FEDRA emulsion software from the OPERA Collaboration
EdbMomentumEstimator Class Reference

#include <EdbMomentumEstimator.h>

Inheritance diagram for EdbMomentumEstimator:
Collaboration diagram for EdbMomentumEstimator:

Public Member Functions

TString AlgStr (int alg)
 
float CellWeight (int npl, int m)
 
void DrawPlots (TCanvas *c1=NULL)
 
 EdbMomentumEstimator ()
 
void EstimateMomentumError (float P, int npl, float ang, float &pmin, float &pmax)
 
double GetDTs (double Ts)
 
double GetDTx (double Tx)
 
double GetDTy (double Ty)
 
double Mat (float P, int npl, float ang)
 
TF1 * MCSCoordErrorFunction (const char *name, float tmean, float x0)
 
TF1 * MCSErrorFunction (const char *name, float x0, float dtx)
 
TF1 * MCSErrorFunction_base (const char *name, float x0, float dtx)
 
float P_MS (EdbTrackP &tr)
 
float PMS (EdbTrackP &tr)
 
float PMSang (EdbTrackP &tr)
 
int PMSang_base (EdbTrackP &tr)
 
int PMSang_base_A (EdbTrackP &tr)
 
float PMSang_corr (EdbTrackP &tr)
 
float PMScoordinate (EdbTrackP &tr)
 
void Print ()
 
void Set0 ()
 
void SetDTsErrorFunction (TF1 &f)
 
void SetDTxErrorFunction (TF1 &f)
 
void SetDTyErrorFunction (TF1 &f)
 
void SetParPMS_Mag ()
 
void SetParPMS_Mag (Int_t type, Int_t parNumber, Double_t parvalue)
 
virtual ~EdbMomentumEstimator ()
 
- Public Member Functions inherited from EdbTrackFitter
float Chi2SegM (EdbSegP s1, EdbSegP s2, EdbSegP &s, EdbScanCond &cond1, EdbScanCond &cond2)
 
float Chi2SegMCS (const EdbSegP &s1, const EdbSegP &s2)
 
 EdbTrackFitter ()
 
int FitTrackLine (const EdbTrackP &tr, float &x, float &y, float &z, float &tx, float &ty, float &w)
 
int FitTrackLine (EdbTrackP &tr)
 
float PMS_KF (EdbTrackP &t, float p0=10., float probbest=0.5)
 
void Print ()
 
double ProbSegMCS (EdbSegP *s1, EdbSegP *s2)
 
void SetDefaultBrick ()
 
void SetNsegMax (int nseg)
 
bool SplitTrack (EdbTrackP &t, EdbTrackP &t1, int isplit)
 
int SplitTrackByKink (EdbTrackP *t, TObjArray &tracks, float maxkink)
 
virtual ~EdbTrackFitter ()
 

Public Attributes

int eAlg
 select the algorithm for PMS estimation More...
 
float eDP
 
float eDPx
 
float eDPy
 the fit error More...
 
TF1 eDTsErrorFun
 
TF1 eDTxErrorFun
 input parameters for PMS_mag More...
 
TF1 eDTyErrorFun
 
TF1 * eF1
 
TF1 * eF1X
 fit function More...
 
TF1 * eF1Y
 
TGraphErrors * eG
 3D component of the momentum More...
 
TGraphAsymmErrors * eGA
 3D component of the momentum More...
 
TGraphAsymmErrors * eGAX
 longitudianl component of the momentum More...
 
TGraphAsymmErrors * eGAY
 transverse component of the momentum More...
 
TGraphErrors * eGX
 longitudianl component of the momentum More...
 
TGraphErrors * eGY
 transverse component of the momentum More...
 
int eMinEntr
 min number of entries in the cell to accept it for fitting (def=1) More...
 
float eP
 the output of PMSang More...
 
float ePmax
 momentum 90% errors range More...
 
float ePmin
 
float ePx
 the fit results More...
 
float ePXmax
 momentum 90% errors range More...
 
float ePXmin
 
float ePy
 the estimated momentum More...
 
float ePYmax
 momentum 90% errors range More...
 
float ePYmin
 
int eStatus
 status of the estimation (-1 nothing was done) More...
 
EdbTrackP eTrack
 the copy of the track to be used for plots More...
 
bool eVerbose
 
- Public Attributes inherited from EdbTrackFitter
bool eDE_correction
 take into account the energy loss or not More...
 
float eM
 mass of the particle (if negative - use the mass setted in the track) More...
 
float ePcut
 minimal momentum? More...
 
float ePdef
 default momentum More...
 
float eTPb
 ? More...
 
float eX0
 rad length of the media [microns] More...
 

Additional Inherited Members

- Static Public Member Functions inherited from EdbTrackFitter
static float Chi2ACP (EdbSegP s1, EdbSegP s2, EdbScanCond &cond)
 
static float Chi2ASeg (EdbSegP &s1, EdbSegP &s2, EdbSegP &s, EdbScanCond &cond1, EdbScanCond &cond2)
 
static float Chi2ASegLL (EdbSegP &s1, EdbSegP &s2, EdbSegP &s, EdbScanCond &cond1, EdbScanCond &cond2)
 
static float Chi2PSeg (EdbSegP &s1, EdbSegP &s2, EdbSegP &seg, EdbScanCond &cond1, EdbScanCond &cond2)
 
static float Chi2Seg (EdbSegP *s1, EdbSegP *s2)
 
static float MaxChi2Seg (EdbTrackP &tr)
 
static float MaxKink (EdbTrackP &tr)
 
static float MeanChi2Seg (EdbTrackP &tr)
 
static float MeanKink (EdbTrackP &tr)
 
static int RMSprojXY (EdbTrackP &tr, float &ex, float &ey)
 
static float Theta (EdbSegP &s, EdbSegP &s1)
 

Constructor & Destructor Documentation

◆ EdbMomentumEstimator()

EdbMomentumEstimator::EdbMomentumEstimator ( )
31{
32 eAlg = 0; // default algorithm
33 eF1 = 0;
34 eF1X = 0;
35 eF1Y = 0;
36 eG = 0;
37 eGX = 0;
38 eGY = 0;
39 eGA = 0;
40 eGAX = 0;
41 eGAY = 0;
42 eVerbose=0;
43 eMinEntr = 1;
44
45 eDTxErrorFun=TF1("dTxError","pol4");
46 eDTyErrorFun=TF1("dTyError","pol4");
47 eDTsErrorFun=TF1("dTsError","pol4");
49}
bool eVerbose
Definition: EdbMomentumEstimator.h:48
TGraphAsymmErrors * eGAX
longitudianl component of the momentum
Definition: EdbMomentumEstimator.h:57
int eAlg
select the algorithm for PMS estimation
Definition: EdbMomentumEstimator.h:25
TGraphAsymmErrors * eGAY
transverse component of the momentum
Definition: EdbMomentumEstimator.h:58
TF1 * eF1Y
Definition: EdbMomentumEstimator.h:50
void SetParPMS_Mag()
Definition: EdbMomentumEstimator.cxx:73
TGraphErrors * eG
3D component of the momentum
Definition: EdbMomentumEstimator.h:52
int eMinEntr
min number of entries in the cell to accept it for fitting (def=1)
Definition: EdbMomentumEstimator.h:28
TF1 eDTxErrorFun
input parameters for PMS_mag
Definition: EdbMomentumEstimator.h:31
TGraphAsymmErrors * eGA
3D component of the momentum
Definition: EdbMomentumEstimator.h:56
TGraphErrors * eGY
transverse component of the momentum
Definition: EdbMomentumEstimator.h:54
TF1 eDTyErrorFun
Definition: EdbMomentumEstimator.h:32
TF1 * eF1X
fit function
Definition: EdbMomentumEstimator.h:49
TF1 eDTsErrorFun
Definition: EdbMomentumEstimator.h:33
TGraphErrors * eGX
longitudianl component of the momentum
Definition: EdbMomentumEstimator.h:53
TF1 * eF1
Definition: EdbMomentumEstimator.h:51

◆ ~EdbMomentumEstimator()

EdbMomentumEstimator::~EdbMomentumEstimator ( )
virtual
53{
54 SafeDelete(eF1);
55 SafeDelete(eF1X);
56 SafeDelete(eF1Y);
57 SafeDelete(eG);
58 SafeDelete(eGX);
59 SafeDelete(eGY);
60}

Member Function Documentation

◆ AlgStr()

TString EdbMomentumEstimator::AlgStr ( int  alg)
102{
103 char *str = new char[256];
104 switch(alg) {
105 case 0:
106 sprintf(str,"%d (PMSang) Version rewised by VT 13/05/2008 (see PMSang_base) and further modified by Magali at the end of 2008", alg); break;
107 case 1:
108 sprintf(str,"%d (PMSang_base) Version rewised by VT 13/05/2008",alg); break;
109 case 2:
110 sprintf(str,"%d (PMSang_base_A) Version revised by Andrea Russo 13/03/2009 based on PMSang_base() by VT",alg); break;
111 case 3:
112 sprintf(str,"%d (PMScoordinate) Momentum estimation by coordinate method A.Russo 2010",alg); break;
113 case 4:
114 sprintf(str,"%d (PMSang_corr) PMS_ang corrected by ASh",alg); break;
115 }
116 TString s(str);
117 return s;
118}
s
Definition: check_shower.C:55

