CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/TrackingTools/TrajectoryState/interface/BasicTrajectoryState.h

Go to the documentation of this file.
00001 #ifndef BasicTrajectoryState_H
00002 #define BasicTrajectoryState_H
00003 
00004 #include "TrackingTools/TrajectoryState/interface/ProxyBase.h"
00005 #include "DataFormats/GeometrySurface/interface/ReferenceCounted.h"
00006 #include "TrackingTools/TrajectoryState/interface/CopyUsingClone.h"
00007 
00008 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
00009 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryError.h"
00010 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00011 #include "TrackingTools/TrajectoryParametrization/interface/CartesianTrajectoryError.h"
00012 #include "TrackingTools/TrajectoryParametrization/interface/CurvilinearTrajectoryError.h"
00013 #include "TrackingTools/TrajectoryState/interface/SurfaceSideDefinition.h"
00014 
00015 #include <vector>
00016 
00017 
00018 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00019 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
00020 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryError.h"
00021 
00022 #include "DataFormats/GeometrySurface/interface/ReferenceCounted.h"
00023 
00024 #include "DataFormats/GeometryCommonDetAlgo/interface/DeepCopyPointer.h"
00025 #include "DataFormats/GeometrySurface/interface/Surface.h"
00026 #include "TrackingTools/TrajectoryParametrization/interface/TrajectoryStateExceptions.h"
00027 
00028 #include "FWCore/Utilities/interface/GCC11Compatibility.h"
00029 
00031 // #include <iostream>
00032 
00033 //class MagneticField;
00034 #include "MagneticField/Engine/interface/MagneticField.h"
00035 
00036 
00037 
00038 class TrajectoryStateOnSurface;
00039 
00040 
00047 class BasicTrajectoryState : public ReferenceCountedInEvent  {
00048 public:
00049 
00050   typedef BasicTrajectoryState                              BTSOS;
00051   typedef ProxyBase< BTSOS, CopyUsingClone<BTSOS> >         Proxy;
00052   typedef ReferenceCountingPointer<BasicTrajectoryState>    RCPtr;
00053   typedef SurfaceSideDefinition::SurfaceSide SurfaceSide;
00054 
00055 private:
00056   friend class ProxyBase< BTSOS, CopyUsingClone<BTSOS> >;
00057   friend class ReferenceCountingPointer<BasicTrajectoryState>;
00058 public:
00059 
00060   // default constructor : to make root happy
00061   BasicTrajectoryState(){}
00062 
00064   explicit BasicTrajectoryState(const Surface& aSurface);
00065 
00066   virtual ~BasicTrajectoryState();
00067 
00071   BasicTrajectoryState( const FreeTrajectoryState& fts,
00072                               const Surface& aSurface,
00073                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface);
00077   BasicTrajectoryState( const GlobalTrajectoryParameters& par,
00078                               const Surface& aSurface,
00079                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface);
00083   BasicTrajectoryState( const GlobalTrajectoryParameters& par,
00084                               const CartesianTrajectoryError& err,
00085                               const Surface& aSurface,
00086                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface);
00087 
00092   BasicTrajectoryState( const GlobalTrajectoryParameters& par,
00093                               const CurvilinearTrajectoryError& err,
00094                               const Surface& aSurface,
00095                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface,
00096                               double weight = 1.);
00101   BasicTrajectoryState( const GlobalTrajectoryParameters& par,
00102                               const CurvilinearTrajectoryError& err,
00103                               const Surface& aSurface,
00104                               double weight);
00108   BasicTrajectoryState( const LocalTrajectoryParameters& par,
00109                               const Surface& aSurface,
00110                               const MagneticField* field,
00111                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface);
00116   BasicTrajectoryState( const LocalTrajectoryParameters& par,
00117                               const LocalTrajectoryError& err,
00118                               const Surface& aSurface,
00119                               const MagneticField* field,
00120                               const SurfaceSide side = SurfaceSideDefinition::atCenterOfSurface,
00121                               double weight = 1.);
00126   BasicTrajectoryState( const LocalTrajectoryParameters& par,
00127                               const LocalTrajectoryError& err,
00128                               const Surface& aSurface,
00129                               const MagneticField* field,
00130                               double weight);
00131 
00132  
00133   bool isValid() const {
00134     return theFreeState || theLocalParametersValid;
00135   }
00136 
00137 
00138 // access global parameters/errors
00139   const GlobalTrajectoryParameters& globalParameters() const {
00140     return freeTrajectoryState(false)->parameters();
00141   }
00142   GlobalPoint globalPosition() const {
00143     return freeTrajectoryState(false)->position();
00144   }
00145   GlobalVector globalMomentum() const {
00146     return freeTrajectoryState(false)->momentum();
00147   }
00148   GlobalVector globalDirection() const {
00149     return freeTrajectoryState(false)->momentum().unit();
00150   }  
00151   TrackCharge charge() const {
00152     return freeTrajectoryState(false)->charge();
00153   }
00154   double signedInverseMomentum() const {
00155     return freeTrajectoryState(false)->signedInverseMomentum();
00156   }
00157   double transverseCurvature() const {
00158     return freeTrajectoryState(false)->transverseCurvature();
00159   }
00160 
00161   const CartesianTrajectoryError cartesianError() const {
00162     if unlikely(!hasError()) {
00163         missingError(" accesing cartesian error.");
00164         return CartesianTrajectoryError();
00165       }
00166     return freeTrajectoryState()->cartesianError();
00167   }
00168   const CurvilinearTrajectoryError& curvilinearError() const {
00169     if unlikely(!hasError()) {
00170         missingError(" accesing curvilinearerror.");
00171         static CurvilinearTrajectoryError crap;
00172         return crap;
00173       }
00174     return freeTrajectoryState()->curvilinearError();
00175   }
00176 
00177 
00178   FreeTrajectoryState* freeTrajectoryState(bool withErrors = true) const;
00179   
00180   const MagneticField *magneticField() const { return theField; }
00181 
00182 // access local parameters/errors
00183   const LocalTrajectoryParameters& localParameters() const {
00184     if unlikely(!isValid()) notValid();
00185     if unlikely(!theLocalParametersValid)
00186       createLocalParameters();
00187     return theLocalParameters;
00188   }
00189   LocalPoint localPosition() const {
00190     return localParameters().position();
00191   }
00192   LocalVector localMomentum() const {
00193     return localParameters().momentum();
00194   }
00195   LocalVector localDirection() const {
00196     return localMomentum().unit();
00197   }
00198 
00199   const LocalTrajectoryError& localError() const {
00200     if unlikely(!hasError()) {
00201         missingError(" accessing local error.");
00202         return theLocalError;
00203       }
00204     if unlikely(theLocalError.invalid()) createLocalError();
00205     return theLocalError;
00206   }
00207 
00208   const Surface& surface() const {
00209     return *theSurfaceP;
00210   }
00211 
00212   double weight() const {return theWeight;} 
00213 
00214   void rescaleError(double factor);
00215 
00216 
00217 
00219   SurfaceSide surfaceSide() const {
00220     return theSurfaceSide;
00221   }
00222 
00223   bool hasError() const {
00224     return (theFreeState && theFreeState->hasError()) || theLocalError.valid();
00225   }
00226 
00227 
00228   virtual BasicTrajectoryState* clone() const=0;
00229 
00230   virtual bool canUpdateLocalParameters() const { return true; }
00231 
00232   virtual void update( const LocalTrajectoryParameters& p,
00233                        const Surface& aSurface,
00234                        const MagneticField* field,
00235                        const SurfaceSide side ) ;
00236 
00237   virtual void update( const LocalTrajectoryParameters& p,
00238                        const LocalTrajectoryError& err,
00239                        const Surface& aSurface,
00240                        const MagneticField* field,
00241                        const SurfaceSide side,
00242                        double weight ) ;
00243 
00244 public:
00245   virtual std::vector<TrajectoryStateOnSurface> components() const;
00246 
00247 private:
00248 
00249   static void notValid();
00250 
00251   
00252   void missingError(char const * where) const; // dso_internal;
00253 
00254 // create global parameters and errors from local
00255   void checkGlobalParameters() const dso_internal;
00256   void checkCurvilinError() const  dso_internal;
00257 
00258 // create local parameters and errors from global
00259   void createLocalParameters() const;
00260   // create local errors from global
00261   void createLocalError() const;
00262   void createLocalErrorFromCurvilinearError() const  dso_internal;
00263 
00264 private:
00265 
00266   mutable DeepCopyPointer<FreeTrajectoryState> theFreeState;
00267 
00268   mutable LocalTrajectoryError      theLocalError;
00269   mutable LocalTrajectoryParameters theLocalParameters;
00270 
00271   mutable bool theLocalParametersValid;
00272   mutable bool theGlobalParamsUp2Date;
00273 
00274  
00275   SurfaceSide theSurfaceSide;
00276   ConstReferenceCountingPointer<Surface> theSurfaceP;
00277 
00278   double theWeight;
00279   const MagneticField* theField;
00280 
00281 };
00282 
00283 #endif