32 #include <TParticle.h>
33 #include <TDatabasePDG.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"
51 #include "AliAODMCParticle.h"
52 #include "AliAODMCHeader.h"
53 #include "AliESDtrack.h"
55 #include "THnSparse.h"
62 fHistEventsProcessed(0x0),
64 fCountRecoDStarSel(0),
67 fMinITSClustersSoft(4),
76 AliAnalysisTaskSE(name),
78 fHistEventsProcessed(0x0),
80 fCountRecoDStarSel(0),
83 fMinITSClustersSoft(4),
89 Info(
"AliCFTaskForDStarAnalysis",
"Calling Constructor");
91 DefineOutput(1,TH1I::Class());
92 DefineOutput(2,AliCFContainer::Class());
93 DefineOutput(3,THnSparseD::Class());
103 AliAnalysisTaskSE::operator=(c) ;
112 AliAnalysisTaskSE(c),
113 fCFManager(c.fCFManager),
114 fHistEventsProcessed(c.fHistEventsProcessed),
115 fCorrelation(c.fCorrelation),
116 fCountRecoDStarSel(c.fCountRecoDStarSel),
118 fMinITSClusters(c.fMinITSClusters),
119 fMinITSClustersSoft(c.fMinITSClustersSoft),
120 fAcceptanceUnf(c.fAcceptanceUnf)
145 Error(
"UserExec",
"NO EVENT FOUND!");
149 AliAODEvent* aodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
151 TClonesArray *arrayDStartoD0pi=0;
153 if(!aodEvent && AODEvent() && IsStandardAOD()) {
156 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
159 AliAODHandler* aodHandler = (AliAODHandler*)
160 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
161 if(aodHandler->GetExtensions()) {
162 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
163 AliAODEvent *aodFromExt = ext->GetAOD();
164 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(
"Dstar");
167 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(
"Dstar");
170 if (!arrayDStartoD0pi) {
171 AliError(
"Could not find array of HF vertices");
177 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001)
return;
186 Double_t containerInput[15] ;
187 Double_t containerInputMC[15] ;
191 TClonesArray* mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
193 AliError(
"Could not find Monte-Carlo in AOD");
197 AliAODMCHeader *mcHeader =
dynamic_cast<AliAODMCHeader*
>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
199 AliError(
"Could not find MC Header in AOD");
204 AliAODVertex *vtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
205 Double_t zPrimVertex = vtx1->GetZ();
206 Double_t zMCVertex = mcHeader->GetVtxZ();
207 Bool_t vtxFlag = kTRUE;
208 TString
title=vtx1->GetTitle();
209 if(!title.Contains(
"VertexerTracks")) vtxFlag=kFALSE;
211 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
212 AliAODMCParticle* mcPart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iPart));
214 AliWarning(
"MC Particle not found in tree, skipping");
219 if (!
fCFManager->CheckParticleCuts(0, mcPart))
continue;
222 Double_t vectorMC[9] = {9999.,9999.,9999.,9999.,9999.,9999.,9999.,9999.,9999.};
226 containerInputMC[0] = vectorMC[0];
227 containerInputMC[1] = vectorMC[1] ;
228 containerInputMC[2] = vectorMC[2] ;
229 containerInputMC[3] = vectorMC[3] ;
230 containerInputMC[4] = vectorMC[4] ;
231 containerInputMC[5] = vectorMC[5] ;
232 containerInputMC[6] = 0.;
233 containerInputMC[7] = 0.;
234 containerInputMC[8] = 0.;
235 containerInputMC[9] = -100000.;
236 containerInputMC[10] = 1.01;
237 containerInputMC[11] = vectorMC[6];
238 containerInputMC[12] = zMCVertex;
239 containerInputMC[13] = vectorMC[7];
240 containerInputMC[14] = vectorMC[8];
247 Int_t daughter0 = mcPart->GetDaughter(0);
248 Int_t daughter1 = mcPart->GetDaughter(1);
250 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughter0,daughter1));
253 AliAODMCParticle* mcPartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter0));
254 if (!mcPartDaughter0) {
255 AliError(
"Could not find Monte-Carlo in AOD");
260 AliAODMCParticle* mcPartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter1));
261 if (!mcPartDaughter1) {
262 AliError(
"Could not find Monte-Carlo in AOD");
267 Double_t eta1 = mcPartDaughter1->Eta();
268 Double_t pt1 = mcPartDaughter1->Pt();
274 if(TMath::Abs(mcPartDaughter0->GetPdgCode())==421){
275 daughD00 = mcPartDaughter0->GetDaughter(0);
276 daughD01 = mcPartDaughter0->GetDaughter(1);
278 daughD00 = mcPartDaughter1->GetDaughter(0);
279 daughD01 = mcPartDaughter1->GetDaughter(1);
283 AliAODMCParticle* mcD0PartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughD00));
284 AliAODMCParticle* mcD0PartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughD01));
286 if (!mcD0PartDaughter0 || !mcD0PartDaughter1) {
287 AliWarning(
"At least one D0 Daughter Particle not found in tree, but it should be, this check was already done...");
292 Double_t theD0pt0 = mcD0PartDaughter0->Pt();
293 Double_t theD0pt1 = mcD0PartDaughter1->Pt();
294 Double_t theD0eta0 = mcD0PartDaughter0->Eta();
295 Double_t theD0eta1 = mcD0PartDaughter1->Eta();
300 Bool_t daught1inAcceptance = (TMath::Abs(eta1) <= 0.9 && pt1 >= 0.05);
302 Bool_t D0daught0inAcceptance = (TMath::Abs(theD0eta0) <= 0.9 && theD0pt0 >= 0.1);
303 Bool_t D0daught1inAcceptance = (TMath::Abs(theD0eta1) <= 0.9 && theD0pt1 >= 0.1);
305 if (daught1inAcceptance && D0daught0inAcceptance && D0daught1inAcceptance) {
307 AliDebug(2,
"D* Daughter particles in acceptance");
316 Bool_t refitFlag = kTRUE;
317 for (Int_t iaod =0; iaod<aodEvent->GetNumberOfTracks(); iaod++){
318 AliAODTrack *track = (AliAODTrack*)aodEvent->GetTrack(iaod);
321 if ((track->GetLabel() == daughD00) || (track->GetLabel() == daughD01)) {
322 if(!(track->GetStatus()&AliESDtrack::kTPCrefit) || !(track->GetStatus()&AliESDtrack::kITSrefit)) {
336 AliDebug(3,
"Problems in filling the container");
342 AliDebug(2, Form(
"Found %d D* candidates",arrayDStartoD0pi->GetEntriesFast()));
345 Int_t pdgDgDStartoD0pi[2]={421,211};
346 Int_t pdgDgD0toKpi[2]={321,211};
348 for (Int_t iDStartoD0pi = 0; iDStartoD0pi<arrayDStartoD0pi->GetEntriesFast(); iDStartoD0pi++) {
355 Bool_t unsetvtx=kFALSE;
364 Int_t mcLabel = dstarD0pi->
MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,mcArray);
367 Int_t mcD0Label = D0particle->MatchToMC(421,mcArray,2,pdgDgD0toKpi);
369 if (mcLabel == -1 || mcD0Label ==-1)
371 AliDebug(2,
"No MC particle found");
376 AliAODMCParticle* mcVtxHFDStar = (AliAODMCParticle*)mcArray->At(mcLabel);
377 AliAODMCParticle* mcVtxHFD0Kpi = (AliAODMCParticle*)mcArray->At(mcD0Label);
379 if (!mcVtxHFD0Kpi || !mcVtxHFDStar) {
380 AliWarning(
"Could not find associated MC D0 and/or D* in AOD MC tree");
385 AliAODTrack *track2 = (AliAODTrack*)dstarD0pi->
GetBachelor();
388 AliAODTrack *track0 = (AliAODTrack*)D0particle->GetDaughter(0);
389 AliAODTrack *track1 = (AliAODTrack*)D0particle->GetDaughter(1);
392 if (!
fCFManager->CheckParticleCuts(0 ,mcVtxHFDStar)) {
393 AliDebug(2,
"Skipping the particles due to cuts");
398 Double_t pt = TMath::Sqrt(TMath::Power(D0particle->Pt(),2)+TMath::Power(track2->Pt(),2));
400 Double_t cosThetaStar = 9999.;
403 Double_t dca = (D0particle->GetDCA())*1E4;
406 Double_t d0xd0 = (D0particle->
Prodd0d0())*1E8;
408 Double_t phi = D0particle->Phi();
411 Int_t pdgCode = mcVtxHFD0Kpi->GetPdgCode();
417 pTpi = D0particle->PtProng(0);
418 pTK = D0particle->PtProng(1);
419 d0pi = (D0particle->Getd0Prong(0))*1E4;
420 d0K = (D0particle->Getd0Prong(1))*1E4;
426 pTpi = D0particle->PtProng(1);
427 pTK = D0particle->PtProng(0);
428 d0pi = (D0particle->Getd0Prong(1))*1E4;
429 d0K = (D0particle->Getd0Prong(0))*1E4;
434 Double_t cT = D0particle->
CtD0();
436 containerInput[0] = pt;
438 containerInput[2] = cosThetaStar;
439 containerInput[3] = track2->Pt();
440 containerInput[4] = D0particle->Pt();
441 containerInput[5] = cT*1.E4;
442 containerInput[6] = dca;
443 containerInput[7] = d0pi;
444 containerInput[8] = d0K;
445 containerInput[9] = d0xd0;
446 containerInput[10] = cosPointingAngle;
447 containerInput[11] = phi;
448 containerInput[12] = zPrimVertex;
449 containerInput[13] = pTpi;
450 containerInput[14] = pTK;
455 if((!(track0->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track1->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track0->GetStatus()&AliESDtrack::kITSrefit)) || (!(track1->GetStatus()&AliESDtrack::kITSrefit))) {
460 if((!(track2->GetStatus()&AliESDtrack::kITSrefit))) {
465 Bool_t acceptanceProng0 = (TMath::Abs(D0particle->EtaProng(0))<= 0.9 && D0particle->PtProng(0) >= 0.1);
466 Bool_t acceptanceProng1 = (TMath::Abs(D0particle->EtaProng(1))<= 0.9 && D0particle->PtProng(1) >= 0.1);
469 Bool_t acceptanceProng2 = (TMath::Abs(track2->Eta())<= 0.9 && track2->Pt() >= 0.05);
471 if (acceptanceProng0 && acceptanceProng1 && acceptanceProng2) {
472 AliDebug(2,
"D* reco daughters in acceptance");
482 fill[2] = mcVtxHFDStar->Pt();
483 fill[3] = mcVtxHFDStar->Y();
488 Int_t ncls0=0,ncls1=0,ncls2=0;
489 for(Int_t l=0;l<6;l++) {
490 if(TESTBIT(track0->GetITSClusterMap(),l)) ncls0++;
491 if(TESTBIT(track1->GetITSClusterMap(),l)) ncls1++;
492 if(TESTBIT(track2->GetITSClusterMap(),l)) ncls2++;
495 AliDebug(2, Form(
"n clusters = %d", ncls0));
501 Double_t cuts[7] = {9999999., 1.1, 0., 9999999., 9999999., 0.,0.027};
504 Double_t theD0pt = D0particle->Pt();
515 else if (theD0pt > 1 && theD0pt <= 2){
524 else if (theD0pt > 2 && theD0pt <= 3){
533 else if (theD0pt > 3 && theD0pt <= 5){
542 else if (theD0pt > 5){
552 && TMath::Abs(cosThetaStar) < cuts[1]
555 && TMath::Abs(d0pi) < cuts[3]
556 && TMath::Abs(d0K) < cuts[4]
558 && cosPointingAngle > cuts[6]
561 AliDebug(2,
"Particle passed D* selection cuts");
572 fill[2] = mcVtxHFDStar->Pt();
573 fill[3] = mcVtxHFDStar->Y();
587 PostData(2,
fCFManager->GetParticleContainer()) ;
596 AliAnalysisTaskSE::Terminate();
599 AliCFContainer *cont=
dynamic_cast<AliCFContainer*
> (GetOutputData(2));
601 printf(
"CONTAINER NOT FOUND\n");
613 Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s\n", GetName());
627 Bool_t isDStar = kFALSE;
629 if(TMath::Abs(mcPart->GetPdgCode())!=413)
return isDStar;
632 Int_t daughter0 = mcPart->GetDaughter(0);
633 Int_t daughter1 = mcPart->GetDaughter(1);
635 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughter0,daughter1));
636 if (daughter0 == 0 || daughter1 == 0) {
637 AliDebug(2,
"Error! the D* MC doesn't have correct daughters!!");
641 if (TMath::Abs(daughter1 - daughter0) != 1) {
642 AliDebug(2,
"The D* MC doesn't come from a 2-prong decay, skipping!!");
646 AliAODMCParticle* mcPartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter0));
647 AliAODMCParticle* mcPartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter1));
648 if (!mcPartDaughter0 || !mcPartDaughter1) {
649 AliWarning(
"D*: At least one Daughter Particle not found in tree, skipping");
653 if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==421 &&
654 TMath::Abs(mcPartDaughter1->GetPdgCode())==211) &&
655 !(TMath::Abs(mcPartDaughter0->GetPdgCode())==211 &&
656 TMath::Abs(mcPartDaughter1->GetPdgCode())==421)) {
657 AliDebug(2,
"The D* MC doesn't come from a Kpi decay, skipping!!");
661 Double_t vtx2daughter0[3] = {0,0,0};
662 Double_t vtx2daughter1[3] = {0,0,0};
665 mcPartDaughter0->XvYvZv(vtx2daughter0);
666 mcPartDaughter1->XvYvZv(vtx2daughter1);
669 if (vtx2daughter0[0] != vtx2daughter1[0] && vtx2daughter0[1] != vtx2daughter1[1] && vtx2daughter0[2] != vtx2daughter1[2]) {
670 AliError(
"The D* daughters have different secondary vertex, skipping the track");
674 AliAODMCParticle* neutralDaugh = mcPartDaughter0;
676 Double_t VectorD0[2] ={0.,0.};
679 AliDebug(2,
"Error! the D0 MC doesn't have correct daughters!!");
687 if (TMath::Abs(mcPartDaughter0->GetPdgCode()) == 211) {
688 pTpi = mcPartDaughter0->Pt();
689 pTD0 = mcPartDaughter1->Pt();
692 pTpi = mcPartDaughter1->Pt();
693 pTD0 = mcPartDaughter0->Pt();
696 vectorMC[0] = mcPart->Pt();
697 vectorMC[1] = mcPart->Y() ;
702 vectorMC[6] = mcPart->Phi() ;
703 vectorMC[7] = VectorD0[0] ;
704 vectorMC[8] = VectorD0[1] ;
718 Bool_t isHadronic = kFALSE;
720 Int_t daughterD00 = neutralDaugh->GetDaughter(0);
721 Int_t daughterD01 = neutralDaugh->GetDaughter(1);
723 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughterD00,daughterD01));
724 if (daughterD00 == 0 || daughterD01 == 0) {
725 AliDebug(2,
"Error! the D0 MC doesn't have correct daughters!!");
729 if (TMath::Abs(daughterD01 - daughterD00) != 1) {
730 AliDebug(2,
"The D0 MC doesn't come from a 2-prong decay, skipping!!");
734 AliAODMCParticle* mcPartDaughterD00 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughterD00));
735 AliAODMCParticle* mcPartDaughterD01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughterD01));
736 if (!mcPartDaughterD00 || !mcPartDaughterD01) {
737 AliWarning(
"D0 MC analysis: At least one Daughter Particle not found in tree, skipping");
741 if (!(TMath::Abs(mcPartDaughterD00->GetPdgCode())==321 &&
742 TMath::Abs(mcPartDaughterD01->GetPdgCode())==211) &&
743 !(TMath::Abs(mcPartDaughterD00->GetPdgCode())==211 &&
744 TMath::Abs(mcPartDaughterD01->GetPdgCode())==321)) {
745 AliDebug(2,
"The D0 MC doesn't come from a Kpi decay, skipping!!");
753 if (TMath::Abs(mcPartDaughterD00->GetPdgCode()) == 211) {
754 pTD0pi = mcPartDaughterD00->Pt();
755 pTD0K = mcPartDaughterD01->Pt();
758 pTD0pi = mcPartDaughterD01->Pt();
759 pTD0K = mcPartDaughterD00->Pt();
764 VectorD0[0] = pTD0pi;
AliCFManager * fCFManager
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabs2prong, Int_t *pdgDg, Int_t *pdgDg2prong, TClonesArray *mcArray, Bool_t isV0=kFALSE) const
void UnsetOwnPrimaryVtx()
void UserExec(Option_t *option)
Bool_t fAcceptanceUnf
min n. of ITS clusters for RecoDecay soft pion
Double_t Prodd0d0() const
Bool_t GetDStarMCParticle(AliAODMCParticle *mcPart, TClonesArray *mcArray, Double_t *vectorMC) const
AliCFTaskForDStarAnalysis & operator=(const AliCFTaskForDStarAnalysis &c)
Bool_t EvaluateIfD0toKpi(AliAODMCParticle *neutralDaugh, TClonesArray *mcArray, Double_t *VectorD0) const
Int_t fMinITSClustersSoft
min n. of ITS clusters for RecoDecay
Double_t CosThetaStarD0bar() const
angle of K
Int_t fEvents
Reco particle found that satisfy cuts in D* selection.
AliAODTrack * GetBachelor() const
AliAODVertex * GetOwnPrimaryVtx() const
AliCFTaskForDStarAnalysis()
void SetOwnPrimaryVtx(const AliAODVertex *vtx)
void UserCreateOutputObjects()
ANALYSIS FRAMEWORK STUFF to loop on data and fill output objects.
TH1I * fHistEventsProcessed
pointer to the CF manager
Double_t CosPointingAngle() const
Double_t CosThetaStarD0() const
AliAODRecoDecayHF2Prong * Get2Prong() const
void Terminate(Option_t *)
virtual ~AliCFTaskForDStarAnalysis()
Int_t fMinITSClusters
n. of events