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

#include <PRDHandle_CSC.h>

Inheritance diagram for PRDHandle_CSC:
Collaboration diagram for PRDHandle_CSC:

Public Member Functions

 PRDHandle_CSC (PRDCollHandle_CSC *, const Muon::CscPrepData *)
virtual ~PRDHandle_CSC ()
void buildShapes (SoNode *&shape_simple, SoNode *&shape_detailed)
int regionIndex ()
const Muon::CscPrepDatacsc () const
const Trk::PrepRawDatagetPRD () const
bool inMuonChamber () const
GeoPVConstLink parentMuonChamberPV () const
virtual QStringList clicked () const
void setVisible (bool)
bool visible () const
virtual bool highLight () const
virtual bool transformUsesSurfacePositionOnly () 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::CscPrepDatam_csc
Impm_d
PRDSysCommonDatam_common
bool m_visible

Detailed Description

Definition at line 13 of file PRDHandle_CSC.h.

Constructor & Destructor Documentation

◆ PRDHandle_CSC()

PRDHandle_CSC::PRDHandle_CSC ( PRDCollHandle_CSC * collhandle,
const Muon::CscPrepData * csc )

Definition at line 24 of file PRDHandle_CSC.cxx.

25 : PRDHandleBase(static_cast<PRDCollHandleBase*>(collhandle)), m_csc(csc)
26{
28}
PRDHandleBase(PRDCollHandleBase *)
const Muon::CscPrepData * m_csc
const Muon::CscPrepData * csc() const
static void initClass()

◆ ~PRDHandle_CSC()

virtual PRDHandle_CSC::~PRDHandle_CSC ( )
inlinevirtual

Definition at line 17 of file PRDHandle_CSC.h.

17{};

Member Function Documentation

◆ buildShapes()

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

Implements PRDHandleBase.

Definition at line 31 of file PRDHandle_CSC.cxx.

32{
33 const CscIdHelper * idhelper = VP1DetInfo::cscIDHelper();
34 if (!idhelper)
35 return;
36
37 Identifier id = m_csc->identify();
38
39 SoSeparator * errDetailed = new SoSeparator;
40
41 double striplength = m_csc->detectorElement()->stripLength( id );
42 if (static_cast<PRDCollHandle_CSC*>(collHandle())->project())
43 striplength += 300.0;//Fixme: Rough extension for now
44 shape_simple = common()->nodeManager()->getShapeNode_Strip(striplength);
45
46 // Translation from objects local position to the strip position
47 const Amg::Vector2D& localpos = m_csc->localPosition();
48 const Amg::Vector3D& globalposHIT = m_csc->detectorElement()->stripPos( id );
49 // get local position on wire plane, here we have to use a tolarance as the wire plane is located 2.5 CLHEP::mm
50 // from the strip plane
51 double tolerance = 3.;
52 std::optional<Amg::Vector2D> localposHIT = m_csc->detectorElement()->surface( id ).Trk::Surface::globalToLocal(globalposHIT,tolerance);
53
54 if( !localposHIT )
55 {
56 localposHIT.emplace();
57 localposHIT->setZero();
58 VP1Msg::message("Warning: Local wire position is NULL");
59 }
60 SoTranslation * localtrans0 = new SoTranslation;
61 localtrans0->translation.setValue((*localposHIT)[Trk::locX]-localpos[Trk::locX],(*localposHIT)[Trk::locY]-localpos[Trk::locY],0);
62
63 const double maxCharge = 1e7;
64 //Thickness of highlighed strip
65 //FIXME: the maxCharge/3 is just a quick fix to get a nice presentation
66 // maybe this should go like sqrt(charge/maxCharge) so that it
67 // is clear for small charges.
68 //const double stripHeight = (1 + 4*sqrt(m_csc->charge()/maxCharge))*CLHEP::mm; // [1,5]
69 //
70 // The minimum is chosen equal to the neighbouring strips, such
71 // that a zero charge will give the same stirp height
72 const double stripHeight = (1 + 4*m_csc->charge()/(maxCharge/3))*CLHEP::mm; // [1,5]
73 //Thickness of additional strips (from rdoList())
74 const double stripHeightRDOs = 1*CLHEP::mm;
75
76 const std::vector<Identifier> rdolist = m_csc->rdoList();
77 if (rdolist.size() == 1 || !collHandle()->drawRDOs())
78 {
79 errDetailed->addChild(localtrans0);
80 errDetailed->addChild(common()->nodeManager()->getShapeNode_Strip(striplength,
81 m_csc->detectorElement()->cathodeReadoutPitch(idhelper->chamberLayer( id ),
82 idhelper->measuresPhi( id )), stripHeight));
83
84 //Translate back so errDetailed is left sane (eg. when drawing errors later)
85 SoTranslation * localtransBack = new SoTranslation;
86 localtransBack->translation.setValue(-(localtrans0->translation.getValue()));
87 errDetailed->addChild(localtransBack);
88 } else
89 {
90 SoSeparator * rdos = new SoSeparator;
91 rdos->addChild(localtrans0);
92
93 rdos->addChild(common()->nodeManager()->getShapeNode_Strip(striplength,
94 m_csc->detectorElement()->cathodeReadoutPitch(idhelper->chamberLayer( id ),
95 idhelper->measuresPhi( id )), stripHeight));
96
97 SoTransparency * transparent = new SoTransparency;
98 transparent->transparency.setValue(0.5);
99 rdos->addChild( transparent );
100 Amg::Vector2D localposOLD = *localposHIT;
101 for (const Identifier& rdo_id : rdolist)
102 {
103 if (rdo_id == id )
104 continue;
105 const Amg::Vector3D& globalposRDO = m_csc->detectorElement()->stripPos( rdo_id );
106
107 // const Amg::Vector2D * localposRDO = m_csc->detectorElement()->surface( rdo_id ).globalToLocal(globalposRDO,tolerance);
108 std::optional<Amg::Vector2D> localposRDO = m_csc->detectorElement()->surface( rdo_id ).Trk::Surface::globalToLocal(globalposRDO,tolerance);
109
110 if (!localposRDO)
111 {
112 VP1Msg::message("Warning: Local wire position is NULL");
113 continue;
114 }
115
116 SoTranslation * localtrans = new SoTranslation;
117 localtrans->translation.setValue((*localposRDO)[Trk::locX]-localposOLD[Trk::locX],(*localposRDO)[Trk::locY]-localposOLD[Trk::locY],0);
118 rdos->addChild(localtrans);
119 double striplengthRDO = m_csc->detectorElement()->stripLength( rdo_id );
120
121 rdos->addChild(common()->nodeManager()->getShapeNode_Strip(striplengthRDO,
122 m_csc->detectorElement()->cathodeReadoutPitch(idhelper->chamberLayer( rdo_id ),
123 idhelper->measuresPhi( rdo_id )), stripHeightRDOs));
124
125 localposOLD = *localposRDO;
126 }
127 errDetailed->addChild(rdos);
128 }
129
130 SoMaterial * mat = new SoMaterial;
131 mat->diffuseColor.setValue(1.0,0,0);
132 errDetailed->addChild(mat);
133 errDetailed->addChild(common()->nodeManager()->getShapeNode_Cross(10));
134
135 shape_detailed = errDetailed;
136}
T_ResultType project(ParameterMapping::type< N > parameter_map, const T_Matrix &matrix)
int chamberLayer(const Identifier &id) const
bool measuresPhi(const Identifier &id) const override
SoNode * getShapeNode_Strip(double length, double width=0, double depth=0)
PRDSysCommonData * common() const
PRDCollHandleBase * collHandle() const
HitsSoNodeManager * nodeManager() const
SoSFFloat transparency
static const CscIdHelper * cscIDHelper()
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37
constexpr double tolerance

