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"
56 fD0RPSigmaPullRatioP(0),
57 fD0RPSigmaPullRatioK(0),
58 fD0RPSigmaPullRatioPi(0),
89 fRunInVertexing(kFALSE),
90 fImproveTracks(kTRUE),
91 fUpdateSecVertCovMat(kTRUE),
92 fUpdateSTCovMatrix(kTRUE),
102 for(
Int_t jh=0; jh<2; jh++){
103 for(
Int_t ih=0; ih<4; ih++){
117 const char *systematic,
127 fD0RPSigmaPullRatioP(0),
128 fD0RPSigmaPullRatioK(0),
129 fD0RPSigmaPullRatioPi(0),
160 fRunInVertexing(isRunInVertexing),
161 fImproveTracks(kTRUE),
162 fUpdateSecVertCovMat(kTRUE),
163 fUpdateSTCovMatrix(kTRUE),
179 for(
Int_t jh=0; jh<2; jh++){
180 for(
Int_t ih=0; ih<4; ih++){
190 TString resfileCurURI = Form(
"alien:///alice/cern.ch/user/p/pwg_hf/common/Improver/%s/%s/ITSgraphs_Current.root",period,systematic);
191 TFile *resfileCur=TFile::Open(resfileCurURI.Data());
200 for(
Int_t j=0; j<2; j++){
201 for(
Int_t i=0; i<4; i++){
202 fD0RPMeanPCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanP_B%d_phi%d",j,i))));
203 fD0RPMeanKCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanK_B%d_phi%d",j,i))));
204 fD0RPMeanPiCur[j][i]=
new TGraph(*static_cast<TGraph*>(resfileCur->Get(Form(
"D0RPMeanPi_B%d_phi%d",j,i))));
205 fD0RPMeanPCur[j][i]->SetName(Form(
"D0RPMeanPCur_B%d_phi%d",j,i));
206 fD0RPMeanKCur[j][i]->SetName(Form(
"D0RPMeanKCur_B%d_phi%d",j,i));
207 fD0RPMeanPiCur[j][i]->SetName(Form(
"D0RPMeanPiCur_B%d_phi%d",j,i));
216 fD0RPResPCur ->SetName(
"D0RPResPCur" );
245 TString resfileUpgURI = Form(
"alien:///alice/cern.ch/user/p/pwg_hf/common/Improver/%s/%s/ITSgraphs_NewAll-X0.3-Res4um.root",period,systematic);
246 TFile *resfileUpg=TFile::Open(resfileUpgURI.Data());
250 for(
Int_t j=0; j<2; j++){
251 for(
Int_t i=0; i<4; i++){
252 fD0RPMeanPUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanP_B%d_phi%d",j,i))));
253 fD0RPMeanKUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanK_B%d_phi%d",j,i))));
254 fD0RPMeanPiUpg[j][i]=
new TGraph(*static_cast<TGraph*>(resfileUpg->Get(Form(
"D0RPMeanPi_B%d_phi%d",j,i))));
255 fD0RPMeanPUpg[j][i]->SetName(Form(
"D0RPMeanPUpg_B%d_phi%d",j,i));
256 fD0RPMeanKUpg[j][i]->SetName(Form(
"D0RPMeanKUpg_B%d_phi%d",j,i));
257 fD0RPMeanPiUpg[j][i]->SetName(Form(
"D0RPMeanPiUpg_B%d_phi%d",j,i));
266 fD0RPResPUpg ->SetName(
"D0RPResPUpg" );
295 DefineOutput(1,TNtuple::Class());
311 fDebugNtuple=
new TNtuple(
"fDebugNtuple",
"Smearing",
"pdg:ptmc:d0rpo:d0zo:pt1o:sd0rpo:sd0zo:spt1o:d0rpn:d0zn:pt1n:sd0rpn:sd0zn:spt1n:d0rpmc:d0zmc:pt1mc");
322 for(
Int_t j=0; j<2; j++){
323 for(
Int_t i=0; i<4; i++){
359 if(AODEvent() && IsStandardAOD()) ev = dynamic_cast<AliAODEvent*> (AODEvent());
369 TClonesArray *array2Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"D0toKpi"));
371 for (
Int_t icand=0;icand<array2Prong->GetEntries();++icand) {
377 TClonesArray *arrayCascade=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Dstar"));
379 for (
Int_t icand=0;icand<arrayCascade->GetEntries();++icand) {
385 TClonesArray *array3Prong=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(
"Charm3Prong"));
387 for (
Int_t icand=0;icand<array3Prong->GetEntries();++icand) {
395 TClonesArray *mcs=
static_cast<TClonesArray*
>(ev->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
398 for(
Int_t itrack=0;itrack<ev->GetNumberOfTracks();++itrack) {
399 AliAODTrack * trk =
dynamic_cast<AliAODTrack*
>(ev->GetTrack(itrack));
400 if(!trk) AliFatal(
"Not a standard AOD");
406 AliVVertex *primaryVertex=ev->GetPrimaryVertex();
412 for (
Int_t icand=0;icand<array2Prong->GetEntries();++icand) {
417 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
420 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
421 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
425 ta12.Add(&et1); ta12.Add(&et2);
433 v12->GetCovMatrix(covpos);
434 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
436 decay->GetSecondaryVtx()->SetChi2perNDF(v12->GetChi2toNDF());
441 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
443 d0err[0] = TMath::Sqrt(covd0z0[0]);
444 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
446 d0err[1] = TMath::Sqrt(covd0z0[0]);
447 decay->Setd0Prongs(2,d0);
454 dca=et1.GetDCA(&et2,bz,xdummy,ydummy);
460 for (
Int_t i=0;i<2;++i) {
461 AliExternalTrackParam et;
462 et.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(i)));
463 et.PropagateToDCA(v12,bz,100.,d0z0,covd0z0);
468 decay->SetPxPyPzProngs(2,px,py,pz);
476 for (
Int_t icand=0;icand<arrayCascade->GetEntries();++icand) {
486 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decayDstar->
GetBachelor()));
489 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(decay);
498 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
500 d01err[0] = TMath::Sqrt(covd0z0[0]);
501 trackD0->PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
503 d01err[1] = TMath::Sqrt(covd0z0[0]);
504 decayDstar->Setd0Prongs(2,d01);
508 delete trackD0; trackD0=NULL;
512 for (
Int_t i=0;i<2;++i) {
513 const AliAODTrack *t1=
static_cast<AliAODTrack*
>(decayDstar->GetDaughter(i));
518 decayDstar->SetPxPyPzProngs(2,px1,py1,pz1);
526 for (
Int_t icand=0;icand<array3Prong->GetEntries();++icand) {
531 AliVVertex *oldSecondaryVertex=decay->GetSecondaryVtx();
532 AliExternalTrackParam et1; et1.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(0)));
533 AliExternalTrackParam et2; et2.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(1)));
534 AliExternalTrackParam et3; et3.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(2)));
536 ta123.Add(&et1);ta123.Add(&et2);ta123.Add(&et3);
537 ta12. Add(&et1);ta12 .Add(&et2);
538 ta23 .Add(&et2);ta23 .Add(&et3);
547 v123->GetCovMatrix(covpos);
548 decay->GetSecondaryVtx()->SetPosition(pos[0],pos[1],pos[2]);
550 decay->GetSecondaryVtx()->SetChi2perNDF(v123->GetChi2toNDF());
555 et1.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
557 d0err[0] = TMath::Sqrt(covd0z0[0]);
558 et2.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
560 d0err[1] = TMath::Sqrt(covd0z0[0]);
561 et3.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
563 d0err[2] = TMath::Sqrt(covd0z0[0]);
564 decay->Setd0Prongs (3,d0 );
571 dca[0]=et1.GetDCA(&et2,bz,xdummy,ydummy);
572 dca[1]=et3.GetDCA(&et2,bz,xdummy,ydummy);
573 dca[2]=et1.GetDCA(&et3,bz,xdummy,ydummy);
574 decay->SetDCAs(3,dca);
577 Float_t sigmaV=v123->GetDispersion();
580 primaryVertex->GetXYZ(pos);
581 decay->
SetDist12toPrim(TMath::Sqrt((v12->GetX()-pos[0])*(v12->GetX()-pos[0])
582 +(v12->GetY()-pos[1])*(v12->GetY()-pos[1])
583 +(v12->GetZ()-pos[2])*(v12->GetZ()-pos[2])));
584 decay->
SetDist23toPrim(TMath::Sqrt((v23->GetX()-pos[0])*(v23->GetX()-pos[0])
585 +(v23->GetY()-pos[1])*(v23->GetY()-pos[1])
586 +(v23->GetZ()-pos[2])*(v23->GetZ()-pos[2])));
590 for (
Int_t i=0;i<3;++i) {
591 AliExternalTrackParam et;
592 et.CopyFromVTrack(static_cast<AliAODTrack*>(decay->GetDaughter(i)));
593 et.PropagateToDCA(v123,bz,100.,d0z0,covd0z0);
598 decay->SetPxPyPzProngs(3,px,py,pz);
600 delete v123;
delete v12;
delete v23;
610 if (!(track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)))
614 if (TESTBIT(track->GetITSClusterMap(),7))
return;
619 AliExternalTrackParam et; et.CopyFromVTrack(track);
626 Int_t imc=track->GetLabel();
628 const AliAODMCParticle *mc=
static_cast<AliAODMCParticle*
>(mcs->At(imc));
636 AliExternalTrackParam mct(mcx,mcp,mccv,mcc);
637 const Double_t *parammc=mct.GetParameter();
639 AliVertex vtx(mcx,1.,1);
644 et.PropagateToDCA(&vtx,track->GetBz(),10.);
645 et.Rotate(mct.GetAlpha());
652 if(bz<0.) magfield=0;
653 else if(bz>0.)magfield=1;
664 switch (mc->GetPdgCode()) {
665 case 2212:
case -2212:
718 Double_t dd0zn =dd0zo *(sd0zo >0. ? (sd0zn /sd0zo ) : 1.);
721 Double_t dd0rpn=dd0rpo*(sd0rpo>0. ? (sd0rpn/sd0rpo) : 1.);
722 Double_t dd0mrpn=TMath::Abs(sd0mrpn)-TMath::Abs(sd0mrpo);
723 Double_t d0rpn =d0rpmc+dd0rpn-dd0mrpn;
726 dd0mrpn=sd0mrpn-sd0mrpo;
727 d0rpn =d0rpmc+dd0rpn+dd0mrpn;
731 Double_t dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
739 if(sd0rpo>0.) covar[0]*=(sd0rpn/sd0rpo)*(sd0rpn/sd0rpo);
740 if(sd0zo>0. && sd0rpo>0.)covar[1]*=(sd0rpn/sd0rpo)*(sd0zn/sd0zo);
741 if(sd0zo>0.) covar[2]*=(sd0zn/sd0zo)*(sd0zn/sd0zo);
742 if(sd0rpo>0.) covar[3]*=(sd0rpn/sd0rpo);
743 if(sd0zo>0.) covar[4]*=(sd0zn/sd0zo);
744 if(sd0rpo>0.) covar[6]*=(sd0rpn/sd0rpo);
745 if(sd0zo>0.) covar[7]*=(sd0zn/sd0zo);
746 if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);
747 if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);
748 if(spt1o>0.) covar[12]*=(spt1n/spt1o);
749 if(spt1o>0.) covar[13]*=(spt1n/spt1o);
750 if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);
754 covar[0]*=pullcorr*pullcorr;
768 et.GetCovarianceXYZPxPyPz(cv);
769 track->SetPosition(x,kFALSE);
770 track->SetP(p,kTRUE);
771 track->SetCovMatrix(cv);
775 UChar_t itsClusterMap = track->GetITSClusterMap();
776 SETBIT(itsClusterMap,7);
777 track->SetITSClusterMap(itsClusterMap);
811 AliVertexerTracks vertexer(bField);
812 vertexer.SetVtxStart(old->GetX(),old->GetY(),old->GetZ());
813 AliESDVertex *vertex=vertexer.VertexForSelectedTracks(tracks,ids);
825 Int_t n =graph->GetN();
829 if(!graphSA)
return graph->Eval(xmin);
831 if(x<xminSA)
return graphSA->Eval(xminSA);
832 return graphSA->Eval(x);
834 if (x>xmax)
return graph->Eval(xmax);
835 return graph->Eval(x);
842 if(phi>2.*pi || phi<0.)
return -1;
843 if((phi<=(pi/4.)) || (phi>7.*(pi/4.)))
return 0;
844 if((phi>(pi/4.)) && (phi<=3.*(pi/4.)))
return 1;
845 if((phi>3.*(pi/4.)) && (phi<=5.*(pi/4.)))
return 2;
846 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
Bool_t fMimicData
flag to switch on/off the correction of the pulls
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]
pt dep. d0 sigma pull MC/data in rphi for pions
Bool_t FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
TList * fDebugOutput
! collection of debug output
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 * fD0RPSigmaPullRatioK
pt dep. d0 sigma pull MC/data in rphi for protons
TGraph * fD0RPResPiCurSA
old standalone pt dep. d0 res. in rphi for kaons
TGraph * fD0RPSigmaPullRatioP
old pt dep. d0 res. in rphi for pions
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
TGraph * fD0RPSigmaPullRatioPi
pt dep. d0 sigma pull MC/data in rphi for kaons
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
Bool_t fUpdateSTCovMatrix
flag to swicth on/off the modification of the sec vert cov matrix
TGraph * fD0ZResPiUpg
new pt dep. d0 res. in z for kaons
TGraph * fD0ZResPiCur
old pt dep. d0 res. in z for kaons
Bool_t fUpdatePulls
flag to switch on/off the update of the single track covariance matrix
void SetSigmaVert(Double_t sigmaVert)
AliAODRecoDecayHF2Prong * Get2Prong() const
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