1 //====================================================================================================================================================
3 // Class for the analysis of the ALICE muon forward tracks (MUON + MFT)
5 // Contact author: antonio.uras@cern.ch
7 //====================================================================================================================================================
10 #include "TClonesArray.h"
11 #include "AliMuonForwardTrack.h"
12 #include "AliMuonForwardTrackPair.h"
18 #include "TParticle.h"
19 #include "AliMUONTrackParam.h"
20 #include "AliMUONTrackExtrap.h"
21 #include "TGeoManager.h"
23 #include "TLorentzVector.h"
24 #include "TDatabasePDG.h"
26 #include "AliMuonForwardTrackAnalysis.h"
28 ClassImp(AliMuonForwardTrackAnalysis)
30 //====================================================================================================================================================
32 AliMuonForwardTrackAnalysis::AliMuonForwardTrackAnalysis():
36 fInputTreeWithBranson(0x0),
37 fInputTreeWithoutBranson(0x0),
38 fMuonForwardTracksWithBranson(0),
39 fMuonForwardTrackPairsWithBranson(0),
40 fMuonForwardTracksWithoutBranson(0),
41 fMuonForwardTrackPairsWithoutBranson(0),
42 fMFTTrackWithBranson(0),
43 fMFTTrackWithoutBranson(0),
45 fMFTTrackPairWithBranson(0),
46 fMFTTrackPairWithoutBranson(0),
53 fNTracksAnalyzedOfEvent(0),
56 fNPairsAnalyzedOfEvent(0),
57 fNTracksAnalyzedOfEventAfterCut(0),
58 fNPairsAnalyzedOfEventAfterCut(0),
59 fHistOffsetSingleMuonsX(0x0),
60 fHistOffsetSingleMuonsY(0x0),
61 fHistOffsetSingleMuons(0x0),
62 fHistWOffsetSingleMuons(0x0),
63 fHistErrorSingleMuonsX(0x0),
64 fHistErrorSingleMuonsY(0x0),
65 fHistZOriginSingleMuonsMC(0x0),
66 fHistZROriginSingleMuonsMC(0x0),
67 fHistSingleMuonsPtRapidityMC(0x0),
68 fHistSingleMuonsOffsetChi2(0x0),
69 fHistRapidityPtMuonPairs(0x0),
70 fHistMassMuonPairsVsPt(0),
71 fHistMassMuonPairsWithoutMFTVsPt(0),
72 fHistMassMuonPairsVsPtLSp(0),
73 fHistMassMuonPairsWithoutMFTVsPtLSp(0),
74 fHistMassMuonPairsVsPtLSm(0),
75 fHistMassMuonPairsWithoutMFTVsPtLSm(0),
76 fEvalDimuonVtxResolution(kFALSE),
84 fSingleMuonAnalysis(1),
94 fMaxNWrongClustersMC(999),
96 fUseBransonForCut(kFALSE),
97 fUseBransonForKinematics(kFALSE),
98 fCutOnOffsetChi2(kFALSE),
106 // default constructor
108 for (Int_t iPtBin=0; iPtBin<fNMaxPtBinsDimuons+1; iPtBin++) {
109 fHistMassMuonPairs[iPtBin] = NULL;
110 fHistMassMuonPairsWithoutMFT[iPtBin] = NULL;
111 fHistMassMuonPairsMC[iPtBin] = NULL;
112 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] = NULL;
113 fHistWOffsetMuonPairsAtPCA[iPtBin] = NULL;
114 fHistDistancePrimaryVtxPCA[iPtBin] = NULL;
115 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] = NULL;
116 fHistDimuonVtxResolutionX[iPtBin] = NULL;
117 fHistDimuonVtxResolutionY[iPtBin] = NULL;
118 fHistDimuonVtxResolutionZ[iPtBin] = NULL;
123 //====================================================================================================================================================
125 Bool_t AliMuonForwardTrackAnalysis::Init(Char_t *inputFileName) {
127 fPtAxisDimuons = new TAxis(fNPtDimuBins, fPtDimuMin, fPtDimuMax);
131 TFile *inputFile = new TFile(Form("%s/%s",fInputDir.Data(),inputFileName));
132 if (!inputFile || !inputFile->IsOpen()) {
133 AliError(Form("Error opening file %s", inputFileName));
136 fInputTreeWithBranson = (TTree*) inputFile->Get("AliMuonForwardTracksWithBranson");
137 if (!fInputTreeWithBranson) {
138 AliError("Error reading input tree");
141 fInputTreeWithoutBranson = (TTree*) inputFile->Get("AliMuonForwardTracksWithoutBranson");
142 if (!fInputTreeWithoutBranson) {
143 AliError("Error reading input tree");
147 if (fFirstEvent<0 || fLastEvent<0 || fFirstEvent>fLastEvent || fFirstEvent>=fInputTreeWithBranson->GetEntriesFast()) {
149 fLastEvent = fInputTreeWithBranson->GetEntriesFast()-1;
152 fLastEvent = TMath::Min(fLastEvent, Int_t(fInputTreeWithBranson->GetEntriesFast()-1));
155 AliInfo(Form("Analysing events %d to %d", fFirstEvent, fLastEvent));
157 fMuonForwardTracksWithBranson = new TClonesArray("AliMuonForwardTrack",30);
158 fInputTreeWithBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithBranson);
160 fMuonForwardTracksWithoutBranson = new TClonesArray("AliMuonForwardTrack",30);
161 fInputTreeWithoutBranson->SetBranchAddress("tracks", &fMuonForwardTracksWithoutBranson);
163 TGeoManager::Import(Form("%s/geometry.root",fInputDir.Data()));
165 AliMUONTrackExtrap::SetField();
167 fMuonForwardTrackPairsWithBranson = new TClonesArray("AliMuonForwardTrackPair",10);
168 fMuonForwardTrackPairsWithoutBranson = new TClonesArray("AliMuonForwardTrackPair",10);
169 fMuonForwardTrackPairsWithBranson->SetOwner(kTRUE);
170 fMuonForwardTrackPairsWithoutBranson->SetOwner(kTRUE);
177 //====================================================================================================================================================
179 Bool_t AliMuonForwardTrackAnalysis::LoadNextEvent() {
181 if (fEv>fLastEvent) return kFALSE;
182 if (fEv<fFirstEvent) { fEv++; return kTRUE; }
183 fMuonForwardTracksWithBranson -> Clear("");
184 fMuonForwardTracksWithoutBranson -> Clear("");
185 fInputTreeWithBranson->GetEvent(fEv);
186 fInputTreeWithoutBranson->GetEvent(fEv);
187 AliDebug(2,Form("**** analyzing event # %4d (%3d tracks) ****", fEv, fMuonForwardTracksWithBranson->GetEntriesFast()));
189 fPrimaryVtxX = gRandom->Gaus(0., fXVertResMC);
190 fPrimaryVtxY = gRandom->Gaus(0., fYVertResMC);
191 fPrimaryVtxZ = gRandom->Gaus(0., fZVertResMC);
193 if (fSingleMuonAnalysis) {
194 fNTracksAnalyzedOfEvent = 0;
195 fNTracksAnalyzedOfEventAfterCut = 0;
196 fNTracksOfEvent = fMuonForwardTracksWithBranson->GetEntriesFast();
197 while (AnalyzeSingleMuon()) continue;
200 if (fMuonPairAnalysis) {
201 if (fMuonForwardTrackPairsWithBranson) {
202 fMuonForwardTrackPairsWithBranson->Clear("C");
203 fMuonForwardTrackPairsWithoutBranson->Clear("C");
206 fNPairsAnalyzedOfEvent = 0;
207 fNPairsAnalyzedOfEventAfterCut = 0;
208 // fNPairsOfEvent = fMuonForwardTrackPairsWithBranson->GetEntriesFast();
209 while (AnalyzeMuonPair()) continue;
212 AliDebug(2,Form("**** analyzed event # %4d (%3d tracks and %3d pairs analyzed) ****", fEv, fNTracksAnalyzedOfEventAfterCut, fNPairsAnalyzedOfEventAfterCut));
220 //====================================================================================================================================================
222 Bool_t AliMuonForwardTrackAnalysis::AnalyzeSingleMuon() {
224 if (fNTracksAnalyzedOfEvent>=fNTracksOfEvent) return kFALSE;
226 fMFTTrackWithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(fNTracksAnalyzedOfEvent);
227 fMFTTrackWithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(fNTracksAnalyzedOfEvent);
229 fNTracksAnalyzedOfEvent++;
231 Bool_t passedCut = kFALSE;
232 if (fUseBransonForCut) passedCut = PassedCutSingleMuon(fMFTTrackWithBranson);
233 else passedCut = PassedCutSingleMuon(fMFTTrackWithoutBranson);
234 if (!passedCut) return kTRUE;
236 if (fUseBransonForKinematics) fMFTTrack = fMFTTrackWithBranson;
237 else fMFTTrack = fMFTTrackWithoutBranson;
238 if (fMatchTrigger && !fMFTTrack->GetMatchTrigger()) return kTRUE;
239 fMCRefTrack = fMFTTrack->GetMCTrackRef();
241 if (fOption!=kPionsKaons && !fMCRefTrack) return kTRUE;
242 if (fOption!=kPionsKaons && fMFTTrack->GetNWrongClustersMC()>fMaxNWrongClustersMC) return kTRUE;
245 fHistZOriginSingleMuonsMC -> Fill(-1.*fMCRefTrack->Vz());
246 fHistZROriginSingleMuonsMC -> Fill(-1.*fMCRefTrack->Vz(), TMath::Sqrt(fMCRefTrack->Vx()*fMCRefTrack->Vx()+fMCRefTrack->Vy()*fMCRefTrack->Vy()));
249 AliMUONTrackParam *param = fMFTTrack->GetTrackParamAtMFTCluster(0);
250 AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ);
253 Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
254 Double_t energy = TMath::Sqrt(param->P()*param->P() + mMu*mMu);
255 pMu.SetPxPyPzE(param->Px(), param->Py(), param->Pz(), energy);
258 cov = param->GetCovariances();
260 fHistErrorSingleMuonsX -> Fill(1.e4*TMath::Sqrt(cov(0,0)));
261 fHistErrorSingleMuonsY -> Fill(1.e4*TMath::Sqrt(cov(2,2)));
263 Double_t dX = fMFTTrack->GetOffsetX(fPrimaryVtxX, fPrimaryVtxZ);
264 Double_t dY = fMFTTrack->GetOffsetY(fPrimaryVtxY, fPrimaryVtxZ);
266 Double_t offset = fMFTTrack->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
267 Double_t weightedOffset = fMFTTrack->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
269 // AliDebug(2, Form("pdg code = %d\n", fMCRefTrack->GetPdgCode()));
271 fHistOffsetSingleMuonsX -> Fill(1.e4*dX);
272 fHistOffsetSingleMuonsY -> Fill(1.e4*dY);
274 if (fOption!=kPionsKaons) fHistSingleMuonsPtRapidityMC-> Fill(fMCRefTrack->Y(), fMCRefTrack->Pt());
275 fHistOffsetSingleMuons -> Fill(1.e4*offset);
276 fHistWOffsetSingleMuons -> Fill(weightedOffset);
277 Double_t chi2OverNdf = fMFTTrack->GetGlobalChi2()/Double_t(fMFTTrack->GetNMFTClusters()+fMFTTrack->GetNMUONClusters());
278 fHistSingleMuonsOffsetChi2 -> Fill(1.e4*offset, chi2OverNdf);
281 fNTracksAnalyzedOfEventAfterCut++;
287 //====================================================================================================================================================
289 Bool_t AliMuonForwardTrackAnalysis::AnalyzeMuonPair() {
291 if (fNPairsAnalyzedOfEvent>=fNPairsOfEvent) return kFALSE;
293 fMFTTrackPairWithBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithBranson->At(fNPairsAnalyzedOfEvent);
294 fMFTTrackPairWithoutBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithoutBranson->At(fNPairsAnalyzedOfEvent);
296 fNPairsAnalyzedOfEvent++;
298 Bool_t passedCut = kFALSE;
299 if (fUseBransonForCut) passedCut = PassedCutMuonPair(fMFTTrackPairWithBranson);
300 else passedCut = PassedCutMuonPair(fMFTTrackPairWithoutBranson);
302 if (!passedCut) return kTRUE;
304 if (fUseBransonForKinematics) fMFTTrackPair = fMFTTrackPairWithBranson;
305 else fMFTTrackPair = fMFTTrackPairWithoutBranson;
307 if ( fMFTTrackPair->GetTrack(0)->GetNWrongClustersMC()>fMaxNWrongClustersMC ||
308 fMFTTrackPair->GetTrack(1)->GetNWrongClustersMC()>fMaxNWrongClustersMC ) return kTRUE;
310 if (fOption==kResonanceOnly && !fMFTTrackPair->IsResonance()) return kTRUE;
312 if (fOption==kResonanceOnly && fMFTTrackPair->GetCharge() != 0) return kTRUE;
314 Double_t pca[3] = {0};
315 fMFTTrackPair -> GetPointOfClosestApproach(pca);
316 Double_t distancePrimaryVtxPCA = TMath::Sqrt(TMath::Power(fPrimaryVtxX-pca[0],2)+
317 TMath::Power(fPrimaryVtxY-pca[1],2)+
318 TMath::Power(fPrimaryVtxZ-pca[2],2));
320 fMFTTrackPair -> SetKinem(fPrimaryVtxZ);
322 Int_t ptBin = fPtAxisDimuons->FindBin(fMFTTrackPair->GetPt());
324 if (1<=ptBin && ptBin<=fNPtDimuBins) {
325 fHistMassMuonPairs[ptBin] -> Fill(fMFTTrackPair->GetMass());
326 fHistMassMuonPairsWithoutMFT[ptBin] -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
327 if (fOption!=kPionsKaons) fHistMassMuonPairsMC[ptBin] -> Fill(fMFTTrackPair->GetMassMC());
328 fHistWOffsetMuonPairsAtPrimaryVtx[ptBin] -> Fill(fMFTTrackPair->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
329 fHistWOffsetMuonPairsAtPCA[ptBin] -> Fill(fMFTTrackPair->GetWeightedOffset(pca[0], pca[1], pca[2]));
330 fHistDistancePrimaryVtxPCA[ptBin] -> Fill(distancePrimaryVtxPCA*1.e4);
331 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[ptBin] -> Fill(fMFTTrackPair->GetWeightedOffset(pca[0], pca[1], pca[2]), distancePrimaryVtxPCA*1.e4);
332 if (fEvalDimuonVtxResolution) {
333 fHistDimuonVtxResolutionX[ptBin]->Fill(pca[0]*1.e4);
334 fHistDimuonVtxResolutionY[ptBin]->Fill(pca[1]*1.e4);
335 fHistDimuonVtxResolutionZ[ptBin]->Fill(pca[2]*1.e4);
338 fHistMassMuonPairs[0] -> Fill(fMFTTrackPair->GetMass());
339 fHistMassMuonPairsWithoutMFT[0] -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
340 if (fOption!=kPionsKaons) fHistMassMuonPairsMC[0] -> Fill(fMFTTrackPair->GetMassMC());
341 fHistWOffsetMuonPairsAtPrimaryVtx[0] -> Fill(fMFTTrackPair->GetWeightedOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ));
342 fHistWOffsetMuonPairsAtPCA[0] -> Fill(fMFTTrackPair->GetWeightedOffset(pca[0], pca[1], pca[2]));
343 fHistDistancePrimaryVtxPCA[0] -> Fill(distancePrimaryVtxPCA*1.e4);
344 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[0] -> Fill(fMFTTrackPair->GetWeightedOffset(pca[0], pca[1], pca[2]), distancePrimaryVtxPCA*1.e4);
345 if (fEvalDimuonVtxResolution) {
346 fHistDimuonVtxResolutionX[0]->Fill(pca[0]*1.e4);
347 fHistDimuonVtxResolutionY[0]->Fill(pca[1]*1.e4);
348 fHistDimuonVtxResolutionZ[0]->Fill(pca[2]*1.e4);
351 if (fMFTTrackPair->GetCharge() == 0) {
352 fHistMassMuonPairsVsPt -> Fill(fMFTTrackPair->GetMass(), fMFTTrackPair->GetPt());
353 fHistMassMuonPairsWithoutMFTVsPt -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ), fMFTTrackPair->GetPt());
355 else if (fMFTTrackPair->GetCharge() == -2) {
356 fHistMassMuonPairsVsPtLSm -> Fill(fMFTTrackPair->GetMass(), fMFTTrackPair->GetPt());
357 fHistMassMuonPairsWithoutMFTVsPtLSm -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ), fMFTTrackPair->GetPt());
359 else if (fMFTTrackPair->GetCharge() == 2) {
360 fHistMassMuonPairsVsPtLSp -> Fill(fMFTTrackPair->GetMass(), fMFTTrackPair->GetPt());
361 fHistMassMuonPairsWithoutMFTVsPtLSp -> Fill(fMFTTrackPair->GetMassWithoutMFT(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ), fMFTTrackPair->GetPt());
364 if (fOption!=kPionsKaons) fHistRapidityPtMuonPairs -> Fill(fMFTTrackPair->GetRapidityMC(), fMFTTrackPair->GetPt());
365 else fHistRapidityPtMuonPairs -> Fill(fMFTTrackPair->GetRapidity(), fMFTTrackPair->GetPt());
367 AliDebug(1, Form("mass = %f MC = %f", fMFTTrackPair->GetMass(), fMFTTrackPair->GetMassMC()));
369 fNPairsAnalyzedOfEventAfterCut++;
375 //====================================================================================================================================================
377 void AliMuonForwardTrackAnalysis::BuildMuonPairs() {
379 Int_t nMuonPairs = 0;
381 for (Int_t iTrack=0; iTrack<fMuonForwardTracksWithBranson->GetEntriesFast(); iTrack++) {
382 for (Int_t jTrack=0; jTrack<iTrack; jTrack++) {
384 AliMuonForwardTrack *track0_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(iTrack);
385 AliMuonForwardTrack *track1_WithBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithBranson->At(jTrack);
387 AliMuonForwardTrack *track0_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(iTrack);
388 AliMuonForwardTrack *track1_WithoutBranson = (AliMuonForwardTrack*) fMuonForwardTracksWithoutBranson->At(jTrack);
390 if (fMatchTrigger) if (!track0_WithBranson->GetMatchTrigger() || !track1_WithBranson->GetMatchTrigger()) continue;
391 if (fOption!=kPionsKaons && (!track0_WithBranson->GetMCTrackRef() || !track1_WithBranson->GetMCTrackRef())) continue;
393 new ((*fMuonForwardTrackPairsWithBranson)[nMuonPairs]) AliMuonForwardTrackPair(track0_WithBranson, track1_WithBranson);
394 new ((*fMuonForwardTrackPairsWithoutBranson)[nMuonPairs]) AliMuonForwardTrackPair(track0_WithoutBranson, track1_WithoutBranson);
396 AliMuonForwardTrackPair *trackPairWithBranson = (AliMuonForwardTrackPair*) fMuonForwardTrackPairsWithBranson->At(nMuonPairs);
397 if (!(fOption==kResonanceOnly && !trackPairWithBranson->IsResonance())) nMuonPairs++;
404 //====================================================================================================================================================
406 Bool_t AliMuonForwardTrackAnalysis::PassedCutSingleMuon(AliMuonForwardTrack *track) {
408 AliMUONTrackParam *param = track->GetTrackParamAtMFTCluster(0);
409 AliMUONTrackExtrap::ExtrapToZCov(param, fPrimaryVtxZ);
411 if (track->Pt()<fPtMinSingleMuons) return kFALSE;
413 if (fCutOnOffsetChi2) {
414 Double_t offset = 1.e4*track->GetOffset(fPrimaryVtxX, fPrimaryVtxY, fPrimaryVtxZ);
415 Double_t chi2OverNdf = track->GetGlobalChi2() / Double_t(track->GetNMFTClusters()+track->GetNMUONClusters());
416 offset /= fScaleOffset;
417 chi2OverNdf /= fScaleChi2;
418 offset -= fCenterOffset;
419 chi2OverNdf -= fCenterChi2;
420 // printf("cut on offset and chi2: returning %d\n", TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf)>fRadiusCut);
421 if (TMath::Sqrt(offset*offset + chi2OverNdf*chi2OverNdf) > fRadiusCut) return kFALSE;
428 //====================================================================================================================================================
430 Bool_t AliMuonForwardTrackAnalysis::PassedCutMuonPair(AliMuonForwardTrackPair *pair) {
432 return PassedCutSingleMuon(pair->GetTrack(0)) && PassedCutSingleMuon(pair->GetTrack(1));
436 //====================================================================================================================================================
438 void AliMuonForwardTrackAnalysis::Terminate(Char_t *outputFileName) {
440 TFile *fileOut = new TFile(Form("%s/%s",fOutputDir.Data(),outputFileName), "recreate");
442 printf("Writing output objects to file %s\n", fileOut->GetName());
444 fHistOffsetSingleMuonsX -> Write();
445 fHistOffsetSingleMuonsY -> Write();
446 fHistOffsetSingleMuons -> Write();
447 fHistWOffsetSingleMuons -> Write();
448 fHistErrorSingleMuonsX -> Write();
449 fHistErrorSingleMuonsY -> Write();
451 fHistSingleMuonsPtRapidityMC -> Write();
452 fHistSingleMuonsOffsetChi2 -> Write();
454 fHistZOriginSingleMuonsMC -> Write();
455 fHistZROriginSingleMuonsMC -> Write();
457 for (Int_t iPtBin=0; iPtBin<fNPtDimuBins+1; iPtBin++) {
458 fHistMassMuonPairs[iPtBin] -> Write();
459 fHistMassMuonPairsWithoutMFT[iPtBin] -> Write();
460 fHistMassMuonPairsMC[iPtBin] -> Write();
461 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] -> Write();
462 fHistWOffsetMuonPairsAtPCA[iPtBin] -> Write();
463 fHistDistancePrimaryVtxPCA[iPtBin] -> Write();
464 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] -> Write();
465 if (fEvalDimuonVtxResolution) {
466 fHistDimuonVtxResolutionX[iPtBin] -> Write();
467 fHistDimuonVtxResolutionY[iPtBin] -> Write();
468 fHistDimuonVtxResolutionZ[iPtBin] -> Write();
472 fHistMassMuonPairsVsPt -> Write();
473 fHistMassMuonPairsWithoutMFTVsPt -> Write();
474 fHistMassMuonPairsVsPtLSp -> Write();
475 fHistMassMuonPairsWithoutMFTVsPtLSp -> Write();
476 fHistMassMuonPairsVsPtLSm -> Write();
477 fHistMassMuonPairsWithoutMFTVsPtLSm -> Write();
479 fHistRapidityPtMuonPairs -> Write();
485 //====================================================================================================================================================
487 void AliMuonForwardTrackAnalysis::BookHistos() {
489 fHistOffsetSingleMuonsX = new TH1D("fHistOffsetSingleMuonsX", "Offset for single muons along X", 200, -1000, 1000);
490 fHistOffsetSingleMuonsY = new TH1D("fHistOffsetSingleMuonsY", "Offset for single muons along Y", 200, -1000, 1000);
491 fHistErrorSingleMuonsX = new TH1D("fHistErrorSingleMuonsX", "Coordinate Error for single muons along X", 200, 0, 1000);
492 fHistErrorSingleMuonsY = new TH1D("fHistErrorSingleMuonsY", "Coordinate Error for single muons along Y", 200, 0, 1000);
493 fHistOffsetSingleMuons = new TH1D("fHistOffsetSingleMuons", "Offset for single muons", 200, 0, 2000);
494 fHistWOffsetSingleMuons = new TH1D("fHistWOffsetSingleMuons", "Weighted Offset for single muons", 300, 0, 15);
496 fHistSingleMuonsPtRapidityMC = new TH2D("fHistSingleMuonsPtRapidityMC", "Phase Space for single muons", 100, -4.5, -2., 100, 0., 10.);
497 fHistSingleMuonsOffsetChi2 = new TH2D("fHistSingleMuonsOffsetChi2", "Offset vs #chi^{2}/ndf for single muons", 400, 0, 4000, 200, 0, 10);
498 fHistZOriginSingleMuonsMC = new TH1D("fHistZOriginSingleMuonsMC", "Z origin for single muons (from MC)", 1000, 0., 500.);
499 fHistZROriginSingleMuonsMC = new TH2D("fHistZROriginSingleMuonsMC", "Z-R origin for single muons (from MC)", 1000, 0., 500., 1000, 0., 100.);
501 fHistOffsetSingleMuonsX -> SetXTitle("Offset(X) [#mum]");
502 fHistOffsetSingleMuonsY -> SetXTitle("Offset(Y) [#mum]");
503 fHistErrorSingleMuonsX -> SetXTitle("Err. on track position at z_{vtx} (X) [#mum]");
504 fHistErrorSingleMuonsY -> SetXTitle("Err. on track position at z_{vtx} (Y) [#mum]");
505 fHistOffsetSingleMuons -> SetXTitle("Offset [#mum]");
506 fHistWOffsetSingleMuons -> SetXTitle("Weighted Offset");
508 fHistSingleMuonsPtRapidityMC -> SetXTitle("y^{#mu}");
509 fHistSingleMuonsPtRapidityMC -> SetYTitle("p_{T}^{#mu} [GeV/c]");
510 fHistSingleMuonsOffsetChi2 -> SetXTitle("Offset [#mum]");
511 fHistSingleMuonsOffsetChi2 -> SetYTitle("#chi^{2}/ndf");
513 fHistZOriginSingleMuonsMC -> SetXTitle("Z [cm]");
514 fHistZROriginSingleMuonsMC -> SetXTitle("Z [cm]");
515 fHistZROriginSingleMuonsMC -> SetXTitle("R [cm]");
517 fHistOffsetSingleMuonsX -> Sumw2();
518 fHistOffsetSingleMuonsY -> Sumw2();
519 fHistErrorSingleMuonsX -> Sumw2();
520 fHistErrorSingleMuonsY -> Sumw2();
521 fHistOffsetSingleMuons -> Sumw2();
522 fHistWOffsetSingleMuons -> Sumw2();
524 fHistZOriginSingleMuonsMC -> Sumw2();
525 fHistZROriginSingleMuonsMC -> Sumw2();
527 fHistSingleMuonsPtRapidityMC -> Sumw2();
528 fHistSingleMuonsOffsetChi2 -> Sumw2();
530 //--------------------------------------------
532 for (Int_t iPtBin=0; iPtBin<=fNPtDimuBins+1; iPtBin++) {
535 fHistMassMuonPairs[iPtBin] = new TH1D(Form("fHistMassMuonPairs_%d",iPtBin),
536 "Dimuon Mass (MUON+MFT) (All p_{T}^{#mu#mu})",
537 fNMassBins, fMassMin, fMassMax);
538 fHistMassMuonPairsWithoutMFT[iPtBin] = new TH1D(Form("fHistMassMuonPairsWithoutMFT_%d",iPtBin),
539 "Dimuon Mass (MUON only) (All p_{T}^{#mu#mu})",
540 fNMassBins, fMassMin, fMassMax);
541 fHistMassMuonPairsMC[iPtBin] = new TH1D(Form("fHistMassMuonPairsMC_%d",iPtBin),
542 "Dimuon Mass (MC) (All p_{T}^{#mu#mu})",
543 fNMassBins, fMassMin, fMassMax);
544 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] = new TH1D(Form("fHistWOffsetMuonPairsAtPrimaryVtx_%d",iPtBin),
545 "Weighted Offset for Muon Pairs at Primary Vertex (All p_{T}^{#mu#mu})",
547 fHistWOffsetMuonPairsAtPCA[iPtBin] = new TH1D(Form("fHistWOffsetMuonPairsAtPCA_%d",iPtBin),
548 "Weighted Offset for Muon Pairs at PCA (All p_{T}^{#mu#mu})",
550 fHistDistancePrimaryVtxPCA[iPtBin] = new TH1D(Form("fHistDistancePrimaryVtxPCA_%d",iPtBin),
551 "Distance between PCA and primary vertex (All p_{T}^{#mu#mu})",
553 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] = new TH2D(Form("fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA_%d",iPtBin),
554 "DistancePrimaryVtxPCA vs WOffsetMuonPairsAtPCA (All p_{T}^{#mu#mu})",
555 300, 0, 60, 1000, 0, 50000);
556 if (fEvalDimuonVtxResolution) {
557 fHistDimuonVtxResolutionX[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionX_%d",iPtBin),
558 "Dimuon Vtx offset along X (All p_{T}^{#mu#mu})",
560 fHistDimuonVtxResolutionY[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionY_%d",iPtBin),
561 "Dimuon Vtx offset along Y (All p_{T}^{#mu#mu})",
563 fHistDimuonVtxResolutionZ[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionZ_%d",iPtBin),
564 "Dimuon Vtx offset along Z (All p_{T}^{#mu#mu})",
565 2000, -10000, 10000);
570 Double_t ptMin = fPtAxisDimuons->GetBinLowEdge(iPtBin);
571 Double_t ptMax = fPtAxisDimuons->GetBinUpEdge(iPtBin);
572 fHistMassMuonPairs[iPtBin] = new TH1D(Form("fHistMassMuonPairs_%d",iPtBin),
573 Form("Dimuon Mass (MUON+MFT) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
574 fNMassBins, fMassMin, fMassMax);
575 fHistMassMuonPairsWithoutMFT[iPtBin] = new TH1D(Form("fHistMassMuonPairsWithoutMFT_%d",iPtBin),
576 Form("Dimuon Mass (MUON only) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
577 fNMassBins, fMassMin, fMassMax);
578 fHistMassMuonPairsMC[iPtBin] = new TH1D(Form("fHistMassMuonPairsMC_%d",iPtBin),
579 Form("Dimuon Mass (MC) (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
580 fNMassBins, fMassMin, fMassMax);
581 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] = new TH1D(Form("fHistWOffsetMuonPairsAtPrimaryVtx_%d",iPtBin),
582 Form("Weighted Offset for Muon Pairs at Primary Vertex (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",
583 ptMin,ptMax), 300, 0, 60);
584 fHistWOffsetMuonPairsAtPCA[iPtBin] = new TH1D(Form("fHistWOffsetMuonPairsAtPCA_%d",iPtBin),
585 Form("Weighted Offset for Muon Pairs at PCA (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",
586 ptMin,ptMax), 300, 0, 60);
587 fHistDistancePrimaryVtxPCA[iPtBin] = new TH1D(Form("fHistDistancePrimaryVtxPCA_%d",iPtBin),
588 Form("Distance between PCA and primary vertex (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",
589 ptMin,ptMax), 1000, 0, 50000);
590 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] = new TH2D(Form("fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA_%d",iPtBin),
591 Form("DistancePrimaryVtxPCA vs WOffsetMuonPairsAtPCA (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",
592 ptMin,ptMax), 300, 0, 60, 1000, 0, 50000);
593 if (fEvalDimuonVtxResolution) {
594 fHistDimuonVtxResolutionX[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionX_%d",iPtBin),
595 Form("Dimuon Vtx offset along X (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
597 fHistDimuonVtxResolutionY[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionY_%d",iPtBin),
598 Form("Dimuon Vtx offset along Y (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
600 fHistDimuonVtxResolutionZ[iPtBin] = new TH1D(Form("fHistDimuonVtxResolutionZ_%d",iPtBin),
601 Form("Dimuon Vtx offset along Z (%3.1f < p_{T}^{#mu#mu} < %3.1f GeV/c)",ptMin,ptMax),
602 2000, -10000, 10000);
606 fHistMassMuonPairs[iPtBin] -> SetXTitle("Mass [GeV/c^{2}]");
607 fHistMassMuonPairsWithoutMFT[iPtBin] -> SetXTitle("Mass [GeV/c^{2}]");
608 fHistMassMuonPairsMC[iPtBin] -> SetXTitle("Mass [GeV/c^{2}]");
609 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] -> SetXTitle("Weighted Offset at Primary Vtx");
610 fHistWOffsetMuonPairsAtPCA[iPtBin] -> SetXTitle("Weighted Offset at PCA");
611 fHistDistancePrimaryVtxPCA[iPtBin] -> SetXTitle("PCA - Primary Vtx [#mum]");
612 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] -> SetXTitle("Weighted Offset at PCA");
613 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] -> SetYTitle("PCA - Primary Vtx [#mum]");
614 if (fEvalDimuonVtxResolution) {
615 fHistDimuonVtxResolutionX[iPtBin] -> SetXTitle("Offset [#mum]");
616 fHistDimuonVtxResolutionY[iPtBin] -> SetXTitle("Offset [#mum]");
617 fHistDimuonVtxResolutionZ[iPtBin] -> SetXTitle("Offset [#mum]");
620 fHistMassMuonPairs[iPtBin] -> Sumw2();
621 fHistMassMuonPairsWithoutMFT[iPtBin] -> Sumw2();
622 fHistMassMuonPairsMC[iPtBin] -> Sumw2();
623 fHistWOffsetMuonPairsAtPrimaryVtx[iPtBin] -> Sumw2();
624 fHistWOffsetMuonPairsAtPCA[iPtBin] -> Sumw2();
625 fHistDistancePrimaryVtxPCA[iPtBin] -> Sumw2();
626 fHistDistancePrimaryVtxPCAvsWOffsetMuonPairsAtPCA[iPtBin] -> Sumw2();
627 if (fEvalDimuonVtxResolution) {
628 fHistDimuonVtxResolutionX[iPtBin] -> Sumw2();
629 fHistDimuonVtxResolutionY[iPtBin] -> Sumw2();
630 fHistDimuonVtxResolutionZ[iPtBin] -> Sumw2();
635 fHistMassMuonPairsVsPt = new TH2D("fHistMassMuonPairsVsPt", "Dimuon Mass (MUON+MFT) vs p_{T}", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
636 fHistMassMuonPairsWithoutMFTVsPt = new TH2D("fHistMassMuonPairsWithoutMFTVsPt", "Dimuon Mass (MUON only) vs p_{T}", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
637 fHistMassMuonPairsVsPtLSp = new TH2D("fHistMassMuonPairsVsPtLSp", "Dimuon Mass (MUON+MFT) vs p_{T} Like sign ++", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
638 fHistMassMuonPairsWithoutMFTVsPtLSp = new TH2D("fHistMassMuonPairsWithoutMFTVsPtLSp", "Dimuon Mass (MUON only) vs p_{T} Like sign ++", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
639 fHistMassMuonPairsVsPtLSm = new TH2D("fHistMassMuonPairsVsPtLSm", "Dimuon Mass (MUON+MFT) vs p_{T} Like sign --", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
640 fHistMassMuonPairsWithoutMFTVsPtLSm = new TH2D("fHistMassMuonPairsWithoutMFTVsPtLSm", "Dimuon Mass (MUON only) vs p_{T} Like sign --", fNMassBins, fMassMin, fMassMax, 20, 0., 10.);
642 fHistMassMuonPairsVsPt -> SetXTitle("Mass [GeV/c^{2}]");
643 fHistMassMuonPairsWithoutMFTVsPt -> SetXTitle("Mass [GeV/c^{2}]");
644 fHistMassMuonPairsVsPt -> SetYTitle("p_{T} [GeV/c]");
645 fHistMassMuonPairsWithoutMFTVsPt -> SetYTitle("p_{T} [GeV/c]");
646 fHistMassMuonPairsVsPt -> Sumw2();
647 fHistMassMuonPairsWithoutMFTVsPt -> Sumw2();
648 fHistMassMuonPairsVsPtLSp -> SetXTitle("Mass [GeV/c^{2}]");
649 fHistMassMuonPairsWithoutMFTVsPtLSp -> SetXTitle("Mass [GeV/c^{2}]");
650 fHistMassMuonPairsVsPtLSp -> SetYTitle("p_{T} [GeV/c]");
651 fHistMassMuonPairsWithoutMFTVsPtLSp -> SetYTitle("p_{T} [GeV/c]");
652 fHistMassMuonPairsVsPtLSp -> Sumw2();
653 fHistMassMuonPairsWithoutMFTVsPtLSp -> Sumw2();
654 fHistMassMuonPairsVsPtLSm -> SetXTitle("Mass [GeV/c^{2}]");
655 fHistMassMuonPairsWithoutMFTVsPtLSm -> SetXTitle("Mass [GeV/c^{2}]");
656 fHistMassMuonPairsVsPtLSm -> SetYTitle("p_{T} [GeV/c]");
657 fHistMassMuonPairsWithoutMFTVsPtLSm -> SetYTitle("p_{T} [GeV/c]");
658 fHistMassMuonPairsVsPtLSm -> Sumw2();
659 fHistMassMuonPairsWithoutMFTVsPtLSm -> Sumw2();
661 if (fOption==kPionsKaons) fHistRapidityPtMuonPairs = new TH2D("fHistRapidityPtMuonPairs", "Dimuon Phase Space (rec)", 20, -4.5, -2., 20, 0., 10.);
662 else fHistRapidityPtMuonPairs = new TH2D("fHistRapidityPtMuonPairs", "Dimuon Phase Space (MC)", 100, -4.5, -2., 100, 0., 10.);
663 fHistRapidityPtMuonPairs -> SetXTitle("Rapidity");
664 fHistRapidityPtMuonPairs -> SetYTitle("p_{T} [GeV/c]");
665 fHistRapidityPtMuonPairs -> Sumw2();
669 //====================================================================================================================================================