32 #include <TParticle.h> 33 #include <TDatabasePDG.h> 39 #include "AliMCEvent.h" 40 #include "AliCFManager.h" 41 #include "AliCFContainer.h" 43 #include "AliAnalysisManager.h" 44 #include "AliAODHandler.h" 45 #include "AliAODEvent.h" 46 #include "AliAODRecoDecay.h" 50 #include "AliAODMCParticle.h" 51 #include "AliAODMCHeader.h" 52 #include "AliESDtrack.h" 54 #include "THnSparse.h" 61 fHistEventsProcessed(0x0),
63 fCountRecoDStarSel(0),
66 fMinITSClustersSoft(4),
88 Info(
"AliCFTaskForDStarAnalysis",
"Calling Constructor");
90 DefineOutput(1,TH1I::Class());
91 DefineOutput(2,AliCFContainer::Class());
92 DefineOutput(3,THnSparseD::Class());
102 AliAnalysisTaskSE::operator=(c) ;
144 Error(
"UserExec",
"NO EVENT FOUND!");
150 TClonesArray *arrayDStartoD0pi=0;
152 if(!aodEvent && AODEvent() && IsStandardAOD()) {
155 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
158 AliAODHandler* aodHandler = (AliAODHandler*)
159 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
160 if(aodHandler->GetExtensions()) {
161 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
163 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(
"Dstar");
166 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(
"Dstar");
169 if (!arrayDStartoD0pi) {
170 AliError(
"Could not find array of HF vertices");
176 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001)
return;
190 TClonesArray* mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
192 AliError(
"Could not find Monte-Carlo in AOD");
196 AliAODMCHeader *mcHeader =
dynamic_cast<AliAODMCHeader*
>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
198 AliError(
"Could not find MC Header in AOD");
203 AliAODVertex *vtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
204 Double_t zPrimVertex = vtx1->GetZ();
205 Double_t zMCVertex = mcHeader->GetVtxZ();
208 if(!title.Contains(
"VertexerTracks")) vtxFlag=kFALSE;
210 for (
Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
211 AliAODMCParticle* mcPart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iPart));
213 AliWarning(
"MC Particle not found in tree, skipping");
218 if (!
fCFManager->CheckParticleCuts(0, mcPart))
continue;
221 Double_t vectorMC[9] = {9999.,9999.,9999.,9999.,9999.,9999.,9999.,9999.,9999.};
225 containerInputMC[0] = vectorMC[0];
226 containerInputMC[1] = vectorMC[1] ;
227 containerInputMC[2] = vectorMC[2] ;
228 containerInputMC[3] = vectorMC[3] ;
229 containerInputMC[4] = vectorMC[4] ;
230 containerInputMC[5] = vectorMC[5] ;
231 containerInputMC[6] = 0.;
232 containerInputMC[7] = 0.;
233 containerInputMC[8] = 0.;
234 containerInputMC[9] = -100000.;
235 containerInputMC[10] = 1.01;
236 containerInputMC[11] = vectorMC[6];
237 containerInputMC[12] = zMCVertex;
238 containerInputMC[13] = vectorMC[7];
239 containerInputMC[14] = vectorMC[8];
246 Int_t daughter0 = mcPart->GetDaughter(0);
247 Int_t daughter1 = mcPart->GetDaughter(1);
249 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughter0,daughter1));
252 AliAODMCParticle* mcPartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter0));
253 if (!mcPartDaughter0) {
254 AliError(
"Could not find Monte-Carlo in AOD");
259 AliAODMCParticle* mcPartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter1));
260 if (!mcPartDaughter1) {
261 AliError(
"Could not find Monte-Carlo in AOD");
266 Double_t eta1 = mcPartDaughter1->Eta();
267 Double_t pt1 = mcPartDaughter1->Pt();
273 if(TMath::Abs(mcPartDaughter0->GetPdgCode())==421){
274 daughD00 = mcPartDaughter0->GetDaughter(0);
275 daughD01 = mcPartDaughter0->GetDaughter(1);
277 daughD00 = mcPartDaughter1->GetDaughter(0);
278 daughD01 = mcPartDaughter1->GetDaughter(1);
282 AliAODMCParticle* mcD0PartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughD00));
283 AliAODMCParticle* mcD0PartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughD01));
285 if (!mcD0PartDaughter0 || !mcD0PartDaughter1) {
286 AliWarning(
"At least one D0 Daughter Particle not found in tree, but it should be, this check was already done...");
291 Double_t theD0pt0 = mcD0PartDaughter0->Pt();
292 Double_t theD0pt1 = mcD0PartDaughter1->Pt();
293 Double_t theD0eta0 = mcD0PartDaughter0->Eta();
294 Double_t theD0eta1 = mcD0PartDaughter1->Eta();
299 Bool_t daught1inAcceptance = (TMath::Abs(eta1) <= 0.9 && pt1 >= 0.05);
301 Bool_t D0daught0inAcceptance = (TMath::Abs(theD0eta0) <= 0.9 && theD0pt0 >= 0.1);
302 Bool_t D0daught1inAcceptance = (TMath::Abs(theD0eta1) <= 0.9 && theD0pt1 >= 0.1);
304 if (daught1inAcceptance && D0daught0inAcceptance && D0daught1inAcceptance) {
306 AliDebug(2,
"D* Daughter particles in acceptance");
316 for (
Int_t iaod =0; iaod<aodEvent->GetNumberOfTracks(); iaod++){
317 AliAODTrack *track = (AliAODTrack*)aodEvent->GetTrack(iaod);
320 if ((track->GetLabel() == daughD00) || (track->GetLabel() == daughD01)) {
321 if(!(track->GetStatus()&AliESDtrack::kTPCrefit) || !(track->GetStatus()&AliESDtrack::kITSrefit)) {
335 AliDebug(3,
"Problems in filling the container");
341 AliDebug(2, Form(
"Found %d D* candidates",arrayDStartoD0pi->GetEntriesFast()));
344 Int_t pdgDgDStartoD0pi[2]={421,211};
345 Int_t pdgDgD0toKpi[2]={321,211};
347 for (
Int_t iDStartoD0pi = 0; iDStartoD0pi<arrayDStartoD0pi->GetEntriesFast(); iDStartoD0pi++) {
363 Int_t mcLabel = dstarD0pi->
MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,mcArray);
366 Int_t mcD0Label = D0particle->MatchToMC(421,mcArray,2,pdgDgD0toKpi);
368 if (mcLabel == -1 || mcD0Label ==-1)
370 AliDebug(2,
"No MC particle found");
375 AliAODMCParticle* mcVtxHFDStar = (AliAODMCParticle*)mcArray->At(mcLabel);
376 AliAODMCParticle* mcVtxHFD0Kpi = (AliAODMCParticle*)mcArray->At(mcD0Label);
378 if (!mcVtxHFD0Kpi || !mcVtxHFDStar) {
379 AliWarning(
"Could not find associated MC D0 and/or D* in AOD MC tree");
384 AliAODTrack *track2 = (AliAODTrack*)dstarD0pi->
GetBachelor();
387 AliAODTrack *track0 = (AliAODTrack*)D0particle->GetDaughter(0);
388 AliAODTrack *track1 = (AliAODTrack*)D0particle->GetDaughter(1);
391 if (!
fCFManager->CheckParticleCuts(0 ,mcVtxHFDStar)) {
392 AliDebug(2,
"Skipping the particles due to cuts");
397 Double_t pt = TMath::Sqrt(TMath::Power(D0particle->Pt(),2)+TMath::Power(track2->Pt(),2));
402 Double_t dca = (D0particle->GetDCA())*1E4;
410 Int_t pdgCode = mcVtxHFD0Kpi->GetPdgCode();
416 pTpi = D0particle->PtProng(0);
417 pTK = D0particle->PtProng(1);
418 d0pi = (D0particle->Getd0Prong(0))*1E4;
419 d0K = (D0particle->Getd0Prong(1))*1E4;
425 pTpi = D0particle->PtProng(1);
426 pTK = D0particle->PtProng(0);
427 d0pi = (D0particle->Getd0Prong(1))*1E4;
428 d0K = (D0particle->Getd0Prong(0))*1E4;
435 containerInput[0] = pt;
437 containerInput[2] = cosThetaStar;
438 containerInput[3] = track2->Pt();
439 containerInput[4] = D0particle->Pt();
440 containerInput[5] = cT*1.E4;
441 containerInput[6] = dca;
442 containerInput[7] = d0pi;
443 containerInput[8] = d0K;
444 containerInput[9] = d0xd0;
445 containerInput[10] = cosPointingAngle;
446 containerInput[11] = phi;
447 containerInput[12] = zPrimVertex;
448 containerInput[13] = pTpi;
449 containerInput[14] = pTK;
454 if((!(track0->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track1->GetStatus()&AliESDtrack::kTPCrefit)) || (!(track0->GetStatus()&AliESDtrack::kITSrefit)) || (!(track1->GetStatus()&AliESDtrack::kITSrefit))) {
459 if((!(track2->GetStatus()&AliESDtrack::kITSrefit))) {
464 Bool_t acceptanceProng0 = (TMath::Abs(D0particle->EtaProng(0))<= 0.9 && D0particle->PtProng(0) >= 0.1);
465 Bool_t acceptanceProng1 = (TMath::Abs(D0particle->EtaProng(1))<= 0.9 && D0particle->PtProng(1) >= 0.1);
468 Bool_t acceptanceProng2 = (TMath::Abs(track2->Eta())<= 0.9 && track2->Pt() >= 0.05);
470 if (acceptanceProng0 && acceptanceProng1 && acceptanceProng2) {
471 AliDebug(2,
"D* reco daughters in acceptance");
481 fill[2] = mcVtxHFDStar->Pt();
482 fill[3] = mcVtxHFDStar->Y();
487 Int_t ncls0=0,ncls1=0,ncls2=0;
488 for(
Int_t l=0;l<6;l++) {
489 if(TESTBIT(track0->GetITSClusterMap(),l)) ncls0++;
490 if(TESTBIT(track1->GetITSClusterMap(),l)) ncls1++;
491 if(TESTBIT(track2->GetITSClusterMap(),l)) ncls2++;
494 AliDebug(2, Form(
"n clusters = %d", ncls0));
500 Double_t cuts[7] = {9999999., 1.1, 0., 9999999., 9999999., 0.,0.027};
503 Double_t theD0pt = D0particle->Pt();
514 else if (theD0pt > 1 && theD0pt <= 2){
523 else if (theD0pt > 2 && theD0pt <= 3){
532 else if (theD0pt > 3 && theD0pt <= 5){
541 else if (theD0pt > 5){
551 && TMath::Abs(cosThetaStar) < cuts[1]
554 && TMath::Abs(d0pi) < cuts[3]
555 && TMath::Abs(d0K) < cuts[4]
557 && cosPointingAngle > cuts[6]
560 AliDebug(2,
"Particle passed D* selection cuts");
571 fill[2] = mcVtxHFDStar->Pt();
572 fill[3] = mcVtxHFDStar->Y();
586 PostData(2,
fCFManager->GetParticleContainer()) ;
595 AliAnalysisTaskSE::Terminate();
598 AliCFContainer *cont=
dynamic_cast<AliCFContainer*
> (GetOutputData(2));
600 printf(
"CONTAINER NOT FOUND\n");
612 Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s\n", GetName());
628 if(TMath::Abs(mcPart->GetPdgCode())!=413)
return isDStar;
631 Int_t daughter0 = mcPart->GetDaughter(0);
632 Int_t daughter1 = mcPart->GetDaughter(1);
634 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughter0,daughter1));
635 if (daughter0 == 0 || daughter1 == 0) {
636 AliDebug(2,
"Error! the D* MC doesn't have correct daughters!!");
640 if (TMath::Abs(daughter1 - daughter0) != 1) {
641 AliDebug(2,
"The D* MC doesn't come from a 2-prong decay, skipping!!");
645 AliAODMCParticle* mcPartDaughter0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter0));
646 AliAODMCParticle* mcPartDaughter1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughter1));
647 if (!mcPartDaughter0 || !mcPartDaughter1) {
648 AliWarning(
"D*: At least one Daughter Particle not found in tree, skipping");
652 if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==421 &&
653 TMath::Abs(mcPartDaughter1->GetPdgCode())==211) &&
654 !(TMath::Abs(mcPartDaughter0->GetPdgCode())==211 &&
655 TMath::Abs(mcPartDaughter1->GetPdgCode())==421)) {
656 AliDebug(2,
"The D* MC doesn't come from a Kpi decay, skipping!!");
660 Double_t vtx2daughter0[3] = {0,0,0};
661 Double_t vtx2daughter1[3] = {0,0,0};
664 mcPartDaughter0->XvYvZv(vtx2daughter0);
665 mcPartDaughter1->XvYvZv(vtx2daughter1);
668 if (vtx2daughter0[0] != vtx2daughter1[0] && vtx2daughter0[1] != vtx2daughter1[1] && vtx2daughter0[2] != vtx2daughter1[2]) {
669 AliError(
"The D* daughters have different secondary vertex, skipping the track");
673 AliAODMCParticle* neutralDaugh = mcPartDaughter0;
678 AliDebug(2,
"Error! the D0 MC doesn't have correct daughters!!");
686 if (TMath::Abs(mcPartDaughter0->GetPdgCode()) == 211) {
687 pTpi = mcPartDaughter0->Pt();
688 pTD0 = mcPartDaughter1->Pt();
691 pTpi = mcPartDaughter1->Pt();
692 pTD0 = mcPartDaughter0->Pt();
695 vectorMC[0] = mcPart->Pt();
696 vectorMC[1] = mcPart->Y() ;
701 vectorMC[6] = mcPart->Phi() ;
702 vectorMC[7] = VectorD0[0] ;
703 vectorMC[8] = VectorD0[1] ;
717 Bool_t isHadronic = kFALSE;
719 Int_t daughterD00 = neutralDaugh->GetDaughter(0);
720 Int_t daughterD01 = neutralDaugh->GetDaughter(1);
722 AliDebug(2, Form(
"daughter0 = %d and daughter1 = %d",daughterD00,daughterD01));
723 if (daughterD00 == 0 || daughterD01 == 0) {
724 AliDebug(2,
"Error! the D0 MC doesn't have correct daughters!!");
728 if (TMath::Abs(daughterD01 - daughterD00) != 1) {
729 AliDebug(2,
"The D0 MC doesn't come from a 2-prong decay, skipping!!");
733 AliAODMCParticle* mcPartDaughterD00 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughterD00));
734 AliAODMCParticle* mcPartDaughterD01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughterD01));
735 if (!mcPartDaughterD00 || !mcPartDaughterD01) {
736 AliWarning(
"D0 MC analysis: At least one Daughter Particle not found in tree, skipping");
740 if (!(TMath::Abs(mcPartDaughterD00->GetPdgCode())==321 &&
741 TMath::Abs(mcPartDaughterD01->GetPdgCode())==211) &&
742 !(TMath::Abs(mcPartDaughterD00->GetPdgCode())==211 &&
743 TMath::Abs(mcPartDaughterD01->GetPdgCode())==321)) {
744 AliDebug(2,
"The D0 MC doesn't come from a Kpi decay, skipping!!");
752 if (TMath::Abs(mcPartDaughterD00->GetPdgCode()) == 211) {
753 pTD0pi = mcPartDaughterD00->Pt();
754 pTD0K = mcPartDaughterD01->Pt();
757 pTD0pi = mcPartDaughterD01->Pt();
758 pTD0K = mcPartDaughterD00->Pt();
763 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()
Int_t fCountRecoDStarSel
response matrix for unfolding
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 *)
TList * OpenFile(const char *fname)
virtual ~AliCFTaskForDStarAnalysis()
Int_t fMinITSClusters
n. of events