ATLAS Offline Software
Loading...
Searching...
No Matches
PRDHandle_MDT Class Reference

#include <PRDHandle_MDT.h>

Inheritance diagram for PRDHandle_MDT:
Collaboration diagram for PRDHandle_MDT:

Public Member Functions

 PRDHandle_MDT (PRDCollHandle_MDT *, const Muon::MdtPrepData *)
virtual ~PRDHandle_MDT ()
void buildShapes (SoNode *&shape_simple, SoNode *&shape_detailed)
int regionIndex ()
QStringList clicked () const
bool highLight () const
bool transformUsesSurfacePositionOnly () const
const Muon::MdtPrepDatadriftCircle () const
const Trk::PrepRawDatagetPRD () const
bool masked () const
QString driftCircleStatus () const
int ADC () const
bool inMuonChamber () const
GeoPVConstLink parentMuonChamberPV () const
void setVisible (bool)
bool visible () const
SoSeparator * sepSimple () const
SoSeparator * sepDetailed () const
PRDSysCommonDatacommon () const
virtual Amg::Vector3D center () const
Amg::Vector3D positionPRD () const
Amg::Vector3D positionSecondPRD () const
Amg::Transform3D getTransform_CLHEP () const
virtual SoTransform * createTransform () const
void update3DObjects ()
void updateMaterial ()
PRDCollHandleBasecollHandle () const
virtual const Trk::PrepRawDatagetSecondPRD () const
virtual bool isSane () const
 Returns false if the PRD is not safe to draw.

Private Attributes

const Muon::MdtPrepDatam_driftcircle
Impm_d
PRDSysCommonDatam_common
bool m_visible

Detailed Description

Definition at line 12 of file PRDHandle_MDT.h.

Constructor & Destructor Documentation

◆ PRDHandle_MDT()

PRDHandle_MDT::PRDHandle_MDT ( PRDCollHandle_MDT * collhandle,
const Muon::MdtPrepData * dc )

Definition at line 19 of file PRDHandle_MDT.cxx.

20 : PRDHandleBase(static_cast<PRDCollHandleBase*>(collhandle)), m_driftcircle(dc)
21{
22}
PRDHandleBase(PRDCollHandleBase *)
const Muon::MdtPrepData * m_driftcircle

◆ ~PRDHandle_MDT()

virtual PRDHandle_MDT::~PRDHandle_MDT ( )
inlinevirtual

Definition at line 16 of file PRDHandle_MDT.h.

16{};

Member Function Documentation

◆ ADC()

int PRDHandle_MDT::ADC ( ) const
inline

Definition at line 49 of file PRDHandle_MDT.h.

50{
51 return m_driftcircle->adc();
52}

◆ buildShapes()

void PRDHandle_MDT::buildShapes ( SoNode *& shape_simple,
SoNode *& shape_detailed )
virtual

Implements PRDHandleBase.

Definition at line 25 of file PRDHandle_MDT.cxx.

