Analysis class AliMuonForwardTrackAnalysis modified (pt bins added)
[u/mrichter/AliRoot.git] / MFT / AliMuonForwardTrackAnalysis.cxx
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"
25 #include "TGraph.h"
26 #include "AliMuonForwardTrackAnalysis.h"
27
28 ClassImp(AliMuonForwardTrackAnalysis)
29
30 //====================================================================================================================================================
31
32 AliMuonForwardTrackAnalysis::AliMuonForwardTrackAnalysis():
33   TObject(),
34   fInputDir(0),
35   fOutputDir(0),
36   fInputTreeWithBranson(0x0),
37   fInputTreeWithoutBranson(0x0),
38   fMuonForwardTracksWithBranson(0),
39   fMuonForwardTrackPairsWithBranson(0),
40   fMuonForwardTracksWithoutBranson(0),
41   fMuonForwardTrackPairsWithoutBranson(0),
42   fMFTTrackWithBranson(0),
43   fMFTTrackWithoutBranson(0),
44   fMFTTrack(0),
45   fMFTTrackPairWithBranson(0),
46   fMFTTrackPairWithoutBranson(0),
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   fHistSingleMuonsPtRapidity(0x0),
64   fHistSingleMuonsOffsetChi2(0x0),
65   fGraphSingleMuonsOffsetChi2(0x0),
66   fHistRapidityPtMuonPairsMC(0x0),
67   fNMassBins(10),
68   fNPtDimuBins(1000),
69   fMassMin(0),
70   fMassMax(10),
71   fPtDimuMin(0),
72   fPtDimuMax(5),
73   fPtAxisDimuons(0),
74   fSingleMuonAnalysis(1),
75   fMuonPairAnalysis(1),
76   fMatchTrigger(0),
77   fOption(0),
78   fXVertResMC(50.e-4),
79   fYVertResMC(50.e-4),
80   fZVertResMC(50.e-4),
81   fPrimaryVtxX(0.),
82   fPrimaryVtxY(0.),
83   fPrimaryVtxZ(0.),
84   fMaxNWrongClustersMC(999),
85   fPtMinSingleMuons(0),
86   fUseBransonForCut(kFALSE),
87   fUseBransonForKinematics(kFALSE),
88   fCutOnOffsetChi2(kFALSE),
89   fCenterOffset(0.), 
90   fCenterChi2(1.), 
91   fScaleOffset(250.), 
92   fScaleChi2(4.5),
93   fRadiusCut(1.)
94 {
95
96   // default constructor
97
98   for (Int_t iPtBin=0; iPtBin<fNMaxPtBinsDimuons+1; iPtBin++) {
99     fHistWOffsetMuonPairs[iPtBin]        = NULL;
100     fHistMassMuonPairs[iPtBin]           = NULL;
101     fHistMassMuonPairsWithoutMFT[iPtBin] = NULL;
102     fHistMassMuonPairsMC[iPtBin]         = NULL;
103   }
104
105 }
106
107 //====================================================================================================================================================
108
109 Bool_t AliMuonForwardTrackAnalysis::Init(Char_t *inputFileName) {
110
111   fPtAxisDimuons = new TAxis(fNPtDimuBins, fPtDimuMin, fPtDimuMax);
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   }
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) {
127     AliError("Error reading input tree");
128     return kFALSE;
129   }
130
131   if (fFirstEvent<0 || fLastEvent<0 || fFirstEvent>fLastEvent || fFirstEvent>=fInputTreeWithBranson->GetEntries()) {
132     fFirstEvent = 0;
133     fLastEvent  = fInputTreeWithBranson->GetEntries()-1;
134   }
135   else {
136     fLastEvent = TMath::Min(fLastEvent, Int_t(fInputTreeWithBranson->GetEntries()-1));
137   }
138
139   AliInfo(Form("Analysing events %d to %d", fFirstEvent, fLastEvent));
140
141   fMuonForwardTracksWithBranson = new TClonesArray("AliMuonForwardTrack");
142   fInputTreeWithBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithBranson);  
143
144   fMuonForwardTracksWithoutBranson = new TClonesArray("AliMuonForwardTrack");
145   fInputTreeWithoutBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithoutBranson);  
146
147   TGeoManager::Import(Form("%s/geometry.root",fInputDir.Data()));
148
149   AliMUONTrackExtrap::SetField();
150
151   fMuonForwardTrackPairsWithBranson    = new TClonesArray("AliMuonForwardTrackPair");
152   fMuonForwardTrackPairsWithoutBranson = new TClonesArray("AliMuonForwardTrackPair");
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; }
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);
173
174   if (fSingleMuonAnalysis) {
175     fNTracksAnalyzedOfEvent = 0;
176     fNTracksOfEvent = fMuonForwardTracksWithBranson->GetEntries();
177     while (AnalyzeSingleMuon()) continue;
178   }
179   
180   if (fMuonPairAnalysis) {
181     if (fMuonForwardTrackPairsWithBranson) {
182       fMuonForwardTrackPairsWithBranson->Delete();
183       fMuonForwardTrackPairsWithoutBranson->Delete();
184     }
185     BuildMuonPairs();
186     fNPairsAnalyzedOfEvent = 0;
187     fNPairsOfEvent = fMuonForwardTrackPairsWithBranson->GetEntries();
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
203   fMFTTrackWithBranson    = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(fNTracksAnalyzedOfEvent);
204   fMFTTrackWithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(fNTracksAnalyzedOfEvent);
205
206   fNTracksAnalyzedOfEvent++;
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;
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
221   AliMUONTrackParam *param = fMFTTrack->GetTrackParamAtMFTCluster(0);
222   AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ);
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
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
235   Double_t dX = fMFTTrack->GetOffsetX(fPrimaryVtxX, fPrimaryVtxZ);
236   Double_t dY = fMFTTrack->GetOffsetY(fPrimaryVtxY, fPrimaryVtxZ);
237   
238   Double_t offset = fMFTTrack->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
239   Double_t weightedOffset = fMFTTrack->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
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
246   fHistSingleMuonsPtRapidity  -> Fill(pMu.Rapidity(), pMu.Pt());
247   fHistOffsetSingleMuons      -> Fill(1.e4*offset);
248   fHistWOffsetSingleMuons     -> Fill(weightedOffset);
249   Double_t chi2OverNdf = fMFTTrack->GetGlobalChi2()/Double_t(fMFTTrack->GetNMFTClusters()+fMFTTrack->GetNMUONClusters());
250   fHistSingleMuonsOffsetChi2  -> Fill(1.e4*offset, chi2OverNdf);
251   fGraphSingleMuonsOffsetChi2 -> SetPoint(fGraphSingleMuonsOffsetChi2->GetN(),1.e4*offset, chi2OverNdf);
252
253   fNTracksAnalyzed++;
254
255   return kTRUE;
256
257 }
258
259 //====================================================================================================================================================
260
261 Bool_t AliMuonForwardTrackAnalysis::AnalyzeMuonPair() {
262
263   if (fNPairsAnalyzedOfEvent>=fNPairsOfEvent) return kFALSE;
264
265   fMFTTrackPairWithBranson    = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithBranson->At(fNPairsAnalyzedOfEvent);
266   fMFTTrackPairWithoutBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithoutBranson->At(fNPairsAnalyzedOfEvent);
267
268   fNPairsAnalyzedOfEvent++;
269
270   Bool_t passedCut = kFALSE;
271   if (fUseBransonForCut) passedCut = PassedCutMuonPair(fMFTTrackPairWithBranson);
272   else passedCut = PassedCutMuonPair(fMFTTrackPairWithoutBranson);
273
274   if (!passedCut) return kTRUE;
275
276   if (fUseBransonForKinematics) fMFTTrackPair = fMFTTrackPairWithBranson;
277   else fMFTTrackPair = fMFTTrackPairWithoutBranson;
278
279   if ( fMFTTrackPair->GetTrack(0)->GetNWrongClustersMC()>fMaxNWrongClustersMC || 
280        fMFTTrackPair->GetTrack(1)->GetNWrongClustersMC()>fMaxNWrongClustersMC ) return kTRUE;
281
282   if (fOption==kResonanceOnly && !fMFTTrackPair->IsResonance()) return kTRUE;
283
284   Int_t ptBin = fPtAxisDimuons->FindBin(fMFTTrackPair->GetPtMC());
285
286   if (1<=ptBin && ptBin<=fNPtDimuBins) {
287     fHistMassMuonPairs[ptBin]           -> Fill(fMFTTrackPair->GetMass(fPrimaryVtxZ));
288     fHistWOffsetMuonPairs[ptBin]        -> Fill(fMFTTrackPair->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
289     fHistMassMuonPairsWithoutMFT[ptBin] -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
290     fHistMassMuonPairsMC[ptBin]         -> Fill(fMFTTrackPair->GetMassMC());
291   }
292   fHistMassMuonPairs[0]           -> Fill(fMFTTrackPair->GetMass(fPrimaryVtxZ));
293   fHistWOffsetMuonPairs[0]        -> Fill(fMFTTrackPair->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
294   fHistMassMuonPairsWithoutMFT[0] -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
295   fHistMassMuonPairsMC[0]         -> Fill(fMFTTrackPair->GetMassMC());
296
297   fHistRapidityPtMuonPairsMC          -> Fill(fMFTTrackPair->GetRapidityMC(), fMFTTrackPair->GetPtMC());
298
299   AliDebug(1, Form("mass = %f   MC = %f", fMFTTrackPair->GetMass(fPrimaryVtxZ), fMFTTrackPair->GetMassMC()));
300
301   return kTRUE;
302
303 }
304
305 //====================================================================================================================================================
306
307 void AliMuonForwardTrackAnalysis::BuildMuonPairs() {
308
309   for (Int_t iTrack=0; iTrack<fMuonForwardTracksWithBranson->GetEntries(); iTrack++) {
310     for (Int_t jTrack=0; jTrack<iTrack; jTrack++) {
311     
312       AliMuonForwardTrack *track0_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(iTrack);
313       AliMuonForwardTrack *track1_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(jTrack);
314
315       AliMuonForwardTrack *track0_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(iTrack);
316       AliMuonForwardTrack *track1_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(jTrack);
317
318       if (fMatchTrigger) if (!track0_WithBranson->GetMatchTrigger() || !track1_WithBranson->GetMatchTrigger()) continue;
319       if (!track0_WithBranson->GetMCTrackRef() || !track1_WithBranson->GetMCTrackRef()) continue;
320
321       AliMuonForwardTrackPair *trackPairWithBranson    = new AliMuonForwardTrackPair(track0_WithBranson, track1_WithBranson);
322       AliMuonForwardTrackPair *trackPairWithoutBranson = new AliMuonForwardTrackPair(track0_WithoutBranson, track1_WithoutBranson);
323       if (fOption==kResonanceOnly && !trackPairWithBranson->IsResonance()) {
324         delete trackPairWithBranson;
325         delete trackPairWithoutBranson;
326         continue;
327       }
328       new ((*fMuonForwardTrackPairsWithBranson)[fMuonForwardTrackPairsWithBranson->GetEntries()]) AliMuonForwardTrackPair(*trackPairWithBranson);
329       new ((*fMuonForwardTrackPairsWithoutBranson)[fMuonForwardTrackPairsWithoutBranson->GetEntries()]) AliMuonForwardTrackPair(*trackPairWithoutBranson);
330     }
331   }
332
333 }
334
335 //====================================================================================================================================================
336
337 Bool_t AliMuonForwardTrackAnalysis::PassedCutSingleMuon(AliMuonForwardTrack *track) {
338
339   AliMUONTrackParam *param = track->GetTrackParamAtMFTCluster(0);
340   AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ);
341
342   if (track->Pt()<fPtMinSingleMuons) return kFALSE;
343   
344   if (fCutOnOffsetChi2) {
345     Double_t offset = 1.e4*track->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
346     Double_t chi2OverNdf = track->GetGlobalChi2() / Double_t(track->GetNMFTClusters()+track->GetNMUONClusters()); 
347     offset /= fScaleOffset;
348     chi2OverNdf /= fScaleChi2;
349     offset -= fCenterOffset;
350     chi2OverNdf -= fCenterChi2;
351     //    printf("cut on offset and chi2: returning %d\n", TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf)>fRadiusCut);
352     if (TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf) > fRadiusCut) return kFALSE;
353   }
354
355   return kTRUE;
356
357 }
358
359 //====================================================================================================================================================
360
361 Bool_t AliMuonForwardTrackAnalysis::PassedCutMuonPair(AliMuonForwardTrackPair *pair) {
362
363   return PassedCutSingleMuon(pair->GetTrack(0)) && PassedCutSingleMuon(pair->GetTrack(1));
364
365 }
366
367 //====================================================================================================================================================
368
369 void AliMuonForwardTrackAnalysis::Terminate(Char_t *outputFileName) {
370
371   TFile *fileOut = new TFile(Form("%s/%s",fOutputDir.Data(),outputFileName), "recreate");
372
373   printf("Writing output objects to file %s\n", fileOut->GetName());
374
375   fHistOffsetSingleMuonsX -> Write();
376   fHistOffsetSingleMuonsY -> Write();
377   fHistOffsetSingleMuons  -> Write();
378   fHistWOffsetSingleMuons -> Write();
379   fHistErrorSingleMuonsX  -> Write();
380   fHistErrorSingleMuonsY  -> Write();
381
382   fHistSingleMuonsPtRapidity -> Write();
383   fHistSingleMuonsOffsetChi2 -> Write();
384
385   fGraphSingleMuonsOffsetChi2 -> Write();
386
387   for (Int_t iPtBin=0; iPtBin<fNPtDimuBins+1; iPtBin++) {
388     fHistWOffsetMuonPairs[iPtBin]        -> Write();
389     fHistMassMuonPairs[iPtBin]           -> Write();
390     fHistMassMuonPairsWithoutMFT[iPtBin] -> Write();
391     fHistMassMuonPairsMC[iPtBin]         -> Write();
392   }
393
394   fHistRapidityPtMuonPairsMC -> Write();
395
396   fileOut -> Close();
397
398 }
399
400 //====================================================================================================================================================
401
402 void AliMuonForwardTrackAnalysis::BookHistos() {
403
404   fHistOffsetSingleMuonsX = new TH1D("fHistOffsetSingleMuonsX", "Offset for single muons along X",  200, -1000, 1000);
405   fHistOffsetSingleMuonsY = new TH1D("fHistOffsetSingleMuonsY", "Offset for single muons along Y",  200, -1000, 1000);
406   fHistErrorSingleMuonsX  = new TH1D("fHistErrorSingleMuonsX",  "Coordinate Error for single muons along X",  200, 0, 1000);
407   fHistErrorSingleMuonsY  = new TH1D("fHistErrorSingleMuonsY",  "Coordinate Error for single muons along Y",  200, 0, 1000);
408   fHistOffsetSingleMuons  = new TH1D("fHistOffsetSingleMuons",  "Offset for single muons",          200, 0, 2000);
409   fHistWOffsetSingleMuons = new TH1D("fHistWOffsetSingleMuons", "Weighted Offset for single muons", 300, 0, 15);  
410
411   fHistSingleMuonsPtRapidity = new TH2D("fHistSingleMuonsPtRapidity", "Phase Space for single muons", 10, -4, -2.5, 10, 0.5, 5.5);
412   fHistSingleMuonsOffsetChi2 = new TH2D("fHistSingleMuonsOffsetChi2", "Offset vs #chi^{2}/ndf for single muons", 400, 0, 4000, 100, 0, 20);
413
414   fHistOffsetSingleMuonsX -> SetXTitle("Offset(X)  [#mum]");
415   fHistOffsetSingleMuonsY -> SetXTitle("Offset(Y)  [#mum]");
416   fHistErrorSingleMuonsX  -> SetXTitle("Err. on track position at z_{vtx} (X)  [#mum]");
417   fHistErrorSingleMuonsY  -> SetXTitle("Err. on track position at z_{vtx} (Y)  [#mum]");
418   fHistOffsetSingleMuons  -> SetXTitle("Offset  [#mum]");
419   fHistWOffsetSingleMuons -> SetXTitle("Weighted Offset");
420
421   fHistSingleMuonsPtRapidity -> SetXTitle("y^{#mu}");
422   fHistSingleMuonsPtRapidity -> SetYTitle("p_{T}^{#mu}  [GeV/c]");
423   fHistSingleMuonsOffsetChi2 -> SetXTitle("Offset  [#mum]");
424   fHistSingleMuonsOffsetChi2 -> SetYTitle("#chi^{2}/ndf");
425
426   fHistOffsetSingleMuonsX -> Sumw2();
427   fHistOffsetSingleMuonsY -> Sumw2();
428   fHistErrorSingleMuonsX  -> Sumw2();
429   fHistErrorSingleMuonsY  -> Sumw2();
430   fHistOffsetSingleMuons  -> Sumw2();
431   fHistWOffsetSingleMuons -> Sumw2();
432
433   fHistSingleMuonsPtRapidity -> Sumw2();
434   fHistSingleMuonsOffsetChi2 -> Sumw2();
435     
436   //--------------------------------------------
437
438   fGraphSingleMuonsOffsetChi2 = new TGraph();
439   fGraphSingleMuonsOffsetChi2 -> SetName("fGraphSingleMuonsOffsetChi2");
440   fGraphSingleMuonsOffsetChi2 -> SetTitle("fGraphSingleMuonsOffsetChi2");
441
442   //--------------------------------------------
443
444   for (Int_t iPtBin=0; iPtBin<=fNPtDimuBins+1; iPtBin++) {
445
446     if (!iPtBin) {
447       fHistWOffsetMuonPairs[iPtBin]        = new TH1D(Form("fHistWOffsetMuonPairs_%d",iPtBin),        
448                                                       "Weighted Offset for Muon Pairs (All p_{T}^{#mu#mu})",
449                                                       300, 0, 60);
450       fHistMassMuonPairs[iPtBin]           = new TH1D(Form("fHistMassMuonPairs_%d",iPtBin),           
451                                                       "Dimuon Mass (MUON+MFT) (All p_{T}^{#mu#mu})",
452                                                       fNMassBins, fMassMin, fMassMax);
453       fHistMassMuonPairsWithoutMFT[iPtBin] = new TH1D(Form("fHistMassMuonPairsWithoutMFT_%d",iPtBin), 
454                                                       "Dimuon Mass (MUON only) (All p_{T}^{#mu#mu})",
455                                                       fNMassBins, fMassMin, fMassMax);
456       fHistMassMuonPairsMC[iPtBin]         = new TH1D(Form("fHistMassMuonPairsMC_%d",iPtBin),         
457                                                       "Dimuon Mass (MC) (All p_{T}^{#mu#mu})",
458                                                       fNMassBins, fMassMin, fMassMax);
459     }
460
461     else {
462       Double_t ptMin = fPtAxisDimuons->GetBinLowEdge(iPtBin);
463       Double_t ptMax = fPtAxisDimuons->GetBinUpEdge(iPtBin);
464       fHistWOffsetMuonPairs[iPtBin]        = new TH1D(Form("fHistWOffsetMuonPairs_%d",iPtBin),        
465                                                       Form("Weighted Offset for Muon Pairs ( %3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax), 
466                                                       300, 0, 60);
467       fHistMassMuonPairs[iPtBin]           = new TH1D(Form("fHistMassMuonPairs_%d",iPtBin),           
468                                                       Form("Dimuon Mass (MUON+MFT) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax), 
469                                                       fNMassBins, fMassMin, fMassMax);
470       fHistMassMuonPairsWithoutMFT[iPtBin] = new TH1D(Form("fHistMassMuonPairsWithoutMFT_%d",iPtBin), 
471                                                       Form("Dimuon Mass (MUON only) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax), 
472                                                       fNMassBins, fMassMin, fMassMax);
473       fHistMassMuonPairsMC[iPtBin]         = new TH1D(Form("fHistMassMuonPairsMC_%d",iPtBin),         
474                                                       Form("Dimuon Mass (MC) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax), 
475                                                       fNMassBins, fMassMin, fMassMax);      
476     }
477     
478     fHistWOffsetMuonPairs[iPtBin]        -> SetXTitle("Weighted Offset");
479     fHistMassMuonPairs[iPtBin]           -> SetXTitle("Mass  [GeV/c^{2}]");
480     fHistMassMuonPairsWithoutMFT[iPtBin] -> SetXTitle("Mass  [GeV/c^{2}]");
481     fHistMassMuonPairsMC[iPtBin]         -> SetXTitle("Mass  [GeV/c^{2}]");    
482
483     fHistWOffsetMuonPairs[iPtBin]        -> Sumw2();
484     fHistMassMuonPairs[iPtBin]           -> Sumw2();
485     fHistMassMuonPairsWithoutMFT[iPtBin] -> Sumw2();
486     fHistMassMuonPairsMC[iPtBin]         -> Sumw2();    
487
488   }
489   
490   fHistRapidityPtMuonPairsMC   = new TH2D("fHistRapidityPtMuonPairsMC", "Dimuon Phase Space (MC)", 100, -4.5, -2., 100, 0., 10.); 
491   fHistRapidityPtMuonPairsMC   -> SetXTitle("Rapidity");
492   fHistRapidityPtMuonPairsMC   -> SetYTitle("p_{T}  [GeV/c]");
493   fHistRapidityPtMuonPairsMC   -> Sumw2();
494
495 }
496
497 //====================================================================================================================================================
498