◆ CellWeight()

float EdbMomentumEstimator::CellWeight ( int  npl,
int  m 
)

------------------------— TO BE IMPLEMENTED--------------------------------------—

npl - number of plates, m - the cell thickness in plates return the statistical weight of the cell

return Sqrt(npl/m); // the simpliest estimation no shift, no correlations

645{
647
650
652
653 return 2*Sqrt( npl/m + 1./m/m*( npl*(m-1) - m*(m-1)/2.) );
654 // return 1;
655}

◆ DrawPlots()

void EdbMomentumEstimator::DrawPlots ( TCanvas c1 = NULL)

example of the plots available after PMSang

725{
727 gStyle->SetOptFit(11111);
728 if(c1==NULL) c1 = new TCanvas("tf","track momentum estimation",800,600);
729 c1->Divide(3,2);
730
731 if(eAlg<2||eAlg==3)
732 {
733 if(eGX) {
734 c1->cd(1);
735 TGraphErrors *gx = new TGraphErrors(*eGX);
736
737 if(eAlg<2)
738 {
739 gx->Draw("ALPR");
740 gx->SetTitle("Theta vs cell (transverse component)");
741 TF1 *fxmin = new TF1(*(eF1X));
742 fxmin->SetLineColor(kBlue);
743 fxmin->SetParameter(0,ePXmin);
744 fxmin->Draw("same");
745 TF1 *fxmax = new TF1(*(eF1X));
746 fxmax->SetLineColor(kBlue);
747 fxmax->SetParameter(0,ePXmax);
748 fxmax->Draw("same");
749 }
750 else
751 {
752 gx->Draw("A*");
753 gx->SetTitle("Position vs cell (X component)");
754 }
755
756
757 }
758
759 if(eGY) {
760 c1->cd(2);
761 TGraphErrors *gy = new TGraphErrors(*eGY);
762
763 if(eAlg<2)
764 {
765 gy->Draw("ALPR");
766 gy->SetTitle("Theta vs cell (longitudinal component)");
767 TF1 *fymin = new TF1(*(eF1Y));
768 fymin->SetLineColor(kBlue);
769 fymin->SetParameter(0,ePYmin);
770 fymin->Draw("same");
771 TF1 *fymax = new TF1(*(eF1Y));
772 fymax->SetLineColor(kBlue);
773 fymax->SetParameter(0,ePYmax);
774 fymax->Draw("same");
775 }
776 else
777 {
778 gy->Draw("A*");
779 gy->SetTitle("Position vs cell (Y component)");
780 }
781
782
783 }
784
785 if(eG) {
786 c1->cd(3);
787 TGraphErrors *g = new TGraphErrors(*eG);
788
789 if(eAlg<2)
790 {
791 g->Draw("ALPR");
792 g->SetTitle("Theta vs cell (3D)");
793 //g->Print();
794 TF1 *fmin = new TF1(*(eF1));
795 fmin->SetLineColor(kBlue);
796 fmin->SetParameter(0,ePmin);
797 fmin->Draw("same");
798 TF1 *fmax = new TF1(*(eF1));
799 fmax->SetLineColor(kBlue);
800 fmax->SetParameter(0,ePmax);
801 fmax->Draw("same");
802 }
803 else
804 {
805 g->Draw("A*");
806 g->SetTitle("Position vs cell (3D)");
807 }
808
809
810 }
811 }
812
813 if(eAlg==2)
814 {
815 if(eGAX) {
816 c1->cd(1);
817 TGraphAsymmErrors *gx = new TGraphAsymmErrors(*eGAX);
818 gx->SetTitle("Theta vs cell (longitudinal component)");
819 gx->Draw("ALPR");
820 TF1 *fxmin = new TF1(*(eF1X));
821 fxmin->SetLineColor(kBlue);
822 fxmin->SetParameter(0,ePXmin);
823 fxmin->Draw("same");
824 TF1 *fxmax = new TF1(*(eF1X));
825 fxmax->SetLineColor(kBlue);
826 fxmax->SetParameter(0,ePXmax);
827 fxmax->Draw("same");
828 }
829
830 if(eGAY) {
831 c1->cd(2);
832 TGraphAsymmErrors *gy = new TGraphAsymmErrors(*eGAY);
833 gy->SetTitle("Theta vs cell (transverse component)");
834 gy->Draw("ALPR");
835 TF1 *fymin = new TF1(*(eF1Y));
836 fymin->SetLineColor(kBlue);
837 fymin->SetParameter(0,ePYmin);
838 fymin->Draw("same");
839 TF1 *fymax = new TF1(*(eF1Y));
840 fymax->SetLineColor(kBlue);
841 fymax->SetParameter(0,ePYmax);
842 fymax->Draw("same");
843 }
844
845 if(eGA) {
846 c1->cd(3);
847 TGraphAsymmErrors *g = new TGraphAsymmErrors(*eGA);
848 g->SetTitle("Theta vs cell (3D)");
849 g->Draw("ALPR");
850 //g->Print();
851 TF1 *fmin = new TF1(*(eF1));
852 fmin->SetLineColor(kBlue);
853 fmin->SetParameter(0,ePmin);
854 fmin->Draw("same");
855 TF1 *fmax = new TF1(*(eF1));
856 fmax->SetLineColor(kBlue);
857 fmax->SetParameter(0,ePmax);
858 fmax->Draw("same");
859 }
860 }
861
862
863
864 int nseg = eTrack.N();
865 if(nseg) {
866 c1->cd(4);
867 TGraph2D *gxyz = new TGraph2D(nseg);
868 for(int i=0; i<nseg; i++)
869 gxyz->SetPoint(i, eTrack.GetSegment(i)->X(), eTrack.GetSegment(i)->Y(), eTrack.GetSegment(i)->Z());
870 gxyz->SetName("gxyz");
871 gxyz->SetTitle("track: X vs Y vs Z");
872 gxyz->SetMarkerStyle(21);
873 gxyz->Draw("P");
874
875 TGraphErrors *gtx = new TGraphErrors(nseg);
876 for(int i=0; i<nseg; i++)
877 gtx->SetPoint(i, eTrack.GetSegment(i)->PID(), eTrack.GetSegment(i)->TX());
878 TGraphErrors *gty = new TGraphErrors(nseg);
879 for(int i=0; i<nseg; i++)
880 gty->SetPoint(i, eTrack.GetSegment(i)->PID(), eTrack.GetSegment(i)->TY());
881
882
883 TVirtualPad *vp;
884 vp = c1->cd(5);
885 vp->SetGrid();
886 gtx->SetLineColor(kBlue);
887 gtx->SetMarkerStyle(24);
888 gtx->Draw("ALP");
889
890 vp = c1->cd(6);
891 vp->SetGrid();
892 gty->SetMarkerStyle(24);
893 gty->SetLineColor(kRed);
894 gty->Draw("ALP");
895 }
896
897}
float ePmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:44
float ePXmin
Definition: EdbMomentumEstimator.h:39
float ePXmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:39
float ePmin
Definition: EdbMomentumEstimator.h:44
EdbTrackP eTrack
the copy of the track to be used for plots
Definition: EdbMomentumEstimator.h:46
float ePYmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:40
float ePYmin
Definition: EdbMomentumEstimator.h:40
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t X() const
Definition: EdbSegP.h:173
Float_t Z() const
Definition: EdbSegP.h:153
Float_t Y() const
Definition: EdbSegP.h:174
Int_t PID() const
Definition: EdbSegP.h:148
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
Int_t N() const
Definition: EdbPattern.h:177
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:195
TCanvas * c1
Definition: energy.C:13
#define NULL
Definition: nidaqmx.h:84
new TCanvas()

◆ EstimateMomentumError()

void EdbMomentumEstimator::EstimateMomentumError ( float  P,
int  npl,
float  ang,
float &  pmin,
float &  pmax 
)
700{
701 float pinv=1./P;
702 float DP=Mat(P, npl, ang );
703 float pinvmin=pinv*(1-DP*1.64);
704 float pinvmax=pinv*(1+DP*1.64);
705 pmin=(1./pinvmax); //90%CL minimum momentum
706 pmax=(1./pinvmin); //90%CL maximum momentum
707 if (P>1000.) pmax=10000000.;
708}
double Mat(float P, int npl, float ang)
Definition: EdbMomentumEstimator.cxx:711

◆ GetDTs()

double EdbMomentumEstimator::GetDTs ( double  Ts)
inline
83{return eDTsErrorFun.Eval(Ts);}

◆ GetDTx()

double EdbMomentumEstimator::GetDTx ( double  Tx)
inline
81{return eDTxErrorFun.Eval(Tx);}

◆ GetDTy()

double EdbMomentumEstimator::GetDTy ( double  Ty)
inline
82{return eDTyErrorFun.Eval(Ty);}

◆ Mat()

double EdbMomentumEstimator::Mat ( float  P,
int  npl,
float  ang 
)

These parametrisations at low and large angles are parametrised with MC See Magali's thesis for more informations

712{
715 double DP=0.;
716// new parameterisition as published
717 if(Abs(ang)<0.2) DP = ((0.397+0.019*P)/Sqrt(npl) + (0.176+0.042*P) + (-0.014-0.003*P)*Sqrt(npl));
718 if(Abs(ang)>=0.2) DP = ((1.400-0.022*P)/Sqrt(npl) + (-0.040+0.051*P) + (0.003-0.004*P)*Sqrt(npl));
719 if (DP>0.80) DP=0.80;
720 return DP;
721}

