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
00032
00033
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
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
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
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;
00253
00254
00255 void checkGlobalParameters() const dso_internal;
00256 void checkCurvilinError() const dso_internal;
00257
00258
00259 void createLocalParameters() const;
00260
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