Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #205 from vkuznet/ThreadSafe_TransientTrack
Thread safe TransientTrack package
- Loading branch information
Showing
2 changed files
with
160 additions
and
129 deletions.
There are no files selected for viewing
198 changes: 104 additions & 94 deletions
198
TrackingTools/TransientTrack/interface/TrackTransientTrack.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,94 +1,104 @@ | ||
#ifndef TrackReco_TrackTransientTrack_h | ||
#define TrackReco_TrackTransientTrack_h | ||
|
||
/** | ||
* Concrete implementation of the TransientTrack for a reco::Track | ||
*/ | ||
|
||
#include "TrackingTools/TransientTrack/interface/BasicTransientTrack.h" | ||
#include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" | ||
#include "DataFormats/TrackReco/interface/Track.h" | ||
#include "DataFormats/TrackReco/interface/TrackFwd.h" | ||
#include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h" | ||
|
||
namespace reco { | ||
|
||
class TrackTransientTrack : public Track, public BasicTransientTrack { | ||
public: | ||
|
||
// constructor from persistent track | ||
TrackTransientTrack(); | ||
TrackTransientTrack( const Track & tk , const MagneticField* field); | ||
TrackTransientTrack( const TrackRef & tk , const MagneticField* field); | ||
|
||
TrackTransientTrack( const TrackRef & tk , const MagneticField* field, const edm::ESHandle<GlobalTrackingGeometry>& trackingGeometry); | ||
|
||
TrackTransientTrack( const Track & tk , const MagneticField* field, const edm::ESHandle<GlobalTrackingGeometry>& trackingGeometry); | ||
|
||
TrackTransientTrack( const TrackTransientTrack & tt ); | ||
|
||
TrackTransientTrack& operator=(const TrackTransientTrack & tt); | ||
|
||
void setES(const edm::EventSetup& ); | ||
|
||
void setTrackingGeometry(const edm::ESHandle<GlobalTrackingGeometry>& ); | ||
|
||
void setBeamSpot(const reco::BeamSpot& beamSpot); | ||
|
||
FreeTrajectoryState initialFreeState() const {return initialFTS;} | ||
|
||
TrajectoryStateOnSurface outermostMeasurementState() const; | ||
|
||
TrajectoryStateOnSurface innermostMeasurementState() const; | ||
|
||
TrajectoryStateClosestToPoint | ||
trajectoryStateClosestToPoint( const GlobalPoint & point ) const | ||
{return builder(initialFTS, point);} | ||
|
||
/** | ||
* The TSOS at any point. The initial state will be used for the propagation. | ||
*/ | ||
TrajectoryStateOnSurface stateOnSurface(const GlobalPoint & point) const; | ||
|
||
TrajectoryStateClosestToPoint impactPointTSCP() const; | ||
|
||
TrajectoryStateOnSurface impactPointState() const; | ||
|
||
bool impactPointStateAvailable() const {return initialTSOSAvailable;} | ||
|
||
/** | ||
* access to original persistent track | ||
*/ | ||
TrackRef persistentTrackRef() const { return tkr_; } | ||
|
||
TrackBaseRef trackBaseRef() const {return TrackBaseRef(tkr_);} | ||
|
||
TrackCharge charge() const {return Track::charge();} | ||
|
||
const MagneticField* field() const {return theField;} | ||
|
||
const Track & track() const {return *this;} | ||
|
||
TrajectoryStateClosestToBeamLine stateAtBeamLine() const; | ||
|
||
private: | ||
|
||
void calculateTSOSAtVertex() const; | ||
|
||
TrackRef tkr_; | ||
const MagneticField* theField; | ||
|
||
FreeTrajectoryState initialFTS; | ||
mutable bool initialTSOSAvailable, initialTSCPAvailable, blStateAvailable; | ||
mutable TrajectoryStateOnSurface initialTSOS; | ||
mutable TrajectoryStateClosestToPoint initialTSCP; | ||
TSCPBuilderNoMaterial builder; | ||
edm::ESHandle<GlobalTrackingGeometry> theTrackingGeometry; | ||
reco::BeamSpot theBeamSpot; | ||
mutable TrajectoryStateClosestToBeamLine trajectoryStateClosestToBeamLine; | ||
|
||
}; | ||
|
||
} | ||
|
||
#endif | ||
#ifndef TrackingTools_TransientTrack_TrackingTransientTrack_h | ||
#define TrackingTools_TransientTrack_TrackingTransientTrack_h | ||
|
||
#include <atomic> | ||
|
||
/** | ||
* Concrete implementation of the TransientTrack for a reco::Track | ||
*/ | ||
|
||
#include "TrackingTools/TransientTrack/interface/BasicTransientTrack.h" | ||
#include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" | ||
#include "DataFormats/TrackReco/interface/Track.h" | ||
#include "DataFormats/TrackReco/interface/TrackFwd.h" | ||
#include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h" | ||
|
||
namespace reco { | ||
|
||
class TrackTransientTrack : public Track, public BasicTransientTrack { | ||
public: | ||
|
||
// constructor from persistent track | ||
TrackTransientTrack(); | ||
TrackTransientTrack( const Track & tk , const MagneticField* field); | ||
TrackTransientTrack( const TrackRef & tk , const MagneticField* field); | ||
|
||
TrackTransientTrack( const TrackRef & tk , const MagneticField* field, const edm::ESHandle<GlobalTrackingGeometry>& trackingGeometry); | ||
|
||
TrackTransientTrack( const Track & tk , const MagneticField* field, const edm::ESHandle<GlobalTrackingGeometry>& trackingGeometry); | ||
|
||
TrackTransientTrack( const TrackTransientTrack & tt ); | ||
|
||
TrackTransientTrack& operator=(const TrackTransientTrack & tt); | ||
|
||
void setES(const edm::EventSetup& ); | ||
|
||
void setTrackingGeometry(const edm::ESHandle<GlobalTrackingGeometry>& ); | ||
|
||
void setBeamSpot(const reco::BeamSpot& beamSpot); | ||
|
||
FreeTrajectoryState initialFreeState() const {return initialFTS;} | ||
|
||
TrajectoryStateOnSurface outermostMeasurementState() const; | ||
|
||
TrajectoryStateOnSurface innermostMeasurementState() const; | ||
|
||
TrajectoryStateClosestToPoint | ||
trajectoryStateClosestToPoint( const GlobalPoint & point ) const | ||
{return builder(initialFTS, point);} | ||
|
||
/** | ||
* The TSOS at any point. The initial state will be used for the propagation. | ||
*/ | ||
TrajectoryStateOnSurface stateOnSurface(const GlobalPoint & point) const; | ||
|
||
TrajectoryStateClosestToPoint impactPointTSCP() const; | ||
|
||
TrajectoryStateOnSurface impactPointState() const; | ||
|
||
bool impactPointStateAvailable() const {return (m_TSOS.load()==kSet ? true : false); } | ||
|
||
/** | ||
* access to original persistent track | ||
*/ | ||
TrackRef persistentTrackRef() const { return tkr_; } | ||
|
||
TrackBaseRef trackBaseRef() const {return TrackBaseRef(tkr_);} | ||
|
||
TrackCharge charge() const {return Track::charge();} | ||
|
||
const MagneticField* field() const {return theField;} | ||
|
||
const Track & track() const {return *this;} | ||
|
||
TrajectoryStateClosestToBeamLine stateAtBeamLine() const; | ||
|
||
private: | ||
|
||
TrackRef tkr_; | ||
const MagneticField* theField; | ||
|
||
FreeTrajectoryState initialFTS; | ||
|
||
// mutable member data, those should be treated very carefully to guarantee | ||
// thread safeness of the code by using atomic thread-safe helpers, see below | ||
mutable TrajectoryStateOnSurface initialTSOS; | ||
mutable TrajectoryStateClosestToPoint initialTSCP; | ||
mutable TrajectoryStateClosestToBeamLine trajectoryStateClosestToBeamLine; | ||
// thread-safe helpers to guarantee proper update of mutable member data | ||
mutable std::atomic<char> m_TSOS; | ||
mutable std::atomic<char> m_TSCP; | ||
mutable std::atomic<char> m_SCTBL; | ||
|
||
TSCPBuilderNoMaterial builder; | ||
edm::ESHandle<GlobalTrackingGeometry> theTrackingGeometry; | ||
reco::BeamSpot theBeamSpot; | ||
|
||
// to be used to setup thread states of class mutables | ||
enum CacheStates {kUnset, kSetting, kSet}; | ||
|
||
}; | ||
|
||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters