2 #include "AliESDEvent.h"
3 #include "AliESDtrack.h"
4 #include "AliESDVertex.h"
5 #include "AliVertexerTracks.h"
10 #include <TObjArray.h>
12 #include <TPaveText.h>
25 fEvProc(0),fIPCenterStat(0),fMinTracksForIP(ntrIP>2?ntrIP:2),fOutlierCut(outcut),
30 fEstimVtx(0),fEstimTrc(0),fHVtxXY(0),fNtuple(0),fVertexer(0),fTracks(0)
32 InitEstimators(nPhiBins,nestb,estmin,estmax,ntrBins,ntMn,ntMx,nPBins,pmn,pmx,ntuple);
37 :
TNamed(
"IPEstimator",
""),
38 fEvProc(0),fIPCenterStat(0),fMinTracksForIP(2),fOutlierCut(1e-4),
42 fEstimIP(0),fEstimVtx(0),fEstimTrc(0),fHVtxXY(0),fNtuple(0),fVertexer(0),fTracks(0)
62 if (!vtx)
return kFALSE;
65 double r = xyz[0]*xyz[0] + xyz[1]*xyz[1];
66 if (r>2.)
return kFALSE;
83 if (!
IsValid()) {AliError(
"Not initialized yet");
return -999;}
89 if (!vtx) vtx = (AliESDVertex*) esd->GetPrimaryVertex();
90 if (!vtx || (nTracks=vtx->GetNIndices())<
GetMinTracks()+1)
return kFALSE;
93 for (
int itr=0;itr<nTracks;itr++)
fTracks->Add(esd->GetTrack(trackID[itr]));
95 fVertexer->SetFieldkG( esd->GetMagneticField() );
107 if (!
IsValid()) {AliError(
"Not initialized yet");
return -999;}
111 int nTracks = tracks->GetEntriesFast();
113 for (
int itr=0;itr<nTracks;itr++)
fTracks->Add(tracks->At(itr));
123 int nTracks =
fTracks->GetEntriesFast();
125 for (
int i=nTracks;i--;) trackID[i] = i;
126 double xyzDCA[3],ddca[2],covdca[3];
127 int nTracks1 = nTracks - 1;
128 AliExternalTrackParam *selTrack,*movTrack=0;
131 AliESDVertex* recNewVtx =
fVertexer->VertexForSelectedTracks(
fTracks,trackID,kTRUE,kFALSE,kFALSE);
132 if (!recNewVtx || ((nTracks=recNewVtx->GetNIndices())<
GetMinTracks())) {
133 if (recNewVtx)
delete recNewVtx;
142 double fieldVal =
fVertexer->GetFieldkG();
143 for (
int itr=0;itr<nTracks;itr++) {
144 selTrack = (AliExternalTrackParam*) (*
fTracks)[itr];
145 double pTrack = selTrack->GetP();
146 if (!
IsZero(fieldVal) && (pTrack<pmn || pTrack>pmx))
continue;
147 selTrackID = trackID[itr];
150 movTrack = (AliExternalTrackParam*) (*
fTracks)[nTracks1];
151 movTrackID = trackID[nTracks1];
152 (*fTracks)[itr] = movTrack;
153 trackID[itr] = movTrackID;
158 recNewVtx =
fVertexer->VertexForSelectedTracks(
fTracks,trackID,kTRUE,kFALSE,kFALSE);
160 double told = selTrack->GetX();
161 selTrack->PropagateToDCA(recNewVtx,fieldVal,1e4,ddca,covdca);
162 selTrack->GetXYZ(xyzDCA);
164 double phiTrack = selTrack->Phi();
165 double cs = TMath::Cos(phiTrack);
166 double sn = TMath::Sin(phiTrack);
168 double vtDCA = (recNewVtx->GetX()-
fIPCenIni[0])*sn - (recNewVtx->GetY()-
fIPCenIni[1])*cs;
170 selTrack->PropagateTo(told,fieldVal);
173 ntf[0] = float(nTracks1);
174 ntf[1] = recNewVtx->GetX();
175 ntf[2] = recNewVtx->GetY();
176 ntf[3] = recNewVtx->GetZ();
186 (*fTracks)[itr] = selTrack;
187 trackID[itr] = selTrackID;
189 (*fTracks)[nTracks1] = movTrack;
190 trackID[nTracks1] = movTrackID;
204 double estIP = rvD*rtD;
205 double estVtx = rvD*(rvD - rtD);
206 double estTrc = rtD*(rtD - rvD);
222 nPBins = nPBins<1 ? 1: nPBins;
223 pmn = pmn>0.1 ? pmn : 0.1;
224 pmx = pmx>pmn ? pmx : pmn+0.1;
227 ntMn = ntMn>2 ? ntMn : 2;
228 ntMx = ntMx>ntMn ? ntMx : ntMn;
229 ntrBins = ntrBins<1 ? 1:ntrBins;
230 int step = (ntMx-ntMn)/ntrBins;
231 if (step<1) step = 1;
232 ntrBins = (ntMx-ntMn)/step;
235 nPhiBins = nPhiBins>1 ? nPhiBins : 1;
238 nestb = nestb>300 ? nestb:300;
239 estmin = estmin<-2.e-2 ? estmin : -2.e-2;
240 estmax = estmax> 4.e-2 ? estmax : 4.e-2;
245 fEstimIP =
new TH2F(nm.Data(),nm.Data(),nPhiBins,0.,2.*TMath::Pi(),nestb,estmin,estmax);
249 fEstimVtx =
new TH2F(nm.Data(),nm.Data(),ntrBins,ntMn,ntMx, nestb,estmin,estmax);
253 fEstimTrc =
new TH2F(nm.Data(),nm.Data(),nPBins,1./pmx,1./pmn, nestb,estmin,estmax);
257 fHVtxXY =
new TH2F(nm.Data(),nm.Data(),200, -1,1, 200,-1,1);
262 fNtuple =
new TNtuple(nm.Data(),nm.Data(),
"ntrack:xv:yv:zv:xt:yt:phi:p");
276 if (!
IsValid()) {AliError(
"Not initialized yet");
return -999;}
284 est = TMath::Sqrt(est);
288 *err += cx*cx*cxe*cxe + cy*cy*cye*cye;
289 *err = TMath::Sqrt(*err)/est/2.;
304 if (!
IsValid()) {AliError(
"Not initialized yet");
return -999;}
305 int bin =
fEstimVtx->GetXaxis()->FindBin(ntr);
307 AliError(Form(
"Requested vertex multiplicity %d out of defined %d-%d range",
311 TH1* proj =
fEstimVtx->ProjectionY(
"vrProj",bin,bin,
"e");
315 est = TMath::Sqrt(est);
316 if (err) *err /= 2*est;
330 if (!
IsValid()) {AliError(
"Not initialized yet");
return -999;}
333 int bin =
fEstimTrc->GetXaxis()->FindBin(pt);
338 TH1* proj =
fEstimTrc->ProjectionY(
"trProj",bin,bin,
"e");
342 est = TMath::Sqrt(est);
343 if (err) *err /= 2*est;
358 double max = histo->GetMaximum();
359 double cut = (ctfact>0&&ctfact<1.) ? max*ctfact : 0;
360 int nb = histo->GetNbinsX();
361 double mean = 0.,cumul = 0, rms = 0;
362 for (
int i=1;i<=nb;i++) {
363 double vl = histo->GetBinContent(i) - cut;
364 if (vl<1e-10)
continue;
365 double x = histo->GetBinCenter(i);
371 mean = cumul>0 ? mean/cumul : 0;
372 rms -= mean*mean*cumul;
374 *err = cumul > 1 ? rms/(cumul-1) : 0;
375 if (*err>0) *err = TMath::Sqrt(*err/cumul);
384 if (!
IsValid()) {printf(
"Not initialized yet\n");
return;}
386 double cx,cy,cz,cxe,cye,cze;
390 printf(
"Processed %d events\n",
fEvProc);
391 printf(
"Estimator for IP center: %+.4e+-%.3e | %+.4e+-%.3e | %+.4e+-%.3e\n",
392 cx,cxe,cy,cye,cz,cze);
393 printf(
"Initial IP center was : %+.4e %+.4e %+.4e\n",
396 printf(
"Estimator for IP sigma : %.4e+-%.3e\n",sgIP,cxe);
398 printf(
"Estimators for vertex resolution vs Ntracks:\n");
402 if (
IsZero(sig))
continue;
403 int tmin = TMath::Nint(
fEstimVtx->GetXaxis()->GetBinLowEdge(i));
404 int tmax = tmin + int(
fEstimVtx->GetXaxis()->GetBinWidth(i));
405 printf(
"%3d-%3d : %.4e+-%.3e\n",tmin,tmax,sig,cxe);
408 printf(
"Estimators for track DCA resolution vs P:\n");
411 if (
IsZero(sig))
continue;
412 double pmax = 1./
fEstimTrc->GetXaxis()->GetBinLowEdge(i);
413 double pmin = 1./(
fEstimTrc->GetXaxis()->GetBinLowEdge(i)+
fEstimTrc->GetXaxis()->GetBinWidth(i));
414 printf(
"%.2f-%.2f : %.4e+-%.3e\n",pmin,pmax,sig, cxe);
448 TCanvas *cnv =
new TCanvas(GetName(), GetName(),5,5,700,1000);
449 gStyle->SetOptStat(0);
450 gStyle->SetTitleH(0.07);
451 gStyle->SetTitleW(0.7);
452 gStyle->SetTitleY(1);
453 gStyle->SetTitleX(0.2);
461 TPaveText *pt =
new TPaveText(0.05,0.05,0.95,0.95,
"blNDC");
462 snprintf(buff,nc,
"%s | Outliers Cut : %.2e",GetName(),
fOutlierCut);
465 snprintf(buff,nc,
"Processed Events:\n%d",
fEvProc);
471 double cx,cy,cz,cxe,cye,cze;
476 snprintf(buff,nc,
"Int.Spot (#mum)\n%+d#pm%d\n%+d#pm%d\n%+d#pm%d",
477 int(cx*1e4),
int(cxe*1e4),
int(cy*1e4),
int(cye*1e4),
int(cz*1e4),
int(cze*1e4));
481 snprintf(buff,nc,
"Int.Spot #sigma (#mum):\n%d#pm%d",
int(cx*1e4),
int(cxe*1e4));
487 gPad->SetLeftMargin(0.2);
490 iph->SetTitle(
"Int.Spot size vs #phi");
491 for (
int i=1;i<=iph->GetNbinsX();i++) {
493 iph->SetBinContent(i,cx*1e4);
494 iph->SetBinError(i,cxe*1e4);
496 iph->GetXaxis()->SetTitle(
"#phi");
497 iph->GetYaxis()->SetTitle(
"#sigma_{IP} [#mum]");
498 iph->SetMarkerStyle(20);
501 iph->SetTitleOffset(2.5,
"Y");
504 gPad->SetLeftMargin(0.2);
507 vrh->SetTitle(
"Vertex resolution vs N tracks");
508 for (
int i=1;i<=vrh->GetNbinsX();i++) {
509 cx =
GetVtxSigma( TMath::Nint(vrh->GetBinCenter(i)), &cxe);
510 vrh->SetBinContent(i,cx*1e4);
511 vrh->SetBinError(i,cxe*1e4);
513 vrh->GetXaxis()->SetTitle(
"n tracks");
514 vrh->GetYaxis()->SetTitle(
"#sigma_{VTX} [#mum]");
515 vrh->SetMarkerStyle(20);
518 vrh->SetTitleOffset(2.5,
"Y");
521 gPad->SetLeftMargin(0.2);
524 trh->SetTitle(
"Track DCA resolution vs 1/P");
525 for (
int i=1;i<=trh->GetNbinsX();i++) {
527 trh->SetBinContent(i,cx*1e4);
528 trh->SetBinError(i,cxe*1e4);
530 trh->GetXaxis()->SetTitle(
"1/p [GeV]");
531 trh->GetYaxis()->SetTitle(
"#sigma_{DCA} [#mum]");
532 trh->SetMarkerStyle(20);
535 trh->SetTitleOffset(2.5,
"Y");
540 if (outname) cnv->Print(outname);
551 if (coll->IsEmpty())
return 1;
552 TIterator* iter = coll->MakeIterator();
555 while ((obj = iter->Next())) {
557 if (!entry)
continue;
virtual Long64_t Merge(TCollection *coll)
static Double_t CalcMean(TH1 *histo, Double_t ctfact, Double_t *err=0)
Bool_t IsZero(Double_t v, Double_t thresh=1e-15) const
Double_t GetTrackMinP() const
void UpdateEstimators(double rvD, double rtD, double nTracks, double pTrack, double phiTrack)
void InitEstimators(Int_t nPhiBins=12, Int_t nestb=500, Double_t estmin=-2e-2, Double_t estmax=6e-2, Int_t ntrBins=10, Int_t ntMn=2, Int_t ntMx=32, Int_t nPBins=14, Double_t pmn=0.2, Double_t pmx=3., Bool_t ntuple=kFALSE)
Double_t GetIPCenIni(Int_t id) const
Int_t GetMaxTracks() const
Int_t GetMinTracks() const
ClassImp(AliIntSpotEstimator) AliIntSpotEstimator
Bool_t ProcessEvent(const AliESDEvent *esd, const AliESDVertex *vtx=0)
virtual void Print(Option_t *opt="") const
virtual void Clear(Option_t *opt="")
Double_t GetDCASigma(double p, Double_t *err=0) const
Int_t GetNPhiBins() const
Double_t GetIPCenter(Int_t id, Double_t *err=0) const
AliVertexerTracks * fVertexer
optional ntuple with dca's
TObjArray * fTracks
vertex fitter
AliIntSpotEstimator(Bool_t initDef=kFALSE)
Double_t GetVtxSigma(int ntr, Double_t *err=0) const
TCanvas * CreateReport(const char *outname=0)
Double_t GetIPSigma(Int_t phibin=0, Double_t *err=0) const
Double_t GetTrackMaxP() const
Int_t GetNTrackBins() const
Bool_t ProcessIPCenter(const AliESDVertex *vtx)
AliIntSpotEstimator & operator+=(const AliIntSpotEstimator &src)