#ifndef _DKINEMATICDATA_ #define _DKINEMATICDATA_ /* * DKinematicData.h * Hall D * * Created by Matthew Shepherd on 5/28/07. Class largely borrowed from the KTKinematicData class used in CLEO. Where applicable CLHEP objects have been converted int Hall D ROOT-based typdefs. A portion of the original CLEO documenation appears below: Usage: Describes kinematic properties of charged tracks, photons, and virtual particles such as pi0, Ks, so that a user can carry out standard operations such as calculating masses, adding 4-momenta together, etc. The basic information consists of the 3-momentum, 3-position, mass and charge. A 7x7 error matrix is stored for the quantities \c (Px,Py,Pz,E,x,y,z). \par Building a simple DKinematicData object In addition to the usual copy constructor, DKinematicData objects can be built from basic momentum and position information, e.g., \code DVector3 momentum(1.2, -0.5, 0.6); DVector3 position(0.002, 0.003, 0.); double mass = 0.1396; double charge = -1.0; DMatrixDSym errMatrix(7,1); // Create a 7x7 unit matrix for now DKinematicData pion(momentum, position, mass, charge, errorMatrix); \endcode The error matrix argument is optional. If absent, a null error matrix is stored.

Most of the time you build a kinematic object from a helix read from the data access system. In that case you supply the helix parameters, magnetic field (to compute the momentum) and mass (needed for the energy). The kinematic parameters are evaluated at the point of closest approach to the reference point.