◆ MCSCoordErrorFunction()

TF1 * EdbMomentumEstimator::MCSCoordErrorFunction ( const char *  name,
float  tmean,
float  x0 
)

return the function of the expected position deviation as function of range

use the Highland-Lynch-Dahl formula for theta_rms_plane = 13.6 MeV/bcp*z*sqrt(x/x0) (PDG) so the expected measured position deviation is (1/sqrt(3))*theta_rms_plane + measurement error log term in HLD formula is neglected

685{
691
692
693 return new TF1(name,Form("sqrt(([1])**2+(2./3)*((x*sqrt(1+%f**2))**3)*(0.0136**2)*[0]/%f)",tmean,x0));
694
695 //P is returned in GeV
696}
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24

◆ MCSErrorFunction()

TF1 * EdbMomentumEstimator::MCSErrorFunction ( const char *  name,
float  x0,
float  dtx 
)

dtx - the plane angle measurement error return the function of the expected angular deviation vs range

use the Highland-Lynch-Dahl formula for theta_rms_plane = 13.6 MeV/bcp*z*sqrt(x/x0)*(1+0.038*log(x/x0)) (PDG) so the expected measured angle is sqrt( theta_rms_plane**2 + dtx**2)

The constant term im the scattering formula is not 13.6 but 14.64, which is the right reevaluated number, due to a calculation with the moliere distribution. 13.6 is an approximation. See Geant3 or 4 references for more explanations.???????

err(x) = sqrt(k*x*(1+0.038*log(x/x0))/p**2 + dtx)

float k = 14.64*14.64/x0; 14.64*14.64/1000/1000 = 0.0002143296 - we need p in GeV 13.6*13.6/1000/1000 = 0.0001849599 - we need p in GeV

659{
671
675
676
677 return new TF1(name,Form("sqrt(214.3296*x/%f*((1+0.038*log(x/(%f)))**2)/([0])**2+%e)",x0,x0,dtx));
678 // return new TF1(name,Form("sqrt(184.9599*x/%f*((1+0.038*log(x/(%f)))**2)/([0])**2+%e)",x0,x0,dtx));
679
680 //P is returned in MeV by this function for more convinience, but given in GeV as output.
681}

◆ MCSErrorFunction_base()

TF1 * EdbMomentumEstimator::MCSErrorFunction_base ( const char *  name,
float  x0,
float  dtx 
)

dtx - the plane angle measurement error return the function of the expected angular deviation vs range

use the Highland-Lynch-Dahl formula for theta_rms_plane = 13.6 MeV/bcp*z*sqrt(x/x0)*(1+0.038*log(x/x0)) (PDG) so the expected measured angle is sqrt( theta_rms_plane**2 + dtx**2)

The constant term im the scattering formula is not 13.6 but 14.64, which is the right reevaluated number, due to a calculation with the moliere distribution. 13.6 is an approximation. See Geant3 or 4 references for more explanations.???????

err(x) = sqrt(k*x*(1+0.038*log(x/x0))/p**2 + dtx)

float k = 14.64*14.64/x0; 14.64*14.64/1000/1000 = 0.0002143296 - we need p in GeV 13.6*13.6/1000/1000 = 0.0001849599 - we need p in GeV

1050{
1062
1066
1067 return new TF1(name,Form("sqrt(0.0002143296*x/%f*((1+0.038*log(x/(%f)))**2)/([0])**2+%f)",x0,x0,dtx));
1068 //return new TF1(name,Form("sqrt(0.0001849599*x/%f*(1+0.038*log(x/(%f)))/([0])**2+%f)",x0,x0,dtx));
1069}

◆ P_MS()

float EdbMomentumEstimator::P_MS ( EdbTrackP tr)

momentum estimation by multiple scattering (first test version (VT))

1073{
1075
1076 int stepmax = 1;
1077 int nms = 0;
1078 double tms = 0.;
1079 int ist = 0;
1080
1081 float m; // the mass of the particle
1082 eM<0? m = tr.M(): m=eM;
1083
1084 EdbSegP *s1=0,*s2=0;
1085
1086 double dx,dy,dz,ds;
1087 double dtx,dty,dts,fact,ax1,ax2,ay1,ay2,dax1,dax2,day1,day2;
1088
1089 int nseg = tr.N(), i1 = 0, i2 = 0;
1090
1091 for (ist=1; ist<=stepmax; ist++) { // step size
1092
1093 for (i1=0; i1<(nseg-ist); i1++) { // for each step just once
1094
1095 i2 = i1+ist;
1096
1097 s1 = tr.GetSegment(i1);
1098 s2 = tr.GetSegment(i2);
1099
1100 dx = s2->X()-s1->X();
1101 dy = s2->Y()-s1->Y();
1102 dz = s2->Z()-s1->Z();
1103 ds = Sqrt(dx*dx+dy*dy+dz*dz);
1104
1105 ax1 = ATan(s1->TX());
1106 ax2 = ATan(s2->TX());
1107 ay1 = ATan(s1->TY());
1108 ay2 = ATan(s2->TY());
1109 dax1 = s1->STX();
1110 dax2 = s2->STX();
1111 day1 = s1->STY();
1112 day2 = s2->STY();
1113 dtx = (ax2-ax1);
1114 dty = (ay2-ay1);
1115 dts = dtx*dtx+dty*dty;
1116 fact = 1.+0.038*Log(ds/eX0);
1117 dts = (dts-dax1-dax2-day1-day2)/ds/fact/fact;
1118 // if (dts < 0.) dts = 0.;
1119 tms += dts;
1120 nms++;
1121 }
1122 }
1123
1124 if(tms<=0) {
1125 printf("P_MS: BAD estimation for track %d: tms=%g nms=%d\n",tr.ID(),tms,nms);
1126 return 10; // with correct parameters setting this problem is usually happend for hard tracks >=10 GeV
1127 }
1128 double pbeta = 0., pbeta2 = 0.;
1129 pbeta = Sqrt((double)nms/tms/eX0)*0.01923;
1130 pbeta2 = pbeta*pbeta;
1131 double p = 0.5*(pbeta2 + Sqrt(pbeta2*pbeta2 + 4.*pbeta2*m*m));
1132 if (p <= 0.)
1133 p = 0.;
1134 else
1135 p = Sqrt(p);
1136
1137 if (eDE_correction)
1138 {
1139 double dtot = 0., eTPb = 1000./1300., e = 0., tkin = 0.;
1140 s1 = tr.GetSegment(0);
1141 s2 = tr.GetSegment(nseg-1);
1142
1143 dx = s2->X()-s1->X();
1144 dy = s2->Y()-s1->Y();
1145 dz = s2->Z()-s1->Z();
1146
1147 dtot = Sqrt(dx*dx+dy*dy+dz*dz)*eTPb;
1148
1149 double DE = EdbPhysics::DeAveragePb(p, m, dtot);
1150 tkin = Sqrt(p*p + m*m) - m;
1151
1152 if (tkin < DE)
1153 {
1154 tkin = 0.5*DE;
1155 e = tkin + m;
1156 p = Sqrt(e*e - m*m);
1157 DE = EdbPhysics::DeAveragePb(p, m, dtot);
1158 }
1159 tkin = tkin + 0.5*DE;
1160 e = tkin + m;
1161 p = Sqrt(e*e - m*m);
1162 }
1163
1164 return (float)p;
1165}
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
brick dz
Definition: RecDispMC.C:107
double DE
Definition: RecDispMC_Profiles.C:465
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:132
Definition: EdbSegP.h:21
Float_t STX() const
Definition: EdbSegP.h:164
Float_t STY() const
Definition: EdbSegP.h:165
float eTPb
?
Definition: EdbTrackFitter.h:26
bool eDE_correction
take into account the energy loss or not
Definition: EdbTrackFitter.h:28
float eX0
rad length of the media [microns]
Definition: EdbTrackFitter.h:23
float eM
mass of the particle (if negative - use the mass setted in the track)
Definition: EdbTrackFitter.h:24
EdbDisplay * ds
Definition: check_vertex.C:16
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30
p
Definition: testBGReduction_AllMethods.C:8

◆ PMS()

float EdbMomentumEstimator::PMS ( EdbTrackP tr)

according to eAlg the algorithm will be selected to estimate the momentum

