1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Selector Base class for PHOS
7 //*-- Authors: Oystein Djuvsland (Bergen)
8 //_________________________________________________________________________
9 #include "AliAnalysisEtSelectorPhos.h"
10 #include "AliAnalysisEtCuts.h"
11 #include "AliESDCaloCluster.h"
12 #include "AliESDEvent.h"
13 #include "TRefArray.h"
14 #include "AliPHOSGeometry.h"
18 #include "TParticle.h"
22 ClassImp(AliAnalysisEtSelectorPhos)
24 AliAnalysisEtSelectorPhos::AliAnalysisEtSelectorPhos(AliAnalysisEtCuts* cuts): AliAnalysisEtSelector(cuts)
29 ,fMatrixInitialized(kFALSE)
34 AliAnalysisEtSelectorPhos::AliAnalysisEtSelectorPhos(): AliAnalysisEtSelector()
39 ,fMatrixInitialized(kFALSE)
44 AliAnalysisEtSelectorPhos::~AliAnalysisEtSelectorPhos()
49 TRefArray* AliAnalysisEtSelectorPhos::GetClusters()
51 if(!fClusterArray) fClusterArray = new TRefArray;
55 fEvent->GetPHOSClusters(fClusterArray);
59 Printf("Could not initialize cluster array");
65 Int_t AliAnalysisEtSelectorPhos::Init(const AliESDEvent* event)
68 AliAnalysisEtSelector::Init(event);
69 Printf("Initializing selector for run: %d", event->GetRunNumber());
70 int res = LoadGeometry();
72 if(LoadBadMaps()) return -1;
74 if (!fMatrixInitialized)
76 Printf("INITIALIZING MISALIGNMENT MATRICES");
77 for (Int_t mod=0; mod<5; mod++) {
79 if (!event->GetPHOSMatrix(mod))
81 Printf("Could not find geo matrix for module %d", mod);
84 fMatrixInitialized = kTRUE;
85 fGeoUtils->SetMisalMatrix(event->GetPHOSMatrix(mod),mod) ;
86 Printf("PHOS geo matrix %p for module # %d is set\n", event->GetPHOSMatrix(mod), mod);
92 Bool_t AliAnalysisEtSelectorPhos::PassMinEnergyCut(const AliESDCaloCluster& cluster) const
96 cluster.GetPosition(pos);
98 // std::cout << fCuts->GetReconstructedPhosClusterEnergyCut();
99 return TMath::Sin(cp.Theta())*cluster.E() > fCuts->GetReconstructedPhosClusterEnergyCut();
102 Bool_t AliAnalysisEtSelectorPhos::PassMinEnergyCut(const TParticle& part) const
104 // std::cout << fCuts->GetReconstructedPhosClusterEnergyCut();
105 return TMath::Sin(part.Theta())*part.Energy() > fCuts->GetReconstructedPhosClusterEnergyCut();
109 Bool_t AliAnalysisEtSelectorPhos::PassDistanceToBadChannelCut(const AliESDCaloCluster& cluster) const
110 { // cut distance to bad channel
111 if(!fMatrixInitialized)
113 Printf("Misalignment matrices are not initialized");
117 cluster.GetPosition(gPos);
119 TVector3 glVec(gPos);
120 fGeoUtils->GlobalPos2RelId(glVec, relId);
122 //std::cout << "In phos distance to bad channel cut!" << std::endl;
124 fGeoUtils->Global2Local(locVec, glVec, relId[0]);
125 // std::cout << fGeoUtils << std::endl;
126 //std::cout << relId[0] << " " << cluster.IsPHOS() << std::endl;
127 //std::cout << locVec[0] << " " << " " << locVec[1] << " " << locVec[2] << std::endl;
128 for (Int_t x = 0; x < fBadMapM2->GetNbinsX(); x++)
130 for (Int_t z = 0; z < fBadMapM2->GetNbinsY(); z++)
134 if (fBadMapM2->GetBinContent(x+1, z+1) != 0)
144 fGeoUtils->RelPosInModule(tmpRel, tmpX, tmpZ);
146 Float_t distance = TMath::Sqrt((tmpX-locVec[0])*(tmpX-locVec[0]) + (tmpZ - locVec[2])*(tmpZ-locVec[2]));
147 //Float_t distance = TMath::Sqrt((x-relId[3])*(x-relId[3]) + (z - relId[2])*(z-relId[2]));
149 if (distance < fCuts->GetPhosBadDistanceCut())
151 // std::cout << "Module 2, position: " << locVec[0] << ", " << locVec[2] << ", distance to bad channel: " << distance << ", number of cells: " << cluster.GetNCells() << std::endl;
158 if (fBadMapM3->GetBinContent(x+1, z+1) != 0)
168 fGeoUtils->RelPosInModule(tmpRel, tmpX, tmpZ);
170 Float_t distance = TMath::Sqrt((tmpX-locVec[0])*(tmpX-locVec[0]) + (tmpZ - locVec[2])*(tmpZ-locVec[2]));
172 // Float_t distance = TMath::Sqrt((x-locVec[0])*(x-locVec[0]) + (z - locVec[2])*(z-locVec[2]));
173 //Float_t distance = TMath::Sqrt((x-relId[3])*(x-relId[3]) + (z - relId[2])*(z-relId[2]));
174 if (distance < fCuts->GetPhosBadDistanceCut())
176 // std::cout << "Module 3, position: " << locVec[0] << ", " << locVec[2] << ", distance to bad channel: " << distance << ", number of cells: " << cluster.GetNCells() << std::endl;
183 if (fBadMapM4->GetBinContent(x+1, z+1) != 0)
193 fGeoUtils->RelPosInModule(tmpRel, tmpX, tmpZ);
195 Float_t distance = TMath::Sqrt((tmpX-locVec[0])*(tmpX-locVec[0]) + (tmpZ - locVec[2])*(tmpZ-locVec[2]));
197 // Float_t distance = TMath::Sqrt((x-locVec[0])*(x-locVec[0]) + (z - locVec[2])*(z-locVec[2]));
198 //Float_t distance = TMath::Sqrt((x-relId[3])*(x-relId[3]) + (z - relId[2])*(z-relId[2]));
199 if (distance < fCuts->GetPhosBadDistanceCut())
201 // std::cout << "Module 4, position: " << locVec[0] << ", " << locVec[2] << ", distance to bad channel: " << distance << ", number of cells: " << cluster.GetNCells() << std::endl;
214 Bool_t AliAnalysisEtSelectorPhos::PassTrackMatchingCut(const AliESDCaloCluster& cluster) const
215 { // cut track matching
217 if(!fMatrixInitialized)
219 Printf("Misalignment matrices are not initialized");
223 // cluster->GetTrackDx(), cluster->GetTrackDz(), event->GetTrack(trackMatchedIndex)->Pt(), event->GetTrack(trackMatchedIndex)->Charge(), ev
225 Int_t nTracksMatched = cluster.GetNTracksMatched();
226 if(nTracksMatched == 0) return kTRUE;
228 Int_t trackMatchedIndex = cluster.GetTrackMatchedIndex();
229 if(trackMatchedIndex < 0) return kTRUE;
231 AliVParticle *track = fEvent->GetTrack(trackMatchedIndex);
232 if(track->Pt()<0.5) return kTRUE;//Track matches below about 500 MeV are mostly random. It takes ~460 MeV to reach the EMCal
233 Double_t dx = cluster.GetTrackDx();
234 Double_t dz = cluster.GetTrackDz();
235 Double_t pt = track->Pt();
236 Int_t charge = track->Charge();
240 Double_t sx=TMath::Min(5.4,2.59719e+02*TMath::Exp(-pt/1.02053e-01)+
241 6.58365e-01*5.91917e-01*5.91917e-01/((pt-9.61306e-01)*(pt-9.61306e-01)+5.91917e-01*5.91917e-01)+1.59219);
242 Double_t sz=TMath::Min(2.75,4.90341e+02*1.91456e-02*1.91456e-02/(pt*pt+1.91456e-02*1.91456e-02)+1.60) ;
244 Double_t mf = fEvent->GetMagneticField(); //Positive for ++ and negative for --
246 if(mf<0.){ //field --
249 meanX=TMath::Min(7.3, 3.89994*1.20679*1.20679/(pt*pt+1.20679*1.20679)+0.249029+2.49088e+07*TMath::Exp(-pt*3.33650e+01)) ;
251 meanX=-TMath::Min(7.7,3.86040*0.912499*0.912499/(pt*pt+0.912499*0.912499)+1.23114+4.48277e+05*TMath::Exp(-pt*2.57070e+01)) ;
256 meanX=-TMath::Min(8.0,3.86040*1.31357*1.31357/(pt*pt+1.31357*1.31357)+0.880579+7.56199e+06*TMath::Exp(-pt*3.08451e+01)) ;
258 meanX= TMath::Min(6.85, 3.89994*1.16240*1.16240/(pt*pt+1.16240*1.16240)-0.120787+2.20275e+05*TMath::Exp(-pt*2.40913e+01)) ;
261 Double_t rz=(dz-meanZ)/sz ;
262 Double_t rx=(dx-meanX)/sx ;
263 Double_t r = TMath::Sqrt(rx*rx+rz*rz);
264 if(r < fCuts->GetPhosTrackRCut()) return kFALSE;
270 int AliAnalysisEtSelectorPhos::LoadGeometry()
273 fGeoUtils = AliPHOSGeometry::GetInstance("IHEP");
274 // ifstream f("badchannels.txt", ios::in);
278 int AliAnalysisEtSelectorPhos::LoadBadMaps()
280 TFile *f = TFile::Open("badchannels.root", "READ");
284 std::cout << "Could not open badchannels.root" << std::endl;
288 fBadMapM2 = (TH2I*)f->Get("bad_channels_m2");
291 std::cout << "Could not find bad_channels_m2 in badchannels.root" << std::endl;
293 fBadMapM3 = (TH2I*)f->Get("bad_channels_m3");
296 std::cout << "Could not find bad_channels_m3 in badchannels.root" << std::endl;
299 fBadMapM4 = (TH2I*)f->Get("bad_channels_m4");
302 std::cout << "Could not find bad_channels_m4 in badchannels.root" << std::endl;
311 Bool_t AliAnalysisEtSelectorPhos::CutGeometricalAcceptance(const TParticle& part)
313 float myphi = part.Phi();
314 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
315 return TMath::Abs(part.Eta()) < fCuts->GetGeometryPhosEtaAccCut()
316 && myphi < fCuts->GetGeometryPhosPhiAccMaxCut()*TMath::Pi()/180.
317 && myphi > fCuts->GetGeometryPhosPhiAccMinCut()*TMath::Pi()/180.;
320 Bool_t AliAnalysisEtSelectorPhos::CutGeometricalAcceptance(const AliVTrack& track)
322 float myphi = track.Phi();
323 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
324 return TMath::Abs(track.Eta()) < fCuts->GetGeometryPhosEtaAccCut()
325 && myphi < fCuts->GetGeometryPhosPhiAccMaxCut()*TMath::Pi()/180.
326 && myphi > fCuts->GetGeometryPhosPhiAccMinCut()*TMath::Pi()/180.;
330 Bool_t AliAnalysisEtSelectorPhos::CutGeometricalAcceptance(const AliESDCaloCluster& cluster)
333 cluster.GetPosition(pos);
335 float myphi = cp.Phi();
336 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
337 return TMath::Abs(cp.Eta()) < fCuts->GetGeometryPhosEtaAccCut()
338 && myphi < fCuts->GetGeometryPhosPhiAccMaxCut()*TMath::Pi()/180.
339 && myphi > fCuts->GetGeometryPhosPhiAccMinCut()*TMath::Pi()/180.;