diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h index 665e4764272c38615e746d7171687e454f33b5ed..1a9922544c06bbb80fe56cb86612f25973a12acb 100755 --- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h +++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h @@ -95,14 +95,20 @@ namespace Trk public: friend class TrackSlimmingTool; - Track (); //!<needed by POOL. DO NOT USE YOURSELF! + /** + * Default constructor + * Here for POOL and simple tests. + * The track will return isValid() == false. + * It is not expected to be used in + * production. + */ + Track (); + /** * Full constructor * - * Pass everything possible to form a track, including - * As usual, since the FitQuality and the vectors are passed by - * pointer, they will be owned by the Track (i.e. the Track will - * delete them) + * Pass everything possible to form a track. + * The Track assumes ownership of the pointers. * * <b>PLEASE NOTE!</b> * if there is more than one Perigee in trackStateOnSurfaces @@ -128,16 +134,25 @@ namespace Trk virtual ~Track (); //!< destructor + /** + * returns true if the track has non-nullptr + * fitQuality and DataVector<const TrackStateOnSurface>* + */ + bool isValid() const; + /** - * return fit quality. this pointer is NULL (==0) if no FitQuality + * return fit quality pointer. It will be nullptr if no FitQuality * is assigned to the Track */ - const FitQuality* fitQuality () const { - return m_fitQuality; - } + const FitQuality* fitQuality () const; + /** + * set FitQuality. The Track takes ownership. + */ + void setFitQuality(const FitQuality* quality); + /** - * return Perigee. this pointer is NULL (==0) if no perigee parameters + * return Perigee. Can be nullptr if no perigee parameters * were assigned to the Track. * * This method performs lazy initialization and caches the result. @@ -151,8 +166,8 @@ namespace Trk * Return a pointer to a vector of TrackParameters. * It is created Lazily by this method and then cached. * - * The pointer will be NULL (==0) if the track was created - * without parameters. + * The pointer will be nullptr if the track was created + * without parameters. * * In general, it will be defined and will have at least one entry * @@ -272,7 +287,7 @@ namespace Trk * for example, TrackParameter, RIO_OnTrack and FitQualityOnSurface */ DataVector<const TrackStateOnSurface>* m_trackStateVector{nullptr}; - + /** * A vector of TrackParameters: these can be any of the classes that * derive from Trk::TrackParameters, for example, Perigee, MeasuredPerigee, @@ -302,7 +317,6 @@ namespace Trk */ CxxUtils::CachedValue<DataVector<const MeasurementBase>> m_cachedOutlierVector; - /** * A pointer to the Track's Perigee parameters. * @@ -310,7 +324,7 @@ namespace Trk * or MeasuredPerigee parameter */ CxxUtils::CachedValue<const Perigee*> m_perigeeParameters; - + /** * A pointer to the Track's FitQuality. This is guaranteed to diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc index 251dca1c813187b2251289377544673e58259091..474b2acd1a1cb368bbfb262fd38dccea1946f588 100644 --- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc +++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc @@ -4,13 +4,24 @@ namespace Trk { +inline bool +Track::isValid() const +{ + return (m_fitQuality && m_trackStateVector); +} + +inline const FitQuality* +Track::fitQuality() const +{ + return m_fitQuality; +} + inline const DataVector<const TrackStateOnSurface>* Track::trackStateOnSurfaces() const { return m_trackStateVector; } - inline DataVector<const TrackStateOnSurface>* Track::trackStateOnSurfaces() { diff --git a/Tracking/TrkEvent/TrkTrack/src/Track.cxx b/Tracking/TrkEvent/TrkTrack/src/Track.cxx index a5340b1a11912a16d7dc0a04912855b93ea9f87b..399ff0c55eb1eaf31101d0efe92e84466c8ef33b 100755 --- a/Tracking/TrkEvent/TrkTrack/src/Track.cxx +++ b/Tracking/TrkEvent/TrkTrack/src/Track.cxx @@ -194,6 +194,10 @@ Trk::Track::~Track() const DataVector<const Trk::TrackParameters>* Trk::Track::trackParameters() const { + + if(!m_trackStateVector){ + return nullptr; + } // Do work only if it is not valid. if ( !m_cachedParameterVector.isValid()){ // create cached parameter vector (which DOES NOT OWN ELEMENTS ... @@ -255,16 +259,15 @@ void Trk::Track::findPerigeeImpl() const const Trk::Perigee* Trk::Track::perigeeParameters() const { - if (!m_perigeeParameters.isValid()) { // findPerigee performs the setting of the parameters // i.e does the CachedValue set findPerigeeImpl(); } - //Return payload if valid - if(m_perigeeParameters.isValid()){ - return *(m_perigeeParameters.ptr()); + // Return payload if valid + if (m_perigeeParameters.isValid()) { + return *(m_perigeeParameters.ptr()); } return nullptr; @@ -272,9 +275,12 @@ Trk::Track::perigeeParameters() const const DataVector<const Trk::MeasurementBase>* Trk::Track::measurementsOnTrack() const { + if (!m_trackStateVector) { + return nullptr; + } // We only need to do work if not valid. - if ( m_trackStateVector and !m_cachedMeasurementVector.isValid()){ + if (!m_cachedMeasurementVector.isValid()){ // create new DataVector which DOES NOT OWN ELEMENTS . DataVector< const Trk::MeasurementBase> tmpMeasurementVector(SG::VIEW_ELEMENTS); // for measurements on track it is very likely that #(meas) ~ #(TSOS)-> reserve(#(TSOS)) @@ -299,6 +305,9 @@ const DataVector<const Trk::MeasurementBase>* Trk::Track::measurementsOnTrack() const DataVector<const Trk::MeasurementBase>* Trk::Track::outliersOnTrack() const { + if (!m_trackStateVector) { + return nullptr; + } //We only need to do work if not valid if ( !m_cachedOutlierVector.isValid()){ // create new DataVector which DOES NOT OWN ELEMENTS . @@ -318,7 +327,14 @@ const DataVector<const Trk::MeasurementBase>* Trk::Track::outliersOnTrack() cons return m_cachedOutlierVector.ptr(); } -void Trk::Track::setTrackStateOnSurfaces(DataVector<const Trk::TrackStateOnSurface>* input) +void Trk::Track::setFitQuality(const FitQuality* quality) +{ + delete m_fitQuality; + m_fitQuality = quality; +} + +void Trk::Track::setTrackStateOnSurfaces( + DataVector<const Trk::TrackStateOnSurface>* input) { delete m_trackStateVector; // delete existing m_trackStateVector = input; // add new