1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Base class for MC analysis
7 //*-- Author: Marcelo G. Munhoz (USP)
8 //_________________________________________________________________________
10 #include "AliAnalysisEmEtReconstructed.h"
11 #include "AliAnalysisEtCuts.h"
12 #include "AliESDtrack.h"
14 #include "AliVEvent.h"
15 #include "AliMCEvent.h"
16 #include "AliESDEvent.h"
18 #include "TParticle.h"
19 #include "AliGenHijingEventHeader.h"
20 #include "AliGenPythiaEventHeader.h"
22 #include "AliESDCaloCluster.h"
23 #include "TGeoGlobalMagField.h"
25 #include "AliEMCALTrack.h"
26 #include "AliESDtrackCuts.h"
27 #include "AliEMCALGeometry.h"
28 #include "AliExternalTrackParam.h"
29 #include "AliTrackerBase.h"
30 #include "TGeoManager.h"
34 ClassImp(AliAnalysisEmEtReconstructed);
38 AliAnalysisEmEtReconstructed::AliAnalysisEmEtReconstructed():AliAnalysisEtReconstructed()
40 ,fElectronMatchtotETDep(0)
44 ,fMuonMatchtotETDep(0), fPionMatchtotETDep(0), fKaonMatchtotETDep(0), fProtonMatchtotETDep(0)
45 ,fTotChargedMatchtotETDep(0)
54 ,fHistAllRectotETDep(0)
56 ,fHistElectronRecETDep(0)
58 ,fHistElectronMatchtotETDep(0)
59 ,fHistElectronRecdEdxP(0)
61 ,fHistNeutralRectotET(0)
63 ,fHistTotEMRectotET(0)
67 ,fHistMuonMatchtotETDep(0)
72 ,fHistPionMatchtotETDep(0)
77 ,fHistKaonMatchtotETDep(0)
80 ,fHistProtonRecETDep(0)
82 ,fHistProtonMatchtotETDep(0)
83 ,fHistProtonRecdEdxP(0)
85 ,fHistTotChargedMatchtotETDep(0)
87 ,fHistTotalRectotETDep(0)
91 fHistogramNameSuffix = TString("EmcalRec");
94 //fResCut = fEmcalTrackDistanceCut;
96 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG));
97 //TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
98 TGeoManager::Import("geometry.root");
102 AliAnalysisEmEtReconstructed::~AliAnalysisEmEtReconstructed()
106 delete fHistAllRecETDep;
108 delete fHistAllRectotETDep;
110 delete fHistElectronRecETDep;
111 delete fHistElectronRec;
112 delete fHistElectronMatchtotETDep;
114 delete fHistElectronRecdEdxP;
116 delete fHistNeutralRectotET;
118 delete fHistTotEMRectotET;
120 delete fHistMuonRecETDep;
122 delete fHistMuonMatchtotETDep;
124 delete fHistMuonRecdEdxP;
126 delete fHistPionRecETDep;
128 delete fHistPionMatchtotETDep;
130 delete fHistPionRecdEdxP;
132 delete fHistKaonRecETDep;
134 delete fHistKaonMatchtotETDep;
136 delete fHistKaonRecdEdxP;
138 delete fHistProtonRecETDep;
139 delete fHistProtonRec;
140 delete fHistProtonMatchtotETDep;
142 delete fHistProtonRecdEdxP;
144 delete fHistTotChargedMatchtotETDep;
146 delete fHistTotalRectotETDep;
153 Int_t AliAnalysisEmEtReconstructed::AnalyseEvent(AliVEvent* ev)
154 { // analyse MC and real event info
156 AliError("ERROR: Event does not exist");
160 fESD = dynamic_cast<AliESDEvent*>(ev);
163 fGeoUt = AliEMCALGeometry::GetInstance("EMCAL_FIRSTYEARV1");//new AliEMCALGeometry("EMCAL_FIRSTYEAR","EMCAL");
164 //fGeoUt = AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1");
165 AliInfo("Creating new AliEMCALGeometry");
167 //fGeoUt = new AliEMCALGeometry("EMCAL_COMPLETE1","EMCAL");
169 AliInfo("No fGeoUt!");
172 if(!fESD->GetEMCALMatrix(0)){
173 AliInfo("No matrix!");
176 fGeoUt->SetMisalMatrix(fESD->GetEMCALMatrix(0),0);
182 // get all emcal clusters
183 TRefArray* caloClusters = new TRefArray();
184 fESD->GetEMCALClusters( caloClusters );
186 Int_t nCluster = caloClusters->GetEntries();
188 Float_t pos[3] = {0};
189 TVector3 caloPos(0,0,0);
190 TVector3 trackPos(0,0,0);
191 Double_t res=0, delta_eta=0, delta_phi=0, maxPid=-99;
192 Double_t xCluster[4]={0}, xCharged[7]={0};
194 AliESDtrack *track = 0;
197 for (int iCluster = 0; iCluster < nCluster; iCluster++ )
199 // Retrieve calo cluster information
200 AliESDCaloCluster* caloCluster = ( AliESDCaloCluster* )caloClusters->At( iCluster );
201 Float_t caloE = caloCluster->E();
202 caloCluster->GetPosition(pos);
203 caloPos.SetXYZ(pos[0],pos[1],pos[2]);
205 // look for track that matches calo cluster
206 //track = FindMatch(caloCluster, res); // Marcelo's matching
208 // *********************
210 delta_eta = caloCluster->GetTrackDz();
211 delta_phi = caloCluster->GetTrackDx();
213 if (caloCluster->GetTrackMatchedIndex() > 0) // tender's matching
214 track = fESD->GetTrack(caloCluster->GetTrackMatchedIndex());
217 // if ( !fEsdtrackCutsITSTPC->IsSelected(track) )
219 // *********************
221 // Retrieve track PID
223 maxPid = GetTrackPID(track);
228 Double_t etDep = CalculateTransverseEnergy(caloCluster);
231 //fHistAllRecEtaEDepETDep->Fill(caloE,caloPos.Eta(),etDep);
232 //fHistAllRecEtaETDep->Fill(etDep,caloPos.Eta());
235 xCluster[1] = caloPos.Eta();
236 xCluster[2] = TMath::RadToDeg()*caloPos.Phi();
237 xCluster[3] = caloCluster->GetNCells();
238 fAllRectotETDep += etDep;
242 fHistAllRecETDep->Fill(xCluster,etDep);
243 fHistAllRec->Fill(xCluster);
248 xCharged[0] = track->Eta();
249 xCharged[1] = track->Pt();
257 xCharged[3] = caloPos.Eta();
258 xCharged[4] = TMath::RadToDeg()*caloPos.Phi();
259 xCharged[5] = caloCluster->GetNCells();
262 Bool_t isCharged = kFALSE;
264 if (maxPid == AliPID::kProton)
268 fHistProtonRecETDep->Fill(xCharged,etDep);
269 fHistProtonRec->Fill(xCharged);
272 fHistProtonRecdEdxP->Fill(track->P(),track->GetTPCsignal());
274 if ((res>0.) && (res<fResCut))
276 fProtonMatchtotETDep += etDep;
281 else if (maxPid == AliPID::kPion)
285 fHistPionRecETDep->Fill(xCharged,etDep);
286 fHistPionRec->Fill(xCharged);
289 fHistPionRecdEdxP->Fill(track->P(),track->GetTPCsignal());
291 if ((res>0.) && (res<fResCut))
293 fPionMatchtotETDep += etDep;
297 else if (maxPid == AliPID::kKaon)
301 fHistKaonRecETDep->Fill(xCharged,etDep);
302 fHistKaonRec->Fill(xCharged);
305 fHistKaonRecdEdxP->Fill(track->P(),track->GetTPCsignal());
307 if ((res>0.) && (res<fResCut))
310 fKaonMatchtotETDep += etDep;
314 else if (maxPid == AliPID::kMuon)
318 fHistMuonRecETDep->Fill(xCharged,etDep);
319 fHistMuonRec->Fill(xCharged);
321 fHistMuonRecdEdxP->Fill(track->P(),track->GetTPCsignal());
323 if ((res>0.) && (res<fResCut))
326 fMuonMatchtotETDep += etDep;
330 else if (maxPid == AliPID::kElectron)
334 fHistElectronRecETDep->Fill(xCharged,etDep);
335 fHistElectronRec->Fill(xCharged);
338 fHistElectronRecdEdxP->Fill(track->P(),track->GetTPCsignal());
340 if ((res>0.) && (res<fResCut))
342 fElectronMatchtotETDep += etDep;
349 fNeutralRectotET += etDep;
352 } // end of loop over clusters
354 fTotEMRectotET = fElectronMatchtotETDep + fNeutralRectotET;
355 fTotChargedMatchtotETDep = fMuonMatchtotETDep + fPionMatchtotETDep + fKaonMatchtotETDep + fProtonMatchtotETDep;
356 fTotalRectotETDep = fTotEMRectotET + fTotChargedMatchtotETDep;
358 fHistAllRectotETDep->Fill(fAllRectotETDep);
360 fHistElectronMatchtotETDep->Fill(fElectronMatchtotETDep);
361 fHistNeutralRectotET->Fill(fNeutralRectotET);
363 fHistTotEMRectotET->Fill(fTotEMRectotET);
365 fHistMuonMatchtotETDep->Fill(fMuonMatchtotETDep);
366 fHistPionMatchtotETDep->Fill(fPionMatchtotETDep);
367 fHistKaonMatchtotETDep->Fill(fKaonMatchtotETDep);
368 fHistProtonMatchtotETDep->Fill(fProtonMatchtotETDep);
369 fHistTotChargedMatchtotETDep->Fill(fTotChargedMatchtotETDep);
371 fHistTotalRectotETDep->Fill(fTotalRectotETDep);
378 void AliAnalysisEmEtReconstructed::Init()
380 AliAnalysisEt::Init();
384 void AliAnalysisEmEtReconstructed::ResetEventValues()
385 { // reset event values
386 AliAnalysisEt::ResetEventValues();
388 // collision geometry defaults for p+p:
391 fElectronMatchtotETDep = 0;
392 fNeutralRectotET = 0;
396 fMuonMatchtotETDep = 0; fPionMatchtotETDep = 0; fKaonMatchtotETDep = 0; fProtonMatchtotETDep = 0;
397 fTotChargedMatchtotETDep = 0;
399 fTotalRectotETDep = 0;
403 void AliAnalysisEmEtReconstructed::CreateHistograms()
404 { // histogram related additions
405 //AliAnalysisEt::CreateHistograms();
408 fHistAllRecETDep = CreateClusterHistoSparse("fHistAllRecETDep_","E_{T}, all particles");
409 fHistAllRec = CreateClusterHistoSparse("fHistAllRec_","counts, all particles");
411 TString histname = "fHistAllRectotETDep_" + fHistogramNameSuffix;
412 fHistAllRectotETDep = new TH1F(histname.Data(),"total ET, all particles",fgNumOfEBins, fgEAxis);
416 fHistElectronRecETDep = CreateChargedPartHistoSparse("fHistElectronRecETDep_","E_{T}, electrons");
417 fHistElectronRec = CreateChargedPartHistoSparse("fHistElectronRec_","counts, electrons");
419 histname = "fHistElectronMatchtotETDep_" + fHistogramNameSuffix;
420 fHistElectronMatchtotETDep = new TH1F(histname.Data(),"total ET, MC primary Electrons",fgNumOfEBins, fgEAxis);
422 histname = "fHistElectronRecdEdxP_" + fHistogramNameSuffix;
423 fHistElectronRecdEdxP = new TH2F(histname,"TPC dEdx vs P",100,0.,10.,100,0.,200.);
425 histname = "fHistNeutralRectotET_" + fHistogramNameSuffix;
426 fHistNeutralRectotET = new TH1F(histname.Data(),"total ET, neutral particles",fgNumOfEBins, fgEAxis);
428 histname = "fHistTotEMRectotET_" + fHistogramNameSuffix;
429 fHistTotEMRectotET = new TH1F(histname.Data(),"total electromagnetic ET",fgNumOfEBins, fgEAxis);
432 fHistMuonRecETDep = CreateChargedPartHistoSparse("fHistMuonRecETDep_","E_{T}, muons");
433 fHistMuonRec = CreateChargedPartHistoSparse("fHistMuonRec_","counts, muons");
435 histname = "fHistMuonMatchtotETDep_" + fHistogramNameSuffix;
436 fHistMuonMatchtotETDep = new TH1F(histname.Data(),"total ET, Muons",fgNumOfEBins, fgEAxis);
438 histname = "fHistMuonRecdEdxP_" + fHistogramNameSuffix;
439 fHistMuonRecdEdxP = new TH2F(histname,"TPC dEdx vs P",100,0.,10.,100,0.,200.);
442 fHistPionRecETDep = CreateChargedPartHistoSparse("fHistPionRecETDep_","E_{T}, pions");
443 fHistPionRec = CreateChargedPartHistoSparse("fHistPionRec_","counts, pions");
445 histname = "fHistPionMatchtotETDep_" + fHistogramNameSuffix;
446 fHistPionMatchtotETDep = new TH1F(histname.Data(),"total ET, Pions",fgNumOfEBins, fgEAxis);
447 histname = "fHistPionRecdEdxP_" + fHistogramNameSuffix;
448 fHistPionRecdEdxP = new TH2F(histname,"TPC dEdx vs P",100,0.,10.,100,0.,200.);
451 fHistKaonRecETDep = CreateChargedPartHistoSparse("fHistKaonRecETDep_","E_{T}, kaons");
452 fHistKaonRec = CreateChargedPartHistoSparse("fHistKaonRec_","counts, kaons");
454 histname = "fHistKaonMatchtotETDep_" + fHistogramNameSuffix;
455 fHistKaonMatchtotETDep = new TH1F(histname.Data(),"total ET, Kaons",fgNumOfEBins, fgEAxis);
457 histname = "fHistKaonRecdEdxP_" + fHistogramNameSuffix;
458 fHistKaonRecdEdxP = new TH2F(histname,"TPC dEdx vs P",100,0.,10.,100,0.,200.);
461 fHistProtonRecETDep = CreateChargedPartHistoSparse("fHistProtonRecETDep_","E_{T}, protons");
462 fHistProtonRec = CreateChargedPartHistoSparse("fHistProtonRec_","counts, protons");
464 histname = "fHistProtonMatchtotETDep_" + fHistogramNameSuffix;
465 fHistProtonMatchtotETDep = new TH1F(histname.Data(),"total ET, Protons",fgNumOfEBins, fgEAxis);
467 histname = "fHistProtonRecdEdxP_" + fHistogramNameSuffix;
468 fHistProtonRecdEdxP = new TH2F(histname,"TPC dEdx vs P",100,0.,10.,100,0.,200.);
470 histname = "fHistTotChargedMatchtotETDep_" + fHistogramNameSuffix;
471 fHistTotChargedMatchtotETDep = new TH1F(histname.Data(),"total ET, charged particles",fgNumOfEBins, fgEAxis);
473 histname = "fHistTotalRectotETDep_" + fHistogramNameSuffix;
474 fHistTotalRectotETDep = new TH1F(histname.Data(),"total ET, all particles",fgNumOfEBins, fgEAxis);
476 histname = "fHistDeltaRZ_" + fHistogramNameSuffix;
477 fHistDeltaRZ = new TH2F(histname,"#Delta#phi vs #Delta#eta (track projection - cluster position)",200,-0.1,0.1,200,-0.1,0.1);
480 void AliAnalysisEmEtReconstructed::FillOutputList(TList *list)
481 {//Function for filling the output list
482 //AliAnalysisEt::FillOutputList(list);
486 list->Add(fHistAllRecETDep);
487 list->Add(fHistAllRec);
489 list->Add(fHistAllRectotETDep);
492 list->Add(fHistElectronRecETDep);
493 list->Add(fHistElectronRec);
495 list->Add(fHistElectronMatchtotETDep);
496 list->Add(fHistElectronRecdEdxP);
499 list->Add(fHistTotEMRectotET);
501 list->Add(fHistMuonRec);
502 list->Add(fHistMuonRecdEdxP);
503 list->Add(fHistMuonMatchtotETDep);
506 list->Add(fHistPionRecETDep);
507 list->Add(fHistPionRec);
509 list->Add(fHistPionMatchtotETDep);
510 list->Add(fHistPionRecdEdxP);
513 list->Add(fHistKaonRecETDep);
514 list->Add(fHistKaonRec);
516 list->Add(fHistKaonMatchtotETDep);
517 list->Add(fHistKaonRecdEdxP);
520 list->Add(fHistProtonRecETDep);
521 list->Add(fHistProtonRec);
523 list->Add(fHistProtonMatchtotETDep);
524 list->Add(fHistProtonRecdEdxP);
526 list->Add(fHistTotChargedMatchtotETDep);
527 list->Add(fHistTotalRectotETDep);
529 list->Add(fHistDeltaRZ);
532 //________________________________________________________________________
533 //project to a EMCal radius
534 Bool_t AliAnalysisEmEtReconstructed::GetTrackProjection(AliExternalTrackParam *trackParam, TVector3 &trackPos)
535 {//Gets the projection of the track
536 Bool_t proj = kFALSE;
537 Double_t emcalR = fGeoUt->GetEMCGeometry()->GetIPDistance();
539 if (trackParam) //it is constructed from TParticle
541 Double_t trkPos[3] = {0};
543 //Assume the track is a pion with mass 0.139GeV/c^2
544 //Extrapolation step is 1cm
545 if(!AliTrackerBase::PropagateTrackToBxByBz(trackParam, emcalR, 0.139, 1, kTRUE, 0.8) ) return proj;
547 trackParam->GetXYZ(trkPos);
549 trackPos.SetXYZ(trkPos[0],trkPos[1],trkPos[2]);
557 //________________________________________________________________________
558 //project to a cluster position
559 Bool_t AliAnalysisEmEtReconstructed::GetTrackProjection(AliEMCALTrack* emcTrack, TVector3 &trackPos, TVector3 clusPos)
560 {//project to a cluster position
561 Bool_t proj = kFALSE;
565 Double_t trkPos[3] = {0};
567 emcTrack->PropagateToGlobal(clusPos.X(),clusPos.Y(),clusPos.Z(),0.,0.);
568 emcTrack->GetXYZ(trkPos);
570 trackPos.SetXYZ(trkPos[0],trkPos[1],trkPos[2]);
578 //________________________________________________________________________
579 AliESDtrack* AliAnalysisEmEtReconstructed::FindMatch(const AliESDCaloCluster *caloCluster, Double_t& resMin)
580 {//find a matched track
584 TVector3 caloPos(0,0,0);
585 Float_t pos[3] = {0};
586 caloCluster->GetPosition(pos);
587 caloPos.SetXYZ(pos[0],pos[1],pos[2]);
590 TVector3 trackPos(0,0,0);
591 TVector3 trackMatchPos(0,0,0);
592 AliEMCALTrack *emcTrack = 0;
593 AliESDtrack *trackMatch = 0;
595 TObjArray* list = fEsdtrackCutsITSTPC->GetAcceptedTracks(fESD);;
596 Int_t nGoodTracks = list->GetEntries();
598 for (Int_t iTrack = 0; iTrack < nGoodTracks; iTrack++)
600 AliESDtrack *track = dynamic_cast<AliESDtrack*> (list->At(iTrack));
603 AliError(Form("ERROR: Could not get track %d", iTrack));
607 emcTrack = new AliEMCALTrack(*track);
609 if (GetTrackProjection(emcTrack,trackPos,caloPos))
611 res = sqrt(pow(trackPos.Phi()-caloPos.Phi(),2)+pow(trackPos.Eta()-caloPos.Eta(),2));
617 trackMatchPos.SetXYZ(trackPos.X(),trackPos.Y(),trackPos.Z());
624 fHistDeltaRZ->Fill(trackMatchPos.Phi()-caloPos.Phi(),trackMatchPos.Eta()-caloPos.Eta());
629 //________________________________________________________________________
630 Double_t AliAnalysisEmEtReconstructed::GetTrackPID(const AliESDtrack *track) const
631 {//Get the default track ID
632 const Double_t *pidWeights = track->PID();
634 Double_t maxpidweight = 0;
638 for (Int_t p =0; p < AliPID::kSPECIES; p++)
640 if (pidWeights[p] > maxpidweight)
642 maxpidweight = pidWeights[p];