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 ()
 transverse component of the momentum More...
 
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 Fit3Pos (EdbTrackP &tr)
 
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
 
float eDP
 
float eDPx
 
float eDPy
 
TF1 eDTsErrorFun
 
TF1 eDTxErrorFun
 
TF1 eDTyErrorFun
 
TF1 * eF1
 
TF1 * eF1X
 
TF1 * eF1Y
 fit function More...
 
TGraphErrors * eG
 
TGraphAsymmErrors * eGA
 transverse component of the momentum More...
 
TGraphAsymmErrors * eGAX
 3D component of the momentum More...
 
TGraphAsymmErrors * eGAY
 longitudianl component of the momentum More...
 
TGraphErrors * eGX
 3D component of the momentum More...
 
TGraphErrors * eGY
 longitudianl component of the momentum More...
 
int eMinEntr
 
float eP
 
float ePmax
 
float ePmin
 
float ePx
 
float ePXmax
 
float ePXmin
 
float ePy
 
float ePYmax
 
float ePYmin
 
int eStatus
 
EdbTrackP eTrack
 
bool eVerbose
 
- Public Attributes inherited from EdbTrackFitter
bool eDE_correction
 
float eM
 
float ePcut
 
float ePdef
 
float eTPb
 
float eX0
 

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 ( )

transverse component of the momentum

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");
48  SetParPMS_Mag();
49 }
bool eVerbose
Definition: EdbMomentumEstimator.h:47
TGraphAsymmErrors * eGAX
3D component of the momentum
Definition: EdbMomentumEstimator.h:56
int eAlg
Definition: EdbMomentumEstimator.h:24
TGraphAsymmErrors * eGAY
longitudianl component of the momentum
Definition: EdbMomentumEstimator.h:57
TF1 * eF1Y
fit function
Definition: EdbMomentumEstimator.h:49
void SetParPMS_Mag()
Definition: EdbMomentumEstimator.cxx:73
TGraphErrors * eG
Definition: EdbMomentumEstimator.h:51
int eMinEntr
Definition: EdbMomentumEstimator.h:27
TF1 eDTxErrorFun
Definition: EdbMomentumEstimator.h:30
TGraphAsymmErrors * eGA
transverse component of the momentum
Definition: EdbMomentumEstimator.h:55
TGraphErrors * eGY
longitudianl component of the momentum
Definition: EdbMomentumEstimator.h:53
TF1 eDTyErrorFun
Definition: EdbMomentumEstimator.h:31
TF1 * eF1X
Definition: EdbMomentumEstimator.h:48
TF1 eDTsErrorFun
Definition: EdbMomentumEstimator.h:32
TGraphErrors * eGX
3D component of the momentum
Definition: EdbMomentumEstimator.h:52
TF1 * eF1
Definition: EdbMomentumEstimator.h:50

◆ ~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 }
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CellWeight()

