CMS 3D CMS Logo

CTPPSGeometryESModule.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * Authors:
4 * Jan Kaspar (jan.kaspar@gmail.com)
5 * Dominik Mierzejewski <dmierzej@cern.ch>
6 *
7 ****************************************************************************/
8 
14 
21 
23 
27 
30 
34 
38 
48 {
49  public:
51  ~CTPPSGeometryESModule() override {}
52 
53  std::unique_ptr<DetGeomDesc> produceIdealGD( const IdealGeometryRecord& );
54 
55  std::unique_ptr<DetGeomDesc> produceRealGD( const VeryForwardRealGeometryRecord& );
56  std::unique_ptr<CTPPSGeometry> produceRealTG( const VeryForwardRealGeometryRecord& );
57 
58  std::unique_ptr<DetGeomDesc> produceMisalignedGD( const VeryForwardMisalignedGeometryRecord& );
59  std::unique_ptr<CTPPSGeometry> produceMisalignedTG( const VeryForwardMisalignedGeometryRecord& );
60 
61  protected:
63  static void buildDetGeomDesc( DDFilteredView* fv, DetGeomDesc* gd );
64 
65  unsigned int verbosity_;
67 };
68 
69 
70 //----------------------------------------------------------------------------------------------------
71 //----------------------------------------------------------------------------------------------------
72 
74  verbosity_( iConfig.getUntrackedParameter<unsigned int>( "verbosity", 1 ) ),
75  compactViewTag_( iConfig.getParameter<std::string>( "compactViewTag" ) )
76 {
78 
81 
84 }
85 
86 //----------------------------------------------------------------------------------------------------
87 
88 void
91  DetGeomDesc*& newGD )
92 {
93  newGD = new DetGeomDesc( *(idealGD.product()) );
94  std::deque<const DetGeomDesc*> buffer;
95  std::deque<DetGeomDesc*> bufferNew;
96  buffer.emplace_back( idealGD.product() );
97  bufferNew.emplace_back( newGD );
98 
99  while ( !buffer.empty() ) {
100  const DetGeomDesc* sD = buffer.front();
101  DetGeomDesc* pD = bufferNew.front();
102  buffer.pop_front();
103  bufferNew.pop_front();
104 
105  const std::string name = pD->name().name();
106 
107  // Is it sensor? If yes, apply full sensor alignments
108  if ( name == DDD_TOTEM_RP_SENSOR_NAME
110  || name == DDD_CTPPS_UFSD_SEGMENT_NAME
111  || name == DDD_CTPPS_PIXELS_SENSOR_NAME ) {
112  unsigned int plId = pD->geographicalID();
113 
114  if ( alignments.isValid() ) {
115  const RPAlignmentCorrectionData& ac = alignments->getFullSensorCorrection( plId );
116  pD->ApplyAlignment( ac );
117  }
118  }
119 
120  // Is it RP box? If yes, apply RP alignments
121  if ( name == DDD_TOTEM_RP_RP_NAME
122  || name == DDD_CTPPS_DIAMONDS_RP_NAME
123  || name == DDD_CTPPS_UFSD_PLANE_NAME
124  || name == DDD_CTPPS_PIXELS_RP_NAME ) {
125  unsigned int rpId = pD->geographicalID();
126 
127  if ( alignments.isValid() ) {
128  const RPAlignmentCorrectionData& ac = alignments->getRPCorrection( rpId );
129  pD->ApplyAlignment( ac );
130  }
131  }
132 
133  // create and add children
134  for ( unsigned int i = 0; i < sD->components().size(); i++ ) {
135  const DetGeomDesc* sDC = sD->components()[i];
136  buffer.emplace_back( sDC );
137 
138  // create new node with the same information as in sDC and add it as a child of pD
139  DetGeomDesc* cD = new DetGeomDesc( *sDC );
140  pD->addComponent( cD );
141 
142  bufferNew.emplace_back( cD );
143  }
144  }
145 }
146 
147 //----------------------------------------------------------------------------------------------------
148 
149 void
151 {
152  // try to dive into next level
153  if ( !fv->firstChild() ) return;
154 
155  // loop over siblings in the level
156  do {
157  // create new DetGeomDesc node and add it to the parent's (gd) list
158  DetGeomDesc* newGD = new DetGeomDesc( fv );
159 
160  const std::string name = fv->logicalPart().name().name();
161 
162  // strip sensors
163  if ( name == DDD_TOTEM_RP_SENSOR_NAME ) {
164  const std::vector<int>& copy_num = fv->copyNumbers();
165  // check size of copy numubers array
166  if ( copy_num.size() < 3 )
167  throw cms::Exception("DDDTotemRPContruction") << "size of copyNumbers for strip sensor is "
168  << copy_num.size() << ". It must be >= 3.";
169 
170  // extract information
171  const unsigned int decRPId = copy_num[copy_num.size() - 3];
172  const unsigned int arm = decRPId / 100;
173  const unsigned int station = ( decRPId % 100 ) / 10;
174  const unsigned int rp = decRPId % 10;
175  const unsigned int detector = copy_num[copy_num.size() - 1];
176  newGD->setGeographicalID( TotemRPDetId( arm, station, rp, detector ) );
177  }
178 
179  // strip and pixels RPs
180  else if ( name == DDD_TOTEM_RP_RP_NAME || name == DDD_CTPPS_PIXELS_RP_NAME) {
181  uint32_t decRPId = uint32_t(fv->copyno());
182 
183  // check if it is a pixel RP
184  if ( decRPId >= 10000 ){
185  decRPId = decRPId % 10000;
186  const unsigned int armIdx = ( decRPId / 100 ) % 10;
187  const unsigned int stIdx = ( decRPId / 10 ) % 10;
188  const unsigned int rpIdx = decRPId % 10;
189  newGD->setGeographicalID( CTPPSPixelDetId( armIdx, stIdx, rpIdx ) );
190  }else{
191  const unsigned int armIdx = ( decRPId / 100 ) % 10;
192  const unsigned int stIdx = ( decRPId / 10 ) % 10;
193  const unsigned int rpIdx = decRPId % 10;
194  newGD->setGeographicalID( TotemRPDetId( armIdx, stIdx, rpIdx ) );
195  }
196  }
197 
198  // pixel sensors
199  else if ( name == DDD_CTPPS_PIXELS_SENSOR_NAME ) {
200  const std::vector<int>& copy_num = fv->copyNumbers();
201  // check size of copy numubers array
202  if ( copy_num.size() < 4 )
203  throw cms::Exception("DDDTotemRPContruction") << "size of copyNumbers for pixel sensor is "
204  << copy_num.size() << ". It must be >= 4.";
205 
206  // extract information
207  const unsigned int decRPId = copy_num[copy_num.size() - 4] % 10000;
208  const unsigned int arm = decRPId / 100;
209  const unsigned int station = ( decRPId % 100 ) / 10;
210  const unsigned int rp = decRPId % 10;
211  const unsigned int detector = copy_num[copy_num.size() - 2] - 1;
212  newGD->setGeographicalID( CTPPSPixelDetId( arm, station, rp, detector ) );
213  }
214 
215 
216  // diamond/UFSD sensors
217  else if ( name == DDD_CTPPS_DIAMONDS_SEGMENT_NAME || name == DDD_CTPPS_UFSD_SEGMENT_NAME ) {
218  const std::vector<int>& copy_num = fv->copyNumbers();
219 
220  const unsigned int id = copy_num[copy_num.size()-1];
221  const unsigned int arm = copy_num[1]-1;
222  const unsigned int station = 1;
223  const unsigned int rp = 6;
224  const unsigned int plane = ( id / 100 );
225  const unsigned int channel = id % 100;
226  newGD->setGeographicalID( CTPPSDiamondDetId( arm, station, rp, plane, channel ) );
227  }
228 
229  // diamond RPs
230  else if ( name == DDD_CTPPS_DIAMONDS_RP_NAME ) {
231  const std::vector<int>& copy_num = fv->copyNumbers();
232 
233  // check size of copy numubers array
234  if ( copy_num.size() < 2 )
235  throw cms::Exception("DDDTotemRPContruction") << "size of copyNumbers for diamond RP is "
236  << copy_num.size() << ". It must be >= 2.";
237 
238  const unsigned int arm = copy_num[1] - 1;
239  const unsigned int station = 1;
240  const unsigned int rp = 6;
241 
242  newGD->setGeographicalID( CTPPSDiamondDetId( arm, station, rp ) );
243  }
244 
245  // add component
246  gd->addComponent( newGD );
247 
248  // recursion
249  buildDetGeomDesc( fv, newGD );
250  } while ( fv->nextSibling() );
251 
252  // go a level up
253  fv->parent();
254 }
255 
256 //----------------------------------------------------------------------------------------------------
257 
258 std::unique_ptr<DetGeomDesc>
260 {
261  // get the DDCompactView from EventSetup
263  iRecord.get( compactViewTag_, cpv );
264 
265  // create DDFilteredView and apply the filter
267  DDFilteredView fv( *( cpv.product() ), filter );
268 
269  // conversion to DetGeomDesc structure
270  DetGeomDesc* root = new DetGeomDesc( &fv );
271  buildDetGeomDesc( &fv, root );
272 
273  // construct the tree of DetGeomDesc
274  return std::unique_ptr<DetGeomDesc>( const_cast<DetGeomDesc*>( root ) );
275 }
276 
277 //----------------------------------------------------------------------------------------------------
278 
279 std::unique_ptr<DetGeomDesc>
281 {
282  // get the input GeometricalDet
284  iRecord.getRecord<IdealGeometryRecord>().get( idealGD );
285 
286  // load alignments
288  try { iRecord.getRecord<RPRealAlignmentRecord>().get( alignments ); }
289  catch ( cms::Exception& ) {}
290 
291  if ( alignments.isValid() ) {
292  if ( verbosity_ )
293  edm::LogVerbatim("CTPPSGeometryESModule::produceRealGD")
294  << ">> CTPPSGeometryESModule::produceRealGD > Real geometry: "
295  << alignments->getRPMap().size() << " RP and "
296  << alignments->getSensorMap().size() << " sensor alignments applied.";
297  }
298  else {
299  if ( verbosity_ )
300  edm::LogVerbatim("CTPPSGeometryESModule::produceRealGD")
301  << ">> CTPPSGeometryESModule::produceRealGD > Real geometry: No alignments applied.";
302  }
303 
304  DetGeomDesc* newGD = nullptr;
305  applyAlignments( idealGD, alignments, newGD );
306  return std::unique_ptr<DetGeomDesc>( newGD );
307 }
308 
309 //----------------------------------------------------------------------------------------------------
310 
311 std::unique_ptr<DetGeomDesc>
313 {
314  // get the input GeometricalDet
316  iRecord.getRecord<IdealGeometryRecord>().get( idealGD );
317 
318  // load alignments
320  try { iRecord.getRecord<RPMisalignedAlignmentRecord>().get( alignments ); }
321  catch ( cms::Exception& ) {}
322 
323  if ( alignments.isValid() ) {
324  if ( verbosity_ )
325  edm::LogVerbatim("CTPPSGeometryESModule::produceMisalignedGD")
326  << ">> CTPPSGeometryESModule::produceMisalignedGD > Misaligned geometry: "
327  << alignments->getRPMap().size() << " RP and "
328  << alignments->getSensorMap().size() << " sensor alignments applied.";
329  } else {
330  if ( verbosity_ )
331  edm::LogVerbatim("CTPPSGeometryESModule::produceMisalignedGD")
332  << ">> CTPPSGeometryESModule::produceMisalignedGD > Misaligned geometry: No alignments applied.";
333  }
334 
335  DetGeomDesc* newGD = nullptr;
336  applyAlignments( idealGD, alignments, newGD );
337  return std::unique_ptr<DetGeomDesc>( newGD );
338 }
339 
340 //----------------------------------------------------------------------------------------------------
341 
342 std::unique_ptr<CTPPSGeometry>
344 {
346  iRecord.get( gD );
347 
348  return std::make_unique<CTPPSGeometry>( gD.product() );
349 }
350 
351 //----------------------------------------------------------------------------------------------------
352 
353 std::unique_ptr<CTPPSGeometry>
355 {
357  iRecord.get( gD );
358 
359  return std::make_unique<CTPPSGeometry>( gD.product() );
360 }
361 
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
bool parent()
set the current node to the parent node ...
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the filtered-view.
const std::string DDD_CTPPS_PIXELS_RP_NAME
Definition: CTPPSDDDNames.h:23
const N & name() const
Definition: DDBase.h:78
nav_type copyNumbers() const
return the stack of copy numbers
bool nextSibling()
set the current node to the next sibling ...
static void applyAlignments(const edm::ESHandle< DetGeomDesc > &, const edm::ESHandle< RPAlignmentCorrectionsData > &, DetGeomDesc *&)
std::unique_ptr< CTPPSGeometry > produceRealTG(const VeryForwardRealGeometryRecord &)
Builds ideal, real and misaligned geometries.
const mapType & getRPMap() const
returns the map of RP alignment corrections
Event setup record containing the real (actual) geometry information.
void setWhatProduced(T *iThis, const es::Label &iLabel=es::Label())
Definition: ESProducer.h:115
const std::string DDD_CTPPS_DIAMONDS_SEGMENT_NAME
Definition: CTPPSDDDNames.h:17
int copyno() const
Copy number associated with the current node.
RPAlignmentCorrectionData & getRPCorrection(unsigned int id)
returns the correction value from the RP map
void ApplyAlignment(const RPAlignmentCorrectionData &)
alignment
Definition: DetGeomDesc.cc:185
std::unique_ptr< CTPPSGeometry > produceMisalignedTG(const VeryForwardMisalignedGeometryRecord &)
void setGeographicalID(DetId id)
ID stuff.
Definition: DetGeomDesc.h:60
virtual ConstContainer components() const
access to the tree structure
Definition: DetGeomDesc.cc:123
RPAlignmentCorrectionData getFullSensorCorrection(unsigned int id, bool useRPErrors=false) const
void get(HolderT &iHolder) const
Geometrical description of a sensor.
Definition: DetGeomDesc.h:37
Alignment correction or result of alignment procedure for a single RP sensor. Within the geometry des...
DDName name() const
Definition: DetGeomDesc.h:87
std::unique_ptr< DetGeomDesc > produceRealGD(const VeryForwardRealGeometryRecord &)
A DDFilter that always returns true.
Definition: DDFilter.h:27
const std::string DDD_CTPPS_UFSD_PLANE_NAME
Definition: CTPPSDDDNames.h:25
const std::string DDD_TOTEM_RP_RP_NAME
DDD names of RP volumes.
Definition: CTPPSDDDNames.h:22
virtual DetId geographicalID() const
Definition: DetGeomDesc.h:61
const mapType & getSensorMap() const
returns the map of sensor alignment corrections
const std::string DDD_CTPPS_DIAMONDS_RP_NAME
Definition: CTPPSDDDNames.h:24
#define DEFINE_FWK_EVENTSETUP_MODULE(type)
Definition: ModuleFactory.h:60
std::unique_ptr< DetGeomDesc > produceMisalignedGD(const VeryForwardMisalignedGeometryRecord &)
CTPPSGeometryESModule(const edm::ParameterSet &)
Event setup record containing the misaligned geometry information. It is used for alignment studies o...
static void buildDetGeomDesc(DDFilteredView *fv, DetGeomDesc *gd)
bool firstChild()
set the current node to the first child ...
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
std::unique_ptr< DetGeomDesc > produceIdealGD(const IdealGeometryRecord &)
const std::string DDD_TOTEM_RP_SENSOR_NAME
DDD names of sensors.
Definition: CTPPSDDDNames.h:14
bool isValid() const
Definition: ESHandle.h:47
const std::string DDD_CTPPS_PIXELS_SENSOR_NAME
Definition: CTPPSDDDNames.h:15
T const * product() const
Definition: ESHandle.h:86
void addComponent(DetGeomDesc *)
Definition: DetGeomDesc.cc:160
const std::string & name() const
Returns the name.
Definition: DDName.cc:90
const std::string DDD_CTPPS_UFSD_SEGMENT_NAME
Definition: CTPPSDDDNames.h:18