16 #include <TObjArray.h>
17 #include <TClonesArray.h>
23 #include "AliVertex.h"
24 #include "AliVVertex.h"
25 #include "AliESDVertex.h"
26 #include "AliVertexerTracks.h"
27 #include "AliAODEvent.h"
28 #include "AliAODTrack.h"
29 #include "AliAODMCParticle.h"
30 #include "AliExternalTrackParam.h"
35 #include "AliNeutralTrackParam.h"
86 fRunInVertexing(kFALSE),
87 fImproveTracks(kTRUE),
88 fUpdateSecVertCovMat(kFALSE),
96 for(
Int_t jh=0; jh<2; jh++){
97 for(
Int_t ih=0; ih<4; ih++){
110 const char *resfileCurURI,
111 const char *resfileUpgURI,
151 fRunInVertexing(isRunInVertexing),
152 fImproveTracks(kTRUE),
153 fUpdateSecVertCovMat(kFALSE),
167 for(
Int_t jh=0; jh<2; jh++){
168 for(
Int_t ih=0; ih<4; ih++){
178 TFile *resfileCur=TFile::Open(resfileCurURI);
182 for(
Int_t j=0; j<2; j++){
183 for(
Int_t i=0; i<4; i++){
184 fD0RPMeanPCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanP_B%d_phi%d",j,i))));
185 fD0RPMeanKCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanK_B%d_phi%d",j,i))));
186 fD0RPMeanPiCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanPi_B%d_phi%d",j,i))));
187 fD0RPMeanPCur[j][i]->SetName(Form(
"D0RPMeanPCur_B%d_phi%d",j,i));
188 fD0RPMeanKCur[j][i]->SetName(Form(
"D0RPMeanKCur_B%d_phi%d",j,i));
189 fD0RPMeanPiCur[j][i]->SetName(Form(
"D0RPMeanPiCur_B%d_phi%d",j,i));
226 TFile *resfileUpg=TFile::Open(resfileUpgURI );
230 for(
Int_t j=0; j<2; j++){
231 for(
Int_t i=0; i<4; i++){
232 fD0RPMeanPUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanP_B%d_phi%d",j,i))));
233 fD0RPMeanKUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanK_B%d_phi%d",j,i))));
234 fD0RPMeanPiUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanPi_B%d_phi%d",j,i))));
235 fD0RPMeanPUpg[j][i]->SetName(Form(
"D0RPMeanPUpg_B%d_phi%d",j,i));
236 fD0RPMeanKUpg[j][i]->SetName(Form(
"D0RPMeanKUpg_B%d_phi%d",j,i));
237 fD0RPMeanPiUpg[j][i]->SetName(Form(
"D0RPMeanPiUpg_B%d_phi%d",j,i));
275 DefineOutput(1,TNtuple::Class());
291 fDebugNtuple=
new TNtuple(
"fDebugNtuple",
"Smearing",
"pdg:ptmc:d0rpo:d0zo:pt1o:sd0rpo:sd0zo:spt1o:d0rpn:d0zn:pt1n:sd0rpn:sd0zn:spt1n:d0rpmc:d0zmc:pt1mc");
299 for(
Int_t j=0; j<2; j++){
300 for(
Int_t i=0; i<4; i++){
336 if(AODEvent() && IsStandardAOD()) ev = dynamic_cast<AliAODEvent*> (AODEvent());
346 TClonesArray *array2Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"D0toKpi"));
348 for (
Int_t icand=0;icand<array2Prong->GetEntries();++icand) {
354 TClonesArray *arrayCascade=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Dstar"));
356 for (
Int_t icand=0;icand<arrayCascade->GetEntries();++icand) {
362 TClonesArray *array3Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Charm3Prong"));
364 for (
Int_t icand=0;icand<array3Prong->GetEntries();++icand) {
372 TClonesArray *mcs=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
375 for(
Int_t itrack=0;itrack<ev->GetNumberOfTracks();++itrack) {
376 AliAODTrack * trk =
dynamic_cast<AliAODTrack*
>(ev->GetTrack(itrack));
377 if(!trk) AliFatal(
"Not a standard AOD");
383 AliVVertex *primaryVertex=ev->GetPrimaryVertex();
389 for (
Int_t icand=0;icand<array2Prong->GetEntries();++icand) {
394 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
397 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
398 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
402 ta12.Add(&et1); ta12.Add(&et2);
410 v12->GetCovMatrix(covpos);
411 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
413 decay->GetSecondaryVtx()->SetChi2perNDF(v12->GetChi2toNDF());
418 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
420 d0err[0] = TMath::Sqrt(covd0z0[0]);
421 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
423 d0err[1] = TMath::Sqrt(covd0z0[0]);
424 decay->Setd0Prongs(2,d0);
431 dca=et1.GetDCA(&et2,bz,xdummy,ydummy);
437 for (
Int_t i=0;i<2;++i) {
438 AliExternalTrackParam et;
439 et.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(i)));
440 et.PropagateToDCA(v12,bz,100.,d0z0,covd0z0);
445 decay->SetPxPyPzProngs(2,px,py,pz);
453 for (
Int_t icand=0;icand<arrayCascade->GetEntries();++icand) {
463 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decayDstar->
GetBachelor()));
466 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(decay);
475 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
477 d01err[0] = TMath::Sqrt(covd0z0[0]);
478 trackD0->PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
480 d01err[1] = TMath::Sqrt(covd0z0[0]);
481 decayDstar->Setd0Prongs(2,d01);
485 delete trackD0; trackD0=NULL;
489 for (
Int_t i=0;i<2;++i) {
490 const AliAODTrack *t1=
static_cast<AliAODTrack*
>(decayDstar->GetDaughter(i));
495 decayDstar->SetPxPyPzProngs(2,px1,py1,pz1);
503 for (
Int_t icand=0;icand<array3Prong->GetEntries();++icand) {
508 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
509 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
510 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
511 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(2)));
513 ta123.Add(&et1);ta123.Add(&et2);ta123.Add(&et3);
514 ta12. Add(&et1);ta12 .Add(&et2);
515 ta23 .Add(&et2);ta23 .Add(&et3);
524 v123->GetCovMatrix(covpos);
525 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
527 decay->GetSecondaryVtx()->SetChi2perNDF(v123->GetChi2toNDF());
532 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
534 d0err[0] = TMath::Sqrt(covd0z0[0]);
535 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
537 d0err[1] = TMath::Sqrt(covd0z0[0]);
538 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
540 d0err[2] = TMath::Sqrt(covd0z0[0]);
541 decay->Setd0Prongs (3,d0 );
548 dca[0]=et1.GetDCA(&et2,bz,xdummy,ydummy);
549 dca[1]=et3.GetDCA(&et2,bz,xdummy,ydummy);
550 dca[2]=et1.GetDCA(&et3,bz,xdummy,ydummy);
551 decay->SetDCAs(3,dca);
554 Float_t sigmaV=v123->GetDispersion();
557 primaryVertex->GetXYZ(pos);
558 decay->
SetDist12toPrim(TMath::Sqrt((v12->GetX()-pos[0])*(v12->GetX()-pos[0])
559 +(v12->GetY()-pos[1])*(v12->GetY()-pos[1])
560 +(v12->GetZ()-pos[2])*(v12->GetZ()-pos[2])));
561 decay->
SetDist23toPrim(TMath::Sqrt((v23->GetX()-pos[0])*(v23->GetX()-pos[0])
562 +(v23->GetY()-pos[1])*(v23->GetY()-pos[1])
563 +(v23->GetZ()-pos[2])*(v23->GetZ()-pos[2])));
567 for (
Int_t i=0;i<3;++i) {
568 AliExternalTrackParam et;
569 et.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(i)));
570 et.PropagateToDCA(v123,bz,100.,d0z0,covd0z0);
575 decay->SetPxPyPzProngs(3,px,py,pz);
577 delete v123;
delete v12;
delete v23;
587 if (!(track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)))
591 if (TESTBIT(track->GetITSClusterMap(),7))
return;
596 AliExternalTrackParam et; et.CopyFromVTrack(track);
603 Int_t imc=track->GetLabel();
605 const AliAODMCParticle *mc=
static_cast<AliAODMCParticle*
>(mcs->At(imc));
613 AliExternalTrackParam mct(mcx,mcp,mccv,mcc);
614 const Double_t *parammc=mct.GetParameter();
616 AliVertex vtx(mcx,1.,1);
621 et.PropagateToDCA(&vtx,track->GetBz(),10.);
622 et.Rotate(mct.GetAlpha());
629 if(bz<0.) magfield=0;
630 else if(bz>0.)magfield=1;
639 switch (mc->GetPdgCode()) {
640 case 2212:
case -2212:
690 Double_t dd0zn =dd0zo *(sd0zo >0. ? (sd0zn /sd0zo ) : 1.);
693 Double_t dd0rpn=dd0rpo*(sd0rpo>0. ? (sd0rpn/sd0rpo) : 1.);
694 Double_t dd0mrpn=TMath::Abs(sd0mrpn)-TMath::Abs(sd0mrpo);
695 Double_t d0rpn =d0rpmc+dd0rpn-dd0mrpn;
697 Double_t dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
704 if(sd0rpo>0.) covar[0]*=(sd0rpn/sd0rpo)*(sd0rpn/sd0rpo);
705 if(sd0zo>0. && sd0rpo>0.)covar[1]*=(sd0rpn/sd0rpo)*(sd0zn/sd0zo);
706 if(sd0zo>0.) covar[2]*=(sd0zn/sd0zo)*(sd0zn/sd0zo);
707 if(sd0rpo>0.) covar[3]*=(sd0rpn/sd0rpo);
708 if(sd0zo>0.) covar[4]*=(sd0zn/sd0zo);
709 if(sd0rpo>0.) covar[6]*=(sd0rpn/sd0rpo);
710 if(sd0zo>0.) covar[7]*=(sd0zn/sd0zo);
711 if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);
712 if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);
713 if(spt1o>0.) covar[12]*=(spt1n/spt1o);
714 if(spt1o>0.) covar[13]*=(spt1n/spt1o);
715 if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);
723 et.GetCovarianceXYZPxPyPz(cv);
724 track->SetPosition(x,kFALSE);
725 track->SetP(p,kTRUE);
726 track->SetCovMatrix(cv);
730 UChar_t itsClusterMap = track->GetITSClusterMap();
731 SETBIT(itsClusterMap,7);
732 track->SetITSClusterMap(itsClusterMap);
766 AliVertexerTracks vertexer(bField);
767 vertexer.SetVtxStart(old->GetX(),old->GetY(),old->GetZ());
768 AliESDVertex *vertex=vertexer.VertexForSelectedTracks(tracks,ids);
780 Int_t n =graph->GetN();
784 if(!graphSA)
return graph->Eval(xmin);
786 if(x<xminSA)
return graphSA->Eval(xminSA);
787 return graphSA->Eval(x);
789 if (x>xmax)
return graph->Eval(xmax);
790 return graph->Eval(x);
797 if(phi>2.*pi || phi<0.)
return -1;
798 if((phi<=(pi/4.)) || (phi>7.*(pi/4.)))
return 0;
799 if((phi>(pi/4.)) && (phi<=3.*(pi/4.)))
return 1;
800 if((phi>3.*(pi/4.)) && (phi<=5.*(pi/4.)))
return 2;
801 if((phi>(5.*pi/4.)) && (phi<=7.*(pi/4.)))
return 3;
TGraph * fPt1ResPiCur
old pt dep. 1/pt res. for kaons
TGraph * fD0RPMeanPUpg[2][4]
new pt dep. d0 res. in rphi for pions
TGraph * fD0ZResPUpg
old pt dep. 1/pt res. for pions
TGraph * fD0RPResKCur
old pt dep. d0 res. in rphi for protons
TGraph * fD0RPResPiUpgSA
new standalone pt dep. d0 res. in rphi for kaons
TGraph * fD0ZResKUpgSA
new standalone pt dep. d0 res. in z for protons
TGraph * fD0RPResPCurSA
old standalone pt dep. d0 res. in z for pions
virtual void UserCreateOutputObjects()
Implementation of interface methods.
TGraph * fD0RPResPiCur
old pt dep. d0 res. in rphi for kaons
TGraph * fPt1ResKUpgSA
new standalone pt dep. 1/pt res. for protons
TGraph * fD0ZResPUpgSA
old standalone pt dep. 1/pt res. for pions
TGraph * fD0RPMeanPiCur[2][4]
old pt dep. d0 mean. in rphi for kaons in 4 phi regions
Double_t EvalGraph(Double_t x, const TGraph *graph, const TGraph *graphSA=0) const
Helper functions.
TGraph * fD0RPMeanPiUpg[2][4]
new pt dep. d0 mean in rphi for kaons in 4 phi regions
Bool_t fUpdateSecVertCovMat
this is always kTRUE. kFALSE only if re-running on already improved AODs
TGraph * fD0ZResPiCurSA
old standalone pt dep. d0 res. in z for kaons
virtual void UserExec(Option_t *option)
TGraph * fD0RPMeanPCur[2][4]
old pt dep. d0 res. in rphi for pions
Bool_t FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
TList * fDebugOutput
flag to swicth on/off the modification of the sec vert cov matrix
void SmearTrack(AliAODTrack *track, const TClonesArray *mcs, Double_t bz)
void SetDist12toPrim(Double_t d)
TGraph * fPt1ResPiUpg
new pt dep. 1/pt res. for kaons
TGraph * fPt1ResPCurSA
old standalone pt dep. d0 res. in rphi for pions
TGraph * fPt1ResPiCurSA
old standalone pt dep. 1/pt res. for kaons
Bool_t FillRecoCasc(AliVEvent *event, AliAODRecoCascadeHF *rc, Bool_t isDStar, Bool_t recoSecVtx=kFALSE)
TGraph * fPt1ResPUpg
new pt dep. d0 mean in rphi for pions in 4 phi regions
TGraph * fD0RPResKCurSA
old standalone pt dep. d0 res. in rphi for protons
void SetDist23toPrim(Double_t d)
TGraph * fPt1ResKUpg
new pt dep. 1/pt res. for protons
TGraph * fPt1ResKCur
old pt dep. 1/pt res. for protons
TGraph * fD0RPResKUpgSA
new standalone pt dep. d0 res. in rphi for protons
TGraph * fPt1ResPUpgSA
new standalone pt dep. d0 res. in rphi for pions
AliAnalysisTaskSEImproveITS()
virtual ~AliAnalysisTaskSEImproveITS()
AliAODTrack * GetBachelor() const
TGraph * fD0RPResPiCurSA
old standalone pt dep. d0 res. in rphi for kaons
TGraph * fD0ZResKCurSA
old standalone pt dep. d0 res. in z for protons
TGraph * fD0ZResPCurSA
new pt dep. 1/pt res. for pions
Float_t * fDebugVars
! variables to store as degug info
TGraph * fD0RPResPCur
old pt dep. d0 res. in z for pions
Bool_t fRunInVertexing
new standalone pt dep. 1/pt res. for pions
TGraph * fPt1ResPiUpgSA
new standalone pt dep. 1/pt res. for kaons
TGraph * fD0RPResPUpgSA
new standalone pt dep. d0 res. in z for pions
TGraph * fPt1ResKCurSA
old standalone pt dep. 1/pt res. for protons
Bool_t fImproveTracks
flag to run hybrid task before the vertexingHF task or in standard mode
TGraph * fD0ZResKCur
old pt dep. d0 res. in z for protons
void Setd0errProngs(Int_t nprongs, Double_t *d0)
TGraph * fPt1ResPCur
old pt dep. d0 mean. in rphi for pions in 4 phi regions
TGraph * fD0RPResPUpg
new pt dep. d0 res. in z for pions
TGraph * fD0ZResPiUpg
new pt dep. d0 res. in z for kaons
TGraph * fD0ZResPiCur
old pt dep. d0 res. in z for kaons
void SetSigmaVert(Double_t sigmaVert)
AliAODRecoDecayHF2Prong * Get2Prong() const
ClassImp(AliAnalysisTaskSEImproveITS)
TGraph * fD0ZResPiUpgSA
new standalone pt dep. d0 res. in z for kaons
TGraph * fD0RPResPiUpg
new pt dep. d0 res. in rphi for kaons
TGraph * fD0RPMeanKUpg[2][4]
new pt dep. d0 mean in rphi for protons in 4 phi regions
AliESDVertex * RecalculateVertex(const AliVVertex *old, TObjArray *tracks, Double_t bField)
TGraph * fD0RPMeanKCur[2][4]
old pt dep. d0 mean. in rphi for protons in 4 phi regions
TNtuple * fDebugNtuple
! debug send on output slot 1
Int_t PhiBin(Double_t phi) const
TGraph * fD0RPResKUpg
new pt dep. d0 res. in rphi for protons
TGraph * fD0ZResKUpg
new pt dep. d0 res. in z for protons