]>
Commit | Line | Data |
---|---|---|
7cd8a4ce | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, 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 | ||
16 | //----------------------------------------------------------------------- | |
17 | // Example of task (running locally, on AliEn and CAF), | |
18 | // which provides standard way of calculating acceptance and efficiency | |
19 | // between different steps of the procedure. | |
20 | // The ouptut of the task is a AliCFContainer from which the efficiencies | |
21 | // can be calculated | |
22 | //----------------------------------------------------------------------- | |
23 | // Author : R. Vernet, Consorzio Cometa - Catania (it) | |
24 | //----------------------------------------------------------------------- | |
25 | // Modification done by X. Lopez - LPC Clermont (fr) | |
26 | //----------------------------------------------------------------------- | |
27 | ||
28 | ||
29 | #ifndef ALICFMUONRESTASK1_CXX | |
30 | #define ALICFMUONRESTASK1_CXX | |
31 | ||
32 | #include "AliCFMuonResTask1.h" | |
33 | #include "AliHeader.h" | |
34 | #include "AliESDHeader.h" | |
35 | #include "AliStack.h" | |
36 | #include "TParticle.h" | |
37 | #include "TLorentzVector.h" | |
38 | #include "TH1I.h" | |
39 | #include "AliMCEvent.h" | |
40 | #include "AliAnalysisManager.h" | |
41 | #include "AliESDEvent.h" | |
42 | #include "AliAODEvent.h" | |
43 | #include "AliCFManager.h" | |
44 | #include "AliCFCutBase.h" | |
45 | #include "AliCFContainer.h" | |
46 | #include "TChain.h" | |
47 | #include "AliESDtrack.h" | |
48 | #include "AliLog.h" | |
49 | #include "AliESDMuonTrack.h" | |
50 | #include "AliESDtrack.h" | |
51 | #include "AliESDInputHandler.h" | |
52 | #include "TCanvas.h" | |
53 | ||
54 | ClassImp(AliCFMuonResTask1) | |
55 | ||
56 | //__________________________________________________________________________ | |
57 | AliCFMuonResTask1::AliCFMuonResTask1() : | |
58 | fReadAODData(0), | |
59 | fCFManager(0x0), | |
60 | fQAHistList(0x0), | |
61 | fHistEventsProcessed(0x0), | |
62 | fNevt(0) | |
63 | { | |
64 | // | |
65 | //Default ctor | |
66 | // | |
67 | } | |
68 | //___________________________________________________________________________ | |
69 | AliCFMuonResTask1::AliCFMuonResTask1(const Char_t* name) : | |
70 | AliAnalysisTaskSE(name), | |
71 | fReadAODData(0), | |
72 | fCFManager(0x0), | |
73 | fQAHistList(0x0), | |
74 | fHistEventsProcessed(0x0), | |
75 | fNevt(0) | |
76 | { | |
77 | // | |
78 | // Constructor. Initialization of Inputs and Outputs | |
79 | // | |
80 | Info("AliCFMuonResTask1","Calling Constructor"); | |
81 | ||
82 | fHistEventsProcessed = new TH1I("fHistEventsProcessed","",1,0,1) ; | |
83 | ||
84 | DefineOutput(1,TH1I::Class()); | |
85 | DefineOutput(2,AliCFContainer::Class()); | |
86 | ||
87 | } | |
88 | ||
89 | //___________________________________________________________________________ | |
90 | AliCFMuonResTask1& AliCFMuonResTask1::operator=(const AliCFMuonResTask1& c) | |
91 | { | |
92 | // | |
93 | // Assignment operator | |
94 | // | |
95 | if (this!=&c) { | |
96 | AliAnalysisTaskSE::operator=(c) ; | |
97 | fReadAODData = c.fReadAODData ; | |
98 | fCFManager = c.fCFManager; | |
99 | fQAHistList = c.fQAHistList ; | |
100 | fHistEventsProcessed = c.fHistEventsProcessed; | |
101 | fNevt = c.fNevt ; | |
102 | } | |
103 | return *this; | |
104 | } | |
105 | ||
106 | //___________________________________________________________________________ | |
107 | AliCFMuonResTask1::AliCFMuonResTask1(const AliCFMuonResTask1& c) : | |
108 | AliAnalysisTaskSE(c), | |
109 | fReadAODData(c.fReadAODData), | |
110 | fCFManager(c.fCFManager), | |
111 | fQAHistList(c.fQAHistList), | |
112 | fHistEventsProcessed(c.fHistEventsProcessed), | |
113 | fNevt(c.fNevt) | |
114 | { | |
115 | // | |
116 | // Copy Constructor | |
117 | // | |
118 | } | |
119 | ||
120 | //___________________________________________________________________________ | |
121 | AliCFMuonResTask1::~AliCFMuonResTask1() { | |
122 | // | |
123 | //destructor | |
124 | // | |
125 | Info("~AliCFMuonResTask1","Calling Destructor"); | |
126 | if (fCFManager) delete fCFManager ; | |
127 | if (fHistEventsProcessed) delete fHistEventsProcessed ; | |
128 | if (fQAHistList) {fQAHistList->Clear(); delete fQAHistList;} | |
129 | } | |
130 | ||
131 | //_________________________________________________ | |
132 | void AliCFMuonResTask1::UserExec(Option_t *) | |
133 | { | |
134 | // | |
135 | // Main loop function | |
136 | // | |
137 | ||
138 | Info("UserExec","") ; | |
139 | if (!fMCEvent) { | |
140 | Error("UserExec","NO MC EVENT FOUND!"); | |
141 | return; | |
142 | } | |
143 | ||
144 | fNevt++; | |
145 | Double_t containerInput[13] ; | |
146 | Double_t BeamEnergy=7000; | |
147 | ||
148 | //////// | |
149 | //// MC | |
150 | //////// | |
151 | ||
152 | fCFManager->SetEventInfo(fMCEvent); | |
153 | AliStack* stack = fMCEvent->Stack(); | |
154 | ||
155 | // loop on the MC event | |
156 | for (Int_t ipart=0; ipart<fMCEvent->GetNumberOfTracks(); ipart++) { | |
157 | AliMCParticle *mcPart = fMCEvent->GetTrack(ipart); | |
158 | ||
159 | TParticle *part = mcPart->Particle(); | |
160 | TParticle *part0 = mcPart->Particle(); | |
161 | TParticle *part1 = mcPart->Particle(); | |
162 | ||
163 | // Selection of the resonance | |
164 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcPart)) continue; | |
165 | ||
166 | // Mother kinematics | |
167 | Float_t e = part->Energy(); | |
168 | Float_t pz = part->Pz(); | |
169 | //Float_t py = part->Py(); | |
170 | //Float_t px = part->Px(); | |
171 | Float_t rapmc = Rap(e,pz); | |
172 | //Float_t mass = part->GetCalcMass(); | |
173 | ||
174 | // Decays kinematics | |
175 | ||
176 | Int_t p0 = part->GetDaughter(0); | |
177 | part0 = stack->Particle(p0); | |
178 | // selection of the rapidity for first muon | |
179 | AliMCParticle *mcpart0 = new AliMCParticle(part0); | |
180 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mcpart0)) continue; | |
181 | Int_t pdg0 = part0->GetPdgCode(); | |
182 | ||
183 | Int_t p1 = part->GetDaughter(1); | |
184 | part1 = stack->Particle(p1); | |
185 | // selection of the rapidity for second muon | |
186 | AliMCParticle *mcpart1 = new AliMCParticle(part1); | |
187 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mcpart1)) continue; | |
188 | Int_t pdg1 = part1->GetPdgCode(); | |
189 | ||
190 | // 0 mu- 1 mu+ | |
191 | Float_t e0=-999, pz0=-999, py0=-999, px0=-999, phi0=-999, rapmc0=-999; | |
192 | Float_t e1=-999, pz1=-999, py1=-999, px1=-999, phi1=-999, rapmc1=-999; | |
193 | Double_t charge0=-999, charge1=-999; | |
194 | ||
195 | // ordering sign: first = mu- | |
196 | if(pdg0==13){ | |
197 | e0 = part0->Energy(); | |
198 | pz0 = part0->Pz(); | |
199 | py0 = part0->Py(); | |
200 | px0 = part0->Px(); | |
201 | phi0 = part0->Phi(); | |
202 | phi0 = Phideg(phi0); | |
203 | rapmc0=Rap(e0,pz0); | |
204 | charge0 = part0->GetPDG()->Charge()/3; | |
205 | ||
206 | e1 = part1->Energy(); | |
207 | pz1 = part1->Pz(); | |
208 | py1 = part1->Py(); | |
209 | px1 = part1->Px(); | |
210 | phi1 = part1->Phi(); | |
211 | phi1 = Phideg(phi1); | |
212 | rapmc1=Rap(e1,pz1); | |
213 | charge1 = part1->GetPDG()->Charge()/3; | |
214 | } | |
215 | else{ | |
216 | if(pdg0==-13){ | |
217 | e1 = part0->Energy(); | |
218 | pz1 = part0->Pz(); | |
219 | py1 = part0->Py(); | |
220 | px1 = part0->Px(); | |
221 | phi1 = part0->Phi(); | |
222 | phi1 = Phideg(phi1); | |
223 | rapmc1=Rap(e1,pz1); | |
224 | charge1 = part0->GetPDG()->Charge()/3; | |
225 | ||
226 | e0 = part1->Energy(); | |
227 | pz0 = part1->Pz(); | |
228 | py0 = part1->Py(); | |
229 | px0 = part1->Px(); | |
230 | phi0 = part1->Phi(); | |
231 | phi0 = Phideg(phi0); | |
232 | rapmc0=Rap(e0,pz0); | |
233 | charge0 = part1->GetPDG()->Charge()/3; | |
234 | } | |
235 | } | |
236 | ||
237 | if(pdg0==13 || pdg1==13) { | |
238 | ||
239 | Float_t pmc = TMath::Sqrt((px0+px1)*(px0+px1)+(py0+py1)*(py0+py1)+ | |
240 | (pz0+pz1)*(pz0+pz1)); | |
241 | Float_t ptmc = TMath::Sqrt((px0+px1)*(px0+px1)+(py0+py1)*(py0+py1)); | |
242 | Float_t imassmc = Imass(e0,px0,py0,pz0,e1,px1,py1,pz1); | |
243 | //Float_t rapmc_check=Rap((e0+e1),(pz0+pz1)); | |
244 | ||
245 | Double_t costCS = CostCS((Double_t) px0,(Double_t) py0,(Double_t) pz0,(Double_t) e0, (Double_t)charge0,(Double_t) px1,(Double_t) py1,(Double_t) pz1,(Double_t) e1, BeamEnergy); | |
246 | Double_t costHE = CostHE((Double_t) px0,(Double_t) py0,(Double_t) pz0,(Double_t) e0, (Double_t)charge0,(Double_t) px1,(Double_t) py1,(Double_t) pz1,(Double_t) e1); | |
247 | Double_t phiCS = PhiCS((Double_t) px0,(Double_t) py0,(Double_t) pz0,(Double_t) e0, (Double_t)charge0,(Double_t) px1,(Double_t) py1,(Double_t) pz1,(Double_t) e1, BeamEnergy); | |
248 | Double_t phiHE = PhiHE((Double_t) px0,(Double_t) py0,(Double_t) pz0,(Double_t) e0, (Double_t)charge0,(Double_t) px1,(Double_t) py1,(Double_t) pz1,(Double_t) e1, BeamEnergy); | |
249 | ||
250 | containerInput[0] = fNevt+0.5 ; | |
251 | containerInput[1] = rapmc0 ; | |
252 | containerInput[2] = phi0 ; | |
253 | containerInput[3] = rapmc1 ; | |
254 | containerInput[4] = phi1 ; | |
255 | containerInput[5] = imassmc ; | |
256 | containerInput[6] = rapmc ; | |
257 | containerInput[7] = ptmc; | |
258 | containerInput[8] = pmc; | |
259 | containerInput[9] = costCS; | |
260 | containerInput[10] = phiCS; | |
261 | containerInput[11] = costHE; | |
262 | containerInput[12] = phiHE; | |
263 | ||
264 | // fill the container at the first step | |
265 | fCFManager->GetParticleContainer()->Fill(containerInput,0); | |
266 | } | |
267 | } | |
268 | ||
269 | //////// | |
270 | //// ESD | |
271 | //////// | |
272 | ||
273 | AliESDEvent *fESD; | |
274 | AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> | |
275 | (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
276 | fESD = esdH->GetEvent(); | |
277 | Int_t mult1 = fESD->GetNumberOfMuonTracks() ; | |
278 | ||
279 | ||
280 | for (Int_t j = 0; j<mult1; j++) { | |
281 | AliESDMuonTrack* mu1 = new AliESDMuonTrack(*(fESD->GetMuonTrack(j))); | |
282 | Float_t zr1 = mu1->Charge(); | |
283 | // Select mu- | |
284 | if(zr1<0){ | |
285 | Float_t pxr1 = mu1->Px(); | |
286 | Float_t pyr1 = mu1->Py(); | |
287 | Float_t pzr1 = mu1->Pz(); | |
288 | Float_t phir1 = mu1->Phi(); | |
289 | phir1=Phideg(phir1); | |
290 | Float_t er1 = mu1->E(); | |
291 | Float_t rap1=Rap(er1,pzr1); | |
292 | // selection of the rapidity for first muon | |
293 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mu1)) continue; | |
294 | ||
295 | for (Int_t jj = 0; jj<mult1; jj++) { | |
296 | AliESDMuonTrack* mu2 = new AliESDMuonTrack(*(fESD->GetMuonTrack(jj))); | |
297 | Float_t zr2 = mu2->Charge(); | |
298 | // Select mu+ | |
299 | if(zr2>0 && jj !=j){ | |
300 | Float_t pxr2 = mu2->Px(); | |
301 | Float_t pyr2 = mu2->Py(); | |
302 | Float_t pzr2 = mu2->Pz(); | |
303 | Float_t phir2 = mu2->Phi(); | |
304 | phir2 = Phideg(phir2); | |
305 | Float_t er2 = mu2->E(); | |
306 | Float_t rap2=Rap(er2,pzr2); | |
307 | // selection of the rapidity for second muon | |
308 | if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mu2)) continue; | |
309 | ||
310 | Float_t prec = TMath::Sqrt((pxr1+pxr2)*(pxr1+pxr2)+(pyr1+pyr2)*(pyr1+pyr2)+ | |
311 | (pzr1+pzr2)*(pzr1+pzr2)); | |
312 | Float_t ptrec = TMath::Sqrt((pxr1+pxr2)*(pxr1+pxr2)+(pyr1+pyr2)*(pyr1+pyr2)); | |
313 | Float_t raprec=Rap((er1+er2),(pzr1+pzr2)); | |
314 | Float_t imassrec = Imass(er1,pxr1,pyr1,pzr1,er2,pxr2,pyr2,pzr2); | |
315 | ||
316 | Double_t costCSrec = CostCS((Double_t) pxr1,(Double_t) pyr1,(Double_t)pzr1,(Double_t) er1, (Double_t)zr1,(Double_t) pxr2,(Double_t) pyr2,(Double_t)pzr2,(Double_t) er2, BeamEnergy); | |
317 | Double_t costHErec = CostHE((Double_t) pxr1,(Double_t) pyr1,(Double_t)pzr1,(Double_t) er1, (Double_t)zr1,(Double_t) pxr2,(Double_t) pyr2,(Double_t)pzr2,(Double_t) er2); | |
318 | Double_t phiCSrec = PhiCS((Double_t) pxr1,(Double_t) pyr1,(Double_t)pzr1,(Double_t) er1, (Double_t)zr1,(Double_t) pxr2,(Double_t) pyr2,(Double_t)pzr2,(Double_t) er2, BeamEnergy); | |
319 | Double_t phiHErec = PhiHE((Double_t) pxr1,(Double_t) pyr1,(Double_t)pzr1,(Double_t) er1, (Double_t)zr1,(Double_t) pxr2,(Double_t) pyr2,(Double_t)pzr2,(Double_t) er2, BeamEnergy); | |
320 | ||
321 | containerInput[0] = fNevt+0.5 ; | |
322 | containerInput[1] = rap1 ; | |
323 | containerInput[2] = phir1 ; | |
324 | containerInput[3] = rap2 ; | |
325 | containerInput[4] = phir2 ; | |
326 | containerInput[5] = imassrec ; | |
327 | containerInput[6] = raprec ; | |
328 | containerInput[7] = ptrec; | |
329 | containerInput[8] = prec; | |
330 | containerInput[9] = costCSrec; | |
331 | containerInput[10] = phiCSrec; | |
332 | containerInput[11] = costHErec; | |
333 | containerInput[12] = phiHErec; | |
334 | ||
335 | // fill the container at the second step | |
336 | fCFManager->GetParticleContainer()->Fill(containerInput,1); | |
337 | ||
338 | } // mu+ Selection | |
339 | } // second mu Loop | |
340 | } // mu- Selection | |
341 | } | |
342 | ||
343 | // ---------- | |
344 | fHistEventsProcessed->Fill(0); | |
345 | PostData(1,fHistEventsProcessed) ; | |
346 | PostData(2,fCFManager->GetParticleContainer()) ; | |
347 | } | |
348 | //________________________________________________________________________ | |
349 | const Float_t AliCFMuonResTask1::Imass(Float_t e1, Float_t px1, Float_t py1, Float_t pz1, | |
350 | Float_t e2, Float_t px2, Float_t py2, Float_t pz2) | |
351 | { | |
352 | // invariant mass calculation | |
353 | Float_t imassrec = TMath::Sqrt((e1+e2)*(e1+e2)-((px1+px2)*(px1+px2)+ | |
354 | (py1+py2)*(py1+py2)+(pz1+pz2)*(pz1+pz2))); | |
355 | return imassrec; | |
356 | } | |
357 | //________________________________________________________________________ | |
358 | const Float_t AliCFMuonResTask1::Rap(Float_t e, Float_t pz) | |
359 | { | |
360 | // calculate rapidity | |
361 | Float_t rap; | |
362 | if(e!=pz){ | |
363 | rap = 0.5*TMath::Log((e+pz)/(e-pz)); | |
364 | return rap; | |
365 | } | |
366 | else{ | |
367 | rap = -200; | |
368 | return rap; | |
369 | } | |
370 | } | |
371 | //________________________________________________________________________ | |
372 | const Float_t AliCFMuonResTask1::Phideg(Float_t phi) | |
373 | { | |
374 | // calculate Phi in range [-180,180] | |
375 | Float_t phideg; | |
376 | ||
377 | phideg = phi-TMath::Pi(); | |
378 | phideg = phideg*57.296; | |
379 | return phideg; | |
380 | } | |
381 | //________________________________________________________________________ | |
382 | const Double_t AliCFMuonResTask1::CostCS(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
383 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2, | |
384 | Double_t Energy) | |
385 | { | |
386 | TLorentzVector PMu1CM, PMu2CM, PProjCM, PTargCM, PDimuCM; // In the CM. frame | |
387 | TLorentzVector PMu1Dimu, PMu2Dimu, PProjDimu, PTargDimu; // In the dimuon rest frame | |
388 | TVector3 beta,zaxisCS; | |
389 | Double_t mp=0.93827231; | |
390 | // | |
391 | // --- Fill the Lorentz vector for projectile and target in the CM frame | |
392 | // | |
393 | PProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
394 | PTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
395 | // | |
396 | // --- Get the muons parameters in the CM frame | |
397 | // | |
398 | PMu1CM.SetPxPyPzE(px1,py1,pz1,e1); | |
399 | PMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
400 | // | |
401 | // --- Obtain the dimuon parameters in the CM frame | |
402 | // | |
403 | PDimuCM=PMu1CM+PMu2CM; | |
404 | // | |
405 | // --- Translate the dimuon parameters in the dimuon rest frame | |
406 | // | |
407 | beta=(-1./PDimuCM.E())*PDimuCM.Vect(); | |
408 | PMu1Dimu=PMu1CM; | |
409 | PMu2Dimu=PMu2CM; | |
410 | PProjDimu=PProjCM; | |
411 | PTargDimu=PTargCM; | |
412 | PMu1Dimu.Boost(beta); | |
413 | PMu2Dimu.Boost(beta); | |
414 | PProjDimu.Boost(beta); | |
415 | PTargDimu.Boost(beta); | |
416 | // | |
417 | // --- Determine the z axis for the CS angle | |
418 | // | |
419 | zaxisCS=(((PProjDimu.Vect()).Unit())-((PTargDimu.Vect()).Unit())).Unit(); | |
420 | // | |
421 | // --- Determine the CS angle (angle between mu+ and the z axis defined above) | |
422 | Double_t cost; | |
423 | ||
424 | if(charge1>0) cost = zaxisCS.Dot((PMu1Dimu.Vect()).Unit()); | |
425 | else cost = zaxisCS.Dot((PMu2Dimu.Vect()).Unit()); | |
426 | return cost; | |
427 | } | |
428 | //________________________________________________________________________ | |
429 | ||
430 | //________________________________________________________________________ | |
431 | const Double_t AliCFMuonResTask1::CostHE(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
432 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2) | |
433 | { | |
434 | TLorentzVector PMu1CM, PMu2CM, PDimuCM; // In the CM frame | |
435 | TLorentzVector PMu1Dimu, PMu2Dimu; // In the dimuon rest frame | |
436 | TVector3 beta,zaxisCS; | |
437 | // | |
438 | // --- Get the muons parameters in the CM frame | |
439 | // | |
440 | PMu1CM.SetPxPyPzE(px1,py1,pz1,e1); | |
441 | PMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
442 | // | |
443 | // --- Obtain the dimuon parameters in the CM frame | |
444 | // | |
445 | PDimuCM=PMu1CM+PMu2CM; | |
446 | // | |
447 | // --- Translate the muon parameters in the dimuon rest frame | |
448 | // | |
449 | beta=(-1./PDimuCM.E())*PDimuCM.Vect(); | |
450 | PMu1Dimu=PMu1CM; | |
451 | PMu2Dimu=PMu2CM; | |
452 | PMu1Dimu.Boost(beta); | |
453 | PMu2Dimu.Boost(beta); | |
454 | // | |
455 | // --- Determine the z axis for the calculation of the polarization angle (i.e. the direction of the dimuon in the CM system) | |
456 | // | |
457 | TVector3 zaxis; | |
458 | zaxis=(PDimuCM.Vect()).Unit(); | |
459 | ||
460 | // --- Calculation of the polarization angle (angle between mu+ and the z axis defined above) | |
461 | Double_t cost; | |
462 | if(charge1>0) cost = zaxis.Dot((PMu1Dimu.Vect()).Unit()); | |
463 | else cost = zaxis.Dot((PMu2Dimu.Vect()).Unit()); | |
464 | ||
465 | return cost; | |
466 | } | |
467 | //________________________________________________________________________ | |
468 | ||
469 | //________________________________________________________________________ | |
470 | const Double_t AliCFMuonResTask1::PhiCS(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
471 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2, | |
472 | Double_t Energy) | |
473 | { | |
474 | TLorentzVector PMu1CM, PMu2CM, PProjCM, PTargCM, PDimuCM; // In the CM frame | |
475 | TLorentzVector PMu1Dimu, PMu2Dimu, PProjDimu, PTargDimu; // In the dimuon rest frame | |
476 | TVector3 beta,yaxisCS, xaxisCS, zaxisCS; | |
477 | Double_t mp=0.93827231; | |
478 | // | |
479 | // --- Fill the Lorentz vector for projectile and target in the CM frame | |
480 | // | |
481 | PProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
482 | PTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
483 | // | |
484 | // --- Get the muons parameters in the CM frame | |
485 | // | |
486 | PMu1CM.SetPxPyPzE(px1,py1,pz1,e1); | |
487 | PMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
488 | // | |
489 | // --- Obtain the dimuon parameters in the CM frame | |
490 | // | |
491 | PDimuCM=PMu1CM+PMu2CM; | |
492 | // | |
493 | // --- Translate the dimuon parameters in the dimuon rest frame | |
494 | // | |
495 | beta=(-1./PDimuCM.E())*PDimuCM.Vect(); | |
496 | PMu1Dimu=PMu1CM; | |
497 | PMu2Dimu=PMu2CM; | |
498 | PProjDimu=PProjCM; | |
499 | PTargDimu=PTargCM; | |
500 | PMu1Dimu.Boost(beta); | |
501 | PMu2Dimu.Boost(beta); | |
502 | PProjDimu.Boost(beta); | |
503 | PTargDimu.Boost(beta); | |
504 | // | |
505 | // --- Determine the z axis for the CS angle | |
506 | // | |
507 | zaxisCS=(((PProjDimu.Vect()).Unit())-((PTargDimu.Vect()).Unit())).Unit(); | |
508 | yaxisCS=(((PProjDimu.Vect()).Unit()).Cross((PTargDimu.Vect()).Unit())).Unit(); | |
509 | xaxisCS=(yaxisCS.Cross(zaxisCS)).Unit(); | |
510 | ||
511 | Double_t phi; | |
512 | if(charge1>0) phi = TMath::ATan2((PMu1Dimu.Vect()).Dot(yaxisCS),((PMu1Dimu.Vect()).Dot(xaxisCS))); | |
513 | else phi = TMath::ATan2((PMu2Dimu.Vect()).Dot(yaxisCS),((PMu2Dimu.Vect()).Dot(xaxisCS))); | |
514 | ||
515 | return phi; | |
516 | } | |
517 | //________________________________________________________________________ | |
518 | ||
519 | //________________________________________________________________________ | |
520 | const Double_t AliCFMuonResTask1::PhiHE(Double_t px1, Double_t py1, Double_t pz1, Double_t e1, | |
521 | Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2, Double_t Energy) | |
522 | { | |
523 | TLorentzVector PMu1CM, PMu2CM, PProjCM, PTargCM, PDimuCM; // In the CM frame | |
524 | TLorentzVector PMu1Dimu, PMu2Dimu, PProjDimu, PTargDimu; // In the dimuon rest frame | |
525 | TVector3 beta,xaxis,yaxis,zaxis; | |
526 | Double_t mp=0.93827231; | |
527 | ||
528 | // | |
529 | // --- Get the muons parameters in the CM frame | |
530 | // | |
531 | PMu1CM.SetPxPyPzE(px1,py1,pz1,e1); | |
532 | PMu2CM.SetPxPyPzE(px2,py2,pz2,e2); | |
533 | // | |
534 | // --- Obtain the dimuon parameters in the CM frame | |
535 | // | |
536 | PDimuCM=PMu1CM+PMu2CM; | |
537 | // | |
538 | // --- Translate the muon parameters in the dimuon rest frame | |
539 | // | |
540 | zaxis=(PDimuCM.Vect()).Unit(); | |
541 | ||
542 | beta=(-1./PDimuCM.E())*PDimuCM.Vect(); | |
543 | ||
544 | PProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
545 | PTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp)); | |
546 | ||
547 | PProjDimu=PProjCM; | |
548 | PTargDimu=PTargCM; | |
549 | ||
550 | PProjDimu.Boost(beta); | |
551 | PTargDimu.Boost(beta); | |
552 | ||
553 | yaxis=((PProjDimu.Vect()).Cross(PTargDimu.Vect())).Unit(); | |
554 | xaxis=(yaxis.Cross(zaxis)).Unit(); | |
555 | ||
556 | PMu1Dimu=PMu1CM; | |
557 | PMu2Dimu=PMu2CM; | |
558 | PMu1Dimu.Boost(beta); | |
559 | PMu2Dimu.Boost(beta); | |
560 | ||
561 | Double_t phi; | |
562 | if(charge1>0) phi = TMath::ATan2((PMu1Dimu.Vect()).Dot(yaxis),(PMu1Dimu.Vect()).Dot(xaxis)); | |
563 | else phi = TMath::ATan2((PMu2Dimu.Vect()).Dot(yaxis),(PMu2Dimu.Vect()).Dot(xaxis)); | |
564 | ||
565 | return phi; | |
566 | } | |
567 | ||
568 | //________________________________________________________________________ | |
569 | void AliCFMuonResTask1::Terminate(Option_t *) | |
570 | { | |
571 | // draw result of the Invariant mass MC and ESD | |
572 | ||
573 | AliCFContainer *cont = dynamic_cast<AliCFContainer*> (GetOutputData(2)); | |
574 | ||
575 | TH1D *kmass = cont->ShowProjection(5,0); | |
576 | TH1D *rmass = cont->ShowProjection(5,1); | |
577 | TH1D *kcostCS = cont->ShowProjection(9,0); | |
578 | TH1D *rcostCS = cont->ShowProjection(9,1); | |
579 | ||
580 | TCanvas *c1 = new TCanvas("AliCFMuonResTask1","JPSI MC & ESD",10,10,510,510); | |
581 | c1->Divide(2,2); | |
582 | c1->cd(1); | |
583 | kmass->Draw("HIST"); | |
584 | c1->cd(2); | |
585 | rmass->Draw("HIST"); | |
586 | c1->cd(3); | |
587 | kcostCS->Draw("HIST"); | |
588 | c1->cd(4); | |
589 | rcostCS->Draw("HIST"); | |
590 | } | |
591 | //________________________________________________________________________ | |
592 | ||
593 | #endif |