25 #include <TParticle.h>
27 #include <THnSparse.h>
30 #include <TDatabasePDG.h>
31 #include <TParameter.h>
32 #include <AliAnalysisDataSlot.h>
33 #include <AliAnalysisDataContainer.h>
36 #include "AliMCEvent.h"
37 #include "AliAnalysisManager.h"
38 #include "AliAODMCHeader.h"
39 #include "AliAODHandler.h"
41 #include "AliAODVertex.h"
42 #include "AliAODRecoDecay.h"
47 #include "AliESDtrack.h"
48 #include "AliAODMCParticle.h"
50 #include "AliAODEvent.h"
51 #include "AliVertexerTracks.h"
52 #include "AliNeutralTrackParam.h"
63 fSingleSideband(kFALSE),
77 fIsSignalPrompt(kFALSE),
78 fIsSignalFromB(kFALSE),
79 fIsBackground(kFALSE),
92 AliAnalysisTaskSE(name),
97 fSingleSideband(kFALSE),
105 fListSignalPrompt(0),
111 fIsSignalPrompt(kFALSE),
112 fIsSignalFromB(kFALSE),
113 fIsBackground(kFALSE),
121 fSignalTypeForTree(0)
132 DefineOutput(1, TH1D::Class());
133 DefineOutput(2, TList::Class());
134 DefineOutput(3, TList::Class());
135 DefineOutput(4, TList::Class());
136 DefineOutput(5, TList::Class());
137 DefineOutput(6, TList::Class());
138 DefineOutput(7, AliRDHFCutsDStartoKpipi::Class());
139 DefineOutput(8, AliNormalizationCounter::Class());
140 DefineOutput(9, TTree::Class());
142 for (Int_t i=0;i<30;i++) {
171 const char* name = GetOutputSlot(7)->GetContainer()->GetName();
172 copyCuts->SetName(name);
174 PostData(7, copyCuts);
176 fPDGMDStarD0 = TDatabasePDG::Instance()->GetParticle(413)->Mass() - TDatabasePDG::Instance()->GetParticle(421)->Mass();
181 fNEvents =
new TH1D(GetOutputSlot(1)->GetContainer()->GetName(),
"Counter", 21, -0.5, 20.5);
182 fNEvents->GetXaxis()->SetBinLabel(1,
"Events");
183 fNEvents->GetXaxis()->SetBinLabel(2,
"Magnetic field");
184 fNEvents->GetXaxis()->SetBinLabel(3,
"Selected");
185 fNEvents->GetXaxis()->SetBinLabel(4,
"Primary vertex");
186 fNEvents->GetXaxis()->SetBinLabel(5,
"Candidates");
187 fNEvents->GetXaxis()->SetBinLabel(6,
"Passed track cuts");
188 fNEvents->GetXaxis()->SetBinLabel(7,
"Passed fiducial acc cuts");
189 fNEvents->GetXaxis()->SetBinLabel(8,
"Passed cand cuts");
190 fNEvents->GetXaxis()->SetBinLabel(9,
"Recalc prim vtx");
191 fNEvents->GetXaxis()->SetBinLabel(10,
"Calc D* vtx");
192 fNEvents->GetXaxis()->SetBinLabel(11,
"Pass daught imppar cut");
193 fNEvents->GetXaxis()->SetBinLabel(12,
"Real D* (MC)");
194 fNEvents->GetXaxis()->SetBinLabel(13,
"Skip from Hijing (MC)");
237 fTreeCandidate =
new TTree(GetOutputSlot(9)->GetContainer()->GetName(), GetOutputSlot(9)->GetContainer()->GetName());
257 TString listName = list->GetName();
258 listName.ReplaceAll(
"list",
"");
260 if (listName.EqualTo(
"signalfromb")) {
261 listName =
"signal from B";
263 if (listName.EqualTo(
"signalprompt")) {
264 listName =
"signal prompt";
267 TString regions[3] = {
"",
"Peak",
"Sideband"};
270 TH1D* hDeltaInvMass =
new TH1D(
"DeltaInvMass", Form(
"D*-D^{0} invariant mass, %s; #DeltaM [GeV/c^{2}]; Entries", listName.Data()), 700, 0.13, 0.2);
271 hDeltaInvMass->Sumw2();
272 hDeltaInvMass->SetLineColor(4);
273 hDeltaInvMass->SetMarkerColor(4);
274 hDeltaInvMass->SetMarkerStyle(20);
275 hDeltaInvMass->SetMarkerSize(0.6);
276 list->Add(hDeltaInvMass);
279 TH1D* hDeltaInvMassPre =
new TH1D(
"DeltaInvMassPre", Form(
"D*-D^{0} invariant mass pre vtx, %s; #DeltaM [GeV/c^{2}]; Entries", listName.Data()), 700, 0.13, 0.2);
280 hDeltaInvMassPre->Sumw2();
281 hDeltaInvMassPre->SetLineColor(4);
282 hDeltaInvMassPre->SetMarkerColor(4);
283 hDeltaInvMassPre->SetMarkerStyle(20);
284 hDeltaInvMassPre->SetMarkerSize(0.6);
285 list->Add(hDeltaInvMassPre);
288 TH1D* hInvMassD0 =
new TH1D(
"InvMassD0", Form(
"D^{0} invariant mass, %s; M [GeV/c^{2}]; Entries", listName.Data()), 600, 1.6, 2.2);
290 hInvMassD0->SetLineColor(4);
291 hInvMassD0->SetMarkerColor(4);
292 hInvMassD0->SetMarkerStyle(20);
293 hInvMassD0->SetMarkerSize(0.6);
294 list->Add(hInvMassD0);
296 for (Int_t r=0;r<3;r++) {
297 TString regionTitle(regions[r]);
298 if (!regionTitle.EqualTo(
"")) {
299 regionTitle.ToLower();
300 regionTitle.Prepend(
", ");
301 regionTitle.Append(
" region");
305 TH1D* hImpPar =
new TH1D(Form(
"ImpPar%s", regions[r].
Data()), Form(
"D* impact parameter%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
307 hImpPar->SetLineColor(4);
308 hImpPar->SetMarkerColor(4);
309 hImpPar->SetMarkerStyle(20);
310 hImpPar->SetMarkerSize(0.6);
314 TH1D* hImpParSoftPi =
new TH1D(Form(
"ImpParSoftPi%s", regions[r].
Data()), Form(
"#pi_{s} impact parameter%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
315 hImpParSoftPi->Sumw2();
316 hImpParSoftPi->SetLineColor(4);
317 hImpParSoftPi->SetMarkerColor(4);
318 hImpParSoftPi->SetMarkerStyle(20);
319 hImpParSoftPi->SetMarkerSize(0.6);
320 list->Add(hImpParSoftPi);
323 TH1D* hImpParD0 =
new TH1D(Form(
"ImpParD0%s", regions[r].
Data()), Form(
"D^{0} impact parameter%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
325 hImpParD0->SetLineColor(4);
326 hImpParD0->SetMarkerColor(4);
327 hImpParD0->SetMarkerStyle(20);
328 hImpParD0->SetMarkerSize(0.6);
329 list->Add(hImpParD0);
332 TH1D* hImpParD0K =
new TH1D(Form(
"ImpParD0K%s", regions[r].
Data()), Form(
"K (from D^{0}) impact parameter%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
334 hImpParD0K->SetLineColor(4);
335 hImpParD0K->SetMarkerColor(4);
336 hImpParD0K->SetMarkerStyle(20);
337 hImpParD0K->SetMarkerSize(0.6);
338 list->Add(hImpParD0K);
341 TH1D* hImpParD0K2 =
new TH1D(Form(
"ImpParD0K2%s", regions[r].
Data()), Form(
"K (from D^{0}) impact parameter (no recalc prim vtx)%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
342 hImpParD0K2->Sumw2();
343 hImpParD0K2->SetLineColor(4);
344 hImpParD0K2->SetMarkerColor(4);
345 hImpParD0K2->SetMarkerStyle(20);
346 hImpParD0K2->SetMarkerSize(0.6);
347 list->Add(hImpParD0K2);
350 TH1D* hImpParD0Pi =
new TH1D(Form(
"ImpParD0Pi%s", regions[r].
Data()), Form(
"#pi (from D^{0}) impact parameter%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
351 hImpParD0Pi->Sumw2();
352 hImpParD0Pi->SetLineColor(4);
353 hImpParD0Pi->SetMarkerColor(4);
354 hImpParD0Pi->SetMarkerStyle(20);
355 hImpParD0Pi->SetMarkerSize(0.6);
356 list->Add(hImpParD0Pi);
359 TH1D* hImpParD0Pi2 =
new TH1D(Form(
"ImpParD0Pi2%s", regions[r].
Data()), Form(
"#pi (from D^{0}) impact parameter (no recalc prim vtx)%s, %s; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data()), 1000, -1000., 1000.);
360 hImpParD0Pi2->Sumw2();
361 hImpParD0Pi2->SetLineColor(4);
362 hImpParD0Pi2->SetMarkerColor(4);
363 hImpParD0Pi2->SetMarkerStyle(20);
364 hImpParD0Pi2->SetMarkerSize(0.6);
365 list->Add(hImpParD0Pi2);
371 Float_t ptLow = ptLimits[i];
372 Float_t ptHigh = ptLimits[(i+1)];
374 TH1D* hDeltaInvMassLoop =
new TH1D(Form(
"DeltaInvMass_%d", i), Form(
"D*-D^{0} invariant mass, %s, %.1f < p_{T} < %.1f GeV/c; #DeltaM [GeV/c^{2}]; Entries", listName.Data(), ptLow, ptHigh), 700, 0.13, 0.2);
375 hDeltaInvMassLoop->Sumw2();
376 hDeltaInvMassLoop->SetLineColor(4);
377 hDeltaInvMassLoop->SetMarkerColor(4);
378 hDeltaInvMassLoop->SetMarkerStyle(20);
379 hDeltaInvMassLoop->SetMarkerSize(0.6);
380 list->Add(hDeltaInvMassLoop);
382 TH1D* hDeltaInvMassPreLoop =
new TH1D(Form(
"DeltaInvMassPre_%d", i), Form(
"D*-D^{0} invariant mass pre vtx, %s, %.1f < p_{T} < %.1f GeV/c; #DeltaM [GeV/c^{2}]; Entries", listName.Data(), ptLow, ptHigh), 700, 0.13, 0.2);
383 hDeltaInvMassPreLoop->Sumw2();
384 hDeltaInvMassPreLoop->SetLineColor(4);
385 hDeltaInvMassPreLoop->SetMarkerColor(4);
386 hDeltaInvMassPreLoop->SetMarkerStyle(20);
387 hDeltaInvMassPreLoop->SetMarkerSize(0.6);
388 list->Add(hDeltaInvMassPreLoop);
390 TH1D* hInvMassD0Loop =
new TH1D(Form(
"InvMassD0_%d", i), Form(
"D^{0} invariant mass, %s, %.1f < p_{T} < %.1f GeV/c; M [GeV/c^{2}]; Entries", listName.Data(), ptLow, ptHigh), 600, 1.6, 2.2);
391 hInvMassD0Loop->Sumw2();
392 hInvMassD0Loop->SetLineColor(4);
393 hInvMassD0Loop->SetMarkerColor(4);
394 hInvMassD0Loop->SetMarkerStyle(20);
395 hInvMassD0Loop->SetMarkerSize(0.6);
396 list->Add(hInvMassD0Loop);
398 for (Int_t r=0;r<3;r++) {
399 TString regionTitle(regions[r]);
400 if (!regionTitle.EqualTo(
"")) {
401 regionTitle.ToLower();
402 regionTitle.Prepend(
", ");
403 regionTitle.Append(
" region");
407 TH1D* hImpPar =
new TH1D(Form(
"ImpPar%s_%d", regions[r].
Data(), i), Form(
"D* impact parameter%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
409 hImpPar->SetLineColor(4);
410 hImpPar->SetMarkerColor(4);
411 hImpPar->SetMarkerStyle(20);
412 hImpPar->SetMarkerSize(0.6);
416 TH1D* hImpParSoftPi =
new TH1D(Form(
"ImpParSoftPi%s_%d", regions[r].
Data(), i), Form(
"#pi_{s} impact parameter%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
417 hImpParSoftPi->Sumw2();
418 hImpParSoftPi->SetLineColor(4);
419 hImpParSoftPi->SetMarkerColor(4);
420 hImpParSoftPi->SetMarkerStyle(20);
421 hImpParSoftPi->SetMarkerSize(0.6);
422 list->Add(hImpParSoftPi);
425 TH1D* hImpParD0 =
new TH1D(Form(
"ImpParD0%s_%d", regions[r].
Data(), i), Form(
"D^{0} impact parameter%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
427 hImpParD0->SetLineColor(4);
428 hImpParD0->SetMarkerColor(4);
429 hImpParD0->SetMarkerStyle(20);
430 hImpParD0->SetMarkerSize(0.6);
431 list->Add(hImpParD0);
434 TH1D* hImpParD0K =
new TH1D(Form(
"ImpParD0K%s_%d", regions[r].
Data(), i), Form(
"K (from D^{0}) impact parameter%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
436 hImpParD0K->SetLineColor(4);
437 hImpParD0K->SetMarkerColor(4);
438 hImpParD0K->SetMarkerStyle(20);
439 hImpParD0K->SetMarkerSize(0.6);
440 list->Add(hImpParD0K);
443 TH1D* hImpParD0K2 =
new TH1D(Form(
"ImpParD0K2%s_%d", regions[r].
Data(), i), Form(
"K (from D^{0}) impact parameter (no recalc prim vtx)%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
444 hImpParD0K2->Sumw2();
445 hImpParD0K2->SetLineColor(4);
446 hImpParD0K2->SetMarkerColor(4);
447 hImpParD0K2->SetMarkerStyle(20);
448 hImpParD0K2->SetMarkerSize(0.6);
449 list->Add(hImpParD0K2);
452 TH1D* hImpParD0Pi =
new TH1D(Form(
"ImpParD0Pi%s_%d", regions[r].
Data(), i), Form(
"#pi (from D^{0}) impact parameter%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
453 hImpParD0Pi->Sumw2();
454 hImpParD0Pi->SetLineColor(4);
455 hImpParD0Pi->SetMarkerColor(4);
456 hImpParD0Pi->SetMarkerStyle(20);
457 hImpParD0Pi->SetMarkerSize(0.6);
458 list->Add(hImpParD0Pi);
461 TH1D* hImpParD0Pi2 =
new TH1D(Form(
"ImpParD0Pi2%s_%d", regions[r].
Data(), i), Form(
"#pi (from D^{0}) impact parameter (no recalc prim vtx)%s, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", regionTitle.Data(), listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
462 hImpParD0Pi2->Sumw2();
463 hImpParD0Pi2->SetLineColor(4);
464 hImpParD0Pi2->SetMarkerColor(4);
465 hImpParD0Pi2->SetMarkerStyle(20);
466 hImpParD0Pi2->SetMarkerSize(0.6);
467 list->Add(hImpParD0Pi2);
473 Int_t sparseBins[3] = {1000, 1000, 1000}; Double_t sparseLow[3] = {-0.5, -0.5, -0.5}; Double_t sparseHigh[3] = {999.5, 999.5, 999.5};
474 THnSparseF* hPDG =
new THnSparseF(
"PDGMotherPeak",
"PDG mother, peak region, background", 3, sparseBins, sparseLow, sparseHigh);
481 Float_t ptLow = ptLimits[i];
482 Float_t ptHigh = ptLimits[(i+1)];
484 TH1D* hImpParTrue =
new TH1D(Form(
"ImpParTrue_%d", i), Form(
"True D* impact parameter, %s, %.1f < p_{T} < %.1f GeV/c; Impact parameter [#mum]; Entries", listName.Data(), ptLow, ptHigh), 1000, -1000., 1000.);
485 hImpParTrue->Sumw2();
486 hImpParTrue->SetLineColor(4);
487 hImpParTrue->SetMarkerColor(4);
488 hImpParTrue->SetMarkerStyle(20);
489 hImpParTrue->SetMarkerSize(0.6);
490 list->Add(hImpParTrue);
497 list->Add(pSingleSideband);
504 list->Add(pSidebandCut);
507 list->Add(pSidebandWindow);
514 Error(
"UserExec",
"NO EVENT FOUND!");
518 AliAODEvent *aodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
519 TClonesArray *arrayCand = 0;
523 if (!aodEvent && AODEvent() && IsStandardAOD()) {
524 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
525 AliAODHandler* aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
526 if(aodHandler->GetExtensions()) {
527 AliAODExtension *ext = (AliAODExtension*) aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
528 AliAODEvent *aodFromExt = ext->GetAOD();
529 arrayCand = (TClonesArray*) aodFromExt->GetList()->FindObject(
"Dstar");
533 arrayCand = (TClonesArray*) aodEvent->GetList()->FindObject(
"Dstar");
536 Int_t pdgDgDStartoD0pi[2] = {421, 211};
537 Int_t pdgDgD0toKpi[2] = {321, 211};
539 TClonesArray *mcArray = 0;
540 AliAODMCHeader *mcHeader = 0;
542 mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
544 AliError(
"Could not find Monte-Carlo in AOD");
548 mcHeader = (AliAODMCHeader*) aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
550 printf(
"AliAnalysisTaskSEDplus::UserExec: MC header branch not found!\n");
555 if (!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField()) < 0.001) {
569 AliAODVertex *vtx1 = (AliAODVertex*) aodEvent->GetPrimaryVertex();
570 if (!vtx1 || vtx1->GetNContributors() < 1) {
576 AliInfo(
"Could not find array of HF vertices, skipping the event");
580 AliDebug(2, Form(
"Found %d vertices", arrayCand->GetEntriesFast()));
586 Int_t nSelectedProd = 0;
587 Int_t nSelectedAna = 0;
589 Int_t nCand = arrayCand->GetEntriesFast();
590 for (Int_t iCand = 0; iCand<nCand; iCand++) {
606 if (ptBin < 0 || ptBin >=
fNPtBins) {
638 FillHistogram(Form(
"DeltaInvMassPre_%d", ptBin), deltaInvMass);
665 d0 = TMath::Abs(d0*1.e4);
673 d0 = TMath::Abs(d0*1.e4);
681 d0 = TMath::Abs(d0*1.e4);
691 AliAODMCParticle *partDSt = 0;
695 Int_t mcLabel = cand->
MatchToMC(413, 421, pdgDgDStartoD0pi, pdgDgD0toKpi, mcArray);
701 partDSt = (AliAODMCParticle*) mcArray->At(mcLabel);
711 if (
IsFromB(mcArray, partDSt)) {
727 AliAODTrack *daughters[3];
728 daughters[0] = candSoftPi;
730 if (((AliAODTrack*) candD0->GetDaughter(0))->Charge()*cand->Charge() > 0) {
732 daughters[1] = (AliAODTrack*) candD0->GetDaughter(0);
733 daughters[2] = (AliAODTrack*) candD0->GetDaughter(1);
736 daughters[1] = (AliAODTrack*) candD0->GetDaughter(1);
737 daughters[2] = (AliAODTrack*) candD0->GetDaughter(0);
740 Double_t PDGCodes[3] = {0., 0., 0.};
742 for (Int_t iD=0; iD<3; iD++) {
743 AliAODTrack *daughter = daughters[iD];
745 Int_t daughterLabel = daughter->GetLabel();
746 if (daughterLabel >= 0) {
747 AliAODMCParticle *daughterMC = (AliAODMCParticle*) mcArray->At(daughterLabel);
748 Int_t motherLabel = daughterMC->GetMother();
749 if (motherLabel >= 0) {
750 AliAODMCParticle *motherMC = (AliAODMCParticle*) mcArray->At(motherLabel);
751 Int_t motherPDG = TMath::Abs(motherMC->GetPdgCode());
755 PDGCodes[iD] = motherPDG;
760 Int_t grandmotherLabel = motherMC->GetMother();
761 if (grandmotherLabel >= 0) {
762 AliAODMCParticle *grandmotherMC = (AliAODMCParticle*) mcArray->At(grandmotherLabel);
763 Int_t grandmotherPDG = TMath::Abs(grandmotherMC->GetPdgCode());
764 PDGCodes[iD] = grandmotherPDG;
771 ((THnSparseF*)
fListBackground->FindObject(
"PDGMotherPeak"))->Fill(PDGCodes);
804 AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
809 TString
title = vtxAOD->GetTitle();
810 if (!title.Contains(
"VertexerTracks")) {
814 AliVertexerTracks *vertexer =
new AliVertexerTracks(aod->GetMagneticField());
816 vertexer->SetITSMode();
817 vertexer->SetMinClusters(3);
818 vertexer->SetConstraintOff();
820 if (title.Contains(
"WithConstraint")) {
821 Float_t diamondcovxy[3];
822 aod->GetDiamondCovXY(diamondcovxy);
823 Double_t pos[3] = {aod->GetDiamondX(), aod->GetDiamondY(), 0.};
824 Double_t cov[6] = {diamondcovxy[0], diamondcovxy[1], diamondcovxy[2], 0., 0., 10.*10.};
825 AliESDVertex *diamond =
new AliESDVertex(pos, cov, 1., 1);
826 vertexer->SetVtxStart(diamond);
827 delete diamond; diamond=NULL;
830 Int_t skipped[10];
for(Int_t i=0; i<10; i++) { skipped[i] = -1; }
831 Int_t nTrksToSkip = 0, id;
834 for (Int_t i=0; i<3; i++) {
840 t = (AliAODTrack*) twoProng->GetDaughter(i-1);
843 id = (Int_t) t->GetID();
847 skipped[nTrksToSkip++] = id;
850 vertexer->SetSkipTracks(nTrksToSkip, skipped);
851 AliESDVertex *vtxESDNew = vertexer->FindPrimaryVertex(aod);
853 delete vertexer; vertexer = NULL;
859 if (vtxESDNew->GetNContributors() <= 0) {
860 delete vtxESDNew; vtxESDNew = NULL;
865 Double_t pos[3], cov[6], chi2perNDF;
866 vtxESDNew->GetXYZ(pos);
867 vtxESDNew->GetCovMatrix(cov);
868 chi2perNDF = vtxESDNew->GetChi2toNDF();
869 delete vtxESDNew; vtxESDNew = NULL;
871 AliAODVertex *vtxAODNew =
new AliAODVertex(pos, cov, chi2perNDF);
882 AliNeutralTrackParam *ntpD0 =
new AliNeutralTrackParam(candD0);
885 AliESDtrack *candSoftPiESD =
new AliESDtrack(candSoftPi);
888 TObjArray *tracks =
new TObjArray(2);
889 tracks->AddAt(candSoftPiESD, 0);
890 tracks->AddAt(ntpD0, 1);
893 Double_t pos[3], cov[6];
896 AliESDVertex *newPrimVtxESD =
new AliESDVertex(pos, cov, 100., 100,
fNewPrimVtx->GetName());
898 AliVertexerTracks *vertexerTracks =
new AliVertexerTracks(
fMagneticField);
899 vertexerTracks->SetVtxStart(newPrimVtxESD);
900 AliESDVertex *vertexESD = (AliESDVertex*) vertexerTracks->VertexForSelectedESDTracks(tracks);
905 if (vertexESD->GetNContributors() != 2) {
906 delete vertexESD; vertexESD = 0;
910 Double_t vertRadius2 = vertexESD->GetX()*vertexESD->GetX() + vertexESD->GetY()*vertexESD->GetY();
911 if (vertRadius2 > 8.) {
913 delete vertexESD; vertexESD = 0;
917 Double_t pos2[3], cov2[6], chi2perNDF;
918 vertexESD->GetXYZ(pos2);
919 vertexESD->GetCovMatrix(cov2);
920 chi2perNDF = vertexESD->GetChi2toNDF();
922 delete vertexESD; vertexESD = 0;
924 AliAODVertex *vertexAOD =
new AliAODVertex(pos2, cov2, chi2perNDF, 0x0, -1, AliAODVertex::kUndef, 2);
932 Double_t invMassDiffAbs = TMath::Abs(invMassDiff);
946 if (invMassDiffAbs < peakCut) {
952 invMassDiff = invMassDiffAbs;
955 if (invMassDiff > sidebandCut && invMassDiff <= sidebandCut+sidebandWindow) {
962 Int_t mother = mcPartCandidate->GetMother();
964 AliAODMCParticle *mcGranma =
dynamic_cast<AliAODMCParticle*
>(arrayMC->At(mother));
966 Int_t pdgGranma = mcGranma->GetPdgCode();
967 Int_t abspdgGranma = TMath::Abs(pdgGranma);
968 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)) {
971 mother = mcGranma->GetMother();
974 AliError(
"Failed casting the mother particle!");
984 Int_t mother = mcPartCandidate->GetMother();
986 AliAODMCParticle *mcGranma =
dynamic_cast<AliAODMCParticle*
>(arrayMC->At(mother));
988 Int_t pdgGranma = mcGranma->GetPdgCode();
989 Int_t abspdgGranma = TMath::Abs(pdgGranma);
990 if (abspdgGranma == 4 || abspdgGranma == 5) {
993 mother = mcGranma->GetMother();
996 AliError(
"Failed casting the mother particle!");
1006 AliExternalTrackParam etp;
1007 etp.CopyFromVTrack(track);
1009 Double_t dz[2], covdz[3];
1012 d0Err = TMath::Sqrt(covdz[0]);
1023 Double_t p[3] = {cand->Px(), cand->Py(), cand->Pz()};
1024 Double_t ptsq = p[0]*p[0] + p[1]*p[1];
1029 Double_t k = - (sec[0]-prim[0])*p[0] - (sec[1]-prim[1])*p[1];
1031 Double_t dx = sec[0] - prim[0] + k*p[0];
1032 Double_t dy = sec[1] - prim[1] + k*p[1];
1033 Double_t absImpPar = TMath::Sqrt(dx*dx+dy*dy);
1035 TVector3 mom(p[0], p[1], p[2]);
1036 TVector3 fline(sec[0]-prim[0], sec[1]-prim[1], sec[2]-prim[2]);
1037 TVector3 cross = mom.Cross(fline);
1039 return (cross.Z() > 0. ? absImpPar : -absImpPar);
1044 Double_t Pt = cand->Pt();
1052 FillHistogram(Form(
"DeltaInvMass_%d", ptBin), deltaInvMass);
1083 AliAODTrack *
pi; AliAODTrack *K; Int_t piId, KId;
1084 if (((AliAODTrack*) candD0->GetDaughter(0))->Charge()*cand->Charge() > 0) {
1092 pi = (AliAODTrack*) candD0->GetDaughter(piId);
1093 K = (AliAODTrack*) candD0->GetDaughter(KId);
1104 d0 = candD0->Getd0Prong(piId);
1119 d0 = candD0->Getd0Prong(KId);
1125 AliAODVertex *origVtx = 0;
1131 Double_t impParD0 = candD0->
ImpParXY()*1.e4;
1149 ((TH1D*)
fListSignal->FindObject(name))->Fill(value);
1180 Double_t Pt = cand->Pt();
1188 AliAODTrack *tr1 = (AliAODTrack*) candD0->GetDaughter(0);
1189 AliAODTrack *tr2 = (AliAODTrack*) candD0->GetDaughter(1);
1190 AliAODTrack *tr3 = (AliAODTrack*) cand->
GetBachelor();
1192 Int_t label1 = tr1->GetLabel();
1193 Int_t label2 = tr2->GetLabel();
1194 Int_t label3 = tr3->GetLabel();
1196 if (label1 < 0 || label2 < 0 || label3 < 0) {
1200 AliAODMCParticle *part1 = (AliAODMCParticle*) arrayMC->At(label1);
1201 AliAODMCParticle *part2 = (AliAODMCParticle*) arrayMC->At(label2);
1202 AliAODMCParticle *part3 = (AliAODMCParticle*) arrayMC->At(label3);
1204 if (part1 == 0 || part2 == 0 || part3 == 0) {
1208 Double_t PxTotal = part1->Px()+part2->Px()+part3->Px();
1209 Double_t PyTotal = part1->Py()+part2->Py()+part3->Py();
1210 Double_t PzTotal = part1->Pz()+part2->Pz()+part3->Pz();
1214 Double_t prim[3] = {headerMC->GetVtxX(), headerMC->GetVtxY(), headerMC->GetVtxZ()};
1215 Double_t sec[3] = {part3->Xv(), part3->Yv(), part3->Zv()};
1216 Double_t p[3] = {PxTotal, PyTotal, PzTotal};
1219 Double_t ptsq = p[0]*p[0] + p[1]*p[1];
1220 Double_t k = - (sec[0]-prim[0])*p[0] - (sec[1]-prim[1])*p[1];
1222 Double_t dx = sec[0] - prim[0] + k*p[0];
1223 Double_t dy = sec[1] - prim[1] + k*p[1];
1224 Double_t absImpPar = TMath::Sqrt(dx*dx+dy*dy)*1.e4;
1226 TVector3 mom(p[0], p[1], p[2]);
1227 TVector3 fline(sec[0]-prim[0], sec[1]-prim[1], sec[2]-prim[2]);
1228 TVector3 cross = mom.Cross(fline);
1230 Double_t impParTrue = cross.Z() > 0. ? absImpPar : -absImpPar;
1232 TH1D* hImpParTrue = (TH1D*)
fListSignalFromB->FindObject(Form(
"ImpParTrue_%d", ptBin));
1233 hImpParTrue->Fill(impParTrue);
Double_t fSidebandCut[30]
Bool_t IsFromHijing(TClonesArray *arrayMC, const AliAODMCParticle *mcPartCandidate)
void StoreCandidates(AliVEvent *, Int_t nCand=0, Bool_t flagFilter=kTRUE)
ClassImp(AliAnalysisTaskSEDStarCharmFraction) AliAnalysisTaskSEDStarCharmFraction
Double_t fSidebandWindow[30]
Double_t DeltaInvMass() const
void FillRegionHistogram(const char *name, Double_t value)
Bool_t CalculateImpactParameter(AliAODTrack *track, Double_t &d0, Double_t &d0Err)
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabs2prong, Int_t *pdgDg, Int_t *pdgDg2prong, TClonesArray *mcArray, Bool_t isV0=kFALSE) const
virtual void UserExec(Option_t *option)
void UnsetOwnPrimaryVtx()
Double_t * fImpParForTree
Double_t ImpParXY() const
void FillHistograms(AliAODRecoCascadeHF *cand)
void FillHistogram(const char *name, Double_t value)
virtual ~AliAnalysisTaskSEDStarCharmFraction()
void SetUpList(TList *list)
TList * fListSignalPrompt
Double_t CalculateImpactParameterDStar(AliAODRecoCascadeHF *cand)
AliAODTrack * GetBachelor() const
AliAODVertex * GetOwnPrimaryVtx() const
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel, AliAODEvent *aod)
void CheckInvMassDStar(AliAODRecoCascadeHF *cand)
AliNormalizationCounter * fCounter
AliAODVertex * RemoveDaughtersFromPrimaryVtx(AliAODEvent *aod, AliAODRecoCascadeHF *cand)
AliAODVertex * fNewPrimVtx
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
void SetOwnPrimaryVtx(const AliAODVertex *vtx)
Double_t * fInvMassForTree
virtual void Terminate(Option_t *option)
Bool_t IsEventSelected(AliVEvent *event)
AliAnalysisTaskSEDStarCharmFraction()
void StoreEvent(AliVEvent *, AliRDHFCuts *, Bool_t mc=kFALSE, Int_t multiplicity=-9999, Double_t spherocity=-99.)
AliAODVertex * ReconstructDStarVtx(AliAODRecoCascadeHF *cand)
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
AliRDHFCutsDStartoKpipi * fCuts
Float_t * GetPtBinLimits() const
Double_t InvMassD0() const
Bool_t IsFromB(TClonesArray *arrayMC, const AliAODMCParticle *mcPartCandidate)
AliAODRecoDecayHF2Prong * Get2Prong() const
virtual void UserCreateOutputObjects()
Int_t PtBin(Double_t pt) const
Short_t * fSignalTypeForTree
void FillTrueImpactParameter(AliAODMCHeader *headerMC, TClonesArray *arrayMC, AliAODRecoCascadeHF *cand)