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"
25 #include "TObjString.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),hCounter(0),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),hCounter(0),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, TH1I::Class());
97 DefineOutput(3, TList::Class());
99 }//AliAnalysisTaskUpcK0sK0s
101 //_____________________________________________________________________________
102 void AliAnalysisTaskUpcK0sK0s::Init()
105 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
109 //_____________________________________________________________________________
110 AliAnalysisTaskUpcK0sK0s::~AliAnalysisTaskUpcK0sK0s()
126 }//~AliAnalysisTaskUpcK0sK0s
129 //_____________________________________________________________________________
130 void AliAnalysisTaskUpcK0sK0s::UserCreateOutputObjects()
132 hCounter = new TH1I("hCounter", "hCounter", 34000, 1., 34001.);
135 fDataFilnam = new TObjString();
136 fDataFilnam->SetString("");
139 fK0sAODv0s = new TClonesArray("AliAODv0", 1000);
140 fK0sESDv0s = new TClonesArray("AliESDv0", 1000);
143 fK0sAODTracks = new TClonesArray("AliAODTrack", 1000);
144 fK0sESDTracks = new TClonesArray("AliESDtrack", 1000);
146 //output tree with K0s candidate events
147 fK0sTree = new TTree("fK0sTree", "fK0sTree");
148 fK0sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
149 fK0sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
150 fK0sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
152 fK0sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
153 fK0sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
154 fK0sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
155 fK0sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
156 fK0sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
157 fK0sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
158 fK0sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
159 fK0sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
160 fK0sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
161 fK0sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
162 fK0sTree ->Branch("fDataFilnam", &fDataFilnam);
163 fK0sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
164 fK0sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
166 fK0sTree ->Branch("fK0sESDv0s", &fK0sESDv0s);
167 fK0sTree ->Branch("fK0sESDTracks", &fK0sESDTracks);
170 fK0sTree ->Branch("fK0sAODv0s", &fK0sAODv0s);
171 fK0sTree ->Branch("fK0sAODTracks", &fK0sAODTracks);
175 fListHist = new TList();
176 fListHist ->SetOwner();
178 fHistTriggersPerRun = new TH1D("fHistTriggersPerRun", "fHistTriggersPerRun", 3000, 167000.5, 170000.5);
179 fListHist->Add(fHistTriggersPerRun);
181 fHistK0sMass = new TH1D("fHistK0sMass","fHistK0sMass",200,0.4,0.6);
182 fListHist->Add(fHistK0sMass);
184 PostData(1, fK0sTree);
185 PostData(2, hCounter);
186 PostData(3, fListHist);
188 }//UserCreateOutputObjects
190 //_____________________________________________________________________________
191 void AliAnalysisTaskUpcK0sK0s::UserExec(Option_t *)
194 //cout<<"#################### Next event ##################"<<endl;
196 if( fType == 0 ) RunESD();
198 if(fRunHist) RunAODhist();
199 if(fRunTree) RunAODtree();
203 //_____________________________________________________________________________
204 void AliAnalysisTaskUpcK0sK0s::RunAODhist()
208 AliAODEvent *aod = (AliAODEvent*) InputEvent();
213 TString trigger = aod->GetFiredTriggerClasses();
215 if( !trigger.Contains("CCUP4-B") ) return;
217 fRunNum = aod ->GetRunNumber();
218 fHistTriggersPerRun->Fill(fRunNum);
222 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
223 fVtxContrib = fAODVertex->GetNContributors();
224 if(fVtxContrib < 2) return;
228 AliAODVZERO *fV0data = aod ->GetVZEROData();
230 fV0Adecision = fV0data->GetV0ADecision();
231 fV0Cdecision = fV0data->GetV0CDecision();
232 if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
234 AliAODZDC *fZDCdata = aod->GetZDCData();
236 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
237 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
238 if( fZDCAenergy > 6000 || fZDCCenergy > 6000) return;
241 Int_t V0Index[3] = {-1,-1,-1};
242 Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
245 Int_t TrackID[5] = {-1,-1,-1,-1,-1};
249 for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
250 AliAODv0 *v0 = aod->GetV0(iV0);
252 Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
253 if (lOnFlyStatus) continue;
255 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
256 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
257 if (!pTrack || !nTrack) continue;
259 if ( pTrack->Charge() == nTrack->Charge())continue;
261 if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
262 if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
263 if(pTrack->GetTPCNcls() < 50)continue;
264 if(nTrack->GetTPCNcls() < 50)continue;
265 if(pTrack->Chi2perNDF() > 4)continue;
266 if(nTrack->Chi2perNDF() > 4)continue;
268 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
269 if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
270 if(TMath::Abs(dca[1]) > 2) continue;
271 if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
272 if(TMath::Abs(dca[1]) > 2) continue;
274 V0Index[nGoodV0s] = iV0;
275 V0TrackID[2*nGoodV0s] = pTrack->GetID();
276 V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
278 if(nGoodV0s > 2) break;
282 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
283 AliAODTrack *trk = aod->GetTrack(itr);
286 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
287 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
288 if(trk->GetTPCNcls() < 50)continue;
289 if(trk->Chi2perNDF() > 4)continue;
290 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
291 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
292 if(TMath::Abs(dca[1]) > 2) continue;
294 TrackID[nGoodTracks] = trk->GetID();
297 if(nGoodTracks > 4) break;
300 if(nGoodV0s == 2 && nGoodTracks == 4){
301 //SortArray(TrackID);
302 //SortArray(V0TrackID);
303 //for(Int_t i=0; i<4; i++) if (TrackID[i] != V0TrackID[i]) return;
304 for(Int_t i=0; i<2; i++){
305 AliAODv0 *v0 = aod->GetV0(V0Index[i]);
306 fHistK0sMass->Fill(v0->MassK0Short());
311 PostData(3, fListHist);
315 //_____________________________________________________________________________
316 void AliAnalysisTaskUpcK0sK0s::RunAODtree()
319 AliAODEvent *aod = (AliAODEvent*) InputEvent();
323 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
324 fDataFilnam->Clear();
325 fDataFilnam->SetString(filnam);
326 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
327 fRunNum = aod ->GetRunNumber();
332 TString trigger = aod->GetFiredTriggerClasses();
334 if( !trigger.Contains("CCUP4-B") ) return;
336 Bool_t isTRG = kFALSE;
337 for(Int_t i=1; i<ntrg; i++) {
338 if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
340 if( !isTRG ) {PostData(2, hCounter); return;}
345 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
346 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
348 //Event identification
349 fPerNum = aod ->GetPeriodNumber();
350 fOrbNum = aod ->GetOrbitNumber();
351 fBCrossNum = aod ->GetBunchCrossNumber();
354 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
355 fVtxContrib = fAODVertex->GetNContributors();
358 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
361 AliAODVZERO *fV0data = aod ->GetVZEROData();
362 AliAODZDC *fZDCdata = aod->GetZDCData();
364 fV0Adecision = fV0data->GetV0ADecision();
365 fV0Cdecision = fV0data->GetV0CDecision();
366 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
367 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
370 Int_t V0Index[3] = {-1,-1,-1};
371 Int_t V0TrackID[6] = {-1,-1,-1,-1,-1,-1};
374 Int_t TrackID[5] = {-1,-1,-1,-1,-1};
377 for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
378 AliAODv0 *v0 = aod->GetV0(iV0);
380 Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
381 if (lOnFlyStatus) continue;
383 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
384 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
385 if (!pTrack || !nTrack) continue;
387 if ( pTrack->Charge() == nTrack->Charge())continue;
389 if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
390 if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
391 if(pTrack->GetTPCNcls() < 50)continue;
392 if(nTrack->GetTPCNcls() < 50)continue;
393 if(pTrack->Chi2perNDF() > 4)continue;
394 if(nTrack->Chi2perNDF() > 4)continue;
396 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
397 if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
398 if(TMath::Abs(dca[1]) > 2) continue;
399 if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
400 if(TMath::Abs(dca[1]) > 2) continue;
402 V0Index[nGoodV0s] = iV0;
403 V0TrackID[2*nGoodV0s] = pTrack->GetID();
404 V0TrackID[2*nGoodV0s+1] = nTrack->GetID();
406 if(nGoodV0s > 2) break;
410 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
411 AliAODTrack *trk = aod->GetTrack(itr);
414 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
415 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
416 if(trk->GetTPCNcls() < 50)continue;
417 if(trk->Chi2perNDF() > 4)continue;
418 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
419 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
420 if(TMath::Abs(dca[1]) > 2) continue;
422 TrackID[nGoodTracks] = trk->GetID();
425 if(nGoodTracks > 4) break;
428 if(nGoodV0s == 2 && nGoodTracks == 4){
429 //SortArray(TrackID);
430 //SortArray(V0TrackID);
431 //for{Int_t i=0; i<4; i++} if (TrackID[i] != V0TrackID[i]) {PostData(2, hCounter); return;}
432 for(Int_t i=0; i<2; i++){
433 AliAODv0 *v0 = aod->GetV0(V0Index[i]);
434 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
435 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
437 new((*fK0sAODv0s)[i]) AliAODv0(*v0);
438 new((*fK0sAODTracks)[2*i]) AliAODTrack(*pTrack);
439 new((*fK0sAODTracks)[2*i+1]) AliAODTrack(*nTrack);
445 PostData(1, fK0sTree);
446 PostData(2, hCounter);
450 //_____________________________________________________________________________
451 void AliAnalysisTaskUpcK0sK0s::SortArray(Double_t *dArray) {
452 for (Int_t i = 3; i > 0; --i) {
453 for (Int_t j = 0; j < i; ++j) {
454 if (dArray[j] > dArray[j+1]) {
455 Double_t dTemp = dArray[j];
456 dArray[j] = dArray[j+1];
463 //_____________________________________________________________________________
464 void AliAnalysisTaskUpcK0sK0s::RunESD()
468 AliESDEvent *esd = (AliESDEvent*) InputEvent();
472 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
473 fDataFilnam->Clear();
474 fDataFilnam->SetString(filnam);
475 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
476 fRunNum = esd->GetRunNumber();
481 TString trigger = esd->GetFiredTriggerClasses();
483 fTrigger[0] = trigger.Contains("CINT7-B");
484 fTrigger[1] = trigger.Contains("CCUP4-B"); // CE
485 fTrigger[2] = trigger.Contains("CCUP4-E"); // CE
487 Bool_t isTRG = kFALSE;
488 for(Int_t i=1; i<ntrg; i++) {
489 if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
491 if( !isTRG ) {PostData(3, hCounter); return;}
496 fL0inputs = esd->GetHeader()->GetL0TriggerInputs();
497 fL1inputs = esd->GetHeader()->GetL1TriggerInputs();
499 //Event identification
500 fPerNum = esd->GetPeriodNumber();
501 fOrbNum = esd->GetOrbitNumber();
502 fBCrossNum = esd->GetBunchCrossNumber();
505 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
506 fVtxContrib = fESDVertex->GetNContributors();
509 fNtracklets = esd->GetMultiplicity()->GetNumberOfTracklets();
512 AliESDVZERO *fV0data = esd->GetVZEROData();
513 AliESDZDC *fZDCdata = esd->GetESDZDC();
515 fV0Adecision = fV0data->GetV0ADecision();
516 fV0Cdecision = fV0data->GetV0CDecision();
517 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
518 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
521 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
524 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
525 AliESDtrack *trk = esd->GetTrack(itr);
528 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
529 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
530 if(trk->GetTPCNcls() < 50)continue;
531 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
532 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
533 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
534 trk->GetImpactParameters(dca[0],dca[1]);
535 if(TMath::Abs(dca[1]) > 2) continue;
537 TrackIndex[nGoodTracks] = itr;
539 if(nGoodTracks > 4) break;
542 if(nGoodTracks == 2){
543 for(Int_t i=0; i<2; i++){
544 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
546 AliExternalTrackParam cParam;
547 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
549 new((*fJPsiESDTracks)[i]) AliESDtrack(*trk);
553 PostData(1, fJPsiTree);
556 if(nGoodTracks == 4){
557 for(Int_t i=0; i<4; i++){
558 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
560 AliExternalTrackParam cParam;
561 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
563 new((*fPsi2sESDTracks)[i]) AliESDtrack(*trk);
567 PostData(2, fPsi2sTree);
570 PostData(3, hCounter);
574 //_____________________________________________________________________________
575 void AliAnalysisTaskUpcK0sK0s::Terminate(Option_t *)
578 cout<<"Analysis complete."<<endl;