1 /**************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 //-----------------------------------------------------------------
17 // AliAnalysisTaskSpectraAllChNanoAOD class
18 // NanoAOD edition: this is only meant to test the developement
19 // version of NanoAODs
21 //-----------------------------------------------------------------
28 #include "THnSparse.h"
30 #include "AliAnalysisTask.h"
31 #include "AliAODTrack.h"
32 #include "AliAODMCParticle.h"
33 #include "AliVParticle.h"
34 #include "AliAODEvent.h"
35 #include "AliAODInputHandler.h"
36 #include "AliAnalysisTaskSpectraAllChNanoAOD.h"
37 #include "AliAnalysisTaskESDfilter.h"
38 #include "AliAnalysisDataContainer.h"
39 #include "AliSpectraAODTrackCuts.h"
40 #include "AliSpectraAODEventCuts.h"
41 #include "AliHelperPID.h"
42 #include "AliPIDCombined.h"
43 #include "AliCentrality.h"
45 #include "AliVEvent.h"
47 #include <TMCProcess.h>
50 #include "AliNanoAODHeader.h"
51 #include "AliNanoAODTrack.h"
53 using namespace AliHelperPIDNameSpace;
56 ClassImp(AliAnalysisTaskSpectraAllChNanoAOD)
58 //________________________________________________________________________
59 AliAnalysisTaskSpectraAllChNanoAOD::AliAnalysisTaskSpectraAllChNanoAOD(const char *name) : AliAnalysisTaskSE(name),
74 // Default constructor
75 DefineInput(0, TChain::Class());
76 DefineOutput(1, TList::Class());
77 DefineOutput(2, AliSpectraAODEventCuts::Class());
78 DefineOutput(3, AliSpectraAODTrackCuts::Class());
79 DefineOutput(4, AliHelperPID::Class());
82 //________________________________________________________________________
83 void AliAnalysisTaskSpectraAllChNanoAOD::UserCreateOutputObjects()
85 // create output objects
88 fOutput->SetName("fOutput");
90 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
91 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
92 if (!fHelperPID) AliFatal("HelperPID should be set in the steering macro");
94 // binning common to all the THn
95 const Double_t ptBins[] = {0.20,0.30,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.4,2.8,3.2,3.6,4.0,5.0,6.0,7.0,8.0,9.0,10.,12.,15.};
96 const Int_t nptBins=26;
98 //dimensions of THnSparse for tracks
99 const Int_t nvartrk=8;
100 // pt cent Q vec IDrec IDgen isph iswd y
101 Int_t binsHistRealTrk[nvartrk] = { nptBins, fnCentBins, fnQvecBins, 4, 3, 2, 2, 2};
102 Double_t xminHistRealTrk[nvartrk] = { 0., 0., 0., -.5, -0.5, -0.5, -0.5, -0.5};
103 Double_t xmaxHistRealTrk[nvartrk] = { 10., 100., 8., 3.5, 2.5, 1.5, 1.5, 0.5};
104 THnSparseF* NSparseHistTrk = new THnSparseF("NSparseHistTrk","NSparseHistTrk",nvartrk,binsHistRealTrk,xminHistRealTrk,xmaxHistRealTrk);
105 NSparseHistTrk->GetAxis(0)->SetTitle("#it{p}_{T,rec}");
106 NSparseHistTrk->GetAxis(0)->SetName("pT_rec");
107 NSparseHistTrk->SetBinEdges(0,ptBins);
108 NSparseHistTrk->GetAxis(1)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
109 NSparseHistTrk->GetAxis(1)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
110 NSparseHistTrk->GetAxis(2)->SetTitle("Q vec");
111 NSparseHistTrk->GetAxis(2)->SetName("Q_vec");
112 NSparseHistTrk->GetAxis(3)->SetTitle("ID rec");
113 NSparseHistTrk->GetAxis(3)->SetName("ID_rec");
114 NSparseHistTrk->GetAxis(4)->SetTitle("ID gen");
115 NSparseHistTrk->GetAxis(4)->SetName("ID_gen");
116 NSparseHistTrk->GetAxis(5)->SetTitle("isph");
117 NSparseHistTrk->GetAxis(5)->SetName("isph");
118 NSparseHistTrk->GetAxis(6)->SetTitle("iswd");
119 NSparseHistTrk->GetAxis(6)->SetName("iswd");
120 NSparseHistTrk->GetAxis(7)->SetTitle("y");
121 NSparseHistTrk->GetAxis(7)->SetName("y");
122 fOutput->Add(NSparseHistTrk);
124 //dimensions of THnSparse for stack
125 const Int_t nvarst=5;
126 // pt cent IDgen isph y
127 Int_t binsHistRealSt[nvarst] = { nptBins, fnCentBins, 3, 2, 2};
128 Double_t xminHistRealSt[nvarst] = { 0., 0., -0.5, -0.5, -0.5};
129 Double_t xmaxHistRealSt[nvarst] = { 10., 100., 2.5, 1.5, 0.5};
130 THnSparseF* NSparseHistSt = new THnSparseF("NSparseHistSt","NSparseHistSt",nvarst,binsHistRealSt,xminHistRealSt,xmaxHistRealSt);
131 NSparseHistSt->GetAxis(0)->SetTitle("#it{p}_{T,gen}");
132 NSparseHistSt->SetBinEdges(0,ptBins);
133 NSparseHistSt->GetAxis(0)->SetName("pT_rec");
134 NSparseHistSt->GetAxis(1)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
135 NSparseHistSt->GetAxis(1)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
136 NSparseHistSt->GetAxis(2)->SetTitle("ID gen");
137 NSparseHistSt->GetAxis(2)->SetName("ID_gen");
138 NSparseHistSt->GetAxis(3)->SetTitle("isph");
139 NSparseHistSt->GetAxis(3)->SetName("isph");
140 NSparseHistSt->GetAxis(4)->SetTitle("y");
141 NSparseHistSt->GetAxis(4)->SetName("y");
142 fOutput->Add(NSparseHistSt);
144 //dimensions of THnSparse for the normalization
145 const Int_t nvarev=3;
147 Int_t binsHistRealEv[nvarev] = { fnCentBins, fnQvecBins, fnNchBins};
148 Double_t xminHistRealEv[nvarev] = { 0., 0., 0.};
149 Double_t xmaxHistRealEv[nvarev] = { 100., 8., 2000.};
150 THnSparseF* NSparseHistEv = new THnSparseF("NSparseHistEv","NSparseHistEv",nvarev,binsHistRealEv,xminHistRealEv,xmaxHistRealEv);
151 NSparseHistEv->GetAxis(0)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
152 NSparseHistEv->GetAxis(0)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
153 NSparseHistEv->GetAxis(1)->SetTitle("Q vec");
154 NSparseHistEv->GetAxis(1)->SetName("Q_vec");
155 NSparseHistEv->GetAxis(2)->SetTitle("N charged");
156 NSparseHistEv->GetAxis(2)->SetName("N_ch");
157 fOutput->Add(NSparseHistEv);
159 PostData(1, fOutput );
160 PostData(2, fEventCuts);
161 PostData(3, fTrackCuts);
162 PostData(4, fHelperPID);
165 //________________________________________________________________________
167 void AliAnalysisTaskSpectraAllChNanoAOD::UserExec(Option_t *)
169 //Printf("An event");
171 fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
173 AliWarning("ERROR: AliAODEvent not available \n");
177 if (strcmp(fAOD->ClassName(), "AliAODEvent"))
179 AliFatal("Not processing AODs");
182 AliNanoAODHeader * headNano = dynamic_cast<AliNanoAODHeader*>((TObject*)fAOD->GetHeader());
184 Bool_t isNano = (headNano != 0);
187 if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection
190 if(fHelperPID->GetPIDType()==kBayes)fHelperPID->GetPIDCombined()->SetDefaultTPCPriors();//FIXME maybe this can go in the UserCreateOutputObject?
192 Double_t Qvec=0.;//in case of MC we save space in the memory
195 if(fVZEROside==0)Qvec=fEventCuts->GetqV0A();
196 else if (fVZEROside==1)Qvec=fEventCuts->GetqV0C();
199 if(fVZEROside==0) Qvec=headNano->GetVar(0); // FIXME: we need proper getters here
200 else if (fVZEROside==1)Qvec=headNano->GetVar(1);
205 Double_t Cent=isNano ? headNano->GetVar(2) : fEventCuts->GetCent();
207 // First do MC to fill up the MC particle array
208 TClonesArray *arrayMC = 0;
211 arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
213 AliFatal("Error: MC particles branch not found!\n");
215 Int_t nMC = arrayMC->GetEntries();
216 for (Int_t iMC = 0; iMC < nMC; iMC++)
218 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
219 if(!partMC->Charge()) continue;//Skip neutrals
220 if(fCharge != 0 && partMC->Charge()*fCharge < 0.) continue;//if fCharge != 0 only select fCharge
222 if(partMC->Eta() < fTrackCuts->GetEtaMin() || partMC->Eta() > fTrackCuts->GetEtaMax())continue;//ETA CUT ON GENERATED!!!!!!!!!!!!!!!!!!!!!!!!!!
224 //pt cent IDgen isph y
226 varSt[0]=partMC->Pt();
228 varSt[2]=(Double_t)fHelperPID->GetParticleSpecies(partMC);
229 varSt[3]=(Double_t)partMC->IsPhysicalPrimary();
230 varSt[4]=partMC->Y();
231 ((THnSparseF*)fOutput->FindObject("NSparseHistSt"))->Fill(varSt);//stack loop
233 //Printf("a particle");
238 //main loop on tracks
242 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
243 AliVTrack* track = (AliVTrack*) fAOD->GetTrack(iTracks);
244 if(fCharge != 0 && track->Charge() != fCharge) continue;//if fCharge != 0 only select fCharge
246 if (!fTrackCuts->IsSelected((AliAODTrack*)track,kTRUE)) continue; //track selection (rapidity selection NOT in the standard cuts)
249 if(!fFillOnlyEvents){
250 Int_t IDrec=isNano ? GetNanoTrackID (track) : fHelperPID->GetParticleSpecies(track,kTRUE);//id from detector
252 if(isNano) y = ((AliNanoAODTrack*)track)->Y(fHelperPID->GetMass((AliHelperParticleSpecies_t)IDrec));
253 else y = ((AliAODTrack*)track)->Y(fHelperPID->GetMass((AliHelperParticleSpecies_t)IDrec));
254 Int_t IDgen=kSpUndefined;//set if MC
259 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
261 AliError("Cannot get MC particle");
264 IDgen=fHelperPID->GetParticleSpecies(partMC);
265 isph=partMC->IsPhysicalPrimary();
266 iswd=partMC->IsSecondaryFromWeakDecay();//FIXME not working on old productions
269 //pt cent Q vec IDrec IDgen isph iswd y
271 varTrk[0]=track->Pt();
274 varTrk[3]=(Double_t)IDrec;
275 varTrk[4]=(Double_t)IDgen;
276 varTrk[5]=(Double_t)isph;
277 varTrk[6]=(Double_t)iswd;
279 ((THnSparseF*)fOutput->FindObject("NSparseHistTrk"))->Fill(varTrk);//track loop
281 //for nsigma PID fill double counting of ID
282 if(fHelperPID->GetPIDType()<kBayes && fDoDoubleCounting){//only nsigma
284 HasDC=fHelperPID->GetDoubleCounting(track,kTRUE);//get the array with double counting
285 for(Int_t ipart=0;ipart<kNSpecies;ipart++){
286 if(HasDC[ipart]==kTRUE){
287 varTrk[3]=(Double_t)ipart;
288 ((THnSparseF*)fOutput->FindObject("NSparseHistTrk"))->Fill(varTrk);//track loop
293 //fill all charged (3)
296 ((THnSparseF*)fOutput->FindObject("NSparseHistTrk"))->Fill(varTrk);//track loop
297 }//end if fFillOnlyEvents
302 } // end loop on tracks
308 ((THnSparseF*)fOutput->FindObject("NSparseHistEv"))->Fill(varEv);//event loop
310 PostData(1, fOutput );
311 PostData(2, fEventCuts);
312 PostData(3, fTrackCuts);
313 PostData(4, fHelperPID);
316 //_________________________________________________________________
317 void AliAnalysisTaskSpectraAllChNanoAOD::Terminate(Option_t *)
323 Int_t AliAnalysisTaskSpectraAllChNanoAOD::GetNanoTrackID(AliVTrack * track) {
324 // Applies nsigma PID to nano tracks
325 AliNanoAODTrack * nanoTrack = dynamic_cast<AliNanoAODTrack*>(track);
326 if(!nanoTrack) AliFatal("Not a nano AOD track");
329 static const Int_t kcstNSigmaTPCPi = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTPCPi");
330 static const Int_t kcstNSigmaTPCKa = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTPCKa");
331 static const Int_t kcstNSigmaTPCPr = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTPCPr");
332 static const Int_t kcstNSigmaTOFPi = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTOFPi");
333 static const Int_t kcstNSigmaTOFKa = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTOFKa");
334 static const Int_t kcstNSigmaTOFPr = AliNanoAODTrackMapping::GetInstance()->GetVarIndex("cstNSigmaTOFPr");
336 Double_t nSigmaPID = 3.0;
340 //get the identity of the particle with the minimum Nsigma
341 Double_t nsigmaPion=999., nsigmaKaon=999., nsigmaProton=999.;
342 if(nanoTrack->Pt() > fTrackCuts->GetPtTOFMatching()) {
343 nsigmaProton = TMath::Sqrt(nanoTrack->GetVar(kcstNSigmaTPCPr)*nanoTrack->GetVar(kcstNSigmaTPCPr)+nanoTrack->GetVar(kcstNSigmaTOFPr)*nanoTrack->GetVar(kcstNSigmaTOFPr));
344 nsigmaKaon = TMath::Sqrt(nanoTrack->GetVar(kcstNSigmaTPCKa)*nanoTrack->GetVar(kcstNSigmaTPCKa)+nanoTrack->GetVar(kcstNSigmaTOFKa)*nanoTrack->GetVar(kcstNSigmaTOFKa));
345 nsigmaPion = TMath::Sqrt(nanoTrack->GetVar(kcstNSigmaTPCPi)*nanoTrack->GetVar(kcstNSigmaTPCPi)+nanoTrack->GetVar(kcstNSigmaTOFPi)*nanoTrack->GetVar(kcstNSigmaTOFPi));
348 nsigmaProton = TMath::Abs(nanoTrack->GetVar(kcstNSigmaTPCPr));
349 nsigmaKaon = TMath::Abs(nanoTrack->GetVar(kcstNSigmaTPCKa));
350 nsigmaPion = TMath::Abs(nanoTrack->GetVar(kcstNSigmaTPCPi));
355 // guess the particle based on the smaller nsigma (within nSigmaPID)
356 if( ( nsigmaKaon==nsigmaPion ) && ( nsigmaKaon==nsigmaProton )) return kSpUndefined;//if is the default value for the three
358 if( ( nsigmaKaon < nsigmaPion ) && ( nsigmaKaon < nsigmaProton ) && (nsigmaKaon < nSigmaPID)){
361 if( ( nsigmaPion < nsigmaKaon ) && ( nsigmaPion < nsigmaProton ) && (nsigmaPion < nSigmaPID)){
364 if( ( nsigmaProton < nsigmaKaon ) && ( nsigmaProton < nsigmaPion ) && (nsigmaProton < nSigmaPID)){
367 // else, return undefined