Bug Summary

File:/home/sdobbs/work/clang/halld_recon/src/libraries/PID/DNeutralParticleHypothesis_factory.cc
Warning:line 41, column 2
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

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// $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>
11using namespace std;
12
13#include <TMath.h>
14
15#include "DNeutralParticleHypothesis_factory.h"
16using namespace jana;
17
18//------------------
19// init
20//------------------
21jerror_t DNeutralParticleHypothesis_factory::init(void)
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 return NOERROR;
31}
32
33//------------------
34// brun
35//------------------
36jerror_t DNeutralParticleHypothesis_factory::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
37{
38 // Get Target parameters from XML
39 DApplication *locApplication = dynamic_cast<DApplication*> (locEventLoop->GetJApplication());
40 DGeometry *locGeometry = locApplication ? locApplication->GetDGeometry(runnumber):NULL__null;
1
Assuming 'locApplication' is null
2
'?' condition is false
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// evnt
49//------------------
50jerror_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__null;
64 locEventLoop->GetSingle(locEventRFBunch);
65
66 const DVertex* locVertex = NULL__null;
67 locEventLoop->GetSingle(locVertex);
68
69 // Loop over DNeutralShowers
70 for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i)
71 {
72 const DNeutralShower *locNeutralShower = locNeutralShowers[loc_i];
73 // Loop over vertices and PID hypotheses & create DNeutralParticleHypotheses for each combination
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
86DNeutralParticleHypothesis* 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 // Calculate DNeutralParticleHypothesis Quantities (projected time at vertex for given id, etc.)
95 double locMass = ParticleMass(locPID);
96
97 DVector3 locPath = locHitPoint - locVertexGuess;
98 double locPathLength = locPath.Mag();
99 if(!(locPathLength > 0.0))
100 return nullptr; //invalid, will divide by zero when creating error matrix, so skip!
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 // Make sure that the beta is physically meaningful for this
115 // mass hypothesis
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//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;
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 // Build DNeutralParticleHypothesis // dEdx not set
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 // Calculate DNeutralParticleHypothesis FOM
150 unsigned int locNDF = 0;
151 double locChiSq = 0.0;
152 double locFOM = -1.0; //undefined for non-photons
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
163void DNeutralParticleHypothesis_factory::Calc_ParticleCovariance_Photon(const DNeutralShower* locNeutralShower, const TMatrixFSym* locVertexCovMatrix, const DVector3& locMomentum, const DVector3& locPathVector, TMatrixFSym* locParticleCovariance) const
164{
165 //build 8x8 matrix: 5x5 shower, 3x3 vertex position
166 TMatrixFSym locShowerPlusVertCovariance(8);
167 for(unsigned int loc_l = 0; loc_l < 5; ++loc_l) //shower: e, x, y, z, t
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) //vertex xyz
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 //the input delta X is defined as "hit - start"
179 //however, the documentation and derivations define delta x as "start - hit"
180 //so, reverse the sign of the inputs to match the documentation
181 //and then the rest will follow the documentation
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 //build transform matrix
188 TMatrix locTransformMatrix(7, 8);
189
190 locTransformMatrix(0, 0) = locUnitP.X(); //partial deriv of px wrst shower-e
191 locTransformMatrix(0, 1) = locMomentum.Px()*(locDeltaXOverDeltaXSq.X() - 1.0/locDeltaX.X()); //partial deriv of px wrst shower-x
192 locTransformMatrix(0, 2) = locMomentum.Px()*locDeltaX.Y()/locDeltaX.Mag2(); //partial deriv of px wrst shower-y
193 locTransformMatrix(0, 3) = locMomentum.Px()*locDeltaX.Z()/locDeltaX.Mag2(); //partial deriv of px wrst shower-z
194 locTransformMatrix(0, 5) = -1.0*locTransformMatrix(0, 1); //partial deriv of px wrst vert-x
195 locTransformMatrix(0, 6) = -1.0*locTransformMatrix(0, 2); //partial deriv of px wrst vert-y
196 locTransformMatrix(0, 7) = -1.0*locTransformMatrix(0, 3); //partial deriv of px wrst vert-z
197
198 locTransformMatrix(1, 0) = locUnitP.Y(); //partial deriv of py wrst shower-e
199 locTransformMatrix(1, 1) = locMomentum.Py()*locDeltaX.X()/locDeltaX.Mag2(); //partial deriv of py wrst shower-x
200 locTransformMatrix(1, 2) = locMomentum.Py()*(locDeltaXOverDeltaXSq.Y() - 1.0/locDeltaX.Y()); //partial deriv of py wrst shower-y
201 locTransformMatrix(1, 3) = locMomentum.Py()*locDeltaX.Z()/locDeltaX.Mag2(); //partial deriv of py wrst shower-z
202 locTransformMatrix(1, 5) = -1.0*locTransformMatrix(1, 1); //partial deriv of py wrst vert-x
203 locTransformMatrix(1, 6) = -1.0*locTransformMatrix(1, 2); //partial deriv of py wrst vert-y
204 locTransformMatrix(1, 7) = -1.0*locTransformMatrix(1, 3); //partial deriv of py wrst vert-z
205
206 locTransformMatrix(2, 0) = locUnitP.Z(); //partial deriv of pz wrst shower-e
207 locTransformMatrix(2, 1) = locMomentum.Pz()*locDeltaX.X()/locDeltaX.Mag2(); //partial deriv of pz wrst shower-x
208 locTransformMatrix(2, 2) = locMomentum.Pz()*locDeltaX.Y()/locDeltaX.Mag2(); //partial deriv of pz wrst shower-y
209 locTransformMatrix(2, 3) = locMomentum.Pz()*(locDeltaXOverDeltaXSq.Z() - 1.0/locDeltaX.Z()); //partial deriv of pz wrst shower-z
210 locTransformMatrix(2, 5) = -1.0*locTransformMatrix(2, 1); //partial deriv of pz wrst vert-x
211 locTransformMatrix(2, 6) = -1.0*locTransformMatrix(2, 2); //partial deriv of pz wrst vert-y
212 locTransformMatrix(2, 7) = -1.0*locTransformMatrix(2, 3); //partial deriv of pz wrst vert-z
213
214 locTransformMatrix(3, 5) = 1.0; //partial deriv of x wrst vertex-x
215 locTransformMatrix(4, 6) = 1.0; //partial deriv of y wrst vertex-y
216 locTransformMatrix(5, 7) = 1.0; //partial deriv of z wrst vertex-z
217
218 locTransformMatrix(6, 0) = 0.0; //partial deriv of t wrst shower-e //beta defined = 1
219 locTransformMatrix(6, 1) = locUnitDeltaXOverC.X(); //partial deriv of t wrst shower-x
220 locTransformMatrix(6, 2) = locUnitDeltaXOverC.Y(); //partial deriv of t wrst shower-y
221 locTransformMatrix(6, 3) = locUnitDeltaXOverC.Z(); //partial deriv of t wrst shower-z
222 locTransformMatrix(6, 4) = 1.0; //partial deriv of t wrst shower-t
223 locTransformMatrix(6, 5) = -1.0*locTransformMatrix(6, 1); //partial deriv of t wrst vert-x
224 locTransformMatrix(6, 6) = -1.0*locTransformMatrix(6, 2); //partial deriv of t wrst vert-y
225 locTransformMatrix(6, 7) = -1.0*locTransformMatrix(6, 3); //partial deriv of t wrst vert-z
226
227 //convert
228 *locParticleCovariance = locShowerPlusVertCovariance.Similarity(locTransformMatrix);
229}
230
231void 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_LIGHT29.9792458;
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_LIGHT29.9792458;
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_LIGHT29.9792458;
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_LIGHT29.9792458;
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){ //vertex xyz
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}