#include "IReconTrack.hxx" #include "ICorrValues.hxx" ClassImp(COMET::IReconTrack); COMET::IReconTrack::IReconTrack() { fState = new ITrackState; fNodes = new IReconNodeContainerImpl; } COMET::IReconTrack::IReconTrack(const COMET::IReconTrack& track) : COMET::IReconBase(track) { fNodes = new IReconNodeContainerImpl; // Copy the nodes // Create new nodes with ITrackState's COMET::IReconNodeContainer::const_iterator in; for (in=track.GetNodes().begin(); in!=track.GetNodes().end(); ++in){ COMET::IHandle node(new COMET::IReconNode); COMET::IHandle object = (*in)->GetObject(); node->SetObject(object); COMET::IHandle tstate = (*in)->GetState(); if (tstate) { COMET::IHandle pstate(new COMET::ITrackState(*tstate)); node->SetState(pstate); } node->SetQuality((*in)->GetQuality()); fNodes->push_back(node); } if (track.GetState()) { COMET::IHandle state = track.GetState(); fState = new ITrackState(*state); } else { fState = new ITrackState; } } COMET::IReconTrack::~IReconTrack() {} double COMET::IReconTrack::GetEDeposit() const { IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetEDeposit(); } TLorentzVector COMET::IReconTrack::GetPosition() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetPosition(); } TLorentzVector COMET::IReconTrack::GetPositionVariance() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetPositionVariance(); } bool COMET::IReconTrack::IsXTrack() const { TLorentzVector var = GetPositionVariance(); if (COMET::ICorrValues::IsFree(var.X())) return false; return true; } bool COMET::IReconTrack::IsYTrack() const { TLorentzVector var = GetPositionVariance(); if (COMET::ICorrValues::IsFree(var.Y())) return false; return true; } bool COMET::IReconTrack::IsZTrack() const { TLorentzVector var = GetPositionVariance(); if (COMET::ICorrValues::IsFree(var.Z())) return false; return true; } int COMET::IReconTrack::GetDimensions() const{ TLorentzVector var = GetPositionVariance(); int dim = 0; if (IsXTrack()) ++dim; if (IsYTrack()) ++dim; if (IsZTrack()) ++dim; return dim; } TVector3 COMET::IReconTrack::GetDirection() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetDirection(); } double COMET::IReconTrack::GetCurvature() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetCurvature(); } double COMET::IReconTrack::GetMomentum() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetMomentum(); } TVector3 COMET::IReconTrack::GetMomentumVector() const { // This is the preferred way to access a state field. IHandle state = GetState(); if (!state) throw EMissingField(); TVector3 dir = state->GetDirection(); // Normalize the direction in case if its not the unit vector dir = dir.Unit(); return (state->GetMomentum() * dir); } TVector3 COMET::IReconTrack::GetWidth() const { IHandle state = GetState(); if (!state) throw EMissingField(); return state->GetWidth(); }