CMS 3D CMS Logo

CTPPSGeometryInfo.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * Authors:
4 * Jan Kašpar (jan.kaspar@gmail.com)
5 *
6 ****************************************************************************/
7 
16 
21 
26 
27 //----------------------------------------------------------------------------------------------------
28 
33 {
34  public:
35  explicit CTPPSGeometryInfo( const edm::ParameterSet& );
36 
37  private:
39 
41 
45 
46  void analyze( const edm::Event&, const edm::EventSetup& ) override;
47 
48  static void PrintDetId( const CTPPSDetId &id, bool printDetails = true );
49 
50  void PrintGeometry( const CTPPSGeometry &, const edm::Event& );
51 };
52 
53 //----------------------------------------------------------------------------------------------------
54 
56  geometryType_ ( iConfig.getUntrackedParameter<std::string>( "geometryType", "real" ) ),
57  printRPInfo_ ( iConfig.getUntrackedParameter<bool>( "printRPInfo", true ) ),
58  printSensorInfo_( iConfig.getUntrackedParameter<bool>( "printSensorInfo", true ) )
59 {
60 }
61 
62 //----------------------------------------------------------------------------------------------------
63 
64 void
66 {
68 
69  if ( geometryType_ == "ideal" ) {
70  if ( watcherIdealGeometry_.check( iSetup ) ) {
71  iSetup.get<IdealGeometryRecord>().get( geometry );
72  PrintGeometry( *geometry, iEvent );
73  }
74  return;
75  }
76 
77  else if ( geometryType_ == "real" ) {
78  if ( watcherRealGeometry_.check( iSetup ) ) {
79  iSetup.get<VeryForwardRealGeometryRecord>().get( geometry );
80  PrintGeometry( *geometry, iEvent );
81  }
82  return;
83  }
84 
85  else if ( geometryType_ == "misaligned" ) {
86  if ( watcherMisalignedGeometry_.check( iSetup ) ) {
87  iSetup.get<VeryForwardMisalignedGeometryRecord>().get( geometry );
88  PrintGeometry( *geometry, iEvent );
89  }
90  return;
91  }
92 
93  throw cms::Exception("CTPPSGeometryInfo") << "Unknown geometry type: `" << geometryType_ << "'.";
94 }
95 
96 //----------------------------------------------------------------------------------------------------
97 
98 void
99 CTPPSGeometryInfo::PrintDetId( const CTPPSDetId &id, bool printDetails )
100 {
101  std::ostringstream oss;
102  oss << id.rawId();
103 
104  const unsigned int rpDecId = id.arm()*100 + id.station()*10 + id.rp();
105 
106  if ( id.subdetId() == CTPPSDetId::sdTrackingStrip ) {
107  TotemRPDetId fid( id );
108  oss << " (strip RP " << rpDecId;
109  if ( printDetails )
110  oss << ", plane " << fid.plane();
111  oss << ")";
112  }
113 
114  if ( id.subdetId() == CTPPSDetId::sdTrackingPixel ) {
115  CTPPSPixelDetId fid( id );
116  oss << " (pixel RP " << rpDecId;
117  if ( printDetails )
118  oss << ", plane " << fid.plane();
119  oss << ")";
120  }
121 
122  if (id.subdetId() == CTPPSDetId::sdTimingDiamond) {
123  CTPPSDiamondDetId fid( id );
124  oss << " (diamd RP " << rpDecId;
125  if ( printDetails )
126  oss << ", plane " << fid.plane() << ", channel " << fid.channel();
127  oss << ")";
128  }
129  edm::LogVerbatim("CTPPSGeometryInfo") << oss.str();
130 }
131 
132 //----------------------------------------------------------------------------------------------------
133 
134 void
136 {
137  time_t unixTime = event.time().unixTime();
138  char timeStr[50];
139  strftime( timeStr, 50, "%F %T", localtime( &unixTime ) );
140 
141  edm::LogVerbatim("CTPPSGeometryInfo")
142  << "new " << geometryType_ << " geometry found in run="
143  << event.id().run() << ", event=" << event.id().event() << ", UNIX timestamp=" << unixTime
144  << " (" << timeStr << ")";
145 
146  // RP geometry
147  if ( printRPInfo_ ) {
148  std::ostringstream oss;
149  oss << "* RPs:\n"
150  << " ce: RP center in global coordinates, in mm\n";
151  for ( auto it = geometry.beginRP(); it != geometry.endRP(); ++it ) {
152  const DDTranslation &t = it->second->translation();
153 
154  PrintDetId( CTPPSDetId( it->first ), false );
155  oss << std::fixed << std::setprecision( 3 ) << " | ce=(" << t.x() << ", " << t.y() << ", " << t.z() << ")";
156  }
157  edm::LogVerbatim("CTPPSGeometryInfo") << oss.str();
158  }
159 
160  // sensor geometry
161  if ( printSensorInfo_ ) {
162  edm::LogVerbatim("CTPPSGeometryInfo")
163  << "* sensors:\n"
164  << " ce: sensor center in global coordinates, in mm\n"
165  << " a1: local axis (1, 0, 0) in global coordinates\n"
166  << " a2: local axis (0, 1, 0) in global coordinates\n"
167  << " a3: local axis (0, 0, 1) in global coordinates";
168 
169  for ( auto it = geometry.beginSensor(); it != geometry.endSensor(); ++it ) {
170  CTPPSDetId detId( it->first );
171 
172  const CLHEP::Hep3Vector gl_o = geometry.localToGlobal( detId, CLHEP::Hep3Vector( 0, 0, 0 ) );
173  const CLHEP::Hep3Vector gl_a1 = geometry.localToGlobal( detId, CLHEP::Hep3Vector( 1, 0, 0 ) ) - gl_o;
174  const CLHEP::Hep3Vector gl_a2 = geometry.localToGlobal( detId, CLHEP::Hep3Vector( 0, 1, 0 ) ) - gl_o;
175  const CLHEP::Hep3Vector gl_a3 = geometry.localToGlobal( detId, CLHEP::Hep3Vector( 0, 0, 1 ) ) - gl_o;
176 
177  PrintDetId( detId );
178 
179  edm::LogVerbatim("CTPPSGeometryInfo")
180  << " | ce=(" << gl_o.x() << ", " << gl_o.y() << ", " << gl_o.z() << ")"
181  << " | a1=(" << gl_a1.x() << ", " << gl_a1.y() << ", " << gl_a1.z() << ")"
182  << " | a2=(" << gl_a2.x() << ", " << gl_a2.y() << ", " << gl_a2.z() << ")"
183  << " | a3=(" << gl_a3.x() << ", " << gl_a3.y() << ", " << gl_a3.z() << ")";
184  }
185  }
186 }
187 
188 //----------------------------------------------------------------------------------------------------
189 
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
std::string geometryType_
uint32_t plane() const
Class to print out information on current geometry.
edm::ESWatcher< VeryForwardRealGeometryRecord > watcherRealGeometry_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static void PrintDetId(const CTPPSDetId &id, bool printDetails=true)
uint32_t plane() const
Definition: TotemRPDetId.h:49
mapType::const_iterator beginSensor() const
begin iterator over sensors
Definition: CTPPSGeometry.h:70
Event setup record containing the real (actual) geometry information.
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
int iEvent
Definition: GenABIO.cc:230
void analyze(const edm::Event &, const edm::EventSetup &) override
void PrintGeometry(const CTPPSGeometry &, const edm::Event &)
edm::ESWatcher< VeryForwardMisalignedGeometryRecord > watcherMisalignedGeometry_
RPDeviceMapType::const_iterator beginRP() const
begin iterator over RPs
Definition: CTPPSGeometry.h:75
CTPPSGeometryInfo(const edm::ParameterSet &)
uint32_t plane() const
CLHEP::Hep3Vector localToGlobal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
The manager class for TOTEM RP geometry.
Definition: CTPPSGeometry.h:33
uint32_t channel() const
const T & get() const
Definition: EventSetup.h:55
mapType::const_iterator endSensor() const
end iterator over sensors
Definition: CTPPSGeometry.h:72
RPDeviceMapType::const_iterator endRP() const
end iterator over RPs
Definition: CTPPSGeometry.h:77
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
ESHandle< TrackerGeometry > geometry
Event setup record containing the misaligned geometry information. It is used for alignment studies o...
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
edm::ESWatcher< IdealGeometryRecord > watcherIdealGeometry_
Definition: event.py:1