24 SetFactoryFlag(NOT_OBJECT_OWNER);
27 dResourcePool_TMatrixFSym = std::make_shared<DResourcePool<TMatrixFSym>>();
28 dResourcePool_TMatrixFSym->Set_ControlParams(50, 20, 1000, 15000, 0);
30 gPARMS->SetDefaultParameter(
"COMBO:MAX_MASSIVE_NEUTRAL_BETA", dMaxMassiveNeutralBeta);
44 locEventLoop->GetSingle(dParticleID);
54 dResourcePool_NeutralParticleHypothesis->Recycle(dCreated);
58 vector<const DNeutralShower*> locNeutralShowers;
59 locEventLoop->Get(locNeutralShowers);
61 vector<Particle_t> locPIDHypotheses;
62 locPIDHypotheses.push_back(
Gamma);
65 locEventLoop->GetSingle(locEventRFBunch);
67 const DVertex* locVertex = NULL;
68 locEventLoop->GetSingle(locVertex);
71 for(
size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i)
75 for(
size_t loc_j = 0; loc_j < locPIDHypotheses.size(); ++loc_j)
78 if(locNeutralParticleHypothesis != NULL)
79 _data.push_back(locNeutralParticleHypothesis);
89 DVector3 locVertexGuess = dSpacetimeVertex.Vect();
90 double locStartTime = dSpacetimeVertex.T();
98 DVector3 locPath = locHitPoint - locVertexGuess;
99 double locPathLength = locPath.Mag();
100 if(!(locPathLength > 0.0))
104 shared_ptr<TMatrixFSym> locParticleCovariance = (locVertexCovMatrix !=
nullptr) ? dResourcePool_TMatrixFSym->Get_SharedResource() :
nullptr;
105 if(locParticleCovariance !=
nullptr)
106 locParticleCovariance->ResizeTo(7, 7);
108 double locProjectedTime = 0.0, locPMag = 0.0;
111 double locDeltaT = locHitTime - locStartTime;
112 double locBeta = locPathLength/(locDeltaT*29.9792458);
114 locBeta = dMaxMassiveNeutralBeta;
117 double locGamma = 1.0/
sqrt(1.0 - locBeta*locBeta);
118 locPMag = locGamma*locBeta*locMass;
119 locMomentum.SetMag(locPMag);
123 locProjectedTime = locStartTime + (locVertexGuess.Z() - dTargetCenterZ)/29.9792458;
124 if(locVertexCovMatrix !=
nullptr)
125 Calc_ParticleCovariance_Massive(locNeutralShower, locVertexCovMatrix, locMass, locDeltaT, locMomentum, locPath, locParticleCovariance.get());
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());
140 locNeutralParticleHypothesis->
setPID(locPID);
141 locNeutralParticleHypothesis->
setMomentum(locMomentum);
142 locNeutralParticleHypothesis->
setPosition(locVertexGuess);
143 locNeutralParticleHypothesis->
setTime(locProjectedTime);
145 locNeutralParticleHypothesis->
setErrorMatrix(locParticleCovariance);
148 unsigned int locNDF = 0;
149 double locChiSq = 0.0;
150 double locFOM = -1.0;
153 double locTimePull = 0.0;
154 locChiSq = dParticleID->Calc_TimingChiSq(locNeutralParticleHypothesis, locNDF, locTimePull);
155 locFOM = TMath::Prob(locChiSq, locNDF);
158 return locNeutralParticleHypothesis;
164 TMatrixFSym locShowerPlusVertCovariance(8);
165 for(
unsigned int loc_l = 0; loc_l < 5; ++loc_l)
167 for(
unsigned int loc_m = 0; loc_m < 5; ++loc_m)
168 locShowerPlusVertCovariance(loc_l, loc_m) = (*(locNeutralShower->
dCovarianceMatrix))(loc_l, loc_m);
170 for(
unsigned int loc_l = 0; loc_l < 3; ++loc_l)
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);
180 DVector3 locDeltaX = -1.0*locPathVector;
181 DVector3 locDeltaXOverDeltaXSq = (1.0/locDeltaX.Mag2())*locDeltaX;
183 DVector3 locUnitDeltaXOverC = (1.0/(29.9792458*locDeltaX.Mag()))*locDeltaX;
186 TMatrix locTransformMatrix(7, 8);
188 locTransformMatrix(0, 0) = locUnitP.X();
189 locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaXSq.X() - 1.0/locDeltaX.X());
190 locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX.Mag2();
191 locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX.Mag2();
192 locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1);
193 locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2);
194 locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3);
196 locTransformMatrix(1, 0) = locUnitP.Y();
197 locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX.Mag2();
198 locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaXSq.Y() - 1.0/locDeltaX.Y());
199 locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX.Mag2();
200 locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1);
201 locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2);
202 locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3);
204 locTransformMatrix(2, 0) = locUnitP.Z();
205 locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX.Mag2();
206 locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX.Mag2();
207 locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaXSq.Z() - 1.0/locDeltaX.Z());
208 locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1);
209 locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2);
210 locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3);
212 locTransformMatrix(3, 5) = 1.0;
213 locTransformMatrix(4, 6) = 1.0;
214 locTransformMatrix(5, 7) = 1.0;
216 locTransformMatrix(6, 0) = 0.0;
217 locTransformMatrix(6, 1) = locUnitDeltaXOverC.X();
218 locTransformMatrix(6, 2) = locUnitDeltaXOverC.Y();
219 locTransformMatrix(6, 3) = locUnitDeltaXOverC.Z();
220 locTransformMatrix(6, 4) = 1.0;
221 locTransformMatrix(6, 5) = -1.0*locTransformMatrix(6, 1);
222 locTransformMatrix(6, 6) = -1.0*locTransformMatrix(6, 2);
223 locTransformMatrix(6, 7) = -1.0*locTransformMatrix(6, 3);
226 *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix);
232 TMatrixFSym locShowerPlusVertCovariance(9);
233 for(
unsigned int loc_l = 0; loc_l < 5; ++loc_l)
235 for(
unsigned int loc_m = 0; loc_m < 5; ++loc_m)
236 locShowerPlusVertCovariance(loc_l, loc_m) = (*(locNeutralShower->
dCovarianceMatrix))(loc_l, loc_m);
238 for(
unsigned int loc_l = 0; loc_l < 4; ++loc_l)
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);
248 DVector3 locDeltaX = -1.0*locPathVector;
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;
258 TMatrix locTransformMatrix(7, 9);
260 locTransformMatrix(0, 0) = 0.0;
261 locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaX4Sq.X() + 1.0/locDeltaX.X());
262 locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX4Sq;
263 locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX4Sq;
264 locTransformMatrix(0, 4) = locDeltaT*locCSq*locMomentum.Px()/locDeltaX4Sq;
265 locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1);
266 locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2);
267 locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3);
268 locTransformMatrix(0, 8) = -1.0*locTransformMatrix(0, 4);
270 locTransformMatrix(1, 0) = 0.0;
271 locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX4Sq;
272 locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaX4Sq.Y() + 1.0/locDeltaX.Y());
273 locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX4Sq;
274 locTransformMatrix(1, 4) = locDeltaT*locCSq*locMomentum.Py()/locDeltaX4Sq;
275 locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1);
276 locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2);
277 locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3);
278 locTransformMatrix(1, 8) = -1.0*locTransformMatrix(1, 4);
280 locTransformMatrix(2, 0) = 0.0;
281 locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX4Sq;
282 locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX4Sq;
283 locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaX4Sq.Z() + 1.0/locDeltaX.Z());
284 locTransformMatrix(2, 4) = locDeltaT*locCSq*locMomentum.Pz()/locDeltaX4Sq;
285 locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1);
286 locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2);
287 locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3);
288 locTransformMatrix(2, 8) = -1.0*locTransformMatrix(2, 4);
290 locTransformMatrix(3, 5) = 1.0;
291 locTransformMatrix(4, 6) = 1.0;
292 locTransformMatrix(5, 7) = 1.0;
293 locTransformMatrix(6, 8) = 1.0;
296 *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix);
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
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
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)
TMatrixFSym dCovarianceMatrix
DetectorSystem_t dTimeSource
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