5 #include <TClonesArray.h>
6 #include <TObjString.h>
10 #include "AliHighPtDeDxData.h"
11 #include "AliHighPtDeDxMc.h"
12 #include "AliHighPtDeDxCalib.h"
14 #include <AliXRDPROOFtoolkit.h>
16 #include "DebugClasses.C"
18 #include "my_functions.C"
28 In this version the start step for calibrations is 2. We do not correct for
29 the Ncl dependence as this is still uncertain of this should be done or not.
31 It is good to make a small test first because the MIP peak might have to be
32 adjusted. With pass0 the default 40-60 window should be good, but
37 Use AliRoot because of AliXRDPROOFtoolkit:
38 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC")
39 gSystem->AddIncludePath("-I../lib")
40 gSystem->AddIncludePath("-I../grid")
41 gSystem->AddIncludePath("-I../macros")
42 gROOT->SetMacroPath(".:../macros:../grid:../lib/")
43 .L libMyDeDxAnalysis.so
49 // Step 1: create calibrations
51 CreateCalib("7tev_b.dat", kFALSE, "7tev_b.root", 0, 2)
53 // This function is not used anymore
54 // CreateCalibV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0)
57 // Step 2 and 3 are found in calibrate_de_dx.C
60 // Step 5: create data
61 CreateOutput("7tev_b.dat", kFALSE, "7tev_b.root", 0, "fitparameters/7tev_b.root")
62 CreateOutputV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0, "fitparameters/7tev_b.root")
69 CreateCalib("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, 2)
71 CreateOutput("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, "fitparameters/7tev_b_test.root")
72 CreateOutputV0("7tev_b_test_v0.dat", kFALSE, "7tev_b_test_v0_loose.root", 0, "fitparameters/7tev_b_test.root")
77 const Int_t nPtBins = 68;
78 //Double_t xBins[nPtBins+1] = {0., 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1 , 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0};
79 Double_t xBins[nPtBins+1] = {0. , 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45,
80 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95,
81 1.0, 1.1 , 1.2, 1.3 , 1.4, 1.5 , 1.6, 1.7 , 1.8, 1.9 ,
82 2.0, 2.2 , 2.4, 2.6 , 2.8, 3.0 , 3.2, 3.4 , 3.6, 3.8 ,
83 4.0, 4.5 , 5.0, 5.5 , 6.0, 6.5 , 7.0, 8.0 , 9.0, 10.0,
84 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0,
85 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0 };
87 TFile* dataOutFile = 0;
96 void CreateOutput(const Char_t* dataFileName, Bool_t isMc,
97 const Char_t* outfilename, Int_t maxEvents,
98 const Char_t* fitFileName=0);
99 void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run,
100 Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE,
101 Int_t etaLow=-8, Int_t etaHigh=8);
102 void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc,
103 const Char_t* outFileName, Int_t maxEvents,
104 const Char_t* fitFileName=0);
105 void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run,
106 Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE,
107 Int_t etaLow=-8, Int_t etaHigh=8);
109 void CreateCalib(const Char_t* dataFileName, Bool_t isMc,
110 const Char_t* outfilename, Int_t maxEvents, Int_t startStep);
111 void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run,
112 Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE,
113 Int_t etaLow=-8, Int_t etaHigh=8);
114 void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc,
115 const Char_t* outFileName, Int_t maxEvents);
116 void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut,
117 Int_t run, Bool_t analyzeMc);
118 Int_t CalculateFilter(DeDxTrack* track);
120 //____________________________________________________________________________
121 void CreateOutput(const Char_t* dataFileName, Bool_t isMc,
122 const Char_t* outFileName, Int_t maxEvents,
123 const Char_t* fitFileName)
126 TF1* fDeDxVsEtaNeg = 0;
127 TF1* fDeDxVsEtaPos = 0;
132 TFile* fitFile = FindFileFresh(fitFileName);
135 DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo");
139 if(!fitPar->calibFileName.IsNull()) {
141 cout << "Setting calibFile: " << fitPar->calibFileName << endl;
142 TFile* calibFile = FindFileFresh(fitPar->calibFileName);
145 AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0);
147 fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg();
148 fDeDxVsEtaPos = calib->GetDeDxVsEtaPos();
149 fDeDxVsNcl = calib->GetDeDxVsNcl();
152 fixMIP = fitPar->MIP;
153 fixPlateau = fitPar->plateau;
155 Double_t dedxPar[6] = {0, 0, 0, 0, 0, 0};
156 Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0};
158 dedxPar[0] = fitPar->optionDeDx;
159 for(Int_t i = 0; i < fitPar->nDeDxPar; i++) {
160 dedxPar[i+1] = fitPar->parDeDx[i];
163 sigmaPar[0] = fitPar->optionSigma;
164 for(Int_t i = 0; i < fitPar->nSigmaPar; i++) {
165 sigmaPar[i+1] = fitPar->parSigma[i];
168 piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
169 piFunc->SetParameters(dedxPar);
171 kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
172 kFunc->SetParameters(dedxPar);
173 kFunc->SetParameter(0, kFunc->GetParameter(0)+10);
175 pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
176 pFunc->SetParameters(dedxPar);
177 pFunc->SetParameter(0, pFunc->GetParameter(0)+20);
179 eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
180 eFunc->SetParameters(dedxPar);
181 eFunc->SetParameter(0, eFunc->GetParameter(0)+30);
183 sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1);
184 sigmaFunc->SetParameters(sigmaPar);
188 dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE");
192 mcOutFile = new TFile(Form("mc/%s", outFileName), "RECREATE");
195 // Create output objects
197 TList* runList = new TList();
198 runList->SetOwner(kTRUE);
199 runList->SetBit(TObject::kSingleKey);
201 TList* analysisList = new TList();
202 analysisList->SetOwner(kFALSE);
204 // TList filter, phi cut, run, isMc
205 AddObject(analysisList, 1, kTRUE, 0, isMc);
207 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, -6);
208 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -6, -4);
209 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -4, -2);
210 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -2, 0);
211 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 2);
212 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 2, 4);
213 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 4, 6);
214 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 6, 8);
216 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0);
217 AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8);
218 AddObject(analysisList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4);
219 AddObject(analysisList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8);
220 AddObject(analysisList, 1, kFALSE, 0, isMc);
221 AddObject(analysisList, 2, kTRUE, 0, isMc);
222 AddObject(analysisList, 2, kFALSE, 0, isMc);
226 if(strstr(dataFileName, ".dat")) {
228 AliXRDPROOFtoolkit tool;
229 TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
233 TFile* dataFile = FindFileFresh(dataFileName);
237 Tree = (TTree*)dataFile->Get("tree");
240 TClonesArray* trackArray = 0;
241 TClonesArray* mcTrackArray = 0;
242 DeDxEvent* event = 0;
243 Tree->SetBranchAddress("event", &event);
244 Tree->SetBranchAddress("trackGlobalPar" , &trackArray);
246 Tree->SetBranchAddress("trackMC" , &mcTrackArray);
248 Int_t nEvents = Tree->GetEntries();
249 cout << "Number of events: " << nEvents << endl;
251 if(maxEvents>0 && maxEvents < nEvents) {
254 cout << "N events was reduced to: " << maxEvents << endl;
257 Int_t currentRun = 0;
259 TIter* iter = new TIter(analysisList);
261 for(Int_t n = 0; n < nEvents; n++) {
266 cout << "Event: " << n+1 << "/" << nEvents << endl;
269 if(event->run == -1) {
274 if(event->run != currentRun) {
276 cout << "New run: " << event->run << endl;
277 currentRun = event->run;
279 // Check if run objects exist
280 TObjString* runString = new TObjString(Form("%d", currentRun));
281 if(!runList->FindObject(runString->GetString().Data())) {
283 runList->Add(runString);
285 // TList filter, phi cut, run, isMc
286 AddObject(analysisList, 1, kTRUE, currentRun, isMc);
287 AddObject(analysisList, 1, kFALSE, currentRun, isMc);
288 // AddObject(analysisList, 2, kTRUE, currentRun, isMc);
289 // AddObject(analysisList, 2, kFALSE, currentRun, isMc);
291 // Is this really necessary?
293 iter = new TIter(analysisList);
301 // iterate over analysis list
303 AliHighPtDeDxBase* analysis = 0;
304 while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
306 // First we set the global properties
307 // If I want to use a narrower vtx I have here to redefine my
308 // vtxstatus according to the new vtx range
309 analysis->SetEventRun(event->run);
310 analysis->SetEventMag(event->mag);
311 analysis->SetEventVtxStatus(event->vtxstatus);
312 analysis->SetEventTrigger(event->trig);
314 Int_t vtxstatusmc = 0;
315 if(TMath::Abs(event->zvtxMC) < 10.0)
317 analysis->SetEventVtxStatusMc(vtxstatusmc);
319 if(!analysis->EventAccepted()) // only checks for runs currently
322 // There is a small prolem in making this really nice, because we need
323 // also event info from events that are rejected by the vtx cut to
324 // correct our data. That is why we for bnow only have the run cut there
326 analysis->FillEventInfo();
328 // First we do the special MC part
331 AliHighPtDeDxMc* mcAnalysis = dynamic_cast<AliHighPtDeDxMc*> (analysis);
335 // loop over mc tracks
336 const Int_t nMcTracks = mcTrackArray->GetEntries();
338 for(Int_t i = 0; i < nMcTracks; i++) {
340 DeDxTrackMC* trackMC = (DeDxTrackMC*)mcTrackArray->At(i);
342 mcAnalysis->SetTrackPtMc(trackMC->ptMC);
343 mcAnalysis->SetTrackEtaMc(trackMC->etaMC);
344 mcAnalysis->SetTrackChargeMc(trackMC->qMC);
345 mcAnalysis->SetTrackPidMc(trackMC->pidMC);
346 if(mcAnalysis->TrackAcceptedMc()) {
347 // if(trackMC->ptMC<2.0)
348 // mcAnalysis->FillTrackInfoMc(100.0);
350 mcAnalysis->FillTrackInfoMc(1.0);
357 // The trig==1 is always true for real data, but not for MC data
361 if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
364 const Int_t nTracks = trackArray->GetEntries();
366 for(Int_t i = 0; i < nTracks; i++) {
368 DeDxTrack* track = (DeDxTrack*)trackArray->At(i);
370 Double_t eta = track->eta;
371 Double_t dedx = track->dedx;
372 Int_t ncl = track->ncl;
375 dedx *= 50.0 / fDeDxVsNcl->Eval(ncl);
378 dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta);
380 dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta);
383 analysis->SetTrackCharge(track->q);
384 analysis->SetTrackP(track->p);
385 analysis->SetTrackPt(track->pt);
387 Int_t filter = CalculateFilter(track);
388 analysis->SetTrackFilter(filter);
389 analysis->SetTrackPhi(track->phi);
390 analysis->SetTrackDeDx(dedx);
391 analysis->SetTrackNcl(ncl);
392 analysis->SetTrackEta(eta);
393 analysis->SetTrackPidMc(track->pid);
395 if(analysis->TrackAccepted()) {
397 // analysis->FillTrackInfo(100.0);
399 analysis->FillTrackInfo(1.0);
407 TList* runListMc = (TList*)runList->Clone();
411 // I need to somehow specify autowrite, but I am not sure how, so for now
412 // this a bit stupid workaround...
414 AliHighPtDeDxBase* analysis = 0;
415 while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
417 AliHighPtDeDxMc* mcAnalysis = dynamic_cast<AliHighPtDeDxMc*> (analysis);
428 runList->Write("runList");
430 AliHighPtDeDxBase* analysis = 0;
431 while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
433 AliHighPtDeDxData* dataAnalysis = dynamic_cast<AliHighPtDeDxData*> (analysis);
435 dataAnalysis->Write();
438 dataOutFile->Close();
442 cout << "Nbad (runno == -1) : " << nBad << endl;
445 //___________________________________________________________________________
446 void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run,
447 Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs,
448 Int_t etaLow, Int_t etaHigh)
450 if(etaCut && etaAbs) {
452 Fatal("AddObject", "You cannot have a cut on both abs and signed eta");
455 TString objectName("filter");
456 objectName += filter;
458 objectName += "phicut";
465 objectName += etaLow;
466 objectName += etaHigh;
469 objectName += "etaabs";
470 objectName += etaLow;
471 objectName += etaHigh;
475 AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data");
477 data->SetUseRunCut(kTRUE);
482 data->SetIsMc(analyzeMc);
483 data->SetUseFilterCut(kTRUE);
484 data->SetFilter(filter);
485 data->SetUsePhiCut(phiCut);
487 data->SetPhiCutLow(data->GetStandardPhiCutLow());
488 data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
491 data->SetUseEtaCut(kTRUE);
493 data->SetUseEtaCutAbs(kTRUE);
494 if(etaCut || etaAbs) {
495 data->SetEtaLow(Double_t(etaLow)/10.0);
496 data->SetEtaHigh(Double_t(etaHigh)/10.0);
499 data->Init(nPtBins, xBins);
502 if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) {
504 data->SetPionDeDxFunction(piFunc);
505 data->SetKaonDeDxFunction(kFunc);
506 data->SetProtonDeDxFunction(pFunc);
507 data->SetElectronDeDxFunction(eFunc);
508 data->SetSigmaDeDxFunction(sigmaFunc);
512 // create the correction class also
515 AliHighPtDeDxMc* mc = new AliHighPtDeDxMc(objectName.Data(), "Analysis mc");
517 mc->SetUseRunCut(kTRUE);
522 mc->SetUseFilterCut(kTRUE);
523 mc->SetFilter(filter);
524 mc->SetUsePhiCut(phiCut);
526 mc->SetPhiCutLow(mc->GetStandardPhiCutLow());
527 mc->SetPhiCutHigh(mc->GetStandardPhiCutHigh());
529 mc->Init(nPtBins, xBins);
534 //____________________________________________________________________________
535 void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc,
536 const Char_t* outFileName, Int_t maxEvents,
537 const Char_t* fitFileName)
540 TF1* fDeDxVsEtaNeg = 0;
541 TF1* fDeDxVsEtaPos = 0;
546 TFile* fitFile = FindFileFresh(fitFileName);
549 DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo");
553 if(!fitPar->calibFileName.IsNull()) {
555 cout << "Setting calibFile: " << fitPar->calibFileName << endl;
556 TFile* calibFile = FindFileFresh(fitPar->calibFileName);
559 AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0);
561 fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg();
562 fDeDxVsEtaPos = calib->GetDeDxVsEtaPos();
563 fDeDxVsNcl = calib->GetDeDxVsNcl();
566 fixMIP = fitPar->MIP;
567 fixPlateau = fitPar->plateau;
569 Double_t dedxPar[6] = {0, 0, 0, 0, 0, 0};
570 Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0};
572 dedxPar[0] = fitPar->optionDeDx;
573 for(Int_t i = 0; i < fitPar->nDeDxPar; i++) {
574 dedxPar[i+1] = fitPar->parDeDx[i];
577 sigmaPar[0] = fitPar->optionSigma;
578 for(Int_t i = 0; i < fitPar->nSigmaPar; i++) {
579 sigmaPar[i+1] = fitPar->parSigma[i];
582 piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
583 piFunc->SetParameters(dedxPar);
585 kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
586 kFunc->SetParameters(dedxPar);
587 kFunc->SetParameter(0, kFunc->GetParameter(0)+10);
589 pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
590 pFunc->SetParameters(dedxPar);
591 pFunc->SetParameter(0, pFunc->GetParameter(0)+20);
593 eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
594 eFunc->SetParameters(dedxPar);
595 eFunc->SetParameter(0, eFunc->GetParameter(0)+30);
597 sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1);
598 sigmaFunc->SetParameters(sigmaPar);
602 dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE");
604 // Create output objects
606 TList* runList = new TList();
607 runList->SetOwner(kTRUE);
608 runList->SetBit(TObject::kSingleKey);
610 TList* analysisList = new TList();
611 analysisList->SetOwner(kFALSE);
613 // TList v0type, phi cut, run, isMc
614 AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc);
615 AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0);
616 AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8);
617 AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4);
618 AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8);
619 AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc);
620 AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0);
621 AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8);
622 AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4);
623 AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8);
627 if(strstr(dataFileName, ".dat")) {
629 AliXRDPROOFtoolkit tool;
630 TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
634 TFile* dataFile = FindFileFresh(dataFileName);
638 Tree = (TTree*)dataFile->Get("tree");
641 TClonesArray* v0Array = 0;
642 DeDxEvent* event = 0;
643 Tree->SetBranchAddress("event", &event);
644 Tree->SetBranchAddress("v0GlobalPar" , &v0Array);
646 Int_t nEvents = Tree->GetEntries();
647 cout << "Number of events: " << nEvents << endl;
649 if(maxEvents>0 && maxEvents < nEvents) {
652 cout << "N events was reduced to: " << maxEvents << endl;
655 Int_t currentRun = 0;
657 TIter* iter = new TIter(analysisList);
659 for(Int_t n = 0; n < nEvents; n++) {
664 cout << "Event: " << n+1 << "/" << nEvents << endl;
666 if(event->run == -1) {
670 // if(event->run == 126437)
673 if(event->run != currentRun) {
675 cout << "New run: " << event->run << endl;
676 currentRun = event->run;
678 // Check if run objects exist
679 TObjString* runString = new TObjString(Form("%d", currentRun));
680 if(!runList->FindObject(runString->GetString().Data())) {
682 runList->Add(runString);
684 // TList v0type, phi cut, run, isMc
685 AddObjectV0(analysisList, "lambda", kTRUE, currentRun, isMc);
686 AddObjectV0(analysisList, "kaon", kTRUE, currentRun, isMc);
688 // Is this really necessary?
690 iter = new TIter(analysisList);
698 // iterate over analysis list
700 AliHighPtDeDxBase* analysis = 0;
701 while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
703 // First we set the global properties
704 // If I want to use a narrower vtx I have here to redefine my
705 // vtxstatus according to the new vtx range
706 analysis->SetEventRun(event->run);
707 analysis->SetEventMag(event->mag);
708 analysis->SetEventVtxStatus(event->vtxstatus);
709 analysis->SetEventTrigger(event->trig);
711 Int_t vtxstatusmc = 0;
712 if(TMath::Abs(event->zvtxMC) < 10.0)
714 analysis->SetEventVtxStatusMc(vtxstatusmc);
716 if(!analysis->EventAccepted()) // only checks for runs currently
718 // There is a small prolem in making this really nice, because we need
719 // also event info from events that are rejected by the vtx cut to
720 // correct our data. That is why we for bnow only have the run cut there
722 analysis->FillEventInfo();
725 // The trig==1 is always true for real data, but not for MC data
729 if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
732 const Int_t nV0s = v0Array->GetEntries();
734 for(Int_t i = 0; i < nV0s; i++) {
736 DeDxV0* v0 = (DeDxV0*)v0Array->At(i);
738 // if(v0->ptrack.filter != 2)
747 // if(v0->decayr < 5.0)
750 // if(v0->decayr > 40.0)
753 const Double_t dmassK = TMath::Abs(v0->dmassK0);
754 const Double_t dmassL = TMath::Abs(v0->dmassL);
755 const Double_t dmassAL = TMath::Abs(v0->dmassAL);
757 Bool_t fillPos = kFALSE;
758 Bool_t fillNeg = kFALSE;
761 if(strstr(analysis->GetName(), "lambda")) {
766 if(dmassL<0.01&&dmassL>0.01)
769 if(dmassAL<0.01&&dmassL)
773 if(dmassL<0.01 || dmassAL<0.01)
782 for(Int_t j = 0; j < 2; j++) {
784 DeDxTrack* track = 0;
789 track = &(v0->ntrack);
795 track = &(v0->ptrack);
800 Double_t eta = track->eta;
801 Double_t dedx = track->dedx;
802 Int_t ncl = track->ncl;
805 dedx *= 50.0 / fDeDxVsNcl->Eval(ncl);
808 dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta);
810 dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta);
813 analysis->SetTrackCharge(track->q);
814 analysis->SetTrackP(track->p);
815 analysis->SetTrackPt(track->pt);
817 analysis->SetTrackFilter(track->filter);
818 analysis->SetTrackPhi(track->phi);
819 analysis->SetTrackDeDx(dedx);
820 analysis->SetTrackNcl(ncl);
821 analysis->SetTrackBeta(track->beta);
822 analysis->SetTrackPidMc(track->pid);
823 analysis->SetTrackEta(eta);
825 if(analysis->TrackAccepted()) {
826 analysis->FillTrackInfo(1.0);
834 runList->Write("runList");
836 AliHighPtDeDxBase* analysis = 0;
837 while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
839 AliHighPtDeDxData* dataAnalysis = dynamic_cast<AliHighPtDeDxData*> (analysis);
841 dataAnalysis->Write();
844 dataOutFile->Close();
848 cout << "Nbad (runno == -1) : " << nBad << endl;
852 //___________________________________________________________________________
853 void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run,
854 Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs,
855 Int_t etaLow, Int_t etaHigh)
857 if(etaCut && etaAbs) {
859 Fatal("AddObject", "You cannot have a cut on both abs and signed eta");
863 TString objectName(baseName);
865 objectName += "phicut";
872 objectName += etaLow;
873 objectName += etaHigh;
876 objectName += "etaabs";
877 objectName += etaLow;
878 objectName += etaHigh;
881 AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data");
883 data->SetUseRunCut(kTRUE);
888 data->SetIsMc(analyzeMc);
889 data->SetUseFilterCut(kFALSE);
891 data->SetUsePhiCut(phiCut);
893 data->SetPhiCutLow(data->GetStandardPhiCutLow());
894 data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
897 data->SetUseEtaCut(kTRUE);
899 data->SetUseEtaCutAbs(kTRUE);
900 if(etaCut || etaAbs) {
901 data->SetEtaLow(Double_t(etaLow)/10.0);
902 data->SetEtaHigh(Double_t(etaHigh)/10.0);
905 data->Init(nPtBins, xBins);
908 if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) {
910 data->SetPionDeDxFunction(piFunc);
911 data->SetKaonDeDxFunction(kFunc);
912 data->SetProtonDeDxFunction(pFunc);
913 data->SetElectronDeDxFunction(eFunc);
914 data->SetSigmaDeDxFunction(sigmaFunc);
918 //____________________________________________________________________________
919 void CreateCalib(const Char_t* dataFileName, Bool_t isMc,
920 const Char_t* outFileName, Int_t maxEvents, Int_t startStep)
922 if(startStep < 1 || startStep > 3) {
924 cout << "Start step should be 1,2, or 3 - 2 is recommended" << endl;
929 for(Int_t i = 0; i < 10; i++)
930 cout << "Step 1 calibration is depreceated! - 2 is recommended" << endl;
935 CreateDir("calib_eta");
936 dataOutFile = new TFile(Form("calib_eta/%s", outFileName), "RECREATE");
939 CreateDir("no_calib_eta");
940 dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE");
943 // Create output objects
945 TList* runList = new TList();
946 runList->SetOwner(kTRUE);
947 runList->SetBit(TObject::kSingleKey);
949 TList* calibList = new TList();
950 calibList->SetOwner(kFALSE);
952 // TList filter, phi cut, run, isMc
953 AddCalibObject(calibList, 1, kTRUE, 0, isMc);
954 AddCalibObject(calibList, 2, kTRUE, 0, isMc);
955 AddCalibObject(calibList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0);
956 AddCalibObject(calibList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8);
957 AddCalibObject(calibList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4);
958 AddCalibObject(calibList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8);
959 // AddCalibObject(calibList, 1, kFALSE, 0, isMc);
960 // AddCalibObject(calibList, 2, kTRUE, 0, isMc);
961 // AddCalibObject(calibList, 2, kFALSE, 0, isMc);
965 if(strstr(dataFileName, ".dat")) {
967 AliXRDPROOFtoolkit tool;
968 TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
972 TFile* dataFile = FindFileFresh(dataFileName);
976 Tree = (TTree*)dataFile->Get("tree");
979 TClonesArray* trackArray = 0;
980 TClonesArray* mcTrackArray = 0;
981 DeDxEvent* event = 0;
982 Tree->SetBranchAddress("event", &event);
983 Tree->SetBranchAddress("trackGlobalPar" , &trackArray);
985 Tree->SetBranchAddress("trackMC" , &mcTrackArray);
987 Int_t nEvents = Tree->GetEntries();
988 cout << "Number of events: " << nEvents << endl;
990 if(maxEvents>0 && maxEvents < nEvents) {
993 cout << "N events was reduced to: " << maxEvents << endl;
996 Int_t currentRun = 0;
998 TIter* iter = new TIter(calibList);
999 AliHighPtDeDxCalib* calib = 0;
1001 for(Int_t step = startStep; step <= 3; step++) {
1004 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1006 calib->SetStep(step);
1007 // Here you can set the MIP interval
1009 if(step==startStep) {
1010 calib->SetDeDxMIPMin(25);
1011 calib->SetDeDxMIPMax(55);
1013 calib->SetDeDxMIPMin(40);
1014 calib->SetDeDxMIPMax(60);
1016 calib->Init(step, nPtBins, xBins);
1019 for(Int_t n = 0; n < nEvents; n++) {
1023 if((n+1)%1000000==0)
1024 cout << "Event: " << n+1 << "/" << nEvents << endl;
1026 if(event->run == -1) {
1030 // if(event->run == 126437)
1033 if(event->run != currentRun) {
1035 cout << "New run: " << event->run << endl;
1036 currentRun = event->run;
1038 // Check if run objects exist
1039 TObjString* runString = new TObjString(Form("%d", currentRun));
1040 if(!runList->FindObject(runString->GetString().Data())) {
1042 runList->Add(runString);
1044 // TList filter, phi cut, run, isMc
1045 AddCalibObject(calibList, 1, kTRUE, currentRun, isMc);
1046 // AddCalibObject(calibList, 1, kFALSE, currentRun, isMc);
1047 // AddCalibObject(calibList, 2, kTRUE, currentRun, isMc);
1048 // AddCalibObject(calibList, 2, kFALSE, currentRun, isMc);
1050 // Is this really necessary?
1052 iter = new TIter(calibList);
1055 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1057 calib->SetStep(step);
1058 if(step==startStep) {
1059 calib->SetDeDxMIPMin(25);
1060 calib->SetDeDxMIPMax(55);
1062 calib->SetDeDxMIPMin(40);
1063 calib->SetDeDxMIPMax(60);
1065 calib->Init(step, nPtBins, xBins);
1074 // iterate over calib list
1076 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1078 // First we set the global properties
1079 // If I want to use a narrower vtx I have here to redefine my
1080 // vtxstatus according to the new vtx range
1081 calib->SetEventRun(event->run);
1082 calib->SetEventMag(event->mag);
1083 calib->SetEventVtxStatus(event->vtxstatus);
1084 calib->SetEventTrigger(event->trig);
1086 if(!calib->EventAccepted()) // only checks for runs currently
1089 calib->FillEventInfo();
1091 // The trig==1 is always true for real data, but not for MC data
1095 if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
1098 const Int_t nTracks = trackArray->GetEntries();
1100 for(Int_t i = 0; i < nTracks; i++) {
1102 DeDxTrack* track = (DeDxTrack*)trackArray->At(i);
1104 calib->SetTrackCharge(track->q);
1105 calib->SetTrackP(track->p);
1106 calib->SetTrackPt(track->pt);
1107 Int_t filter = CalculateFilter(track);
1108 calib->SetTrackFilter(filter);
1109 calib->SetTrackPhi(track->phi);
1110 calib->SetTrackDeDx(track->dedx);
1111 calib->SetTrackNcl(track->ncl);
1112 calib->SetTrackBeta(track->beta);
1113 calib->SetTrackPidMc(track->pid);
1114 calib->SetTrackEta(track->eta);
1116 if(calib->TrackAccepted()) {
1117 // if(track->pt<2.0)
1118 // calib->FillTrackInfo(100.0);
1120 calib->FillTrackInfo(1.0);
1126 if(step == 2) { // perform eta calibration
1128 cout << "Starting Eta cal" << endl;
1130 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1132 calib->PerformEtaCal();
1134 cout << "Finishing Eta cal" << endl;
1135 } else if(step == 1) { // perform ncl calibration
1138 cout << "Starting Ncl cal" << endl;
1140 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1142 calib->PerformNclCal();
1144 cout << "Finished Ncl cal" << endl;
1148 cout << "Nbad (runno == -1) : " << nBad << endl;
1151 runList->Write("runList");
1153 cout << "Writing calibration data" << endl;
1154 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1156 cout << "Writing calibration object " << calib->GetName() << endl;
1159 cout << "Finsihed writing calibration data" << endl;
1160 dataOutFile->Close();
1165 //___________________________________________________________________________
1166 void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run,
1167 Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs,
1168 Int_t etaLow, Int_t etaHigh)
1170 if(etaCut && etaAbs) {
1172 Fatal("AddCalibObject", "You cannot have a cut on both abs and signed eta");
1175 TString objectName("filter");
1176 objectName += filter;
1178 objectName += "phicut";
1184 objectName += "eta";
1185 objectName += etaLow;
1186 objectName += etaHigh;
1189 objectName += "etaabs";
1190 objectName += etaLow;
1191 objectName += etaHigh;
1194 // dataOutFile->cd();
1195 AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data");
1197 data->SetUseRunCut(kTRUE);
1202 data->SetIsMc(analyzeMc);
1203 data->SetUseFilterCut(kTRUE);
1204 data->SetFilter(filter);
1205 data->SetUsePhiCut(phiCut);
1207 data->SetPhiCutLow(data->GetStandardPhiCutLow());
1208 data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
1211 data->SetUseEtaCut(kTRUE);
1213 data->SetUseEtaCutAbs(kTRUE);
1214 if(etaCut || etaAbs) {
1215 data->SetEtaLow(Double_t(etaLow)/10.0);
1216 data->SetEtaHigh(Double_t(etaHigh)/10.0);
1219 data->SetUseRunCut(kTRUE);
1223 data->Init(nPtBins, xBins);
1227 //____________________________________________________________________________
1228 void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc,
1229 const Char_t* outFileName, Int_t maxEvents)
1231 CreateDir("no_calib_eta");
1232 dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE");
1234 // Create output objects
1236 TList* runList = new TList();
1237 runList->SetOwner(kTRUE);
1238 runList->SetBit(TObject::kSingleKey);
1240 TList* calibList = new TList();
1241 calibList->SetOwner(kFALSE);
1243 // TList filter, phi cut, run, isMc
1244 AddCalibObjectV0(calibList, "lambda", kTRUE, 0, isMc);
1245 // AddCalibObject(calibList, 1, kFALSE, 0, isMc);
1246 AddCalibObjectV0(calibList, "kaon", kTRUE, 0, isMc);
1247 // AddCalibObject(calibList, 2, kFALSE, 0, isMc);
1251 if(strstr(dataFileName, ".dat")) {
1253 AliXRDPROOFtoolkit tool;
1254 TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
1258 TFile* dataFile = FindFileFresh(dataFileName);
1262 Tree = (TTree*)dataFile->Get("tree");
1265 TClonesArray* v0Array = 0;
1266 DeDxEvent* event = 0;
1267 Tree->SetBranchAddress("event", &event);
1268 Tree->SetBranchAddress("v0" , &v0Array);
1270 Int_t nEvents = Tree->GetEntries();
1271 cout << "Number of events: " << nEvents << endl;
1273 if(maxEvents>0 && maxEvents < nEvents) {
1275 nEvents = maxEvents;
1276 cout << "N events was reduced to: " << maxEvents << endl;
1279 Int_t currentRun = 0;
1281 TIter* iter = new TIter(calibList);
1282 AliHighPtDeDxCalib* calib = 0;
1285 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1290 for(Int_t n = 0; n < nEvents; n++) {
1294 if((n+1)%1000000==0)
1295 cout << "Event: " << n+1 << "/" << nEvents << endl;
1297 if(event->run == -1) {
1301 // if(event->run == 126437)
1304 if(event->run != currentRun) {
1306 cout << "New run: " << event->run << endl;
1307 currentRun = event->run;
1309 // Check if run objects exist
1310 TObjString* runString = new TObjString(Form("%d", currentRun));
1311 if(!runList->FindObject(runString->GetString().Data())) {
1313 runList->Add(runString);
1315 // TList filter, phi cut, run, isMc
1316 AddCalibObjectV0(calibList, "lambda", kTRUE, currentRun, isMc);
1317 AddCalibObjectV0(calibList, "kaon", kTRUE, currentRun, isMc);
1319 // Is this really necessary?
1321 iter = new TIter(calibList);
1324 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1335 // iterate over calib list
1337 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1339 // First we set the global properties
1340 // If I want to use a narrower vtx I have here to redefine my
1341 // vtxstatus according to the new vtx range
1342 calib->SetEventRun(event->run);
1343 calib->SetEventMag(event->mag);
1344 calib->SetEventVtxStatus(event->vtxstatus);
1345 calib->SetEventTrigger(event->trig);
1347 if(!calib->EventAccepted()) // only checks for runs currently
1350 calib->FillEventInfo();
1352 // The trig==1 is always true for real data, but not for MC data
1356 if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
1359 const Int_t nV0s = v0Array->GetEntries();
1361 for(Int_t i = 0; i < nV0s; i++) {
1363 DeDxV0* v0 = (DeDxV0*)v0Array->At(i);
1365 // if(v0->ptrack.filter != 2)
1371 if(v0->dmassG < 0.1)
1374 // if(v0->decayr < 5.0)
1377 // if(v0->decayr > 40.0)
1380 const Double_t dmassK = TMath::Abs(v0->dmassK0);
1381 const Double_t dmassL = TMath::Abs(v0->dmassL);
1382 const Double_t dmassAL = TMath::Abs(v0->dmassAL);
1384 Bool_t fillPos = kFALSE;
1385 Bool_t fillNeg = kFALSE;
1388 if(strstr(calib->GetName(), "lambda")) {
1400 if(dmassL<0.01 || dmassAL<0.01)
1409 for(Int_t j = 0; j < 2; j++) {
1411 DeDxTrack* track = 0;
1416 track = &(v0->ntrack);
1422 track = &(v0->ptrack);
1427 calib->SetTrackCharge(track->q);
1428 calib->SetTrackP(track->p);
1429 calib->SetTrackPt(track->pt);
1430 // NB! Filter is not used for these tracks!
1431 calib->SetTrackFilter(track->filter);
1432 calib->SetTrackPhi(track->phi);
1433 calib->SetTrackDeDx(track->dedx);
1434 calib->SetTrackNcl(track->ncl);
1435 calib->SetTrackBeta(track->beta);
1436 calib->SetTrackPidMc(track->pid);
1437 calib->SetTrackEta(track->eta);
1439 if(calib->TrackAccepted()) {
1440 calib->FillTrackInfo(1.0);
1447 runList->Write("runList");
1449 while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
1453 dataOutFile->Close();
1457 cout << "Nbad (runno == -1) : " << nBad << endl;
1460 //___________________________________________________________________________
1461 void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut,
1462 Int_t run, Bool_t analyzeMc)
1464 TString objectName(baseName);
1466 objectName += "phicut";
1472 AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data");
1474 data->SetUseRunCut(kTRUE);
1479 data->SetIsMc(analyzeMc);
1480 data->SetUseFilterCut(kFALSE);
1481 data->SetUsePhiCut(phiCut);
1483 data->SetPhiCutLow(data->GetStandardPhiCutLow());
1484 data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
1486 data->Init(nPtBins, xBins);
1490 //___________________________________________________________________________
1491 Int_t CalculateFilter(DeDxTrack* track)
1494 if(track->filterset3)
1496 if(track->filterset2 && !track->filterset3)
1498 if(track->filterset1)