1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15 //------------------------------------------------------------------------------
16 // AlidNdPtCutAnalysis class.
19 // - fills generic cut histograms
20 // - generates cuts (selection criteria)
23 // - generic cut histograms
24 // - control histograms
26 // Author: J.Otwinowski 04/11/2008
27 //------------------------------------------------------------------------------
31 #include "AliHeader.h"
32 #include "AliGenEventHeader.h"
33 #include "AliInputEventHandler.h"
35 #include "AliESDEvent.h"
36 #include "AliMCEvent.h"
37 #include "AliESDtrackCuts.h"
39 #include "AliTracker.h"
41 #include "AlidNdPtEventCuts.h"
42 #include "AlidNdPtAcceptanceCuts.h"
43 #include "AlidNdPtBackgroundCuts.h"
44 #include "AlidNdPtAnalysis.h"
45 #include "AliPhysicsSelection.h"
47 #include "AliPWG0Helper.h"
48 #include "AlidNdPtHelper.h"
49 #include "AlidNdPtCutAnalysis.h"
53 ClassImp(AlidNdPtCutAnalysis)
55 //_____________________________________________________________________________
56 AlidNdPtCutAnalysis::AlidNdPtCutAnalysis(): AlidNdPt(),
64 // default constructor
68 //_____________________________________________________________________________
69 AlidNdPtCutAnalysis::AlidNdPtCutAnalysis(Char_t* name, Char_t* title): AlidNdPt(name,title),
81 //_____________________________________________________________________________
82 AlidNdPtCutAnalysis::~AlidNdPtCutAnalysis() {
84 if(fEventCount) delete fEventCount; fEventCount=0;
85 if(fRecEventHist) delete fRecEventHist; fRecEventHist=0;
86 if(fMCEventHist) delete fMCEventHist; fMCEventHist=0;
87 if(fRecMCEventHist) delete fRecMCEventHist; fRecMCEventHist=0;
88 if(fRecMCTrackHist) delete fRecMCTrackHist; fRecMCTrackHist=0;
90 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
93 //_____________________________________________________________________________
94 void AlidNdPtCutAnalysis::Init(){
99 const Int_t ptNbins = 56;
100 const Double_t ptMin = 0.;
101 const Double_t ptMax = 16.;
102 Double_t binsPt[ptNbins+1] = {0.,0.05,0.1,0.15,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,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0};
105 const Int_t ptNbins = 50;
106 const Double_t ptMin = 1.e-2, ptMax = 50.;
107 Double_t *binsPt = CreateLogAxis(ptNbins,ptMin,ptMax);
110 Int_t binsEventCount[2]={2,2};
111 Double_t minEventCount[2]={0,0};
112 Double_t maxEventCount[2]={2,2};
113 fEventCount = new THnSparseF("fEventCount","trig vs trig+vertex",2,binsEventCount,minEventCount,maxEventCount);
114 fEventCount->GetAxis(0)->SetTitle("trig");
115 fEventCount->GetAxis(1)->SetTitle("trig+vert");
116 fEventCount->Sumw2();
118 //Xv:Yv:Zv:ResZv:Mult
119 Double_t kFact = 1.0;
121 Int_t binsRecEventHist[5]={80,80,100,80,150};
122 Double_t minRecEventHist[5]={-3.*kFact,-3.*kFact,-35.,0.,0.};
123 Double_t maxRecEventHist[5]={3.*kFact,3.*kFact,35.,10.,150.};
124 fRecEventHist = new THnSparseF("fRecEventHist","Xv:Yv:Zv:ResZv:Mult",5,binsRecEventHist,minRecEventHist,maxRecEventHist);
125 fRecEventHist->GetAxis(0)->SetTitle("Xv (cm)");
126 fRecEventHist->GetAxis(1)->SetTitle("Yv (cm)");
127 fRecEventHist->GetAxis(2)->SetTitle("Zv (cm)");
128 fRecEventHist->GetAxis(3)->SetTitle("ResZv (cm)");
129 fRecEventHist->GetAxis(4)->SetTitle("Mult");
130 fRecEventHist->Sumw2();
133 Int_t binsMCEventHist[3]={80,80,100};
134 Double_t minMCEventHist[3]={-0.1,-0.1,-35.};
135 Double_t maxMCEventHist[3]={0.1,0.1,35.};
136 fMCEventHist = new THnSparseF("fMCEventHist","mcXv:mcYv:mcZv",3,binsMCEventHist,minMCEventHist,maxMCEventHist);
137 fMCEventHist->GetAxis(0)->SetTitle("mcXv (cm)");
138 fMCEventHist->GetAxis(1)->SetTitle("mcYv (cm)");
139 fMCEventHist->GetAxis(2)->SetTitle("mcZv (cm)");
140 fMCEventHist->Sumw2();
142 //Xv-mcXv:Yv-mcYv:Zv-mcZv:Mult
143 Int_t binsRecMCEventHist[4]={100,100,100,150};
144 Double_t minRecMCEventHist[4]={-1.0*kFact,-1.0*kFact,-1.0*kFact,0.};
145 Double_t maxRecMCEventHist[4]={1.0*kFact,1.0*kFact,1.0*kFact,150.};
146 fRecMCEventHist = new THnSparseF("fRecMCEventHist","Xv-mcXv:Yv-mcYv:Zv-mcZv:Mult",4,binsRecMCEventHist,minRecMCEventHist,maxRecMCEventHist);
147 fRecMCEventHist->GetAxis(0)->SetTitle("Xv-mcXv (cm)");
148 fRecMCEventHist->GetAxis(1)->SetTitle("Yv-mcYv (cm)");
149 fRecMCEventHist->GetAxis(2)->SetTitle("Zv-mcZv (cm)");
150 fRecMCEventHist->GetAxis(3)->SetTitle("Mult");
151 fRecMCEventHist->Sumw2();
154 // THnSparse track histograms
157 //nCrossRows:chi2PerClust:nCrossRows/nFindableClust:fracSharedClust:DCAy:DCAz:eta:phi:pt:hasStrangeMother:isFromMaterial:isPrim:charge
158 Int_t binsRecMCTrackHist[13]= { 160, 10, 20, 20, 50, 50, 20, 90, ptNbins, 2, 2, 2, 3 };
159 Double_t minRecMCTrackHist[13]={ 0., 0., 0., 0., -0.5,-0.5,-1.0, 0., ptMin, 0., 0., 0.,-1. };
160 Double_t maxRecMCTrackHist[13]={ 160., 10., 1., 1., 0.5, 0.5, 1.0, 2.*TMath::Pi(), ptMax, 2., 2., 2., 2. };
162 fRecMCTrackHist = new THnSparseF("fRecMCTrackHist","nCrossRows:chi2PerClust:nCrossRows/nFindableClust:fracSharedClust:DCAy:DCAz:eta:phi:pt:hasStrangeMother:isFromMaterial:isPrim:charge",13,binsRecMCTrackHist,minRecMCTrackHist,maxRecMCTrackHist);
163 fRecMCTrackHist->SetBinEdges(8,binsPt);
164 fRecMCTrackHist->GetAxis(0)->SetTitle("nCrossRows");
165 fRecMCTrackHist->GetAxis(1)->SetTitle("chi2PerClust");
166 fRecMCTrackHist->GetAxis(2)->SetTitle("nCrossRows/nFindableClust");
167 fRecMCTrackHist->GetAxis(3)->SetTitle("fracSharedClust");
168 fRecMCTrackHist->GetAxis(4)->SetTitle("DCAy (cm)");
169 fRecMCTrackHist->GetAxis(5)->SetTitle("DCAz (cm)");
170 fRecMCTrackHist->GetAxis(6)->SetTitle("#eta");
171 fRecMCTrackHist->GetAxis(7)->SetTitle("#phi (rad)");
172 fRecMCTrackHist->GetAxis(8)->SetTitle("p_{T} (GeV/c)");
173 fRecMCTrackHist->GetAxis(9)->SetTitle("hasStrangeMother");
174 fRecMCTrackHist->GetAxis(10)->SetTitle("isFromMaterial");
175 fRecMCTrackHist->GetAxis(11)->SetTitle("isPrim");
176 fRecMCTrackHist->GetAxis(12)->SetTitle("charge");
177 fRecMCTrackHist->Sumw2();
179 //nClust:chi2PerClust:nClust/nFindableClust:DCAy:DCAz:eta:phi:pt:kinkIdx:isPrim:polarity
181 Int_t binsRecMCTrackHist[11]={160,80,80,100,100,90,90,ptNbins, 3, 2, 2};
182 Double_t minRecMCTrackHist[11]={0., 0., 0., -1.,-1.,-1.5, 0., ptMin, -1., 0., 0.};
183 Double_t maxRecMCTrackHist[11]={160.,10.,1.2, 1.,1.,1.5, 2.*TMath::Pi(), ptMax, 2., 2., 2.};
185 fRecMCTrackHist = new THnSparseF("fRecMCTrackHist","nClust:chi2PerClust:nClust/nFindableClust:DCAy:DCAz:eta:phi:pt:kinkIdx:isPrim:polarity",11,binsRecMCTrackHist,minRecMCTrackHist,maxRecMCTrackHist);
186 fRecMCTrackHist->SetBinEdges(7,binsPt);
188 fRecMCTrackHist->GetAxis(0)->SetTitle("nClust");
189 fRecMCTrackHist->GetAxis(1)->SetTitle("chi2PerClust");
190 fRecMCTrackHist->GetAxis(2)->SetTitle("nClust/nFindableClust");
191 fRecMCTrackHist->GetAxis(3)->SetTitle("DCAy (cm)");
192 fRecMCTrackHist->GetAxis(4)->SetTitle("DCAz (cm)");
193 fRecMCTrackHist->GetAxis(5)->SetTitle("#eta");
194 fRecMCTrackHist->GetAxis(6)->SetTitle("#phi (rad)");
195 fRecMCTrackHist->GetAxis(7)->SetTitle("p_{T} (GeV/c)");
196 fRecMCTrackHist->GetAxis(8)->SetTitle("kinkIdx"); // 0 - no kink, -1 - kink mother, 1 - kink daugther
197 fRecMCTrackHist->GetAxis(9)->SetTitle("isPrim");
198 fRecMCTrackHist->GetAxis(10)->SetTitle("polarity");
199 fRecMCTrackHist->Sumw2();
202 // init output folder
203 fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");
207 //_____________________________________________________________________________
208 void AlidNdPtCutAnalysis::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent)
211 // Process real and/or simulated events
214 AliDebug(AliLog::kError, "esdEvent not available");
218 // get selection cuts
219 AlidNdPtEventCuts *evtCuts = GetEventCuts();
220 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
221 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
223 if(!evtCuts || !accCuts || !esdTrackCuts) {
224 AliDebug(AliLog::kError, "cuts not available");
230 Bool_t isEventTriggered = kTRUE;
231 AliPhysicsSelection *physicsSelection = NULL;
232 AliTriggerAnalysis* triggerAnalysis = NULL;
235 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
238 Printf("ERROR: Could not receive input handler");
242 if(evtCuts->IsTriggerRequired())
245 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
247 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
248 if(!physicsSelection) return;
249 //SetPhysicsTriggerSelection(physicsSelection);
251 if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
252 // set trigger (V0AND)
253 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
254 if(!triggerAnalysis) return;
255 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
259 // use MC information
260 AliHeader* header = 0;
261 AliGenEventHeader* genHeader = 0;
264 AliPWG0Helper::MCProcessType evtType = AliPWG0Helper::kInvalidProcess;
269 AliDebug(AliLog::kError, "mcEvent not available");
273 // get MC event header
274 header = mcEvent->Header();
276 AliDebug(AliLog::kError, "Header not available");
281 stack = mcEvent->Stack();
283 AliDebug(AliLog::kError, "Stack not available");
287 // get event type (ND=0x1, DD=0x2, SD=0x4)
288 evtType = AliPWG0Helper::GetEventProcessType(header);
289 AliDebug(AliLog::kDebug+1, Form("Found process type %d", evtType));
292 genHeader = header->GenEventHeader();
294 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
297 genHeader->PrimaryVertex(vtxMC);
299 // Fill MC event histogram
300 Double_t vMCEventHist[3]={vtxMC[0],vtxMC[1],vtxMC[2]};
301 fMCEventHist->Fill(vMCEventHist);
305 // get reconstructed vertex
306 Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();
307 Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();
308 const AliESDVertex* vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints);
309 Bool_t isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, esdEvent->GetPrimaryVertexSPD(), GetAnalysisMode(), kFALSE);
310 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex;
312 TObjArray *allChargedTracks=0;
318 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK,isEventTriggered);
320 Bool_t isTrigAndVertex = isEventTriggered && isEventOK;
321 Double_t vEventCount[2] = { static_cast<Double_t>(isEventTriggered), static_cast<Double_t>(isTrigAndVertex)};
322 fEventCount->Fill(vEventCount);
325 // cosmic background and splitted tracks
327 if(GetParticleMode() == AlidNdPtHelper::kBackgroundTrack)
329 AlidNdPtBackgroundCuts *backCuts = GetBackgroundCuts();
330 if(!backCuts) return;
332 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
334 AliESDtrack *track1 = esdEvent->GetTrack(iTrack);
335 if(!track1) continue;
336 if(track1->Charge()==0) continue;
338 for (Int_t jTrack = iTrack+1; jTrack < esdEvent->GetNumberOfTracks(); jTrack++)
340 AliESDtrack *track2 = esdEvent->GetTrack(jTrack);
341 if(!track2) continue;
342 if(track2->Charge()==0) continue;
344 //printf("track2->Charge() %d\n",track2->Charge());
346 backCuts->IsBackgroundTrack(track1, track2);
352 if(isEventOK && isEventTriggered)
354 // get all charged tracks
355 allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());
356 if(!allChargedTracks) return;
358 Int_t entries = allChargedTracks->GetEntries();
359 for(Int_t i=0; i<entries;++i)
361 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
364 if(!esdTrackCuts->AcceptTrack(track)) continue;
367 Bool_t isOK = kFALSE;
368 Double_t x[3]; track->GetXYZ(x);
369 Double_t b[3]; AliTracker::GetBxByBz(x,b);
372 // if TPC-ITS hybrid tracking (kTPCITSHybrid)
373 // replace track parameters with TPC-ony track parameters
375 if( GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybrid || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt)
377 // Relate TPC-only tracks to SPD vertex
378 isOK = track->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);
381 // replace esd track parameters with TPCinner
382 AliExternalTrackParam *tpcTrack = new AliExternalTrackParam(*(track->GetTPCInnerParam()));
383 if (!tpcTrack) return;
384 track->Set(tpcTrack->GetX(),tpcTrack->GetAlpha(),tpcTrack->GetParameter(),tpcTrack->GetCovariance());
386 if(tpcTrack) delete tpcTrack;
390 if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtxUpdate)
393 // update track parameters
395 AliExternalTrackParam cParam;
396 isOK = track->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig, &cParam);
399 track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());
402 FillHistograms(track, stack);
406 Double_t vRecEventHist[5] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv(),vtxESD->GetZRes(),static_cast<Double_t>(multAll)};
407 fRecEventHist->Fill(vRecEventHist);
410 Double_t vRecMCEventHist[5] = {vtxESD->GetXv()-vtxMC[0],vtxESD->GetYv()-vtxMC[1],vtxESD->GetZv()-vtxMC[2],static_cast<Double_t>(multAll)};
411 fRecMCEventHist->Fill(vRecMCEventHist);
415 if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;
419 //_____________________________________________________________________________
420 void AlidNdPtCutAnalysis::FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack) const
423 // Fill ESD track and MC histograms
425 if(!esdTrack) return;
426 if(esdTrack->Charge() == 0.) return;
428 Float_t pt = esdTrack->Pt();
429 Float_t eta = esdTrack->Eta();
430 Float_t phi = esdTrack->Phi();
434 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
435 nClust = esdTrack->GetTPCNclsIter1();
437 nClust = esdTrack->GetTPCclusters(0);
440 Float_t chi2PerCluster = 0.;
441 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
442 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2Iter1()/Float_t(nClust);
444 chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
447 Int_t nFindableClust = esdTrack->GetTPCNclsF();
450 Float_t clustPerFindClust = 0.;
451 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
453 Float_t b[2], bCov[3];
454 esdTrack->GetImpactParameters(b,bCov);
457 Float_t nCrossedRowsTPC = esdTrack->GetTPCClusterInfo(2,1);
459 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
460 if (esdTrack->GetTPCNclsF()>0) {
461 ratioCrossedRowsOverFindableClustersTPC = esdTrack->GetTPCClusterInfo(2,1)/esdTrack->GetTPCNclsF();
465 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
466 Float_t fracClustersTPCShared = -1.;
467 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClust);
472 //if(esdTrack->GetKinkIndex(0) > 0.) isKink = kTRUE;
473 if(esdTrack->GetKinkIndex(0) > 0) kinkIdx = 1; // kink daughter
474 else if(esdTrack->GetKinkIndex(0) < 0) kinkIdx = -1; // kink mother
475 else kinkIdx = 0; // not kink
477 //printf("esdTrack->GetKinkIndex(0) %d \n", esdTrack->GetKinkIndex(0));
478 //printf("esdTrack->GetKinkIndex(1) %d \n", esdTrack->GetKinkIndex(1));
479 //printf("esdTrack->GetKinkIndex(2) %d \n", esdTrack->GetKinkIndex(2));
480 //printf("kinkIdx %d \n", kinkIdx);
483 // Fill rec vs MC information
485 Bool_t isPrim = kTRUE;
486 Bool_t hasStrangeMother = kFALSE;
487 Bool_t isFromMaterial = kFALSE;
491 Int_t label = TMath::Abs(esdTrack->GetLabel());
492 TParticle* particle = stack->Particle(label);
493 if(!particle) return;
494 if(particle->GetPDG() && particle->GetPDG()->Charge()==0.) return;
495 isPrim = stack->IsPhysicalPrimary(label);
497 // check whether has stange mother
499 Int_t motherPdg = -1;
500 TParticle* mother = 0;
502 Int_t motherLabel = particle->GetMother(0);
503 if(motherLabel>0) mother = stack->Particle(motherLabel);
504 if(mother) motherPdg = TMath::Abs(mother->GetPdgCode()); // take abs for visualisation only
505 Int_t mech = particle->GetUniqueID(); // production mechanism
507 if( (motherPdg == 3122) || (motherPdg == -3122) || (motherPdg == 310)) // lambda, antilambda, k0s
509 if( (mech == 4) || (mech == 5) ) hasStrangeMother = kTRUE;
512 //if(isPrim==0 && mech == 13)
513 //printf("mech %d \n", mech);
514 if(!isPrim) isFromMaterial = kTRUE;
517 //if(isPrim && pt > 1.5 && kinkIdx == -1) printf("nClust %d \n", nClust);
521 Int_t charge = esdTrack->Charge();
523 //Double_t vRecMCTrackHist[11] = { nClust,chi2PerCluster,clustPerFindClust,b[0],b[1],eta,phi,pt,kinkIdx,isPrim, polarity };
524 //fRecMCTrackHist->Fill(vRecMCTrackHist);
526 Double_t vRecMCTrackHist[13] = { static_cast<Double_t>(nCrossedRowsTPC), chi2PerCluster, ratioCrossedRowsOverFindableClustersTPC, fracClustersTPCShared , b[0], b[1], eta, phi, pt, static_cast<Double_t>(hasStrangeMother), static_cast<Double_t>(isFromMaterial), static_cast<Double_t>(isPrim), static_cast<Double_t>(charge) };
527 fRecMCTrackHist->Fill(vRecMCTrackHist);
531 //_____________________________________________________________________________
532 Long64_t AlidNdPtCutAnalysis::Merge(TCollection* const list)
534 // Merge list of objects (needed by PROOF)
542 TIterator* iter = list->MakeIterator();
545 //TList *collPhysSelection = new TList;
547 // collection of generated histograms
549 while((obj = iter->Next()) != 0) {
550 AlidNdPtCutAnalysis* entry = dynamic_cast<AlidNdPtCutAnalysis*>(obj);
551 if (entry == 0) continue;
554 fEventCount->Add(entry->fEventCount);
555 fRecEventHist->Add(entry->fRecEventHist);
556 fRecMCEventHist->Add(entry->fRecMCEventHist);
557 fMCEventHist->Add(entry->fMCEventHist);
560 fRecMCTrackHist->Add(entry->fRecMCTrackHist);
563 //collPhysSelection->Add(entry->GetPhysicsTriggerSelection());
568 //AliPhysicsSelection *trigSelection = GetPhysicsTriggerSelection();
569 //trigSelection->Merge(collPhysSelection);
571 //if(collPhysSelection) delete collPhysSelection;
576 //_____________________________________________________________________________
577 void AlidNdPtCutAnalysis::Analyse()
580 // Analyse histograms
582 TH1::AddDirectory(kFALSE);
583 TObjArray *aFolderObj = new TObjArray;
584 if(!aFolderObj) return;
593 AlidNdPtEventCuts *evtCuts = GetEventCuts();
594 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
595 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
597 if(!evtCuts || !accCuts || !esdTrackCuts) {
598 Error("AlidNdPtCutAnalysis::Analyse()", "cuts not available");
603 // set min and max values
605 Double_t minPt = accCuts->GetMinPt();
606 Double_t maxPt = accCuts->GetMaxPt();
607 Double_t minEta = accCuts->GetMinEta();
608 Double_t maxEta = accCuts->GetMaxEta()-0.00001;
610 Double_t maxDCAr = accCuts->GetMaxDCAr();
615 h2D = (TH2D*)fEventCount->Projection(0,1);
617 h2D->SetName("trig_vs_trigANDvertex");
618 aFolderObj->Add(h2D);
620 fEventCount->GetAxis(0)->SetRange(2,2); // triggered
621 h1D = (TH1D*)fEventCount->Projection(1);
623 h1D->SetTitle("rec. vertex for triggered events");
624 h1D->SetName("trigANDvertex");
625 aFolderObj->Add(h1D);
628 // Create rec. event histograms
630 h1D = (TH1D *)fRecEventHist->Projection(0);
632 h1D->SetName("rec_xv");
633 aFolderObj->Add(h1D);
635 h1D = (TH1D *)fRecEventHist->Projection(1);
637 h1D->SetName("rec_yv");
638 aFolderObj->Add(h1D);
640 h1D = (TH1D *)fRecEventHist->Projection(2);
642 h1D->SetName("rec_zv");
643 aFolderObj->Add(h1D);
645 h2D = (TH2D *)fRecEventHist->Projection(3,4);
647 h2D->SetName("rec_resZv_vs_Mult");
648 aFolderObj->Add(h2D);
650 h2D = (TH2D *)fRecEventHist->Projection(0,1);
652 h2D->SetName("rec_xv_vs_yv");
653 aFolderObj->Add(h2D);
655 h2D = (TH2D *)fRecEventHist->Projection(0,2);
657 h2D->SetName("rec_xv_vs_zv");
658 aFolderObj->Add(h2D);
660 h2D = (TH2D *)fRecEventHist->Projection(3,4);
662 h2D->SetName("rec_resZv_vs_Mult");
663 aFolderObj->Add(h2D);
671 // Create mc event histograms
673 h2D = (TH2D *)fMCEventHist->Projection(0,1);
675 h2D->SetName("mc_xv_vs_yv");
676 aFolderObj->Add(h2D);
678 h2D = (TH2D *)fMCEventHist->Projection(0,2);
680 h2D->SetName("mc_xv_vs_zv");
681 aFolderObj->Add(h2D);
684 // Create rec-mc event histograms
686 h2D = (TH2D *)fRecMCEventHist->Projection(0,3);
688 h2D->SetName("rec_mc_deltaXv_vs_mult");
689 aFolderObj->Add(h2D);
691 h2D = (TH2D *)fRecMCEventHist->Projection(1,3);
693 h2D->SetName("rec_mc_deltaYv_vs_mult");
694 aFolderObj->Add(h2D);
696 h2D = (TH2D *)fRecMCEventHist->Projection(2,3);
698 h2D->SetName("rec_mc_deltaZv_vs_mult");
699 aFolderObj->Add(h2D);
706 // Create rec-mc track track histograms
710 fRecMCTrackHist->GetAxis(3)->SetRangeUser(-maxDCAr,maxDCAr);
711 fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);
713 h2D = (TH2D *)fRecMCTrackHist->Projection(7,5);
715 h2D->SetName("pt_vs_eta");
716 aFolderObj->Add(h2D);
718 fRecMCTrackHist->GetAxis(7)->SetRangeUser(minPt,maxPt);
720 h2D = (TH2D *)fRecMCTrackHist->Projection(0,5);
722 h2D->SetName("nClust_vs_eta");
723 aFolderObj->Add(h2D);
725 h2D = (TH2D *)fRecMCTrackHist->Projection(1,5);
727 h2D->SetName("chi2PerClust_vs_eta");
728 aFolderObj->Add(h2D);
730 h2D = (TH2D *)fRecMCTrackHist->Projection(2,5);
732 h2D->SetName("ratio_nClust_nFindableClust_vs_eta");
733 aFolderObj->Add(h2D);
735 h2D = (TH2D *)fRecMCTrackHist->Projection(5,6);
737 h2D->SetName("eta_vs_phi");
738 aFolderObj->Add(h2D);
741 fRecMCTrackHist->GetAxis(5)->SetRangeUser(minEta,maxEta);
743 h2D = (TH2D *)fRecMCTrackHist->Projection(0,6);
745 h2D->SetName("nClust_vs_phi");
746 aFolderObj->Add(h2D);
748 h2D = (TH2D *)fRecMCTrackHist->Projection(1,6);
750 h2D->SetName("chi2PerClust_vs_phi");
751 aFolderObj->Add(h2D);
753 h2D = (TH2D *)fRecMCTrackHist->Projection(2,6);
755 h2D->SetName("ratio_nClust_nFindableClust_vs_phi");
756 aFolderObj->Add(h2D);
759 fRecMCTrackHist->GetAxis(7)->SetRangeUser(0.0,maxPt);
761 h2D = (TH2D *)fRecMCTrackHist->Projection(0,7);
763 h2D->SetName("nClust_vs_pt");
764 aFolderObj->Add(h2D);
766 h2D = (TH2D *)fRecMCTrackHist->Projection(1,7);
768 h2D->SetName("chi2PerClust_vs_pt");
769 aFolderObj->Add(h2D);
771 h2D = (TH2D *)fRecMCTrackHist->Projection(2,7);
773 h2D->SetName("ratio_nClust_nFindableClust_vs_pt");
774 aFolderObj->Add(h2D);
776 h2D = (TH2D *)fRecMCTrackHist->Projection(6,7);
778 h2D->SetName("phi_vs_pt");
779 aFolderObj->Add(h2D);
783 fRecMCTrackHist->GetAxis(5)->SetRangeUser(minEta,maxEta);
784 fRecMCTrackHist->GetAxis(7)->SetRangeUser(minPt,maxPt);
787 fRecMCTrackHist->GetAxis(3)->SetRangeUser(-maxDCAr,maxDCAr);
788 fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);
790 h2D = (TH2D *)fRecMCTrackHist->Projection(0,1);
792 h2D->SetName("nClust_vs_chi2PerClust");
793 aFolderObj->Add(h2D);
795 h2D = (TH2D *)fRecMCTrackHist->Projection(0,2);
797 h2D->SetName("nClust_vs_ratio_nClust_nFindableClust");
798 aFolderObj->Add(h2D);
803 fRecMCTrackHist->GetAxis(0)->SetRange(50,160); // nClust/track > 50
804 fRecMCTrackHist->GetAxis(1)->SetRangeUser(0.,3.9999); // chi2/cluster < 4.0
805 fRecMCTrackHist->GetAxis(3)->SetRange(1,fRecMCTrackHist->GetAxis(3)->GetNbins());
806 //fRecMCTrackHist->GetAxis(4)->SetRangeUser(-1.0,1.0);
807 fRecMCTrackHist->GetAxis(4)->SetRange(1,fRecMCTrackHist->GetAxis(4)->GetNbins());
810 fRecMCTrackHist->GetAxis(9)->SetRange(1,1);
811 h1D = (TH1D *)fRecMCTrackHist->Projection(3);
813 h1D->SetName("dcay_sec");
814 aFolderObj->Add(h1D);
817 fRecMCTrackHist->GetAxis(9)->SetRange(2,2);
818 h1D = (TH1D *)fRecMCTrackHist->Projection(3);
820 h1D->SetName("dcay_prim");
821 aFolderObj->Add(h1D);
824 //fRecMCTrackHist->GetAxis(3)->SetRangeUser(-1.0,1.0);
825 fRecMCTrackHist->GetAxis(4)->SetRange(1,fRecMCTrackHist->GetAxis(4)->GetNbins());
828 fRecMCTrackHist->GetAxis(9)->SetRange(1,1);
829 h1D = (TH1D *)fRecMCTrackHist->Projection(4);
831 h1D->SetName("dcaz_sec");
832 aFolderObj->Add(h1D);
835 fRecMCTrackHist->GetAxis(9)->SetRange(2,2);
836 h1D = (TH1D *)fRecMCTrackHist->Projection(4);
838 h1D->SetName("dcaz_prim");
839 aFolderObj->Add(h1D);
842 // export objects to analysis folder
843 fAnalysisFolder = ExportToFolder(aFolderObj);
844 if(!fAnalysisFolder) {
845 if(aFolderObj) delete aFolderObj;
849 // delete only TObjArray
850 if(aFolderObj) delete aFolderObj;
853 //_____________________________________________________________________________
854 TFolder* AlidNdPtCutAnalysis::ExportToFolder(TObjArray * const array)
856 // recreate folder avery time and export objects to new one
858 AlidNdPtCutAnalysis * comp=this;
859 TFolder *folder = comp->GetAnalysisFolder();
862 TFolder *newFolder = 0;
864 Int_t size = array->GetSize();
867 // get name and title from old folder
868 name = folder->GetName();
869 title = folder->GetTitle();
875 newFolder = CreateFolder(name.Data(),title.Data());
876 newFolder->SetOwner();
878 // add objects to folder
880 newFolder->Add(array->At(i));
888 //_____________________________________________________________________________
889 TFolder* AlidNdPtCutAnalysis::CreateFolder(TString name,TString title) {
890 // create folder for analysed histograms
893 folder = new TFolder(name.Data(),title.Data());