ATLAS Offline Software
Loading...
Searching...
No Matches
RoiDescriptor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5/**************************************************************************
6 ** @file RoiDescriptor.cxx
7 ** @author sutt@cern.ch
8 **
9 ** Description: standalone RoIDescriptor implementation
10 **
11 ** Created: Tue 5 Aug 2014 00:13:41 CEST
12 ** Modified:
13 **************************************************************************/
14
17
18#include <cmath>
19#include <sstream>
20#include <stdexcept>
21
22
23namespace {
24 constexpr double M_2PI = 2*M_PI;
26 constexpr float M_PIF = M_PI;
27 constexpr int RoiVersion = 4;
28}
29
30std::atomic<double> RoiDescriptor::s_zedWidthDefault = 225;
31std::atomic<bool> RoiDescriptor::s_firstInstanceCreated = false;
32
34{
36 throw std::runtime_error("Cannot set default z-width because a RoiDescriptor has already been created");
37 }
39}
40
42 : m_phi(0), m_eta(0), m_zed(0),
43 m_phiMinus(0), m_phiPlus(0),
44 m_etaMinus(0), m_etaPlus(0),
46 m_dzdrMinus(0), m_dzdrPlus(0),
47 m_drdzMinus(0), m_drdzPlus(0),
49 m_fullscan(fullscan),
50 m_composite(false),
52 m_version(RoiVersion)
53{
59 if ( m_fullscan ) construct( 0, -5, 5, 0, -M_PI, M_PI, 0, -s_zedWidthDefault, s_zedWidthDefault );
60}
61
62
63RoiDescriptor::RoiDescriptor(double eta_, double etaMinus_, double etaPlus_,
64 double phi_, double phiMinus_, double phiPlus_,
65 double zed_, double zedMinus_, double zedPlus_)
66 : m_phi(RoiUtil::phicheck(phi_)), m_eta(RoiUtil::etacheck(eta_)), m_zed(RoiUtil::zedcheck(zed_)),
67 m_phiMinus(0), m_phiPlus(0),
68 m_etaMinus(0), m_etaPlus(0),
69 m_zedMinus(0), m_zedPlus(0),
70 m_dzdrMinus(0), m_dzdrPlus(0),
71 m_drdzMinus(0), m_drdzPlus(0),
73 m_fullscan(false),
74 m_composite(false),
76 m_version(RoiVersion)
77{
78 construct( eta_, etaMinus_, etaPlus_, phi_, phiMinus_, phiPlus_, zed_, zedMinus_, zedPlus_ );
79}
80
81
82RoiDescriptor::RoiDescriptor(double etaMinus_, double etaPlus_,
83 double phiMinus_, double phiPlus_ )
84 : m_phi(0), m_eta(0), m_zed(0),
85 m_phiMinus(0), m_phiPlus(0),
86 m_etaMinus(0), m_etaPlus(0),
87 m_zedMinus(0), m_zedPlus(0),
88 m_dzdrMinus(0), m_dzdrPlus(0),
89 m_drdzMinus(0), m_drdzPlus(0),
91 m_fullscan(false),
92 m_composite(false),
94 m_version(RoiVersion)
95{
96 double eta_ = 0.5*(etaMinus_+etaPlus_);
97 double phi_ = 0.5*(phiMinus_+phiPlus_);
98
99 if ( phiMinus_>phiPlus_ ) phi_ += M_PI;
100 if ( phi_<-M_PI ) phi_ += M_2PI;
101 if ( phi_>M_PI ) phi_ -= M_2PI;
102
103 construct( eta_, etaMinus_, etaPlus_, phi_, phiMinus_, phiPlus_, 0, -s_zedWidthDefault, s_zedWidthDefault );
104}
105
106
108 m_phi(roi.phi()), m_eta(roi.eta()), m_zed(roi.zed()),
109 m_phiMinus(0), m_phiPlus(0),
110 m_etaMinus(0), m_etaPlus(0),
111 m_zedMinus(0), m_zedPlus(0),
112 m_dzdrMinus(0), m_dzdrPlus(0),
113 m_drdzMinus(0), m_drdzPlus(0),
115 m_fullscan(roi.isFullscan()),
116 m_composite(roi.composite()),
118 m_version(roi.version()) {
119
121
122}
123
125
126
128
129 if ( this==&roi ) return *this;
130 construct( roi );
131 m_fullscan = roi.isFullscan();
132 m_composite = roi.composite();
134 m_version = roi.version();
135
136 if ( roi.size()>0 ) {
137 if ( m_manageConstituents ) {
139 for ( unsigned i=0 ; i<roi.size() ; i++ ) push_back( new RoiDescriptor( *roi.at(i) ) );
140 }
141 else {
143 for ( unsigned i=0 ; i<roi.size() ; i++ ) push_back( roi.at(i) );
144 }
145 }
146
147 return *this;
148}
149
150
151RoiDescriptor& RoiDescriptor::operator=( const RoiDescriptor& roi ) { return operator=( static_cast<const IRoiDescriptor&>(roi) ); }
152
153
154
156 if ( manageConstituents() ) for ( roi_iterator itr=begin() ; itr!=end() ; itr++ ) delete *itr;
157}
158
159
160void RoiDescriptor::construct(double eta_, double etaMinus_, double etaPlus_,
161 double phi_, double phiMinus_, double phiPlus_,
162 double zed_, double zedMinus_, double zedPlus_)
163{
165
166 m_eta = eta_;
167 m_phi = phi_;
168 m_zed = zed_;
169
170 if ( std::isnan(m_eta) ) throw std::invalid_argument( "RoiDescriptor: eta nan" );
171 if ( std::isnan(m_phi) ) throw std::invalid_argument( "RoiDescriptor: phi nan" );
172 if ( std::isnan(m_zed) ) throw std::invalid_argument( "RoiDescriptor: zed nan" );
173
174
175 m_etaPlus = etaPlus_;
176 m_etaMinus = etaMinus_;
177
178 if ( std::isnan(m_etaPlus) ) throw std::invalid_argument( "RoiDescriptor: etaPlus nan" );
179 if ( std::isnan(m_etaMinus) ) throw std::invalid_argument( "RoiDescriptor: etaMinus nan" );
180
181
182 m_zedMinus = zedMinus_;
183 m_zedPlus = zedPlus_;
184
185 if ( std::isnan(m_zedPlus) ) throw std::invalid_argument( "RoiDescriptor: zedPlus nan" );
186 if ( std::isnan(m_zedMinus) ) throw std::invalid_argument( "RoiDescriptor: zedMinus nan" );
187
188
189 // deal with double -> float M_PI conversion
190
191 m_phiPlus = phiPlus_;
192
193 if ( std::isnan(m_phiPlus) ) throw std::invalid_argument( "RoiDescriptor: phiPlus nan" );
194
195
196 while ( m_phiPlus> M_PIF ) m_phiPlus -= M_2PI;
197 while ( m_phiPlus<-M_PIF ) m_phiPlus += M_2PI;
205 if ( m_phiPlus> M_PI ) m_phiPlus -= 1e-7;
206 if ( m_phiPlus<-M_PI ) m_phiPlus += 1e-7;
207
208
209 m_phiMinus = phiMinus_;
210
211 if ( std::isnan(m_phiMinus) ) throw std::invalid_argument( "RoiDescriptor: phiMinus nan" );
212
213 while ( m_phiMinus<-M_PIF ) m_phiMinus += M_2PI;
214 while ( m_phiMinus> M_PIF ) m_phiMinus -= M_2PI;
216 if ( m_phiMinus> M_PI ) m_phiMinus -= 1e-7;
217 if ( m_phiMinus<-M_PI ) m_phiMinus += 1e-7;
218
219
221
222 m_drdzMinus = std::tan(2*std::atan(std::exp(-etaMinus_)));
223 m_drdzPlus = std::tan(2*std::atan(std::exp(-etaPlus_)));
224
227
228 const double maxR = 1100; // maximum radius of an ID RoI, hmmm should be a configurable parameter?
229
232
233}
234
235
237 construct( roi.eta(), roi.etaMinus(), roi.etaPlus(),
238 roi.phi(), roi.phiMinus(), roi.phiPlus(),
239 roi.zed(), roi.zedMinus(), roi.zedPlus() );
240}
241
244double RoiDescriptor::zedMin(double r) const { return r*m_dzdrMinus+m_zedMinus; }
245double RoiDescriptor::zedMax(double r) const { return r*m_dzdrPlus+m_zedPlus; }
246
247double RoiDescriptor::rhoMin(double z) const { return (z-m_zedMinus)*m_drdzMinus; }
248double RoiDescriptor::rhoMax(double z) const { return (z-m_zedPlus)*m_drdzPlus ; }
249
250
251
253// helper operators
254
255RoiDescriptor::operator std::string() const {
256 std::stringstream ss;
257 ss << " z: " << zed() << " (" << zedMinus() << " - " << zedPlus() << ")"
258 << " eta: " << eta() << " (" << etaMinus() << " - " << etaPlus() << ")"
259 << " phi: " << phi() << " (" << phiMinus() << " - " << phiPlus() << ")"
260 << ( isFullscan() ? " - fullscan": "" );
261 if ( composite() ) {
262 ss << "\t : components: " << size() << "\n";
263 for ( unsigned i=0 ; i<size() ; i++ ) ss << "\t\t" << i << " " << at(i) << " " << *at(i) << "\n";
264 }
265 return ss.str();
266}
267
268std::string str( const RoiDescriptor& d ) {
269 return std::string(d);
270}
271
272std::ostream& operator<<( std::ostream& m, const RoiDescriptor& d ) {
273 return m << std::string(d);
274}
275
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define M_2PI
static Double_t ss
std::ostream & operator<<(std::ostream &m, const RoiDescriptor &d)
static const float M_PIF
#define z
virtual bool isFullscan() const =0
is this a full detector RoI?
virtual double eta() const =0
virtual int version() const =0
which roi version?
virtual double phiPlus() const =0
extreme phi values
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double phiMinus() const =0
virtual double phi() const =0
Methods to retrieve data members.
IRoiDescriptor()
default constructor
virtual double zedMinus() const =0
virtual double zed() const =0
std::vector< constIRoiDescriptor * >::const_iterator roi_iterator
virtual const IRoiDescriptor * at(int i) const =0
find an RoiDescriptor constituent
virtual unsigned size() const =0
number of constituents
virtual double etaMinus() const =0
virtual double etaPlus() const =0
virtual bool composite() const =0
Super RoI access methods.
Describes the Region of Ineterest geometry It has basically 9 parameters.
virtual double etaMinus() const override final
gets eta at zMinus
void push_back(const IRoiDescriptor *roi)
add a RoiDescriptor
bool manageConstituents() const
always manage constituents ???
virtual double etaPlus() const override final
gets eta at zedPlus
virtual double zed() const override final
virtual double zedMax(double r) const override final
static std::atomic< bool > s_firstInstanceCreated
to ensure default width is only set once at job startup
float m_etaPlus
eta of RoI at zedPlus
float m_phi
phi of RoI center
float m_eta
eta of RoI center
static double zedWidthDefault()
float m_dzdrPlus
dz/dr at the front of the RoI
virtual bool isFullscan() const override final
is this a full scan RoI?
RoiDescriptor & operator=(const IRoiDescriptor &r)
float m_etaMinus
eta of RoI at zedMinus
virtual double zedMin(double r) const override final
methods to calculate z position at the RoI boundary at a given radius
RoiDescriptor(bool fullscan=ROI)
default constructor
float m_zedOuterMinus
z at rear of RoI at the outer radius ( = 1100 mm)
virtual double phi() const override final
Methods to retrieve data members.
int m_version
transient version identifier
virtual double rhoMin(double z) const override final
accessors to calculate r position at position z along the RoI boundaries
float m_zedMinus
z position at most negative position along the beamline
virtual double phiMinus() const override final
gets phiMinus
bool m_composite
flag this as a composite RoI
bool m_manageConstituents
flag to determine whether consituents should be managed
float m_dzdrMinus
dz/dr at the rear of the RoI
float m_drdzPlus
dr/dz at the front of the RoI
float m_zed
zed of RoI center
virtual roi_iterator begin() const override final
iterators
void construct(double eta, double etaMinus, double etaPlus, double phi, double phiMinus, double phiPlus, double zed, double zedMinus, double zedPlus)
construct RoiDescriptor internals - similar to constructors
virtual double zedPlus() const override final
z at the most forward end of the RoI
virtual double zedMinus() const override final
z at the most backward end of the RoI
static std::atomic< double > s_zedWidthDefault
default parameters - there may be better ways, but this will do
virtual double rhoMax(double z) const override final
float m_drdzMinus
dr/dz at the rear of the RoI
virtual const IRoiDescriptor * at(int i) const override final
find an RoiDescriptor constituent
float m_phiMinus
most negative RoI in azimuthal
bool m_fullscan
flag this as a full detector RoI
virtual int version() const override final
versioning
float m_phiPlus
most positive RoI in azimuthal
virtual unsigned size() const override final
number of constituents
virtual ~RoiDescriptor()
virtual double eta() const override final
virtual bool composite() const override final
SuperRoI compatability methods.
float m_zedPlus
z position at most positive position along the beamline
virtual roi_iterator end() const override final
float m_zedOuterPlus
z at front of RoI at the outer radius ( = 1100 mm)
virtual double phiPlus() const override final
gets phiPlus
int r
Definition globals.cxx:22