]>
Commit | Line | Data |
---|---|---|
e806e863 | 1 | //==================================================================================================================================================== |
2 | // | |
3 | // Class for the analysis of the ALICE muon forward tracks (MUON + MFT) | |
4 | // | |
5 | // Contact author: antonio.uras@cern.ch | |
6 | // | |
7 | //==================================================================================================================================================== | |
8 | ||
9 | #include "TObject.h" | |
10 | #include "TClonesArray.h" | |
11 | #include "AliMuonForwardTrack.h" | |
12 | #include "AliMuonForwardTrackPair.h" | |
13 | #include "TMatrixD.h" | |
14 | #include "TTree.h" | |
15 | #include "TH1D.h" | |
16 | #include "AliLog.h" | |
17 | #include "TFile.h" | |
18 | #include "TParticle.h" | |
19 | #include "AliMUONTrackParam.h" | |
20 | #include "AliMUONTrackExtrap.h" | |
21 | #include "TGeoManager.h" | |
22 | #include "TRandom.h" | |
23 | #include "TLorentzVector.h" | |
24 | #include "TDatabasePDG.h" | |
b5ab1ac4 | 25 | #include "TGraph.h" |
e806e863 | 26 | #include "AliMuonForwardTrackAnalysis.h" |
27 | ||
28 | ClassImp(AliMuonForwardTrackAnalysis) | |
29 | ||
30 | //==================================================================================================================================================== | |
31 | ||
32 | AliMuonForwardTrackAnalysis::AliMuonForwardTrackAnalysis(): | |
33 | TObject(), | |
34 | fInputDir(0), | |
35 | fOutputDir(0), | |
7e3dd1af | 36 | fInputTreeWithBranson(0x0), |
37 | fInputTreeWithoutBranson(0x0), | |
38 | fMuonForwardTracksWithBranson(0), | |
39 | fMuonForwardTrackPairsWithBranson(0), | |
40 | fMuonForwardTracksWithoutBranson(0), | |
41 | fMuonForwardTrackPairsWithoutBranson(0), | |
42 | fMFTTrackWithBranson(0), | |
43 | fMFTTrackWithoutBranson(0), | |
e806e863 | 44 | fMFTTrack(0), |
7e3dd1af | 45 | fMFTTrackPairWithBranson(0), |
46 | fMFTTrackPairWithoutBranson(0), | |
e806e863 | 47 | fMFTTrackPair(0), |
48 | fMCRefTrack(0), | |
49 | fEv(0), | |
50 | fFirstEvent(-1), | |
51 | fLastEvent(-1), | |
52 | fNTracksOfEvent(0), | |
53 | fNTracksAnalyzedOfEvent(0), | |
54 | fNTracksAnalyzed(0), | |
55 | fNPairsOfEvent(0), | |
56 | fNPairsAnalyzedOfEvent(0), | |
57 | fHistOffsetSingleMuonsX(0x0), | |
58 | fHistOffsetSingleMuonsY(0x0), | |
59 | fHistOffsetSingleMuons(0x0), | |
60 | fHistWOffsetSingleMuons(0x0), | |
61 | fHistErrorSingleMuonsX(0x0), | |
62 | fHistErrorSingleMuonsY(0x0), | |
63 | fHistOffsetSingleMuonsX_vsPtRapidity(0x0), | |
64 | fHistOffsetSingleMuonsY_vsPtRapidity(0x0), | |
65 | fHistSingleMuonsPtRapidity(0x0), | |
b5ab1ac4 | 66 | fHistSingleMuonsOffsetChi2(0x0), |
e806e863 | 67 | fHistWOffsetMuonPairs(0x0), |
68 | fHistMassMuonPairs(0x0), | |
69 | fHistMassMuonPairsWithoutMFT(0x0), | |
70 | fHistMassMuonPairsMC(0x0), | |
71 | fHistRapidityPtMuonPairsMC(0x0), | |
b5ab1ac4 | 72 | fGraphSingleMuonsOffsetChi2(0x0), |
e806e863 | 73 | fNMassBins(1000), |
74 | fMassMin(0), | |
75 | fMassMax(10), | |
76 | fSingleMuonAnalysis(1), | |
77 | fMuonPairAnalysis(1), | |
78 | fMatchTrigger(0), | |
79 | fOption(0), | |
b5ab1ac4 | 80 | fXVertResMC(50.e-4), |
81 | fYVertResMC(50.e-4), | |
82 | fZVertResMC(50.e-4), | |
7e3dd1af | 83 | fPrimaryVtxX(0.), |
84 | fPrimaryVtxY(0.), | |
85 | fPrimaryVtxZ(0.), | |
e806e863 | 86 | fMaxNWrongClustersMC(999), |
7e3dd1af | 87 | fPtMinSingleMuons(0), |
88 | fUseBransonForCut(kFALSE), | |
89 | fUseBransonForKinematics(kFALSE), | |
90 | fCutOnOffsetChi2(kFALSE), | |
91 | fCenterOffset(0.), | |
92 | fCenterChi2(1.), | |
93 | fScaleOffset(250.), | |
94 | fScaleChi2(4.5), | |
95 | fRadiusCut(1.) | |
e806e863 | 96 | { |
97 | ||
98 | // default constructor | |
99 | ||
100 | for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) { | |
101 | for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) { | |
102 | fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] = 0x0; | |
103 | fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] = 0x0; | |
104 | } | |
105 | } | |
106 | ||
107 | } | |
108 | ||
109 | //==================================================================================================================================================== | |
110 | ||
111 | Bool_t AliMuonForwardTrackAnalysis::Init(Char_t *inputFileName) { | |
112 | ||
113 | BookHistos(); | |
114 | ||
115 | TFile *inputFile = new TFile(Form("%s/%s",fInputDir.Data(),inputFileName)); | |
116 | if (!inputFile || !inputFile->IsOpen()) { | |
117 | AliError(Form("Error opening file %s", inputFileName)); | |
118 | return kFALSE; | |
119 | } | |
7e3dd1af | 120 | fInputTreeWithBranson = (TTree*) inputFile->Get("AliMuonForwardTracksWithBranson"); |
121 | if (!fInputTreeWithBranson) { | |
122 | AliError("Error reading input tree"); | |
123 | return kFALSE; | |
124 | } | |
125 | fInputTreeWithoutBranson = (TTree*) inputFile->Get("AliMuonForwardTracksWithoutBranson"); | |
126 | if (!fInputTreeWithoutBranson) { | |
e806e863 | 127 | AliError("Error reading input tree"); |
128 | return kFALSE; | |
129 | } | |
130 | ||
7e3dd1af | 131 | if (fFirstEvent<0 || fLastEvent<0 || fFirstEvent>fLastEvent || fFirstEvent>=fInputTreeWithBranson->GetEntries()) { |
e806e863 | 132 | fFirstEvent = 0; |
7e3dd1af | 133 | fLastEvent = fInputTreeWithBranson->GetEntries()-1; |
e806e863 | 134 | } |
135 | else { | |
7e3dd1af | 136 | fLastEvent = TMath::Min(fLastEvent, Int_t(fInputTreeWithBranson->GetEntries()-1)); |
e806e863 | 137 | } |
138 | ||
139 | AliInfo(Form("Analysing events %d to %d", fFirstEvent, fLastEvent)); | |
140 | ||
7e3dd1af | 141 | fMuonForwardTracksWithBranson = new TClonesArray("AliMuonForwardTrack"); |
142 | fInputTreeWithBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithBranson); | |
143 | ||
144 | fMuonForwardTracksWithoutBranson = new TClonesArray("AliMuonForwardTrack"); | |
145 | fInputTreeWithoutBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithoutBranson); | |
e806e863 | 146 | |
147 | TGeoManager::Import(Form("%s/geometry.root",fInputDir.Data())); | |
148 | ||
149 | AliMUONTrackExtrap::SetField(); | |
150 | ||
7e3dd1af | 151 | fMuonForwardTrackPairsWithBranson = new TClonesArray("AliMuonForwardTrackPair"); |
152 | fMuonForwardTrackPairsWithoutBranson = new TClonesArray("AliMuonForwardTrackPair"); | |
e806e863 | 153 | |
154 | return kTRUE; | |
155 | ||
156 | } | |
157 | ||
158 | //==================================================================================================================================================== | |
159 | ||
160 | Bool_t AliMuonForwardTrackAnalysis::LoadNextEvent() { | |
161 | ||
162 | if (fEv>fLastEvent) return kFALSE; | |
163 | if (fEv<fFirstEvent) { fEv++; return kTRUE; } | |
7e3dd1af | 164 | fMuonForwardTracksWithBranson -> Delete(); |
165 | fMuonForwardTracksWithoutBranson -> Delete(); | |
166 | fInputTreeWithBranson->GetEvent(fEv); | |
167 | fInputTreeWithoutBranson->GetEvent(fEv); | |
168 | AliInfo(Form("**** analyzing event # %4d (%3d tracks) ****", fEv, fMuonForwardTracksWithBranson->GetEntries())); | |
169 | ||
170 | fPrimaryVtxX = gRandom->Gaus(0., fXVertResMC); | |
171 | fPrimaryVtxY = gRandom->Gaus(0., fYVertResMC); | |
172 | fPrimaryVtxZ = gRandom->Gaus(0., fZVertResMC); | |
e806e863 | 173 | |
174 | if (fSingleMuonAnalysis) { | |
175 | fNTracksAnalyzedOfEvent = 0; | |
7e3dd1af | 176 | fNTracksOfEvent = fMuonForwardTracksWithBranson->GetEntries(); |
e806e863 | 177 | while (AnalyzeSingleMuon()) continue; |
178 | } | |
179 | ||
180 | if (fMuonPairAnalysis) { | |
7e3dd1af | 181 | if (fMuonForwardTrackPairsWithBranson) { |
182 | fMuonForwardTrackPairsWithBranson->Delete(); | |
183 | fMuonForwardTrackPairsWithoutBranson->Delete(); | |
e806e863 | 184 | } |
185 | BuildMuonPairs(); | |
186 | fNPairsAnalyzedOfEvent = 0; | |
7e3dd1af | 187 | fNPairsOfEvent = fMuonForwardTrackPairsWithBranson->GetEntries(); |
e806e863 | 188 | while (AnalyzeMuonPair()) continue; |
189 | } | |
190 | ||
191 | fEv++; | |
192 | ||
193 | return kTRUE; | |
194 | ||
195 | } | |
196 | ||
197 | //==================================================================================================================================================== | |
198 | ||
199 | Bool_t AliMuonForwardTrackAnalysis::AnalyzeSingleMuon() { | |
200 | ||
201 | if (fNTracksAnalyzedOfEvent>=fNTracksOfEvent) return kFALSE; | |
202 | ||
7e3dd1af | 203 | fMFTTrackWithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(fNTracksAnalyzedOfEvent); |
204 | fMFTTrackWithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(fNTracksAnalyzedOfEvent); | |
205 | ||
e806e863 | 206 | fNTracksAnalyzedOfEvent++; |
7e3dd1af | 207 | |
208 | Bool_t passedCut = kFALSE; | |
209 | if (fUseBransonForCut) passedCut = PassedCutSingleMuon(fMFTTrackWithBranson); | |
210 | else passedCut = PassedCutSingleMuon(fMFTTrackWithoutBranson); | |
211 | if (!passedCut) return kTRUE; | |
212 | ||
213 | if (fUseBransonForKinematics) fMFTTrack = fMFTTrackWithBranson; | |
214 | else fMFTTrack = fMFTTrackWithoutBranson; | |
e806e863 | 215 | if (fMatchTrigger && !fMFTTrack->GetMatchTrigger()) return kTRUE; |
216 | fMCRefTrack = fMFTTrack->GetMCTrackRef(); | |
217 | ||
218 | if (!fMCRefTrack) return kTRUE; | |
219 | if (fMFTTrack->GetNWrongClustersMC()>fMaxNWrongClustersMC) return kTRUE; | |
220 | ||
e806e863 | 221 | AliMUONTrackParam *param = fMFTTrack->GetTrackParamAtMFTCluster(0); |
7e3dd1af | 222 | AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ); |
e806e863 | 223 | |
224 | TLorentzVector pMu; | |
225 | Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass(); | |
226 | Double_t energy = TMath::Sqrt(param->P()*param->P() + mMu*mMu); | |
227 | pMu.SetPxPyPzE(param->Px(), param->Py(), param->Pz(), energy); | |
228 | ||
e806e863 | 229 | TMatrixD cov(5,5); |
230 | cov = param->GetCovariances(); | |
231 | ||
232 | fHistErrorSingleMuonsX -> Fill(1.e4*TMath::Sqrt(cov(0,0))); | |
233 | fHistErrorSingleMuonsY -> Fill(1.e4*TMath::Sqrt(cov(2,2))); | |
234 | ||
7e3dd1af | 235 | Double_t dX = fMFTTrack->GetOffsetX(fPrimaryVtxX, fPrimaryVtxZ); |
236 | Double_t dY = fMFTTrack->GetOffsetY(fPrimaryVtxY, fPrimaryVtxZ); | |
e806e863 | 237 | |
7e3dd1af | 238 | Double_t offset = fMFTTrack->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ); |
239 | Double_t weightedOffset = fMFTTrack->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ); | |
e806e863 | 240 | |
241 | // AliDebug(2, Form("pdg code = %d\n", fMCRefTrack->GetPdgCode())); | |
242 | ||
243 | fHistOffsetSingleMuonsX -> Fill(1.e4*dX); | |
244 | fHistOffsetSingleMuonsY -> Fill(1.e4*dY); | |
245 | Int_t rapBin = fHistOffsetSingleMuonsX_vsPtRapidity->GetXaxis()->FindBin(pMu.Rapidity()); | |
246 | Int_t ptBin = fHistOffsetSingleMuonsX_vsPtRapidity->GetYaxis()->FindBin(pMu.Pt()); | |
247 | // AliDebug(1, Form("pt = %f (%d), rap = %f (%d)\n", pMu.Pt(), pMu.Rapidity(), ptBin, rapBin)); | |
248 | if (0<rapBin && rapBin<=fNRapBinsOffsetSingleMuons && 0<ptBin && ptBin<=fNPtBinsOffsetSingleMuons) { | |
249 | fHistOffsetSingleMuonsX_tmp[rapBin-1][ptBin-1]->Fill(1.e4*dX); | |
250 | fHistOffsetSingleMuonsY_tmp[rapBin-1][ptBin-1]->Fill(1.e4*dY); | |
251 | } | |
b5ab1ac4 | 252 | fHistSingleMuonsPtRapidity -> Fill(pMu.Rapidity(), pMu.Pt()); |
253 | fHistOffsetSingleMuons -> Fill(1.e4*offset); | |
254 | fHistWOffsetSingleMuons -> Fill(weightedOffset); | |
255 | Double_t chi2OverNdf = fMFTTrack->GetGlobalChi2()/Double_t(fMFTTrack->GetNMFTClusters()+fMFTTrack->GetNMUONClusters()); | |
256 | fHistSingleMuonsOffsetChi2 -> Fill(1.e4*offset, chi2OverNdf); | |
257 | fGraphSingleMuonsOffsetChi2 -> SetPoint(fGraphSingleMuonsOffsetChi2->GetN(),1.e4*offset, chi2OverNdf); | |
e806e863 | 258 | |
259 | fNTracksAnalyzed++; | |
260 | ||
261 | return kTRUE; | |
262 | ||
263 | } | |
264 | ||
265 | //==================================================================================================================================================== | |
266 | ||
267 | Bool_t AliMuonForwardTrackAnalysis::AnalyzeMuonPair() { | |
268 | ||
269 | if (fNPairsAnalyzedOfEvent>=fNPairsOfEvent) return kFALSE; | |
270 | ||
7e3dd1af | 271 | fMFTTrackPairWithBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithBranson->At(fNPairsAnalyzedOfEvent); |
272 | fMFTTrackPairWithoutBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithoutBranson->At(fNPairsAnalyzedOfEvent); | |
e806e863 | 273 | |
7e3dd1af | 274 | fNPairsAnalyzedOfEvent++; |
275 | ||
276 | Bool_t passedCut = kFALSE; | |
277 | if (fUseBransonForCut) passedCut = PassedCutMuonPair(fMFTTrackPairWithBranson); | |
278 | else passedCut = PassedCutMuonPair(fMFTTrackPairWithoutBranson); | |
279 | ||
280 | if (!passedCut) return kTRUE; | |
281 | ||
282 | if (fUseBransonForKinematics) fMFTTrackPair = fMFTTrackPairWithBranson; | |
283 | else fMFTTrackPair = fMFTTrackPairWithoutBranson; | |
e806e863 | 284 | |
7e3dd1af | 285 | if ( fMFTTrackPair->GetTrack(0)->GetNWrongClustersMC()>fMaxNWrongClustersMC || |
286 | fMFTTrackPair->GetTrack(1)->GetNWrongClustersMC()>fMaxNWrongClustersMC ) return kTRUE; | |
e806e863 | 287 | |
7e3dd1af | 288 | if (fOption==kResonanceOnly && !fMFTTrackPair->IsResonance()) return kTRUE; |
289 | ||
290 | fHistMassMuonPairs -> Fill(fMFTTrackPair->GetMass(fPrimaryVtxZ)); | |
291 | fHistWOffsetMuonPairs -> Fill(fMFTTrackPair->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ)); | |
292 | fHistMassMuonPairsWithoutMFT -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ)); | |
e806e863 | 293 | fHistMassMuonPairsMC -> Fill(fMFTTrackPair->GetMassMC()); |
294 | fHistRapidityPtMuonPairsMC -> Fill(fMFTTrackPair->GetRapidityMC(), fMFTTrackPair->GetPtMC()); | |
295 | ||
7e3dd1af | 296 | AliDebug(1, Form("mass = %f MC = %f", fMFTTrackPair->GetMass(fPrimaryVtxZ), fMFTTrackPair->GetMassMC())); |
e806e863 | 297 | |
298 | return kTRUE; | |
299 | ||
300 | } | |
301 | ||
302 | //==================================================================================================================================================== | |
303 | ||
304 | void AliMuonForwardTrackAnalysis::BuildMuonPairs() { | |
305 | ||
7e3dd1af | 306 | for (Int_t iTrack=0; iTrack<fMuonForwardTracksWithBranson->GetEntries(); iTrack++) { |
e806e863 | 307 | for (Int_t jTrack=0; jTrack<iTrack; jTrack++) { |
308 | ||
7e3dd1af | 309 | AliMuonForwardTrack *track0_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(iTrack); |
310 | AliMuonForwardTrack *track1_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(jTrack); | |
311 | ||
312 | AliMuonForwardTrack *track0_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(iTrack); | |
313 | AliMuonForwardTrack *track1_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(jTrack); | |
e806e863 | 314 | |
7e3dd1af | 315 | if (fMatchTrigger) if (!track0_WithBranson->GetMatchTrigger() || !track1_WithBranson->GetMatchTrigger()) continue; |
316 | if (!track0_WithBranson->GetMCTrackRef() || !track1_WithBranson->GetMCTrackRef()) continue; | |
e806e863 | 317 | |
7e3dd1af | 318 | AliMuonForwardTrackPair *trackPairWithBranson = new AliMuonForwardTrackPair(track0_WithBranson, track1_WithBranson); |
319 | AliMuonForwardTrackPair *trackPairWithoutBranson = new AliMuonForwardTrackPair(track0_WithoutBranson, track1_WithoutBranson); | |
320 | if (fOption==kResonanceOnly && !trackPairWithBranson->IsResonance()) { | |
321 | delete trackPairWithBranson; | |
322 | delete trackPairWithoutBranson; | |
e806e863 | 323 | continue; |
324 | } | |
7e3dd1af | 325 | new ((*fMuonForwardTrackPairsWithBranson)[fMuonForwardTrackPairsWithBranson->GetEntries()]) AliMuonForwardTrackPair(*trackPairWithBranson); |
326 | new ((*fMuonForwardTrackPairsWithoutBranson)[fMuonForwardTrackPairsWithoutBranson->GetEntries()]) AliMuonForwardTrackPair(*trackPairWithoutBranson); | |
e806e863 | 327 | } |
328 | } | |
329 | ||
330 | } | |
331 | ||
332 | //==================================================================================================================================================== | |
333 | ||
7e3dd1af | 334 | Bool_t AliMuonForwardTrackAnalysis::PassedCutSingleMuon(AliMuonForwardTrack *track) { |
335 | ||
336 | AliMUONTrackParam *param = track->GetTrackParamAtMFTCluster(0); | |
337 | AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ); | |
338 | ||
339 | if (track->Pt()<fPtMinSingleMuons) return kFALSE; | |
340 | ||
341 | if (fCutOnOffsetChi2) { | |
342 | Double_t offset = 1.e4*track->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ); | |
343 | Double_t chi2OverNdf = track->GetGlobalChi2() / Double_t(track->GetNMFTClusters()+track->GetNMUONClusters()); | |
344 | offset /= fScaleOffset; | |
345 | chi2OverNdf /= fScaleChi2; | |
346 | offset -= fCenterOffset; | |
347 | chi2OverNdf -= fCenterChi2; | |
348 | // printf("cut on offset and chi2: returning %d\n", TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf)>fRadiusCut); | |
349 | if (TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf) > fRadiusCut) return kFALSE; | |
350 | } | |
351 | ||
352 | return kTRUE; | |
353 | ||
354 | } | |
355 | ||
356 | //==================================================================================================================================================== | |
357 | ||
358 | Bool_t AliMuonForwardTrackAnalysis::PassedCutMuonPair(AliMuonForwardTrackPair *pair) { | |
359 | ||
360 | return PassedCutSingleMuon(pair->GetTrack(0)) && PassedCutSingleMuon(pair->GetTrack(1)); | |
361 | ||
362 | } | |
363 | ||
364 | //==================================================================================================================================================== | |
365 | ||
e806e863 | 366 | void AliMuonForwardTrackAnalysis::Terminate(Char_t *outputFileName) { |
367 | ||
368 | for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) { | |
369 | for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) { | |
370 | Int_t binMin_x = fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->FindBin(-3*fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS()); | |
371 | Int_t binMax_x = fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->FindBin(+3*fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS()); | |
372 | for (Int_t bin=1; bin<=fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetNbinsX(); bin++) { | |
373 | if (bin<binMin_x || bin>binMax_x) fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->SetBinContent(bin, 0); | |
374 | } | |
375 | Int_t binMin_y = fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->FindBin(-3*fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS()); | |
376 | Int_t binMax_y = fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->FindBin(+3*fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS()); | |
377 | for (Int_t bin=1; bin<=fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetNbinsX(); bin++) { | |
378 | if (bin<binMin_y || bin>binMax_y) fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->SetBinContent(bin, 0); | |
379 | } | |
380 | fHistOffsetSingleMuonsX_vsPtRapidity->SetBinContent(rapBin+1, ptBin+1, fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS()); | |
381 | fHistOffsetSingleMuonsX_vsPtRapidity->SetBinError(rapBin+1, ptBin+1, fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMSError()); | |
382 | fHistOffsetSingleMuonsY_vsPtRapidity->SetBinContent(rapBin+1, ptBin+1, fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS()); | |
383 | fHistOffsetSingleMuonsY_vsPtRapidity->SetBinError(rapBin+1, ptBin+1, fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMSError()); | |
384 | } | |
385 | } | |
386 | ||
387 | TFile *fileOut = new TFile(Form("%s/%s",fOutputDir.Data(),outputFileName), "recreate"); | |
388 | ||
389 | printf("Writing output objects to file %s\n", fileOut->GetName()); | |
390 | ||
391 | fHistOffsetSingleMuonsX -> Write(); | |
392 | fHistOffsetSingleMuonsY -> Write(); | |
393 | fHistOffsetSingleMuons -> Write(); | |
394 | fHistWOffsetSingleMuons -> Write(); | |
395 | fHistErrorSingleMuonsX -> Write(); | |
396 | fHistErrorSingleMuonsY -> Write(); | |
397 | ||
398 | fHistOffsetSingleMuonsX_vsPtRapidity -> Write(); | |
399 | fHistOffsetSingleMuonsY_vsPtRapidity -> Write(); | |
400 | ||
401 | // for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) { | |
402 | // for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) { | |
403 | // fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] -> Write(); | |
404 | // fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] -> Write(); | |
405 | // } | |
406 | // } | |
407 | ||
408 | fHistSingleMuonsPtRapidity -> Write(); | |
b5ab1ac4 | 409 | fHistSingleMuonsOffsetChi2 -> Write(); |
410 | ||
411 | fGraphSingleMuonsOffsetChi2 -> Write(); | |
e806e863 | 412 | |
413 | fHistWOffsetMuonPairs -> Write(); | |
414 | fHistMassMuonPairs -> Write(); | |
415 | fHistMassMuonPairsWithoutMFT -> Write(); | |
416 | fHistMassMuonPairsMC -> Write(); | |
417 | fHistRapidityPtMuonPairsMC -> Write(); | |
418 | ||
419 | fileOut -> Close(); | |
420 | ||
421 | } | |
422 | ||
423 | //==================================================================================================================================================== | |
424 | ||
425 | void AliMuonForwardTrackAnalysis::BookHistos() { | |
426 | ||
427 | fHistOffsetSingleMuonsX = new TH1D("fHistOffsetSingleMuonsX", "Offset for single muons along X", 200, -1000, 1000); | |
428 | fHistOffsetSingleMuonsY = new TH1D("fHistOffsetSingleMuonsY", "Offset for single muons along Y", 200, -1000, 1000); | |
429 | fHistErrorSingleMuonsX = new TH1D("fHistErrorSingleMuonsX", "Coordinate Error for single muons along X", 200, 0, 1000); | |
430 | fHistErrorSingleMuonsY = new TH1D("fHistErrorSingleMuonsY", "Coordinate Error for single muons along Y", 200, 0, 1000); | |
b5ab1ac4 | 431 | fHistOffsetSingleMuons = new TH1D("fHistOffsetSingleMuons", "Offset for single muons", 200, 0, 2000); |
e806e863 | 432 | fHistWOffsetSingleMuons = new TH1D("fHistWOffsetSingleMuons", "Weighted Offset for single muons", 300, 0, 15); |
433 | ||
434 | fHistOffsetSingleMuonsX_vsPtRapidity = new TH2D("fHistOffsetSingleMuonsX_vsPtRapidity", "Offset for single muons along X", | |
435 | 10, -4, -2.5, 10, 0.5, 5.5); | |
436 | fHistOffsetSingleMuonsY_vsPtRapidity = new TH2D("fHistOffsetSingleMuonsY_vsPtRapidity", "Offset for single muons along Y", | |
437 | 10, -4, -2.5, 10, 0.5, 5.5); | |
438 | ||
439 | for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) { | |
440 | for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) { | |
441 | fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] = new TH1D(Form("fHistOffsetSingleMuonsX_tmp_%02d_%02d",rapBin,ptBin), "", 1000, -1000, 1000); | |
442 | fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] = new TH1D(Form("fHistOffsetSingleMuonsY_tmp_%02d_%02d",rapBin,ptBin), "", 1000, -1000, 1000); | |
443 | } | |
444 | } | |
445 | ||
446 | fHistSingleMuonsPtRapidity = new TH2D("fHistSingleMuonsPtRapidity", "Phase Space for single muons", 10, -4, -2.5, 10, 0.5, 5.5); | |
b5ab1ac4 | 447 | fHistSingleMuonsOffsetChi2 = new TH2D("fHistSingleMuonsOffsetChi2", "Offset vs #chi^{2}/ndf for single muons", 400, 0, 4000, 100, 0, 20); |
e806e863 | 448 | |
449 | fHistOffsetSingleMuonsX -> SetXTitle("Offset(X) [#mum]"); | |
450 | fHistOffsetSingleMuonsY -> SetXTitle("Offset(Y) [#mum]"); | |
451 | fHistErrorSingleMuonsX -> SetXTitle("Err. on track position at z_{vtx} (X) [#mum]"); | |
452 | fHistErrorSingleMuonsY -> SetXTitle("Err. on track position at z_{vtx} (Y) [#mum]"); | |
453 | fHistOffsetSingleMuons -> SetXTitle("Offset [#mum]"); | |
454 | fHistWOffsetSingleMuons -> SetXTitle("Weighted Offset"); | |
455 | ||
456 | fHistOffsetSingleMuonsX_vsPtRapidity -> SetXTitle("y^{#mu}"); | |
457 | fHistOffsetSingleMuonsY_vsPtRapidity -> SetXTitle("y^{#mu}"); | |
458 | fHistOffsetSingleMuonsX_vsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]"); | |
459 | fHistOffsetSingleMuonsY_vsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]"); | |
460 | ||
461 | fHistSingleMuonsPtRapidity -> SetXTitle("y^{#mu}"); | |
462 | fHistSingleMuonsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]"); | |
b5ab1ac4 | 463 | fHistSingleMuonsOffsetChi2 -> SetXTitle("Offset [#mum]"); |
464 | fHistSingleMuonsOffsetChi2 -> SetYTitle("#chi^{2}/ndf"); | |
e806e863 | 465 | |
466 | fHistOffsetSingleMuonsX -> Sumw2(); | |
467 | fHistOffsetSingleMuonsY -> Sumw2(); | |
468 | fHistErrorSingleMuonsX -> Sumw2(); | |
469 | fHistErrorSingleMuonsY -> Sumw2(); | |
470 | fHistOffsetSingleMuons -> Sumw2(); | |
471 | fHistWOffsetSingleMuons -> Sumw2(); | |
472 | ||
473 | fHistOffsetSingleMuonsX_vsPtRapidity -> Sumw2(); | |
474 | fHistOffsetSingleMuonsY_vsPtRapidity -> Sumw2(); | |
475 | fHistSingleMuonsPtRapidity -> Sumw2(); | |
b5ab1ac4 | 476 | fHistSingleMuonsOffsetChi2 -> Sumw2(); |
e806e863 | 477 | |
478 | //-------------------------------------------- | |
479 | ||
7e3dd1af | 480 | fGraphSingleMuonsOffsetChi2 = new TGraph(); |
b5ab1ac4 | 481 | fGraphSingleMuonsOffsetChi2 -> SetName("fGraphSingleMuonsOffsetChi2"); |
7e3dd1af | 482 | fGraphSingleMuonsOffsetChi2 -> SetTitle("fGraphSingleMuonsOffsetChi2"); |
b5ab1ac4 | 483 | |
484 | //-------------------------------------------- | |
485 | ||
e806e863 | 486 | fHistWOffsetMuonPairs = new TH1D("fHistWOffsetMuonPairs", "Weighted Offset for Muon Pairs", 300, 0, 60); |
487 | fHistMassMuonPairs = new TH1D("fHistMassMuonPairs", "Dimuon Mass (MUON+MFT)", fNMassBins, fMassMin, fMassMax); | |
488 | fHistMassMuonPairsWithoutMFT = new TH1D("fHistMassMuonPairsWithoutMFT", "Dimuon Mass (MUON only)", fNMassBins, fMassMin, fMassMax); | |
489 | fHistMassMuonPairsMC = new TH1D("fHistMassMuonPairsMC", "Dimuon Mass (MC)", fNMassBins, fMassMin, fMassMax); | |
490 | fHistRapidityPtMuonPairsMC = new TH2D("fHistRapidityPtMuonPairsMC", "Dimuon Phase Space (MC)", 100, -4.5, -2., 100, 0., 10.); | |
491 | ||
492 | fHistWOffsetMuonPairs -> SetXTitle("Weighted Offset"); | |
493 | fHistMassMuonPairs -> SetXTitle("Mass [GeV/c^{2}]"); | |
494 | fHistMassMuonPairsWithoutMFT -> SetXTitle("Mass [GeV/c^{2}]"); | |
495 | fHistMassMuonPairsMC -> SetXTitle("Mass [GeV/c^{2}]"); | |
496 | fHistRapidityPtMuonPairsMC -> SetXTitle("Rapidity"); | |
497 | fHistRapidityPtMuonPairsMC -> SetYTitle("p_{T} [GeV/c]"); | |
498 | ||
499 | fHistWOffsetMuonPairs -> Sumw2(); | |
500 | fHistMassMuonPairs -> Sumw2(); | |
501 | fHistMassMuonPairsWithoutMFT -> Sumw2(); | |
502 | fHistMassMuonPairsMC -> Sumw2(); | |
503 | fHistRapidityPtMuonPairsMC -> Sumw2(); | |
504 | ||
505 | } | |
506 | ||
507 | //==================================================================================================================================================== | |
508 |