Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEventProcessor_dc_alignment.h
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DEventProcessor_dc_alignment.h
4 // Created: Thu Oct 18 17:15:41 EDT 2012
5 // Creator: staylor (on Linux ifarm1102 2.6.18-274.3.1.el5 x86_64)
6 //
7 
8 #ifndef _DEventProcessor_dc_alignment_
9 #define _DEventProcessor_dc_alignment_
10 
11 #include <pthread.h>
12 #include <map>
13 #include <vector>
14 #include <deque>
15 using std::map;
16 
17 #include <TTree.h>
18 #include <TFile.h>
19 #include <TH1.h>
20 #include <TH2.h>
21 #include <TH3.h>
22 
23 #include <JANA/JFactory.h>
24 #include <JANA/JEventProcessor.h>
25 #include <JANA/JEventLoop.h>
26 #include <JANA/JCalibration.h>
27 
28 #include <PID/DKinematicData.h>
29 #include <CDC/DCDCTrackHit.h>
30 #include <FDC/DFDCHit.h>
31 #include <FDC/DFDCGeometry.h>
32 #include <BCAL/DBCALShower.h>
33 #include <FCAL/DFCALShower.h>
34 #include <FDC/DFDCPseudo.h>
35 #include <FDC/DFDCIntersection.h>
36 #include <TRACKING/DTrackFinder.h>
37 #include <DMatrixSIMD.h>
38 #include <DVector2.h>
39 
40 #include "FDC_branch.h"
41 #include "FDC_c_branch.h"
42 #include "CDC_branch.h"
43 
44 typedef struct{
51  double doca,t;
52  double drift,drift_time;
53 }update_t;
54 
55 typedef struct{
56  double res,V;
61  double doca,t,z;
62  double drift_time,drift;
63  int ring_id,straw_id;
66 
67 typedef struct{
68  double dx_u,dy_u,dx_d,dy_d;
70 
71 typedef struct{
72  unsigned int id;
77  double ures,doca;
78  double R;
79  double drift,drift_time,t;
81 
82 typedef struct{
83  double xtrack,ytrack,ztrack;
84  const DBCALShower *match;
86 
87 
88 typedef struct{
91 }align_t;
92 
93 typedef struct{
97 
98 typedef struct{
102 
103 typedef struct{
106 }cdc_align_t;
107 
108 #define EPS 1e-3
109 #define ITER_MAX 20
110 
111 class DEventProcessor_dc_alignment:public jana::JEventProcessor{
112  public:
115  const char* className(void){return "DEventProcessor_dc_alignment";}
116 
117  TDirectory *dir;
118  TTree *fdctree;
121  TBranch *fdcbranch;
122 
123  TTree *fdcCtree;
126  TBranch *fdcCbranch;
127 
128  TTree *cdctree;
131  TBranch *cdcbranch;
132 
136  };
142  };
143 
146  kU,
148  kV,
149  };
150 
155  };
157  dX,
158  dY,
161  };
167  };
168 
170  public:
172  DMatrix4x4 Ckk,unsigned int h_id=0,unsigned int num_hits=0)
173  :z(z),t(t),S(S),J(J),Skk(Skk),Ckk(Ckk),h_id(h_id),num_hits(num_hits){}
174  double z,t;
179  unsigned int h_id,num_hits;
180  };
181 
182 
183 
184  private:
185  jerror_t init(void); ///< Called once at program start.
186  jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber); ///< Called everytime a new run number is detected.
187  jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber); ///< Called every event.
188  jerror_t erun(void); ///< Called everytime run number changes, provided brun has been called.
189  jerror_t fini(void); ///< Called after last event of last event source has been processed.
190 
191  jerror_t DoFilterAnodePlanes(double t0,double start_z,DMatrix4x1 &S,
192  vector<const DFDCPseudo*> &fdchits);
193  jerror_t DoFilterCathodePlanes(double t0,double start_z,DMatrix4x1 &S,
194  vector<const DFDCPseudo*> &fdchits);
195 
196  jerror_t DoFilter(double t0,double z,DMatrix4x1 &S,vector<const DCDCTrackHit *>&hits);
197 
198  jerror_t KalmanFilter(double anneal_factor,
199  DMatrix4x1 &S,DMatrix4x4 &C,
200  vector<const DFDCPseudo *>&hits,
201  deque<trajectory_t>&trajectory,
202  vector<update_t>&updates,
203  double &chi2,unsigned int &ndof);
204  jerror_t KalmanFilter(double anneal_factor,
205  DMatrix4x1 &S,DMatrix4x4 &C,
206  vector<const DCDCTrackHit *>&hits,
207  deque<trajectory_t>&trajectory,
208  vector<cdc_update_t>&updates,
209  double &chi2,unsigned int &ndof,
210  bool timebased=false);
211  jerror_t KalmanFilter(double anneal_factor,
212  DMatrix4x1 &S,DMatrix4x4 &C,
213  vector<const DFDCPseudo*>&hits,
214  deque<trajectory_t>&trajectory,
215  vector<wire_update_t>&updates,
216  double &chi2,unsigned int &ndof);
217 
218  jerror_t Smooth(DMatrix4x1 &Ss,DMatrix4x4 &Cs,
219  deque<trajectory_t>&trajectory,
220  vector<const DFDCPseudo *>&hits,
221  vector<update_t>updates,
222  vector<update_t>&smoothed_updates);
223  jerror_t Smooth(DMatrix4x1 &Ss,DMatrix4x4 &Cs,
224  deque<trajectory_t>&trajectory,
225  vector<const DCDCTrackHit *>&hits,
226  vector<cdc_update_t>&updates,
227  vector<cdc_update_t>&smoothed_updates);
228  jerror_t Smooth(DMatrix4x1 &Ss,DMatrix4x4 &Cs,
229  deque<trajectory_t>&trajectory,
230  vector<const DFDCPseudo*>&hits,
231  vector<wire_update_t>updates,
232  vector<wire_update_t>&smoothed_updates);
233 
234  jerror_t SetReferenceTrajectory(double t0,double z,DMatrix4x1 &S,
235  deque<trajectory_t>&trajectory,
236  vector<const DFDCPseudo *>&hits);
237  jerror_t SetReferenceTrajectory(double t0,double z,DMatrix4x1 &S,
238  deque<trajectory_t>&trajectory,
239  const DCDCTrackHit *last_cdc);
240 
241  jerror_t FindOffsets(vector<const DFDCPseudo *>&hits,
242  vector<update_t>&smoothed_updates);
243  jerror_t FindOffsets(vector<const DCDCTrackHit*>&hits,
244  vector<cdc_update_t>&updates);
245  jerror_t FindOffsets(vector<const DFDCPseudo *>&hits,
246  vector<wire_update_t>&smoothed_updates);
247 
248  jerror_t EstimateT0(vector<update_t>&updates,
249  vector<const DFDCPseudo*>&hits);
250 
251  unsigned int locate(vector<double>&xx,double x);
252  double cdc_variance(double t);
253  double cdc_drift_distance(double dphi, double delta,double t);
254  double fdc_drift_distance(double t);
255 
256  jerror_t GetProcessNoise(double dz,
257  double chi2c_factor,
258  double chi2a_factor,
259  double chi2a_corr,
260  const DMatrix4x1 &S,
261  DMatrix4x4 &Q);
262 
263  double GetDriftDistance(double t);
264  double GetDriftVariance(double t);
265  void UpdateWireOriginAndDir(unsigned int ring,unsigned int straw,
266  DVector3 &origin,DVector3 &wdir);
267  void ComputeGMatrices(double s,double t,double scale,
268  double tx,double ty,double tdir2,double one_over_d,
269  double wx,double wy,double wdir2,
270  double tdir_dot_wdir,
271  double tdir_dot_diff,
272  double wdir_dot_diff,
273  double dx0,double dy0,
274  double diffx,double diffy,
275  double diffz,
276  DMatrix1x4 &G,DMatrix4x1 &G_T);
277 
278  void PlotLines(deque<trajectory_t>&traj);
279 
280 
281  pthread_mutex_t mutex;
282 
292  TH1F *Hfcalmatch;
293  TH1F *Hztarg;
296 
300 
302  double endplate_z;
303  int myevt;
304 
308 
309  // drift time tables
310  vector<double>cdc_drift_table;
311  vector<double>fdc_drift_table;
312 
313  // Resolution parameters
315 
316  // Geometry
317  const DGeometry *dgeom;
318 
319  vector<align_t>alignments;
320  vector<vector<cdc_align_t> >cdc_alignments;
321  vector<wire_align_t>fdc_alignments;
322  vector<cathode_align_t>fdc_cathode_alignments;
323  vector<vector<DFDCWire*> >fdcwires;
325  vector<vector<cdc_offset_t> >cdc_offsets;
326 
327  vector<vector<double> >max_sag;
328  vector<vector<double> >sag_phi_offset;
329  double long_drift_func[3][3];
330  double short_drift_func[3][3];
331 };
332 
333 
334 // Smearing function derived from fitting residuals
336  // return 0.001*0.001;
337  if (t<0.) t=0.;
338 
339  //CDC_RES_PAR1=0.254;
340  //CDC_RES_PAR2=0.025;
341  double sigma=CDC_RES_PAR1/(t+1.)+CDC_RES_PAR2;
342  //sigma+=0.02;
343 
344  //sigma=0.08/(t+1.)+0.03;
345 
346  // sigma=0.035;
347 
348  return sigma*sigma;
349 }
350 
351 // Convert time to distance for the cdc
352 /*
353 inline double DEventProcessor_dc_alignment::cdc_drift_distance(double t){
354  double d=0.;
355  if (t>0.0) d=0.034*sqrt(t)-1.e-4*t;
356  return d;
357 }
358 */
359 
360 #endif // _DEventProcessor_dc_alignment_
361 
void PlotLines(deque< trajectory_t > &traj)
vector< vector< double > > sag_phi_offset
jerror_t DoFilterAnodePlanes(double t0, double start_z, DMatrix4x1 &S, vector< const DFDCPseudo * > &fdchits)
double cdc_drift_distance(double dphi, double delta, double t)
TVector3 DVector3
Definition: DVector3.h:14
jerror_t init(void)
Called once at program start.
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
vector< cathode_align_t > fdc_cathode_alignments
vector< vector< cdc_offset_t > > cdc_offsets
vector< vector< cdc_align_t > > cdc_alignments
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
jerror_t DoFilterCathodePlanes(double t0, double start_z, DMatrix4x1 &S, vector< const DFDCPseudo * > &fdchits)
jerror_t EstimateT0(vector< update_t > &updates, vector< const DFDCPseudo * > &hits)
void ComputeGMatrices(double s, double t, double scale, double tx, double ty, double tdir2, double one_over_d, double wx, double wy, double wdir2, double tdir_dot_wdir, double tdir_dot_diff, double wdir_dot_diff, double dx0, double dy0, double diffx, double diffy, double diffz, DMatrix1x4 &G, DMatrix4x1 &G_T)
trajectory_t(double z, double t, DMatrix4x1 S, DMatrix4x4 J, DMatrix4x1 Skk, DMatrix4x4 Ckk, unsigned int h_id=0, unsigned int num_hits=0)
jerror_t GetProcessNoise(double dz, double chi2c_factor, double chi2a_factor, double chi2a_corr, const DMatrix4x1 &S, DMatrix4x4 &Q)
TLatex tx
jerror_t SetReferenceTrajectory(double t0, double z, DMatrix4x1 &S, deque< trajectory_t > &trajectory, vector< const DFDCPseudo * > &hits)
vector< vector< DFDCWire * > > fdcwires
jerror_t fini(void)
Called after last event of last event source has been processed.
Double_t sigma[NCHANNELS]
Definition: st_tw_resols.C:37
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
#define S(str)
Definition: hddm-c.cpp:84
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
jerror_t DoFilter(double t0, double z, DMatrix4x1 &S, vector< const DCDCTrackHit * > &hits)
jerror_t FindOffsets(vector< const DFDCPseudo * > &hits, vector< update_t > &smoothed_updates)
unsigned int locate(vector< double > &xx, double x)
jerror_t Smooth(DMatrix4x1 &Ss, DMatrix4x4 &Cs, deque< trajectory_t > &trajectory, vector< const DFDCPseudo * > &hits, vector< update_t >updates, vector< update_t > &smoothed_updates)
void UpdateWireOriginAndDir(unsigned int ring, unsigned int straw, DVector3 &origin, DVector3 &wdir)
jerror_t KalmanFilter(double anneal_factor, DMatrix4x1 &S, DMatrix4x4 &C, vector< const DFDCPseudo * > &hits, deque< trajectory_t > &trajectory, vector< update_t > &updates, double &chi2, unsigned int &ndof)
#define G(x, y, z)