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 
11 //----------------------------------------------------------------------------------------------------
12 
13 void
15 {
16  // reset
17  sensors_map_.clear();
18  rps_map_.clear();
19  stations_in_arm_.clear();
20  rps_in_station_.clear();
21  dets_in_rp_.clear();
22 
23  // propagate through the GeometricalDet structure and add all detectors to 'sensors_map_'
24  std::deque<const DetGeomDesc *> buffer;
25  buffer.emplace_back(gD);
26  while ( !buffer.empty() ) {
27  const DetGeomDesc *d = buffer.front();
28  buffer.pop_front();
29 
30  // check if it is a sensor
31  if ( d->name().name() == DDD_TOTEM_RP_SENSOR_NAME
33  || d->name().name() == DDD_CTPPS_PIXELS_SENSOR_NAME ) {
34  addSensor(d->geographicalID(), d);
35  }
36 
37  // check if it is a RP
38  if ( d->name().name() == DDD_TOTEM_RP_RP_NAME
40  || d->name().name() == DDD_CTPPS_DIAMONDS_RP_NAME ) {
41  addRP( d->geographicalID(), d );
42  }
43 
44  for ( unsigned int i = 0; i < d->components().size(); i++ )
45  buffer.emplace_back( d->components()[i] );
46  }
47 
48  // build sets
49  for ( const auto& it : sensors_map_ ) {
50  const CTPPSDetId detId( it.first );
51  const CTPPSDetId rpId = detId.getRPId();
52  const CTPPSDetId stId = detId.getStationId();
53  const CTPPSDetId armId = detId.getArmId();
54 
55  stations_in_arm_[armId].insert( armId );
56  rps_in_station_[stId].insert( rpId );
57  dets_in_rp_[rpId].insert( detId );
58  }
59 }
60 
61 //----------------------------------------------------------------------------------------------------
62 
63 bool
64 CTPPSGeometry::addSensor( unsigned int id, const DetGeomDesc*& gD )
65 {
66  if ( sensors_map_.find( id ) != sensors_map_.end() ) return false;
67 
68  sensors_map_[id] = gD;
69  return true;
70 }
71 
72 //----------------------------------------------------------------------------------------------------
73 
74 bool
75 CTPPSGeometry::addRP( unsigned int id, const DetGeomDesc*& gD )
76 {
77  if ( rps_map_.find( id ) != rps_map_.end() ) return false;
78 
79  rps_map_[id] = const_cast<DetGeomDesc*>( gD );
80  return true;
81 }
82 
83 //----------------------------------------------------------------------------------------------------
84 
85 const DetGeomDesc*
86 CTPPSGeometry::getSensor( unsigned int id ) const
87 {
88  auto it = sensors_map_.find( id );
89  if ( it == sensors_map_.end() )
90  throw cms::Exception("CTPPSGeometry") << "Not found detector with ID " << id << ", i.e. "
91  << CTPPSDetId( id );
92 
93  return it->second;
94 }
95 
96 //----------------------------------------------------------------------------------------------------
97 
98 const DetGeomDesc*
99 CTPPSGeometry::getRP( unsigned int id ) const
100 {
101  auto it = rps_map_.find( id );
102  if ( it == rps_map_.end() )
103  throw cms::Exception("CTPPSGeometry") << "Not found RP device with ID " << id << ", i.e. "
104  << CTPPSDetId( id );
105 
106  return it->second;
107 }
108 
109 //----------------------------------------------------------------------------------------------------
110 const std::set<unsigned int>&
111 CTPPSGeometry::getStationsInArm( unsigned int id ) const
112 {
113  auto it = stations_in_arm_.find( id );
114  if ( it == stations_in_arm_.end() )
115  throw cms::Exception("CTPPSGeometry") << "Arm with ID " << id << " not found.";
116  return it->second;
117 }
118 
119 //----------------------------------------------------------------------------------------------------
120 
121 const std::set<unsigned int>&
122 CTPPSGeometry::getRPsInStation( unsigned int id ) const
123 {
124  auto it = rps_in_station_.find( id );
125  if ( it == rps_in_station_.end() )
126  throw cms::Exception("CTPPSGeometry") << "Station with ID " << id << " not found.";
127  return it->second;
128 }
129 
130 //----------------------------------------------------------------------------------------------------
131 
132 const std::set<unsigned int>&
133 CTPPSGeometry::getSensorsInRP( unsigned int id ) const
134 {
135  auto it = dets_in_rp_.find( id );
136  if ( it == dets_in_rp_.end() )
137  throw cms::Exception("CTPPSGeometry") << "RP with ID " << id << " not found.";
138  return it->second;
139 }
140 
141 //----------------------------------------------------------------------------------------------------
142 
143 CLHEP::Hep3Vector
144 CTPPSGeometry::localToGlobal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
145 {
146  return gd->rotation() * r + CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
147 }
148 
149 //----------------------------------------------------------------------------------------------------
150 
151 CLHEP::Hep3Vector
152 CTPPSGeometry::localToGlobal( unsigned int id, const CLHEP::Hep3Vector& r ) const
153 {
154  return localToGlobal( getSensor( id ), r );
155 }
156 
157 //----------------------------------------------------------------------------------------------------
158 
159 CLHEP::Hep3Vector
160 CTPPSGeometry::globalToLocal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
161 {
162  return gd->rotation().Inverse() * ( r - CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() ) );
163 }
164 
165 //----------------------------------------------------------------------------------------------------
166 
167 CLHEP::Hep3Vector
168 CTPPSGeometry::globalToLocal( unsigned int id, const CLHEP::Hep3Vector& r ) const
169 {
170  return globalToLocal( getSensor( id ), r );
171 }
172 
173 //----------------------------------------------------------------------------------------------------
174 
175 CLHEP::Hep3Vector
176 CTPPSGeometry::localToGlobalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
177 {
178  return getSensor( id )->rotation() * dir;
179 }
180 
181 //----------------------------------------------------------------------------------------------------
182 
183 CLHEP::Hep3Vector
184 CTPPSGeometry::globalToLocalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
185 {
186  return getSensor( id )->rotation().Inverse() * dir;
187 }
188 
189 //----------------------------------------------------------------------------------------------------
190 
191 CLHEP::Hep3Vector
192 CTPPSGeometry::getSensorTranslation( unsigned int id ) const
193 {
194  auto gd = getSensor( id );
195  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
196 }
197 
198 //----------------------------------------------------------------------------------------------------
199 
200 CLHEP::Hep3Vector
201 CTPPSGeometry::getRPTranslation( unsigned int id ) const
202 {
203  auto gd = getRP( id );
204  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
205 }
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
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::set< unsigned int > & getRPsInStation(unsigned int) const
after checks returns set of RP ids corresponding to the given station id
const std::string DDD_CTPPS_DIAMONDS_SEGMENT_NAME
Definition: CTPPSDDDNames.h:17
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
CLHEP::Hep3Vector localToGlobal(const DetGeomDesc *, const CLHEP::Hep3Vector &) 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:90
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