ATLAS Offline Software
Loading...
Searching...
No Matches
HitToSodeNode.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6// Update: Riccardo Maria BIANCHI rbianchi@cern.ch Feb 2014 //
7
8#ifndef BUILDVP1LIGHT
9
13#include "VP1Utils/VP1DetInfo.h"
14#include "VP1Base/VP1Msg.h"
16
17#include <Inventor/nodes/SoSeparator.h>
18#include <Inventor/nodes/SoTranslation.h>
19#include <Inventor/nodes/SoNode.h>
20#include <Inventor/nodes/SoTransform.h>
21#include <Inventor/nodes/SoPointSet.h>
22#include <Inventor/nodes/SoLineSet.h>
23
24#include "TrkSurfaces/Surface.h"
31
33
34#include <sstream>
35#include <cmath>
36
37
40
48
50 : VP1HelperClassBase(sys,"HitToSoNode"), m_d(new Imp)
51{
52 m_d->theclass = this;
53}
54
55//____________________________________________________________________
57{
58 messageVerbose("destructor begin");
59 delete m_d;
60 messageVerbose("destructor end");
61}
62
64 const TgcIdHelper * idhelper = VP1DetInfo::tgcIDHelper();
65 if (!idhelper) {
66 VP1Msg::message("HitToSoNode::getTGCAngle WARNING: could not get TGC idhelper!");
67 return 0.0;
68 }
69
70 if ( !idhelper->isStrip(id)) return 0.0; // Not phi strip
72
73 // int stationeta=idHelper->stationEta(id);
74 // int stripNo = idHelper->channel(id);
75 // int gasGap = idHelper->gasGap(id);
76 //
77 // const MuonGM::TgcReadoutElement *ele= VP1DetInfo::muonDetMgr ()->getTgcReadoutElement(id);
78 //
79 // double stripLength = ele->stripLength(gasGap,stripNo);
80 // double stripWidth=std::abs(ele->stripMaxX(gasGap, stripNo, (*lp)[Trk::locZ])-ele->stripMinX(gasGap, stripNo, (*lp)[Trk::locZ]));
81 //
82 // double localX1=ele->stripCtrX(gasGap, stripNo, stripLength/2.);
83 // double localX2=ele->stripCtrX(gasGap, stripNo, -stripLength/2.);
84 // if (stationeta>0) {
85 // localX1=-localX1;
86 // localX2=-localX2;
87 // }
88 //
89 // return atan2(localX2-localX1,stripLength);
90
91 int stripNo = idhelper->channel(id);
92 int gasGap = idhelper->gasGap(id);
93
94
96
97 Amg::Vector3D lposTGC = detEl->stripCenterLocX(gasGap, stripNo, 0.) * Amg::Vector3D::UnitX();
98 const double shift = detEl->getStationEta() > 0 ? 1.*Gaudi::Units::cm : - 1.*Gaudi::Units::cm;
99 Amg::Vector3D lposTgcShifted = detEl->stripCenterLocX(gasGap, stripNo, shift) * Amg::Vector3D::UnitX()
100 + shift * Amg::Vector3D::UnitY();
101
102 return (lposTGC - lposTgcShifted).phi();
103
104}
105
106//____________________________________________________________________
107SoTransform * HitToSoNode::createTransform(const Trk::RIO_OnTrack& rio, bool useSurfacePositionOnly) const
108{
109 const Trk::Surface& theSurface = rio.detectorElement()->surface(rio.identify());
110 SoTransform * theHitTransform = VP1LinAlgUtils::toSoTransform(theSurface.transform());
111
112 // const Amg::Vector3D* theHitGPos;
113 if ( useSurfacePositionOnly ) {
114 // if (verbose) VP1Msg::message("useSurfacePositionOnly");
115 theHitTransform->translation.setValue(theSurface.center()[0], theSurface.center()[1], theSurface.center()[2]);
116
117 } else {
118
119 // for strips, clusters or short tubes, use position of hit.
120 // FIXME - for DCs, shouldn't this be the d0=0 position, i.e. on the wire?
121 theHitTransform->translation.setValue(rio.globalPosition()[0], rio.globalPosition()[1], rio.globalPosition()[2]);
122 }
123 return theHitTransform;
124}
125
126SoTransform * HitToSoNode::createTGC_Transform(const Trk::RIO_OnTrack& rio, bool useSurfacePositionOnly) const {
127 // std::cout<<"createTGC_Transform for:\n"<<rio<<std::endl;
128
129 const TgcIdHelper * idhelper = VP1DetInfo::tgcIDHelper();
130 const MuonGM::TgcReadoutElement* detEl = dynamic_cast<const MuonGM::TgcReadoutElement*>(rio.detectorElement());
131
132 if (!idhelper||!detEl) {
133 return new SoTransform;
134 }
135
136 const Trk::Surface& theSurface = rio.detectorElement()->surface(rio.identify());
137 SoTransform * theHitTransform =0;
138 if (idhelper->isStrip( rio.identify() )){
139 // std::cout<<"Strip"<<std::endl;
140
141 // for phi strips, use sinstereo to get correct orientation
142
143 double angle = getTGCAngle(rio.identify());
144
145 Amg::RotationMatrix3D localRot;
146 localRot.setIdentity();
147
148 if (0 < detEl->getStationEta()) {
149// localRot.setPhi (angle);
150 Amg::setPhi(localRot, angle);
151 } else {
152// localRot.setPhi (-angle);
153 Amg::setPhi(localRot, -angle);
154 }
155 // std::cout<<"Local ROT = "<<localRot<<std::endl;
156
157 Amg::toString(localRot);
158 localRot *= theSurface.transform().rotation();
159
160 // std::cout<<"translation = "<<Amg::toString(theSurface.transform().translation())<<std::endl;
161
162// HepGeom::Transform3D trans (localRot, theSurface.transform().translation());
163 Amg::Transform3D trans = Amg::getTransformFromRotTransl(localRot, theSurface.transform().translation() );
164
165 // std::cout<<"transform = "<<Amg::toString(trans)<<std::endl;
166
167 theHitTransform = VP1LinAlgUtils::toSoTransform(trans);
168 } else {
169 // eta strips just use surface orientiation
170 theHitTransform = VP1LinAlgUtils::toSoTransform(theSurface.transform());
171 }
172
173 if (!useSurfacePositionOnly){
174 const Amg::Vector3D& theHitGPos= rio.globalPosition();
175 theHitTransform->translation.setValue((theHitGPos)[0], (theHitGPos)[1], (theHitGPos)[2]);
176 }
177 return theHitTransform;
178}
179
180void HitToSoNode::buildTubeShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&shape_simple, SoSeparator*&shape_detailed, bool , double length, bool doProjection)
181{
182 const Trk::CylinderBounds* ccbo = dynamic_cast<const Trk::CylinderBounds*>(&(rio.detectorElement()->surface(rio.identify()).bounds()));
183 assert(ccbo!=0);
184 if (!ccbo) {
185 VP1Msg::message("HitToSoNode::buildTubeShapes ERROR: Trk::CylinderBounds conversion failed");
186 return;
187 }
188
189 double radius = std::abs(rio.localParameters().get(Trk::locR));
190 if (radius<0.15)
191 radius = 0.0;//radius is so small it is better to collapse to line
192
193 double halflength(ccbo->halflengthZ());
194
195 if (doProjection && dynamic_cast<const InDet::TRT_DriftCircleOnTrack*>(&rio)){
196
197 double strawLength=2.0*halflength;
198 if (strawLength<160.0)
199 strawLength = 2*349.3150-strawLength;//Yeah, we hardcode a lot here... but dimensions of TRT barrel straws are not likely to change.
200
201 SoPointSet * scatPointSet = new SoPointSet;
202 SoVertexProperty * scatVtxProperty = new SoVertexProperty;
203 scatVtxProperty->vertex.set1Value(0,0.0f,0.0f,strawLength);
204 scatPointSet->numPoints=1;
205 scatPointSet->vertexProperty.setValue(scatVtxProperty);
206
207 shape_detailed->addChild(scatPointSet);
208 shape_simple->addChild(scatPointSet);
209
210 } else {
211 if (length!=0.0) {
212 halflength = length/2.0;
213 // FIXME! translate to z position here instead of in AscObj_TSOS, for symmetry with buildStripShapes
214 }
215 SoNode * simpleShape = m_d->nodeManager.getShapeNode_DriftTube( halflength, 0.0 );
216 shape_simple->addChild(simpleShape);
217 //Detailed shape uses tube (unless negligible radius):
218 if (radius==0.0)
219 shape_detailed->addChild(simpleShape);
220 else
221 shape_detailed->addChild(m_d->nodeManager.getShapeNode_DriftTube( halflength, radius ));
222 }
223}
224
225void HitToSoNode::buildStripShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&shape_simple, SoSeparator*&shape_detailed, bool blockGP)
226{
227 // assuming starting with position being that of centre of surface i.e. always working in local coord system
228
229
230 double stripLength =100.0, stripWidth = 10.0, stripThickness=1.0;
231 std::optional<Amg::Vector2D> localposROT=std::nullopt;
232 Amg::Vector2D* localposStrip=0;
233 Identifier id=rio.identify();
234 fillValues(id, rio.detectorElement(), stripLength, stripWidth, stripThickness, localposStrip);
235
236 //std::cout<<"Got back: "<<stripLength<<","<<stripWidth<<","<<stripThickness<<std::endl;
237 //std::cout<<"LocalposStrip="<<*localposStrip<<std::endl;
238
239 // if (static_cast<PRDCollHandle_TGC*>(collHandle())->project())
240 // striplength += 300.0;//Fixme: Rough extension for now
241 double tolerance = 3.;
242 localposROT = rio.detectorElement()->surface( rio.identify() ).globalToLocal(rio.globalPosition(), tolerance);
243
244 if( !localposROT )
245 {
246 localposROT.emplace();
247 localposROT->setZero();
248 VP1Msg::message("Warning: Local hit position was NULL");
249 }
250
251 if (!blockGP){
252 SoSeparator * gpSep = new SoSeparator;
253 SoTranslation * localtransGP = new SoTranslation;
254 localtransGP->translation.setValue(static_cast<float>( (*localposROT)[Trk::locX]),
255 static_cast<float>( (*localposROT)[Trk::locY]),
256 0.0f);
257
258 gpSep->addChild(localtransGP);
259 gpSep->addChild(m_d->nodeManager.getShapeNode_Cross(10));
260 shape_detailed->addChild(gpSep);
261 }
262
263
264 SoTranslation * localtrans0 = new SoTranslation;
265 localtrans0->translation.setValue(static_cast<float>( (*localposStrip)[Trk::locX]),
266 static_cast<float>( (*localposStrip)[Trk::locY]),
267 0.0f);
268
269
270 shape_simple->addChild(localtrans0);
271 shape_simple->addChild( m_d->nodeManager.getShapeNode_Strip(stripLength));
272
273 shape_detailed->addChild(localtrans0);
274 shape_detailed->addChild(m_d->nodeManager.getShapeNode_Strip(stripLength,stripWidth,stripThickness));
275 // Transform back to centre of Surface
276 SoTranslation * localtrans1 = new SoTranslation;
277 localtrans1->translation.setValue(static_cast<float>( -(*localposStrip)[Trk::locX]),
278 static_cast<float>( -(*localposStrip)[Trk::locY]),
279 0.0f);
280 shape_simple->addChild(localtrans1);
281 shape_detailed->addChild(localtrans1);
282
283 delete localposStrip;
284}
285
286void HitToSoNode::fillValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
287
288 const AtlasDetectorID * idhelper = VP1DetInfo::atlasIDHelper();
289 if (!idhelper) return;
290 if (idhelper->is_muon(id)){
291 if (idhelper->is_rpc(id)) { fillRPCValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;}
292 if (idhelper->is_tgc(id)) { fillTGCValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;}
293 if (idhelper->is_csc(id)) { fillCSCValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;}
294 if (idhelper->is_stgc(id)) { fillSTGCValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;}
295 if (idhelper->is_mm(id)) { fillMMValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;}
296 } else {
297 if (idhelper->is_indet(id) && (idhelper->is_pixel(id)||idhelper->is_sct(id))) {
298 fillSiValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return;
299 }
300 }
301 VP1Msg::message("Warning: HitToSoNode::fillValues(...) unknown technology.");
302 return;
303}
304
305void HitToSoNode::fillTGCValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth,double& stripThickness, Amg::Vector2D*& localposStrip){
306 const TgcIdHelper * idhelper = VP1DetInfo::tgcIDHelper();
307 const MuonGM::TgcReadoutElement* detEl =
308 dynamic_cast<const MuonGM::TgcReadoutElement*>(baseDetEl);
309 if (!idhelper || !detEl){
310 VP1Msg::message("Could not get either TGC IdHelper or det element");
311 localposStrip = new Amg::Vector2D;
312 return;
313 }
314
315 int plane = idhelper->gasGap( id );
316 int strip = idhelper->channel( id );
317 int isStrip = idhelper->isStrip( id );
318
319 if (isStrip){
320 striplength = detEl->stripLength();
321 stripWidth = detEl->stripWidth(plane, strip);
322 stripThickness = 3*0.8+0.1;
323 } else {
324 striplength = detEl->gangShortWidth(plane, strip);
325 stripWidth = detEl->gangRadialLength(plane, strip);
326 stripThickness = 3*0.8;
327 }
328 stripWidth=std::max(10.0,stripWidth);
329 // Translation from objects local position to the strip position
330 // get local position on wire plane, here we have to use a tolarance as the wire plane is located 2.5 CLHEP::mm
331 // from the strip plane
332
333 Amg::Vector2D localPos_a;
334 Amg::Vector3D dummy; // this is not actually used
335 Amg::Vector3D globalPos_a = detEl->channelPos( id );
336 bool ok = detEl->surface( id ).globalToLocal(globalPos_a, dummy, localPos_a);
337 if (ok) {
338 localposStrip = new Amg::Vector2D(localPos_a);
339 }
340 else{
341 VP1Msg::message("fillTGCValues - Could not get localposStrip!!");
342 }
343
344
345 // std::cout<<"HitToSoNode::fillTGCValues channelPos = "<<detEl->channelPos( id )<<std::endl;
346 if( !localposStrip )
347 {
348 localposStrip = new Amg::Vector2D;
349 VP1Msg::message("Warning: Local strip position was NULL");
350 }
351 return;
352}
353
354void HitToSoNode::fillRPCValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
355 const RpcIdHelper * idhelper = VP1DetInfo::rpcIDHelper();
356 const MuonGM::RpcReadoutElement* detEl =
357 dynamic_cast<const MuonGM::RpcReadoutElement*>(baseDetEl);
358 if (!idhelper || !detEl){
359 VP1Msg::message("Could not get either RPC IdHelper or det element");
360 localposStrip = new Amg::Vector2D;
361 return;
362 }
363
364 int measPhi = idhelper->measuresPhi( id );
365 striplength = detEl->StripLength(measPhi);
366 stripWidth = detEl->StripWidth(measPhi),//strip width
367 stripThickness = (measPhi==1) ? 0.9: 0.8;//strip thickness - different from phi/eta to avoid hatching issues
368
369 // Translation from objects local position to the strip position
370 Amg::Vector2D localPos_a;
371 Amg::Vector3D dummy; // this is not actually used
372 Amg::Vector3D globalPos_a = detEl->stripPos( id );
373 bool ok = detEl->surface( id ).globalToLocal(globalPos_a, dummy, localPos_a);
374 if (ok) {
375 localposStrip = new Amg::Vector2D(localPos_a);
376 }
377 else{
378 VP1Msg::message("fillRPCValues - Could not get localposStrip!!");
379 }
380
381 //std::cout<<"HitToSoNode::fillRPCValues channelPos = "<<detEl->stripPos( id )<<std::endl;
382
383 if( !localposStrip )
384 {
385 localposStrip = new Amg::Vector2D;
386 VP1Msg::message("Warning: Local strip position is NULL");
387 }
388}
389
390void HitToSoNode::fillCSCValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
391 const CscIdHelper * idhelper = VP1DetInfo::cscIDHelper();
392 const MuonGM::CscReadoutElement* detEl =
393 dynamic_cast<const MuonGM::CscReadoutElement*>(baseDetEl);
394 if (!idhelper || !detEl){
395 VP1Msg::message("Could not get either CSC IdHelper or det element");
396 localposStrip = new Amg::Vector2D;
397 return;
398 }
399
400 int measPhi = idhelper->measuresPhi( id );
401 int chamberLayer = idhelper->chamberLayer( id );
402
403 striplength = detEl->stripLength(id);
404 stripWidth = detEl->cathodeReadoutPitch(chamberLayer,measPhi);
405 stripThickness = (measPhi==1) ? 0.9: 0.8;//strip thickness - different from phi/eta to avoid hatching issues
406
407 // Translation from objects local position to the strip position
408 Amg::Vector2D localPos_a;
409 Amg::Vector3D dummy; // this is not actually used
410 Amg::Vector3D globalPos_a = detEl->stripPos( id );
411 bool ok = detEl->surface( id ).globalToLocal(globalPos_a, dummy, localPos_a);
412 if (ok) {
413 localposStrip = new Amg::Vector2D(localPos_a);
414 }
415 else{
416 VP1Msg::message("fillCSCValues - Could not get localposStrip!!");
417 }
418
419
420
421 if( !localposStrip )
422 {
423 localposStrip = new Amg::Vector2D;
424 VP1Msg::message("Warning: Local strip position is NULL");
425 }
426}
427
428void HitToSoNode::fillSTGCValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
429 const sTgcIdHelper * idhelper = VP1DetInfo::stgcIDHelper();
431 const_cast<MuonGM::sTgcReadoutElement*>(dynamic_cast<const MuonGM::sTgcReadoutElement*>(baseDetEl));
432 if (!idhelper || !detEl){
433 VP1Msg::message("Could not get either STGC IdHelper or det element");
434 localposStrip = new Amg::Vector2D;
435 return;
436 }
437
438 striplength=100; //FIXME!
439 stripWidth=2.7;
440 stripThickness=1;
441 // int measPhi = idhelper->measuresPhi( id );
442 // int chamberLayer = idhelper->chamberLayer( id );
443 //
444 // striplength = detEl->stripLength(id);
445 // stripWidth = detEl->cathodeReadoutPitch(chamberLayer,measPhi);
446 // stripThickness = (measPhi==1) ? 0.9: 0.8;//strip thickness - different from phi/eta to avoid hatching issues
447
448 localposStrip = new Amg::Vector2D;
449 if( !(detEl->stripPosition(id,*localposStrip)) )
450 {
451 VP1Msg::message("Warning: Local strip position is NULL");
452 }
453}
454
455void HitToSoNode::fillMMValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
456 const MmIdHelper * idhelper = VP1DetInfo::mmIDHelper();
457 const MuonGM::CscReadoutElement* detEl =
458 dynamic_cast<const MuonGM::CscReadoutElement*>(baseDetEl);
459 if (!idhelper || !detEl){
460 VP1Msg::message("Could not get either CSC IdHelper or det element");
461 localposStrip = new Amg::Vector2D;
462 return;
463 }
464 //
465
466 // FIXME - get dimensions!
467
468 striplength=100; //FIXME!
469 stripWidth=10;
470 stripThickness=1;
471 // int measPhi = idhelper->measuresPhi( id );
472 // int chamberLayer = idhelper->chamberLayer( id );
473 //
474 // striplength = detEl->stripLength(id);
475 // stripWidth = detEl->cathodeReadoutPitch(chamberLayer,measPhi);
476 // stripThickness = (measPhi==1) ? 0.9: 0.8;//strip thickness - different from phi/eta to avoid hatching issues
477 //
478 // // Translation from objects local position to the strip position
479 localposStrip = new Amg::Vector2D;
480
481 if( !(detEl->stripPosition(id,*localposStrip)) )
482 {
483 VP1Msg::message("Warning: Local strip position is NULL");
484 }
485}
486
487void HitToSoNode::fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){
488 const InDetDD::SiDetectorElement* detEl =
489 dynamic_cast<const InDetDD::SiDetectorElement*>(baseDetEl);
490 if ( !detEl){
491 VP1Msg::message("Could not get Si det element");
492 localposStrip = new Amg::Vector2D;
493 return;
494 }
495
496 localposStrip = new Amg::Vector2D(detEl->rawLocalPositionOfCell( id ));
497 // (*localPosStrip)[Trk::distPhi] += (idhelper->is_pixel(id) ? m_pixelLorentzAngleTool : m_sctLorentzAngleTool)->getLorentzShift(detEl->identifyHash());
498 // SiLorentzAngleTool cannot be used here because HitToSoNode is not a tool nor algorithm
499
500 striplength = detEl->etaPitch() ;
501 stripWidth = detEl->phiPitch( *localposStrip );
502 stripThickness = detEl->thickness()/10.0;
503
504}
505
506#endif // BUILDVP1LIGHT
double length(const pvec &v)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
bool is_indet(Identifier id) const
bool is_stgc(Identifier id) const
bool is_rpc(Identifier id) const
bool is_sct(Identifier id) const
bool is_tgc(Identifier id) const
bool is_pixel(Identifier id) const
bool is_muon(Identifier id) const
bool is_csc(Identifier id) const
bool is_mm(Identifier id) const
int chamberLayer(const Identifier &id) const
bool measuresPhi(const Identifier &id) const override
const double driftdischeight
HitToSoNode * theclass
HitsSoNodeManager nodeManager
void fillRPCValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
void fillTGCValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
void fillCSCValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
void fillValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
SoTransform * createTransform(const Trk::RIO_OnTrack &rio, bool useSurfacePositionOnly) const
void buildTubeShapes(const Trk::RIO_OnTrack &rio, SoSeparator *&shape_simple, SoSeparator *&shape_detailed, bool blockGP, double length, bool doProjection)
HitToSoNode(IVP1System *sys=0)
void buildStripShapes(const Trk::RIO_OnTrack &rio, SoSeparator *&shape_simple, SoSeparator *&shape_detailed, bool blockGP)
double getTGCAngle(Identifier id) const
returns the phi angle of the passed phi strip identifier.
void fillSTGCValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
void fillMMValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
SoTransform * createTGC_Transform(const Trk::RIO_OnTrack &rio, bool useSurfacePositionOnly) const
TGCs are rotated.
void fillSiValues(Identifier &id, const Trk::TrkDetElementBase *baseDetEl, double &striplength, double &stripWidth, double &stripThickness, Amg::Vector2D *&localposStrip)
Class to hold geometrical description of a silicon detector element.
double phiPitch() const
Pitch (inline methods)
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
double etaPitch() const
Pitch (inline methods)
Represents 'corrected' measurements from the TRT (for example, corrected for wire sag).
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position If the strip number is outside the range of valid strips, the function will return fal...
double stripLength(int chamberLayer, int measuresPhi, int stripNumber, double &epsilon) const
double cathodeReadoutPitch(int chLayer, int measuresPhi) const
Amg::Vector3D stripPos(const Identifier &id) const
takes into account internal alignment parameters, hence gives accurate answer
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
const TgcReadoutElement * getTgcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
double StripLength(bool measphi) const
returns the strip length for the phi or eta plane
double StripWidth(bool measphi) const
returns the strip width for the phi or eta plane
A TgcReadoutElement corresponds to a single TGC chamber; therefore typically a TGC station contains s...
Amg::Vector3D channelPos(const Identifier &id) const
Returns the position of the active channel (wireGang or strip)
double stripLength() const
Returns the length of each strip which is equal to the height of the chamber.
double gangShortWidth(int gasGap, int gang) const
Returns the length of the most bottom wire in the gang.
double stripWidth(int gasGap, int strip) const
Returns the width of a given strip in the gasGap i.
double stripCenterLocX(int gasGap, int strip, double radialPos) const
Returns the local X of the strip center at a given local radial position.
double gangRadialLength(int gasGap, int gang) const
Returns the length of the wire gang along the radial direction [pitch x N_{wire}^{gang}...
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position - should be renamed to channel position If the strip number is outside the range of va...
bool measuresPhi(const Identifier &id) const override
int channel(const Identifier &id) const override
int gasGap(const Identifier &id) const override
get the hashes
int isStrip(const Identifier &id) const
isStrip corresponds to measuresPhi
Bounds for a cylindrical Surface.
double halflengthZ() const
This method returns the halflengthZ.
double get(ParamDefs par) const
Retrieve specified parameter (const version).
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const override final
Specified for PlaneSurface: GlobalToLocal method without dynamic memory allocation - boolean checks i...
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const TrkDetElementBase * detectorElement() const =0
returns the detector element, assoicated with the PRD of this class
Identifier identify() const
return the identifier -extends MeasurementBase
virtual const Amg::Vector3D & globalPosition() const override=0
Interface method to get the global Position.
Abstract Base Class for tracking surfaces.
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
This is the base class for all tracking detector elements with read-out relevant information.
virtual const SurfaceBounds & bounds() const =0
Return the boundaries of the element.
virtual const Surface & surface() const =0
Return surface associated with this detector element.
static const RpcIdHelper * rpcIDHelper()
static const TgcIdHelper * tgcIDHelper()
static const sTgcIdHelper * stgcIDHelper()
static const AtlasDetectorID * atlasIDHelper()
static const MuonGM::MuonDetectorManager * muonDetMgr()
static const MmIdHelper * mmIDHelper()
static const CscIdHelper * cscIDHelper()
VP1HelperClassBase(IVP1System *sys=0, QString helpername="")
void messageVerbose(const QString &) const
static SoTransform * toSoTransform(const HepGeom::Transform3D &, SoTransform *t=0)
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Amg::RotationMatrix3D setPhi(Amg::RotationMatrix3D mat, double angle, int convention=0)
Amg::Transform3D getTransformFromRotTransl(Amg::RotationMatrix3D rot, Amg::Vector3D transl_vec)
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37
@ locR
Definition ParamDefs.h:44