CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
Reconstruction/KalFitAlg/KalFitAlg-00-15-08/KalFitAlg/KalFitAlg.h
Go to the documentation of this file.
1//------------------------------------------------------------------------
2// Description :
3// Main file of the module KalFit in charge of :
4// 1/ Refit of the Mdc tracks using Kalman filter
5// 2/ Backward filter (smoothing)
6// 3/ and also several mass hypothesis, Non unif mag field treatment...
7//
8//------------------------------------------------------------------------
9
10#ifndef _DEFINE_KALFITALG_H_
11#define _DEFINE_KALFITALG_H_
12#ifndef DBL_MAX
13#define DBL_MAX 9999
14#endif
15
16class KalFitTrack;
17class KalFitHitMdc;
18class KalFitHelixSeg;
19class Bfield;
20//class Helix;
21
22#include "GaudiKernel/Algorithm.h"
23#include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
24#include "MdcCalibFunSvc/MdcCalibFunSvc.h"
25#include "GaudiKernel/IMagneticFieldSvc.h"
26#include "MagneticField/MagneticFieldSvc.h"
27#include "KalFitAlg/KalFitWire.h"
28#include "KalFitAlg/KalFitHelixSeg.h"
29#include "KalFitAlg/KalFitCylinder.h"
30#include "KalFitAlg/KalFitLayer_Mdc.h"
31#include "KalFitAlg/KalFitSuper_Mdc.h"
32#include "KalFitAlg/KalFitMaterial.h"
33#include "KalFitAlg/KalFitGemHit.h"
34#include "MdcTables/MdcTables.h"
35#include "GaudiKernel/NTuple.h"
36#include "AIDA/IHistogram1D.h"
37#include "AIDA/IHistogramFactory.h"
38#include "GaudiKernel/IHistogramSvc.h"
39#include "MdcRecEvent/RecMdcKalTrack.h"
40#include "MdcRecEvent/RecMdcKalHelixSeg.h"
41#include "HepPDT/ParticleDataTable.hh"
42#include <vector>
43//added header files for 6.0.0
44#include "CLHEP/Matrix/Vector.h"
45#include "CLHEP/Matrix/Matrix.h"
46#include "CLHEP/Matrix/SymMatrix.h"
47#include "CLHEP/Vector/ThreeVector.h"
48#include "G4Material.hh"
49#include "G4Tubs.hh"
50#include "CgemGeomSvc/ICgemGeomSvc.h"
51#include "CgemGeomSvc/CgemGeomSvc.h"
52
53#ifndef ENABLE_BACKWARDS_COMPATIBILITY
54typedef HepGeom::Point3D <double > HepPoint3D;
55#endif
56
57using namespace std;
58using namespace CLHEP;
59
60
61class KalFitAlg : public Algorithm {
62
63 public:
64 /**@name Main member functions*/
65 //@{
66 /// constructor
67 KalFitAlg(const std::string& name, ISvcLocator* pSvcLocator);
68 /// destructor
70 /// initialize
71 StatusCode initialize();
72 /// event function
73 StatusCode execute();
74 StatusCode finalize();
75 StatusCode beginRun();
76 /// hist definition
77 void hist_def ( void );
78 /// delete C++ objects, necessary to clean before begin_run or inside
79 /// destructor
80 void clean(void);
81 //@}
82 /**@name Set up the description of the Mdc */
83 //@{
84 /// Set up the wires, layers and superlayers...
85 void set_Mdc(void);
86 /// Initialize the material for Mdc
87 void setMaterial_Mdc(void);
88 /// Initialize the cylinders (walls and cathodes) for Mdc
89 void setCylinder_Mdc(void);
90 ///
91 void setDchisqCut(void);
92 /// initialize for the services
93 void setCalibSvc_init(void);
94 void setGeomSvc_init(void);
96 ///
97 void getEventStarTime(void);
98
99 /**@name Kalman filter method related member functions*/
100 //@{
101 /// Kalman filter (forward) in Mdc
102 void filter_fwd_anal(KalFitTrack& trk, int l_mass, int way, HepSymMatrix& Eakal);
103 void filter_fwd_calib(KalFitTrack& trk, int l_mass, int way, HepSymMatrix& Eakal);
104
105 void init_matrix(MdcRec_trk& trk, HepSymMatrix& Ea);
106 void init_matrix(int k, MdcRec_trk& trk, HepSymMatrix& Ea);
107
108 void start_seed(KalFitTrack& track, int lead_, int way, MdcRec_trk& trk);
109
110 /// Kalman filter (smoothing or backward part)
111 void smoother_anal(KalFitTrack& trk, int way);
112 void smoother_calib(KalFitTrack& trk, int way);
113
114 /// Take the inner walls (eloss and mult scat) into account
115 void innerwall(KalFitTrack& trk, int l_mass, int way);
116 void innerwall(KalFitTrack& trk, int l_mass, int way,int begin,int end);
117 void innerwall(KalFitTrack& track, int l_mass, int way, double r1, double r2, int& index);//add by Huang Zhen
118 //@{
119 /// with results got at the inner Mdc hit
120 void fillTds(MdcRec_trk& TrasanTRK, KalFitTrack& track,
121 RecMdcKalTrack* trk,int l_mass);
122 void fillTds_lead(MdcRec_trk& TrasanTRK, KalFitTrack& track,
123 RecMdcKalTrack* trk, int l_mass);
124 /// with results got at the outer Mdc hit
126 MdcRec_trk& TrasanTRK,int l_mass );
127
129 MdcRec_trk& TrasanTRK,int l_mass,RecMdcKalHelixSegCol* segcol);
130
131 ///for smoother process
133 MdcRec_trk& TrasanTRK,int l_mass,RecMdcKalHelixSegCol* segcol, int smoothflag);
134 /// with results got at (0,0,0)
135 void fillTds_ip(MdcRec_trk& TrasanTRK, KalFitTrack& track,
136 RecMdcKalTrack* trk, int l_mass);
137
138 /// complete the RecMdcKalTrackCol
139 void sameas(RecMdcKalTrack* trk, int l_mass, int imain);
140
141 void complete_track(MdcRec_trk& TrasanTRK,
142 MdcRec_trk_add& TrasanTRK_add,
143 KalFitTrack& track_lead,
144 RecMdcKalTrack* kaltrk,
145 RecMdcKalTrackCol* kalcol,RecMdcKalHelixSegCol* segcol,int flagsmooth);
146
147 void complete_track(MdcRec_trk& TrasanTRK,
148 MdcRec_trk_add& TrasanTRK_add,
149 KalFitTrack& track_lead,
150 RecMdcKalTrack* kaltrk,
152
153 // Careful refit
158
159 // clear tables by wangdy
160 void clearTables( );
161
162 ///
163 int getWallMdcNumber(const HepPoint3D& point);
164
165 ///
166 void extToAnyPoint(KalFitTrack& trk, const HepPoint3D& point);
167
168 ///
169 void setBesFromGdml(void);
170
171
172 // --- about GEM
174 void fromFHitToInnerWall(KalFitTrack& track, int way);
175 void fitGemHits(KalFitTrack& track, int hypo, int way);
176 KalFitTrack Cgem_filter_anal(KalFitTrack& track, int hypo, int way);//add by Huang Zhen
177 void residual(KalFitTrack& track);//add by Huang Zhen
178
179 /// this usage is used to control the usage of this algorithm ,to be
180 /// analysis or calibration.
181 int usage_;
182 ///
183 int choice_;
184 //// flag to calculate path length in each Mdc laye :
185 int pathl_;
186 /// flag to take account the wire sag into account
187 int wsag_;
188 /// flag to perform smoothing
189 int back_;
190
191 int eventno;
192
193 int Tds_back_no;
194 /// value of the pT cut for backward filter
195 double pT_;
196 /// leading mass assumption
197 int lead_;
198 ///
199 int mhyp_;
200 /// value of the momentum cut to decide refit
202 double pt_cut_,theta_cut_;
203
204
205 /// Flag account to multiple scattering and energy loss,
206 /// where lr flag from and whether use active hits only
208 /// flag to enhance the error matrix at the inner hit of Mdc (cosmic)
209 int enhance_;
211 ///
213 int steplev_;
214 int numfcor_;
215 int numf_;
216 int inner_steps_;
217 int outer_steps_;
218 int numf_in_;
219 int numf_out_;
220 int fitnocut_;
221 ///
223 /// mass assumption for backward filter (if <0 means use leading mass)
224 int i_back_;
225 int i_front_;
226 /// Debug flag for the track finder part
227 int debug_ , debug_kft_;
228 /// Fill ntuples of KalFit
229 int ntuple_;
230 // dir of files
231 string matfile_, cylfile_;
232 //cut for delta_chi2
233 double dchi2cutf_, dchi2cuts_;
234
236
237 /// factor of energy loss straggling for electron
238 double fstrag_;
239 //wire resoltion flag
240 int resolution_;
242
243 /// propagation correction
244 int tprop_;
245 int eventNo;
246 int m_usevtxdb;
247 int m_csmflag; //cosmic events flag; for cosmic events tof(y>0) should be minus
248 double m_dangcut, m_dphicut; //for cosmic events cut
249 double m_alpha;
250 private:
251 // --- KalFitCylinders
252 std::vector<KalFitCylinder> _BesKalmanFitWalls;
253 std::vector<KalFitMaterial> _BesKalmanFitMaterials;
254 std::vector<KalFitCylinder> m_innerWall;
255 std::vector<KalFitCylinder> m_CGEM;
256 std::vector<KalFitMaterial> m_CGEMMaterials;
257 //std::vector<G4Tubs> _BesKalmanFitTubs;
258
259 // --- statistics
260 int nTotalTrks;
261 int nFailedTrks[5];
262
263 // --- GEM resolution
264 double myRphiResGem; // in cm
265 double myZResGem; // in cm
266
267 // --- GEM hit coordinate choice
268 bool myUseGemPos3D;
269
270
271 KalFitWire * _wire;
272 KalFitLayer_Mdc * _layer;
273 KalFitSuper_Mdc * _superLayer;
274 HepPDT::ParticleDataTable* m_particleTable;
275 static const double RIW;
276
277 const MdcCalibFunSvc* m_mdcCalibFunSvc_;
278 const IMagneticFieldSvc* m_MFSvc_;
279 static IMdcGeomSvc* imdcGeomSvc_;
280 const CgemGeomSvc* m_CgemGeomSvc_;
281
282 int useNCGem_;
283 int nInnerCFiber_;
284 KalFitGemHitCol myGemHitCol[4];
285
286 int testCDC;
287
288 //sort the rec hits by layer
289 static bool order_rechits(const SmartRef<RecMdcHit>& m1, const SmartRef<RecMdcHit>& m2);
290
291 //ntuples
292 NTuple::Tuple* m_nt1; // KalFit track params
293 NTuple::Tuple* m_nt2; // KalFit 2-prong comparison
294 NTuple::Tuple* m_nt3; // PatRec track params
295 NTuple::Tuple* m_nt4; // PatRec 2-prong comparison
296 NTuple::Tuple* m_nt5; // for hit checking and cut
297 NTuple::Tuple* m_nt6; // for helix seg of calib
298
299 //for nt1
300 NTuple::Item<long> m_trackid,m_evtid;
301 NTuple::Item<double> m_chi2direct,m_prob;
302 NTuple::Matrix<double> m_ndf,m_chisq,m_stat;
303 NTuple::Array<double> m_length,m_tof,m_nhits;
304 NTuple::Item<double> m_zptot,m_zptote,m_zptotmu,m_zptotk,m_zptotp;
305 NTuple::Item<double> m_zpt,m_zpte,m_zptmu,m_zptk,m_zptp;
306 NTuple::Item<double> m_fptot,m_fptote,m_fptotmu,m_fptotk,m_fptotp;
307 NTuple::Item<double> m_fpt,m_fpte,m_fptmu,m_fptk,m_fptp;
308 NTuple::Item<double> m_lptot,m_lptote,m_lptotmu,m_lptotk,m_lptotp;
309 NTuple::Item<double> m_lpt,m_lpte,m_lptmu,m_lptk,m_lptp;
310 NTuple::Item<double> m_zsigp,m_zsigpe,m_zsigpmu,m_zsigpk,m_zsigpp;
311 NTuple::Array<double> m_zhelix,m_zhelixe,m_zhelixmu,m_zhelixk,m_zhelixp;
312 NTuple::Array<double> m_fhelix,m_fhelixe,m_fhelixmu,m_fhelixk,m_fhelixp;
313 NTuple::Array<double> m_lhelix,m_lhelixe,m_lhelixmu,m_lhelixk,m_lhelixp;
314 NTuple::Array<double> m_zerror,m_zerrore,m_zerrormu,m_zerrork,m_zerrorp;
315 NTuple::Array<double> m_ferror,m_ferrore,m_ferrormu,m_ferrork,m_ferrorp;
316 NTuple::Array<double> m_lerror,m_lerrore,m_lerrormu,m_lerrork,m_lerrorp;
317 NTuple::Array<double> m_rGem, m_chi2Gem, m_phiGemExp, m_phiGemHit, m_zGemExp, m_zGemHit;
318 //for nt1 single track MCTruth
319 NTuple::Array<double> m_mchelix;
320 NTuple::Item<double> m_mcptot;
321 NTuple::Item<long> m_mcpid;
322 //for nt3
323 NTuple::Array<double> m_trkhelix, m_trkerror;
324 NTuple::Item<double> m_trkndf, m_trkchisq, m_trkptot, m_trksigp;
325 //for nt2
326 NTuple::Item<double> m_delx,m_dely,m_delz,m_delthe,m_delphi,m_delp;
327 NTuple::Item<double> m_delpx,m_delpy,m_delpz;
328
329 //for nt4
330 NTuple::Item<double> m_trkdelx,m_trkdely,m_trkdelz;
331 NTuple::Item<double> m_trkdelthe,m_trkdelphi,m_trkdelp;
332 //for nt5
333 NTuple::Item<double> m_dchi2,m_orichi2,m_fitchi2,m_residest, m_residnew,m_anal_dr, m_anal_phi0, m_anal_kappa, m_anal_dz, m_anal_tanl, m_anal_ea_dr, m_anal_ea_phi0, m_anal_ea_kappa, m_anal_ea_dz, m_anal_ea_tanl;
334 NTuple::Item<long> m_masshyp, m_layer;
335 //for nt6
336 NTuple::Item<double> m_docaInc,m_docaExc, m_tdrift;
337 NTuple::Item<long> m_layerid,m_eventNo;
338 NTuple::Item<double> m_residualInc, m_residualExc, m_lr, m_yposition, m_dd;
339
340 NTuple::Item<double> m_dchisq0,m_dchisq1,m_dchisq2,m_dchisq3,m_dchisq4,m_dchisq5,m_dchisq6,m_dchisq7,m_dchisq8,m_dchisq9,m_dchisq10,m_dchisq11,m_dchisq12,m_dchisq13,m_dchisq14,m_dchisq15,m_dchisq16,m_dchisq17,m_dchisq18,m_dchisq19,m_dchisq20,m_dchisq21,m_dchisq22,m_dchisq23,m_dchisq24,m_dchisq25,m_dchisq26,m_dchisq27,m_dchisq28,m_dchisq29,m_dchisq30,m_dchisq31,m_dchisq32,m_dchisq33,m_dchisq34,m_dchisq35,m_dchisq36,m_dchisq37,m_dchisq38,m_dchisq39,m_dchisq40,m_dchisq41,m_dchisq42;
341 NTuple::Item<double> m_dtrack0,m_dtrack1,m_dtrack2,m_dtrack3,m_dtrack4,m_dtrack5,m_dtrack6,m_dtrack7,m_dtrack8,m_dtrack9,m_dtrack10,m_dtrack11,m_dtrack12,m_dtrack13,m_dtrack14,m_dtrack15,m_dtrack16,m_dtrack17,m_dtrack18,m_dtrack19,m_dtrack20,m_dtrack21,m_dtrack22,m_dtrack23,m_dtrack24,m_dtrack25,m_dtrack26,m_dtrack27,m_dtrack28,m_dtrack29,m_dtrack30,m_dtrack31,m_dtrack32,m_dtrack33,m_dtrack34,m_dtrack35,m_dtrack36,m_dtrack37,m_dtrack38,m_dtrack39,m_dtrack40,m_dtrack41,m_dtrack42;
342 NTuple::Item<double> m_dtdc0,m_dtdc1,m_dtdc2,m_dtdc3,m_dtdc4,m_dtdc5,m_dtdc6,m_dtdc7,m_dtdc8,m_dtdc9,m_dtdc10,m_dtdc11,m_dtdc12,m_dtdc13,m_dtdc14,m_dtdc15,m_dtdc16,m_dtdc17,m_dtdc18,m_dtdc19,m_dtdc20,m_dtdc21,m_dtdc22,m_dtdc23,m_dtdc24,m_dtdc25,m_dtdc26,m_dtdc27,m_dtdc28,m_dtdc29,m_dtdc30,m_dtdc31,m_dtdc32,m_dtdc33,m_dtdc34,m_dtdc35,m_dtdc36,m_dtdc37,m_dtdc38,m_dtdc39,m_dtdc40,m_dtdc41,m_dtdc42;
343
344 bool ifProdNt10;
345 NTuple::Tuple* m_nt10;
346 NTuple::Item<long> m_evt3;
347 NTuple::Item<long> m_nGemHits,m_qua;
348 NTuple::Array<double> m_meas_r,m_meas_phi,m_meas_z,m_esti1_r,m_esti1_phi,m_esti1_z,m_esti2_r,m_esti2_phi ,m_esti2_z,m_diff1_phi,m_diff2_z,m_diff1_z,m_diff2_phi,m_Gchi2;
349 NTuple::Array<int> m_GemLayer,m_mass;
350 NTuple::Array<double> m_meas_phierr,m_meas_zerr,m_esti_phierr,m_esti_zerr;
351 NTuple::Item<int> ctrk;
352 NTuple::Array<double> m_phi1,m_z1,m_phi2,m_z2,m_resphi1,m_resphi2,m_resz1,m_resz2,m_achi2;
353
354 bool ifProdNt11;
355 NTuple::Tuple* m_nt11;
356 NTuple::Item<int> m_evt4,m_ntruth;
357 NTuple::Array<double> m_dtphi,m_dtv,m_dtpostphi,m_dtpostz;
358 NTuple::Array<int> m_tlayer;
359
360 //calculate residual of 5 helix parameter and momemtum between kalman filter and MCtruth, add by Huang Zhen
361 bool ifProdNt12;
362 NTuple::Tuple* m_nt12;
363 NTuple::Item<long> m_track,m_evt;
364 NTuple::Item<double> m_diff_dr,m_diff_phi0,m_diff_kappa,m_diff_dz,m_diff_tanl,m_diff_p;
365};
366#endif
367
vector< KalFitGemHit > KalFitGemHitCol
ObjectVector< RecMdcKalHelixSeg > RecMdcKalHelixSegCol
ObjectVector< RecMdcKalTrack > RecMdcKalTrackCol
double pe_cut_
value of the momentum cut to decide refit
void residual(KalFitTrack &track)
void filter_fwd_anal(KalFitTrack &trk, int l_mass, int way, HepSymMatrix &Eakal)
Kalman filter (forward) in Mdc.
void innerwall(KalFitTrack &track, int l_mass, int way, double r1, double r2, int &index)
void filter_fwd_calib(KalFitTrack &trk, int l_mass, int way, HepSymMatrix &Eakal)
double fstrag_
factor of energy loss straggling for electron
StatusCode beginRun()
void fillTds_lead(MdcRec_trk &TrasanTRK, KalFitTrack &track, RecMdcKalTrack *trk, int l_mass)
~KalFitAlg(void)
destructor
void fromFHitToInnerWall(KalFitTrack &track, int way)
void clean(void)
void kalman_fitting_MdcxReco_Csmc_Sew(void)
void setCalibSvc_init(void)
initialize for the services
void smoother_anal(KalFitTrack &trk, int way)
Kalman filter (smoothing or backward part)
int i_back_
mass assumption for backward filter (if <0 means use leading mass)
void complete_track(MdcRec_trk &TrasanTRK, MdcRec_trk_add &TrasanTRK_add, KalFitTrack &track_lead, RecMdcKalTrack *kaltrk, RecMdcKalTrackCol *kalcol, RecMdcKalHelixSegCol *segcol, int flagsmooth)
int wsag_
flag to take account the wire sag into account
void kalman_fitting_calib(void)
void sameas(RecMdcKalTrack *trk, int l_mass, int imain)
complete the RecMdcKalTrackCol
void fillTds_ip(MdcRec_trk &TrasanTRK, KalFitTrack &track, RecMdcKalTrack *trk, int l_mass)
with results got at (0,0,0)
void init_matrix(int k, MdcRec_trk &trk, HepSymMatrix &Ea)
void makeGemHitsCol()
void fitGemHits(KalFitTrack &track, int hypo, int way)
void fillTds(MdcRec_trk &TrasanTRK, KalFitTrack &track, RecMdcKalTrack *trk, int l_mass)
with results got at the inner Mdc hit
void innerwall(KalFitTrack &trk, int l_mass, int way)
Take the inner walls (eloss and mult scat) into account.
void innerwall(KalFitTrack &trk, int l_mass, int way, int begin, int end)
KalFitTrack Cgem_filter_anal(KalFitTrack &track, int hypo, int way)
int debug_
Debug flag for the track finder part.
void start_seed(KalFitTrack &track, int lead_, int way, MdcRec_trk &trk)
void getEventStarTime(void)
void setBesFromGdml(void)
void setGeomSvc_init(void)
KalFitAlg(const std::string &name, ISvcLocator *pSvcLocator)
constructor
void kalman_fitting_anal(void)
void setDchisqCut(void)
int getWallMdcNumber(const HepPoint3D &point)
void set_Mdc(void)
Set up the wires, layers and superlayers...
void setMagneticFieldSvc_init(void)
int enhance_
flag to enhance the error matrix at the inner hit of Mdc (cosmic)
StatusCode execute()
event function
void complete_track(MdcRec_trk &TrasanTRK, MdcRec_trk_add &TrasanTRK_add, KalFitTrack &track_lead, RecMdcKalTrack *kaltrk, RecMdcKalTrackCol *kalcol, RecMdcKalHelixSegCol *segcol)
void fillTds_back(KalFitTrack &track, RecMdcKalTrack *trk, MdcRec_trk &TrasanTRK, int l_mass, RecMdcKalHelixSegCol *segcol, int smoothflag)
for smoother process
void smoother_calib(KalFitTrack &trk, int way)
void init_matrix(MdcRec_trk &trk, HepSymMatrix &Ea)
void setCylinder_Mdc(void)
Initialize the cylinders (walls and cathodes) for Mdc.
double pT_
value of the pT cut for backward filter
StatusCode initialize()
initialize
StatusCode finalize()
void kalman_fitting_csmalign(void)
void hist_def(void)
hist definition
void fillTds_back(KalFitTrack &track, RecMdcKalTrack *trk, MdcRec_trk &TrasanTRK, int l_mass)
with results got at the outer Mdc hit
void setMaterial_Mdc(void)
Initialize the material for Mdc.
void fillTds_back(KalFitTrack &track, RecMdcKalTrack *trk, MdcRec_trk &TrasanTRK, int l_mass, RecMdcKalHelixSegCol *segcol)
void extToAnyPoint(KalFitTrack &trk, const HepPoint3D &point)
void clearTables()
Description of a track class (<- Helix.cc)