26{
27 const Trk::CylinderBounds* ccbo = dynamic_cast<const Trk::CylinderBounds*>(&(m_driftcircle->detectorElement()->surface(m_driftcircle->identify()).bounds()));
28 if (not ccbo) return;
29
30 double radius = m_driftcircle->localPosition()[0];
31 if (radius<0.15)
32 radius = 0.0;//radius is so small it is better to collapse to line
33 double halflength(ccbo->halflengthZ());
34 PRDCollHandle_MDT::PROJECTION projection(static_cast<PRDCollHandle_MDT*>(collHandle())->projection());
35 if (projection!=PRDCollHandle_MDT::NONE) {
36 const double epsilon = 0.15;
37 if (projection==PRDCollHandle_MDT::TOCHAMBERS) {
38 double distanceToFirstEndPlane, distanceToSecondEndPlane;
40 Amg::Vector3D tubedir(0.0,0.0,1.0);
42 if (common()->muonChamberProjectionHelper()
43 ->getDistancesToMDTChamberWallsAlongLine( parentMuonChamberPV(),
44 transform * Amg::Vector3D(0.0,0.0,0.0), tubedir,
45 distanceToFirstEndPlane, distanceToSecondEndPlane, radius )) {
46 if (fabs(distanceToFirstEndPlane-distanceToSecondEndPlane)>0.1*epsilon)
47 std::cout <<"PRDHandle_MDT: Warning tube is not centered in chamber! We should translate the prd object appropriately (todo)."<<std::endl;
48 halflength = std::max(distanceToFirstEndPlane,distanceToSecondEndPlane)+epsilon;
49 } else {
50 std::cout <<"PRDHandle_MDT: Couldn't retrieve data for projections to chamber end planes."<<std::endl;
51 halflength += 500.0;
52 }
53 } else {
54 assert(projection==PRDCollHandle_MDT::TOTUBES);
55 //To end of tubes.
56 halflength += 56.0 + epsilon;
57 }
58 }
59
60 shape_simple = common()->nodeManager()->getShapeNode_DriftTube( halflength, 0.0 );
61 //Detailed shape uses tube (unless negligible radius):
62 if (radius==0.0)
63 shape_detailed = shape_simple;
64 else
65 shape_detailed = common()->nodeManager()->getShapeNode_DriftTube( halflength, radius );
66
67 if ( m_driftcircle->rdoList().size() > 1)
68 VP1Msg::message("Warning: MDT has additional elements in rdoList: NOT IMPLEMENTED");
69}
SoNode * getShapeNode_DriftTube(double halfLength, double radius)
static Amg::Vector3D & applyTransformToVector(const Amg::Transform3D &m, Amg::Vector3D &v)
Amg::Transform3D getTransform_CLHEP() const
PRDSysCommonData * common() const
PRDCollHandleBase * collHandle() const
GeoPVConstLink parentMuonChamberPV() const
HitsSoNodeManager * nodeManager() const
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30
Eigen::Affine3d Transform3D
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Eigen::Matrix< double, 3, 1 > Vector3D

◆ center()

Amg::Vector3D PRDHandleBase::center ( ) const
virtualinherited

Reimplemented in PRDHandle_SpacePoint.

Definition at line 316 of file PRDHandleBase.cxx.

317{
318 return positionPRD();
319}
Amg::Vector3D positionPRD() const

◆ clicked()

QStringList PRDHandle_MDT::clicked ( ) const
virtual

Reimplemented from PRDHandleBase.

Definition at line 80 of file PRDHandle_MDT.cxx.

81{
82
83 if (!m_driftcircle)
84 return QStringList("Null PRD");
85 const MdtIdHelper * idhelper = VP1DetInfo::mdtIDHelper();
86 if (!idhelper)
87 return QStringList("Null PRD");
88
89 std::ostringstream os;
90 Identifier id = m_driftcircle->identify();
91
92 os << "MdtPrepData with Identifier ["<<id.get_compact() ;
93 os << "] = [" << (idhelper->print_to_string(id)) ;
94 os << "]\n at global position = [" << m_driftcircle->globalPosition()<<"], local position = ["<<m_driftcircle->localPosition()<<"].";
95 os <<"\nDrift radius = "<<m_driftcircle->localPosition()[0]<<" CLHEP::mm. ";
96 os <<"ADC: "<<m_driftcircle->adc();
97 os <<", TDC: "<<m_driftcircle->tdc();
98 std::string status("Status: ");
99 os<<status;
100
101 QStringList l(QString(os.str().c_str())+driftCircleStatus());
102
103 return l;
104}
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
QString driftCircleStatus() const
static const MdtIdHelper * mdtIDHelper()
l
Printing final latex table to .tex output file.
status
Definition merge.py:16

◆ collHandle()

PRDCollHandleBase * PRDHandleBase::collHandle ( ) const
inherited

Definition at line 228 of file PRDHandleBase.cxx.

229{
230 return m_d->colhandle;
231}

◆ common()

PRDSysCommonData * PRDHandleBase::common ( ) const
inlineinherited

Definition at line 53 of file PRDHandleBase.h.

53{ return m_common; }
PRDSysCommonData * m_common

◆ createTransform()

SoTransform * PRDHandleBase::createTransform ( ) const
virtualinherited

Reimplemented in PRDHandle_sTGC, and PRDHandle_TGC.

Definition at line 371 of file PRDHandleBase.cxx.