◆ 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_CSC::clicked ( ) const
virtual

Reimplemented from PRDHandleBase.

Definition at line 147 of file PRDHandle_CSC.cxx.

148{
149
150 if (!m_csc)
151 return QStringList("Null PRD");
152 const CscIdHelper * idhelper = VP1DetInfo::cscIDHelper();
153 if (!idhelper)
154 return QStringList("Null PRD");
155
156 Identifier id = m_csc->identify();
157 std::ostringstream os;
158 os << "CscPrepData with Identifier ["<<id.get_compact() ;
159 os << "] = [" << (idhelper->print_to_string(id)) ;
160 os << "]\n at global position = [" << m_csc->globalPosition()<<"], local position = ["<<m_csc->localPosition()<<"].";
161 os << ". Charge="<<m_csc->charge()<<", time="<< m_csc->time()<<", status="<<Muon::toString(m_csc->status());
162 os << ". RDO list= [";
163 for( unsigned int i=0;i<m_csc->rdoList().size();++i) os << m_csc->rdoList()[i] << " , ";
164 os << "].";
165 // os << *(m_csc);
166 return QString(os.str().c_str()).split("\n");
167}
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
std::string toString(CscStripStatus cstat)
Return a string description of a CSC cluster status flag.

◆ 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)

◆ csc()

const Muon::CscPrepData * PRDHandle_CSC::csc ( ) const
inline

Definition at line 22 of file PRDHandle_CSC.h.

22{ return m_csc; }

◆ getPRD()

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

Implements PRDHandleBase.

Definition at line 23 of file PRDHandle_CSC.h.

23{ return m_csc; }

◆ 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
Eigen::Affine3d Transform3D
Amg::Rotation3D getRotation3DfromAngleAxis(double angle, Amg::Vector3D &axis)
get a AngleAxis from an angle and an axis.
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Eigen::Translation< double, 3 > Translation3D

◆ highLight()

virtual bool PRDHandleBase::highLight ( ) const
inlinevirtualinherited

Reimplemented in PRDHandle_MDT, and PRDHandle_TRT.

Definition at line 45 of file PRDHandleBase.h.

45{ return false; }//Return true to get hit highlighted (for e.g. a TRT hits with HT).

◆ inMuonChamber()

bool PRDHandle_CSC::inMuonChamber ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 26 of file PRDHandle_CSC.h.

26{ 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.

◆ parentMuonChamberPV()

GeoPVConstLink PRDHandle_CSC::parentMuonChamberPV ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 27 of file PRDHandle_CSC.h.

27{ return m_csc->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_CSC::regionIndex ( )
virtual

Reimplemented from PRDHandleBase.

Definition at line 139 of file PRDHandle_CSC.cxx.

140{
141 //Unique for each station.
142 const MuonGM::MuonStation* station = m_csc->detectorElement()->parentMuonStation();
143 return station->getPhiIndex()-99999*station->getEtaIndex();//hopefully unique.
144}
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()

virtual bool PRDHandleBase::transformUsesSurfacePositionOnly ( ) const
inlinevirtualinherited

Reimplemented in PRDHandle_MDT, and PRDHandle_TRT.

Definition at line 47 of file PRDHandleBase.h.

47{ return false; }//Override and return true if should use just the surface position.

◆ 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_csc

const Muon::CscPrepData* PRDHandle_CSC::m_csc
private

Definition at line 33 of file PRDHandle_CSC.h.

◆ m_d

Imp* PRDHandleBase::m_d
privateinherited

Definition at line 83 of file PRDHandleBase.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: