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"
25 #include "AliMuonForwardTrackAnalysis.h"
27 ClassImp(AliMuonForwardTrackAnalysis)
29 //====================================================================================================================================================
31 AliMuonForwardTrackAnalysis::AliMuonForwardTrackAnalysis():
36 fMuonForwardTracks(0),
37 fMuonForwardTrackPairs(0),
45 fNTracksAnalyzedOfEvent(0),
48 fNPairsAnalyzedOfEvent(0),
49 fHistOffsetSingleMuonsX(0x0),
50 fHistOffsetSingleMuonsY(0x0),
51 fHistOffsetSingleMuons(0x0),
52 fHistWOffsetSingleMuons(0x0),
53 fHistErrorSingleMuonsX(0x0),
54 fHistErrorSingleMuonsY(0x0),
55 fHistOffsetSingleMuonsX_vsPtRapidity(0x0),
56 fHistOffsetSingleMuonsY_vsPtRapidity(0x0),
57 fHistSingleMuonsPtRapidity(0x0),
58 fHistWOffsetMuonPairs(0x0),
59 fHistMassMuonPairs(0x0),
60 fHistMassMuonPairsWithoutMFT(0x0),
61 fHistMassMuonPairsMC(0x0),
62 fHistRapidityPtMuonPairsMC(0x0),
66 fSingleMuonAnalysis(1),
73 fMaxNWrongClustersMC(999),
77 // default constructor
79 for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) {
80 for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) {
81 fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] = 0x0;
82 fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] = 0x0;
88 //====================================================================================================================================================
90 Bool_t AliMuonForwardTrackAnalysis::Init(Char_t *inputFileName) {
94 TFile *inputFile = new TFile(Form("%s/%s",fInputDir.Data(),inputFileName));
95 if (!inputFile || !inputFile->IsOpen()) {
96 AliError(Form("Error opening file %s", inputFileName));
99 fInputTree = (TTree*) inputFile->Get("AliMuonForwardTracks");
101 AliError("Error reading input tree");
105 if (fFirstEvent<0 || fLastEvent<0 || fFirstEvent>fLastEvent || fFirstEvent>=fInputTree->GetEntries()) {
107 fLastEvent = fInputTree->GetEntries()-1;
110 fLastEvent = TMath::Min(fLastEvent, Int_t(fInputTree->GetEntries()-1));
113 AliInfo(Form("Analysing events %d to %d", fFirstEvent, fLastEvent));
115 fMuonForwardTracks = new TClonesArray("AliMuonForwardTrack");
116 fInputTree->SetBranchAddress("tracks", &fMuonForwardTracks);
118 TGeoManager::Import(Form("%s/geometry.root",fInputDir.Data()));
120 AliMUONTrackExtrap::SetField();
122 fMuonForwardTrackPairs = new TClonesArray("AliMuonForwardTrackPair");
128 //====================================================================================================================================================
130 Bool_t AliMuonForwardTrackAnalysis::LoadNextEvent() {
132 if (fEv>fLastEvent) return kFALSE;
133 if (fEv<fFirstEvent) { fEv++; return kTRUE; }
134 fMuonForwardTracks -> Clear();
135 fInputTree->GetEvent(fEv);
136 AliInfo(Form("**** analyzing event # %4d (%3d tracks) ****", fEv, fMuonForwardTracks->GetEntries()));
138 if (fSingleMuonAnalysis) {
139 fNTracksAnalyzedOfEvent = 0;
140 fNTracksOfEvent = fMuonForwardTracks->GetEntries();
141 while (AnalyzeSingleMuon()) continue;
144 if (fMuonPairAnalysis) {
145 if (fMuonForwardTrackPairs) {
146 fMuonForwardTrackPairs->Clear();
149 fNPairsAnalyzedOfEvent = 0;
150 fNPairsOfEvent = fMuonForwardTrackPairs->GetEntries();
151 while (AnalyzeMuonPair()) continue;
160 //====================================================================================================================================================
162 Bool_t AliMuonForwardTrackAnalysis::AnalyzeSingleMuon() {
164 if (fNTracksAnalyzedOfEvent>=fNTracksOfEvent) return kFALSE;
166 fMFTTrack = (AliMuonForwardTrack*) fMuonForwardTracks->At(fNTracksAnalyzedOfEvent);
167 fNTracksAnalyzedOfEvent++;
168 if (fMatchTrigger && !fMFTTrack->GetMatchTrigger()) return kTRUE;
169 fMCRefTrack = fMFTTrack->GetMCTrackRef();
171 if (!fMCRefTrack) return kTRUE;
172 if (fMFTTrack->GetNWrongClustersMC()>fMaxNWrongClustersMC) return kTRUE;
174 Double_t xOrig=gRandom->Gaus(0., fXVertResMC);
175 Double_t yOrig=gRandom->Gaus(0., fXVertResMC);
176 Double_t zOrig=gRandom->Gaus(0., fZVertResMC);
178 AliMUONTrackParam *param = fMFTTrack->GetTrackParamAtMFTCluster(0);
179 AliMUONTrackExtrap::ExtrapToZCov(param, zOrig);
182 Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
183 Double_t energy = TMath::Sqrt(param->P()*param->P() + mMu*mMu);
184 pMu.SetPxPyPzE(param->Px(), param->Py(), param->Pz(), energy);
186 if (fMFTTrack->Pt()<fPtMinSingleMuons) return kTRUE;
189 cov = param->GetCovariances();
191 fHistErrorSingleMuonsX -> Fill(1.e4*TMath::Sqrt(cov(0,0)));
192 fHistErrorSingleMuonsY -> Fill(1.e4*TMath::Sqrt(cov(2,2)));
194 Double_t dX = fMFTTrack->GetOffsetX(xOrig, zOrig);
195 Double_t dY = fMFTTrack->GetOffsetY(yOrig, zOrig);
197 Double_t offset = fMFTTrack->GetOffset(xOrig, yOrig, zOrig);
198 Double_t weightedOffset = fMFTTrack->GetWeightedOffset(xOrig, yOrig, zOrig);
200 // AliDebug(2, Form("pdg code = %d\n", fMCRefTrack->GetPdgCode()));
202 fHistOffsetSingleMuonsX -> Fill(1.e4*dX);
203 fHistOffsetSingleMuonsY -> Fill(1.e4*dY);
204 Int_t rapBin = fHistOffsetSingleMuonsX_vsPtRapidity->GetXaxis()->FindBin(pMu.Rapidity());
205 Int_t ptBin = fHistOffsetSingleMuonsX_vsPtRapidity->GetYaxis()->FindBin(pMu.Pt());
206 // AliDebug(1, Form("pt = %f (%d), rap = %f (%d)\n", pMu.Pt(), pMu.Rapidity(), ptBin, rapBin));
207 if (0<rapBin && rapBin<=fNRapBinsOffsetSingleMuons && 0<ptBin && ptBin<=fNPtBinsOffsetSingleMuons) {
208 fHistOffsetSingleMuonsX_tmp[rapBin-1][ptBin-1]->Fill(1.e4*dX);
209 fHistOffsetSingleMuonsY_tmp[rapBin-1][ptBin-1]->Fill(1.e4*dY);
211 fHistSingleMuonsPtRapidity -> Fill(pMu.Rapidity(), pMu.Pt());
212 fHistOffsetSingleMuons -> Fill(1.e4*offset);
213 fHistWOffsetSingleMuons -> Fill(weightedOffset);
221 //====================================================================================================================================================
223 Bool_t AliMuonForwardTrackAnalysis::AnalyzeMuonPair() {
225 if (fNPairsAnalyzedOfEvent>=fNPairsOfEvent) return kFALSE;
227 fMFTTrackPair = (AliMuonForwardTrackPair*) fMuonForwardTrackPairs->At(fNPairsAnalyzedOfEvent);
229 if (fOption==kResonanceOnly && !fMFTTrackPair->IsResonance()) {
230 fNPairsAnalyzedOfEvent++;
234 Double_t xOrig=gRandom->Gaus(0., fXVertResMC);
235 Double_t yOrig=gRandom->Gaus(0., fXVertResMC);
236 Double_t zOrig=gRandom->Gaus(0., fZVertResMC);
237 AliDebug(1, Form("origin = (%f, %f, %f)", xOrig, yOrig, zOrig));
239 fHistMassMuonPairs -> Fill(fMFTTrackPair->GetMass(zOrig));
240 fHistWOffsetMuonPairs -> Fill(fMFTTrackPair->GetWeightedOffset(xOrig, yOrig, zOrig));
241 fHistMassMuonPairsWithoutMFT -> Fill(fMFTTrackPair->GetMassWithoutMFT(xOrig, yOrig, zOrig));
242 fHistMassMuonPairsMC -> Fill(fMFTTrackPair->GetMassMC());
243 fHistRapidityPtMuonPairsMC -> Fill(fMFTTrackPair->GetRapidityMC(), fMFTTrackPair->GetPtMC());
245 AliDebug(1, Form("mass = %f MC = %f", fMFTTrackPair->GetMass(zOrig), fMFTTrackPair->GetMassMC()));
247 fNPairsAnalyzedOfEvent++;
253 //====================================================================================================================================================
255 void AliMuonForwardTrackAnalysis::BuildMuonPairs() {
257 for (Int_t iTrack=0; iTrack<fMuonForwardTracks->GetEntries(); iTrack++) {
258 for (Int_t jTrack=0; jTrack<iTrack; jTrack++) {
260 AliMuonForwardTrack *track0 = (AliMuonForwardTrack*) fMuonForwardTracks->At(iTrack);
261 AliMuonForwardTrack *track1 = (AliMuonForwardTrack*) fMuonForwardTracks->At(jTrack);
263 if (fMatchTrigger) if (!track0->GetMatchTrigger() || !track1->GetMatchTrigger()) continue;
264 if (!track0->GetMCTrackRef() || !track1->GetMCTrackRef()) continue;
265 if (track0->GetNWrongClustersMC()>fMaxNWrongClustersMC || track1->GetNWrongClustersMC()>fMaxNWrongClustersMC) continue;
266 if (track0->Pt()<fPtMinSingleMuons || track1->Pt()<fPtMinSingleMuons) continue;
268 AliMuonForwardTrackPair *trackPair = new AliMuonForwardTrackPair(track0, track1);
269 if (fOption==kResonanceOnly && !trackPair->IsResonance()) {
273 new ((*fMuonForwardTrackPairs)[fMuonForwardTrackPairs->GetEntries()]) AliMuonForwardTrackPair(*trackPair);
280 //====================================================================================================================================================
282 void AliMuonForwardTrackAnalysis::Terminate(Char_t *outputFileName) {
284 for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) {
285 for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) {
286 Int_t binMin_x = fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->FindBin(-3*fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS());
287 Int_t binMax_x = fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->FindBin(+3*fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS());
288 for (Int_t bin=1; bin<=fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetNbinsX(); bin++) {
289 if (bin<binMin_x || bin>binMax_x) fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->SetBinContent(bin, 0);
291 Int_t binMin_y = fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->FindBin(-3*fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS());
292 Int_t binMax_y = fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->FindBin(+3*fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS());
293 for (Int_t bin=1; bin<=fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetNbinsX(); bin++) {
294 if (bin<binMin_y || bin>binMax_y) fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->SetBinContent(bin, 0);
296 fHistOffsetSingleMuonsX_vsPtRapidity->SetBinContent(rapBin+1, ptBin+1, fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMS());
297 fHistOffsetSingleMuonsX_vsPtRapidity->SetBinError(rapBin+1, ptBin+1, fHistOffsetSingleMuonsX_tmp[rapBin][ptBin]->GetRMSError());
298 fHistOffsetSingleMuonsY_vsPtRapidity->SetBinContent(rapBin+1, ptBin+1, fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMS());
299 fHistOffsetSingleMuonsY_vsPtRapidity->SetBinError(rapBin+1, ptBin+1, fHistOffsetSingleMuonsY_tmp[rapBin][ptBin]->GetRMSError());
303 TFile *fileOut = new TFile(Form("%s/%s",fOutputDir.Data(),outputFileName), "recreate");
305 printf("Writing output objects to file %s\n", fileOut->GetName());
307 fHistOffsetSingleMuonsX -> Write();
308 fHistOffsetSingleMuonsY -> Write();
309 fHistOffsetSingleMuons -> Write();
310 fHistWOffsetSingleMuons -> Write();
311 fHistErrorSingleMuonsX -> Write();
312 fHistErrorSingleMuonsY -> Write();
314 fHistOffsetSingleMuonsX_vsPtRapidity -> Write();
315 fHistOffsetSingleMuonsY_vsPtRapidity -> Write();
317 // for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) {
318 // for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) {
319 // fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] -> Write();
320 // fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] -> Write();
324 fHistSingleMuonsPtRapidity -> Write();
326 fHistWOffsetMuonPairs -> Write();
327 fHistMassMuonPairs -> Write();
328 fHistMassMuonPairsWithoutMFT -> Write();
329 fHistMassMuonPairsMC -> Write();
330 fHistRapidityPtMuonPairsMC -> Write();
336 //====================================================================================================================================================
338 void AliMuonForwardTrackAnalysis::BookHistos() {
340 fHistOffsetSingleMuonsX = new TH1D("fHistOffsetSingleMuonsX", "Offset for single muons along X", 200, -1000, 1000);
341 fHistOffsetSingleMuonsY = new TH1D("fHistOffsetSingleMuonsY", "Offset for single muons along Y", 200, -1000, 1000);
342 fHistErrorSingleMuonsX = new TH1D("fHistErrorSingleMuonsX", "Coordinate Error for single muons along X", 200, 0, 1000);
343 fHistErrorSingleMuonsY = new TH1D("fHistErrorSingleMuonsY", "Coordinate Error for single muons along Y", 200, 0, 1000);
344 fHistOffsetSingleMuons = new TH1D("fHistOffsetSingleMuons", "Offset for single muons", 100, 0, 2000);
345 fHistWOffsetSingleMuons = new TH1D("fHistWOffsetSingleMuons", "Weighted Offset for single muons", 300, 0, 15);
347 fHistOffsetSingleMuonsX_vsPtRapidity = new TH2D("fHistOffsetSingleMuonsX_vsPtRapidity", "Offset for single muons along X",
348 10, -4, -2.5, 10, 0.5, 5.5);
349 fHistOffsetSingleMuonsY_vsPtRapidity = new TH2D("fHistOffsetSingleMuonsY_vsPtRapidity", "Offset for single muons along Y",
350 10, -4, -2.5, 10, 0.5, 5.5);
352 for (Int_t rapBin=0; rapBin<fNRapBinsOffsetSingleMuons; rapBin++) {
353 for (Int_t ptBin=0; ptBin<fNPtBinsOffsetSingleMuons; ptBin++) {
354 fHistOffsetSingleMuonsX_tmp[rapBin][ptBin] = new TH1D(Form("fHistOffsetSingleMuonsX_tmp_%02d_%02d",rapBin,ptBin), "", 1000, -1000, 1000);
355 fHistOffsetSingleMuonsY_tmp[rapBin][ptBin] = new TH1D(Form("fHistOffsetSingleMuonsY_tmp_%02d_%02d",rapBin,ptBin), "", 1000, -1000, 1000);
359 fHistSingleMuonsPtRapidity = new TH2D("fHistSingleMuonsPtRapidity", "Phase Space for single muons", 10, -4, -2.5, 10, 0.5, 5.5);
361 fHistOffsetSingleMuonsX -> SetXTitle("Offset(X) [#mum]");
362 fHistOffsetSingleMuonsY -> SetXTitle("Offset(Y) [#mum]");
363 fHistErrorSingleMuonsX -> SetXTitle("Err. on track position at z_{vtx} (X) [#mum]");
364 fHistErrorSingleMuonsY -> SetXTitle("Err. on track position at z_{vtx} (Y) [#mum]");
365 fHistOffsetSingleMuons -> SetXTitle("Offset [#mum]");
366 fHistWOffsetSingleMuons -> SetXTitle("Weighted Offset");
368 fHistOffsetSingleMuonsX_vsPtRapidity -> SetXTitle("y^{#mu}");
369 fHistOffsetSingleMuonsY_vsPtRapidity -> SetXTitle("y^{#mu}");
370 fHistOffsetSingleMuonsX_vsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]");
371 fHistOffsetSingleMuonsY_vsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]");
373 fHistSingleMuonsPtRapidity -> SetXTitle("y^{#mu}");
374 fHistSingleMuonsPtRapidity -> SetYTitle("p_{T}^{#mu} [GeV/c]");
376 fHistOffsetSingleMuonsX -> Sumw2();
377 fHistOffsetSingleMuonsY -> Sumw2();
378 fHistErrorSingleMuonsX -> Sumw2();
379 fHistErrorSingleMuonsY -> Sumw2();
380 fHistOffsetSingleMuons -> Sumw2();
381 fHistWOffsetSingleMuons -> Sumw2();
383 fHistOffsetSingleMuonsX_vsPtRapidity -> Sumw2();
384 fHistOffsetSingleMuonsY_vsPtRapidity -> Sumw2();
385 fHistSingleMuonsPtRapidity -> Sumw2();
387 //--------------------------------------------
389 fHistWOffsetMuonPairs = new TH1D("fHistWOffsetMuonPairs", "Weighted Offset for Muon Pairs", 300, 0, 60);
390 fHistMassMuonPairs = new TH1D("fHistMassMuonPairs", "Dimuon Mass (MUON+MFT)", fNMassBins, fMassMin, fMassMax);
391 fHistMassMuonPairsWithoutMFT = new TH1D("fHistMassMuonPairsWithoutMFT", "Dimuon Mass (MUON only)", fNMassBins, fMassMin, fMassMax);
392 fHistMassMuonPairsMC = new TH1D("fHistMassMuonPairsMC", "Dimuon Mass (MC)", fNMassBins, fMassMin, fMassMax);
393 fHistRapidityPtMuonPairsMC = new TH2D("fHistRapidityPtMuonPairsMC", "Dimuon Phase Space (MC)", 100, -4.5, -2., 100, 0., 10.);
395 fHistWOffsetMuonPairs -> SetXTitle("Weighted Offset");
396 fHistMassMuonPairs -> SetXTitle("Mass [GeV/c^{2}]");
397 fHistMassMuonPairsWithoutMFT -> SetXTitle("Mass [GeV/c^{2}]");
398 fHistMassMuonPairsMC -> SetXTitle("Mass [GeV/c^{2}]");
399 fHistRapidityPtMuonPairsMC -> SetXTitle("Rapidity");
400 fHistRapidityPtMuonPairsMC -> SetYTitle("p_{T} [GeV/c]");
402 fHistWOffsetMuonPairs -> Sumw2();
403 fHistMassMuonPairs -> Sumw2();
404 fHistMassMuonPairsWithoutMFT -> Sumw2();
405 fHistMassMuonPairsMC -> Sumw2();
406 fHistRapidityPtMuonPairsMC -> Sumw2();
410 //====================================================================================================================================================