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
34  || d->name().name() == DDD_CTPPS_PIXELS_SENSOR_NAME ) {
35  addSensor(d->geographicalID(), d);
36  }
37 
38  // check if it is a RP
39  if ( d->name().name() == DDD_TOTEM_RP_RP_NAME
42  || d->name().name() == DDD_CTPPS_PIXELS_RP_NAME ) {
43  addRP( d->geographicalID(), d );
44  }
45 
46  for ( unsigned int i = 0; i < d->components().size(); i++ )
47  buffer.emplace_back( d->components()[i] );
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 it = sensors_map_.find( id );
91  if ( it == sensors_map_.end() )
92  throw cms::Exception("CTPPSGeometry") << "Not found detector with ID " << id << ", i.e. "
93  << CTPPSDetId( id );
94 
95  return it->second;
96 }
97 
98 //----------------------------------------------------------------------------------------------------
99 
100 const DetGeomDesc*
101 CTPPSGeometry::getRP( unsigned int id ) const
102 {
103  auto it = rps_map_.find( id );
104  if ( it == rps_map_.end() )
105  throw cms::Exception("CTPPSGeometry") << "Not found RP device with ID " << id << ", i.e. "
106  << CTPPSDetId( id );
107 
108  return it->second;
109 }
110 
111 //----------------------------------------------------------------------------------------------------
112 const std::set<unsigned int>&
113 CTPPSGeometry::getStationsInArm( unsigned int id ) const
114 {
115  auto it = stations_in_arm_.find( id );
116  if ( it == stations_in_arm_.end() )
117  throw cms::Exception("CTPPSGeometry") << "Arm with ID " << id << " not found.";
118  return it->second;
119 }
120 
121 //----------------------------------------------------------------------------------------------------
122 
123 const std::set<unsigned int>&
124 CTPPSGeometry::getRPsInStation( unsigned int id ) const
125 {
126  auto it = rps_in_station_.find( id );
127  if ( it == rps_in_station_.end() )
128  throw cms::Exception("CTPPSGeometry") << "Station with ID " << id << " not found.";
129  return it->second;
130 }
131 
132 //----------------------------------------------------------------------------------------------------
133 
134 const std::set<unsigned int>&
135 CTPPSGeometry::getSensorsInRP( unsigned int id ) const
136 {
137  auto it = dets_in_rp_.find( id );
138  if ( it == dets_in_rp_.end() )
139  throw cms::Exception("CTPPSGeometry") << "RP with ID " << id << " not found.";
140  return it->second;
141 }
142 
143 //----------------------------------------------------------------------------------------------------
144 
145 CLHEP::Hep3Vector
146 CTPPSGeometry::localToGlobal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
147 {
148  return gd->rotation() * r + CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
149 }
150 
151 //----------------------------------------------------------------------------------------------------
152 
153 CLHEP::Hep3Vector
154 CTPPSGeometry::localToGlobal( unsigned int id, const CLHEP::Hep3Vector& r ) const
155 {
156  return localToGlobal( getSensor( id ), r );
157 }
158 
159 //----------------------------------------------------------------------------------------------------
160 
161 CLHEP::Hep3Vector
162 CTPPSGeometry::globalToLocal( const DetGeomDesc* gd, const CLHEP::Hep3Vector& r ) const
163 {
164  return gd->rotation().Inverse() * ( r - CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() ) );
165 }
166 
167 //----------------------------------------------------------------------------------------------------
168 
169 CLHEP::Hep3Vector
170 CTPPSGeometry::globalToLocal( unsigned int id, const CLHEP::Hep3Vector& r ) const
171 {
172  return globalToLocal( getSensor( id ), r );
173 }
174 
175 //----------------------------------------------------------------------------------------------------
176 
177 CLHEP::Hep3Vector
178 CTPPSGeometry::localToGlobalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
179 {
180  return getSensor( id )->rotation() * dir;
181 }
182 
183 //----------------------------------------------------------------------------------------------------
184 
185 CLHEP::Hep3Vector
186 CTPPSGeometry::globalToLocalDirection( unsigned int id, const CLHEP::Hep3Vector& dir ) const
187 {
188  return getSensor( id )->rotation().Inverse() * dir;
189 }
190 
191 //----------------------------------------------------------------------------------------------------
192 
193 CLHEP::Hep3Vector
194 CTPPSGeometry::getSensorTranslation( unsigned int id ) const
195 {
196  auto gd = getSensor( id );
197  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
198 }
199 
200 //----------------------------------------------------------------------------------------------------
201 
202 CLHEP::Hep3Vector
203 CTPPSGeometry::getRPTranslation( unsigned int id ) const
204 {
205  auto gd = getRP( id );
206  return CLHEP::Hep3Vector( gd->translation().x(), gd->translation().y(), gd->translation().z() );
207 }
const std::string DDD_CTPPS_PIXELS_RP_NAME
Definition: CTPPSDDDNames.h:23
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
const std::string DDD_CTPPS_UFSD_PLANE_NAME
Definition: CTPPSDDDNames.h:25
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:22
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:24
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
const std::string DDD_CTPPS_UFSD_SEGMENT_NAME
Definition: CTPPSDDDNames.h:18