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),
96 for(
Int_t ih=0; ih<4; ih++){
108 const char *resfileCurURI,
109 const char *resfileUpgURI,
149 fRunInVertexing(isRunInVertexing),
150 fImproveTracks(kTRUE),
164 for(
Int_t ih=0; ih<4; ih++){
173 TFile *resfileCur=TFile::Open(resfileCurURI);
177 for(
Int_t i=0; i<4; i++){
178 fD0RPMeanPCur[i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanP_phi%d",i))));
179 fD0RPMeanKCur[i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanK_phi%d",i))));
180 fD0RPMeanPiCur[i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanPi_phi%d",i))));
219 TFile *resfileUpg=TFile::Open(resfileUpgURI );
223 for(
Int_t j=0; j<4; j++){
224 fD0RPMeanPUpg[j]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanP_phi%d",j))));
225 fD0RPMeanKUpg[j]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanK_phi%d",j))));
226 fD0RPMeanPiUpg[j]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanPi_phi%d",j))));
266 DefineOutput(1,TNtuple::Class());
282 fDebugNtuple=
new TNtuple(
"fDebugNtuple",
"Smearing",
"pdg:ptmc:d0rpo:d0zo:pt1o:sd0rpo:sd0zo:spt1o:d0rpn:d0zn:pt1n:sd0rpn:sd0zn:spt1n:d0rpmc:d0zmc:pt1mc");
290 for(
Int_t j=0; j<4; j++){
325 if(AODEvent() && IsStandardAOD()) ev = dynamic_cast<AliAODEvent*> (AODEvent());
334 TClonesArray *mcs=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
337 for(
Int_t itrack=0;itrack<ev->GetNumberOfTracks();++itrack) {
338 AliAODTrack * trk =
dynamic_cast<AliAODTrack*
>(ev->GetTrack(itrack));
339 if(!trk) AliFatal(
"Not a standard AOD");
345 AliVVertex *primaryVertex=ev->GetPrimaryVertex();
351 TClonesArray *array2Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"D0toKpi"));
353 for (
Int_t icand=0;icand<array2Prong->GetEntries();++icand) {
358 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
361 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
362 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
366 ta12.Add(&et1); ta12.Add(&et2);
374 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
375 decay->GetSecondaryVtx()->SetChi2perNDF(v12->GetChi2toNDF());
382 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
384 d0err[0] = TMath::Sqrt(covd0z0[0]);
385 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
387 d0err[1] = TMath::Sqrt(covd0z0[0]);
388 decay->Setd0Prongs(2,d0);
395 dca=et1.GetDCA(&et2,bz,xdummy,ydummy);
402 for (
Int_t i=0;i<2;++i) {
403 const AliAODTrack *t=
static_cast<AliAODTrack*
>(decay->GetDaughter(i));
408 decay->SetPxPyPzProngs(2,px,py,pz);
414 TClonesArray *arrayCascade=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Dstar"));
417 for (
Int_t icand=0;icand<arrayCascade->GetEntries();++icand) {
427 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decayDstar->
GetBachelor()));
430 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(decay);
439 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
441 d01err[0] = TMath::Sqrt(covd0z0[0]);
442 trackD0->PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
444 d01err[1] = TMath::Sqrt(covd0z0[0]);
445 decayDstar->Setd0Prongs(2,d01);
449 delete trackD0; trackD0=NULL;
453 for (
Int_t i=0;i<2;++i) {
454 const AliAODTrack *t1=
static_cast<AliAODTrack*
>(decayDstar->GetDaughter(i));
459 decayDstar->SetPxPyPzProngs(2,px1,py1,pz1);
466 TClonesArray *array3Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Charm3Prong"));
468 for (
Int_t icand=0;icand<array3Prong->GetEntries();++icand) {
473 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
474 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
475 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
476 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(2)));
478 ta123.Add(&et1);ta123.Add(&et2);ta123.Add(&et3);
479 ta12. Add(&et1);ta12 .Add(&et2);
480 ta23 .Add(&et2);ta23 .Add(&et3);
488 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
489 decay->GetSecondaryVtx()->SetChi2perNDF(v123->GetChi2toNDF());
495 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
497 d0err[0] = TMath::Sqrt(covd0z0[0]);
498 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
500 d0err[1] = TMath::Sqrt(covd0z0[0]);
501 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
503 d0err[2] = TMath::Sqrt(covd0z0[0]);
504 decay->Setd0Prongs (3,d0 );
511 dca[0]=et1.GetDCA(&et2,bz,xdummy,ydummy);
512 dca[1]=et3.GetDCA(&et2,bz,xdummy,ydummy);
513 dca[2]=et1.GetDCA(&et3,bz,xdummy,ydummy);
514 decay->SetDCAs(3,dca);
517 Float_t sigmaV=v123->GetDispersion();
520 primaryVertex->GetXYZ(pos);
521 decay->
SetDist12toPrim(TMath::Sqrt((v12->GetX()-pos[0])*(v12->GetX()-pos[0])
522 +(v12->GetY()-pos[1])*(v12->GetY()-pos[1])
523 +(v12->GetZ()-pos[2])*(v12->GetZ()-pos[2])));
524 decay->
SetDist23toPrim(TMath::Sqrt((v23->GetX()-pos[0])*(v23->GetX()-pos[0])
525 +(v23->GetY()-pos[1])*(v23->GetY()-pos[1])
526 +(v23->GetZ()-pos[2])*(v23->GetZ()-pos[2])));
528 delete v123;
delete v12;
delete v23;
531 for (
Int_t i=0;i<3;++i) {
532 const AliAODTrack *t=
static_cast<AliAODTrack*
>(decay->GetDaughter(i));
537 decay->SetPxPyPzProngs(3,px,py,pz);
547 if (!(track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)))
551 if (TESTBIT(track->GetITSClusterMap(),7))
return;
556 AliExternalTrackParam et; et.CopyFromVTrack(track);
563 Int_t imc=track->GetLabel();
565 const AliAODMCParticle *mc=
static_cast<AliAODMCParticle*
>(mcs->At(imc));
573 AliExternalTrackParam mct(mcx,mcp,mccv,mcc);
574 const Double_t *parammc=mct.GetParameter();
576 AliVertex vtx(mcx,1.,1);
581 et.PropagateToDCA(&vtx,track->GetBz(),10.);
582 et.Rotate(mct.GetAlpha());
596 switch (mc->GetPdgCode()) {
597 case 2212:
case -2212:
647 Double_t dd0zn =dd0zo *(sd0zo >0. ? (sd0zn /sd0zo ) : 1.);
650 Double_t dd0rpn=dd0rpo*(sd0rpo>0. ? (sd0rpn/sd0rpo) : 1.);
651 Double_t dd0mrpn=TMath::Abs(sd0mrpn)-TMath::Abs(sd0mrpo);
652 Double_t d0rpn =d0rpmc+dd0rpn-dd0mrpn;
654 Double_t dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
661 if(sd0rpo>0.) covar[0]*=(sd0rpn/sd0rpo)*(sd0rpn/sd0rpo);
662 if(sd0zo>0. && sd0rpo>0.)covar[1]*=(sd0rpn/sd0rpo)*(sd0zn/sd0zo);
663 if(sd0zo>0.) covar[2]*=(sd0zn/sd0zo)*(sd0zn/sd0zo);
664 if(sd0rpo>0.) covar[3]*=(sd0rpn/sd0rpo);
665 if(sd0zo>0.) covar[4]*=(sd0zn/sd0zo);
666 if(sd0rpo>0.) covar[6]*=(sd0rpn/sd0rpo);
667 if(sd0zo>0.) covar[7]*=(sd0zn/sd0zo);
668 if(sd0rpo>0.) covar[10]*=(sd0rpn/sd0rpo);
669 if(sd0zo>0.) covar[11]*=(sd0zn/sd0zo);
677 et.GetCovarianceXYZPxPyPz(cv);
678 track->SetPosition(x,kFALSE);
679 track->SetP(p,kTRUE);
680 track->SetCovMatrix(cv);
684 UChar_t itsClusterMap = track->GetITSClusterMap();
685 SETBIT(itsClusterMap,7);
686 track->SetITSClusterMap(itsClusterMap);
720 AliVertexerTracks vertexer(bField);
721 vertexer.SetVtxStart(old->GetX(),old->GetY(),old->GetZ());
722 AliESDVertex *vertex=vertexer.VertexForSelectedTracks(tracks,ids);
734 Int_t n =graph->GetN();
738 if(!graphSA)
return graph->Eval(xmin);
740 if(x<xminSA)
return graphSA->Eval(xminSA);
741 return graphSA->Eval(x);
743 if (x>xmax)
return graph->Eval(xmax);
744 return graph->Eval(x);
751 if(phi>2.*pi || phi<0.)
return -1;
752 if((phi<=(pi/4.)) || (phi>7.*(pi/4.)))
return 0;
753 if((phi>(pi/4.)) && (phi<=3.*(pi/4.)))
return 1;
754 if((phi>3.*(pi/4.)) && (phi<=5.*(pi/4.)))
return 2;
755 if((phi>(5.*pi/4.)) && (phi<=7.*(pi/4.)))
return 3;
TGraph * fPt1ResPiCur
old pt dep. 1/pt res. for kaons
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
Double_t EvalGraph(Double_t x, const TGraph *graph, const TGraph *graphSA=0) const
Helper functions.
void SmearTrack(AliAODTrack *track, const TClonesArray *mcs)
TGraph * fD0ZResPiCurSA
old standalone pt dep. d0 res. in z for kaons
TGraph * fD0RPMeanKUpg[4]
new pt dep. d0 mean in rphi for protons in 4 phi regions
virtual void UserExec(Option_t *option)
Bool_t FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
TList * fDebugOutput
this is always kTRUE. kFALSE only if re-running on already improved AODs
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
TGraph * fD0RPMeanPiUpg[4]
new pt dep. d0 mean in rphi for kaons in 4 phi regions
void SetDist23toPrim(Double_t d)
TGraph * fPt1ResKUpg
new pt dep. 1/pt res. for protons
TGraph * fD0RPMeanPiCur[4]
old pt dep. d0 mean. in rphi for kaons in 4 phi regions
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 * fD0RPMeanPCur[4]
old pt dep. d0 res. in rphi for pions
TGraph * fD0RPResPUpg
new pt dep. d0 res. in z for pions
TGraph * fD0RPMeanKCur[4]
old pt dep. d0 mean. in rphi for protons in 4 phi regions
TGraph * fD0ZResPiUpg
new pt dep. d0 res. in z for kaons
TGraph * fD0ZResPiCur
old pt dep. d0 res. in z for kaons
TGraph * fD0RPMeanPUpg[4]
new pt dep. d0 res. in rphi for pions
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
AliESDVertex * RecalculateVertex(const AliVVertex *old, TObjArray *tracks, Double_t bField)
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