1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: ALICE Offline. *
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 **************************************************************************/
17 //=========================================================================//
18 // AliEbyE Analysis for Particle Ratio Fluctuation //
19 // Deepika Rathee | Satyajit Jena //
20 // drathee@cern.ch | sjena@cern.ch //
21 // Dealing with Wide pT Addition (Test Only - not for use)
22 //=========================================================================//
32 #include "AliAnalysisTask.h"
33 #include "AliAnalysisManager.h"
34 #include "AliVEvent.h"
36 #include "AliESDEvent.h"
37 #include "AliAODEvent.h"
38 #include "AliAODMCParticle.h"
39 #include "AliAODMCHeader.h"
40 #include "AliPIDResponse.h"
41 #include "AliPIDCombined.h"
42 #include "AliAODHeader.h"
43 #include "AliAODpidUtil.h"
44 #include "AliHelperPID.h"
47 #include "AliEbyEPidTTask.h"
49 ClassImp(AliEbyEPidTTask)
51 //-----------------------------------------------------------------------
52 AliEbyEPidTTask::AliEbyEPidTTask( const char *name ) : AliAnalysisTaskSE( name ),
55 fCentralityEstimator("V0M"),
63 fNumberOfTracks(8000),
64 fNumberOfTracksM(8000),
79 fTrackChargeM[kTrack];
83 DefineOutput(1, TList::Class()); //! Connect Outpput....
84 DefineOutput(2, TTree::Class()); //! Connect Outpput....
87 AliEbyEPidTTask::~AliEbyEPidTTask() {
89 if (fThnList) delete fThnList;
90 if (fHelperPID) delete fHelperPID;
91 if (fEventTree) delete fEventTree;
94 //---------------------------------------------------------------------------------
95 void AliEbyEPidTTask::UserCreateOutputObjects() {
96 fThnList = new TList();
97 fThnList->SetOwner(kTRUE);
99 fEventCounter = new TH1D("fEventCounter","EventCounter", 70, 0.5,70.5);
100 fThnList->Add(fEventCounter);
102 TList *ll = (TList*)fHelperPID->GetOutputList();
103 for (Int_t ikey = 0; ikey < ll->GetEntries(); ikey++) {
104 fThnList->Add(ll->At(ikey));
106 TDirectory *owd = gDirectory;
108 fEventTree = new TTree("fEventTree","fEventTree");
111 fEventTree->Branch("fRunNumber", &fRunNumber, "fRunNumber/I");
112 fEventTree->Branch("fFilterBit", &fFilterBit, "fFilterBit/I");
113 fEventTree->Branch("fNumberOfTracks", &fNumberOfTracks,"fNumberOfTracks/I");
114 fEventTree->Branch("fCentPercentile", &fCentPercentile,"fCentPercentile/F");
116 fEventTree->Branch("fVertexX", &fVertexX, "fVertexX/F");
117 fEventTree->Branch("fVertexY", &fVertexY, "fVertexY/F");
118 fEventTree->Branch("fVertexZ", &fVertexZ, "fVertexZ/F");
120 fEventTree->Branch("fTrackPt", fTrackPt, "fTrackPt[fNumberOfTracks]/F");
121 fEventTree->Branch("fTrackPhi", fTrackPhi, "fTrackPhi[fNumberOfTracks]/F");
122 fEventTree->Branch("fTrackEta", fTrackEta, "fTrackEta[fNumberOfTracks]/F");
123 fEventTree->Branch("fTrackCharge", fTrackCharge, "fTrackCharge[fNumberOfTracks]/I");
124 fEventTree->Branch("fTrackPid", fTrackPid, "fTrackPid[fNumberOfTracks]/I");
127 fEventTree->Branch("fNumberOfTracksM", &fNumberOfTracksM, "fNumberOfTracksM/I");
128 fEventTree->Branch("fTrackPtM", fTrackPtM, "fTrackPtM[fNumberOfTracksM]/F");
129 fEventTree->Branch("fTrackPhiM", fTrackPhiM, "fTrackPhiM[fNumberOfTracksM]/F");
130 fEventTree->Branch("fTrackEtaM", fTrackEtaM, "fTrackEtaM[fNumberOfTracksM]/F");
131 fEventTree->Branch("fTrackChargeM", fTrackChargeM, "fTrackChargeM[fNumberOfTracksM]/I");
132 fEventTree->Branch("fTrackPidM", fTrackPidM, "fTrackPidM[fNumberOfTracksM]/I");
135 PostData(1, fThnList);
136 PostData(2, fEventTree);
139 //----------------------------------------------------------------------------------
140 void AliEbyEPidTTask::UserExec( Option_t * ){
142 fEventCounter->Fill(1);
144 AliAODEvent* event = dynamic_cast<AliAODEvent*>(InputEvent());
146 Printf("ERROR 01: AOD not found ");
150 fEventCounter->Fill(2);
153 // Float_t gRefMul = -1;
155 AliAODHeader *aodHeader = event->GetHeader();
156 gCent = (Int_t)aodHeader->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
157 // gRefMul = aodHeader->GetRefMultiplicity();
158 if (gCent < 0 || gCent > 100) return;
159 fEventCounter->Fill(3);
161 const AliAODVertex *vertex = event->GetPrimaryVertex();
163 fEventCounter->Fill(4);
164 Bool_t vtest = kFALSE;
166 vertex->GetCovarianceMatrix(fCov);
167 if(vertex->GetNContributors() > 0) {
174 fEventCounter->Fill(5);
176 AliCentrality *centrality = event->GetCentrality();
177 if (centrality->GetQuality() != 0) return;
179 fEventCounter->Fill(6);
181 fRunNumber = event->GetRunNumber();
182 fFilterBit = fAODtrackCutBit;
183 fCentPercentile = gCent;
184 fVertexX = vertex->GetX();
185 fVertexY = vertex->GetY();
186 fVertexZ = vertex->GetZ();
189 if(fHelperPID->GetPIDType()==kBayes)fHelperPID->GetPIDCombined()->SetDefaultTPCPriors();//FIXME maybe this can go in the UserCreateOutputObject?
195 for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
196 AliAODTrack* track = dynamic_cast<AliAODTrack *>(event->GetTrack(itrk));
197 fEventCounter->Fill(10);
198 if (!track) continue;
199 fEventCounter->Fill(11);
200 if (!AcceptTrack(track)) continue;
201 fEventCounter->Fill(12);
202 Int_t a = fHelperPID->GetParticleSpecies((AliVTrack*) track,kTRUE);
203 // if(a < 0 || a > 2) continue;
204 fEventCounter->Fill(13);
208 else if (a == 1 ) b = 2;
209 else if (a == 2 ) b = 3;
212 if (track->Charge() < 0 ) b = -1*b;
214 // Int_t icharge = track->Charge() > 0 ? 0 : 1;
216 // cout << icharge << " " << track->Charge() << endl;
218 fTrackPt[iTracks] = (Float_t)track->Pt();
219 fTrackPhi[iTracks] = (Float_t)track->Phi();
220 fTrackEta[iTracks] = (Float_t)track->Eta();
221 fTrackCharge[iTracks] = track->Charge();
222 fTrackPid[iTracks] = b;
225 fNumberOfTracks = iTracks;
228 fEventCounter->Fill(21);
229 TClonesArray *arrayMC= 0;
230 arrayMC = dynamic_cast<TClonesArray*> (event->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
232 Printf("Error: MC particles branch not found!\n");
235 fEventCounter->Fill(22);
236 AliAODMCHeader *mcHdr=0;
237 mcHdr=(AliAODMCHeader*)event->GetList()->FindObject(AliAODMCHeader::StdBranchName());
239 Printf("MC header branch not found!\n");
243 fEventCounter->Fill(23);
245 Int_t nMC = arrayMC->GetEntries();
247 for (Int_t iMC = 0; iMC < nMC; iMC++) {
248 fEventCounter->Fill(24);
249 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
250 if(!AcceptMCTrack(partMC)) continue;
252 fEventCounter->Fill(25);
253 Int_t a = partMC->GetPdgCode();
255 // Int_t a = fHelperPID->GetMCParticleSpecie((AliVEvent*) event,(AliVTrack*)partMC,1);
257 //if(a < 0 || a > 2) continue;
258 Int_t icharge = a > 0 ? 0 : 1;
260 // cout << a << " " << icharge << endl;
262 fTrackPtM[mTracks] = (Float_t)partMC->Pt();
263 fTrackPhiM[mTracks] = (Float_t)partMC->Phi();
264 fTrackEtaM[mTracks] = (Float_t)partMC->Eta();
265 fTrackChargeM[mTracks] = icharge;
266 fTrackPidM[mTracks] = a;
270 fEventCounter->Fill(26);
271 fNumberOfTracksM = mTracks;
274 fEventCounter->Fill(30);
277 PostData(1, fThnList);
278 PostData(2, fEventTree);
281 //___________________________________________________________
282 void AliEbyEPidTTask::Terminate( Option_t * ){
283 Info("AliEbyEPidTTask"," Task Successfully finished");
286 //___________________________________________________________
287 Bool_t AliEbyEPidTTask::AcceptTrack(AliAODTrack *track) const {
288 if(!track) return kFALSE;
289 if (track->Charge() == 0 ) return kFALSE;
290 if (!track->TestFilterBit(fAODtrackCutBit)) return kFALSE;
295 //___________________________________________________________
296 Bool_t AliEbyEPidTTask::AcceptMCTrack(AliAODMCParticle *track) const {
297 if(!track) return kFALSE;
298 if(!track->IsPhysicalPrimary()) return kFALSE;
299 if (track->Charge() == 0 ) return kFALSE;