Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DVertex_factory.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DVertex_factory.cc
4 // Created: Tue Apr 6 17:01:54 EDT 2010
5 // Creator: davidl (on Darwin Amelia.local 9.8.0 i386)
6 //
7 
8 #include "DVertex_factory.h"
9 
10 //------------------
11 // init
12 //------------------
13 jerror_t DVertex_factory::init(void)
14 {
16  dMinTrackingFOM = 5.73303E-7;
17  dNoKinematicFitFlag = false;
18  return NOERROR;
19 }
20 
21 //------------------
22 // brun
23 //------------------
24 jerror_t DVertex_factory::brun(jana::JEventLoop* locEventLoop, int32_t runnumber)
25 {
26  dKinFitUtils = new DKinFitUtils_GlueX(locEventLoop);
29 
30  // Get Target parameters from XML
31  dTargetZCenter = 65.0;
32  dTargetLength = 30.0;
33  dTargetRadius = 1.5; //FIX: grab from database!!!
34  DApplication* locApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication());
35  DGeometry* locGeometry = locApplication->GetDGeometry(locEventLoop->GetJEvent().GetRunNumber());
36  locGeometry->GetTargetZ(dTargetZCenter);
37  locGeometry->GetTargetLength(dTargetLength);
38 
39  gPARMS->SetDefaultParameter("VERTEX:NO_KINFIT_FLAG", dNoKinematicFitFlag);
40  gPARMS->SetDefaultParameter("VERTEX:DEBUGLEVEL", dKinFitDebugLevel);
41 
43 
44  locEventLoop->GetSingle(dAnalysisUtilities);
45 
46  return NOERROR;
47 }
48 
49 //------------------
50 // evnt
51 //------------------
52 jerror_t DVertex_factory::evnt(JEventLoop* locEventLoop, uint64_t eventnumber)
53 {
54  //preferentially (kinematic fit):
55  //use tracks with a matched hit & good tracking FOM
56  //if no good tracks (or none with matched hits), use all tracks
57  //if no tracks, use target center
58 
59  vector<const DTrackTimeBased*> locTrackTimeBasedVector;
60  locEventLoop->Get(locTrackTimeBasedVector);
61 
62  const DEventRFBunch* locEventRFBunch = NULL;
63  locEventLoop->GetSingle(locEventRFBunch);
64 
65  const DDetectorMatches* locDetectorMatches = NULL;
66  locEventLoop->GetSingle(locDetectorMatches);
67 
68  //select the best DTrackTimeBased for each track: use best tracking FOM
69  map<JObject::oid_t, const DTrackTimeBased*> locBestTrackTimeBasedMap; //lowest tracking chisq/ndf for each candidate id
70  for(size_t loc_i = 0; loc_i < locTrackTimeBasedVector.size(); ++loc_i)
71  {
72  JObject::oid_t locCandidateID = locTrackTimeBasedVector[loc_i]->candidateid;
73  if(locBestTrackTimeBasedMap.find(locCandidateID) == locBestTrackTimeBasedMap.end())
74  locBestTrackTimeBasedMap[locCandidateID] = locTrackTimeBasedVector[loc_i];
75  else if(locTrackTimeBasedVector[loc_i]->FOM > locBestTrackTimeBasedMap[locCandidateID]->FOM)
76  locBestTrackTimeBasedMap[locCandidateID] = locTrackTimeBasedVector[loc_i];
77  }
78 
79  //separate the tracks based on high/low tracking FOM & has hit-match
80  map<JObject::oid_t, const DTrackTimeBased*>::iterator locIterator;
81  vector<const DTrackTimeBased*> locTrackTimeBasedVector_OnePerTrack, locTrackTimeBasedVector_OnePerTrack_Good;
82  for(locIterator = locBestTrackTimeBasedMap.begin(); locIterator != locBestTrackTimeBasedMap.end(); ++locIterator)
83  {
84  const DTrackTimeBased* locTrackTimeBased = locIterator->second;
85  locTrackTimeBasedVector_OnePerTrack.push_back(locTrackTimeBased);
86  if((locTrackTimeBased->FOM >= dMinTrackingFOM) && locDetectorMatches->Get_IsMatchedToHit(locTrackTimeBased))
87  locTrackTimeBasedVector_OnePerTrack_Good.push_back(locTrackTimeBased);
88  }
89 
90  vector<const DTrackTimeBased*> locTrackTimeBasedVectorToUse = (locTrackTimeBasedVector_OnePerTrack_Good.size() >= 2) ? locTrackTimeBasedVector_OnePerTrack_Good : locTrackTimeBasedVector_OnePerTrack;
91 
92  //handle cases of no/one track
93  if(locTrackTimeBasedVectorToUse.empty())
94  return Create_Vertex_NoTracks(locEventRFBunch);
95  if(locTrackTimeBasedVectorToUse.size() == 1)
96  return Create_Vertex_OneTrack(locTrackTimeBasedVectorToUse[0], locEventRFBunch);
97 
98  // first calculate a rough vertex
99  DVector3 locRoughPosition = dAnalysisUtilities->Calc_CrudeVertex(locTrackTimeBasedVectorToUse);
100 
101  // if only want rough guess, save it and exit
102  if(dNoKinematicFitFlag || (locTrackTimeBasedVectorToUse[0]->errorMatrix() == nullptr))
103  return Create_Vertex_Rough(locRoughPosition, locEventRFBunch);
104 
105  //prepare for kinematic fit
108  TVector3 locTRoughPosition(locRoughPosition.X(), locRoughPosition.Y(), locRoughPosition.Z());
109 
110  // create particles for kinematic fit
111  set<shared_ptr<DKinFitParticle>> locKinFitParticles;
112  for(size_t loc_i = 0; loc_i < locTrackTimeBasedVectorToUse.size(); ++loc_i)
113  locKinFitParticles.insert(dKinFitUtils->Make_DetectedParticle(locTrackTimeBasedVectorToUse[loc_i]));
114 
115  // create vertex constraint
116  auto locVertexConstraint = dKinFitUtils->Make_VertexConstraint(locKinFitParticles, {}, locTRoughPosition);
117  dKinFitter->Add_Constraint(locVertexConstraint);
118 
119  // fit, save, and return
120  if(!dKinFitter->Fit_Reaction()) //if fit fails to converge: use rough results
121  return Create_Vertex_Rough(locRoughPosition, locEventRFBunch);
122 
123  //save kinfit results
124  return Create_Vertex_KinFit(locEventRFBunch);
125 }
126 
128 {
129  DVertex* locVertex = new DVertex();
130  locVertex->dSpacetimeVertex = DLorentzVector(DVector3(0.0, 0.0, dTargetZCenter), locEventRFBunch->dTime);
131  locVertex->dKinFitNDF = 0;
132  locVertex->dKinFitChiSq = 0.0;
133 
134  //error matrix
135  locVertex->dCovarianceMatrix.ResizeTo(4, 4);
136  locVertex->dCovarianceMatrix.Zero();
137  locVertex->dCovarianceMatrix(0, 0) = dTargetRadius*dTargetRadius/12.0; //x variance //should instead use beam spot size
138  locVertex->dCovarianceMatrix(1, 1) = dTargetRadius*dTargetRadius/12.0; //y variance //should instead use beam spot size
139  locVertex->dCovarianceMatrix(2, 2) = dTargetLength*dTargetLength/12.0; //z variance
140  locVertex->dCovarianceMatrix(3, 3) = locEventRFBunch->dTimeVariance; //t variance
141 
142  _data.push_back(locVertex);
143  return NOERROR;
144 }
145 
146 jerror_t DVertex_factory::Create_Vertex_OneTrack(const DTrackTimeBased* locTrackTimeBased, const DEventRFBunch* locEventRFBunch)
147 {
148  DVector3 locPosition = locTrackTimeBased->position();
149  double locTime = locEventRFBunch->dTime + (locPosition.Z() - dTargetZCenter)/29.9792458;
150 
151  DVertex* locVertex = new DVertex();
152  locVertex->dSpacetimeVertex = DLorentzVector(locPosition, locTime);
153  locVertex->dKinFitNDF = 0;
154  locVertex->dKinFitChiSq = 0.0;
155 
156  //error matrix
157  if(locTrackTimeBased->errorMatrix() != nullptr)
158  {
159  const TMatrixFSym& locTrackErrorMatrix = *(locTrackTimeBased->errorMatrix());
160  locVertex->dCovarianceMatrix.ResizeTo(4, 4);
161  locVertex->dCovarianceMatrix.Zero();
162  for(size_t loc_i = 0; loc_i < 3; ++loc_i)
163  {
164  for(size_t loc_j = 0; loc_j < 3; ++loc_j)
165  locVertex->dCovarianceMatrix(loc_i, loc_j) = locTrackErrorMatrix(loc_i + 3, loc_j + 3);
166  }
167  locVertex->dCovarianceMatrix(3, 3) = locEventRFBunch->dTimeVariance; //t variance
168  }
169 
170  _data.push_back(locVertex);
171  return NOERROR;
172 }
173 
174 jerror_t DVertex_factory::Create_Vertex_Rough(DVector3 locPosition, const DEventRFBunch* locEventRFBunch)
175 {
176  double locTime = locEventRFBunch->dTime + (locPosition.Z() - dTargetZCenter)/29.9792458;
177 
178  DVertex* locVertex = new DVertex();
179  locVertex->dSpacetimeVertex = DLorentzVector(locPosition, locTime);
180  locVertex->dKinFitNDF = 0;
181  locVertex->dKinFitChiSq = 0.0;
182 
183  //error matrix //too lazy to compute properly right now ... need to hack DAnalysisUtilities::Calc_DOCA()
184  locVertex->dCovarianceMatrix.ResizeTo(4, 4);
185  locVertex->dCovarianceMatrix.Zero();
186  locVertex->dCovarianceMatrix(0, 0) = 0.65; //x variance //from monitoring plots of vertex
187  locVertex->dCovarianceMatrix(1, 1) = 0.65; //y variance //from monitoring plots of vertex
188  locVertex->dCovarianceMatrix(2, 2) = 1.5; //z variance //a guess, semi-guarding against the worst case scenario //ugh
189  locVertex->dCovarianceMatrix(3, 3) = locEventRFBunch->dTimeVariance; //t variance
190 
191  _data.push_back(locVertex);
192  return NOERROR;
193 }
194 
195 jerror_t DVertex_factory::Create_Vertex_KinFit(const DEventRFBunch* locEventRFBunch)
196 {
197  auto locResultVertexConstraint = std::dynamic_pointer_cast<DKinFitConstraint_Vertex>(*dKinFitter->Get_KinFitConstraints().begin());
198 
199  TVector3 locFitVertex = locResultVertexConstraint->Get_CommonVertex();
200  DVector3 locDFitVertex(locFitVertex.X(), locFitVertex.Y(), locFitVertex.Z());
201  double locTime = locEventRFBunch->dTime + (locDFitVertex.Z() - dTargetZCenter)/29.9792458;
202 
203  DVertex* locVertex = new DVertex();
204  locVertex->dSpacetimeVertex = DLorentzVector(locDFitVertex, locTime);
205  locVertex->dKinFitNDF = dKinFitter->Get_NDF();
206  locVertex->dKinFitChiSq = dKinFitter->Get_ChiSq();
207 
208  //error matrix
209  const TMatrixDSym& locMatrixDSym = dKinFitter->Get_VXi();
210  locVertex->dCovarianceMatrix.ResizeTo(4, 4);
211  locVertex->dCovarianceMatrix.Zero();
212  for(size_t loc_i = 0; loc_i < 3; ++loc_i)
213  {
214  for(size_t loc_j = 0; loc_j < 3; ++loc_j)
215  locVertex->dCovarianceMatrix(loc_i, loc_j) = locMatrixDSym(loc_i, loc_j);
216  }
217  locVertex->dCovarianceMatrix(3, 3) = locEventRFBunch->dTimeVariance; //t variance
218 
219  //Particle Maps & Pulls
220  //Build pulls from this:
221  map<shared_ptr<DKinFitParticle>, map<DKinFitPullType, double> > locPulls_KinFitParticle;
222  dKinFitter->Get_Pulls(locPulls_KinFitParticle);
223 
224  //By looping over the pulls:
225  auto locMapIterator = locPulls_KinFitParticle.begin();
226  for(; locMapIterator != locPulls_KinFitParticle.end(); ++locMapIterator)
227  {
228  auto locOutputKinFitParticle = locMapIterator->first;
229  auto locInputKinFitParticle = dKinFitUtils->Get_InputKinFitParticle(locOutputKinFitParticle);
230 
231  const JObject* locSourceJObject = dKinFitUtils->Get_SourceJObject(locInputKinFitParticle);
232  locVertex->dKinFitPulls[locSourceJObject] = locMapIterator->second;
233  }
234 
235  _data.push_back(locVertex);
236 
237  return NOERROR;
238 }
void Reset_NewEvent(void)
Definition: DKinFitter.cc:71
shared_ptr< DKinFitConstraint_Vertex > Make_VertexConstraint(const set< shared_ptr< DKinFitParticle >> &locFullConstrainParticles, const set< shared_ptr< DKinFitParticle >> &locNoConstrainParticles, TVector3 locVertexGuess=TVector3())
void Set_UpdateCovarianceMatricesFlag(bool locUpdateCovarianceMatricesFlag)
Definition: DKinFitUtils.h:52
bool Fit_Reaction(void)
Definition: DKinFitter.cc:723
jerror_t Create_Vertex_NoTracks(const DEventRFBunch *locEventRFBunch)
TVector3 Get_CommonVertex(void) const
DKinFitter * dKinFitter
TVector3 DVector3
Definition: DVector3.h:14
unsigned int dKinFitNDF
Definition: DVertex.h:31
const DVector3 & position(void) const
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
shared_ptr< DKinFitParticle > Make_DetectedParticle(const DKinematicData *locKinematicData)
DKinFitUtils_GlueX * dKinFitUtils
TLorentzVector DLorentzVector
void Add_Constraint(const shared_ptr< DKinFitConstraint > &locKinFitConstraint)
Definition: DKinFitter.h:54
jerror_t Create_Vertex_OneTrack(const DTrackTimeBased *locTrackTimeBased, const DEventRFBunch *locEventRFBunch)
jerror_t init(void)
Called once at program start.
map< const JObject *, map< DKinFitPullType, double > > dKinFitPulls
Definition: DVertex.h:33
DVector3 Calc_CrudeVertex(const vector< const DKinematicData * > &locParticles) const
DGeometry * GetDGeometry(unsigned int run_number)
set< shared_ptr< DKinFitConstraint > > Get_KinFitConstraints(void) const
Definition: DKinFitter.h:99
unsigned int Get_NDF(void) const
Definition: DKinFitter.h:90
void Set_DebugLevel(int locDebugLevel)
Definition: DKinFitter.cc:107
bool Get_IsMatchedToHit(const DTrackingData *locTrack) const
DLorentzVector dSpacetimeVertex
Definition: DVertex.h:28
double Get_ChiSq(void) const
Definition: DKinFitter.h:88
double dTimeVariance
Definition: DEventRFBunch.h:31
jerror_t Create_Vertex_KinFit(const DEventRFBunch *locEventRFBunch)
void Get_Pulls(map< shared_ptr< DKinFitParticle >, map< DKinFitPullType, double > > &locPulls) const
Definition: DKinFitter.h:91
const JObject * Get_SourceJObject(const shared_ptr< DKinFitParticle > &locInputKinFitParticle) const
const TMatrixDSym & Get_VXi(void)
Definition: DKinFitter.h:95
TMatrixFSym dCovarianceMatrix
Definition: DVertex.h:29
shared_ptr< DKinFitParticle > Get_InputKinFitParticle(const shared_ptr< DKinFitParticle > &locKinFitParticle) const
Definition: DKinFitUtils.h:203
double dKinFitChiSq
Definition: DVertex.h:32
shared_ptr< const TMatrixFSym > errorMatrix(void) const
bool GetTargetLength(double &target_length) const
z-location of center of target
Definition: DGeometry.cc:1972
bool GetTargetZ(double &z_target) const
z-location of center of target
Definition: DGeometry.cc:1933
const DAnalysisUtilities * dAnalysisUtilities
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
jerror_t Create_Vertex_Rough(DVector3 locPosition, const DEventRFBunch *locEventRFBunch)