CMS 3D CMS Logo

CTPPSGeometry.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * This is a part of TOTEM offline software.
4 * Authors:
5 * Jan Kaspar (jan.kaspar@gmail.com)
6 *
7 ****************************************************************************/
8 
10 #include <regex>
11 
12 //----------------------------------------------------------------------------------------------------
13 
14 void
16 {
17  // reset
18  sensors_map_.clear();
19  rps_map_.clear();
20  stations_in_arm_.clear();
21  rps_in_station_.clear();
22  dets_in_rp_.clear();
23 
24  // propagate through the GeometricalDet structure and add all detectors to 'sensors_map_'
25  std::deque<const DetGeomDesc *> buffer;
26  buffer.emplace_back(gD);
27  while ( !buffer.empty() ) {
28  const DetGeomDesc *d = buffer.front();
29  buffer.pop_front();
30 
31  // check if it is a sensor
32  if ( d->name().name() == DDD_TOTEM_RP_SENSOR_NAME
33  || std::regex_match( d->name().name(), std::regex( DDD_TOTEM_TIMING_SENSOR_TMPL ) )
37  addSensor( d->geographicalID(), d );
38 
39  // check if it is a RP
40  if ( d->name().name() == DDD_TOTEM_RP_RP_NAME
43  || d->name().name() == DDD_CTPPS_PIXELS_RP_NAME )
44  addRP( d->geographicalID(), d );
45 
46  for ( const auto& comp : d->components() )
47  buffer.emplace_back( comp );
48  }
49 
50  // build sets
51  for ( const auto& it : sensors_map_ ) {
52  const CTPPSDetId detId( it.first );
53  const CTPPSDetId rpId = detId.getRPId();
54  const CTPPSDetId stId = detId.getStationId();
55  const CTPPSDetId armId = detId.getArmId();
56 
57  stations_in_arm_[armId].insert( armId );
58  rps_in_station_[stId].insert( rpId );
59  dets_in_rp_[rpId].insert( detId );
60  }
61 }
62 
63 //----------------------------------------------------------------------------------------------------
64 
65 bool
66 CTPPSGeometry::addSensor( unsigned int id, const DetGeomDesc*& gD )
67 {
68  if ( sensors_map_.find( id ) != sensors_map_.end() ) return false;
69 
70  sensors_map_[id] = gD;
71  return true;
72 }
73 
74 //----------------------------------------------------------------------------------------------------
75 
76 bool
77 CTPPSGeometry::addRP( unsigned int id, const DetGeomDesc*& gD )
78 {
79  if ( rps_map_.find( id ) != rps_map_.end() ) return false;
80 
81  rps_map_[id] = const_cast<DetGeomDesc*>( gD );
82  return true;
83 }
84 
85 //----------------------------------------------------------------------------------------------------
86 
87 const DetGeomDesc*
88 CTPPSGeometry::getSensor( unsigned int id ) const
89 {
90  auto g = getSensorNoThrow(id);
91  if(nullptr ==g) {
92  throw cms::Exception("CTPPSGeometry") << "Not found detector with ID " << id << ", i.e. "
93  << CTPPSDetId( id );
94  }
95  return g;
96 }
97 
98 //----------------------------------------------------------------------------------------------------
99 
100 const DetGeomDesc*
102 {
103  auto it = sensors_map_.find( id );
104  if ( it == sensors_map_.end() ) {
105  return nullptr;
106  }
107  return it->second;
108 }
109 
110 //----------------------------------------------------------------------------------------------------
111 
112 const DetGeomDesc*
113 CTPPSGeometry::getRP( unsigned int id ) const
114 {
115  auto rp = getRPNoThrow(id);
116  if(nullptr == rp) {
117  throw cms::Exception("CTPPSGeometry") << "Not found RP device with ID " << id << ", i.e. "
118  << CTPPSDetId( id );
119  }
120  return rp;
121 }
122 
123 //----------------------------------------------------------------------------------------------------
124 
125 const DetGeomDesc*
126 CTPPSGeometry::getRPNoThrow( unsigned int id ) const noexcept
127 {
128  auto it = rps_map_.find( id );
129  if ( it == rps_map_.end() ) {
130  return nullptr;
131  }
132 
133  return it->second;
134 }
135 
136 //----------------------------------------------------------------------------------------------------
137 const std::set<unsigned int>&
138 CTPPSGeometry::getStationsInArm( unsigned int id ) const
139 {
140  auto it = stations_in_arm_.find( id );
141  if ( it == stations_in_arm_.end() )
142  throw cms::Exception("CTPPSGeometry") << "Arm with ID " << id << " not found.";
143  return it->second;
144 }
145 
146 //----------------------------------------------------------------------------------------------------
147 
148 const std::set<unsigned int>&
149 CTPPSGeometry::getRPsInStation( unsigned int id ) const
150 {
151  auto it = rps_in_station_.find( id );
152  if ( it == rps_in_station_.end() )
153  throw cms::Exception("CTPPSGeometry") << "Station with ID " << id << " not found.";
154  return it->second;
155 }
156 
157 //----------------------------------------------------------------------------------------------------
158 
159 const std::set<unsigned int>&
160 CTPPSGeometry::getSensorsInRP( unsigned int id ) const
161 {
162  auto it = dets_in_rp_.find( id );
163  if ( it == dets_in_rp_.end() )
164  throw cms::Exception("CTPPSGeometry") << "RP with ID " << id << " not found.";
165  return it->second;
166 }
167 
168 //----------------------------------------------------------------------------------------------------
169 
170 CLHEP::Hep3Vector
171 CTPPSGeometry::localToGlobal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
172 {
173  return gd->rotation() * r + CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
174 }
175 
176 //----------------------------------------------------------------------------------------------------
177 
178 CLHEP::Hep3Vector
179 CTPPSGeometry::localToGlobal( unsigned int id, const CLHEP::Hep3Vector& r ) const
180 {
181  return localToGlobal( getSensor( id ), r );
182 }
183 
184 //----------------------------------------------------------------------------------------------------
185 
186 CLHEP::Hep3Vector
187 CTPPSGeometry::globalToLocal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
188 {
189  return gd->rotation().Inverse() * ( r - CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() ) );
190 }
191 
192 //----------------------------------------------------------------------------------------------------
193 
194 CLHEP::Hep3Vector
195 CTPPSGeometry::globalToLocal( unsigned int id, const CLHEP::Hep3Vector& r ) const
196 {
197  return globalToLocal( getSensor( id ), r );
198 }
199 
200 //----------------------------------------------------------------------------------------------------
201 
202 CLHEP::Hep3Vector
203 CTPPSGeometry::localToGlobalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
204 {
205  return getSensor( id )->rotation() * dir;
206 }
207 
208 //----------------------------------------------------------------------------------------------------
209 
210 CLHEP::Hep3Vector
211 CTPPSGeometry::globalToLocalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
212 {
213  return getSensor( id )->rotation().Inverse() * dir;
214 }
215 
216 //----------------------------------------------------------------------------------------------------
217 
218 CLHEP::Hep3Vector
219 CTPPSGeometry::getSensorTranslation( unsigned int id ) const
220 {
221  auto gd = getSensor( id );
222  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
223 }
224 
225 //----------------------------------------------------------------------------------------------------
226 
227 CLHEP::Hep3Vector
228 CTPPSGeometry::getRPTranslation( unsigned int id ) const
229 {
230  auto gd = getRP( id );
231  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
232 }
const std::string DDD_CTPPS_PIXELS_RP_NAME
Definition: CTPPSDDDNames.h:22
DDRotationMatrix rotation() const
geometry information
Definition: DetGeomDesc.h:83
const std::set< unsigned int > & getStationsInArm(unsigned int) const
after checks returns set of station ids corresponding to the given arm id
const DetGeomDesc * getSensorNoThrow(unsigned int id) const
#define noexcept
mapSetType stations_in_arm_
map: parent ID -> set of subelements E.g. stations_in_arm_ is map of arm ID -> set of stations (in th...
CTPPSDetId getStationId() const
Definition: CTPPSDetId.h:92
const std::string DDD_TOTEM_TIMING_RP_NAME
Definition: CTPPSDDDNames.h:24
const std::set< unsigned int > & getRPsInStation(unsigned int) const
after checks returns set of RP ids corresponding to the given station id
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
const std::string DDD_CTPPS_DIAMONDS_SEGMENT_NAME
Definition: CTPPSDDDNames.h:16
const DetGeomDesc * getSensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
void build(const DetGeomDesc *)
build up from DetGeomDesc structure
virtual ConstContainer components() const
access to the tree structure
Definition: DetGeomDesc.cc:123
Geometrical description of a sensor.
Definition: DetGeomDesc.h:37
DDTranslation translation() const
Definition: DetGeomDesc.h:84
CTPPSDetId getRPId() const
Definition: CTPPSDetId.h:97
DDName name() const
Definition: DetGeomDesc.h:87
const std::string DDD_TOTEM_TIMING_SENSOR_TMPL
Definition: CTPPSDDDNames.h:18
CLHEP::Hep3Vector localToGlobal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
const DetGeomDesc * getRPNoThrow(unsigned int id) const
CLHEP::Hep3Vector getRPTranslation(unsigned int id) const
CTPPSDetId getArmId() const
Definition: CTPPSDetId.h:87
const std::string DDD_TOTEM_RP_RP_NAME
DDD names of RP volumes.
Definition: CTPPSDDDNames.h:21
mapSetType rps_in_station_
virtual DetId geographicalID() const
Definition: DetGeomDesc.h:61
CLHEP::Hep3Vector localToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector &) const
const std::string DDD_CTPPS_DIAMONDS_RP_NAME
Definition: CTPPSDDDNames.h:23
RPDeviceMapType rps_map_
map: rp id –> DetGeomDesc
CLHEP::Hep3Vector globalToLocalDirection(unsigned int id, const CLHEP::Hep3Vector &) const
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
bool addSensor(unsigned int, const DetGeomDesc *&)
adds an item to the map (detector ID –> DetGeomDesc) performs necessary checks
const std::string DDD_TOTEM_RP_SENSOR_NAME
DDD names of sensors.
Definition: CTPPSDDDNames.h:14
CLHEP::Hep3Vector getSensorTranslation(unsigned int id) const
dbl *** dir
Definition: mlp_gen.cc:35
mapSetType dets_in_rp_
const std::set< unsigned int > & getSensorsInRP(unsigned int) const
after checks returns set of sensor ids corresponding to the given RP id
const std::string DDD_CTPPS_PIXELS_SENSOR_NAME
Definition: CTPPSDDDNames.h:15
mapType sensors_map_
map: sensor id –> DetGeomDesc
CLHEP::Hep3Vector globalToLocal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
const std::string & name() const
Returns the name.
Definition: DDName.cc:53
const DetGeomDesc * getRP(unsigned int id) const
returns geometry of a RP box
bool addRP(unsigned int id, const DetGeomDesc *&)
adds a RP box to a map
const std::string DDD_CTPPS_UFSD_SEGMENT_NAME
Definition: CTPPSDDDNames.h:17