clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -main-file-name DNeutralParticleHypothesis_factory.cc -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /w/halld-scifs17exp/home/sdobbs/clang/llvm-project/install/lib/clang/12.0.0 -D HAVE_CCDB -D HAVE_RCDB -D HAVE_EVIO -D HAVE_TMVA=1 -D RCDB_MYSQL=1 -D RCDB_SQLITE=1 -D SQLITE_USE_LEGACY_STRUCT=ON -I .Linux_CentOS7.7-x86_64-gcc4.8.5/libraries/PID -I libraries/PID -I . -I libraries -I libraries/include -I /w/halld-scifs17exp/home/sdobbs/clang/halld_recon/Linux_CentOS7.7-x86_64-gcc4.8.5/include -I external/xstream/include -I /usr/include/tirpc -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/root/root-6.08.06/include -I /w/halld-scifs17exp/halld2/home/sdobbs/Software/jana/jana_0.8.2/Linux_CentOS7.7-x86_64-gcc4.8.5/include -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/ccdb/ccdb_1.06.06/include -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/rcdb/rcdb_0.06.00/cpp/include -I /usr/include/mysql -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/sqlitecpp/SQLiteCpp-2.2.0^bs130/include -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/sqlite/sqlite-3.13.0^bs130/include -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/hdds/hdds-4.9.0/Linux_CentOS7.7-x86_64-gcc4.8.5/src -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/xerces-c/xerces-c-3.1.4/include -I /group/halld/Software/builds/Linux_CentOS7.7-x86_64-gcc4.8.5/evio/evio-4.4.6/Linux-x86_64/include -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5 -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/x86_64-redhat-linux -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/backward -internal-isystem /usr/local/include -internal-isystem /w/halld-scifs17exp/home/sdobbs/clang/llvm-project/install/lib/clang/12.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /home/sdobbs/work/clang/halld_recon/src -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /tmp/scan-build-2021-01-21-110224-160369-1 -x c++ libraries/PID/DNeutralParticleHypothesis_factory.cc
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 | |
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 | return NOERROR; |
31 | } |
32 | |
33 | |
34 | |
35 | |
36 | jerror_t DNeutralParticleHypothesis_factory::brun(jana::JEventLoop *locEventLoop, int32_t runnumber) |
37 | { |
38 | |
39 | DApplication *locApplication = dynamic_cast<DApplication*> (locEventLoop->GetJApplication()); |
40 | DGeometry *locGeometry = locApplication ? locApplication->GetDGeometry(runnumber):NULL; |
| 1 | Assuming 'locApplication' is null | |
|
| |
| 3 | | 'locGeometry' initialized to a null pointer value | |
|
41 | locGeometry->GetTargetZ(dTargetCenterZ); |
| 4 | | Called C++ object pointer is null |
|
42 | locEventLoop->GetSingle(dParticleID); |
43 | |
44 | return NOERROR; |
45 | } |
46 | |
47 | |
48 | |
49 | |
50 | jerror_t DNeutralParticleHypothesis_factory::evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber) |
51 | { |
52 | dResourcePool_NeutralParticleHypothesis->Recycle(dCreated); |
53 | dCreated.clear(); |
54 | _data.clear(); |
55 | |
56 | vector<const DNeutralShower*> locNeutralShowers; |
57 | locEventLoop->Get(locNeutralShowers); |
58 | |
59 | vector<Particle_t> locPIDHypotheses; |
60 | locPIDHypotheses.push_back(Gamma); |
61 | locPIDHypotheses.push_back(Neutron); |
62 | |
63 | const DEventRFBunch* locEventRFBunch = NULL; |
64 | locEventLoop->GetSingle(locEventRFBunch); |
65 | |
66 | const DVertex* locVertex = NULL; |
67 | locEventLoop->GetSingle(locVertex); |
68 | |
69 | |
70 | for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i) |
71 | { |
72 | const DNeutralShower *locNeutralShower = locNeutralShowers[loc_i]; |
73 | |
74 | for(size_t loc_j = 0; loc_j < locPIDHypotheses.size(); ++loc_j) |
75 | { |
76 | DNeutralParticleHypothesis* locNeutralParticleHypothesis = Create_DNeutralParticleHypothesis(locNeutralShower, locPIDHypotheses[loc_j], locEventRFBunch, locVertex->dSpacetimeVertex, &locVertex->dCovarianceMatrix); |
77 | if(locNeutralParticleHypothesis != nullptr) |
78 | _data.push_back(locNeutralParticleHypothesis); |
79 | } |
80 | } |
81 | |
82 | dCreated = _data; |
83 | return NOERROR; |
84 | } |
85 | |
86 | DNeutralParticleHypothesis* DNeutralParticleHypothesis_factory::Create_DNeutralParticleHypothesis(const DNeutralShower* locNeutralShower, Particle_t locPID, const DEventRFBunch* locEventRFBunch, const DLorentzVector& dSpacetimeVertex, const TMatrixFSym* locVertexCovMatrix, bool locPerfomBetaCut) |
87 | { |
88 | DVector3 locVertexGuess = dSpacetimeVertex.Vect(); |
89 | double locStartTime = dSpacetimeVertex.T(); |
90 | |
91 | double locHitTime = locNeutralShower->dSpacetimeVertex.T(); |
92 | DVector3 locHitPoint = locNeutralShower->dSpacetimeVertex.Vect(); |
93 | |
94 | |
95 | double locMass = ParticleMass(locPID); |
96 | |
97 | DVector3 locPath = locHitPoint - locVertexGuess; |
98 | double locPathLength = locPath.Mag(); |
99 | if(!(locPathLength > 0.0)) |
100 | return nullptr; |
101 | |
102 | DVector3 locMomentum(locPath); |
103 | shared_ptr<TMatrixFSym> locParticleCovariance = (locVertexCovMatrix != nullptr) ? dResourcePool_TMatrixFSym->Get_SharedResource() : nullptr; |
104 | if(locParticleCovariance != nullptr) |
105 | locParticleCovariance->ResizeTo(7, 7); |
106 | |
107 | double locProjectedTime = 0.0, locPMag = 0.0; |
108 | if(locPID != Gamma) |
109 | { |
110 | double locDeltaT = locHitTime - locStartTime; |
111 | double locBeta = locPathLength/(locDeltaT*29.9792458); |
112 | |
113 | if(locPerfomBetaCut) { |
114 | |
115 | |
116 | if (locBeta>=1.0 || locBeta<0) return nullptr; |
117 | } |
118 | |
119 | double locGamma = 1.0/sqrt(1.0 - locBeta*locBeta); |
120 | locPMag = locGamma*locBeta*locMass; |
121 | locMomentum.SetMag(locPMag); |
122 | |
123 | |
124 | |
125 | locProjectedTime = locStartTime + (locVertexGuess.Z() - dTargetCenterZ)/29.9792458; |
126 | if(locVertexCovMatrix != nullptr) |
127 | Calc_ParticleCovariance_Massive(locNeutralShower, locVertexCovMatrix, locMass, locDeltaT, locMomentum, locPath, locParticleCovariance.get()); |
128 | } |
129 | else |
130 | { |
131 | locPMag = locNeutralShower->dEnergy; |
132 | double locFlightTime = locPathLength/29.9792458; |
133 | locProjectedTime = locHitTime - locFlightTime; |
134 | locMomentum.SetMag(locPMag); |
135 | if(locVertexCovMatrix != nullptr) |
136 | Calc_ParticleCovariance_Photon(locNeutralShower, locVertexCovMatrix, locMomentum, locPath, locParticleCovariance.get()); |
137 | } |
138 | |
139 | |
140 | DNeutralParticleHypothesis* locNeutralParticleHypothesis = Get_Resource(); |
141 | locNeutralParticleHypothesis->Set_NeutralShower(locNeutralShower); |
142 | locNeutralParticleHypothesis->setPID(locPID); |
143 | locNeutralParticleHypothesis->setMomentum(locMomentum); |
144 | locNeutralParticleHypothesis->setPosition(locVertexGuess); |
145 | locNeutralParticleHypothesis->setTime(locProjectedTime); |
146 | locNeutralParticleHypothesis->Set_T0(locStartTime, sqrt(locEventRFBunch->dTimeVariance), locEventRFBunch->dTimeSource); |
147 | locNeutralParticleHypothesis->setErrorMatrix(locParticleCovariance); |
148 | |
149 | |
150 | unsigned int locNDF = 0; |
151 | double locChiSq = 0.0; |
152 | double locFOM = -1.0; |
153 | if(locPID == Gamma) |
154 | { |
155 | double locTimePull = 0.0; |
156 | locChiSq = dParticleID->Calc_TimingChiSq(locNeutralParticleHypothesis, locNDF, locTimePull); |
157 | locFOM = TMath::Prob(locChiSq, locNDF); |
158 | } |
159 | locNeutralParticleHypothesis->Set_ChiSq_Overall(locChiSq, locNDF, locFOM); |
160 | return locNeutralParticleHypothesis; |
161 | } |
162 | |
163 | void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Photon(const DNeutralShower* locNeutralShower, const TMatrixFSym* locVertexCovMatrix, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const |
164 | { |
165 | |
166 | TMatrixFSym locShowerPlusVertCovariance(8); |
167 | for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) |
168 | { |
169 | for(unsigned int loc_m = 0; loc_m < 5; ++loc_m) |
170 | locShowerPlusVertCovariance(loc_l, loc_m) = (*(locNeutralShower->dCovarianceMatrix))(loc_l, loc_m); |
171 | } |
172 | for(unsigned int loc_l = 0; loc_l < 3; ++loc_l) |
173 | { |
174 | for(unsigned int loc_m = 0; loc_m < 3; ++loc_m) |
175 | locShowerPlusVertCovariance(5 + loc_l, 5 + loc_m) = (*locVertexCovMatrix)(loc_l, loc_m); |
176 | } |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | DVector3 locDeltaX = -1.0*locPathVector; |
183 | DVector3 locDeltaXOverDeltaXSq = (1.0/locDeltaX.Mag2())*locDeltaX; |
184 | DVector3 locUnitP = (1.0/locNeutralShower->dEnergy)*locMomentum; |
185 | DVector3 locUnitDeltaXOverC = (1.0/(29.9792458*locDeltaX.Mag()))*locDeltaX; |
186 | |
187 | |
188 | TMatrix locTransformMatrix(7, 8); |
189 | |
190 | locTransformMatrix(0, 0) = locUnitP.X(); |
191 | locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaXSq.X() - 1.0/locDeltaX.X()); |
192 | locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX.Mag2(); |
193 | locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX.Mag2(); |
194 | locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); |
195 | locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); |
196 | locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); |
197 | |
198 | locTransformMatrix(1, 0) = locUnitP.Y(); |
199 | locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX.Mag2(); |
200 | locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaXSq.Y() - 1.0/locDeltaX.Y()); |
201 | locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX.Mag2(); |
202 | locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); |
203 | locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); |
204 | locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); |
205 | |
206 | locTransformMatrix(2, 0) = locUnitP.Z(); |
207 | locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX.Mag2(); |
208 | locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX.Mag2(); |
209 | locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaXSq.Z() - 1.0/locDeltaX.Z()); |
210 | locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); |
211 | locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); |
212 | locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); |
213 | |
214 | locTransformMatrix(3, 5) = 1.0; |
215 | locTransformMatrix(4, 6) = 1.0; |
216 | locTransformMatrix(5, 7) = 1.0; |
217 | |
218 | locTransformMatrix(6, 0) = 0.0; |
219 | locTransformMatrix(6, 1) = locUnitDeltaXOverC.X(); |
220 | locTransformMatrix(6, 2) = locUnitDeltaXOverC.Y(); |
221 | locTransformMatrix(6, 3) = locUnitDeltaXOverC.Z(); |
222 | locTransformMatrix(6, 4) = 1.0; |
223 | locTransformMatrix(6, 5) = -1.0*locTransformMatrix(6, 1); |
224 | locTransformMatrix(6, 6) = -1.0*locTransformMatrix(6, 2); |
225 | locTransformMatrix(6, 7) = -1.0*locTransformMatrix(6, 3); |
226 | |
227 | |
228 | *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix); |
229 | } |
230 | |
231 | 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 |
232 | { |
233 | double ct=locDeltaT*SPEED_OF_LIGHT; |
234 | double x=locPathVector.x(); |
235 | double y=locPathVector.y(); |
236 | double z=locPathVector.z(); |
237 | double s=locPathVector.Mag(); |
238 | double fac=1./sqrt(ct*ct-s*s); |
239 | double fac2=fac*fac; |
240 | double fac3=fac2*fac; |
241 | double dpx_dx=locMass*fac*(1.+x*x*fac2); |
242 | double dpx_dy=locMass*x*y*fac3; |
243 | double dpx_dz=locMass*x*z*fac3; |
244 | double dpx_dt=-locMass*fac3*x*ct*SPEED_OF_LIGHT; |
245 | double dpy_dx=dpx_dy; |
246 | double dpy_dz=locMass*z*y*fac3; |
247 | double dpy_dy=locMass*fac*(1.+y*y*fac2); |
248 | double dpy_dt=-locMass*fac3*y*ct*SPEED_OF_LIGHT; |
249 | double dpz_dx=dpx_dz; |
250 | double dpz_dy=dpy_dz; |
251 | double dpz_dz=locMass*fac*(1.+z*z*fac2); |
252 | double dpz_dt=-locMass*fac3*z*ct*SPEED_OF_LIGHT; |
253 | double varx=25.,vary=25.,varz=25.,vart=0.09; |
254 | |
255 | locParticleCovariance->Zero(); |
256 | locParticleCovariance->operator()(0,0)=dpx_dx*dpx_dx*varx |
257 | +dpx_dy*dpx_dy*vary+dpx_dz*dpx_dz*varz |
258 | +dpx_dt*dpx_dt*vart; |
259 | locParticleCovariance->operator()(1,1)=dpy_dx*dpy_dx*varx |
260 | +dpy_dy*dpy_dy*vary+dpy_dz*dpy_dz*varz |
261 | +dpy_dt*dpy_dt*vart; |
262 | locParticleCovariance->operator()(2,2)=dpz_dx*dpz_dx*varx |
263 | +dpz_dy*dpz_dy*vary+dpz_dz*dpz_dz*varz |
264 | +dpz_dt*dpz_dt*vart; |
265 | |
266 | for(unsigned int loc_l = 0; loc_l < 3; ++loc_l){ |
267 | for(unsigned int loc_m = 0; loc_m < 3; ++loc_m) |
268 | locParticleCovariance->operator()(3 + loc_l, 3 + loc_m) = (*locVertexCovMatrix)(loc_l, loc_m); |
269 | } |
270 | locParticleCovariance->operator()(6,6)=vart; |
271 | } |