float EdbMomentumEstimator::CellWeight ( int  npl,
int  m 
)
645 {
646  //--------------------------- TO BE IMPLEMENTED-----------------------------------------
647 
648  // npl - number of plates, m - the cell thickness in plates
649  // return the statistical weight of the cell
650 
651  //return Sqrt(npl/m); // the simpliest estimation no shift, no correlations
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)
725 {
726  // example of the plots available after PMSang
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
Definition: EdbMomentumEstimator.h:43
float ePXmin
Definition: EdbMomentumEstimator.h:38
float ePXmax
Definition: EdbMomentumEstimator.h:38
float ePmin
Definition: EdbMomentumEstimator.h:43
EdbTrackP eTrack
Definition: EdbMomentumEstimator.h:45
float ePYmax
Definition: EdbMomentumEstimator.h:39
float ePYmin
Definition: EdbMomentumEstimator.h:39
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
Float_t Y() const
Definition: EdbSegP.h:171
Int_t PID() const
Definition: EdbSegP.h:145
Float_t TY() const
Definition: EdbSegP.h:173
Int_t N() const
Definition: EdbPattern.h:182
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:200
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
struct @7 P

◆ GetDTs()

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

◆ GetDTx()

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

◆ GetDTy()

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

◆ Mat()

double EdbMomentumEstimator::Mat ( float  P,
int  npl,
float  ang 
)
712 {
713  // These parametrisations at low and large angles are parametrised with MC
714  // See Magali's thesis for more informations
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 
)
685 {
686  // return the function of the expected position deviation as function of range
687  //
688  // use the Highland-Lynch-Dahl formula for theta_rms_plane = 13.6 MeV/bcp*z*sqrt(x/x0) (PDG)
689  // so the expected measured position deviation is (1/sqrt(3))*theta_rms_plane + measurement error
690  // log term in HLD formula is neglected
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 
)
659 {
660  // dtx - the plane angle measurement error
661  // return the function of the expected angular deviation vs range
662  //
663  // 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)
664  // so the expected measured angle is sqrt( theta_rms_plane**2 + dtx**2)
665  //
666  // The constant term im the scattering formula is not 13.6 but 14.64, which
667  // is the right reevaluated number, due to a calculation with the moliere
668  // distribution. 13.6 is an approximation. See Geant3 or 4 references for more explanations.???????
669  //
670  // err(x) = sqrt(k*x*(1+0.038*log(x/x0))/p**2 + dtx)
671 
672  // float k = 14.64*14.64/x0;
673  // 14.64*14.64/1000/1000 = 0.0002143296 - we need p in GeV
674  // 13.6*13.6/1000/1000 = 0.0001849599 - we need p in GeV
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 
)
1050 {
1051  // dtx - the plane angle measurement error
1052  // return the function of the expected angular deviation vs range
1053  //
1054  // 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)
1055  // so the expected measured angle is sqrt( theta_rms_plane**2 + dtx**2)
1056  //
1057  // The constant term im the scattering formula is not 13.6 but 14.64, which
1058  // is the right reevaluated number, due to a calculation with the moliere
1059  // distribution. 13.6 is an approximation. See Geant3 or 4 references for more explanations.???????
1060  //
1061  // err(x) = sqrt(k*x*(1+0.038*log(x/x0))/p**2 + dtx)
1062 
1063  // float k = 14.64*14.64/x0;
1064  // 14.64*14.64/1000/1000 = 0.0002143296 - we need p in GeV
1065  // 13.6*13.6/1000/1000 = 0.0001849599 - we need p in GeV
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)
1073 {
1074  // momentum estimation by multiple scattering (first test version (VT))
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
EdbDisplay * ds
Definition: check_vertex.C:16
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:131
Definition: EdbSegP.h:18
Float_t STX() const
Definition: EdbSegP.h:161
Float_t STY() const
Definition: EdbSegP.h:162
float eTPb
Definition: EdbTrackFitter.h:25
bool eDE_correction
Definition: EdbTrackFitter.h:27
float eX0
Definition: EdbTrackFitter.h:22
float eM
Definition: EdbTrackFitter.h:23
p
Definition: testBGReduction_AllMethods.C:8
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ PMS()

float EdbMomentumEstimator::PMS ( EdbTrackP tr)
122 {
123  // according to eAlg the algorithm will be selected to estimate the momentum
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
Definition: EdbMomentumEstimator.h:42
void Set0()
Definition: EdbMomentumEstimator.cxx:63
int eStatus
Definition: EdbMomentumEstimator.h:25
float PMScoordinate(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:477
int PMSang_base(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:900
void Clear()
Definition: EdbPattern.h:271
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:516

◆ PMSang()

float EdbMomentumEstimator::PMSang ( EdbTrackP tr)
256 {
257  // Version rewised by VT 13/05/2008 (see PMSang_base) and further modified by Magali at the end of 2008
258  //
259  // Momentum estimation by multiple scattering (Annecy implementation Oct-2007)
260  //
261  // Input: tr - can be modified by the function
262  //
263  // calculate momentum in transverse and in longitudinal projections using the different
264  // measurements errors parametrisation
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:80
TF1 * MCSErrorFunction(const char *name, float x0, float dtx)
Definition: EdbMomentumEstimator.cxx:658
float eDPy
Definition: EdbMomentumEstimator.h:36
float ePx
Definition: EdbMomentumEstimator.h:35
double GetDTy(double Ty)
Definition: EdbMomentumEstimator.h:81
float ePy
Definition: EdbMomentumEstimator.h:35
float eDPx
Definition: EdbMomentumEstimator.h:36
void EstimateMomentumError(float P, int npl, float ang, float &pmin, float &pmax)
Definition: EdbMomentumEstimator.cxx:699
float eDP
Definition: EdbMomentumEstimator.h:42
double GetDTs(double Ts)
Definition: EdbMomentumEstimator.h:82
Int_t ID() const
Definition: EdbSegP.h:144
Float_t W() const
Definition: EdbSegP.h:148
Int_t Flag() const
Definition: EdbSegP.h:146
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:86
int FitTrackLine(EdbTrackP &tr)
Definition: EdbTrackFitter.cxx:519

◆ PMSang_base()

int EdbMomentumEstimator::PMSang_base ( EdbTrackP tr)
901 {
902  // Version rewised by VT 13/05/2008
903  //
904  // Momentum estimation by multiple scattering (Annecy algorithm Oct-2007)
905  //
906  // Input: tr - can be modified by the function
907  //
908  // calculate momentum in transverse and in longitudinal projections using the different
909  // measurements errors parametrisation
910  // return value: -99 - estimation impossible;
911  // 0 - fit is not successful;
912  // 1 - only one momentum component is fitted well
913  // 2 - both components are successfully fitted
914  // "base" is stay for the original version - to be tested in comparison to the "final" version
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:383
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)
1169 {
1170  // Version revised by Andrea Russo 13/03/2009 based on PMSang_base() by VT
1171  //
1172  // include asymmetrical errors in scattering VS ncell graphs, based on ChiSquare distribution
1173  //
1174  // improved check on correctness of fit result, based on chisquare cut (FitProbability > 0.05)
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)
159 {
161  // Version rewised by VT 13/05/2008 (see PMSang_base) and further modified by Magali at the end of 2008
162  // Momentum estimation by multiple scattering (Annecy implementation Oct-2007)
163  //
164  // Input: tr - can be modified by the function
165  //
166  // calculate momentum in transverse and in longitudinal projections using the different
167  // measurements errors parametrisation
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)
478 {
479  // Momentum estimation by coordinate method
480  //
481  // April 2010
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: tlg2pattern.C:54

◆ 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
78 {eDTsErrorFun=f;};
FILE * f
Definition: RecDispMC.C:150

◆ SetDTxErrorFunction()

void EdbMomentumEstimator::SetDTxErrorFunction ( TF1 &  f)
inline
76 {eDTxErrorFun=f;}

◆ SetDTyErrorFunction()

void EdbMomentumEstimator::SetDTyErrorFunction ( TF1 &  f)
inline
77 {eDTyErrorFun=f;};

◆ SetParPMS_Mag() [1/2]

void EdbMomentumEstimator::SetParPMS_Mag ( )
74 {
75  // set the default values for parameters used in PMS_Mag
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

◆ eDP

float EdbMomentumEstimator::eDP

◆ eDPx

float EdbMomentumEstimator::eDPx

◆ eDPy

float EdbMomentumEstimator::eDPy

◆ eDTsErrorFun

TF1 EdbMomentumEstimator::eDTsErrorFun

◆ eDTxErrorFun

TF1 EdbMomentumEstimator::eDTxErrorFun

◆ eDTyErrorFun

TF1 EdbMomentumEstimator::eDTyErrorFun

◆ eF1

TF1* EdbMomentumEstimator::eF1

◆ eF1X

TF1* EdbMomentumEstimator::eF1X

◆ eF1Y

TF1* EdbMomentumEstimator::eF1Y

fit function

◆ eG

TGraphErrors* EdbMomentumEstimator::eG

◆ eGA

TGraphAsymmErrors* EdbMomentumEstimator::eGA

transverse component of the momentum

◆ eGAX

TGraphAsymmErrors* EdbMomentumEstimator::eGAX

3D component of the momentum

◆ eGAY

TGraphAsymmErrors* EdbMomentumEstimator::eGAY

longitudianl component of the momentum

◆ eGX

TGraphErrors* EdbMomentumEstimator::eGX

3D component of the momentum

◆ eGY

TGraphErrors* EdbMomentumEstimator::eGY

longitudianl component of the momentum

◆ eMinEntr

int EdbMomentumEstimator::eMinEntr

◆ eP

float EdbMomentumEstimator::eP

◆ ePmax

float EdbMomentumEstimator::ePmax

◆ ePmin

float EdbMomentumEstimator::ePmin

◆ ePx

float EdbMomentumEstimator::ePx

◆ ePXmax

float EdbMomentumEstimator::ePXmax

◆ ePXmin

float EdbMomentumEstimator::ePXmin

◆ ePy

float EdbMomentumEstimator::ePy

◆ ePYmax

float EdbMomentumEstimator::ePYmax

◆ ePYmin

float EdbMomentumEstimator::ePYmin

◆ eStatus

int EdbMomentumEstimator::eStatus

◆ eTrack

EdbTrackP EdbMomentumEstimator::eTrack

◆ eVerbose

bool EdbMomentumEstimator::eVerbose

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