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>
32 #include <TClonesArray.h>
33 #include <TObjArray.h>
34 #include <TObjString.h>
37 #include <TRefArray.h>
40 #include "AliAnalysisTaskSE.h"
41 #include "AliAODHandler.h"
43 #include "AliJCORRANTask.h"
44 #include "AliAnalysisManager.h"
45 #include "AliESDEvent.h"
46 #include "AliMCEvent.h"
48 #include "AliGenEventHeader.h"
49 #include "AliGenCocktailEventHeader.h"
50 #include "AliGenPythiaEventHeader.h"
51 #include "AliInputEventHandler.h"
52 #include "AliESDCaloCluster.h"
53 #include "AliAODEvent.h"
54 #include "AliAODHeader.h"
56 #include "AliESDVertex.h"
57 #include "AliESDtrack.h"
58 #include "AliAODTrack.h"
59 #include "AliAnalysisFilter.h"
60 #include "AliESDtrackCuts.h"
61 #include "AliAODVertex.h"
62 #include "AliAODTracklets.h"
63 #include "AliAODPid.h"
64 #include "AliESDUtils.h"
65 //#include "AliESDVZERO.h"
66 #include "AliCentrality.h"
67 #include "AliAODTracklets.h"
68 #include "AliMultiplicity.h"
69 #include "AliJConst.h"
70 #include "AliESDRun.h"
71 #include "AliESDVZERO.h"
72 #include "AliExternalTrackParam.h"
74 #include "AliESDCaloCluster.h"
75 #include "AliEMCALGeometry.h"
76 #include "AliVCluster.h"
77 #include "AliVCaloCells.h"
78 #include "AliEMCALRecoUtils.h"
79 #include "AliEMCALPIDUtils.h"
81 #include "AliJTrack.h"
82 #include "AliJMCTrack.h"
83 #include "AliJPhoton.h"
84 #include "AliJEventHeader.h"
85 #include "AliJRunHeader.h"
87 //______________________________________________________________________________
88 AliJCORRANTask::AliJCORRANTask() :
89 AliAnalysisTaskSE("PWG4JCORRAN"),
90 fRunType("LHC10h"), // enable filling EP info
95 fAODName("jcorran.root"),
96 fStoreEventPlaneSource(false),
97 fStoreTPCTrack(false),
115 //Default constructor
116 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
117 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
119 fIsRealOrMC.ResizeTo(1);
122 DefineInput (0, TChain::Class());
123 DefineInput (1, TList::Class());
124 DefineOutput (1, TList::Class());
125 // DefineOutput (2, TList::Class());
128 //______________________________________________________________________________
129 AliJCORRANTask::AliJCORRANTask(const char *name, TString inputformat):
130 AliAnalysisTaskSE(name),
131 fRunType("LHC10h"), // enable filling EP info
132 fInputFormat(inputformat),
136 fAODName("jcorran.root"),
137 fStoreEventPlaneSource(false),
138 fStoreTPCTrack(false),
157 if(fDebug > 5) cout << "---- AliJCORRANTask Constructor ----"<<endl;
159 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
160 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
162 fIsRealOrMC.ResizeTo(1);
166 DefineInput (0, TChain::Class());
167 // DefineInput (1, TList::Class());
168 DefineOutput (1, TList::Class());
169 // DefineOutput (2, TList::Class());
172 //____________________________________________________________________________
173 AliJCORRANTask::AliJCORRANTask(const AliJCORRANTask& ap) :
174 AliAnalysisTaskSE(ap.GetName()),
175 fRunType(ap.fRunType),
176 fInputFormat(ap.fInputFormat),
177 fEsdTrackCuts(ap.fEsdTrackCuts),
178 fESDFilter(ap.fESDFilter),
179 fIsRealOrMC(ap.fIsRealOrMC),
180 fAODName(ap.fAODName),
181 fStoreEventPlaneSource(ap.fStoreEventPlaneSource),
182 fStoreTPCTrack(ap.fStoreTPCTrack),
183 fOADBPath(ap.fOADBPath),
184 fTrackList(ap.fTrackList),
185 fMCTrackList(ap.fMCTrackList),
186 fPhotonList(ap.fPhotonList),
187 fHeaderList(ap.fHeaderList),
188 fRunInfoList(ap.fRunInfoList),
190 fPIDResponse(ap.fPIDResponse),
191 fPIDCombined(ap.fPIDCombined),
192 fVZEROData(ap.fVZEROData),
193 fTZEROData(ap.fTZEROData),
194 //fFMDData(ap.fFMDData),
195 fZDCData(ap.fZDCData),
196 fAliRunHeader(ap.fAliRunHeader),
197 fEMCALGeoUtils(ap.fEMCALGeoUtils),
198 fPHOSGeom(ap.fPHOSGeom)
201 for(int k=0; k < kRangeTriggerTableAlice; k++)
202 fActiveTriggers[k] = ap.fActiveTriggers[k];
204 for(int j=0; j < kRangeTriggerTableJCorran; j++)
205 fTriggerTableJCorran[j] = ap.fTriggerTableJCorran[j];
207 fIsRealOrMC.ResizeTo(1);
209 fIsRealOrMC[0] = ap.fIsRealOrMC[0];
213 //_____________________________________________________________________________
214 AliJCORRANTask& AliJCORRANTask::operator = (const AliJCORRANTask& ap)
216 // assignment operator
218 this->~AliJCORRANTask();
219 new(this) AliJCORRANTask(ap);
223 //______________________________________________________________________________
224 AliJCORRANTask::~AliJCORRANTask()
231 delete fAliRunHeader;
237 delete fEMCALGeoUtils;
247 //________________________________________________________________________
249 void AliJCORRANTask::UserCreateOutputObjects()
251 //=== create the jcorran outputs objects
252 if(fDebug > 1) printf("AliJCORRANTask::UserCreateOutPutData() \n");
254 //=== Get AnalysisManager
255 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
256 if(!man->GetOutputEventHandler()) {
257 Fatal("UserCreateOutputObjects", "This task needs an AOD handler");
260 man->RegisterExtraFile(fAODName.Data());
263 fEMCALGeoUtils = AliEMCALGeometry::GetInstance("EMCAL_COMPLETE");
264 fPHOSGeom = new AliPHOSGeoUtils();
266 //=== Set Tree and TClonesArray
268 AddListAODBranch("AliJTrackList", "AliJTrack", &fTrackList, 1000);
269 AddListAODBranch("AliJPhotonList", "AliJPhoton", &fPhotonList, 1000);
270 if((bool)fIsRealOrMC[0])
271 AddListAODBranch("AliJTMCrackList", "AliJMCTrack", &fMCTrackList, 1000);
273 AddListAODBranch("AliJEventHeaderList", "AliJEventHeader", &fHeaderList, 1000);
275 fAliRunHeader = new AliJRunHeader();
276 fRunInfoList = new TList();
277 fRunInfoList->SetName("RunInfoList");
278 fRunInfoList->SetOwner();
279 fRunInfoList->Clear();
280 fRunInfoList->Add(fAliRunHeader);
282 if( fStoreEventPlaneSource ){
283 fVZEROData = new AliESDVZERO;
284 fTZEROData = new AliESDTZERO;
285 fZDCData = new AliESDZDC;
286 AddAODBranch("AliESDVZERO", &fVZEROData, fAODName.Data());
287 AddAODBranch("AliESDTZERO", &fTZEROData, fAODName.Data());
288 AddAODBranch("AliESDZDC", &fZDCData, fAODName.Data());
291 fPIDesd = new AliESDpid;
292 fPIDCombined = new AliPIDCombined;
293 fPIDCombined->SetDefaultTPCPriors();
294 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
295 fPIDResponse = ((AliInputEventHandler*) (man->GetInputEventHandler()))->GetPIDResponse();
296 fPIDResponse->SetOADBPath(AliAnalysisManager::GetOADBPath());
297 if (!fOADBPath.IsNull()) fPIDResponse->SetOADBPath(fOADBPath.Data());
299 cout << "Add(fAliRunHeader) in UserCreateObject() ======= " << endl;
300 PostData(1,fRunInfoList);
304 //______________________________________________________________________________
305 void AliJCORRANTask::UserExec(Option_t* /*option*/)
308 // Processing of one event
309 if(fDebug > 5) cout << "------- AliJCORRANTask Exec-------"<<endl;
310 if(!((Entry()-1)%100)) AliInfo(Form(" Processing event # %lld", Entry()));
314 if((bool)fIsRealOrMC[0]) fMCTrackList->Clear();
315 fPhotonList->Clear();
316 fHeaderList->Clear();
318 //=== COMMON for ESD and AOD
320 AliVEvent *event = InputEvent();
322 AliMCEvent* mcEvent = NULL;
323 if((bool)fIsRealOrMC[0]) mcEvent = MCEvent();
325 if(event->GetRunNumber() != runId){ //new run has started
326 runId = event->GetRunNumber();
327 //Polarity of magnetic field in L3 solenoid
328 Short_t l3MgFieldPolarity=0; // (LHC convention: +current -> +Bz)
329 //Create internal JCorran trigger mask. Mapping between trigger and trigger bit
330 fTriggerTableJCorran[kMinBiasTriggerBitJCorran]="Minimum Bias";//minimum bias occupies first trigger bit
331 fTriggerTableJCorran[kHighMultTriggerBitJCorran]="High Multiplicity";//high multiplicity trigger => second trigger bit
332 //=========== Fill Run header object ===============
333 fAliRunHeader->SetRunNumber(runId);
334 fAliRunHeader->SetActiveTriggersJCorran(fTriggerTableJCorran,kRangeTriggerTableJCorran);
335 SetAliceTriggerDef(fAliRunHeader);//TODO for AOD
336 SetAliceFilterMapDef(fAliRunHeader);// TODO for AOD
338 if(fInputFormat=="ESD"){
339 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
341 if(esd->GetCurrentL3() >0) l3MgFieldPolarity = 1;
342 if(esd->GetCurrentL3() <0) l3MgFieldPolarity = -1;
343 fAliRunHeader->SetL3Field(l3MgFieldPolarity, esd->GetMagneticField());
344 const AliESDRun* esdRun = esd->GetESDRun();
345 for(Int_t triggerBit=0; triggerBit<kRangeTriggerTableAlice; triggerBit++){
346 fActiveTriggers[triggerBit] = esdRun->GetTriggerClass(triggerBit);
348 fAliRunHeader->SetActiveTriggersAlice(fActiveTriggers);
350 fRunInfoList->Add(fAliRunHeader);
351 cout << "Add(fAliRunHeader) is done =============" << endl;
355 if(fInputFormat=="ESD"){ //Reading ESD
356 if(fDebug > 5) cout << "\t------- Start ESD "<<endl;
357 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
361 //ReadESDCaloClusters(esd);
362 if((bool)fIsRealOrMC[0]) ReadMCTracks(mcEvent);
363 }else if( fInputFormat == "AOD") {
364 if(fDebug > 5) cout << "\t------- Start AOD "<<endl;
365 AliAODEvent* aod = dynamic_cast<AliAODEvent*>(event);
369 //ReadAODCaloClusters(aod);
371 cout << "Error: Not correct InputDataFormat especified " << endl;
375 //=== TODO : need this?
376 AliAODHandler* outputHandler =
377 (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
378 outputHandler->SetFillAOD(kTRUE);
379 outputHandler->SetFillExtension(kTRUE);
380 PostData(1,fRunInfoList);
382 if(fDebug > 5) cout << "\t------- End UserExec "<<endl;
385 //______________________________________________________________________________
386 void AliJCORRANTask::Init()
388 // Intialisation of parameters
389 AliInfo("Doing initialization") ;
391 TString formula(fEsdTrackCuts->GetMaxDCAToVertexXYPtDep());
392 if(formula.Length()>0){ // momentum dep DCA cut for AOD
393 formula.ReplaceAll("pt","x");
397 //______________________________________________________________________________
398 void AliJCORRANTask::Terminate(Option_t *)
400 // Processing when the event loop is ended
401 cout<<"PWG4JCORRAN Analysis DONE !!"<<endl;
402 // Printout fRunInfoList here
403 fRunInfoList = dynamic_cast<TList*> (GetOutputData(1));
406 fAliRunHeader = dynamic_cast<AliJRunHeader*> (fRunInfoList->FindObject("AliJRunHeader"));
407 if(fAliRunHeader) {fAliRunHeader->Print();}
411 cout << "WARNING : Run Information List is empty" << endl;
416 //______________________________________________________________________________
417 void AliJCORRANTask::ReadESDTracks(AliESDEvent * esd)
418 //void AliJCORRANTask::ReadESDTracks(const AliESDEvent * esd)
420 // Read the AliESDtrack and fill the list of AliJTrack containers
421 Int_t nt = esd->GetNumberOfTracks();
422 if(fDebug > 5) cout << "ESD::NumberOfTracks = " << nt << endl;
426 for(Int_t it = 0; it < nt; it++) {
428 AliESDtrack *track = esd->GetTrack(it);
429 if( !track ) continue;
430 if(! fEsdTrackCuts->IsSelected(track)) continue; // apply track selection criteria
431 UInt_t filterMap = fESDFilter->IsSelected( track );
432 //------------ T P C ------------
433 Float_t tpcDca[2], tpcCov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
434 track->GetImpactParametersTPC(tpcDca,tpcCov);
436 Int_t nClust = track->GetTPCclusters(0);
437 Int_t nFindableClust = track->GetTPCNclsF();
438 Float_t tpcChi2PerCluster = 0.;
439 if(nClust>0.) tpcChi2PerCluster = track->GetTPCchi2()/Float_t(nClust);
441 Float_t tpcClustPerFindClust = 0.;
442 if(nFindableClust>0.) tpcClustPerFindClust = Float_t(nClust)/nFindableClust;
443 //--------------------------------
445 //create a new AliJTrack and fill the track info
446 AliJTrack * ctrack = new( (*fTrackList)[fTrackList->GetEntriesFast()] ) AliJTrack;
447 ctrack->SetPxPyPzE(track->Px(), track->Py(), track->Pz(), 0 );
448 ctrack->SetTPCdEdx( track->GetTPCsignal() );
449 if( fStoreTPCTrack ){
450 AliESDtrack *tpcTrack = AliESDtrackCuts::GetTPCOnlyTrack( esd, it );
451 if( !tpcTrack ) continue;
452 ctrack->SetTPCTrack( tpcTrack->Px(), tpcTrack->Py(), tpcTrack->Pz());
454 ReadESDPID( track, ctrack );
455 ctrack->SetParticleType(kNone);
456 ctrack->SetCharge(track->Charge());
457 ctrack->SetFilterMap( filterMap );
459 if(fDebug > 5 && track->P()>1 ) cout << "P = " << track->P() << endl;
465 //_________________________________________________________________________________-
466 void AliJCORRANTask::ReadESDPID(AliESDtrack *track, AliJTrack *ctrack)
468 // Probability calculation for PID
469 Double_t probTPC[AliPID::kSPECIES]={0.};
470 Double_t probTOF[AliPID::kSPECIES]={0.};
471 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
473 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
474 UInt_t detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
475 if (detUsed != 0) { // TPC is available
476 for (Int_t ispec=0; ispec<AliPID::kSPECIES; ++ispec) {
477 Double_t nSigmaTPC = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)ispec);
478 ctrack->SetTPCsigma(AliJTrack::AliJTrkPID(ispec), nSigmaTPC);
481 // compute priors for TPC+TOF, even if we ask just TOF for PID
482 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
483 detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
484 if (detUsed != 0) { // TOF is available
485 for (Int_t ispec=0; ispec<AliPID::kSPECIES; ++ispec) {
486 Double_t nSigmaTOF = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)ispec);
487 ctrack->SetTOFsigma(AliJTrack::AliJTrkPID(ispec), nSigmaTOF);
491 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
492 detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
495 for (int ip=0 ; ip < (AliPID::kSPECIES); ip++) {
496 ctrack->SetPID(AliJTrack::AliJTrkPID(ip), probTOF[ip], AliJTrack::kTOF);
497 ctrack->SetPID(AliJTrack::AliJTrkPID(ip), probTPC[ip], AliJTrack::kTPC);
498 ctrack->SetPID(AliJTrack::AliJTrkPID(ip), probTPCTOF[ip], AliJTrack::kTPCTOF);
501 // TOF beta and expected beta
502 Float_t beta = -1; Float_t minP = 0.2; Float_t minTPCsignal = 40; Float_t minTOFLength = 365.; Float_t minTOFsignal = 12000;
503 Double_t inttimes[10]; Float_t betaTh[10]; Double_t dEdxTh[10];
504 track->GetIntegratedTimes(inttimes);
505 for(int i=0;i<10;i++) {
506 betaTh[i] = -1.; // initialize expected beta = -1
507 dEdxTh[i] = -1.; // initialize expected dEdx = -1
509 if(track->P() > minP && track->GetTPCsignal() > minTPCsignal && (track->GetStatus() & AliESDtrack::kTOFout)
510 && (track->GetStatus() & AliESDtrack::kTIME) && (track->GetIntegratedLength() > minTOFLength)&& track->GetTOFsignal() > minTOFsignal) {
511 Double_t consCal = 33.3564095198152043;
512 beta = track->GetIntegratedLength() / (track->GetTOFsignal() - fPIDesd->GetTOFResponse().GetStartTime(track->P())) * consCal;
513 for(int i=0; i<10; i++) {
514 betaTh[i] = track->GetIntegratedLength() / ( inttimes[i] ) * consCal;
517 ctrack->SetTOFbeta(beta);
520 track->GetInnerPxPyPz(ptpc);
521 Float_t momtpc=TMath::Sqrt(ptpc[0]*ptpc[0] + ptpc[1]*ptpc[1] + ptpc[2]*ptpc[2]);
522 for(int ip=0; ip < (AliJTrack::kNAliJTrkPID); ip++) {
523 ctrack->SetExpectedTOFbeta(AliJTrack::AliJTrkPID(ip), betaTh[ip]);
525 dEdxTh[ip] = fPIDesd->GetTPCResponse().GetExpectedSignal(momtpc, AliPID::EParticleType(ip));
526 ctrack->SetExpectedTPCdEdx(AliJTrack::AliJTrkPID(ip), dEdxTh[ip]);
533 //______________________________________________________________________________
534 void AliJCORRANTask::ReadAODTracks(const AliAODEvent * aod)
536 // Read the AliAODtrack and fill the list of AliJTrack containers
537 Int_t nt = aod->GetNumberOfTracks();
538 if(fDebug > 5) cout << "AOD::NumberOfTracks = " << nt << endl;
539 cout << "AOD::NumberOfTracks = " << nt << endl;
542 for(Int_t it = 0; it < nt; it++) {
544 AliAODTrack *track = aod->GetTrack(it);
545 //if(!AcceptAODTrack(track)) continue;
546 //if(! fEsdTrackCuts->IsSelected(track)) continue; //apply loose selection criteria
547 //FK//if(track->GetType() != AliAODTrack::kPrimary) continue; // only primaries
549 AliJTrack * ctrack = new( (*fTrackList)[fTrackList->GetEntriesFast()] ) AliJTrack;
550 ctrack->SetPxPyPzE(track->Px(), track->Py(), track->Pz(), 0 );
551 //TODO if( fStoreTPCTrack )
552 ctrack->SetParticleType(kNone);
553 ctrack->SetCharge(track->Charge());
554 ctrack->SetStatus(track->GetStatus());//
555 ctrack->SetFlags( track->GetFlags() );
556 ctrack->SetLabel( track->GetLabel() );
559 for( unsigned int i=0;i<sizeof(filterMap)*8;i++ ){
560 filterMap |= track->TestFilterBit( 1UL<<i );
562 ctrack->SetFilterMap( filterMap );
565 double const * pid = track->PID();
566 ctrack->SetPID(AliJTrack::kElectronAliJ,pid[AliAODTrack::kElectron],AliJTrack::kTOF);
567 ctrack->SetPID(AliJTrack::kMuonAliJ, pid[AliAODTrack::kMuon], AliJTrack::kTOF);
568 ctrack->SetPID(AliJTrack::kPionAliJ, pid[AliAODTrack::kPion], AliJTrack::kTOF);
569 ctrack->SetPID(AliJTrack::kKaonAliJ, pid[AliAODTrack::kKaon], AliJTrack::kTOF);
570 ctrack->SetPID(AliJTrack::kProtonAliJ, pid[AliAODTrack::kProton], AliJTrack::kTOF);
572 ctrack->SetTPCnClust(track->GetTPCNcls());
573 ctrack->SetTPCdEdx( track->GetTPCsignal() );
575 if((bool) fIsRealOrMC[0]){
576 //Int_t label = track->GetLabel();
577 //ctrack->SetITSLabel(label);
578 //ctrack->SetTPCLabel(label);
582 if(fDebug > 5 && track->P()>1 ) cout << "P = " << track->P() << endl;
586 //______________________________________________________________________________
587 void AliJCORRANTask::ReadESDCaloClusters(const AliESDEvent* esd)
589 //AliVEvent * event = InputEvent();
590 AliVEvent * event = (AliVEvent*)esd;
591 TRefArray *caloClustersArr=new TRefArray();
592 event->GetEMCALClusters(caloClustersArr);
594 event->GetPrimaryVertex()->GetXYZ(v);
596 AliEMCALRecoUtils * fRecoUtils = new AliEMCALRecoUtils;
598 //const Int_t kNumberOfEMCALClusters =caloClustersArr->GetEntries();
599 Int_t numberOfCaloClusters = caloClustersArr->GetEntries() ;
600 if(fDebug > 5) cout << "ESD::number of ESD caloclusters " << numberOfCaloClusters << endl;
602 AliVCaloCells *emCells =event->GetEMCALCells();
605 for(Int_t icluster=0; icluster<numberOfCaloClusters; icluster++){
606 AliVCluster *c1 = (AliVCluster*) caloClustersArr->At(icluster);
608 //== remove bad channels
609 if(fRecoUtils->ClusterContainsBadChannel(fEMCALGeoUtils, c1->GetCellsAbsId(), c1->GetNCells())) continue;
610 //== check energy and position
611 if(fRecoUtils->IsRecalibrationOn()){
612 fRecoUtils->RecalibrateClusterEnergy(fEMCALGeoUtils, c1, emCells);
613 fRecoUtils->RecalculateClusterShowerShapeParameters(fEMCALGeoUtils, emCells, c1);
614 fRecoUtils->RecalculateClusterPID(c1);
616 //== correct non linearity
617 c1->SetE(fRecoUtils->CorrectClusterEnergyLinearity(c1));
619 //== corrected clusters
620 if(c1->E() < 0.8 || c1->E() > 30) continue; //TODO
621 //fRecoUtils->GetMaxEnergyCell(fEMCALGeo, emCells, c1, absID1, iSM, ieta1, iphi1, shared);
623 AliJPhoton *pht = new( (*fPhotonList)[nPhotons++] ) AliJPhoton;
624 pht->SetParticleType(kNone);//kPhoton);
625 pht->SetChi2(c1->Chi2());
626 pht->SetPID(c1->GetPID());
629 c1->GetPosition(pos);
630 c1->GetMomentum(p1, v);
632 pht->SetPositionX(pos[0]);
633 pht->SetPositionY(pos[1]);
634 pht->SetPositionZ(pos[2]);
635 pht->SetPxPyPzE( p1.Px(), p1.Py(), p1.Pz(), p1.E());
636 pht->SetTrackDx( c1->GetTrackDx() );
637 pht->SetTrackDz( c1->GetTrackDz() );
639 if(c1->IsEMCAL()) pht->SetCaloType(AliJPhoton::kEMCALCalo);
640 if(c1->IsPHOS()) pht->SetCaloType(AliJPhoton::kPHOSCalo);
641 pht->SetDistToBadChannel(c1->GetDistanceToBadChannel());
642 pht->SetDispersion(c1->GetDispersion());
643 pht->SetM20(c1->GetM20());
644 pht->SetM02(c1->GetM02());
645 pht->SetEmcCpvDist(c1->GetEmcCpvDistance());
646 pht->SetNCells(c1->GetNCells());
647 pht->SetCellsAmplitudeFraction( c1->GetCellsAmplitudeFraction() );
648 pht->SetCellsAbsId(c1->GetCellsAbsId());
649 Int_t imoduleID = GetSuperModuleNumber(c1->IsEMCAL(), c1->GetCellAbsId(0));
650 pht->SetSuperModuleID(imoduleID);
653 delete caloClustersArr;
657 //______________________________________________________________________________
658 void AliJCORRANTask::ReadAODCaloClusters(const AliAODEvent* aod)
661 // Read the AliAODCaloClusters and fill the list of AliJPhoton containers
664 //______________________________________________________________________________
665 AliJEventHeader* AliJCORRANTask::ReadCommonHeader(AliVEvent *event){
666 //Read the AliVEvent and fill the list of AliJEventHeader containers
667 //create a header and fill it
668 AliJEventHeader *hdr = new( (*fHeaderList)[fHeaderList->GetEntriesFast()] ) AliJEventHeader;
670 AliVVZERO *v0 = event->GetVZEROData();
671 if( v0 ) hdr->SetV0Mult(v0->GetMTotV0A() + v0->GetMTotV0C());
672 // Get Centrality as a percent from 0% to 100%
673 AliCentrality *cent = event->GetCentrality();
675 hdr->SetCentrality( cent->GetCentralityPercentile("V0M"));
676 hdr->SetCentralityArray(AliJEventHeader::kcV0M, cent->GetCentralityPercentile("V0M"));
677 hdr->SetCentralityArray(AliJEventHeader::kcFMD, cent->GetCentralityPercentile("FMD"));
678 hdr->SetCentralityArray(AliJEventHeader::kcTRK, cent->GetCentralityPercentile("TRK"));
679 hdr->SetCentralityArray(AliJEventHeader::kcTKL, cent->GetCentralityPercentile("TKL"));
680 hdr->SetCentralityArray(AliJEventHeader::kcCL0, cent->GetCentralityPercentile("CL0"));
681 hdr->SetCentralityArray(AliJEventHeader::kcCL1, cent->GetCentralityPercentile("CL1"));
682 hdr->SetCentralityArray(AliJEventHeader::kcV0MvsFMD, cent->GetCentralityPercentile("V0MvsFMD"));
683 hdr->SetCentralityArray(AliJEventHeader::kcTKLvsV0, cent->GetCentralityPercentile("TKLvsV0"));
684 hdr->SetCentralityArray(AliJEventHeader::kcZEMvsZDC, cent->GetCentralityPercentile("ZEMvsZDC"));
686 hdr->SetTriggerMaskAlice(event->GetTriggerMask()); //ULong64_t
687 hdr->SetTriggerMaskJCorran(ConvertTriggerMask()); //UInt_t
688 hdr->SetEventType(event->GetEventType());
689 int ncontributors = 0;
690 const AliVVertex * vtxESD = event->GetPrimaryVertex();
692 hdr->SetXVertex(vtxESD->GetX()); //FK// EFF
693 hdr->SetYVertex(vtxESD->GetY()); //FK// EFF
694 hdr->SetZVertex(vtxESD->GetZ());
695 //hdr->SetZVertexErr(vtxESD->GetZRes());
697 vtxESD->GetCovarianceMatrix(covMat);
698 hdr->SetZVertexErr(TMath::Sqrt(covMat[5])); // GetZRes := TMath::Sqrt(fCovZZ)
699 ncontributors = vtxESD->GetNContributors(); // get number of contributors to vertex
700 hdr->SetVtxMult( vtxESD->GetNContributors() );
702 hdr->SetZVertex(9999);
703 hdr->SetZVertexErr(9999);
705 hdr->SetVtxMult(ncontributors); //FK// EFF contrib to vertex
708 //______________________________________________________________________________
709 void AliJCORRANTask::ReadESDHeader(AliESDEvent *esd)
711 // Read the AliESDEvent and fill the list of AliJEventHeader containers
713 AliESDUtils::RefitESDVertexTracks( esd ); // TODO only for LHC11a right?
714 AliJEventHeader *hdr = ReadCommonHeader( esd );
715 //create a header and fill it
716 AliMultiplicity *fSPDMult =(AliMultiplicity *) esd->GetMultiplicity();
717 if(fSPDMult) hdr->SetSPDTrackletMult(fSPDMult->GetNumberOfTracklets());
719 //TODO Store Detector data
720 if( fStoreEventPlaneSource ){
721 *fVZEROData = *esd->GetVZEROData();
722 *fTZEROData = AliESDTZERO(*esd->GetESDTZERO());
723 *fZDCData = *esd->GetESDZDC();
725 hdr->SetEventID( esd->GetEventNumberInFile());
726 const AliESDVertex * vtxESD = esd->GetPrimaryVertex();
727 if( vtxESD->GetStatus() == 0 ) hdr->SetVtxMult( 0 );
728 // if fNcontributes > 0 then status is always true. do we need this?
731 //______________________________________________________________________________
732 void AliJCORRANTask::ReadAODHeader(AliAODEvent *aod)
734 //Read the AliAODEvent and fill the list of AliJEventHeader containers
735 AliJEventHeader *hdr = ReadCommonHeader( aod );
737 const AliAODTracklets *trackletsSPD = aod->GetTracklets();
739 hdr->SetSPDTrackletMult(trackletsSPD->GetNumberOfTracklets());
741 //TODO hdr->SetEventID( esd->GetEventNumberInFile());
744 //______________________________________________________________________________
745 Int_t AliJCORRANTask::GetSuperModuleNumber(bool isemcal, Int_t absId)
747 //get super module number
749 // return GetEMCALGeoUtils()->GetSuperModuleNumber(absId) ;
750 return fEMCALGeoUtils->GetSuperModuleNumber(absId) ;
755 fPHOSGeom->AbsToRelNumbering(absId,relId);
756 fPHOSGeom->AbsToRelNumbering(absId,relId);
764 //_____________________________________________________________________________
766 UInt_t AliJCORRANTask::ConvertTriggerMask(){
768 //convert alice trigger mask to jcorran trigger mask
769 UInt_t triggerMaskJC=0;
770 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
771 ->IsEventSelected() & AliVEvent::kMB){
772 // minimum bias TBit 0
773 triggerMaskJC += (1<<kMinBiasTriggerBitJCorran);
776 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
777 ->IsEventSelected() & AliVEvent::kHighMult){
778 //high multiplicity trigger TBit 1
779 triggerMaskJC += (1<<kHighMultTriggerBitJCorran);
782 return triggerMaskJC;
786 //______________________________________________________________________________
788 void AliJCORRANTask::ReadMCTracks(AliMCEvent *fMC){
789 //store MC information from AliStack
790 AliStack *stack = fMC->Stack();
791 Int_t np = fMC->GetNumberOfTracks();
793 // AliGenEventHeader* genHeader = fMC->GenEventHeader();
794 // AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
795 // Double_t ptHard = 0;
796 // Double_t nTrials = 1; // Trials for MC trigger weigth for real data
797 // nTrials = pythiaGenHeader->Trials();
798 // ptHard = pythiaGenHeader->GetPtHard();
799 // Int_t nprim = stack->GetNtrack();
803 for(Int_t iTrack = 0; iTrack < np; iTrack++){
804 AliMCParticle *track = (AliMCParticle*) fMC->GetTrack(iTrack);
806 Printf("ERROR: Could not receive track %d", iTrack);
809 Bool_t isPrimary = fMC->Stack()->IsPhysicalPrimary(iTrack);
811 //create a new JMCTrack and fill the track info
812 AliJMCTrack *ctrack = new( (*fMCTrackList)[ntrack++] ) AliJMCTrack;;
814 TParticle *partStack = stack->Particle(iTrack);
815 Int_t pdg = partStack->GetPdgCode();
816 // BS unused : Float_t engy = partStack->Energy();
817 // BS unused : Float_t pt = partStack->Pt();
818 // BS unused : Float_t ptot = partStack->P();
819 // BS unused : Float_t eta = partStack->Eta();
820 // BS unused : Float_t theta = partStack->Theta();
821 // BS unused : Float_t phi = atan2(sin( partStack->Phi()), cos(partStack->Phi()));
822 // BS unused : Short_t ch = (Short_t) partStack->GetPDG()->Charge();
823 Int_t label = track->GetLabel();
825 ctrack->SetLabel(label);
826 ctrack->SetPdgCode(pdg);
827 ctrack->SetPxPyPzE( partStack->Px(), partStack->Py(), partStack->Pz(), partStack->Energy());
828 //ctrack->SetCharge(ch);
829 ctrack->SetFlag(AliJMCTrack::kPrimary, isPrimary);
831 ctrack->SetProductionVertex(partStack->Vx(),partStack->Vy(),partStack->Vz());
833 Int_t status = partStack->GetStatusCode();
834 ctrack->SetStatusCode(status);
836 //ctrack->SetPtHard(ptHard);
838 //bool isInc = (status == 1 && icode == 22); //Inclusive
839 bool ispi0 = (status == 11 && pdg == 111); //kPizero
840 bool isDgamma = (status == 6 || status == 7) && pdg == 22; // Direct photon
841 bool inPHOS = (ispi0||isDgamma)&&fabs(eta)<0.12;
842 bool inEMCAL = (ispi0||isDgamma)&&fabs(eta)<0.7;
843 bool inTPC = fabs(eta)<0.9;
844 ctrack->SetMother(0,partStack->GetFirstMother());
845 ctrack->SetMother(1,partStack->GetSecondMother());
846 ctrack->SetDaughter(0,partStack->GetFirstDaughter());
847 ctrack->SetDaughter(1,partStack->GetLastDaughter());
848 ctrack->SetIsInPHOS(inPHOS);
849 ctrack->SetIsInEMCAL(inEMCAL);
850 ctrack->SetIsInTPC(inTPC);
852 }// loop for al primary tracks
856 //--------------------------------------------------------------------
857 bool AliJCORRANTask::AcceptAODTrack(AliAODTrack* aodTrack){
858 //This function mimics for the AliAODTracks object the AliESDtrackCut function IsSelected
859 //Cuts are taken from fEsdTrackCuts object
860 if(fEsdTrackCuts->GetMinNClusterTPC() > aodTrack->GetTPCNcls()) return kFALSE;
862 //if(fEsdTrackCuts->GetMaxChi2PerClusterTPC() < );//<-------- how to check?
863 // ctrack->SetChi2perNDF(track->Chi2perNDF());
865 // C h e c k r e f i t
868 if(fEsdTrackCuts->GetRequireTPCRefit() &&
869 ((aodTrack->GetStatus() & AliJTrack::kTPCrefit) == 0)) return kFALSE;
870 if(fEsdTrackCuts->GetRequireITSRefit() &&
871 ((aodTrack->GetStatus() & AliJTrack::kITSrefit) == 0)) return kFALSE;
875 Float_t impactDCA[3];
876 if( aodTrack->GetPosition(impactDCA)){
877 if((fEsdTrackCuts->GetMaxDCAToVertexXY()>0) &&
878 (fEsdTrackCuts->GetMaxDCAToVertexXY() < sqrt(impactDCA[0]*impactDCA[0] + impactDCA[1]*impactDCA[1]))) return kFALSE;
879 if((fEsdTrackCuts->GetMaxDCAToVertexZ()>0) &&
880 (fEsdTrackCuts->GetMaxDCAToVertexZ() < TMath::Abs(impactDCA[2]))) return kFALSE;
881 } else return kFALSE;
885 // if(fEsdTrackCuts->GetAcceptKinkDaughters()) //<--------how to check ?
886 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
892 bool AliJCORRANTask::SetAliceTriggerDef(AliJRunHeader *RunInfo){
893 RunInfo->AddAliceTriggerDef( "kMB", AliVEvent::kMB );
894 if( fRunType == "LHC10h" )
896 RunInfo->AddAliceTriggerDef( "kINT7", AliVEvent::kINT7 );
897 RunInfo->AddAliceTriggerDef( "kMUON", AliVEvent::kMUON );
898 RunInfo->AddAliceTriggerDef( "kHighMult", AliVEvent::kHighMult );
899 RunInfo->AddAliceTriggerDef( "kEMC1", AliVEvent::kEMC1 );
900 RunInfo->AddAliceTriggerDef( "kCINT5", AliVEvent::kCINT5 );
901 RunInfo->AddAliceTriggerDef( "kCMUS5", AliVEvent::kCMUS5 );
902 RunInfo->AddAliceTriggerDef( "kMUSH7", AliVEvent::kMUSH7 );
903 RunInfo->AddAliceTriggerDef( "kMUL7", AliVEvent::kMUL7 );
904 RunInfo->AddAliceTriggerDef( "kMUU7", AliVEvent::kMUU7 );
905 RunInfo->AddAliceTriggerDef( "kEMC7", AliVEvent::kEMC7 );
906 RunInfo->AddAliceTriggerDef( "kMUS7", AliVEvent::kMUS7 );
907 RunInfo->AddAliceTriggerDef( "kPHI1", AliVEvent::kPHI1 );
908 RunInfo->AddAliceTriggerDef( "kPHI7", AliVEvent::kPHI7 );
909 RunInfo->AddAliceTriggerDef( "kUserDefined", AliVEvent::kUserDefined );
910 RunInfo->AddAliceTriggerDef( "kFastOnly", AliVEvent::kFastOnly );
911 RunInfo->AddAliceTriggerDef( "kAny", AliVEvent::kAny );
912 RunInfo->AddAliceTriggerDef( "kAnyINT", AliVEvent::kAnyINT );
916 RunInfo->AddAliceTriggerDef( "kINT7", AliVEvent::kINT7 );
917 RunInfo->AddAliceTriggerDef( "kMUON", AliVEvent::kMUON );
918 RunInfo->AddAliceTriggerDef( "kHighMult", AliVEvent::kHighMult );
919 RunInfo->AddAliceTriggerDef( "kEMC1", AliVEvent::kEMC1 );
920 RunInfo->AddAliceTriggerDef( "kCINT5", AliVEvent::kCINT5 );
921 RunInfo->AddAliceTriggerDef( "kCMUS5", AliVEvent::kCMUS5 );
922 RunInfo->AddAliceTriggerDef( "kMUSH7", AliVEvent::kMUSH7 );
923 RunInfo->AddAliceTriggerDef( "kMUL7", AliVEvent::kMUL7 );
924 RunInfo->AddAliceTriggerDef( "kMUU7", AliVEvent::kMUU7 );
925 RunInfo->AddAliceTriggerDef( "kEMC7", AliVEvent::kEMC7 );
926 RunInfo->AddAliceTriggerDef( "kMUS7", AliVEvent::kMUS7 );
927 RunInfo->AddAliceTriggerDef( "kPHI1", AliVEvent::kPHI1 );
928 RunInfo->AddAliceTriggerDef( "kPHI7", AliVEvent::kPHI7 );
929 RunInfo->AddAliceTriggerDef( "kUserDefined", AliVEvent::kUserDefined );
930 RunInfo->AddAliceTriggerDef( "kFastOnly", AliVEvent::kFastOnly );
931 RunInfo->AddAliceTriggerDef( "kAny", AliVEvent::kAny );
932 RunInfo->AddAliceTriggerDef( "kAnyINT", AliVEvent::kAnyINT );
937 bool AliJCORRANTask::SetAliceFilterMapDef(AliJRunHeader *RunInfo) {
938 if( fRunType == "LHC10h" )
940 RunInfo->AddAliceFilterMapDef("EsdTrackCutsL",BIT(0));
941 RunInfo->AddAliceFilterMapDef("EsdTrackCutsITsa",BIT(1));
942 RunInfo->AddAliceFilterMapDef("ItsStrong",BIT(2));
943 RunInfo->AddAliceFilterMapDef("ElectronID",BIT(3));
944 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH",BIT(4));
945 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH2",BIT(5));
946 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH3",BIT(6));
947 RunInfo->AddAliceFilterMapDef("EsdTrackCutsTPCOnly",BIT(7));
948 RunInfo->AddAliceFilterMapDef("EsdTrackCutsRaa",BIT(8));
953 RunInfo->AddAliceFilterMapDef("EsdTrackCutsL",BIT(0));
954 RunInfo->AddAliceFilterMapDef("EsdTrackCutsITsa",BIT(1));
955 RunInfo->AddAliceFilterMapDef("ItsStrong",BIT(2));
956 RunInfo->AddAliceFilterMapDef("ElectronID",BIT(3));
957 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH",BIT(4));
958 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH2",BIT(5));
959 RunInfo->AddAliceFilterMapDef("EsdTrackCutsH3",BIT(6));
960 RunInfo->AddAliceFilterMapDef("EsdTrackCutsTPCOnly",BIT(7));
961 RunInfo->AddAliceFilterMapDef("EsdTrackCutsRaa",BIT(8));
966 void AliJCORRANTask::PrintOut() {
967 AliJRunHeader * RunInfo = fAliRunHeader;
968 cout << "===== TriggerDef =====" << endl;
969 cout << RunInfo->GetAliceTriggerDef("kMB") << endl;
970 cout << RunInfo->GetAliceTriggerDef("kINT7") << endl;
971 cout << RunInfo->GetAliceTriggerDef("kMUON") << endl;
972 cout << RunInfo->GetAliceTriggerDef("kHighMult") << endl;
973 cout << RunInfo->GetAliceTriggerDef("kEMC1") << endl;
974 cout << RunInfo->GetAliceTriggerDef("kCINT5") << endl;
975 cout << RunInfo->GetAliceTriggerDef("kCMUS5") << endl;
976 cout << RunInfo->GetAliceTriggerDef("kMUSH7") << endl;
977 cout << RunInfo->GetAliceTriggerDef("kMUL7") << endl;
978 cout << RunInfo->GetAliceTriggerDef("kMUU7") << endl;
979 cout << RunInfo->GetAliceTriggerDef("kEMC7") << endl;
980 cout << RunInfo->GetAliceTriggerDef("kMUS7") << endl;
981 cout << RunInfo->GetAliceTriggerDef("kPHI1") << endl;
982 cout << RunInfo->GetAliceTriggerDef("kPHI7") << endl;
983 cout << RunInfo->GetAliceTriggerDef("kUserDefined") << endl;
984 cout << RunInfo->GetAliceTriggerDef("kFastOnly") << endl;
985 cout << RunInfo->GetAliceTriggerDef("kAny") << endl;
986 cout << RunInfo->GetAliceTriggerDef("kAnyINT") << endl;
987 cout << "===== FilterMapDef =====" << endl;
988 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsL") << endl;
989 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsITsa") << endl;
990 cout << RunInfo->GetAliceFilterMapDef("ItsStrong") << endl;
991 cout << RunInfo->GetAliceFilterMapDef("ElectronID") << endl;
992 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsH") << endl;
993 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsH2") << endl;
994 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsH3") << endl;
995 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsTPCOnly") << endl;
996 cout << RunInfo->GetAliceFilterMapDef("EsdTrackCutsRaa") << endl;
1000 //********************************************
1002 //********************************************
1003 void AliJCORRANTask::AddListAODBranch(const char* aname, const char* cname, TClonesArray **obj, int nlist){
1004 *obj = new TClonesArray(cname, nlist);
1005 (*obj)->SetName(aname);
1006 AddAODBranch("TClonesArray", obj, fAODName.Data() );