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 
15  // reset
16  sensors_map_.clear();
17  rps_map_.clear();
18  stations_in_arm_.clear();
19  rps_in_station_.clear();
20  dets_in_rp_.clear();
21 
22  // propagate through the GeometricalDet structure and add all detectors to 'sensors_map_'
23  std::deque<const DetGeomDesc*> buffer;
24  buffer.emplace_back(gD);
25  while (!buffer.empty()) {
26  const DetGeomDesc* d = buffer.front();
27  buffer.pop_front();
28 
29  // check if it is a sensor
30  if (d->name() == DDD_TOTEM_RP_SENSOR_NAME ||
31  std::regex_match(d->name(), std::regex(DDD_TOTEM_TIMING_SENSOR_TMPL)) ||
34  addSensor(d->geographicalID(), d);
35 
36  // check if it is a RP
37  if (d->name() == DDD_TOTEM_RP_RP_NAME || d->name() == DDD_TOTEM_TIMING_RP_NAME ||
39  addRP(d->geographicalID(), d);
40 
41  for (const auto& comp : d->components())
42  buffer.emplace_back(comp);
43  }
44 
45  // build sets
46  for (const auto& it : sensors_map_) {
47  const CTPPSDetId detId(it.first);
48  const CTPPSDetId rpId = detId.rpId();
49  const CTPPSDetId stId = detId.stationId();
50  const CTPPSDetId armId = detId.armId();
51 
52  stations_in_arm_[armId].insert(armId);
53  rps_in_station_[stId].insert(rpId);
54  dets_in_rp_[rpId].insert(detId);
55  }
56 }
57 
58 //----------------------------------------------------------------------------------------------------
59 
60 bool CTPPSGeometry::addSensor(unsigned int id, const DetGeomDesc*& gD) {
61  if (sensors_map_.find(id) != sensors_map_.end())
62  return false;
63 
64  sensors_map_[id] = gD;
65  return true;
66 }
67 
68 //----------------------------------------------------------------------------------------------------
69 
70 bool CTPPSGeometry::addRP(unsigned int id, const DetGeomDesc*& gD) {
71  if (rps_map_.find(id) != rps_map_.end())
72  return false;
73 
74  rps_map_[id] = gD;
75  return true;
76 }
77 
78 //----------------------------------------------------------------------------------------------------
79 
80 const DetGeomDesc* CTPPSGeometry::sensor(unsigned int id) const {
81  auto g = sensorNoThrow(id);
82  if (nullptr == g) {
83  throw cms::Exception("CTPPSGeometry") << "Not found detector with ID " << id << ", i.e. " << CTPPSDetId(id);
84  }
85  return g;
86 }
87 
88 //----------------------------------------------------------------------------------------------------
89 
90 const DetGeomDesc* CTPPSGeometry::sensorNoThrow(unsigned int id) const noexcept {
91  auto it = sensors_map_.find(id);
92  if (it == sensors_map_.end()) {
93  return nullptr;
94  }
95  return it->second;
96 }
97 
98 //----------------------------------------------------------------------------------------------------
99 
100 const DetGeomDesc* CTPPSGeometry::rp(unsigned int id) const {
101  auto rp = rpNoThrow(id);
102  if (nullptr == rp) {
103  throw cms::Exception("CTPPSGeometry") << "Not found RP device with ID " << id << ", i.e. " << CTPPSDetId(id);
104  }
105  return rp;
106 }
107 
108 //----------------------------------------------------------------------------------------------------
109 
110 const DetGeomDesc* CTPPSGeometry::rpNoThrow(unsigned int id) const noexcept {
111  auto it = rps_map_.find(id);
112  if (it == rps_map_.end()) {
113  return nullptr;
114  }
115 
116  return it->second;
117 }
118 
119 //----------------------------------------------------------------------------------------------------
120 const std::set<unsigned int>& CTPPSGeometry::stationsInArm(unsigned int id) const {
121  auto it = stations_in_arm_.find(id);
122  if (it == stations_in_arm_.end())
123  throw cms::Exception("CTPPSGeometry") << "Arm with ID " << id << " not found.";
124  return it->second;
125 }
126 
127 //----------------------------------------------------------------------------------------------------
128 
129 const std::set<unsigned int>& CTPPSGeometry::rpsInStation(unsigned int id) const {
130  auto it = rps_in_station_.find(id);
131  if (it == rps_in_station_.end())
132  throw cms::Exception("CTPPSGeometry") << "Station with ID " << id << " not found.";
133  return it->second;
134 }
135 
136 //----------------------------------------------------------------------------------------------------
137 
138 const std::set<unsigned int>& CTPPSGeometry::sensorsInRP(unsigned int id) const {
139  auto it = dets_in_rp_.find(id);
140  if (it == dets_in_rp_.end())
141  throw cms::Exception("CTPPSGeometry") << "RP with ID " << id << " not found.";
142  return it->second;
143 }
144 
145 //----------------------------------------------------------------------------------------------------
146 
147 CLHEP::Hep3Vector CTPPSGeometry::localToGlobal(const DetGeomDesc* gd, const CLHEP::Hep3Vector& r) const {
148  return gd->rotation() * r + CLHEP::Hep3Vector(gd->translation().x(), gd->translation().y(), gd->translation().z());
149 }
150 
151 //----------------------------------------------------------------------------------------------------
152 
153 CLHEP::Hep3Vector CTPPSGeometry::localToGlobal(unsigned int id, const CLHEP::Hep3Vector& r) const {
154  return localToGlobal(sensor(id), r);
155 }
156 
157 //----------------------------------------------------------------------------------------------------
158 
159 CLHEP::Hep3Vector CTPPSGeometry::globalToLocal(const DetGeomDesc* gd, const CLHEP::Hep3Vector& r) const {
160  return gd->rotation().Inverse() *
161  (r - CLHEP::Hep3Vector(gd->translation().x(), gd->translation().y(), gd->translation().z()));
162 }
163 
164 //----------------------------------------------------------------------------------------------------
165 
166 CLHEP::Hep3Vector CTPPSGeometry::globalToLocal(unsigned int id, const CLHEP::Hep3Vector& r) const {
167  return globalToLocal(sensor(id), r);
168 }
169 
170 //----------------------------------------------------------------------------------------------------
171 
172 CLHEP::Hep3Vector CTPPSGeometry::localToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector& dir) const {
173  return sensor(id)->rotation() * dir;
174 }
175 
176 //----------------------------------------------------------------------------------------------------
177 
178 CLHEP::Hep3Vector CTPPSGeometry::globalToLocalDirection(unsigned int id, const CLHEP::Hep3Vector& dir) const {
179  return sensor(id)->rotation().Inverse() * dir;
180 }
181 
182 //----------------------------------------------------------------------------------------------------
183 
184 CLHEP::Hep3Vector CTPPSGeometry::sensorTranslation(unsigned int id) const {
185  auto gd = sensor(id);
186  return CLHEP::Hep3Vector(gd->translation().x(), gd->translation().y(), gd->translation().z());
187 }
188 
189 //----------------------------------------------------------------------------------------------------
190 
191 CLHEP::Hep3Vector CTPPSGeometry::rpTranslation(unsigned int id) const {
192  auto gd = rp(id);
193  return CLHEP::Hep3Vector(gd->translation().x(), gd->translation().y(), gd->translation().z());
194 }
Translation translation() const
Definition: DetGeomDesc.h:65
const std::string DDD_CTPPS_PIXELS_RP_NAME
Definition: CTPPSDDDNames.h:22
DetId geographicalID() const
Definition: DetGeomDesc.h:53
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...
const DetGeomDesc * rpNoThrow(unsigned int id) const
const DetGeomDesc * rp(unsigned int id) const
returns geometry of a RP box
const std::string DDD_TOTEM_TIMING_RP_NAME
Definition: CTPPSDDDNames.h:25
const std::set< unsigned int > & rpsInStation(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
CLHEP::Hep3Vector sensorTranslation(unsigned int id) const
CTPPSDetId rpId() const
Definition: CTPPSDetId.h:78
const std::string DDD_CTPPS_DIAMONDS_SEGMENT_NAME
Definition: CTPPSDDDNames.h:16
CTPPSDetId stationId() const
Definition: CTPPSDetId.h:76
CLHEP::Hep3Vector rpTranslation(unsigned int id) const
void build(const DetGeomDesc *)
build up from DetGeomDesc structure
Geometrical description of a sensor.
Definition: DetGeomDesc.h:35
Container components() const
access to the tree structure
Definition: DetGeomDesc.cc:54
const std::string DDD_TOTEM_TIMING_SENSOR_TMPL
Definition: CTPPSDDDNames.h:18
CLHEP::Hep3Vector localToGlobal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
CTPPSDetId armId() const
Definition: CTPPSDetId.h:74
d
Definition: ztail.py:151
RotationMatrix rotation() const
geometry information
Definition: DetGeomDesc.h:64
const std::string & name() const
Definition: DetGeomDesc.h:66
#define noexcept
const std::set< unsigned int > & sensorsInRP(unsigned int) const
after checks returns set of sensor ids corresponding to the given RP id
const DetGeomDesc * sensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
const std::string DDD_TOTEM_RP_RP_NAME
DDD names of RP volumes.
Definition: CTPPSDDDNames.h:21
mapSetType rps_in_station_
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
const std::set< unsigned int > & stationsInArm(unsigned int) const
after checks returns set of station ids corresponding to the given arm id
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
mapSetType dets_in_rp_
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
bool addRP(unsigned int id, const DetGeomDesc *&)
adds a RP box to a map
const DetGeomDesc * sensorNoThrow(unsigned int id) const
const std::string DDD_CTPPS_UFSD_SEGMENT_NAME
Definition: CTPPSDDDNames.h:17