Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DNeutralParticleHypothesis_factory.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DNeutralParticleHypothesis_factory.cc
4 // Created: Thu Dec 3 17:27:55 EST 2009
5 // Creator: pmatt (on Linux ifarml6 2.6.18-128.el5 x86_64)
6 //
7 
8 
9 #include <iostream>
10 #include <iomanip>
11 using namespace std;
12 
13 #include <TMath.h>
14 
16 using namespace jana;
17 
18 //------------------
19 // init
20 //------------------
22 {
23  //Setting this flag makes it so that JANA does not delete the objects in _data. This factory will manage this memory.
24  SetFactoryFlag(NOT_OBJECT_OWNER);
25  dResourcePool_NeutralParticleHypothesis = new DResourcePool<DNeutralParticleHypothesis>();
26  dResourcePool_NeutralParticleHypothesis->Set_ControlParams(50, 20, 400, 4000, 0);
27  dResourcePool_TMatrixFSym = std::make_shared<DResourcePool<TMatrixFSym>>();
28  dResourcePool_TMatrixFSym->Set_ControlParams(50, 20, 1000, 15000, 0);
29 
30  gPARMS->SetDefaultParameter("COMBO:MAX_MASSIVE_NEUTRAL_BETA", dMaxMassiveNeutralBeta);
31 
32  return NOERROR;
33 }
34 
35 //------------------
36 // brun
37 //------------------
38 jerror_t DNeutralParticleHypothesis_factory::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
39 {
40  // Get Target parameters from XML
41  DApplication *locApplication = dynamic_cast<DApplication*> (locEventLoop->GetJApplication());
42  DGeometry *locGeometry = locApplication ? locApplication->GetDGeometry(runnumber):NULL;
43  locGeometry->GetTargetZ(dTargetCenterZ);
44  locEventLoop->GetSingle(dParticleID);
45 
46  return NOERROR;
47 }
48 
49 //------------------
50 // evnt
51 //------------------
52 jerror_t DNeutralParticleHypothesis_factory::evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
53 {
54  dResourcePool_NeutralParticleHypothesis->Recycle(dCreated);
55  dCreated.clear();
56  _data.clear();
57 
58  vector<const DNeutralShower*> locNeutralShowers;
59  locEventLoop->Get(locNeutralShowers);
60 
61  vector<Particle_t> locPIDHypotheses;
62  locPIDHypotheses.push_back(Gamma);
63 
64  const DEventRFBunch* locEventRFBunch = NULL;
65  locEventLoop->GetSingle(locEventRFBunch);
66 
67  const DVertex* locVertex = NULL;
68  locEventLoop->GetSingle(locVertex);
69 
70  // Loop over DNeutralShowers
71  for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i)
72  {
73  const DNeutralShower *locNeutralShower = locNeutralShowers[loc_i];
74  // Loop over vertices and PID hypotheses & create DNeutralParticleHypotheses for each combination
75  for(size_t loc_j = 0; loc_j < locPIDHypotheses.size(); ++loc_j)
76  {
77  DNeutralParticleHypothesis* locNeutralParticleHypothesis = Create_DNeutralParticleHypothesis(locNeutralShower, locPIDHypotheses[loc_j], locEventRFBunch, locVertex->dSpacetimeVertex, &locVertex->dCovarianceMatrix);
78  if(locNeutralParticleHypothesis != NULL)
79  _data.push_back(locNeutralParticleHypothesis);
80  }
81  }
82 
83  dCreated = _data;
84  return NOERROR;
85 }
86 
87 DNeutralParticleHypothesis* DNeutralParticleHypothesis_factory::Create_DNeutralParticleHypothesis(const DNeutralShower* locNeutralShower, Particle_t locPID, const DEventRFBunch* locEventRFBunch, const DLorentzVector& dSpacetimeVertex, const TMatrixFSym* locVertexCovMatrix)
88 {
89  DVector3 locVertexGuess = dSpacetimeVertex.Vect();
90  double locStartTime = dSpacetimeVertex.T();
91 
92  double locHitTime = locNeutralShower->dSpacetimeVertex.T();
93  DVector3 locHitPoint = locNeutralShower->dSpacetimeVertex.Vect();
94 
95  // Calculate DNeutralParticleHypothesis Quantities (projected time at vertex for given id, etc.)
96  double locMass = ParticleMass(locPID);
97 
98  DVector3 locPath = locHitPoint - locVertexGuess;
99  double locPathLength = locPath.Mag();
100  if(!(locPathLength > 0.0))
101  return NULL; //invalid, will divide by zero when creating error matrix, so skip!
102 
103  DVector3 locMomentum(locPath);
104  shared_ptr<TMatrixFSym> locParticleCovariance = (locVertexCovMatrix != nullptr) ? dResourcePool_TMatrixFSym->Get_SharedResource() : nullptr;
105  if(locParticleCovariance != nullptr)
106  locParticleCovariance->ResizeTo(7, 7);
107 
108  double locProjectedTime = 0.0, locPMag = 0.0;
109  if(locPID != Gamma)
110  {
111  double locDeltaT = locHitTime - locStartTime;
112  double locBeta = locPathLength/(locDeltaT*29.9792458);
113  if(locBeta >= 1.0)
114  locBeta = dMaxMassiveNeutralBeta;
115  if(locBeta < 0.0)
116  locBeta = 0.0;
117  double locGamma = 1.0/sqrt(1.0 - locBeta*locBeta);
118  locPMag = locGamma*locBeta*locMass;
119  locMomentum.SetMag(locPMag);
120 
121 //cout << "DNeutralParticleHypothesis_factory: pid, mass, shower-z, vertex-z, path, shower t, rf t, delta-t, beta, pmag = " << locPID << ", " << locMass << ", " << locHitPoint.Z() << ", " << locVertexGuess.Z() << ", " << locPathLength << ", " << locHitTime << ", " << locStartTime << ", " << locDeltaT << ", " << locBeta << ", " << locPMag << endl;
122 
123  locProjectedTime = locStartTime + (locVertexGuess.Z() - dTargetCenterZ)/29.9792458;
124  if(locVertexCovMatrix != nullptr)
125  Calc_ParticleCovariance_Massive(locNeutralShower, locVertexCovMatrix, locMass, locDeltaT, locMomentum, locPath, locParticleCovariance.get());
126  }
127  else
128  {
129  locPMag = locNeutralShower->dEnergy;
130  double locFlightTime = locPathLength/29.9792458;
131  locProjectedTime = locHitTime - locFlightTime;
132  locMomentum.SetMag(locPMag);
133  if(locVertexCovMatrix != nullptr)
134  Calc_ParticleCovariance_Photon(locNeutralShower, locVertexCovMatrix, locMomentum, locPath, locParticleCovariance.get());
135  }
136 
137  // Build DNeutralParticleHypothesis // dEdx not set
138  DNeutralParticleHypothesis* locNeutralParticleHypothesis = Get_Resource();
139  locNeutralParticleHypothesis->Set_NeutralShower(locNeutralShower);
140  locNeutralParticleHypothesis->setPID(locPID);
141  locNeutralParticleHypothesis->setMomentum(locMomentum);
142  locNeutralParticleHypothesis->setPosition(locVertexGuess);
143  locNeutralParticleHypothesis->setTime(locProjectedTime);
144  locNeutralParticleHypothesis->Set_T0(locStartTime, sqrt(locEventRFBunch->dTimeVariance), locEventRFBunch->dTimeSource);
145  locNeutralParticleHypothesis->setErrorMatrix(locParticleCovariance);
146 
147  // Calculate DNeutralParticleHypothesis FOM
148  unsigned int locNDF = 0;
149  double locChiSq = 0.0;
150  double locFOM = -1.0; //undefined for non-photons
151  if(locPID == Gamma)
152  {
153  double locTimePull = 0.0;
154  locChiSq = dParticleID->Calc_TimingChiSq(locNeutralParticleHypothesis, locNDF, locTimePull);
155  locFOM = TMath::Prob(locChiSq, locNDF);
156  }
157  locNeutralParticleHypothesis->Set_ChiSq_Overall(locChiSq, locNDF, locFOM);
158  return locNeutralParticleHypothesis;
159 }
160 
161 void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Photon(const DNeutralShower* locNeutralShower, const TMatrixFSym* locVertexCovMatrix, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const
162 {
163  //build 8x8 matrix: 5x5 shower, 3x3 vertex position
164  TMatrixFSym locShowerPlusVertCovariance(8);
165  for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) //shower: e, x, y, z, t
166  {
167  for(unsigned int loc_m = 0; loc_m < 5; ++loc_m)
168  locShowerPlusVertCovariance(loc_l, loc_m) = (*(locNeutralShower->dCovarianceMatrix))(loc_l, loc_m);
169  }
170  for(unsigned int loc_l = 0; loc_l < 3; ++loc_l) //vertex xyz
171  {
172  for(unsigned int loc_m = 0; loc_m < 3; ++loc_m)
173  locShowerPlusVertCovariance(5 + loc_l, 5 + loc_m) = (*locVertexCovMatrix)(loc_l, loc_m);
174  }
175 
176  //the input delta X is defined as "hit - start"
177  //however, the documentation and derivations define delta x as "start - hit"
178  //so, reverse the sign of the inputs to match the documentation
179  //and then the rest will follow the documentation
180  DVector3 locDeltaX = -1.0*locPathVector;
181  DVector3 locDeltaXOverDeltaXSq = (1.0/locDeltaX.Mag2())*locDeltaX;
182  DVector3 locUnitP = (1.0/locNeutralShower->dEnergy)*locMomentum;
183  DVector3 locUnitDeltaXOverC = (1.0/(29.9792458*locDeltaX.Mag()))*locDeltaX;
184 
185  //build transform matrix
186  TMatrix locTransformMatrix(7, 8);
187 
188  locTransformMatrix(0, 0) = locUnitP.X(); //partial deriv of px wrst shower-e
189  locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaXSq.X() - 1.0/locDeltaX.X()); //partial deriv of px wrst shower-x
190  locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX.Mag2(); //partial deriv of px wrst shower-y
191  locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX.Mag2(); //partial deriv of px wrst shower-z
192  locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); //partial deriv of px wrst vert-x
193  locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); //partial deriv of px wrst vert-y
194  locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); //partial deriv of px wrst vert-z
195 
196  locTransformMatrix(1, 0) = locUnitP.Y(); //partial deriv of py wrst shower-e
197  locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX.Mag2(); //partial deriv of py wrst shower-x
198  locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaXSq.Y() - 1.0/locDeltaX.Y()); //partial deriv of py wrst shower-y
199  locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX.Mag2(); //partial deriv of py wrst shower-z
200  locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); //partial deriv of py wrst vert-x
201  locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); //partial deriv of py wrst vert-y
202  locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); //partial deriv of py wrst vert-z
203 
204  locTransformMatrix(2, 0) = locUnitP.Z(); //partial deriv of pz wrst shower-e
205  locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX.Mag2(); //partial deriv of pz wrst shower-x
206  locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX.Mag2(); //partial deriv of pz wrst shower-y
207  locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaXSq.Z() - 1.0/locDeltaX.Z()); //partial deriv of pz wrst shower-z
208  locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); //partial deriv of pz wrst vert-x
209  locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); //partial deriv of pz wrst vert-y
210  locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); //partial deriv of pz wrst vert-z
211 
212  locTransformMatrix(3, 5) = 1.0; //partial deriv of x wrst vertex-x
213  locTransformMatrix(4, 6) = 1.0; //partial deriv of y wrst vertex-y
214  locTransformMatrix(5, 7) = 1.0; //partial deriv of z wrst vertex-z
215 
216  locTransformMatrix(6, 0) = 0.0; //partial deriv of t wrst shower-e //beta defined = 1
217  locTransformMatrix(6, 1) = locUnitDeltaXOverC.X(); //partial deriv of t wrst shower-x
218  locTransformMatrix(6, 2) = locUnitDeltaXOverC.Y(); //partial deriv of t wrst shower-y
219  locTransformMatrix(6, 3) = locUnitDeltaXOverC.Z(); //partial deriv of t wrst shower-z
220  locTransformMatrix(6, 4) = 1.0; //partial deriv of t wrst shower-t
221  locTransformMatrix(6, 5) = -1.0*locTransformMatrix(6, 1); //partial deriv of t wrst vert-x
222  locTransformMatrix(6, 6) = -1.0*locTransformMatrix(6, 2); //partial deriv of t wrst vert-y
223  locTransformMatrix(6, 7) = -1.0*locTransformMatrix(6, 3); //partial deriv of t wrst vert-z
224 
225  //convert
226  *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix);
227 }
228 
229 void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Massive(const DNeutralShower* locNeutralShower, const TMatrixFSym* locVertexCovMatrix, double locMass, double locDeltaT, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const
230 {
231  //build 9x9 matrix: 5x5 shower, 4x4 vertex position & time
232  TMatrixFSym locShowerPlusVertCovariance(9);
233  for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) //shower: e, x, y, z, t
234  {
235  for(unsigned int loc_m = 0; loc_m < 5; ++loc_m)
236  locShowerPlusVertCovariance(loc_l, loc_m) = (*(locNeutralShower->dCovarianceMatrix))(loc_l, loc_m);
237  }
238  for(unsigned int loc_l = 0; loc_l < 4; ++loc_l) //vertex xyzt
239  {
240  for(unsigned int loc_m = 0; loc_m < 4; ++loc_m)
241  locShowerPlusVertCovariance(5 + loc_l, 5 + loc_m) = (*locVertexCovMatrix)(loc_l, loc_m);
242  }
243 
244  //the input delta X/t are defined as "hit - start"
245  //however, the documentation and derivations define delta x/t as "start - hit"
246  //so, reverse the sign of the inputs to match the documentation
247  //and then the rest will follow the documentation
248  DVector3 locDeltaX = -1.0*locPathVector;
249  locDeltaT *= -1.0;
250  double locCSq = 29.9792458*29.9792458;
251  double locCDeltaTSq = locCSq*locDeltaT*locDeltaT;
252  double locDeltaX4Sq = locCDeltaTSq - locDeltaX.Mag2();
253  DVector3 locDeltaXOverDeltaX4Sq = (1.0/locDeltaX4Sq)*locDeltaX;
254  DVector3 locEPVecOverPSq = (locNeutralShower->dEnergy/locMomentum.Mag2())*locMomentum;
255  DVector3 locEPVecOverCPMagDeltaXMag = (locNeutralShower->dEnergy/(29.9792458*locDeltaX.Mag()*locMomentum.Mag()))*locDeltaX;
256 
257  //build transform matrix
258  TMatrix locTransformMatrix(7, 9);
259 
260  locTransformMatrix(0, 0) = 0.0; //partial deriv of px wrst shower-e
261  locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaX4Sq.X() + 1.0/locDeltaX.X()); //partial deriv of px wrst shower-x
262  locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX4Sq; //partial deriv of px wrst shower-y
263  locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX4Sq; //partial deriv of px wrst shower-z
264  locTransformMatrix(0, 4) = locDeltaT*locCSq*locMomentum.Px()/locDeltaX4Sq; //partial deriv of px wrst shower-t
265  locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); //partial deriv of px wrst vert-x
266  locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); //partial deriv of px wrst vert-y
267  locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); //partial deriv of px wrst vert-z
268  locTransformMatrix(0, 8) = -1.0*locTransformMatrix(0, 4); //partial deriv of px wrst vert-t
269 
270  locTransformMatrix(1, 0) = 0.0; //partial deriv of py wrst shower-e
271  locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX4Sq; //partial deriv of py wrst shower-x
272  locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaX4Sq.Y() + 1.0/locDeltaX.Y()); //partial deriv of py wrst shower-y
273  locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX4Sq; //partial deriv of py wrst shower-z
274  locTransformMatrix(1, 4) = locDeltaT*locCSq*locMomentum.Py()/locDeltaX4Sq; //partial deriv of py wrst shower-t
275  locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); //partial deriv of py wrst vert-x
276  locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); //partial deriv of py wrst vert-y
277  locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); //partial deriv of py wrst vert-z
278  locTransformMatrix(1, 8) = -1.0*locTransformMatrix(1, 4); //partial deriv of py wrst vert-t
279 
280  locTransformMatrix(2, 0) = 0.0; //partial deriv of pz wrst shower-e
281  locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX4Sq; //partial deriv of pz wrst shower-x
282  locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX4Sq; //partial deriv of pz wrst shower-y
283  locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaX4Sq.Z() + 1.0/locDeltaX.Z()); //partial deriv of pz wrst shower-z
284  locTransformMatrix(2, 4) = locDeltaT*locCSq*locMomentum.Pz()/locDeltaX4Sq; //partial deriv of pz wrst shower-t
285  locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); //partial deriv of pz wrst vert-x
286  locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); //partial deriv of pz wrst vert-y
287  locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); //partial deriv of pz wrst vert-z
288  locTransformMatrix(2, 8) = -1.0*locTransformMatrix(2, 4); //partial deriv of pz wrst vert-t
289 
290  locTransformMatrix(3, 5) = 1.0; //partial deriv of x wrst vertex-x
291  locTransformMatrix(4, 6) = 1.0; //partial deriv of y wrst vertex-y
292  locTransformMatrix(5, 7) = 1.0; //partial deriv of z wrst vertex-z
293  locTransformMatrix(6, 8) = 1.0; //partial deriv of t wrst vertex-t
294 
295  //convert
296  *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix);
297 }
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
void setMomentum(const DVector3 &aMomentum)
void Set_T0(double locT0, double locT0Error, DetectorSystem_t locT0Detector)
void setTime(double locTime)
DNeutralParticleHypothesis * Create_DNeutralParticleHypothesis(const DNeutralShower *locNeutralShower, Particle_t locPID, const DEventRFBunch *locEventRFBunch, const DLorentzVector &dSpacetimeVertex, const TMatrixFSym *locVertexCovMatrix)
void Calc_ParticleCovariance_Photon(const DNeutralShower *locNeutralShower, const TMatrixFSym *locVertexCovMatrix, const DVector3 &locMomentum, const DVector3 &locPathVector, TMatrixFSym *locParticleCovariance) const
TVector3 DVector3
Definition: DVector3.h:14
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
void Set_ChiSq_Overall(double locChiSq, unsigned int locNDF, double locFOM)
TLorentzVector DLorentzVector
jerror_t init(void)
Called once at program start.
DLorentzVector dSpacetimeVertex
void setErrorMatrix(const shared_ptr< const TMatrixFSym > &aMatrix)
DGeometry * GetDGeometry(unsigned int run_number)
void Set_NeutralShower(const DNeutralShower *locNeutralShower)
shared_ptr< TMatrixFSym > dCovarianceMatrix
DLorentzVector dSpacetimeVertex
Definition: DVertex.h:28
double dTimeVariance
Definition: DEventRFBunch.h:31
void Calc_ParticleCovariance_Massive(const DNeutralShower *locNeutralShower, const TMatrixFSym *locVertexCovMatrix, double locMass, double locDeltaT, const DVector3 &locMomentum, const DVector3 &locPathVector, TMatrixFSym *locParticleCovariance) const
void setPID(Particle_t locPID)
static double ParticleMass(Particle_t p)
double sqrt(double)
TMatrixFSym dCovarianceMatrix
Definition: DVertex.h:29
DetectorSystem_t dTimeSource
Definition: DEventRFBunch.h:28
void Set_ControlParams(size_t locGetBatchSize, size_t locNumToAllocateAtOnce, size_t locMaxLocalPoolSize)
void setPosition(const DVector3 &aPosition)
bool GetTargetZ(double &z_target) const
z-location of center of target
Definition: DGeometry.cc:1933
Particle_t
Definition: particleType.h:12