1111import org .jlab .clas .pdg .PDGDatabase ;
1212import org .jlab .clas .pdg .PDGParticle ;
1313import org .jlab .clas .tracking .kalmanfilter .Material ;
14+ import org .jlab .io .base .DataBank ;
1415import org .jlab .io .base .DataEvent ;
1516import org .jlab .rec .ahdc .Hit .Hit ;
1617import org .jlab .rec .ahdc .Track .Track ;
@@ -32,6 +33,9 @@ public class KalmanFilter {
3233
3334 private final int Niter = 40 ; // number of iterations for the Kalman Filter
3435 private boolean IsVtxDefined = false ; // implemented but not used yet
36+ private double [] vertex_resolutions = {0.09 , 1e10 }; // {error in r squared in mm^2, error in z squared in mm^2}
37+ // mm, CLAS and AHDC don't necessary have the same alignement (ZERO), this parameter may be subject to calibration
38+ private double clas_alignement = -54 ;
3539
3640 private void propagation (ArrayList <Track > tracks , DataEvent event , final double magfield , boolean IsMC ) {
3741
@@ -44,6 +48,30 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
4448 final double tesla = 0.001 ;
4549 final double [] B = {0.0 , 0.0 , magfield / 10 * tesla };
4650 HashMap <String , Material > materialHashMap = MaterialMap .generateMaterials ();
51+ // Recover the vertex of the electron
52+ if (event .hasBank ("REC::Particle" )) {
53+ DataBank recBank = event .getBank ("REC::Particle" );
54+ int row = 0 ;
55+ while ((!IsVtxDefined ) && row < recBank .rows ()) {
56+ if (recBank .getInt ("pid" , row ) == 11 ) {
57+ IsVtxDefined = true ;
58+ vz_constraint = 10 *recBank .getFloat ("vz" ,row ) - (IsMC ? 0 : clas_alignement ); // mm
59+ ////////////////////////////////////////
60+ /// compute electron resolution here
61+ /// it depends en p and theta
62+ /// the fine tuning will be done later
63+ /// ////////////////////////////////////
64+ //double px = recBank.getFloat("px",row);
65+ //double py = recBank.getFloat("py",row);
66+ //double pz = recBank.getFloat("pz",row);
67+ //double p = Math.sqrt(px*px+py*py+pz*pz);
68+ //double theta = Math.acos(pz/p);
69+ vertex_resolutions [0 ] = 0.09 ;
70+ vertex_resolutions [1 ] = 64 ;//4 + 1e10*theta + 1e10*p;
71+ }
72+ row ++;
73+ }
74+ }
4775
4876 // Loop over tracks
4977 int trackId = 0 ;
@@ -53,7 +81,7 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
5381 // Initialize state vector
5482 double x0 = 0.0 ;
5583 double y0 = 0.0 ;
56- double z0 = track .get_Z0 ();
84+ double z0 = IsVtxDefined ? vz_constraint : track .get_Z0 ();
5785 double px0 = track .get_px ();
5886 double py0 = track .get_py ();
5987 double pz0 = track .get_pz ();
@@ -62,9 +90,6 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
6290 // Read list of hits
6391 ArrayList <Hit > AHDC_hits = track .getHits ();
6492 Collections .sort (AHDC_hits ); // sorted following the compareTo() method in Hit.java
65-
66- double zbeam = 0 ;
67- if (IsVtxDefined )zbeam = vz_constraint ;
6893
6994 // Start propagation
7095 Stepper stepper = new Stepper (y );
@@ -76,7 +101,7 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
76101 RealVector initialStateEstimate = new ArrayRealVector (stepper .y );
77102 RealMatrix initialErrorCovariance = MatrixUtils .createRealMatrix (new double [][]{{50.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 }, {0.0 , 50.0 , 0.0 , 0.0 , 0.0 , 0.0 }, {0.0 , 0.0 , 900.0 , 0.0 , 0.0 , 0.0 }, {0.0 , 0.0 , 0.0 , 100.00 , 0.0 , 0.0 }, {0.0 , 0.0 , 0.0 , 0.0 , 100.00 , 0.0 }, {0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 900.0 }});
78103 KFitter TrackFitter = new KFitter (initialStateEstimate , initialErrorCovariance , stepper , propagator , materialHashMap );
79- TrackFitter .setVertexDefined ( IsVtxDefined );
104+ if ( IsVtxDefined ) TrackFitter .setVertexResolution ( vertex_resolutions );
80105
81106 // Loop over number of iterations
82107 for (int k = 0 ; k < Niter ; k ++) {
@@ -94,7 +119,7 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
94119 }
95120 // Backward propagation (first layer to beamline)
96121 {
97- Hit hit = new Hit_beam (0 , 0 , zbeam );
122+ Hit hit = new Hit_beam (0 , 0 , vz_constraint );
98123 TrackFitter .predict (hit , false );
99124 TrackFitter .correct (hit );
100125 }
@@ -136,11 +161,11 @@ private void propagation(ArrayList<Track> tracks, DataEvent event, final double
136161 hit .setTrackId (trackId );
137162 sum_adc += hit .getADC ();
138163 sum_residuals += hit .getResidual ();
139- chi2 += Math .pow (hit .getResidual (),2. 0 );
164+ chi2 += Math .pow (hit .getResidual (),2 )/ hit . get_MeasurementNoise (). getEntry ( 0 , 0 );
140165 }
141166 track .set_sum_adc (sum_adc );
142167 track .set_sum_residuals (sum_residuals );
143- track .set_chi2 (chi2 );
168+ track .set_chi2 (chi2 /( AHDC_hits . size ()- 3 ) );
144169 track .set_p_drift_kf (p_drift );
145170 track .set_dEdx_kf (sum_adc /s );
146171 track .set_path_kf (s );
0 commit comments