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

#include <PRDHandle_TRT.h>

Inheritance diagram for PRDHandle_TRT:
Collaboration diagram for PRDHandle_TRT:

Public Member Functions

 PRDHandle_TRT (PRDCollHandle_TRT *, const InDet::TRT_DriftCircle *)
virtual ~PRDHandle_TRT ()
void buildShapes (SoNode *&shape_simple, SoNode *&shape_detailed)
int regionIndex ()
bool highLight () const
bool transformUsesSurfacePositionOnly () const
const InDet::TRT_DriftCircledriftCircle () const
const Trk::PrepRawDatagetPRD () const
bool isBarrel () const
bool isPositiveZ () const
bool highLevel () const
virtual QStringList clicked () 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 ()
virtual bool inMuonChamber () const
virtual GeoPVConstLink parentMuonChamberPV () const
PRDCollHandleBasecollHandle () const
virtual const Trk::PrepRawDatagetSecondPRD () const
virtual bool isSane () const
 Returns false if the PRD is not safe to draw.

Private Attributes

const InDet::TRT_DriftCirclem_driftcircle
Impm_d
PRDSysCommonDatam_common
bool m_visible

Detailed Description

Definition at line 12 of file PRDHandle_TRT.h.

Constructor & Destructor Documentation

◆ PRDHandle_TRT()

PRDHandle_TRT::PRDHandle_TRT ( PRDCollHandle_TRT * collhandle,
const InDet::TRT_DriftCircle * dc )

Definition at line 24 of file PRDHandle_TRT.cxx.

25 : PRDHandleBase(static_cast<PRDCollHandleBase*>(collhandle)), m_driftcircle(dc)
26{
27}
PRDHandleBase(PRDCollHandleBase *)
const InDet::TRT_DriftCircle * m_driftcircle

◆ ~PRDHandle_TRT()

virtual PRDHandle_TRT::~PRDHandle_TRT ( )
inlinevirtual

Definition at line 16 of file PRDHandle_TRT.h.

16{};

Member Function Documentation

◆ buildShapes()

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

Implements PRDHandleBase.

Definition at line 30 of file PRDHandle_TRT.cxx.

