1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 **************************************************************************/
23 #include "TClonesArray.h"
24 #include "TParticle.h"
27 #include "TDatabasePDG.h"
28 #include "TLorentzVector.h"
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
33 #include "AliESDEvent.h"
34 #include "AliAODEvent.h"
35 #include "AliMCEvent.h"
36 #include "AliAODVZERO.h"
37 #include "AliAODZDC.h"
38 #include "AliESDVZERO.h"
39 #include "AliESDZDC.h"
40 #include "AliPIDResponse.h"
41 #include "AliAODTrack.h"
42 #include "AliAODPid.h"
43 #include "AliAODVertex.h"
44 #include "AliESDVertex.h"
45 #include "AliMultiplicity.h"
46 #include "AliESDtrack.h"
47 #include "AliESDMuonTrack.h"
48 #include "AliAODMCParticle.h"
49 #include "AliMCParticle.h"
52 #include "AliAnalysisTaskUpcK0sK0s.h"
54 ClassImp(AliAnalysisTaskUpcK0sK0s);
59 //trees for UPC analysis,
60 // michal.broz@cern.ch
62 //_____________________________________________________________________________
63 AliAnalysisTaskUpcK0sK0s::AliAnalysisTaskUpcK0sK0s()
64 : AliAnalysisTaskSE(),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),fK0sTree(0),
65 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
66 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
67 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
68 fK0sAODv0s(0),fK0sESDv0s(0),fK0sAODTracks(0),fK0sESDTracks(0),
69 fListHist(0),fHistTriggersPerRun(0),fHistK0sMass(0)
75 }//AliAnalysisTaskUpcK0sK0s
78 //_____________________________________________________________________________
79 AliAnalysisTaskUpcK0sK0s::AliAnalysisTaskUpcK0sK0s(const char *name)
80 : AliAnalysisTaskSE(name),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),fK0sTree(0),
81 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
82 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
83 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
84 fK0sAODv0s(0),fK0sESDv0s(0),fK0sAODTracks(0),fK0sESDTracks(0),
85 fListHist(0),fHistTriggersPerRun(0),fHistK0sMass(0)
90 if( strstr(name,"ESD") ) fType = 0;
91 if( strstr(name,"AOD") ) fType = 1;
95 DefineOutput(1, TTree::Class());
96 DefineOutput(2, TList::Class());
98 }//AliAnalysisTaskUpcK0sK0s
100 //_____________________________________________________________________________
101 void AliAnalysisTaskUpcK0sK0s::Init()
104 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
108 //_____________________________________________________________________________
109 AliAnalysisTaskUpcK0sK0s::~AliAnalysisTaskUpcK0sK0s()
121 }//~AliAnalysisTaskUpcK0sK0s
124 //_____________________________________________________________________________
125 void AliAnalysisTaskUpcK0sK0s::UserCreateOutputObjects()
129 fK0sAODv0s = new TClonesArray("AliAODv0", 1000);
130 fK0sESDv0s = new TClonesArray("AliESDv0", 1000);
133 fK0sAODTracks = new TClonesArray("AliAODTrack", 1000);
134 fK0sESDTracks = new TClonesArray("AliESDtrack", 1000);
136 //output tree with K0s candidate events
137 fK0sTree = new TTree("fK0sTree", "fK0sTree");
138 fK0sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
139 fK0sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
140 fK0sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
142 fK0sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
143 fK0sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
144 fK0sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
145 fK0sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
146 fK0sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
147 fK0sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
148 fK0sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
149 fK0sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
150 fK0sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
151 fK0sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
152 fK0sTree ->Branch("fDataFilnam", &fDataFilnam);
153 fK0sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
154 fK0sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
156 fK0sTree ->Branch("fK0sESDv0s", &fK0sESDv0s);
157 fK0sTree ->Branch("fK0sESDTracks", &fK0sESDTracks);
160 fK0sTree ->Branch("fK0sAODv0s", &fK0sAODv0s);
161 fK0sTree ->Branch("fK0sAODTracks", &fK0sAODTracks);
165 fListHist = new TList();
166 fListHist ->SetOwner();
168 fHistTriggersPerRun = new TH1D("fHistTriggersPerRun", "fHistTriggersPerRun", 3000, 167000.5, 170000.5);
169 fListHist->Add(fHistTriggersPerRun);
171 fHistK0sMass = new TH2D("fHistK0sMass","fHistK0sMass",20,0.45,0.55,20,0.45,0.55);
172 fListHist->Add(fHistK0sMass);
174 PostData(1, fK0sTree);
175 PostData(2, fListHist);
177 }//UserCreateOutputObjects
179 //_____________________________________________________________________________
180 void AliAnalysisTaskUpcK0sK0s::UserExec(Option_t *)
183 //cout<<"#################### Next event ##################"<<endl;
185 if( fType == 0 ) RunESD();
187 if(fRunHist) RunAODhist();
188 if(fRunTree) RunAODtree();
192 //_____________________________________________________________________________
193 void AliAnalysisTaskUpcK0sK0s::RunAODhist()
197 AliAODEvent *aod = (AliAODEvent*) InputEvent();
199 //cout<<"File: "<<(aod->GetHeader()->GetESDFileName()).Data()<<" Event: "<<aod->GetHeader()->GetEventNumberESDFile()<<endl;
202 TString trigger = aod->GetFiredTriggerClasses();
204 if( !trigger.Contains("CCUP4-B") ) return;
206 fRunNum = aod ->GetRunNumber();
207 fHistTriggersPerRun->Fill(fRunNum);
211 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
212 fVtxContrib = fAODVertex->GetNContributors();
213 if(fVtxContrib < 2) return;
217 AliAODVZERO *fV0data = aod ->GetVZEROData();
219 fV0Adecision = fV0data->GetV0ADecision();
220 fV0Cdecision = fV0data->GetV0CDecision();
221 if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
223 AliAODZDC *fZDCdata = aod->GetZDCData();
225 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
226 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
227 if( fZDCAenergy > 8200 || fZDCCenergy > 8200) return;
230 Int_t V0Index[3] = {-1,-1,-1};
231 Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
234 Int_t TrackID[5] = {-1,-1,-1,-1,-1};
238 for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
239 AliAODv0 *v0 = aod->GetV0(iV0);
241 Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
242 if (lOnFlyStatus) continue;
244 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
245 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
246 if (!pTrack || !nTrack) continue;
248 if ( pTrack->Charge() == nTrack->Charge())continue;
250 if(!(pTrack->GetStatus() & AliESDtrack::kITSrefit) ) continue;
251 if(!(nTrack->GetStatus() & AliESDtrack::kITSrefit) ) continue;
252 if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
253 if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
254 if(pTrack->GetTPCNcls() < 50)continue;
255 if(nTrack->GetTPCNcls() < 50)continue;
256 if(pTrack->Chi2perNDF() > 4)continue;
257 if(nTrack->Chi2perNDF() > 4)continue;
259 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
260 if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
261 if(TMath::Abs(dca[1]) > 2) continue;
262 if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
263 if(TMath::Abs(dca[1]) > 2) continue;
265 V0Index[nGoodV0s] = iV0;
266 V0TrackID[2*nGoodV0s] = pTrack->GetID();
267 V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
269 if(nGoodV0s > 2) break;
273 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
274 AliAODTrack *trk = aod->GetTrack(itr);
277 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
278 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
279 if(trk->GetTPCNcls() < 50)continue;
280 if(trk->Chi2perNDF() > 4)continue;
281 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
282 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
283 if(TMath::Abs(dca[1]) > 2) continue;
285 TrackID[nGoodTracks] = trk->GetID();
288 if(nGoodTracks > 4) break;
291 if(nGoodV0s == 2 && nGoodTracks == 4){
292 //SortArray(TrackID);
293 //SortArray(V0TrackID);
294 //for(Int_t i=0; i<4; i++) if (TrackID[i] != V0TrackID[i]) return;
295 AliAODv0 *v00 = aod->GetV0(V0Index[0]);
296 AliAODv0 *v01 = aod->GetV0(V0Index[1]);
297 fHistK0sMass->Fill(v00->MassK0Short(),v01->MassK0Short());
301 PostData(2, fListHist);
305 //_____________________________________________________________________________
306 void AliAnalysisTaskUpcK0sK0s::RunAODtree()
309 AliAODEvent *aod = (AliAODEvent*) InputEvent();
313 fDataFilnam = aod->GetHeader()->GetESDFileName();
314 fEvtNum = aod->GetHeader()->GetEventNumberESDFile();
315 fRunNum = aod->GetRunNumber();
318 TString trigger = aod->GetFiredTriggerClasses();
320 if( !trigger.Contains("CCUP4-B") ) return;
323 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
324 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
326 //Event identification
327 fPerNum = aod ->GetPeriodNumber();
328 fOrbNum = aod ->GetOrbitNumber();
329 fBCrossNum = aod ->GetBunchCrossNumber();
332 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
333 fVtxContrib = fAODVertex->GetNContributors();
336 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
339 AliAODVZERO *fV0data = aod ->GetVZEROData();
340 AliAODZDC *fZDCdata = aod->GetZDCData();
342 fV0Adecision = fV0data->GetV0ADecision();
343 fV0Cdecision = fV0data->GetV0CDecision();
344 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
345 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
348 Int_t V0Index[3] = {-1,-1,-1};
349 Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
352 Int_t TrackID[5] = {-1,-1,-1,-1,-1};
355 for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
356 AliAODv0 *v0 = aod->GetV0(iV0);
358 Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
359 if (lOnFlyStatus) continue;
361 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
362 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
363 if (!pTrack || !nTrack) continue;
365 if ( pTrack->Charge() == nTrack->Charge())continue;
367 if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
368 if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
369 if(!(pTrack->GetStatus() & AliESDtrack::kITSrefit) ) continue;
370 if(!(nTrack->GetStatus() & AliESDtrack::kITSrefit) ) continue;
371 if(pTrack->GetTPCNcls() < 50)continue;
372 if(nTrack->GetTPCNcls() < 50)continue;
373 if(pTrack->Chi2perNDF() > 4)continue;
374 if(nTrack->Chi2perNDF() > 4)continue;
376 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
377 if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
378 if(TMath::Abs(dca[1]) > 2) continue;
379 if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
380 if(TMath::Abs(dca[1]) > 2) continue;
382 V0Index[nGoodV0s] = iV0;
383 V0TrackID[2*nGoodV0s] = pTrack->GetID();
384 V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
386 if(nGoodV0s > 2) break;
390 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
391 AliAODTrack *trk = aod->GetTrack(itr);
394 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
395 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
396 if(trk->GetTPCNcls() < 50)continue;
397 if(trk->Chi2perNDF() > 4)continue;
398 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
399 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
400 if(TMath::Abs(dca[1]) > 2) continue;
402 TrackID[nGoodTracks] = trk->GetID();
405 if(nGoodTracks > 4) break;
408 if(nGoodV0s == 2 && nGoodTracks == 4){
409 //SortArray(TrackID);
410 //SortArray(V0TrackID);
411 //for{Int_t i=0; i<4; i++} if (TrackID[i] != V0TrackID[i]) return;
412 for(Int_t i=0; i<2; i++){
413 AliAODv0 *v0 = aod->GetV0(V0Index[i]);
414 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
415 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
417 new((*fK0sAODv0s)[i]) AliAODv0(*v0);
418 new((*fK0sAODTracks)[2*i]) AliAODTrack(*pTrack);
419 new((*fK0sAODTracks)[2*i+1]) AliAODTrack(*nTrack);
425 PostData(1, fK0sTree);
429 //_____________________________________________________________________________
430 void AliAnalysisTaskUpcK0sK0s::SortArray(Double_t *dArray) {
431 for (Int_t i = 3; i > 0; --i) {
432 for (Int_t j = 0; j < i; ++j) {
433 if (dArray[j] > dArray[j+1]) {
434 Double_t dTemp = dArray[j];
435 dArray[j] = dArray[j+1];
442 //_____________________________________________________________________________
443 void AliAnalysisTaskUpcK0sK0s::RunESD()
448 //_____________________________________________________________________________
449 void AliAnalysisTaskUpcK0sK0s::Terminate(Option_t *)
452 cout<<"Analysis complete."<<endl;