1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Selection class for EMCAL
5 //*-- Authors: Oystein Djuvsland (Bergen)
6 //_________________________________________________________________________
9 #include "AliAnalysisEtSelectorEmcal.h"
10 #include "AliAnalysisEtCuts.h"
11 #include "AliEMCALTrack.h"
12 #include "TParticle.h"
14 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal(AliAnalysisEtCuts* cuts):AliAnalysisEtSelector(cuts)
18 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal():AliAnalysisEtSelector()
22 AliAnalysisEtSelectorEmcal::~AliAnalysisEtSelectorEmcal()
27 void AliAnalysisEtSelectorEmcal::Init()
29 AliAnalysisEtSelector::Init();
32 Int_t AliAnalysisEtSelectorEmcal::Init(const AliESDEvent* event)
35 AliAnalysisEtSelector::Init(event);
36 Printf("Initializing selector for run: %d", event->GetRunNumber());
41 TRefArray* AliAnalysisEtSelectorEmcal::GetClusters()
44 if(!fClusterArray) fClusterArray = new TRefArray;
48 fEvent->GetEMCALClusters(fClusterArray);
52 Printf("Could not initialize cluster array");
57 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const AliESDCaloCluster& cl) const
62 return TMath::Sin(cp.Theta())*cl.E() > fCuts->GetReconstructedEmcalClusterEnergyCut();
65 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const TParticle& p) const
67 return TMath::Sin(p.Theta())*p.Energy() > fCuts->GetReconstructedEmcalClusterEnergyCut();
70 Bool_t AliAnalysisEtSelectorEmcal::PassDistanceToBadChannelCut(const AliESDCaloCluster& ) const
75 Bool_t AliAnalysisEtSelectorEmcal::PassTrackMatchingCut(const AliESDCaloCluster& cluster) const
78 Int_t nTracksMatched = cluster.GetNTracksMatched();
79 if(nTracksMatched == 0){
83 Int_t trackMatchedIndex = cluster.GetTrackMatchedIndex();
84 if(trackMatchedIndex < 0){
87 AliVParticle *track = fEvent->GetTrack(trackMatchedIndex);
88 if(track->Pt()<0.5) return kTRUE;//Track matches below about 500 MeV are mostly random. It takes ~460 MeV to reach the EMCal
90 //Float_t recoE = cluster.E();
93 // //cluster.GetPosition(pos);
94 // Int_t trackMatchIdx = cluster.GetTrackMatchedIndex();
95 // //Double_t distance = 9999.0;
96 // if(trackMatchIdx>-1)
99 // //distance = CalcTrackClusterDistance(pos, &trackMatchIdx);
104 //return distance > fCuts->GetEmcalTrackDistanceCut();
107 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const TParticle& part) const
109 return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
110 && part.Phi() < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
111 && part.Phi() > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
114 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliVTrack& part) const
116 return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
117 && part.Phi() < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
118 && part.Phi() > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
121 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliESDCaloCluster& cluster) const
124 cluster.GetPosition(pos);
126 return TMath::Abs(cp.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
127 && cp.Phi() < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
128 && cp.Phi() > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
133 AliAnalysisEtSelectorEmcal::CalcTrackClusterDistance(const Float_t clsPos[3],Int_t *trkMatchId) const
134 { // calculate distance between cluster and closest track
136 Double_t trkPos[3] = {0,0,0};
138 Int_t bestTrkMatchId = -1;
139 Double_t distance = 9999; // init to a big number
142 Double_t distX = 0, distY = 0, distZ = 0;
144 for (Int_t iTrack = 0; iTrack < fEvent->GetNumberOfTracks(); iTrack++) {
145 AliESDtrack *track = static_cast<AliESDtrack*>( fEvent->GetTrack(iTrack) );
147 AliError(Form("ERROR: Could not get track %d", iTrack));
151 // check for approx. eta and phi range before we propagate..
154 AliEMCALTrack emctrack(*track);
155 if (!emctrack.PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) ) {
158 emctrack.GetXYZ(trkPos);
160 distX = clsPos[0]-trkPos[0];
161 distY = clsPos[1]-trkPos[1];
162 distZ = clsPos[2]-trkPos[2];
163 dist = TMath::Sqrt(distX*distX + distY*distY + distZ*distZ);
165 if (dist < distance) {
167 bestTrkMatchId = iTrack;
171 // printf("CalcTrackClusterDistance: bestTrkMatch %d origTrkMatch %d distance %f\n", bestTrkMatchId, *trkMatchId, distance);
172 *trkMatchId = bestTrkMatchId;