Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DTrackFitter.h
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DTrackFitter.h
4 // Created: Mon Sep 1 10:30:04 EDT 2008
5 // Creator: davidl (on Darwin Amelia.local 8.11.1 i386)
6 //
7 
8 #ifndef _DTrackFitter_
9 #define _DTrackFitter_
10 
11 #include <JANA/JObject.h>
12 #include <JANA/JFactory.h>
13 #include <JANA/JEventLoop.h>
14 
15 #ifdef PROFILE_TRK_TIMES
16 #include <prof_time.h>
17 #endif
18 #include <DANA/DApplication.h>
19 #include <TRACKING/DTrackingData.h>
22 #include <CDC/DCDCTrackHit.h>
23 #include <FDC/DFDCPseudo.h>
25 
26 using namespace std;
27 
28 #define QuietNaN std::numeric_limits<double>::quiet_NaN()
29 
30 
32 class DGeometry;
33 
34 //////////////////////////////////////////////////////////////////////////////////
35 /// The DTrackFitter class is a base class for different charged track
36 /// fitting algorithms. It does not actually fit the track itself, but
37 /// provides the interface and some common support features most algorthims
38 /// will need to implement.
39 ///
40 /// The reason this is needed (instead of just using the mechanism already
41 /// built into JANA) is due to the nature of charged track fitting.
42 /// Specifically, tracks are usually fit first to the wire positions
43 /// and then to the drift times. The algorithm for both is (at least
44 /// usually) the same. However, we want to separate the wire-based and
45 /// time-based fitting into 2 distinct stages allowing easy access to the
46 /// wire-based fits.
47 ///
48 /// There were a few options on how to handle this within the JANA framework
49 /// but it was decided passing DTrackFitter objects through the framework
50 /// was the best way to address it. Sub-classes of DTrackFitter will
51 /// implement the actual algorithms, but JANA will only see these
52 /// objects as pointers to the DTrackFitter base class. Only one
53 /// DTrackFitterXXX object will exist for each thread (i.e. each JEventLoop).
54 /// As such, the state of that object will likely be overwritten
55 /// many times in a single event and it's internal data never used
56 /// by anything outside of the TRACKING package. Also, the factories that
57 /// produce the DTrackFitterXXX objects will make them as persistent
58 /// and will turn off the the WRITE_TO_OUTPUT bit by default.
59 //////////////////////////////////////////////////////////////////////////////////
60 
61 class DTrackFitter:public jana::JObject{
62  public:
63  JOBJECT_PUBLIC(DTrackFitter);
64 
65  enum fit_type_t{
67  kTimeBased
68  };
69 
74  kFitNoImprovement
75  };
76 
77  class dedx_t{
78  public:
79  dedx_t(double dE,double dx, double p):dE(dE),dx(dx),p(p){}
80  double dE; // energy loss in layer
81  double dx; // path length in layer
82  double p; // momentum at this dE/dx measurement
83 
84  };
86  public:
87  Extrapolation_t(DVector3 position,DVector3 momentum,
88  double t,double s,double s_theta_ms_sum=0.,
89  double theta2ms_sum=0.):
90  position(position),momentum(momentum),t(t),s(s),s_theta_ms_sum(s_theta_ms_sum),theta2ms_sum(theta2ms_sum){}
93  double t;
94  double s;
96  double theta2ms_sum;
97  };
98 
99 
100  class pull_t{
101  public:
102  pull_t(double resi, double err,double s=0.0,
103  double tdrift=0.0, double d=0.0,
104  const DCDCTrackHit *cdc_hit=NULL,
105  const DFDCPseudo *fdc_hit=NULL, double docaphi=0.0,
106  double z=0.0, double cosThetaRel=0.0,double tcorr=0.0,double resic=0.0,
107  double errc=0.0):resi(resi),err(err),s(s),tdrift(tdrift),d(d),cdc_hit(cdc_hit),fdc_hit(fdc_hit),docaphi(docaphi),z(z),cosThetaRel(cosThetaRel),tcorr(tcorr),resic(resic),errc(errc){}
108  double resi; // residual of measurement
109  double err; // estimated error of measurement
110  double s;
111  double tdrift; // drift time of this measurement
112  double d; // doca to wire
115  double docaphi; // phi of doca in CDC straws
116  double z;// z position at doca
117  double cosThetaRel; // dot product between track and wire directions
118  double tcorr; // drift time with correction for B
119  double resic; // residual for FDC cathode measuremtns
120  double errc;
121  vector<double> trackDerivatives;
122  inline void AddTrackDerivatives(vector<double> d){ trackDerivatives = d;}
123 
124  };
125 
126  // Constructor and destructor
127  DTrackFitter(JEventLoop *loop); // require JEventLoop in constructor
128  virtual ~DTrackFitter();
129 
130  void Reset(void);
131 
132  // Hit accessor methods
133  void AddHit(const DCDCTrackHit* cdchit);
134  void AddHits(vector<const DCDCTrackHit*> cdchits);
135  void AddHit(const DFDCPseudo* fdchit);
136  void AddHits(vector<const DFDCPseudo*> fdchits);
137  const vector<const DCDCTrackHit*>& GetCDCInputHits(void) const {return cdchits;}
138  const vector<const DFDCPseudo*>& GetFDCInputHits(void) const {return fdchits;}
139  const vector<const DCDCTrackHit*>& GetCDCFitHits(void) const {return cdchits_used_in_fit;}
140  const vector<const DFDCPseudo*>& GetFDCFitHits(void) const {return fdchits_used_in_fit;}
142  extrapolations[SYS_TOF].clear();
143  extrapolations[SYS_BCAL].clear();
144  extrapolations[SYS_FCAL].clear();
145  extrapolations[SYS_FDC].clear();
146  extrapolations[SYS_CDC].clear();
147  extrapolations[SYS_START].clear();
148  extrapolations[SYS_DIRC].clear();
149  };
150 
151  // Fit parameter accessor methods
152  const DKinematicData& GetInputParameters(void) const {return input_params;}
153  const DTrackingData& GetFitParameters(void) const {return fit_params;}
154  double GetChisq(void) const {return chisq;}
155  int GetNdof(void) const {return Ndof;}
156  unsigned int GetNumPotentialFDCHits(void) const {return potential_fdc_hits_on_track;}
157  unsigned int GetNumPotentialCDCHits(void) const {return potential_cdc_hits_on_track;}
158  //virtual unsigned int GetRatioMeasuredPotentialFDCHits(void) const =0;
159  //virtual unsigned int GetRatioMeasuredPotentialCDCHits(void) const =0;
160  bool GetIsSmoothed(void) const {return IsSmoothed;}
161 
162  vector<pull_t>& GetPulls(void){return pulls;}
163  const map<DetectorSystem_t,vector<Extrapolation_t> >&GetExtrapolations(void) const{
164  return extrapolations;
165  }
166 
167  fit_type_t GetFitType(void) const {return fit_type;}
168  const DMagneticFieldMap* GetDMagneticFieldMap(void) const {return bfield;}
169 
170  void SetFitType(fit_type_t type){fit_type=type;}
171  void SetInputParameters(const DTrackingData &starting_params){input_params=starting_params;}
172 
173  // Wrappers
174  fit_status_t FitTrack(const DVector3 &pos, const DVector3 &mom, double q, double mass,double t0=QuietNaN,DetectorSystem_t t0_det=SYS_NULL);
175  fit_status_t FitTrack(const DTrackingData &starting_params);
176 
177  // Methods that actually do something
178  fit_status_t
179  FindHitsAndFitTrack(const DKinematicData &starting_params,
180  const DReferenceTrajectory *rt,
181  JEventLoop *loop, double mass=-1.0,
182  int N=0,
183  double t0=QuietNaN,
185  ); ///< mass<0 means get it from starting_params
186  fit_status_t
187  FindHitsAndFitTrack(const DKinematicData &starting_params,
188  const map<DetectorSystem_t,vector<DTrackFitter::Extrapolation_t> >&extrapolations,
189  JEventLoop *loop,
190  double mass,int N,double t0,
191  DetectorSystem_t t0_det);
192 
193  jerror_t CorrectForELoss(const DKinematicData &starting_params, DReferenceTrajectory *rt, DVector3 &pos, DVector3 &mom, double mass);
194  double CalcDensityEffect(double p,double mass,double density,
195  double Z_over_A,double I);
196  double CalcDensityEffect(double p,double mass,
197  double rho_Z_over_A,double LnI);
198  double CalcDensityEffect(double betagamma,
199  double rho_Z_over_A,double LnI);
200 #ifdef PROFILE_TRK_TIMES
201  void GetProfilingTimes(std::map<std::string, prof_time::time_diffs> &my_prof_times) const;
202 #endif
203  bool ExtrapolateToRadius(double R,
204  const vector<Extrapolation_t>&extraps,
205  DVector3 &pos,DVector3 &mom,double &t,
206  double &s) const;
207  bool ExtrapolateToRadius(double R,
208  const vector<Extrapolation_t>&extraps,
209  DVector3 &pos) const;
210  double DistToWire(const DCoordinateSystem *wire,
211  const vector<Extrapolation_t>&extrapolations,
212  DVector3 *pos=NULL,DVector3 *mom=NULL,
213  DVector3 *position_along_wire=NULL) const;
214 
215  //---- The following need to be supplied by the subclass ----
216  virtual string Name(void) const =0;
217  virtual fit_status_t FitTrack(void)=0;
218  virtual double ChiSq(fit_type_t fit_type, DReferenceTrajectory *rt, double *chisq_ptr=NULL, int *dof_ptr=NULL, vector<pull_t> *pulls_ptr=NULL)=0;
219 
220  protected:
221 
222 
223  // The following should be used as inputs by FitTrack(void)
224  vector<const DCDCTrackHit*> cdchits; //< Hits in the CDC
225  vector<const DFDCPseudo*> fdchits; //< Hits in the FDC
226  DTrackingData input_params; //< Starting parameters for the fit
227  fit_type_t fit_type; //< kWireBased or kTimeBased
228  const DMagneticFieldMap *bfield; //< Magnetic field map for current event (acquired through loop)
229  const DGeometry *geom; //< DGeometry pointer used to access materials through calibDB maps for eloss
230  const DRootGeom *RootGeom; //< ROOT geometry used for accessing material for MULS, energy loss
231  JEventLoop *loop; //< Pointer to JEventLoop object handling the current event
232 
233  // The following should be set as outputs by FitTrack(void)
234  DTrackingData fit_params; //< Results of last fit
235  double chisq; //< Chi-sq of final track fit (not the chisq/dof!)
236  int Ndof; //< Number of degrees of freedom for final track
237  vector<pull_t> pulls; //< pull_t objects for each contribution to chisq (assuming no correlations)
238  map<DetectorSystem_t,vector<Extrapolation_t> > extrapolations;
239 
240  fit_status_t fit_status; //< Status of values in fit_params (kFitSuccess, kFitFailed, ...)
241  vector<const DCDCTrackHit*> cdchits_used_in_fit; //< The CDC hits actually used in the fit
242  vector<const DFDCPseudo*> fdchits_used_in_fit; //< The FDC hits actually used in the fit
243 
244  bool IsSmoothed; //< Indicates if the smoother routine finished successfully
245 
248 
249 
251 
252  private:
255 
256  // Prohibit default constructor
257  DTrackFitter();
258 
259  // gas material properties
260  double mKRhoZoverAGas,mRhoZoverAGas,mLnIGas;
261 
262 };
263 
264 #endif // _DTrackFitter_
265 
int GetNdof(void) const
Definition: DTrackFitter.h:155
vector< pull_t > pulls
Definition: DTrackFitter.h:237
#define QuietNaN
Definition: DTrackFitter.h:28
vector< pull_t > & GetPulls(void)
Definition: DTrackFitter.h:162
dedx_t(double dE, double dx, double p)
Definition: DTrackFitter.h:79
The DTrackFitter class is a base class for different charged track fitting algorithms. It does not actually fit the track itself, but provides the interface and some common support features most algorthims will need to implement.
Definition: DTrackFitter.h:61
TVector3 DVector3
Definition: DVector3.h:14
void ClearExtrapolations(void)
Definition: DTrackFitter.h:141
Definition: GlueX.h:16
fit_type_t fit_type
Definition: DTrackFitter.h:227
const DRootGeom * RootGeom
Definition: DTrackFitter.h:230
bool GetIsSmoothed(void) const
Definition: DTrackFitter.h:160
DetectorSystem_t
Definition: GlueX.h:15
class DFDCPseudo: definition for a reconstructed point in the FDC
Definition: DFDCPseudo.h:74
map< DetectorSystem_t, vector< Extrapolation_t > > extrapolations
Definition: DTrackFitter.h:238
vector< const DFDCPseudo * > fdchits_used_in_fit
Definition: DTrackFitter.h:242
void SetInputParameters(const DTrackingData &starting_params)
Definition: DTrackFitter.h:171
unsigned int potential_cdc_hits_on_track
Definition: DTrackFitter.h:247
const DFDCPseudo * fdc_hit
Definition: DTrackFitter.h:114
Definition: GlueX.h:17
Definition: GlueX.h:19
const vector< const DFDCPseudo * > & GetFDCInputHits(void) const
Definition: DTrackFitter.h:138
const DMagneticFieldMap * bfield
Definition: DTrackFitter.h:228
pull_t(double resi, double err, double s=0.0, double tdrift=0.0, double d=0.0, const DCDCTrackHit *cdc_hit=NULL, const DFDCPseudo *fdc_hit=NULL, double docaphi=0.0, double z=0.0, double cosThetaRel=0.0, double tcorr=0.0, double resic=0.0, double errc=0.0)
Definition: DTrackFitter.h:102
vector< const DCDCTrackHit * > cdchits
Definition: DTrackFitter.h:224
const map< DetectorSystem_t, vector< Extrapolation_t > > & GetExtrapolations(void) const
Definition: DTrackFitter.h:163
const DGeometry * geom
Definition: DTrackFitter.h:229
double GetChisq(void) const
Definition: DTrackFitter.h:154
Definition: GlueX.h:20
bool CORRECT_FOR_ELOSS
Definition: DTrackFitter.h:250
Definition: GlueX.h:18
double mRhoZoverAGas
Definition: DTrackFitter.h:260
fit_status_t fit_status
Definition: DTrackFitter.h:240
void SetFitType(fit_type_t type)
Definition: DTrackFitter.h:170
const DCDCTrackHit * cdc_hit
Definition: DTrackFitter.h:113
Definition: GlueX.h:22
vector< double > trackDerivatives
Definition: DTrackFitter.h:121
Definition: GlueX.h:26
vector< const DCDCTrackHit * > cdchits_used_in_fit
Definition: DTrackFitter.h:241
const vector< const DCDCTrackHit * > & GetCDCInputHits(void) const
Definition: DTrackFitter.h:137
const vector< const DCDCTrackHit * > & GetCDCFitHits(void) const
Definition: DTrackFitter.h:139
unsigned int GetNumPotentialCDCHits(void) const
Definition: DTrackFitter.h:157
void cdc_hit(Int_t &, Int_t &, Int_t &, Int_t[], Int_t, Int_t, Int_t, Int_t, Int_t, Int_t)
Definition: fa125fns.h:55
const vector< const DFDCPseudo * > & GetFDCFitHits(void) const
Definition: DTrackFitter.h:140
vector< const DFDCPseudo * > fdchits
Definition: DTrackFitter.h:225
void AddTrackDerivatives(vector< double > d)
Definition: DTrackFitter.h:122
JEventLoop * loop
Definition: DTrackFitter.h:231
DTrackingData input_params
Definition: DTrackFitter.h:226
string MATERIAL_MAP_MODEL
Definition: DTrackFitter.h:254
fit_type_t GetFitType(void) const
Definition: DTrackFitter.h:167
const DMagneticFieldMap * GetDMagneticFieldMap(void) const
Definition: DTrackFitter.h:168
const DKinematicData & GetInputParameters(void) const
Definition: DTrackFitter.h:152
DTrackingData fit_params
Definition: DTrackFitter.h:234
Extrapolation_t(DVector3 position, DVector3 momentum, double t, double s, double s_theta_ms_sum=0., double theta2ms_sum=0.)
Definition: DTrackFitter.h:87
unsigned int potential_fdc_hits_on_track
Definition: DTrackFitter.h:246
unsigned int GetNumPotentialFDCHits(void) const
Definition: DTrackFitter.h:156
#define I(x, y, z)
const DTrackingData & GetFitParameters(void) const
Definition: DTrackFitter.h:153