Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:04:01

0001 /****************************************************************************
0002  *
0003  * This is a part of TOTEM offline software.
0004  * Authors:
0005  *   Hubert Niewiadomski
0006  *   Jan Kašpar (jan.kaspar@gmail.com)
0007  *
0008  ****************************************************************************/
0009 
0010 #ifndef DataFormats_CTPPSReco_TotemRPLocalTrack
0011 #define DataFormats_CTPPSReco_TotemRPLocalTrack
0012 
0013 #include "DataFormats/Common/interface/DetSetVector.h"
0014 #include "DataFormats/CTPPSReco/interface/TotemRPRecHit.h"
0015 
0016 #include "TVector3.h"
0017 #include "TMatrixD.h"
0018 #include "TVectorD.h"
0019 
0020 //----------------------------------------------------------------------------------------------------
0021 
0022 /**
0023  *\brief A track fit through a single RP.
0024  *
0025  * x = x0+tx*(z-z0) y = ...
0026  *
0027  * z0 is defined below
0028  * x any y refer to the global (x, y) system with the beam at (x = 0, y = 0).
0029  * Only VALID tracks (IsValid()==true) can be later used for physics reconstruction!
0030  **/
0031 class TotemRPLocalTrack {
0032 public:
0033   class FittedRecHit : public TotemRPRecHit {
0034   public:
0035     FittedRecHit(const TotemRPRecHit &hit, const TVector3 &space_point_on_det, double residual, double pull)
0036         : TotemRPRecHit(hit), space_point_on_det_(space_point_on_det), residual_(residual), pull_(pull) {}
0037 
0038     FittedRecHit() : TotemRPRecHit(), residual_(0), pull_(0) {}
0039 
0040     virtual ~FittedRecHit() {}
0041 
0042     inline const TVector3 &globalCoordinates() const { return space_point_on_det_; }
0043     inline void setGlobalCoordinates(const TVector3 &space_point_on_det) { space_point_on_det_ = space_point_on_det; }
0044 
0045     inline double residual() const { return residual_; }
0046     inline void setResidual(double residual) { residual_ = residual; }
0047 
0048     inline double pull() const { return pull_; }
0049     inline void setPull(double pull) { pull_ = pull; }
0050 
0051     inline double pullNormalization() const { return residual_ / pull_; }
0052 
0053   private:
0054     TVector3 space_point_on_det_;  ///< mm
0055     double residual_;              ///< mm
0056     double pull_;                  ///< normalised residual
0057   };
0058 
0059 public:
0060   ///< parameter vector size
0061   static const int dimension = 4;
0062 
0063   ///< covariance matrix size
0064   static const int covarianceSize = dimension * dimension;
0065 
0066   TotemRPLocalTrack() : z0_(0), chiSquared_(0), valid_(false) {}
0067 
0068   TotemRPLocalTrack(double z0,
0069                     const TVectorD &track_params_vector,
0070                     const TMatrixD &par_covariance_matrix,
0071                     double chiSquared);
0072 
0073   virtual ~TotemRPLocalTrack() {}
0074 
0075   inline const edm::DetSetVector<FittedRecHit> &hits() const { return track_hits_vector_; }
0076   inline void addHit(unsigned int detId, const FittedRecHit &hit) {
0077     track_hits_vector_.find_or_insert(detId).push_back(hit);
0078   }
0079 
0080   inline double x0() const { return track_params_vector_[0]; }
0081   inline double x0Sigma() const { return sqrt(CovarianceMatrixElement(0, 0)); }
0082   inline double x0Variance() const { return CovarianceMatrixElement(0, 0); }
0083 
0084   inline double y0() const { return track_params_vector_[1]; }
0085   inline double y0Sigma() const { return sqrt(CovarianceMatrixElement(1, 1)); }
0086   inline double y0Variance() const { return CovarianceMatrixElement(1, 1); }
0087 
0088   inline double z0() const { return z0_; }
0089   inline void setZ0(double z0) { z0_ = z0; }
0090 
0091   inline double tx() const { return track_params_vector_[2]; }
0092   inline double txSigma() const { return sqrt(CovarianceMatrixElement(2, 2)); }
0093 
0094   inline double ty() const { return track_params_vector_[3]; }
0095   inline double tySigma() const { return sqrt(CovarianceMatrixElement(3, 3)); }
0096 
0097   inline TVector3 directionVector() const {
0098     TVector3 vect(tx(), ty(), 1);
0099     vect.SetMag(1.0);
0100     return vect;
0101   }
0102 
0103   TVectorD parameterVector() const;
0104   void setParameterVector(const TVectorD &track_params_vector);
0105 
0106   TMatrixD covarianceMatrix() const;
0107   void setCovarianceMatrix(const TMatrixD &par_covariance_matrix);
0108 
0109   inline double chiSquared() const { return chiSquared_; }
0110   inline void setChiSquared(double &chiSquared) { chiSquared_ = chiSquared; }
0111 
0112   inline double chiSquaredOverNDF() const { return chiSquared_ / (track_hits_vector_.size() - 4); }
0113 
0114   inline unsigned short numberOfPointsUsedForFit() const { return track_hits_vector_.size(); }
0115 
0116   /// returns (x, y) vector
0117   inline TVector2 trackPoint(double z) const {
0118     double delta_z = z - z0_;
0119     return TVector2(track_params_vector_[0] + track_params_vector_[2] * delta_z,
0120                     track_params_vector_[1] + track_params_vector_[3] * delta_z);
0121   }
0122 
0123   inline TVector3 trackCentrePoint() { return TVector3(track_params_vector_[0], track_params_vector_[1], z0_); }
0124 
0125   TMatrixD trackPointInterpolationCovariance(double z) const;
0126 
0127   inline bool isValid() const { return valid_; }
0128 
0129   inline void setValid(bool valid) { valid_ = valid; }
0130 
0131   friend bool operator<(const TotemRPLocalTrack &l, const TotemRPLocalTrack &r);
0132 
0133 private:
0134   inline const double &CovarianceMatrixElement(int i, int j) const { return par_covariance_matrix_[i * dimension + j]; }
0135 
0136   inline double &CovarianceMatrixElement(int i, int j) { return par_covariance_matrix_[i * dimension + j]; }
0137 
0138   edm::DetSetVector<FittedRecHit> track_hits_vector_;
0139 
0140   /// track parameters: (x0, y0, tx, ty); x = x0 + tx*(z-z0) ...
0141   double track_params_vector_[dimension];
0142 
0143   /// z where x0 and y0 are evaluated.
0144   /// filled from CTPPSGeometry::getRPTranslation
0145   double z0_;
0146 
0147   double par_covariance_matrix_[covarianceSize];
0148 
0149   /// fit chi^2
0150   double chiSquared_;
0151 
0152   /// fit valid?
0153   bool valid_;
0154 };
0155 
0156 #endif