CMS 3D CMS Logo

TotemRPGeometry.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 
12 #include <iostream>
14 
15 using namespace std;
16 
17 //----------------------------------------------------------------------------------------------------
18 
20 {
21  // propagate through the GeometricalDet structure and add
22  // all detectors to 'theMap'
23  deque<const DetGeomDesc *> buffer;
24  buffer.push_back(gD);
25  while (buffer.size() > 0)
26  {
27  const DetGeomDesc *d = buffer.front();
28  buffer.pop_front();
29 
30  // check if it is RP detector
31  if (! d->name().name().compare(DDD_TOTEM_RP_DETECTOR_NAME)
32  or d->name().name().compare(DDD_CTPPS_DIAMONDS_DETECTOR_NAME)==0)
33  AddDetector(d->geographicalID(), d);
34 
35  // check if it is RP device (primary vacuum)
36  if (! d->name().name().compare(DDD_TOTEM_RP_PRIMARY_VACUUM_NAME))
37  AddRPDevice(d->geographicalID(), d);
38 
39  for (unsigned int i = 0; i < d->components().size(); i++)
40  buffer.push_back(d->components()[i]);
41  }
42 
43  // build sets from theMap
44  BuildSets();
45 
46  return 0;
47 }
48 
49 //----------------------------------------------------------------------------------------------------
50 
51 char TotemRPGeometry::AddDetector(unsigned int id, const DetGeomDesc* &gD)
52 {
53  // check if the ID is already in map
54  if (theMap.find(id) != theMap.end())
55  return 1;
56 
57  // add gD
58  theMap[id] = gD;
59  return 0;
60 }
61 
62 //----------------------------------------------------------------------------------------------------
63 
64 const DetGeomDesc* TotemRPGeometry::GetDetector(unsigned int id) const
65 {
66  // check if id is RP id?
67 
68  // check if there is a corresponding key
69 // std::cout<<"TotemRPGeometry::GetDetector entered, id="<<id<<std::endl;
70  mapType::const_iterator it = theMap.find(id);
71  if (it == theMap.end())
72  throw cms::Exception("TotemRPGeometry") << "Not found detector with ID " << id << ", i.e. "
73  << CTPPSDetId(id);
74 
75  // the [] operator cannot be used as this method is const
76  // and it must be const and one gets TotemRPGeometry const
77  // from EventSetup
78  //std::cout<<"det. retrieved:"<<id<<std::endl;
79  return (*it).second;
80 }
81 
82 //----------------------------------------------------------------------------------------------------
83 
84 CLHEP::Hep3Vector TotemRPGeometry::GetDetEdgePosition(unsigned int id) const
85 {
86  // hardcoded for now, values taken from RP_Hybrid.xml
87  // +-------+
88  // | |
89  // | + (0,0)
90  // *(x,y) |
91  // \-----+
92  // x=-RP_Det_Size_a/2+RP_Det_Edge_Length/(2*sqrt(2))
93  // y=x
94  // ideally we would get this from the geometry in the event setup
95  double x=-36.07/2+22.276/(2*sqrt(2));
96  return LocalToGlobal(id, CLHEP::Hep3Vector(x, x, 0.));
97 }
98 
99 // Left edge: -18.0325, -2.2209 ; Right edge: -2.2209, -18.0325
100 
101 //----------------------------------------------------------------------------------------------------
102 
103 CLHEP::Hep3Vector TotemRPGeometry::GetDetEdgeNormalVector(unsigned int id) const
104 {
105  return GetDetector(id)->rotation() * CLHEP::Hep3Vector(-sqrt(2)/2, -sqrt(2)/2, 0.);
106 }
107 
108 //----------------------------------------------------------------------------------------------------
109 
110 char TotemRPGeometry::AddRPDevice(unsigned int id, const DetGeomDesc* &gD)
111 {
112  // check if the copy_no is already in map
113  if (theRomanPotMap.find(id) != theRomanPotMap.end())
114  return 1;
115 
116  // add gD
117  theRomanPotMap[id] = (DetGeomDesc*) gD;
118  return 0;
119 }
120 
121 //----------------------------------------------------------------------------------------------------
122 
123 const DetGeomDesc* TotemRPGeometry::GetRPDevice(unsigned int id) const
124 {
125  // check if there is a corresponding key
126  RPDeviceMapType::const_iterator it = theRomanPotMap.find(id);
127  if (it == theRomanPotMap.end())
128  throw cms::Exception("TotemRPGeometry") << "Not found RP device with ID " << id << ", i.e. "
129  << TotemRPDetId(id);
130 
131  return (*it).second;
132 }
133 
134 //----------------------------------------------------------------------------------------------------
135 
136 CLHEP::Hep3Vector TotemRPGeometry::GetRPThinFoilPosition(int copy_no) const
137 {
138  // hardcoded for now, taken from RP_Box.xml:RP_Box_primary_vacuum_y
139  // ideally we would get this from the geometry in the event setup
140  return LocalToGlobal(GetRPDevice(copy_no), CLHEP::Hep3Vector(0., -135.65/2.0, 0.));
141 }
142 
143 //----------------------------------------------------------------------------------------------------
144 
145 CLHEP::Hep3Vector TotemRPGeometry::GetRPThinFoilNormalVector(int copy_no) const
146 {
147  return GetRPDevice(copy_no)->rotation() * CLHEP::Hep3Vector(0., -1., 0.);
148 }
149 
150 //----------------------------------------------------------------------------------------------------
151 
153 {
154  // reset
155  stationsInArm.clear();
156  rpsInStation.clear();
157  detsInRP.clear();
158 
159  // build
160  for (mapType::const_iterator it = theMap.begin(); it != theMap.end(); ++it)
161  {
162  const CTPPSDetId detId(it->first);
163  const CTPPSDetId rpId = detId.getRPId();
164  const CTPPSDetId stId = detId.getStationId();
165  const CTPPSDetId armId = detId.getArmId();
166 
167  stationsInArm[armId].insert(armId);
168  rpsInStation[stId].insert(rpId);
169  detsInRP[rpId].insert(detId);
170  }
171 }
172 
173 //----------------------------------------------------------------------------------------------------
174 std::set<unsigned int> const& TotemRPGeometry::StationsInArm(unsigned int id) const
175 {
176  mapSetType::const_iterator it = stationsInArm.find(id);
177  if (it == stationsInArm.end())
178  throw cms::Exception("TotemRPGeometry") << "Arm with ID " << id << " not found.";
179  return (*it).second;
180 }
181 
182 //----------------------------------------------------------------------------------------------------
183 
184 std::set<unsigned int> const& TotemRPGeometry::RPsInStation(unsigned int id) const
185 {
186  mapSetType::const_iterator it = rpsInStation.find(id);
187  if (it == rpsInStation.end())
188  throw cms::Exception("TotemRPGeometry") << "Station with ID " << id << " not found.";
189  return (*it).second;
190 }
191 
192 //----------------------------------------------------------------------------------------------------
193 
194 std::set<unsigned int> const& TotemRPGeometry::DetsInRP(unsigned int id) const
195 {
196  mapSetType::const_iterator it = detsInRP.find(id);
197  if (it == detsInRP.end())
198  throw cms::Exception("TotemRPGeometry") << "RP with ID " << id << " not found.";
199  return (*it).second;
200 }
201 
202 //----------------------------------------------------------------------------------------------------
203 
204 CLHEP::Hep3Vector TotemRPGeometry::LocalToGlobal(const DetGeomDesc *gd, const CLHEP::Hep3Vector& r) const
205 {
206  CLHEP::Hep3Vector tmp = gd->rotation() * r;
207  tmp.setX(tmp.x() + (gd->translation()).x());
208  tmp.setY(tmp.y() + (gd->translation()).y());
209  tmp.setZ(tmp.z() + (gd->translation()).z());
210  return tmp;
211 }
212 
213 //----------------------------------------------------------------------------------------------------
214 
215 CLHEP::Hep3Vector TotemRPGeometry::LocalToGlobal(unsigned int id, const CLHEP::Hep3Vector& r) const
216 {
217  auto gd = GetDetector(id);
218  CLHEP::Hep3Vector tmp = gd->rotation() * r;
219  tmp.setX(tmp.x() + (gd->translation()).x());
220  tmp.setY(tmp.y() + (gd->translation()).y());
221  tmp.setZ(tmp.z() + (gd->translation()).z());
222  return tmp;
223 }
224 
225 //----------------------------------------------------------------------------------------------------
226 
227 CLHEP::Hep3Vector TotemRPGeometry::GlobalToLocal(const DetGeomDesc *gd, const CLHEP::Hep3Vector& r) const
228 {
229  CLHEP::Hep3Vector tmp = r;
230  tmp.setX(tmp.x() - (gd->translation()).x());
231  tmp.setY(tmp.y() - (gd->translation()).y());
232  tmp.setZ(tmp.z() - (gd->translation()).z());
233  return (gd->rotation()).Inverse() * tmp;
234 }
235 
236 //----------------------------------------------------------------------------------------------------
237 
238 CLHEP::Hep3Vector TotemRPGeometry::GlobalToLocal(unsigned int id, const CLHEP::Hep3Vector& r) const
239 {
240  auto gd = GetDetector(id);
241  CLHEP::Hep3Vector tmp = r;
242  tmp.setX(tmp.x() - (gd->translation()).x());
243  tmp.setY(tmp.y() - (gd->translation()).y());
244  tmp.setZ(tmp.z() - (gd->translation()).z());
245  return (gd->rotation()).Inverse() * tmp;
246 }
247 
248 //----------------------------------------------------------------------------------------------------
249 
250 CLHEP::Hep3Vector TotemRPGeometry::LocalToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector& dir) const
251 {
252  return GetDetector(id)->rotation() * dir;
253 }
254 
255 //----------------------------------------------------------------------------------------------------
256 
257 CLHEP::Hep3Vector TotemRPGeometry::GlobalToLocalDirection(unsigned int id, const CLHEP::Hep3Vector& dir) const
258 {
259  return (GetDetector(id)->rotation()).Inverse() * dir;
260 }
261 
262 //----------------------------------------------------------------------------------------------------
263 
264 CLHEP::Hep3Vector TotemRPGeometry::GetDetTranslation(unsigned int id) const
265 {
266  auto gd = GetDetector(id);
267  CLHEP::Hep3Vector tmp;
268  tmp.setX((gd->translation()).x());
269  tmp.setY((gd->translation()).y());
270  tmp.setZ((gd->translation()).z());
271  return tmp;
272 }
273 
274 //----------------------------------------------------------------------------------------------------
275 
276 void TotemRPGeometry::GetReadoutDirection(unsigned int id, double &dx, double &dy) const
277 {
278  CLHEP::Hep3Vector d = LocalToGlobalDirection(id, CLHEP::Hep3Vector(0., 1., 0.));
279  dx = d.x();
280  dy = d.y();
281 }
282 
283 //----------------------------------------------------------------------------------------------------
284 
285 CLHEP::Hep3Vector TotemRPGeometry::GetRPGlobalTranslation(int copy_no) const
286 {
287  CLHEP::Hep3Vector tmp;
288  auto gd = GetRPDevice(copy_no);
289  tmp.setX((gd->translation()).x());
290  tmp.setY((gd->translation()).y());
291  tmp.setZ((gd->translation()).z());
292  return tmp;
293 }
294 
295 //----------------------------------------------------------------------------------------------------
296 
297 CLHEP::HepRotation TotemRPGeometry::GetRPGlobalRotation(int copy_no) const
298 {
299  double xx, xy, xz, yx, yy, yz, zx, zy, zz;
300  GetRPDevice(copy_no)->rotation().GetComponents(xx, xy, xz, yx, yy, yz, zx, zy, zz);
301  CLHEP::HepRep3x3 rot_mat( xx, xy, xz, yx, yy, yz, zx, zy, zz);
302  CLHEP::HepRotation rot(rot_mat);
303  return rot;
304 }
305 
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
const DetGeomDesc * GetDetector(unsigned int) const
returns geometry of a detector performs necessary checks, returns NULL if fails input is raw ID ...
DDRotationMatrix rotation() const
geometry information
Definition: DetGeomDesc.h:86
CLHEP::Hep3Vector GetDetEdgePosition(unsigned int id) const
returns the position of the edge of a detector
const DetGeomDesc * GetRPDevice(unsigned int id) const
returns geometry of a RP box
CLHEP::Hep3Vector GetRPGlobalTranslation(int copy_no) const
position of a RP package (translation z corresponds to the first plane - TODO check it) ...
CLHEP::Hep3Vector GetRPThinFoilPosition(int copy_no) const
returns the (outer) position of the thin foil of a RP box
char Build(const DetGeomDesc *)
build up from DetGeomDesc structure, return 0 = success
void BuildSets()
builds maps element ID –> set of subelements (re)builds stationsInArm, rpsInStation, detsInRP out of theMap
const char DDD_TOTEM_RP_PRIMARY_VACUUM_NAME[]
DDD name of RP.
CLHEP::Hep3Vector LocalToGlobal(const DetGeomDesc *gd, const CLHEP::Hep3Vector &r) const
CTPPSDetId getStationId() const
Definition: CTPPSDetId.h:92
char AddRPDevice(unsigned int id, const DetGeomDesc *&det_geom_desc)
adds a RP package (primary vacuum) to a map
void GetReadoutDirection(unsigned int id, double &dx, double &dy) const
CLHEP::Hep3Vector LocalToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector &dir) const
CLHEP::Hep3Vector GlobalToLocalDirection(unsigned int id, const CLHEP::Hep3Vector &dir) const
T x() const
Cartesian x coordinate.
CLHEP::Hep3Vector GetDetTranslation(unsigned int id) const
virtual ConstContainer components() const
access to the tree structure
Definition: DetGeomDesc.cc:121
T sqrt(T t)
Definition: SSEVec.h:18
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< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Geometrical description of a detector.
Definition: DetGeomDesc.h:40
DDTranslation translation() const
Definition: DetGeomDesc.h:87
CTPPSDetId getRPId() const
Definition: CTPPSDetId.h:97
DDName name() const
Definition: DetGeomDesc.h:90
CLHEP::Hep3Vector GetDetEdgeNormalVector(unsigned int id) const
returns a normal vector for the edge of a detector
const char DDD_CTPPS_DIAMONDS_DETECTOR_NAME[]
CLHEP::Hep3Vector GlobalToLocal(const DetGeomDesc *gd, const CLHEP::Hep3Vector &r) const
CLHEP::HepRotation GetRPGlobalRotation(int copy_no) const
returns number of detectors in the geometry (size of theMap)
CTPPSDetId getArmId() const
Definition: CTPPSDetId.h:87
virtual DetId geographicalID() const
Definition: DetGeomDesc.h:64
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
std::set< unsigned int > const & StationsInArm(unsigned int) const
after checks returns set of stations corresponding to the given arm ID
dbl *** dir
Definition: mlp_gen.cc:35
const char DDD_TOTEM_RP_DETECTOR_NAME[]
DDD name of RP detector.
std::set< unsigned int > const & DetsInRP(unsigned int) const
char AddDetector(unsigned int, const DetGeomDesc *&)
adds an item to the map (detector ID –> DetGeomDesc) performs necessary checks, returns 0 if succesf...
const std::string & name() const
Returns the name.
Definition: DDName.cc:90
CLHEP::Hep3Vector GetRPThinFoilNormalVector(int copy_no) const
returns a normal vector for the thin foil of a RP box
std::set< unsigned int > const & RPsInStation(unsigned int) const
after checks returns set of RP corresponding to the given station ID