]>
Commit | Line | Data |
---|---|---|
c88234ad | 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 | // AliAnalysisTaskSpectraAOD 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 | |
6522a8cb | 30 | #include "AliVParticle.h"\r |
c88234ad | 31 | #include "AliAODEvent.h"\r |
32 | #include "AliAODInputHandler.h"\r | |
33 | #include "AliAnalysisTaskSpectraAOD.h"\r | |
34 | #include "AliAnalysisTaskESDfilter.h"\r | |
35 | #include "AliAnalysisDataContainer.h"\r | |
36 | #include "AliSpectraAODHistoManager.h"\r | |
37 | #include "AliSpectraAODTrackCuts.h"\r | |
38 | #include "AliSpectraAODEventCuts.h"\r | |
39 | #include "AliCentrality.h"\r | |
40 | #include "TProof.h"\r | |
41 | #include "AliPID.h"\r | |
42 | #include "AliVEvent.h"\r | |
43 | #include "AliPIDResponse.h"\r | |
823864bf | 44 | #include "AliStack.h"\r |
e8b0fe64 | 45 | #include "AliSpectraAODPID.h"\r |
9fcae40e | 46 | #include <TMCProcess.h>\r |
47 | \r | |
c88234ad | 48 | #include <iostream>\r |
49 | \r | |
823864bf | 50 | \r |
51 | \r | |
52 | \r | |
c88234ad | 53 | using namespace AliSpectraNameSpace;\r |
54 | using namespace std;\r | |
55 | \r | |
56 | ClassImp(AliAnalysisTaskSpectraAOD) // EX1 This stuff tells root to implement the streamer, inspector methods etc (we discussed about it today)\r | |
57 | \r | |
58 | //________________________________________________________________________\r | |
10a8ccbe | 59 | AliAnalysisTaskSpectraAOD::AliAnalysisTaskSpectraAOD(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fHistMan(0), fTrackCuts(0), fEventCuts(0), fPID(0), fIsMC(0), fNRebin(0)\r |
c88234ad | 60 | {\r |
823864bf | 61 | // Default constructor\r |
10a8ccbe | 62 | \r |
823864bf | 63 | DefineInput(0, TChain::Class());\r |
64 | DefineOutput(1, AliSpectraAODHistoManager::Class());\r | |
65 | DefineOutput(2, AliSpectraAODEventCuts::Class());\r | |
66 | DefineOutput(3, AliSpectraAODTrackCuts::Class());\r | |
e8b0fe64 | 67 | DefineOutput(4, AliSpectraAODPID::Class());\r |
10a8ccbe | 68 | fNRebin=0;\r |
69 | \r | |
c88234ad | 70 | }\r |
71 | //________________________________________________________________________\r | |
c88234ad | 72 | //________________________________________________________________________\r |
73 | void AliAnalysisTaskSpectraAOD::UserCreateOutputObjects()\r | |
74 | {\r | |
75 | // create output objects\r | |
10a8ccbe | 76 | fHistMan = new AliSpectraAODHistoManager("SpectraHistos",fNRebin);\r |
c88234ad | 77 | \r |
823864bf | 78 | if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");\r |
79 | if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");\r | |
e8b0fe64 | 80 | if (!fPID) AliFatal("PID object should be set in the steering macro");\r |
c88234ad | 81 | \r |
e8b0fe64 | 82 | PostData(1, fHistMan );\r |
823864bf | 83 | PostData(2, fEventCuts);\r |
84 | PostData(3, fTrackCuts);\r | |
e8b0fe64 | 85 | PostData(4, fPID );\r |
c88234ad | 86 | \r |
87 | }\r | |
88 | //________________________________________________________________________\r | |
89 | void AliAnalysisTaskSpectraAOD::UserExec(Option_t *)\r | |
90 | {\r | |
91 | // main event loop\r | |
1516046a | 92 | //Printf("ALIVE");\r |
823864bf | 93 | fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);\r |
59c903c0 | 94 | if (!fAOD) {\r |
95 | AliWarning("ERROR: AliAODEvent not available \n");\r | |
96 | return;\r | |
97 | }\r | |
98 | \r | |
823864bf | 99 | if (strcmp(fAOD->ClassName(), "AliAODEvent"))\r |
100 | {\r | |
c88234ad | 101 | AliFatal("Not processing AODs");\r |
823864bf | 102 | }\r |
103 | \r | |
f6a38178 | 104 | if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection\r |
105 | \r | |
e8b0fe64 | 106 | //AliCentrality fAliCentral*;\r |
107 | // if ((fAOD->GetCentrality())->GetCentralityPercentile("V0M") > 5.) return;\r | |
6eee0bf6 | 108 | \r |
e8b0fe64 | 109 | // First do MC to fill up the MC particle array, such that we can use it later\r |
110 | TClonesArray *arrayMC = 0;\r | |
111 | if (fIsMC)\r | |
112 | {\r | |
113 | arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());\r | |
114 | if (!arrayMC) {\r | |
115 | AliFatal("Error: MC particles branch not found!\n");\r | |
c88234ad | 116 | }\r |
e8b0fe64 | 117 | Int_t nMC = arrayMC->GetEntries();\r |
118 | for (Int_t iMC = 0; iMC < nMC; iMC++)\r | |
119 | {\r | |
120 | AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);\r | |
121 | if(!partMC->Charge()) continue;//Skip neutrals\r | |
00493191 | 122 | //if(partMC->Eta() > fTrackCuts->GetEtaMin() && partMC->Eta() < fTrackCuts->GetEtaMax()){//charged hadron are filled inside the eta acceptance\r |
123 | //Printf("%f %f-%f",partMC->Eta(),fTrackCuts->GetEtaMin(),fTrackCuts->GetEtaMax());\r | |
124 | if(partMC->Eta() < fTrackCuts->GetEtaMin() || partMC->Eta() > fTrackCuts->GetEtaMax())continue;//ETA CUT ON GENERATED!!!!!!!!!!!!!!!!!!!!!!!!!!\r | |
125 | fHistMan->GetPtHistogram(kHistPtGen)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());\r | |
126 | \r | |
e9c44a2a | 127 | //rapidity cut\r |
e8b0fe64 | 128 | if(TMath::Abs(partMC->Y()) > fTrackCuts->GetY() ) continue; \r |
129 | // check for true PID + and fill P_t histos \r | |
130 | Int_t charge = partMC->Charge() > 0 ? kChPos : kChNeg ;\r | |
131 | Int_t id = fPID->GetParticleSpecie(partMC);\r | |
132 | if(id != kSpUndefined) {\r | |
133 | fHistMan->GetHistogram2D(kHistPtGenTruePrimary,id,charge)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());\r | |
823864bf | 134 | }\r |
e8b0fe64 | 135 | }\r |
136 | }\r | |
6da07d74 | 137 | \r |
e8b0fe64 | 138 | //main loop on tracks\r |
139 | for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {\r | |
140 | AliAODTrack* track = fAOD->GetTrack(iTracks);\r | |
decf69d9 | 141 | if (!fTrackCuts->IsSelected(track,kTRUE)) continue;\r |
e8b0fe64 | 142 | \r |
143 | fPID->FillQAHistos(fHistMan, track, fTrackCuts);\r | |
6da07d74 | 144 | \r |
e8b0fe64 | 145 | //calculate DCA for AOD track\r |
9fcae40e | 146 | Double_t dca=track->DCA();\r |
b150ea7e | 147 | if(dca==-999.){// track->DCA() does not work in old AOD production\r |
148 | Double_t d[2], covd[3];\r | |
149 | AliAODTrack* track_clone=(AliAODTrack*)track->Clone("track_clone"); // need to clone because PropagateToDCA updates the track parameters\r | |
150 | Bool_t isDCA = track_clone->PropagateToDCA(fAOD->GetPrimaryVertex(),fAOD->GetMagneticField(),9999.,d,covd);\r | |
151 | delete track_clone;\r | |
152 | if(!isDCA)d[0]=-999.;\r | |
153 | dca=d[0];\r | |
154 | }\r | |
9fcae40e | 155 | fHistMan->GetPtHistogram(kHistPtRec)->Fill(track->Pt(),dca); // PT histo\r |
6da07d74 | 156 | \r |
e8b0fe64 | 157 | // get identity and charge\r |
972a21ad | 158 | Int_t idRec = fPID->GetParticleSpecie(fHistMan,track, fTrackCuts);\r |
6da07d74 | 159 | \r |
e9c44a2a | 160 | Int_t charge = track->Charge() > 0 ? kChPos : kChNeg;\r |
6da07d74 | 161 | \r |
e9c44a2a | 162 | // Fill histograms, only if inside y and nsigma acceptance\r |
9fcae40e | 163 | if(idRec != kSpUndefined && fTrackCuts->CheckYCut ((AODParticleSpecies_t)idRec))fHistMan->GetHistogram2D(kHistPtRecSigma,idRec,charge)->Fill(track->Pt(),dca);\r |
e9c44a2a | 164 | //can't put a continue because we still have to fill allcharged primaries, done later\r |
6da07d74 | 165 | \r |
e8b0fe64 | 166 | /* MC Part */\r |
167 | if (arrayMC) {\r | |
168 | AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));\r | |
169 | if (!partMC) { \r | |
170 | AliError("Cannot get MC particle");\r | |
171 | continue; \r | |
172 | }\r | |
173 | // Check if it is primary, secondary from material or secondary from weak decay\r | |
174 | Bool_t isPrimary = partMC->IsPhysicalPrimary();\r | |
175 | Bool_t isSecondaryMaterial = kFALSE; \r | |
176 | Bool_t isSecondaryWeak = kFALSE; \r | |
177 | if(!isPrimary) {\r | |
178 | Int_t mfl=-999,codemoth=-999;\r | |
179 | Int_t indexMoth=partMC->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()\r | |
180 | if(indexMoth>=0){//is not fake\r | |
181 | AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);\r | |
182 | codemoth = TMath::Abs(moth->GetPdgCode());\r | |
183 | mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));\r | |
184 | }\r | |
ae0fdd7d | 185 | //Int_t uniqueID = partMC->GetUniqueID();\r |
00493191 | 186 | //cout<<"uniqueID: "<<partMC->GetUniqueID()<<" "<<kPDecay<<endl;\r |
187 | //cout<<"status: "<<partMC->GetStatus()<<" "<<kPDecay<<endl;\r | |
9fcae40e | 188 | // if(uniqueID == kPDecay)Printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");\r |
e8b0fe64 | 189 | if(mfl==3) isSecondaryWeak = kTRUE; // add if(partMC->GetStatus() & kPDecay)? FIXME\r |
190 | else isSecondaryMaterial = kTRUE;\r | |
191 | }\r | |
6da07d74 | 192 | \r |
9fcae40e | 193 | if (isPrimary)fHistMan->GetPtHistogram(kHistPtRecPrimary)->Fill(track->Pt(),dca); // PT histo of primaries\r |
e9c44a2a | 194 | \r |
195 | //nsigma cut (reconstructed nsigma)\r | |
196 | if(idRec == kSpUndefined) continue;\r | |
197 | \r | |
198 | // rapidity cut (reconstructed pt and identity)\r | |
199 | if(!fTrackCuts->CheckYCut ((AODParticleSpecies_t)idRec)) continue;\r | |
200 | \r | |
e8b0fe64 | 201 | // Get true ID\r |
6da07d74 | 202 | Int_t idGen = fPID->GetParticleSpecie(partMC);\r |
203 | //if(TMath::Abs(partMC->Y()) > fTrackCuts->GetY() ) continue; // FIXME: do we need a rapidity cut on the generated?\r | |
e8b0fe64 | 204 | // Fill histograms for primaries\r |
e9c44a2a | 205 | \r |
9fcae40e | 206 | if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTrue, idGen, charge)->Fill(track->Pt(),dca); \r |
e9c44a2a | 207 | \r |
208 | if (isPrimary) {\r | |
9fcae40e | 209 | fHistMan ->GetHistogram2D(kHistPtRecSigmaPrimary, idRec, charge)->Fill(track->Pt(),dca); \r |
e9c44a2a | 210 | if(idGen != kSpUndefined) {\r |
9fcae40e | 211 | fHistMan ->GetHistogram2D(kHistPtRecPrimary, idGen, charge)->Fill(track->Pt(),dca);\r |
212 | if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTruePrimary, idGen, charge)->Fill(track->Pt(),dca); \r | |
f6a38178 | 213 | }\r |
e8b0fe64 | 214 | }\r |
215 | //25th Apr - Muons are added to Pions -- FIXME\r | |
216 | if ( partMC->PdgCode() == 13 && idRec == kSpPion) { \r | |
9fcae40e | 217 | fHistMan->GetPtHistogram(kHistPtRecTrueMuonPlus)->Fill(track->Pt(),dca); \r |
e8b0fe64 | 218 | if(isPrimary)\r |
9fcae40e | 219 | fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonPlus)->Fill(track->Pt(),dca); \r |
e8b0fe64 | 220 | }\r |
221 | if ( partMC->PdgCode() == -13 && idRec == kSpPion) { \r | |
9fcae40e | 222 | fHistMan->GetPtHistogram(kHistPtRecTrueMuonMinus)->Fill(track->Pt(),dca); \r |
e8b0fe64 | 223 | if (isPrimary) {\r |
9fcae40e | 224 | fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonMinus)->Fill(track->Pt(),dca); \r |
e8b0fe64 | 225 | }\r |
226 | }\r | |
6da07d74 | 227 | \r |
e8b0fe64 | 228 | ///..... END FIXME\r |
f6a38178 | 229 | \r |
e8b0fe64 | 230 | // Fill secondaries\r |
9fcae40e | 231 | if(isSecondaryWeak ) fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryWeakDecay, idRec, charge)->Fill(track->Pt(),dca);\r |
232 | if(isSecondaryMaterial) fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryMaterial , idRec, charge)->Fill(track->Pt(),dca);\r | |
f6a38178 | 233 | \r |
e8b0fe64 | 234 | }//end if(arrayMC)\r |
235 | } // end loop on tracks\r | |
236 | \r | |
97b01bb0 | 237 | PostData(1, fHistMan );\r |
823864bf | 238 | PostData(2, fEventCuts);\r |
239 | PostData(3, fTrackCuts);\r | |
97b01bb0 | 240 | PostData(4, fPID );\r |
c88234ad | 241 | }\r |
823864bf | 242 | \r |
c88234ad | 243 | //_________________________________________________________________\r |
244 | void AliAnalysisTaskSpectraAOD::Terminate(Option_t *)\r | |
245 | {\r | |
823864bf | 246 | // Terminate\r |
c88234ad | 247 | }\r |