]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/PiKaPr/TestAOD/AliAnalysisTaskSpectraBoth.cxx
Coverity fix
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TestAOD / AliAnalysisTaskSpectraBoth.cxx
1 /**************************************************************************\r
2  * Copyright(c) 1998-2009, 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 //-----------------------------------------------------------------\r
17 //         AliAnalysisTaskSpectraBoth class\r
18 //-----------------------------------------------------------------\r
19 \r
20 #include "TChain.h"\r
21 #include "TTree.h"\r
22 #include "TLegend.h"\r
23 #include "TH1F.h"\r
24 #include "TH2F.h"\r
25 #include "TCanvas.h"\r
26 #include "AliAnalysisTask.h"\r
27 #include "AliAnalysisManager.h"\r
28 #include "AliAODTrack.h"\r
29 #include "AliAODMCParticle.h"\r
30 #include "AliVParticle.h"\r
31 #include "AliAODEvent.h"\r
32 #include "AliAODInputHandler.h"\r
33 #include "AliAnalysisTaskSpectraBoth.h"\r
34 #include "AliAnalysisTaskESDfilter.h"\r
35 #include "AliAnalysisDataContainer.h"\r
36 #include "AliSpectraBothHistoManager.h"\r
37 #include "AliSpectraBothTrackCuts.h"\r
38 #include "AliSpectraBothEventCuts.h"\r
39 #include "AliCentrality.h"\r
40 #include "TProof.h"\r
41 #include "AliPID.h"\r
42 #include "AliVEvent.h"\r
43 #include "AliESDEvent.h"\r
44 #include "AliPIDResponse.h"\r
45 #include "AliStack.h"\r
46 #include "AliSpectraBothPID.h"\r
47 #include <TMCProcess.h>\r
48 \r
49 #include <iostream>\r
50 \r
51 \r
52 \r
53 \r
54 using namespace AliSpectraNameSpaceBoth;\r
55 using namespace std;\r
56 \r
57 ClassImp(AliAnalysisTaskSpectraBoth)\r
58 \r
59 //________________________________________________________________________\r
60 AliAnalysisTaskSpectraBoth::AliAnalysisTaskSpectraBoth(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fHistMan(0), fTrackCuts(0), fEventCuts(0),  fPID(0), fIsMC(0), fNRebin(0),fUseMinSigma(0),fCuts(0),fdotheMCLoopAfterEventCuts(0)\r
61 {\r
62   // Default constructor\r
63   \r
64   DefineInput(0, TChain::Class());\r
65   DefineOutput(1, AliSpectraBothHistoManager::Class());\r
66   DefineOutput(2, AliSpectraBothEventCuts::Class());\r
67   DefineOutput(3, AliSpectraBothTrackCuts::Class());\r
68   DefineOutput(4, AliSpectraBothPID::Class());\r
69   fNRebin=0;\r
70   \r
71 }\r
72 //________________________________________________________________________\r
73 //________________________________________________________________________\r
74 void AliAnalysisTaskSpectraBoth::UserCreateOutputObjects()\r
75 {\r
76   // create output objects\r
77   fHistMan = new AliSpectraBothHistoManager("SpectraHistos",fNRebin);\r
78 \r
79   if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");\r
80   if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");\r
81   if (!fPID)       AliFatal("PID object should be set in the steering macro");\r
82   fTrackCuts->SetAliESDtrackCuts(fCuts);\r
83   PostData(1, fHistMan  );\r
84   PostData(2, fEventCuts);\r
85   PostData(3, fTrackCuts);\r
86   PostData(4, fPID      );\r
87 \r
88 }\r
89 //________________________________________________________________________\r
90 void AliAnalysisTaskSpectraBoth::UserExec(Option_t *)\r
91 {\r
92   // main event loop\r
93         Int_t ifAODEvent=AliSpectraBothTrackCuts::kotherobject;\r
94         fAOD = dynamic_cast<AliVEvent*>(InputEvent());\r
95    \r
96   //    AliESDEvent* esdevent=0x0;\r
97  //     AliAODEvent* aodevent=0x0;\r
98    \r
99         TString nameoftrack(fAOD->ClassName());  \r
100         if(!nameoftrack.CompareTo("AliESDEvent"))\r
101         {\r
102                 ifAODEvent=AliSpectraBothTrackCuts::kESDobject;\r
103                 //esdevent=dynamic_cast<AliESDEvent*>(fAOD);\r
104         }\r
105         else if(!nameoftrack.CompareTo("AliAODEvent"))\r
106         {\r
107                 ifAODEvent=AliSpectraBothTrackCuts::kAODobject;\r
108                 //aodevent=dynamic_cast<AliAODEvent*>(fAOD);\r
109         }\r
110         else\r
111                 AliFatal("Not processing AODs or ESDS") ;\r
112         if(fdotheMCLoopAfterEventCuts)\r
113                 if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection\r
114  \r
115   \r
116         TClonesArray *arrayMC = 0;\r
117         Int_t npar=0;\r
118         AliStack* stack=0x0;\r
119   \r
120         if (fIsMC)\r
121         {\r
122           \r
123                   if(ifAODEvent==AliSpectraBothTrackCuts::kAODobject)\r
124                   {     \r
125                           arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());\r
126                           if (!arrayMC) \r
127                           {\r
128                                         AliFatal("Error: MC particles branch not found!\n");\r
129                           }\r
130                           Int_t nMC = arrayMC->GetEntries();\r
131                           for (Int_t iMC = 0; iMC < nMC; iMC++)\r
132                           {\r
133                                   AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);\r
134                                   if(!partMC->Charge()) continue;//Skip neutrals\r
135                                   //if(partMC->Eta() > fTrackCuts->GetEtaMin() && partMC->Eta() < fTrackCuts->GetEtaMax()){//charged hadron are filled inside the eta acceptance\r
136                                   //Printf("%f     %f-%f",partMC->Eta(),fTrackCuts->GetEtaMin(),fTrackCuts->GetEtaMax());\r
137                                   if(partMC->Eta() > fTrackCuts->GetEtaMin() && partMC->Eta() < fTrackCuts->GetEtaMax())\r
138                                                 fHistMan->GetPtHistogram(kHistPtGen)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());\r
139                                   \r
140                                   //rapidity cut\r
141                                   if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) continue;        \r
142                                   if(partMC->IsPhysicalPrimary())\r
143                                          npar++;    \r
144                                   // check for true PID + and fill P_t histos \r
145                                   Int_t charge = partMC->Charge() > 0 ? kChPos : kChNeg ;\r
146                                   Int_t id = fPID->GetParticleSpecie(partMC);\r
147                                   if(id != kSpUndefined) \r
148                                   {\r
149                                         fHistMan->GetHistogram2D(kHistPtGenTruePrimary,id,charge)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());\r
150                                   }\r
151                           }\r
152                   }\r
153                   if(ifAODEvent==AliSpectraBothTrackCuts::kESDobject)\r
154                   {     \r
155                         AliMCEvent* mcEvent  = (AliMCEvent*) MCEvent();\r
156                         //Printf("MC particles: %d", mcEvent->GetNumberOfTracks());             \r
157                         if (!mcEvent) \r
158                         {\r
159                                 AliFatal("Error: MC particles branch not found!\n");\r
160                         }\r
161                         stack = mcEvent->Stack();\r
162                         Int_t nMC = stack->GetNtrack();\r
163                         for (Int_t iMC = 0; iMC < nMC; iMC++)\r
164                         {\r
165                                  \r
166                                 TParticle *partMC = stack->Particle(iMC);\r
167                                 \r
168                                 if(!partMC)     \r
169                                         continue;       \r
170         \r
171                                 if(!partMC->GetPDG(0))\r
172                                         continue;\r
173                                 if(TMath::Abs(partMC->GetPDG(0)->Charge()/3.0)<0.01) \r
174                                         continue;//Skip neutrals\r
175                                 if(partMC->Eta() > fTrackCuts->GetEtaMin() && partMC->Eta() < fTrackCuts->GetEtaMax())\r
176                                         fHistMan->GetPtHistogram(kHistPtGen)->Fill(partMC->Pt(),stack->IsPhysicalPrimary(iMC));\r
177                                 if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) \r
178                                         continue;\r
179                                 if(stack->IsPhysicalPrimary(iMC))\r
180                                          npar++;    \r
181                                   // check for true PID + and fill P_t histos \r
182                                 Int_t charge = partMC->GetPDG(0)->Charge()/3.0 > 0 ? kChPos : kChNeg ;\r
183                                 Int_t id = fPID->GetParticleSpecie(partMC);\r
184                                 if(id != kSpUndefined) \r
185                                 {\r
186                                         fHistMan->GetHistogram2D(kHistPtGenTruePrimary,id,charge)->Fill(partMC->Pt(),stack->IsPhysicalPrimary(iMC));\r
187                                 }\r
188                           }\r
189                   }\r
190         }\r
191   \r
192         if(!fdotheMCLoopAfterEventCuts)\r
193                 if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection\r
194 \r
195         //main loop on tracks\r
196         Int_t ntracks=0;\r
197         //cout<<fAOD->GetNumberOfTracks()<<endl;\r
198         for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) \r
199         {\r
200                 AliVTrack* track = dynamic_cast<AliVTrack*>(fAOD->GetTrack(iTracks));\r
201                 AliAODTrack* aodtrack=0;\r
202                 AliESDtrack* esdtrack=0;\r
203                 Float_t dca=-999.;\r
204                 if(ifAODEvent==AliSpectraBothTrackCuts::kESDobject)\r
205                 {\r
206                         esdtrack=dynamic_cast<AliESDtrack*>(track);\r
207                         if(!esdtrack)\r
208                                 continue;\r
209                         Float_t dcaz=0.0;\r
210                         esdtrack->GetImpactParameters(dca,dcaz);\r
211                 }\r
212                 else if (ifAODEvent==AliSpectraBothTrackCuts::kAODobject)\r
213                 {\r
214                         aodtrack=dynamic_cast<AliAODTrack*>(track);\r
215                         if(!aodtrack)\r
216                                 continue;               \r
217                         dca=aodtrack->DCA();\r
218                 }\r
219                 else\r
220                         continue;\r
221                 if (!fTrackCuts->IsSelected(track,kTRUE)) \r
222                         continue;\r
223                 ntracks++;\r
224                 fPID->FillQAHistos(fHistMan, track, fTrackCuts);\r
225     \r
226                 //calculate DCA for AOD track\r
227                 if(dca==-999.)\r
228                 {// track->DCA() does not work in old AOD production\r
229                         Double_t d[2], covd[3];\r
230                         AliVTrack* track_clone=(AliVTrack*)track->Clone("track_clone"); // need to clone because PropagateToDCA updates the track parameters\r
231                         Bool_t isDCA = track_clone->PropagateToDCA(fAOD->GetPrimaryVertex(),fAOD->GetMagneticField(),9999.,d,covd);\r
232                         delete track_clone;\r
233                         if(!isDCA)\r
234                                 d[0]=-999.;\r
235                         dca=d[0];\r
236                 }\r
237                 fHistMan->GetPtHistogram(kHistPtRec)->Fill(track->Pt(),dca);  // PT histo\r
238                 // get identity and charge\r
239                 Bool_t rec[3]={false,false,false};\r
240                 Int_t idRec  = fPID->GetParticleSpecie(fHistMan,track, fTrackCuts,rec);\r
241                 for(int irec=kSpPion;irec<kNSpecies;irec++)\r
242                 {\r
243    \r
244                         if(fUseMinSigma)\r
245                         {\r
246                                 if(irec>kSpPion)\r
247                                         break;\r
248                         }\r
249                         else\r
250                         {       \r
251                                 if(!rec[irec]) \r
252                                         idRec = kSpUndefined;\r
253                                 else    \r
254                                         idRec=irec;\r
255                         }               \r
256    \r
257                         Int_t charge = track->Charge() > 0 ? kChPos : kChNeg;\r
258                 \r
259                         // Fill histograms, only if inside y and nsigma acceptance\r
260                         if(idRec != kSpUndefined && fTrackCuts->CheckYCut ((BothParticleSpecies_t)idRec))\r
261                                 fHistMan->GetHistogram2D(kHistPtRecSigma,idRec,charge)->Fill(track->Pt(),dca);\r
262                         //can't put a continue because we still have to fill allcharged primaries, done later\r
263                 \r
264                         /* MC Part */\r
265                         if (arrayMC||stack) \r
266                         {\r
267                                 Bool_t isPrimary           = kFALSE;\r
268                                 Bool_t isSecondaryMaterial = kFALSE; \r
269                                 Bool_t isSecondaryWeak     = kFALSE; \r
270                                 Int_t idGen     =kSpUndefined;\r
271                                 Int_t pdgcode=0;\r
272                                 if (ifAODEvent==AliSpectraBothTrackCuts::kAODobject)\r
273                                 {\r
274                                         AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));\r
275                                         if (!partMC) \r
276                                         { \r
277                                                 AliError("Cannot get MC particle");\r
278                                                 continue; \r
279                                         }\r
280                                         // Check if it is primary, secondary from material or secondary from weak decay\r
281                                         isPrimary           = partMC->IsPhysicalPrimary();\r
282                                         isSecondaryWeak     = partMC->IsSecondaryFromWeakDecay();\r
283                                         isSecondaryMaterial      = partMC->IsSecondaryFromMaterial();\r
284                                         //cout<<"AOD tagging "<<isPrimary<<" "<<isSecondaryWeak<<isSecondaryMaterial<<" "<<partMC->GetMCProcessCode()<<endl;\r
285 \r
286                                         if(!isPrimary&&!isSecondaryWeak&&!isSecondaryMaterial) \r
287                                         {\r
288                                                 AliError("old tagging");\r
289                                                 Int_t mfl=-999,codemoth=-999;\r
290                                                 Int_t indexMoth=partMC->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()\r
291                                                 if(indexMoth>=0)\r
292                                                 {//is not fake\r
293                                                         AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);\r
294                                                         codemoth = TMath::Abs(moth->GetPdgCode());\r
295                                                         mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));\r
296                                                 }\r
297                                                 //Int_t uniqueID = partMC->GetUniqueID();\r
298                                                 //cout<<"uniqueID: "<<partMC->GetUniqueID()<<"       "<<kPDecay<<endl;\r
299                                                 //cout<<"status: "<<partMC->GetStatus()<<"       "<<kPDecay<<endl;\r
300                                                 // if(uniqueID == kPDecay)Printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");\r
301                                                 if(mfl==3) \r
302                                                         isSecondaryWeak     = kTRUE; // add if(partMC->GetStatus() & kPDecay)? FIXME\r
303                                                 else       \r
304                                                         isSecondaryMaterial = kTRUE;\r
305                                         }\r
306                                         //cout<<"AOD 2 tagging "<<isPrimary<<" "<<isSecondaryWeak<<isSecondaryMaterial<<" "<<partMC->GetMCProcessCode()<<endl;\r
307 \r
308 \r
309                                         idGen     = fPID->GetParticleSpecie(partMC);\r
310                                         pdgcode=partMC->GetPdgCode(); \r
311                                 }\r
312                                 else if (ifAODEvent==AliSpectraBothTrackCuts::kESDobject)\r
313                                 {\r
314                                         TParticle *partMC =stack->Particle(TMath::Abs(track->GetLabel()));\r
315                                         if (!partMC) \r
316                                         { \r
317                                                 AliError("Cannot get MC particle");\r
318                                                 continue; \r
319                                         }\r
320                                         isPrimary           = stack->IsPhysicalPrimary(TMath::Abs(track->GetLabel()));\r
321                                         isSecondaryWeak     = stack->IsSecondaryFromWeakDecay(TMath::Abs(track->GetLabel()));\r
322                                         isSecondaryMaterial      = stack->IsSecondaryFromMaterial(TMath::Abs(track->GetLabel()));\r
323                                         //cout<<"ESD tagging "<<isPrimary<<" "<<isSecondaryWeak<<isSecondaryMaterial<<endl;\r
324                                         \r
325                                         idGen     = fPID->GetParticleSpecie(partMC);\r
326                                         pdgcode=partMC->GetPdgCode(); \r
327                                 }\r
328                                 else\r
329                                         return;\r
330                         \r
331                         //        cout<<isPrimary<<" "<<isSecondaryWeak<<" "<<isSecondaryMaterial<<endl;\r
332                         //        cout<<" functions "<<partMC->IsPhysicalPrimary()<<" "<<partMC->IsSecondaryFromWeakDecay()<<" "<<partMC->IsSecondaryFromMaterial()<<endl;\r
333                   \r
334                                 if (isPrimary&&irec==kSpPion)\r
335                                         fHistMan->GetPtHistogram(kHistPtRecPrimary)->Fill(track->Pt(),dca);  // PT histo of primaries\r
336                   \r
337                         //nsigma cut (reconstructed nsigma)\r
338                                 if(idRec == kSpUndefined) \r
339                                         continue;\r
340                   \r
341                         // rapidity cut (reconstructed pt and identity)\r
342                                  if(!fTrackCuts->CheckYCut ((BothParticleSpecies_t)idRec)) continue;\r
343                   \r
344                   // Get true ID\r
345                   \r
346                   //if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) continue;          // FIXME: do we need a rapidity cut on the generated?\r
347                   // Fill histograms for primaries\r
348                   \r
349                                  if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTrue,  idGen, charge)->Fill(track->Pt(),dca); \r
350                   \r
351                                 if (isPrimary) \r
352                                 {\r
353                                         fHistMan->GetHistogram2D(kHistPtRecSigmaPrimary, idRec, charge)->Fill(track->Pt(),dca); \r
354                                         if(idGen != kSpUndefined) \r
355                                         {\r
356                                                 fHistMan->GetHistogram2D(kHistPtRecPrimary,      idGen, charge)->Fill(track->Pt(),dca);\r
357                                                 if (idRec == idGen) \r
358                                                         fHistMan->GetHistogram2D(kHistPtRecTruePrimary,  idGen, charge)->Fill(track->Pt(),dca); \r
359                                         }\r
360                                 }\r
361                                  //25th Apr - Muons are added to Pions -- FIXME\r
362                                 if ( pdgcode == 13 && idRec == kSpPion) \r
363                                 { \r
364                                         fHistMan->GetPtHistogram(kHistPtRecTrueMuonPlus)->Fill(track->Pt(),dca); \r
365                                         if(isPrimary)\r
366                                                 fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonPlus)->Fill(track->Pt(),dca); \r
367                                 }\r
368                                 if ( pdgcode == -13 && idRec == kSpPion) \r
369                                 { \r
370                                         fHistMan->GetPtHistogram(kHistPtRecTrueMuonMinus)->Fill(track->Pt(),dca); \r
371                                         if (isPrimary) \r
372                                         {\r
373                                                 fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonMinus)->Fill(track->Pt(),dca); \r
374                                         }\r
375                                 }\r
376                   \r
377                                  ///..... END FIXME\r
378                   \r
379                                 // Fill secondaries\r
380                                 if(isSecondaryWeak    )  \r
381                                         fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryWeakDecay, idRec, charge)->Fill(track->Pt(),dca);\r
382                                 if(isSecondaryMaterial)  \r
383                                         fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryMaterial , idRec, charge)->Fill(track->Pt(),dca);\r
384                   \r
385                         }//end if(arrayMC)\r
386                 }\r
387         \r
388         \r
389         } // end loop on tracks\r
390  // cout<< ntracks<<endl;\r
391   fHistMan->GetGenMulvsRawMulHistogram("hHistGenMulvsRawMul")->Fill(npar,ntracks);\r
392   PostData(1, fHistMan  );\r
393   PostData(2, fEventCuts);\r
394   PostData(3, fTrackCuts);\r
395   PostData(4, fPID      );\r
396 }\r
397 \r
398 //_________________________________________________________________\r
399 void   AliAnalysisTaskSpectraBoth::Terminate(Option_t *)\r
400 {\r
401   // Terminate\r
402 }\r