1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 // Analysis task for high pt particle correlations
18 // author: R.Diaz, J. Rak, D.J. Kim
19 // ALICE Group University of Jyvaskyla
21 // Fill the analysis containers for ESD or AOD
22 // Adapted for AliAnalysisTaskSE and AOD objects
23 //////////////////////////////////////////////////////////////////////////////
26 #include <Riostream.h>
31 #include <TClonesArray.h>
32 #include <TObjArray.h>
33 #include <TObjString.h>
36 #include <TRefArray.h>
39 #include "AliAnalysisTaskSE.h"
41 #include "AliJCORRANTask.h"
42 #include "AliAnalysisManager.h"
43 #include "AliESDEvent.h"
44 #include "AliMCEvent.h"
46 #include "AliGenEventHeader.h"
47 #include "AliGenCocktailEventHeader.h"
48 #include "AliGenPythiaEventHeader.h"
49 #include "AliInputEventHandler.h"
50 #include "AliESDCaloCluster.h"
51 #include "AliAODEvent.h"
52 #include "AliAODHeader.h"
54 #include "AliESDVertex.h"
55 #include "AliESDtrack.h"
56 #include "AliAODTrack.h"
57 #include "AliAnalysisFilter.h"
58 #include "AliESDtrackCuts.h"
59 #include "AliPHOSGeoUtils.h"
60 #include "AliEMCALGeoUtils.h"
61 #include "AliESDtrackCuts.h"
63 #include "AliPhJTrackList.h"
64 #include "AliPhJMCTrackList.h"
65 #include "AliPhJPhotonList.h"
66 #include "AliPhJHeaderList.h"
67 #include "AliJTrack.h"
68 #include "AliJPhoton.h"
69 #include "AliJHeader.h"
70 #include "AliAODTracklets.h"
71 #include "AliMultiplicity.h"
73 #include "AliESDRun.h"
74 #include "AliJRunHeader.h"
77 //______________________________________________________________________________
78 AliJCORRANTask::AliJCORRANTask() :
79 AliAnalysisTaskSE("PWG4JCORRAN"),
81 fEsdTrackCuts(0), //FK//
82 fDownscaling(0),//FK//
83 fLowerCutOnLPMom(0),//FK//
84 fLowerCutOnLeadingCaloClusterE(0),//FK//
100 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
101 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
103 DefineInput (0, TChain::Class());
107 //______________________________________________________________________________
108 AliJCORRANTask::AliJCORRANTask(const char *name, TString inputformat, AliESDtrackCuts* esdTrackCuts, Int_t downSc, Double_t lowLPmom, Double_t lowCaloE) :
109 AliAnalysisTaskSE(name),
110 fInputFormat(inputformat),
111 fEsdTrackCuts(esdTrackCuts), //FK//
112 fDownscaling(downSc),//FK//
113 fLowerCutOnLPMom(lowLPmom),//FK//
114 fLowerCutOnLeadingCaloClusterE(lowCaloE),//FK//
128 if(fDebug > 5) cout << "---- AliJCORRANTask Constructor ----"<<endl;
130 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
131 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
133 DefineInput (0, TChain::Class());
135 fTrackList = new AliPhJTrackList(kALICE);
136 //fMCTrackList = new AliPhJMCTrackList(kALICE);
137 fPhotonList = new AliPhJPhotonList(kALICE);
138 fHeaderList = new AliPhJHeaderList(kALICE);
140 fAliRunHeader = new AliJRunHeader();
142 fPHOSGeom = new AliPHOSGeoUtils("PHOSgeo") ;
143 fEMCALGeom = new AliEMCALGeoUtils("EMCAL_COMPLETE");
146 DefineOutput(1, TTree::Class());
147 DefineOutput(2, TList::Class());
151 //____________________________________________________________________________
152 AliJCORRANTask::AliJCORRANTask(const AliJCORRANTask& ap) :
153 AliAnalysisTaskSE(ap.GetName()),
154 fInputFormat(ap.fInputFormat),
155 fEsdTrackCuts(ap.fEsdTrackCuts), //FK//
156 fDownscaling(ap.fDownscaling), //FK//
157 fLowerCutOnLPMom(ap.fLowerCutOnLPMom), //FK//
158 fLowerCutOnLeadingCaloClusterE(ap.fLowerCutOnLeadingCaloClusterE), //FK//
160 fTrackList(ap.fTrackList),
161 //fMCTrackList(ap.fMCTrackList),
162 fPhotonList(ap.fPhotonList),
163 fHeaderList(ap.fHeaderList),
164 fAliRunHeader(ap.fAliRunHeader),
166 fTrackQACuts(ap.fTrackQACuts),
167 fTrackKineCuts(ap.fTrackKineCuts),
168 fPHOSGeom(ap.fPHOSGeom),
169 fEMCALGeom(ap.fEMCALGeom)
174 //_____________________________________________________________________________
175 AliJCORRANTask& AliJCORRANTask::operator = (const AliJCORRANTask& ap)
177 // assignment operator
179 this->~AliJCORRANTask();
180 new(this) AliJCORRANTask(ap);
184 //______________________________________________________________________________
185 AliJCORRANTask::~AliJCORRANTask()
190 //delete fMCTrackList;
193 delete fAliRunHeader;
198 delete fTrackKineCuts;
199 if(fPHOSGeom) delete fPHOSGeom ;
200 if(fEMCALGeom) delete fEMCALGeom ;
204 //________________________________________________________________________
205 void AliJCORRANTask::UserCreateOutputObjects()
207 // create the jcorran outputs objects
208 if(fDebug > 5) cout << "AliJCORRANTask UserCreateOutputObjects----------------------"<<endl;
209 OpenFile(1) ; // Will open the file for the object to be written at output #1
211 fTree = new TTree("T","ALICE JYU CORRAN");
212 fTree->Branch("JTKT/JTrackList","AliPhJTrackList",&fTrackList,500000);
213 //fTree->Branch("JTKT/JMCTrackList","AliPhJMCTrackList",&fMCTrackList,500000);
214 fTree->Branch("JTKT/JPhotonList","AliPhJPhotonList",&fPhotonList,500000);
215 fTree->Branch("JTKT/JHeaderList","AliPhJHeaderList",&fHeaderList,500000);
218 // Offline Trigger QA
219 OpenFile(2) ; // Will open the file for the object to be written at output #2
220 TString trackQAlist = "MinNClusterTPC:";
221 trackQAlist+= "MinNClustersITS:";
222 trackQAlist+= "MaxChi2PerClusterTPC:";
223 trackQAlist+= "MaxChi2PerClusterITS:";
224 trackQAlist+= "RequireTPCRefit:";
225 trackQAlist+= "RequireITSRefit:";
226 trackQAlist+= "AcceptKinkDaughters:";
227 trackQAlist+= "MaxCovMatrixDiag11:";
228 trackQAlist+= "MaxCovMatrixDiag22:";
229 trackQAlist+= "MaxCovMatrixDiag33:";
230 trackQAlist+= "MaxCovMatrixDiag44:";
231 trackQAlist+= "MaxCovMatrixDiag55:";
232 trackQAlist+= "MaxNsigmaToVertex:";
233 trackQAlist+= "RequireSigmaToVertex";
235 TString trackKinelist = "PMin:PMax:";
236 trackKinelist+= "PtMin:PtMax:";
237 trackKinelist+= "PxMin:PxMax:";
238 trackKinelist+= "PyMin:PyMax:";
239 trackKinelist+= "PzMin:PzMax:";
240 trackKinelist+= "EtaMin:EtaMax:";
241 trackKinelist+= "RapMin:RapMax";
243 fTrackQACuts = new TNtuple("TrackQACuts", "track quality cuts applied on ESD",trackQAlist.Data());
244 fTrackKineCuts = new TNtuple("TrackKineCuts", "kinematic cuts applied on ESD", trackKinelist.Data());
245 fQAList = new TList();
246 fQAList->SetName("ESD QA List") ;
247 fQAList->AddAt(fTrackQACuts, 0) ;
248 fQAList->AddAt(fTrackKineCuts, 1) ;
252 //______________________________________________________________________________
253 void AliJCORRANTask::UserExec(Option_t */*option*/)
255 // Processing of one event
256 //if(fDebug > 5) cout << "------- AliJCORRANTask Exec-------"<<endl;
257 if(!((Entry()-1)%100))
258 AliInfo(Form(" Processing event # %lld", Entry()));
264 if(fInputFormat=="ESD"){
265 // if(fDebug > 5) cout <<"--------- Reading ESD --------"<< endl;
266 AliESDEvent* esd = (AliESDEvent*)InputEvent();
268 //AliMCEvent* fmcEvent = MCEvent();
269 //ReadMCTracks(fmcEvent);
272 //=========== FILL AND STORE RUN HEADER (ONLY ONCE PER RUN) =============
273 if(esd->GetRunNumber() != runId){ //new run has started
275 const AliESDRun* esdRun = esd->GetESDRun();
277 for(Int_t triggerBit=0; triggerBit<kRangeTriggerTableAlice; triggerBit++){
278 fActiveTriggers[triggerBit] = esdRun->GetTriggerClass(triggerBit);
280 runId = esd->GetRunNumber();
282 //Polarity of magnetic field in L3 solenoid
283 Short_t l3MgFieldPolarity=0; // (LHC convention: +current -> +Bz)
284 if(esd->GetCurrentL3() >0) l3MgFieldPolarity = 1;
285 if(esd->GetCurrentL3() <0) l3MgFieldPolarity = -1;
287 //Create JCorran trigger mask mapping
288 fTriggerTableJCorran[kMinBiasTriggerBitJCorran]="Minimum Bias";//minimum bias occupies first trigger bit
290 //=========== Fill Run header object ===============
291 fAliRunHeader->SetRunNumber(runId);
292 fAliRunHeader->SetActiveTriggersAlice(fActiveTriggers);
293 fAliRunHeader->SetL3Field(l3MgFieldPolarity, esd->GetMagneticField());
294 fAliRunHeader->SetActiveTriggersJCorran(fTriggerTableJCorran,kRangeTriggerTableJCorran);
297 (fTree->GetUserInfo())->Add(fAliRunHeader);
301 if( StoreDownscaledMinBiasEvent() || ContainsESDHighPtTrack(esd) || ContainsESDHighECaloClusters(esd) ){ //FK//
302 //-------------- reset all the arrays -------------
304 //fMCTrackList->Reset();
305 fPhotonList->Reset();
306 fHeaderList->Reset();
308 //store event only when it is downscaled min bias
309 // or contais high pt hadron
310 // or contains high energy cluster in EMCAL or PHOS
312 ReadESDCaloClusters(esd);
315 fTree->Fill(); // fill the TTree
322 if(fInputFormat == "AODout") // reading from AOD output handler
325 if(fInputFormat == "AODin") // reading from AOD input handler
326 aod = (AliAODEvent*)InputEvent();
328 cout << "Error: Not correct InputDataFormat especified " << endl;
333 ReadAODCaloClusters(aod);
336 fTree->Fill(); // fill the TTree
345 //______________________________________________________________________________
346 void AliJCORRANTask::Init()
348 // Intialisation of parameters
349 AliInfo("Doing initialization") ;
353 //______________________________________________________________________________
354 void AliJCORRANTask::Terminate(Option_t *)
356 // Processing when the event loop is ended
358 if(fInputFormat == "AODout") ReadFilter(); // change it to save this info also from AODin !!!!
360 ((AliJRunHeader *) (fTree->GetUserInfo())->First())->PrintOut();
362 cout<<"PWG4JCORRAN Analysis DONE !!"<<endl;
365 //______________________________________________________________________________
366 void AliJCORRANTask::ReadESDTracks(const AliESDEvent * esd)
369 // Read the AliESDtrack and fill the list of AliJTrack containers
370 Int_t nt = esd->GetNumberOfTracks();
371 // if(fDebug < 5) cout << "ESD::NumberOfTracks = " << nt << endl;
372 Float_t ptot, pt, eta;
378 for(Int_t it = 0; it < nt; it++) {
380 AliESDtrack *track = esd->GetTrack(it);
381 if(! fEsdTrackCuts->IsSelected(track)) continue; //FK// apply loose selection criteria
383 UInt_t status = track->GetStatus();
385 Float_t impactXY, impactZ;
386 track->GetImpactParameters(impactXY,impactZ);
387 //------------ T P C ------------
388 Float_t tpcDca[2], tpcCov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
389 track->GetImpactParametersTPC(tpcDca,tpcCov);
391 Float_t tpcDedx = track->GetTPCsignal();
392 Int_t tpcNcls = track->GetTPCNcls();
394 Int_t nClust = track->GetTPCclusters(0);
395 Int_t nFindableClust = track->GetTPCNclsF();
396 Float_t tpcChi2PerCluster = 0.;
397 if(nClust>0.) tpcChi2PerCluster = track->GetTPCchi2()/Float_t(nClust);
399 Float_t tpcClustPerFindClust = 0.;
400 if(nFindableClust>0.) tpcClustPerFindClust = Float_t(nClust)/nFindableClust;
401 //--------------------------------
404 track->GetPxPyPz(mom);
405 p3.SetXYZ(mom[0],mom[1],mom[2]);
406 ptot = track->GetP();
409 track->GetESDpid(pid);
412 track->GetExternalCovariance(extCov);
414 Double_t extDiaCov[5];
415 extDiaCov[0]=extCov[0];
416 extDiaCov[1]=extCov[2];
417 extDiaCov[2]=extCov[5];
418 extDiaCov[3]=extCov[9];
419 extDiaCov[4]=extCov[14];
421 //create a new AliJTrack and fill the track info
422 fTrackList->AddAliJTrack(ntrk);
423 AliJTrack *ctrack = fTrackList->GetAliJTrack(ntrk);
425 ctrack->SetPtot(ptot);
427 ctrack->SetTheta(p3.Theta());
428 ctrack->SetPhi(p3.Phi());
430 ctrack->SetFlavor(kHadron);
431 ctrack->SetCharge(track->Charge());
432 ctrack->ConvertAliPID();
435 Int_t itof = track->GetTOFcluster(); // index of the assigned TOF cluster
436 if(itof>=0) ctrack->SetTof(track->GetTOFsignal());
438 ctrack->SetTPCdEdx(tpcDedx);
439 ctrack->SetTPCnClust(tpcNcls);
440 ctrack->SetTPCDCAXY(tpcDca[0]);
441 ctrack->SetTPCDCAZ(tpcDca[1]);
442 ctrack->SetTPCClustPerFindClust(tpcClustPerFindClust);
443 ctrack->SetTPCChi2PerClust(tpcChi2PerCluster);
444 ctrack->SetImapactXY(impactXY);
445 ctrack->SetImapactZ(impactZ);
447 ctrack->SetKinkIndex(track->GetKinkIndex(0));
448 ctrack->SetStatus(status);
449 ctrack->SetExternalDiaCovariance(extDiaCov);
451 fTrackList->SetNTracks(++ntrk);
456 //______________________________________________________________________________
457 void AliJCORRANTask::ReadAODTracks(const AliAODEvent * aod)
459 // Read the AliAODtrack and fill the list of AliJTrack containers
460 Int_t nt = aod->GetNumberOfTracks();
461 if(fDebug < 5) cout << "AOD::NumberOfTracks = " << nt << endl;
464 for(Int_t it = 0; it < nt; it++) {
466 AliAODTrack *track = aod->GetTrack(it);
467 if(track->GetType() != AliAODTrack::kPrimary) continue; // only primaries
468 if(! fEsdTrackCuts->IsSelected(track)) continue; //apply loose selection criteria
469 //create a new AliJTrack and fill the track info
470 fTrackList->AddAliJTrack(ntrk);
471 AliJTrack *ctrack = fTrackList->GetAliJTrack(ntrk);
473 ctrack->SetPt(track->Pt());
474 ctrack->SetTheta(track->Theta());
475 ctrack->SetPhi(track->Phi());
476 ctrack->SetPID((Double_t*)track->PID());
477 ctrack->SetFlavor(kHadron);
478 ctrack->SetCharge(track->Charge());
479 ctrack->SetChi2perNDF(track->Chi2perNDF());
480 ctrack->SetChi2Trig(track->GetChi2MatchTrigger());
481 ctrack->SetRecFlags(track->GetFlags());
483 fTrackList->SetNTracks(++ntrk);
488 //______________________________________________________________________________
489 void AliJCORRANTask::ReadESDCaloClusters(const AliESDEvent* esd)
491 // Read the AliESDCaloClusters and fill the list of AliJPhoton containers
492 Short_t nPhotons = 0;
493 Int_t numberOfCaloClusters = esd->GetNumberOfCaloClusters() ;
494 if(fDebug < 5) cout << "ESD::number of ESD caloclusters " << numberOfCaloClusters << endl;
495 // loop over all the Calo Clusters
496 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
497 AliESDCaloCluster *caloCluster = esd->GetCaloCluster(icluster) ;
498 if(!caloCluster) continue;
499 if(caloCluster->GetTrackMatched()==-1){
500 if(caloCluster->E()<0.2) continue; //FK//
501 // we will not implement any PID cut here
502 fPhotonList->AddAliJPhoton(nPhotons);
503 AliJPhoton *pht = fPhotonList->GetAliJPhoton(nPhotons);
504 pht->SetFlavor(kPhoton);
505 pht->SetE(caloCluster->E());
506 pht->SetChi2(caloCluster->GetClusterChi2());
507 pht->SetPID(caloCluster->GetPid());
508 Float_t pos[3]; caloCluster->GetPosition(pos) ;
512 pht->SetPhi(atan2(pos[1],pos[0]));
513 pht->SetTheta(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2]));
514 pht->SetPt(caloCluster->E()*sin(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2])));
516 if(caloCluster->IsEMCAL()) pht->SetCaloType(AliJPhoton::kEMCALCalo);
517 if(caloCluster->IsPHOS()) pht->SetCaloType(AliJPhoton::kPHOSCalo);
518 pht->SetDistToBadChannel(caloCluster->GetDistanceToBadChannel());
519 pht->SetDispersion(caloCluster->GetClusterDisp());
520 pht->SetM20(caloCluster->GetM20());
521 pht->SetM02(caloCluster->GetM02());
522 pht->SetEmcCpvDist(caloCluster->GetEmcCpvDistance());
523 pht->SetNCells(caloCluster->GetNCells());
524 pht->SetCellsAbsId(caloCluster->GetCellsAbsId());
525 Int_t imoduleID = GetSuperModuleNumber(caloCluster->IsEMCAL(), caloCluster->GetCellAbsId(0));
526 pht->SetSuperModuleID(imoduleID);
527 // char buffer[20] = "photon";
528 // pht->PrintOut(buffer);
530 fPhotonList->SetNPhotons(++nPhotons);
532 } //PHOS and EMCAL clusters
536 //______________________________________________________________________________
537 void AliJCORRANTask::ReadAODCaloClusters(const AliAODEvent* aod)
539 // Read the AliAODCaloClusters and fill the list of AliJPhoton containers
540 Int_t numberOfCaloClusters = aod->GetNCaloClusters() ;
541 if(fDebug < 5) cout << "AOD::number of ESD caloclusters " << numberOfCaloClusters << endl;
542 Short_t nPhotons = 0;
543 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
544 AliAODCaloCluster * caloCluster = aod->GetCaloCluster(icluster) ;
545 if(!caloCluster) continue;
546 if(caloCluster->GetNTracksMatched() > 0) continue;
547 // we will not implement any PID cut here
548 fPhotonList->AddAliJPhoton(nPhotons);
549 AliJPhoton *pht = fPhotonList->GetAliJPhoton(nPhotons);
551 pht->SetE(caloCluster->E());
552 pht->SetFlavor(kPhoton);
553 pht->SetChi2(caloCluster->Chi2());
554 pht->SetPID((Double_t*)caloCluster->PID());
555 Float_t pos[3]; caloCluster->GetPosition(pos) ;
559 pht->SetPhi(atan2(pos[1],pos[0]));
560 pht->SetTheta(atan2(sqrt(pos[0]*pos[1]+pos[1]*pos[1]),pos[2]));
561 pht->SetPt(caloCluster->E()*sin(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2])));
563 if(caloCluster->IsEMCALCluster()) pht->SetCaloType(AliJPhoton::kEMCALCalo);
564 if(caloCluster->IsPHOSCluster()) pht->SetCaloType(AliJPhoton::kPHOSCalo);
565 pht->SetDistToBadChannel(caloCluster->GetDistToBadChannel());
566 pht->SetDispersion(caloCluster->GetDispersion());
567 pht->SetM20(caloCluster->GetM20());
568 pht->SetM02(caloCluster->GetM02());
569 pht->SetEmcCpvDist(caloCluster->GetEmcCpvDistance());
570 pht->SetNCells(int(caloCluster->GetNCells()));
571 pht->SetCellsAbsId(caloCluster->GetCellsAbsId());
572 Int_t imoduleID = GetSuperModuleNumber(caloCluster->IsEMCALCluster(), caloCluster->GetCellAbsId(0));
573 pht->SetSuperModuleID(imoduleID);
575 fPhotonList->SetNPhotons(++nPhotons);
580 //______________________________________________________________________________
581 void AliJCORRANTask::ReadESDHeader(const AliESDEvent *esd)
583 // Read the AliESDEvent and fill the list of AliJHeader containers
584 Short_t nHeaders = 0;
585 //create a header and fill it
586 fHeaderList->AddAliJHeader(nHeaders);
587 AliJHeader *hdr = fHeaderList->GetAliJHeader(nHeaders);
589 //cout << esd->GetRunNumber() <<"\t"<< esd->GetEventNumberInFile() << endl;
591 AliMultiplicity *fSPDMult =(AliMultiplicity *) esd->GetMultiplicity();
592 hdr->SetSPDTrackletMult(fSPDMult->GetNumberOfTracklets());
594 hdr->SetEventID( esd->GetEventNumberInFile());
596 hdr->SetTriggerMaskAlice(esd->GetTriggerMask()); //ULong64_t
597 hdr->SetTriggerMaskJCorran(ConvertTriggerMask(/*esd->GetTriggerMask()*/)); //UInt_t
599 const AliESDVertex * vtxESD = esd->GetVertex();
600 hdr->SetZVertex(vtxESD->GetZv());
601 hdr->SetZVertexErr(vtxESD->GetZRes());
603 fHeaderList->SetNHeaders(++nHeaders);
606 //______________________________________________________________________________
607 void AliJCORRANTask::ReadAODHeader(const AliAODEvent *aod)
609 //read AOD event header
610 Short_t nHeaders = 0;
611 //create a header and fill it
612 fHeaderList->AddAliJHeader(nHeaders);
613 AliJHeader *hdr = fHeaderList->GetAliJHeader(nHeaders);
615 //load aod event header
616 AliAODHeader * aodh = aod->GetHeader();
618 hdr->SetCentrality(int(aodh->GetCentrality()));
620 hdr->SetTriggerMaskAlice(aodh->GetTriggerMask()); //ULong64_t
621 hdr->SetEventType(aodh->GetEventType());
623 fHeaderList->SetNHeaders(++nHeaders);
626 //______________________________________________________________________________
627 void AliJCORRANTask::ReadFilter()
630 TList* olist = OutputTree()->GetUserInfo();
631 AliAnalysisFilter* trackFilter = (AliAnalysisFilter*)olist->At(0);
633 if(!trackFilter) return;
635 TList* cutslist = trackFilter->GetCuts();
636 //cout << "number of cuts " << cutslist->GetSize();
638 for(int ic = 0; ic< cutslist->GetSize(); ic++){
639 AliESDtrackCuts* icuts = (AliESDtrackCuts*)cutslist->At(ic);
641 // read ESD track quality cuts
643 trkcut[0] = (Float_t)icuts->GetMinNClusterTPC();
644 trkcut[1] = (Float_t)icuts->GetMinNClustersITS();
645 trkcut[2] = (Float_t)icuts->GetMaxChi2PerClusterTPC();
646 trkcut[3] = (Float_t)icuts->GetMaxChi2PerClusterITS();
647 trkcut[4] = (Float_t)icuts->GetRequireTPCRefit();
648 trkcut[5] = (Float_t)icuts->GetRequireITSRefit();
649 trkcut[6] = (Float_t)icuts->GetAcceptKinkDaughters();
650 icuts->GetMaxCovDiagonalElements(trkcut[7],trkcut[8],trkcut[9],trkcut[10],trkcut[11]);
651 trkcut[12] = (Float_t)icuts->GetMaxNsigmaToVertex();
652 trkcut[13] = (Float_t)icuts->GetRequireSigmaToVertex();
654 fTrackQACuts->Fill(trkcut);
656 // read track kinmatic cuts
658 icuts->GetPRange(kinecut[0], kinecut[1]);
659 icuts->GetPtRange(kinecut[2], kinecut[3]);
660 icuts->GetPxRange(kinecut[4], kinecut[5]);
661 icuts->GetPyRange(kinecut[6], kinecut[7]);
662 icuts->GetPzRange(kinecut[8], kinecut[9]);
663 icuts->GetEtaRange(kinecut[10], kinecut[11]);
664 icuts->GetRapRange(kinecut[12], kinecut[13]);
666 fTrackKineCuts->Fill(kinecut);
673 //______________________________________________________________________________
674 Int_t AliJCORRANTask::GetSuperModuleNumber(bool isemcal, Int_t absId)
676 //get super module number
678 return fEMCALGeom->GetSuperModuleNumber(absId) ;
682 fPHOSGeom->AbsToRelNumbering(absId,relId);
690 //_____________________________________________________________________________
692 UInt_t AliJCORRANTask::ConvertTriggerMask(/*Long64_t alicetriggermask*/){
693 //convert alice trigger mask to jcorran trigger mask
694 UInt_t triggerMaskJC=0;
696 Bool_t isSelected = kTRUE;
697 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
699 if(isSelected){ //tag collision candidates
700 triggerMaskJC += (1<<kMinBiasTriggerBitJCorran);
703 return triggerMaskJC;
707 //______________________________________________________________________________
708 bool AliJCORRANTask::StoreDownscaledMinBiasEvent(){
710 bool isThisEventToBeStored = kFALSE;
711 static Long_t evtNumber=0;
713 if( ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() ){
714 //collision candidate
716 if(evtNumber% fDownscaling ==0){ isThisEventToBeStored = kTRUE; } //store every 50th collision candidate event
719 return isThisEventToBeStored;
721 //______________________________________________________________________________
722 bool AliJCORRANTask::ContainsESDHighPtTrack(const AliESDEvent* esd){
723 bool isThisEventToBeStored = kFALSE;
725 Int_t nt = esd->GetNumberOfTracks();
727 for(Int_t it = 0; it < nt; it++) {
728 AliESDtrack *track = esd->GetTrack(it);
729 //Does event contain high pt particle above 2 GeV
730 //which fulfills loose track selection criteria
731 if(track->Pt() > fLowerCutOnLPMom && fEsdTrackCuts->IsSelected(track)){
732 isThisEventToBeStored = kTRUE;
737 return isThisEventToBeStored;
740 //______________________________________________________________________________
741 bool AliJCORRANTask::ContainsESDHighECaloClusters(const AliESDEvent* esd){
742 bool isThisEventToBeStored = kFALSE;
744 Int_t numberOfCaloClusters = esd->GetNumberOfCaloClusters() ;
745 // loop over all the Calo Clusters
746 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
747 AliESDCaloCluster *caloCluster = esd->GetCaloCluster(icluster) ;
748 if(!caloCluster) continue;
749 if(caloCluster->GetTrackMatched()==-1){
750 //sotre calo clusters above 2 GeV
751 if( caloCluster->E() > fLowerCutOnLeadingCaloClusterE){
752 isThisEventToBeStored = kTRUE;
757 return isThisEventToBeStored;
768 void AliJCORRANTask::ReadMCTracks(AliMCEvent *fMC)
770 AliGenEventHeader* genHeader = fMC->GenEventHeader();
771 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
774 Double_t nTrials = 1; // Trials for MC trigger weigth for real data
776 nTrials = pythiaGenHeader->Trials();
777 ptHard = pythiaGenHeader->GetPtHard();
778 //cout << nTrials <<"\t"<< ptHard << endl;
780 AliStack *stack = fMC->Stack();
781 Int_t np = fMC->GetNumberOfTracks();
782 Int_t nprim = stack->GetNtrack();
783 if(np!=nprim) cout << "GetNumberOfTracks = "<< np <<"\t, stack = "<< nprim << endl;
785 for(Int_t itrack = 0; itrack < nprim; itrack++){
786 //create a new JMCTrack and fill the track info
787 fMCTrackList->AddJMCTrack(ntrack);
788 JMCTrack *ctrack = fMCTrackList->GetTrack(ntrack);
789 TParticle *ipart = stack->Particle(itrack);
790 Int_t icode= ipart->GetPdgCode();
791 Float_t pt = ipart->Pt();
792 Float_t eta = ipart->Eta();
793 Float_t phi = ipart->Phi();
794 Int_t status = ipart->GetStatusCode();
795 Bool_t isprim = ipart->IsPrimary();
797 ctrack->SetE(ipart->Energy());
798 ctrack->SetTheta(ipart->Theta());
802 ctrack->SetPtHard(ptHard);
803 ctrack->SetPdgCode(icode);
804 ctrack->SetStatusCode(status);
805 ctrack->SetIsPrimary(isprim);
806 ctrack->SetProductionVertex(ipart->Vx(),ipart->Vx(),ipart->Vz());
808 //bool isInc = (status == 1 && icode == 22); //Inclusive
809 bool ispi0 = (status == 11 && icode == 111); //kPizero
810 bool isDgamma = (status == 6 || status == 7) && icode == 22; // Direct photon
811 bool inPHOS = (ispi0||isDgamma)&&fabs(eta)<0.12;
812 bool inEMCAL = (ispi0||isDgamma)&&fabs(eta)<0.7;
813 bool inTPC = fabs(eta)<0.9;
814 ctrack->SetMother(0,ipart->GetFirstMother());
815 ctrack->SetMother(1,ipart->GetSecondMother());
816 ctrack->SetDaughter(0,ipart->GetFirstDaughter());
817 ctrack->SetDaughter(1,ipart->GetLastDaughter());
818 ctrack->SetIsInPHOS(inPHOS);
819 ctrack->SetIsInEMCAL(inEMCAL);
820 ctrack->SetIsInTPC(inTPC);
822 fMCTrackList->SetNTracks(++ntrack);
823 }// loop for al primary tracks