• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

beamtime/cern-oct12/go4/AnalysisMacros/spadic_noise_Analysis.cxx (r4864/r4859)

Go to the documentation of this file.
00001 #include <iostream>
00002 #include <string>
00003 #include <typeinfo>
00004 #include <iostream>
00005 #include <vector>
00006 #include <list>
00007 
00008 
00009 #include "Riostream.h"
00010 #include "TRint.h"
00011 #include "TROOT.h"
00012 #include "TStyle.h"
00013 #include "Riostream.h"
00014 #include "TRandom2.h"
00015 
00016 #include "TH2.h"
00017 #include "TH1.h"
00018 #include "TF1.h"
00019 
00020 #include "TGraph.h"
00021 #include "TGraphErrors.h"
00022 #include "TMultiGraph.h"
00023 #include "TCanvas.h"
00024 #include "TPad.h"
00025 #include "TProfile.h"
00026 #include "TStopwatch.h"
00027 
00028 #include "TFile.h"
00029 #include "TTree.h"
00030 #include "TBranch.h"
00031 #include "TMath.h"
00032 #include "TLegend.h"
00033 #include "TLine.h"
00034 #include "TColor.h"
00035 #include "TText.h"
00036 #include "TKey.h"
00037 #include "TLatex.h"
00038 #include "TPaveText.h"
00039 #include "TCanvas.h"
00040 
00041 #include "TPrincipal.h"
00042 #include "TMatrix.h"
00043 
00044 #include "TRocEvent.h"
00045 #include "roc/Message.h"
00046 #include "TSpadicEvent.h"
00047 #include "TEpicsEvent.h"
00048 #include "TFiberHodEvent.h"
00049 #include "TMbsCrateEvent.h"
00050 #include "TBeamMonitorEvent.h"
00051 #include "TCernOct12UnpackEvent.h"
00052 #include "TCernOct12DetectorEvent.h"
00053 
00054 #include "PR_tools.cxx"
00055 
00056 //#include "CBMsimTR.C"
00057 
00058 #define NUM_SPADIC_CHA             8
00059 #define SPADIC_TRACE_SIZE         45
00060 #define SPADIC_ADC_MAX           255
00061 #define noBaselineTB               5 
00062 Double_t fHistoScale = 25;//default to get good calibration fit
00063 //Double_t fHistoScale = 700/3.674/3;//800/3.674;//769.599/3.674;//830.609/3.674;
00064 //Double_t fHistoScale = SPADIC_TRACE_SIZE * SPADIC_ADC_MAX / 100.;// uncalibrated data analysis
00065 Double_t dEdx_min =   0.; //range of the spectrum to calc. pion efficiency full range [0,100]
00066 Double_t dEdx_max = 100.; //range of the spectrum to calc. pion efficiency full range [0,100]
00067 Int_t Pi_Ch1_Min, Pi_Ch1_Max, Pi_Ch2_Min, Pi_Ch2_Max, Pi_Pb_Min, Pi_Pb_Max, El_Ch1_Min, El_Ch1_Max, El_Ch2_Min, El_Ch2_Max, El_Pb_Min, El_Pb_Max;
00068 Bool_t isElectron, isPion, isMyon, isOverFlowEvent, isUnderFlowEvent, isPulser;
00069 TPrincipal* principal = new TPrincipal(NUM_SPADIC_CHA,"ND");
00070 //TMatrixD* cova = new TMatrixD(NUM_SPADIC_CHA,NUM_SPADIC_CHA);
00071 /*
00072 TH1I *clusterSize = new TH1I("clusterSize","clusterSize",NUM_SPADIC_CHA+1,-0.5,NUM_SPADIC_CHA+0.5);
00073 TH1I *maxAmplitudeValue = new TH1I("maxAmplitudeValue","maxAmplitudeValue",256*2,0,256);
00074 TH2I *maxAmplitudeHitTime = new TH2I("maxAmplitudeHitTime","maxAmplitudeHitTime",256,0,256,45,0,45);
00075 TH1I *covaMatixValue = new TH1I("covaMatixValue","covaMatixValue",1000,-0.13,0.13);
00076 TH2I *covaMatixValueMaxAmplitude = new TH2I("covaMatixValueMaxAmplitude","covaMatixValueMaxAmplitude",1000,-0.13,0.13,256,0,256);
00077 TH2I *covaMatixValueHitTime = new TH2I("covaMatixValueHitTime","covaMatixValueHitTime",1000,-0.13,0.13,45,0,45);
00078 TH1I *signalChDistance = new TH1I("signalChDistance","signalChDistance",2*NUM_SPADIC_CHA+1,-NUM_SPADIC_CHA-0.5,NUM_SPADIC_CHA+0.5);
00079 TH2I *averageSignal_2D = new TH2I("averageSignal_2D","averageSignal_2D",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,356,-100,256);
00080 TH1I *noiseDistribution = new TH1I("noiseDistribution","noiseDistribution",2*SPADIC_ADC_MAX,-SPADIC_ADC_MAX,SPADIC_ADC_MAX);
00081 TH2I *baselineDistribution = new TH2I("baselineDistribution","baselineDistribution",NUM_SPADIC_CHA,-0.5,NUM_SPADIC_CHA-0.5,SPADIC_ADC_MAX,0,SPADIC_ADC_MAX);
00082 */
00083 Int_t momentum(0), AnodeV(0), DriftV(0);
00084 Int_t susid = 0;
00085 Int_t pidcuts[18] = {0};
00086 Double_t calibrationParameter[4] = {0.0};
00087 
00088 void SetSusid(Int_t sid=0){
00089   susid = sid;
00090 }
00091 
00092 Double_t MPV_kev(0.0), MPV_adc(0.0), sigma_kev(0.0), sigma_adc(0.0), ChiSqr_kev(0.0), ChiSqr_adc(0.0);
00093 
00094 void Statusbar(Int_t i, Int_t n) {
00095  
00096   if (Int_t(i * 100 / Float_t(n)) - Int_t((i-1) * 100 / Float_t(n)) >= 1){
00097     //cout << "     " << Int_t(i * 100 / Float_t(n)) << "%" << flush << "\r";
00098     printf("     %3i%%",Int_t(i * 100 / Float_t(n)));
00099     cout << flush << "\r";
00100   }
00101   //if (int(i * 100 / float(n)) >=99 && int((i-1) * 100 / float(n)) < 99) 
00102   //cout << endl;
00103   /*
00104     if (int(i * 100 / float(n)) - int((i-1) * 100 / float(n)) >= 1) {
00105     if (int(i * 100 / float(n)) == 1 || i == 1 || i == 0) 
00106     cout << "[" << flush;
00107     cout << "-" << flush;
00108     if (int(i * 10 / float(n)) - int((i-1) * 10 / float(n)) >= 1) 
00109     cout << "|";
00110     if (int(i * 100 / float(n)) >=99) 
00111     cout << "]" <<endl;
00112     }
00113   */
00114 }
00115 
00116 Double_t scaling2keV(Double_t ADCvalue) {
00117   if (fHistoScale == SPADIC_TRACE_SIZE * SPADIC_ADC_MAX / 100.){
00118     return ADCvalue;
00119   }
00120   //calibrationParameter[1] = 0.0;
00121   //return (ADCvalue - calibrationParameter[1]) * calibrationParameter[2]/*3.60898e+00*/ / ((calibrationParameter[0] + calibrationParameter[1])/* * 0.85*/);
00122   //return (ADCvalue / (calibrationParameter[0] * 0.75)) * calibrationParameter[2]; // based on the maximum with correction factor 2011 standart
00123   //return (ADCvalue / calibrationParameter[0]) * calibrationParameter[2]; // based on landau MPV
00124   //return (ADCvalue - calibrationParameter[1]) / (calibrationParameter[0] - calibrationParameter[1]) * calibrationParameter[2]; // based on landau MPV including offset
00125   //return (ADCvalue) * calibrationParameter[3];// based on 3 points of the slope 
00126   /*
00127     if (calibrationParameter[3] < 0.005)
00128     return ADCvalue * (0.005283 * 1.22);
00129     else
00130   */
00131   //return (MPV_kev - sigma_kev) / (MPV_adc - sigma_adc) * ADCvalue - (MPV_kev - sigma_kev) / (MPV_adc - sigma_adc) * MPV_adc + MPV_kev; //1)
00132 
00133   //return (MPV_kev - sigma_kev) / (MPV_adc - sigma_adc) * ADCvalue - (MPV_kev - sigma_kev) / (MPV_adc - sigma_adc) * MPV_adc + MPV_kev; //1)
00134   //return (sigma_kev / sigma_adc * ADCvalue + MPV_kev - sigma_kev/ sigma_adc * MPV_adc);// * 1.25; //2)
00135   return (MPV_kev / MPV_adc * ADCvalue); // 10.07.13 bugfix
00136   
00137   //return (ADCvalue - calibrationParameter[1]) / (calibrationParameter[0] - calibrationParameter[1]) * calibrationParameter[2]; // based on landau MPV including offset
00138   //return (ADCvalue / (calibrationParameter[0]/* * 0.75*/)) * calibrationParameter[2]; // based on the maximum with correction factor 2011 standart
00139   //return (ADCvalue - calibrationParameter[1]) * (calibrationParameter[3]); // based on 3 points of the slope including offset
00140 }
00141 
00142 void CalcPionEfficiency(TH1D* hElectronSpectra, TH1D* hPionSpectra, TGraphErrors* hEfficiency, TGraphErrors* fitEfficiency, const Int_t nChambers, Bool_t debug=false){  
00143   hEfficiency->SetNameTitle("hEfficiency","hEfficiency");
00144   fitEfficiency->SetNameTitle("fitEfficiency","fitEfficiency");
00145 
00146   TString cHist, cTitle;
00147   TH1D *sLikelihoodPi[nChambers+1];
00148   TH1D *sLikelihoodEl[nChambers+1];
00149   Int_t nLikeliBins[] = {220,220,220,220,220,220,220,220,220,220,220,220,220};
00150   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00151     cHist.Form("L_Pi_Prob_temp_%i",Chamberloop);
00152     //sLikelihoodPi[Chamberloop] = new TH1D(cHist,"e and pi Prob",220,-0.05,1.05);
00153     sLikelihoodPi[Chamberloop] = new TH1D(cHist,"e and pi Prob",nLikeliBins[Chamberloop-1],-0.05,1.05);
00154     cHist.Form("L_El_Prob_temp_%i",Chamberloop);
00155     //sLikelihoodEl[Chamberloop] = new TH1D(cHist,"e and pi Prob",220,-0.05,1.05);
00156     sLikelihoodEl[Chamberloop] = new TH1D(cHist,"e and pi Prob",nLikeliBins[Chamberloop-1],-0.05,1.05);
00157   }
00158   Int_t nEvents = 5e7;//1000000;//200000
00159   TH1D* hElectronProbability = (TH1D*)hElectronSpectra->Clone("ElectronProbability");
00160   hElectronProbability->Scale(1./hElectronProbability->Integral());
00161   TH1D* hPionProbability = (TH1D*)hPionSpectra->Clone("hPionProbability");
00162   hPionProbability->Scale(1./hPionProbability->Integral());
00163   hEfficiency->SetMarkerStyle(20);
00164   hEfficiency->GetXaxis()->SetTitle("Number of detector hits");
00165   hEfficiency->GetYaxis()->SetTitle("Pion efficiency [%]");
00166   fitEfficiency->SetMarkerStyle(24);
00167   fitEfficiency->GetXaxis()->SetTitle("Number of detector hits");
00168   fitEfficiency->GetYaxis()->SetTitle("Pion efficiency [%]");
00169 
00170   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00171     cHist.Form("sLikelihoodPi%02d",Chamberloop);
00172     sLikelihoodPi[Chamberloop]->Reset();
00173     sLikelihoodPi[Chamberloop]->SetNameTitle(cHist,cHist);
00174     sLikelihoodPi[Chamberloop]->SetXTitle("Likelihood");
00175     sLikelihoodPi[Chamberloop]->SetYTitle("#");
00176     cHist.Form("sLikelihoodEl%02d",Chamberloop);
00177     sLikelihoodEl[Chamberloop]->Reset();
00178     sLikelihoodEl[Chamberloop]->SetNameTitle(cHist,cHist);
00179     sLikelihoodEl[Chamberloop]->SetXTitle("Likelihood");
00180     sLikelihoodEl[Chamberloop]->SetYTitle("#");
00181 if (hElectronSpectra->Integral() > 0 && hPionSpectra->Integral() > 0){
00182   Bool_t lowStatistic = false;
00183   Int_t nElTries(0), nPiTries(0);
00184   Double_t P_e(1.0), P_pi(1.0);
00185   Double_t fEl(0.0), fPi(0.0);
00186   Double_t L_e(0.0), L_p(0.0);
00187   Double_t chEl(0.0), chPi(0.0);
00188   for(Int_t iE = 0;iE < nEvents;iE++){
00189     if (debug) Statusbar(iE,nEvents);
00190     P_e = 1;
00191     P_pi = 1;
00192          
00193     for(int iCh = 1; iCh <= Chamberloop; iCh++){
00194       if (lowStatistic)
00195         break;
00196       // ladung würfeln
00197       fEl = 0;
00198       fPi = 0;
00199       while (fEl == 0 || fPi == 0) {
00200         chEl = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00201         //while (hElectronProbability->FindBin(chEl) > dEdx_max) {
00202         //chEl = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00203         //}     
00204         fEl = hElectronProbability->GetBinContent( hElectronProbability->FindBin(chEl));
00205         fPi = hPionProbability->GetBinContent( hPionProbability->FindBin(chEl));
00206         nElTries++;
00207         if (nElTries/Float_t(Chamberloop*nEvents) > 15) {
00208           printf("too low electron statistic\n");
00209           lowStatistic = true;
00210           break;
00211         }
00212         
00213       }
00214       P_e = P_e * (fEl);
00215       P_pi = P_pi * (fPi);
00216         
00217     }      
00218     L_e = 0;
00219     if((P_e+P_pi)>0){
00220       L_e = P_e /(P_e+P_pi);
00221     }
00222     sLikelihoodEl[Chamberloop]->Fill(L_e);
00223       
00224     P_e = 1;
00225     P_pi = 1;
00226           
00227     L_p = 0;
00228 
00229 
00230     for(Int_t iCh = 1;iCh<= Chamberloop;iCh++){
00231       if (lowStatistic)
00232         break;
00233       // ladung würfeln
00234       fEl = 0;
00235       fPi = 0;
00236       while (fEl == 0 || fPi == 0) {
00237         chPi = hPionSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/);
00238         // while (hElectronProbability->FindBin(chPi) > dEdx_max) {
00239         //chPi = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00240         //}
00241         fPi = hPionProbability->GetBinContent( hPionProbability->FindBin(chPi));
00242         fEl = hElectronProbability->GetBinContent( hElectronProbability->FindBin(chPi));
00243         nPiTries++;
00244         if (nPiTries/Float_t(Chamberloop*nEvents) > 15) {
00245           printf("too low pion statistic\n");
00246           lowStatistic = true;
00247           break;
00248         }
00249         
00250       }
00251       P_e = P_e * (fEl);
00252       P_pi = P_pi * (fPi);
00253               
00254     }    
00255     L_p = 0; 
00256     if((P_e+P_pi)>0){
00257       L_p = 1. - (P_pi /(P_e+P_pi));
00258     }   
00259         
00260     if (lowStatistic){
00261       printf(" ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! too low statistic\n");
00262       break;
00263     }
00264     else
00265       sLikelihoodPi[Chamberloop]->Fill(L_p);
00266   }
00267   Double_t ElectronIntegral =  0.0;
00268   Double_t PionIntegral = 0.0;
00269   Double_t lastPionIntegral = 0.0;
00270   Int_t ElectronBin = nLikeliBins[Chamberloop-1];         
00271   Double_t ElectronIntAll = sLikelihoodEl[Chamberloop]->Integral(0,nLikeliBins[Chamberloop-1]);
00272   Double_t PionIntAll = sLikelihoodPi[Chamberloop]->Integral(0,nLikeliBins[Chamberloop-1]); // misidentified pions of all pions
00273   if (ElectronIntAll > 0 && PionIntAll > 0) {
00274     while (ElectronIntegral < 0.90000 && ElectronBin > 0){
00275       ElectronBin -= 1;
00276       ElectronIntegral = (sLikelihoodEl[Chamberloop]->Integral(ElectronBin,nLikeliBins[Chamberloop-1]))/ElectronIntAll;
00277       //PionIntAll = (sLikelihoodPi[Chamberloop]->Integral(ElectronBin,nLikeliBins[Chamberloop-1]) + sLikelihoodEl[Chamberloop]->Integral(ElectronBin,nLikeliBins[Chamberloop-1]));//new remaining pions within 90% electrons
00278       PionIntegral     = (sLikelihoodPi[Chamberloop]->Integral(ElectronBin,nLikeliBins[Chamberloop-1]))/PionIntAll;
00279       if (sLikelihoodPi[Chamberloop]->GetBinContent(ElectronBin+1) > 0.0){
00280         lastPionIntegral = (sLikelihoodPi[Chamberloop]->Integral(ElectronBin+1,nLikeliBins[Chamberloop-1]))/PionIntAll;
00281       } 
00282     }
00283   }
00284   if (lastPionIntegral == 0.0)
00285     lastPionIntegral = (sLikelihoodPi[Chamberloop]->Integral(ElectronBin-1,nLikeliBins[Chamberloop-1]))/PionIntAll;
00286   /*
00287     if (ElectronBin / nLikeliBins[Chamberloop-1] > 0.955){
00288     fitLimit--;
00289     }
00290   */
00291   if (debug) {
00292     printf("  layer %d\n",Chamberloop);
00293     printf("    Pioneneffizienz     : %8.4f Bin %.3f\n",PionIntegral*100,(ElectronBin)/(Float_t)nLikeliBins[Chamberloop-1]);
00294     printf("    remaining Pieff.    : %8.4f Bin %.3f\n",PionIntegral*100*PionIntAll/(PionIntegral*PionIntAll+ElectronIntegral*ElectronIntAll),(ElectronBin)/(Float_t)nLikeliBins[Chamberloop-1]);
00295     printf("    Electroneneffizienz : %8.4f Bin %.3f\n\n",ElectronIntegral*100,(ElectronBin)/(Float_t)nLikeliBins[Chamberloop-1]);
00296   }
00297   //hEfficiency->Fill(Chamberloop,PionIntegral*100.);
00298   hEfficiency->SetPoint(Chamberloop-1, Chamberloop, PionIntegral*100.);
00299   hEfficiency->SetPointError(Chamberloop-1,0, fabs(PionIntegral - lastPionIntegral) *100.);// Delta pion integral between electron integral < 0.9 and >= 0.9
00300   
00301   printf("   %2i %7.4f +- %7.4f  (%.4f EE) (Ebin:%3i, %.4f) %3i bins\n", Chamberloop, PionIntegral*100.,  fabs(PionIntegral - lastPionIntegral) *100., ElectronIntegral, nLikeliBins[Chamberloop-1] - ElectronBin, ElectronBin/Float_t(nLikeliBins[Chamberloop-1]), nLikeliBins[Chamberloop-1]);
00302  
00303  }
00304     else {
00305       printf("  empty spectra: no pion efficiency calculated\n");
00306     }
00307   }
00308   TF1 *simPionEff = new TF1("simPionEff","exp([0]+[1]*x)",0.5,6.5/*nChambers*/);
00309   hEfficiency->Fit("simPionEff","RQ0");
00310   printf("           fit PE:%.6f   (ChiSqr/NDF:%.6f)\n",(exp(simPionEff->GetParameter(0) + simPionEff->GetParameter(1) * nChambers)),simPionEff->GetChisquare() / Float_t(simPionEff->GetNDF()));
00311   for (Int_t iChamber = 1; iChamber <= nChambers; iChamber++){
00312     fitEfficiency->SetPoint(iChamber-1, iChamber, (exp(simPionEff->GetParameter(0) + simPionEff->GetParameter(1) * iChamber)));
00313     fitEfficiency->SetPointError(iChamber-1, 0, fabs((exp(simPionEff->GetParameter(0) + simPionEff->GetParameter(1) * iChamber)) 
00314                                                      - (exp((simPionEff->GetParameter(0) + simPionEff->GetParError(0)) + (simPionEff->GetParameter(1) + simPionEff->GetParError(1)) * iChamber))));
00315   }
00316   delete simPionEff;
00317   //TFile *outfile = new TFile("Likelihoods.root","RECREATE");
00318   //outfile->cd();
00319   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00320     //sLikelihoodPi[Chamberloop]->Write(TString(sLikelihoodPi[Chamberloop]->GetName())+TString(hElectronSpectra->GetName()), TObject::kOverwrite);
00321     //sLikelihoodEl[Chamberloop]->Write(TString(sLikelihoodEl[Chamberloop]->GetName())+TString(hElectronSpectra->GetName()), TObject::kOverwrite);
00322     delete sLikelihoodPi[Chamberloop];   
00323     delete sLikelihoodEl[Chamberloop];
00324   }
00325   //outfile->Close();
00326  
00327 }
00328 
00329 
00330 
00331 void CalcPionEfficiency(TH1D* hElectronSpectra, TH1D* hPionSpectra, TProfile* hEfficiency, const Int_t nChambers, Bool_t debug){    
00332   Bool_t useAntiProbability = false;
00333   TString cHist, cTitle;
00334   TH1D *sLikelihoodPi[nChambers+1];
00335   TH1D *sLikelihoodEl[nChambers+1];
00336   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00337     cHist.Form("L_Pi_Prob_temp_%i",Chamberloop);
00338     sLikelihoodPi[Chamberloop] = new TH1D(cHist,"e and pi Prob",220,-0.05,1.05);
00339     cHist.Form("L_El_Prob_temp_%i",Chamberloop);
00340     sLikelihoodEl[Chamberloop] = new TH1D(cHist,"e and pi Prob",220,-0.05,1.05);
00341   }
00342   Int_t nEvents = 5e7;//25000000;//100000;
00343   TH1D* hElectronProbability = (TH1D*)hElectronSpectra->Clone("ElectronProbability");
00344   hElectronProbability->Scale(1./hElectronProbability->Integral());
00345   TH1D* hPionProbability = (TH1D*)hPionSpectra->Clone("hPionProbability");
00346   hPionProbability->Scale(1./hPionProbability->Integral());
00347   TCanvas *cTemp2 = NULL;
00348   TCanvas *cTemp = NULL;
00349   if (debug) {
00350     cTemp2 = new TCanvas("temp2","temp2",800,600);
00351     cTemp2->Divide(1,1);
00352     cTemp = new TCanvas("temp","temp",800,600);
00353     cTemp->Divide(2,2);
00354     cTemp->cd(1);
00355     hElectronSpectra->DrawCopy();
00356     cTemp->cd(2);
00357     hElectronProbability->DrawCopy();
00358     cTemp->cd(3);
00359     hPionSpectra->DrawCopy();
00360     cTemp->cd(4);
00361     hPionProbability->DrawCopy();
00362     cTemp->Update();
00363   }
00364   hEfficiency->Reset();
00365   //hEfficiency->SetNameTitle(title,title);
00366   hEfficiency->GetYaxis()->SetRangeUser(0.01,100.5);
00367   hEfficiency->SetMarkerStyle(20);
00368   hEfficiency->SetXTitle("Number of detector layer");
00369   hEfficiency->SetYTitle("Pion efficiency [%]");
00370 
00371   //if (hElectronSpectra->Integral() > 0 && hPionSpectra->Integral() > 0){
00372   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00373     cHist.Form("sLikelihoodPi%02d",Chamberloop);
00374     sLikelihoodPi[Chamberloop]->Reset();
00375     sLikelihoodPi[Chamberloop]->SetNameTitle(cHist,cHist);
00376     sLikelihoodPi[Chamberloop]->SetXTitle("Likelihood");
00377     sLikelihoodPi[Chamberloop]->SetYTitle("#");
00378     cHist.Form("sLikelihoodEl%02d",Chamberloop);
00379     sLikelihoodEl[Chamberloop]->Reset();
00380     sLikelihoodEl[Chamberloop]->SetNameTitle(cHist,cHist);
00381     sLikelihoodEl[Chamberloop]->SetXTitle("Likelihood");
00382     sLikelihoodEl[Chamberloop]->SetYTitle("#");
00383     if (hElectronSpectra->Integral() > 0 && hPionSpectra->Integral() > 0){
00384       Bool_t lowStatistic = false;
00385       Int_t nElTries(0), nPiTries(0);
00386 
00387       for(Int_t iE = 0;iE < nEvents;iE++){
00388         if (debug) Statusbar(iE,nEvents);
00389         Double_t P_e = 1;
00390         Double_t P_pi = 1;
00391          
00392         for(int iCh = 1; iCh <= Chamberloop; iCh++){
00393           if (lowStatistic)
00394             break;
00395           // ladung würfeln
00396           Double_t fEl = 0;
00397           Double_t fPi = 0;
00398           while (fEl == 0 || fPi == 0) {
00399             Double_t chEl = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00400             //while (hElectronProbability->FindBin(chEl) > dEdx_max) {
00401             //chEl = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00402             //} 
00403             fEl = hElectronProbability->GetBinContent( hElectronProbability->FindBin(chEl));
00404             fPi = hPionProbability->GetBinContent( hPionProbability->FindBin(chEl));
00405             nElTries++;
00406             if (nElTries/Float_t(Chamberloop*nEvents) > 15) {
00407               printf("too low electron statistic\n");
00408               lowStatistic = true;
00409               break;
00410             }
00411         
00412           }
00413           P_e = P_e * (fEl * 1e9);
00414           P_pi = P_pi * (fPi * 1e9);
00415         
00416         }      
00417         Double_t L_e = 0;
00418         if((P_e+P_pi)>0){
00419           L_e = P_e /(P_e+P_pi);
00420         }
00421         sLikelihoodEl[Chamberloop]->Fill(L_e);
00422       
00423         P_e = 1;
00424         P_pi = 1;
00425           
00426         Double_t L_p = 0;
00427         if (useAntiProbability) {
00428           for(Int_t iCh = 1;iCh<= Chamberloop;iCh++){
00429             if (lowStatistic)
00430               break;
00431             // ladung würfeln
00432             Double_t fEl = 0;
00433             Double_t fPi = 0;
00434             while (fEl == 0 || fPi == 0) {
00435               Double_t chPi = hPionSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/);
00436               //while (hElectronProbability->FindBin(chPi) > dEdx_max) {
00437               //chPi = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00438               //}
00439               fEl = hPionProbability->GetBinContent( hPionProbability->FindBin(chPi));
00440               fPi = hElectronProbability->GetBinContent( hElectronProbability->FindBin(chPi));
00441               nPiTries++;
00442               if (nPiTries/Float_t(Chamberloop*nEvents) > 15) {
00443                 printf("too low pion statistic\n");
00444                 lowStatistic = true;
00445                 break;
00446               }
00447         
00448             }
00449             P_e = P_e * (fEl * 1e9);
00450             P_pi = P_pi * (fPi * 1e9);
00451         
00452           }      
00453           L_p = 0;
00454           if((P_e+P_pi)>0){
00455             L_p = P_pi /(P_e+P_pi);
00456           }  
00457         } 
00458         else {
00459           for(Int_t iCh = 1;iCh<= Chamberloop;iCh++){
00460             if (lowStatistic)
00461               break;
00462             // ladung würfeln
00463             Double_t fEl = 0;
00464             Double_t fPi = 0;
00465             while (fEl == 0 || fPi == 0) {
00466               Double_t chPi = hPionSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/);
00467               // while (hElectronProbability->FindBin(chPi) > dEdx_max) {
00468               //chPi = hElectronSpectra->GetRandom(/*dEdx_min,dEdx_max*//*0.0,100.0*/); 
00469               //}
00470               fPi = hPionProbability->GetBinContent( hPionProbability->FindBin(chPi));
00471               fEl = hElectronProbability->GetBinContent( hElectronProbability->FindBin(chPi));
00472               nPiTries++;
00473               if (nPiTries/Float_t(Chamberloop*nEvents) > 15) {
00474                 printf("too low pion statistic\n");
00475                 lowStatistic = true;
00476                 break;
00477               }
00478         
00479             }
00480             P_e = P_e * (fEl * 1e9);
00481             P_pi = P_pi * (fPi * 1e9);
00482               
00483           }    
00484           L_p = 0; 
00485           if((P_e+P_pi)>0){
00486             L_p = 1. - (P_pi /(P_e+P_pi));
00487           }   
00488         }
00489         if (lowStatistic){
00490           printf(" ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! too low statistic\n");
00491           break;
00492         }
00493         else
00494           sLikelihoodPi[Chamberloop]->Fill(L_p);
00495       }
00496       Double_t ElectronIntegral =  0.0;
00497       Double_t PionIntegral = 0.0;
00498       Int_t ElectronBin = 220;    
00499       Double_t ElectronIntAll = sLikelihoodEl[Chamberloop]->Integral(0,220);
00500       Double_t PionIntAll = sLikelihoodPi[Chamberloop]->Integral(0,220);
00501       if (ElectronIntAll > 0 && PionIntAll > 0) {
00502         while (ElectronIntegral < 0.90000 && ElectronBin > 0){
00503           ElectronBin -= 1;
00504           ElectronIntegral = (sLikelihoodEl[Chamberloop]->Integral(ElectronBin,220))/ElectronIntAll;
00505           PionIntegral     = (sLikelihoodPi[Chamberloop]->Integral(ElectronBin,220))/PionIntAll;
00506         }
00507       }
00508       if (debug) {
00509         printf("  layer %d\n",Chamberloop);
00510         printf("    Pioneneffizienz     : %8.4f Bin %.3f\n",PionIntegral*100,(ElectronBin)/220.);
00511         printf("    remaining Pieff.    : %8.4f Bin %.3f\n",PionIntegral*100*PionIntAll/(PionIntegral*PionIntAll+ElectronIntegral*ElectronIntAll),(ElectronBin)/220.);
00512         printf("    Electroneneffizienz : %8.4f Bin %.3f\n\n",ElectronIntegral*100,(ElectronBin)/220.);
00513       }
00514       hEfficiency->Fill(Chamberloop,PionIntegral*100.);
00515       if (debug) {
00516         cTemp2->cd(1)->SetLogy(1);
00517         hEfficiency->DrawCopy();
00518         cTemp2->Update();
00519       }
00520     }
00521     else {
00522       printf("  empty spectra: no pion efficiency calculated\n");
00523     }
00524   }
00525   //TFile *output = new TFile(file,"UPDATE");
00526   //output->cd();
00527   for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00528     sLikelihoodPi[Chamberloop]->Write("", TObject::kOverwrite);
00529     sLikelihoodEl[Chamberloop]->Write("", TObject::kOverwrite);
00530     delete sLikelihoodPi[Chamberloop];   
00531     delete sLikelihoodEl[Chamberloop];
00532   }
00533   // file->cd();
00534   // hEfficiency->Write("", TObject::kOverwrite);
00535   if (debug) {
00536     cTemp->Close();
00537     delete cTemp;
00538     cTemp2->Close();
00539     delete cTemp2;
00540   }
00541 }
00542 
00543 
00544 void GetPidCuts(TString runId)
00545 {
00546   //cout << runId << endl;
00547   runId.ReplaceAll("Be_run","");
00548   //cout << runId << endl;
00549   runId.ReplaceAll("Te_run","");
00550   //cout << runId << endl;
00551   runId.ReplaceAll(".root","");
00552   //cout << runId << endl;
00553   //int runnumber=runId.Atoi();
00554   //Int_t pidcuts[18];
00555   runId.ReplaceAll("data2012/TTrees/merged/","");
00556   Int_t Momentum = TString(runId(0,1)).Atoi();
00557   printf("     Momentum %iGeV/c\n",Momentum);
00558   if (Momentum == 2){
00559     pidcuts[0] = 1000; // // El Ch1 min
00560     pidcuts[1] = 4000; // // El Ch1 max
00561     pidcuts[2] =  800; // // El Ch2 min
00562     pidcuts[3] = 4000; // // El Ch2 max
00563     pidcuts[4] =  850;//300; // // El Pb min
00564     pidcuts[5] = 4000; // // El Pb max
00565     pidcuts[6] =    0; // // Pi Ch1 min
00566     pidcuts[7] =  375; // // Pi Ch1 max
00567     pidcuts[8] =    0; // // Pi Ch2 min
00568     pidcuts[9] =  350; // // Pi Ch2 max
00569     pidcuts[10]=  350;//500; // // Pi Pb min
00570     pidcuts[11]= 4000; // // Pi Pb max
00571     pidcuts[12]=  375; // // Mu Ch1 min
00572     pidcuts[13]= 1000; // // Mu Ch1 max
00573     pidcuts[14]=  350; // // Mu Ch2 min
00574     pidcuts[15]=  800; // // Mu Ch2 max
00575     pidcuts[16]=  550; // // Mu Pb min
00576     pidcuts[17]=  850; // // Mu Pb max
00577   } else if (Momentum == 3) {
00578     if (runId == "3GeV_1775V_500V_FFM0.5x100_FFM0.5x200_0" ||
00579         runId == "3GeV_1775V_500V_FFM0.7x100_FFM0.7x100_0" ||
00580         runId == "3GeV_1775V_500V_FFM0.7x350_FFM1.2x200_0" ||
00581         runId == "3GeV_1775V_500V_FFM1.2x100_FFM1.2x100_0" ||
00582         runId == "3GeV_1775V_500V_H25_H25_0" ||
00583         runId == "3GeV_1775V_500V_H_FFM0.7x200_0"
00584         ){
00585       pidcuts[0] =  800; // // El Ch1 min
00586       pidcuts[1] = 4000; // // El Ch1 max
00587       pidcuts[2] =  475; // // El Ch2 min
00588       pidcuts[3] = 4000; // // El Ch2 max
00589       pidcuts[4] =  850; // // El Pb min
00590       pidcuts[5] = 4000; // // El Pb max
00591       pidcuts[6] =    0; // // Pi Ch1 min
00592       pidcuts[7] =  375; // // Pi Ch1 max
00593       pidcuts[8] =    0; // // Pi Ch2 min
00594       pidcuts[9] =  350; // // Pi Ch2 max
00595       pidcuts[10]=  350;//500; // // Pi Pb min
00596       pidcuts[11]= 4000; // // Pi Pb max
00597       pidcuts[12]=  375; // // Mu Ch1 min
00598       pidcuts[13]= 1000; // // Mu Ch1 max
00599       pidcuts[14]=  350; // // Mu Ch2 min
00600       pidcuts[15]=  600; // // Mu Ch2 max
00601       pidcuts[16]=  600; // // Mu Pb min
00602       pidcuts[17]=  850; // // Mu Pb max
00603     } else if (runId == "3GeV_1800V_500V_B_K_A" ||
00604                runId == "3GeV_B_K_A"
00605                ){
00606       pidcuts[0] =  800; // // El Ch1 min
00607       pidcuts[1] = 4000; // // El Ch1 max
00608       pidcuts[2] =  475; // // El Ch2 min
00609       pidcuts[3] = 4000; // // El Ch2 max
00610       pidcuts[4] =  850; // // El Pb min
00611       pidcuts[5] = 4000; // // El Pb max
00612       pidcuts[6] =    0; // // Pi Ch1 min
00613       pidcuts[7] =  375; // // Pi Ch1 max
00614       pidcuts[8] =    0; // // Pi Ch2 min
00615       pidcuts[9] =  350; // // Pi Ch2 max
00616       pidcuts[10]=  350;//500; // // Pi Pb min
00617       pidcuts[11]= 4000; // // Pi Pb max
00618       pidcuts[12]=  375; // // Mu Ch1 min
00619       pidcuts[13]= 1000; // // Mu Ch1 max
00620       pidcuts[14]=  350; // // Mu Ch2 min
00621       pidcuts[15]=  700; // // Mu Ch2 max
00622       pidcuts[16]=  350; // // Mu Pb min
00623       pidcuts[17]=  850; // // Mu Pb max
00624     } else {
00625       pidcuts[0] =  650; // // El Ch1 min
00626       pidcuts[1] = 4000; // // El Ch1 max
00627       pidcuts[2] =  475; // // El Ch2 min
00628       pidcuts[3] = 4000; // // El Ch2 max
00629       pidcuts[4] =  850; // // El Pb min
00630       pidcuts[5] = 4000; // // El Pb max
00631       pidcuts[6] =    0; // // Pi Ch1 min
00632       pidcuts[7] =  375; // // Pi Ch1 max
00633       pidcuts[8] =    0; // // Pi Ch2 min
00634       pidcuts[9] =  350; // // Pi Ch2 max
00635       pidcuts[10]=  350;//500; // // Pi Pb min
00636       pidcuts[11]= 4000; // // Pi Pb max
00637       pidcuts[12]=  375; // // Mu Ch1 min
00638       pidcuts[13]=  650; // // Mu Ch1 max
00639       pidcuts[14]=  350; // // Mu Ch2 min
00640       pidcuts[15]=  475; // // Mu Ch2 max
00641       pidcuts[16]=  600; // // Mu Pb min
00642       pidcuts[17]=  850; // // Mu Pb max
00643     }
00644   } else if (Momentum == 4) {
00645     pidcuts[0] =  600; // // El Ch1 min
00646     pidcuts[1] = 4000; // // El Ch1 max
00647     pidcuts[2] =  400; // // El Ch2 min
00648     pidcuts[3] = 4000; // // El Ch2 max
00649     pidcuts[4] =  900; // // El Pb min
00650     pidcuts[5] = 4000; // // El Pb max
00651     pidcuts[6] =    0; // // Pi Ch1 min
00652     pidcuts[7] =  375; // // Pi Ch1 max
00653     pidcuts[8] =    0; // // Pi Ch2 min
00654     pidcuts[9] =  350; // // Pi Ch2 max
00655     pidcuts[10]=  350; // // Pi Pb min
00656     pidcuts[11]= 4000; // // Pi Pb max
00657     pidcuts[12]=  375; // // Mu Ch1 min
00658     pidcuts[13]=  900; // // Mu Ch1 max
00659     pidcuts[14]=  350; // // Mu Ch2 min
00660     pidcuts[15]=  550; // // Mu Ch2 max
00661     pidcuts[16]=  600; // // Mu Pb min
00662     pidcuts[17]=  900; // // Mu Pb max
00663   } else if (Momentum == 6) {
00664     pidcuts[0] =  500; // // El Ch1 min
00665     pidcuts[1] = 4000; // // El Ch1 max
00666     pidcuts[2] =  375; // // El Ch2 min
00667     pidcuts[3] = 4000; // // El Ch2 max
00668     pidcuts[4] = 1000; // // El Pb min
00669     pidcuts[5] = 4000; // // El Pb max
00670     pidcuts[6] =    0; // // Pi Ch1 min
00671     pidcuts[7] =  375; // // Pi Ch1 max
00672     pidcuts[8] =    0; // // Pi Ch2 min
00673     pidcuts[9] =  350; // // Pi Ch2 max
00674     pidcuts[10]=  350; // // Pi Pb min
00675     pidcuts[11]= 4000; // // Pi Pb max
00676     pidcuts[12]=  375; // // Mu Ch1 min
00677     pidcuts[13]= 1000; // // Mu Ch1 max
00678     pidcuts[14]=  350; // // Mu Ch2 min
00679     pidcuts[15]= 1000; // // Mu Ch2 max
00680     pidcuts[16]=  400; // // Mu Pb min
00681     pidcuts[17]=  600; // // Mu Pb max
00682   } else if (Momentum == 8) { 
00683     pidcuts[0] =  450; // // El Ch1 min
00684     pidcuts[1] = 4000; // // El Ch1 max
00685     pidcuts[2] =  375; // // El Ch2 min
00686     pidcuts[3] = 4000; // // El Ch2 max
00687     pidcuts[4] =  800; // // El Pb min
00688     pidcuts[5] = 4000; // // El Pb max
00689     pidcuts[6] =    0; // // Pi Ch1 min
00690     pidcuts[7] =  375; // // Pi Ch1 max
00691     pidcuts[8] =    0; // // Pi Ch2 min
00692     pidcuts[9] =  350; // // Pi Ch2 max
00693     pidcuts[10]=  350; // // Pi Pb min
00694     pidcuts[11]= 4000; // // Pi Pb max
00695     pidcuts[12]=  375;//400; // // Mu Ch1 min
00696     pidcuts[13]= 1000;//700; // // Mu Ch1 max
00697     pidcuts[14]=  350; // // Mu Ch2 min
00698     pidcuts[15]= 4000;//700;//450; // // Mu Ch2 max
00699     pidcuts[16]=  425;//500; // // Mu Pb min
00700     pidcuts[17]=  550;//1000; // // Mu Pb max
00701   }
00702 }
00703 void getPID(/*TMbsCrateEvent* input, TString runId*/ Float_t ch1, Float_t ch2, Float_t pb)
00704 {
00705   //int *pidcuts = GetPidCuts(runId);
00706   
00707   //cout << "test: " << pidcuts[7] << endl;
00708   isPion = false;
00709   isElectron = false;
00710   isMyon = false;
00711   if ((ch1 < 350 && pb < 350) || (ch2 < 350 && pb < 350)) return; // noise trigger or event without pid at allgo 
00712   if (ch1 > pidcuts[0] && // ELECTRON
00713       ch1 < pidcuts[1] &&
00714       ch2 > pidcuts[2] &&
00715       ch2 < pidcuts[3] &&
00716       pb  > pidcuts[4] &&
00717       pb  < pidcuts[5]){
00718     isElectron=true;
00719   }  
00720   else if (ch1 > pidcuts[6]  && // PION
00721            ch1 < pidcuts[7]  &&
00722            ch2 > pidcuts[8]  &&  // was 340
00723            ch2 < pidcuts[9]  &&  // was 348
00724            pb  > pidcuts[10] &&
00725            pb  < pidcuts[11]){
00726     isPion=true;
00727   }     
00728   else if (((ch1 > pidcuts[12] && ch1 < pidcuts[13]) 
00729             ||
00730             (ch2 > pidcuts[14] && ch2 < pidcuts[15]))
00731            &&
00732            (pb  > pidcuts[16] && pb  < pidcuts[17])){
00733     isMyon=true;
00734   }  
00735 }
00736 
00737 Int_t GetPadMax(TH1D* inPulse[NUM_SPADIC_CHA]) {
00738   Int_t maxCh = -1;
00739   Double_t maxIntegral = 0.0;
00740   Double_t tempIntegral = 0.0;
00741   //Double_t Integral[NUM_SPADIC_CHA] = {0.0};
00742   for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00743     tempIntegral = 0.0;
00744     for (Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++) {
00745       if (inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) > 0.0)
00746         tempIntegral += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
00747     }
00748     //Integral[ch] = tempIntegral;
00749     if (tempIntegral > maxIntegral) {
00750       maxCh = ch;
00751       maxIntegral = tempIntegral;
00752     }
00753   }
00754 
00755   /*
00756     Double_t maximum = 0.0;
00757     Int_t maxCh = -1;
00758     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00759     if (inPulse[ch]->GetBincontent(inPulse[ch]->GetMaximumBin()) > maximum){
00760     maximum = inPulse[ch]->GetBincontent(inPulse[ch]->GetMaximumBin());
00761     maxCh = ch;
00762     }
00763     }
00764   */
00765   return maxCh;
00766 }
00767 
00768 Double_t Get3PadIntegral(TH1D* inPulse[NUM_SPADIC_CHA])
00769 {
00770   Int_t maxCh = GetPadMax(inPulse);
00771   Double_t signal = inPulse[maxCh]->Integral();
00772   if (maxCh-1 >= 0)
00773     signal += inPulse[maxCh-1]->Integral();
00774   if (maxCh+1 < NUM_SPADIC_CHA)
00775     signal += inPulse[maxCh+1]->Integral();
00776   return signal;
00777 }
00778 Double_t Get3PadPosAmplitude(TH1D* inPulse[NUM_SPADIC_CHA])
00779 {
00780   Int_t maxCh = GetPadMax(inPulse);
00781   Int_t maxBin = inPulse[maxCh]->GetMaximumBin();
00782   Double_t signal = 0.0;
00783   if (inPulse[maxCh]->GetBinContent(maxBin) > 0)
00784     signal = inPulse[maxCh]->GetBinContent(maxBin);
00785   if (maxCh-1 >= 0 && inPulse[maxCh-1]->GetBinContent(maxBin) > 0)
00786     signal += inPulse[maxCh-1]->GetBinContent(maxBin);
00787   if (maxCh+1 < NUM_SPADIC_CHA && inPulse[maxCh+1]->GetBinContent(maxBin) > 0)
00788     signal += inPulse[maxCh+1]->GetBinContent(maxBin);
00789   return signal;
00790 }
00791 Double_t Get3PadPosIntegral(TH1D* inPulse[NUM_SPADIC_CHA])
00792 {
00793   const Int_t minBin = 0;
00794   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00795   Int_t maxCh = -1;
00796   Double_t maxIntegral = 0.0;
00797   Double_t tempIntegral = 0.0;
00798   Double_t Integral[NUM_SPADIC_CHA] = {0.0};
00799   for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00800     tempIntegral = 0.0;
00801     for (Int_t bin = minBin; bin < maxBin; bin++) {
00802       if (inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) > 0.0)
00803         tempIntegral += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
00804     }
00805     Integral[ch] = tempIntegral;
00806     if (tempIntegral > maxIntegral) {
00807       maxCh = ch;
00808       maxIntegral = tempIntegral;
00809     }
00810   }
00811   Double_t signal = Integral[maxCh];
00812   if (maxCh-1 >= 0)
00813     signal += Integral[maxCh-1];
00814   if (maxCh+1 < NUM_SPADIC_CHA)
00815     signal += Integral[maxCh+1];
00816   return signal;
00817 }
00818 Double_t Get3PadPosIntegralCrossTalk(TH1D* inPulse1[NUM_SPADIC_CHA], TH1D* inPulse2[NUM_SPADIC_CHA], Int_t *deltaChMax)
00819 {
00820   const Int_t minBin = 0;
00821   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00822   Int_t maxCh1(-1), maxCh2(-1);
00823   Double_t maxIntegral1(0.0), maxIntegral2(0.0);
00824   Double_t tempIntegral1(0.0), tempIntegral2(0.0);
00825   Double_t Integral1[NUM_SPADIC_CHA] = {0.0};
00826   Double_t Integral2[NUM_SPADIC_CHA] = {0.0};
00827   for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00828     tempIntegral1 = 0.0;
00829     tempIntegral2 = 0.0;
00830     for (Int_t bin = minBin; bin < maxBin; bin++) {
00831       if (inPulse1[ch]->GetBinContent(inPulse1[ch]->FindBin(bin)) > 0.0)
00832         tempIntegral1 += inPulse1[ch]->GetBinContent(inPulse1[ch]->FindBin(bin));
00833       if (inPulse2[ch]->GetBinContent(inPulse2[ch]->FindBin(bin)) > 0.0)
00834         tempIntegral2 += inPulse2[ch]->GetBinContent(inPulse2[ch]->FindBin(bin));
00835     }
00836     Integral1[ch] = tempIntegral1;
00837     Integral2[ch] = tempIntegral2;
00838     if (tempIntegral1 > maxIntegral1) {
00839       maxCh1 = ch;
00840       maxIntegral1 = tempIntegral1;
00841     }
00842     if (tempIntegral2 > maxIntegral2) {
00843       maxCh2 = ch;
00844       maxIntegral2 = tempIntegral2;
00845     }
00846   }
00847   *deltaChMax = fabs(maxCh1 - maxCh2) ;
00848    for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00849        Integral1[ch] += Integral2[ch];
00850    }
00851    Double_t signal = Integral1[maxCh1];
00852    if (maxCh1-1 >= 0)
00853      signal += Integral1[maxCh1-1];
00854    if (maxCh1+1 < NUM_SPADIC_CHA)
00855      signal += Integral1[maxCh1+1];
00856    return signal;
00857 
00858  }
00859 /*
00860   Double_t GetPosition(TH1D* inPulse[NUM_SPADIC_CHA], Double_t chargePercentage[3]) 
00861   {
00862   const Int_t minBin = 0;
00863   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00864   Double_t dxPos = 0;
00865   Int_t maxCh = GetPadMax(inPulse);
00866   Double_t intensCh[NUM_SPADIC_CHA] = {0.0};
00867   if (maxCh >= 1 && maxCh <= NUM_SPADIC_CHA - 1){
00868   for (Int_t ch = maxCh-1; ch <= maxCh+1; ch++){
00869   for (Int_t bin = minBin; bin < maxBin; bin++) {
00870   if (inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) > 0.0)
00871   intensCh[ch] += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
00872   }
00873   }
00874   chargePercentage[0] = intensCh[maxCh-1] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00875   chargePercentage[1] = intensCh[maxCh]   / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00876   chargePercentage[2] = intensCh[maxCh+1] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00877   dxPos = 0.5 * log((intensCh[maxCh+1] / intensCh[maxCh-1])) / log((pow(intensCh[maxCh],2) / (intensCh[maxCh+1] * intensCh[maxCh-1])));
00878   }
00879   return dxPos;
00880   }
00881 */
00882 Double_t calcK3at0hs(Double_t ra=0.02/*[mm]*/, Double_t s=2.5/*[mm]*/){
00883   // valid within ra/s [1.5E-3,7.5E-3]
00884   return -20.19*(ra/s)+0.85; //lin fit
00885   //return 0.68*TMath::Exp(-26.70*(ra/s)+0.22);// exp fit
00886   //return 0.86-25.34*(ra/s)+569.86*(ra/s)*(ra/s);// poly 2 fit
00887 }
00888 
00889 Double_t calcK3(Float_t h=4.0){
00890   // valid within h/s [0.5,1.6]
00891   Double_t s=2.5;//[mm]
00892   Double_t ra=0.02;//[mm]
00893   return -0.245 * (h/s) + calcK3at0hs(ra,s);
00894   //return -0.245 * (h/2.5) + 0.70; //PhD status 08.05.2013
00895 }
00896 void PrfAna(TH1D* inPulse[NUM_SPADIC_CHA], TH2D* clusterwCharge, Int_t maxCh = -1, Int_t clusterWidth = 0){
00897   const Double_t W = 7.125;//[mm]
00898 
00899 
00900   const Double_t par = 1.0;
00901   const Double_t h = 3.5; //[mm]
00902   const Double_t K3 = calcK3(h);//0.525; 
00903   const Double_t SqrtK3 = sqrt(K3);
00904   const Int_t minBin = 0;
00905   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00906   if(maxCh == -1) maxCh = GetPadMax(inPulse);
00907   Double_t intensCh[NUM_SPADIC_CHA] = {0.0};
00908   
00909   //Int_t clusterWidth = 0;
00910   if (maxCh >= 1 && maxCh <= NUM_SPADIC_CHA - 1){
00911     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00912       for (Int_t bin = minBin; bin < maxBin; bin++) {
00913         if (inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) > 0.0)
00914           intensCh[ch] += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
00915       }
00916     }
00917     /*
00918     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
00919       if(intensCh[ch] >= 0.1 * intensCh[maxCh]){
00920         clusterWidth++;
00921       }
00922     }
00923     */
00924     Double_t d = 0.5 * W * log((intensCh[maxCh+1] / intensCh[maxCh-1])) / log((pow(intensCh[maxCh],2) / (intensCh[maxCh+1] * intensCh[maxCh-1])));
00925     Double_t chargeTheo = -1. / (2. * atan(SqrtK3)) * (atan(SqrtK3 * tanh(TMath::Pi() * (-2. + SqrtK3 ) * (W + 2.* d * par) / (8.* h) )) +  atan(SqrtK3 *  tanh(TMath::Pi() * (-2. + SqrtK3 ) * (W - 2.* d * par) / (8.* h) )) );       
00926     Double_t chargePercent = intensCh[maxCh] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00927     clusterwCharge->Fill(clusterWidth, chargeTheo - chargePercent);
00928   }
00929 
00930 }
00931 
00932 void CalcPrf(TH1D* inPulse[NUM_SPADIC_CHA], TH2D* prf, TProfile* prfProfile, Double_t padWidth, Int_t maxCh = -1)
00933 {
00934   const Int_t minBin = 0;
00935   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00936   if(maxCh == -1) maxCh = GetPadMax(inPulse);
00937   //Double_t intensCh[NUM_SPADIC_CHA] = {0.0};
00938   Double_t intensCh[3] = {0.0};
00939   if (maxCh >= 1 && maxCh <= NUM_SPADIC_CHA - 1){
00940     //for (Int_t ch = maxCh-1; ch <= maxCh+1; ch++){
00941     for (Int_t ch = 0; ch < 3; ch++){
00942       for (Int_t bin = minBin; bin < maxBin; bin++) {
00943         //if (inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) > 0.0)
00944         if (inPulse[maxCh-1+ch]->GetBinContent(inPulse[maxCh-1+ch]->FindBin(bin)) > 0.0)
00945           //intensCh[ch] += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
00946           intensCh[ch] += inPulse[maxCh-1+ch]->GetBinContent(inPulse[maxCh-1+ch]->FindBin(bin));
00947       }
00948     }
00949     //Double_t dxPos = 0.5 * log((intensCh[maxCh+1] / intensCh[maxCh-1])) / log((pow(intensCh[maxCh],2) / (intensCh[maxCh+1] * intensCh[maxCh-1])));
00950     Double_t dxPos = calcSimpleDisplacement( padWidth, intensCh);//0.5 * padWidth * log((intensCh[2] / intensCh[0])) / log((pow(intensCh[1],2) / (intensCh[2] * intensCh[0])));
00951     //Double_t dxPos = calcDisplacementHyperbolicSecantSquared( padWidth, intensCh);
00952     //Double_t dxPos = calcDisplacementPRFFitting( padWidth, intensCh);
00953 
00954     Double_t QSum = (intensCh[0] + intensCh[1] + intensCh[2]);
00955 
00956     //Double_t chargePercent = intensCh[maxCh-1] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00957     Double_t chargePercent = intensCh[0] / QSum;
00958     prf->Fill(-dxPos-padWidth, chargePercent);
00959     prfProfile->Fill(-dxPos-padWidth ,chargePercent);
00960     //chargePercent = intensCh[maxCh] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00961     chargePercent = intensCh[1] / QSum;
00962     prf->Fill(dxPos,chargePercent);
00963     prfProfile->Fill(dxPos ,chargePercent);
00964     //chargePercent = intensCh[maxCh+1] / (intensCh[maxCh-1] + intensCh[maxCh] + intensCh[maxCh+1]);
00965     chargePercent = intensCh[2] / QSum;
00966     prf->Fill(-dxPos+padWidth,chargePercent);
00967     prfProfile->Fill(-dxPos+padWidth ,chargePercent);
00968   }
00969 }
00970 void FillAverageSignal(TH1D* inPulse[NUM_SPADIC_CHA], TProfile* averagePulse, TH2I* averagePulse2D)
00971 {
00972   const Int_t minBin = 0;
00973   const Int_t maxBin = SPADIC_TRACE_SIZE-1;
00974   Int_t maxCh = GetPadMax(inPulse);
00975   for (Int_t bin = minBin; bin < maxBin; bin++) {
00976     averagePulse->Fill(bin,inPulse[maxCh]->GetBinContent(inPulse[maxCh]->FindBin(bin)));
00977     averagePulse2D->Fill(bin,inPulse[maxCh]->GetBinContent(inPulse[maxCh]->FindBin(bin)));
00978   }
00979 }
00980 
00981   /*
00982     void get_Pb_Ch_Cut(TString fname) {
00983     ifstream cutLib;
00984     cutLib.open("cutConditions.txt");
00985     TString run;
00986     string line;
00987     Bool_t found = false;
00988     if (cutLib.is_open()) {
00989     getline (cutLib, line);
00990     while (run != fname && cutLib.good()){
00991     cutLib >> run >> Pi_Ch1_Min >> Pi_Ch1_Max >> Pi_Ch2_Min >> Pi_Ch2_Max >> Pi_Pb_Min >> Pi_Pb_Max >> El_Ch1_Min >> El_Ch1_Max >> El_Ch2_Min >> El_Ch2_Max >> El_Pb_Min >> El_Pb_Max;
00992     //printf("%s\n",run.Data());
00993     if(run == fname){
00994     printf("          run                  Pi_Ch1_Min, Pi_Ch1_Max, Pi_Ch2_Min, Pi_Ch2_Max,  Pi_Pb_Min,  Pi_Pb_Max, El_Ch1_Min, El_Ch1_Max, El_Ch2_Min, El_Ch2_Max,  El_Pb_Min,  El_Pb_Max\n          %s %11i %11i %11i %11i %11i %11i %11i %11i %11i %11i %11i %11i\n",run.Data(), Pi_Ch1_Min, Pi_Ch1_Max, Pi_Ch2_Min, Pi_Ch2_Max, Pi_Pb_Min, Pi_Pb_Max, El_Ch1_Min, El_Ch1_Max, El_Ch2_Min, El_Ch2_Max, El_Pb_Min, El_Pb_Max);
00995     found = true;
00996     }
00997     }
00998     if (!found) printf("did not found pid cut conditions for %s\n",fname.Data());
00999     }
01000     cutLib.close();
01001     }
01002 
01003 
01004     void getPID(Float_t Ch1, Float_t Ch2, Float_t Pb) {
01005     if (Ch1 < Pi_Ch1_Max && Ch1 > Pi_Ch1_Min)
01006     if (Ch2 < Pi_Ch2_Max && Ch2 > Pi_Ch2_Min)
01007     if (Pb < Pi_Pb_Max && Pb > Pi_Pb_Min)
01008     isPion = true;
01009     if (Ch1 < El_Ch1_Max && Ch1 > El_Ch1_Min)
01010     if (Ch2 < El_Ch2_Max && Ch2 > El_Ch2_Min)
01011     if (Pb < El_Pb_Max && Pb > El_Pb_Min)
01012     isElectron = true;
01013     }
01014   */
01015 
01016 Double_t GetMaxAplitude(TH1D* inPulse[NUM_SPADIC_CHA], Int_t maxCh = -1) {
01017   if (maxCh == -1) maxCh = GetPadMax(inPulse);
01018   return inPulse[maxCh]->GetBinContent(inPulse[maxCh]->GetMaximumBin());
01019 }
01020 
01021 
01022   Bool_t HitTimeWindow(TH1D* inPulse[NUM_SPADIC_CHA], Int_t maxCh = -1) {
01023     if (maxCh == -1) maxCh = GetPadMax(inPulse);
01024     if (inPulse[maxCh]->GetMaximumBin() > 10 && inPulse[maxCh]->GetMaximumBin() < 20) // 13, 20
01025       return true;
01026 
01027     return false;
01028   }
01029 
01030   Bool_t BorderPadMax(TH1D* inPulse[NUM_SPADIC_CHA], Int_t maxCh = -1) {
01031     if (maxCh == -1) maxCh = GetPadMax(inPulse);
01032     if (maxCh == 0 || maxCh == NUM_SPADIC_CHA-1)
01033       return true;
01034     return false;
01035   }
01036 Bool_t minimumIntegralThreshold(TH1D* inPulse[NUM_SPADIC_CHA]) {
01037   if (Get3PadPosIntegral(inPulse) > 25
01038       //25 
01039       //50
01040       )//2011: 25
01041     return true;
01042   return false;
01043 }
01044 
01045 Bool_t minimumAmplitudeThreshold(TH1D* inPulse[NUM_SPADIC_CHA], Int_t maxCh = -1) {
01046   /*
01047     Int_t maxCh = GetPadMax(inPulse);
01048     if (maxCh > -1){
01049     if (inPulse[maxCh]->GetBinContent(inPulse[maxCh]->GetMaximumBin()) > 15){
01050     return true;
01051     }
01052     }
01053   */
01054   /*
01055     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++)
01056     maxAmplitudeValue->Fill(inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()));
01057   */
01058   Double_t minAmpl[3] = {12,15,15};//{10,15,15};
01059   if (maxCh == -1){ 
01060     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
01061       if (inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()) > minAmpl[susid]){ //2011: 15
01062         return true;
01063       }    
01064     }
01065     return false;
01066   }
01067   else {
01068     if (inPulse[maxCh]->GetBinContent(inPulse[maxCh]->GetMaximumBin()) > minAmpl[susid]){
01069       return true;
01070     }
01071     return false;
01072   }
01073   cout << ">>>>>>>>>>>>>>>>  BIG SHIT HAS HAPPEND!!!!!!!!!!!!!!" << endl;
01074   return false;
01075 }
01076 
01077   void BaselineCompensation(TH1D* inPulse[NUM_SPADIC_CHA], TH1D* outPulse[NUM_SPADIC_CHA], TH2I* baselineDistribution=NULL)
01078   {
01079     Double_t baseline[NUM_SPADIC_CHA] = {0.0};
01080     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
01081       outPulse[ch]->Reset();
01082       for (Int_t bin = 0; bin < noBaselineTB; bin++){
01083         baseline[ch] += inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
01084       }
01085       baseline[ch] /= (Double_t)noBaselineTB;
01086       if (baseline[ch] > 1)
01087         if(baselineDistribution)
01088           baselineDistribution->Fill(ch,baseline[ch]);
01089     }
01090    
01091     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
01092       for (Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++){
01093         outPulse[ch]->Fill(bin, inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin)) - baseline[ch]);
01094       }
01095     }
01096   }
01097   /*
01098     void NoiseCompensation(TH1D* inPulse[NUM_SPADIC_CHA],TH1D* outPulse[NUM_SPADIC_CHA])
01099     {  
01100     Double_t minIntegral = 265*45;
01101     Double_t tempIntegral = 0.0;
01102     int minch = -1;//GetMinimumChannel(input);
01103     Int_t max2minCh[NUM_SPADIC_CHA] = {-1};
01104     Double_t Integral[NUM_SPADIC_CHA] = {0.0};
01105     for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
01106     tempIntegral = 0.0;   
01107     Integral[ch] = inPulse[ch]->Integral();
01108     if (tempIntegral < minIntegral){
01109     minIntegral = tempIntegral;
01110     minch = ch;
01111     }
01112     }
01113     }
01114   */
01115 Int_t GetClusterSize(){
01116   return -1;
01117 }
01118 
01119 Int_t CancelNoise_Cova(TH1D* inPulse[NUM_SPADIC_CHA],
01120                        TH1D* outPulse[NUM_SPADIC_CHA], 
01121                        TH1I*covaMatixValue=NULL,
01122                        TH2I*covaMatixValueMaxAmplitude=NULL,
01123                        TH2I*covaMatixValueHitTime=NULL,
01124                        TH2I*maxAmplitudeHitTime=NULL,
01125                        TH1I*noiseDistribution=NULL,
01126                        TH1I*clusterSize=NULL,
01127                        TH1I*signalChDistance=NULL,
01128                        TH2I*averageNoise_2D=NULL,
01129                        TH2I*averageSignal_2D=NULL,
01130                        TH2I*covaMatixValueClusterSize=NULL,
01131                        Bool_t debug=false){
01132   Bool_t rawStatistic = false;
01133   Double_t lowercorthreshold[3] = {0.120, 0.112, 0.111};//{0.121, 0.112, 0.111};
01134   Double_t minAmplitude[3] = {30, 16, 20};
01135   //const double uppercorthreshold = 0.112;
01136   //const double nosignalcorthreshold = 0.1;
01137   Double_t cortest[NUM_SPADIC_CHA];
01138   Double_t inputarray[SPADIC_TRACE_SIZE][NUM_SPADIC_CHA] = {{0.0}};
01139   Double_t minIntegral = 265*45;
01140   Double_t tempIntegral = 0.0;
01141   Int_t minCh = -1;//GetMinimumChannel(input);
01142   Int_t maxCh = -1;//GetPadMax(inPulse);
01143   Int_t noise_ch_counter=0;
01144   Int_t signal_ch_counter=0;
01145 
01146   for(Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
01147     tempIntegral = 0.0;
01148     outPulse[ch]->Reset();
01149     for(Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++){  
01150       inputarray[bin][ch] = inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(bin));
01151       tempIntegral += inputarray[bin][ch];
01152     }
01153     if (tempIntegral < minIntegral){
01154       minIntegral = tempIntegral;
01155       minCh = ch;
01156     }
01157   }
01158 
01159   Double_t thisisnoise[SPADIC_TRACE_SIZE] = {0.0};
01160 
01161   for(int t=0;t<SPADIC_TRACE_SIZE;t++){
01162     principal->AddRow(inputarray[t]);
01163   }
01164   
01165   principal->MakePrincipals();
01166   TMatrixD* cova = (TMatrixD*)principal->GetCovarianceMatrix();
01167   
01168   Int_t lastSigCh = -1;
01169   std::list<Double_t> covaList;
01170   std::list<Double_t>::iterator it;
01171   for(int ch=0;ch<NUM_SPADIC_CHA;ch++){
01172     cortest[ch] = TMatrixDRow (*cova,minCh)(ch);
01173     if(covaMatixValueClusterSize){
01174       covaList.push_back(cortest[ch]);
01175     }
01176     if((cortest[ch] > lowercorthreshold[susid]) 
01177        && (
01178            (inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()) < minAmplitude[susid])
01179            || ((inPulse[ch]->GetMaximumBin() < 5 || inPulse[ch]->GetMaximumBin() > 20))
01180            )
01181        // && (fabs(inPulse[ch]->GetBinContent(inPulse[ch]->GetMinimumBin())) < minAmplitude[susid])
01182        ){
01183       noise_ch_counter++;
01184       for(Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++){
01185         thisisnoise[bin] += inputarray[bin][ch];
01186       }
01187     }
01188     else { //debug
01189       if (lastSigCh != -1){
01190         if(signalChDistance){
01191           signalChDistance->Fill(ch - lastSigCh/*maxCh-ch*/); //debug
01192         }
01193       }
01194       lastSigCh = ch;
01195     } //debug
01196   }
01197   if(covaMatixValueClusterSize) {
01198     covaList.sort();
01199     Int_t counter = 0;//NUM_SPADIC_CHA-1;
01200     for (it = covaList.begin(); it != covaList.end(); it++){
01201       if(debug) cout << *it << " (" << counter << ") | ";
01202       covaMatixValueClusterSize->Fill(*it,counter);
01203       counter++;
01204     }
01205     if(debug) cout << endl;
01206     covaList.clear();
01207   }
01208   //if (noise_ch_counter > 0){ // have found a noise channel to subtract
01209   //if (noise_ch_counter < NUM_SPADIC_CHA && noise_ch_counter > 0){
01210   for(Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++){
01211     thisisnoise[bin] /= (double)noise_ch_counter;
01212     if (noise_ch_counter < NUM_SPADIC_CHA && noise_ch_counter > 0){
01213       if(noiseDistribution){
01214         noiseDistribution->Fill(thisisnoise[bin]);
01215       }
01216     }    
01217   } /*//else {cout << "very bad thing happened!!" << endl;}
01218     //} else 
01219   if (noise_ch_counter == 0){ // if no noise channels could be found just subtract the lowest channel to avoid underflows
01220     for(Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++){
01221       thisisnoise[bin] = inputarray[bin][minCh];
01222     }
01223   }
01224     */
01225 
01226   for (int ch=0; ch<NUM_SPADIC_CHA; ch++){     
01227     for (int k=0; k<SPADIC_TRACE_SIZE; k++){  
01228       outPulse[ch]->Fill(k, inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(k)) - thisisnoise[k]);
01229       if ( TString(inPulse[0]->GetTitle()).BeginsWith("baselinePulse")){
01230         if(averageSignal_2D && averageNoise_2D){
01231           if (rawStatistic){
01232             averageSignal_2D->Fill(k,inPulse[ch]->GetBinContent(inPulse[ch]->FindBin(k)));
01233           } else {
01234             averageSignal_2D->Fill(k,outPulse[ch]->GetBinContent(outPulse[ch]->FindBin(k)));
01235           }
01236           averageNoise_2D->Fill(k,thisisnoise[k]);
01237         }
01238       }
01239     }
01240     if ( TString(inPulse[ch]->GetTitle()).BeginsWith("baselinePulse")){
01241       if (rawStatistic){
01242         if (ch != minCh)
01243           if (covaMatixValue)
01244             covaMatixValue->Fill(cortest[ch]);
01245         if (ch != minCh)
01246           if(covaMatixValueMaxAmplitude)
01247             covaMatixValueMaxAmplitude->Fill(cortest[ch], inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()));
01248         if (ch != minCh)
01249           if(covaMatixValueHitTime)
01250             covaMatixValueHitTime->Fill(cortest[ch], inPulse[ch]->GetMaximumBin());
01251         if(maxAmplitudeHitTime)
01252           if (inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()) > 0.0){
01253             maxAmplitudeHitTime->Fill(inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin()), inPulse[ch]->GetMaximumBin());
01254           }
01255       } else {
01256         if (ch != minCh){
01257           if (covaMatixValue){
01258             covaMatixValue->Fill(cortest[ch]);
01259           }     
01260           if(covaMatixValueMaxAmplitude){
01261             covaMatixValueMaxAmplitude->Fill(cortest[ch], outPulse[ch]->GetBinContent(outPulse[ch]->GetMaximumBin()));
01262           }     
01263           if(covaMatixValueHitTime){
01264             covaMatixValueHitTime->Fill(cortest[ch], outPulse[ch]->GetMaximumBin());
01265           }
01266         }
01267         if(maxAmplitudeHitTime){
01268           if (outPulse[ch]->GetBinContent(outPulse[ch]->GetMaximumBin()) > 0.0){
01269             maxAmplitudeHitTime->Fill(outPulse[ch]->GetBinContent(outPulse[ch]->GetMaximumBin()), outPulse[ch]->GetMaximumBin());
01270           }
01271         }       
01272       }
01273     }
01274   }
01275   if ( TString(inPulse[0]->GetTitle()).BeginsWith("baselinePulse")){
01276     if (clusterSize){      
01277       if (rawStatistic){
01278         maxCh = GetPadMax(inPulse);
01279         for (Int_t iCh = maxCh; iCh < NUM_SPADIC_CHA; iCh++){
01280           if (
01281               (cortest[iCh] > lowercorthreshold[susid]) 
01282               && (
01283                   (inPulse[iCh]->GetBinContent(inPulse[iCh]->GetMaximumBin()) < minAmplitude[susid])
01284                   || ((inPulse[iCh]->GetMaximumBin() < 5 || inPulse[iCh]->GetMaximumBin() > 20))        
01285                   )             
01286               ) break;
01287           signal_ch_counter++;
01288         }
01289         for (Int_t iCh = maxCh-1; iCh >= 0; iCh--){
01290           if (
01291               (cortest[iCh] > lowercorthreshold[susid]) 
01292               && (
01293                   (inPulse[iCh]->GetBinContent(inPulse[iCh]->GetMaximumBin()) < minAmplitude[susid])
01294                   || ((inPulse[iCh]->GetMaximumBin() < 5 || inPulse[iCh]->GetMaximumBin() > 20))
01295                   )             
01296               ) break;
01297           signal_ch_counter++;
01298         } 
01299       } else {
01300         maxCh = GetPadMax(outPulse);
01301         for (Int_t iCh = maxCh; iCh < NUM_SPADIC_CHA; iCh++){
01302           if (
01303               (cortest[iCh] > lowercorthreshold[susid]) 
01304               && (
01305                   (inPulse[iCh]->GetBinContent(inPulse[iCh]->GetMaximumBin()) < minAmplitude[susid])
01306                   || ((inPulse[iCh]->GetMaximumBin() < 5 || inPulse[iCh]->GetMaximumBin() > 20))        
01307                   )             
01308               ) break;
01309           signal_ch_counter++;
01310         }
01311         for (Int_t iCh = maxCh-1; iCh >= 0; iCh--){
01312           if (
01313               (cortest[iCh] > lowercorthreshold[susid]) 
01314               && (
01315                   (inPulse[iCh]->GetBinContent(inPulse[iCh]->GetMaximumBin()) < minAmplitude[susid])
01316                   || ((inPulse[iCh]->GetMaximumBin() < 5 || inPulse[iCh]->GetMaximumBin() > 20))
01317                   )             
01318               ) break;
01319           signal_ch_counter++;
01320         } 
01321       }      
01322       //clusterSize->Fill(NUM_SPADIC_CHA-noise_ch_counter); //debug
01323       clusterSize->Fill(signal_ch_counter); //debug
01324     }
01325   }
01326   principal->Clear();
01327   return signal_ch_counter;
01328 }
01329 void CalcDeltaSim(TH1D *delta, TH1D *sim/*, TH1D *measurement*/) {
01330   delta->SetYTitle(/*"#Delta [%]"*/"#frac{measured}{simulated}");
01331   delta->GetXaxis()->SetLabelSize(0.08);
01332   delta->GetYaxis()->SetLabelSize(0.08);
01333   delta->GetXaxis()->SetTitleSize(0.09);
01334   delta->GetYaxis()->SetTitleSize(0.09);
01335   delta->GetYaxis()->SetTitleOffset(0.5);
01336   delta->GetXaxis()->SetTitleOffset(1.0);
01337   //delta->Sumw2();
01338   delta->Divide(sim);
01339  
01340   /*
01341     for (Int_t bin = 1; bin < delta->GetNbinsX(); bin++) {
01342     Float_t dEdx = delta->GetBinCenter(bin);
01343     Float_t simValue = sim->GetBinContent(sim->FindBin(dEdx));
01344     Float_t measuredValue = measurement->GetBinContent(measurement->FindBin(dEdx));
01345     if (simValue > 0 && measuredValue > 0 && measurement->FindBin(dEdx) < measurement->GetNbinsX()+1)     
01346     delta->SetBinContent(bin, measuredValue/simValue);
01347 
01348     }
01349   */
01350 }
01351 
01352   Double_t Calibration(TString file, Int_t suid) {
01353 
01354     TFile *output = new TFile(file,"READ");
01355     if (output->IsOpen()) {
01356       TF1 *uLandau = NULL;
01357       TF1 *sLandau = NULL;
01358       TH1D* uncalibrated = (TH1D*)output->Get("Uncalibrated_Pions"); 
01359       //TH1D* uncalibratedElectron = (TH1D*)output->Get("Uncalibrated_Electrons"); 
01360       /*
01361       // offset
01362       Int_t xBin = 1;
01363       Float_t threshold = uncalibrated->GetEntries() * 5.0e-4;
01364       while (uncalibrated->GetBinContent(xBin) <= threshold)
01365       xBin++;
01366       if (xBin > 1)
01367       calibrationParameter[1] = uncalibrated->GetBinCenter(xBin);//0.5 * (uncalibrated->GetBinCenter(xBin) + uncalibrated->GetBinCenter(xBin+1));
01368       else
01369       calibrationParameter[1] = 0.0;
01370 
01371       if (suid == 11)
01372       calibrationParameter[1] *= 0.75;
01373       else if (suid == 10)
01374       calibrationParameter[1] *= 0.90;
01375       else if (suid == 18)
01376       calibrationParameter[1] *= 0.65;
01377     
01378       // with offset compensation
01379       Double_t uncMax           = uncalibrated->GetBinContent(uncalibrated->GetMaximumBin());
01380       Double_t uncFullHeight    = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.50 * uncMax)) - calibrationParameter[1];
01381       Double_t uncPercentHeight = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.10 * uncMax)) - calibrationParameter[1];
01382       Double_t uncPermillHeight = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.05 * uncMax)) - calibrationParameter[1];
01383       */
01384       /*
01385       // without offset compensation
01386       Double_t uncMax           = uncalibrated->GetBinContent(uncalibrated->GetMaximumBin());
01387       Double_t uncFullHeight    = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.50 * uncMax));
01388       Double_t uncPercentHeight = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.10 * uncMax));
01389       Double_t uncPermillHeight = uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(0.05 * uncMax));
01390       */
01391       const Double_t yFitRange = 0.50;
01392       //landau = new TF1("landau","landau",0,uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(yFitRange * uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()))));//3000);//2000
01393       uLandau = new TF1("uLandau","[0]*TMath::Landau(x,[1],[2],0)+[3]*TMath::Gaus(x,[1],[4],0)",200,uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(yFitRange * uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()))));//3000);//2000
01394       uLandau->SetParName(0,"lConstant");
01395       uLandau->SetParameter("lConstant",uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()));
01396 
01397       uLandau->SetParName(1,"MPV");
01398       uLandau->SetParameter("MPV",700);
01399       uLandau->SetParLimits(1,500,810);//(1,514,644);
01400 
01401       uLandau->SetParName(2,"lSigma");
01402       uLandau->SetParameter("lSigma",190);
01403       uLandau->SetParLimits(2,100.0,220.0);
01404 
01405       uLandau->SetParName(3,"gConstant");
01406       uLandau->SetParameter("gConstant",0.025 * uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()));
01407       uLandau->SetParLimits(3,0.0,uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()));
01408 
01409       uLandau->SetParName(4,"gSigma");
01410       uLandau->SetParameter("gSigma",160);
01411       uLandau->SetParLimits(4,0.0,200);
01412       //landau->SetParLimits(2,114.7,175.0);//160.13); 
01413   
01414       uncalibrated->Fit(uLandau,"0QRB");//LL"); 
01415       printf("Unc:         Landau    Gaus\nConst.  %9.4f     %9.4f\nMPV     %9.4f     %9.4f\nSigma   %9.4f     %9.4f\n\n",uLandau->GetParameter("lConstant"),uLandau->GetParameter("gConstant"),uLandau->GetParameter("MPV"),uLandau->GetParameter("MPV"),uLandau->GetParameter("lSigma"),uLandau->GetParameter("gSigma"));    
01416       MPV_adc = uLandau->GetParameter("MPV");
01417       sigma_adc = uLandau->GetParameter("lSigma");
01418       ChiSqr_adc = uLandau->GetChisquare()/uLandau->GetNDF();
01419       TH2I *paras = NULL;
01420       TProfile *momentumMPV = NULL;
01421       TProfile *momentumSigma = NULL;
01422       TProfile *HVMPV = NULL;
01423       TProfile *HVSigma = NULL;
01424       TFile *fitFile = new TFile("CalibrationFitParameter.root","UPDATE");
01425       if (fitFile->IsOpen()) {
01426         TString title;
01427         title.Form("sigma_MPV_%i",suid);
01428         paras = (TH2I*)fitFile->Get(title);
01429         if (NULL == paras)
01430           paras = new TH2I(title,title,500,0,500,1500,0,1500);
01431         paras->Fill(sigma_adc, MPV_adc);
01432 
01433         title.Form("momentum_MPV_%i",suid);
01434         momentumMPV = (TProfile*)fitFile->Get(title);
01435         if (NULL == momentumMPV)
01436           momentumMPV = new TProfile(title,title,10,0.5,10.5);
01437         if (AnodeV == 1775)
01438           momentumMPV->Fill(momentum, MPV_adc);
01439 
01440         title.Form("momentum_Sigma_%i",suid);
01441         momentumSigma = (TProfile*)fitFile->Get(title);
01442         if (NULL == momentumSigma)
01443           momentumSigma = new TProfile(title,title,10,0.5,10.5);
01444         if (AnodeV == 1775)
01445           momentumSigma->Fill(momentum, sigma_adc);
01446 
01447         title.Form("HV_MPV_%i",suid);
01448         HVMPV = (TProfile*)fitFile->Get(title);
01449         if (NULL == HVMPV)
01450           HVMPV = new TProfile(title,title,3,1737.5,1812.5);
01451         if (momentum == 3)
01452           HVMPV->Fill(AnodeV, MPV_adc);
01453 
01454         title.Form("HV_Sigma_%i",suid);
01455         HVSigma = (TProfile*)fitFile->Get(title);
01456         if (NULL == HVSigma)
01457           HVSigma = new TProfile(title,title,3,1737.5,1812.5);
01458         if (momentum == 3)
01459           HVSigma->Fill(AnodeV, sigma_adc);
01460 
01461         fitFile->cd();
01462         paras->Write("", TObject::kOverwrite);
01463         momentumMPV->Write("", TObject::kOverwrite);
01464         momentumSigma->Write("", TObject::kOverwrite);
01465         HVMPV->Write("", TObject::kOverwrite);
01466         HVSigma->Write("", TObject::kOverwrite);
01467         fitFile->Close();
01468       }
01469       calibrationParameter[0] = uLandau->GetParameter("MPV");//uncalibrated->GetMean();
01470       //printf("\nuncalibrated:\n  MPV = %7.3f  offset = %7.3f (%7.3f) \n",calibrationParameter[0], calibrationParameter[1], threshold);
01471    
01472       //calibrationParameter[1] = landau->GetParameter("Sigma");
01473   
01474       TString simfile = "data2012/root/sim/Sim_xeco20_12mm_03GeV.root";
01475       simfile.Form("data2012/root/sim/Sim_xeco20_12mm_%02iGeV.root",momentum);
01476       //cout << simfile << endl;
01477       TFile *sim = new TFile(simfile.Data(),"READ");
01478       //TFile *sim = new TFile(/*"Pions_dEdx_3GeV_12mm_XeCo2.root"*/"data2012/root/sim/Sim_xeco20_12mm_03GeV.root","READ");
01479       TH1D* simulated= (TH1D*)sim->Get("hPi"); 
01480       /*
01481         Double_t simMax           = simulated->GetBinContent(simulated->GetMaximumBin());
01482         Double_t simFullHeight    = simulated->GetBinCenter(simulated->FindLastBinAbove(0.50 * simMax));
01483         Double_t simPercentHeight = simulated->GetBinCenter(simulated->FindLastBinAbove(0.10 * simMax));
01484         Double_t simPermillHeight = simulated->GetBinCenter(simulated->FindLastBinAbove(0.05 * simMax));
01485       */
01486       //landau = new TF1("landau","landau",0,simulated->GetBinCenter(simulated->FindLastBinAbove(yFitRange * simulated->GetBinContent(simulated->GetMaximumBin()))));//30);//10
01487       sLandau = new TF1("sLandau","[0]*TMath::Landau(x,[1],[2],0)+[3]*TMath::Gaus(x,[1],[4],0)",1,simulated->GetBinCenter(simulated->FindLastBinAbove(yFitRange * simulated->GetBinContent(simulated->GetMaximumBin()))));//30);//10
01488     
01489       sLandau->SetParName(0,"lConstant");
01490       sLandau->SetParameter("lConstant",simulated->GetBinContent(simulated->GetMaximumBin()));
01491 
01492       sLandau->SetParName(1,"MPV");
01493       sLandau->SetParLimits(1,0.0,5);
01494       sLandau->SetParameter("MPV",3.75);
01495 
01496       sLandau->SetParName(2,"lSigma");
01497       sLandau->SetParLimits(2,0.0,2);
01498       sLandau->SetParameter("lSigma",1.13);
01499 
01500       sLandau->SetParName(3,"gConstant");
01501       sLandau->SetParLimits(3,0.0, simulated->GetBinContent(simulated->GetMaximumBin()));
01502       sLandau->SetParameter("gConstant",0.025 * simulated->GetBinContent(simulated->GetMaximumBin()));
01503 
01504       sLandau->SetParName(4,"gSigma");
01505       sLandau->SetParLimits(4,0.0,10);
01506       sLandau->SetParameter("gSigma",1.5);
01507 
01508       simulated->Fit( sLandau,"0QRB");//LL");
01509       printf("Sim:         Landau    Gaus\nConst.  %9.4f     %9.4f\nMPV     %9.4f     %9.4f\nSigma   %9.4f     %9.4f\n\n",sLandau->GetParameter("lConstant"),sLandau->GetParameter("gConstant"),sLandau->GetParameter("MPV"),sLandau->GetParameter("MPV"),sLandau->GetParameter("lSigma"),sLandau->GetParameter("gSigma"));
01510       MPV_kev = sLandau->GetParameter("MPV");
01511       sigma_kev = sLandau->GetParameter("lSigma");
01512       ChiSqr_kev = sLandau->GetChisquare()/ sLandau->GetNDF();
01513       calibrationParameter[2] =  sLandau->GetParameter("MPV");//simulated->GetMean();
01514       printf("\nfit range: [0, %f]  [0, %f]\n",uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(yFitRange * uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()))),simulated->GetBinCenter(simulated->FindLastBinAbove(yFitRange * simulated->GetBinContent(simulated->GetMaximumBin()))));
01515       printf("\n     MPV      sigma     ChiSqr/NDF\nADC: %7.3f  %7.3f  %7.3f\nkev: %7.3f  %7.3f  %7.3f\n  1) m = %7.5f, b = %7.5f\n  2) m = %7.5f, b = %7.5f\n",MPV_adc,sigma_adc,ChiSqr_adc,MPV_kev,sigma_kev,ChiSqr_kev,
01516              (MPV_kev-sigma_kev)/(MPV_adc-sigma_adc),MPV_kev-(MPV_kev-sigma_kev)/(MPV_adc-sigma_adc)*MPV_adc,
01517              sigma_kev/sigma_adc,MPV_kev-sigma_kev/sigma_adc*MPV_adc
01518              );
01519       /*
01520         if (susid == 0){
01521         sigma_adc *= 0.85;
01522         MPV_adc *= 0.90;
01523         }
01524         if (susid == 2){
01525         sigma_adc *= 0.85;
01526         MPV_adc *= 0.85;
01527         }
01528       */
01529       if (susid == 0){
01530         if (momentum == 2){
01531           sigma_adc = 128;
01532           MPV_adc = 510;
01533         } else if (momentum == 3){
01534           if (AnodeV == 1750){
01535             sigma_adc = 150;
01536             MPV_adc = 515;//529.84
01537           } else if (AnodeV == 1775){
01538             sigma_adc = 175;
01539             MPV_adc = 629.78;//595.72//657.05
01540           } else if (AnodeV == 1800){
01541             sigma_adc = 190;
01542             MPV_adc = 696.98;
01543           }
01544         } else if (momentum == 4){
01545           sigma_adc = 170;
01546           MPV_adc = 750.00;
01547         } else if (momentum == 6){
01548           sigma_adc = 180.;
01549           MPV_adc = 650.;//630.12
01550         } else if (momentum == 8){
01551           sigma_adc = 190;//218.74
01552           MPV_adc = 650.00;//651.86
01553         }   
01554       }
01555       if (susid == 1){
01556         if (momentum == 2){
01557           sigma_adc = 140;//163.24
01558           MPV_adc = 600;
01559         } else if (momentum == 3){
01560           if (AnodeV == 1750){
01561             sigma_adc = 124.48;
01562             MPV_adc = 534.72;
01563           } else if (AnodeV == 1775){
01564             sigma_adc = 146.69;//136.99//144.65
01565             MPV_adc = 604.33;//580.00//608.40
01566           } else if (AnodeV == 1800){
01567             sigma_adc = 153;
01568             MPV_adc = 629.1;
01569           }
01570         } else if (momentum == 4){
01571           sigma_adc = 140;
01572           MPV_adc = 668.04;
01573         } else if (momentum == 6){
01574           sigma_adc = 160;
01575           MPV_adc = 654.10;
01576         } else if (momentum == 8){
01577           sigma_adc = 173.48;
01578           MPV_adc = 670.05;
01579         }   
01580       }
01581       if (susid == 2){
01582         if (momentum == 2){
01583 
01584         } else if (momentum == 3){
01585           if (AnodeV == 1750){
01586             sigma_adc = 150;
01587             MPV_adc = 520;
01588           } else if (AnodeV == 1775){
01589             sigma_adc = 170;
01590             MPV_adc = 560;//850
01591           } else if (AnodeV == 1800){
01592             sigma_adc = 180;
01593             MPV_adc = 550;
01594           }
01595         } else if (momentum == 4){
01596 
01597         } else if (momentum == 6){
01598 
01599         } else if (momentum == 8){
01600 
01601         }
01602       }
01603       
01604   
01605    
01606       if (suid == 11){
01607         //MPV_adc = 595.506;
01608         //sigma_adc = 136.429;
01609         //calibrationParameter[3] = 1.22 * (simFullHeight / uncFullHeight + simPercentHeight / uncPercentHeight + simPermillHeight / uncPermillHeight) / 3.0;
01610         //calibrationParameter[2] *= 1.25;//without offset
01611         //calibrationParameter[2] *= 1.25;//with offset
01612       }
01613       else if (suid == 10){
01614         //calibrationParameter[3] = 1.00 * (simFullHeight / uncFullHeight + simPercentHeight / uncPercentHeight + simPermillHeight / uncPermillHeight) / 3.0;
01615         //calibrationParameter[2] *= 1.22;//without offset
01616         //calibrationParameter[2] *= 1.10;//with offset
01617       }
01618       else if (suid == 18){
01619         //calibrationParameter[3] = 2.00 * (simFullHeight / uncFullHeight + simPercentHeight / uncPercentHeight + simPermillHeight / uncPermillHeight) / 3.0;
01620         //calibrationParameter[2] *= 2.25;//without offset
01621         //calibrationParameter[2] *= 2.35;//with offset
01622       }
01623       /*
01624         printf("simulated:\n  MPV = %7.3f  offset = %7.3f \n",landau->GetParameter("MPV"), 0.0);
01625         printf("\n  (ADCvalue / %7.3f ) * %7.3f     -> ADCvalue * %7.6f\n",calibrationParameter[0],calibrationParameter[2],calibrationParameter[2]/calibrationParameter[0]);
01626         printf("\n  ADCvalue * %7.6f\n\n",calibrationParameter[3]);
01627 
01628         printf("  maxA:%.2f  %.2f  %.2f  %.2f\n  maxA:%.2f  %.2f  %.2f  %.2f\n",uncMax,uncFullHeight,uncPercentHeight,uncPermillHeight,simMax,simFullHeight,simPercentHeight,simPermillHeight);
01629       */
01630       printf("\nfit range: [0, %f]  [0, %f]\n",uncalibrated->GetBinCenter(uncalibrated->FindLastBinAbove(yFitRange * uncalibrated->GetBinContent(uncalibrated->GetMaximumBin()))),simulated->GetBinCenter(simulated->FindLastBinAbove(yFitRange * simulated->GetBinContent(simulated->GetMaximumBin()))));
01631       printf("\n     MPV      sigma     ChiSqr/NDF\nADC: %7.3f  %7.3f  %7.3f\nkev: %7.3f  %7.3f  %7.3f\n  1) m = %7.5f, b = %7.5f\n  2) m = %7.5f, b = %7.5f\n",MPV_adc,sigma_adc,ChiSqr_adc,MPV_kev,sigma_kev,ChiSqr_kev,
01632              (MPV_kev-sigma_kev)/(MPV_adc-sigma_adc),MPV_kev-(MPV_kev-sigma_kev)/(MPV_adc-sigma_adc)*MPV_adc,
01633              sigma_kev/sigma_adc,MPV_kev-sigma_kev/sigma_adc*MPV_adc
01634              );
01635       output->Close();
01636       return  MPV_adc;//calibrationParameter[0];//landau->GetParameter("MPV");//*0.85;
01637     }
01638     else
01639       return 1;
01640   }
01641 
01642 void FillUnCalibratedPionSpectrum(TString filename, TString file,  Int_t usedSuId, Bool_t amplitude, Bool_t debug) {
01643   printf("---FillUnCalibratedPionSpectrum---\n");
01644   TFile *output = new TFile(file,"UPDATE");
01645   if (output->IsOpen()) {
01646     TH1D* uncalibrated = new TH1D("Uncalibrated_Pions","Uncalibrated Pion Spectrum",200,0,100*fHistoScale);
01647     TH1D* uncalibratedElectron = new TH1D("Uncalibrated_Electrons","Uncalibrated Electron Spectrum",200,0,100*fHistoScale);
01648     //TH1I* hitTime = new TH1I();
01649     //TH1I *amplitude = new TH1I();
01650 
01651     TH1I *clusterSize = new TH1I("UC_clusterSize","clusterSize",NUM_SPADIC_CHA+1,-0.5,NUM_SPADIC_CHA+0.5);
01652     TH1I *maxAmplitudeValue = new TH1I("UC_maxAmplitudeValue","maxAmplitudeValue",256*2,0,256);
01653     TH2I *maxAmplitudeHitTime = new TH2I("UC_maxAmplitudeHitTime","maxAmplitudeHitTime",256,0,256,45,0,45);
01654     TH1I *covaMatixValue = new TH1I("UC_covaMatixValue","covaMatixValue",1000,-0.13,0.13);
01655     TH2I *covaMatixValueMaxAmplitude = new TH2I("UC_covaMatixValueMaxAmplitude","covaMatixValueMaxAmplitude",1000,-0.13,0.13,256,0,256);
01656     TH2I *covaMatixValueHitTime = new TH2I("UC_covaMatixValueHitTime","covaMatixValueHitTime",1000,-0.13,0.13,45,0,45);
01657     TH1I *signalChDistance = new TH1I("UC_signalChDistance","signalChDistance",2*NUM_SPADIC_CHA+1,-NUM_SPADIC_CHA-0.5,NUM_SPADIC_CHA+0.5);
01658     TH2I *averageSignal_2D = new TH2I("UC_averageSignal_2D","averageSignal_2D",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,356,-100,256);
01659     TH2I *averageNoise_2D = new TH2I("UC_averageNoise_2D","averageNoise_2D",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,356,-100,256);
01660     TH1I *noiseDistribution = new TH1I("UC_noiseDistribution","noiseDistribution",2*SPADIC_ADC_MAX,-SPADIC_ADC_MAX,SPADIC_ADC_MAX);
01661     TH2I *baselineDistribution = new TH2I("UC_baselineDistribution","baselineDistribution",NUM_SPADIC_CHA,-0.5,NUM_SPADIC_CHA-0.5,SPADIC_ADC_MAX,0,SPADIC_ADC_MAX);
01662 
01663     TH1D *rawPulse[NUM_SPADIC_CHA];
01664     TH1D *baselinePulse[NUM_SPADIC_CHA];
01665     TH1D *baselineNoisePulse[NUM_SPADIC_CHA];
01666     TString name;
01667     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) {
01668       name.Form("Ch%02i",ch);
01669       rawPulse[ch] = new TH1D("rawPulse"+name,"rawPulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
01670       baselinePulse[ch] = new TH1D("baselinePulse"+name,"baselinePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
01671       baselineNoisePulse[ch] = new TH1D("baselineNoisePulse"+name,"baselineNoisePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
01672     }
01673     name = filename;
01674     name.ReplaceAll(".root","");
01675     GetPidCuts(name.ReplaceAll("data2012/TTrees/merged/",""));
01676     TFile inputFile(filename,"READ");
01677     if (inputFile.IsOpen()) {
01678       TTree* theTree=NULL;
01679       TKey* kee=NULL;
01680       TIter iter(inputFile.GetListOfKeys());
01681       while ( ( kee=dynamic_cast<TKey*>(iter()) ) !=0 ) {
01682         theTree = dynamic_cast<TTree*>(kee->ReadObj());
01683         if (theTree)
01684           break; // we take first Tree in file, disregarding its name...
01685       }
01686       if(theTree==0) {
01687         cout <<"Error: no Tree in file "<< filename.Data() << endl;
01688         return;
01689       }
01690       TCernOct12UnpackEvent* evnt = new TCernOct12UnpackEvent;
01691       TGo4EventElement* theBase=evnt;
01692       evnt->synchronizeWithTree(theTree, &theBase);
01693       Int_t entries = theTree->GetEntries();
01694       Int_t nPion(0),nElectron(0);
01695       printf("%i Events found in TTree\n",entries);
01696       TMbsCrateEvent* fCrateInputEvent=NULL;
01697       TSpadicEvent* SpadicInputEvent=NULL;
01698       TSpadicData* theSpadic=NULL;
01699       Float_t Ch1(0), Ch2(0), Pb(0);
01700       //Bool_t isPulser = false;
01701       Int_t clusterCh = 0;
01702       if (debug) entries /= 100;
01703       for(Int_t i=0;i<entries;++i) {
01704         Statusbar(i,entries);
01705         theTree->GetEntry(i);
01706         fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(evnt->GetSubEvent("MBSCRATE"));    
01707         SpadicInputEvent=dynamic_cast<TSpadicEvent*>(evnt->GetSubEvent("SPADIC"));
01708         isPion = false;
01709         isElectron = false;
01710         isOverFlowEvent = false;
01711         isUnderFlowEvent = false;
01712         isPulser = fCrateInputEvent->fIsPulser;
01713         if (isPulser) continue;
01714         if ((Ch1 < 350 && Pb < 350) || (Ch2 < 350 && Pb < 350)) continue;
01715     
01716         /*
01717         //2011
01718         Ch1 = fCrateInputEvent->fData1182[1][0];
01719         Ch2 = fCrateInputEvent->fData1182[0][1];
01720         Pb  = fCrateInputEvent->fData1182[1][5];      
01721         */
01722         //2012
01723         Ch1 = fCrateInputEvent->fData1182[1][0];
01724         Ch2 = fCrateInputEvent->fData1182[0][0];
01725         Pb  = fCrateInputEvent->fData1182[1][1];
01726         getPID(Ch1, Ch2, Pb);
01727         if (isPion)
01728           nPion++;
01729         if (isElectron)
01730           nElectron++;
01731       
01732         //for (Int_t suid = 0; suid < /*usedSusibos*/1; suid++){
01733         theSpadic=dynamic_cast<TSpadicData*>(SpadicInputEvent->getEventElement(usedSuId));
01734 
01735         if(NULL == theSpadic || !theSpadic) {cout << "no data found for Susibo " << usedSuId << endl; return;}
01736         if (isPion || isElectron){
01737           for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) {       
01738             rawPulse[ch]->Reset();
01739             baselinePulse[ch]->Reset();
01740             baselineNoisePulse[ch]->Reset();
01741      
01742             for (Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++) {       
01743               rawPulse[ch]->Fill(bin, (Double_t)theSpadic->fSpadicPulse[ch][bin]);
01744             }     
01745           }
01746    
01747           BaselineCompensation(rawPulse, baselinePulse, baselineDistribution);
01748           clusterCh = CancelNoise_Cova(baselinePulse, baselineNoisePulse, covaMatixValue,covaMatixValueMaxAmplitude,covaMatixValueHitTime,maxAmplitudeHitTime,noiseDistribution,clusterSize,signalChDistance,averageNoise_2D,averageSignal_2D,NULL,false);
01749 
01750 
01751           //inPulse[ch]->GetBinContent(inPulse[ch]->GetMaximumBin())
01752 
01753           if(amplitude){
01754             if (isElectron || isPion)
01755               for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++)
01756                 maxAmplitudeValue->Fill(baselineNoisePulse[ch]->GetBinContent(baselineNoisePulse[ch]->GetMaximumBin()));
01757             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
01758               if (isPion){
01759                 uncalibrated->Fill(Get3PadPosAmplitude(baselineNoisePulse));
01760               }
01761               else if (isElectron){
01762                 uncalibratedElectron->Fill(Get3PadPosAmplitude(baselineNoisePulse));
01763               }
01764             }
01765           }     
01766           else{
01767 
01768             for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++)
01769               maxAmplitudeValue->Fill(baselineNoisePulse[ch]->GetBinContent(baselineNoisePulse[ch]->GetMaximumBin()));
01770             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
01771               if (isPion){
01772                 uncalibrated->Fill(Get3PadPosIntegral(baselineNoisePulse));     
01773               }
01774               else if (isElectron){
01775                 uncalibratedElectron->Fill(Get3PadPosIntegral(baselineNoisePulse));
01776               }
01777             }
01778           }
01779         }
01780       }
01781       printf("%.2f%% pions, %.2f%% electrons and %.2f%% no PID or noise\n",Float_t(nPion)/entries*100,Float_t(nElectron)/entries*100, Float_t(entries-(nElectron+nPion))/entries*100);
01782       output->cd();
01783       uncalibrated->Write("", TObject::kOverwrite);
01784       uncalibratedElectron->Write("", TObject::kOverwrite);
01785 
01786       maxAmplitudeValue->Write("", TObject::kOverwrite);
01787       covaMatixValue->Write("", TObject::kOverwrite);
01788       covaMatixValueMaxAmplitude->Write("", TObject::kOverwrite);
01789       covaMatixValueHitTime->Write("", TObject::kOverwrite);
01790       clusterSize->Write("", TObject::kOverwrite);
01791       maxAmplitudeHitTime->Write("", TObject::kOverwrite);
01792   
01793       noiseDistribution->SetXTitle("noise [ADC]");
01794       noiseDistribution->SetYTitle("#");
01795       noiseDistribution->Write("", TObject::kOverwrite);
01796       baselineDistribution->SetXTitle("channel");
01797       baselineDistribution->SetYTitle("ADC");
01798       baselineDistribution->Write("", TObject::kOverwrite);
01799 
01800       output->Close();
01801       inputFile.Close();
01802      
01803       /*
01804         delete theTree;
01805         delete kee;
01806         delete evnt;
01807         delete theBase;
01808         delete fCrateInputEvent;
01809         delete SpadicInputEvent;
01810         delete theSpadic;
01811       
01812         delete uncalibrated; 
01813       
01814         for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) {
01815         delete rawPulse[ch];
01816         delete baselinePulse[ch];
01817         delete baselineNoisePulse[ch];
01818         }
01819       */
01820     }
01821     else {
01822       printf("ERROR::FillUnCalibratedPionSpectrum: %s not found",filename.Data());
01823     }
01824   }
01825   else {
01826     printf("ERROR::FillUnCalibratedPionSpectrum: %s not found",file.Data());
01827 
01828   }
01829 }
01830   //void spadic_noise_Analysis(){
01831 
01832   //}
01833 
01834 void spadic_noise_Analysis(TString filename=/*"data2011/TTrees/Be_run2110020.root"*/"data2012/TTrees/Be_run2310004.root",TString radiator = "D", const Int_t suid = 1, Bool_t debug=false, Bool_t simple = false, Bool_t plotFromFile = true)
01835 {
01836   TStopwatch timer;
01837   timer.Start();
01838   Bool_t fast = true;
01839   gROOT->Reset(); 
01840   gROOT->SetStyle("Plain");
01841   gStyle->SetPalette(1,0);
01842   gStyle->SetOptStat(kFALSE);
01843   gStyle->SetOptTitle(kFALSE);
01844   gStyle->SetPadTickX(1);                         //<-- tic marks on all axes
01845   gStyle->SetPadTickY(1);  
01846   Bool_t amplitude = false;
01847  
01848   if (suid > 4){
01849     printf("ERROR:: did not find susibo %i\n",suid);
01850     return;
01851   }
01852   susid = suid;
01853   TString tempcast = filename;
01854   TString replaceString;
01855   momentum = TString((tempcast.ReplaceAll("data2012/TTrees/merged/",""))(0,1)).Atoi();
01856   replaceString.Form("%iGeV_",momentum);
01857   AnodeV = TString((tempcast.ReplaceAll(replaceString,""))(0,4)).Atoi();
01858   replaceString.Form("%iV_",AnodeV);
01859   DriftV = TString((tempcast.ReplaceAll(replaceString,""))(0,3)).Atoi();
01860   if (AnodeV == 0)
01861     AnodeV = 1800;
01862   if (DriftV == 0)
01863     DriftV = 500;
01864   printf("\n  momentum: %iGeV  anode: %iV  drift: %iV\n", momentum, AnodeV, DriftV);
01865   TString simfile = "data2012/root/sim/Sim_xeco20_12mm_03GeV.root";
01866   simfile.Form("data2012/root/sim/Sim_xeco20_12mm_%02iGeV.root",momentum);
01867   cout << "  sim. file path: " << simfile << endl;
01868   const Int_t usedSusibos = 5;
01869   //Int_t usedSuId[usedSusibos] = {         2,         12,        6,        18,         4,         5,        16,        17  };
01870   //TString usedSuName[usedSusibos] = {"MS336/10","MS336/11","MS444/10","MS444/11","FFM01","FFM02","FFM03","FFM04"};
01871   //Double_t padWidth[usedSusibos] = {5,5,8,8,0,0,0,0};
01872   //Double_t h[usedSusibos] = {3,3,4,4,0,0,0,0};
01873   Int_t usedSuId[usedSusibos] = {            11,      10,        18,        5,       19};
01874   TString usedSuName[usedSusibos] = {"MS_R_I","MS_N_II","MS_J_III","FFM_5+5","FFM_4+4"};
01875   Double_t padWidth[usedSusibos] = {     7.125,   7.125,     7.125,    7.125,    7.125};
01876   Double_t h[usedSusibos] = {              3.5,     3.5,       3.5,        5,        4};
01877   Double_t K3 = calcK3(h[0]);//0.525;
01878   Double_t par = 1.0;
01879   TString outpic;
01880   TString outfilename;
01881   outpic = filename;
01882   outpic.ReplaceAll("data2012/TTrees/merged/","");
01883   outpic.ReplaceAll(".root","");
01884   outfilename.Form("data2012/root/Spectra_%s_Rad_%s_Sus%02i.root",outpic.Data(),radiator.Data(),usedSuId[suid]);
01885   outpic = outfilename;
01886   outpic.ReplaceAll("root/","pics/");
01887   outpic.ReplaceAll(".root","");
01888   Double_t MPV_pion = Calibration(outfilename, usedSuId[suid]);
01889   if (MPV_pion == 1) {
01890     FillUnCalibratedPionSpectrum(filename,outfilename, usedSuId[suid], amplitude, debug);
01891     MPV_pion = Calibration(outfilename, usedSuId[suid]);
01892   }
01893   //printf("MPV_pion: %.3e\n",MPV_pion);
01894   //Double_t scaling2keV = 3.60898e+00/MPV_pion;//3.65338e+00/MPV_pion;//3.67179/MPV_pion;//7.87153e+02;//3.67179/6.67190e+02;
01895   Int_t nbins(200),lbin(0/*-1000*/),hbin(100);
01896   
01897   if(amplitude) {
01898     lbin /= 20;
01899     hbin /= 20;
01900   }
01901   else {
01902     nbins = 200;
01903     lbin = 0;
01904     if (fHistoScale == SPADIC_TRACE_SIZE * SPADIC_ADC_MAX / 100.)
01905       hbin = 100*fHistoScale;
01906   }
01907   TFile *output = new TFile(outfilename,"UPDATE");
01908   TH2F* Ch1_Pb = NULL;
01909   TH2F* allCh1_Pb = NULL;
01910   TH2F* noCh1_Pb = NULL;
01911   TH2F* Ch2_Pb = NULL;
01912   TH2F* allCh2_Pb = NULL;
01913   TH2F* noCh2_Pb = NULL;
01914   TH2F* Ch1_Ch2 = NULL;
01915   TH2F* allCh1_Ch2 = NULL;
01916   TH2F* noCh1_Ch2 = NULL;
01917   TH1I* hCh_1 = NULL;
01918   TH1I *hCh_2 = NULL;
01919   TH1I *hPb = NULL;
01920   TH2D* clusterwCharge = NULL;
01921   TH2D* prf = NULL;
01922   TProfile* prfProfile = NULL;
01923 
01924   TH1I *clusterSize = NULL;
01925   TH1I *maxAmplitudeValue = NULL;
01926   TH2I *maxAmplitudeHitTime = NULL;
01927   TH1I *covaMatixValue = NULL;
01928   TH2I *covaMatixValueMaxAmplitude = NULL;
01929   TH2I *covaMatixValueHitTime = NULL;
01930   TH1I *signalChDistance = NULL;
01931   TH2I *averageSignal_2D = NULL;
01932   TH2I *averageNoise_2D = NULL;
01933   TH1I *noiseDistribution = NULL;
01934   TH2I *baselineDistribution = NULL;
01935 
01936 
01937   TH1D *preCompPulse[NUM_SPADIC_CHA] = {NULL};
01938   TH1D *preCompBaselinePulse[NUM_SPADIC_CHA] = {NULL};
01939   TH1D *rawPulse[NUM_SPADIC_CHA] = {NULL};
01940   TH1D *baselinePulse[NUM_SPADIC_CHA] = {NULL};
01941   TH1D *noisePulse[NUM_SPADIC_CHA] = {NULL};
01942   TH1D *baselineNoisePulse[NUM_SPADIC_CHA] = {NULL};
01943   TH1D *noiseBaselinePulse[NUM_SPADIC_CHA] = {NULL};
01944   TH1D *lastPulse[NUM_SPADIC_CHA] = {NULL};
01945   TH2I *offSpillPulse[NUM_SPADIC_CHA] = {NULL};
01946 
01947   TProfile *averagePulse_e = NULL;
01948   TProfile *averagePulse_p = NULL;
01949 
01950 
01951   TH2I *averagePulse_2D_e = NULL;
01952   TH2I *averagePulse_2D_p = NULL;
01953 
01954   TH1D *preCompSpectrum = NULL;
01955   TH1D *preCompBaselineSpectrum = NULL;
01956   TH1D *preCompSpectrumElectron = NULL;
01957   TH1D *preCompBaselineSpectrumElectron = NULL;
01958   TH1D *rawSpectrum = NULL;
01959   TH1D *baselineSpectrum = NULL;
01960   TH1D *noiseSpectrum = NULL;
01961   TH1D *baselineNoiseSpectrum = NULL;
01962   TH1D *baselineNoiseSpectrumWoOWoU = NULL;
01963   TH1D *baselineNoiseSpectrumElectron = NULL;
01964   TH1D *baselineNoiseSpectrumWoOWoUElectron = NULL;
01965   TH1D *noiseBaselineSpectrum = NULL;
01966   TH1D *probabilityOverflow = NULL;
01967   TH1D *probabilityUnderflow = NULL;
01968   TH1D *probabilityOverflowE = NULL;
01969   TH1D *probabilityUnderflowE = NULL;
01970   TH2I* keV2Amplitude = new TH2I("keV2Amplitude","keV2Amplitude",100,0,100,256,0,256);
01971   keV2Amplitude->SetContour(99);
01972   TProfile* keV2AmplitudeProfile = new TProfile("keV2AmplitudeProfile","keV2AmplitudeProfile",100,0,100);
01973 
01974 
01975   TH2I* IntegralvsAmplitude = new TH2I("IntegralvsAmplitude","IntegralvsAmplitude",NUM_SPADIC_CHA*SPADIC_TRACE_SIZE*256,0,NUM_SPADIC_CHA*SPADIC_TRACE_SIZE*256,NUM_SPADIC_CHA*SPADIC_TRACE_SIZE,0,NUM_SPADIC_CHA*SPADIC_TRACE_SIZE);
01976   IntegralvsAmplitude->SetXTitle("Integrated ADC values 3 pad cluster");
01977   IntegralvsAmplitude->SetYTitle("Maximum ADC amplitude on pad max");
01978   IntegralvsAmplitude->SetContour(99);
01979 
01980   TProfile *crossTalk = NULL;//new TProfile("CrossTalk","CrossTalk",6,-0.5,5.5);
01981 
01982   TH1D *baselineNoiseSpectrumCrossTalkE[6] = {NULL};
01983   TH1D *baselineNoiseSpectrumCrossTalkP[6] = {NULL};
01984 
01985   TString name;
01986   Int_t color[NUM_SPADIC_CHA] = {1,2,3,4,800,6,7,8};
01987 
01988   if (plotFromFile) {
01989     output->cd();
01990     clusterSize = (TH1I*)output->Get("clusterSize");
01991     maxAmplitudeValue = (TH1I*)output->Get("maxAmplitudeValue");
01992     maxAmplitudeHitTime = (TH2I*)output->Get("maxAmplitudeHitTime");
01993     covaMatixValue = (TH1I*)output->Get("covaMatixValue");
01994     covaMatixValueMaxAmplitude = (TH2I*)output->Get("covaMatixValueMaxAmplitude");
01995     covaMatixValueHitTime = (TH2I*)output->Get("covaMatixValueHitTime");
01996     signalChDistance = (TH1I*)output->Get("signalChDistance");
01997     averageSignal_2D = (TH2I*)output->Get("averageSignal_2D");
01998     averageNoise_2D = (TH2I*)output->Get("averageNoise_2D");
01999     noiseDistribution = (TH1I*)output->Get("noiseDistribution");
02000     baselineDistribution = (TH2I*)output->Get("baselineDistribution");
02001     Ch1_Pb = (TH2F*)output->Get("Ch1_Pb");
02002     allCh1_Pb = (TH2F*)output->Get("allCh1_Pb");
02003     if (!Ch1_Pb)
02004       cout << "Ch1_Pb" << endl;
02005     noCh1_Pb = (TH2F*)output->Get("noCh1_Pb");
02006     if (!noCh1_Pb)
02007       cout << "noCh1_Pb" << endl;
02008     Ch2_Pb = (TH2F*)output->Get("Ch2_Pb");
02009     allCh2_Pb = (TH2F*)output->Get("allCh2_Pb");
02010     if (!Ch2_Pb)
02011       cout << "Ch2_Pb" << endl;
02012     noCh2_Pb = (TH2F*)output->Get("noCh2_Pb");
02013     if (!noCh2_Pb)
02014       cout << "noCh2_Pb" << endl;
02015     Ch1_Ch2 = (TH2F*)output->Get("Ch1_Ch2");
02016     allCh1_Ch2 = (TH2F*)output->Get("allCh1_Ch2");
02017     if (!Ch1_Ch2)
02018       cout << "Ch1_Ch2" << endl;
02019     noCh1_Ch2 = (TH2F*)output->Get("noCh1_Ch2");
02020     if (!noCh1_Ch2)
02021       cout << "noCh1_Ch2" << endl;
02022 
02023     clusterwCharge = (TH2D*)output->Get("clusterwCharge");
02024 
02025     prf = (TH2D*)output->Get("PRF_2D");
02026     if (!prf)
02027       cout << "PRF_2D" << endl;
02028     prfProfile = (TProfile*)output->Get("PRF");
02029     if (!prfProfile)
02030       cout << "PRF" << endl;
02031   
02032     averagePulse_e = (TProfile*)output->Get("averagePulse_e");
02033     if (!averagePulse_e)
02034       cout << "averagePulse_e" << endl;
02035     averagePulse_p = (TProfile*)output->Get("averagePulse_p");
02036     if (!averagePulse_p)
02037       cout << "averagePulse_p" << endl;
02038 
02039     averagePulse_2D_e = (TH2I*)output->Get("averagePulse_2D_e");
02040     if (!averagePulse_2D_e)
02041       cout << "averagePulse_2D_e" << endl;
02042     averagePulse_2D_p = (TH2I*)output->Get("averagePulse_2D_p");
02043     if (!averagePulse_2D_p)
02044       cout << "averagePulse_2D_p" << endl;
02045 
02046 
02047     preCompSpectrum = (TH1D*)output->Get("preCompSpectrum");
02048     if (!preCompSpectrum)
02049       cout << "preCompSpectrum" << endl;
02050     preCompBaselineSpectrum = (TH1D*)output->Get("preCompBaselineSpectrum");
02051     if (!preCompBaselineSpectrum)
02052       cout << "preCompBaselineSpectrum" << endl;
02053     preCompSpectrumElectron = (TH1D*)output->Get("preCompSpectrumElectron");
02054     if (!preCompSpectrumElectron)
02055       cout << "preCompSpectrumElectron" << endl;
02056     preCompBaselineSpectrumElectron = (TH1D*)output->Get("preCompBaselineSpectrumElectron");
02057     if (!preCompBaselineSpectrumElectron)
02058       cout << "preCompBaselineSpectrumElectron" << endl;
02059     rawSpectrum = (TH1D*)output->Get("rawSpectrum");
02060     if (!rawSpectrum)
02061       cout << "rawSpectrum" << endl;
02062     baselineSpectrum = (TH1D*)output->Get("baselineSpectrum");
02063     if (!baselineSpectrum)
02064       cout << "baselineSpectrum" << endl;
02065     noiseSpectrum = (TH1D*)output->Get("noiseSpectrum");
02066     if (!noiseSpectrum)
02067       cout << "noiseSpectrum" << endl;
02068     baselineNoiseSpectrum = (TH1D*)output->Get("baselineNoiseSpectrum");
02069     if (!baselineNoiseSpectrum)
02070       cout << "baselineNoiseSpectrum" << endl;
02071     baselineNoiseSpectrumWoOWoU = (TH1D*)output->Get("baselineNoiseSpectrumWoOWoU");
02072     if (!baselineNoiseSpectrumWoOWoU)
02073       cout << "baselineNoiseSpectrumWoOWoU" << endl;
02074     baselineNoiseSpectrumElectron = (TH1D*)output->Get("baselineNoiseSpectrumElectron");
02075     if (!baselineNoiseSpectrumElectron)
02076       cout << "baselineNoiseSpectrumElectron" << endl;
02077     baselineNoiseSpectrumWoOWoUElectron = (TH1D*)output->Get("baselineNoiseSpectrumWoOWoUElectron");
02078     if (!baselineNoiseSpectrumWoOWoUElectron)
02079       cout << "baselineNoiseSpectrumWoOWoUElectron" << endl;
02080     noiseBaselineSpectrum = (TH1D*)output->Get("noiseBaselineSpectrum");
02081     if (!noiseBaselineSpectrum)
02082       cout << "noiseBaselineSpectrum" << endl;
02083     probabilityOverflow = (TH1D*)output->Get("probabilityOverflow");
02084     if (!probabilityOverflow)
02085       cout << "probabilityOverflow" << endl;
02086     probabilityUnderflow = (TH1D*)output->Get("probabilityUnderflow");
02087     if (!probabilityUnderflow)
02088       cout << "probabilityUnderflow" << endl;
02089     probabilityOverflowE = (TH1D*)output->Get("probabilityOverflowE");
02090     if (!probabilityOverflowE)
02091       cout << "probabilityOverflowE" << endl;
02092     probabilityUnderflowE = (TH1D*)output->Get("probabilityUnderflowE");
02093     if (!probabilityUnderflowE)
02094       cout << "probabilityUnderflowE" << endl;
02095 
02096     crossTalk = (TProfile *)output->Get("CrossTalk");
02097     if (!crossTalk)
02098       cout << "crossTalk" << endl;
02099 
02100     for(Int_t delta = 0; delta < 6; delta++) {
02101       name.Form("_delta%02i",delta);
02102       baselineNoiseSpectrumCrossTalkE[delta] = (TH1D*)output->Get("baselineNoiseSpectrumCrossTalkE"+name);
02103       if (!baselineNoiseSpectrumCrossTalkE[delta])
02104         cout << TString("baselineNoiseSpectrumCrossTalkE"+name) << endl;
02105       baselineNoiseSpectrumCrossTalkP[delta] = (TH1D*)output->Get("baselineNoiseSpectrumCrossTalkP"+name);
02106       if (!baselineNoiseSpectrumCrossTalkP[delta])
02107         cout << TString("baselineNoiseSpectrumCrossTalkP"+name) << endl;
02108     }
02109   }
02110   else {
02111 
02112 
02113     clusterSize = new TH1I("clusterSize","clusterSize",NUM_SPADIC_CHA+1,-0.5,NUM_SPADIC_CHA+0.5);
02114     maxAmplitudeValue = new TH1I("maxAmplitudeValue","maxAmplitudeValue",256*2,0,256);
02115     maxAmplitudeHitTime = new TH2I("maxAmplitudeHitTime","maxAmplitudeHitTime",256,0,256,45,0,45);
02116     covaMatixValue = new TH1I("covaMatixValue","covaMatixValue",1000,-0.13,0.13);
02117     covaMatixValueMaxAmplitude = new TH2I("covaMatixValueMaxAmplitude","covaMatixValueMaxAmplitude",1000,-0.13,0.13,256,0,256);
02118     covaMatixValueHitTime = new TH2I("covaMatixValueHitTime","covaMatixValueHitTime",1000,-0.13,0.13,45,0,45);
02119     signalChDistance = new TH1I("signalChDistance","signalChDistance",2*NUM_SPADIC_CHA+1,-NUM_SPADIC_CHA-0.5,NUM_SPADIC_CHA+0.5);
02120     averageSignal_2D = new TH2I("averageSignal_2D","averageSignal_2D",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,356,-100,256);
02121     averageNoise_2D = new TH2I("averageNoise_2D","averageNoise_2D",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,356,-100,256);
02122     noiseDistribution = new TH1I("noiseDistribution","noiseDistribution",2*SPADIC_ADC_MAX,-SPADIC_ADC_MAX,SPADIC_ADC_MAX);
02123     baselineDistribution = new TH2I("baselineDistribution","baselineDistribution",NUM_SPADIC_CHA,-0.5,NUM_SPADIC_CHA-0.5,SPADIC_ADC_MAX,0,SPADIC_ADC_MAX);
02124     clusterSize->SetXTitle("cluster width [channels]");
02125     clusterSize->SetYTitle("normalized counts");
02126     signalChDistance->SetXTitle("distance to next signal channel [channels]");
02127     signalChDistance->SetYTitle("normalized counts");
02128     maxAmplitudeHitTime->SetXTitle("max. amplitude [ADC]");
02129     maxAmplitudeHitTime->SetYTitle("max. time bin");
02130     maxAmplitudeHitTime->SetContour(99);
02131     baselineDistribution->SetContour(99);
02132     covaMatixValueMaxAmplitude->SetContour(99);
02133     covaMatixValueHitTime->SetContour(99);
02134 
02135     maxAmplitudeValue->SetXTitle("max. amplitude [ADC]");
02136     covaMatixValue->SetXTitle("cova. value");
02137 
02138     covaMatixValueMaxAmplitude->SetYTitle("max. amplitude [ADC]");
02139     covaMatixValueMaxAmplitude->SetXTitle("cova. value");
02140 
02141     covaMatixValueHitTime->SetXTitle("cova. value");
02142     covaMatixValueHitTime->SetYTitle("max. time bin");
02143 
02144     hCh_1 = new TH1I("Ch_1","Ch_1",1000,0,4000);
02145     hCh_1->SetXTitle("Cherenkov 1 [a.u.]");
02146 
02147     hCh_2 = new TH1I("Ch_2","Ch_2",1000,0,4000);
02148     hCh_2->SetXTitle("Cherenkov 2 [a.u.]");
02149 
02150     hPb = new TH1I("Pb","Pb",1000,0,4000);
02151     hPb->SetYTitle("Pb-glass calorimeter [a.u.]");
02152 
02153     Ch1_Pb = new TH2F("Ch1_Pb","good PID Ch1_Pb",400,0,4000,400,0,4000);
02154     Ch1_Pb->SetXTitle("Cherenkov 1 [a.u.]");
02155     Ch1_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02156     Ch1_Pb->SetContour(99);
02157 
02158     allCh1_Pb = new TH2F("allCh1_Pb","all PID Ch1_Pb",400,0,4000,400,0,4000);
02159     allCh1_Pb->SetXTitle("Cherenkov 1 [a.u.]");
02160     allCh1_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02161     allCh1_Pb->SetContour(99);
02162 
02163     noCh1_Pb = new TH2F("noCh1_Pb","no good PID Ch1_Pb",400,0,4000,400,0,4000);
02164     noCh1_Pb->SetXTitle("Cherenkov 1 [a.u.]");
02165     noCh1_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02166     noCh1_Pb->SetContour(99);
02167 
02168     Ch2_Pb = new TH2F("Ch2_Pb","good PID Ch2_Pb",400,0,4000,400,0,4000);
02169     Ch2_Pb->SetXTitle("Cherenkov 2 [a.u.]");
02170     Ch2_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02171     Ch2_Pb->SetContour(99);
02172 
02173     allCh2_Pb = new TH2F("allCh2_Pb","all PID Ch2_Pb",400,0,4000,400,0,4000);
02174     allCh2_Pb->SetXTitle("Cherenkov 2 [a.u.]");
02175     allCh2_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02176     allCh2_Pb->SetContour(99);
02177 
02178     noCh2_Pb = new TH2F("noCh2_Pb","no good PID Ch2_Pb",400,0,4000,400,0,4000);
02179     noCh2_Pb->SetXTitle("Cherenkov 2 [a.u.]");
02180     noCh2_Pb->SetYTitle("Pb-glass calorimeter [a.u.]");
02181     noCh2_Pb->SetContour(99);
02182 
02183     Ch1_Ch2 = new TH2F("Ch1_Ch2","good PID Ch1_Ch2",400,0,4000,400,0,4000);
02184     Ch1_Ch2->SetXTitle("Cherenkov 1 [a.u.]");
02185     Ch1_Ch2->SetYTitle("Cherenkov 2 [a.u.]");
02186     Ch1_Ch2->SetContour(99);
02187 
02188     allCh1_Ch2 = new TH2F("allCh1_Ch2","all PID Ch1_Ch2",400,0,4000,400,0,4000);
02189     allCh1_Ch2->SetXTitle("Cherenkov 1 [a.u.]");
02190     allCh1_Ch2->SetYTitle("Cherenkov 2 [a.u.]");
02191     allCh1_Ch2->SetContour(99);
02192 
02193     noCh1_Ch2 = new TH2F("noCh1_Ch2","no good PID Ch1_Ch2",400,0,4000,400,0,4000);
02194     noCh1_Ch2->SetXTitle("Cherenkov 1 [a.u.]");
02195     noCh1_Ch2->SetYTitle("Cherenkov 2 [a.u.]");
02196     noCh1_Ch2->SetContour(99);
02197 
02198     clusterwCharge = new TH2D("clusterwCharge", "clusterwCharge", NUM_SPADIC_CHA,0,NUM_SPADIC_CHA,2000,-1,1);
02199     clusterwCharge->SetXTitle("cluster size");
02200     clusterwCharge->SetYTitle("relative charge - theo.");
02201     clusterwCharge->SetContour(99); 
02202 
02203     prf = new TH2D("PRF_2D", "PRF_2D", 30 * padWidth[suid], -1.5 * padWidth[suid] , 1.5 * padWidth[suid], 100, 0, 1);
02204     prf->SetYTitle("relative pad charge");
02205     prf->SetXTitle("reco. hit position [mm]");
02206     prf->SetContour(99); 
02207     prfProfile = new TProfile("PRF", "PRF", 6 * padWidth[suid], -1.5 * padWidth[suid], 1.5 * padWidth[suid]);
02208     prfProfile->SetMarkerStyle(24);
02209     prfProfile->SetMarkerColor(1);
02210     prfProfile->SetLineColor(1);
02211     prfProfile->SetYTitle("relative pad charge");
02212     prfProfile->SetXTitle("reco. hit position [mm]");
02213 
02214     for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) {
02215       name.Form("Ch%02i",ch);
02216       preCompPulse[ch] = new TH1D("preCompPulse"+name,"preCompPulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02217       preCompPulse[ch]->SetLineColor(color[ch]);
02218       preCompPulse[ch]->SetXTitle("time bin []");
02219       preCompPulse[ch]->SetYTitle("ADC value");
02220       preCompBaselinePulse[ch] = new TH1D("preCompBaselinePulse"+name,"preCompBaselinePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02221       preCompBaselinePulse[ch]->SetLineColor(color[ch]);
02222       preCompBaselinePulse[ch]->SetXTitle("time bin []");
02223       preCompBaselinePulse[ch]->SetYTitle("ADC value");
02224       rawPulse[ch] = new TH1D("rawPulse"+name,"rawPulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02225       rawPulse[ch]->SetLineColor(color[ch]);
02226       rawPulse[ch]->SetXTitle("time bin []");
02227       rawPulse[ch]->SetYTitle("ADC value");
02228       baselinePulse[ch] = new TH1D("baselinePulse"+name,"baselinePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02229       baselinePulse[ch]->SetLineColor(color[ch]);
02230       baselinePulse[ch]->SetXTitle("time bin []");
02231       baselinePulse[ch]->SetYTitle("ADC value");
02232       noisePulse[ch] = new TH1D("noisePulse"+name,"noisePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02233       noisePulse[ch]->SetLineColor(color[ch]);
02234       noisePulse[ch]->SetXTitle("time bin []");
02235       noisePulse[ch]->SetYTitle("ADC value");
02236       baselineNoisePulse[ch] = new TH1D("baselineNoisePulse"+name,"baselineNoisePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02237       baselineNoisePulse[ch]->SetLineColor(color[ch]);
02238       baselineNoisePulse[ch]->SetXTitle("time bin []");
02239       baselineNoisePulse[ch]->SetYTitle("ADC value");
02240       noiseBaselinePulse[ch] = new TH1D("noiseBaselinePulse"+name,"noiseBaselinePulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02241       noiseBaselinePulse[ch]->SetLineColor(color[ch]);
02242       noiseBaselinePulse[ch]->SetXTitle("time bin []");
02243       noiseBaselinePulse[ch]->SetYTitle("ADC value");
02244       offSpillPulse[ch] = new TH2I("offSpillPulse"+name,"offSpillPulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,256,0,256);
02245       offSpillPulse[ch]->SetLineColor(color[ch]);
02246       name.Form("Ch%02i",ch);
02247       lastPulse[ch] = new TH1D("lastPulse"+name,"lastPulse"+name,SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02248     }
02249 
02250     averagePulse_e = new TProfile("averagePulse_e","averagePulse_e",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE); 
02251     averagePulse_e->SetLineColor(kRed);
02252     averagePulse_e->SetMarkerStyle(20);
02253     averagePulse_e->SetMarkerColor(kRed);
02254     averagePulse_e->SetXTitle("TimeBin");
02255     averagePulse_e->SetYTitle("ADC value");
02256 
02257     averagePulse_p = new TProfile("averagePulse_p","averagePulse_p",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE);
02258     averagePulse_p->SetLineColor(kBlue);
02259     averagePulse_p->SetMarkerStyle(22);
02260     averagePulse_p->SetMarkerColor(kBlue);
02261     averagePulse_p->SetXTitle("TimeBin");
02262     averagePulse_p->SetYTitle("ADC value");
02263 
02264     averagePulse_2D_e = new TH2I("averagePulse_2D_e","averagePulse_2D_e",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,276,-20,256); 
02265     //averagePulse_2D_e->SetLineColor(kRed);
02266     //averagePulse_2D_e->SetMarkerStyle(20);
02267     //averagePulse_2D_e->SetMarkerColor(kRed);
02268     averagePulse_2D_e->SetXTitle("TimeBin");
02269     averagePulse_2D_e->SetYTitle("ADC value");
02270     averagePulse_2D_e->SetContour(99); 
02271     averagePulse_2D_p = new TH2I("averagePulse_2D_p","averagePulse_2D_p",SPADIC_TRACE_SIZE,0,SPADIC_TRACE_SIZE,276,-20,256);
02272     //averagePulse_2D_p->SetLineColor(kBlue);
02273     //averagePulse_2D_p->SetMarkerStyle(22);
02274     //averagePulse_2D_p->SetMarkerColor(kBlue);
02275     averagePulse_2D_p->SetXTitle("TimeBin");
02276     averagePulse_2D_p->SetYTitle("ADC value");
02277     averagePulse_2D_p->SetContour(99); 
02278     averageSignal_2D->SetContour(99);
02279     averageNoise_2D->SetContour(99);
02280     preCompSpectrum = new TH1D("preCompSpectrum","preCompSpectrum",nbins,lbin,hbin);
02281     preCompSpectrum->SetLineColor(2);
02282     preCompSpectrum->SetXTitle("dE/dx [keV]");
02283     preCompSpectrum->SetYTitle("normalized counts");
02284     preCompBaselineSpectrum = new TH1D("preCompBaselineSpectrum","preCompBaselineSpectrum",nbins,lbin,hbin);
02285     preCompBaselineSpectrum->SetLineColor(7);
02286     preCompBaselineSpectrum->SetXTitle("dE/dx [keV]");
02287     preCompBaselineSpectrum->SetYTitle("normalized counts");
02288     preCompSpectrumElectron = new TH1D("preCompSpectrumElectron","preCompSpectrumElectron",nbins,lbin,hbin);
02289     preCompSpectrumElectron->SetLineColor(2);
02290     preCompSpectrumElectron->SetXTitle("dE/dx [keV]");
02291     preCompSpectrumElectron->SetYTitle("normalized counts");
02292     preCompBaselineSpectrumElectron = new TH1D("preCompBaselineSpectrumElectron","preCompBaselineSpectrumElectron",nbins,lbin,hbin);
02293     preCompBaselineSpectrumElectron->SetLineColor(3);
02294     preCompBaselineSpectrumElectron->SetXTitle("dE/dx [keV]");
02295     preCompBaselineSpectrumElectron->SetYTitle("normalized counts");
02296     rawSpectrum = new TH1D("rawSpectrum","rawSpectrum",nbins,lbin,hbin);
02297     rawSpectrum->SetLineColor(1);
02298     rawSpectrum->SetXTitle("dE/dx [keV]");
02299     rawSpectrum->SetYTitle("normalized counts");
02300     baselineSpectrum = new TH1D("baselineSpectrum","baselineSpectrum",nbins,lbin,hbin);
02301     baselineSpectrum->SetLineColor(2);
02302     baselineSpectrum->SetXTitle("dE/dx [keV]");
02303     baselineSpectrum->SetYTitle("normalized counts");
02304     noiseSpectrum = new TH1D("noiseSpectrum","noiseSpectrum",nbins,lbin,hbin);
02305     noiseSpectrum->SetLineColor(3);
02306     noiseSpectrum->SetXTitle("dE/dx [keV]");
02307     noiseSpectrum->SetYTitle("normalized counts");
02308     baselineNoiseSpectrum = new TH1D("baselineNoiseSpectrum","baselineNoiseSpectrum",nbins,lbin,hbin);
02309     baselineNoiseSpectrum->SetLineColor(4);
02310     baselineNoiseSpectrum->SetXTitle("dE/dx [keV]");
02311     baselineNoiseSpectrum->SetYTitle("normalized counts");
02312     baselineNoiseSpectrumWoOWoU = new TH1D("baselineNoiseSpectrumWoOWoU","baselineNoiseSpectrumWoOWoU",nbins,lbin,hbin);
02313     baselineNoiseSpectrumWoOWoU->SetLineColor(6);
02314     baselineNoiseSpectrumWoOWoU->SetXTitle("dE/dx [keV]");
02315     baselineNoiseSpectrumWoOWoU->SetYTitle("normalized counts");
02316     baselineNoiseSpectrumElectron = new TH1D("baselineNoiseSpectrumElectron","baselineNoiseSpectrumElectron",nbins,lbin,hbin);
02317     baselineNoiseSpectrumElectron->SetLineColor(4);
02318     baselineNoiseSpectrumElectron->SetXTitle("dE/dx [keV]");
02319     baselineNoiseSpectrumElectron->SetYTitle("normalized counts");
02320     baselineNoiseSpectrumWoOWoUElectron = new TH1D("baselineNoiseSpectrumWoOWoUElectron","baselineNoiseSpectrumWoOWoUElectron",nbins,lbin,hbin);
02321     baselineNoiseSpectrumWoOWoUElectron->SetLineColor(6);
02322     baselineNoiseSpectrumWoOWoUElectron->SetLineStyle(1);
02323     baselineNoiseSpectrumWoOWoUElectron->SetXTitle("dE/dx [keV]");
02324     baselineNoiseSpectrumWoOWoUElectron->SetYTitle("normalized counts");
02325     noiseBaselineSpectrum = new TH1D("noiseBaselineSpectrum","noiseBaselineSpectrum",nbins,lbin,hbin);
02326     noiseBaselineSpectrum->SetLineColor(800);
02327     noiseBaselineSpectrum->SetXTitle("dE/dx [keV]");
02328     noiseBaselineSpectrum->SetYTitle("normalized counts");
02329     probabilityOverflow = new TH1D("probabilityOverflow","probabilityOverflow",nbins,lbin,hbin);
02330     probabilityOverflow->SetLineColor(800);
02331     probabilityOverflow->SetFillColor(800);
02332     probabilityOverflow->SetFillStyle(3002);
02333     probabilityUnderflow = new TH1D("probabilityUnderflow","probabilityUnderflow",nbins,lbin,hbin); 
02334     probabilityUnderflow->SetLineColor(8);
02335     probabilityUnderflow->SetFillColor(8);
02336     probabilityUnderflow->SetFillStyle(3005);
02337     probabilityOverflowE = new TH1D("probabilityOverflowE","probabilityOverflowE",nbins,lbin,hbin);
02338     probabilityOverflowE->SetLineColor(800);
02339     probabilityOverflowE->SetFillColor(800);
02340     probabilityOverflowE->SetFillStyle(3002);
02341     probabilityUnderflowE = new TH1D("probabilityUnderflowE","probabilityUnderflowE",nbins,lbin,hbin); 
02342     probabilityUnderflowE->SetLineColor(8);
02343     probabilityUnderflowE->SetFillColor(8);
02344     probabilityUnderflowE->SetFillStyle(3005);
02345 
02346     crossTalk = new TProfile("CrossTalk","CrossTalk",6,-0.5,5.5);
02347 
02348     for(Int_t delta = 0; delta < 6; delta++) {
02349       name.Form("_delta%02i",delta);
02350       baselineNoiseSpectrumCrossTalkE[delta] = new TH1D("baselineNoiseSpectrumCrossTalkE"+name,"baselineNoiseSpectrumCrossTalkE"+name,nbins,lbin,hbin);
02351       baselineNoiseSpectrumCrossTalkE[delta]->SetLineColor(12+delta);
02352       baselineNoiseSpectrumCrossTalkE[delta]->SetXTitle("dE/dx [keV]");
02353       baselineNoiseSpectrumCrossTalkE[delta]->SetYTitle("normalized counts");
02354       baselineNoiseSpectrumCrossTalkP[delta] = new TH1D("baselineNoiseSpectrumCrossTalkP"+name,"baselineNoiseSpectrumCrossTalkP"+name,nbins,lbin,hbin);
02355       baselineNoiseSpectrumCrossTalkP[delta]->SetLineColor(12+delta);
02356       baselineNoiseSpectrumCrossTalkP[delta]->SetLineStyle(2);
02357       baselineNoiseSpectrumCrossTalkP[delta]->SetXTitle("dE/dx [keV]");
02358       baselineNoiseSpectrumCrossTalkP[delta]->SetYTitle("normalized counts");
02359     }
02360   }
02361 
02362 
02363 
02364   TString formula(""), K3formula("-0.245*([0]/[2])+(-20.19*([1]/[2])+0.85)");//K3formula("0.35");;
02365  
02366   
02367   formula.Form(" -1. / (2. * atan(sqrt(%f))) * (atan(sqrt(%f) *tanh(3.14159265 * (-2. + sqrt(%f) ) * (%f + 2.* x * %f) / (8.* %f) )) +  atan(sqrt(%f) *  tanh(3.14159265 * (-2. + sqrt(%f) ) * (%f - 2.* x * %f) / (8.* %f) )) )",calcK3(h[suid]),calcK3(h[suid]),calcK3(h[suid]),padWidth[suid],par,h[suid],calcK3(h[suid]),calcK3(h[suid]),padWidth[suid],par,h[suid]);
02368   TF1 *mathieson = new TF1("mathieson", formula, -1.5 * padWidth[suid], 1.5 * padWidth[suid]);
02369   /*
02370     formula.Form(" -1. / (2. * atan(sqrt([0]))) * (atan(sqrt([0]) *tanh(3.14159265 * (-2. + sqrt([0]) ) * (%f + 2.* x * %f) / (8.* %f) )) +  atan(sqrt([0]) *  tanh(3.14159265 * (-2. + sqrt([0]) ) * (%f - 2.* x * %f) / (8.* %f) )) )",padWidth[suid],par,h[suid],padWidth[suid],par,h[suid]);
02371     formula.Form(" -1. / (2. * atan(sqrt([0]))) * (atan(sqrt([0]) *tanh(3.14159265 * (-2. + sqrt([0]) ) * (%f + 2.* x * %f) / (8.* [1]) )) +  atan(sqrt([0]) *  tanh(3.14159265 * (-2. + sqrt([0]) ) * (%f - 2.* x * %f) / (8.* [1]) )) )",padWidth[suid],par,padWidth[suid],par);
02372   */
02373   formula.Form(" -1. / (2. * atan(sqrt(%s))) * (atan(sqrt(%s) *tanh(3.14159265 * (-2. + sqrt(%s) ) * (%f + 2.* x * %f) / (8.* [0]) )) +  atan(sqrt(%s) *  tanh(3.14159265 * (-2. + sqrt(%s) ) * (%f - 2.* x * %f) / (8.* [0]) )) )",  K3formula.Data(),K3formula.Data(),K3formula.Data(),padWidth[suid],par,K3formula.Data(),K3formula.Data(),padWidth[suid],par);// [0] = h; [1] = r_a; [2] = s
02374   TF1 *mathiesonFit = new TF1("mathiesonFit", formula, -1.5 * padWidth[suid], 1.5 * padWidth[suid]);
02375   mathiesonFit->SetLineColor(1);
02376   mathiesonFit->SetLineStyle(2);
02377   mathiesonFit->SetLineWidth(1);
02378   mathieson->SetLineColor(1);
02379   mathieson->SetLineStyle(1);
02380   mathieson->SetLineWidth(1);
02381   const Double_t r_a = 0.002;
02382   const Double_t s_a = 2.5;
02383   mathiesonFit->SetParName(0,"h");
02384   mathiesonFit->SetParameter(0,h[suid]);
02385   mathiesonFit->SetParLimits(0,1.25,4.0);
02386   mathiesonFit->SetParName(1,"r_a");
02387   mathiesonFit->SetParameter(1,r_a);
02388   mathiesonFit->SetParLimits(1,0.0018,0.0022);
02389   mathiesonFit->SetParName(2,"s");
02390   mathiesonFit->SetParameter(2,s_a);
02391   mathiesonFit->SetParLimits(2,2.4,2.6);
02392 
02393 
02394   Int_t nPions = 0;
02395   Int_t nElectrons = 0;
02396   Int_t entries = 0;
02397   TCanvas *c = NULL;
02398   if (!plotFromFile) {
02399     name = filename;
02400     //get_Pb_Ch_Cut(name.ReplaceAll("data2011/TTrees/",""));
02401     GetPidCuts(name.ReplaceAll("data2012/TTrees/merged",""));
02402 
02403     TFile inputFile(filename,"READ");
02404     if (!inputFile.IsOpen())
02405       cout << "file not found: " << filename << endl;
02406     else
02407       cout << "file found: " << filename << endl;
02408     TTree* theTree=NULL;
02409     TKey* kee=NULL;
02410     TIter iter(inputFile.GetListOfKeys());
02411     while ( ( kee=dynamic_cast<TKey*>(iter()) ) !=0 ) {
02412       theTree = dynamic_cast<TTree*>(kee->ReadObj());
02413       if (theTree)
02414         break; // we take first Tree in file, disregarding its name...
02415     }
02416     if(theTree==NULL) {
02417       cout <<"Error: no Tree in file "<< filename.Data() << endl;
02418       return;
02419     }
02420     TCernOct12UnpackEvent* evnt = new TCernOct12UnpackEvent;
02421     TGo4EventElement* theBase=evnt;
02422     evnt->synchronizeWithTree(theTree, &theBase);
02423     entries = theTree->GetEntries();
02424     printf("%i Events found in TTree\n",entries);
02425     TMbsCrateEvent* fCrateInputEvent = NULL;
02426     TSpadicEvent* SpadicInputEvent = NULL;
02427     TSpadicData* theSpadic = NULL;
02428     Float_t Ch1(0), Ch2(0), Pb(0);
02429     Int_t clusterCh = 0;
02430     if (debug) {
02431       c = new TCanvas("c","c",1750,700);
02432       c->Divide(7,2);
02433     }
02434     TCanvas *cDebug = NULL;
02435     if (debug) {
02436       cDebug = new TCanvas("cDebug","cDebug",800,600);
02437       cDebug->Divide(2,1);
02438     }
02439 
02440     //Int_t nAfterMinA = 0;
02441     //Int_t nAfterBorderPads = 0;
02442     //Int_t nAfterOverUnder = 0;
02443     if (debug) entries = 200;
02444   
02445     for(Int_t i=0;i<entries;++i) {
02446       Statusbar(i,entries);
02447       theTree->GetEntry(i);
02448       fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(evnt->GetSubEvent("MBSCRATE"));    
02449       SpadicInputEvent=dynamic_cast<TSpadicEvent*>(evnt->GetSubEvent("SPADIC"));
02450       if (fCrateInputEvent->fIsPulser) continue;
02451       isPion = false;
02452       isElectron = false;
02453       isOverFlowEvent = false;
02454       isUnderFlowEvent = false;
02455       /* 
02456       //2011
02457       Ch1 = fCrateInputEvent->fData1182[1][0];
02458       Ch2 = fCrateInputEvent->fData1182[0][1];
02459       Pb  = fCrateInputEvent->fData1182[1][5];
02460       */
02461       //2012
02462       Ch1 = fCrateInputEvent->fData1182[1][0];
02463       Ch2 = fCrateInputEvent->fData1182[0][0];
02464       Pb  = fCrateInputEvent->fData1182[1][1];
02465       getPID(Ch1, Ch2, Pb);
02466 
02467       hCh_1->Fill(Ch1);
02468       hCh_2->Fill(Ch2);
02469       hPb->Fill(Pb);
02470 
02471       if ((Ch1 > 350 && Pb > 350) || (Ch2 > 350 && Pb > 350)){
02472 
02473         allCh1_Pb->Fill(Ch1,Pb);
02474         allCh2_Pb->Fill(Ch2,Pb);
02475         allCh1_Ch2->Fill(Ch1,Ch2);
02476 
02477         if (isPion || isElectron) {
02478           Ch1_Pb->Fill(Ch1,Pb);
02479           Ch2_Pb->Fill(Ch2,Pb);
02480           Ch1_Ch2->Fill(Ch1,Ch2);
02481         }
02482         if (!isPion && !isElectron) {
02483           noCh1_Pb->Fill(Ch1,Pb);
02484           noCh2_Pb->Fill(Ch2,Pb);
02485           noCh1_Ch2->Fill(Ch1,Ch2);
02486         }
02487       }
02488       //for (Int_t suid = 0; suid < /*usedSusibos*/1; suid++){
02489       theSpadic=dynamic_cast<TSpadicData*>(SpadicInputEvent->getEventElement(usedSuId[suid]));
02490       if (!theSpadic) { return;}
02491       if (NULL == theSpadic || !theSpadic) { return;}
02492       if (isPion || isElectron) {
02493         for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) { 
02494           rawPulse[ch]->Reset();
02495           rawPulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02496           baselinePulse[ch]->Reset();
02497           baselinePulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02498           noisePulse[ch]->Reset();
02499           noisePulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02500           baselineNoisePulse[ch]->Reset();
02501           baselineNoisePulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02502           noiseBaselinePulse[ch]->Reset();
02503           noiseBaselinePulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02504           preCompPulse[ch]->Reset();
02505           preCompPulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02506           preCompBaselinePulse[ch]->Reset();
02507           preCompBaselinePulse[ch]->GetYaxis()->SetRangeUser(-50,256);
02508           for (Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++) { 
02509             rawPulse[ch]->Fill(bin, (Double_t)theSpadic->fSpadicPulse[ch][bin]);
02510             preCompPulse[ch]->Fill(bin, (Double_t)theSpadic->fSpadicCompensated[ch][bin]);
02511             if ((Int_t)theSpadic->fSpadicPulse[ch][bin] == 0 && bin < SPADIC_TRACE_SIZE-1) 
02512               isUnderFlowEvent = true;
02513           
02514             if ((Int_t)theSpadic->fSpadicPulse[ch][bin] == 255)
02515               isOverFlowEvent = true;
02516           
02517           }      
02518         }
02519         if (fast) {
02520           BaselineCompensation(rawPulse, baselinePulse, baselineDistribution);
02521           clusterCh = CancelNoise_Cova(baselinePulse, baselineNoisePulse, covaMatixValue,covaMatixValueMaxAmplitude,covaMatixValueHitTime,maxAmplitudeHitTime,noiseDistribution,clusterSize,signalChDistance,averageNoise_2D,averageSignal_2D,NULL,false);
02522         } else {
02523           BaselineCompensation(preCompPulse, preCompBaselinePulse, baselineDistribution);
02524           BaselineCompensation(rawPulse, baselinePulse, baselineDistribution);
02525           clusterCh = CancelNoise_Cova(rawPulse, noisePulse, covaMatixValue,covaMatixValueMaxAmplitude,covaMatixValueHitTime,maxAmplitudeHitTime,noiseDistribution,clusterSize,signalChDistance,averageNoise_2D,averageSignal_2D,NULL,false);
02526           clusterCh = CancelNoise_Cova(baselinePulse, baselineNoisePulse, covaMatixValue,covaMatixValueMaxAmplitude,covaMatixValueHitTime,maxAmplitudeHitTime,noiseDistribution,clusterSize,signalChDistance,averageNoise_2D,averageSignal_2D,NULL,false);
02527           BaselineCompensation(noisePulse, noiseBaselinePulse, baselineDistribution);
02528         }
02529 
02530         if (isElectron || isPion) 
02531           for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++)
02532             maxAmplitudeValue->Fill(baselineNoisePulse[ch]->GetBinContent(baselineNoisePulse[ch]->GetMaximumBin()));
02533 
02534         if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02535           CalcPrf(baselineNoisePulse, prf, prfProfile, padWidth[suid]);
02536           PrfAna(baselineNoisePulse, clusterwCharge, -1, clusterCh);
02537         }
02538         Int_t deltaChMax = -1;     
02539         Double_t temp = scaling2keV(Get3PadPosIntegralCrossTalk(baselineNoisePulse, lastPulse, &deltaChMax));     
02540      
02541         if (isElectron) {
02542           nElectrons++;
02543           if(amplitude){         
02544             if(minimumAmplitudeThreshold(preCompPulse) && !BorderPadMax(preCompPulse) && HitTimeWindow(preCompPulse) && minimumIntegralThreshold(preCompPulse))
02545               preCompSpectrumElectron->Fill(scaling2keV(Get3PadPosAmplitude(preCompPulse)));
02546             if(minimumAmplitudeThreshold(preCompBaselinePulse) && !BorderPadMax(preCompBaselinePulse) && HitTimeWindow(preCompBaselinePulse) && minimumIntegralThreshold(preCompBaselinePulse))
02547               preCompBaselineSpectrumElectron->Fill(scaling2keV(Get3PadPosAmplitude(preCompBaselinePulse)));
02548             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02549               baselineNoiseSpectrumElectron->Fill(scaling2keV(Get3PadPosAmplitude(baselineNoisePulse)));
02550               if (isOverFlowEvent)
02551                 probabilityOverflowE->Fill(Get3PadPosAmplitude(baselineNoisePulse));
02552               if(isUnderFlowEvent)
02553                 probabilityUnderflowE->Fill(Get3PadPosAmplitude(baselineNoisePulse));
02554             }
02555           }
02556           else{
02557             if (!fast){
02558               if(minimumAmplitudeThreshold(preCompPulse) && !BorderPadMax(preCompPulse) && HitTimeWindow(preCompPulse) && minimumIntegralThreshold(preCompPulse))
02559                 preCompSpectrumElectron->Fill(scaling2keV(Get3PadPosIntegral(preCompPulse)));
02560               if(minimumAmplitudeThreshold(preCompBaselinePulse) && !BorderPadMax(preCompBaselinePulse) && HitTimeWindow(preCompBaselinePulse) && minimumIntegralThreshold(preCompBaselinePulse))
02561                 preCompBaselineSpectrumElectron->Fill(scaling2keV(Get3PadPosIntegral(preCompBaselinePulse)));
02562             }
02563             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02564               baselineNoiseSpectrumElectron->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02565               FillAverageSignal(baselineNoisePulse, averagePulse_e, averagePulse_2D_e);
02566               if (deltaChMax >= 0 && deltaChMax < 6){
02567                 if(minimumAmplitudeThreshold(lastPulse) && !BorderPadMax(lastPulse) && HitTimeWindow(lastPulse) && minimumIntegralThreshold(lastPulse)){
02568                   baselineNoiseSpectrumCrossTalkE[deltaChMax]->Fill(temp);
02569                   //crossTalk->Fill(deltaChMax,(temp*scaling2keV - Get3PadPosIntegral(baselineNoisePulse)*scaling2keV) / (temp*scaling2keV) * 100);
02570                 }
02571               }
02572               if (isOverFlowEvent)
02573                 probabilityOverflowE->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02574               if(isUnderFlowEvent)
02575                 probabilityUnderflowE->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));      
02576               if (!isOverFlowEvent && !isUnderFlowEvent){
02577                 if(amplitude){
02578                   baselineNoiseSpectrumWoOWoUElectron->Fill(Get3PadPosAmplitude(baselineNoisePulse));     
02579                 }
02580                 else{
02581                   baselineNoiseSpectrumWoOWoUElectron->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));          
02582                 }
02583               }
02584             }
02585           }
02586         }
02587         if (isPion){
02588           nPions++;
02589           IntegralvsAmplitude->Fill(Get3PadPosIntegral(noiseBaselinePulse), GetMaxAplitude(noiseBaselinePulse));//Get3PadPosAmplitude(noiseBaselinePulse));
02590           if(minimumAmplitudeThreshold(rawPulse) && !BorderPadMax(rawPulse) && HitTimeWindow(rawPulse) && minimumIntegralThreshold(rawPulse)){
02591             if(amplitude)
02592               rawSpectrum->Fill(Get3PadPosAmplitude(rawPulse));
02593             else
02594               rawSpectrum->Fill(scaling2keV(Get3PadPosIntegral(rawPulse)));
02595           }
02596           if(amplitude){
02597             if(minimumAmplitudeThreshold(baselinePulse) && !BorderPadMax(baselinePulse) && HitTimeWindow(baselinePulse) && minimumIntegralThreshold(baselinePulse))
02598               baselineSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(baselinePulse)));
02599             if(minimumAmplitudeThreshold(noiseBaselinePulse) && !BorderPadMax(noiseBaselinePulse) && HitTimeWindow(noiseBaselinePulse) && minimumIntegralThreshold(noiseBaselinePulse))
02600               noiseBaselineSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(noiseBaselinePulse)));
02601             if(minimumAmplitudeThreshold(noisePulse) && !BorderPadMax(noisePulse) && HitTimeWindow(noisePulse) && minimumIntegralThreshold(noisePulse))
02602               noiseSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(noisePulse)));        
02603             if(minimumAmplitudeThreshold(preCompPulse) && !BorderPadMax(preCompPulse) && HitTimeWindow(preCompPulse) && minimumIntegralThreshold(preCompPulse))
02604               preCompSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(preCompPulse)));
02605             if(minimumAmplitudeThreshold(preCompBaselinePulse) && !BorderPadMax(preCompBaselinePulse) && HitTimeWindow(preCompBaselinePulse) && minimumIntegralThreshold(preCompBaselinePulse))
02606               preCompBaselineSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(preCompBaselinePulse)));
02607             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02608               baselineNoiseSpectrum->Fill(scaling2keV(Get3PadPosAmplitude(baselineNoisePulse)));
02609               if (!isOverFlowEvent && !isUnderFlowEvent)
02610                 baselineNoiseSpectrumWoOWoU->Fill(Get3PadPosAmplitude(baselineNoisePulse));
02611               if (isOverFlowEvent)
02612                 probabilityOverflow->Fill(Get3PadPosAmplitude(baselineNoisePulse));
02613               if(isUnderFlowEvent)
02614                 probabilityUnderflow->Fill(Get3PadPosAmplitude(baselineNoisePulse));
02615             }
02616           }
02617           else{
02618             if (!fast){
02619               if(minimumAmplitudeThreshold(baselinePulse) && !BorderPadMax(baselinePulse) && HitTimeWindow(baselinePulse) && minimumIntegralThreshold(baselinePulse))
02620                 baselineSpectrum->Fill(scaling2keV(Get3PadPosIntegral(baselinePulse)));
02621               if(minimumAmplitudeThreshold(noisePulse) && !BorderPadMax(noisePulse) && HitTimeWindow(noisePulse) && minimumIntegralThreshold(noisePulse))
02622                 noiseSpectrum->Fill(scaling2keV(Get3PadPosIntegral(noisePulse)));
02623               if(minimumAmplitudeThreshold(noiseBaselinePulse) && !BorderPadMax(noiseBaselinePulse) && HitTimeWindow(noiseBaselinePulse) && minimumIntegralThreshold(noiseBaselinePulse)){
02624                 noiseBaselineSpectrum->Fill(scaling2keV(Get3PadPosIntegral(noiseBaselinePulse)));
02625               }
02626               if(minimumAmplitudeThreshold(preCompPulse) && !BorderPadMax(preCompPulse) && HitTimeWindow(preCompPulse) && minimumIntegralThreshold(preCompPulse))
02627                 preCompSpectrum->Fill(scaling2keV(Get3PadPosIntegral(preCompPulse)));
02628               if(minimumAmplitudeThreshold(preCompBaselinePulse) && !BorderPadMax(preCompBaselinePulse) && HitTimeWindow(preCompBaselinePulse) && minimumIntegralThreshold(preCompBaselinePulse))
02629                 preCompBaselineSpectrum->Fill(scaling2keV(Get3PadPosIntegral(preCompBaselinePulse)));
02630             }
02631             if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02632               baselineNoiseSpectrum->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02633               keV2AmplitudeProfile->Fill(scaling2keV(Get3PadPosIntegral(noiseBaselinePulse)), GetMaxAplitude(noiseBaselinePulse));
02634               keV2Amplitude->Fill(scaling2keV(Get3PadPosIntegral(noiseBaselinePulse)), GetMaxAplitude(noiseBaselinePulse));
02635               //IntegralvsAmplitude->Fill(Get3PadPosIntegral(noiseBaselinePulse), GetMaxAplitude(noiseBaselinePulse));//Get3PadPosAmplitude(noiseBaselinePulse));
02636               FillAverageSignal(baselineNoisePulse, averagePulse_p, averagePulse_2D_p);
02637               if (deltaChMax >= 0 && deltaChMax < 6){
02638                 if(minimumAmplitudeThreshold(lastPulse) && !BorderPadMax(lastPulse) && HitTimeWindow(lastPulse) && minimumIntegralThreshold(lastPulse)){
02639                   baselineNoiseSpectrumCrossTalkP[deltaChMax]->Fill(temp);
02640                   crossTalk->Fill(deltaChMax,(temp - scaling2keV(Get3PadPosIntegral(baselineNoisePulse))) / (temp) * 100);
02641                 }
02642               }
02643               if (!isOverFlowEvent && !isUnderFlowEvent)
02644                 baselineNoiseSpectrumWoOWoU->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02645               if (isOverFlowEvent)
02646                 probabilityOverflow->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02647               if(isUnderFlowEvent)
02648                 probabilityUnderflow->Fill(scaling2keV(Get3PadPosIntegral(baselineNoisePulse)));
02649             }
02650           
02651           }
02652         }
02653         if (debug) {
02654           if (i%100000 == 0) {
02655             for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++) {     
02656               c->cd(1);
02657               if(ch==0)
02658                 rawPulse[ch]->DrawCopy();
02659               else
02660                 rawPulse[ch]->DrawCopy("same");
02661               c->cd(2);
02662               if(ch==0)
02663                 baselinePulse[ch]->DrawCopy();
02664               else
02665                 baselinePulse[ch]->DrawCopy("same");
02666               c->cd(3);
02667               if(ch==0)
02668                 baselineNoisePulse[ch]->DrawCopy();
02669               else
02670                 baselineNoisePulse[ch]->DrawCopy("same");
02671               c->cd(4);
02672               if(ch==0)
02673                 noisePulse[ch]->DrawCopy();
02674               else
02675                 noisePulse[ch]->DrawCopy("same");
02676               c->cd(5);
02677               if(ch==0)
02678                 noiseBaselinePulse[ch]->DrawCopy();
02679               else
02680                 noiseBaselinePulse[ch]->DrawCopy("same");
02681               c->cd(6);
02682               if(ch==0)
02683                 preCompPulse[ch]->DrawCopy();
02684               else
02685                 preCompPulse[ch]->DrawCopy("same");
02686               c->cd(7);
02687               if(ch==0)
02688                 preCompBaselinePulse[ch]->DrawCopy();
02689               else
02690                 preCompBaselinePulse[ch]->DrawCopy("same");
02691 
02692               rawPulse[ch]->Reset();
02693               baselinePulse[ch]->Reset();
02694               baselineNoisePulse[ch]->Reset();
02695             }
02696           }
02697           c->cd(8)->SetLogy(1);
02698           rawSpectrum->DrawCopy();
02699           c->cd(9)->SetLogy(1);
02700           baselineSpectrum->DrawCopy();
02701           c->cd(10)->SetLogy(1);
02702           baselineNoiseSpectrum->DrawCopy();
02703           c->cd(11)->SetLogy(1);
02704           noiseSpectrum->DrawCopy();
02705           c->cd(12)->SetLogy(1);
02706           noiseBaselineSpectrum->DrawCopy();
02707           c->cd(13)->SetLogy(1);
02708           preCompSpectrum->DrawCopy();
02709           c->cd(14)->SetLogy(1);
02710           preCompBaselineSpectrum->DrawCopy();
02711           c->Update();
02712           cDebug->cd(1);
02713           clusterSize->DrawCopy();
02714           cDebug->cd(2);
02715           signalChDistance->DrawCopy();
02716           cDebug->Update();
02717           cDebug->SaveAs("pics/Debug.pdf");
02718         }
02719     
02720         if(minimumAmplitudeThreshold(baselineNoisePulse) && !BorderPadMax(baselineNoisePulse) && HitTimeWindow(baselineNoisePulse) && minimumIntegralThreshold(baselineNoisePulse)){
02721           for (Int_t ch = 0; ch < NUM_SPADIC_CHA; ch++){
02722             for (Int_t bin = 0; bin < SPADIC_TRACE_SIZE; bin++) {
02723               lastPulse[ch]->SetBinContent(lastPulse[ch]->FindBin(bin),baselineNoisePulse[ch]->GetBinContent(baselineNoisePulse[ch]->FindBin(bin)));
02724             }
02725           }
02726         }
02727       }
02728     }
02729   } // if !plotFromFile
02730 
02731   TFile *sim = new TFile(simfile.Data(),"READ");
02732   TH1D* simSpectrum = (TH1D*)sim->Get("hPi");
02733  
02734   simSpectrum->SetXTitle("dE/dx [keV]");
02735   simSpectrum->SetYTitle("normalized counts");
02736   simSpectrum->SetStats(false);
02737   simSpectrum->SetLineStyle(1);
02738   simSpectrum->SetLineColor(1);
02739   simSpectrum->Scale(/*baselineNoiseSpectrum->GetEntries()*/1./(Double_t)simSpectrum->Integral());
02740   simSpectrum->GetXaxis()->SetRangeUser(-0.5,70);
02741   if (debug) {
02742     c->SaveAs("pics/Spectra_overview.pdf");
02743     c->Clear();
02744     c->cd(1)->SetLogy(1);
02745     rawSpectrum->GetYaxis()->SetRangeUser(0.5,1e4);
02746     rawSpectrum->DrawCopy();
02747     c->cd(2)->SetLogy(1);
02748     baselineSpectrum->DrawCopy();
02749     c->cd(3)->SetLogy(1);
02750     baselineNoiseSpectrum->DrawCopy();
02751     c->cd(4)->SetLogy(1);
02752     noiseSpectrum->DrawCopy();
02753     c->cd(5)->SetLogy(1);
02754     noiseBaselineSpectrum->DrawCopy();
02755     c->cd(6)->SetLogy(1);
02756   }
02757   TCanvas *cResults = new TCanvas("cResults","cResults",1600,600);
02758   //cResults->Divide(1,1);
02759   TPad *pad1 = new TPad("pad1","top pad",0,0.35,0.5,1);
02760   //ad *pad1 = new TPad("pad1","top pad",0,0,1,1);
02761   pad1->SetBottomMargin(0);
02762   pad1->Draw();
02763   
02764   TPad *pad2 = new TPad("pad2","bottom pad",0,0,0.5,0.35);
02765   pad2->SetTopMargin(0);
02766   pad2->SetBottomMargin(0.2);
02767   pad2->Draw();
02768   TPad *pad3 = new TPad("pad3","top pad",0.5,0.35,1,1);
02769   //ad *pad1 = new TPad("pad1","top pad",0,0,1,1);
02770   pad3->SetBottomMargin(0);
02771   pad3->Draw();
02772   
02773   TPad *pad4 = new TPad("pad4","bottom pad",0.5,0,1,0.35);
02774   pad4->SetTopMargin(0);
02775   pad4->SetBottomMargin(0.2);
02776   pad4->Draw();
02777   
02778   pad1->cd()->SetLogy(1);
02779   TLegend *leg = new TLegend(0.15,0.5,0.85,0.85);
02780   leg->SetNColumns(2);
02781   leg->SetFillStyle(0);
02782   leg->SetTextSize(0.035);
02783   leg->SetLineStyle(0);
02784   leg->SetLineColor(0);
02785   TString calib = "";
02786   calib.Form(" (#sigma:%.2f MPV:%.2f #Chi^{2}/NDF:%.2f m:%.3fE-3 b:%.3f)",sigma_adc,MPV_adc,ChiSqr_adc,
02787              //(MPV_kev-sigma_kev)/(MPV_adc-sigma_adc),MPV_kev-(MPV_kev-sigma_kev)/(MPV_adc-sigma_adc)*MPV_adc, // 1)
02788              sigma_kev/sigma_adc*1000,MPV_kev-sigma_kev/sigma_adc*MPV_adc // 2)
02789              );//calibrationParameter[3],calibrationParameter[2]/calibrationParameter[0],calibrationParameter[1]);
02790   leg->SetHeader("#pi^{-} spectra, " + usedSuName[suid] + ", p=3GeV/c, 12mm XeCO_{2} " + calib);
02791   leg->AddEntry(simSpectrum,"simulated","l");
02792   leg->AddEntry((TObject*)0, "","");
02793   if (simple) {
02794     leg->AddEntry(baselineNoiseSpectrum,"measured: 1.baseline 2.noise","l");
02795     leg->AddEntry(baselineNoiseSpectrumWoOWoU,"measured: 1.baseline 2.noise(woO && woU)","l");
02796     //leg->AddEntry(preCompSpectrum,"measured: MS noise","l");
02797     //leg->AddEntry(preCompBaselineSpectrum,"measured: MS noise + baseline","l");
02798     //leg->AddEntry((TObject*)0, "               woO && woU", "");
02799     //leg->AddEntry(noiseBaselineSpectrum,"measured: 1. noise 2. baseline","l");
02800     leg->AddEntry(probabilityOverflow,"overflow probability","f");
02801     leg->AddEntry(probabilityUnderflow,"underflow probability","f");
02802   } else {
02803     leg->AddEntry(baselineNoiseSpectrum,"measured: FFM noise + baseline","l");
02804     leg->AddEntry(baselineNoiseSpectrumWoOWoU,"measured: FFM noise + baseline (woO && woU)","l");
02805     leg->AddEntry(preCompSpectrum,"measured: MS noise","l");
02806     leg->AddEntry(preCompBaselineSpectrum,"measured: MS noise + baseline","l");
02807     //leg->AddEntry((TObject*)0, "               woO && woU", "");
02808     //leg->AddEntry(noiseBaselineSpectrum,"measured: 1. noise 2. baseline","l");
02809     leg->AddEntry(probabilityOverflow,"overflow probability","f");
02810     leg->AddEntry(probabilityUnderflow,"underflow probability","f");
02811   }
02812 
02813   simSpectrum->GetYaxis()->SetRangeUser(5e-6, 10);
02814   simSpectrum->GetXaxis()->SetLabelSize(0.04);
02815   simSpectrum->GetYaxis()->SetLabelSize(0.04);
02816   simSpectrum->GetXaxis()->SetTitleSize(0.045);
02817   simSpectrum->GetYaxis()->SetTitleSize(0.045);
02818   simSpectrum->GetYaxis()->SetTitleOffset(0.9);
02819   simSpectrum->GetXaxis()->SetTitleOffset(0.5);
02820 
02821   simSpectrum->DrawCopy("");
02822   if (!plotFromFile){
02823     probabilityOverflow->Scale(1./(Double_t)/*probabilityOverflow*/baselineNoiseSpectrum->Integral());
02824     probabilityUnderflow->Scale(1./(Double_t)/*probabilityUnderflow*/baselineNoiseSpectrum->Integral());
02825   }
02826   probabilityUnderflow->DrawCopy("same");
02827   probabilityOverflow->DrawCopy("same");
02828   //rawSpectrum->DrawCopy();
02829   //baselineSpectrum->DrawCopy("same");
02830   if (!plotFromFile)
02831     baselineNoiseSpectrum->Scale(1./(Double_t)baselineNoiseSpectrum->Integral());
02832   baselineNoiseSpectrum->DrawCopy("same");
02833   if (!plotFromFile)
02834     baselineNoiseSpectrumWoOWoU->Scale(1./(Double_t)baselineNoiseSpectrumWoOWoU->Integral());
02835   baselineNoiseSpectrumWoOWoU->DrawCopy("same");
02836   //noiseSpectrum->DrawCopy("same");
02837   //noiseBaselineSpectrum->Scale(1./(Float_t)noiseBaselineSpectrum->GetEntries());
02838   //noiseBaselineSpectrum->DrawCopy("same");
02839   if (!simple) {
02840     if (!plotFromFile)
02841       preCompSpectrum->Scale(1./(Double_t)preCompSpectrum->Integral());
02842     preCompSpectrum->DrawCopy("same");
02843     if (!plotFromFile)
02844       preCompBaselineSpectrum->Scale(1./(Double_t)preCompBaselineSpectrum->Integral());
02845     preCompBaselineSpectrum->DrawCopy("same");
02846   }
02847   simSpectrum->DrawCopy("same");
02848   leg->Draw("same");
02849   
02850   //TH1D *deltaSim = (TH1D*)simSpectrum->Clone("deltaSim");
02851   //deltaSim->Reset();
02852   TH1D *deltaSim = (TH1D*)baselineNoiseSpectrum->Clone("deltaSim");
02853   CalcDeltaSim(deltaSim, simSpectrum/*, baselineNoiseSpectrum*/);
02854   deltaSim->SetLineColor(4);
02855   deltaSim->SetLineStyle(1);
02856   deltaSim->SetMarkerStyle(20);
02857   deltaSim->SetMarkerColor(4);
02858 
02859   //TH1D *deltaSim2 = (TH1D*)simSpectrum->Clone("deltaSim2");
02860   //deltaSim2->Reset();
02861   TH1D *deltaSim2 = (TH1D*)baselineNoiseSpectrumWoOWoU->Clone("deltaSim2"); 
02862   CalcDeltaSim(deltaSim2, simSpectrum/*, baselineNoiseSpectrumWoOWoU*/);
02863   deltaSim2->SetLineColor(6);
02864   deltaSim2->SetLineStyle(1);
02865   deltaSim2->SetMarkerStyle(20);
02866   deltaSim2->SetMarkerColor(6);
02867 
02868   //TH1D *deltaSimMS = (TH1D*)simSpectrum->Clone("deltaSimMS");
02869   //deltaSimMS->Reset();
02870   if (!simple) {
02871     TH1D *deltaSimMS = (TH1D*)preCompSpectrum->Clone("deltaSimMS"); 
02872     CalcDeltaSim(deltaSimMS, simSpectrum/*, preCompSpectrum*/);
02873     deltaSimMS->SetLineColor(2);
02874     deltaSimMS->SetLineStyle(1);
02875     deltaSimMS->SetMarkerStyle(20);
02876     deltaSimMS->SetMarkerColor(2);
02877 
02878     //TH1D *deltaSimMS2 = (TH1D*)simSpectrum->Clone("deltaSimMS2");
02879     //deltaSimMS2->Reset();
02880     TH1D *deltaSimMS2 = (TH1D*)preCompBaselineSpectrum->Clone("deltaSimMS2");
02881     CalcDeltaSim(deltaSimMS2, simSpectrum/*, preCompBaselineSpectrum*/);
02882 
02883     deltaSimMS2->SetLineColor(7);
02884     deltaSimMS2->SetLineStyle(1);
02885     deltaSimMS2->SetMarkerStyle(20);
02886     deltaSimMS2->SetMarkerColor(7);
02887     pad2->cd();
02888     deltaSimMS->GetYaxis()->SetRangeUser(0.1, 2.1);
02889     deltaSimMS->DrawCopy("same");
02890     deltaSimMS2->GetYaxis()->SetRangeUser(0.1, 2.1);
02891     deltaSimMS2->DrawCopy("same");
02892   }
02893 
02894   pad2->cd();
02895   deltaSim->GetXaxis()->SetRangeUser(-0.5,70);
02896   deltaSim->GetYaxis()->SetRangeUser(0.1, 2.1);
02897   deltaSim->DrawCopy("");
02898   deltaSim2->GetYaxis()->SetRangeUser(0.1, 2.1);
02899   deltaSim2->DrawCopy("same");
02900 
02901 
02902 
02903 
02904 
02905   pad3->cd()->SetLogy(1);
02906   //TFile dEdxFile("Electrons_dEdx_3GeV_12mm_XeCo2.root","READ");
02907   TFile dEdxFile(/*"Electrons_3GeV_12mm_XeCo2.root"*//*"data2012/root/sim/Sim_xeco20_12mm_03GeV.root"*/simfile.Data(),"READ");
02908   TString Tr_simfile = "data2012/root/sim/Sim_xeco20_12mm_03GeV_TR.root";
02909   Tr_simfile.Form("data2012/root/sim/Sim_xeco20_12mm_%02iGeV_TR.root",momentum);
02910   TFile TR_simFile(Tr_simfile.Data(),"READ");
02911   TH1D *hElDedx = (TH1D*)dEdxFile.Get("hElDedx");
02912   TH1D *hElTr;
02913   TH1D *hElTrAbs;
02914   TString radiator2;
02915   
02916   TH1D *spectrum; 
02917   TH1D* spectrumAbs;
02918   Float_t attenuation = 1.0;
02919   if (radiator == "") { // No radiator
02920     hElTrAbs = (TH1D*)dEdxFile.Get("hElDedx");
02921   }
02922   else {
02923     if (radiator == "Bshort" || radiator == "B" || radiator == "B++" || radiator == "C" || radiator == "D" || 
02924         radiator == "E" || radiator == "F" || radiator == "K" ||  radiator == "Kshort" || radiator == "K++" || 
02925         radiator == "FFM0.5x100" || radiator == "FFM0.5x200" || radiator == "FFM0.5x350" || 
02926         radiator == "FFM0.7x100" || radiator == "FFM0.7x200" || radiator == "FFM0.7x350" || 
02927         radiator == "FFM1.2x100" || radiator == "FFM1.2x200" || radiator == "FFM1.2x350"){
02928       spectrumAbs = (TH1D*)TR_simFile.Get("Absorption_("+radiator+")");
02929       spectrum = (TH1D*)TR_simFile.Get("Production_("+radiator+")");
02930       if (radiator == "B")
02931         attenuation = 0.65;//ok
02932       if (radiator == "B++")
02933         attenuation = 0.65;//
02934       if (radiator == "Bshort")
02935         attenuation = 0.65;//
02936       if (radiator == "K")
02937         attenuation = 0.65;//
02938       if (radiator == "K++")
02939         attenuation = 0.65;//
02940       if (radiator == "Kshort")
02941         attenuation = 0.65;//
02942       if (radiator == "C")
02943         attenuation = 0.30;//ok
02944       if (radiator == "D")
02945         attenuation = 0.45;//ok
02946       if (radiator == "E")
02947         attenuation = 0.60;//ok
02948       if (radiator == "F")
02949         attenuation = 0.65;//ok
02950       if (radiator == "FFM0.5x100")
02951         attenuation = 0.75;//0.65;//
02952       if (radiator == "FFM0.5x200")
02953         attenuation = 0.75;//0.75;//
02954       if (radiator == "FFM0.5x350")
02955         attenuation = 0.75;//0.65;//
02956       if (radiator == "FFM0.7x100")
02957         attenuation = 0.75;//0.75;//
02958       if (radiator == "FFM0.7x200")
02959         attenuation = 0.75;//0.80;//
02960       if (radiator == "FFM0.7x350")
02961         attenuation = 0.75;//0.65;//
02962       if (radiator == "FFM1.2x100")
02963         attenuation = 0.75;//0.75;//
02964       if (radiator == "FFM1.2x200")
02965         attenuation = 0.75;//0.75;//
02966       if (radiator == "FFM1.2x350")
02967         attenuation = 0.75;//0.65;//
02968     }
02969     else if (radiator == "A" || radiator == "G10" || radiator == "G20" || radiator == "G30" || 
02970              radiator == "H25" || radiator == "H" || radiator == "H++" || radiator == "Iu"  || 
02971              radiator == "Ip" || radiator == "J" || radiator == "L" || radiator == "M" || 
02972              radiator == "N25" || radiator == "O5x5" || radiator == "HF110" || radiator == "3xEF700"){
02973       TString irradiator;
02974       if (radiator == "A"){
02975         irradiator = "C";
02976         attenuation = 0.40;//ok
02977       }
02978       if (radiator == "G10"){
02979         irradiator = "C";
02980         attenuation = 0.35;//ok
02981       }
02982       if (radiator == "G20"){
02983         irradiator = "C";
02984         attenuation = 0.50;//ok
02985       }
02986       if (radiator == "G30"){
02987         irradiator = "C";
02988         attenuation = 0.78;//0.65;//ok
02989       }
02990       if (radiator == "H25"){
02991         irradiator = "C";
02992         attenuation = 0.35;//
02993       }
02994       if (radiator == "H"){
02995         irradiator = "C";
02996         attenuation = 0.78;//0.75;//0.65;//ok
02997       }
02998       if (radiator == "H++"){
02999         irradiator = "C";
03000         attenuation = 0.60;//ok
03001       }
03002       if (radiator == "Ip"){
03003         irradiator = "C";
03004         attenuation = 0.60;//ok
03005       }
03006       if (radiator == "Iu"){
03007         irradiator = "C";
03008         attenuation = 0.55;//ok
03009       }
03010       if (radiator == "J"){
03011         irradiator = "C";
03012         attenuation = 0.20;//ok
03013       }
03014       if (radiator == "L"){
03015         irradiator = "C";
03016         attenuation = 0.60;//0.50;//0.45;//
03017       }
03018       if (radiator == "M"){
03019         irradiator = "C";
03020         attenuation = 0.50;//
03021       }
03022       if (radiator == "N25"){
03023         irradiator = "C";
03024         attenuation = 0.42;//0.40;//0.55;//
03025       }
03026       if (radiator == "O5x5"){
03027         irradiator = "C";
03028         attenuation = 0.39;//0.38;//0.35;//
03029       }
03030       if (radiator == "HF110"){
03031         irradiator = "C";
03032         attenuation = 0.65;//0.35;//0.40;//
03033       }
03034       if (radiator == "3xEF700"){
03035         irradiator = "C";
03036         attenuation = 0.40;//0.35;//0.30;//
03037       }
03038       spectrumAbs = (TH1D*)TR_simFile.Get("Absorption_("+/*ir*/radiator+")");
03039       spectrum = (TH1D*)TR_simFile.Get("Production_("+/*ir*/radiator+")");
03040     }
03041     else {
03042       printf("ERROR::Main: no or wrong radiator type");
03043       return;
03044     }
03045   
03046     hElTr = (TH1D*)hElDedx->Clone("hElTr_"+TString(spectrum->GetTitle()));
03047     hElTr->Reset();
03048     hElTrAbs = (TH1D*)hElDedx->Clone("hElTrAbs_"+TString(spectrumAbs->GetTitle()));
03049     hElTrAbs->Reset();
03050     TRandom2 *rEfficiency = new TRandom2();
03051  
03052 
03053     Int_t nElec = 0.2E6;
03054     radiator2.Form("%s (attenuated to %.1f%%)",radiator.Data(),attenuation*100);
03055     Double_t meanPhot = spectrum->Integral() * spectrum->GetBinWidth(1) * attenuation;
03056     for (Int_t iElec = 0; iElec < nElec; iElec++) {
03057       Int_t nPhot = rEfficiency->Poisson(meanPhot);
03058       Float_t dEdx = hElDedx->GetRandom();
03059       Float_t Tr = 0;
03060       for (Int_t iPhot = 0; iPhot < nPhot; iPhot++) {
03061         Tr += spectrum->GetRandom();
03062       }
03063       hElTr->Fill(dEdx+Tr);
03064     }
03065     meanPhot = spectrumAbs->Integral() * spectrumAbs->GetBinWidth(1) * attenuation;
03066     for (Int_t iElec = 0; iElec < nElec; iElec++) {
03067       Int_t nPhot = rEfficiency->Poisson(meanPhot);
03068       Float_t dEdx = hElDedx->GetRandom();
03069       Float_t Tr = 0;
03070       for (Int_t iPhot = 0; iPhot < nPhot; iPhot++) {
03071         Tr += spectrumAbs->GetRandom();
03072       }
03073       hElTrAbs->Fill(dEdx+Tr);
03074     }
03075   }
03076   //TFile *sim2 = new TFile("Electrons_3GeV_12mm_XeCo2.root","READ");
03077   //TH1D* simSpectrumE = (TH1D*)sim2->Get("ElectronSpectrum_Abs_(D)");
03078   TH1D* simSpectrumE = hElTrAbs;
03079   simSpectrumE->SetXTitle("dE/dx [keV]");
03080   simSpectrumE->SetYTitle("normalized counts");
03081   simSpectrumE->SetStats(false);
03082   simSpectrumE->SetLineStyle(1);
03083   simSpectrumE->SetLineColor(1);
03084   simSpectrumE->Scale(/*baselineNoiseSpectrum->GetEntries()*/1./(Double_t)simSpectrumE->Integral());
03085   simSpectrumE->GetXaxis()->SetRangeUser(-0.5,70);
03086   TLegend *legE = new TLegend(0.15,0.5,0.85,0.85);
03087   legE->SetNColumns(2);
03088   legE->SetFillStyle(0);
03089   legE->SetTextSize(0.035);
03090   legE->SetLineStyle(0);
03091   legE->SetLineColor(0);
03092   legE->SetHeader("e^{-} spectra, " + usedSuName[suid] + ", p=3GeV/c, 12mm XeCO_{2}"); 
03093   legE->AddEntry(simSpectrumE,"simulated radiator: "+radiator2,"l");
03094   legE->AddEntry((TObject*)0, "","");
03095   if (simple) {
03096     legE->AddEntry(baselineNoiseSpectrumElectron,"measured: 1.baseline 2.noise","l");
03097     legE->AddEntry(baselineNoiseSpectrumWoOWoUElectron,"measured: 1.baseline 2.noise(woO && woU)","l");
03098     //legE->AddEntry(preCompSpectrumElectron,"measured: MS noise","l");
03099     //legE->AddEntry(preCompBaselineSpectrumElectron,"measured: MS noise + baseline","l");
03100     //legE->AddEntry((TObject*)0, "               woO && woU", "");
03101     //legE->AddEntry(noiseBaselineSpectrum,"measured: 1. noise 2. baseline","l");
03102     legE->AddEntry(probabilityOverflowE,"overflow probability","f");
03103     legE->AddEntry(probabilityUnderflowE,"underflow probability","f");
03104   } else {
03105     legE->AddEntry(baselineNoiseSpectrumElectron,"measured: baseline + FFM noise","l");
03106     legE->AddEntry(baselineNoiseSpectrumWoOWoUElectron,"measured: baseline + FFM noise (woO && woU)","l");
03107     legE->AddEntry(preCompSpectrumElectron,"measured: MS noise","l");
03108     legE->AddEntry(preCompBaselineSpectrumElectron,"measured: MS noise + baseline","l");
03109     //legE->AddEntry((TObject*)0, "               woO && woU", "");
03110     //legE->AddEntry(noiseBaselineSpectrum,"measured: 1. noise 2. baseline","l");
03111     legE->AddEntry(probabilityOverflowE,"overflow probability","f");
03112     legE->AddEntry(probabilityUnderflowE,"underflow probability","f");
03113   }
03114   simSpectrumE->GetYaxis()->SetRangeUser(5e-6, 10);
03115   simSpectrumE->GetXaxis()->SetLabelSize(0.04);
03116   simSpectrumE->GetYaxis()->SetLabelSize(0.04);
03117   simSpectrumE->GetXaxis()->SetTitleSize(0.045);
03118   simSpectrumE->GetYaxis()->SetTitleSize(0.045);
03119   simSpectrumE->GetYaxis()->SetTitleOffset(0.9);
03120   simSpectrumE->GetXaxis()->SetTitleOffset(0.5);
03121   simSpectrumE->DrawCopy();
03122   if (!plotFromFile){
03123     probabilityOverflowE->Scale(1./(Double_t)/*probabilityOverflow*/baselineNoiseSpectrumElectron->Integral());
03124     probabilityUnderflowE->Scale(1./(Double_t)/*probabilityUnderflow*/baselineNoiseSpectrumElectron->Integral());
03125   }
03126   probabilityUnderflowE->DrawCopy("same");
03127   probabilityOverflowE->DrawCopy("same");
03128   if (!plotFromFile)
03129     baselineNoiseSpectrumElectron->Scale(1./(Double_t)baselineNoiseSpectrumElectron->Integral());
03130   baselineNoiseSpectrumElectron->DrawCopy("same");
03131   if (!plotFromFile)
03132     baselineNoiseSpectrumWoOWoUElectron->Scale(1./(Double_t)baselineNoiseSpectrumWoOWoUElectron->Integral());
03133   baselineNoiseSpectrumWoOWoUElectron->DrawCopy("same");
03134   if (!simple) {
03135     if (!plotFromFile)
03136       preCompSpectrumElectron->Scale(1./(Double_t)preCompBaselineSpectrumElectron->Integral());
03137     preCompSpectrumElectron->DrawCopy("same");
03138     if (!plotFromFile)
03139       preCompBaselineSpectrumElectron->Scale(1./(Double_t)preCompBaselineSpectrumElectron->Integral());
03140     preCompBaselineSpectrumElectron->DrawCopy("same");
03141   }
03142   simSpectrumE->DrawCopy("same");
03143   legE->Draw("same");
03144 
03145 
03146   //TH1D *deltaSimE = (TH1D*)simSpectrumE->Clone("deltaSimE");
03147   //deltaSimE->Reset();
03148   TH1D *deltaSimE = (TH1D*)baselineNoiseSpectrumElectron->Clone("deltaSimE");
03149   CalcDeltaSim(deltaSimE, simSpectrumE/*, baselineNoiseSpectrumElectron*/);
03150   deltaSimE->SetLineColor(4);
03151   deltaSimE->SetLineStyle(1);
03152   deltaSimE->SetMarkerStyle(20);
03153   deltaSimE->SetMarkerColor(4);
03154 
03155   //TH1D *deltaSimE2 = (TH1D*)simSpectrumE->Clone("deltaSimE2");
03156   //deltaSimE2->Reset();
03157   TH1D *deltaSimE2 = (TH1D*)baselineNoiseSpectrumWoOWoUElectron->Clone("deltaSimE2");
03158   CalcDeltaSim(deltaSimE2, simSpectrumE/*, baselineNoiseSpectrumWoOWoUElectron*/);
03159   deltaSimE2->SetLineColor(6);
03160   deltaSimE2->SetLineStyle(1);
03161   deltaSimE2->SetMarkerStyle(20);
03162   deltaSimE2->SetMarkerColor(6);
03163 
03164   if (!simple) {
03165     //TH1D *deltaSimMSE = (TH1D*)simSpectrumE->Clone("deltaSimMSE");
03166     //deltaSimMSE->Reset();
03167     TH1D *deltaSimMSE = (TH1D*)preCompSpectrumElectron->Clone("deltaSimMSE");
03168     CalcDeltaSim(deltaSimMSE, simSpectrumE/*, preCompSpectrumElectron*/);
03169     deltaSimMSE->SetLineColor(2);
03170     deltaSimMSE->SetLineStyle(1);
03171     deltaSimMSE->SetMarkerStyle(20);
03172     deltaSimMSE->SetMarkerColor(2);
03173  
03174     //TH1D *deltaSimMSE2 = (TH1D*)simSpectrumE->Clone("deltaSimMSE2");
03175     //deltaSimMSE2->Reset();
03176     TH1D *deltaSimMSE2 = (TH1D*)preCompBaselineSpectrumElectron->Clone("deltaSimMSE2");
03177     CalcDeltaSim(deltaSimMSE2, simSpectrumE/*, preCompBaselineSpectrumElectron*/);
03178     deltaSimMSE2->SetLineColor(7);
03179     deltaSimMSE2->SetLineStyle(1);
03180     deltaSimMSE2->SetMarkerStyle(20);
03181     deltaSimMSE2->SetMarkerColor(7);
03182     pad4->cd();
03183     deltaSimMSE->GetYaxis()->SetRangeUser(0.1, 2.1);
03184     deltaSimMSE->DrawCopy("same");
03185     deltaSimMSE2->GetYaxis()->SetRangeUser(0.1, 2.1);
03186     deltaSimMSE2->DrawCopy("same");
03187   }
03188 
03189   pad4->cd();
03190   deltaSimE->GetYaxis()->SetRangeUser(0.1, 2.1);
03191   deltaSimE->GetXaxis()->SetRangeUser(-0.5,70);
03192   deltaSimE->DrawCopy("");
03193   deltaSimE2->GetYaxis()->SetRangeUser(0.1, 2.1);
03194   deltaSimE2->DrawCopy("same");
03195 
03196   TLine *l2 = new TLine(0,1,70,1);
03197   l2->SetLineStyle(2);
03198   pad4->cd();
03199   l2->Draw("same");
03200   pad2->cd();
03201   l2->Draw("same");
03202 
03203 
03204  
03205   //cResults->Update();
03206   cResults->SaveAs(outpic+".pdf");
03207   cResults->SaveAs(outpic+".png");
03208 
03209 
03210 
03211   TCanvas *cPRF = new TCanvas("cPRF","cPRF",800,600);
03212   TLegend* lPRF = new TLegend(0.65,0.65,0.85,0.85);
03213   lPRF->SetFillStyle(0);
03214   lPRF->SetTextSize(0.025);
03215   lPRF->SetLineStyle(0);
03216   lPRF->SetLineColor(0);
03217   TString values;
03218   lPRF->AddEntry(prfProfile,"average PRF","lp");
03219   lPRF->AddEntry(mathieson,"mathieson formula","l");
03220   lPRF->AddEntry((TObject*)0," K_{3}=0.35","");
03221   prfProfile->Fit("mathiesonFit","QR0");
03222   values.Form(" K_{3}=%.3f",-0.245 * (mathiesonFit->GetParameter(0)/mathiesonFit->GetParameter(2)) + (-20.19*(mathiesonFit->GetParameter(1)/mathiesonFit->GetParameter(2))+0.85));//mathiesonFit->GetParameter(0));
03223   lPRF->AddEntry(mathiesonFit,"mathieson fit","l");
03224   lPRF->AddEntry((TObject*)0,values,"");
03225   values.Form(" h=%.3f",mathiesonFit->GetParameter(0));
03226   lPRF->AddEntry((TObject*)0,values,"");
03227   cPRF->cd()->SetLogz(1);
03228   prf->DrawCopy("colz");
03229   prfProfile->Fit("mathiesonFit","QR0");
03230   mathiesonFit->DrawCopy("same");
03231   mathieson->DrawCopy("same");
03232   prfProfile->DrawCopy("same");
03233 
03234   lPRF->Draw("same");
03235   cPRF->SaveAs(outpic+"_PRF.pdf");
03236   cPRF->SaveAs(outpic+"_PRF.png");
03237 
03238   const Int_t nChambers = 12;
03239   TCanvas *cEfficiency = new TCanvas("cEfficiency","cEfficiency",800,600);
03240   TProfile* pEfficiency = new TProfile("pEfficiency","pEfficiency",12,0.5,12.5);
03241   pEfficiency->GetYaxis()->SetRangeUser(0.0001,100.5);
03242   TGraphErrors* hEfficiency = new TGraphErrors(nChambers);
03243   TGraphErrors* fitEfficiency = new TGraphErrors(nChambers);
03244   TLegend* leg3 = new TLegend(0.15,0.15,0.35,0.35);
03245   leg3->SetFillStyle(0);
03246   leg3->SetTextSize(0.025);
03247   leg3->SetLineStyle(0);
03248   leg3->SetLineColor(0);
03249   leg3->SetHeader(usedSuName[suid] + ", radiator: "+radiator2+", p=3GeV/c, 12mm XeCO_{2}");
03250   TMultiGraph *g1 = new TMultiGraph();    
03251   //TMultiGraph *g2 = new TMultiGraph();
03252   //TFile *output = new TFile(outfilename,"UPDATE");
03253   output->cd();
03254   if (true){
03255     if (simple) {
03256       TString names;
03257       for(Int_t delta = 0; delta < 6; delta++) {
03258         hEfficiency->GetYaxis()->SetRangeUser(1e-2,1e2);
03259         hEfficiency->SetMarkerColor(baselineNoiseSpectrumCrossTalkP[delta]->GetLineColor());
03260         hEfficiency->SetLineColor(baselineNoiseSpectrumCrossTalkP[delta]->GetLineColor());
03261         CalcPionEfficiency(baselineNoiseSpectrumCrossTalkE[delta], baselineNoiseSpectrumCrossTalkP[delta], hEfficiency, fitEfficiency, nChambers, debug);
03262         names.Form("Efficiency_Crosstalk_delta%02i",delta);
03263         hEfficiency->Write(names, TObject::kOverwrite);
03264         fitEfficiency->Write(names + TString("_fit"), TObject::kOverwrite);
03265       }
03266      
03267       CalcPionEfficiency(simSpectrumE, simSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03268       hEfficiency->SetMarkerColor(simSpectrumE->GetLineColor());
03269       hEfficiency->SetLineColor(simSpectrumE->GetLineColor());
03270       fitEfficiency->SetMarkerColor(simSpectrumE->GetLineColor());
03271       fitEfficiency->SetLineColor(simSpectrumE->GetLineColor());
03272       fitEfficiency->SetFillColor(simSpectrumE->GetLineColor());
03273       fitEfficiency->SetFillStyle(3003);
03274       output->cd();
03275       hEfficiency->Write("Efficiency_simulated", TObject::kOverwrite);
03276       fitEfficiency->Write("Efficiency_simulated_fit", TObject::kOverwrite);
03277       leg3->AddEntry(simSpectrum,"simulated","l");
03278       cEfficiency->cd()->SetLogy(1);
03279       pEfficiency->DrawCopy();
03280       g1->Add(hEfficiency,"P");
03281       g1->Add(fitEfficiency,"a3");
03282       //hEfficiency->DrawClone("P,text0");
03283       CalcPionEfficiency(preCompBaselineSpectrumElectron, preCompBaselineSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03284       hEfficiency->SetMarkerColor(preCompBaselineSpectrumElectron->GetLineColor());
03285       hEfficiency->SetLineColor(preCompBaselineSpectrumElectron->GetLineColor());
03286       fitEfficiency->SetMarkerColor(preCompBaselineSpectrumElectron->GetLineColor());
03287       fitEfficiency->SetLineColor(preCompBaselineSpectrumElectron->GetLineColor());
03288       fitEfficiency->SetFillColor(preCompBaselineSpectrumElectron->GetLineColor());
03289       fitEfficiency->SetFillStyle(3003);
03290       output->cd();
03291       hEfficiency->Write("Efficiency_measured_MS", TObject::kOverwrite);
03292       fitEfficiency->Write("Efficiency_measured_MS_fit", TObject::kOverwrite);
03293       //if (!simple) leg3->AddEntry(preCompBaselineSpectrumElectron,"measured: MS noise + baseline","l");
03294       cEfficiency->cd();
03295       //if (!simple) hEfficiency->DrawClone("P,text0,same");
03296       CalcPionEfficiency(baselineNoiseSpectrumElectron, baselineNoiseSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03297       hEfficiency->SetMarkerColor(baselineNoiseSpectrumElectron->GetLineColor());
03298       hEfficiency->SetLineColor(baselineNoiseSpectrumElectron->GetLineColor());
03299       fitEfficiency->SetMarkerColor(baselineNoiseSpectrumElectron->GetLineColor());
03300       fitEfficiency->SetLineColor(baselineNoiseSpectrumElectron->GetLineColor());
03301       fitEfficiency->SetFillColor(baselineNoiseSpectrumElectron->GetLineColor());
03302       fitEfficiency->SetFillStyle(3003);
03303       output->cd();
03304       hEfficiency->Write("Efficiency_measured_FFM", TObject::kOverwrite);
03305       fitEfficiency->Write("Efficiency_measured_FFM_fit", TObject::kOverwrite);
03306       leg3->AddEntry(baselineNoiseSpectrumElectron,"measured: 1.baseline 2.noise","l");
03307       cEfficiency->cd();
03308       g1->Add(hEfficiency,"P");
03309       g1->Add(fitEfficiency,"a3");
03310       //hEfficiency->DrawClone("P,text0,same");
03311       CalcPionEfficiency(baselineNoiseSpectrumWoOWoUElectron, baselineNoiseSpectrumWoOWoU, hEfficiency, fitEfficiency, nChambers, debug);
03312       hEfficiency->SetMarkerColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03313       hEfficiency->SetLineColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03314       fitEfficiency->SetMarkerColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03315       fitEfficiency->SetLineColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03316       fitEfficiency->SetFillColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03317       fitEfficiency->SetFillStyle(3003);
03318       output->cd();
03319       hEfficiency->Write("Efficiency_measured_FFM_WoOWo", TObject::kOverwrite);
03320       fitEfficiency->Write("Efficiency_measured_FFM_WoOWo_fit", TObject::kOverwrite);
03321       leg3->AddEntry(baselineNoiseSpectrumWoOWoUElectron,"measured: 1.baseline 2.noise (woO && woU)","l");
03322       cEfficiency->cd();
03323       g1->Add(hEfficiency,"P");
03324       g1->Add(fitEfficiency,"a3");
03325       g1->Draw("same");
03326       //hEfficiency->DrawClone("P,text0,same");
03327       leg3->Draw("same");
03328       TLine *l1 = new TLine(0.5,1,12.5,1);
03329       l1->SetLineColor(2);
03330       l1->SetLineStyle(2);
03331       l1->Draw("same");
03332       outpic.ReplaceAll("Spectra","Efficiency");
03333       cEfficiency->SaveAs(outpic+".pdf");
03334       cEfficiency->SaveAs(outpic+".png");
03335     }
03336     if (!simple) {
03337       hEfficiency->GetXaxis()->SetRangeUser(1e-2,1e2);
03338       TString names;
03339       for(Int_t delta = 0; delta < 6; delta++) {
03340         hEfficiency->GetYaxis()->SetRangeUser(1e-2,1e2);
03341         hEfficiency->SetMarkerColor(baselineNoiseSpectrumCrossTalkP[delta]->GetLineColor());
03342         hEfficiency->SetLineColor(baselineNoiseSpectrumCrossTalkP[delta]->GetLineColor());
03343         CalcPionEfficiency(baselineNoiseSpectrumCrossTalkE[delta], baselineNoiseSpectrumCrossTalkP[delta], hEfficiency, fitEfficiency, nChambers, debug);
03344         names.Form("Efficiency_Crosstalk_delta%02i",delta);
03345         hEfficiency->Write(names, TObject::kOverwrite);
03346         fitEfficiency->Write(names + TString("_fit"), TObject::kOverwrite);
03347       }
03348 
03349       CalcPionEfficiency(simSpectrumE, simSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03350       hEfficiency->SetMarkerColor(simSpectrumE->GetLineColor());
03351       hEfficiency->SetLineColor(simSpectrumE->GetLineColor());
03352       fitEfficiency->SetMarkerColor(simSpectrumE->GetLineColor());
03353       fitEfficiency->SetLineColor(simSpectrumE->GetLineColor());
03354       fitEfficiency->SetFillColor(simSpectrumE->GetLineColor());
03355       fitEfficiency->SetFillStyle(3003);
03356       output->cd();
03357       hEfficiency->Write("Efficiency_simulated", TObject::kOverwrite);
03358       fitEfficiency->Write("Efficiency_simulated_fit", TObject::kOverwrite);
03359       leg3->AddEntry(simSpectrum,"simulated","l");
03360       cEfficiency->cd()->SetLogy(1);
03361       //hEfficiency->DrawClone("P,text0");
03362       pEfficiency->DrawCopy("P");
03363       g1->Add(hEfficiency,"P");
03364       g1->Add(fitEfficiency,"P");
03365       CalcPionEfficiency(preCompBaselineSpectrumElectron, preCompBaselineSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03366       hEfficiency->SetMarkerColor(preCompBaselineSpectrumElectron->GetLineColor());
03367       hEfficiency->SetLineColor(preCompBaselineSpectrumElectron->GetLineColor());
03368       fitEfficiency->SetMarkerColor(preCompBaselineSpectrumElectron->GetLineColor());
03369       fitEfficiency->SetLineColor(preCompBaselineSpectrumElectron->GetLineColor());
03370       fitEfficiency->SetFillColor(preCompBaselineSpectrumElectron->GetLineColor());
03371       fitEfficiency->SetFillStyle(3003);
03372       output->cd();
03373       hEfficiency->Write("Efficiency_measured_MS", TObject::kOverwrite);
03374       fitEfficiency->Write("Efficiency_measured_MS_fit", TObject::kOverwrite);
03375       leg3->AddEntry(preCompBaselineSpectrumElectron,"measured: MS 1.baseline 2.noise","l");
03376       cEfficiency->cd();
03377       g1->Add(hEfficiency,"P");
03378       g1->Add(fitEfficiency,"P");
03379       //hEfficiency->DrawClone("P,text0,same");
03380       CalcPionEfficiency(baselineNoiseSpectrumElectron, baselineNoiseSpectrum, hEfficiency, fitEfficiency, nChambers, debug);
03381       hEfficiency->SetMarkerColor(baselineNoiseSpectrumElectron->GetLineColor());
03382       hEfficiency->SetLineColor(baselineNoiseSpectrumElectron->GetLineColor());
03383       fitEfficiency->SetMarkerColor(baselineNoiseSpectrumElectron->GetLineColor());
03384       fitEfficiency->SetLineColor(baselineNoiseSpectrumElectron->GetLineColor());
03385       fitEfficiency->SetFillColor(baselineNoiseSpectrumElectron->GetLineColor());
03386       fitEfficiency->SetFillStyle(3003);
03387       output->cd();
03388       hEfficiency->Write("Efficiency_measured_FFM", TObject::kOverwrite);
03389       fitEfficiency->Write("Efficiency_measured_FFM_fit", TObject::kOverwrite);
03390       leg3->AddEntry(baselineNoiseSpectrumElectron,"measured: FFM 1.baseline 2.noise","l");
03391       cEfficiency->cd();
03392       //hEfficiency->DrawClone("P,text0,same");
03393       g1->Add(hEfficiency,"P");
03394       g1->Add(fitEfficiency,"P");
03395       CalcPionEfficiency(baselineNoiseSpectrumWoOWoUElectron, baselineNoiseSpectrumWoOWoU, hEfficiency, fitEfficiency, nChambers, debug);
03396       hEfficiency->SetMarkerColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03397       hEfficiency->SetLineColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03398       fitEfficiency->SetMarkerColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03399       fitEfficiency->SetLineColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03400       fitEfficiency->SetFillColor(baselineNoiseSpectrumWoOWoUElectron->GetLineColor());
03401       fitEfficiency->SetFillStyle(3003);
03402       output->cd();
03403       hEfficiency->Write("Efficiency_measured_FFM_WoOWo", TObject::kOverwrite);
03404       fitEfficiency->Write("Efficiency_measured_FFM_WoOWo_fit", TObject::kOverwrite);
03405       leg3->AddEntry(baselineNoiseSpectrumWoOWoUElectron,"measured: FFM 1.baseline 2.noise (woO && woU)","l");
03406       cEfficiency->cd();
03407       g1->Add(hEfficiency,"P");
03408       g1->Add(fitEfficiency,"P");
03409       //hEfficiency->DrawClone("P,text0,same");
03410       g1->Draw("same");
03411       leg3->Draw("same");
03412       TLine *l1 = new TLine(0.5,1,12.5,1);
03413       l1->SetLineColor(2);
03414       l1->SetLineStyle(2);
03415       l1->Draw("same");
03416       outpic.ReplaceAll("Spectra","Efficiency");
03417       cEfficiency->SaveAs(outpic+".pdf");
03418       cEfficiency->SaveAs(outpic+".png");
03419     }
03420   }
03421   TLegend *lShape = new TLegend(0.5,0.75,0.85,0.85);
03422   lShape->SetFillStyle(0);
03423   lShape->SetTextSize(0.025);
03424   lShape->SetLineStyle(0);
03425   lShape->SetLineColor(0);
03426   TCanvas *r = new TCanvas("r","r",2*800,2*600); 
03427   r->Divide(2,2);
03428   r->cd(1); 
03429   averagePulse_e->GetYaxis()->SetRangeUser(-1,256);
03430   averagePulse_e->DrawCopy();
03431   lShape->AddEntry(averagePulse_e,"electrons","lp");
03432   averagePulse_p->DrawCopy("same");
03433   lShape->AddEntry(averagePulse_p,"pions","lp");
03434   lShape->Draw("same");  
03435   r->cd(3)->SetLogz(1); 
03436   averagePulse_2D_e->DrawCopy("colz");
03437   r->cd(4)->SetLogz(1);
03438   averagePulse_2D_p->DrawCopy("colz");
03439   r->cd(2)->SetLogz(1);
03440   averageSignal_2D->DrawCopy("colz");
03441   r->SaveAs(outpic+"PulseShape.pdf");
03442   r->SaveAs(outpic+"PulseShape.png");
03443   TCanvas *s = new TCanvas("s","s",800,600); 
03444   s->cd(1)->SetLogz(1);   
03445   keV2Amplitude->SetXTitle("dE/dx [keV]");
03446   keV2Amplitude->SetYTitle("Amplitude [ADCs]");
03447   keV2Amplitude->DrawCopy("colz");
03448   keV2AmplitudeProfile->SetMarkerStyle(24);
03449   keV2AmplitudeProfile->DrawCopy("same");
03450   TF1 *linear = new TF1("linear","pol1",2,30);
03451   keV2Amplitude->Fit("linear","RQ0");
03452   linear->SetLineColor(2);
03453   linear->SetLineStyle(1);
03454   linear->Draw("same");
03455   keV2AmplitudeProfile->DrawCopy("same");
03456   TString fitResult;
03457   fitResult.Form("f(x) = (%.3f#pm%.3f) x + (%.3f#pm%.3f)",linear->GetParameter(1), linear->GetParError(1), linear->GetParameter(0), linear->GetParError(0));
03458   TPaveText *pt = new TPaveText(30,20,95,50);
03459   //pt->SetFillStyle(0);
03460   pt->SetLineColor(0);
03461   pt->SetTextSize(0.035);
03462   pt->AddText(fitResult.Data());
03463   pt->Draw("same");
03464   s->SaveAs(outpic+"_Pions_ADC_vs_Amplitude.pdf");
03465   s->SaveAs(outpic+"_Pions_ADC_vs_Amplitude.png");
03466   IntegralvsAmplitude->Draw("colz");
03467   s->SaveAs(outpic+"_Pions_Integral_vs_Amplitude.pdf");
03468   s->SaveAs(outpic+"_Pions_Integral_vs_Amplitude.png");
03469   TCanvas* cBeamMonitor = new TCanvas("BeamMonitor","Beam Monitor",2*800,600);
03470   cBeamMonitor->Divide(2,1);
03471   cBeamMonitor->cd(1)->SetLogz(1);
03472   allCh1_Pb->GetYaxis()->SetTitleOffset(1.35);
03473   allCh1_Pb->DrawCopy("colz");
03474   cBeamMonitor->cd(2)->SetLogz(1);
03475   allCh2_Pb->GetYaxis()->SetTitleOffset(1.35);
03476   allCh2_Pb->DrawCopy("colz");
03477   cBeamMonitor->SaveAs(outpic+"Ch_Pb.pdf");
03478   cBeamMonitor->SaveAs(outpic+"Ch_Pb.png");
03479   TCanvas* cCutMonitor = new TCanvas("CutMonitor","Cut Value Monitor",3*800,3*600);
03480   cCutMonitor->Divide(3,3);
03481   //cCutMonitor->cd(1)->SetLogx(1);
03482   cCutMonitor->cd(1)->SetLogy(1);
03483   maxAmplitudeValue->DrawCopy();
03484   cCutMonitor->cd(2)->SetLogy(1);   
03485   covaMatixValue->DrawCopy();
03486   cCutMonitor->cd(3)->SetLogy(0); 
03487   clusterSize->DrawCopy();
03488   cCutMonitor->cd(4)->SetLogz(1); 
03489   covaMatixValueMaxAmplitude->DrawCopy("colz");
03490   cCutMonitor->cd(5)->SetLogz(1);
03491   covaMatixValueHitTime->DrawCopy("colz");
03492   cCutMonitor->cd(6)->SetLogz(1);
03493   maxAmplitudeHitTime->DrawCopy("colz");
03494   cCutMonitor->cd(7)->SetLogz(1);
03495   clusterwCharge->DrawCopy("colz");
03496   cCutMonitor->SaveAs(outpic+"Cuts.pdf");
03497   cCutMonitor->SaveAs(outpic+"Cuts.png");
03498   TCanvas *cSimple = new TCanvas("cSimple","cSimple",800,600);
03499   cSimple->cd()->SetLogy(1);
03500   if (fHistoScale == SPADIC_TRACE_SIZE * SPADIC_ADC_MAX / 100.)
03501     baselineNoiseSpectrum->SetXTitle("ADC values");
03502   else
03503     baselineNoiseSpectrum->SetXTitle("dE/dx [keV]");
03504   baselineNoiseSpectrum->SetYTitle("normalized counts");
03505   baselineNoiseSpectrum->SetStats(false);
03506   baselineNoiseSpectrum->SetLineStyle(1);
03507   baselineNoiseSpectrum->SetLineColor(1);
03508   //simSpectrumE->Scale(/*baselineNoiseSpectrum->GetEntries()*/1./(Float_t)simSpectrumE->GetEntries());
03509   if (fHistoScale < SPADIC_TRACE_SIZE * SPADIC_ADC_MAX / 100.)
03510     baselineNoiseSpectrum->GetXaxis()->SetRangeUser(-0.5,70);
03511   baselineNoiseSpectrum->DrawCopy();
03512   baselineNoiseSpectrumElectron->SetLineColor(2);
03513   baselineNoiseSpectrumElectron->DrawCopy("same");
03514   outpic.ReplaceAll("Efficiency","Spectra");
03515   cSimple->SaveAs(outpic+"_Simple.pdf");
03516   cSimple->SaveAs(outpic+"_Simple.png");
03517   if (!plotFromFile) {
03518     printf("%i Pion (%.2f%%) & %i Electron (%.2f%%) & %i no PID or noise (%.2f%%) events found\n",nPions,nPions*100./entries,nElectrons,nElectrons*100./entries,entries-(nPions+nElectrons),(entries-(nPions+nElectrons))*100./entries);
03519     hCh_1->Write("", TObject::kOverwrite);
03520     hCh_2->Write("", TObject::kOverwrite);
03521     hPb->Write("", TObject::kOverwrite);
03522     Ch1_Pb->Write("", TObject::kOverwrite);
03523     allCh1_Pb->Write("", TObject::kOverwrite);
03524     noCh1_Pb->Write("", TObject::kOverwrite);
03525     Ch2_Pb->Write("", TObject::kOverwrite);
03526     allCh2_Pb->Write("", TObject::kOverwrite);
03527     noCh2_Pb->Write("", TObject::kOverwrite);
03528     Ch1_Ch2->Write("", TObject::kOverwrite);
03529     allCh1_Ch2->Write("", TObject::kOverwrite);
03530     noCh1_Ch2->Write("", TObject::kOverwrite);
03531     prfProfile->Write("", TObject::kOverwrite);
03532     prf->Write("", TObject::kOverwrite);
03533     clusterwCharge->Write("", TObject::kOverwrite);
03534     mathieson->Write("", TObject::kOverwrite);
03535     mathiesonFit->Write("", TObject::kOverwrite);
03536     cPRF->Write("", TObject::kOverwrite);
03537     cEfficiency->Write("", TObject::kOverwrite);
03538     simSpectrum->Write("", TObject::kOverwrite);
03539     simSpectrumE->Write("", TObject::kOverwrite);
03540     rawSpectrum->Write("", TObject::kOverwrite);
03541     baselineSpectrum->Write("", TObject::kOverwrite);
03542     baselineNoiseSpectrum->Write("", TObject::kOverwrite);
03543     noiseSpectrum->Write("", TObject::kOverwrite);
03544     noiseBaselineSpectrum->Write("", TObject::kOverwrite);
03545     baselineNoiseSpectrumElectron->Write("", TObject::kOverwrite);
03546     baselineNoiseSpectrumWoOWoUElectron->Write("", TObject::kOverwrite);
03547     baselineNoiseSpectrumWoOWoU->Write("", TObject::kOverwrite);
03548     preCompSpectrumElectron->Write("", TObject::kOverwrite);
03549     preCompBaselineSpectrumElectron->Write("", TObject::kOverwrite);
03550     preCompSpectrum->Write("", TObject::kOverwrite);
03551     preCompBaselineSpectrum->Write("", TObject::kOverwrite);
03552     averagePulse_e->Write("", TObject::kOverwrite);
03553     averagePulse_p->Write("", TObject::kOverwrite);
03554     averagePulse_2D_e->Write("", TObject::kOverwrite);
03555     averagePulse_2D_p->Write("", TObject::kOverwrite);
03556     probabilityOverflow->Write("", TObject::kOverwrite);
03557     probabilityUnderflow->Write("", TObject::kOverwrite);
03558     probabilityOverflowE->Write("", TObject::kOverwrite);
03559     probabilityUnderflowE->Write("", TObject::kOverwrite);
03560     keV2AmplitudeProfile->Write("", TObject::kOverwrite);
03561     keV2Amplitude->Write("", TObject::kOverwrite);
03562     IntegralvsAmplitude->Write("", TObject::kOverwrite);
03563     for(Int_t delta = 0; delta < 6; delta++) {
03564       baselineNoiseSpectrumCrossTalkE[delta]->Scale(1./(Double_t)baselineNoiseSpectrumCrossTalkE[delta]->Integral());
03565       baselineNoiseSpectrumCrossTalkE[delta]->Write("", TObject::kOverwrite);
03566       baselineNoiseSpectrumCrossTalkP[delta]->Scale(1./(Double_t)baselineNoiseSpectrumCrossTalkP[delta]->Integral());
03567       baselineNoiseSpectrumCrossTalkP[delta]->Write("", TObject::kOverwrite);  
03568     }
03569     //deltaSim->Write("", TObject::kOverwrite);
03570     //deltaSim2->Write("", TObject::kOverwrite);
03571     maxAmplitudeValue->Write("", TObject::kOverwrite);
03572     covaMatixValue->Write("", TObject::kOverwrite);
03573     covaMatixValueMaxAmplitude->Write("", TObject::kOverwrite);
03574     covaMatixValueHitTime->Write("", TObject::kOverwrite);
03575     clusterSize->Write("", TObject::kOverwrite);
03576     maxAmplitudeHitTime->Write("", TObject::kOverwrite);
03577     crossTalk->Write("", TObject::kOverwrite);
03578     cResults->Write("", TObject::kOverwrite);
03579     noiseDistribution->SetXTitle("noise [ADC]");
03580     noiseDistribution->SetYTitle("#");
03581     noiseDistribution->Write("", TObject::kOverwrite);
03582     baselineDistribution->SetXTitle("channel");
03583     baselineDistribution->SetYTitle("ADC");
03584     baselineDistribution->Write("", TObject::kOverwrite);
03585   }
03586   output->Close();
03587   timer.Stop();
03588   Double_t rtime = timer.RealTime();
03589   Double_t ctime = timer.CpuTime();
03590 
03591   printf("\n\n******************** Reading Test  **********************\n");
03592   printf("   RealTime=%f seconds, CpuTime=%f seconds\n",rtime,ctime);
03593   printf("*********************************************************\n\n");
03594 
03595 }

Generated on Tue Dec 10 2013 04:52:16 for ROCsoft by  doxygen 1.7.1