122{
124
125 eTrack.Clear();
126 eTrack.Copy(tr);
127
128 Set0();
129
130 switch(eAlg){
131 case 0: return PMSang(eTrack);
132
133 case 1:
135 if(eStatus>0) return eP;
136 else return -100.; // todo
137
138 case 2:
140 if(eStatus>0) return eP;
141 else return -100.; // todo
142
143 case 3: return PMScoordinate(eTrack);
144 case 4: return PMSang_corr(eTrack);
145 }
146 return -100;
147}
int PMSang_base_A(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:1168
float PMSang(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:255
float PMSang_corr(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:158
float eP
the output of PMSang
Definition: EdbMomentumEstimator.h:43
void Set0()
Definition: EdbMomentumEstimator.cxx:63
int eStatus
status of the estimation (-1 nothing was done)
Definition: EdbMomentumEstimator.h:26
float PMScoordinate(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:477
int PMSang_base(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:900
void Clear()
Definition: EdbPattern.h:264
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:473

◆ PMSang()

float EdbMomentumEstimator::PMSang ( EdbTrackP tr)

Version rewised by VT 13/05/2008 (see PMSang_base) and further modified by Magali at the end of 2008

Momentum estimation by multiple scattering (Annecy implementation Oct-2007)

Input: tr - can be modified by the function

calculate momentum in transverse and in longitudinal projections using the different measurements errors parametrisation

256{
265
266 int nseg = tr.N();
267 int npl=tr.Npl();
268 if(nseg<2) { Log(1,"PMSang","Warning! nseg<2 (%d)- impossible estimate momentum!",nseg); return -99;}
269 if(npl<nseg) { Log(1,"PMSang","Warning! npl<nseg (%d, %d) - use track.SetCounters() first",npl,nseg); return -99;}
270 int plmax = Max( tr.GetSegmentFirst()->PID(), tr.GetSegmentLast()->PID() ) + 1;
271 if(plmax<1||plmax>1000) { Log(1,"PMSang","Warning! plmax = %d - correct the segments PID's!",plmax); return -99;}
272
273
274 float xmean,ymean,zmean,txmean,tymean,wmean;
275 float xmean0,ymean0,zmean0,txmean0,tymean0,wmean0;
276 FitTrackLine(tr,xmean0,ymean0,zmean0,txmean0,tymean0,wmean0); // calculate mean track parameters
277 float tmean=Sqrt(txmean0*txmean0+ tymean0*tymean0);
278
279 EdbSegP *aas;
280 float sigmax=0, sigmay=0;
281 for (int i =0;i<tr.N();i++)
282 {
283 aas=tr.GetSegment(i);
284 sigmax+=(txmean0-aas->TX())*(txmean0-aas->TX());
285 sigmay+=(tymean0-aas->TY())*(tymean0-aas->TY());
286 }
287 sigmax= Sqrt(sigmax/tr.N());
288 sigmay= Sqrt(sigmay/tr.N());
289 for (int i =0;i<tr.N();i++)
290 {
291 aas=tr.GetSegment(i);
292 if(Abs(aas->TX()-txmean0)>3*sigmax||Abs(aas->TY()-tymean0)>3*sigmay) {
293 aas->Set(aas->ID(),aas->X(),aas->Y(),0.,0.,aas->W(),aas->Flag());}
294 }
295
296 FitTrackLine(tr,xmean0,ymean0,zmean0,txmean0,tymean0,wmean0);
297
298 // EdbAffine2D aff;
299 // aff.ShiftX(-xmean0);
300 // aff.ShiftY(-ymean0);
301 // aff.Rotate( -ATan2(txmean0,tymean0) ); // rotate track to get longitudinal as tx, transverse as ty angle
302 // tr.Transform(aff);
303 float PHI=atan2(txmean0,tymean0);
304 for (int i =0;i<tr.N();i++)
305 {
306 aas=tr.GetSegment(i);
307 float slx=aas->TY()*cos(-PHI)-aas->TX()*sin(-PHI);
308 float sly=aas->TX()*cos(-PHI)+ aas->TY()*sin(-PHI);
309 aas->Set(aas->ID(),aas->X(),aas->Y(),slx,sly,aas->W(),aas->Flag());
310 }
311
312 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
313
314
315
316
317 // -- start calcul --
318
319 int minentr = eMinEntr; // min number of entries in the cell to accept the cell for fitting
320 int stepmax = npl-1; //npl/minentr; // max step
321 const int size = stepmax+1; // vectors size
322
323 TVectorF da(size), dax(size), day(size);
324 TArrayI nentr(size), nentrx(size), nentry(size);
325
326 EdbSegP *s1,*s2;
327 for(int ist=1; ist<=stepmax; ist++) // cycle by the step size
328 {
329 for(int i1=0; i1<nseg-1; i1++) // cycle by the first seg
330 {
331 s1 = tr.GetSegment(i1);
332 if(!s1) continue;
333 for(int i2=i1+1; i2<nseg; i2++) // cycle by the second seg
334 {
335 s2 = tr.GetSegment(i2);
336 if(!s2) continue;
337 int icell = Abs(s2->PID()-s1->PID());
338 if( icell == ist )
339 {
340 if (s2->TX()!=0&&s1->TX()!=0)
341 {
342 dax[icell-1] += ( (ATan(s2->TX())- ATan(s1->TX())) * (ATan(s2->TX())- ATan(s1->TX())) );
343 nentrx[icell-1]+=1;
344 }
345 if (s2->TY()!=0&&s1->TY()!=0)
346 {
347 day[icell-1] += ( (ATan(s2->TY())- ATan(s1->TY())) * (ATan(s2->TY())- ATan(s1->TY())) );
348 nentry[icell-1]+=1;
349 }
350 if (s2->TX()!=0&&s1->TX()!=0&&s2->TY()!=0&&s1->TY()!=0)
351 {
352 da[icell-1] += (( (ATan(s2->TX())- ATan(s1->TX())) * (ATan(s2->TX())- ATan(s1->TX())) )
353 + ( (ATan(s2->TY())-ATan(s1->TY())) * (ATan(s2->TY())- ATan(s1->TY())) ));
354 nentr[icell-1] +=1;
355 }
356 }
357 }
358 }
359 }
360
361 float Zcorr = Sqrt(1+txmean0*txmean0+tymean0*tymean0); // correction due to non-zero track angle and crossed lead thickness
362
363 int maxX =0, maxY=0, max3D=0; // maximum value for the function fit
364 TVectorF vindx(size), errvindx(size),vindy(size), errvindy(size),vind3d(size), errvind3d(size);
365 TVectorF errda(size), errdax(size), errday(size);
366 int ist=0, ist1=0, ist2=0; // use the counter for case of missing cells
367 for(int i=0; i<size; i++)
368 {
369 if( nentrx[i] >= minentr && Abs(dax[i])<0.1)
370 {
371 vindx[ist] = i+1; // x-coord is defined as the number of cells
372 errvindx[ist] = .25;
373 dax[ist] = Sqrt( dax[i]/(nentrx[i]*Zcorr) );
374 errdax[ist] = dax[ist]/Sqrt(2*nentrx[i]);//CellWeight(npl,i+1); // Sqrt(npl/vind[i]);
375 ist++;
376 maxX=i+1;
377 }
378 if( nentry[i] >= minentr && Abs(day[i])<0.1)
379 {
380 vindy[ist1] = i+1; // x-coord is defined as the number of cells
381 errvindy[ist1] = .25;
382 day[ist1] = Sqrt( day[i]/(nentry[i]*Zcorr) );
383 errday[ist1] = day[ist1]/Sqrt(2*nentry[i]);//CellWeight(npl,i+1);
384 ist1++;
385 maxY=i+1;
386 }
387 if( nentr[i] >= minentr/2 && Abs(da[i])<0.1 )
388 {
389 vind3d[ist2] = i+1; // x-coord is defined as the number of cells
390 errvind3d[ist2] = .25;
391 da[ist2] = Sqrt( da[i]/(2*nentr[i]*Zcorr) );
392 errda[ist2] = da[ist2]/Sqrt(4*nentr[i]);//CellWeight(npl,i+1));
393 ist2++;
394 max3D=i+1;
395 }
396 }
397
398 float dt = GetDTs(tmean);// measurements errors parametrization
399 dt*=dt;
400 float dtx = GetDTx(txmean);// measurements errors parametrization
401 dtx*=dtx;
402 float dty = GetDTy(tymean);// measurements errors parametrization
403 dty*=dty;
404
405 float x0 = eX0/1000;
406 float chi2_3D =0;
407 float chi2_T =0;
408 float chi2_L =0;
409
410 SafeDelete(eF1);
411 SafeDelete(eF1X);
412 SafeDelete(eF1Y);
413 SafeDelete(eG);
414 SafeDelete(eGX);
415 SafeDelete(eGY);
416
417 eF1X = MCSErrorFunction("eF1X",x0,dtx); eF1X->SetRange(0,Min(14,maxX));
418 eF1X->SetParameter(0,2000.); // starting value for momentum in GeV
419 eF1Y = MCSErrorFunction("eF1Y",x0,dty); eF1Y->SetRange(0,Min(14,maxY));
420 eF1Y->SetParameter(0,2000.); // starting value for momentum in GeV
421 eF1 = MCSErrorFunction("eF1",x0,dt); eF1->SetRange(0,Min(14,max3D));
422 eF1->SetParameter(0,2000.); // starting value for momentum in GeV
423
424 if (max3D>0)
425 {
426 eG=new TGraphErrors(vind3d,da,errvind3d,errda);
427 eG->Fit("eF1","QR");
428 eP=1./1000.*Abs(eF1->GetParameter(0));
429 eDP=1./1000.*eF1->GetParError(0);
430 if (eP>20||eP<0||eP==2) eP=-99;
431 EstimateMomentumError( eP, npl, tymean, ePmin, ePmax );
432 chi2_3D = eF1->GetChisquare()/eF1->GetNDF();
433 if (eVerbose) printf("P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] ; chi2_3D %6.2f\n", eP, ePmin, ePmax,chi2_3D);
434 }
435 if (maxX>0)
436 {
437 eGX=new TGraphErrors(vindx,dax,errvindx,errdax);
438 eGX->Fit("eF1X","QR");
439 ePx=1./1000.*Abs(eF1X->GetParameter(0));
440 eDPx=1./1000.*eF1X->GetParError(0);
441 if (ePx>20||ePx<0||ePx==2) ePx=-99;
442 EstimateMomentumError( ePx, npl, txmean, ePXmin, ePXmax );
443 chi2_L = eF1X->GetChisquare()/eF1X->GetNDF();
444 if (eVerbose) printf("PL=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] ; chi2_L %6.2f \n",ePx,ePXmin, ePXmax,chi2_L);
445 }
446 if (maxY>0)
447 {
448 eGY=new TGraphErrors(vindy,day,errvindy,errday);
449 eGY->Fit("eF1Y","QR");
450 ePy=1./1000.*Abs(eF1Y->GetParameter(0));
451 eDPy=1./1000.*eF1Y->GetParError(0);
452 if (ePy>20||ePy<0||ePy==2) ePy=-99;
453 EstimateMomentumError( ePy, npl, tmean, ePYmin, ePYmax );
454 chi2_T = eF1Y->GetChisquare()/eF1Y->GetNDF();
455 if (eVerbose) printf("PT=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] ; chi2_T %6.2f\n", ePy, ePYmin, ePYmax,chi2_T);
456 }
457
458 float ptrue=eP;
459 if (tmean>0.200&&chi2_T<chi2_3D)
460 {
461 ptrue = ePy;
462 if (eVerbose) printf(" For this track the evolution of the Transverse projection gives the most accurate estimate of the momentum %7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] ; chi2_T /DoF %6.2f\n", ePy, ePYmin, ePYmax,chi2_T);
463}
464
465 //-----------------------------TO TEST with MC studies------------------------------------
466 // float wx = 1./eDPx/eDPx;
467 // float wy = 1./eDPy/eDPy;
468 // float ptest = (ePx*wx + ePy*wy)/(wx+wy);
469 //----------------------------------------------------------------------------------------
470
471 return ptrue;
472}
double GetDTx(double Tx)
Definition: EdbMomentumEstimator.h:81
TF1 * MCSErrorFunction(const char *name, float x0, float dtx)
Definition: EdbMomentumEstimator.cxx:658
float eDPy
the fit error
Definition: EdbMomentumEstimator.h:37
float ePx
the fit results
Definition: EdbMomentumEstimator.h:36
double GetDTy(double Ty)
Definition: EdbMomentumEstimator.h:82
float ePy
the estimated momentum
Definition: EdbMomentumEstimator.h:36
float eDPx
Definition: EdbMomentumEstimator.h:37
void EstimateMomentumError(float P, int npl, float ang, float &pmin, float &pmax)
Definition: EdbMomentumEstimator.cxx:699
float eDP
Definition: EdbMomentumEstimator.h:43
double GetDTs(double Ts)
Definition: EdbMomentumEstimator.h:83
Int_t ID() const
Definition: EdbSegP.h:147
Float_t W() const
Definition: EdbSegP.h:151
Int_t Flag() const
Definition: EdbSegP.h:149
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:87
int FitTrackLine(EdbTrackP &tr)
Definition: EdbTrackFitter.cxx:520

◆ PMSang_base()

int EdbMomentumEstimator::PMSang_base ( EdbTrackP tr)

Version rewised by VT 13/05/2008

Momentum estimation by multiple scattering (Annecy algorithm Oct-2007)

Input: tr - can be modified by the function

calculate momentum in transverse and in longitudinal projections using the different measurements errors parametrisation return value: -99 - estimation impossible; 0 - fit is not successful; 1 - only one momentum component is fitted well 2 - both components are successfully fitted "base" is stay for the original version - to be tested in comparison to the "final" version

901{
915
916 int nseg = tr.N();
917 if(nseg<2) { Log(1,"PMSang_base","Warning! nseg<2 (%d)- impossible estimate momentum!",nseg); return -99;}
918 int npl = tr.Npl();
919 if(npl<nseg) { Log(1,"PMSang_base","Warning! npl<nseg (%d, %d) - use track.SetCounters() first",npl,nseg); return -99;}
920 int plmax = Max( tr.GetSegmentFirst()->PID(), tr.GetSegmentLast()->PID() ) + 1;
921 if(plmax<1||plmax>1000) { Log(1,"PMSang_base","Warning! plmax = %d - correct the segments PID's!",plmax); return -99;}
922 Log(3,"PMSang_base","estimate track with %d segments %d plates",tr.N(), tr.Npl());
923
924 float xmean,ymean,zmean,txmean,tymean,wmean;
925 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
926 EdbAffine2D aff;
927 aff.ShiftX(-xmean);
928 aff.ShiftY(-ymean);
929 aff.Rotate( -ATan2(tymean,txmean) ); // rotate track to get longitudinal as tx, transverse as ty angle
930 tr.Transform(aff);
931 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
932
933 int minentr = eMinEntr; // min number of entries in the cell to accept the cell for fitting
934 int stepmax = npl/minentr; // max step
935 int size = stepmax+1; // vectors size
936
937 TVectorF dax(size), day(size);
938 TArrayI nentr(size);
939
940 Log(3,"PMSang_base","stepmax = %d",stepmax);
941
942 EdbSegP *s1,*s2;
943 for(int ist=1; ist<=stepmax; ist++) // cycle by the step size
944 {
945 for(int i1=0; i1<nseg-1; i1++) // cycle by the first seg
946 {
947 s1 = tr.GetSegment(i1);
948 for(int i2=i1+1; i2<nseg; i2++) // cycle by the second seg
949 {
950 s2 = tr.GetSegment(i2);
951 int icell = Abs(s2->PID()-s1->PID());
952 if( icell == ist ) {
953 dax[icell-1] += ( (ATan(s2->TX())- ATan(s1->TX())) * (ATan(s2->TX())- ATan(s1->TX())) );
954 day[icell-1] += ( (ATan(s2->TY())- ATan(s1->TY())) * (ATan(s2->TY())- ATan(s1->TY())) );
955 nentr[icell-1] +=1;
956 }
957 }
958 }
959 }
960
961 float maxX =0; // maximum value for the function fit
962 TVector vind(size), errvind(size);
963 TVector errdax(size), errday(size);
964 int ist=0; // use the counter for case of missing cells
965 for(int i=0; i<size; i++)
966 {
967 if( nentr[i] >= minentr ) {
968 vind[ist] = i+1; // x-coord is defined as the number of cells
969 dax[ist] = Sqrt( dax[ist]/nentr[i] );
970 day[ist] = Sqrt( day[ist]/nentr[i] );
971 errvind[ist] = 0.25;
972 errdax[ist] = dax[ist]/CellWeight(npl,i+1);
973 errday[ist] = day[ist]/CellWeight(npl,i+1);
974 maxX = vind[ist];
975 ist++;
976 }
977 }
978
979 float dtx = GetDTx(txmean); // measurements errors parametrization, longtudinal
980 dtx*=dtx;
981 float dty = GetDTy(tymean); // measurements errors parametrization, transversal
982 dty*=dty;
983
984 float Zcorr = Sqrt(1+txmean*txmean+tymean*tymean);
985 float x0 = eX0/1000/Zcorr; // the effective rad length in [mm]
986
987 SafeDelete(eF1X);
988 SafeDelete(eF1Y);
989 SafeDelete(eGX);
990 SafeDelete(eGY);
991
992 const char *fitopt = "MQR"; //MQR
993
994 bool statFitPX = false, statFitPY = false;
995 float initP = 1., minP=0., maxP=100.; // starting value for momentum in GeV
996
997 eF1X = MCSErrorFunction_base("eF1X",x0,dtx); eF1X->SetRange(0,maxX);
998 eF1X->SetParameter(0, initP);
999 // eF1X->SetParameter(1, 0.002);
1000 eF1X->SetParLimits(0, minP, maxP);
1001 eGX=new TGraphErrors(vind,dax,errvind,errdax);
1002 eGX->Fit("eF1X",fitopt);
1003 ePx=eF1X->GetParameter(0);
1004 if( Abs(ePx-initP)<0.00001 ) {
1005 eF1X->SetParameter(0, 2*initP);
1006 eGX->Fit("eF1X",fitopt);
1007 ePx=eF1X->GetParameter(0);
1008 if( Abs(ePx - 2*initP)>0.00001 ) statFitPX=true;
1009 }
1010 else statFitPX=true;
1011
1012 if(statFitPX) eDPx=eF1X->GetParError(0);
1013 else { eDPx =-99; ePx = -99; }
1014
1015 eF1Y = MCSErrorFunction_base("eF1Y",x0,dty); eF1Y->SetRange(0,maxX);
1016 eF1Y->SetParameter(0,initP);
1017 eF1Y->SetParLimits(0, minP, maxP);
1018 eGY=new TGraphErrors(vind,day,errvind,errday);
1019 eGY->Fit("eF1Y",fitopt);
1020 ePy=eF1Y->GetParameter(0);
1021 if( Abs(ePy-initP)<0.00001 ) {
1022 eF1Y->SetParameter(0, 2*initP);
1023 eGY->Fit("eF1Y",fitopt);
1024 ePy=eF1Y->GetParameter(0);
1025 if( Abs(ePy - 2*initP)>0.00001 ) statFitPY=true;
1026 }
1027 else statFitPY=true;
1028 if(statFitPY) eDPy=eF1Y->GetParError(0);
1029 else { eDPy =-99; ePy = -99; }
1030
1031 EstimateMomentumError( ePx, npl, txmean, ePXmin, ePXmax );
1032 EstimateMomentumError( ePy, npl, tymean, ePYmin, ePYmax );
1033
1034 float wx = statFitPX? 1./eDPx/eDPx : 0;
1035 float wy = statFitPY? 1./eDPy/eDPy : 0;
1036 if(statFitPX||statFitPY) {
1037 eP = (ePx*wx + ePy*wy)/(wx+wy); // TODO: check on MC the biases of different estimations
1038 eDP = Sqrt(1./(wx+wy));
1039 } else {eP = -1; eDP=-1; }
1040
1041 if(gEDBDEBUGLEVEL>1)
1042 printf("id=%6d (%2d/%2d) px=%7.2f +-%5.2f (%6.2f : %6.2f) py=%7.2f +-%5.2f (%6.2f : %6.2f) pmean =%7.2f %d %d\n",
1043 tr.ID(),npl,nseg,ePx,eDPx,ePXmin, ePXmax,ePy,eDPy,ePYmin, ePYmax, eP, statFitPX, statFitPY);
1044
1045 return statFitPX+statFitPY;
1046}
Definition: EdbAffine.h:17
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void Rotate(float angle)
Definition: EdbAffine.cxx:354
TF1 * MCSErrorFunction_base(const char *name, float x0, float dtx)
Definition: EdbMomentumEstimator.cxx:1049
float CellWeight(int npl, int m)
Definition: EdbMomentumEstimator.cxx:644
gEDBDEBUGLEVEL
Definition: energy.C:7
Definition: TVectors.h:8

◆ PMSang_base_A()

int EdbMomentumEstimator::PMSang_base_A ( EdbTrackP tr)

Version revised by Andrea Russo 13/03/2009 based on PMSang_base() by VT

include asymmetrical errors in scattering VS ncell graphs, based on ChiSquare distribution

improved check on correctness of fit result, based on chisquare cut (FitProbability > 0.05)

1169{
1175
1176 int nseg = tr.N();
1177 if(nseg<2) { Log(1,"PMSang_base","Warning! nseg<2 (%d)- impossible estimate momentum!",nseg); return -99;}
1178 int npl = tr.Npl();
1179 if(npl<nseg) { Log(1,"PMSang_base","Warning! npl<nseg (%d, %d) - use track.SetCounters() first",npl,nseg); return -99;}
1180 int plmax = Max( tr.GetSegmentFirst()->PID(), tr.GetSegmentLast()->PID() ) + 1;
1181 if(plmax<1||plmax>1000) { Log(1,"PMSang_base","Warning! plmax = %d - correct the segments PID's!",plmax); return -99;}
1182 Log(3,"PMSang_base","estimate track with %d segments %d plates",tr.N(), tr.Npl());
1183
1184 float xmean,ymean,zmean,txmean,tymean,wmean;
1185 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
1186 EdbAffine2D aff;
1187 aff.ShiftX(-xmean);
1188 aff.ShiftY(-ymean);
1189 aff.Rotate( -ATan2(tymean,txmean) ); // rotate track to get longitudinal as tx, transverse as ty angle
1190 tr.Transform(aff);
1191 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
1192
1193 int minentr = eMinEntr; // min number of entries in the cell to accept the cell for fitting
1194 int stepmax = npl/minentr; // max step
1195 int size = stepmax+1; // vectors size
1196
1197 TVectorF dax(size), day(size);
1198 TArrayI nentr(size);
1199
1200 Log(3,"PMSang_base_A","stepmax = %d",stepmax);
1201
1202
1203 EdbSegP *s1,*s2;
1204 for(int ist=1; ist<=stepmax; ist++) // cycle by the step size
1205 {
1206 for(int i1=0; i1<nseg-1; i1++) // cycle by the first seg
1207 {
1208 s1 = tr.GetSegment(i1);
1209 for(int i2=i1+1; i2<nseg; i2++) // cycle by the second seg
1210 {
1211 s2 = tr.GetSegment(i2);
1212 int icell = Abs(s2->PID()-s1->PID());
1213 if( icell == ist ) {
1214 dax[icell-1] += ( (ATan(s2->TX())- ATan(s1->TX())) * (ATan(s2->TX())- ATan(s1->TX())) );
1215 day[icell-1] += ( (ATan(s2->TY())- ATan(s1->TY())) * (ATan(s2->TY())- ATan(s1->TY())) );
1216 nentr[icell-1] +=1;
1217 }
1218 }
1219 }
1220 }
1221
1222 float maxX =0; // maximum value for the function fit
1223 TVector vind(size), errvind(size);
1224
1225 TVector errdaxL(size), errdayL(size); // L stands for low, lower error bar
1226 TVector errdaxH(size), errdayH(size); // H stands for high, hogher error bar
1227 int ist=0; // use the counter for case of missing cells
1228 for(int i=0; i<size; i++)
1229 {
1230 if( nentr[i] >= minentr ) {
1231 float ndf = CellWeight(npl,i+1); // CellWeight is interpreted as the ndf in the determination of dax and day
1232
1233 vind[ist] = i+1; // x-coord is defined as the number of cells
1234 dax[ist] = Sqrt( dax[ist]/nentr[i] );
1235 day[ist] = Sqrt( day[ist]/nentr[i] );
1236
1237 errvind[ist] = 0.25;
1238
1239 //errdax[ist] = dax[ist]/CellWeight(npl,i+1);
1240 //errday[ist] = day[ist]/CellWeight(npl,i+1);
1241
1242 errdaxL[ist] = dax[ist] - dax[ist]/(Sqrt(TMath::ChisquareQuantile(0.84,ndf)/ndf));
1243 errdaxH[ist] = dax[ist]/(Sqrt(TMath::ChisquareQuantile(0.16,ndf)/ndf)) - dax[ist];
1244
1245 errdayL[ist] = day[ist] - day[ist]/(Sqrt(TMath::ChisquareQuantile(0.84,CellWeight(npl,i+1))/ndf));
1246 errdayH[ist] = day[ist]/(Sqrt(TMath::ChisquareQuantile(0.16,ndf)/ndf)) - day[ist];
1247
1248 maxX = vind[ist];
1249 ist++;
1250 }
1251 }
1252
1253 float dtx = GetDTx(txmean); // measurements errors parametrization
1254 dtx*=dtx;
1255 float dty = GetDTy(txmean); // measurements errors parametrization
1256 dty*=dty;
1257
1258 float Zcorr = Sqrt(1+txmean*txmean+tymean*tymean);
1259 float x0 = eX0/1000/Zcorr; // the effective rad length in [mm]
1260
1261 SafeDelete(eF1X);
1262 SafeDelete(eF1Y);
1263 SafeDelete(eGAX);
1264 SafeDelete(eGAY);
1265
1266 bool statFitPX = false, statFitPY = false;
1267 float initP = 1., minP=0., maxP=100.; // starting value for momentum in GeV
1268
1269 eF1X = MCSErrorFunction_base("eF1X",x0,dtx); eF1X->SetRange(0,maxX);
1270 eF1X->SetParameter(0, initP);
1271 eF1X->SetParameter(1, 0.003);
1272 eF1X->SetParLimits(0, minP, maxP);
1273
1274 eGAX=new TGraphAsymmErrors(vind,dax,errvind,errvind,errdaxL,errdaxH);
1275
1276 const char *fitopt = "MQR"; //MQR
1277 eGAX->Fit("eF1X",fitopt);
1278 ePx=eF1X->GetParameter(0);
1279
1280 /*
1281 if( Abs(ePx-initP)<0.00001 ) {
1282 eF1X->SetParameter(0, 2*initP);
1283 eGAX->Fit("eF1X",fitopt);
1284 ePx=eF1X->GetParameter(0);
1285 if( Abs(ePx - 2*initP)>0.00001 ) statFitPX=true;
1286 }
1287 else statFitPX=true;
1288 */
1289
1290 if(eF1X->GetChisquare() > TMath::ChisquareQuantile(0.05,eF1X->GetNDF())) //checking if fit procedure gives a reasonable result (i.e., p>0.05)
1291 statFitPX=false;
1292 else
1293 statFitPX=true;
1294
1295 //statFitPX=true;
1296
1297
1298 if(statFitPX) eDPx=eF1X->GetParError(0);
1299 else { eDPx =-99; ePx = -99; }
1300
1301 eF1Y = MCSErrorFunction_base("eF1Y",x0,dty); eF1Y->SetRange(0,maxX);
1302 eF1Y->SetParameter(0,initP);
1303 eF1Y->SetParLimits(0, minP, maxP);
1304
1305 eGAY=new TGraphAsymmErrors(vind,day,errvind,errvind,errdayL,errdayH);
1306
1307 eGAY->Fit("eF1Y", fitopt);
1308 ePy=eF1Y->GetParameter(0);
1309 /*
1310 if( Abs(ePy-initP)<0.00001 ) {
1311 eF1Y->SetParameter(0, 2*initP);
1312 eGAY->Fit("eF1Y",fitopt);
1313 ePy=eF1Y->GetParameter(0);
1314 if( Abs(ePy - 2*initP)>0.00001 ) statFitPY=true;
1315 }
1316 else statFitPY=true;
1317 */
1318
1319 if(eF1Y->GetChisquare()> TMath::ChisquareQuantile(0.05,eF1Y->GetNDF())) //checking if fit procedure gives a reasonable result (i.e., p>0.05)
1320 statFitPY=false;
1321 else
1322 statFitPY=true;
1323
1324 //statFitPY=true;
1325
1326 if(statFitPY) eDPy=eF1Y->GetParError(0);
1327 else { eDPy =-99; ePy = -99; }
1328
1329 EstimateMomentumError( ePx, npl, txmean, ePXmin, ePXmax );
1330 EstimateMomentumError( ePy, npl, tymean, ePYmin, ePYmax );
1331
1332 float wx = statFitPX? 1./eDPx/eDPx : 0;
1333 float wy = statFitPY? 1./eDPy/eDPy : 0;
1334 if(statFitPX||statFitPY) {
1335 eP = (ePx*wx + ePy*wy)/(wx+wy); // TODO: check on MC the biases of different estimations
1336 eDP = Sqrt(1./(wx+wy));
1337 } else {eP = -1; eDP=-1; }
1338
1339 if(gEDBDEBUGLEVEL>1)
1340 printf("id=%6d (%2d/%2d) px=%7.2f +-%5.2f (%6.2f : %6.2f) py=%7.2f +-%5.2f (%6.2f : %6.2f) pmean =%7.2f %d %d\n",
1341 tr.ID(),npl,nseg,ePx,eDPx,ePXmin, ePXmax,ePy,eDPy,ePYmin, ePYmax, eP, statFitPX, statFitPY);
1342
1343
1344 return statFitPX+statFitPY;
1345}

◆ PMSang_corr()

float EdbMomentumEstimator::PMSang_corr ( EdbTrackP tr)

! !Corrections by ASh! Version rewised by VT 13/05/2008 (see PMSang_base) and further modified by Magali at the end of 2008 Momentum estimation by multiple scattering (Annecy implementation Oct-2007)

Input: tr - can be modified by the function

calculate momentum in transverse and in longitudinal projections using the different measurements errors parametrisation

159{
168
169 int nseg = tr.N();
170 int npl=tr.Npl();
171 if(nseg<2) { Log(1,"PMSang","Warning! nseg<2 (%d)- impossible estimate momentum!",nseg); return -99;}
172 if(npl<nseg) { Log(1,"PMSang","Warning! npl<nseg (%d, %d) - use track.SetCounters() first",npl,nseg); return -99;}
173 int plmax = Max( tr.GetSegmentFirst()->PID(), tr.GetSegmentLast()->PID() ) + 1;
174 if(plmax<1||plmax>1000) { Log(1,"PMSang","Warning! plmax = %d - correct the segments PID's!",plmax); return -99;}
175
176 float xmean0,ymean0,zmean0,txmean0,tymean0,wmean0;
177 FitTrackLine(tr,xmean0,ymean0,zmean0,txmean0,tymean0,wmean0); // calculate mean track parameters
178 float tmean=Sqrt(txmean0*txmean0+ tymean0*tymean0);
179
180 // -- start calcul --
181 const int size = npl; // vectors size
182
183 TVectorF da(size);
184 TArrayI nentr(size);
185
186 EdbSegP *s1,*s2;
187 for(int i1=0; i1<nseg-1; i1++){
188 s1 = tr.GetSegment(i1);
189 if(!s1) continue;
190
191 for(int i2=i1+1; i2<nseg; i2++){
192 s2 = tr.GetSegment(i2);
193 if(!s2) continue;
194 int icell = Abs(s2->PID()-s1->PID());
195 da[icell-1] += CalcTheta(*s1,*s2);
196 nentr[icell-1] +=1;
197 }
198 }
199
200 float Zcorr = Sqrt(1+tmean*tmean); // correction due to non-zero track angle and crossed lead thickness
201
202 int max3D=0; // maximum value for the function fit
203 TVectorF vind3d(size), errvind3d(size);
204 TVectorF errda(size);
205 int ist=0; // use the counter for case of missing cells
206 for(int i=0; i<size; i++)
207 {
208 if( nentr[i] >= eMinEntr/2 && Abs(da[i])<0.1 )
209 {
210 vind3d[ist] = i+1; // x-coord is defined as the number of cells
211 errvind3d[ist] = .25;
212 da[ist] = Sqrt( da[i]/(2*nentr[i]) );
213 errda[ist] = da[ist]/Sqrt(4*nentr[i]);//CellWeight(npl,i+1));
214 ist++;
215 max3D=i+1;
216 }
217 }
218
219 float dt = GetDTs(tmean);
220 dt*=dt;
221
222 float x0 = eX0/(1000*Zcorr);
223 float chi2_3D =0;
224
225 SafeDelete(eF1);
226 SafeDelete(eG);
227
228 eF1 = MCSErrorFunction("eF1",x0,dt); eF1->SetRange(0,Min(14,max3D));
229 eF1->SetParameter(0,2000.); // starting value for momentum in GeV
230
231 if (max3D>0)
232 {
233 eG=new TGraphErrors(vind3d,da,errvind3d,errda);
234 if(eG->Fit("eF1","QR")!=0)return -99;
235 eP= 0.001*Abs(eF1->GetParameter(0));
236 eDP=0.001*eF1->GetParError(0);
237 EstimateMomentumError( eP, npl, tmean, ePmin, ePmax );
238 chi2_3D = eF1->GetChisquare()/eF1->GetNDF();
239 if (eVerbose) printf("P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] ; chi2_3D %6.2f\n", eP, ePmin, ePmax,chi2_3D);
240 }
241 return eP;
242 // if(eP>50 || eP==2)eP=-99;
243
244 // float ptrue=eP;
245
246 //-----------------------------TO TEST with MC studies------------------------------------
247 // float wx = 1./eDPx/eDPx;
248 // float wy = 1./eDPy/eDPy;
249 // float ptest = (ePx*wx + ePy*wy)/(wx+wy);
250 //----------------------------------------------------------------------------------------
251
252 // return ptrue;
253}
double CalcTheta(const EdbSegP &s1, const EdbSegP &s2)
Definition: EdbMomentumEstimator.cxx:149

◆ PMScoordinate()

float EdbMomentumEstimator::PMScoordinate ( EdbTrackP tr)

Momentum estimation by coordinate method

April 2010

478{
482
483 int nseg = tr.N();
484 int npl = tr.Npl();
485
486
487 //float xmean,ymean,zmean,txmean,tymean,wmean;
488 float xmean0,ymean0,zmean0,txmean0,tymean0,wmean0;
489 FitTrackLine(tr,xmean0,ymean0,zmean0,txmean0,tymean0,wmean0); // calculate mean track parameters
490 float tmean=Sqrt(txmean0*txmean0+ tymean0*tymean0);
491
492 float ang = 0.;
493
494 /*
495 for (int i =0;i<tr.N();i++)
496 {
497 aas=tr.GetSegment(i);
498 float slx=aas->TY()*cos(-PHI)-aas->TX()*sin(-PHI);
499 float sly=aas->TX()*cos(-PHI)+ aas->TY()*sin(-PHI);
500 aas->Set(aas->ID(),aas->X(),aas->Y(),slx,sly,aas->W(),aas->Flag());
501 }
502
503 FitTrackLine(tr,xmean,ymean,zmean,txmean,tymean,wmean); // calculate mean track parameters
504 */
505
506
507
508 //int minentr = eMinEntr; // min number of entries in the cell, should not be set smaller than 5
509 int nr1,nr2;
510
511 float dx1,dx2,dy1,dy2,DX1,DY1,DX2,DY2,appx,appy;
512
513 TVectorF da(npl), dax(npl), day(npl);
514 TArrayI nentr(npl);
515
516 for(int i=0;i<npl;i++)
517 {
518 da[i] = 0;
519 dax[i] = 0;
520 day[i] = 0;
521 nentr[i] = 0;
522 }
523
524 EdbSegP *s1=0,*s2=0,*s3=0;
525
526
527 for(int i =0;i<=nseg-3;i++) // cycle by the first seg
528 {
529 s1 = tr.GetSegment(i);
530 for(int j =i+1;j<=nseg-2;j++) // cycle by the second seg
531 {
532 s2 = tr.GetSegment(j);
533 for(int k =j+1;k<=nseg-1;k++) // cycle by the third seg
534 {
535 s3 = tr.GetSegment(k);
536
537 nr1 = TMath::Abs(s1->PID()-s2->PID());
538 nr2 = TMath::Abs(s2->PID()-s3->PID());
539 if(nr1!=nr2) continue; // continue if (s1,s2) and (s2,s3) correspond to different cells
540
541 dx1 = s2->X()-s1->X();
542 dx2 = s3->X()-s2->X();
543 dy1 = s2->Y()-s1->Y();
544 dy2 = s3->Y()-s2->Y();
545
546 ang = 0; // ang is the rotation angle to get trasverse and longitudinal coordinates; not yet implemented
547 DX1 = cos(ang)*dx1+sin(ang)*dy1;
548 DY1 = cos(ang)*dy1-sin(ang)*dx1;
549
550 DX2 = cos(ang)*dx2+sin(ang)*dy2;
551 DY2 = cos(ang)*dy2-sin(ang)*dx2;
552
553 appx = ( DX1 * ((s2->Z()-s3->Z())/(s1->Z()-s2->Z())) - DX2 ) * ( DX1 * ((s2->Z()-s3->Z())/(s1->Z()-s2->Z())) - DX2 );
554 appy = ( DY1 * ((s2->Z()-s3->Z())/(s1->Z()-s2->Z())) - DY2 ) * ( DY1 * ((s2->Z()-s3->Z())/(s1->Z()-s2->Z())) - DY2 );
555
556
557 dax[nr1] += appx;
558 day[nr1] += appy;
559 //da[nr1] += ( (((s2->X()-s1->X())*(s2->Z()-s3->Z())/(s1->Z()-s2->Z()))-(s3->X()-s2->X()))**2 + (((y[j]-y[i])*(z[j]-z[k])/(z[i]-z[j]))-(y[k]-y[j]))**2 ) /2. ;
560 da[nr1] += (appx + appy)/2.;
561 nentr[nr1] += 1;
562
563 }//end cycle 3rd seg
564
565 }//end cycle 2nd seg
566
567 }//end cycle 1st seg
568
569 bool IsEmpty=true;
570 for(int i=0;i<npl;i++)
571 {
572 if(nentr[i]>0)
573 {
574 IsEmpty=false;
575 dax[i] = sqrt(dax[i]/nentr[i]);
576 day[i] = sqrt(day[i]/nentr[i]);
577 da[i] = sqrt(da[i]/nentr[i]);
578 }
579 }
580
581 SafeDelete(eF1);
582 SafeDelete(eF1X);
583 SafeDelete(eF1Y);
584 SafeDelete(eG);
585 SafeDelete(eGX);
586 SafeDelete(eGY);
587
588 if(IsEmpty)return -99;
589 eG = new TGraphErrors();
590 eGX = new TGraphErrors();
591 eGY = new TGraphErrors();
592
593
594 int cont = 0;
595 for(int i=0;i<npl;i++)
596 {
597 if(nentr[i]>eMinEntr)
598 {
599 eGX->SetPoint(cont,i*1300,dax[i]);
600 eGX->SetPointError(cont,0,dax[i]/Sqrt(nentr[i]));
601 eGY->SetPoint(cont,i*1300,day[i]);
602 eGY->SetPointError(cont,0,day[i]/Sqrt(nentr[i]));
603 eG->SetPoint(cont,i*1300,da[i]);
604 eG->SetPointError(cont,0,da[i]/Sqrt(nentr[i]));
605 cont++;
606 }
607 }
608 if(cont==0)return -99;
609 eF1X = MCSCoordErrorFunction("eF1X",tmean,eX0);
610 eF1X->SetParLimits(0,0.0001,100);
611 eF1X->SetParLimits(1,0.0001,100);
612 eF1X->SetParameter(0,5); // starting value for momentum in GeV
613 eF1X->SetParameter(1,10); // starting value for coordinate error
614
615 eF1Y = MCSCoordErrorFunction("eF1Y",tmean,eX0);
616 //eF1Y->SetRange(0,Min(57,maxY));
617 eF1Y->SetParLimits(0,0.0001,100);
618 eF1Y->SetParLimits(1,0.0001,100);
619 eF1Y->SetParameter(0,5); // starting value for momentum in GeV
620 eF1Y->SetParameter(1,10); // starting value for coordinate error
621
622 eF1 = MCSCoordErrorFunction("eF1",tmean,eX0);
623 //eF1->SetRange(0,Min(57,max3D));
624 eF1->SetParLimits(0,0.0,100);
625 eF1->SetParLimits(1,0.0,100);
626 eF1->SetParameter(0,5); // starting value for momentum in GeV
627 eF1->SetParameter(1,10); // starting value for coordinate error
628
629 const char *fitopt = "MQ"; //MQR
630 eG ->Fit(eF1, fitopt);
631 eGX->Fit(eF1X,fitopt);
632 eGY->Fit(eF1Y,fitopt);
633
634
635 eP = 1./sqrt(eF1->GetParameter(0));
636 ePx = 1./sqrt(eF1X->GetParameter(0));
637 ePy = 1./sqrt(eF1Y->GetParameter(0));
638 return eP;
639}
TF1 * MCSCoordErrorFunction(const char *name, float tmean, float x0)
Definition: EdbMomentumEstimator.cxx:684

◆ Print()

void EdbMomentumEstimator::Print ( )
91{
92 printf("\nEdbMomentumEstimator:\n");
93 printf("Algorithm: %s\n", AlgStr(eAlg).Data());
94 printf("eX0 = %f \n", eX0);
95 printf("eDTxErrorFun parameters:");eDTxErrorFun.Print();
96 printf("eDTyErrorFun parameters:");eDTyErrorFun.Print();
97 printf("eDTsErrorFun parameters:");eDTsErrorFun.Print();
98}
TString AlgStr(int alg)
Definition: EdbMomentumEstimator.cxx:101
@ Data
Definition: tlg2couples.C:53

◆ Set0()

void EdbMomentumEstimator::Set0 ( )
64{
65 eStatus=-1;
66 ePx=ePy=-99;
67 eDPx=eDPy=-99;
69 eP=eDP=ePmin=ePmax = -99;
70}

◆ SetDTsErrorFunction()

void EdbMomentumEstimator::SetDTsErrorFunction ( TF1 &  f)
inline
FILE * f
Definition: RecDispMC.C:150

◆ SetDTxErrorFunction()

void EdbMomentumEstimator::SetDTxErrorFunction ( TF1 &  f)
inline

◆ SetDTyErrorFunction()

void EdbMomentumEstimator::SetDTyErrorFunction ( TF1 &  f)
inline

◆ SetParPMS_Mag() [1/2]

void EdbMomentumEstimator::SetParPMS_Mag ( )

set the default values for parameters used in PMS_Mag

74{
76 eX0 = 5600;
77
78 eDTsErrorFun.SetParameters(0.0021, 0.0054,0,0,0);
79 eDTxErrorFun.SetParameters(0.0021, 0.0093,0,0,0);
80 eDTyErrorFun.SetParameters(0.0021, 0.0 ,0,0,0);
81}

◆ SetParPMS_Mag() [2/2]

void EdbMomentumEstimator::SetParPMS_Mag ( Int_t  type,
Int_t  parNumber,
Double_t  parvalue 
)
84{
85 if (type==0) eDTxErrorFun.SetParameter(parNumber,parvalue);
86 if (type==1) eDTyErrorFun.SetParameter(parNumber,parvalue);
87 if (type==2) eDTsErrorFun.SetParameter(parNumber,parvalue);
88}
Int_t type
Definition: testBGReduction_By_ANN.C:15

Member Data Documentation

◆ eAlg

int EdbMomentumEstimator::eAlg

select the algorithm for PMS estimation

◆ eDP

float EdbMomentumEstimator::eDP

◆ eDPx

float EdbMomentumEstimator::eDPx

◆ eDPy

float EdbMomentumEstimator::eDPy

the fit error

◆ eDTsErrorFun

TF1 EdbMomentumEstimator::eDTsErrorFun

◆ eDTxErrorFun

TF1 EdbMomentumEstimator::eDTxErrorFun

input parameters for PMS_mag

◆ eDTyErrorFun

TF1 EdbMomentumEstimator::eDTyErrorFun

◆ eF1

TF1* EdbMomentumEstimator::eF1

◆ eF1X

TF1* EdbMomentumEstimator::eF1X

fit function

◆ eF1Y

TF1* EdbMomentumEstimator::eF1Y

◆ eG

TGraphErrors* EdbMomentumEstimator::eG

3D component of the momentum

◆ eGA

TGraphAsymmErrors* EdbMomentumEstimator::eGA

3D component of the momentum

◆ eGAX

TGraphAsymmErrors* EdbMomentumEstimator::eGAX

longitudianl component of the momentum

◆ eGAY

TGraphAsymmErrors* EdbMomentumEstimator::eGAY

transverse component of the momentum

◆ eGX

TGraphErrors* EdbMomentumEstimator::eGX

longitudianl component of the momentum

◆ eGY

TGraphErrors* EdbMomentumEstimator::eGY

transverse component of the momentum

◆ eMinEntr

int EdbMomentumEstimator::eMinEntr

min number of entries in the cell to accept it for fitting (def=1)

◆ eP

float EdbMomentumEstimator::eP

the output of PMSang

◆ ePmax

float EdbMomentumEstimator::ePmax

momentum 90% errors range

◆ ePmin

float EdbMomentumEstimator::ePmin

◆ ePx

float EdbMomentumEstimator::ePx

the fit results

◆ ePXmax

float EdbMomentumEstimator::ePXmax

momentum 90% errors range

◆ ePXmin

float EdbMomentumEstimator::ePXmin

◆ ePy

float EdbMomentumEstimator::ePy

the estimated momentum

◆ ePYmax

float EdbMomentumEstimator::ePYmax

momentum 90% errors range

◆ ePYmin

float EdbMomentumEstimator::ePYmin

◆ eStatus

int EdbMomentumEstimator::eStatus

status of the estimation (-1 nothing was done)

◆ eTrack

EdbTrackP EdbMomentumEstimator::eTrack

the copy of the track to be used for plots

◆ eVerbose

bool EdbMomentumEstimator::eVerbose

The documentation for this class was generated from the following files: