CMS 3D CMS Logo

TotemRPLocalTrackFitterAlgorithm.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * This is a part of TOTEM offline software.
4 * Authors:
5 * Hubert Niewiadomski
6 * Jan Kašpar (jan.kaspar@gmail.com)
7 *
8 ****************************************************************************/
9 
11 
13 
14 #include "TMatrixD.h"
15 
16 //----------------------------------------------------------------------------------------------------
17 
18 using namespace std;
19 using namespace edm;
20 
21 //----------------------------------------------------------------------------------------------------
22 
24 
25 //----------------------------------------------------------------------------------------------------
26 
27 void TotemRPLocalTrackFitterAlgorithm::reset() { det_data_map_.clear(); }
28 
29 //----------------------------------------------------------------------------------------------------
30 
33  RPDetCoordinateAlgebraObjs det_algebra_obj;
34 
35  det_algebra_obj.centre_of_det_global_position_ = convert3vector(tot_rp_geom.sensorTranslation(det_id));
36 
37  TVector3 rd_dir = convert3vector(tot_rp_geom.localToGlobalDirection(det_id, rp_topology_.GetStripReadoutAxisDir()));
38 
39  TVector2 v(rd_dir.X(), rd_dir.Y());
40  det_algebra_obj.readout_direction_ = v.Unit();
41  det_algebra_obj.rec_u_0_ = 0.0;
42  det_algebra_obj.available_ = true;
43  det_algebra_obj.rec_u_0_ =
44  -(det_algebra_obj.readout_direction_ * det_algebra_obj.centre_of_det_global_position_.XYvector());
45 
46  return det_algebra_obj;
47 }
48 
49 //----------------------------------------------------------------------------------------------------
50 
52  unsigned int det_id, const CTPPSGeometry &tot_rp_geom) {
53  auto it = det_data_map_.find(det_id);
54  if (it != det_data_map_.end()) {
55  return &(it->second);
56  } else {
57  det_data_map_[det_id] = prepareReconstAlgebraData(det_id, tot_rp_geom);
58  return &det_data_map_[det_id];
59  }
60 }
61 
62 //----------------------------------------------------------------------------------------------------
63 
65  double z_0,
66  const CTPPSGeometry &tot_geom,
67  TotemRPLocalTrack &fitted_track) {
68  fitted_track.setValid(false);
69 
70  // bind hits with their algebra objects
71  struct HitWithAlg {
72  unsigned int detId;
73  const TotemRPRecHit *hit;
75  };
76 
77  vector<HitWithAlg> applicable_hits;
78 
79  for (auto &ds : hits) {
80  unsigned int detId = ds.detId();
81 
82  for (auto &h : ds) {
83  RPDetCoordinateAlgebraObjs *alg = getDetAlgebraData(detId, tot_geom);
84  if (alg->available_)
85  applicable_hits.push_back({detId, &h, alg});
86  }
87  }
88 
89  if (applicable_hits.size() < 5)
90  return false;
91 
92  TMatrixD H(applicable_hits.size(), 4);
93  TVectorD V(applicable_hits.size());
94  TVectorD V_inv(applicable_hits.size());
95  TVectorD U(applicable_hits.size());
96 
97  for (unsigned int i = 0; i < applicable_hits.size(); ++i) {
98  RPDetCoordinateAlgebraObjs *alg_obj = applicable_hits[i].alg;
99 
100  H(i, 0) = alg_obj->readout_direction_.X();
101  H(i, 1) = alg_obj->readout_direction_.Y();
102  double delta_z = alg_obj->centre_of_det_global_position_.Z() - z_0;
103  H(i, 2) = alg_obj->readout_direction_.X() * delta_z;
104  H(i, 3) = alg_obj->readout_direction_.Y() * delta_z;
105  double var = applicable_hits[i].hit->sigma();
106  var *= var;
107  V[i] = var;
108  V_inv[i] = 1.0 / var;
109  U[i] = applicable_hits[i].hit->position() - alg_obj->rec_u_0_;
110  }
111 
112  TMatrixD H_T_V_inv(TMatrixD::kTransposed, H);
113  multiplyByDiagonalInPlace(H_T_V_inv, V_inv);
114  TMatrixD V_a(H_T_V_inv);
115  TMatrixD V_a_mult(V_a, TMatrixD::kMult, H);
116  try {
117  V_a_mult.Invert();
118  } catch (cms::Exception &e) {
119  LogError("TotemRPLocalTrackFitterAlgorithm") << "Error in TotemRPLocalTrackFitterAlgorithm::fitTrack > "
120  << "Fit matrix is singular. Skipping.";
121  return false;
122  }
123 
124  TMatrixD u_to_a(V_a_mult, TMatrixD::kMult, H_T_V_inv);
125  TVectorD a(U);
126  a *= u_to_a;
127 
128  fitted_track.setZ0(z_0);
129  fitted_track.setParameterVector(a);
130  fitted_track.setCovarianceMatrix(V_a_mult);
131 
132  double Chi_2 = 0;
133  for (unsigned int i = 0; i < applicable_hits.size(); ++i) {
134  RPDetCoordinateAlgebraObjs *alg_obj = applicable_hits[i].alg;
135  TVector2 readout_dir = alg_obj->readout_direction_;
136  double det_z = alg_obj->centre_of_det_global_position_.Z();
137  double sigma_str = applicable_hits[i].hit->sigma();
138  double sigma_str_2 = sigma_str * sigma_str;
139  TVector2 fited_det_xy_point = fitted_track.trackPoint(det_z);
140  double U_readout = applicable_hits[i].hit->position() - alg_obj->rec_u_0_;
141  double U_fited = (readout_dir *= fited_det_xy_point);
142  double residual = U_fited - U_readout;
143  TMatrixD V_T_Cov_X_Y(1, 2);
144  V_T_Cov_X_Y(0, 0) = readout_dir.X();
145  V_T_Cov_X_Y(0, 1) = readout_dir.Y();
146  TMatrixD V_T_Cov_X_Y_mult(V_T_Cov_X_Y, TMatrixD::kMult, fitted_track.trackPointInterpolationCovariance(det_z));
147  double fit_strip_var = V_T_Cov_X_Y_mult(0, 0) * readout_dir.X() + V_T_Cov_X_Y_mult(0, 1) * readout_dir.Y();
148  double pull_normalization = sqrt(sigma_str_2 - fit_strip_var);
149  double pull = residual / pull_normalization;
150 
151  Chi_2 += residual * residual / sigma_str_2;
152 
154  *(applicable_hits[i].hit), TVector3(fited_det_xy_point.X(), fited_det_xy_point.Y(), det_z), residual, pull);
155  fitted_track.addHit(applicable_hits[i].detId, hit_point);
156  }
157 
158  fitted_track.setChiSquared(Chi_2);
159  fitted_track.setValid(true);
160  return true;
161 }
162 
163 //----------------------------------------------------------------------------------------------------
164 
166  for (int i = 0; i < mt.GetNrows(); ++i) {
167  for (int j = 0; j < mt.GetNcols(); ++j) {
168  mt[i][j] *= diag[j];
169  }
170  }
171 }
Vector sensorTranslation(unsigned int id) const
void setChiSquared(double &chiSquared)
void multiplyByDiagonalInPlace(TMatrixD &mt, const TVectorD &diag)
A matrix multiplication shorthand.
void addHit(unsigned int detId, const FittedRecHit &hit)
void reset()
Resets the reconstruction-data cache.
TVector2 readout_direction_
non paralell projection and rot_cor included
Log< level::Error, false > LogError
TVector2 trackPoint(double z) const
returns (x, y) vector
A track fit through a single RP.
bool available_
if det should be included in the reconstruction
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t V
void setZ0(double z0)
T sqrt(T t)
Definition: SSEVec.h:23
double rec_u_0_
in mm, position of det. centre projected on readout direction
TotemRPLocalTrackFitterAlgorithm(const edm::ParameterSet &conf)
Reconstructed hit in TOTEM RP.
Definition: TotemRPRecHit.h:18
TMatrixD trackPointInterpolationCovariance(double z) const
The manager class for TOTEM RP geometry.
Definition: CTPPSGeometry.h:30
void setValid(bool valid)
RPDetCoordinateAlgebraObjs prepareReconstAlgebraData(unsigned int det_id, const CTPPSGeometry &tot_rp_geom)
Build the reconstruction data.
bool fitTrack(const edm::DetSetVector< TotemRPRecHit > &hits, double z_0, const CTPPSGeometry &tot_geom, TotemRPLocalTrack &fitted_track)
performs the track fit, returns true if successful
void setCovarianceMatrix(const TMatrixD &par_covariance_matrix)
HLT enums.
double a
Definition: hdecay.h:121
void setParameterVector(const TVectorD &track_params_vector)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
Vector localToGlobalDirection(unsigned int id, const Vector &) const
RPDetCoordinateAlgebraObjs * getDetAlgebraData(unsigned int det_id, const CTPPSGeometry &tot_rp_geom)