1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-----------------------------------------------------------------------
19 // Example of task (running locally, on AliEn and CAF),
20 // which provides standard way of calculating acceptance and efficiency
21 // between different steps of the procedure.
22 // The ouptut of the task is a AliCFContainer from which the efficiencies
24 //-----------------------------------------------------------------------
25 // Author : R. Vernet, Consorzio Cometa - Catania (it)
26 //-----------------------------------------------------------------------
27 // Modification done by X. Lopez - LPC Clermont (fr)
28 //-----------------------------------------------------------------------
31 #ifndef ALICFMUONRESTASK1_CXX
32 #define ALICFMUONRESTASK1_CXX
34 #include "AliCFMuonResTask1.h"
35 #include "AliHeader.h"
36 #include "AliESDHeader.h"
38 #include "TParticle.h"
39 #include "TLorentzVector.h"
41 #include "AliMCEvent.h"
42 #include "AliAnalysisManager.h"
43 #include "AliESDEvent.h"
44 #include "AliAODEvent.h"
45 #include "AliCFManager.h"
46 #include "AliCFCutBase.h"
47 #include "AliCFContainer.h"
49 #include "AliESDtrack.h"
51 #include "AliESDMuonTrack.h"
52 #include "AliESDtrack.h"
53 #include "AliESDInputHandler.h"
56 ClassImp(AliCFMuonResTask1)
58 //__________________________________________________________________________
59 AliCFMuonResTask1::AliCFMuonResTask1() :
63 fHistEventsProcessed(0x0),
70 //___________________________________________________________________________
71 AliCFMuonResTask1::AliCFMuonResTask1(const Char_t* name) :
72 AliAnalysisTaskSE(name),
76 fHistEventsProcessed(0x0),
80 // Constructor. Initialization of Inputs and Outputs
82 Info("AliCFMuonResTask1","Calling Constructor");
84 fHistEventsProcessed = new TH1I("fHistEventsProcessed","",1,0,1) ;
86 DefineOutput(1,TH1I::Class());
87 DefineOutput(2,AliCFContainer::Class());
91 //___________________________________________________________________________
92 AliCFMuonResTask1& AliCFMuonResTask1::operator=(const AliCFMuonResTask1& c)
95 // Assignment operator
98 AliAnalysisTaskSE::operator=(c) ;
99 fReadAODData = c.fReadAODData ;
100 fCFManager = c.fCFManager;
101 fQAHistList = c.fQAHistList ;
102 fHistEventsProcessed = c.fHistEventsProcessed;
108 //___________________________________________________________________________
109 AliCFMuonResTask1::AliCFMuonResTask1(const AliCFMuonResTask1& c) :
110 AliAnalysisTaskSE(c),
111 fReadAODData(c.fReadAODData),
112 fCFManager(c.fCFManager),
113 fQAHistList(c.fQAHistList),
114 fHistEventsProcessed(c.fHistEventsProcessed),
122 //___________________________________________________________________________
123 AliCFMuonResTask1::~AliCFMuonResTask1() {
127 Info("~AliCFMuonResTask1","Calling Destructor");
128 if (fCFManager) delete fCFManager ;
129 if (fHistEventsProcessed) delete fHistEventsProcessed ;
130 if (fQAHistList) {fQAHistList->Clear(); delete fQAHistList;}
133 //_________________________________________________
134 void AliCFMuonResTask1::UserExec(Option_t *)
137 // Main loop function
140 Info("UserExec"," ") ;
142 Error("UserExec","NO MC EVENT FOUND!");
147 Double_t containerInput[13] ;
148 Double_t beamEnergy=7000;
154 fCFManager->SetMCEventInfo(fMCEvent);
155 AliStack* stack = fMCEvent->Stack();
157 // loop on the MC event
158 for (Int_t ipart=0; ipart<fMCEvent->GetNumberOfTracks(); ipart++) {
159 AliMCParticle *mcPart = (AliMCParticle*) fMCEvent->GetTrack(ipart);
161 TParticle *part = mcPart->Particle();
163 // Selection of the resonance
164 if (!fCFManager->CheckParticleCuts(AliCFManager::kPartGenCuts,mcPart)) continue;
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();
176 Int_t p0 = part->GetDaughter(0);
177 TParticle *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();
183 Int_t p1 = part->GetDaughter(1);
184 TParticle *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();
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;
195 // ordering sign: first = mu-
197 e0 = part0->Energy();
204 charge0 = part0->GetPDG()->Charge()/3;
206 e1 = part1->Energy();
213 charge1 = part1->GetPDG()->Charge()/3;
217 e1 = part0->Energy();
224 charge1 = part0->GetPDG()->Charge()/3;
226 e0 = part1->Energy();
233 charge0 = part1->GetPDG()->Charge()/3;
237 if(pdg0==13 || pdg1==13) {
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));
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);
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;
264 // fill the container at the first step
265 fCFManager->GetParticleContainer()->Fill(containerInput,0);
274 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>
275 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
278 AliError("Cannot get input event handler");
282 fESD = esdH->GetEvent();
283 Int_t mult1 = fESD->GetNumberOfMuonTracks() ;
286 for (Int_t j = 0; j<mult1; j++) {
287 AliESDMuonTrack* mu1 = new AliESDMuonTrack(*(fESD->GetMuonTrack(j)));
288 Float_t zr1 = mu1->Charge();
291 Float_t pxr1 = mu1->Px();
292 Float_t pyr1 = mu1->Py();
293 Float_t pzr1 = mu1->Pz();
294 Float_t phir1 = mu1->Phi();
296 Float_t er1 = mu1->E();
297 Float_t rap1=Rap(er1,pzr1);
298 // selection of the rapidity for first muon
299 if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mu1)) continue;
301 for (Int_t jj = 0; jj<mult1; jj++) {
302 AliESDMuonTrack* mu2 = new AliESDMuonTrack(*(fESD->GetMuonTrack(jj)));
303 Float_t zr2 = mu2->Charge();
306 Float_t pxr2 = mu2->Px();
307 Float_t pyr2 = mu2->Py();
308 Float_t pzr2 = mu2->Pz();
309 Float_t phir2 = mu2->Phi();
310 phir2 = Phideg(phir2);
311 Float_t er2 = mu2->E();
312 Float_t rap2=Rap(er2,pzr2);
313 // selection of the rapidity for second muon
314 if (!fCFManager->CheckParticleCuts(AliCFManager::kPartAccCuts,mu2)) continue;
316 Float_t prec = TMath::Sqrt((pxr1+pxr2)*(pxr1+pxr2)+(pyr1+pyr2)*(pyr1+pyr2)+
317 (pzr1+pzr2)*(pzr1+pzr2));
318 Float_t ptrec = TMath::Sqrt((pxr1+pxr2)*(pxr1+pxr2)+(pyr1+pyr2)*(pyr1+pyr2));
319 Float_t raprec=Rap((er1+er2),(pzr1+pzr2));
320 Float_t imassrec = Imass(er1,pxr1,pyr1,pzr1,er2,pxr2,pyr2,pzr2);
322 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);
323 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);
324 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);
325 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);
327 containerInput[0] = fNevt+0.5 ;
328 containerInput[1] = rap1 ;
329 containerInput[2] = phir1 ;
330 containerInput[3] = rap2 ;
331 containerInput[4] = phir2 ;
332 containerInput[5] = imassrec ;
333 containerInput[6] = raprec ;
334 containerInput[7] = ptrec;
335 containerInput[8] = prec;
336 containerInput[9] = costCSrec;
337 containerInput[10] = phiCSrec;
338 containerInput[11] = costHErec;
339 containerInput[12] = phiHErec;
341 // fill the container at the second step
342 fCFManager->GetParticleContainer()->Fill(containerInput,1);
350 fHistEventsProcessed->Fill(0);
351 PostData(1,fHistEventsProcessed) ;
352 PostData(2,fCFManager->GetParticleContainer()) ;
354 //________________________________________________________________________
355 Float_t AliCFMuonResTask1::Imass(Float_t e1, Float_t px1, Float_t py1, Float_t pz1,
356 Float_t e2, Float_t px2, Float_t py2, Float_t pz2) const
358 // invariant mass calculation
359 Float_t imassrec = TMath::Sqrt((e1+e2)*(e1+e2)-((px1+px2)*(px1+px2)+
360 (py1+py2)*(py1+py2)+(pz1+pz2)*(pz1+pz2)));
363 //________________________________________________________________________
364 Float_t AliCFMuonResTask1::Rap(Float_t e, Float_t pz) const
366 // calculate rapidity
368 if(TMath::Abs(e-pz)>1e-7){
369 rap = 0.5*TMath::Log((e+pz)/(e-pz));
377 //________________________________________________________________________
378 Float_t AliCFMuonResTask1::Phideg(Float_t phi) const
380 // calculate Phi in range [-180,180]
383 phideg = phi-TMath::Pi();
384 phideg = phideg*57.296;
387 //________________________________________________________________________
388 Double_t AliCFMuonResTask1::CostCS(Double_t px1, Double_t py1, Double_t pz1, Double_t e1,
389 Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2,
393 TLorentzVector pMu1CM, pMu2CM, pProjCM, pTargCM, pDimuCM; // In the CM. frame
394 TLorentzVector pMu1Dimu, pMu2Dimu, pProjDimu, pTargDimu; // In the dimuon rest frame
395 TVector3 beta,zaxisCS;
396 Double_t mp=0.93827231;
398 // --- Fill the Lorentz vector for projectile and target in the CM frame
400 pProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp));
401 pTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp));
403 // --- Get the muons parameters in the CM frame
405 pMu1CM.SetPxPyPzE(px1,py1,pz1,e1);
406 pMu2CM.SetPxPyPzE(px2,py2,pz2,e2);
408 // --- Obtain the dimuon parameters in the CM frame
410 pDimuCM=pMu1CM+pMu2CM;
412 // --- Translate the dimuon parameters in the dimuon rest frame
414 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
419 pMu1Dimu.Boost(beta);
420 pMu2Dimu.Boost(beta);
421 pProjDimu.Boost(beta);
422 pTargDimu.Boost(beta);
424 // --- Determine the z axis for the CS angle
426 zaxisCS=(((pProjDimu.Vect()).Unit())-((pTargDimu.Vect()).Unit())).Unit();
428 // --- Determine the CS angle (angle between mu+ and the z axis defined above)
431 if(charge1>0) cost = zaxisCS.Dot((pMu1Dimu.Vect()).Unit());
432 else cost = zaxisCS.Dot((pMu2Dimu.Vect()).Unit());
435 //________________________________________________________________________
437 //________________________________________________________________________
438 Double_t AliCFMuonResTask1::CostHE(Double_t px1, Double_t py1, Double_t pz1, Double_t e1,
439 Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2)
442 TLorentzVector pMu1CM, pMu2CM, pDimuCM; // In the CM frame
443 TLorentzVector pMu1Dimu, pMu2Dimu; // In the dimuon rest frame
444 TVector3 beta,zaxisCS;
446 // --- Get the muons parameters in the CM frame
448 pMu1CM.SetPxPyPzE(px1,py1,pz1,e1);
449 pMu2CM.SetPxPyPzE(px2,py2,pz2,e2);
451 // --- Obtain the dimuon parameters in the CM frame
453 pDimuCM=pMu1CM+pMu2CM;
455 // --- Translate the muon parameters in the dimuon rest frame
457 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
460 pMu1Dimu.Boost(beta);
461 pMu2Dimu.Boost(beta);
463 // --- Determine the z axis for the calculation of the polarization angle (i.e. the direction of the dimuon in the CM system)
466 zaxis=(pDimuCM.Vect()).Unit();
468 // --- Calculation of the polarization angle (angle between mu+ and the z axis defined above)
470 if(charge1>0) cost = zaxis.Dot((pMu1Dimu.Vect()).Unit());
471 else cost = zaxis.Dot((pMu2Dimu.Vect()).Unit());
475 //________________________________________________________________________
477 //________________________________________________________________________
478 Double_t AliCFMuonResTask1::PhiCS(Double_t px1, Double_t py1, Double_t pz1, Double_t e1,
479 Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2,
483 TLorentzVector pMu1CM, pMu2CM, pProjCM, pTargCM, pDimuCM; // In the CM frame
484 TLorentzVector pMu1Dimu, pMu2Dimu, pProjDimu, pTargDimu; // In the dimuon rest frame
485 TVector3 beta,yaxisCS, xaxisCS, zaxisCS;
486 Double_t mp=0.93827231;
488 // --- Fill the Lorentz vector for projectile and target in the CM frame
490 pProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp));
491 pTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp));
493 // --- Get the muons parameters in the CM frame
495 pMu1CM.SetPxPyPzE(px1,py1,pz1,e1);
496 pMu2CM.SetPxPyPzE(px2,py2,pz2,e2);
498 // --- Obtain the dimuon parameters in the CM frame
500 pDimuCM=pMu1CM+pMu2CM;
502 // --- Translate the dimuon parameters in the dimuon rest frame
504 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
509 pMu1Dimu.Boost(beta);
510 pMu2Dimu.Boost(beta);
511 pProjDimu.Boost(beta);
512 pTargDimu.Boost(beta);
514 // --- Determine the z axis for the CS angle
516 zaxisCS=(((pProjDimu.Vect()).Unit())-((pTargDimu.Vect()).Unit())).Unit();
517 yaxisCS=(((pProjDimu.Vect()).Unit()).Cross((pTargDimu.Vect()).Unit())).Unit();
518 xaxisCS=(yaxisCS.Cross(zaxisCS)).Unit();
521 if(charge1>0) phi = TMath::ATan2((pMu1Dimu.Vect()).Dot(yaxisCS),((pMu1Dimu.Vect()).Dot(xaxisCS)));
522 else phi = TMath::ATan2((pMu2Dimu.Vect()).Dot(yaxisCS),((pMu2Dimu.Vect()).Dot(xaxisCS)));
526 //________________________________________________________________________
528 //________________________________________________________________________
529 Double_t AliCFMuonResTask1::PhiHE(Double_t px1, Double_t py1, Double_t pz1, Double_t e1,
530 Double_t charge1, Double_t px2, Double_t py2, Double_t pz2, Double_t e2, Double_t Energy)
533 TLorentzVector pMu1CM, pMu2CM, pProjCM, pTargCM, pDimuCM; // In the CM frame
534 TLorentzVector pMu1Dimu, pMu2Dimu, pProjDimu, pTargDimu; // In the dimuon rest frame
535 TVector3 beta,xaxis,yaxis,zaxis;
536 Double_t mp=0.93827231;
539 // --- Get the muons parameters in the CM frame
541 pMu1CM.SetPxPyPzE(px1,py1,pz1,e1);
542 pMu2CM.SetPxPyPzE(px2,py2,pz2,e2);
544 // --- Obtain the dimuon parameters in the CM frame
546 pDimuCM=pMu1CM+pMu2CM;
548 // --- Translate the muon parameters in the dimuon rest frame
550 zaxis=(pDimuCM.Vect()).Unit();
552 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
554 pProjCM.SetPxPyPzE(0.,0.,-Energy,TMath::Sqrt(Energy*Energy+mp*mp));
555 pTargCM.SetPxPyPzE(0.,0.,Energy,TMath::Sqrt(Energy*Energy+mp*mp));
560 pProjDimu.Boost(beta);
561 pTargDimu.Boost(beta);
563 yaxis=((pProjDimu.Vect()).Cross(pTargDimu.Vect())).Unit();
564 xaxis=(yaxis.Cross(zaxis)).Unit();
568 pMu1Dimu.Boost(beta);
569 pMu2Dimu.Boost(beta);
572 if(charge1>0) phi = TMath::ATan2((pMu1Dimu.Vect()).Dot(yaxis),(pMu1Dimu.Vect()).Dot(xaxis));
573 else phi = TMath::ATan2((pMu2Dimu.Vect()).Dot(yaxis),(pMu2Dimu.Vect()).Dot(xaxis));
578 //________________________________________________________________________
579 void AliCFMuonResTask1::Terminate(Option_t *)
581 // draw result of the Invariant mass MC and ESD
583 AliCFContainer *cont = dynamic_cast<AliCFContainer*> (GetOutputData(2));
585 AliError("Cannot find container in file");
589 TH1D *kmass = cont->ShowProjection(5,0);
590 TH1D *rmass = cont->ShowProjection(5,1);
591 TH1D *kcostCS = cont->ShowProjection(9,0);
592 TH1D *rcostCS = cont->ShowProjection(9,1);
594 TCanvas *c1 = new TCanvas("AliCFMuonResTask1","JPSI MC & ESD",10,10,510,510);
601 kcostCS->Draw("HIST");
603 rcostCS->Draw("HIST");
605 //________________________________________________________________________