1 /**************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 //-----------------------------------------------------------------------
17 // Class for HF corrections as a function of many variables
18 // 6 Steps introduced: MC, MC Acc, Reco, Reco Acc, Reco Acc + ITS Cl,
19 // Reco Acc + ITS Cl + PPR cuts
20 // 13 variables used: pt, y, cosThetaStar, ptPi, ptK, ct,
21 // dca, d0Pi, d0K, d0Pixd0K, cosPointingAngle, phi, z
23 //-----------------------------------------------------------------------
24 // Author : C. Zampolli, CERN
25 //-----------------------------------------------------------------------
26 //-----------------------------------------------------------------------
27 // Base class for HF Unfolding (pt and eta)
28 // correlation matrix filled at Acceptance and PPR level
29 // Author: A.Grelli , Utrecht - agrelli@uu.nl
30 //-----------------------------------------------------------------------
32 #include <TParticle.h>
33 #include <TDatabasePDG.h>
38 #include "AliCFHeavyFlavourTaskMultiVarMultiStep.h"
40 #include "AliMCEvent.h"
41 #include "AliCFManager.h"
42 #include "AliCFContainer.h"
44 #include "AliAnalysisManager.h"
45 #include "AliAODHandler.h"
46 #include "AliAODEvent.h"
47 #include "AliAODRecoDecay.h"
48 #include "AliAODRecoDecayHF.h"
49 #include "AliAODRecoDecayHF2Prong.h"
50 #include "AliAODMCParticle.h"
51 #include "AliAODMCHeader.h"
52 #include "AliESDtrack.h"
54 #include "THnSparse.h"
57 //__________________________________________________________________________
58 AliCFHeavyFlavourTaskMultiVarMultiStep::AliCFHeavyFlavourTaskMultiVarMultiStep() :
62 fHistEventsProcessed(0x0),
70 fCountRecoITSClusters(0),
73 fFillFromGenerated(kFALSE),
75 fAcceptanceUnf(kTRUE),
82 //___________________________________________________________________________
83 AliCFHeavyFlavourTaskMultiVarMultiStep::AliCFHeavyFlavourTaskMultiVarMultiStep(const Char_t* name) :
84 AliAnalysisTaskSE(name),
87 fHistEventsProcessed(0x0),
95 fCountRecoITSClusters(0),
98 fFillFromGenerated(kFALSE),
100 fAcceptanceUnf(kTRUE),
104 // Constructor. Initialization of Inputs and Outputs
106 Info("AliCFHeavyFlavourTaskMultiVarMultiStep","Calling Constructor");
108 DefineInput(0) and DefineOutput(0)
109 are taken care of by AliAnalysisTaskSE constructor
111 DefineOutput(1,TH1I::Class());
112 DefineOutput(2,AliCFContainer::Class());
113 DefineOutput(3,THnSparseD::Class());
116 //___________________________________________________________________________
117 AliCFHeavyFlavourTaskMultiVarMultiStep& AliCFHeavyFlavourTaskMultiVarMultiStep::operator=(const AliCFHeavyFlavourTaskMultiVarMultiStep& c)
120 // Assignment operator
123 AliAnalysisTaskSE::operator=(c) ;
125 fCFManager = c.fCFManager;
126 fHistEventsProcessed = c.fHistEventsProcessed;
131 //___________________________________________________________________________
132 AliCFHeavyFlavourTaskMultiVarMultiStep::AliCFHeavyFlavourTaskMultiVarMultiStep(const AliCFHeavyFlavourTaskMultiVarMultiStep& c) :
133 AliAnalysisTaskSE(c),
135 fCFManager(c.fCFManager),
136 fHistEventsProcessed(c.fHistEventsProcessed),
137 fCorrelation(c.fCorrelation),
138 fCountMC(c.fCountMC),
139 fCountAcc(c.fCountAcc),
140 fCountVertex(c.fCountVertex),
141 fCountRefit(c.fCountRefit),
142 fCountReco(c.fCountReco),
143 fCountRecoAcc(c.fCountRecoAcc),
144 fCountRecoITSClusters(c.fCountRecoITSClusters),
145 fCountRecoPPR(c.fCountRecoPPR),
147 fFillFromGenerated(c.fFillFromGenerated),
148 fMinITSClusters(c.fMinITSClusters),
149 fAcceptanceUnf(c.fAcceptanceUnf),
150 fKeepD0fromB(c.fKeepD0fromB)
157 //___________________________________________________________________________
158 AliCFHeavyFlavourTaskMultiVarMultiStep::~AliCFHeavyFlavourTaskMultiVarMultiStep() {
162 if (fCFManager) delete fCFManager ;
163 if (fHistEventsProcessed) delete fHistEventsProcessed ;
164 if (fCorrelation) delete fCorrelation ;
167 //_________________________________________________
168 void AliCFHeavyFlavourTaskMultiVarMultiStep::UserExec(Option_t *)
171 // Main loop function
174 if (fFillFromGenerated){
175 AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
179 Error("UserExec","NO EVENT FOUND!");
184 if (fEvents%10000 ==0) AliDebug(2,Form("Event %d",fEvents));
185 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
187 TClonesArray *arrayD0toKpi=0;
189 if(!aodEvent && AODEvent() && IsStandardAOD()) {
190 // In case there is an AOD handler writing a standard AOD, use the AOD
191 // event in memory rather than the input (ESD) event.
192 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
193 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
194 // have to taken from the AOD event hold by the AliAODExtension
195 AliAODHandler* aodHandler = (AliAODHandler*)
196 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
197 if(aodHandler->GetExtensions()) {
198 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
199 AliAODEvent *aodFromExt = ext->GetAOD();
200 arrayD0toKpi=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
203 arrayD0toKpi=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
208 AliError("Could not find array of HF vertices");
213 fCFManager->SetRecEventInfo(aodEvent);
214 fCFManager->SetMCEventInfo(aodEvent);
216 // MC-event selection
217 Double_t containerInput[13] ;
218 Double_t containerInputMC[13] ;
220 //loop on the MC event
222 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
224 AliError("Could not find Monte-Carlo in AOD");
229 Int_t icountReco = 0;
230 Int_t icountVertex = 0;
231 Int_t icountRefit = 0;
232 Int_t icountRecoAcc = 0;
233 Int_t icountRecoITSClusters = 0;
234 Int_t icountRecoPPR = 0;
236 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
238 AliError("Could not find MC Header in AOD");
244 // AOD primary vertex
245 AliAODVertex *vtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
246 Double_t zPrimVertex = vtx1->GetZ();
247 Double_t zMCVertex = mcHeader->GetVtxZ();
248 Bool_t vtxFlag = kTRUE;
249 TString title=vtx1->GetTitle();
250 if(!title.Contains("VertexerTracks")) vtxFlag=kFALSE;
252 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
253 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
254 if (mcPart->GetPdgCode() == 4) cquarks++;
255 if (mcPart->GetPdgCode() == -4) cquarks++;
257 AliWarning("Particle not found in tree, skipping");
261 // check the MC-level cuts
263 if (!fCFManager->CheckParticleCuts(0, mcPart)) continue; // 0 stands for MC level
264 Int_t pdgGranma = CheckOrigin(mcPart, mcArray);
265 Int_t abspdgGranma = TMath::Abs(pdgGranma);
266 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)) {
267 AliDebug(2,Form("Particle has a b-meson, or b-baryon mother (pdg code mother = %d )--> not coming from a c-quark, skipping...", pdgGranma));
268 if (!fKeepD0fromB) continue; // skipping particles that don't come from c quark
271 // if (TMath::Abs(pdgGranma)!=4) {
273 // fill the container for Gen-level selection
274 Double_t vectorMC[7] = {9999.,9999.,9999.,9999.,9999.,9999.,9999.};
275 if (GetGeneratedValuesFromMCParticle(mcPart, mcArray, vectorMC)){
276 containerInputMC[0] = vectorMC[0];
277 containerInputMC[1] = vectorMC[1] ;
278 containerInputMC[2] = vectorMC[2] ;
279 containerInputMC[3] = vectorMC[3] ;
280 containerInputMC[4] = vectorMC[4] ;
281 containerInputMC[5] = vectorMC[5] ; // in micron
282 containerInputMC[6] = 0.; // dummy value, meaningless in MC, in micron
283 containerInputMC[7] = 0.; // dummy value, meaningless in MC, in micron
284 containerInputMC[8] = 0.; // dummy value, meaningless in MC, in micron
285 containerInputMC[9] = -100000.; // dummy value, meaningless in MC, in micron^2
286 containerInputMC[10] = 1.01; // dummy value, meaningless in MC
287 containerInputMC[11] = vectorMC[6]; // dummy value, meaningless in MC
288 containerInputMC[12] = zMCVertex; // z of reconstructed of primary vertex
289 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGenerated);
292 // check the MC-Acceptance level cuts
293 // since standard CF functions are not applicable, using Kine Cuts on daughters
295 Int_t daughter0 = mcPart->GetDaughter(0);
296 Int_t daughter1 = mcPart->GetDaughter(1);
297 AliDebug(2, Form("daughter0 = %d and daughter1 = %d",daughter0,daughter1));
298 if (daughter0 == 0 || daughter1 == 0) {
299 AliDebug(2, "Error! the D0 MC doesn't have correct daughters!! But it should have, this check was already done...");
301 if (TMath::Abs(daughter1 - daughter0) != 1) {
302 AliDebug(2, "The D0 MC doesn't come from a 2-prong decay, but it should be, this check was already done...");
304 AliAODMCParticle* mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughter0));
305 AliAODMCParticle* mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughter1));
306 if (!mcPartDaughter0 || !mcPartDaughter1) {
307 AliWarning("At least one Daughter Particle not found in tree, but it should be, this check was already done...");
309 Double_t eta0 = mcPartDaughter0->Eta();
310 Double_t eta1 = mcPartDaughter1->Eta();
311 Double_t y0 = mcPartDaughter0->Y();
312 Double_t y1 = mcPartDaughter1->Y();
313 Double_t pt0 = mcPartDaughter0->Pt();
314 Double_t pt1 = mcPartDaughter1->Pt();
315 AliDebug(2, Form("Daughter 0: eta = %f, y = %f, pt = %f", eta0, y0, pt0));
316 AliDebug(2, Form("Daughter 1: eta = %f, y = %f, pt = %f", eta1, y1, pt1));
317 Bool_t daught0inAcceptance = (TMath::Abs(eta0) < 0.9 && pt0 > 0.1);
318 Bool_t daught1inAcceptance = (TMath::Abs(eta1) < 0.9 && pt1 > 0.1);
319 if (daught0inAcceptance && daught1inAcceptance) {
320 // checking whether the cuts implemented in the CF are equivalent - simply a cross-check
321 AliDebug(2, "Daughter particles in acceptance");
322 if (!fCFManager->CheckParticleCuts(1, mcPartDaughter0)) {
323 AliDebug(2,"Inconsistency with CF cut for daughter 0!");
325 if (!fCFManager->CheckParticleCuts(1, mcPartDaughter1)) {
326 AliDebug(2,"Inconsistency with CF cut for daughter 1!");
328 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance);
331 // check on the vertex
333 printf("Vertex cut passed\n");
334 // filling the container if the vertex is ok
335 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex) ;
336 printf("Vertex cut passed 2\n");
338 // check on the kTPCrefit and kITSrefit conditions of the daughters
339 Bool_t refitFlag = kTRUE;
340 for (Int_t iaod =0; iaod<aodEvent->GetNumberOfTracks(); iaod++){
341 AliAODTrack *track = (AliAODTrack*)aodEvent->GetTrack(iaod);
342 if ((track->GetLabel() == daughter0) || (track->GetLabel() == daughter1)) {
343 if(!(track->GetStatus()&AliESDtrack::kTPCrefit) || !(track->GetStatus()&AliESDtrack::kITSrefit)) {
349 printf("Refit cut passed\n");
350 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit);
354 AliDebug(3,"Refit cut not passed\n");
358 AliDebug(3,"Vertex cut not passed\n");
362 AliDebug(3,"Acceptance cut not passed\n");
366 AliDebug(3,"Problems in filling the container");
371 if (cquarks<2) AliDebug(2,Form("Event found with %d c-quarks", cquarks));
373 AliDebug(2,Form("Found %i MC particles that are D0!!",icountMC));
374 AliDebug(2,Form("Found %i MC particles that are D0 and satisfy Acc cuts!!",icountAcc));
375 AliDebug(2,Form("Found %i MC particles that are D0 and satisfy Vertex cuts!!",icountVertex));
376 AliDebug(2,Form("Found %i MC particles that are D0 and satisfy Refit cuts!!",icountRefit));
378 // Now go to rec level
379 fCountMC += icountMC;
380 fCountAcc += icountAcc;
382 AliDebug(2, Form("Found %d vertices",arrayD0toKpi->GetEntriesFast()));
384 Int_t pdgDgD0toKpi[2]={321,211};
386 for (Int_t iD0toKpi = 0; iD0toKpi<arrayD0toKpi->GetEntriesFast(); iD0toKpi++) {
388 AliAODRecoDecayHF2Prong* d0tokpi = (AliAODRecoDecayHF2Prong*)arrayD0toKpi->At(iD0toKpi);
389 Bool_t unsetvtx=kFALSE;
390 if(!d0tokpi->GetOwnPrimaryVtx()) {
391 d0tokpi->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
395 // find associated MC particle
396 Int_t mcLabel = d0tokpi->MatchToMC(421,mcArray,2,pdgDgD0toKpi) ;
399 AliDebug(2,"No MC particle found");
402 AliAODMCParticle* mcVtxHF = (AliAODMCParticle*)mcArray->At(mcLabel);
404 AliWarning("Could not find associated MC in AOD MC tree");
407 // check whether the daughters have kTPCrefit and kITSrefit set
408 AliAODTrack *track0 = (AliAODTrack*)d0tokpi->GetDaughter(0);
409 AliAODTrack *track1 = (AliAODTrack*)d0tokpi->GetDaughter(1);
410 if((!(track0->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track1->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track0->GetStatus()&AliESDtrack::kITSrefit)) || (!(track1->GetStatus()&AliESDtrack::kITSrefit))) {
411 // skipping if at least one daughter does not have kTPCrefit or kITSrefit
415 // check on the vertex -- could be moved outside the loop on the reconstructed D0...
417 // skipping cause vertex is not ok
421 const Double_t d0tokpiCuts[9] = {0.3,999999.,1.1,0.,0.,999999.,999999.,999999.,0.};
423 if (!(d0tokpi->SelectD0(&d0tokpiCuts[0],okD0,okD0bar))){
424 // skipping candidate
428 // check if associated MC v0 passes the cuts
429 if (!fCFManager->CheckParticleCuts(0 ,mcVtxHF)) { // 0 stands for MC
430 AliDebug(2, "Skipping the particles due to cuts");
433 Int_t pdgGranma = CheckOrigin(mcVtxHF, mcArray);
434 Int_t abspdgGranma = TMath::Abs(pdgGranma);
435 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)) {
436 AliDebug(2,Form("At Reco level, from MC info: Particle has a b-meson, or b-baryon mother (pdg code mother = %d )--> not coming from a c-quark, skipping...", pdgGranma));
437 if (!fKeepD0fromB) continue; // skipping particles that don't come from c quark
440 // fill the container...
441 Double_t pt = d0tokpi->Pt();
442 Double_t rapidity = d0tokpi->YD0();
444 Double_t cosThetaStar = 9999.;
447 Double_t dca = d0tokpi->GetDCA();
450 Double_t d0xd0 = d0tokpi->Prodd0d0();
451 Double_t cosPointingAngle = d0tokpi->CosPointingAngle();
452 Double_t phi = d0tokpi->Phi();
453 Int_t pdgCode = mcVtxHF->GetPdgCode();
455 cosThetaStar = d0tokpi->CosThetaStarD0();
456 pTpi = d0tokpi->PtProng(0);
457 pTK = d0tokpi->PtProng(1);
458 d0pi = d0tokpi->Getd0Prong(0);
459 d0K = d0tokpi->Getd0Prong(1);
460 invMass=d0tokpi->InvMassD0();
463 cosThetaStar = d0tokpi->CosThetaStarD0bar();
464 pTpi = d0tokpi->PtProng(1);
465 pTK = d0tokpi->PtProng(0);
466 d0pi = d0tokpi->Getd0Prong(1);
467 d0K = d0tokpi->Getd0Prong(0);
468 invMass=d0tokpi->InvMassD0bar();
471 Double_t cT = d0tokpi->CtD0();
473 if (!fFillFromGenerated){
474 // ...either with reconstructed values....
475 containerInput[0] = pt;
476 containerInput[1] = rapidity;
477 containerInput[2] = cosThetaStar;
478 containerInput[3] = pTpi;
479 containerInput[4] = pTK;
480 containerInput[5] = cT*1.E4; // in micron
481 containerInput[6] = dca*1.E4; // in micron
482 containerInput[7] = d0pi*1.E4; // in micron
483 containerInput[8] = d0K*1.E4; // in micron
484 containerInput[9] = d0xd0*1.E8; // in micron^2
485 containerInput[10] = cosPointingAngle; // in micron
486 containerInput[11] = phi;
487 containerInput[12] = zPrimVertex; // z of reconstructed of primary vertex
490 // ... or with generated values
491 Double_t vectorMC[7] = {9999.,9999.,9999.,9999.,9999.,9999.,9999.};
492 if (GetGeneratedValuesFromMCParticle(mcVtxHF, mcArray, vectorMC)){
493 containerInput[0] = vectorMC[0];
494 containerInput[1] = vectorMC[1] ;
495 containerInput[2] = vectorMC[2] ;
496 containerInput[3] = vectorMC[3] ;
497 containerInput[4] = vectorMC[4] ;
498 containerInput[5] = vectorMC[5] ; // in micron
499 containerInput[6] = 0.; // dummy value, meaningless in MC, in micron
500 containerInput[7] = 0.; // dummy value, meaningless in MC, in micron
501 containerInput[8] = 0.; // dummy value, meaningless in MC, in micron
502 containerInput[9] = 100000.; // dummy value, meaningless in MC, in micron^2
503 containerInput[10] = 1.01; // dummy value, meaningless in MC
504 containerInput[11] = vectorMC[6];
505 containerInput[12] = zMCVertex; // z of reconstructed of primary vertex
508 AliDebug(3,"Problems in filling the container");
512 AliDebug(2, Form("Filling the container with pt = %f, rapidity = %f, cosThetaStar = %f, pTpi = %f, pTK = %f, cT = %f", containerInput[0], containerInput[1], containerInput[2], containerInput[3], containerInput[4], containerInput[5]));
514 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed) ;
517 Bool_t acceptanceProng0 = (TMath::Abs(d0tokpi->EtaProng(0))< 0.9 && d0tokpi->PtProng(0) > 0.1);
518 Bool_t acceptanceProng1 = (TMath::Abs(d0tokpi->EtaProng(1))< 0.9 && d0tokpi->PtProng(1) > 0.1);
519 if (acceptanceProng0 && acceptanceProng1) {
520 AliDebug(2,"D0 reco daughters in acceptance");
521 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance) ;
526 Double_t fill[4]; //fill response matrix
528 // dimensions 0&1 : pt,eta (Rec)
533 // dimensions 2&3 : pt,eta (MC)
535 fill[2] = mcVtxHF->Pt();
536 fill[3] = mcVtxHF->Y();
538 fCorrelation->Fill(fill);
542 // cut on the min n. of clusters in ITS
543 Int_t ncls0=0,ncls1=0;
544 for(Int_t l=0;l<6;l++) {
545 if(TESTBIT(track0->GetITSClusterMap(),l)) ncls0++;
546 if(TESTBIT(track1->GetITSClusterMap(),l)) ncls1++;
548 AliDebug(2, Form("n clusters = %d", ncls0));
549 if (ncls0 >= fMinITSClusters && ncls1 >= fMinITSClusters) {
550 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters) ;
551 icountRecoITSClusters++;
552 AliDebug(2,Form("pT = %f, dca = %f, cosThetaStar = %f, pTpi = %f, pTK = %f, d0pi = %f, d0K = %f, d0xd0 = %f, cosPointingAngle = %f", pt, dca, cosThetaStar,pTpi, pTK, d0pi*1E4, d0K*1E4, d0xd0*1E8, cosPointingAngle));
555 //added mass cut for D0 analysis
556 Double_t cuts[7] = {9999999., 1.1, 0., 9999999., 9999999., 0.,0.027};
557 //cuts of the D0 analysis (looser) see AliAnalysisTaskSED0Mass.cxx
561 cuts[0] = 400; //dca (um)
562 cuts[1] = 0.8; //cosTstar
563 cuts[2] = 0.5; //pt (GeV/c)
564 cuts[3] = 500; //d0 (um)
565 cuts[4] = -25000; //d0xd0 (um^2)
566 cuts[5] = 0.7; //cosTpointing
569 cuts[0] = 400; //dca (um)
570 cuts[1] = 0.8; //cosTstar
571 cuts[2] = 0.5; //pt (GeV/c)
572 cuts[3] = 500; //d0 (um)
573 cuts[4] = -20000; //d0xd0 (um^2)
574 cuts[5] = 0.5; //cosTpointing
577 /* //not same cuts for pt = 1 to 2 and 1 to 3 GeV in case must match them because of poor stat
578 else if (pt > 1 && pt <= 2){
598 else if (pt > 1 && pt <= 3){
617 else if (pt > 3 && pt <= 5){
656 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
657 if (TMath::Abs(invMass-mD0PDG) < cuts[6]
659 && TMath::Abs(cosThetaStar) < cuts[1]
662 && TMath::Abs(d0pi*1E4) < cuts[3]
663 && TMath::Abs(d0K*1E4) < cuts[3]
664 && d0xd0*1E8 < cuts[4]
665 && cosPointingAngle > cuts[5]
668 AliDebug(2,"Particle passed PPR cuts (actually cuts for D0 analysis!)");
669 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoPPR) ;
672 if(!fAcceptanceUnf){ // unfolding
674 Double_t fill[4]; //fill response matrix
676 // dimensions 0&1 : pt,eta (Rec)
681 // dimensions 2&3 : pt,eta (MC)
683 fill[2] = mcVtxHF->Pt();
684 fill[3] = mcVtxHF->Y();
686 fCorrelation->Fill(fill);
691 AliDebug(2,"Particle skipped due to PPR cuts");
692 if (dca*1E4 > cuts[0]){
693 AliDebug(2,"Problems with dca");
695 if ( TMath::Abs(cosThetaStar) > cuts[1]){
696 AliDebug(2,"Problems with cosThetaStar");
699 AliDebug(2,"Problems with pTpi");
702 AliDebug(2,"Problems with pTK");
704 if (TMath::Abs(d0pi*1E4) > cuts[3]){
705 AliDebug(2,"Problems with d0pi");
707 if (TMath::Abs(d0K*1E4) > cuts[3]){
708 AliDebug(2,"Problems with d0K");
710 if (d0xd0*1E8 > cuts[4]){
711 AliDebug(2,"Problems with d0xd0");
713 if (cosPointingAngle < cuts[5]){
714 AliDebug(2,"Problems with cosPointingAngle");
720 if(unsetvtx) d0tokpi->UnsetOwnPrimaryVtx();
721 } // end loop on D0->Kpi
723 AliDebug(2, Form("Found %i Reco particles that are D0!!",icountReco));
725 fCountReco+= icountReco;
726 fCountVertex+= icountVertex;
727 fCountRefit+= icountRefit;
728 fCountRecoAcc+= icountRecoAcc;
729 fCountRecoITSClusters+= icountRecoITSClusters;
730 fCountRecoPPR+= icountRecoPPR;
732 fHistEventsProcessed->Fill(0);
733 /* PostData(0) is taken care of by AliAnalysisTaskSE */
734 PostData(1,fHistEventsProcessed) ;
735 PostData(2,fCFManager->GetParticleContainer()) ;
736 PostData(3,fCorrelation) ;
740 //___________________________________________________________________________
741 void AliCFHeavyFlavourTaskMultiVarMultiStep::Terminate(Option_t*)
743 // The Terminate() function is the last function to be called during
744 // a query. It always runs on the client, it can be used to present
745 // the results graphically or save the results to file.
747 AliAnalysisTaskSE::Terminate();
749 AliInfo(Form("Found %i MC particles that are D0 in MC, in %d events",fCountMC,fEvents));
750 AliInfo(Form("Found %i MC particles that are D0 in MC and satisfy Acc cuts, in %d events",fCountAcc,fEvents));
751 AliInfo(Form("Found %i MC particles that are D0 in MC and satisfy Acc cuts, and satisfy Vertex requirement in %d events",fCountVertex,fEvents));
752 AliInfo(Form("Found %i MC particles that are D0 in MC and satisfy Acc cuts, and satisfy ITS+TPC refit requirementin %d events",fCountRefit,fEvents));
753 AliInfo(Form("Found %i reco D0 that are decaying in K+pi, in %d events",fCountReco,fEvents));
754 AliInfo(Form("Among the above, found %i reco D0 that are decaying in K+pi and are in the requested acceptance, in %d events",fCountRecoAcc,fEvents));
755 AliInfo(Form("Among the above, found %i reco D0 that are decaying in K+pi and have at least %d clusters in ITS, in %d events",fCountRecoITSClusters,fMinITSClusters,fEvents));
756 AliInfo(Form("Among the above, found %i reco D0 that are decaying in K+pi and satisfy PPR cuts, in %d events",fCountRecoPPR,fEvents));
758 // draw some example plots....
760 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
762 printf("CONTAINER NOT FOUND\n");
765 // projecting the containers to obtain histograms
766 // first argument = variable, second argument = step
769 TH1D* h00 = cont->ShowProjection(0,0) ; // pt
770 TH1D* h10 = cont->ShowProjection(1,0) ; // rapidity
771 TH1D* h20 = cont->ShowProjection(2,0) ; // cosThetaStar
772 TH1D* h30 = cont->ShowProjection(3,0) ; // pTpi
773 TH1D* h40 = cont->ShowProjection(4,0) ; // pTK
774 TH1D* h50 = cont->ShowProjection(5,0) ; // cT
775 TH1D* h60 = cont->ShowProjection(6,0) ; // dca
776 TH1D* h70 = cont->ShowProjection(7,0) ; // d0pi
777 TH1D* h80 = cont->ShowProjection(8,0) ; // d0K
778 TH1D* h90 = cont->ShowProjection(9,0) ; // d0xd0
779 TH1D* h100 = cont->ShowProjection(10,0) ; // cosPointingAngle
780 TH1D* h110 = cont->ShowProjection(11,0) ; // phi
782 // MC-Acceptance level
783 TH1D* h01 = cont->ShowProjection(0,1) ; // pt
784 TH1D* h11 = cont->ShowProjection(1,1) ; // rapidity
785 TH1D* h21 = cont->ShowProjection(2,1) ; // cosThetaStar
786 TH1D* h31 = cont->ShowProjection(3,1) ; // pTpi
787 TH1D* h41 = cont->ShowProjection(4,1) ; // pTK
788 TH1D* h51 = cont->ShowProjection(5,1) ; // cT
789 TH1D* h61 = cont->ShowProjection(6,1) ; // dca
790 TH1D* h71 = cont->ShowProjection(7,1) ; // d0pi
791 TH1D* h81 = cont->ShowProjection(8,1) ; // d0K
792 TH1D* h91 = cont->ShowProjection(9,1) ; // d0xd0
793 TH1D* h101 = cont->ShowProjection(10,1) ; // cosPointingAngle
794 TH1D* h111 = cont->ShowProjection(11,1) ; // phi
797 TH1D* h04 = cont->ShowProjection(0,4) ; // pt
798 TH1D* h14 = cont->ShowProjection(1,4) ; // rapidity
799 TH1D* h24 = cont->ShowProjection(2,4) ; // cosThetaStar
800 TH1D* h34 = cont->ShowProjection(3,4) ; // pTpi
801 TH1D* h44 = cont->ShowProjection(4,4) ; // pTK
802 TH1D* h54 = cont->ShowProjection(5,4) ; // cT
803 TH1D* h64 = cont->ShowProjection(6,4) ; // dca
804 TH1D* h74 = cont->ShowProjection(7,4) ; // d0pi
805 TH1D* h84 = cont->ShowProjection(8,4) ; // d0K
806 TH1D* h94 = cont->ShowProjection(9,4) ; // d0xd0
807 TH1D* h104 = cont->ShowProjection(10,4) ; // cosPointingAngle
808 TH1D* h114 = cont->ShowProjection(11,4) ; // phi
810 h00->SetTitle("pT_D0 (GeV/c)");
811 h10->SetTitle("rapidity");
812 h20->SetTitle("cosThetaStar");
813 h30->SetTitle("pT_pi (GeV/c)");
814 h40->SetTitle("pT_K (Gev/c)");
815 h50->SetTitle("cT (#mum)");
816 h60->SetTitle("dca (#mum)");
817 h70->SetTitle("d0_pi (#mum)");
818 h80->SetTitle("d0_K (#mum)");
819 h90->SetTitle("d0xd0 (#mum^2)");
820 h100->SetTitle("cosPointingAngle");
821 h100->SetTitle("phi (rad)");
823 h00->GetXaxis()->SetTitle("pT_D0 (GeV/c)");
824 h10->GetXaxis()->SetTitle("rapidity");
825 h20->GetXaxis()->SetTitle("cosThetaStar");
826 h30->GetXaxis()->SetTitle("pT_pi (GeV/c)");
827 h40->GetXaxis()->SetTitle("pT_K (Gev/c)");
828 h50->GetXaxis()->SetTitle("cT (#mum)");
829 h60->GetXaxis()->SetTitle("dca (#mum)");
830 h70->GetXaxis()->SetTitle("d0_pi (#mum)");
831 h80->GetXaxis()->SetTitle("d0_K (#mum)");
832 h90->GetXaxis()->SetTitle("d0xd0 (#mum^2)");
833 h100->GetXaxis()->SetTitle("cosPointingAngle");
834 h110->GetXaxis()->SetTitle("phi (rad)");
836 h01->SetTitle("pT_D0 (GeV/c)");
837 h11->SetTitle("rapidity");
838 h21->SetTitle("cosThetaStar");
839 h31->SetTitle("pT_pi (GeV/c)");
840 h41->SetTitle("pT_K (Gev/c)");
841 h51->SetTitle("cT (#mum)");
842 h61->SetTitle("dca (#mum)");
843 h71->SetTitle("d0_pi (#mum)");
844 h81->SetTitle("d0_K (#mum)");
845 h91->SetTitle("d0xd0 (#mum^2)");
846 h101->SetTitle("cosPointingAngle");
847 h111->GetXaxis()->SetTitle("phi (rad)");
849 h01->GetXaxis()->SetTitle("pT_D0 (GeV/c)");
850 h11->GetXaxis()->SetTitle("rapidity");
851 h21->GetXaxis()->SetTitle("cosThetaStar");
852 h31->GetXaxis()->SetTitle("pT_pi (GeV/c)");
853 h41->GetXaxis()->SetTitle("pT_K (Gev/c)");
854 h51->GetXaxis()->SetTitle("cT (#mum)");
855 h61->GetXaxis()->SetTitle("dca (#mum)");
856 h71->GetXaxis()->SetTitle("d0_pi (#mum)");
857 h81->GetXaxis()->SetTitle("d0_K (#mum)");
858 h91->GetXaxis()->SetTitle("d0xd0 (#mum^2)");
859 h101->GetXaxis()->SetTitle("cosPointingAngle");
860 h111->GetXaxis()->SetTitle("phi (rad)");
862 h04->SetTitle("pT_D0 (GeV/c)");
863 h14->SetTitle("rapidity");
864 h24->SetTitle("cosThetaStar");
865 h34->SetTitle("pT_pi (GeV/c)");
866 h44->SetTitle("pT_K (Gev/c)");
867 h54->SetTitle("cT (#mum)");
868 h64->SetTitle("dca (#mum)");
869 h74->SetTitle("d0_pi (#mum)");
870 h84->SetTitle("d0_K (#mum)");
871 h94->SetTitle("d0xd0 (#mum^2)");
872 h104->SetTitle("cosPointingAngle");
873 h114->GetXaxis()->SetTitle("phi (rad)");
875 h04->GetXaxis()->SetTitle("pT_D0 (GeV/c)");
876 h14->GetXaxis()->SetTitle("rapidity");
877 h24->GetXaxis()->SetTitle("cosThetaStar");
878 h34->GetXaxis()->SetTitle("pT_pi (GeV/c)");
879 h44->GetXaxis()->SetTitle("pT_K (Gev/c)");
880 h54->GetXaxis()->SetTitle("cT (#mum)");
881 h64->GetXaxis()->SetTitle("dca (#mum)");
882 h74->GetXaxis()->SetTitle("d0_pi (#mum)");
883 h84->GetXaxis()->SetTitle("d0_K (#mum)");
884 h94->GetXaxis()->SetTitle("d0xd0 (#mum^2)");
885 h104->GetXaxis()->SetTitle("cosPointingAngle");
886 h114->GetXaxis()->SetTitle("phi (rad)");
888 Double_t max0 = h00->GetMaximum();
889 Double_t max1 = h10->GetMaximum();
890 Double_t max2 = h20->GetMaximum();
891 Double_t max3 = h30->GetMaximum();
892 Double_t max4 = h40->GetMaximum();
893 Double_t max5 = h50->GetMaximum();
894 Double_t max6 = h60->GetMaximum();
895 Double_t max7 = h70->GetMaximum();
896 Double_t max8 = h80->GetMaximum();
897 Double_t max9 = h90->GetMaximum();
898 Double_t max10 = h100->GetMaximum();
899 Double_t max11 = h110->GetMaximum();
901 h00->GetYaxis()->SetRangeUser(0,max0*1.2);
902 h10->GetYaxis()->SetRangeUser(0,max1*1.2);
903 h20->GetYaxis()->SetRangeUser(0,max2*1.2);
904 h30->GetYaxis()->SetRangeUser(0,max3*1.2);
905 h40->GetYaxis()->SetRangeUser(0,max4*1.2);
906 h50->GetYaxis()->SetRangeUser(0,max5*1.2);
907 h60->GetYaxis()->SetRangeUser(0,max6*1.2);
908 h70->GetYaxis()->SetRangeUser(0,max7*1.2);
909 h80->GetYaxis()->SetRangeUser(0,max8*1.2);
910 h90->GetYaxis()->SetRangeUser(0,max9*1.2);
911 h100->GetYaxis()->SetRangeUser(0,max10*1.2);
912 h110->GetYaxis()->SetRangeUser(0,max11*1.2);
914 h01->GetYaxis()->SetRangeUser(0,max0*1.2);
915 h11->GetYaxis()->SetRangeUser(0,max1*1.2);
916 h21->GetYaxis()->SetRangeUser(0,max2*1.2);
917 h31->GetYaxis()->SetRangeUser(0,max3*1.2);
918 h41->GetYaxis()->SetRangeUser(0,max4*1.2);
919 h51->GetYaxis()->SetRangeUser(0,max5*1.2);
920 h61->GetYaxis()->SetRangeUser(0,max6*1.2);
921 h71->GetYaxis()->SetRangeUser(0,max7*1.2);
922 h81->GetYaxis()->SetRangeUser(0,max8*1.2);
923 h91->GetYaxis()->SetRangeUser(0,max9*1.2);
924 h101->GetYaxis()->SetRangeUser(0,max10*1.2);
925 h111->GetYaxis()->SetRangeUser(0,max11*1.2);
927 h00->SetMarkerStyle(20);
928 h10->SetMarkerStyle(24);
929 h20->SetMarkerStyle(21);
930 h30->SetMarkerStyle(25);
931 h40->SetMarkerStyle(27);
932 h50->SetMarkerStyle(28);
933 h60->SetMarkerStyle(20);
934 h70->SetMarkerStyle(24);
935 h80->SetMarkerStyle(21);
936 h90->SetMarkerStyle(25);
937 h100->SetMarkerStyle(27);
938 h110->SetMarkerStyle(28);
940 h00->SetMarkerColor(2);
941 h10->SetMarkerColor(2);
942 h20->SetMarkerColor(2);
943 h30->SetMarkerColor(2);
944 h40->SetMarkerColor(2);
945 h50->SetMarkerColor(2);
946 h60->SetMarkerColor(2);
947 h70->SetMarkerColor(2);
948 h80->SetMarkerColor(2);
949 h90->SetMarkerColor(2);
950 h100->SetMarkerColor(2);
951 h110->SetMarkerColor(2);
953 h01->SetMarkerStyle(20) ;
954 h11->SetMarkerStyle(24) ;
955 h21->SetMarkerStyle(21) ;
956 h31->SetMarkerStyle(25) ;
957 h41->SetMarkerStyle(27) ;
958 h51->SetMarkerStyle(28) ;
959 h61->SetMarkerStyle(20);
960 h71->SetMarkerStyle(24);
961 h81->SetMarkerStyle(21);
962 h91->SetMarkerStyle(25);
963 h101->SetMarkerStyle(27);
964 h111->SetMarkerStyle(28);
966 h01->SetMarkerColor(8);
967 h11->SetMarkerColor(8);
968 h21->SetMarkerColor(8);
969 h31->SetMarkerColor(8);
970 h41->SetMarkerColor(8);
971 h51->SetMarkerColor(8);
972 h61->SetMarkerColor(8);
973 h71->SetMarkerColor(8);
974 h81->SetMarkerColor(8);
975 h91->SetMarkerColor(8);
976 h101->SetMarkerColor(8);
977 h111->SetMarkerColor(8);
979 h04->SetMarkerStyle(20) ;
980 h14->SetMarkerStyle(24) ;
981 h24->SetMarkerStyle(21) ;
982 h34->SetMarkerStyle(25) ;
983 h44->SetMarkerStyle(27) ;
984 h54->SetMarkerStyle(28) ;
985 h64->SetMarkerStyle(20);
986 h74->SetMarkerStyle(24);
987 h84->SetMarkerStyle(21);
988 h94->SetMarkerStyle(25);
989 h104->SetMarkerStyle(27);
990 h114->SetMarkerStyle(28);
992 h04->SetMarkerColor(4);
993 h14->SetMarkerColor(4);
994 h24->SetMarkerColor(4);
995 h34->SetMarkerColor(4);
996 h44->SetMarkerColor(4);
997 h54->SetMarkerColor(4);
998 h64->SetMarkerColor(4);
999 h74->SetMarkerColor(4);
1000 h84->SetMarkerColor(4);
1001 h94->SetMarkerColor(4);
1002 h104->SetMarkerColor(4);
1003 h114->SetMarkerColor(4);
1005 gStyle->SetCanvasColor(0);
1006 gStyle->SetFrameFillColor(0);
1007 gStyle->SetTitleFillColor(0);
1008 gStyle->SetStatColor(0);
1010 // drawing in 2 separate canvas for a matter of clearity
1011 TCanvas * c1 =new TCanvas("c1","pT, rapidiy, cosThetaStar",1100,1600);
1043 TCanvas * c2 =new TCanvas("c2","pTpi, pTK, cT",1100,1600);
1074 TCanvas * c3 =new TCanvas("c3","dca, d0pi, d0K",1100,1600);
1105 TCanvas * c4 =new TCanvas("c4","d0xd0, cosPointingAngle, phi",1100,1600);
1136 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
1138 TH2D* corr1 =hcorr->Projection(0,2);
1139 TH2D* corr2 = hcorr->Projection(1,3);
1141 TCanvas * c7 =new TCanvas("c7","",800,400);
1144 corr1->Draw("text");
1146 corr2->Draw("text");
1149 TFile* file_projection = new TFile("CFtaskHFprojection.root","RECREATE");
1153 h00->Write("pT_D0_step0");
1154 h10->Write("rapidity_step0");
1155 h20->Write("cosThetaStar_step0");
1156 h30->Write("pT_pi_step0");
1157 h40->Write("pT_K_step0");
1158 h50->Write("cT_step0");
1159 h60->Write("dca_step0");
1160 h70->Write("d0_pi_step0");
1161 h80->Write("d0_K_step0");
1162 h90->Write("d0xd0_step0");
1163 h100->Write("cosPointingAngle_step0");
1164 h110->Write("phi_step0");
1166 h01->Write("pT_D0_step1");
1167 h11->Write("rapidity_step1");
1168 h21->Write("cosThetaStar_step1");
1169 h31->Write("pT_pi_step1");
1170 h41->Write("pT_K_step1");
1171 h51->Write("cT_step1");
1172 h61->Write("dca_step1");
1173 h71->Write("d0_pi_step1");
1174 h81->Write("d0_K_step1");
1175 h91->Write("d0xd0_step1");
1176 h101->Write("cosPointingAngle_step1");
1177 h111->Write("phi_step1");
1179 h04->Write("pT_D0_step2");
1180 h14->Write("rapidity_step2");
1181 h24->Write("cosThetaStar_step2");
1182 h34->Write("pT_pi_step2");
1183 h44->Write("pT_K_step2");
1184 h54->Write("cT_step2");
1185 h64->Write("dca_step2");
1186 h74->Write("d0_pi_step2");
1187 h80->Write("d0_K_step2");
1188 h94->Write("d0xd0_step2");
1189 h104->Write("cosPointingAngle_step2");
1190 h114->Write("phi_step2");
1192 file_projection->Close();
1197 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
1198 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
1199 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
1200 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
1202 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
1203 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
1204 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
1205 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
1209 //___________________________________________________________________________
1210 void AliCFHeavyFlavourTaskMultiVarMultiStep::UserCreateOutputObjects() {
1211 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
1212 //TO BE SET BEFORE THE EXECUTION OF THE TASK
1214 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
1218 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
1221 //___________________________________________________________________________
1222 Double_t AliCFHeavyFlavourTaskMultiVarMultiStep::CosThetaStar(AliAODMCParticle* mcPart, AliAODMCParticle* mcPartDaughter0, AliAODMCParticle* mcPartDaughter1) const {
1225 // to calculate cos(ThetaStar) for generated particle
1226 // using the K, since mcPartDaughter0 and mcPartDaughter1 always correspond to K and pi respectively
1227 // (see where the function is called)
1230 Int_t pdgvtx = mcPart->GetPdgCode();
1231 /* if (pdgvtx > 0) { // setting as the first daughter always the kaon, to be used to calculate cos(ThetaStar)
1232 Int_t pdgprong0 = TMath::Abs(mcPartDaughter0->GetPdgCode());
1233 Int_t pdgprong1 = TMath::Abs(mcPartDaughter1->GetPdgCode());
1234 AliInfo(Form("D0, with pdgprong0 = %d, pdgprong1 = %d",pdgprong0,pdgprong1));
1235 AliDebug(2,"This is a D0");
1236 AliAODMCParticle* mcPartdummy = mcPartDaughter0;
1237 mcPartDaughter0 = mcPartDaughter1;
1238 mcPartDaughter1 = mcPartdummy;
1244 Int_t pdgprong0 = TMath::Abs(mcPartDaughter0->GetPdgCode());
1245 Int_t pdgprong1 = TMath::Abs(mcPartDaughter1->GetPdgCode());
1246 if (pdgvtx > 0) { // setting as the first daughter always the kaon, to be used to calculate cos(ThetaStar)
1250 AliDebug(2,"D0bar");
1252 if (pdgprong0 == 211){
1253 AliDebug(2,Form("pdgprong0 = %d, pdgprong1 = %d, switching...",pdgprong0,pdgprong1));
1254 AliAODMCParticle* mcPartdummy = mcPartDaughter0;
1255 mcPartDaughter0 = mcPartDaughter1;
1256 mcPartDaughter1 = mcPartdummy;
1257 pdgprong0 = TMath::Abs(mcPartDaughter0->GetPdgCode());
1258 pdgprong1 = TMath::Abs(mcPartDaughter1->GetPdgCode());
1261 AliDebug(2,Form("After checking, pdgprong0 = %d, pdgprong1 = %d",pdgprong0,pdgprong1));
1262 Double_t massvtx = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdgvtx))->Mass();
1264 massp[0] = TDatabasePDG::Instance()->GetParticle(pdgprong0)->Mass();
1265 massp[1] = TDatabasePDG::Instance()->GetParticle(pdgprong1)->Mass();
1267 Double_t pStar = TMath::Sqrt(TMath::Power(massvtx*massvtx-massp[0]*massp[0]-massp[1]*massp[1],2.)-4.*massp[0]*massp[0]*massp[1]*massp[1])/(2.*massvtx);
1269 Double_t px = mcPartDaughter0->Px()+mcPartDaughter1->Px();
1270 Double_t py = mcPartDaughter0->Py()+mcPartDaughter1->Py();
1271 Double_t pz = mcPartDaughter0->Pz()+mcPartDaughter1->Pz();
1272 Double_t p = TMath::Sqrt(px*px+py*py+pz*pz);
1273 Double_t e = TMath::Sqrt(massvtx*massvtx+p*p);
1274 Double_t beta = p/e;
1275 Double_t gamma = e/massvtx;
1276 TVector3 mom(mcPartDaughter0->Px(),mcPartDaughter0->Py(),mcPartDaughter0->Pz());
1277 TVector3 momTot(mcPartDaughter0->Px()+mcPartDaughter1->Px(),mcPartDaughter0->Py()+mcPartDaughter1->Py(),mcPartDaughter0->Pz()+mcPartDaughter1->Pz());
1279 Double_t qlprong = mom.Dot(momTot)/momTot.Mag(); // analog to AliAODRecoDecay::QlProng(0)
1281 AliDebug(2,Form("pStar = %f, beta = %f, gamma = %f, qlprong = %f, massp[0] = %f", pStar, beta, gamma, qlprong, massp[0]));
1282 Double_t cts = (qlprong/gamma-beta*TMath::Sqrt(pStar*pStar+massp[0]*massp[0]))/pStar;
1283 AliDebug(2,Form("cts = %f", cts));
1286 //___________________________________________________________________________
1287 Double_t AliCFHeavyFlavourTaskMultiVarMultiStep::CT(AliAODMCParticle* mcPart, AliAODMCParticle* mcPartDaughter0, AliAODMCParticle* mcPartDaughter1) const {
1290 // to calculate cT for generated particle
1293 Double_t xmcPart[3] = {0,0,0};
1294 Double_t xdaughter0[3] = {0,0,0};
1295 Double_t xdaughter1[3] = {0,0,0};
1296 mcPart->XvYvZv(xmcPart); // cm
1297 mcPartDaughter0->XvYvZv(xdaughter0); // cm
1298 mcPartDaughter1->XvYvZv(xdaughter1); //cm
1299 Double_t prodVtxD0 = TMath::Sqrt(xmcPart[0]*xmcPart[0]+
1300 xmcPart[1]*xmcPart[1]+
1301 xmcPart[2]*xmcPart[2]);
1302 Double_t prodVtxDaughter0 = TMath::Sqrt(xdaughter0[0]*xdaughter0[0]+
1303 xdaughter0[1]*xdaughter0[1]+
1304 xdaughter0[2]*xdaughter0[2]);
1305 Double_t prodVtxDaughter1 = TMath::Sqrt(xdaughter1[0]*xdaughter1[0]+
1306 xdaughter1[1]*xdaughter1[1]+
1307 xdaughter1[2]*xdaughter1[2]);
1309 AliDebug(2, Form("D0: x = %f, y = %f, z = %f, production vertex distance = %f (cm), %f (micron)", xmcPart[0], xmcPart[1], xmcPart[2], prodVtxD0, prodVtxD0*1.E4));
1310 AliDebug(2, Form("Daughter0: x = %f, y = %f, z = %f, production vertex distance = %f (cm) %f (micron)", xdaughter0[0], xdaughter0[1], xdaughter0[2], prodVtxDaughter0, prodVtxDaughter0*1E4));
1311 AliDebug(2, Form("Daughter1: x = %f, y = %f, z = %f, production vertex distance = %f (cm) %f (micron)", xdaughter1[0], xdaughter1[1], xdaughter1[2], prodVtxDaughter1, prodVtxDaughter1*1.E4));
1313 Double_t cT0 = TMath::Sqrt((xdaughter0[0]-xmcPart[0])*(xdaughter0[0]-xmcPart[0])+
1314 (xdaughter0[1]-xmcPart[1])*(xdaughter0[1]-xmcPart[1])+
1315 (xdaughter0[2]-xmcPart[2])*(xdaughter0[2]-xmcPart[2]));
1317 Double_t cT1 = TMath::Sqrt((xdaughter1[0]-xmcPart[0])*(xdaughter1[0]-xmcPart[0])+
1318 (xdaughter1[1]-xmcPart[1])*(xdaughter1[1]-xmcPart[1])+
1319 (xdaughter1[2]-xmcPart[2])*(xdaughter1[2]-xmcPart[2]));
1321 if ((cT0 - cT1)>1E-5) {
1322 AliWarning(Form("cT from daughter 0 (%f) different from cT from daughter 1 (%f)! Using cT from daughter 0, but PLEASE, CHECK....",cT0,cT1));
1325 // calculating cT from cT0
1327 Double_t mass = TDatabasePDG::Instance()->GetParticle(mcPart->GetPdgCode())->Mass(); // mcPart->GetPdgCode() should return +/- 421 for the D0/D0bar
1328 Double_t p = mcPart-> P();
1329 Double_t cT = cT0*mass/p;
1330 AliDebug(2, Form("cT from daughter 0 = %f (micron)", cT0*1E4));
1331 AliDebug(2, Form("cT from daughter 1 = %f (micron)", cT1*1E4));
1332 AliDebug(2, Form("cT (with mass = %f and p = %f) = %f (micron)", mass, p, cT*1E4));
1335 //________________________________________________________________________________
1336 Bool_t AliCFHeavyFlavourTaskMultiVarMultiStep::GetGeneratedValuesFromMCParticle(AliAODMCParticle* mcPart, TClonesArray* mcArray, Double_t* vectorMC) const {
1339 // collecting all the necessary info (pt, y, cosThetaStar, ptPi, ptKa, cT) from MC particle
1342 Bool_t isOk = kFALSE;
1344 // check whether the D0 decays in pi+K
1345 // to be added!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1346 // could use a cut in the CF, but not clear how to define a TDecayChannel
1347 // implemented for the time being as a cut on the number of daughters - see later when
1348 // getting the daughters
1350 // getting the daughters
1351 Int_t daughter0 = mcPart->GetDaughter(0);
1352 Int_t daughter1 = mcPart->GetDaughter(1);
1353 AliDebug(2, Form("daughter0 = %d and daughter1 = %d",daughter0,daughter1));
1354 if (daughter0 == 0 || daughter1 == 0) {
1355 AliDebug(2, "Error! the D0 MC doesn't have correct daughters!!");
1358 if (TMath::Abs(daughter1 - daughter0) != 1) {
1359 AliDebug(2, "The D0 MC doesn't come from a 2-prong decay, skipping!!");
1362 AliAODMCParticle* mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughter0));
1363 AliAODMCParticle* mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughter1));
1364 if (!mcPartDaughter0 || !mcPartDaughter1) {
1365 AliWarning("At least one Daughter Particle not found in tree, skipping");
1368 if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==321 &&
1369 TMath::Abs(mcPartDaughter1->GetPdgCode())==211) &&
1370 !(TMath::Abs(mcPartDaughter0->GetPdgCode())==211 &&
1371 TMath::Abs(mcPartDaughter1->GetPdgCode())==321)) {
1372 AliDebug(2, "The D0 MC doesn't come from a Kpi decay, skipping!!");
1376 Double_t vtx1[3] = {0,0,0}; // primary vertex
1377 Double_t vtx2daughter0[3] = {0,0,0}; // secondary vertex from daughter 0
1378 Double_t vtx2daughter1[3] = {0,0,0}; // secondary vertex from daughter 1
1379 mcPart->XvYvZv(vtx1); // cm
1380 // getting vertex from daughters
1381 mcPartDaughter0->XvYvZv(vtx2daughter0); // cm
1382 mcPartDaughter1->XvYvZv(vtx2daughter1); //cm
1383 if (vtx2daughter0[0] != vtx2daughter1[0] && vtx2daughter0[1] != vtx2daughter1[1] && vtx2daughter0[2] != vtx2daughter1[2]) {
1384 AliError("Daughters have different secondary vertex, skipping the track");
1389 // always instantiate the AliAODRecoDecay with the positive daughter first, the negative second
1390 AliAODMCParticle* positiveDaugh = mcPartDaughter0;
1391 AliAODMCParticle* negativeDaugh = mcPartDaughter1;
1392 if (mcPartDaughter0->GetPdgCode()<0 && mcPartDaughter1->GetPdgCode()>0){
1393 // inverting in case the positive daughter is the second one
1394 positiveDaugh = mcPartDaughter1;
1395 negativeDaugh = mcPartDaughter0;
1397 // getting the momentum from the daughters
1398 Double_t px[2] = {positiveDaugh->Px(), negativeDaugh->Px()};
1399 Double_t py[2] = {positiveDaugh->Py(), negativeDaugh->Py()};
1400 Double_t pz[2] = {positiveDaugh->Pz(), negativeDaugh->Pz()};
1402 Double_t d0[2] = {0.,0.};
1404 AliAODRecoDecayHF* decay = new AliAODRecoDecayHF(vtx1,vtx2daughter0,nprongs,charge,px,py,pz,d0);
1406 Double_t cosThetaStar = 0.;
1407 Double_t cosThetaStarD0 = 0.;
1408 Double_t cosThetaStarD0bar = 0.;
1409 cosThetaStarD0 = decay->CosThetaStar(1,421,211,321);
1410 cosThetaStarD0bar = decay->CosThetaStar(0,421,321,211);
1411 if (mcPart->GetPdgCode() == 421){ // D0
1412 AliDebug(3, Form("D0, with pdgprong0 = %d, pdgprong1 = %d",mcPartDaughter0->GetPdgCode(),mcPartDaughter1->GetPdgCode()));
1413 cosThetaStar = cosThetaStarD0;
1415 else if (mcPart->GetPdgCode() == -421){ // D0bar{
1416 AliDebug(3, Form("D0bar, with pdgprong0 = %d, pdgprong1 = %d",mcPartDaughter0->GetPdgCode(),mcPartDaughter1->GetPdgCode()));
1417 cosThetaStar = cosThetaStarD0bar;
1420 AliWarning("There are problems!! particle was expected to be either a D0 or a D0bar, check...");
1423 if (cosThetaStar < -1 || cosThetaStar > 1) {
1424 AliWarning("Invalid value for cosine Theta star, returning");
1428 // calculate cos(Theta*) according to the method implemented herein
1430 Double_t cts = 9999.;
1431 cts = CosThetaStar(mcPart, mcPartDaughter0, mcPartDaughter1);
1432 if (cts < -1 || cts > 1) {
1433 AliWarning("Invalid value for cosine Theta star from AliCFHeavyFlavourTaskMultiVarMultiStep method");
1435 if (TMath::Abs(cts - cosThetaStar)>0.001) {
1436 AliError(Form("cosThetaStar automatically calculated different from that manually calculated!!! cosThetaStar = %f, cosThetaStar = %f", cosThetaStar,cts));
1439 Double_t cT = decay->Ct(421);
1441 // calculate cT from the method implemented herein
1443 cT1 = CT(mcPart, mcPartDaughter0, mcPartDaughter1);
1445 if (TMath::Abs(cT1 - cT)>0.001) {
1446 AliError(Form("cT automatically calculated different from that manually calculated!!! cT = %f, cT1 = %f",cT,cT1));
1449 // get the pT of the daughters
1454 if (TMath::Abs(mcPartDaughter0->GetPdgCode()) == 211) {
1455 pTpi = mcPartDaughter0->Pt();
1456 pTK = mcPartDaughter1->Pt();
1459 pTpi = mcPartDaughter1->Pt();
1460 pTK = mcPartDaughter0->Pt();
1463 vectorMC[0] = mcPart->Pt();
1464 vectorMC[1] = mcPart->Y() ;
1465 vectorMC[2] = cosThetaStar ;
1466 vectorMC[3] = pTpi ;
1468 vectorMC[5] = cT*1.E4 ; // in micron
1469 vectorMC[6] = mcPart->Phi() ;
1473 //_________________________________________________________________________________________________
1474 Int_t AliCFHeavyFlavourTaskMultiVarMultiStep::CheckOrigin(AliAODMCParticle* mcPart, TClonesArray* mcArray)const{
1477 // checking whether the very mother of the D0 is a charm or a bottom quark
1480 Int_t pdgGranma = 0;
1482 mother = mcPart->GetMother();
1486 AliDebug(2,Form("mother at step %d = %d", istep, mother));
1487 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(mcArray->At(mother));
1488 pdgGranma = mcGranma->GetPdgCode();
1489 AliDebug(2,Form("Pdg mother at step %d = %d", istep, pdgGranma));
1490 Int_t abspdgGranma = TMath::Abs(pdgGranma);
1491 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)) {
1494 mother = mcGranma->GetMother();