372{
373 //NB: Some code duplicated here and in the getTransform_CLHEP() method.
374 const Trk::PrepRawData * prd = getPRD();
375 if (!prd) {
376 std::cerr<<"PRDHandleBase::createTransform() No prd!"<<std::endl;
377 return new SoTransform;
378 }
379 const Trk::Surface& theSurface = prd->detectorElement()->surface(prd->identify());
380 SoTransform * theHitTransform = VP1LinAlgUtils::toSoTransform(theSurface.transform());
381
382 Amg::Vector3D theHitGPos;
384 // for tubes, should use position of center of tube (if drawing full tube)
385 theHitGPos= Amg::Vector3D (theSurface.center());
386 } else {
387 // for strips, clusters or short tubes, use position of hit.
388 theHitGPos = theSurface.localToGlobal(prd->localPosition());
389 }
390 if ((theHitGPos)[0]!=(theHitGPos)[0] || (theHitGPos)[1]!=(theHitGPos)[1] || (theHitGPos)[2]!=(theHitGPos)[2]){
391 std::cerr<<"PRDHandleBase::createTransform() NaN in globalposition"<<std::endl;
392 }
393 theHitTransform->translation.setValue((theHitGPos)[0], (theHitGPos)[1], (theHitGPos)[2]);
394 return theHitTransform;
395}
virtual const Trk::PrepRawData * getPRD() const =0
virtual bool transformUsesSurfacePositionOnly() const
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
const Amg::Vector2D & localPosition() const
return the local position reference
Identifier identify() const
return the identifier
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
virtual const Surface & surface() const =0
Return surface associated with this detector element.
static SoTransform * toSoTransform(const HepGeom::Transform3D &, SoTransform *t=0)

◆ driftCircle()

const Muon::MdtPrepData * PRDHandle_MDT::driftCircle ( ) const
inline

Definition at line 25 of file PRDHandle_MDT.h.

25{ return m_driftcircle; }

◆ driftCircleStatus()

QString PRDHandle_MDT::driftCircleStatus ( ) const

Definition at line 107 of file PRDHandle_MDT.cxx.

108{
109 QString status;
110 switch (m_driftcircle->status()){
112 status+="Masked";
113 break;
115 status+="Drift Time";
116 break;
118 status+="Before Spectrum";
119 break;
121 status+="After Spectrum";
122 break;
123 default:
124 status+=QString((" Unknown with value = "+std::to_string(m_driftcircle->status())).c_str());
125 }
126 return status;
127}
@ MdtStatusAfterSpectrum
The tube produced a hit that is inconsistent with the drift time spectrum, the drift time is larger t...
@ MdtStatusBeforeSpectrum
The tube produced a hit that is inconsistent with the drift time spectrum, the drift time is smaller ...
@ MdtStatusMasked
A hit during a previous bunch crossing occured which rendered the tube dead for this bunch crossing.
@ MdtStatusDriftTime
The tube produced a vaild measurement.

◆ getPRD()

const Trk::PrepRawData * PRDHandle_MDT::getPRD ( ) const
inlinevirtual

Implements PRDHandleBase.

Definition at line 26 of file PRDHandle_MDT.h.

26{ return m_driftcircle; }

◆ getSecondPRD()

virtual const Trk::PrepRawData * PRDHandleBase::getSecondPRD ( ) const
inlinevirtualinherited

Reimplemented in PRDHandle_SpacePoint.

Definition at line 73 of file PRDHandleBase.h.

73{ return 0; }//For SCT spacepoints

◆ getTransform_CLHEP()

Amg::Transform3D PRDHandleBase::getTransform_CLHEP ( ) const
inherited

Definition at line 322 of file PRDHandleBase.cxx.

323{
324 if (m_d->sepDetailed&&m_d->sepDetailed->getNumChildren()>0) {
325 //For efficiency/consistency we simply copy the transform from the
326 //inventor transformation (only loose slight precision in the
327 //double->float->double conversions):
328 SoTransform * transform = static_cast<SoTransform*>(m_d->sepDetailed->getChild(0));
329 float tx, ty, tz;
330 transform->translation.getValue().getValue(tx,ty,tz);
331 SbVec3f so_rotaxis;
332 float so_rotangle;
333 transform->rotation.getValue().getValue(so_rotaxis, so_rotangle);
334 float rx, ry, rz;
335 so_rotaxis.getValue(rx,ry,rz);
336 Amg::Vector3D axis(rx,ry,rz);
337// Amg::AngleAxis3D angleAxis = Amg::getRotation3DfromAngleAxis( so_rotangle, axis );
338// Amg::Rotation3D rot;
339// rot = angleAxis;
340 Amg::Rotation3D rot = Amg::getRotation3DfromAngleAxis( so_rotangle, axis );
341 return Amg::Translation3D(tx,ty,tz) * rot;
342 }
343 std::cout<<"VP1 PRDHandleBase Warning: getTransform_CLHEP called at inopportune moment!!"<<std::endl;
344
345 //NB: Some code duplicated here and in the createTransform() method.
346
347 const Trk::PrepRawData * prd = getPRD();
348 if (!prd) {
349 return Amg::Transform3D::Identity();
350 }
351 const Trk::Surface& theSurface = prd->detectorElement()->surface(prd->identify());
352 Amg::Vector3D theHitGPos;
354 // for tubes, should use position of center of tube (if drawing full tube)
355 theHitGPos= Amg::Vector3D(theSurface.center());
356 } else {
357 // for clusters or short tubes, use position of hit.
358 theHitGPos = theSurface.localToGlobal(prd->localPosition()); //theSurface 'new s' a Vector3D and returns pointer
359 }
360
361// CLHEP::Hep3Vector t(theSurface.transform().getTranslation());
362// return HepGeom::Transform3D( HepGeom::Translate3D(theHitGPos->x()-t.x(),theHitGPos->y()-t.y(),theHitGPos->z()-t.z()) * (theSurface.transform()) );
365 Amg::Translation3D transl = Amg::Translation3D(theHitGPos.x()-t.x(), theHitGPos.y()-t.y(), theHitGPos.z()-t.z());
366 Amg::Transform3D transf = transl * (theSurface.transform());
367 return transf;
368}
static Double_t rz
Amg::Vector3D getTranslationVectorFromTransform(const Amg::Transform3D &tr)
Get the Translation vector out of a Transformation.
Eigen::Quaternion< double > Rotation3D
Amg::Rotation3D getRotation3DfromAngleAxis(double angle, Amg::Vector3D &axis)
get a AngleAxis from an angle and an axis.
Eigen::Translation< double, 3 > Translation3D

◆ highLight()

bool PRDHandle_MDT::highLight ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 54 of file PRDHandle_MDT.h.

55{
56 PRDCollHandle_MDT* ch = static_cast<PRDCollHandle_MDT*>(collHandle());
57 return ( masked() && ch->highLightMasked() ) || ( ADC() <= ch->highLightADCBelow() );
58}
int ADC() const
bool masked() const

◆ inMuonChamber()

bool PRDHandle_MDT::inMuonChamber ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 32 of file PRDHandle_MDT.h.

32{ return true; }

◆ isSane()

virtual bool PRDHandleBase::isSane ( ) const
inlinevirtualinherited

Returns false if the PRD is not safe to draw.

Reimplemented in PRDHandle_Pixel.

Definition at line 75 of file PRDHandleBase.h.

◆ masked()

bool PRDHandle_MDT::masked ( ) const
inline

Definition at line 44 of file PRDHandle_MDT.h.

45{
46 return m_driftcircle->status() == Muon::MdtStatusMasked;
47}

◆ parentMuonChamberPV()

GeoPVConstLink PRDHandle_MDT::parentMuonChamberPV ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 33 of file PRDHandle_MDT.h.

33{ return m_driftcircle->detectorElement()->getMaterialGeom()->getParent(); }

◆ positionPRD()

Amg::Vector3D PRDHandleBase::positionPRD ( ) const
inherited

Definition at line 303 of file PRDHandleBase.cxx.

304{
305 return Imp::positionPRD(getPRD());
306}
static Amg::Vector3D positionPRD(const Trk::PrepRawData *prd)

◆ positionSecondPRD()

Amg::Vector3D PRDHandleBase::positionSecondPRD ( ) const
inherited

Definition at line 309 of file PRDHandleBase.cxx.

310{
312}
virtual const Trk::PrepRawData * getSecondPRD() const

◆ regionIndex()

int PRDHandle_MDT::regionIndex ( )
virtual

Reimplemented from PRDHandleBase.

Definition at line 72 of file PRDHandle_MDT.cxx.

73{
74 //Unique for each station.
75 const MuonGM::MuonStation* station = m_driftcircle->detectorElement()->parentMuonStation();
76 return station->getPhiIndex()-99999*station->getEtaIndex();//hopefully unique.
77}
int getEtaIndex() const
a la AMDB
int getPhiIndex() const
a la AMDB

◆ sepDetailed()

