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
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;
00063
00064
00065 Double_t dEdx_min = 0.;
00066 Double_t dEdx_max = 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
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
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
00098 printf(" %3i%%",Int_t(i * 100 / Float_t(n)));
00099 cout << flush << "\r";
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
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
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 return (MPV_kev / MPV_adc * ADCvalue);
00136
00137
00138
00139
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
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
00156 sLikelihoodEl[Chamberloop] = new TH1D(cHist,"e and pi Prob",nLikeliBins[Chamberloop-1],-0.05,1.05);
00157 }
00158 Int_t nEvents = 5e7;
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
00197 fEl = 0;
00198 fPi = 0;
00199 while (fEl == 0 || fPi == 0) {
00200 chEl = hElectronSpectra->GetRandom();
00201
00202
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
00234 fEl = 0;
00235 fPi = 0;
00236 while (fEl == 0 || fPi == 0) {
00237 chPi = hPionSpectra->GetRandom();
00238
00239
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]);
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
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
00288
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
00298 hEfficiency->SetPoint(Chamberloop-1, Chamberloop, PionIntegral*100.);
00299 hEfficiency->SetPointError(Chamberloop-1,0, fabs(PionIntegral - lastPionIntegral) *100.);
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);
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
00318
00319 for (Int_t Chamberloop = 1; Chamberloop <= nChambers; Chamberloop++){
00320
00321
00322 delete sLikelihoodPi[Chamberloop];
00323 delete sLikelihoodEl[Chamberloop];
00324 }
00325
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;
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
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
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
00396 Double_t fEl = 0;
00397 Double_t fPi = 0;
00398 while (fEl == 0 || fPi == 0) {
00399 Double_t chEl = hElectronSpectra->GetRandom();
00400
00401
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
00432 Double_t fEl = 0;
00433 Double_t fPi = 0;
00434 while (fEl == 0 || fPi == 0) {
00435 Double_t chPi = hPionSpectra->GetRandom();
00436
00437
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
00463 Double_t fEl = 0;
00464 Double_t fPi = 0;
00465 while (fEl == 0 || fPi == 0) {
00466 Double_t chPi = hPionSpectra->GetRandom();
00467
00468
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
00526
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
00534
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
00547 runId.ReplaceAll("Be_run","");
00548
00549 runId.ReplaceAll("Te_run","");
00550
00551 runId.ReplaceAll(".root","");
00552
00553
00554
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;
00560 pidcuts[1] = 4000;
00561 pidcuts[2] = 800;
00562 pidcuts[3] = 4000;
00563 pidcuts[4] = 850;
00564 pidcuts[5] = 4000;
00565 pidcuts[6] = 0;
00566 pidcuts[7] = 375;
00567 pidcuts[8] = 0;
00568 pidcuts[9] = 350;
00569 pidcuts[10]= 350;
00570 pidcuts[11]= 4000;
00571 pidcuts[12]= 375;
00572 pidcuts[13]= 1000;
00573 pidcuts[14]= 350;
00574 pidcuts[15]= 800;
00575 pidcuts[16]= 550;
00576 pidcuts[17]= 850;
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;
00586 pidcuts[1] = 4000;
00587 pidcuts[2] = 475;
00588 pidcuts[3] = 4000;
00589 pidcuts[4] = 850;
00590 pidcuts[5] = 4000;
00591 pidcuts[6] = 0;
00592 pidcuts[7] = 375;
00593 pidcuts[8] = 0;
00594 pidcuts[9] = 350;
00595 pidcuts[10]= 350;
00596 pidcuts[11]= 4000;
00597 pidcuts[12]= 375;
00598 pidcuts[13]= 1000;
00599 pidcuts[14]= 350;
00600 pidcuts[15]= 600;
00601 pidcuts[16]= 600;
00602 pidcuts[17]= 850;
00603 } else if (runId == "3GeV_1800V_500V_B_K_A" ||
00604 runId == "3GeV_B_K_A"
00605 ){
00606 pidcuts[0] = 800;
00607 pidcuts[1] = 4000;
00608 pidcuts[2] = 475;
00609 pidcuts[3] = 4000;
00610 pidcuts[4] = 850;
00611 pidcuts[5] = 4000;
00612 pidcuts[6] = 0;
00613 pidcuts[7] = 375;
00614 pidcuts[8] = 0;
00615 pidcuts[9] = 350;
00616 pidcuts[10]= 350;
00617 pidcuts[11]= 4000;
00618 pidcuts[12]= 375;
00619 pidcuts[13]= 1000;
00620 pidcuts[14]= 350;
00621 pidcuts[15]= 700;
00622 pidcuts[16]= 350;
00623 pidcuts[17]= 850;
00624 } else {
00625 pidcuts[0] = 650;
00626 pidcuts[1] = 4000;
00627 pidcuts[2] = 475;
00628 pidcuts[3] = 4000;
00629 pidcuts[4] = 850;
00630 pidcuts[5] = 4000;
00631 pidcuts[6] = 0;
00632 pidcuts[7] = 375;
00633 pidcuts[8] = 0;
00634 pidcuts[9] = 350;
00635 pidcuts[10]= 350;
00636 pidcuts[11]= 4000;
00637 pidcuts[12]= 375;
00638 pidcuts[13]= 650;
00639 pidcuts[14]= 350;
00640 pidcuts[15]= 475;
00641 pidcuts[16]= 600;
00642 pidcuts[17]= 850;
00643 }
00644 } else if (Momentum == 4) {
00645 pidcuts[0] = 600;
00646 pidcuts[1] = 4000;
00647 pidcuts[2] = 400;
00648 pidcuts[3] = 4000;
00649 pidcuts[4] = 900;
00650 pidcuts[5] = 4000;
00651 pidcuts[6] = 0;
00652 pidcuts[7] = 375;
00653 pidcuts[8] = 0;
00654 pidcuts[9] = 350;
00655 pidcuts[10]= 350;
00656 pidcuts[11]= 4000;
00657 pidcuts[12]= 375;
00658 pidcuts[13]= 900;
00659 pidcuts[14]= 350;
00660 pidcuts[15]= 550;
00661 pidcuts[16]= 600;
00662 pidcuts[17]= 900;
00663 } else if (Momentum == 6) {
00664 pidcuts[0] = 500;
00665 pidcuts[1] = 4000;
00666 pidcuts[2] = 375;
00667 pidcuts[3] = 4000;
00668 pidcuts[4] = 1000;
00669 pidcuts[5] = 4000;
00670 pidcuts[6] = 0;
00671 pidcuts[7] = 375;
00672 pidcuts[8] = 0;
00673 pidcuts[9] = 350;
00674 pidcuts[10]= 350;
00675 pidcuts[11]= 4000;
00676 pidcuts[12]= 375;
00677 pidcuts[13]= 1000;
00678 pidcuts[14]= 350;
00679 pidcuts[15]= 1000;
00680 pidcuts[16]= 400;
00681 pidcuts[17]= 600;
00682 } else if (Momentum == 8) {
00683 pidcuts[0] = 450;
00684 pidcuts[1] = 4000;
00685 pidcuts[2] = 375;
00686 pidcuts[3] = 4000;
00687 pidcuts[4] = 800;
00688 pidcuts[5] = 4000;
00689 pidcuts[6] = 0;
00690 pidcuts[7] = 375;
00691 pidcuts[8] = 0;
00692 pidcuts[9] = 350;
00693 pidcuts[10]= 350;
00694 pidcuts[11]= 4000;
00695 pidcuts[12]= 375;
00696 pidcuts[13]= 1000;
00697 pidcuts[14]= 350;
00698 pidcuts[15]= 4000;
00699 pidcuts[16]= 425;
00700 pidcuts[17]= 550;
00701 }
00702 }
00703 void getPID( Float_t ch1, Float_t ch2, Float_t pb)
00704 {
00705
00706
00707
00708 isPion = false;
00709 isElectron = false;
00710 isMyon = false;
00711 if ((ch1 < 350 && pb < 350) || (ch2 < 350 && pb < 350)) return;
00712 if (ch1 > pidcuts[0] &&
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] &&
00721 ch1 < pidcuts[7] &&
00722 ch2 > pidcuts[8] &&
00723 ch2 < pidcuts[9] &&
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
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
00749 if (tempIntegral > maxIntegral) {
00750 maxCh = ch;
00751 maxIntegral = tempIntegral;
00752 }
00753 }
00754
00755
00756
00757
00758
00759
00760
00761
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
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882 Double_t calcK3at0hs(Double_t ra=0.02, Double_t s=2.5){
00883
00884 return -20.19*(ra/s)+0.85;
00885
00886
00887 }
00888
00889 Double_t calcK3(Float_t h=4.0){
00890
00891 Double_t s=2.5;
00892 Double_t ra=0.02;
00893 return -0.245 * (h/s) + calcK3at0hs(ra,s);
00894
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;
00898
00899
00900 const Double_t par = 1.0;
00901 const Double_t h = 3.5;
00902 const Double_t K3 = calcK3(h);
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
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
00919
00920
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
00938 Double_t intensCh[3] = {0.0};
00939 if (maxCh >= 1 && maxCh <= NUM_SPADIC_CHA - 1){
00940
00941 for (Int_t ch = 0; ch < 3; ch++){
00942 for (Int_t bin = minBin; bin < maxBin; bin++) {
00943
00944 if (inPulse[maxCh-1+ch]->GetBinContent(inPulse[maxCh-1+ch]->FindBin(bin)) > 0.0)
00945
00946 intensCh[ch] += inPulse[maxCh-1+ch]->GetBinContent(inPulse[maxCh-1+ch]->FindBin(bin));
00947 }
00948 }
00949
00950 Double_t dxPos = calcSimpleDisplacement( padWidth, intensCh);
00951
00952
00953
00954 Double_t QSum = (intensCh[0] + intensCh[1] + intensCh[2]);
00955
00956
00957 Double_t chargePercent = intensCh[0] / QSum;
00958 prf->Fill(-dxPos-padWidth, chargePercent);
00959 prfProfile->Fill(-dxPos-padWidth ,chargePercent);
00960
00961 chargePercent = intensCh[1] / QSum;
00962 prf->Fill(dxPos,chargePercent);
00963 prfProfile->Fill(dxPos ,chargePercent);
00964
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
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
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)
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
01039
01040 )
01041 return true;
01042 return false;
01043 }
01044
01045 Bool_t minimumAmplitudeThreshold(TH1D* inPulse[NUM_SPADIC_CHA], Int_t maxCh = -1) {
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 Double_t minAmpl[3] = {12,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]){
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
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
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};
01134 Double_t minAmplitude[3] = {30, 16, 20};
01135
01136
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;
01142 Int_t maxCh = -1;
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
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 {
01189 if (lastSigCh != -1){
01190 if(signalChDistance){
01191 signalChDistance->Fill(ch - lastSigCh);
01192 }
01193 }
01194 lastSigCh = ch;
01195 }
01196 }
01197 if(covaMatixValueClusterSize) {
01198 covaList.sort();
01199 Int_t counter = 0;
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
01209
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 }
01218
01219
01220
01221
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
01323 clusterSize->Fill(signal_ch_counter);
01324 }
01325 }
01326 principal->Clear();
01327 return signal_ch_counter;
01328 }
01329 void CalcDeltaSim(TH1D *delta, TH1D *sim) {
01330 delta->SetYTitle("#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
01338 delta->Divide(sim);
01339
01340
01341
01342
01343
01344
01345
01346
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
01360
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391 const Double_t yFitRange = 0.50;
01392
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()))));
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);
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
01413
01414 uncalibrated->Fit(uLandau,"0QRB");
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");
01470
01471
01472
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
01477 TFile *sim = new TFile(simfile.Data(),"READ");
01478
01479 TH1D* simulated= (TH1D*)sim->Get("hPi");
01480
01481
01482
01483
01484
01485
01486
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()))));
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");
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");
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
01521
01522
01523
01524
01525
01526
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;
01537 } else if (AnodeV == 1775){
01538 sigma_adc = 175;
01539 MPV_adc = 629.78;
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.;
01550 } else if (momentum == 8){
01551 sigma_adc = 190;
01552 MPV_adc = 650.00;
01553 }
01554 }
01555 if (susid == 1){
01556 if (momentum == 2){
01557 sigma_adc = 140;
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;
01565 MPV_adc = 604.33;
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;
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
01608
01609
01610
01611
01612 }
01613 else if (suid == 10){
01614
01615
01616
01617 }
01618 else if (suid == 18){
01619
01620
01621
01622 }
01623
01624
01625
01626
01627
01628
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;
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
01649
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;
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
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
01718
01719
01720
01721
01722
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
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
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
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
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
01831
01832
01833
01834 void spadic_noise_Analysis(TString filename="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);
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
01870
01871
01872
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]);
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
01894
01895 Int_t nbins(200),lbin(0),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;
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
02266
02267
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
02273
02274
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)");
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
02371
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);
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
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;
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
02441
02442
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
02457
02458
02459
02460
02461
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
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
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));
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
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 }
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(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
02759 TPad *pad1 = new TPad("pad1","top pad",0,0.35,0.5,1);
02760
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
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
02788 sigma_kev/sigma_adc*1000,MPV_kev-sigma_kev/sigma_adc*MPV_adc
02789 );
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
02797
02798
02799
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
02808
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)baselineNoiseSpectrum->Integral());
02824 probabilityUnderflow->Scale(1./(Double_t)baselineNoiseSpectrum->Integral());
02825 }
02826 probabilityUnderflow->DrawCopy("same");
02827 probabilityOverflow->DrawCopy("same");
02828
02829
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
02837
02838
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
02851
02852 TH1D *deltaSim = (TH1D*)baselineNoiseSpectrum->Clone("deltaSim");
02853 CalcDeltaSim(deltaSim, simSpectrum);
02854 deltaSim->SetLineColor(4);
02855 deltaSim->SetLineStyle(1);
02856 deltaSim->SetMarkerStyle(20);
02857 deltaSim->SetMarkerColor(4);
02858
02859
02860
02861 TH1D *deltaSim2 = (TH1D*)baselineNoiseSpectrumWoOWoU->Clone("deltaSim2");
02862 CalcDeltaSim(deltaSim2, simSpectrum);
02863 deltaSim2->SetLineColor(6);
02864 deltaSim2->SetLineStyle(1);
02865 deltaSim2->SetMarkerStyle(20);
02866 deltaSim2->SetMarkerColor(6);
02867
02868
02869
02870 if (!simple) {
02871 TH1D *deltaSimMS = (TH1D*)preCompSpectrum->Clone("deltaSimMS");
02872 CalcDeltaSim(deltaSimMS, simSpectrum);
02873 deltaSimMS->SetLineColor(2);
02874 deltaSimMS->SetLineStyle(1);
02875 deltaSimMS->SetMarkerStyle(20);
02876 deltaSimMS->SetMarkerColor(2);
02877
02878
02879
02880 TH1D *deltaSimMS2 = (TH1D*)preCompBaselineSpectrum->Clone("deltaSimMS2");
02881 CalcDeltaSim(deltaSimMS2, simSpectrum);
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
02907 TFile dEdxFile(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 == "") {
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;
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;
02944 if (radiator == "D")
02945 attenuation = 0.45;
02946 if (radiator == "E")
02947 attenuation = 0.60;
02948 if (radiator == "F")
02949 attenuation = 0.65;
02950 if (radiator == "FFM0.5x100")
02951 attenuation = 0.75;
02952 if (radiator == "FFM0.5x200")
02953 attenuation = 0.75;
02954 if (radiator == "FFM0.5x350")
02955 attenuation = 0.75;
02956 if (radiator == "FFM0.7x100")
02957 attenuation = 0.75;
02958 if (radiator == "FFM0.7x200")
02959 attenuation = 0.75;
02960 if (radiator == "FFM0.7x350")
02961 attenuation = 0.75;
02962 if (radiator == "FFM1.2x100")
02963 attenuation = 0.75;
02964 if (radiator == "FFM1.2x200")
02965 attenuation = 0.75;
02966 if (radiator == "FFM1.2x350")
02967 attenuation = 0.75;
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;
02977 }
02978 if (radiator == "G10"){
02979 irradiator = "C";
02980 attenuation = 0.35;
02981 }
02982 if (radiator == "G20"){
02983 irradiator = "C";
02984 attenuation = 0.50;
02985 }
02986 if (radiator == "G30"){
02987 irradiator = "C";
02988 attenuation = 0.78;
02989 }
02990 if (radiator == "H25"){
02991 irradiator = "C";
02992 attenuation = 0.35;
02993 }
02994 if (radiator == "H"){
02995 irradiator = "C";
02996 attenuation = 0.78;
02997 }
02998 if (radiator == "H++"){
02999 irradiator = "C";
03000 attenuation = 0.60;
03001 }
03002 if (radiator == "Ip"){
03003 irradiator = "C";
03004 attenuation = 0.60;
03005 }
03006 if (radiator == "Iu"){
03007 irradiator = "C";
03008 attenuation = 0.55;
03009 }
03010 if (radiator == "J"){
03011 irradiator = "C";
03012 attenuation = 0.20;
03013 }
03014 if (radiator == "L"){
03015 irradiator = "C";
03016 attenuation = 0.60;
03017 }
03018 if (radiator == "M"){
03019 irradiator = "C";
03020 attenuation = 0.50;
03021 }
03022 if (radiator == "N25"){
03023 irradiator = "C";
03024 attenuation = 0.42;
03025 }
03026 if (radiator == "O5x5"){
03027 irradiator = "C";
03028 attenuation = 0.39;
03029 }
03030 if (radiator == "HF110"){
03031 irradiator = "C";
03032 attenuation = 0.65;
03033 }
03034 if (radiator == "3xEF700"){
03035 irradiator = "C";
03036 attenuation = 0.40;
03037 }
03038 spectrumAbs = (TH1D*)TR_simFile.Get("Absorption_("+radiator+")");
03039 spectrum = (TH1D*)TR_simFile.Get("Production_("+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
03077
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(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
03099
03100
03101
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
03110
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)baselineNoiseSpectrumElectron->Integral());
03124 probabilityUnderflowE->Scale(1./(Double_t)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
03147
03148 TH1D *deltaSimE = (TH1D*)baselineNoiseSpectrumElectron->Clone("deltaSimE");
03149 CalcDeltaSim(deltaSimE, simSpectrumE);
03150 deltaSimE->SetLineColor(4);
03151 deltaSimE->SetLineStyle(1);
03152 deltaSimE->SetMarkerStyle(20);
03153 deltaSimE->SetMarkerColor(4);
03154
03155
03156
03157 TH1D *deltaSimE2 = (TH1D*)baselineNoiseSpectrumWoOWoUElectron->Clone("deltaSimE2");
03158 CalcDeltaSim(deltaSimE2, simSpectrumE);
03159 deltaSimE2->SetLineColor(6);
03160 deltaSimE2->SetLineStyle(1);
03161 deltaSimE2->SetMarkerStyle(20);
03162 deltaSimE2->SetMarkerColor(6);
03163
03164 if (!simple) {
03165
03166
03167 TH1D *deltaSimMSE = (TH1D*)preCompSpectrumElectron->Clone("deltaSimMSE");
03168 CalcDeltaSim(deltaSimMSE, simSpectrumE);
03169 deltaSimMSE->SetLineColor(2);
03170 deltaSimMSE->SetLineStyle(1);
03171 deltaSimMSE->SetMarkerStyle(20);
03172 deltaSimMSE->SetMarkerColor(2);
03173
03174
03175
03176 TH1D *deltaSimMSE2 = (TH1D*)preCompBaselineSpectrumElectron->Clone("deltaSimMSE2");
03177 CalcDeltaSim(deltaSimMSE2, simSpectrumE);
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
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));
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
03252
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
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
03294 cEfficiency->cd();
03295
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
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
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
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
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
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
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
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
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
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
03570
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 }