ATLAS Offline Software
Loading...
Searching...
No Matches
TrackHandle_TrkTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7// //
8// Implementation of class TrackHandle_TrkTrack //
9// //
10// Author: Thomas H. Kittelmann (Thomas.Kittelmann@cern.ch) //
11// Initial version: February 2008 //
12//
13// Updates:
14// - 2023 Sep, Riccardo Maria BIANCHI @ cern.ch, added Pt to track item in the browser
15// //
17
24#include "TrkTrack/Track.h"
26#include "TrkSurfaces/Surface.h"
27#include "Identifier/Identifier.h"
32#include "VP1Base/VP1Msg.h"//fixme
35#include <Inventor/nodes/SoSeparator.h>
36#include <Inventor/nodes/SoNode.h>
37
38
39
40//____________________________________________________________________
48
49//____________________________________________________________________
53
54//____________________________________________________________________
56{
57 // Object browser stuff
58 QTreeWidget* trkObjBrowser = common()->controller()->trackObjBrowser();
59 if (trkObjBrowser){
60 trkObjBrowser->setCurrentItem(browserTreeItem());
61 trkObjBrowser->scrollToItem(browserTreeItem());
62 }
63 QStringList l;
64 l << "Trk::Track";
65 if (!m_trk) {
66 l << "ERROR: This TrackHandle_TrkTrack handle has a NULL track pointer!!";
67 return l;
68 }
69 l << "Author info: " << " "+QString(m_trk->info().dumpInfo().c_str());
70
72 if (m_trk->fitQuality())
73 l << "Fit quality [Chi^2, nDoF] = ["+QString::number(m_trk->fitQuality()->chiSquared())+", "+QString::number(m_trk->fitQuality()->doubleNumberDoF())+"]. ";
74 if (common()->controller()->printVerboseInfoOnSingleSelection()) {
75 l << " ===== dump =====";
76 std::ostringstream s;
77 s << *m_trk;
78 l << QString(s.str().c_str()).split('\n');
79 }
80 return l;
81}
82
83//____________________________________________________________________
85{
86 //Fixme: TO BASE!!!
87
89 if (!VP1JobConfigInfo::hasMuonGeometry()||!sanity) {
90 VP1Msg::messageVerbose("TrackHandle_TrkTrack WARNING: can't init touched muon chamber list.");
91 return;
92 }
93 Trk::TrackStates::const_iterator tsos_iter = m_trk->trackStateOnSurfaces()->begin();
94 Trk::TrackStates::const_iterator tsos_end = m_trk->trackStateOnSurfaces()->end();
95 for (; tsos_iter != tsos_end; ++tsos_iter) {
96 if (!VP1TrackSanity::isSafe(*tsos_iter)) {
97 if (VP1Msg::verbose())
98 VP1Msg::messageVerbose("TrackHandle_TrkTrack WARNING: Skipping unsafe TSOS for touched muon chamber determination.");
99 continue;
100 }
101 ensureTouchedMuonChambersInitialiasedFromMeas( (*tsos_iter)->measurementOnTrack() );
102 }
103}
104
106{
107 if (meas) {
108 const Trk::CompetingRIOsOnTrack* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(meas);
109
110 // for competing ROTs, it is expected that these are in the same DE. If this turns out not to be the case, need to loop & recursively call this method. EJWM
111 if (crot)
112 meas=&(crot->rioOnTrack(0));
113 if (!VP1TrackSanity::isSafe(meas)) {
114 if (VP1Msg::verbose())
115 VP1Msg::messageVerbose("TrackHandle_TrkTrack WARNING: Skipping unsafe TSOS for touched muon chamber determination.");
116 return;
117 }
118
119 const Trk::RIO_OnTrack* rio = dynamic_cast<const Trk::RIO_OnTrack*>(meas);
120 if (rio) {
121 const MuonGM::MuonReadoutElement* muonDetEl = getMuonReadoutElement(*rio);
122 if (muonDetEl)
123 registerTouchedMuonChamber(muonDetEl->getMaterialGeom()->getParent());
124 }
125 }
126}
127
128
129
130//____________________________________________________________________
132{
133 for (const Trk::TrackParameters* param : *m_trk->trackParameters()) {
134 if (!common()->trackSanityHelper()->isSafe(param))
135 continue;
136 return param->momentum();
137 }
139}
140
141//____________________________________________________________________
143{
144 static_cast<TrackCollHandle_TrkTrack*>(collHandle())->visibleStateUpdated(this);
146}
147
148//____________________________________________________________________
150{
151 if (visible())
152 static_cast<TrackCollHandle_TrkTrack*>(collHandle())->visibleStateUpdated(this);
153}
154
155//____________________________________________________________________
161
162void TrackHandle_TrkTrack::fillObjectBrowser( QList<QTreeWidgetItem *>& listOfItems)
163{
164 TrackHandleBase::fillObjectBrowser(listOfItems); // Obligatory!
165
166 // Fill sub-data.
167 QList<AssociatedObjectHandleBase*> list = getAllAscObjHandles();
170 unsigned int i=0;
171 for (;it!=itE;++it){
172// VP1Msg::messageVerbose("TSOS #"+QString::number(i++));
173
174 bool visible=false;
175 QTreeWidgetItem* TSOSitem = new QTreeWidgetItem(browserTreeItem());
176
177 AscObj_TSOS* asc=nullptr;
178 if (i<static_cast<unsigned int>(list.size())) asc = dynamic_cast<AscObj_TSOS*>(list.at(i));
179
180 if (asc) {
181 asc->setBrowserTreeItem(TSOSitem);
182 visible=asc->visible();
183 }
184
185 if (!visible) {
186 TSOSitem->setFlags(Qt::ItemFlag());// not selectable, not enabled
187 QFont itemFont = TSOSitem->font(0);
188 itemFont.setStrikeOut(true);
189 TSOSitem->setFont(0, itemFont);
190 TSOSitem->setFont(1, itemFont);
191 }
192 TSOSitem->setText(0, QString("Track State "+QString::number( (int)(it - trkTrackPointer()->trackStateOnSurfaces ()->begin() ) ) ) );
193
194 QString tsosText;
195 bool first=true;
196 const Trk::MeasurementBase* meas = (*it)->measurementOnTrack();
197 if ( meas ){
198 QString measName(TrkObjToString::name(*meas));
199 tsosText+=measName;
200
201 QTreeWidgetItem* measItem = new QTreeWidgetItem(TSOSitem);
202 measItem->setExpanded(true); // want it opened so subparams seen easily
203 measItem->setFlags(Qt::ItemIsEnabled);
204 measItem->setText(0, measName);
205 // measItem->setText(1, TrkObjToString::shortInfo(*meas) );
206
207 QStringList list = TrkObjToString::fullInfo( *((*it)->measurementOnTrack ()) );
208 for (int i = 0; i < (list.size()-1); ){
209 QTreeWidgetItem* subparamItem = new QTreeWidgetItem(measItem);
210 subparamItem->setText(0, list.at(i++) );
211 subparamItem->setText(1, list.at(i++) );
212 subparamItem->setFlags(Qt::ItemIsEnabled);
213 }
214
215 first=false;
216 }
217 if ( (*it)->trackParameters () ) {
218 if (!first) tsosText.append(" + ");
219 tsosText.append("Parameters");
220
221 QTreeWidgetItem* paramItem = new QTreeWidgetItem(TSOSitem);
222 paramItem->setExpanded(true); // want it opened so subparams seen easily
223 paramItem->setFlags(Qt::ItemIsEnabled);
224 paramItem->setText(0, TrkObjToString::name( *((*it)->trackParameters ()) ) );
225 // paramItem->setText(1, TrkObjToString::shortInfo( *((*it)->trackParameters ()) ) );
226
227 QStringList list = TrkObjToString::fullInfo( *((*it)->trackParameters ()) );
228 for (int i = 0; i < (list.size()-1); ){
229 QTreeWidgetItem* subparamItem = new QTreeWidgetItem(paramItem);
230 subparamItem->setText(0, list.at(i++) );
231 subparamItem->setText(1, list.at(i++) );
232 subparamItem->setFlags(Qt::ItemIsEnabled);
233 }
234
235 first=false;
236 }
237 if ( (*it)->materialEffectsOnTrack () ){
238 if (!first) tsosText.append(" + ");
239 tsosText.append("MaterialEffectsOnTrack");
240 QTreeWidgetItem* meItem = new QTreeWidgetItem(TSOSitem);
241 meItem->setExpanded(true); // want it opened so subparams seen easily
242 meItem->setFlags(Qt::ItemIsEnabled);
243
244 meItem->setText(0, TrkObjToString::name( *((*it)->materialEffectsOnTrack ()) ) );
245 meItem->setText(1, TrkObjToString::shortInfo( *((*it)->materialEffectsOnTrack ()) ) );
246
247 first=false;
248 }
249 if ( (*it)->fitQualityOnSurface () ){
250 if (!first) tsosText.append(" + ");
251 tsosText.append("FitQuality");
252 QTreeWidgetItem* fqItem = new QTreeWidgetItem(TSOSitem);
253 fqItem->setExpanded(true); // want it opened so subparams seen easily
254 fqItem->setFlags(Qt::ItemIsEnabled);
255 fqItem->setText(0, QString("FitQuality") );
256 fqItem->setText(1, TrkObjToString::shortInfo( (*it)->fitQualityOnSurface () ) );
257
258 first=false;
259 }
260 // FIXME - add information about chamber for Muon systems?
261
262 if ( (*it)->type(Trk::TrackStateOnSurface::Outlier) ){
263 if (!first) tsosText.append(" + ");
264 tsosText.append("Outlier");
265 }
266
267 if ( (*it)->type(Trk::TrackStateOnSurface::InertMaterial) ){
268 if (!first) tsosText.append(" + ");
269 tsosText.append("InertMaterial");
270 }
271
272 if ( (*it)->type(Trk::TrackStateOnSurface::BremPoint) ){
273 if (!first) tsosText.append(" + ");
274 tsosText.append("BremPoint");
275 }
276
277 if ( (*it)->type(Trk::TrackStateOnSurface::Perigee) ){
278 if (!first) tsosText.append(" + ");
279 tsosText.append("Perigee");
280 }
281
282 if ( (*it)->type(Trk::TrackStateOnSurface::Hole) ){
283 if (!first) tsosText.append(" + ");
284 tsosText.append("Hole");
285 }
286 TSOSitem->setText(1, tsosText );
287 }
288 // listOfItems << browserTreeItem();
289}
290
292{
293 if (trkTrackPointer() && (index<trkTrackPointer()->trackStateOnSurfaces()->size() )){
295 // now find matching AscObj_TSOS
296 QList<AssociatedObjectHandleBase*> list = getAllAscObjHandles();
297 for (int i = 0; i < list.size(); ++i) {
298 // VP1Msg::messageVerbose("TrackSystemController::objectBrowserClicked: checking ASC "+QString::number(i));
299
300 AscObj_TSOS* asc = dynamic_cast<AscObj_TSOS*>(list.at(i));
301 if (asc) {
302 if (asc && asc->trackStateOnSurface()==tsos) {
303 VP1Msg::messageVerbose("TrackSystemController::objectBrowserClicked: this ASC matches "+QString::number(i));
304 //asc->zoomView();
305 return asc->shapeDetailed();
306 }
307 }
308 }
309 }
310 return nullptr;
311}
312
314{
315 // get the track's momentum
316 Amg::Vector3D mom = momentum();
317 mom /= CLHEP::GeV;
318
319 // format info string
320 QString l;
321 l += "|Pt|="+VP1Msg::str(mom.perp())+" [GeV], ";
322 l += "|P|="+VP1Msg::str(mom.mag())+" [GeV], ";
323 l += "Pix["+QString::number(getNPixelHits())+"], SCT["+QString::number(getNSCTHits())+"], TRT["+QString::number(getNTRTHits())
324 +"], MDT["+QString::number(getNMDTHits())+"], RPC["+QString::number(getNRPCHits())+"], TGC["+QString::number(getNTGCHits())+"], CSC["+QString::number(getNCSCHits())+"], MM["+QString::number(getNMMHits())+"], sTGC["+QString::number(getNsTGCHits());
325 return l;
326}
327
328
330
331 if ( !browserTreeItem()) {
332 VP1Msg::messageVerbose("updateObjectBrowser: No m_objBrowseTree!");
333 return;
334 }
335
336 if (!visible()) {
337 browserTreeItem()->setFlags(Qt::ItemFlag()); // not selectable, not enabled
338 } else {
339 browserTreeItem()->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); // selectable, enabled
340 }
341 QFont font= browserTreeItem()->font(0);
342 font.setStrikeOut(!visible());
343 browserTreeItem()->setFont(0, font );
344 browserTreeItem()->setFont(1, font );
345
346
347 // FIXME! Only do if necessary i.e. if something affecting this TSOS has changed.
348
349 QList<AssociatedObjectHandleBase*> list = getAllAscObjHandles();
350
351 if (list.empty()) {
352 VP1Msg::message("No ASC objects associated with this track - no track components visible yet?");
353 return;
354 }
355
358 unsigned int numOfTSOS=0;
359 for (;it!=itE;++it,++numOfTSOS){
360 AscObj_TSOS* asc = dynamic_cast<AscObj_TSOS*>(list.at(numOfTSOS));
361 if (!(asc && asc->trackStateOnSurface()==*it && !list.empty()) ) {
362 // Fallback.
363 VP1Msg::message("TSOS#"+QString::number(numOfTSOS)+" does not seem to match AscObj_TSOS in list, which has size="+QString::number(list.size())+" Will try fallback.");
364 for (int i = 0; i < list.size(); ++i) {
365 AscObj_TSOS* asc = dynamic_cast<AscObj_TSOS*>(list.at(i));
366 if (asc && asc->trackStateOnSurface()==*it) {
367 VP1Msg::message("-> this ASC matches "+QString::number(i));
368 }
369 }
370 }
371 if (!asc) {
372 VP1Msg::message("Could not find matching Asc in list of size "+QString::number(list.size()));
373 continue;
374 }
375
376 if (!asc->browserTreeItem()){
377 // not set yet - so need to do this now. Can we just use the index?
378 asc->setBrowserTreeItem(browserTreeItem()->child(numOfTSOS));
379 }
380
381 if (!asc->browserTreeItem()){
382 VP1Msg::message("Could not find matching browserTreeItem");
383 continue;
384 }
385
386 if (!asc->visible()) {
387 asc->browserTreeItem()->setFlags(Qt::ItemFlag()); // not selectable, not enabled
388 } else {
389 asc->browserTreeItem()->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); // selectable, enabled
390 }
391 QFont itemFont = asc->browserTreeItem()->font(0);
392 itemFont.setStrikeOut(!asc->visible());
393 asc->browserTreeItem()->setFont(0, itemFont);
394 asc->browserTreeItem()->setFont(1, itemFont);
395 }
396}
397
399 return m_trk ? m_trk->fitQuality ():nullptr;
400}
401
402bool TrackHandle_TrkTrack::containsDetElement(const QString &id) const
403{
404 VP1Msg::messageVerbose("TrackHandle_TrkTrack::containsDetElement looking for " + id);
405 Identifier::value_type tmpInt = id.toLong(nullptr,10);//base 10
406 Identifier::value_type tmpInt2 = id.toLong(nullptr,16);//base 16...why?
407
408 VP1Msg::messageVerbose("TrackHandle_TrkTrack::looping over TSOS ");
409
412 for (; it != itE; ++it)
413 {
414 // Still debugging, so leaving this in for now...
415 // std::cout<<(*it)->surface().associatedDetectorElementIdentifier()<<std::endl;
416 if ((*it)->surface().associatedDetectorElementIdentifier()==tmpInt) {
417 VP1Msg::messageVerbose("TrackHandle_TrkTrack::containsDetElement FOUND " + id + "!");
418 return true;
419 }
420 if ((*it)->surface().associatedDetectorElementIdentifier()==tmpInt2) {
421 VP1Msg::messageVerbose("TrackHandle_TrkTrack::containsDetElement FOUND 2 " + id + "!");
422 return true;
423 }
424 }
425 return false;
426}
virtual QTreeWidgetItem * browserTreeItem() const
Definition AscObj_TSOS.h:73
virtual void setBrowserTreeItem(QTreeWidgetItem *obt)
Definition AscObj_TSOS.h:74
const Trk::TrackStateOnSurface * trackStateOnSurface() const
Definition AscObj_TSOS.h:65
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Base class for the XxxReadoutElement, with Xxx = Mdt, Rpc, Tgc, Csc.
void registerTouchedMuonChamber(const GeoPVConstLink &) const
If not earlier, touched muon chambers must me registered at latest when this method is invoked.
virtual void fillObjectBrowser(QList< QTreeWidgetItem * > &list)
Called in child classes.
virtual void visibleStateChanged()
override if need to take action in this case.
QTreeWidgetItem * browserTreeItem() const
friend class TrackCollHandleBase
TrackHandleBase(TrackCollHandleBase *)
QStringList baseInfo() const
virtual const MuonGM::MuonReadoutElement * getMuonReadoutElement(const Trk::RIO_OnTrack &mb) const
virtual Amg::Vector3D momentum() const
bool visible() const
TrackCollHandleBase * collHandle() const
TrackSysCommonData * common() const
const QList< AssociatedObjectHandleBase * > & getAllAscObjHandles() const
override if need to take action in this case.
virtual unsigned getNMDTHits() const
const Trk::Track * m_trk
virtual unsigned getNCSCHits() const
virtual Amg::Vector3D momentum() const
virtual unsigned getNsTGCHits() const
virtual const Trk::FitQuality * getFitQuality() const
void visibleStateChanged()
override if need to take action in this case.
SoNode * zoomToTSOS(unsigned int index)
Depending on controller configuration attempt to zoom to the corresponding TSOS & returned detailed n...
const Trk::Track * trkTrackPointer() const
TrackHandle_TrkTrack(TrackCollHandleBase *, const Trk::Track *)
int m_hitInfoStatus
-1: uninitialized, 0: not present, 1: present.
virtual QString shortInfo() const
returns mom and hit information about track
virtual unsigned getNRPCHits() const
virtual unsigned getNTRTHits() const
virtual QStringList clicked() const
Called when user selects the node (stringlist is displayed in messagebox).
void ensureTouchedMuonChambersInitialised() const
virtual unsigned getNMMHits() const
virtual void fillObjectBrowser(QList< QTreeWidgetItem * > &list)
Called in child classes.
virtual unsigned getNSCTHits() const
void ensureTouchedMuonChambersInitialiasedFromMeas(const Trk::MeasurementBase *meas) const
virtual bool containsDetElement(const QString &) const
virtual unsigned getNPixelHits() const
virtual unsigned getNTGCHits() const
VP1TrackSanity * trackSanityHelper() const
TrackSystemController * controller() const
QTreeWidget * trackObjBrowser() const
Returns a pointer to the Track Object Browser (if it exists)
static QString name(const Trk::MeasurementBase &mb)
static QString shortInfo(const Trk::MeasurementBase &mb)
static QStringList fullInfo(const Trk::MeasurementBase &tp)
Returns list of key, value, key, value etc.
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
This class is the pure abstract base class for all fittable tracking measurements.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ BremPoint
This represents a brem point on the track, and so will contain TrackParameters and MaterialEffectsBas...
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ InertMaterial
This represents inert material, and so will contain MaterialEffectsBase.
@ Hole
A hole on the track - this is defined in the following way.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
static bool hasMuonGeometry()
static void messageVerbose(const QString &)
Definition VP1Msg.cxx:84
static bool verbose()
Definition VP1Msg.h:31
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30
static QString str(const QString &s)
Definition VP1String.h:49
static bool isSafe(const Trk::TrackStateOnSurface *)
static bool countHits(const Trk::Track *, unsigned &nPixelHits, unsigned &nSCTHits, unsigned &nTRTHits, unsigned &nhits_muon_phi, unsigned &nhits_rpc, unsigned &nhits_mdt, unsigned &nhits_tgc, unsigned &nhits_csc, unsigned &nhits_mm, unsigned &nhits_stgc)
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersBase< TrackParametersDim, Charged > TrackParameters
Definition index.py:1