]>
Commit | Line | Data |
---|---|---|
e4dddba1 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
27de2dfb | 16 | /* $Id$ */ |
17 | ||
e4dddba1 | 18 | //----------------------------------------------------------------------------- |
19 | // Analysis task to compute muon/dimuon kinematic distributions | |
20 | // The output is a list of histograms. | |
21 | // The macro class can run on AOD or in the train with the ESD filter. | |
22 | // R. Arnaldi | |
23 | // | |
24 | //----------------------------------------------------------------------------- | |
25 | ||
26 | //#ifndef ALIANALYSISTASKMUONDISTRIBUTIONS_CXX | |
27 | //#define ALIANALYSISTASKMUONDISTRIBUTIONS_CXX | |
28 | ||
e4dddba1 | 29 | #include <TCanvas.h> |
96ee66b9 | 30 | #include <TF1.h> |
e4dddba1 | 31 | #include <TH1.h> |
e4dddba1 | 32 | #include <TLatex.h> |
96ee66b9 | 33 | #include <TList.h> |
34 | #include <TStyle.h> | |
e4dddba1 | 35 | |
36 | #include "AliAnalysisTaskMuonDistributions.h" | |
37 | #include "AliAnalysisTaskSE.h" | |
38 | #include "AliAnalysisManager.h" | |
e4dddba1 | 39 | #include "AliESDEvent.h" |
40 | #include "AliESD.h" | |
41 | #include "AliVEvent.h" | |
42 | #include "AliMCEventHandler.h" | |
43 | #include "AliInputEventHandler.h" | |
44 | #include "AliMCEvent.h" | |
45 | #include "AliStack.h" | |
46 | #include "AliLog.h" | |
47 | #include "AliHeader.h" | |
48 | #include "AliESDHeader.h" | |
49 | #include "AliStack.h" | |
50 | #include "TParticle.h" | |
51 | #include "TLorentzVector.h" | |
52 | #include "AliESDMuonTrack.h" | |
e4dddba1 | 53 | #include "AliESDInputHandler.h" |
54 | #include "AliAODEvent.h" | |
55 | #include "AliAODHeader.h" | |
56 | #include "AliAODHandler.h" | |
57 | #include "AliAODInputHandler.h" | |
e4dddba1 | 58 | |
59 | ClassImp(AliAnalysisTaskMuonDistributions) | |
60 | ||
61 | //__________________________________________________________________________ | |
62 | AliAnalysisTaskMuonDistributions::AliAnalysisTaskMuonDistributions() : | |
63 | fBeamEnergy(0.), | |
64 | fInvMassFitLimitMin(2.), | |
65 | fInvMassFitLimitMax(5.), | |
66 | fPsiFitLimitMin(2.9), | |
67 | fPsiFitLimitMax(3.3), | |
f032e1ac | 68 | fPsiPFitLimitMin(3.3), |
69 | fPsiPFitLimitMax(4.), | |
e4dddba1 | 70 | fBckFitLimitMin(2.2), |
71 | fBckFitLimitMax(2.85), | |
72 | fInvariantMassFit(kFALSE), | |
c5c5bf9c | 73 | fkAnalysisType(0x0), |
e4dddba1 | 74 | fOutput(0x0) |
75 | { | |
76 | } | |
77 | //___________________________________________________________________________ | |
78 | AliAnalysisTaskMuonDistributions::AliAnalysisTaskMuonDistributions(const Char_t* name) : | |
79 | AliAnalysisTaskSE(name), | |
80 | fBeamEnergy(0.), | |
81 | fInvMassFitLimitMin(2.), | |
82 | fInvMassFitLimitMax(5.), | |
83 | fPsiFitLimitMin(2.9), | |
84 | fPsiFitLimitMax(3.3), | |
f032e1ac | 85 | fPsiPFitLimitMin(3.3), |
86 | fPsiPFitLimitMax(4.), | |
e4dddba1 | 87 | fBckFitLimitMin(2.2), |
88 | fBckFitLimitMax(2.85), | |
89 | fInvariantMassFit(kFALSE), | |
c5c5bf9c | 90 | fkAnalysisType(0x0), |
e4dddba1 | 91 | fOutput(0x0) |
92 | { | |
c5c5bf9c | 93 | // |
e4dddba1 | 94 | // Constructor. Initialization of Inputs and Outputs |
95 | // | |
96 | Info("AliAnalysisTaskMuonDistributions","Calling Constructor"); | |
97 | ||
98 | DefineOutput(1,TList::Class()); | |
99 | ||
100 | } | |
101 | ||
102 | //___________________________________________________________________________ | |
103 | AliAnalysisTaskMuonDistributions& AliAnalysisTaskMuonDistributions::operator=(const AliAnalysisTaskMuonDistributions& c) | |
104 | { | |
105 | // | |
106 | // Assignment operator | |
107 | // | |
108 | if (this!=&c) { | |
109 | AliAnalysisTaskSE::operator=(c) ; | |
110 | } | |
111 | return *this; | |
112 | } | |
113 | ||
114 | //___________________________________________________________________________ | |
115 | AliAnalysisTaskMuonDistributions::AliAnalysisTaskMuonDistributions(const AliAnalysisTaskMuonDistributions& c) : | |
116 | AliAnalysisTaskSE(c), | |
117 | fBeamEnergy(c.fBeamEnergy), | |
118 | fInvMassFitLimitMin(c.fInvMassFitLimitMin), | |
119 | fInvMassFitLimitMax(c.fInvMassFitLimitMax), | |
120 | fPsiFitLimitMin(c.fPsiFitLimitMin), | |
121 | fPsiFitLimitMax(c.fPsiFitLimitMax), | |
f032e1ac | 122 | fPsiPFitLimitMin(c.fPsiPFitLimitMin), |
123 | fPsiPFitLimitMax(c.fPsiPFitLimitMax), | |
e4dddba1 | 124 | fBckFitLimitMin(c.fBckFitLimitMin), |
125 | fBckFitLimitMax(c.fBckFitLimitMax), | |
126 | fInvariantMassFit(c.fInvariantMassFit), | |
c5c5bf9c | 127 | fkAnalysisType(c.fkAnalysisType), |
e4dddba1 | 128 | fOutput(c.fOutput) |
129 | { | |
130 | // | |
131 | // Copy Constructor | |
132 | // | |
133 | } | |
134 | ||
135 | //___________________________________________________________________________ | |
136 | AliAnalysisTaskMuonDistributions::~AliAnalysisTaskMuonDistributions() { | |
137 | // | |
138 | //destructor | |
139 | // | |
140 | Info("~AliAnalysisTaskMuonDistributions","Calling Destructor"); | |
93fd3322 | 141 | |
142 | if (fOutput){ | |
143 | delete fOutput; | |
144 | fOutput = 0; | |
145 | } | |
e4dddba1 | 146 | } |
147 | ||
148 | //___________________________________________________________________________ | |
149 | void AliAnalysisTaskMuonDistributions::UserCreateOutputObjects(){ | |
c5c5bf9c | 150 | // |
151 | // output objects creation | |
152 | // | |
e4dddba1 | 153 | fOutput = new TList(); |
154 | fOutput->SetOwner(); | |
155 | // | |
156 | // various histos | |
157 | // | |
158 | TH1D *hNumberMuonTracks = new TH1D("hNumberMuonTracks","hNumberMuonTracks;N_{#mu tracks}",10,0.,10.); | |
159 | // | |
160 | // dimuon histos | |
161 | // | |
c5c5bf9c | 162 | TH1D *hMassDimu = new TH1D("hMassDimu","hMassDimu;M_{#mu#mu} (GeV/c^{2})",180,0,9.); |
163 | TH1D *hPtDimu = new TH1D("hPtDimu","hPtDimu;p_{T} (GeV/c)",100,0,20); | |
164 | TH1D *hRapidityDimu = new TH1D("hRapidityDimu","hRapidityDimu;y",100,-5,-2); | |
165 | TH1D *hCosThetaCSDimu = new TH1D("hCosThetaCSDimu","hCosThetaCSDimu;cos#theta_{CS}",100,-1.,1.); | |
166 | TH1D *hCosThetaHEDimu = new TH1D("hCosThetaHEDimu","hCosThetaHEDimu;cos#theta_{HE}",100,-1.,1.); | |
e4dddba1 | 167 | // |
168 | // muon histos | |
169 | // | |
170 | TH1D *hP = new TH1D("hP","hP;p (GeV/c)",100,0,500); | |
171 | TH1D *hPt = new TH1D("hPt","hPt;p_{T} (GeV/c)",100,0,20); | |
172 | TH1D *hRapidity = new TH1D("hRapidity","hRapidity;y",100,-5,-2); | |
173 | ||
174 | fOutput->Add(hNumberMuonTracks); | |
c5c5bf9c | 175 | fOutput->Add(hMassDimu); |
176 | fOutput->Add(hPtDimu); | |
177 | fOutput->Add(hRapidityDimu); | |
178 | fOutput->Add(hCosThetaCSDimu); | |
179 | fOutput->Add(hCosThetaHEDimu); | |
e4dddba1 | 180 | fOutput->Add(hP); |
181 | fOutput->Add(hPt); | |
182 | fOutput->Add(hRapidity); | |
183 | fOutput->ls(); | |
184 | } | |
185 | ||
186 | //_________________________________________________ | |
187 | void AliAnalysisTaskMuonDistributions::UserExec(Option_t *) | |
188 | { | |
c5c5bf9c | 189 | // |
190 | // Execute analysis for current event | |
191 | // | |
e4dddba1 | 192 | AliESDEvent *esd=0x0; |
193 | AliAODEvent *aod=0x0; | |
194 | ||
c5c5bf9c | 195 | if(strcmp(fkAnalysisType,"ESD")==0){ |
e4dddba1 | 196 | AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> |
197 | (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
198 | esd = esdH->GetEvent(); | |
c5c5bf9c | 199 | } else if(strcmp(fkAnalysisType,"AOD")==0){ |
e4dddba1 | 200 | aod = dynamic_cast<AliAODEvent*> (InputEvent()); |
201 | } | |
202 | ||
203 | Int_t ntracks=-999; | |
c5c5bf9c | 204 | if(strcmp(fkAnalysisType,"ESD")==0) ntracks=esd->GetNumberOfMuonTracks(); |
205 | else if(strcmp(fkAnalysisType,"AOD")==0) ntracks=aod->GetNumberOfTracks(); | |
e4dddba1 | 206 | Int_t nmuontracks=0; |
207 | ||
208 | for (Int_t j = 0; j<ntracks; j++) { | |
c5c5bf9c | 209 | Float_t pxmu1=-999; Float_t pymu1=-999; Float_t pzmu1=-999; Float_t ptmu1=-999; Float_t pmu1=-999; |
210 | Float_t emu1=-999; Float_t rapiditymu1=-999; Float_t chargemu1=-999; | |
211 | if(strcmp(fkAnalysisType,"ESD")==0){ | |
e4dddba1 | 212 | AliESDMuonTrack* mu1 = new AliESDMuonTrack(*(esd->GetMuonTrack(j))); |
213 | if (!mu1->ContainTrackerData()) continue; | |
c5c5bf9c | 214 | chargemu1 = mu1->Charge(); |
215 | pxmu1 = mu1->Px(); | |
216 | pymu1 = mu1->Py(); | |
217 | pzmu1 = mu1->Pz(); | |
218 | emu1 = mu1->E(); | |
219 | pmu1 = mu1->P(); | |
220 | ptmu1 = mu1->Pt(); | |
221 | rapiditymu1 = Rapidity(emu1,pzmu1); | |
222 | } else if(strcmp(fkAnalysisType,"AOD")==0){ | |
e4dddba1 | 223 | AliAODTrack *mu1 = aod->GetTrack(j); |
224 | if(!mu1->IsMuonTrack()) continue; | |
c5c5bf9c | 225 | chargemu1 = mu1->Charge(); |
226 | pxmu1 = mu1->Px(); | |
227 | pymu1 = mu1->Py(); | |
228 | pzmu1 = mu1->Pz(); | |
229 | emu1 = mu1->E(); | |
230 | pmu1 = mu1->P(); | |
231 | ptmu1 = mu1->Pt(); | |
232 | rapiditymu1 = Rapidity(emu1,pzmu1); | |
e4dddba1 | 233 | } |
c5c5bf9c | 234 | ((TH1D*)(fOutput->FindObject("hP")))->Fill(pmu1); |
235 | ((TH1D*)(fOutput->FindObject("hPt")))->Fill(ptmu1); | |
236 | ((TH1D*)(fOutput->FindObject("hRapidity")))->Fill(rapiditymu1); | |
e4dddba1 | 237 | nmuontracks++; |
c5c5bf9c | 238 | if(chargemu1<0){ |
e4dddba1 | 239 | for (Int_t jj = 0; jj<ntracks; jj++) { |
c5c5bf9c | 240 | Float_t pxmu2=-999; Float_t pymu2=-999; Float_t pzmu2=-999; |
241 | Float_t emu2=-999;Float_t chargemu2=-999; | |
242 | if(strcmp(fkAnalysisType,"ESD")==0){ | |
e4dddba1 | 243 | AliESDMuonTrack* mu2 = new AliESDMuonTrack(*(esd->GetMuonTrack(jj))); |
244 | if (!mu2->ContainTrackerData()) continue; | |
c5c5bf9c | 245 | chargemu2 = mu2->Charge(); |
246 | pxmu2 = mu2->Px(); | |
247 | pymu2 = mu2->Py(); | |
248 | pzmu2 = mu2->Pz(); | |
249 | emu2 = mu2->E(); | |
250 | } else if(strcmp(fkAnalysisType,"AOD")==0){ | |
e4dddba1 | 251 | AliAODTrack *mu2 = aod->GetTrack(jj); |
252 | if(!mu2->IsMuonTrack()) continue; | |
c5c5bf9c | 253 | chargemu2 = mu2->Charge(); |
254 | pxmu2 = mu2->Px(); | |
255 | pymu2 = mu2->Py(); | |
256 | pzmu2 = mu2->Pz(); | |
257 | emu2 = mu2->E(); | |
e4dddba1 | 258 | } |
c5c5bf9c | 259 | if(chargemu2>0){ |
260 | Float_t ptdimu = TMath::Sqrt((pxmu1+pxmu2)*(pxmu1+pxmu2)+(pymu1+pymu2)*(pymu1+pymu2)); | |
261 | Float_t massdimu = InvMass(emu1,pxmu1,pymu1,pzmu1,emu2,pxmu2,pymu2,pzmu2); | |
262 | Float_t rapiditydimu = Rapidity((emu1+emu2),(pzmu1+pzmu2)); | |
263 | Double_t costhetaCSdimu = CostCS((Double_t) pxmu1,(Double_t) pymu1,(Double_t)pzmu1,(Double_t) emu1,(Double_t)chargemu1,(Double_t) pxmu2,(Double_t) pymu2,(Double_t)pzmu2,(Double_t) emu2); | |
264 | Double_t costhetaHEdimu = CostHE((Double_t) pxmu1,(Double_t) pymu1,(Double_t)pzmu1,(Double_t) emu1,(Double_t)chargemu1,(Double_t) pxmu2,(Double_t) pymu2,(Double_t)pzmu2,(Double_t) emu2); | |
265 | ((TH1D*)(fOutput->FindObject("hMassDimu")))->Fill(massdimu); | |
266 | ((TH1D*)(fOutput->FindObject("hPtDimu")))->Fill(ptdimu); | |
267 | ((TH1D*)(fOutput->FindObject("hRapidityDimu")))->Fill(rapiditydimu); | |
268 | ((TH1D*)(fOutput->FindObject("hCosThetaCSDimu")))->Fill(costhetaCSdimu); | |
269 | ((TH1D*)(fOutput->FindObject("hCosThetaHEDimu")))->Fill(costhetaHEdimu); | |
e4dddba1 | 270 | } |
271 | //delete mu2; | |
272 | } // second mu Loop | |
273 | } // mu- Selection | |
274 | //delete mu1; | |
275 | } | |
276 | ((TH1D*)(fOutput->FindObject("hNumberMuonTracks")))->Fill(nmuontracks); | |
277 | ||
278 | PostData(1,fOutput); | |
279 | } | |
280 | ||
281 | ||
282 | //________________________________________________________________________ | |
283 | void AliAnalysisTaskMuonDistributions::Terminate(Option_t *) | |
284 | { | |
c5c5bf9c | 285 | // |
286 | // Draw histos | |
287 | // | |
e4dddba1 | 288 | gStyle->SetCanvasColor(10); |
289 | gStyle->SetFrameFillColor(10); | |
290 | Int_t xmin=20; | |
291 | Int_t ymin=20; | |
292 | ||
293 | printf("Using beam Energy=%f \n",fBeamEnergy); | |
294 | ||
f032e1ac | 295 | fOutput = dynamic_cast<TList*> (GetOutputData(1)); |
c5c5bf9c | 296 | TH1D *hNumberMuonTracks = dynamic_cast<TH1D*> (fOutput->FindObject("hNumberMuonTracks")); |
297 | TH1D *hMassDimu = dynamic_cast<TH1D*> (fOutput->FindObject("hMassDimu")); | |
298 | TH1D *hPtDimu = dynamic_cast<TH1D*> (fOutput->FindObject("hPtDimu")); | |
299 | TH1D *hRapidityDimu = dynamic_cast<TH1D*> (fOutput->FindObject("hRapidityDimu")); | |
93fd3322 | 300 | TH1D *hCosThetaCSDimu = dynamic_cast<TH1D*> (fOutput->FindObject("hCosThetaCSDimu")); |
301 | TH1D *hCosThetaHEDimu = dynamic_cast<TH1D*> (fOutput->FindObject("hCosThetaHEDimu")); | |
c5c5bf9c | 302 | TH1D *hP = dynamic_cast<TH1D*> (fOutput->FindObject("hP")); |
303 | TH1D *hPt = dynamic_cast<TH1D*> (fOutput->FindObject("hPt")); | |
304 | TH1D *hRapidity = dynamic_cast<TH1D*> (fOutput->FindObject("hRapidity")); | |
f032e1ac | 305 | |
93fd3322 | 306 | TCanvas *c0_MuonDistributions = new TCanvas("c0_MuonDistributions","Plots",xmin,ymin,600,600); |
307 | c0_MuonDistributions->Divide(2,2); | |
308 | c0_MuonDistributions->cd(1); | |
309 | hNumberMuonTracks->SetFillColor(2); | |
310 | hNumberMuonTracks->Draw(); | |
311 | ||
312 | xmin+=20; ymin+=20; | |
313 | TCanvas *c1_MuonDistributions = new TCanvas("c1_MuonDistributions","Muon kinematic distributions Plots",xmin,ymin,600,600); | |
314 | c1_MuonDistributions->Divide(2,2); | |
315 | c1_MuonDistributions->cd(1); | |
316 | gPad->SetLogy(1); | |
317 | hP->SetLineColor(4); | |
318 | hP->Draw(); | |
319 | c1_MuonDistributions->cd(2); | |
320 | gPad->SetLogy(1); | |
321 | hPt->SetLineColor(4); | |
322 | hPt->Draw(); | |
323 | c1_MuonDistributions->cd(3); | |
324 | hRapidity->SetLineColor(4); | |
325 | hRapidity->Draw(); | |
326 | ||
327 | xmin+=20; ymin+=20; | |
328 | TCanvas *c2_MuonDistributions = new TCanvas("c2_MuonDistributions","Dimuon kinematic distributions Plots",xmin,ymin,600,600); | |
329 | c2_MuonDistributions->Divide(2,2); | |
330 | c2_MuonDistributions->cd(1); | |
331 | gPad->SetLogy(1); | |
332 | hPtDimu->SetLineColor(2); | |
333 | hPtDimu->Draw(); | |
334 | c2_MuonDistributions->cd(2); | |
335 | hRapidityDimu->SetLineColor(2); | |
336 | hRapidityDimu->Draw(); | |
337 | c2_MuonDistributions->cd(3); | |
338 | hCosThetaCSDimu->SetLineColor(2); | |
339 | hCosThetaCSDimu->Draw(); | |
340 | c2_MuonDistributions->cd(4); | |
341 | hCosThetaHEDimu->SetLineColor(2); | |
342 | hCosThetaHEDimu->Draw(); | |
343 | ||
344 | xmin+=20; ymin+=20; | |
345 | TCanvas *c3_MuonDistributions = new TCanvas("c3_MuonDistributions","Invariant Mass Plots",xmin,ymin,600,600); | |
346 | gPad->SetLogy(1); | |
347 | hMassDimu->Draw(); | |
524828c1 | 348 | if(fInvariantMassFit && hMassDimu->GetEntries()>100) FitInvMass(hMassDimu); |
93fd3322 | 349 | c3_MuonDistributions->Update(); |
e4dddba1 | 350 | } |
351 | ||
352 | //________________________________________________________________________ | |
353 | Float_t AliAnalysisTaskMuonDistributions::InvMass(Float_t e1, Float_t px1, Float_t py1, Float_t pz1, | |
c5c5bf9c | 354 | Float_t e2, Float_t px2, Float_t py2, Float_t pz2) const |
e4dddba1 | 355 | { |
c5c5bf9c | 356 | // |
e4dddba1 | 357 | // invariant mass calculation |
c5c5bf9c | 358 | // |
e4dddba1 | 359 | Float_t imassrec = TMath::Sqrt((e1+e2)*(e1+e2)-((px1+px2)*(px1+px2)+ |
360 | (py1+py2)*(py1+py2)+(pz1+pz2)*(pz1+pz2))); | |
361 | return imassrec; | |
362 | } | |
363 | //________________________________________________________________________ | |
c5c5bf9c | 364 | Float_t AliAnalysisTaskMuonDistributions::Rapidity(Float_t e, Float_t pz) const |
e4dddba1 | 365 | { |
c5c5bf9c | 366 | // |
e4dddba1 | 367 | // calculate rapidity |
c5c5bf9c | 368 | // |
e4dddba1 | 369 | Float_t rap; |
c5c5bf9c | 370 | if(TMath::Abs(e-pz)>1e-7){ |
e4dddba1 | 371 | rap = 0.5*TMath::Log((e+pz)/(e-pz)); |
372 | return rap; | |
373 | } else { | |
374 | rap = -200; | |
375 | return rap; | |
376 | } | |
377 | } | |
378 | //________________________________________________________________________ | |
379 | Double_t AliAnalysisTaskMuonDistributions::CostCS(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
380 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2) | |
381 | { | |
f032e1ac | 382 | // |
c5c5bf9c | 383 | // costCS calculation |
384 | // | |
385 | TLorentzVector pMu1CM, pMu2CM, pProjCM, pTargCM, pDimuCM; // In the CM. frame | |
386 | TLorentzVector pMu1Dimu, pMu2Dimu, pProjDimu, pTargDimu; // In the dimuon rest frame | |
e4dddba1 | 387 | TVector3 beta,zaxisCS; |
388 | Double_t mp=0.93827231; | |
389 | // | |
390 | // --- Fill the Lorentz vector for projectile and target in the CM frame | |
391 | // | |
c5c5bf9c | 392 | pProjCM.SetPxPyPzE(0.,0.,-fBeamEnergy,TMath::Sqrt(fBeamEnergy*fBeamEnergy+mp*mp)); |
393 | pTargCM.SetPxPyPzE(0.,0.,fBeamEnergy,TMath::Sqrt(fBeamEnergy*fBeamEnergy+mp*mp)); | |
e4dddba1 | 394 | // |
395 | // --- Get the muons parameters in the CM frame | |
396 | // | |
c5c5bf9c | 397 | pMu1CM.SetPxPyPzE(px1,py1,pz1,e1); |
398 | pMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
e4dddba1 | 399 | // |
400 | // --- Obtain the dimuon parameters in the CM frame | |
401 | // | |
c5c5bf9c | 402 | pDimuCM=pMu1CM+pMu2CM; |
e4dddba1 | 403 | // |
404 | // --- Translate the dimuon parameters in the dimuon rest frame | |
405 | // | |
c5c5bf9c | 406 | beta=(-1./pDimuCM.E())*pDimuCM.Vect(); |
407 | pMu1Dimu=pMu1CM; | |
408 | pMu2Dimu=pMu2CM; | |
409 | pProjDimu=pProjCM; | |
410 | pTargDimu=pTargCM; | |
411 | pMu1Dimu.Boost(beta); | |
412 | pMu2Dimu.Boost(beta); | |
413 | pProjDimu.Boost(beta); | |
414 | pTargDimu.Boost(beta); | |
e4dddba1 | 415 | // |
416 | // --- Determine the z axis for the CS angle | |
417 | // | |
c5c5bf9c | 418 | zaxisCS=(((pProjDimu.Vect()).Unit())-((pTargDimu.Vect()).Unit())).Unit(); |
e4dddba1 | 419 | // |
420 | // --- Determine the CS angle (angle between mu+ and the z axis defined above) | |
421 | Double_t cost; | |
422 | ||
c5c5bf9c | 423 | if(charge1>0) {cost = zaxisCS.Dot((pMu1Dimu.Vect()).Unit());} |
424 | else {cost = zaxisCS.Dot((pMu2Dimu.Vect()).Unit());} | |
e4dddba1 | 425 | return cost; |
426 | } | |
427 | ||
428 | //________________________________________________________________________ | |
429 | Double_t AliAnalysisTaskMuonDistributions::CostHE(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
430 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2) | |
431 | { | |
c5c5bf9c | 432 | // |
433 | // costHE calculation | |
434 | // | |
435 | TLorentzVector pMu1CM, pMu2CM, pDimuCM; // In the CM frame | |
436 | TLorentzVector pMu1Dimu, pMu2Dimu; // In the dimuon rest frame | |
e4dddba1 | 437 | TVector3 beta,zaxisCS; |
438 | // | |
439 | // --- Get the muons parameters in the CM frame | |
440 | // | |
c5c5bf9c | 441 | pMu1CM.SetPxPyPzE(px1,py1,pz1,e1); |
442 | pMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
e4dddba1 | 443 | // |
444 | // --- Obtain the dimuon parameters in the CM frame | |
445 | // | |
c5c5bf9c | 446 | pDimuCM=pMu1CM+pMu2CM; |
e4dddba1 | 447 | // |
448 | // --- Translate the muon parameters in the dimuon rest frame | |
449 | // | |
c5c5bf9c | 450 | beta=(-1./pDimuCM.E())*pDimuCM.Vect(); |
451 | pMu1Dimu=pMu1CM; | |
452 | pMu2Dimu=pMu2CM; | |
453 | pMu1Dimu.Boost(beta); | |
454 | pMu2Dimu.Boost(beta); | |
e4dddba1 | 455 | // |
456 | // --- Determine the z axis for the calculation of the polarization angle (i.e. the direction of the dimuon in the CM system) | |
457 | // | |
458 | TVector3 zaxis; | |
c5c5bf9c | 459 | zaxis=(pDimuCM.Vect()).Unit(); |
e4dddba1 | 460 | |
461 | // --- Calculation of the polarization angle (angle between mu+ and the z axis defined above) | |
462 | Double_t cost; | |
c5c5bf9c | 463 | if(charge1>0) {cost = zaxis.Dot((pMu1Dimu.Vect()).Unit());} |
464 | else {cost = zaxis.Dot((pMu2Dimu.Vect()).Unit());} | |
e4dddba1 | 465 | return cost; |
466 | } | |
467 | ||
468 | //________________________________________________________________________ | |
469 | void AliAnalysisTaskMuonDistributions::FitInvMass(TH1D *histo) | |
470 | { | |
c5c5bf9c | 471 | // |
472 | // Fit to the Invariant Mass Spectrum | |
473 | // | |
f032e1ac | 474 | TF1 *gaupsi = new TF1("gaupsi","gaus",fPsiFitLimitMin,fPsiFitLimitMax); |
475 | TF1 *gaupsip = new TF1("gaupsip","gaus",fPsiPFitLimitMin,fPsiPFitLimitMax); | |
e4dddba1 | 476 | TF1 *ex = new TF1("ex","expo",fBckFitLimitMin,fBckFitLimitMax); |
f032e1ac | 477 | TF1 *tot = new TF1("mtot","gaus(0)+expo(3)+gaus(5)",fInvMassFitLimitMin,fInvMassFitLimitMax); |
478 | Double_t par[8]; | |
c5c5bf9c | 479 | Double_t binWidth= histo->GetBinWidth(1); |
f032e1ac | 480 | gaupsi->SetLineColor(kGreen); |
481 | gaupsi->SetLineWidth(2); | |
482 | histo->Fit(gaupsi,"Rl0"); | |
483 | ex->SetLineColor(kBlue); | |
e4dddba1 | 484 | ex->SetLineWidth(2); |
f032e1ac | 485 | histo->Fit(ex,"Rl+"); |
486 | gaupsip->SetLineColor(kAzure-9); | |
487 | gaupsip->SetLineWidth(2); | |
488 | gaupsip->SetParLimits(1,3.6,3.75); | |
489 | gaupsip->SetParLimits(2,0.8*gaupsi->GetParameter(2),1.2*gaupsi->GetParameter(2)); | |
490 | histo->Fit(gaupsip,"Rl0+"); | |
491 | gaupsi->GetParameters(&par[0]); | |
e4dddba1 | 492 | ex->GetParameters(&par[3]); |
f032e1ac | 493 | gaupsip->GetParameters(&par[5]); |
e4dddba1 | 494 | tot->SetParameters(par); |
495 | tot->SetLineColor(2); | |
496 | tot->SetLineWidth(2); | |
f032e1ac | 497 | tot->SetParLimits(6,3.6,3.75); //limit for the psi(2S) parameters |
498 | tot->SetParLimits(7,0.8*gaupsi->GetParameter(2),1.2*gaupsi->GetParameter(2)); //limit for the psi(2S) parameters | |
e4dddba1 | 499 | histo->Fit(tot,"Rl+"); |
500 | histo->Draw("e"); | |
c5c5bf9c | 501 | Double_t chi2 = tot->GetChisquare(); |
502 | Double_t ndf = tot->GetNDF(); | |
f032e1ac | 503 | |
c5c5bf9c | 504 | Float_t meanPsi= tot->GetParameter(1); |
505 | Float_t sigPsi= tot->GetParameter(2)*1000.; | |
506 | Double_t nPsiFit = TMath::Sqrt(2*3.1415)*tot->GetParameter(0)*tot->GetParameter(2)/binWidth; | |
f032e1ac | 507 | TF1 *psifix = new TF1("psifix","gaus",2.,5.); |
508 | psifix->SetParameter(0,tot->GetParameter(0)); | |
509 | psifix->SetParameter(1,tot->GetParameter(1)); | |
510 | psifix->SetParameter(2,tot->GetParameter(2)); | |
511 | psifix->SetLineColor(kGreen); | |
512 | psifix->Draw("same"); | |
513 | Double_t nPsi2933 = psifix->Integral(2.9,3.3)/binWidth; | |
514 | ||
e4dddba1 | 515 | TF1 *exfix = new TF1("exfix","expo",2.,5.); |
516 | exfix->SetParameter(0,tot->GetParameter(3)); | |
517 | exfix->SetParameter(1,tot->GetParameter(4)); | |
c5c5bf9c | 518 | Double_t nBck = exfix->Integral(2.9,3.3)/binWidth; |
e4dddba1 | 519 | |
f032e1ac | 520 | Float_t meanPsiP= tot->GetParameter(6); |
521 | Float_t sigPsiP= tot->GetParameter(7)*1000.; | |
522 | Double_t nPsiPFit = TMath::Sqrt(2*3.1415)*tot->GetParameter(5)*tot->GetParameter(7)/binWidth; | |
523 | TF1 *psipfix = new TF1("psipfix","gaus",3.,5.); | |
524 | psipfix->SetParameter(0,tot->GetParameter(5)); | |
525 | psipfix->SetParameter(1,tot->GetParameter(6)); | |
526 | psipfix->SetParameter(2,tot->GetParameter(7)); | |
527 | psipfix->SetLineColor(kAzure-9); | |
528 | psipfix->Draw("same"); | |
529 | ||
e4dddba1 | 530 | printf("\n\n****************************************************************************\n"); |
c5c5bf9c | 531 | char psitext[100]; |
524828c1 | 532 | if(nPsiFit<0) nPsiFit = 0; |
f032e1ac | 533 | sprintf(psitext,"N. J/#psi = %10.0f",nPsiFit); |
534 | printf("\nN. J/psi = %10.0f\n",nPsiFit); | |
535 | TLatex *psilatex = new TLatex(4.,0.85*histo->GetMaximum(),psitext); | |
c5c5bf9c | 536 | psilatex->SetTextColor(2); |
537 | psilatex->SetTextSize(0.03); | |
538 | psilatex->SetTextAlign(2); | |
539 | psilatex->Draw(); | |
e4dddba1 | 540 | |
c5c5bf9c | 541 | char psi2text[100]; |
f032e1ac | 542 | sprintf(psi2text,"J/#psi m=%4.3f GeV #sigma= %4.2f MeV",meanPsi,sigPsi); |
543 | printf("J/psi m= %4.3f GeV sigma= %4.2f MeV\n",meanPsi,sigPsi); | |
544 | TLatex *psi2latex = new TLatex(4.,0.425*histo->GetMaximum(),psi2text); | |
c5c5bf9c | 545 | psi2latex->SetTextColor(2); |
546 | psi2latex->SetTextSize(0.03); | |
547 | psi2latex->SetTextAlign(2); | |
548 | psi2latex->Draw(); | |
e4dddba1 | 549 | |
c5c5bf9c | 550 | char sbtext[100]; |
f032e1ac | 551 | sprintf(sbtext,"S/B (2.9-3.3)= %4.2f ",nPsi2933/nBck); |
552 | printf("S/B (2.9-3.3)= %4.2f\n",nPsi2933/nBck); | |
553 | TLatex *sblatex = new TLatex(4.,0.212*histo->GetMaximum(),sbtext); | |
c5c5bf9c | 554 | sblatex->SetTextColor(2); |
555 | sblatex->SetTextSize(0.03); | |
556 | sblatex->SetTextAlign(2); | |
557 | sblatex->Draw(); | |
e4dddba1 | 558 | |
f032e1ac | 559 | char psiptext[100]; |
524828c1 | 560 | if(nPsiPFit<0) nPsiPFit = 0; |
f032e1ac | 561 | sprintf(psiptext,"N. #psi(2S) = %10.0f",nPsiPFit); |
562 | printf("\npsi(2S) = %10.0f\n",nPsiPFit); | |
563 | TLatex *psiplatex = new TLatex(4.,0.106*histo->GetMaximum(),psiptext); | |
564 | psiplatex->SetTextColor(2); | |
565 | psiplatex->SetTextSize(0.03); | |
566 | psiplatex->SetTextAlign(2); | |
567 | psiplatex->Draw(); | |
568 | ||
569 | char psip2text[100]; | |
570 | sprintf(psip2text,"#psi(2S) m=%4.3f GeV #sigma= %4.2f MeV",meanPsiP,sigPsiP); | |
571 | printf("psi(2S) m= %4.3f GeV sigma= %4.2f MeV\n",meanPsiP,sigPsiP); | |
572 | TLatex *psip2latex = new TLatex(4.,0.053*histo->GetMaximum(),psip2text); | |
573 | psip2latex->SetTextColor(2); | |
574 | psip2latex->SetTextSize(0.03); | |
575 | psip2latex->SetTextAlign(2); | |
576 | psip2latex->Draw(); | |
577 | ||
c5c5bf9c | 578 | char chi2text[100]; |
f032e1ac | 579 | sprintf(chi2text,"#chi^2/ndf = %4.2f ",chi2/ndf); |
580 | printf("chi^2/ndf = %4.2f\n",chi2/ndf); | |
581 | TLatex *chi2latex = new TLatex(4.,0.026*histo->GetMaximum(),chi2text); | |
c5c5bf9c | 582 | chi2latex->SetTextColor(2); |
583 | chi2latex->SetTextSize(0.03); | |
584 | chi2latex->SetTextAlign(2); | |
585 | chi2latex->Draw(); | |
e4dddba1 | 586 | printf("\n****************************************************************************\n"); |
587 | ||
588 | } | |
589 | ||
590 |