ATLAS Offline Software
Loading...
Searching...
No Matches
display_track.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "display_track.h"
6
7//#include "PlotValNtuple/Display.h"
8#include "ShapeCreator.h"
9
10#include <vector>
11#include <iostream>
12#include <sstream>
13
14
15#include "TArc.h"
16#include "TLine.h"
17#include "TPolyLine.h"
18#include "TText.h"
19#include "TMath.h"
20
25
26 m_trackGraphics = new std::vector<TObject*>();
27 m_rioGraphics = new std::vector<TObject*>();
28 m_geometryGraphics = new std::vector<TObject*>();
29 m_competingRotGraphics = new std::vector<TObject*>();
30
31};
32
44
45std::vector<TObject*>* displayTracks::getTrackGraphics() {
46 return m_trackGraphics;
47}
48std::vector<TObject*>* displayTracks::getRIOGraphics() {
49 return m_rioGraphics;
50}
51std::vector<TObject*>* displayTracks::getGeometryGraphics() {
52 return m_geometryGraphics;
53}
56}
57
59 while(m_trackGraphics->size()!=0) {
60 delete m_trackGraphics->back();
61 m_trackGraphics->pop_back();
62 }
63}
65 while(m_rioGraphics->size()!=0) {
66 delete m_rioGraphics->back();
67 m_rioGraphics->pop_back();
68 }
69}
70
72 while(m_geometryGraphics->size()!=0) {
73 delete m_geometryGraphics->back();
74 m_geometryGraphics->pop_back();
75 }
76}
78 while(m_competingRotGraphics->size()!=0) {
79 delete m_competingRotGraphics->back();
80 m_competingRotGraphics->pop_back();
81 }
82}
83
90
91
94
95 //ShapeCreator::setProjection(0);
96 m_shapeCreator.setProjection(0);
97
98};
99
103
105 int color(2);
106 //if( pt[i] == 1) color = 4;
107 // length of track parameters in display (mm)
108 double tp_len = 2*10.;
109 double tp_r = 0.1;
110
111 // draw circle at track position
112 TArc* trackpp = m_shapeCreator.createArc( trkPosition, tp_r );
113 trackpp->SetLineColor( color );
114 //m_arcs.push_back(trackpp);
115 TObject* trackppObj = trackpp;
116 m_trackGraphics->push_back(trackppObj);
117
118 //m_display->addArc( trackpp );
119
120 // draw line in track direction
121 TLine* trackp = m_shapeCreator.createLine( trkPosition, trkDirection, tp_len );
122 trackp->SetLineWidth( 2 );
123 trackp->SetLineColor( color );
124 //m_display->addLine( trackp );
125 //m_lines.push_back(trackp);
126 TObject* trackpObj = trackp;
127 m_trackGraphics->push_back(trackpObj);
128
129 // draw line perp. to track direction
130 TLine* trackp_o = m_shapeCreator.createOrthogonalLine( trkPosition, trkDirection, tp_len );
131 trackp_o->SetLineColor( color );
132 //m_display->addLine( trackp_o );
133 //m_lines.push_back(trackp_o);
134 TObject* trackp_oObj = trackp_o;
135 m_trackGraphics->push_back(trackp_oObj);
136
137}
138
139void displayBarrelXY::displayTRT_MeasurementOnTrack( GlobalPosition& strawPosition, double driftRadius, GlobalDirection& trkDirection, bool isOutlier, double) {
140 displayTRT_Measurement(strawPosition, driftRadius, true, isOutlier);
141 if (!isOutlier) {
142 // display marker for left/right solution
143 GlobalDirection dir_o(trkDirection.y(), -trkDirection.x(), 0.);
144 dir_o *= (trkDirection.z()<0 ? -1 : 1);
145
146 // use an arrow as marker: fine for higher zoom, with less zoom looks strange
147 //TArrow* marker = ShapeCreator::createArrow(strawPosition, dir_o, driftRadius);
148 TPolyLine* marker = m_shapeCreator.createTriangle(strawPosition, dir_o,
149 0.45*driftRadius+(driftRadius<0?-0.3:0.3));
150 marker->SetLineColor( 311 );
151 marker->SetLineWidth( 2 );
152 //m_display->addLine( marker_o );
153 //m_lines.push_back(marker_o);
154 TObject* markerObj = marker;
155 m_trackGraphics->push_back(markerObj);
156 }
157}
158
159void displayBarrelXY::displayTRT_Measurement( GlobalPosition& strawPosition, double driftRadius,
160 bool onTrack, bool outlierOnTrack, double) {
161 // tube radius
162 double tube_radius = 2.;
163
164 std::vector<TObject*>* geometry=0;
165 bool backside = strawPosition.z() < 0.;
166 int color_hit = 4; // blue
167 int color_tube = 1; // black
168 if (onTrack && !outlierOnTrack ) {
169 color_hit = backside ? 303 : 4; // dark/full blue
170 geometry = m_trackGraphics;
171 } else if (onTrack && outlierOnTrack) {
172 color_hit = backside ? 302 : 3; // dark/full green
173 geometry = m_trackGraphics;
174 } else {
175 color_hit = backside ? 306 : 6; // dark/full magenta
176 geometry = m_rioGraphics;
177 }
178 // draw TRT tube
179 TArc* tube = m_shapeCreator.createArc( strawPosition, tube_radius );
180 tube->SetLineColor( color_tube );
181 if (!onTrack && backside) tube->SetFillColor( 310 );
182 //m_display->addArc( tube );
183 //m_arcs.push_back(tube);
184 TObject* tubeObj = tube;
185 geometry->push_back(tubeObj);
186
187 // draw little flag to distinguish z<0 / z>0 in XY view
188 double x_flag = backside ? -1.6 : 1.6;
189 GlobalPosition gp_flag(strawPosition.x()+1.6,strawPosition.y()+x_flag,strawPosition.z());
190 TArc* tubeFlag = m_shapeCreator.createArc( gp_flag,0.25 );
191 tubeFlag->SetLineColor( color_hit );
192 tubeFlag->SetFillColor( color_hit );
193 TObject* flagObj = tubeFlag;
194 geometry->push_back(flagObj);
195
196 // draw drift circle or full NODRIFTTIME tube
197 if (driftRadius != 0.0) {
198 TArc* hit = m_shapeCreator.createArc( strawPosition, driftRadius );
199 hit->SetLineColor( color_hit );
200 hit->SetLineWidth( 2 );
201 //m_display->addArc( hit );
202 //m_arcs.push_back(hit);
203 TObject* hitObj = hit;
204 geometry->push_back(hitObj);
205 } else {
206 TArc* hit = m_shapeCreator.createArc( strawPosition, 1.15 ); // tube used w/o drift time -> 4mm/sqrt(12) error
207 hit->SetLineColor( color_hit );
208 hit->SetFillColor( color_hit );
209 hit->SetLineWidth( 2 );
210 TObject* hitObj = hit;
211 geometry->push_back(hitObj);
212 }
213
214 // draw circle at straw (wire) position
215 TArc* tube_c = m_shapeCreator.createArc( strawPosition, 0.05 );
216 tube_c->SetLineColor( 1 );
217 tube_c->SetFillColor( 1 );
218 //m_display->addArc( tube_c );
219 //m_arcs.push_back(tube_c);
220 TObject* tube_cObj = tube_c;
221 geometry->push_back(tube_cObj);
222}
224
225void displayBarrelXY::displaySiliconMeasurement( GlobalPosition& measurementPosition, bool onTrack) {
226 // marker radius
227 double hit_r = 0.15;
228 std::vector<TObject*>* geometry=0;
229
230 int color = 6;
231 if (onTrack) {
232 color = 4;
233 geometry = m_trackGraphics;
234 } else {
235 color = 6;
236 geometry = m_rioGraphics;
237 }
238
239 // draw measurement position
240 TArc* hit = m_shapeCreator.createArc( measurementPosition, hit_r );
241 hit->SetLineColor( color );
242 hit->SetFillColor( color );
243 //m_display->addArc( hit );
244 //m_arcs.push_back(hit);
245 TObject* hitObj = hit;
246 geometry->push_back(hitObj);
247
248}
249
250void displayBarrelXY::displayCompetingTRT_ROT( std::vector<GlobalPosition>& strawPositions, std::vector<double> driftRadii, std::vector<double> assgnProbs, GlobalDirection& trkDirection) {
251
252 GlobalDirection dir_o(trkDirection.y(), -trkDirection.x(), 0.);
253 dir_o *= (trkDirection.z()<0 ? -1 : 1);
254 char assgnProbText[50];
255
256 // write the value of the assignment prob near the measurement
257 sprintf(assgnProbText,"%e", assgnProbs[0]);
258 TText* text = m_shapeCreator.createText(strawPositions[0]+(driftRadii[0]*2.)*dir_o.Unit(), assgnProbText);
259 //TText* text = m_shapeCreator.createText(strawPositions[0], assgnProbText);
260 // align left if direction points left and align right if direction points right
261 text->SetTextAlign((dir_o.x()*driftRadii[0])>0 ? 12 : 32);
262 TObject* textObj = text;
263 m_competingRotGraphics->push_back(textObj);
264
265 // loop over remaining competing measurements
266 for (unsigned int i = 1; i < strawPositions.size(); i++) {
267 // draw drift circle
268 //TArc* hit = m_shapeCreator.createArc( strawPosition, driftRadius );
269 //hit->SetLineColor( color );
270 //TObject* hitObj = hit;
271 //m_competingRotGraphics->push_back(hitObj);
272
273 // write the value of the assignment prob near the measurement
274 sprintf(assgnProbText,"%e", assgnProbs[i]);
275 TText* text = m_shapeCreator.createText(strawPositions[i]+(driftRadii[i]*2.)*dir_o.Unit(), assgnProbText);
276 //TText* text = m_shapeCreator.createText(strawPositions[i], assgnProbText);
277 // align left if direction points left and align right if direction points right
278 text->SetTextAlign((dir_o.x()*driftRadii[i])>0 ? 12 : 32);
279 TObject* textObj = text;
280 m_competingRotGraphics->push_back(textObj);
281
282 if (strawPositions[i] != strawPositions[i-1]) {
283 // we have another straw: draw line between straws
284 TLine* connection = m_shapeCreator.createLine(strawPositions[i-1], strawPositions[i-1]);
285 connection->SetLineColor(16); // gray
286 TObject* connectionObj = connection;
287 m_competingRotGraphics->push_back(connectionObj);
288 }
289 }
290}
291
292
296
299
300 //ShapeCreator::setProjection(0);
301 m_shapeCreator.setProjection(3);
302
303};
304
305
307 int color(2);
308 //if( pt[i] == 1) color = 4;
309 // length of track parameters in display (mm)
310 double tp_len = 2*10.;
311 double tp_r = 0.1;
312
313 // draw circle at track position
314 TArc* trackpp = m_shapeCreator.createArc( trkPosition, tp_r );
315 trackpp->SetLineColor( color );
316 //m_arcs.push_back(trackpp);
317 TObject* trackppObj = trackpp;
318 m_trackGraphics->push_back(trackppObj);
319 // if (trackpp) {
320 // std::cout << "set line color of the circle "<<trackpp<< " to "<< color << std::endl;
321 // }
322 // std::cout << "display: "<<m_display << std::endl;
323
324 //m_display->addArc( trackpp );
325
326 // draw line in track direction
327 TLine* trackp = m_shapeCreator.createLine( trkPosition, trkDirection, tp_len );
328 trackp->SetLineWidth( 2 );
329 trackp->SetLineColor( color );
330 //m_display->addLine( trackp );
331 //m_lines.push_back(trackp);
332 TObject* trackpObj = trackp;
333 m_trackGraphics->push_back(trackpObj);
334
335 // draw line perp. to track direction
336 TLine* trackp_o = m_shapeCreator.createOrthogonalLine( trkPosition, trkDirection, tp_len );
337 trackp_o->SetLineColor( color );
338 //m_display->addLine( trackp_o );
339 //m_lines.push_back(trackp_o);
340 TObject* trackp_oObj = trackp_o;
341 m_trackGraphics->push_back(trackp_oObj);
342
343// TVector3 endOfDirPointer = trkPosition + trkDirection;
344//
345// TEllipse* endOfDir = m_shapeCreator.createEllipse( endOfDirPointer, 0.05, atan(0.05 / trkPosition.Perp()) * 1000. );
346// endOfDir->SetLineColor( color );
347// endOfDir->SetFillColor( color );
348// //m_display->addArc( tube_c );
349// //m_arcs.push_back(tube_c);
350// TObject* endOfDirObj = endOfDir;
351// m_trackGraphics->push_back(endOfDirObj);
352
353}
354
355void displayEndcapPhiZ::displayTRT_MeasurementOnTrack( GlobalPosition& strawPosition, double driftRadius, GlobalDirection& trkDirection, bool isOutlier, double trackRadius) {
356 displayTRT_Measurement(strawPosition, driftRadius, true, isOutlier, trackRadius);
357/* // display marker for left/right solution
358 GlobalDirection dir_o(trkDirection.y(), -trkDirection.x(), 0.);
359 dir_o *= (trkDirection.z()<0 ? -1 : 1);
360
361 // use an arrow as marker: fine for higher zoom, with less zoom looks strange
362 //TArrow* marker = ShapeCreator::createArrow(strawPosition, dir_o, driftRadius);
363 TPolyLine* marker = ShapeCreator::createTriangle(strawPosition, dir_o, driftRadius);
364 marker->SetLineColor( 3 );
365 //marker->SetLineWidth( 2 );
366 //m_display->addLine( marker_o );
367 //m_lines.push_back(marker_o);
368 TObject* markerObj = marker;
369 m_trackGraphics->push_back(markerObj);*/
370
371}
372
373void displayEndcapPhiZ::displayTRT_Measurement( GlobalPosition& strawPosition, double driftRadius, bool onTrack,
374 bool outlierOnTrack, double trackRadius) {
375 // tube radius
376 const double tube_radius = 2.;
377 const double radiusOfStrawCenters = 823.9;
378 //const double phiScale = 180. / TMath::Pi(); // use deg
379 const double phiScale = 1000.; // use mrad
380 //const double tube_radiusInPhi = tube_radius / radiusOfStrawCenters * phiScale;
381 double Rho = radiusOfStrawCenters;
382 if (onTrack && (trackRadius > 0.)) {
383 Rho = trackRadius;
384 }
385 //std::cout << " rho=" << Rho << ", driftradius=" << driftRadius << std::endl;
386 std::vector<TObject*>* geometry=0;
387 int color_hit = 4; // blue
388 int color_tube = 1; // black
389 if (onTrack && !outlierOnTrack ) {
390 color_hit = 4; // full blue
391 geometry = m_trackGraphics;
392 } else if (onTrack && outlierOnTrack) {
393 color_hit = 3; // full green
394 geometry = m_trackGraphics;
395 } else {
396 color_hit = 6; // full magenta
397 geometry = m_rioGraphics;
398 }
399
400 // draw drift circle or full NODRIFTTIME tube
401 if (driftRadius != 0.0) {
402 TEllipse* hit = m_shapeCreator.createEllipse( strawPosition, driftRadius, std::atan(driftRadius / Rho) * phiScale );
403 hit->SetLineColor( color_hit );
404 hit->SetLineWidth( 2 );
405 //m_display->addArc( hit );
406 //m_arcs.push_back(hit);
407 TObject* hitObj = hit;
408 geometry->push_back(hitObj);
409 } else {
410 // tube used w/o drift time -> 4mm/sqrt(12) error
411 TEllipse* hit = m_shapeCreator.createEllipse( strawPosition, 1.15, std::atan(1.15 / Rho) * phiScale );
412 hit->SetLineColor( color_hit );
413 hit->SetFillColor( color_hit );
414 hit->SetLineWidth( 2 );
415 TObject* hitObj = hit;
416 geometry->push_back(hitObj);
417 }
418
419 // draw TRT tube
420 TEllipse* tube = m_shapeCreator.createEllipse( strawPosition, tube_radius, std::atan(tube_radius / Rho) * phiScale );
421 tube->SetLineColor( color_tube );
422 //m_display->addArc( tube );
423 //m_arcs.push_back(tube);
424 TObject* tubeObj = tube;
425 geometry->push_back(tubeObj);
426
427 // draw circle at straw (wire) position
428 TEllipse* tube_c = m_shapeCreator.createEllipse( strawPosition, 0.05, std::atan(0.05 / Rho) * phiScale );
429 tube_c->SetLineColor( color_tube );
430 tube_c->SetFillColor( color_tube );
431 //m_display->addArc( tube_c );
432 //m_arcs.push_back(tube_c);
433 TObject* tube_cObj = tube_c;
434 geometry->push_back(tube_cObj);
435
436 double l = sqrt(strawPosition.y()*strawPosition.y() + strawPosition.x()*strawPosition.x());
437 TVector3 maxRadiusInPhiPosition1(Rho*strawPosition.x()/l - driftRadius * strawPosition.y()/l,
438 Rho*strawPosition.y()/l + driftRadius * strawPosition.x()/l,
439 strawPosition.z());
440
441 TEllipse* maxRad1 = m_shapeCreator.createEllipse( maxRadiusInPhiPosition1, 0.05, std::atan(0.05 / Rho) * phiScale );
442 maxRad1->SetLineColor( color_hit );
443 maxRad1->SetFillColor( color_hit );
444 //m_display->addArc( tube_c );
445 //m_arcs.push_back(tube_c);
446 TObject* maxRad1Obj = maxRad1;
447 geometry->push_back(maxRad1Obj);
448 TVector3 maxRadiusInPhiPosition2(Rho*strawPosition.x()/l + driftRadius * strawPosition.y()/l,
449 Rho*strawPosition.y()/l - driftRadius * strawPosition.x()/l,
450 strawPosition.z());
451
452 TEllipse* maxRad2 = m_shapeCreator.createEllipse( maxRadiusInPhiPosition2, 0.05, std::atan(0.05 / Rho) * phiScale );
453 maxRad2->SetLineColor( color_hit );
454 maxRad2->SetFillColor( color_hit );
455 //m_display->addArc( tube_c );
456 //m_arcs.push_back(tube_c);
457 TObject* maxRad2Obj = maxRad2;
458 geometry->push_back(maxRad2Obj);
459}
461
462void displayEndcapPhiZ::displaySiliconMeasurement( GlobalPosition& measurementPosition, bool onTrack) {
463 // marker radius
464 double hit_r = 0.1;
465 std::vector<TObject*>* geometry=0;
466
467 int color = 6;
468 if (onTrack) {
469 color = 4;
470 geometry = m_trackGraphics;
471 } else {
472 color = 6;
473 geometry = m_rioGraphics;
474 }
475
476 // draw measurement position
477 TArc* hit = m_shapeCreator.createArc( measurementPosition, hit_r );
478 hit->SetLineColor( color );
479 hit->SetFillColor( color );
480 //m_display->addArc( hit );
481 //m_arcs.push_back(hit);
482 TObject* hitObj = hit;
483 geometry->push_back(hitObj);
484
485}
486
487void displayEndcapPhiZ::displayCompetingTRT_ROT( std::vector<GlobalPosition>& strawPositions, std::vector<double> driftRadii, std::vector<double> assgnProbs, GlobalDirection& trkDirection) {
488
489/* GlobalDirection dir_o(trkDirection.y(), -trkDirection.x(), 0.);
490 dir_o *= (trkDirection.z()<0 ? -1 : 1);
491 char assgnProbText[50];
492
493 // write the value of the assignment prob near the measurement
494 sprintf(assgnProbText,"%e", assgnProbs[0]);
495 TText* text = ShapeCreator::createText(strawPositions[0]+(driftRadii[0]*2.)*dir_o.Unit(), assgnProbText);
496 //TText* text = ShapeCreator::createText(strawPositions[0], assgnProbText);
497 // align left if direction points left and align right if direction points right
498 text->SetTextAlign((dir_o.x()*driftRadii[0])>0 ? 12 : 32);
499 TObject* textObj = text;
500 m_competingRotGraphics->push_back(textObj);
501
502 // loop over remaining competing measurements
503 for (unsigned int i = 1; i < strawPositions.size(); i++) {
504 // draw drift circle
505 //TArc* hit = ShapeCreator::createArc( strawPosition, driftRadius );
506 //hit->SetLineColor( color );
507 //TObject* hitObj = hit;
508 //m_competingRotGraphics->push_back(hitObj);
509
510 // write the value of the assignment prob near the measurement
511 sprintf(assgnProbText,"%e", assgnProbs[i]);
512 TText* text = ShapeCreator::createText(strawPositions[i]+(driftRadii[i]*2.)*dir_o.Unit(), assgnProbText);
513 //TText* text = ShapeCreator::createText(strawPositions[i], assgnProbText);
514 // align left if direction points left and align right if direction points right
515 text->SetTextAlign((dir_o.x()*driftRadii[i])>0 ? 12 : 32);
516 TObject* textObj = text;
517 m_competingRotGraphics->push_back(textObj);
518
519 if (strawPositions[i] != strawPositions[i-1]) {
520 // we have another straw: draw line between straws
521 TLine* connection = ShapeCreator::createLine(strawPositions[i-1], strawPositions[i-1]);
522 connection->SetLineColor(16); // gray
523 TObject* connectionObj = connection;
524 m_competingRotGraphics->push_back(connectionObj);
525 }
526 }*/
527}
528
529
virtual void displayTRT_Measurement(GlobalPosition &strawPosition, double driftRadius, bool onTrack, bool outlierOnTrack, double=0.)
create the graphic objects for a single TRT measurement
virtual void displayTRT_Tubes()
virtual void displaySiliconMeasurement(GlobalPosition &measurementPosition, bool onTrack)
create the graphic objects for a single Silicon measurement
virtual void displayCompetingTRT_ROT(std::vector< GlobalPosition > &strawPositions, std::vector< double > driftRadii, std::vector< double > assgnProbs, GlobalDirection &trkDirection)
create the graphic objects for a single CompetingTRT_DriftCirclesOnTrack
virtual void displayTRT_MeasurementOnTrack(GlobalPosition &strawPosition, double driftRadius, GlobalDirection &trkDirection, bool isOutlier, double=0.)
create the graphic objects for a single TRT measurement on track
virtual void displayTrackState(GlobalPosition &trkPosition, GlobalDirection &trkDirection)
create the graphic objects for a single track state
virtual void displayTRT_Tubes()
virtual void displayTrackState(GlobalPosition &trkPosition, GlobalDirection &trkDirection)
create the graphic objects for a single track state
virtual void displayCompetingTRT_ROT(std::vector< GlobalPosition > &strawPositions, std::vector< double > driftRadii, std::vector< double > assgnProbs, GlobalDirection &trkDirection)
create the graphic objects for a single CompetingTRT_DriftCirclesOnTrack
displayEndcapPhiZ()
displayEndcapPhiZ
virtual void displayTRT_Measurement(GlobalPosition &strawPosition, double driftRadius, bool onTrack, bool outlierOnTrack, double trackRadius=0.)
create the graphic objects for a single TRT measurement
virtual void displayTRT_MeasurementOnTrack(GlobalPosition &strawPosition, double driftRadius, GlobalDirection &trkDirection, bool isOutlier, double trackRadius=0.)
create the graphic objects for a single TRT measurement on track
virtual void displaySiliconMeasurement(GlobalPosition &measurementPosition, bool onTrack)
create the graphic objects for a single Silicon measurement
virtual void clearRIOGraphics()
virtual void clear()
clear all graphics vectors
virtual void clearCompetingROTsGraphics()
virtual std::vector< TObject * > * getCompetingROTsGraphics()
std::vector< TObject * > * m_competingRotGraphics
std::vector< TObject * > * m_geometryGraphics
virtual ~displayTracks()
ShapeCreator m_shapeCreator
virtual void clearGeometryGraphics()
std::vector< TObject * > * m_rioGraphics
displayTracks()
base class: displayTracks
virtual void clearTrackGraphics()
virtual std::vector< TObject * > * getGeometryGraphics()
virtual std::vector< TObject * > * getRIOGraphics()
virtual std::vector< TObject * > * getTrackGraphics()
std::vector< TObject * > * m_trackGraphics
TVector3 GlobalPosition
TVector3 GlobalDirection