ATLAS Offline Software
Loading...
Searching...
No Matches
TrackStateOnSurface.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "GaudiKernel/MsgStream.h"
8#include <stdexcept>
9#include <string>
10
11namespace Trk {
13
14// partial
16 const FitQualityOnSurface& fitQoS,
17 std::unique_ptr<MeasurementBase> meas,
18 std::unique_ptr<TrackParameters> trackParameters,
19 std::unique_ptr<MaterialEffectsBase> materialEffects,
20 std::unique_ptr<AlignmentEffectsOnTrack> alignmentEffectsOnTrack)
21 : m_fitQualityOnSurface(fitQoS)
23 , m_measurementOnTrack(std::move(meas))
24 , m_materialEffectsOnTrack(std::move(materialEffects))
26{
27 assert(isSane());
28 setFlags();
29}
30
32 std::unique_ptr<MeasurementBase> meas,
33 std::unique_ptr<TrackParameters> trackParameters,
34 std::unique_ptr<MaterialEffectsBase> materialEffects,
35 std::unique_ptr<AlignmentEffectsOnTrack> alignmentEffectsOnTrack)
38 , m_measurementOnTrack(std::move(meas))
39 , m_materialEffectsOnTrack(std::move(materialEffects))
41{
42 assert(isSane());
43 setFlags();
44}
45
46// full
48 const FitQualityOnSurface& fitQoS,
49 std::unique_ptr<MeasurementBase> meas,
50 std::unique_ptr<TrackParameters> trackParameters,
51 std::unique_ptr<MaterialEffectsBase> materialEffects,
52 const std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>& typePattern,
53 std::unique_ptr<AlignmentEffectsOnTrack> alignmentEffectsOnTrack)
54 : m_fitQualityOnSurface(fitQoS)
56 , m_measurementOnTrack(std::move(meas))
57 , m_materialEffectsOnTrack(std::move(materialEffects))
59 , m_typeFlags(typePattern.to_ulong())
60{
61 assert(isSane());
62}
63
65 std::unique_ptr<MeasurementBase> meas,
66 std::unique_ptr<TrackParameters> trackParameters,
67 std::unique_ptr<MaterialEffectsBase> materialEffects,
68 const std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>& typePattern,
69 std::unique_ptr<AlignmentEffectsOnTrack> alignmentEffectsOnTrack)
72 , m_measurementOnTrack(std::move(meas))
73 , m_materialEffectsOnTrack(std::move(materialEffects))
75 , m_typeFlags(typePattern.to_ulong())
76{
77 assert(isSane());
78}
79
80// copy
96
97// move
99 : m_fitQualityOnSurface(rhs.m_fitQualityOnSurface)
100 , m_trackParameters(std::move(rhs.m_trackParameters))
101 , m_measurementOnTrack(std::move(rhs.m_measurementOnTrack))
102 , m_materialEffectsOnTrack(std::move(rhs.m_materialEffectsOnTrack))
103 , m_alignmentEffectsOnTrack(std::move(rhs.m_alignmentEffectsOnTrack))
104 , m_typeFlags(rhs.m_typeFlags)
105{
106}
107
108// copy assignment
111{
112 if (this != &rhs) {
114 m_trackParameters.reset(
115 rhs.m_trackParameters ? rhs.m_trackParameters->clone() : nullptr);
117 rhs.m_measurementOnTrack ? rhs.m_measurementOnTrack->clone() : nullptr);
119 ? rhs.m_materialEffectsOnTrack->clone()
120 : nullptr);
122 ? std::make_unique<AlignmentEffectsOnTrack>(
124 : nullptr;
126 assert(isSane());
127 }
128 return *this;
129}
130
131// move assignment
134{
135 if (this != &rhs) {
136 m_fitQualityOnSurface = rhs.m_fitQualityOnSurface;
137 m_trackParameters = std::move(rhs.m_trackParameters);
138 m_measurementOnTrack = std::move(rhs.m_measurementOnTrack);
139 m_materialEffectsOnTrack = std::move(rhs.m_materialEffectsOnTrack);
140 m_alignmentEffectsOnTrack = std::move(rhs.m_alignmentEffectsOnTrack);
141 m_typeFlags = rhs.m_typeFlags;
142 }
143 return *this;
144}
145
146std::string
148{
149 std::string type;
150 const auto& typesSet = types();
151 if (typesSet.test(TrackStateOnSurface::Measurement)) {
152 type += "Measurement ";
153 }
154 if (typesSet.test(TrackStateOnSurface::InertMaterial)) {
155 type += "InertMaterial ";
156 }
157 if (typesSet.test(TrackStateOnSurface::BremPoint)) {
158 type += "BremPoint ";
159 }
160 if (typesSet.test(TrackStateOnSurface::Scatterer)) {
161 type += "Scatterer ";
162 }
163 if (typesSet.test(TrackStateOnSurface::Perigee)) {
164 type += "Perigee ";
165 }
166 if (typesSet.test(TrackStateOnSurface::Outlier)) {
167 type += "Outlier ";
168 }
169 if (typesSet.test(TrackStateOnSurface::Hole)) {
170 type += "Hole ";
171 }
172 if (typesSet.test(TrackStateOnSurface::CaloDeposit)) {
173 type += "CaloDeposit ";
174 }
175 if (typesSet.test(TrackStateOnSurface::Parameter)) {
176 type += "Parameter ";
177 }
178 if (typesSet.test(TrackStateOnSurface::FitQuality)) {
179 type += "FitQuality ";
180 }
181 if (typesSet.test(TrackStateOnSurface::Alignment)) {
182 type += "Alignment ";
183 }
184 return type;
185}
186
187const Surface&
189{
190 if (m_trackParameters) {
191 return m_trackParameters->associatedSurface();
192 }
194 return m_measurementOnTrack->associatedSurface();
195 }
197 return m_materialEffectsOnTrack->associatedSurface();
198 }
199 throw std::runtime_error("TrackStateOnSurface without Surface!");
200}
201
202bool
204{
205 bool surfacesDiffer =
209 if (surfacesDiffer) {
210 std::cerr << "TrackStateOnSurface::isSane. With :" << '\n';
211 std::cerr << "Types : " << types().to_string() << '\n';
212 std::cerr << "Hints " << hints().to_string() << '\n';
213 std::cerr << "Surfaces differ! " << std::endl;
214 if (m_trackParameters) {
215 std::cerr << "ParamSurf: [" << &(m_trackParameters->associatedSurface())
216 << "] " << m_trackParameters->associatedSurface() << std::endl;
217 }
219 std::cerr << "measSurf: [" << &(m_measurementOnTrack->associatedSurface())
220 << "] " << m_measurementOnTrack->associatedSurface()
221 << std::endl;
222 }
224 std::cerr << "matSurf: ["
225 << &(m_materialEffectsOnTrack->associatedSurface()) << "] "
226 << m_materialEffectsOnTrack->associatedSurface() << std::endl;
227 }
228 return false;
229 }
230
231 return true;
232}
233
234void
236{
237 // The extra "hidden" bit we save (1<<NumberOfPersistencyHints)
238 // is to dissalow repeated calls to setHints(0).
239 uint8_t exp = 0;
240 if (!m_hints.compare_exchange_strong(
241 exp, hints | (1 << NumberOfPersistencyHints))) {
242 throw std::runtime_error(
243 "TSOS trying to set again already set Persistification Hints");
244 }
245}
246
249MsgStream&
250operator<<(MsgStream& sl, const TrackStateOnSurface& tsos)
251{
252 std::string name("TrackStateOnSurface: ");
253 sl << name << "\t of type : " << tsos.dumpType() << endmsg;
254
255 if (sl.level() < MSG::INFO) {
256 sl << name << "Detailed dump of contained objects follows:" << endmsg;
257 sl << (tsos.fitQualityOnSurface()) << "\n (end of FitQualityOnSurface dump)"
258 << endmsg;
259
260 if (tsos.trackParameters() != nullptr) {
261 sl << *(tsos.trackParameters()) << "\n (end of TrackParameters dump)"
262 << endmsg;
263 }
264
265 if (tsos.measurementOnTrack() != nullptr) {
266 sl << *(tsos.measurementOnTrack()) << "\n (end of MeasurementBase dump"
267 << endmsg;
268 }
269
270 if (tsos.materialEffectsOnTrack() != nullptr) {
271 sl << *(tsos.materialEffectsOnTrack())
272 << "\n (end of MaterialEffectsBase dump)" << endmsg;
273 }
274
275 if (tsos.alignmentEffectsOnTrack() != nullptr) {
276 sl << *(tsos.alignmentEffectsOnTrack())
277 << "\n (end of AlignmentEffectsOnTrack dump)" << endmsg;
278 }
279 }
280 return sl;
281}
282
283std::ostream&
284operator<<(std::ostream& sl, const TrackStateOnSurface& tsos)
285{
286 std::string name("TrackStateOnSurface: ");
287 sl << name << "\t of type : " << tsos.dumpType() << std::endl;
288
289 sl << "\t FitQualityOnSurface(s)." << std::endl;
290 sl << "\t \t" << (tsos.fitQualityOnSurface()) << std::endl;
291
292 if (tsos.trackParameters() != nullptr) {
293 sl << "\t HAS TrackParameter(s)." << std::endl;
294 sl << "\t \t" << *(tsos.trackParameters()) << std::endl;
295 } else {
296 sl << "\t NO TrackParameters." << std::endl;
297 }
298
299 if (tsos.measurementOnTrack() != nullptr) {
300 sl << "\t HAS MeasurementBase(s)." << std::endl;
301 sl << "\t \t" << *(tsos.measurementOnTrack()) << std::endl;
302 } else {
303 sl << "\t NO MeasurementBase." << std::endl;
304 }
305
306 if (tsos.materialEffectsOnTrack() != nullptr) {
307 sl << "\t HAS MaterialEffectsBase." << std::endl;
308 sl << "\t \t" << *(tsos.materialEffectsOnTrack()) << std::endl;
309 } else {
310 sl << "\t NO MaterialEffects." << std::endl;
311 }
312
313 if (tsos.alignmentEffectsOnTrack() != nullptr) {
314 sl << "\t HAS AlignmentEffectsOnTrack." << std::endl;
315 sl << "\t \t" << *(tsos.alignmentEffectsOnTrack()) << std::endl;
316 } else {
317 sl << "\t NO AlignmentEffectsOnTrack." << std::endl;
318 }
319 return sl;
320}
321} // namespace Trk
#define endmsg
Class to represent misalignments or 'discontinuities' on tracks These have a surface where the z axis...
Abstract Base Class for tracking surfaces.
represents the track state (measurement, material, fit parameters and quality) at a surface.
const std::bitset< NumberOfTrackStateOnSurfaceTypes > types() const
returns a bitset with the types of this bitset.
virtual TrackStateOnSurface * clone() const
Pseudo-constructor: needed to avoid excessive RTTI.
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
std::unique_ptr< TrackParameters > m_trackParameters
std::unique_ptr< MeasurementBase > m_measurementOnTrack
void setFlags()
set sensible default flags
TrackStateOnSurface()
Default ctor for POOL.
std::unique_ptr< MaterialEffectsBase > m_materialEffectsOnTrack
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
const std::bitset< NumberOfPersistencyHints > hints() const
Use this method to get the persistification hints.
std::string dumpType() const
returns a string with the expanded type of the object (i.e.
void setHints(const uint8_t hints) const
Use this method to set persistification hints.
const FitQualityOnSurface & fitQualityOnSurface() const
return FitQuality On Surface const overload
Trk::TrackStateOnSurface & operator=(const Trk::TrackStateOnSurface &rhs)
std::atomic< uint8_t > m_hints
bool type(const TrackStateOnSurfaceType type) const
Use this method to find out if the TSoS is of a certain type: i.e.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ BremPoint
This represents a brem point on the track, and so will contain TrackParameters and MaterialEffectsBas...
@ Parameter
This TSOS contains a Trk::ParameterBase.
@ Alignment
This TSOS contains a Trk::AlignmentEffectsOnTrack.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ InertMaterial
This represents inert material, and so will contain MaterialEffectsBase.
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
@ Hole
A hole on the track - this is defined in the following way.
@ CaloDeposit
This TSOS contains a CaloEnergy object.
@ FitQuality
This TSOS contains a Trk::FitQualityOnSurface.
std::unique_ptr< AlignmentEffectsOnTrack > m_alignmentEffectsOnTrack
const MaterialEffectsBase * materialEffectsOnTrack() const
return material effects const overload
FitQualityOnSurface m_fitQualityOnSurface
const Trk::Surface & surface() const
return associated surface
const AlignmentEffectsOnTrack * alignmentEffectsOnTrack() const
return the the alignment effects const overload
Ensure that the ATLAS eigen extensions are properly loaded.
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
bool consistentSurfaces(U)
STL namespace.