1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | #include <iostream> |
10 | #include <iomanip> |
11 | using namespace std; |
12 | |
13 | #include <TMath.h> |
14 | |
15 | #include "DNeutralParticleHypothesis_factory.h" |
16 | using namespace jana; |
17 | |
18 | |
19 | |
20 | |
21 | jerror_t DNeutralParticleHypothesis_factory::init(void) |
22 | { |
23 | return NOERROR; |
24 | } |
25 | |
26 | |
27 | |
28 | |
29 | jerror_t DNeutralParticleHypothesis_factory::brun(jana::JEventLoop *locEventLoop, int32_t runnumber) |
30 | { |
31 | |
32 | DApplication *locApplication = dynamic_cast<DApplication*> (locEventLoop->GetJApplication()); |
33 | DGeometry *locGeometry = locApplication ? locApplication->GetDGeometry(runnumber):NULL__null; |
| 1 | Assuming 'locApplication' is null | |
|
| |
| 3 | | 'locGeometry' initialized to a null pointer value | |
|
34 | locGeometry->GetTargetZ(dTargetCenterZ); |
| 4 | | Called C++ object pointer is null |
|
35 | locEventLoop->GetSingle(dParticleID); |
36 | |
37 | return NOERROR; |
38 | } |
39 | |
40 | |
41 | |
42 | |
43 | jerror_t DNeutralParticleHypothesis_factory::evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber) |
44 | { |
45 | vector<const DNeutralShower*> locNeutralShowers; |
46 | locEventLoop->Get(locNeutralShowers); |
47 | |
48 | vector<Particle_t> locPIDHypotheses; |
49 | locPIDHypotheses.push_back(Gamma); |
50 | locPIDHypotheses.push_back(Neutron); |
51 | |
52 | const DEventRFBunch* locEventRFBunch = NULL__null; |
53 | locEventLoop->GetSingle(locEventRFBunch); |
54 | |
55 | const DVertex* locVertex = NULL__null; |
56 | locEventLoop->GetSingle(locVertex); |
57 | |
58 | |
59 | for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i) |
60 | { |
61 | const DNeutralShower *locNeutralShower = locNeutralShowers[loc_i]; |
62 | |
63 | for(size_t loc_j = 0; loc_j < locPIDHypotheses.size(); ++loc_j) |
64 | { |
65 | DNeutralParticleHypothesis* locNeutralParticleHypothesis = Create_DNeutralParticleHypothesis(locEventLoop, locNeutralShower, locPIDHypotheses[loc_j], locEventRFBunch, locVertex); |
66 | if(locNeutralParticleHypothesis != NULL__null) |
67 | _data.push_back(locNeutralParticleHypothesis); |
68 | } |
69 | } |
70 | |
71 | return NOERROR; |
72 | } |
73 | |
74 | DNeutralParticleHypothesis* DNeutralParticleHypothesis_factory::Create_DNeutralParticleHypothesis(JEventLoop *locEventLoop, const DNeutralShower* locNeutralShower, Particle_t locPID, const DEventRFBunch* locEventRFBunch, const DVertex* locVertex) const |
75 | { |
76 | DVector3 locVertexGuess = locVertex->dSpacetimeVertex.Vect(); |
77 | double locStartTime = locVertex->dSpacetimeVertex.T(); |
78 | |
79 | double locHitTime = locNeutralShower->dSpacetimeVertex.T(); |
80 | DVector3 locHitPoint = locNeutralShower->dSpacetimeVertex.Vect(); |
81 | |
82 | |
83 | double locMass = ParticleMass(locPID); |
84 | |
85 | DVector3 locPath = locHitPoint - locVertexGuess; |
86 | double locPathLength = locPath.Mag(); |
87 | if(!(locPathLength > 0.0)) |
88 | return NULL__null; |
89 | |
90 | DVector3 locMomentum(locPath); |
91 | |
92 | uint64_t locEventNumber = locEventLoop->GetJEvent().GetEventNumber(); |
93 | TMatrixFSym* locParticleCovariance = (dynamic_cast<DApplication*>(japp))->Get_CovarianceMatrixResource(7, locEventNumber); |
94 | |
95 | double locProjectedTime = 0.0, locPMag = 0.0; |
96 | if(locPID != Gamma) |
97 | { |
98 | double locDeltaT = locHitTime - locStartTime; |
99 | double locBeta = locPathLength/(locDeltaT*29.9792458); |
100 | if(locBeta >= 1.0) |
101 | locBeta = 0.9999; |
102 | if(locBeta < 0.0) |
103 | locBeta = 0.0; |
104 | double locGamma = 1.0/sqrt(1.0 - locBeta*locBeta); |
105 | locPMag = locGamma*locBeta*locMass; |
106 | locMomentum.SetMag(locPMag); |
107 | locProjectedTime = locStartTime + (locVertexGuess.Z() - dTargetCenterZ)/29.9792458; |
108 | Calc_ParticleCovariance_Massive(locNeutralShower, locVertex, locMass, locDeltaT, locMomentum, locPath, locParticleCovariance); |
109 | } |
110 | else |
111 | { |
112 | locPMag = locNeutralShower->dEnergy; |
113 | double locFlightTime = locPathLength/29.9792458; |
114 | locProjectedTime = locHitTime - locFlightTime; |
115 | locMomentum.SetMag(locPMag); |
116 | Calc_ParticleCovariance_Photon(locNeutralShower, locVertex, locMomentum, locPath, locParticleCovariance); |
117 | } |
118 | |
119 | |
120 | DNeutralParticleHypothesis* locNeutralParticleHypothesis = new DNeutralParticleHypothesis; |
121 | locNeutralParticleHypothesis->AddAssociatedObject(locNeutralShower); |
122 | |
123 | locNeutralParticleHypothesis->dNeutralShowerID = locNeutralShower->dShowerID; |
124 | locNeutralParticleHypothesis->setPID(locPID); |
125 | locNeutralParticleHypothesis->setMass(locMass); |
126 | locNeutralParticleHypothesis->setCharge(0.0); |
127 | locNeutralParticleHypothesis->setMomentum(locMomentum); |
128 | locNeutralParticleHypothesis->setPosition(locVertexGuess); |
129 | locNeutralParticleHypothesis->setT0(locStartTime, locVertex->dCovarianceMatrix(3, 3), locEventRFBunch->dTimeSource); |
130 | locNeutralParticleHypothesis->setTime(locProjectedTime); |
131 | locNeutralParticleHypothesis->setT1(locNeutralShower->dSpacetimeVertex.T(), sqrt(locNeutralShower->dCovarianceMatrix(4, 4)), locNeutralShower->dDetectorSystem); |
132 | locNeutralParticleHypothesis->setPathLength(locPathLength, 0.0); |
133 | locNeutralParticleHypothesis->setErrorMatrix(locParticleCovariance); |
134 | |
135 | |
136 | unsigned int locNDF = 0; |
137 | double locChiSq = 0.0; |
138 | double locFOM = -1.0; |
139 | if(locPID == Gamma) |
140 | { |
141 | double locTimePull = 0.0; |
142 | locChiSq = dParticleID->Calc_TimingChiSq(locNeutralParticleHypothesis, locNDF, locTimePull); |
143 | locFOM = TMath::Prob(locChiSq, locNDF); |
144 | } |
145 | locNeutralParticleHypothesis->dChiSq = locChiSq; |
146 | locNeutralParticleHypothesis->dNDF = locNDF; |
147 | locNeutralParticleHypothesis->dFOM = locFOM; |
148 | return locNeutralParticleHypothesis; |
149 | } |
150 | |
151 | void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Photon(const DNeutralShower* locNeutralShower, const DVertex* locVertex, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const |
152 | { |
153 | |
154 | TMatrixFSym locShowerPlusVertCovariance(8); |
155 | for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) |
156 | { |
157 | for(unsigned int loc_m = 0; loc_m < 5; ++loc_m) |
158 | locShowerPlusVertCovariance(loc_l, loc_m) = locNeutralShower->dCovarianceMatrix(loc_l, loc_m); |
159 | } |
160 | for(unsigned int loc_l = 0; loc_l < 3; ++loc_l) |
161 | { |
162 | for(unsigned int loc_m = 0; loc_m < 3; ++loc_m) |
163 | locShowerPlusVertCovariance(5 + loc_l, 5 + loc_m) = locVertex->dCovarianceMatrix(loc_l, loc_m); |
164 | } |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | DVector3 locDeltaX = -1.0*locPathVector; |
171 | DVector3 locDeltaXOverDeltaXSq = (1.0/locDeltaX.Mag2())*locDeltaX; |
172 | DVector3 locUnitP = (1.0/locNeutralShower->dEnergy)*locMomentum; |
173 | DVector3 locUnitDeltaXOverC = (1.0/(29.9792458*locDeltaX.Mag()))*locDeltaX; |
174 | |
175 | |
176 | TMatrix locTransformMatrix(7, 8); |
177 | |
178 | locTransformMatrix(0, 0) = locUnitP.X(); |
179 | locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaXSq.X() - 1.0/locDeltaX.X()); |
180 | locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX.Mag2(); |
181 | locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX.Mag2(); |
182 | locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); |
183 | locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); |
184 | locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); |
185 | |
186 | locTransformMatrix(1, 0) = locUnitP.Y(); |
187 | locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX.Mag2(); |
188 | locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaXSq.Y() - 1.0/locDeltaX.Y()); |
189 | locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX.Mag2(); |
190 | locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); |
191 | locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); |
192 | locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); |
193 | |
194 | locTransformMatrix(2, 0) = locUnitP.Z(); |
195 | locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX.Mag2(); |
196 | locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX.Mag2(); |
197 | locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaXSq.Z() - 1.0/locDeltaX.Z()); |
198 | locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); |
199 | locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); |
200 | locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); |
201 | |
202 | locTransformMatrix(3, 5) = 1.0; |
203 | locTransformMatrix(4, 6) = 1.0; |
204 | locTransformMatrix(5, 7) = 1.0; |
205 | |
206 | locTransformMatrix(6, 0) = 0.0; |
207 | locTransformMatrix(6, 1) = locUnitDeltaXOverC.X(); |
208 | locTransformMatrix(6, 2) = locUnitDeltaXOverC.Y(); |
209 | locTransformMatrix(6, 3) = locUnitDeltaXOverC.Z(); |
210 | locTransformMatrix(6, 4) = 1.0; |
211 | locTransformMatrix(6, 5) = -1.0*locTransformMatrix(6, 1); |
212 | locTransformMatrix(6, 6) = -1.0*locTransformMatrix(6, 2); |
213 | locTransformMatrix(6, 7) = -1.0*locTransformMatrix(6, 3); |
214 | |
215 | |
216 | *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix); |
217 | } |
218 | |
219 | void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Massive(const DNeutralShower* locNeutralShower, const DVertex* locVertex, double locMass, double locDeltaT, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const |
220 | { |
221 | |
222 | TMatrixFSym locShowerPlusVertCovariance(9); |
223 | for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) |
224 | { |
225 | for(unsigned int loc_m = 0; loc_m < 5; ++loc_m) |
226 | locShowerPlusVertCovariance(loc_l, loc_m) = locNeutralShower->dCovarianceMatrix(loc_l, loc_m); |
227 | } |
228 | for(unsigned int loc_l = 0; loc_l < 4; ++loc_l) |
229 | { |
230 | for(unsigned int loc_m = 0; loc_m < 4; ++loc_m) |
231 | locShowerPlusVertCovariance(5 + loc_l, 5 + loc_m) = locVertex->dCovarianceMatrix(loc_l, loc_m); |
232 | } |
233 | |
234 | |
235 | |
236 | |
237 | |
238 | DVector3 locDeltaX = -1.0*locPathVector; |
239 | locDeltaT *= -1.0; |
240 | double locCSq = 29.9792458*29.9792458; |
241 | double locCDeltaTSq = locCSq*locDeltaT*locDeltaT; |
242 | double locDeltaX4Sq = locCDeltaTSq - locDeltaX.Mag2(); |
243 | DVector3 locDeltaXOverDeltaX4Sq = (1.0/locDeltaX4Sq)*locDeltaX; |
244 | DVector3 locEPVecOverPSq = (locNeutralShower->dEnergy/locMomentum.Mag2())*locMomentum; |
245 | DVector3 locEPVecOverCPMagDeltaXMag = (locNeutralShower->dEnergy/(29.9792458*locDeltaX.Mag()*locMomentum.Mag()))*locDeltaX; |
246 | |
247 | |
248 | TMatrix locTransformMatrix(7, 9); |
249 | |
250 | locTransformMatrix(0, 0) = 0.0; |
251 | locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaX4Sq.X() + 1.0/locDeltaX.X()); |
252 | locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX4Sq; |
253 | locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX4Sq; |
254 | locTransformMatrix(0, 4) = locDeltaT*locCSq*locMomentum.Px()/locDeltaX4Sq; |
255 | locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); |
256 | locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); |
257 | locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); |
258 | locTransformMatrix(0, 8) = -1.0*locTransformMatrix(0, 4); |
259 | |
260 | locTransformMatrix(1, 0) = 0.0; |
261 | locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX4Sq; |
262 | locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaX4Sq.Y() + 1.0/locDeltaX.Y()); |
263 | locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX4Sq; |
264 | locTransformMatrix(1, 4) = locDeltaT*locCSq*locMomentum.Py()/locDeltaX4Sq; |
265 | locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); |
266 | locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); |
267 | locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); |
268 | locTransformMatrix(1, 8) = -1.0*locTransformMatrix(1, 4); |
269 | |
270 | locTransformMatrix(2, 0) = 0.0; |
271 | locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX4Sq; |
272 | locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX4Sq; |
273 | locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaX4Sq.Z() + 1.0/locDeltaX.Z()); |
274 | locTransformMatrix(2, 4) = locDeltaT*locCSq*locMomentum.Pz()/locDeltaX4Sq; |
275 | locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); |
276 | locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); |
277 | locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); |
278 | locTransformMatrix(2, 8) = -1.0*locTransformMatrix(2, 4); |
279 | |
280 | locTransformMatrix(3, 5) = 1.0; |
281 | locTransformMatrix(4, 6) = 1.0; |
282 | locTransformMatrix(5, 7) = 1.0; |
283 | locTransformMatrix(6, 8) = 1.0; |
284 | |
285 | |
286 | *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix); |
287 | } |