Note that the magnetic field is always specified in \e kilogauss. \code KTHelix helix; double mass = 0.1396; DVector3 bField(0., 0., -15.); DKinematicData pion(helix, mass, bField); \endcode By default, the helix error matrix is converted to the appropriate 7x7 form and added to the object. You can prevent the error matrix from being formed by replacing the above declaration by \code bool noErrorMatrix = false; KTKinematic pion(helix, mass, bField, noErrorMatrix); \endcode \par Setting and retrieving information from DKinematicData objects. All kinds of information can be set or retrieved. \code DKinematicData pion(helix, mass, bField); // Make a pion \endcode Modify some of the pion components \code pion.setMomentum(DVector3(0.2,0.5,-1.2)); // 3-momentum pion.setPosition(DVector3(0.002,0.005,0.02)); // Position pion.setMass(0.4937); // Mass pion.clearErrorMatrix(); // Clear err matrix \endcode Retrieve pion information \code DVector3 momentum = pion.momentum(); // 3-momentum DLorentzVector fourMomentum = pion.lorenzMomentum(); // 4-momentum DVector3 position = pion.position(); // Position double mass = pion.mass(); // Mass double charge = pion.charge(); // Charge DMatrixDSym errorMatrix = pion.errorMatrix(); // Error matrix double ptot = pion.pmag(); // p double ptotsq = pion.pmag2(); // p^2 double pt = pion.pperp(); // pt double ptsq = pion.pperp2(); // pt^2 double px = pion.px(); // px double py = pion.py(); // py double pz = pion.pz(); // pz double E = pion.energy(); // E double x = pion.x(); // x double y = pion.y(); // y double z = pion.z(); // z \endcode \par Fixed or floating mass Particles like pions, kaons and gammas have predetermined, fixed masses while those calculated from invariant masses or mass fits, such as D0's and B's, have masses which "float" because the energy is independent of the momentum. DKinematicData objects have a flag that specifies whether or not the mass is floating or not. The flag can be accessed as follows \code DKinematicData pion(...); bool massFixed = pion.hasFixedMass(); // Get the fixed mass flag pion.setMassFixed(); // Set fixed mass pion.setMassFloat(); // Set floating mass \endcode One should rarely need to set the mass flag since the defaults used by the tracking system are expected to be adequate. For example, when building a DKinematicData object from a helix or from the basic 3-momentum, 3-position, etc., the flag is set to "true". As kinematic fitting becomes available, particles built by combining the 4-momentum of daughter particles will have the flag set to "false" because the energy will be truly independent of the 3-momentum. */ #include #include using namespace jana; #include "GlueX.h" #include "DRandom.h" #include "DVector3.h" #include "DLorentzVector.h" #include "DMatrixDSym.h" #define SPEED_OF_LIGHT 29.9792 class DKinematicData : public JObject { public: //virtual const char* className(void){return "DKinematicData"; } // virtual const char* className(void){return static_className();} // static const char* static_className(void){return "DKinematicData";} // constants, enums and typedefs typedef double ValueType; enum { kDefaultMass = 0 , kDefaultCharge = 0 } ; ///This is needed to associate the elements correctly in the error matrix enum ParameterOrder {kPx = 1, kPy, kPz, kEnergy, kX, kY, kZ}; // constructors and destructor DKinematicData( void ) ; DKinematicData( const oid_t id ); DKinematicData( const DKinematicData& aKinematicData ); DKinematicData( const DKinematicData& aKinematicData, const bool aCopyErrorMatrix ) ; DKinematicData( const DVector3& aMomentum , const DVector3& aPosition, const ValueType aMass, const ValueType aCharge) ; DKinematicData( const DVector3& aMomentum , const DVector3& aPosition, const ValueType aMass, const ValueType aCharge, const DMatrixDSym& aErrorMatrix ) ; // this class needs additional constructors to construct // from kinematic data from tracking output virtual ~DKinematicData( void ) ; // assignment operator(s) const DKinematicData& operator=( const DKinematicData& aOtherKinematicData ) ; bool operator==( const DKinematicData& rhs ) const ; bool operator!=( const DKinematicData& rhs ) const ; // member functions void setMass( const ValueType aMass ) ; void setMomentum( const DVector3& aMomentum ) ; void setPosition( const DVector3& aPosition ) ; void setCharge( const ValueType aCharge); void setMassFixed( void ) ; void setMassFloat( void ) ; void clearErrorMatrix( void ) ; void clearTrackingErrorMatrix(void); void setErrorMatrix( const DMatrixDSym& aMatrix ) ; void setTrackingErrorMatrix(const DMatrixDSym& aMatrix); void setT0(const ValueType at0, const ValueType at0_err, const DetectorSystem_t at0_detector); void setT1(const ValueType at1, const ValueType at1_err, const DetectorSystem_t at1_detector); void setPathLength(const ValueType apathLength, const ValueType apathLength_err); void setdEdx(const ValueType adedx); // For debugging with MCThrown void smearMCThrownMomentum( double smearPct ); // const member functions ValueType mass( void ) const ; ValueType charge( void ) const ; ValueType px( void ) const ; ValueType py( void ) const ; ValueType pz( void ) const ; ValueType energy( void ) const ; ValueType x( void ) const ; ValueType y( void ) const ; ValueType z( void ) const ; ValueType pperp( void ) const ; ValueType pperp2( void ) const ; ValueType pmag( void ) const ; ValueType pmag2( void ) const ; const DVector3& momentum( void ) const ; const DVector3& position( void ) const ; const DLorentzVector lorentzMomentum( void ) const ; bool hasFixedMass( void ) const ; virtual const DMatrixDSym& errorMatrix( void ) const ; const DMatrixDSym &TrackingErrorMatrix(void) const; ValueType t0( void ) const; ValueType t0_err( void ) const; DetectorSystem_t t0_detector( void ) const; ValueType t1( void ) const; ValueType t1_err( void ) const; DetectorSystem_t t1_detector( void ) const; ValueType pathLength( void ) const; ValueType pathLength_err( void ) const; ValueType TOF( void ) ; ValueType TOF_err( void ) ; ValueType dEdx(void) const; ValueType deltaInvBeta( void ) ; ValueType measuredInvBeta_err( void ) ; ValueType deltaBeta( void ) ; ValueType measuredBeta( void ) ; ValueType measuredBeta_err( void ) ; /// \return TRUE if errors are all zero bool hasNullErrorMatrix() const { return (&errorMatrix() == nullMatrix());}; bool hasNull5x5Matrix() const { return (&TrackingErrorMatrix() == null5x5Matrix());}; void toStrings(vector > &items)const{ AddString(items, "q", "%+1.0f", charge()); AddString(items, "x(cm)", "%3.1f", x()); AddString(items, "y(cm)", "%3.1f", y()); AddString(items, "z(cm)", "%3.1f", z()); AddString(items, "E(GeV)", "%2.3f", energy()); AddString(items, "t(ns)", "%2.3f", t0()); AddString(items, "p(GeV/c)", "%2.3f", momentum().Mag()); AddString(items, "theta(deg)", "%2.3f", momentum().Theta()*180.0/M_PI); AddString(items, "phi(deg)", "%2.3f", momentum().Phi()*180.0/M_PI); } protected: // protected member functions // These routines are used to optimize the performance of some // of the move routines DMatrixDSym* takeOwnershipOfPointer( void ); void restoreOwnershipOfPointer( DMatrixDSym* const aPointer); // left for reference -- KTHelix class not ported to GlueX // void calculate7x7ErrorMatrixFrom5x5ErrorMatrix( const KTHelix& aHelix); private: // data members bool m_hasFixedMass ; ValueType m_mass ; ValueType m_charge ; DVector3 m_momentum ; DVector3 m_position ; DMatrixDSym* m_errorMatrix ; // Order is (px, py, pz, E, x, y, z) DMatrixDSym *m_TrackingErrorMatrix; // order is q/pt,phi,tanl,D,z // Time of flight information double m_t0; /// Start time (ns) double m_t0_err; /// Start time error DetectorSystem_t m_t0_detector; /// Detector used to measure the start time double m_t1; /// End of flight time (ns) double m_t1_err; /// End of flight time error DetectorSystem_t m_t1_detector; /// Detector used to measure the end of flight time double m_pathLength; /// Flight path length (cm) double m_pathLength_err; /// Flight path length err // dEdx double m_dedx; //All matricies without a set error matrix can share the same nullMatrix static DMatrixDSym* nullMatrix(); static DMatrixDSym* null5x5Matrix(); }; // inline function definitions #endif /* _DKINEMATICDATA_ */