ATLAS Offline Software
Loading...
Searching...
No Matches
CETmaterial.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// CETmaterial.cxx, (c) ATLAS Detector software
8
9#include <fstream>
10
11// Tracking
21
22//================ Constructor =================================================
23
24Trk::CETmaterial::CETmaterial(const std::string& name, ISvcLocator* pSvcLocator)
25 :
26 AthAlgorithm(name,pSvcLocator),
27 m_chronoStatSvc( "ChronoStatSvc", name )
28{ }
29
30//================ Destructor =================================================
31
36
37
38//================ Initialization =================================================
39
41{
42 // Code entered here will be executed once at program start.
43
44 ATH_MSG_INFO( "initialize()" );
45
46 // Get Extrapolator from ToolService
47 if (m_extrapolator.retrieve().isFailure()) {
48 ATH_MSG_FATAL( "Could not retrieve Tool " << m_extrapolator << ". Exiting." );
49 return StatusCode::FAILURE;
50 }
51 if (m_extraprec.retrieve().isFailure()) {
52 ATH_MSG_FATAL( "Could not retrieve Tool " << m_extraprec << ". Exiting." );
53 return StatusCode::FAILURE;
54 }
55
56 ATH_MSG_INFO( "initialize() successful" );
57 return StatusCode::SUCCESS;
58}
59
60//================ Finalization =================================================
61
63{
64 // Code entered here will be executed once at the end of the program run.
65
66 if (m_chronoStatSvc) m_chronoStatSvc->chronoPrint("MS::scan");
67
68 return StatusCode::SUCCESS;
69}
70
71//================ Execution ====================================================
72
74{
75 ATH_MSG_INFO( "execute()" );
76 const EventContext& ctx = Gaudi::Hive::currentContext();
77 // retrieve outer boundary cylinder surface
78 if (!m_outerBoundary) {
79 m_trackingGeometry = m_extrapolator->trackingGeometry();
80 m_outerBoundary = &(m_trackingGeometry->highestTrackingVolume()->boundarySurfaces()[2]->surfaceRepresentation());
81 if (!m_outerBoundary) {
82 ATH_MSG_FATAL( "Could not retrieve cylinder boundary from " << m_extrapolator << ". Exiting." );
83 return StatusCode::FAILURE;
84 }
85 ATH_MSG_INFO( "boundary retrieved " );
86 }
87
88 if (m_chronoStatSvc) m_chronoStatSvc->chronoStart("MS::scan");
89
90 // scan
91 std::vector<const TrackStateOnSurface*> material;
92 std::vector<const TrackStateOnSurface*> matPrec;
93 double phi = -M_PI;
94 for ( unsigned int it = 0; it < m_numScan+1; it++) {
95 // the initial perigee
96 double z0 = m_minZ0 + (m_maxZ0-m_minZ0)/m_numScan *it;
97 phi += 1*Gaudi::Units::deg; if (phi>M_PI) phi -=2*M_PI;
98
100 double p = m_minP + (m_maxP-m_minP)/m_numScan *it;
101 Trk::PerigeeSurface surface( Amg::Vector3D(0.,0.,0.));
102 Trk::Perigee initialPerigee(0., z0, phi, theta, m_charge/p, surface);
103
104 const Trk::TrackParameters* seed = initialPerigee.clone();
105 const Trk::PerigeeSurface& pSf = initialPerigee.associatedSurface();
106 material.clear(); matPrec.clear();
107 const Trk::TrackParameters* currPar = seed;
108 const Trk::TrackParameters* precPar = seed;
109 if (m_domsentry) {
110 if (!m_msentry) {
111 m_msentry = m_trackingGeometry->trackingVolume("Calo::Containers::Calorimeter");
112 }
113 if (m_msentry) {
114 const Trk::TrackParameters* msEntry =
115 m_extrapolator->extrapolateToVolume(
116 ctx,
117 *currPar,
118 *m_msentry,
120 static_cast<Trk::ParticleHypothesis>(m_particleType.value())).release();
121 if (msEntry) {
122 printMat(
123 theta,
124 phi,
125 currPar->momentum().mag() - msEntry->momentum().mag(),
126 Amg::error(msEntry->covariance()->inverse().eval(), Trk::theta),
127 Amg::error(msEntry->covariance()->inverse().eval(), Trk::phi));
128
129 const std::vector<const Trk::TrackStateOnSurface*>* mmsentry = m_extrapolator->extrapolateM(ctx,
130 *currPar,
131 msEntry->associatedSurface(),
133 false,
134 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
135 if (mmsentry ) {
136 for (const auto& entry : *mmsentry) {
137 if (entry) {
138 ATH_MSG_DEBUG("position:eloss:"
139 << entry->trackParameters()->position() << ":"
140 << entry->trackParameters()->momentum().mag() - currPar->momentum().mag());
141 }
142 }
143
144 currPar = (mmsentry->back()) ? mmsentry->back()->trackParameters() : msEntry;
145
146 const std::vector<const Trk::TrackStateOnSurface*>* peri = m_extrapolator->extrapolateM(ctx,
147 *currPar,
148 pSf,
150 false,
151 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
152 ATH_MSG_INFO ( "material scan:backward:" );
153 if (peri){
154 ATH_MSG_DEBUG ("trPar vector size:" << peri->size() );
155 } else {
156 ATH_MSG_ERROR ("Perigee pointer is null in CETmaterial.cxx");
157 delete msEntry;
158 return StatusCode::FAILURE;
159 }
160 for (const auto& entry : *peri) {
161 if (entry && entry->trackParameters()) {
162 ATH_MSG_DEBUG("position:eloss:"
163 << entry->trackParameters()->position() << ":"
164 << entry->trackParameters()->momentum().mag() - msEntry->momentum().mag());
165 }
166 }
167
168 if (peri->back() && peri->back()->trackParameters()) {
169 ATH_MSG_INFO( "extrapolation to perigee:input: "
170 << initialPerigee.parameters()[0] << ","
171 << initialPerigee.parameters()[1] << ","
172 << initialPerigee.parameters()[2] << ","
173 << initialPerigee.parameters()[3] << ","
174 << initialPerigee.momentum().mag() );
175 ATH_MSG_INFO( "extrapolation to perigee:output: "
176 << peri->back()->trackParameters()->parameters()[0] << ","
177 << peri->back()->trackParameters()->parameters()[1] << ","
178 << peri->back()->trackParameters()->parameters()[2] << ","
179 << peri->back()->trackParameters()->parameters()[3] << ","
180 << peri->back()->trackParameters()->momentum().mag() );
181 } else {
182 ATH_MSG_ERROR( "extrapolation to perigee failed for input parameters: " << msEntry->parameters() );
183 }
184 delete peri;
185 delete msEntry;
186 } else {
187 ATH_MSG_ERROR( "extrapolation to MSentry failed for input parameters: " << currPar->parameters() );
188 printMat(theta,phi,0.);
189 }
190 }
191 }
192 delete currPar;
193 continue;
194 }
195 if (m_checkStepWise) {
196 double matApp = 0.;
197 while (currPar) {
198 std::pair<std::unique_ptr<Trk::TrackParameters>,const Trk::Layer*> next = m_extrapolator->extrapolateToNextActiveLayerM(
199 ctx,
200 *currPar,
202 true,
203 material,
204 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
205
206
207 const Trk::TrackParameters* nextPar = next.first.release();
208 const Trk::Layer* lay = next.second;
209 currPar = nextPar;
210
211 if (m_doprecision && precPar && currPar ) {
212 // try to extrapolate to the same surface
213 const std::vector<const Trk::TrackStateOnSurface*>* nextPrec = m_extraprec->extrapolateM(
214 ctx,
215 *precPar,currPar->associatedSurface(),
217 false,
218 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
219 delete precPar;
220 // collect material
221 if (nextPrec) {
222 for (const auto *i : *nextPrec) {
223 const Trk::MaterialEffectsBase* mEff = i->materialEffectsOnTrack();
224 const Trk::TrackParameters* trPar = i->trackParameters();
225 if (mEff && trPar) {
226 matApp += mEff->thicknessInX0();
227 }
228 }
229 }
230 // stop of extrapolation failed
231 if (!lay || !nextPrec || nextPrec->empty() || !nextPrec->back() ) break;
232 precPar = nextPrec->back()->trackParameters();
233 double mat=0.;
234 if (!material.empty()) for (auto & i : material) {
235 if (i->materialEffectsOnTrack()) mat += i->materialEffectsOnTrack()->thicknessInX0();
236 }
237 if ( precPar ) printMatComp(theta,phi,currPar,lay->enclosingDetachedTrackingVolume()->name(),mat,matApp,currPar->parameters()[0]-precPar->parameters()[0],
238 currPar->parameters()[1]-precPar->parameters()[1]);
239 else if (currPar) {
240 //precPar is nullptr here
241 ATH_MSG_INFO( "expected layer not reached:" << currPar->position() );
242 }
243 }
244 if (nextPar && m_printActive) {
245 int id = 0;
246 if (lay) id = lay->layerType();
247 double matc=0.;
248 if (!material.empty()) for (auto & i : material) {
249 if (i->materialEffectsOnTrack()) matc += i->materialEffectsOnTrack()->thicknessInX0();
250 }
251 else ATH_MSG_INFO( "mat & error:" << theta << "," << phi << "," << matc << ","
252 << Amg::error(nextPar->covariance()->inverse().eval(),Trk::theta) << ","
253 << Amg::error(nextPar->covariance()->inverse().eval(),Trk::phi) );
254
255 printMatPrec(theta,phi,nextPar,nextPar,matc,id,"unknown");
256 }
257 if (!lay) break;
258 }
259 if (m_printMaterial) {
260 double mat=0.;
261 if (!material.empty()) for (auto & i : material) {
262 if (i->materialEffectsOnTrack()) {
263 mat += i->materialEffectsOnTrack()->thicknessInX0();
264 }
265 }
266 printMat(theta,phi,mat);
267 }
268 } else {
269 const std::vector<const Trk::TrackStateOnSurface*>* destParameters = m_extrapolator->extrapolateM(
270 ctx,
271 *currPar,
274 false,
275 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
276
277 if (m_printMaterial) {
278 double mat=0.;
279 if (destParameters) for (const auto *destParameter : *destParameters) {
280 const Trk::MaterialEffectsBase* mEff = destParameter->materialEffectsOnTrack();
281 const Trk::TrackParameters* trPar = destParameter->trackParameters();
282 if (trPar) {
283 //const Trk::MeasuredTrackParameters* mdest = dynamic_cast<const Trk::MeasuredTrackParameters*> (trPar);
284 //if (mdest) ATH_MSG_INFO( "radiation thickness and errors(theta,phi):" << theta << "," << phi << "," << mat << "," <<
285 // mdest->localErrorMatrix().error(Trk::theta) << "," << mdest->localErrorMatrix().error(Trk::phi) );
286 }
287 if (mEff && trPar) {
288 mat += mEff->thicknessInX0();
289 // find volume
290 std::vector<const Trk::DetachedTrackingVolume*> detVols = m_extrapolator->trackingGeometry()->lowestDetachedTrackingVolumes(trPar->position());
291 if (!detVols.empty()) printMatScan(theta,phi,trPar->position().perp(),trPar->position().z(),mEff->thicknessInX0(),(detVols)[0]->name());
292 else printMatScan(theta,phi,trPar->position().perp(),trPar->position().z(),mEff->thicknessInX0(),m_extrapolator->trackingGeometry()->lowestStaticTrackingVolume(trPar->position())->volumeName());
293 }
294 }
295 if (destParameters) {
296 //const Trk::MeasuredTrackParameters* mdest = dynamic_cast<const Trk::MeasuredTrackParameters*> ((*destParameters).back()->trackParameters());
297 //if (mdest) ATH_MSG_INFO( "radiation thickness and errors(theta,phi):" << theta << "," << phi << "," << mat << "," <<
298 //mdest->localErrorMatrix().error(Trk::theta) << "," << mdest->localErrorMatrix().error(Trk::phi) );
299 }
300 printMat(theta,phi,mat);
301 }
302
303 if (!destParameters || destParameters->empty() ) {
304 ATH_MSG_ERROR( "extrapolation to outer boundary failed for input parameters: " << initialPerigee.parameters() );
305 } else if (destParameters->back()->trackParameters()) {
306 // forward extrapolation ok
307 if (m_backward) {
308 material.clear();
309 const std::vector<const Trk::TrackStateOnSurface*>* peri = m_extrapolator->extrapolateM(
310 ctx, *(destParameters->back()->trackParameters()),
311 pSf,
313 false,
314 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
315
316 if (peri) {
317 ATH_MSG_INFO( "trPar vector size:" << peri->size() );
318 for (unsigned int i=0; i< peri->size(); i++)
319 ATH_MSG_INFO( "position:" << i << "," << (*peri)[i]->trackParameters()->position() );
320 ATH_MSG_INFO( "extrapolation to perigee:input: " << initialPerigee.parameters() );
321 ATH_MSG_INFO( "extrapolation to perigee:output: " << peri->back()->trackParameters()->parameters() );
322 } else {
323 ATH_MSG_ERROR( "extrapolation to perigee failed for input parameters: " << destParameters->back()->trackParameters()->parameters() );
324 }
325 delete peri;
326 }
327 }
328
329 delete destParameters;
330 }
331 }
332
333 if (m_chronoStatSvc) m_chronoStatSvc->chronoStop("MS::scan");
334
335 return StatusCode::SUCCESS;
336}
337
338//============================================================================================
339
340void Trk::CETmaterial::printMat(double theta, double phi, double mat, double dtheta, double dphi) const {
341
342 std::ofstream myfilemat;
343 myfilemat.open (m_matTotFile,std::ios::app);
344 myfilemat<<theta<<" "<<phi<<" "<<mat<<" "<<dtheta<<" "<<dphi<<std::endl;
345}
346
347
348void Trk::CETmaterial::printMatScan(double theta, double phi, double r, double z, double mat, const std::string& name) const {
349
350 std::ofstream myfilemat;
351 myfilemat.open(m_matScanFile,std::ios::app);
352 myfilemat << theta << " " << phi << " " << r << " " << z << " " << mat << " " << name << std::endl;
353}
354
355void Trk::CETmaterial::printMatPrec(double theta, double phi, const Trk::TrackParameters* nextPar, const Trk::TrackParameters* mdest, double mat, int id, const std::string& name) {
356
357 if (name.empty()) {}; // dummy to get rid of warning message (unused variable name)
358 std::ofstream myfilemat;
359 myfilemat.open(m_matActiveFile,std::ios::app);
360
361 if (!m_th && !m_ph) {
362 m_th = theta;
363 m_ph = phi;
364 m_id = id;
365 m_matSaved = mat;
366 delete m_next; m_next=nextPar->clone();
367 delete m_err;
368 m_err=nullptr;
369 if (mdest) {
371 *m_err = mdest->covariance()->inverse().eval();
372 }
373 return;
374 }
375
376 if ( theta!=m_th || phi!=m_ph ) {
377
378 if (m_err && m_id>0) {
379 myfilemat << m_th << " " << m_ph << " " << 1 << " " << m_id << " " << m_matSaved << std::endl;
380 myfilemat << m_next->parameters()[Trk::locX] << " " << m_next->parameters()[Trk::locY] << " " << m_next->parameters()[Trk::phi]
381 << " " << m_next->parameters()[Trk::theta] << " " << m_next->parameters()[Trk::qOverP] << std::endl;
382 myfilemat << Amg::error(*m_err,Trk::locX) << " " << Amg::error(*m_err,Trk::locY)
383 << " " << Amg::error(*m_err,Trk::phi) << " " << Amg::error(*m_err,Trk::theta)
384 << " " << Amg::error(*m_err,Trk::qOverP) << std::endl;
385 } else {
386 myfilemat << m_th << " " << m_ph << " " << 0 << " " << m_id << std::endl;
387 myfilemat << m_next->parameters()[Trk::locX] << " " << m_next->parameters()[Trk::locY] << " " << m_next->parameters()[Trk::phi]
388 << " " << m_next->parameters()[Trk::theta] << " " << m_next->parameters()[Trk::qOverP] << std::endl;
389 }
390 m_th = theta;
391 m_ph = phi;
392 m_id = id;
393 m_matSaved = mat;
394 delete m_next; m_next=nextPar->clone();
395 delete m_err;
396 m_err=nullptr;
397
398 if (mdest) {
400 *m_err = mdest->covariance()->inverse().eval();
401 }
402 return;
403 }
404
405 // update data
406 if (id>1) {
407 m_th = theta;
408 m_ph = phi;
409 m_id = id;
410 m_matSaved = mat;
411 delete m_next; m_next=nextPar->clone();
412 delete m_err;
413 m_err=nullptr;
414 if (mdest) {
416 *m_err = mdest->covariance()->inverse().eval();
417 }
418 }
419 }
420
421void Trk::CETmaterial::printMatComp(double theta, double phi, const Trk::TrackParameters* currPar, const std::string& name, double mat, double matApp,double dx, double dy) const
422{
423 std::ofstream myfilemat;
424 myfilemat.open(m_matCompFile,std::ios::app);
425 myfilemat << theta << " " << phi << " " << currPar->position().perp() << " " << currPar->position().z() << " " << name.substr(0,2)
426 << " " << mat << " " << matApp << " " << dx << " " << dy << std::endl;
427}
#define M_PI
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
void printMat(double th, double ph, double mat, double dtheta=0., double dphi=0.) const
BooleanProperty m_backward
Definition CETmaterial.h:85
StatusCode initialize()
standard Athena-Algorithm method
BooleanProperty m_domsentry
Definition CETmaterial.h:86
CETmaterial(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Amg::MatrixX * m_err
Definition CETmaterial.h:94
const Trk::TrackingGeometry * m_trackingGeometry
Definition CETmaterial.h:97
StatusCode finalize()
standard Athena-Algorithm method
IntegerProperty m_particleType
void printMatPrec(double theta, double phi, const Trk::TrackParameters *, const Trk::TrackParameters *, double mat, int id, const std::string &name)
const char * m_matCompFile
Definition CETmaterial.h:83
BooleanProperty m_doprecision
Definition CETmaterial.h:87
DoubleProperty m_charge
Definition CETmaterial.h:74
void printMatScan(double theta, double phi, double r, double z, double mat, const std::string &name) const
IChronoStatSvc_t m_chronoStatSvc
DoubleProperty m_minP
Definition CETmaterial.h:72
const char * m_matTotFile
Definition CETmaterial.h:80
BooleanProperty m_printActive
Definition CETmaterial.h:78
~CETmaterial()
Default Destructor.
DoubleProperty m_minZ0
Definition CETmaterial.h:68
BooleanProperty m_checkStepWise
Definition CETmaterial.h:76
ToolHandle< IExtrapolator > m_extraprec
Definition CETmaterial.h:66
UnsignedIntegerProperty m_numScan
Definition CETmaterial.h:75
DoubleProperty m_maxP
Definition CETmaterial.h:73
const Trk::Surface * m_outerBoundary
Definition CETmaterial.h:96
const char * m_matScanFile
Definition CETmaterial.h:81
StatusCode execute()
standard Athena-Algorithm method
Trk::TrackParameters * m_next
Definition CETmaterial.h:93
BooleanProperty m_printMaterial
Definition CETmaterial.h:77
void printMatComp(double theta, double phi, const Trk::TrackParameters *currPar, const std::string &name, double mat, double matApp, double dx, double dy) const
DoubleProperty m_minTheta
Definition CETmaterial.h:70
DoubleProperty m_maxTheta
Definition CETmaterial.h:71
const Trk::TrackingVolume * m_msentry
Definition CETmaterial.h:98
ToolHandle< IExtrapolator > m_extrapolator
The Extrapolator(s) to be retrieved.
Definition CETmaterial.h:64
DoubleProperty m_maxZ0
Definition CETmaterial.h:69
const char * m_matActiveFile
Definition CETmaterial.h:82
const std::string & name() const
returns the Name
Base Class for a Detector Layer in the Tracking realm.
Definition Layer.h:72
int layerType() const
get the Layer coding
const DetachedTrackingVolume * enclosingDetachedTrackingVolume() const
get the confining DetachedTrackingVolume
base class to integrate material effects on Trk::Track in a flexible way.
double thicknessInX0() const
returns the actually traversed material .
const Amg::Vector3D & momentum() const
Access method for the momentum.
virtual ParametersBase< DIM, T > * clone() const override=0
clone method for polymorphic deep copy
const Amg::Vector3D & position() const
Access method for the position.
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
virtual ParametersT< DIM, T, S > * clone() const override final
Virtual clone.
virtual const S & associatedSurface() const override final
Access to the Surface method.
Class describing the Line to which the Perigee refers to.
int r
Definition globals.cxx:22
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Eigen::Matrix< double, 3, 1 > Vector3D
@ oppositeMomentum
@ alongMomentum
@ next
Definition BinningData.h:33
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ phi
Definition ParamDefs.h:75
@ z0
Definition ParamDefs.h:64
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters