Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DChargedTrackHypothesis_factory.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DChargedTrackHypothesis_factory.cc
4 // Created: Tue Aug 9 14:29:24 EST 2011
5 // Creator: pmatt (on Linux ifarml6 2.6.18-128.el5 x86_64)
6 //
7 
9 
10 inline bool DChargedTrackHypothesis_SortByEnergy(const DChargedTrackHypothesis* locChargedTrackHypothesis1, const DChargedTrackHypothesis* locChargedTrackHypothesis2)
11 {
12  // truncate the track energies: in units of MeV, ignore all digits that are 10s-place and above
13  // then sort by increasing energy: pseudo-random
14 
15  //guard against NaN: necessary since casting to int
16  bool locFirstIsNaN = (!(locChargedTrackHypothesis1->energy() > -1.0) && !(locChargedTrackHypothesis1->energy() < 1.0));
17  bool locSecondIsNaN = (!(locChargedTrackHypothesis2->energy() > -1.0) && !(locChargedTrackHypothesis2->energy() < 1.0));
18  if(locFirstIsNaN)
19  return false;
20  if(locSecondIsNaN)
21  return true;
22  double locE1 = locChargedTrackHypothesis1->energy() - double(int(locChargedTrackHypothesis1->energy()*100.0))/100.0;
23  double locE2 = locChargedTrackHypothesis2->energy() - double(int(locChargedTrackHypothesis2->energy()*100.0))/100.0;
24  return (locE1 < locE2);
25 }
26 
27 //------------------
28 // init
29 //------------------
31 {
32  //Setting this flag makes it so that JANA does not delete the objects in _data. This factory will manage this memory.
33  SetFactoryFlag(NOT_OBJECT_OWNER);
36  dResourcePool_TMatrixFSym = std::make_shared<DResourcePool<TMatrixFSym>>();
37  dResourcePool_TMatrixFSym->Set_ControlParams(20, 20, 50);
38  return NOERROR;
39 }
40 
41 //------------------
42 // brun
43 //------------------
44 jerror_t DChargedTrackHypothesis_factory::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
45 {
46  locEventLoop->GetSingle(dPIDAlgorithm);
47  return NOERROR;
48 }
49 
50 //------------------
51 // evnt
52 //------------------
53 jerror_t DChargedTrackHypothesis_factory::evnt(jana::JEventLoop* locEventLoop, uint64_t eventnumber)
54 {
55  //Recycle
57  dCreated.clear();
58  _data.clear();
59 
60  vector<const DTrackTimeBased*> locTrackTimeBasedVector;
61  locEventLoop->Get(locTrackTimeBasedVector);
62 
63  vector<const DEventRFBunch*> locEventRFBunches;
64  locEventLoop->Get(locEventRFBunches);
65  if (locEventRFBunches.size() == 0)
66  return NOERROR;
67 
68  const DDetectorMatches* locDetectorMatches = NULL;
69  locEventLoop->GetSingle(locDetectorMatches);
70 
71  map<JObject::oid_t, vector<DChargedTrackHypothesis*> > locChargedTrackHypotheses;
72  for(size_t loc_i = 0; loc_i < locTrackTimeBasedVector.size(); loc_i++)
73  {
74  DChargedTrackHypothesis* locChargedTrackHypothesis = Create_ChargedTrackHypothesis(locEventLoop, locTrackTimeBasedVector[loc_i], locDetectorMatches, locEventRFBunches[0]);
75  locChargedTrackHypotheses[locChargedTrackHypothesis->Get_TrackTimeBased()->candidateid].push_back(locChargedTrackHypothesis);
76  }
77 
78  //choose the first hypothesis from each track, and sort by increasing energy in the 1's and 0.1s digits (MeV): pseudo-random
79  vector<DChargedTrackHypothesis*> locTracksToSort;
80  map<JObject::oid_t, vector<DChargedTrackHypothesis*> >::iterator locIterator = locChargedTrackHypotheses.begin();
81  for(; locIterator != locChargedTrackHypotheses.end(); ++locIterator)
82  locTracksToSort.push_back(locIterator->second[0]);
83  sort(locTracksToSort.begin(), locTracksToSort.end(), DChargedTrackHypothesis_SortByEnergy);
84 
85  //now loop through the sorted vector, grab all of the hypotheses for each of those tracks from the map, and save them all in _data
86  for(size_t loc_i = 0; loc_i < locTracksToSort.size(); loc_i++)
87  {
88  JObject::oid_t locTrackID = locTracksToSort[loc_i]->Get_TrackTimeBased()->candidateid;
89  _data.insert(_data.end(), locChargedTrackHypotheses[locTrackID].begin(), locChargedTrackHypotheses[locTrackID].end());
90  }
91 
92  dCreated = _data;
93  return NOERROR;
94 }
95 
96 DChargedTrackHypothesis* DChargedTrackHypothesis_factory::Create_ChargedTrackHypothesis(JEventLoop* locEventLoop, const DTrackTimeBased* locTrackTimeBased, const DDetectorMatches* locDetectorMatches, const DEventRFBunch* locEventRFBunch)
97 {
98  DChargedTrackHypothesis* locChargedTrackHypothesis = Get_Resource();
99  locChargedTrackHypothesis->Share_FromInput_Kinematics(static_cast<const DKinematicData*>(locTrackTimeBased));
100  locChargedTrackHypothesis->Set_TrackTimeBased(locTrackTimeBased);
101 
102  auto locCovarianceMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
103  locCovarianceMatrix->ResizeTo(7, 7);
104  if(locChargedTrackHypothesis->errorMatrix() != nullptr)
105  *locCovarianceMatrix = *(locChargedTrackHypothesis->errorMatrix());
106 
107  // RF Time
108  if(locEventRFBunch->dTimeSource != SYS_NULL)
109  {
110  double locPropagatedRFTime = dPIDAlgorithm->Calc_PropagatedRFTime(locChargedTrackHypothesis, locEventRFBunch);
111  locChargedTrackHypothesis->Set_T0(locPropagatedRFTime, locEventRFBunch->dTimeVariance, locEventRFBunch->dTimeSource);
112  }
113 
114  // Start Counter
115  shared_ptr<const DSCHitMatchParams> locSCHitMatchParams;
116  if(dPIDAlgorithm->Get_BestSCMatchParams(locTrackTimeBased, locDetectorMatches, locSCHitMatchParams))
117  {
118  locChargedTrackHypothesis->Set_SCHitMatchParams(locSCHitMatchParams);
119 
120  double locPropagatedTime = locSCHitMatchParams->dHitTime - locSCHitMatchParams->dFlightTime;
121  locChargedTrackHypothesis->setTime(locPropagatedTime);
122 
123 // double locPropagatedTimeUncertainty = sqrt(locSCHitMatchParams->dHitTimeVariance + locSCHitMatchParams->dFlightTimeVariance);
124  double locPropagatedTimeUncertainty = 0.3;
125 // double locFlightTimePCorrelation = locDetectorMatches->Get_FlightTimePCorrelation(locTrackTimeBased, SYS_START); //uncomment when ready!!
126 // Add_TimeToTrackingMatrix(locChargedTrackHypothesis, locCovarianceMatrix, locSCHitMatchParams->dFlightTimeVariance, locSCHitMatchParams->dHitTimeVariance, locFlightTimePCorrelation); //uncomment when ready!!
127  (*locCovarianceMatrix)(6, 6) = 0.3*0.3+locSCHitMatchParams->dFlightTimeVariance;
128 
129  if(locEventRFBunch->dTimeSource == SYS_NULL)
130  locChargedTrackHypothesis->Set_T0(locPropagatedTime, locPropagatedTimeUncertainty, SYS_START); //update when ready
131  }
132 
133  // MATCHES
134  shared_ptr<const DBCALShowerMatchParams> locBCALShowerMatchParams;
135  shared_ptr<const DTOFHitMatchParams> locTOFHitMatchParams;
136  shared_ptr<const DFCALShowerMatchParams> locFCALShowerMatchParams;
137  shared_ptr<const DDIRCMatchParams> locDIRCMatchParams;
138  if(dPIDAlgorithm->Get_BestBCALMatchParams(locTrackTimeBased, locDetectorMatches, locBCALShowerMatchParams))
139  locChargedTrackHypothesis->Set_BCALShowerMatchParams(locBCALShowerMatchParams);
140  if(dPIDAlgorithm->Get_BestTOFMatchParams(locTrackTimeBased, locDetectorMatches, locTOFHitMatchParams))
141  locChargedTrackHypothesis->Set_TOFHitMatchParams(locTOFHitMatchParams);
142  if(dPIDAlgorithm->Get_BestFCALMatchParams(locTrackTimeBased, locDetectorMatches, locFCALShowerMatchParams))
143  locChargedTrackHypothesis->Set_FCALShowerMatchParams(locFCALShowerMatchParams);
144  if(dPIDAlgorithm->Get_DIRCMatchParams(locTrackTimeBased, locDetectorMatches, locDIRCMatchParams))
145  locChargedTrackHypothesis->Set_DIRCMatchParams(locDIRCMatchParams);
146 
147  //PID
148  if(locChargedTrackHypothesis->t1_detector() == SYS_BCAL)
149  {
150  auto locBCALShowerMatchParams = locChargedTrackHypothesis->Get_BCALShowerMatchParams();
151  const DBCALShower* locBCALShower = locBCALShowerMatchParams->dBCALShower;
152  locChargedTrackHypothesis->setTime(locBCALShower->t - locBCALShowerMatchParams->dFlightTime);
153 // double locFlightTimePCorrelation = locDetectorMatches->Get_FlightTimePCorrelation(locTrackTimeBased, SYS_BCAL); //uncomment when ready!!
154 // Add_TimeToTrackingMatrix(locChargedTrackHypothesis, locCovarianceMatrix.get(), locBCALShowerMatchParams->dFlightTimeVariance, locBCALShower->tErr()*locBCALShower->tErr(), locFlightTimePCorrelation); //uncomment when ready!!
155  (*locCovarianceMatrix)(6 , 6) = 0.25*0.25+locBCALShowerMatchParams->dFlightTimeVariance;
156  }
157 
158  // TOF
159  if(locChargedTrackHypothesis->t1_detector() == SYS_TOF)
160  {
161  auto locTOFHitMatchParams = locChargedTrackHypothesis->Get_TOFHitMatchParams();
162  locChargedTrackHypothesis->setTime(locTOFHitMatchParams->dHitTime - locTOFHitMatchParams->dFlightTime);
163 // double locFlightTimePCorrelation = locDetectorMatches->Get_FlightTimePCorrelation(locTrackTimeBased, SYS_TOF); //uncomment when ready!!
164 // Add_TimeToTrackingMatrix(locChargedTrackHypothesis, locCovarianceMatrix.get(), locTOFHitMatchParams->dFlightTimeVariance, locTOFHitMatchParams->dHitTimeVariance, locFlightTimePCorrelation); //uncomment when ready!!
165  (*locCovarianceMatrix)(6, 6) = 0.1*0.1+locTOFHitMatchParams->dFlightTimeVariance;
166  }
167 
168  //FCAL
169  if(locChargedTrackHypothesis->t1_detector() == SYS_FCAL)
170  {
171  auto locFCALShowerMatchParams = locChargedTrackHypothesis->Get_FCALShowerMatchParams();
172  const DFCALShower* locFCALShower = locFCALShowerMatchParams->dFCALShower;
173  locChargedTrackHypothesis->setTime(locFCALShower->getTime() - locFCALShowerMatchParams->dFlightTime);
174 // double locFlightTimePCorrelation = locDetectorMatches->Get_FlightTimePCorrelation(locTrackTimeBased, SYS_FCAL); //uncomment when ready!!
175 // Add_TimeToTrackingMatrix(locChargedTrackHypothesis, locCovarianceMatrix.get(), locFCALShowerMatchParams->dFlightTimeVariance, locFCALShower->dCovarianceMatrix(4, 4), locFlightTimePCorrelation); //uncomment when ready!!
176  (*locCovarianceMatrix)(6, 6) = 0.7*0.7+locFCALShowerMatchParams->dFlightTimeVariance;
177  }
178 
179  locChargedTrackHypothesis->setErrorMatrix(locCovarianceMatrix);
180 
181  //Calculate PID ChiSq, NDF, FOM
182  locChargedTrackHypothesis->Set_TimeAtPOCAToVertex(locChargedTrackHypothesis->time());
183  dPIDAlgorithm->Calc_ChargedPIDFOM(locChargedTrackHypothesis);
184 
185  return locChargedTrackHypothesis;
186 }
187 
188 void DChargedTrackHypothesis_factory::Add_TimeToTrackingMatrix(DChargedTrackHypothesis* locChargedTrackHypothesis, TMatrixFSym* locCovarianceMatrix, double locFlightTimeVariance, double locHitTimeVariance, double locFlightTimePCorrelation) const
189 {
190  DVector3 locMomentum = locChargedTrackHypothesis->momentum();
191 
192  //extract momentum 3x3 portion of covariance matrix
193  TMatrixFSym locCov_PxPyPz(3);
194  for(size_t loc_i = 0; loc_i < 3; ++loc_i)
195  {
196  for(size_t loc_j = 0; loc_j < 3; ++loc_j)
197  locCov_PxPyPz(loc_i, loc_j) = (*locCovarianceMatrix)(loc_i, loc_j);
198  }
199 
200  //convert px/py/pz to p/theta/phi
201  double locPMag = locMomentum.Mag();
202  double locPPerpSq = locMomentum.Px()*locMomentum.Px() + locMomentum.Py()*locMomentum.Py();
203  TMatrix locJ_CartSpher(3, 3); //jacobian
204  locJ_CartSpher(0, 0) = locMomentum.Px()/locPMag;
205  locJ_CartSpher(0, 1) = locMomentum.Py()/locPMag;
206  locJ_CartSpher(0, 2) = locMomentum.Pz()/locPMag;
207  locJ_CartSpher(1, 0) = locMomentum.Px()*locMomentum.Pz()/(locPMag*locPMag*sqrt(locPPerpSq));
208  locJ_CartSpher(1, 1) = locMomentum.Py()*locMomentum.Pz()/(locPMag*locPMag*sqrt(locPPerpSq));
209  locJ_CartSpher(1, 2) = sqrt(locPPerpSq)/(locPMag*locPMag);
210  locJ_CartSpher(2, 0) = -1.0*locMomentum.Py()/locPPerpSq;
211  locJ_CartSpher(2, 1) = locMomentum.Px()/locPPerpSq;
212  locJ_CartSpher(2, 2) = 0.0;
213  TMatrixFSym locCov_PThetaPhi = locCov_PxPyPz.Similarity(locJ_CartSpher);
214 
215  //add flight time and hit time to p/theta/phi covariance matrix
216  TMatrixFSym locCov_PThetaPhiFTimeHTime(5);
217  double locSigmaPMag = locCov_PThetaPhi(0, 0);
218  for(size_t loc_i = 0; loc_i < 3; ++loc_i)
219  {
220  for(size_t loc_j = 0; loc_j < 3; ++loc_j)
221  locCov_PThetaPhiFTimeHTime(loc_i, loc_j) = locCov_PThetaPhi(loc_i, loc_j);
222  }
223  locCov_PThetaPhiFTimeHTime(0, 3) = locFlightTimePCorrelation*locSigmaPMag*sqrt(locFlightTimeVariance);
224  locCov_PThetaPhiFTimeHTime(0, 4) = locFlightTimePCorrelation*locSigmaPMag*sqrt(locHitTimeVariance);
225  locCov_PThetaPhiFTimeHTime(1, 3) = 0.0;
226  locCov_PThetaPhiFTimeHTime(1, 4) = 0.0;
227  locCov_PThetaPhiFTimeHTime(2, 3) = 0.0;
228  locCov_PThetaPhiFTimeHTime(2, 4) = 0.0;
229 
230  locCov_PThetaPhiFTimeHTime(3, 0) = locFlightTimePCorrelation*locSigmaPMag*sqrt(locFlightTimeVariance);
231  locCov_PThetaPhiFTimeHTime(3, 1) = 0.0;
232  locCov_PThetaPhiFTimeHTime(3, 2) = 0.0;
233  locCov_PThetaPhiFTimeHTime(3, 3) = locFlightTimeVariance;
234  locCov_PThetaPhiFTimeHTime(3, 4) = sqrt(locFlightTimeVariance*locHitTimeVariance); //correlation = 1
235 
236  locCov_PThetaPhiFTimeHTime(4, 0) = locFlightTimePCorrelation*locSigmaPMag*sqrt(locHitTimeVariance);
237  locCov_PThetaPhiFTimeHTime(4, 1) = 0.0;
238  locCov_PThetaPhiFTimeHTime(4, 2) = 0.0;
239  locCov_PThetaPhiFTimeHTime(4, 3) = sqrt(locFlightTimeVariance*locHitTimeVariance); //correlation = 1
240  locCov_PThetaPhiFTimeHTime(4, 4) = locHitTimeVariance;
241 
242  //convert p/theta/phi/flight-time/hit-time to px/py/pz/t
243  TMatrix locJ_SpherCart(4, 5); //jacobian
244  double locTheta = locMomentum.Theta();
245  locJ_SpherCart(0, 0) = locMomentum.Px()/locPMag;
246  locJ_SpherCart(0, 1) = locMomentum.Px()/tan(locTheta);
247  locJ_SpherCart(0, 2) = -1.0*locMomentum.Py();
248  locJ_SpherCart(0, 3) = 0.0;
249  locJ_SpherCart(0, 4) = 0.0;
250  locJ_SpherCart(1, 0) = locMomentum.Py()/locPMag;
251  locJ_SpherCart(1, 1) = locMomentum.Py()/tan(locTheta);
252  locJ_SpherCart(1, 2) = locMomentum.Px();
253  locJ_SpherCart(1, 3) = 0.0;
254  locJ_SpherCart(1, 4) = 0.0;
255  locJ_SpherCart(2, 0) = locMomentum.Pz()/locPMag;
256  locJ_SpherCart(2, 1) = -1.0*locPMag*sin(locTheta);
257  locJ_SpherCart(2, 2) = 0.0;
258  locJ_SpherCart(2, 3) = 0.0;
259  locJ_SpherCart(2, 4) = 0.0;
260  locJ_SpherCart(3, 0) = 0.0;
261  locJ_SpherCart(3, 1) = 0.0;
262  locJ_SpherCart(3, 2) = 0.0;
263  locJ_SpherCart(3, 3) = -1.0;
264  locJ_SpherCart(3, 4) = 1.0;
265  TMatrixFSym locCov_PxPyPzT = locCov_PThetaPhiFTimeHTime.Similarity(locJ_SpherCart);
266 
267  //add time terms to the orignal covariance matrix
268  (*locCovarianceMatrix)(0, 6) = locCov_PxPyPzT(0, 3);
269  (*locCovarianceMatrix)(1, 6) = locCov_PxPyPzT(1, 3);
270  (*locCovarianceMatrix)(2, 6) = locCov_PxPyPzT(2, 3);
271  (*locCovarianceMatrix)(3, 6) = 0.0;
272  (*locCovarianceMatrix)(4, 6) = 0.0;
273  (*locCovarianceMatrix)(5, 6) = 0.0;
274  (*locCovarianceMatrix)(6, 0) = locCov_PxPyPzT(3, 0);
275  (*locCovarianceMatrix)(6, 1) = locCov_PxPyPzT(3, 1);
276  (*locCovarianceMatrix)(6, 2) = locCov_PxPyPzT(3, 2);
277  (*locCovarianceMatrix)(6, 3) = 0.0;
278  (*locCovarianceMatrix)(6, 4) = 0.0;
279  (*locCovarianceMatrix)(6, 5) = 0.0;
280  (*locCovarianceMatrix)(6, 6) = locCov_PxPyPzT(3, 3);
281 }
void setTime(double locTime)
void Set_DIRCMatchParams(shared_ptr< const DDIRCMatchParams > locMatchParams)
void Set_TrackTimeBased(const DTrackTimeBased *locTrackTimeBased)
TVector3 DVector3
Definition: DVector3.h:14
Definition: GlueX.h:16
double energy(void) const
shared_ptr< DResourcePool< TMatrixFSym > > dResourcePool_TMatrixFSym
void Set_FCALShowerMatchParams(shared_ptr< const DFCALShowerMatchParams > locMatchParams)
double getTime() const
Definition: DFCALShower.h:161
DResourcePool< DChargedTrackHypothesis > * dResourcePool_ChargedTrackHypothesis
bool DChargedTrackHypothesis_SortByEnergy(const DChargedTrackHypothesis *locChargedTrackHypothesis1, const DChargedTrackHypothesis *locChargedTrackHypothesis2)
const DTrackTimeBased * Get_TrackTimeBased(void) const
void Set_BCALShowerMatchParams(shared_ptr< const DBCALShowerMatchParams > locMatchParams)
bool Get_DIRCMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DDIRCMatchParams > &locBestMatchParams) const
jerror_t init(void)
Called once at program start.
double Calc_PropagatedRFTime(const DKinematicData *locKinematicData, const DEventRFBunch *locEventRFBunch) const
oid_t candidateid
id of DTrackCandidate corresponding to this track
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
Definition: GlueX.h:19
shared_ptr< const DTOFHitMatchParams > Get_TOFHitMatchParams(void) const
void Set_T0(double locT0, double locT0Error, DetectorSystem_t locT0Detector)
DChargedTrackHypothesis * Create_ChargedTrackHypothesis(JEventLoop *locEventLoop, const DTrackTimeBased *locTrackTimeBased, const DDetectorMatches *locDetectorMatches, const DEventRFBunch *locEventRFBunch)
double time(void) const
bool Get_BestTOFMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DTOFHitMatchParams > &locBestMatchParams) const
void Calc_ChargedPIDFOM(DChargedTrackHypothesis *locChargedTrackHypothesis) const
void Set_TimeAtPOCAToVertex(double locTimeAtPOCAToVertex)
bool Get_BestSCMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DSCHitMatchParams > &locBestMatchParams) const
void Add_TimeToTrackingMatrix(DChargedTrackHypothesis *locChargedTrackHypothesis, TMatrixFSym *locCovarianceMatrix, double locFlightTimeVariance, double locHitTimeVariance, double locFlightTimePCorrelation) const
void setErrorMatrix(const shared_ptr< const TMatrixFSym > &aMatrix)
Definition: GlueX.h:20
bool Get_BestFCALMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DFCALShowerMatchParams > &locBestMatchParams) const
bool Get_BestBCALMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DBCALShowerMatchParams > &locBestMatchParams) const
vector< DChargedTrackHypothesis * > dCreated
void Share_FromInput_Kinematics(const DKinematicData *locSourceData)
Definition: GlueX.h:22
DChargedTrackHypothesis * Get_Resource(void)
void Set_SCHitMatchParams(shared_ptr< const DSCHitMatchParams > locMatchParams)
double dTimeVariance
Definition: DEventRFBunch.h:31
double sqrt(double)
shared_ptr< const DFCALShowerMatchParams > Get_FCALShowerMatchParams(void) const
double sin(double)
const DVector3 & momentum(void) const
DetectorSystem_t dTimeSource
Definition: DEventRFBunch.h:28
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
void Set_TOFHitMatchParams(shared_ptr< const DTOFHitMatchParams > locMatchParams)
void Set_ControlParams(size_t locGetBatchSize, size_t locNumToAllocateAtOnce, size_t locMaxLocalPoolSize)
shared_ptr< const DBCALShowerMatchParams > Get_BCALShowerMatchParams(void) const
shared_ptr< const TMatrixFSym > errorMatrix(void) const
DetectorSystem_t t1_detector(void) const
void Recycle(const DType *locResource)