]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/PiKaPr/TestAOD/AliAnalysisTaskSpectraAOD.cxx
update to AOD analysis
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TestAOD / AliAnalysisTaskSpectraAOD.cxx
CommitLineData
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
30#include "AliAODEvent.h"\r
31#include "AliAODInputHandler.h"\r
32#include "AliAnalysisTaskSpectraAOD.h"\r
33#include "AliAnalysisTaskESDfilter.h"\r
34#include "AliAnalysisDataContainer.h"\r
35#include "AliSpectraAODHistoManager.h"\r
36#include "AliSpectraAODTrackCuts.h"\r
37#include "AliSpectraAODEventCuts.h"\r
38#include "AliCentrality.h"\r
39#include "TProof.h"\r
40#include "AliPID.h"\r
41#include "AliVEvent.h"\r
42#include "AliPIDResponse.h"\r
823864bf 43#include "AliStack.h"\r
c88234ad 44#include <iostream>\r
45\r
823864bf 46\r
47\r
48\r
c88234ad 49using namespace AliSpectraNameSpace;\r
50using namespace std;\r
51\r
52ClassImp(AliAnalysisTaskSpectraAOD) // EX1 This stuff tells root to implement the streamer, inspector methods etc (we discussed about it today)\r
53\r
54//________________________________________________________________________\r
55AliAnalysisTaskSpectraAOD::AliAnalysisTaskSpectraAOD(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fHistMan(0), fTrackCuts(0), fEventCuts(0), fIsMC(0), fPIDResponse(0), fNSigmaPID(0), fYCut(0)\r
56{\r
823864bf 57 // Default constructor\r
58 fNSigmaPID = 3.;\r
59 fYCut = .5;\r
60 DefineInput(0, TChain::Class());\r
61 DefineOutput(1, AliSpectraAODHistoManager::Class());\r
62 DefineOutput(2, AliSpectraAODEventCuts::Class());\r
63 DefineOutput(3, AliSpectraAODTrackCuts::Class());\r
c88234ad 64\r
65}\r
66//________________________________________________________________________\r
67Bool_t AliAnalysisTaskSpectraAOD::CheckYCut(AODParticleSpecies_t species, AliAODTrack* track) const\r
68{\r
823864bf 69 // check if the rapidity is within the set range\r
70 // note: masses are hardcoded for now. we could look them up in the pdg database, but that would mean accecing it 100k+ times per run ...\r
71 Double_t y;\r
72 if (species == kProton) { y = track->Y(9.38271999999999995e-01); }\r
73 if ( species == kKaon ) { y = track->Y(4.93676999999999977e-01); }\r
74 if ( species == kPion) { y = track->Y(1.39570000000000000e-01); }\r
75 if (TMath::Abs(y) > fYCut || y < -998.) return kFALSE;\r
76 return kTRUE;\r
c88234ad 77}\r
78//____________________________________________________________________________\r
79Bool_t AliAnalysisTaskSpectraAOD::CheckYCut(AliAODMCParticle* particle) const\r
80{\r
823864bf 81 // check if the rapidity is within the set range\r
82 Double_t y = particle->Y();\r
83 if (TMath::Abs(y) > fYCut || y < -998.) return kFALSE;\r
84 return kTRUE;\r
c88234ad 85}\r
86//________________________________________________________________________\r
87void AliAnalysisTaskSpectraAOD::UserCreateOutputObjects()\r
88{\r
89 // create output objects\r
823864bf 90 fHistMan = new AliSpectraAODHistoManager("SpectraHistos");\r
c88234ad 91\r
823864bf 92 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");\r
93 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");\r
c88234ad 94\r
823864bf 95 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();\r
96 AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());\r
97 fPIDResponse = inputHandler->GetPIDResponse();\r
c88234ad 98\r
823864bf 99 PostData(1, fHistMan);\r
100 PostData(2, fEventCuts);\r
101 PostData(3, fTrackCuts);\r
c88234ad 102\r
103}\r
104//________________________________________________________________________\r
105void AliAnalysisTaskSpectraAOD::UserExec(Option_t *)\r
106{\r
107 // main event loop\r
823864bf 108 fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);\r
109 if (strcmp(fAOD->ClassName(), "AliAODEvent"))\r
110 {\r
c88234ad 111 AliFatal("Not processing AODs");\r
823864bf 112 }\r
113 \r
114 if(!fPIDResponse) {\r
115 AliError("Cannot get pid response");\r
116 return;\r
117 }\r
118 \r
119 //Selection on QVector, before ANY other selection on the event\r
120 //Spectra MUST be normalized wrt events AFTER the selection on Qvector\r
121 // Can we include this in fEventCuts\r
122 Double_t Qx2EtaPos = 0, Qy2EtaPos = 0;\r
123 Double_t Qx2EtaNeg = 0, Qy2EtaNeg = 0;\r
124 Int_t multPos = 0;\r
125 Int_t multNeg = 0;\r
126 for(Int_t iT = 0; iT < fAOD->GetNumberOfTracks(); iT++) {\r
127 AliAODTrack* aodTrack = fAOD->GetTrack(iT);\r
128 if (!fTrackCuts->IsSelected(aodTrack)) continue;\r
129 if (aodTrack->Eta() >= 0){\r
130 multPos++;\r
131 Qx2EtaPos += TMath::Cos(2*aodTrack->Phi()); \r
132 Qy2EtaPos += TMath::Sin(2*aodTrack->Phi());\r
133 } else {\r
134 multNeg++;\r
135 Qx2EtaNeg += TMath::Cos(2*aodTrack->Phi()); \r
136 Qy2EtaNeg += TMath::Sin(2*aodTrack->Phi());\r
137 }\r
138 } \r
139 Double_t qPos = TMath::Sqrt((Qx2EtaPos*Qx2EtaPos + Qy2EtaPos*Qy2EtaPos)/multPos);\r
140 Double_t qNeg = TMath::Sqrt((Qx2EtaNeg*Qx2EtaNeg + Qy2EtaNeg*Qy2EtaNeg)/multNeg);\r
141 if((qPos>fTrackCuts->GetQvecMin() && qPos<fTrackCuts->GetQvecMax()) || (qNeg>fTrackCuts->GetQvecMin() && qNeg<fTrackCuts->GetQvecMax())){\r
142 \r
143 //check on centrality distribution\r
144 fHistMan->GetPtHistogram("CentCheck")->Fill(fAOD->GetCentrality()->GetCentralityPercentile("V0M"),fAOD->GetHeader()->GetCentralityP()->GetCentralityPercentileUnchecked("V0M"));\r
145 \r
146 if (!fEventCuts->IsSelected(fAOD)) return;\r
147 \r
148 //fill q distributions vs centrality, after all event selection\r
149 fHistMan->GetqVecHistogram(kHistqVecPos)->Fill(qPos,fAOD->GetCentrality()->GetCentralityPercentile("V0M")); // qVector distribution\r
150 fHistMan->GetqVecHistogram(kHistqVecNeg)->Fill(qNeg,fAOD->GetCentrality()->GetCentralityPercentile("V0M")); // qVector distribution\r
151 \r
152 //AliCentrality fAliCentral*;\r
153 // if ((fAOD->GetCentrality())->GetCentralityPercentile("V0M") > 5.) return;\r
154 \r
155 // First do MC to fill up the MC particle array, such that we can use it later\r
156 TClonesArray *arrayMC = 0;\r
157 if (fIsMC)\r
c88234ad 158 {\r
823864bf 159 arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());\r
160 if (!arrayMC) {\r
161 AliFatal("Error: MC particles branch not found!\n");\r
162 }\r
163 Int_t nMC = arrayMC->GetEntries();\r
164 for (Int_t iMC = 0; iMC < nMC; iMC++)\r
165 {\r
166 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);\r
167 fHistMan->GetPtHistogram(kHistPtGen)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());\r
168 \r
169 if(TMath::Abs(partMC->Eta()) > fTrackCuts->GetEta()) continue;\r
170 // check for true PID + and fill P_t histos \r
171 //if (partMC->IsPhysicalPrimary() && CheckYCut(partMC) ) {// only primary vertices and y cut satisfied\r
172 if (CheckYCut(partMC) ){// only primary vertices and y cut satisfied\r
173 if ( partMC->PdgCode() == 2212) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryProtonPlus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
174 if ( partMC->PdgCode() == -2212) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryProtonMinus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
175 if ( partMC->PdgCode() == 321) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryKaonPlus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
176 if ( partMC->PdgCode() == -321) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryKaonMinus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
177 if ( partMC->PdgCode() == 211) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryPionPlus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
178 if ( partMC->PdgCode() == -211) { fHistMan->GetPtHistogram(kHistPtGenTruePrimaryPionMinus)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary()); } \r
179 }\r
180 }\r
c88234ad 181 }\r
823864bf 182 \r
183 \r
184 \r
185 //main loop on tracks\r
186 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++)\r
187 {\r
c88234ad 188 \r
823864bf 189 AliAODTrack* track = fAOD->GetTrack(iTracks);\r
190 if (!fTrackCuts->IsSelected(track)) continue;\r
191 \r
192 //cut on q vectors track-by-track\r
193 if ((qPos>fTrackCuts->GetQvecMin() && qPos<fTrackCuts->GetQvecMax() && track->Eta()<0) || (qNeg>fTrackCuts->GetQvecMin() && qNeg<fTrackCuts->GetQvecMax() && track->Eta()>=0)){\r
194 \r
195 //calculate DCA for AOD track\r
196 Double_t d[2], covd[3];\r
197 AliAODTrack* track_clone=(AliAODTrack*)track->Clone("track_clone"); // need to clone because PropagateToDCA updates the track parameters\r
198 Bool_t isDCA = track_clone->PropagateToDCA(fAOD->GetPrimaryVertex(),fAOD->GetMagneticField(),9999.,d,covd);\r
199 delete track_clone;\r
200 if(!isDCA)d[0]=-999;\r
c88234ad 201\r
823864bf 202 fHistMan->GetPtHistogram(kHistPtRec)->Fill(track->Pt(),d[0]); // PT histo\r
203 //Response\r
204 fHistMan->GetPIDHistogram(kHistPIDTPC)->Fill(track->GetTPCmomentum(), track->GetTPCsignal()*track->Charge()); // PID histo\r
205 fHistMan->GetPIDHistogram(kHistPIDTOF)->Fill(track->P(),track->GetTOFsignal()); // PID histo\r
206 \r
207 AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(track);\r
208 Double_t nsigmaTPCkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));\r
209 Double_t nsigmaTPCkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)); \r
210 Double_t nsigmaTPCkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)); \r
211 Double_t nsigmaTOFkProton=0,nsigmaTOFkKaon=0,nsigmaTOFkPion=0;\r
212 if(track->Pt()>fTrackCuts->GetPtTOFMatching()){\r
213 nsigmaTOFkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));\r
214 nsigmaTOFkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon)); \r
215 nsigmaTOFkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion)); \r
216 \r
217 //TOF\r
218 fHistMan->GetPtHistogram(kHistNSigProtonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));\r
219 fHistMan->GetPtHistogram(kHistNSigKaonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));\r
220 fHistMan->GetPtHistogram(kHistNSigPionTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));\r
221 fHistMan->GetPtHistogram(kHistNSigProtonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));\r
222 fHistMan->GetPtHistogram(kHistNSigKaonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));\r
223 fHistMan->GetPtHistogram(kHistNSigPionPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));\r
224 }\r
225 \r
226 Double_t nsigmaTPCTOFkProton = TMath::Sqrt(nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton);\r
227 Double_t nsigmaTPCTOFkKaon = TMath::Sqrt(nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon);\r
228 Double_t nsigmaTPCTOFkPion = TMath::Sqrt(nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion);\r
229 \r
230 //TPC\r
231 fHistMan->GetPtHistogram(kHistNSigProtonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));\r
232 fHistMan->GetPtHistogram(kHistNSigKaonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon));\r
233 fHistMan->GetPtHistogram(kHistNSigPionTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion));\r
234 fHistMan->GetPtHistogram(kHistNSigProtonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));\r
235 fHistMan->GetPtHistogram(kHistNSigKaonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon));\r
236 fHistMan->GetPtHistogram(kHistNSigPionPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion));\r
237 //TPCTOF\r
238 fHistMan->GetPtHistogram(kHistNSigProtonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkProton);\r
239 fHistMan->GetPtHistogram(kHistNSigKaonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkKaon);\r
240 fHistMan->GetPtHistogram(kHistNSigPionTPCTOF)->Fill(track->P(),nsigmaTPCTOFkPion);\r
241 fHistMan->GetPtHistogram(kHistNSigProtonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkProton);\r
242 fHistMan->GetPtHistogram(kHistNSigKaonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkKaon);\r
243 fHistMan->GetPtHistogram(kHistNSigPionPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkPion);\r
244 \r
245 \r
246 if( ( nsigmaTPCTOFkKaon < nsigmaTPCTOFkPion ) && ( nsigmaTPCTOFkKaon < nsigmaTPCTOFkProton )) { \r
247 if ((nsigmaTPCTOFkKaon > fNSigmaPID) || (!CheckYCut(kKaon, track) ) ) continue;\r
248 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaKaonPlus)->Fill(track->Pt(),d[0]); } \r
249 else { fHistMan->GetPtHistogram(kHistPtRecSigmaKaonMinus)->Fill(track->Pt(),d[0]); } \r
250 }\r
251 if( ( nsigmaTPCTOFkProton < nsigmaTPCTOFkKaon ) && ( nsigmaTPCTOFkProton < nsigmaTPCTOFkPion ) ) {\r
252 if ( nsigmaTPCTOFkProton > fNSigmaPID || (!CheckYCut(kProton, track) ) ) continue;\r
253 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaProtonPlus)->Fill(track->Pt(),d[0]); }\r
254 else { fHistMan->GetPtHistogram(kHistPtRecSigmaProtonMinus)->Fill(track->Pt(),d[0]); }\r
255 }\r
256 if( (nsigmaTPCTOFkPion < nsigmaTPCTOFkProton ) && ( nsigmaTPCTOFkPion < nsigmaTPCTOFkKaon ) ) {\r
257 if (nsigmaTPCTOFkPion > fNSigmaPID || (!CheckYCut(kPion, track) ) ) continue;\r
258 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaPionPlus)->Fill(track->Pt(),d[0]); }\r
259 else { fHistMan->GetPtHistogram(kHistPtRecSigmaPionMinus)->Fill(track->Pt(),d[0]); }\r
260 }\r
261 /* MC Part */\r
262 // MF 22/02/2012\r
263 // fill mc DCA vs pt\r
264 if (arrayMC) {\r
265 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));\r
266 if (!partMC) { \r
267 AliError("Cannot get MC particle");\r
268 continue; }\r
269 if (CheckYCut(partMC)) {\r
270 // primaries, true pid\r
271 if ( partMC->PdgCode() == 2212) { fHistMan->GetPtHistogram(kHistPtRecTrueProtonPlus)->Fill(track->Pt(),d[0]); \r
272 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryProtonPlus)->Fill(track->Pt(),d[0]); }}\r
273 if ( partMC->PdgCode() == -2212) { fHistMan->GetPtHistogram(kHistPtRecTrueProtonMinus)->Fill(track->Pt(),d[0]); \r
274 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryProtonMinus)->Fill(track->Pt(),d[0]); }}\r
275 if ( partMC->PdgCode() == 321) { fHistMan->GetPtHistogram(kHistPtRecTrueKaonPlus)->Fill(track->Pt(),d[0]); \r
276 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryKaonPlus)->Fill(track->Pt(),d[0]); }}\r
277 if ( partMC->PdgCode() == -321) { fHistMan->GetPtHistogram(kHistPtRecTrueKaonMinus)->Fill(track->Pt(),d[0]); \r
278 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryKaonMinus)->Fill(track->Pt(),d[0]); }}\r
279 if ( partMC->PdgCode() == 211) { fHistMan->GetPtHistogram(kHistPtRecTruePionPlus)->Fill(track->Pt(),d[0]); \r
280 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryPionPlus)->Fill(track->Pt(),d[0]); }}\r
281 if ( partMC->PdgCode() == -211) { fHistMan->GetPtHistogram(kHistPtRecTruePionMinus)->Fill(track->Pt(),d[0]); \r
282 if (partMC->IsPhysicalPrimary()) {fHistMan->GetPtHistogram(kHistPtRecTruePrimaryPionMinus)->Fill(track->Pt(),d[0]); }}\r
283 \r
284 // primaries, sigma pid \r
285 if (partMC->IsPhysicalPrimary()) { \r
286 if( ( nsigmaTPCTOFkKaon < nsigmaTPCTOFkPion ) && ( nsigmaTPCTOFkKaon < nsigmaTPCTOFkProton ) ) {\r
287 if ( (nsigmaTPCTOFkKaon > fNSigmaPID ) || (!CheckYCut(kKaon, track) ) ) continue; \r
288 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryKaonPlus)->Fill(track->Pt(),d[0]); } \r
289 else { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryKaonMinus)->Fill(track->Pt(),d[0]); } \r
290 }\r
291 if( ( nsigmaTPCTOFkProton < nsigmaTPCTOFkKaon ) && ( nsigmaTPCTOFkProton < nsigmaTPCTOFkPion ) ) {\r
292 if ( (nsigmaTPCTOFkProton > fNSigmaPID ) || (!CheckYCut(kProton, track) ) ) continue;\r
293 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryProtonPlus)->Fill(track->Pt(),d[0]); }\r
294 else { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryProtonMinus)->Fill(track->Pt(),d[0]); }\r
295 }\r
296 if( (nsigmaTPCTOFkPion < nsigmaTPCTOFkProton ) && ( nsigmaTPCTOFkPion < nsigmaTPCTOFkKaon ) ) {\r
297 if ( ( nsigmaTPCTOFkPion > fNSigmaPID ) || (!CheckYCut(kPion, track) ) ) continue;\r
298 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryPionPlus)->Fill(track->Pt(),d[0]); }\r
299 else { fHistMan->GetPtHistogram(kHistPtRecSigmaPrimaryPionMinus)->Fill(track->Pt(),d[0]); }\r
300 }\r
301 }//end if primaries\r
302 // MF 22/02/2012\r
303 // Distinguish weak decay and material\r
304 //done quickly, code can be improved\r
305 else {//to be added in a separate class\r
306 Int_t mfl=-999,uniqueID=-999;\r
307 Int_t indexMoth=partMC->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()\r
308 if(indexMoth>=0){//is not fake\r
309 AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);\r
310 Float_t codemoth = TMath::Abs(moth->GetPdgCode());\r
311 mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));\r
312 }\r
313 uniqueID = partMC->GetUniqueID();\r
314 //if(mfl==3 && uniqueID == kPDecay){//strangeness KPDecay not working on AOD, to be understood\r
315 if(mfl==3){//strangeness\r
316 if( ( nsigmaTPCkKaon < nsigmaTPCkPion ) && ( nsigmaTPCkKaon < nsigmaTPCkProton ) ) { \r
317 if ( (nsigmaTPCkKaon > fNSigmaPID ) || (!CheckYCut(kKaon, track) ) ) continue;\r
318 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayKaonPlus)->Fill(track->Pt(),d[0]); } \r
319 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayKaonMinus)->Fill(track->Pt(),d[0]); } \r
320 }\r
321 if( ( nsigmaTPCkProton < nsigmaTPCkKaon ) && ( nsigmaTPCkProton < nsigmaTPCkPion ) ) {\r
322 if ( (nsigmaTPCkProton > fNSigmaPID ) || (!CheckYCut(kProton, track) ) ) continue;\r
323 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayProtonPlus)->Fill(track->Pt(),d[0]); }\r
324 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayProtonMinus)->Fill(track->Pt(),d[0]); }\r
325 }\r
326 if( (nsigmaTPCkPion < nsigmaTPCkProton ) && ( nsigmaTPCkPion < nsigmaTPCkKaon ) ) {\r
327 if ( ( nsigmaTPCkPion > fNSigmaPID ) || (!CheckYCut(kPion, track) ) ) continue;\r
328 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayPionPlus)->Fill(track->Pt(),d[0]); }\r
329 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryWeakDecayPionMinus)->Fill(track->Pt(),d[0]); }\r
330 }\r
331 }//end if strangeness\r
332 else{//material\r
333 if( ( nsigmaTPCkKaon < nsigmaTPCkPion ) && ( nsigmaTPCkKaon < nsigmaTPCkProton ) ) { \r
334 if ( (nsigmaTPCkKaon > fNSigmaPID ) || (!CheckYCut(kKaon, track) ) ) continue;\r
335 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialKaonPlus)->Fill(track->Pt(),d[0]); } \r
336 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialKaonMinus)->Fill(track->Pt(),d[0]); } \r
337 }\r
338 if( ( nsigmaTPCkProton < nsigmaTPCkKaon ) && ( nsigmaTPCkProton < nsigmaTPCkPion ) ) {\r
339 if ( (nsigmaTPCkProton > fNSigmaPID ) || (!CheckYCut(kProton, track) ) ) continue;\r
340 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialProtonPlus)->Fill(track->Pt(),d[0]); }\r
341 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialProtonMinus)->Fill(track->Pt(),d[0]); }\r
342 }\r
343 if( (nsigmaTPCkPion < nsigmaTPCkProton ) && ( nsigmaTPCkPion < nsigmaTPCkKaon ) ) {\r
344 if ( ( nsigmaTPCkPion > fNSigmaPID ) || (!CheckYCut(kPion, track) ) ) continue;\r
345 if ( track->Charge() > 0 ) { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialPionPlus)->Fill(track->Pt(),d[0]); }\r
346 else { fHistMan->GetPtHistogram(kHistPtRecSigmaSecondaryMaterialPionMinus)->Fill(track->Pt(),d[0]); }\r
347 }\r
348 }//end if material\r
349 }//end else (IsPhysPrim)\r
350 }//end if(CheckY)\r
351 }//end if(arrayMC)\r
352 }//end if on q vector (track)\r
353 } // end loop on tracks\r
354 }//end if on q vector (event)\r
355 PostData(1, fHistMan);\r
356 PostData(2, fEventCuts);\r
357 PostData(3, fTrackCuts);\r
c88234ad 358}\r
823864bf 359\r
c88234ad 360//_________________________________________________________________\r
361void AliAnalysisTaskSpectraAOD::Terminate(Option_t *)\r
362{\r
823864bf 363 // Terminate\r
c88234ad 364}\r