SoSeparator * PRDHandleBase::sepDetailed ( ) const
inherited

Definition at line 60 of file PRDHandleBase.cxx.

61{
62 return m_d->sepDetailed;
63}

◆ sepSimple()

SoSeparator * PRDHandleBase::sepSimple ( ) const
inherited

Definition at line 54 of file PRDHandleBase.cxx.

55{
56 return m_d->sepSimple;
57}

◆ setVisible()

void PRDHandleBase::setVisible ( bool vis)
inherited

Definition at line 234 of file PRDHandleBase.cxx.

235{
236 if (vis==m_visible)
237 return;
238 //std::cout<<"Changing visible status from "<<m_visible<<" to "<<vis<<" for: "<<*getPRD()<<std::endl;
239 m_visible=vis;
240 if (vis) {
241 m_d->colhandle->incrementNShownHandles();
242 if (inMuonChamber())
244 if (!m_d->sepSimple||!m_d->sepDetailed)
245 m_d->rebuild3DObjects(this);//The call to rebuild also fixes attached state.
246 else
247 m_d->attach3DObjects(this);
248 } else {
249 m_d->colhandle->decrementNShownHandles();
250 if (inMuonChamber())
252 m_d->detach3DObjects();
253 }
254}
virtual bool inMuonChamber() const
virtual GeoPVConstLink parentMuonChamberPV() const
TouchedMuonChamberHelper * touchedMuonChamberHelper() const
void decrementNumberOfObjectsForPV(const GeoPVConstLink &chamberPV)
void incrementNumberOfObjectsForPV(const GeoPVConstLink &chamberPV)

◆ transformUsesSurfacePositionOnly()

bool PRDHandle_MDT::transformUsesSurfacePositionOnly ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 24 of file PRDHandle_MDT.h.

24{ return true; }

◆ update3DObjects()

void PRDHandleBase::update3DObjects ( )
inherited

Definition at line 257 of file PRDHandleBase.cxx.

257 {
258 //Fixme: If selected we really need to redo selection updates!!!
259 if (m_visible) {
260 m_d->rebuild3DObjects(this);
261 } else {
262 //Simply clear the present 3D objects. They will only be recreated if/when the prd becomes visible again.
263 if (m_d->sepDetailed) {
264 m_d->sepDetailed->unref();
265 m_d->sepDetailed = 0;
266 }
267 if (m_d->sepSimple) {
268 m_d->sepSimple->unref();
269 m_d->sepSimple = 0;
270 }
271 }
272
273}

◆ updateMaterial()

void PRDHandleBase::updateMaterial ( )
inherited

Definition at line 160 of file PRDHandleBase.cxx.

161{
162 //We need to change the current material. This means we need to
163 //clear the cache. Only if we are visible do we need to do a
164 //detach->clear material->attach cycle to trigger attachment under new material.
165
166 if (!m_d->currentmaterial)
167 return;//We have no material cached and is thus not attached either.
168 if (m_visible) {
169 //See if the material changed. If it did, detach, update the material, attach again.
170 SoMaterial * newmat = m_d->determineMaterial(this);
171 newmat->ref();
172 if (newmat!=m_d->currentmaterial) {
173 m_d->detach3DObjects();
174 m_d->currentmaterial->unref();
175 m_d->currentmaterial = newmat;
176 m_d->attach3DObjects(this);
177 } else {
178 newmat->unref();
179 }
180 } else {
181 //Just clear material.
182 m_d->currentmaterial->unref();
183 m_d->currentmaterial = 0;
184 }
185}

◆ visible()

bool PRDHandleBase::visible ( ) const
inlineinherited

Definition at line 42 of file PRDHandleBase.h.

42{ return m_visible; }

Member Data Documentation

◆ m_common

PRDSysCommonData* PRDHandleBase::m_common
privateinherited

Definition at line 84 of file PRDHandleBase.h.

◆ m_d

Imp* PRDHandleBase::m_d
privateinherited

Definition at line 83 of file PRDHandleBase.h.

◆ m_driftcircle

const Muon::MdtPrepData* PRDHandle_MDT::m_driftcircle
private

Definition at line 40 of file PRDHandle_MDT.h.

◆ m_visible

bool PRDHandleBase::m_visible
privateinherited

Definition at line 86 of file PRDHandleBase.h.


The documentation for this class was generated from the following files: