]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG0/dNdPt/AlidNdPtCutAnalysis.cxx
change histogram bining
[u/mrichter/AliRoot.git] / PWG0 / dNdPt / AlidNdPtCutAnalysis.cxx
1 /**************************************************************************\r
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3  *                                                                        *\r
4  * Author: The ALICE Off-line Project.                                    *\r
5  * Contributors are mentioned in the code where appropriate.              *\r
6  *                                                                        *\r
7  * Permission to use, copy, modify and distribute this software and its   *\r
8  * documentation strictly for non-commercial purposes is hereby granted   *\r
9  * without fee, provided that the above copyright notice appears in all   *\r
10  * copies and that both the copyright notice and this permission notice   *\r
11  * appear in the supporting documentation. The authors make no claims     *\r
12  * about the suitability of this software for any purpose. It is          *\r
13  * provided "as is" without express or implied warranty.                  *\r
14  **************************************************************************/\r
15 //------------------------------------------------------------------------------\r
16 // AlidNdPtCutAnalysis class. \r
17 //\r
18 // a. functionality:\r
19 // - fills generic cut histograms\r
20 // - generates cuts (selection criteria)\r
21 //\r
22 // b. data members:\r
23 // - generic cut histograms\r
24 // - control histograms\r
25 //\r
26 // Author: J.Otwinowski 04/11/2008 \r
27 //------------------------------------------------------------------------------\r
28 #include "TH1.h"\r
29 #include "TH2.h"\r
30 \r
31 #include "AliHeader.h"  \r
32 #include "AliGenEventHeader.h"  \r
33 #include "AliStack.h"  \r
34 #include "AliESDEvent.h"  \r
35 #include "AliMCEvent.h"  \r
36 #include "AliESDtrackCuts.h"  \r
37 #include "AliLog.h" \r
38 #include "AliTracker.h" \r
39 \r
40 #include "AlidNdPtEventCuts.h"\r
41 #include "AlidNdPtAcceptanceCuts.h"\r
42 #include "AlidNdPtBackgroundCuts.h"\r
43 #include "AlidNdPtAnalysis.h"\r
44 #include "AliPhysicsSelection.h"\r
45 \r
46 #include "AliPWG0Helper.h"\r
47 #include "AlidNdPtHelper.h"\r
48 #include "AlidNdPtCutAnalysis.h"\r
49 \r
50 using namespace std;\r
51 \r
52 ClassImp(AlidNdPtCutAnalysis)\r
53 \r
54 //_____________________________________________________________________________\r
55   AlidNdPtCutAnalysis::AlidNdPtCutAnalysis(): AlidNdPt(),\r
56   fAnalysisFolder(0),\r
57   fEventCount(0),\r
58   fRecEventHist(0),\r
59   fMCEventHist(0),\r
60   fRecMCEventHist(0),\r
61   fRecMCTrackHist(0)\r
62 {\r
63   // default constructor\r
64   Init();\r
65 }\r
66 \r
67 //_____________________________________________________________________________\r
68 AlidNdPtCutAnalysis::AlidNdPtCutAnalysis(Char_t* name, Char_t* title): AlidNdPt(name,title),\r
69   fAnalysisFolder(0),\r
70   fEventCount(0),\r
71   fRecEventHist(0),\r
72   fMCEventHist(0),\r
73   fRecMCEventHist(0),\r
74   fRecMCTrackHist(0)\r
75 {\r
76   // constructor\r
77   Init();\r
78 }\r
79 \r
80 //_____________________________________________________________________________\r
81 AlidNdPtCutAnalysis::~AlidNdPtCutAnalysis() {\r
82   // \r
83   if(fEventCount) delete fEventCount; fEventCount=0;\r
84   if(fRecEventHist) delete fRecEventHist; fRecEventHist=0;\r
85   if(fMCEventHist) delete fMCEventHist; fMCEventHist=0;\r
86   if(fRecMCEventHist) delete fRecMCEventHist; fRecMCEventHist=0;\r
87   if(fRecMCTrackHist) delete fRecMCTrackHist; fRecMCTrackHist=0;\r
88 \r
89   if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;\r
90 }\r
91 \r
92 //_____________________________________________________________________________\r
93 void AlidNdPtCutAnalysis::Init(){\r
94   //\r
95   // Init histograms\r
96   //\r
97   const Int_t ptNbins = 56; \r
98   const Double_t ptMin = 0.; \r
99   const Double_t ptMax = 16.; \r
100 \r
101   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};\r
102 \r
103   // \r
104   Int_t binsEventCount[2]={2,2};\r
105   Double_t minEventCount[2]={0,0}; \r
106   Double_t maxEventCount[2]={2,2}; \r
107   fEventCount = new THnSparseF("fEventCount","trig vs trig+vertex",2,binsEventCount,minEventCount,maxEventCount);\r
108   fEventCount->GetAxis(0)->SetTitle("trig");\r
109   fEventCount->GetAxis(1)->SetTitle("trig+vert");\r
110   fEventCount->Sumw2();\r
111 \r
112   //Xv:Yv:Zv:ResZv:Mult\r
113   Double_t kFact = 1.0;\r
114 \r
115   Int_t binsRecEventHist[5]={80,80,100,80,150};\r
116   Double_t minRecEventHist[5]={-3.*kFact,-3.*kFact,-35.,0.,0.}; \r
117   Double_t maxRecEventHist[5]={3.*kFact,3.*kFact,35.,10.,150.}; \r
118   fRecEventHist = new THnSparseF("fRecEventHist","Xv:Yv:Zv:ResZv:Mult",5,binsRecEventHist,minRecEventHist,maxRecEventHist);\r
119   fRecEventHist->GetAxis(0)->SetTitle("Xv (cm)");\r
120   fRecEventHist->GetAxis(1)->SetTitle("Yv (cm)");\r
121   fRecEventHist->GetAxis(2)->SetTitle("Zv (cm)");\r
122   fRecEventHist->GetAxis(3)->SetTitle("ResZv (cm)");\r
123   fRecEventHist->GetAxis(4)->SetTitle("Mult");\r
124   fRecEventHist->Sumw2();\r
125 \r
126   //Xv:Yv:Zv\r
127   Int_t binsMCEventHist[3]={80,80,100};\r
128   Double_t minMCEventHist[3]={-0.1,-0.1,-35.}; \r
129   Double_t maxMCEventHist[3]={0.1,0.1,35.}; \r
130   fMCEventHist = new THnSparseF("fMCEventHist","mcXv:mcYv:mcZv",3,binsMCEventHist,minMCEventHist,maxMCEventHist);\r
131   fMCEventHist->GetAxis(0)->SetTitle("mcXv (cm)");\r
132   fMCEventHist->GetAxis(1)->SetTitle("mcYv (cm)");\r
133   fMCEventHist->GetAxis(2)->SetTitle("mcZv (cm)");\r
134   fMCEventHist->Sumw2();\r
135 \r
136   //Xv-mcXv:Yv-mcYv:Zv-mcZv:Mult\r
137   Int_t binsRecMCEventHist[4]={100,100,100,150};\r
138   Double_t minRecMCEventHist[4]={-1.0*kFact,-1.0*kFact,-1.0*kFact,0.}; \r
139   Double_t maxRecMCEventHist[4]={1.0*kFact,1.0*kFact,1.0*kFact,150.}; \r
140   fRecMCEventHist = new THnSparseF("fRecMCEventHist","Xv-mcXv:Yv-mcYv:Zv-mcZv:Mult",4,binsRecMCEventHist,minRecMCEventHist,maxRecMCEventHist);\r
141   fRecMCEventHist->GetAxis(0)->SetTitle("Xv-mcXv (cm)");\r
142   fRecMCEventHist->GetAxis(1)->SetTitle("Yv-mcYv (cm)");\r
143   fRecMCEventHist->GetAxis(2)->SetTitle("Zv-mcZv (cm)");\r
144   fRecMCEventHist->GetAxis(3)->SetTitle("Mult");\r
145   fRecMCEventHist->Sumw2();\r
146 \r
147   //\r
148   // THnSparse track histograms\r
149   //\r
150 \r
151   //nClust:chi2PerClust:nClust/nFindableClust:DCAy:DCAz:eta:phi:pt:kinkIdx:isPrim:polarity\r
152   Int_t binsRecMCTrackHist[11]={160,80,80,100,100,90,90,ptNbins, 3, 2, 2};\r
153   Double_t minRecMCTrackHist[11]={0., 0., 0., -1.,-1.,-1.5, 0., ptMin, -1., 0., 0.};\r
154   Double_t maxRecMCTrackHist[11]={160.,10.,1.2, 1.,1.,1.5, 2.*TMath::Pi(), ptMax, 2., 2., 2.};\r
155 \r
156   fRecMCTrackHist = new THnSparseF("fRecMCTrackHist","nClust:chi2PerClust:nClust/nFindableClust:DCAy:DCAz:eta:phi:pt:kinkIdx:isPrim:polarity",11,binsRecMCTrackHist,minRecMCTrackHist,maxRecMCTrackHist);\r
157   fRecMCTrackHist->SetBinEdges(7,binsPt);\r
158 \r
159   fRecMCTrackHist->GetAxis(0)->SetTitle("nClust");\r
160   fRecMCTrackHist->GetAxis(1)->SetTitle("chi2PerClust");\r
161   fRecMCTrackHist->GetAxis(2)->SetTitle("nClust/nFindableClust");\r
162   fRecMCTrackHist->GetAxis(3)->SetTitle("DCAy (cm)");\r
163   fRecMCTrackHist->GetAxis(4)->SetTitle("DCAz (cm)");\r
164   fRecMCTrackHist->GetAxis(5)->SetTitle("#eta");\r
165   fRecMCTrackHist->GetAxis(6)->SetTitle("#phi (rad)");\r
166   fRecMCTrackHist->GetAxis(7)->SetTitle("p_{T} (GeV/c)");\r
167   fRecMCTrackHist->GetAxis(8)->SetTitle("kinkIdx"); // 0 - no kink, -1 - kink mother, 1 - kink daugther \r
168   fRecMCTrackHist->GetAxis(9)->SetTitle("isPrim");\r
169   fRecMCTrackHist->GetAxis(10)->SetTitle("polarity");\r
170   fRecMCTrackHist->Sumw2();\r
171 \r
172   // init output folder\r
173   fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");\r
174 \r
175 }\r
176 \r
177 //_____________________________________________________________________________\r
178 void AlidNdPtCutAnalysis::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent)\r
179 {\r
180   //\r
181   // Process real and/or simulated events\r
182   //\r
183   if(!esdEvent) {\r
184     AliDebug(AliLog::kError, "esdEvent not available");\r
185     return;\r
186   }\r
187 \r
188   // get selection cuts\r
189   AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
190   AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
191   AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
192 \r
193   if(!evtCuts || !accCuts  || !esdTrackCuts) {\r
194     AliDebug(AliLog::kError, "cuts not available");\r
195     return;\r
196   }\r
197 \r
198   // trigger selection\r
199   Bool_t isEventTriggered = kTRUE;\r
200   AliPhysicsSelection *trigSel = NULL;\r
201   AliTriggerAnalysis *trigAna = NULL; // needed for andV0\r
202 \r
203   if(evtCuts->IsTriggerRequired())  \r
204   {\r
205     //\r
206     trigSel = GetPhysicsTriggerSelection();\r
207     if(!trigSel) {\r
208       AliDebug(AliLog::kError, "cannot get trigSel");\r
209       return;\r
210     }\r
211     \r
212     if(IsUseMCInfo()) { \r
213       trigSel->SetAnalyzeMC();\r
214       isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
215 \r
216       trigAna = trigSel->GetTriggerAnalysis();\r
217       if(!trigAna) \r
218         return;\r
219 \r
220       if(GetTrigger() == AliTriggerAnalysis::kV0AND)\r
221         isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
222     }\r
223     else {\r
224       //\r
225       // 0-multiplicity bin for LHC background correction\r
226       //\r
227       if(GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtxUpdate || \r
228          GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt) \r
229       {\r
230         trigSel->SetBin0CallbackViaPointer(&AlidNdPtAnalysis::IsBinZeroTrackSPDvtx);\r
231       } else {\r
232         trigSel->SetBin0CallbackViaPointer(&AlidNdPtAnalysis::IsBinZeroSPDvtx);\r
233       }\r
234 \r
235       isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
236 \r
237       trigAna = trigSel->GetTriggerAnalysis();\r
238       if(!trigAna) \r
239         return;\r
240 \r
241       if(GetTrigger() == AliTriggerAnalysis::kV0AND)\r
242         isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
243     }\r
244   }\r
245 \r
246   // use MC information\r
247   AliHeader* header = 0;\r
248   AliGenEventHeader* genHeader = 0;\r
249   AliStack* stack = 0;\r
250   TArrayF vtxMC(3);\r
251   AliPWG0Helper::MCProcessType evtType = AliPWG0Helper::kInvalidProcess;\r
252 \r
253   if(IsUseMCInfo())\r
254   {\r
255     if(!mcEvent) {\r
256       AliDebug(AliLog::kError, "mcEvent not available");\r
257       return;\r
258     }\r
259 \r
260     // get MC event header\r
261     header = mcEvent->Header();\r
262     if (!header) {\r
263       AliDebug(AliLog::kError, "Header not available");\r
264       return;\r
265     }\r
266 \r
267     // MC particle stack\r
268     stack = mcEvent->Stack();\r
269     if (!stack) {\r
270       AliDebug(AliLog::kError, "Stack not available");\r
271       return;\r
272     }\r
273 \r
274     // get event type (ND=0x1, DD=0x2, SD=0x4)\r
275     evtType = AliPWG0Helper::GetEventProcessType(header);\r
276     AliDebug(AliLog::kDebug+1, Form("Found process type %d", evtType));\r
277 \r
278     // get MC vertex\r
279     genHeader = header->GenEventHeader();\r
280     if (!genHeader) {\r
281       AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
282       return;\r
283     }\r
284     genHeader->PrimaryVertex(vtxMC);\r
285 \r
286     // Fill MC event histogram\r
287     Double_t vMCEventHist[3]={vtxMC[0],vtxMC[1],vtxMC[2]};\r
288     fMCEventHist->Fill(vMCEventHist);\r
289 \r
290   } // end bUseMC\r
291 \r
292   // get reconstructed vertex  \r
293   Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();\r
294   Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();\r
295   const AliESDVertex* vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints); \r
296   Bool_t isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, esdEvent->GetPrimaryVertexSPD(), GetAnalysisMode(), kFALSE);\r
297   Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex;\r
298 \r
299   TObjArray *allChargedTracks=0;\r
300   Int_t multAll=0;\r
301   \r
302   //\r
303   // event counter\r
304   // \r
305   //printf("isEventOK %d, isEventTriggered %d \n",isEventOK,isEventTriggered);\r
306 \r
307   Bool_t isTrigAndVertex = isEventTriggered && isEventOK;\r
308   Double_t vEventCount[2] = { isEventTriggered, isTrigAndVertex};\r
309   fEventCount->Fill(vEventCount);\r
310 \r
311   //\r
312   // cosmic background and splitted tracks\r
313   //\r
314   if(GetParticleMode() == AlidNdPtHelper::kBackgroundTrack) \r
315   {\r
316     AlidNdPtBackgroundCuts *backCuts = GetBackgroundCuts(); \r
317     if(!backCuts) return;\r
318 \r
319     for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++) \r
320     {\r
321       AliESDtrack *track1 = esdEvent->GetTrack(iTrack);\r
322       if(!track1) continue; \r
323       if(track1->Charge()==0) continue; \r
324 \r
325       for (Int_t jTrack = iTrack+1; jTrack < esdEvent->GetNumberOfTracks(); jTrack++) \r
326       {\r
327         AliESDtrack *track2 = esdEvent->GetTrack(jTrack);\r
328         if(!track2) continue; \r
329         if(track2->Charge()==0) continue; \r
330 \r
331         //printf("track2->Charge() %d\n",track2->Charge());\r
332 \r
333         backCuts->IsBackgroundTrack(track1, track2);\r
334       }\r
335     }\r
336   }\r
337 \r
338   // check event cuts\r
339   if(isEventOK && isEventTriggered)\r
340   {\r
341     // get all charged tracks\r
342     allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());\r
343     if(!allChargedTracks) return;\r
344 \r
345     Int_t entries = allChargedTracks->GetEntries();\r
346     for(Int_t i=0; i<entries;++i) \r
347     {\r
348       AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);\r
349       if(!track) continue;\r
350 \r
351       if(!esdTrackCuts->AcceptTrack(track)) continue;\r
352 \r
353       //\r
354       Bool_t isOK = kFALSE;\r
355       Double_t x[3]; track->GetXYZ(x);\r
356       Double_t b[3]; AliTracker::GetBxByBz(x,b);\r
357 \r
358       //\r
359       // if TPC-ITS hybrid tracking (kTPCITSHybrid)\r
360       // replace track parameters with TPC-ony track parameters\r
361       //\r
362       if( GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybrid || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt) \r
363       {\r
364         // Relate TPC-only tracks to SPD vertex\r
365         isOK = track->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);\r
366         if(!isOK) continue;\r
367 \r
368         // replace esd track parameters with TPCinner\r
369         AliExternalTrackParam  *tpcTrack  = new AliExternalTrackParam(*(track->GetTPCInnerParam()));\r
370         if (!tpcTrack) return;\r
371         track->Set(tpcTrack->GetX(),tpcTrack->GetAlpha(),tpcTrack->GetParameter(),tpcTrack->GetCovariance());\r
372 \r
373         if(tpcTrack) delete tpcTrack; \r
374       } \r
375 \r
376       //\r
377       if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtxUpdate) \r
378       {\r
379         //\r
380         // update track parameters\r
381         //\r
382         AliExternalTrackParam cParam;\r
383         isOK = track->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig, &cParam);\r
384         if(!isOK) continue;\r
385 \r
386         track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());\r
387       }\r
388 \r
389       FillHistograms(track, stack);\r
390       multAll++;\r
391     }\r
392 \r
393     Double_t vRecEventHist[5] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv(),vtxESD->GetZRes(),multAll};\r
394     fRecEventHist->Fill(vRecEventHist);\r
395 \r
396     if(IsUseMCInfo()) {\r
397       Double_t vRecMCEventHist[5] = {vtxESD->GetXv()-vtxMC[0],vtxESD->GetYv()-vtxMC[1],vtxESD->GetZv()-vtxMC[2],multAll};\r
398       fRecMCEventHist->Fill(vRecMCEventHist);\r
399     }\r
400   }\r
401 \r
402   if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;\r
403 \r
404 }\r
405 \r
406 //_____________________________________________________________________________\r
407 void AlidNdPtCutAnalysis::FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack) const\r
408 {\r
409   //\r
410   // Fill ESD track and MC histograms \r
411   //\r
412   if(!esdTrack) return;\r
413   if(esdTrack->Charge() == 0.) return;\r
414 \r
415   Float_t pt = esdTrack->Pt();\r
416   Float_t eta = esdTrack->Eta();\r
417   Float_t phi = esdTrack->Phi();\r
418   //Int_t nClust = esdTrack->GetTPCclusters(0);\r
419   Int_t nClust = esdTrack->GetTPCNclsIter1();\r
420   Int_t nFindableClust = esdTrack->GetTPCNclsF();\r
421 \r
422   Float_t chi2PerCluster = 0.;\r
423   //if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);\r
424   if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2Iter1()/Float_t(nClust);\r
425 \r
426   Float_t clustPerFindClust = 0.;\r
427   if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;\r
428 \r
429   Float_t b[2], bCov[3];\r
430   esdTrack->GetImpactParameters(b,bCov);\r
431 \r
432   // kink idx\r
433   Int_t kinkIdx = 0;\r
434   //if(esdTrack->GetKinkIndex(0) > 0.)   isKink  = kTRUE;\r
435   if(esdTrack->GetKinkIndex(0) > 0)      kinkIdx = 1;   // kink daughter\r
436   else if(esdTrack->GetKinkIndex(0) < 0) kinkIdx = -1;  // kink mother\r
437   else kinkIdx = 0; // not kink\r
438 \r
439   //printf("esdTrack->GetKinkIndex(0) %d \n", esdTrack->GetKinkIndex(0));\r
440   //printf("esdTrack->GetKinkIndex(1) %d \n", esdTrack->GetKinkIndex(1));\r
441   //printf("esdTrack->GetKinkIndex(2) %d \n", esdTrack->GetKinkIndex(2));\r
442   //printf("kinkIdx %d \n", kinkIdx);\r
443 \r
444   //\r
445   // Fill rec vs MC information\r
446   //\r
447   Bool_t isPrim = kTRUE;\r
448 \r
449   if(IsUseMCInfo()) {\r
450     if(!stack) return;\r
451     Int_t label = TMath::Abs(esdTrack->GetLabel()); \r
452     TParticle* particle = stack->Particle(label);\r
453     if(!particle) return;\r
454     if(particle->GetPDG() && particle->GetPDG()->Charge()==0.) return;\r
455     isPrim = stack->IsPhysicalPrimary(label);\r
456 \r
457     //if(isPrim && pt > 1.5 && kinkIdx == -1) printf("nClust  %d \n", nClust);\r
458   }\r
459   \r
460   // fill histo\r
461   Int_t polarity = -2;\r
462   if (esdTrack->Charge() < 0.) polarity = 0; \r
463   else polarity = 1; \r
464   Double_t vRecMCTrackHist[11] = { nClust,chi2PerCluster,clustPerFindClust,b[0],b[1],eta,phi,pt,kinkIdx,isPrim, polarity }; \r
465   fRecMCTrackHist->Fill(vRecMCTrackHist);\r
466 }\r
467 \r
468 //_____________________________________________________________________________\r
469 Long64_t AlidNdPtCutAnalysis::Merge(TCollection* const list) \r
470 {\r
471   // Merge list of objects (needed by PROOF)\r
472 \r
473   if (!list)\r
474   return 0;\r
475 \r
476   if (list->IsEmpty())\r
477   return 1;\r
478 \r
479   TIterator* iter = list->MakeIterator();\r
480   TObject* obj = 0;\r
481 \r
482   //TList *collPhysSelection = new TList;\r
483 \r
484   // collection of generated histograms\r
485   Int_t count=0;\r
486   while((obj = iter->Next()) != 0) {\r
487     AlidNdPtCutAnalysis* entry = dynamic_cast<AlidNdPtCutAnalysis*>(obj);\r
488     if (entry == 0) continue; \r
489   \r
490     // event histo\r
491     fEventCount->Add(entry->fEventCount);\r
492     fRecEventHist->Add(entry->fRecEventHist);\r
493     fRecMCEventHist->Add(entry->fRecMCEventHist);\r
494     fMCEventHist->Add(entry->fMCEventHist);\r
495 \r
496     // track histo\r
497     fRecMCTrackHist->Add(entry->fRecMCTrackHist);\r
498 \r
499     // physics selection\r
500     //collPhysSelection->Add(entry->GetPhysicsTriggerSelection());\r
501     \r
502   count++;\r
503   }\r
504 \r
505   //AliPhysicsSelection *trigSelection = GetPhysicsTriggerSelection();\r
506   //trigSelection->Merge(collPhysSelection);\r
507 \r
508   //if(collPhysSelection) delete collPhysSelection;\r
509 \r
510 return count;\r
511 }\r
512 \r
513 //_____________________________________________________________________________\r
514 void AlidNdPtCutAnalysis::Analyse() \r
515 {\r
516   //\r
517   // Analyse histograms\r
518   //\r
519   TH1::AddDirectory(kFALSE);\r
520   TObjArray *aFolderObj = new TObjArray;\r
521   TH1D *h1D = 0; \r
522   TH2D *h2D = 0; \r
523 \r
524 \r
525   //\r
526   // get cuts\r
527   //\r
528   AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
529   AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
530   AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
531 \r
532   if(!evtCuts || !accCuts || !esdTrackCuts) {\r
533     Error("AlidNdPtCutAnalysis::Analyse()", "cuts not available");\r
534     return;\r
535   }\r
536 \r
537   //\r
538   // set min and max values\r
539   //\r
540   Double_t minPt = accCuts->GetMinPt();\r
541   Double_t maxPt = accCuts->GetMaxPt();\r
542   Double_t minEta = accCuts->GetMinEta();\r
543   Double_t maxEta = accCuts->GetMaxEta()-0.00001;\r
544 \r
545   Double_t maxDCAr = accCuts->GetMaxDCAr();\r
546 \r
547   //\r
548   // Event counters\r
549   //\r
550   h2D = (TH2D*)fEventCount->Projection(0,1);\r
551   h2D->SetName("trig_vs_trigANDvertex");\r
552   aFolderObj->Add(h2D);\r
553 \r
554   fEventCount->GetAxis(0)->SetRange(2,2); // triggered\r
555   h1D = (TH1D*)fEventCount->Projection(1);\r
556   h1D->SetTitle("rec. vertex for triggered events");\r
557   h1D->SetName("trigANDvertex");\r
558   aFolderObj->Add(h1D);\r
559 \r
560   //\r
561   // Create rec. event histograms\r
562   //\r
563   h1D = (TH1D *)fRecEventHist->Projection(0);\r
564   h1D->SetName("rec_xv");\r
565   aFolderObj->Add(h1D);\r
566 \r
567   h1D = (TH1D *)fRecEventHist->Projection(1);\r
568   h1D->SetName("rec_yv");\r
569   aFolderObj->Add(h1D);\r
570 \r
571   h1D = (TH1D *)fRecEventHist->Projection(2);\r
572   h1D->SetName("rec_zv");\r
573   aFolderObj->Add(h1D);\r
574 \r
575   h2D = (TH2D *)fRecEventHist->Projection(3,4);\r
576   h2D->SetName("rec_resZv_vs_Mult");\r
577   aFolderObj->Add(h2D);\r
578 \r
579   h2D = (TH2D *)fRecEventHist->Projection(0,1);\r
580   h2D->SetName("rec_xv_vs_yv");\r
581   aFolderObj->Add(h2D);\r
582 \r
583   h2D = (TH2D *)fRecEventHist->Projection(0,2);\r
584   h2D->SetName("rec_xv_vs_zv");\r
585   aFolderObj->Add(h2D);\r
586 \r
587   h2D = (TH2D *)fRecEventHist->Projection(3,4);\r
588   h2D->SetName("rec_resZv_vs_Mult");\r
589   aFolderObj->Add(h2D);\r
590 \r
591   //\r
592   // MC available\r
593   //\r
594   if(IsUseMCInfo()) {\r
595 \r
596   //\r
597   // Create mc event histograms\r
598   //\r
599   h2D = (TH2D *)fMCEventHist->Projection(0,1);\r
600   h2D->SetName("mc_xv_vs_yv");\r
601   aFolderObj->Add(h2D);\r
602 \r
603   h2D = (TH2D *)fMCEventHist->Projection(0,2);\r
604   h2D->SetName("mc_xv_vs_zv");\r
605   aFolderObj->Add(h2D);\r
606 \r
607   //\r
608   // Create rec-mc event histograms\r
609   //\r
610   h2D = (TH2D *)fRecMCEventHist->Projection(0,3);\r
611   h2D->SetName("rec_mc_deltaXv_vs_mult");\r
612   aFolderObj->Add(h2D);\r
613 \r
614   h2D = (TH2D *)fRecMCEventHist->Projection(1,3);\r
615   h2D->SetName("rec_mc_deltaYv_vs_mult");\r
616   aFolderObj->Add(h2D);\r
617 \r
618   h2D = (TH2D *)fRecMCEventHist->Projection(2,3);\r
619   h2D->SetName("rec_mc_deltaZv_vs_mult");\r
620   aFolderObj->Add(h2D);\r
621 \r
622   } // end use MC info \r
623 \r
624 \r
625 \r
626   //\r
627   // Create rec-mc track track histograms \r
628   //\r
629 \r
630   // DCA cuts\r
631   fRecMCTrackHist->GetAxis(3)->SetRangeUser(-maxDCAr,maxDCAr);\r
632   fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);\r
633 \r
634   h2D = (TH2D *)fRecMCTrackHist->Projection(7,5);\r
635   h2D->SetName("pt_vs_eta");\r
636   aFolderObj->Add(h2D);\r
637 \r
638   fRecMCTrackHist->GetAxis(7)->SetRangeUser(minPt,maxPt);  \r
639 \r
640   h2D = (TH2D *)fRecMCTrackHist->Projection(0,5);\r
641   h2D->SetName("nClust_vs_eta");\r
642   aFolderObj->Add(h2D);\r
643 \r
644   h2D = (TH2D *)fRecMCTrackHist->Projection(1,5);\r
645   h2D->SetName("chi2PerClust_vs_eta");\r
646   aFolderObj->Add(h2D);\r
647 \r
648   h2D = (TH2D *)fRecMCTrackHist->Projection(2,5);\r
649   h2D->SetName("ratio_nClust_nFindableClust_vs_eta");\r
650   aFolderObj->Add(h2D);\r
651 \r
652   h2D = (TH2D *)fRecMCTrackHist->Projection(5,6);\r
653   h2D->SetName("eta_vs_phi");\r
654   aFolderObj->Add(h2D);\r
655 \r
656   //\r
657   fRecMCTrackHist->GetAxis(5)->SetRangeUser(minEta,maxEta);  \r
658 \r
659   h2D = (TH2D *)fRecMCTrackHist->Projection(0,6);\r
660   h2D->SetName("nClust_vs_phi");\r
661   aFolderObj->Add(h2D);\r
662 \r
663   h2D = (TH2D *)fRecMCTrackHist->Projection(1,6);\r
664   h2D->SetName("chi2PerClust_vs_phi");\r
665   aFolderObj->Add(h2D);\r
666 \r
667   h2D = (TH2D *)fRecMCTrackHist->Projection(2,6);\r
668   h2D->SetName("ratio_nClust_nFindableClust_vs_phi");\r
669   aFolderObj->Add(h2D);\r
670 \r
671   //\r
672   fRecMCTrackHist->GetAxis(7)->SetRangeUser(0.0,maxPt);  \r
673 \r
674   h2D = (TH2D *)fRecMCTrackHist->Projection(0,7);\r
675   h2D->SetName("nClust_vs_pt");\r
676   aFolderObj->Add(h2D);\r
677 \r
678   h2D = (TH2D *)fRecMCTrackHist->Projection(1,7);\r
679   h2D->SetName("chi2PerClust_vs_pt");\r
680   aFolderObj->Add(h2D);\r
681 \r
682   h2D = (TH2D *)fRecMCTrackHist->Projection(2,7);\r
683   h2D->SetName("ratio_nClust_nFindableClust_vs_pt");\r
684   aFolderObj->Add(h2D);\r
685 \r
686   h2D = (TH2D *)fRecMCTrackHist->Projection(6,7);\r
687   h2D->SetName("phi_vs_pt");\r
688   aFolderObj->Add(h2D);\r
689 \r
690 \r
691   // fiducial volume\r
692   fRecMCTrackHist->GetAxis(5)->SetRangeUser(minEta,maxEta);  \r
693   fRecMCTrackHist->GetAxis(7)->SetRangeUser(minPt,maxPt);  \r
694 \r
695   // DCA cuts\r
696   fRecMCTrackHist->GetAxis(3)->SetRangeUser(-maxDCAr,maxDCAr);\r
697   fRecMCTrackHist->GetAxis(4)->SetRangeUser(-maxDCAr,maxDCAr);\r
698 \r
699   h2D = (TH2D *)fRecMCTrackHist->Projection(0,1);\r
700   h2D->SetName("nClust_vs_chi2PerClust");\r
701   aFolderObj->Add(h2D);\r
702 \r
703   h2D = (TH2D *)fRecMCTrackHist->Projection(0,2);\r
704   h2D->SetName("nClust_vs_ratio_nClust_nFindableClust");\r
705   aFolderObj->Add(h2D);\r
706 \r
707   //\r
708   // DCAy cuts\r
709   //\r
710   fRecMCTrackHist->GetAxis(0)->SetRange(50,160); // nClust/track > 50\r
711   fRecMCTrackHist->GetAxis(1)->SetRangeUser(0.,3.9999); // chi2/cluster < 4.0\r
712   fRecMCTrackHist->GetAxis(3)->SetRange(1,fRecMCTrackHist->GetAxis(3)->GetNbins());\r
713   //fRecMCTrackHist->GetAxis(4)->SetRangeUser(-1.0,1.0);\r
714   fRecMCTrackHist->GetAxis(4)->SetRange(1,fRecMCTrackHist->GetAxis(4)->GetNbins());\r
715 \r
716   // sec\r
717   fRecMCTrackHist->GetAxis(9)->SetRange(1,1);\r
718   h1D = (TH1D *)fRecMCTrackHist->Projection(3);\r
719   h1D->SetName("dcay_sec");\r
720   aFolderObj->Add(h1D);\r
721 \r
722   // prim\r
723   fRecMCTrackHist->GetAxis(9)->SetRange(2,2);\r
724   h1D = (TH1D *)fRecMCTrackHist->Projection(3);\r
725   h1D->SetName("dcay_prim");\r
726   aFolderObj->Add(h1D);\r
727 \r
728   // DCAz cuts\r
729   //fRecMCTrackHist->GetAxis(3)->SetRangeUser(-1.0,1.0);\r
730   fRecMCTrackHist->GetAxis(4)->SetRange(1,fRecMCTrackHist->GetAxis(4)->GetNbins());\r
731 \r
732   // sec\r
733   fRecMCTrackHist->GetAxis(9)->SetRange(1,1);\r
734   h1D = (TH1D *)fRecMCTrackHist->Projection(4);\r
735   h1D->SetName("dcaz_sec");\r
736   aFolderObj->Add(h1D);\r
737 \r
738   // prim\r
739   fRecMCTrackHist->GetAxis(9)->SetRange(2,2);\r
740   h1D = (TH1D *)fRecMCTrackHist->Projection(4);\r
741   h1D->SetName("dcaz_prim");\r
742   aFolderObj->Add(h1D);\r
743 \r
744 \r
745   // export objects to analysis folder\r
746   fAnalysisFolder = ExportToFolder(aFolderObj);\r
747 \r
748   // delete only TObjArray\r
749   if(aFolderObj) delete aFolderObj;\r
750 }\r
751 \r
752 //_____________________________________________________________________________\r
753 TFolder* AlidNdPtCutAnalysis::ExportToFolder(TObjArray * const array) \r
754 {\r
755   // recreate folder avery time and export objects to new one\r
756   //\r
757   AlidNdPtCutAnalysis * comp=this;\r
758   TFolder *folder = comp->GetAnalysisFolder();\r
759 \r
760   TString name, title;\r
761   TFolder *newFolder = 0;\r
762   Int_t i = 0;\r
763   Int_t size = array->GetSize();\r
764 \r
765   if(folder) { \r
766      // get name and title from old folder\r
767      name = folder->GetName();  \r
768      title = folder->GetTitle();  \r
769 \r
770          // delete old one\r
771      delete folder;\r
772 \r
773          // create new one\r
774      newFolder = CreateFolder(name.Data(),title.Data());\r
775      newFolder->SetOwner();\r
776 \r
777          // add objects to folder\r
778      while(i < size) {\r
779            newFolder->Add(array->At(i));\r
780            i++;\r
781          }\r
782   }\r
783 \r
784 return newFolder;\r
785 }\r
786 \r
787 //_____________________________________________________________________________\r
788 TFolder* AlidNdPtCutAnalysis::CreateFolder(TString name,TString title) { \r
789 // create folder for analysed histograms\r
790 //\r
791 TFolder *folder = 0;\r
792   folder = new TFolder(name.Data(),title.Data());\r
793 \r
794   return folder;\r
795 }\r