31{
32 const Trk::CylinderBounds* ccbo = dynamic_cast<const Trk::CylinderBounds*>(&(m_driftcircle->detectorElement()->surface(m_driftcircle->identify()).bounds()));
33 if (not ccbo) return;
34 const double radius = m_driftcircle->localPosition()[0];
35 const double halflength = ccbo->halflengthZ();
36 const double mintuberadius = 0.1;
37
38 if ( m_driftcircle->rdoList().size() > 1)
39 VP1Msg::message("Warning: TRT has additional elements in rdoList: NOT IMPLEMENTED");
40
41 const PRDCollHandle_TRT* trtcollhandle(static_cast<PRDCollHandle_TRT*>(collHandle()));
42
43 if (trtcollhandle->project()) {
44
46 // Projections: //
48
49 const InDetProjFlags::InDetProjPartsFlags projparts(trtcollhandle->appropriateProjections());
50 bool inner,outer;
51 if (isBarrel()) {
52 inner = (projparts&InDetProjFlags::BarrelCentral);
54 } else {
55 const bool posz(isPositiveZ());
58 //Special TRT EndCap Z->R projections.
59
60 //Find center of tube:
62 Amg::Vector3D center(prdtransform*Amg::Vector3D(0,0,0));
63
64 // --> Get points for special projections
66 std::vector<Amg::Vector3D > points;
67
68 if (posz) {
76 points.push_back(p);
77 }
78 if ( projparts & InDetProjFlags::TRT_EndCapZToRCentral ) {
80 //Fixme: Use same parameters here as in InDetProjHelper!!
86 points.push_back(p);
87 }
88 } else {
96 points.push_back(p);
97 }
98 if ( projparts & InDetProjFlags::TRT_EndCapZToRCentral ) {
105 points.push_back(p);
106 }
107 }
108 // --> Build scene objects for special projections
109
110 const unsigned npoints = points.size();
111 if (npoints<1||npoints>2) {
112 collHandle()->message("PRDHandle_TRT::buildShapes ERROR: Unexpected number of points in special endcap projections!!");
113 } else {
114 SoSeparator * sepsimple = new SoSeparator;
115 SoTransform * transf1(VP1LinAlgUtils::toSoTransform((prdtransform.inverse())
116 * Amg::Translation3D(points.at(0).x(),points.at(0).y(),points.at(0).z())));
117 SoNode* point = common()->nodeManager()->getShapeNode_Point();
118 sepsimple->addChild(transf1);
119 sepsimple->addChild(point);
120 SoTranslation * transf2(0);
121 if (npoints==2) {
122 transf2 = new SoTranslation;
123 transf2->translation.setValue(points[1].x()-points[0].x(),points[1].y()-points[0].y(),points[1].z()-points[0].z());
124 sepsimple->addChild(transf2);
125 sepsimple->addChild(point);
126 }
127 shape_simple = sepsimple;
128
129 if (radius<mintuberadius) {
130 shape_detailed = shape_simple;
131 return;
132 }
133 SoSeparator * sepdetailed = new SoSeparator;
134 SoNode* disc = common()->nodeManager()->getShapeNode_DriftDisc(radius);
135 sepdetailed->addChild(transf1);
136 sepdetailed->addChild(disc);
137 if (npoints==2) {
138 sepdetailed->addChild(transf2);
139 sepdetailed->addChild(disc);
140 }
141 shape_detailed = sepdetailed;
142 return;
143 }
144 inner = false;outer = false;
145 //end special projections
146 } else {
149 }
150 }//end endcap
151 if (!inner&&!outer) {
152 collHandle()->message("PRDHandle_TRT::buildShapes ERROR: Inconsistent projection settings! Won't project!");
153 } else {
154 //Perform projections
155 shape_simple = common()->nodeManager()->getShapeNode_ProjectedDriftTube( halflength, 0.0, inner, outer );
156 if (radius<mintuberadius)
157 shape_detailed = shape_simple;
158 else
159 shape_detailed = common()->nodeManager()->getShapeNode_ProjectedDriftTube( halflength, radius, inner, outer );
160 return;
161 }
162 }//endif projections
163
165 // No projections: //
167
168 shape_simple = common()->nodeManager()->getShapeNode_DriftTube( halflength, 0.0 );
169 if (radius<mintuberadius)
170 shape_detailed = shape_simple;
171 else
172 shape_detailed = common()->nodeManager()->getShapeNode_DriftTube( halflength, radius );
173
174}
#define y
#define x
#define z
SoNode * getShapeNode_DriftDisc(double radius)
SoNode * getShapeNode_ProjectedDriftTube(double halfLength, double radius, bool inner, bool outer)
SoNode * getShapeNode_DriftTube(double halfLength, double radius)
static void transformECPointToZPlane_specialZtoR(Amg::Vector3D &p, const double &planeZ, const double &planeRBegin, const double &endcapZBegin, const double &squeezeFactor)
static double trt_barrel_posneg_z()
static double trt_endcap_zasr_squeezefact()
static double surfacethickness()
static double trt_endcap_zasr_endcapz_begin()
static double trt_data_disttosurface_epsilon()
static double trt_endcap_zasr_innerradius()
Amg::Transform3D getTransform_CLHEP() const
PRDSysCommonData * common() const
PRDCollHandleBase * collHandle() const
virtual Amg::Vector3D center() const
bool isPositiveZ() const
bool isBarrel() const
HitsSoNodeManager * nodeManager() const
void message(const QString &) const
static SoTransform * toSoTransform(const HepGeom::Transform3D &, SoTransform *t=0)
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D

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

Reimplemented from PRDHandleBase.

Definition at line 188 of file PRDHandle_TRT.cxx.

