]>
Commit | Line | Data |
---|---|---|
820b4d9e | 1 | #ifndef AliMuonForwardTrackFinder_H |
2 | #define AliMuonForwardTrackFinder_H | |
3 | ||
4 | // ROOT includes | |
5 | #include "TObject.h" | |
6 | #include "TClonesArray.h" | |
7 | #include "TH2D.h" | |
8 | #include "TH1D.h" | |
9 | #include "TFile.h" | |
10 | #include "TGeoManager.h" | |
11 | #include "TMatrixD.h" | |
12 | #include "TParticle.h" | |
13 | #include "TMath.h" | |
14 | #include "TGraph.h" | |
15 | #include "TEllipse.h" | |
16 | #include "TCanvas.h" | |
17 | #include "TString.h" | |
18 | #include "TLatex.h" | |
19 | #include "TMarker.h" | |
20 | #include "TNtuple.h" | |
21 | #include "TRandom.h" | |
22 | #include "TIterator.h" | |
23 | ||
24 | // STEER includes | |
25 | #include "AliLog.h" | |
26 | #include "AliRun.h" | |
27 | #include "AliRunLoader.h" | |
28 | #include "AliLoader.h" | |
29 | #include "AliHeader.h" | |
30 | #include "AliMC.h" | |
31 | #include "AliStack.h" | |
32 | #include "AliMagF.h" | |
33 | #include "AliTracker.h" | |
34 | #include "AliGRPObject.h" | |
35 | #include "AliRunInfo.h" | |
36 | ||
37 | // MUON includes | |
38 | #include "AliMUONConstants.h" | |
39 | #include "AliMUONTrack.h" | |
40 | #include "AliMUONRecoCheck.h" | |
41 | #include "AliMUONTrackParam.h" | |
42 | #include "AliMUONTrackExtrap.h" | |
43 | #include "AliMUONVTrackStore.h" | |
44 | #include "AliMUONVCluster.h" | |
45 | ||
46 | // MFT includes | |
47 | #include "AliMuonForwardTrack.h" | |
48 | #include "AliMFTCluster.h" | |
49 | #include "AliMFT.h" | |
50 | #include "AliMFTSegmentation.h" | |
d4643a10 | 51 | #include "AliMFTConstants.h" |
820b4d9e | 52 | |
53 | //==================================================================================================================================================== | |
54 | // | |
55 | // Class for the creation of the "global muon tracks" built from the clusters in the | |
56 | // muon spectrometer and the clusters of the Muon Forward Tracker. QA histograms are also created | |
57 | // | |
58 | // Contact author: antonio.uras@cern.ch | |
59 | // | |
60 | //==================================================================================================================================================== | |
61 | ||
62 | class AliMuonForwardTrackFinder : public TObject { | |
63 | ||
64 | public: | |
65 | ||
66 | enum matchingOption {kRealMatching, kIdealMatching}; | |
026547c6 | 67 | enum {kConverged, kDiverged}; |
820b4d9e | 68 | |
69 | AliMuonForwardTrackFinder(); | |
70 | ||
d4643a10 | 71 | virtual ~AliMuonForwardTrackFinder(); |
820b4d9e | 72 | |
73 | enum {kAllClusters, kClustersGoodChi2, kClusterOfTrack, kClusterCorrectMC}; | |
74 | ||
75 | void Init(Int_t nRun, Char_t *readDir, Char_t *outDir, Int_t nEventsToAnalyze = -1); | |
76 | Bool_t LoadNextEvent(); | |
77 | Int_t LoadNextTrack(); | |
78 | Int_t GetNDF(Int_t nClusters); | |
79 | void PDGNameConverter(const Char_t *nameIn, Char_t *nameOut); | |
80 | void DrawPlanes(); | |
81 | void Terminate(); | |
82 | void WriteHistos(); | |
83 | ||
84 | void SetRun(Int_t nRun) { fRun = nRun; } | |
85 | void SetNEventsToAnalyze(Int_t nEventsToAnalyze) { fNEventsToAnalyze = nEventsToAnalyze; } | |
86 | void SetSigmaSpectrometerCut(Double_t sigmaSpectrometerCut) { fSigmaSpectrometerCut = sigmaSpectrometerCut; } | |
87 | void SetSigmaClusterCut(Double_t sigmaClusterCut) { fSigmaClusterCut = sigmaClusterCut; } | |
88 | void SetChi2GlobalCut(Double_t chi2GlobalCut) { fChi2GlobalCut = chi2GlobalCut; } | |
89 | void SetReadDir(Char_t *dirName) { fReadDir = dirName; } | |
90 | void SetOutDir(Char_t *dirName) { fOutDir = dirName; } | |
91 | void SetDraw(Bool_t drawOption); | |
92 | void SetRAbsorberCut(Double_t rAbsorberCut) { fRAbsorberCut = rAbsorberCut; } | |
93 | void SetLowPtCut(Double_t lowPtCut) { fLowPtCut = lowPtCut; } | |
94 | void SetNFinalCandidatesCut(Int_t nFinalCandidatesCut) { fNFinalCandidatesCut = nFinalCandidatesCut; } | |
b03d16a3 | 95 | void SetVertexError(Double_t xErr, Double_t yErr, Double_t zErr) { fVertexErrorX=xErr; fVertexErrorY=yErr; fVertexErrorZ=zErr; } |
820b4d9e | 96 | |
97 | Int_t GetRun() { return fRun; } | |
98 | Int_t GetNEvents() { return fNEventsToAnalyze; } | |
99 | Double_t GetSigmaSpectrometerCut() { return fSigmaSpectrometerCut; } | |
100 | Double_t GetSigmaClusterCut() { return fSigmaClusterCut; } | |
101 | Double_t GetChi2GlobalCut() { return fChi2GlobalCut; } | |
102 | Double_t GetRAbsorberCut() { return fRAbsorberCut; } | |
103 | Double_t GetLowPtCut() { return fLowPtCut; } | |
820b4d9e | 104 | Int_t GetNPlanesMFT() { return fNPlanesMFT; } |
105 | Int_t GetNFinalCandidatesCut() { return fNFinalCandidatesCut; } | |
106 | Int_t GetCurrentEvent() { return fEv; } | |
107 | ||
108 | Int_t GetNRealTracksAnalyzed() const { return fCountRealTracksAnalyzed; } | |
109 | Int_t GetNRealTracksAnalyzedOfEvent() const { return fCountRealTracksAnalyzedOfEvent; } | |
110 | Int_t GetNRealTracksWithRefMC() const { return fCountRealTracksWithRefMC; } | |
111 | Int_t GetNRealTracksWithRefMC_andTrigger() const { return fCountRealTracksWithRefMC_andTrigger; } | |
112 | Int_t GetNRealTracksWithRefMC_andTrigger_andGoodPt() const { return fCountRealTracksWithRefMC_andTrigger_andGoodPt; } | |
113 | Int_t GetNRealTracksWithRefMC_andTrigger_andGoodPt_andGoodTheta() const { return fCountRealTracksWithRefMC_andTrigger_andGoodPt_andGoodTheta; } | |
114 | ||
115 | void SetNPlanesMFT(Int_t nPlanesMFT) { fNPlanesMFT = nPlanesMFT; } | |
116 | void SeparateFrontBackClusters(); | |
117 | void SetNMaxMissingMFTClusters(Int_t nMaxMissingMFTClusters) { fNMaxMissingMFTClusters = nMaxMissingMFTClusters; } | |
d4643a10 | 118 | void SetMandatoryPlane(Int_t iPlane) { if (0<=iPlane && iPlane<AliMFTConstants::fNMaxPlanes) fIsPlaneMandatory[iPlane] = kTRUE; } |
820b4d9e | 119 | |
a2b7dc2a | 120 | Int_t FindClusterInPlane(Int_t planeId); |
820b4d9e | 121 | void AttachGoodClusterInPlane(Int_t planeId); |
d4643a10 | 122 | void FillPlanesWithTrackHistory(); |
820b4d9e | 123 | Double_t TryOneCluster(const AliMUONTrackParam &trackParam, AliMFTCluster *cluster); |
124 | void BookHistos(); | |
125 | void SetTitleHistos(); | |
126 | void BookPlanes(); | |
127 | void ResetPlanes(); | |
128 | void PrintParticleHistory(); | |
129 | ||
130 | Bool_t IsCorrectMatch(AliMFTCluster *cluster); | |
131 | void CheckCurrentMuonTrackable(); | |
df4bbbc3 | 132 | Bool_t IsMother(const Char_t *nameMother); |
820b4d9e | 133 | |
134 | void SetMatchingMode(Int_t matchingMode) { fMatchingMode = matchingMode; } | |
b5ab1ac4 | 135 | void SetMinResearchRadiusAtPlane(Int_t plane, Double_t radius) { if (plane>=0 && plane<fNMaxPlanes) fMinResearchRadiusAtPlane[plane] = radius; } |
820b4d9e | 136 | |
137 | void FillOutputTree(); | |
138 | void WriteOutputTree(); | |
139 | ||
140 | Bool_t InitGRP(); | |
141 | Bool_t SetRunNumber(); | |
142 | ||
d4643a10 | 143 | void SetMaxNTracksToBeAnalyzed(Int_t nTracks) { fMaxNTracksToBeAnalyzed = nTracks; } |
7e3dd1af | 144 | void SetBransonCorrection(Bool_t correction) { fBransonCorrection = correction; } |
d4643a10 | 145 | |
820b4d9e | 146 | private: |
147 | ||
148 | AliMuonForwardTrackFinder(const AliMuonForwardTrackFinder& obj); | |
149 | AliMuonForwardTrackFinder& operator=(const AliMuonForwardTrackFinder& other); | |
150 | ||
151 | protected: | |
152 | ||
d4643a10 | 153 | static const Int_t fNMaxPlanes = AliMFTConstants::fNMaxPlanes; // max number of MFT planes |
154 | static const Double_t fRadLengthSi; | |
a2b7dc2a | 155 | static const Int_t fMaxNCandidates = 1000; |
d4643a10 | 156 | |
820b4d9e | 157 | Int_t fRun; |
158 | Int_t fNEventsToAnalyze; // events to analyze | |
159 | Double_t fSigmaClusterCut; // to select the clusters in the MFT planes which are compatible with the extrapolated muon track | |
a2b7dc2a | 160 | Double_t fScaleSigmaClusterCut; // to tune the cut on the compatible clusters in case of too many candidates |
161 | Bool_t fGlobalTrackingDiverged; // to keep memory of a possible divergence in the global tracking finding | |
820b4d9e | 162 | Double_t fChi2GlobalCut; // cut on the final chi2 of the global muon track |
163 | Double_t fSigmaSpectrometerCut; // for the selection of the tracks in the muon spectrometer | |
b03d16a3 | 164 | Double_t fVertexErrorX; // uncertainty on the x position of the muon's origin |
165 | Double_t fVertexErrorY; // uncertainty on the y position of the muon's origin | |
166 | Double_t fVertexErrorZ; // uncertainty on the z position of the muon's origin | |
820b4d9e | 167 | Int_t fNFinalCandidatesCut; // cut on the number of the final candidates for the muon track |
168 | TString fReadDir; | |
169 | TString fOutDir; | |
170 | Bool_t fDrawOption; | |
171 | ||
172 | Double_t fDistanceFromGoodClusterAndTrackAtLastPlane; | |
173 | Double_t fDistanceFromBestClusterAndTrackAtLastPlane; | |
174 | ||
d4643a10 | 175 | TClonesArray *fMFTClusterArray[fNMaxPlanes]; //! array of clusters for the planes of the MFT |
176 | TClonesArray *fMFTClusterArrayFront[fNMaxPlanes]; //! array of front clusters for the planes of the MFT | |
177 | TClonesArray *fMFTClusterArrayBack[fNMaxPlanes]; //! array of back clusters for the planes of the MFT | |
820b4d9e | 178 | |
179 | Double_t fRAbsorberCut; // in cm, corresponds to the radial position of a 3 degrees track at the end of the absorber (-503 cm) | |
180 | Double_t fLowPtCut; // in GeV/c, the lower limit for the pt of a track in the muon spectrometer | |
181 | Int_t fNPlanesMFT; // number of planes of the Vertex Telescope (Muon Internal Tracker) -> This should be taken from the new version of AliVZERO2 | |
182 | Int_t fNPlanesMFTAnalyzed; | |
183 | Int_t fNMaxMissingMFTClusters; // max. number of MFT clusters which can be missed in the global fit procedure | |
d4643a10 | 184 | Bool_t fIsPlaneMandatory[fNMaxPlanes]; // specifies which MFT planes cannot be missed in the global fit procedure |
820b4d9e | 185 | |
186 | Int_t fEv; // current event being analyzed | |
187 | Int_t fLabelMC; // MC label of the muon track reconstructed in the spectrometer | |
188 | ||
189 | Bool_t fIsClusterCompatible[10]; // here the clusters in the Muon Spectrometer are concerned | |
190 | ||
d4643a10 | 191 | Double_t fZPlane[fNMaxPlanes]; // z-position of the MFT planes (center of the support) |
192 | Double_t fRPlaneMax[fNMaxPlanes]; // max radius of the MFT planes (the support) | |
193 | Double_t fRPlaneMin[fNMaxPlanes]; // min radius of the MFT planes (the support) | |
194 | ||
d4643a10 | 195 | TH1D *fHistRadiusEndOfAbsorber, *fHistNTracksAfterExtrapolation[fNMaxPlanes]; // |
196 | TH1D *fHistNGoodClustersForFinalTracks, *fHistResearchRadius[fNMaxPlanes]; // | |
197 | TH1D *fHistDistanceGoodClusterFromTrackMinusDistanceBestClusterFromTrackAtLastPlane; // | |
198 | TH1D *fHistDistanceGoodClusterFromTrackAtLastPlane; // | |
199 | TH1D *fHistChi2Cluster_GoodCluster[fNMaxPlanes], *fHistChi2Cluster_BadCluster[fNMaxPlanes]; // | |
200 | TH1D *fHistGlobalChi2AtPlaneFor_GOOD_CandidatesOfTrackableMuons[fNMaxPlanes]; // | |
201 | TH1D *fHistGlobalChi2AtPlaneFor_BAD_CandidatesOfTrackableMuons[fNMaxPlanes]; // | |
202 | ||
203 | TNtuple *fNtuFinalCandidates; | |
204 | TNtuple *fNtuFinalBestCandidates; | |
205 | ||
206 | TGraph *fGrMFTPlane[4][20]; //! | |
207 | TEllipse *fCircleExt[fNMaxPlanes], *fCircleInt[fNMaxPlanes]; //! | |
208 | TCanvas *fCanvas; //! | |
209 | ||
210 | TLatex *fTxtMuonHistory, *fTxtTrackGoodClusters, *fTxtTrackChi2[fNMaxPlanes]; //! | |
211 | TLatex *fTxtTrackFinalChi2, *fTxtTrackMomentum, *fTxtFinalCandidates, *fTxtDummy; //! | |
212 | TLatex *fTxtAllClust, *fTxtClustGoodChi2, *fTxtClustMC, *fTxtClustOfTrack; //! | |
213 | TMarker *fMrkAllClust, *fMrkClustGoodChi2, *fMrkClustMC, *fMrkClustOfTrack; //! | |
214 | ||
215 | Int_t fCountRealTracksAnalyzed; | |
216 | Int_t fMaxNTracksToBeAnalyzed; | |
820b4d9e | 217 | Int_t fCountRealTracksWithRefMC; |
218 | Int_t fCountRealTracksWithRefMC_andTrigger; | |
219 | Int_t fCountRealTracksWithRefMC_andTrigger_andGoodPt; | |
220 | Int_t fCountRealTracksWithRefMC_andTrigger_andGoodPt_andGoodTheta; | |
221 | Int_t fCountRealTracksAnalyzedOfEvent; | |
222 | Int_t fCountRealTracksAnalyzedWithFinalCandidates; | |
223 | ||
d4643a10 | 224 | TFile *fFileCluster; //! |
225 | TFile *fFileESD; //! | |
226 | TFile *fFile_gAlice; //! | |
820b4d9e | 227 | |
d4643a10 | 228 | AliRunLoader *fRunLoader; //! |
229 | AliLoader *fMFTLoader; //! | |
230 | AliMUONRecoCheck *fMuonRecoCheck; //! | |
820b4d9e | 231 | |
d4643a10 | 232 | TTree *fMFTClusterTree; //! |
820b4d9e | 233 | |
d4643a10 | 234 | AliMUONTrack *fMuonTrackReco; //! muon track being analyzed |
235 | AliMuonForwardTrack *fCurrentTrack; //! muon extrapolated track being tested | |
236 | AliMuonForwardTrack *fFinalBestCandidate; //! best final candidate (if any) | |
820b4d9e | 237 | Bool_t fIsCurrentMuonTrackable; |
d4643a10 | 238 | Bool_t fIsGoodClusterInPlane[fNMaxPlanes]; |
820b4d9e | 239 | |
d4643a10 | 240 | TClonesArray *fCandidateTracks; //! array of track we are going to build (starting from fMuonTrackReco) |
820b4d9e | 241 | |
d4643a10 | 242 | AliMUONVTrackStore *fTrackStore; //! list of reconstructed MUON tracks |
243 | AliMUONVTrackStore *fTrackRefStore; //! list of reconstructible MUON tracks | |
820b4d9e | 244 | |
245 | TIterator *fNextTrack; //! Iterator for reading the MUON tracks | |
246 | ||
d4643a10 | 247 | AliStack *fStack; //! |
820b4d9e | 248 | |
d4643a10 | 249 | AliMFT *fMFT; //! |
250 | AliMFTSegmentation *fSegmentation; //! | |
820b4d9e | 251 | |
d4643a10 | 252 | TFile *fOutputTreeFile, *fOutputQAFile; // |
253 | TTree *fOutputEventTree; //! | |
820b4d9e | 254 | |
d4643a10 | 255 | TClonesArray *fMuonForwardTracks; //! array of AliMuonForwardTrack |
820b4d9e | 256 | |
257 | Int_t fMatchingMode; | |
b5ab1ac4 | 258 | Double_t fMinResearchRadiusAtPlane[fNMaxPlanes]; |
820b4d9e | 259 | |
d4643a10 | 260 | AliGRPObject *fGRPData; //! Data from the GRP/GRP/Data CDB folder |
261 | AliRunInfo *fRunInfo; //! | |
7e3dd1af | 262 | |
263 | Bool_t fBransonCorrection; // if TRUE, Branson Correction is applied when extrapolating the MUON tracks to the vertex region | |
820b4d9e | 264 | |
265 | ClassDef(AliMuonForwardTrackFinder, 1); | |
266 | ||
267 | }; | |
268 | ||
7e3dd1af | 269 | //==================================================================================================================================================== |
820b4d9e | 270 | |
271 | #endif | |
272 | ||
273 |