1 // #include <Riostream.h>
3 // #include <TVectorT.h>
4 // #include <TVector3.h>
7 // #include <TClonesArray.h>
8 // #include <TObjArray.h>
9 // #include <TObjString.h>
10 // #include <TFormula.h>
11 // #include <TString.h>
12 // #include <TRefArray.h>
13 // #include <TNtuple.h>
14 // #include <TArrayF.h>
17 #include "AliJFilter.h"
18 #include "AliAnalysisManager.h"
19 #include "AliAnalysisTaskSE.h"
20 #include "AliESDEvent.h"
21 #include "AliMCEvent.h"
23 #include "AliGenEventHeader.h"
24 #include "AliGenCocktailEventHeader.h"
25 #include "AliGenPythiaEventHeader.h"
26 #include "AliInputEventHandler.h"
27 #include "AliESDCaloCluster.h"
28 #include "AliAODEvent.h"
29 #include "AliAODHeader.h"
30 #include "AliAODHandler.h"
32 #include "AliESDVertex.h"
33 #include "AliESDtrack.h"
34 #include "AliAODTrack.h"
35 #include "AliAnalysisFilter.h"
36 #include "AliESDtrackCuts.h"
37 #include "AliAODVertex.h"
38 #include "AliAODTracklets.h"
39 #include "AliAODPid.h"
40 #include "AliAODMCHeader.h"
41 #include "AliAODMCParticle.h"
42 #include "AliESDUtils.h"
43 //#include "AliESDVZERO.h"
44 #include "AliCentrality.h"
45 #include "AliAODTracklets.h"
46 #include "AliMultiplicity.h"
47 #include "AliJConst.h"
48 #include "AliESDRun.h"
50 #include "AliESDVZERO.h"
51 #include "AliExternalTrackParam.h"
52 #include "AliHeader.h"
54 #include "AliESDCaloCluster.h"
55 #include "AliEMCALGeometry.h"
56 #include "AliVCluster.h"
57 #include "AliVCaloCells.h"
58 #include "AliEMCALRecoUtils.h"
59 #include "AliEMCALPIDUtils.h"
61 #include "AliJTrack.h"
62 #include "AliJMCTrack.h"
63 #include "AliJPhoton.h"
64 //#include "AliJCaloCell.h"
65 #include "AliJEventHeader.h"
66 #include "AliJRunHeader.h"
68 #include "AliPIDResponse.h"
69 #include "AliPIDCombined.h"
70 #include "AliPHOSGeoUtils.h"
71 #include "AliAnalysisUtils.h"
76 //______________________________________________________________________________
77 AliJFilter::AliJFilter() :
82 fStoreEventPlaneSource(0),
105 fEMCALRecoUtils(0x0),
110 //Default constructor
113 //______________________________________________________________________________
114 AliJFilter::AliJFilter(const char *name,AliAnalysisTaskSE *task):
119 fStoreEventPlaneSource(0),
122 fClusterThreshold(0),
142 fEMCALRecoUtils(0x0),
148 if(task->DebugLevel() > 5) cout << "---- AliJFilter Constructor ----"<<endl;
152 //____________________________________________________________________________
153 AliJFilter::AliJFilter(const AliJFilter& ap) :
154 TNamed(ap.GetName(), ap.GetTitle()),
155 fEsdTrackCuts(ap.fEsdTrackCuts),
156 fESDFilter(ap.fESDFilter),
157 fIsRealOrMC(ap.fIsRealOrMC),
158 fStoreEventPlaneSource(ap.fStoreEventPlaneSource),
159 fOADBPath(ap.fOADBPath),
160 fCaloClustersArr(ap.fCaloClustersArr),
161 fClusterThreshold(ap.fClusterThreshold),
162 fTrackThreshold(ap.fTrackThreshold),
163 fEventSuccess(ap.fEventSuccess),
165 fTrackList(ap.fTrackList),
166 fMCTrackList(ap.fMCTrackList),
167 fPhotonList(ap.fPhotonList),
168 fCaloCellList(ap.fCaloCellList),
169 fHeaderList(ap.fHeaderList),
170 fRunInfoList(ap.fRunInfoList),
171 fPIDResponse(ap.fPIDResponse),
172 fPIDCombined(ap.fPIDCombined),
173 fVZEROData(ap.fVZEROData),
174 fTZEROData(ap.fTZEROData),
175 //fFMDData(ap.fFMDData),
176 fZDCData(ap.fZDCData),
177 fEMCLabels(ap.fEMCLabels),
178 fEMCTreeLabels(ap.fEMCTreeLabels),
179 fAliJRunHeader(ap.fAliJRunHeader),
180 fEMCALGeometry(ap.fEMCALGeometry),
181 fEMCALRecoUtils(ap.fEMCALRecoUtils),
182 fPHOSGeom(ap.fPHOSGeom),
183 fAnaUtils(ap.fAnaUtils),
189 //_____________________________________________________________________________
190 AliJFilter& AliJFilter::operator = (const AliJFilter& ap)
192 // assignment operator
195 new(this) AliJFilter(ap);
199 //______________________________________________________________________________
200 AliJFilter::~AliJFilter()
207 delete fCaloCellList;
209 delete fAliJRunHeader;
213 delete fEMCALRecoUtils;
214 delete fEMCALGeometry;
225 //________________________________________________________________________
227 void AliJFilter::UserCreateOutputObjects()
229 //=== create the jcorran outputs objects
230 if(fMyTask->DebugLevel() > 1) printf("AliJFilter::UserCreateOutPutData() \n");
233 cout<<"TEST2 "<<fAliJRunHeader<<endl;
234 if(!fAliJRunHeader) fAliJRunHeader = new AliJRunHeader();
235 fRunInfoList = new TList();
236 fRunInfoList->SetName("RunInfoList");
237 fRunInfoList->SetOwner();
238 fRunInfoList->Clear();
239 fRunInfoList->Add(fAliJRunHeader);
242 fCaloClustersArr = new TRefArray();
243 fEMCALGeometry = AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1");
244 fEMCALRecoUtils = new AliEMCALRecoUtils();
245 fPHOSGeom = new AliPHOSGeoUtils();
246 fAnaUtils = new AliAnalysisUtils();
247 fAnaUtils->SetUseOutOfBunchPileUp( kTRUE );
248 fMcMap = new TArrayI();
250 //=== Set Tree and TClonesArray
252 AddList("AliJTrackList", "AliJTrack", &fTrackList, 1000);
253 if( fAliJRunHeader->GetStoreEMCalInfo() ){
254 AddList("AliJPhotonList", "AliJPhoton", &fPhotonList, 1000);
255 //BS AddList("AliJCaloCell", "AliJCaloCell", &fCaloCellList, 1000);
258 AddList("AliJMCTrackList", "AliJMCTrack", &fMCTrackList, 1000);
260 AddList("AliJEventHeaderList", "AliJEventHeader", &fHeaderList, 1000);
263 if( fAliJRunHeader->GetStoreEventPlaneSource() ){
264 fVZEROData = new AliESDVZERO;
265 fTZEROData = new AliESDTZERO;
266 fZDCData = new AliESDZDC;
269 // fPIDCombined = new AliPIDCombined;
270 // fPIDCombined->SetDefaultTPCPriors();
271 // fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
272 // fPIDResponse = ((AliInputEventHandler*) (man->GetInputEventHandler()))->GetPIDResponse();
273 // fPIDResponse->SetOADBPath(AliAnalysisManager::GetOADBPath());
274 // if (!fOADBPath.IsNull()) fPIDResponse->SetOADBPath(fOADBPath.Data());
276 cout << "Add(fAliJRunHeader) in UserCreateObject() ======= " << endl;
280 //______________________________________________________________________________
281 void AliJFilter::UserExec(Option_t* /*option*/)
284 AliJRunHeader *runh = fAliJRunHeader;
285 Bool_t hasGoodTrack, hasGoodCluster;
287 fEventSuccess = kFALSE;
289 // Processing of one event
290 DEBUG( 5, 1, "------- AliJFilter Exec-------" );
291 if(!((fMyTask->Entry()-1)%100)) AliInfo(Form(" Processing event # %lld", fMyTask->Entry()));
296 fMCTrackList->Clear();
298 fEMCTreeLabels.clear();
301 if( fAliJRunHeader->GetStoreEMCalInfo() ){
302 fPhotonList->Clear("C");
303 fCaloCellList->Clear();
305 fHeaderList->Clear();
307 hasGoodCluster = kTRUE;
308 hasGoodTrack = kTRUE;
310 //=== CHECK ESD, AOD, MC event
311 if( !Event() ) return;
313 if( FromESD() ) { //Reading ESD
314 DEBUG( 5, 1, "\t------- Start ESD " );
315 if( !ESDEvent() ) return;
316 if( runh->GetWithoutSDD() && !(ESDEvent()->GetTriggerMask() & (1<<13)) ) return;
319 if( ! MCEvent() ) return;
324 DEBUG( 5, 1, "\t------- Start AOD " );
325 if( !AODEvent() ) return;
330 if( fAnaUtils->IsPileUpEvent( Event() ))
333 //---------------------------------------------------------------
335 //---------------------------------------------------------------
336 if(!runh->GetRunNumber()){ //new run has started : I suppose no change of run in process
337 runh->SetRunNumber( Event()->GetRunNumber() );
339 //==== General ====//
340 runh->SetBeamEnergy( ESDEvent()->GetBeamEnergy() );
341 runh->SetBeamType( ESDEvent()->GetBeamType() );
342 //==== Detector status ==//
343 if( ESDEvent()->GetCurrentL3() > 0 ) runh->SetL3MagnetFieldPolarity(1);
344 if( ESDEvent()->GetCurrentL3() < 0 ) runh->SetL3MagnetFieldPolarity(-1);
345 runh->SetL3MagnetFieldIntensity( ESDEvent()->GetMagneticField() );
346 runh->SetCurrentL3( ESDEvent()->GetCurrentL3() );
347 runh->SetCurrentDip( ESDEvent()->GetCurrentDip() );
348 runh->SetUniformBMap( ESDEvent()->IsUniformBMap() );
349 //==== Triggers ====//
350 const AliESDRun* esdRun = ESDEvent()->GetESDRun();
351 for(Int_t triggerBit=0; triggerBit<kRangeTriggerTableAlice; triggerBit++){
352 runh->SetActiveTriggersAlice( triggerBit, esdRun->GetTriggerClass(triggerBit) );
355 else if( FromAOD() ){
356 //==== General ====//
357 cout << "Run # = "<< AODEvent()->GetRunNumber() << endl;
358 runh->SetRunNumber( AODEvent()->GetRunNumber() );
359 //TODO runh->SetBeamEnergy( ESDEvent()->GetBeamEnergy() );
360 //TODO runh->SetBeamType( ESDEvent()->GetBeamType() );
361 //==== Detector status ==//
362 //TODO runh->Setl3MgFieldPolarity(1);
363 runh->SetL3MagnetFieldIntensity( AODEvent()->GetMagneticField() );
364 runh->SetCurrentL3( AODEvent()->GetMagneticField()*30000.0/5.00668 );
365 runh->SetCurrentDip( AODEvent()->GetMuonMagFieldScale()*6000.0 );
366 runh->SetUniformBMap( kFALSE ); // TODO is this?
368 cout << "Add(fAliJRunHeader) is done =============" << endl;
371 //---------------------------------------------------------------
372 // EventHeader and read Others
373 //---------------------------------------------------------------
374 if( FromESD() ){ //Reading ESD
375 DEBUG( 5, 1, "\t------- Start READ ESD " );
377 ReadESDHeader( ESDEvent() );
378 ReadESDTracks( ESDEvent() );
380 if( fAliJRunHeader->GetStoreEMCalInfo() ){
381 ReadESDCaloClusters( ESDEvent() );
382 ReadESDCaloCells( ESDEvent() );
385 ReadMCTracksFromESD();
388 }else if( FromAOD() ){
389 DEBUG( 5, 1, "\t------- Start READ AOD " );
390 ReadAODHeader( AODEvent() );
391 ReadAODTracks( AODEvent() );
392 if( fAliJRunHeader->GetStoreEMCalInfo() ){
393 ReadAODCaloClusters( AODEvent() );
394 ReadAODCaloCells( AODEvent() );
397 ReadMCTracksFromAOD();
402 cout << "Error: Not correct InputDataFormat especified " << endl;
406 if( hasGoodCluster || hasGoodTrack ){
407 //=== TODO : need this?
408 AliAODHandler* outputHandler =
409 (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
410 outputHandler->SetFillAOD(kTRUE);
411 outputHandler->SetFillExtension(kTRUE);
412 fEventSuccess = kTRUE;
417 fMCTrackList->Clear();
419 fEMCTreeLabels.clear();
422 if( fAliJRunHeader->GetStoreEMCalInfo() ){
423 fPhotonList->Clear("C");
424 fCaloCellList->Clear();
426 fHeaderList->Clear();
429 DEBUG( 5, 1, "\t------- End UserExec " );
432 //______________________________________________________________________________
433 void AliJFilter::Init()
435 // Intialisation of parameters
436 AliInfo("Doing initialization") ;
438 // TString formula(fEsdTrackCuts->GetMaxDCAToVertexXYPtDep());
439 // if(formula.Length()>0){ // momentum dep DCA cut for AOD
440 // formula.ReplaceAll("pt","x");
444 //______________________________________________________________________________
445 void AliJFilter::Terminate(Option_t *)
449 if( IsMC() ) fMCTrackList->Clear();
450 if( fAliJRunHeader->GetStoreEMCalInfo() ){
451 fPhotonList->Clear();
452 fCaloCellList->Clear();
454 fHeaderList->Clear();
456 // Processing when the event loop is ended
457 cout<<"PWG4JCORRAN Analysis DONE !!"<<endl;
461 //______________________________________________________________________________
462 void AliJFilter::ReadESDTracks(AliESDEvent * esd)
463 //void AliJFilter::ReadESDTracks(const AliESDEvent * esd)
465 // Read the AliESDtrack and fill the list of AliJTrack containers
466 Int_t nt = esd->GetNumberOfTracks();
467 DEBUG( 5, 1 , Form("ESD::NumberOfTracks = %d",nt), "AliJFilter::ReadESDTracks" );
469 //==== Prepare TPC, GCG track ====//
470 Float_t ptMaxTPC = 0;
471 Float_t ptMinTPC = 1E10;
472 Float_t ptMaxGCG = 0;
473 Float_t ptMinGCG = 1E10;
474 for(int i = 0;i<32;i++){
475 AliESDtrackCuts* cuts = (AliESDtrackCuts*)fESDFilter->GetCuts()->At(i);
477 Float_t tmp1= 0,tmp2 = 0;
478 cuts->GetPtRange(tmp1,tmp2);
479 if( TESTBIT ( fAliJRunHeader->GetStoreTPCTrackBitMask(), i ) ){
480 if(tmp1<ptMinTPC)ptMinTPC=tmp1;
481 if(tmp2>ptMaxTPC)ptMaxTPC=tmp2;
483 if( TESTBIT(fAliJRunHeader->GetStoreGCGTrackBitMask() , i ) ){
484 if(tmp1<ptMinGCG)ptMinGCG=tmp1;
485 if(tmp2>ptMaxGCG)ptMaxGCG=tmp2;
489 //==== loop over tracks ====//
490 for(Int_t it = 0; it < nt; it++) {
492 AliESDtrack *track = esd->GetTrack(it);
493 if( !track ) continue;
494 UInt_t filterMap = fESDFilter->IsSelected( track );
495 if(! filterMap ) continue; // apply track selection criteria
497 //====create a new AliJTrack and fill the track info
498 AliJTrack * ctrack = new( (*fTrackList)[fTrackList->GetEntriesFast()] ) AliJTrack;
499 ctrack->SetPxPyPzE(track->Px(), track->Py(), track->Pz(), 0 );
502 ctrack->SetTrackPos( pos );
503 ctrack->SetTPCdEdx( track->GetTPCsignal() );
504 ctrack->SetParticleType(kJNone);
505 ctrack->SetCharge(track->Charge());
506 ctrack->SetFilterMap( filterMap );
507 ctrack->SetLabel( track->GetLabel() );
509 ReadESDPID( track, ctrack );
510 //==== TPC Tracks ====//
511 if( filterMap & fAliJRunHeader->GetStoreTPCTrackBitMask() ) {
512 ConvertESDTPCOnlyTracks( esd, it, ctrack, ptMinTPC, ptMaxTPC );
514 //==== GCG Tracks ====//
515 if( filterMap & fAliJRunHeader->GetStoreGCGTrackBitMask() ) {
516 ConvertESDGCGTracks( esd, it, ctrack, ptMinGCG, ptMaxGCG );
521 track->GetImpactParameters(b,bCov);
522 // ctrack->SetDCAtoVertexXY( b[0] );
523 // ctrack->SetDCAtoVertexZ( b[1] );
525 //if( track->P()>1 ) DEBUG( 5, 1, Form("P = %f", track->P() ) ) ;
530 //______________________________________________________________________________
531 void AliJFilter::ConvertESDTPCOnlyTracks(AliESDEvent* esd, int iTrack, AliJTrack * ctrack, double ptmin, double ptmax)
534 const AliESDVertex *vtxSPD = esd->GetPrimaryVertexSPD();
536 Double_t pos[3] = { 0. };
537 Double_t covTr[21]={0.};
538 //Double_t pid[10]={0.};
540 Double_t p[3] = { 0. };
542 Double_t pDCA[3] = { 0. }; // momentum at DCA
543 Double_t rDCA[3] = { 0. }; // position at DCA
544 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
545 Float_t cDCA[3] = {0.}; // covariance of impact parameters
548 AliESDtrack* esdTrack = esd->GetTrack(iTrack); //carefull do not modify it othwise need to work with a copy
552 AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(esd),esdTrack->GetID());
557 // only constrain tracks above threshold
558 AliExternalTrackParam exParam;
559 // take the B-field from the ESD, no 3D fieldMap available at this point
560 Bool_t relate = false;
561 relate = track->RelateToVertexTPC(vtxSPD,esd->GetMagneticField(),kVeryBig,&exParam);
566 // fetch the track parameters at the DCA (unconstraint)
567 if(track->GetTPCInnerParam()){
568 track->GetTPCInnerParam()->GetPxPyPz(pDCA);
569 track->GetTPCInnerParam()->GetXYZ(rDCA);
571 // get the DCA to the vertex:
572 track->GetImpactParametersTPC(dDCA,cDCA);
573 // set the constrained parameters to the track
574 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
580 esdTrack->GetInnerPxPyPz(p2);
582 Float_t pT = track->Pt();
583 if(pT<ptmin||pT>ptmax){
589 track->GetCovarianceXYZPxPyPz(covTr);
591 ctrack->SetTPCTrack(p[0], p[1], p[2]);
597 void AliJFilter::ConvertESDGCGTracks(AliESDEvent *esd, int iTrack, AliJTrack *ctrack, double ptMin, double ptMax)
600 Double_t pos[3] = { 0. };
601 Double_t covTr[21]={0.};
602 Double_t p[3] = { 0. };
604 Double_t pDCA[3] = { 0. }; // momentum at DCA
605 Double_t rDCA[3] = { 0. }; // position at DCA
606 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
607 Float_t cDCA[3] = {0.}; // covariance of impact parameters
610 AliESDtrack* esdTrack = esd->GetTrack(iTrack); //carefull do not modify it othwise need to work with a copy
611 const AliExternalTrackParam * exParamGC = esdTrack->GetConstrainedParam();
612 if(!exParamGC) return;
614 // fetch the track parameters at the DCA (unconstrained)
615 esdTrack->GetPxPyPz(pDCA);
616 esdTrack->GetXYZ(rDCA);
617 // get the DCA to the vertex:
618 esdTrack->GetImpactParameters(dDCA,cDCA);
620 if (!esdTrack->GetConstrainedPxPyPz(p)) return;
623 Float_t pT = exParamGC->Pt();
624 if(pT<ptMin||pT>ptMax){
628 esdTrack->GetConstrainedXYZ(pos);
629 exParamGC->GetCovarianceXYZPxPyPz(covTr);
631 ctrack->SetGCGTrack(p[0], p[1], p[2]);
636 //_________________________________________________________________________________-
637 void AliJFilter::ReadESDPID(AliESDtrack *track, AliJTrack *ctrack)
639 // To reduce the size of output, the variables which cannot be calculated later are only kept
640 // expected TOF signal, TPC momentum for expected TPC signal. Measured values are stored in ReadESDTrack()
641 // 1. expected TOF signal
642 Double_t times[AliPID::kSPECIES];
643 track->GetIntegratedTimes(times);
644 for(int ip=0; ip < (AliJTrack::kNAliJTrkPID); ip++) {
645 ctrack->SetExpectedTOFsignal(AliJTrack::AliJTrkPID(ip), times[ip]);
649 Double_t momTPC = track->GetTPCmomentum();
650 ctrack->SetTPCmomentum(momTPC);
653 //______________________________________________________________________________
654 Bool_t AliJFilter::ReadAODTracks(const AliAODEvent * aod)
658 hasGoodTrack = kFALSE;
660 // Read the AliAODtrack and fill the list of AliJTrack containers
661 Int_t nt = aod->GetNumberOfTracks();
664 DEBUG(5, 1, Form("AOD::NumberOfTracks = %d",nt) );
666 //==== loop over tracks ====//
667 for(Int_t it = 0; it < nt; it++) {
669 AliAODTrack *track = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
670 if(!track) AliFatal("Not a standard AOD track");
671 //if(track->GetFilterMap() & (1 << 7) ) continue;
672 //if(!AcceptAODTrack(track)) continue;
673 //if(! fEsdTrackCuts->IsSelected(track)) continue; //apply loose selection criteria
674 //FK//if(track->GetType() != AliAODTrack::kPrimary) continue; // only primaries
677 AliJTrack * ctrack = new( (*fTrackList)[listnt++] ) AliJTrack;
678 ctrack->SetID( track->GetID() );
679 ctrack->SetPxPyPzE(track->Px(), track->Py(), track->Pz(), 0 );
682 ctrack->SetTrackPos( pos );
683 //TODO if( fStoreTPCTrack )
684 ctrack->SetParticleType(kJNone);
685 ctrack->SetCharge(track->Charge());
686 ctrack->SetStatus(track->GetStatus());//
687 ctrack->SetFlags( track->GetFlags() );
688 ctrack->SetLabel( track->GetLabel() );
690 // UInt_t filterMap=0;
691 // for( unsigned int i=0;i<sizeof(filterMap)*8;i++ ){
692 // if( track->TestFilterBit( BIT(i) )){
693 // SETBIT( filterMap , i);
696 ctrack->SetFilterMap( track->GetFilterMap() );
699 double const * pid = track->PID();
700 ctrack->SetPID(AliJTrack::kElectronAliJ,pid[AliAODTrack::kElectron],AliJTrack::kTOF);
701 ctrack->SetPID(AliJTrack::kMuonAliJ, pid[AliAODTrack::kMuon], AliJTrack::kTOF);
702 ctrack->SetPID(AliJTrack::kPionAliJ, pid[AliAODTrack::kPion], AliJTrack::kTOF);
703 ctrack->SetPID(AliJTrack::kKaonAliJ, pid[AliAODTrack::kKaon], AliJTrack::kTOF);
704 ctrack->SetPID(AliJTrack::kProtonAliJ, pid[AliAODTrack::kProton], AliJTrack::kTOF);
706 ctrack->SetTPCnClust(track->GetTPCNcls());
707 ctrack->SetTPCdEdx( track->GetTPCsignal() );
708 ctrack->SetTOFsignal( track->GetTOFsignal() );
709 ctrack->SetLabel( track->GetLabel() );
710 for( int i=0;i<int(sizeof(UInt_t)*8);i++ ){
711 ctrack->SetBit( i, track->TestBit( i ));
714 // check track threshold
715 if( track->Pt() > fTrackThreshold )
716 hasGoodTrack = kTRUE;
718 //if(fMyTask->DebugLevel() > 5 && track->P()>1 ) cout << "P = " << track->P() << endl;
725 //______________________________________________________________________________
726 AliJEventHeader* AliJFilter::ReadCommonHeader(AliVEvent *event){
727 //Read the AliVEvent and fill the list of AliJEventHeader containers
728 //create a header and fill it
729 AliJEventHeader *hdr = new( (*fHeaderList)[fHeaderList->GetEntriesFast()] ) AliJEventHeader;
732 // Get Centrality as a percent from 0% to 100%
733 AliCentrality *cent = event->GetCentrality();
735 hdr->SetCentrality( cent->GetCentralityPercentile("V0M"));
736 hdr->SetCentralityArray(AliJEventHeader::kcV0M, cent->GetCentralityPercentile("V0M"));
737 hdr->SetCentralityArray(AliJEventHeader::kcFMD, cent->GetCentralityPercentile("FMD"));
738 hdr->SetCentralityArray(AliJEventHeader::kcTRK, cent->GetCentralityPercentile("TRK"));
739 hdr->SetCentralityArray(AliJEventHeader::kcTKL, cent->GetCentralityPercentile("TKL"));
740 hdr->SetCentralityArray(AliJEventHeader::kcCL0, cent->GetCentralityPercentile("CL0"));
741 hdr->SetCentralityArray(AliJEventHeader::kcCL1, cent->GetCentralityPercentile("CL1"));
742 hdr->SetCentralityArray(AliJEventHeader::kcV0MvsFMD, cent->GetCentralityPercentile("V0MvsFMD"));
743 hdr->SetCentralityArray(AliJEventHeader::kcTKLvsV0, cent->GetCentralityPercentile("TKLvsV0"));
744 hdr->SetCentralityArray(AliJEventHeader::kcZEMvsZDC, cent->GetCentralityPercentile("ZEMvsZDC"));
745 hdr->SetCentralityArray(AliJEventHeader::kcV0A, cent->GetCentralityPercentile("V0A"));
746 hdr->SetCentralityArray(AliJEventHeader::kcV0C, cent->GetCentralityPercentile("V0C"));
748 hdr->SetTriggerMaskAlice(event->GetTriggerMask()); //ULong64_t
749 hdr->SetTriggerMaskJCorran(ConvertTriggerMask()); //UInt_t
750 hdr->SetEventType(event->GetEventType());
751 hdr->SetBunchCrossNumber(event->GetBunchCrossNumber());
753 int ncontributors = 0;
754 const AliVVertex * vtxESD = event->GetPrimaryVertex();
756 hdr->SetXVertex(vtxESD->GetX()); //FK// EFF
757 hdr->SetYVertex(vtxESD->GetY()); //FK// EFF
758 hdr->SetZVertex(vtxESD->GetZ());
759 //hdr->SetZVertexErr(vtxESD->GetZRes());
761 vtxESD->GetCovarianceMatrix(covMat);
762 hdr->SetZVertexErr(TMath::Sqrt(covMat[5])); // GetZRes := TMath::Sqrt(fCovZZ)
763 ncontributors = vtxESD->GetNContributors(); // get number of contributors to vertex
764 hdr->SetVtxMult( vtxESD->GetNContributors() );
766 hdr->SetZVertex(9999);
767 hdr->SetZVertexErr(9999);
769 hdr->SetVtxMult(ncontributors); //FK// EFF contrib to vertex
772 //______________________________________________________________________________
773 void AliJFilter::ReadESDHeader(AliESDEvent *esd)
775 // Read the AliESDEvent and fill the list of AliJEventHeader containers
777 if( fAliJRunHeader->GetRefitESDVertexTracks() )
778 AliESDUtils::RefitESDVertexTracks( esd ); // TODO only for LHC11a right?
779 AliJEventHeader *hdr = ReadCommonHeader( esd );
780 // AliMultiplicity *fSPDMult =(AliMultiplicity *) esd->GetMultiplicity();
781 // if(fSPDMult) hdr->SetSPDTrackletMult(fSPDMult->GetNumberOfTracklets());
782 // This is moved from ReadCommonHeader. AOD should have same.TODO!!
783 AliESDVZERO *v0 = esd->GetVZEROData();
785 if( v0 ) hdr->SetV0Mult(v0->GetMTotV0A() + v0->GetMTotV0C());
786 if( v0 ) hdr->SetV0AMult(v0->GetMTotV0A());
787 if( v0 ) hdr->SetV0CMult(v0->GetMTotV0C());
789 const AliESDRun* esdRun = esd->GetESDRun();
790 //cout <<"========================"<<endl;
791 //cout << (esdRun->GetDetectorsInReco() & AliDAQ::kSPD) << endl;
792 //cout << (esdRun->GetDetectorsInReco() & AliDAQ::kSSD) << endl;
793 //cout << (esdRun->GetDetectorsInReco() & AliDAQ::kSDD) << endl;
794 //cout << (esdRun->GetDetectorsInReco() & AliDAQ::kTPC) << endl;
795 if(esdRun->GetDetectorsInReco() & AliDAQ::kSPD) hdr->SetSPDTrackletMult(AliESDtrackCuts::GetReferenceMultiplicity( esd, AliESDtrackCuts::kTracklets, 1.0 ));
796 if((esdRun->GetDetectorsInReco() & AliDAQ::kSSD) || (esdRun->GetDetectorsInReco() & AliDAQ::kSDD)) hdr->SetITSSATrackletMult(AliESDtrackCuts::GetReferenceMultiplicity( esd, AliESDtrackCuts::kTrackletsITSSA, 1.0 ));
797 if(esdRun->GetDetectorsInReco() & AliDAQ::kTPC) hdr->SetITSTPCTrackletMult(AliESDtrackCuts::GetReferenceMultiplicity( esd, AliESDtrackCuts::kTrackletsITSTPC, 1.0 ));
800 //TODO Store Detector data
801 if( fAliJRunHeader->GetStoreEventPlaneSource() ){
802 *fVZEROData = *esd->GetVZEROData();
803 *fTZEROData = AliESDTZERO(*esd->GetESDTZERO());
804 *fZDCData = *esd->GetESDZDC();
806 hdr->SetEventID( esd->GetEventNumberInFile());
807 //const AliESDVertex * vtxESD = esd->GetPrimaryVertex();
808 //if( vtxESD->GetStatus() == 0 ) hdr->SetVtxMult( 0 );
809 // if fNcontributes > 0 then status is always true. do we need this?
813 const AliVVertex * primaryMCVertex = MCEvent()->GetPrimaryVertex();
814 //cout<<"AliMCEvent = "<<MCEvent()<<endl;
815 //cout<<"AliVVertex = "<<primaryMCVertex<<endl;
816 if( primaryMCVertex ){
817 hdr->SetXVertexMC( primaryMCVertex->GetX() );
818 hdr->SetYVertexMC( primaryMCVertex->GetY() );
819 hdr->SetZVertexMC( primaryMCVertex->GetZ() );
821 AliESDHeader * esdHeader = esd->GetHeader();
822 hdr->SetL0TriggerInputs( esdHeader->GetL0TriggerInputs() );
826 //______________________________________________________________________________
827 void AliJFilter::ReadAODHeader(AliAODEvent *aod)
829 //Read the AliAODEvent and fill the list of AliJEventHeader containers
830 AliJEventHeader *hdr = ReadCommonHeader( aod );
832 const AliAODTracklets *trackletsSPD = aod->GetTracklets();
834 hdr->SetSPDTrackletMult(trackletsSPD->GetNumberOfTracklets());
837 hdr->SetFiredTriggers( aod->GetFiredTriggerClasses() );
838 //TODO hdr->SetEventID( esd->GetEventNumberInFile());
841 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) aod->FindListObject(AliAODMCHeader::StdBranchName());
842 hdr->SetXVertexMC( aodMCheader->GetVtxX() );
843 hdr->SetYVertexMC( aodMCheader->GetVtxY() );
844 hdr->SetZVertexMC( aodMCheader->GetVtxZ() );
847 AliAODHeader * ah = dynamic_cast<AliAODHeader*>(aod->GetHeader());
848 if(!ah) AliFatal("Not a standard AOD");
849 hdr->SetESDFileName( ah->GetESDFileName() );
850 hdr->SetEventNumberESDFile( ah->GetEventNumberESDFile() );
853 //______________________________________________________________________________
854 Int_t AliJFilter::GetSuperModuleNumber(bool isemcal, AliVCluster *cluster, AliVCaloCells *cells, Int_t absId)
856 //get super module number
858 Int_t absIdMax = -1, iSM =-1, ieta = -1, iphi = -1;
859 Bool_t shared = kFALSE;
860 fEMCALRecoUtils->GetMaxEnergyCell(fEMCALGeometry, cells, cluster, absIdMax, iSM, ieta, iphi, shared);
862 if(iSM < 0 || iphi < 0 || ieta < 0 )
864 AliFatal(Form("Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name\n",
873 fPHOSGeom->AbsToRelNumbering(absId,relId);
874 fPHOSGeom->AbsToRelNumbering(absId,relId);
882 //______________________________________________________________________________
883 Double_t * AliJFilter::GetCellsAmplitude( bool isemcal, AliVCluster *cluster, AliVCaloCells *emCells, AliVCaloCells *phoCells )
885 // cell amplitude reader
891 nCell = cluster->GetNCells();
893 amps = new Double_t[nCell];
895 // get the cell addresses
896 cellAddrs = cluster->GetCellsAbsId();
898 // get the cell amplitudes
899 for( iCell = 0; iCell < nCell; iCell++ ){
901 amps[iCell] = emCells->GetCellAmplitude( cellAddrs[iCell] );
903 amps[iCell] = phoCells->GetCellAmplitude( cellAddrs[iCell] );
910 //_____________________________________________________________________________
912 UInt_t AliJFilter::ConvertTriggerMask(){
914 //convert alice trigger mask to jcorran trigger mask
915 UInt_t triggerMaskJC=0;
916 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
917 ->IsEventSelected() & AliVEvent::kMB){
918 // minimum bias TBit 0
919 triggerMaskJC |= (1<<kMinBiasTriggerBitJCorran);
920 fAliJRunHeader->SetActiveTriggersJCorran( kMinBiasTriggerBitJCorran, "MinBiasTriggerBitJCorran");
923 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
924 ->IsEventSelected() & AliVEvent::kHighMult){
925 //high multiplicity trigger TBit 1
926 triggerMaskJC |= (1<<kHighMultTriggerBitJCorran);
927 fAliJRunHeader->SetActiveTriggersJCorran( kHighMultTriggerBitJCorran,"HighMultTriggerBitJCorran");
930 if((((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
931 ->IsEventSelected() & AliVEvent::kEMC1) ||
932 (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
933 ->IsEventSelected() & AliVEvent::kEMC7 )){
935 triggerMaskJC |= (1<<kEmc0TriggerBitJCorran);
936 fAliJRunHeader->SetActiveTriggersJCorran( kEmc0TriggerBitJCorran,"Emc0TriggerBitJCorran");
939 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
940 ->IsEventSelected() & AliVEvent::kEMCEGA){
942 triggerMaskJC |= (1<<kEmc1GammaTriggerBitJCorran);
943 fAliJRunHeader->SetActiveTriggersJCorran( kEmc1GammaTriggerBitJCorran,"Emc1GammaTriggerBitJCorran");
946 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
947 ->IsEventSelected() & AliVEvent::kEMCEJE){
949 triggerMaskJC |= (1<<kEmc1JetTriggerBitJCorran);
950 fAliJRunHeader->SetActiveTriggersJCorran( kEmc1JetTriggerBitJCorran,"Emc1JetTriggerBitJCorran");
953 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
954 ->IsEventSelected() & AliVEvent::kCentral){
955 //central trigger TBit 5
956 triggerMaskJC |= (1<<kCentralTriggerBitJCorran);
957 fAliJRunHeader->SetActiveTriggersJCorran( kCentralTriggerBitJCorran,"CentralTriggerBitJCorran");
960 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
961 ->IsEventSelected() & AliVEvent::kSemiCentral){
962 //semi-central trigger TBit 6
963 triggerMaskJC |= (1<<kSemiCentralTriggerBitJCorran);
964 fAliJRunHeader->SetActiveTriggersJCorran( kSemiCentralTriggerBitJCorran,"SemiCentralTriggerBitJCorran");
967 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
968 ->IsEventSelected() & AliVEvent::kFastOnly){
969 //semi-central trigger TBit 6
970 triggerMaskJC |= (1<<kFastOnlyBitJCorran);
971 fAliJRunHeader->SetActiveTriggersJCorran( kFastOnlyBitJCorran ,"FastOnlyBitJCorran");
974 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
975 ->IsEventSelected() & AliVEvent::kINT7){
976 // minimum bias TBit 0
977 triggerMaskJC |= (1<<kINT7TriggerBitJCorran);
978 fAliJRunHeader->SetActiveTriggersJCorran( kINT7TriggerBitJCorran, "INT7TriggerBitJCorran");
981 return triggerMaskJC;
985 //______________________________________________________________________________
986 void AliJFilter::ReadMCTracksFromESD(){
987 //store MC information from AliStack
988 if(!MCEvent()) return;
989 AliStack *stack = MCEvent()->Stack();
991 Int_t np = MCEvent()->GetNumberOfTracks();
993 // AliGenEventHeader* genHeader = fMC->GenEventHeader();
994 // AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
995 // Double_t ptHard = 0;
996 // Double_t nTrials = 1; // Trials for MC trigger weigth for real data
997 // nTrials = pythiaGenHeader->Trials();
998 // ptHard = pythiaGenHeader->GetPtHard();
999 // Int_t nprim = stack->GetNtrack();
1001 Long64_t ntrack = 0;
1003 for(Long64_t iTrack = 0; iTrack < np; iTrack++){
1004 AliMCParticle *track = (AliMCParticle*) MCEvent()->GetTrack(iTrack);
1006 Printf("ERROR: Could not receive track %d",(int) iTrack);
1009 Bool_t isPrimary = stack->IsPhysicalPrimary(iTrack);
1011 //create a new JMCTrack and fill the track info
1012 AliJMCTrack *ctrack = new( (*fMCTrackList)[ntrack++] ) AliJMCTrack;
1014 TParticle *partStack = stack->Particle(iTrack);
1015 Int_t pdg = partStack->GetPdgCode();
1017 Char_t ch = (Char_t) partStack->GetPDG()->Charge();
1018 Int_t label = track->GetLabel();
1020 ctrack->SetLabel(label);
1021 ctrack->SetPdgCode(pdg);
1022 ctrack->SetPxPyPzE( partStack->Px(), partStack->Py(), partStack->Pz(), partStack->Energy());
1023 ctrack->SetCharge(ch);
1024 ctrack->SetFlag(AliJMCTrack::kPrimary, isPrimary);
1026 ctrack->SetProductionVertex(partStack->Vx(),partStack->Vy(),partStack->Vz());
1027 }// loop for al primary tracks
1031 //--------------------------------------------------------------------
1032 void AliJFilter::ReadMCTracksFromAOD(){
1033 //retreive MC particles from event //FKEFF//
1034 if(!AODEvent()) return; TClonesArray *mcArray = (TClonesArray*) AODEvent()->
1035 FindListObject(AliAODMCParticle::StdBranchName());
1037 Printf("No MC particle branch found");
1041 Long64_t ntrack = 0;
1042 Long64_t np = mcArray->GetEntriesFast();
1044 for(Long64_t it = 0; it < np; it++) {
1045 AliAODMCParticle *track = (AliAODMCParticle*) mcArray->At(it);
1047 Error("ReadEventAODMC", "Could not receive particle %d",(int) it);
1050 bool isPrimary = track->IsPhysicalPrimary();
1052 //create a new JMCTrack and fill the track info
1053 AliJMCTrack *ctrack = new ((*fMCTrackList)[ntrack++]) AliJMCTrack;;
1055 Int_t pdg = track->GetPdgCode();
1057 Char_t ch = (Char_t) track->Charge();
1058 Int_t label = track->GetLabel();
1060 ctrack->SetLabel(label);
1061 ctrack->SetPdgCode(pdg);
1062 ctrack->SetPxPyPzE( track->Px(), track->Py(), track->Pz(), track->E());
1063 ctrack->SetCharge(ch);
1064 ctrack->SetFlag(AliJMCTrack::kPrimary, isPrimary);
1066 ctrack->SetProductionVertex(track->Xv(),track->Yv(),track->Zv());
1073 //--------------------------------------------------------------------
1074 void AliJFilter::RemapMCLabels(){
1075 // remaps all MC labels to the new arrays
1077 Int_t i, j, label, mother0, mother1;
1079 AliJPhoton *cluster;
1080 // BS AliJCaloCell *cell;
1081 AliJMCTrack *mctrack;
1084 for( i = 0; i < fTrackList->GetEntries(); i++ ){
1085 track = (AliJTrack*)fTrackList->At( i );
1087 track->SetLabel( fMcMap->At( track->GetLabel() ));
1091 if( fAliJRunHeader->GetStoreEMCalInfo() ){
1092 for( i = 0; i < fPhotonList->GetEntries(); i++ ){
1093 cluster = (AliJPhoton*)fPhotonList->At( i );
1094 for( j = 0; j < cluster->GetNEMCLabel(); j++ ){
1095 label = cluster->GetEMCLabel( j );
1096 // no label clusters protection
1098 cluster->SetEMCLabel( j, fMcMap->At( label ));
1104 for( i = 0; i < fCaloCellList->GetEntries(); i++ ){
1105 cell = (AliJCaloCell*)fCaloCellList->At( i );
1106 label = cell->GetMcLabel();
1107 // no label cells protection
1109 cell->SetMcLabel( fMcMap->At( cell->GetMcLabel() ));
1115 for( i = 0; i < fMCTrackList->GetEntries(); i++ ){
1116 mctrack = (AliJMCTrack*)fMCTrackList->At( i );
1118 mother0 = mctrack->GetMother( 0 );
1119 mother1 = mctrack->GetMother( 1 );
1122 mother0 = fMcMap->At( mother0 );
1124 mother1 = fMcMap->At( mother1 );
1126 mctrack->SetMother( mother0, mother1 );
1130 //--------------------------------------------------------------------
1133 void AliJFilter::PrintOut() const {
1134 //AliJRunHeader * RunInfo = fAliJRunHeader;
1137 //********************************************
1139 //********************************************
1140 void AliJFilter::AddList(const char* aname, const char* cname, TClonesArray **obj, int nlist){
1141 *obj = new TClonesArray(cname, nlist);
1142 (*obj)->SetName(aname);