21 legacyContainer(false),
25 truthTrackVec(nullptr),
26 truthDimuonVec(nullptr),
40 int ret = GetNodes(topNode);
43 ret = MakeNodes(topNode);
53 std::map<int, SRecTrack*> posTracks;
54 std::map<int, SRecTrack*> negTracks;
55 int nTracks = truthTrackVec->
size();
56 int nRecTracks = legacyContainer ? recEvent->
getNTracks() : recTrackVec->
size();
57 for(
int i = 0; i < nTracks; ++i)
61 if(recTrackIdx < 0 || recTrackIdx >= nRecTracks)
continue;
63 SRecTrack* recTrack = legacyContainer ? &(recEvent->
getTrack(recTrackIdx)) : dynamic_cast<SRecTrack*>(recTrackVec->
at(recTrackIdx));
64 double z_vtx = trk->
get_pos_vtx().Z() + (vtxSmearing>0. ? rndm.Gaus(0., vtxSmearing) : 0.);
66 if(swimTrackToVertex(recTrack, z_vtx) < 0.)
continue;
81 int nTrueDimuons = truthDimuonVec->
size();
82 for(
int i = 0; i < nTrueDimuons; ++i)
87 if(posTracks.find(pid) == posTracks.end() || negTracks.find(mid) == negTracks.end())
continue;
90 double z_vtx = trueDimuon->
get_pos().Z() + (vtxSmearing>0. ? rndm.Gaus(0., vtxSmearing) : 0.);
91 if(!buildRecDimuon(z_vtx, posTracks[pid], negTracks[mid], &recDimuon))
continue;
136 truthTrackVec = findNode::getClass<SQTrackVector>(topNode,
"SQTruthTrackVector");
139 std::cerr <<
Name() <<
": failed finding truth track info, abort." << std::endl;
143 truthDimuonVec = findNode::getClass<SQDimuonVector>(topNode,
"SQTruthDimuonVector");
146 std::cout <<
Name() <<
": failed finding truth dimuon info, rec dimuon will be for reference only. " << std::endl;
151 recEvent = findNode::getClass<SRecEvent>(topNode,
"SRecEvent");
155 recTrackVec = findNode::getClass<SQTrackVector>(topNode,
"SQRecTrackVector");
158 if((!recEvent) && (!recTrackVec))
160 std::cerr <<
Name() <<
": failed finding rec track info, abort." << std::endl;
175 std::cerr <<
Name() <<
": cannot locate DST node, abort." << std::endl;
185 double SQTruthVertexing::swimTrackToVertex(
SRecTrack* track,
double z, TVector3* pos, TVector3* mom)
190 double chi2 = gftrk.swimToVertex(z, &p, &m);
191 if(chi2 < 0.)
return chi2;
201 pos->SetXYZ(p.X(), p.Y(), p.Z());
202 mom->SetXYZ(m.X(), m.Y(), m.Z());
212 if(fabs(p_pos.Z() - z_vtx) > 1.)
214 p_chi2 = swimTrackToVertex(posTrack, z_vtx, &p_pos, &p_mom);
215 if(p_chi2 < 0.)
return false;
225 if(fabs(m_pos.Z() - z_vtx) > 1.)
227 m_chi2 = swimTrackToVertex(negTrack, z_vtx, &p_pos, &p_mom);
228 if(m_chi2 < 0.)
return false;
239 dimuon->
vtx.SetXYZ(0., 0., z_vtx);
virtual TVector3 get_pos_vtx() const =0
Return the track position at vertex.
int End(PHCompositeNode *topNode)
Called at the end of all processing.
Int_t getNDimuons()
Get dimuons.
Int_t getNTracks()
Get tracks.
Double_t getChisqVertex()
virtual int get_track_id_neg() const =0
Return the track ID of the negative track.
virtual size_t size() const =0
virtual const SQDimuon * at(const size_t id) const =0
SQTruthVertexing(const std::string &name="SQTruthVertexing")
PHBoolean addNode(PHNode *)
Double_t getChisqTarget()
void setChisqVertex(Double_t chisq)
int InitRun(PHCompositeNode *topNode)
int process_event(PHCompositeNode *topNode)
void insertDimuon(SRecDimuon dimuon)
Insert dimuon.
virtual const SQTrack * at(const size_t id) const =0
int Init(PHCompositeNode *topNode)
virtual int get_track_id_pos() const =0
Return the track ID of the positive track.
virtual const std::string Name() const
Returns the name of this module.
virtual int get_rec_track_id() const =0
Return the track ID of associated reconstructed track. Valid only if this object holds truth track in...
virtual TVector3 get_pos() const =0
Return the dimuon position at vertex.
void setVertexMom(TVector3 mom)
An SQ interface class to hold one true or reconstructed track.
SRecTrack & getTrack(Int_t i)
Double_t getChisqUpstream()
virtual size_t size() const =0
Int_t getCharge() const
Gets.
virtual void push_back(const SQDimuon *dim)=0
virtual void set_rec_dimuon_id(const int a)=0
virtual int get_track_id() const =0
Return the track ID, which is unique per event(?).
An SQ interface class to hold one true or reconstructed dimuon.
void setVertexPos(TVector3 pos)