189{
190 QStringList l;
192 const unsigned int data = m_driftcircle->getWord();
193
194 QString s;
195 int i;
196 for (i = 26; i >=0; i--)
197 {
198 if (i!=26&&(i+1)%9==0)
199 s+=" ";
200 s += ( data & (0x1<<i) ? "1" : "0");
201 if ((i+1)%9==0)
202 s+=" ";
203 }
204 l << "Raw data bits: "+s;
205
206
207 std::ostringstream os;
208 os << std::hex<<data;
209 l << QString(os.str().c_str());
210
211
212// l << "Drift radius: "+QString::number(m_driftcircle->localPosition()[0]/CLHEP::mm)+" CLHEP::mm";
213// const Trk::CylinderBounds* ccbo = dynamic_cast<const Trk::CylinderBounds*>(&(m_driftcircle->detectorElement()->surface(m_driftcircle->identify()).bounds()));
214// if (ccbo)
215// l << "Straw length: "+QString::number(ccbo->halflengthZ()*2/CLHEP::cm)+" CLHEP::cm";
216
217 return l;
218}
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
virtual QStringList clicked() const
l
Printing final latex table to .tex output file.

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

◆ driftCircle()

const InDet::TRT_DriftCircle * PRDHandle_TRT::driftCircle ( ) const
inline

Definition at line 24 of file PRDHandle_TRT.h.

24{ return m_driftcircle; }

◆ getPRD()

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

Implements PRDHandleBase.

Definition at line 25 of file PRDHandle_TRT.h.

25{ 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.
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.

◆ highLevel()

bool PRDHandle_TRT::highLevel ( ) const
inline

Definition at line 29 of file PRDHandle_TRT.h.

29{ return m_driftcircle->highLevel(); }

◆ highLight()

bool PRDHandle_TRT::highLight ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 43 of file PRDHandle_TRT.h.

44{
45 return highLevel() && static_cast<PRDCollHandle_TRT*>(collHandle())->highLightHighThreshold();
46}
bool highLevel() const

◆ inMuonChamber()

virtual bool PRDHandleBase::inMuonChamber ( ) const
inlinevirtualinherited

Reimplemented in PRDHandle_CSC, PRDHandle_CSC_Strip, PRDHandle_MDT, PRDHandle_MM, PRDHandle_RPC, PRDHandle_sTGC, and PRDHandle_TGC.

Definition at line 67 of file PRDHandleBase.h.

67{ return false; }

◆ isBarrel()

bool PRDHandle_TRT::isBarrel ( ) const
inline

Definition at line 27 of file PRDHandle_TRT.h.

27{ return m_driftcircle->detectorElement()->type()==InDetDD::TRT_BaseElement::BARREL; }

◆ isPositiveZ()

bool PRDHandle_TRT::isPositiveZ ( ) const
inline

Definition at line 28 of file PRDHandle_TRT.h.

28{ return m_driftcircle->detectorElement()->center().z() > 0.0; }

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

virtual GeoPVConstLink PRDHandleBase::parentMuonChamberPV ( ) const
inlinevirtualinherited

Reimplemented in PRDHandle_CSC, PRDHandle_CSC_Strip, PRDHandle_MDT, PRDHandle_MM, PRDHandle_RPC, PRDHandle_sTGC, and PRDHandle_TGC.

Definition at line 68 of file PRDHandleBase.h.

68{ return GeoPVConstLink(); }

◆ 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_TRT::regionIndex ( )
virtual

Reimplemented from PRDHandleBase.

Definition at line 177 of file PRDHandle_TRT.cxx.

178{
179 const TRT_ID * id_helper = VP1DetInfo::trtIDHelper();
180 if (!id_helper)
181 return 0;
182 Identifier id = m_driftcircle->identify();
183 return id_helper->barrel_ec(id)*10000+id_helper->layer_or_wheel(id)*100+(id_helper->phi_module(id)%4);
184}
int phi_module(const Identifier &id) const
Definition TRT_ID.h:806
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition TRT_ID.h:797
int layer_or_wheel(const Identifier &id) const
Definition TRT_ID.h:815
static const TRT_ID * trtIDHelper()

◆ 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_TRT::transformUsesSurfacePositionOnly ( ) const
inlinevirtual

Reimplemented from PRDHandleBase.

Definition at line 22 of file PRDHandle_TRT.h.

22{ 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 InDet::TRT_DriftCircle* PRDHandle_TRT::m_driftcircle
private

Definition at line 35 of file PRDHandle_TRT.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: