11 TPad *padRZ, *padXY, *padStat;
13 float LegendX, LegendY;
14 float lineScale = 1.5;
16 enum ProjectionType { kXY, kRZ, kRZSigned, kXZ, kYZ };
18 float xx(
float x,
float y,
float z, ProjectionType proj = kRZ ){
20 if ( proj == kRZ || proj == kRZSigned){
22 }
else if ( proj == kXY ){
24 }
else if ( proj == kXZ ){
26 }
else if ( proj == kYZ ){
33 float yy(
float x,
float y,
float z, ProjectionType proj = kRZ ){
36 float r = sqrt( pow(x, 2) + pow(y, 2) );
38 }
else if ( proj == kXY ){
40 }
else if ( proj == kRZSigned ){
41 float r = sqrt( pow(x, 2) + pow(y, 2) );
42 if ( y == 0 )
return r;
45 }
else if ( proj == kXZ ){
47 }
else if ( proj == kYZ ){
54 void viz_points(
const char* name,
const char* cmd,
int color,
int eventIndex, ProjectionType projType,
bool Legend =
false ){
56 fwd->Draw( cmd,
"",
"goff", 1, eventIndex );
57 int N = fwd->GetSelectedRows();
58 printf(
"%s : has %d results \n", cmd, N );
59 printf(
"Projection Mode : %d \n", projType );
61 auto cmdX = fwd->GetV1();
62 auto cmdY = fwd->GetV2();
63 auto cmdZ = fwd->GetV3();
64 auto cmdE = fwd->GetV4();
65 if ( cmdE !=
nullptr ){
71 TText *t =
new TText(.5,.5,
"Hello World !");
73 t->SetTextColor(kBlack);
80 float zSizes[] = {2.5, 2.5, 2.0, 1.5, 1.5, 1.5, 1.5, 1.5, 2.5, 2.0, 1.5};
81 for (
int i = 0; i < 50; i++ )
82 zColors[i] = TColor::GetColorPalette(i*zColorStep % 255 );
87 for (
int i = 0; i < N; i++ ){
89 vizX = xx( cmdX[i], cmdY[i], cmdZ[i], projType );
90 vizY = yy( cmdX[i], cmdY[i], cmdZ[i], projType );
91 printf(
"\tpoint at (%f, %f, %f) -> (%f, %f)\n", cmdX[i], cmdY[i], cmdZ[i], vizX, vizY );
94 if ( fabs( cmdZ[i] - 151.75) < 2.5 ) zIndex = 1;
95 if ( fabs( cmdZ[i] - 165.25) < 2.5 ) zIndex = 2;
96 if ( fabs( cmdZ[i] - 178.75) < 2.5 ) zIndex = 3;
100 if ( fabs( cmdZ[i] - 281) < 2.5 ) zIndex = 4;
101 if ( fabs( cmdZ[i] - 304) < 2.5 ) zIndex = 5;
102 if ( fabs( cmdZ[i] - 325) < 2.5 ) zIndex = 6;
103 if ( fabs( cmdZ[i] - 348) < 2.5 ) zIndex = 7;
105 if ( fabs( cmdZ[i] - 375) < 2.5 ) zIndex = 8;
110 TMarker *mk =
new TMarker( vizX, vizY, 20 );
112 mk->SetMarkerSize( 2.5 );
113 if (zIndex >= 1 && zIndex < 50){
114 slc = zColors[zIndex];
116 mk->SetMarkerSize( zSizes[zIndex] );
124 if ( zIndex != 8 && (cmdE !=
nullptr && projType == kRZSigned) ){
127 mk->SetMarkerSize(0);
128 alpha = (cmdE[i] / 10.0);
129 if (alpha>=1) alpha = 1;
130 TBox *box =
new TBox( vizX-0.05*cmdE[i], vizY-0.5, vizX, vizY+0.5 );
131 box->SetFillColor(210);
132 if ( name ==
"WCal Clusters" || name ==
"HCal CLusters" ){
133 box->SetFillColor(880);
134 mk->SetMarkerSize(1);
138 if ( name ==
"FTT Clusters" && projType == kXY ){
139 mk->SetMarkerSize(0);
141 XCluster.SetLineWidth(1);
142 XCluster.SetLineColor(9);
144 YCluster.SetLineWidth(1);
145 YCluster.SetLineColor(46);
153 }
else if(vizX >= 0){
160 }
else if (vizY >= 0){
165 XCluster.DrawLine(vizX, y0, vizX, y1);
166 YCluster.DrawLine(x0, vizY, x1, vizY);
170 if ( cmdE !=
nullptr && (zIndex == 8 || projType != kRZSigned) ){
171 mk->SetMarkerStyle(21);
172 mk->SetMarkerSize( 0.005 * cmdE[i]);
175 printf(
"\tzIndex = %d -> color = %d \n", zIndex, slc );
177 mk->SetMarkerColorAlpha( slc, alpha );
179 mk->SetMarkerColorAlpha( slc, alpha );
205 for (
int i = 1; i < 4; i++ ){
206 TMarker *mk1 =
new TMarker( LegendX, LegendY, 20 );
207 mk1->SetMarkerSize( 2.5 );
208 mk1->SetMarkerColorAlpha( zColors[i], 0.5 );
210 t->DrawText( LegendX + 2, LegendY - 0.5, TString::Format(
"%s: %d", name, i ) );
214 }
else if (name ==
"FTT"){
215 for (
int i = 1; i < 5; i++ ){
216 TMarker *mk1 =
new TMarker( LegendX, LegendY, 20 );
217 mk1->SetMarkerSize( 2.5 );
218 mk1->SetMarkerColorAlpha( zColors[i+3], 0.5 );
220 t->DrawText( LegendX + 2, LegendY - 0.5, TString::Format(
"%s: %d", name, i ) );
224 }
else if (name ==
"FCS"){
225 for (
int i = 1; i < 3; i++ ){
226 TMarker *mk1 =
new TMarker( LegendX, LegendY, 20 );
227 mk1->SetMarkerSize( 2.5 );
228 mk1->SetMarkerColorAlpha( zColors[i], 0.5 );
230 t->DrawText( LegendX + 2, LegendY - 0.5, TString::Format(
"%s: %d", name, i ) );
237 TMarker *mk1 =
new TMarker( LegendX, LegendY, 20 );
238 mk1->SetMarkerSize( 2.5 );
239 mk1->SetMarkerColor( color );
241 t->DrawText( LegendX + 2, LegendY - 0.5, TString::Format(
"%s:", name ) );
248 void viz_seed(
const char* name,
const char* cmd,
int eventIndex, ProjectionType projType = kRZSigned){
250 fwd->Draw(
"reco.mChi2",
"",
"goff", 1, eventIndex );
251 int nTrks = fwd->GetSelectedRows();
254 line.SetLineWidth(2);
255 line.SetLineColor(1);
257 for (
int i = 0; i < nTrks; i++){
259 fwd->Draw( TString::Format(
"reco[%d].mProjections.mXYZ.fX:reco[%d].mProjections.mXYZ.fY:reco[%d].mProjections.mXYZ.fZ", i, i, i),
"",
"goff", 1, eventIndex );
260 auto nHits = fwd->GetSelectedRows();
261 auto projX = fwd->GetV1();
262 auto projY = fwd->GetV2();
263 auto projZ = fwd->GetV3();
275 fwd->Draw( cmd, TString::Format(
"seeds.trackId == %d", i),
"goff", 1, eventIndex );
277 int numSeeds = fwd->GetSelectedRows();
278 auto newX = fwd->GetV1();
279 auto newY = fwd->GetV2();
280 auto newZ = fwd->GetV3();
282 for (
int j = 0; j < numSeeds - 1; j++){
284 float x0 = xx( newX[j], newY[j], newZ[j], projType );
285 float y0 = yy( newX[j], newY[j], newZ[j], projType );
286 float x1 = xx( newX[j+1], newY[j+1], newZ[j+1], projType );
287 float y1 = yy( newX[j+1], newY[j+1], newZ[j+1], projType );
294 void viz_tracks(
int nTrk,
int eventIndex, ProjectionType projType,
bool seeds =
false,
int iTrack = -1,
bool filter =
false){
296 ll.SetLineWidth(lineScale);
300 int NumTracksFound = 0;
301 for (
int i = 0; i < nTrk; i++ ){
302 if ( iTrack >= 0 && i != iTrack )
continue;
305 fwd->Draw( TString::Format(
"reco[%d].mProjections.mXYZ.fX:reco[%d].mProjections.mXYZ.fY:reco[%d].mProjections.mXYZ.fZ:reco[%d].mChi2:reco[%d].mDidFitConverge:reco[%d].mCharge", i, i, i, i, i, i),
"",
"goff", 1, eventIndex );
307 auto trkX = fwd->GetV1();
308 auto trkY = fwd->GetV2();
309 auto trkZ = fwd->GetV3();
310 auto trkChi2 = fwd->GetV4();
311 auto trkConv = fwd->GetVal(4);
312 auto trkQ = fwd->GetVal(5);
315 text.SetTextFont(43);
316 text.SetTextSize(36);
318 text.DrawTextNDC( 0.05, 0.7, TString::Format(
"chi2=%f", trkChi2[0] ) );
319 text.DrawTextNDC( 0.05, 0.65, TString::Format(
"converge=%d", trkConv[0] ) );
328 void viz_proj(
int eventIndex, ProjectionType projType = kRZSigned,
bool markers =
false ){
331 fwd->Draw(
"reco.mChi2",
"",
"goff", 1, eventIndex);
332 int nTrks = fwd->GetSelectedRows();
336 trkproj.SetLineWidth(1.5);
337 trkproj.SetLineColor(24);
340 for (
int i = 0; i < nTrks; i++ ){
343 fwd->Draw( TString::Format(
"reco[%d].projs.mXYZ.fX:reco[%d].projs.mXYZ.fY:reco[%d].projs.mXYZ.fZ", i, i, i),
"",
"goff", 1, eventIndex );
344 auto nHits = fwd->GetSelectedRows();
345 auto projX = fwd->GetV1();
346 auto projY = fwd->GetV2();
347 auto projZ = fwd->GetV3();
351 for (
int j = 0; j < nHits - 1; j++ ){
354 float x0 = xx( projX[j], projY[j], projZ[j], projType );
355 float y0 = yy( projX[j], projY[j], projZ[j], projType );
356 float x1 = xx( projX[j+1], projY[j+1], projZ[j+1], projType );
357 float y1 = yy( projX[j+1], projY[j+1], projZ[j+1], projType );
363 trkproj.DrawLine(x0, y0, x1, y1);
368 for (
int j = 0; j < nHits; j++ ){
370 float x = xx( projX[j], projY[j], projZ[j], projType );
371 float y = yy( projX[j], projY[j], projZ[j], projType );
373 TMarker *mk =
new TMarker( x, y, 20);
374 mk->SetMarkerStyle(23);
375 mk->SetMarkerColor(2);
376 mk->SetMarkerSize(1.5);
383 if (seeds ==
false)
return;
385 for (
int i = 0; i < nTrk; i++ ){
386 if ( iTrack >= 0 && i != iTrack )
continue;
388 fwd->Draw( TString::Format(
"reco[%d].seeds.pos.fX:reco[%d].seeds.pos.fY:reco[%d].seeds.pos.fZ", i, i, i), TString::Format(
"reco[%d].mDidFitConverge!=0", i),
"goff", 1, eventIndex );
389 auto seedX = fwd->GetV1();
390 auto seedY = fwd->GetV2();
391 auto seedZ = fwd->GetV3();
395 ll.SetLineColor(kGreen);
397 for (
int j = 0; j < fwd->GetSelectedRows()-1; j++ ){
399 float seedX1 = xx( seedX[j], seedY[j], seedZ[j], projType );
400 float seedY1 = yy( seedX[j], seedY[j], seedZ[j], projType );
404 float seedX2 = xx( seedX[j+1], seedY[j+1], seedZ[j+1], projType );
405 float seedY2 = yy( seedX[j+1], seedY[j+1], seedZ[j+1], projType );
408 ll.DrawLine( seedX1, seedY1, seedX2, seedY2 );
410 TMarker *mk1 =
new TMarker( seedX1, seedY1, 20 );
411 mk1->SetMarkerSize( 2.5 );
412 mk1->SetMarkerColor(kBlue);
415 TMarker *mk2 =
new TMarker( seedX2, seedY2, 20 );
416 mk2->SetMarkerSize( 2.5 );
417 mk2->SetMarkerColor(kBlue);
427 float statTextY = 0.97;
428 void n() { statTextY -= 0.05; }
429 void viz_stats(
int eventIndex ){
432 text.SetTextFont(43);
433 text.SetTextSize(36);
445 fwd->Draw(
"reco.mChi2",
"",
"goff", 1, eventIndex );
446 int numTracks = fwd->GetSelectedRows();
447 fwd->Draw(
"fst.pos.fX:fst.pos.fY:fst.pos.fZ",
"",
"goff", 1, eventIndex );
448 int numFst = fwd->GetSelectedRows();
449 fwd->Draw(
"ftt.pos.fX:ftt.pos.fY:ftt.pos.fZ",
"",
"goff", 1, eventIndex );
450 int numFtt = fwd->GetSelectedRows();
453 fwd->Draw(
"wcalHits.starXYZ.fX:wcalHits.starXYZ.fY:wcalHits.starXYZ.fZ",
"",
"goff", 1, eventIndex );
454 int numWcalHits = fwd->GetSelectedRows();
455 fwd->Draw(
"hcalHits.starXYZ.fX:hcalHits.starXYZ.fY:hcalHits.starXYZ.fZ",
"",
"goff", 1, eventIndex );
456 int numHcalHits = fwd->GetSelectedRows();
457 fwd->Draw(
"wcalClusters.pos.fX:wcalClusters.pos.fY:wcalClusters.pos.fZ",
"",
"goff", 1, eventIndex );
458 int numWcal = fwd->GetSelectedRows();
459 fwd->Draw(
"hcalClusters.pos.fX:hcalClusters.pos.fY:hcalClusters.pos.fZ",
"",
"goff", 1, eventIndex );
460 int numHcal = fwd->GetSelectedRows();
462 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"Event : %d", eventIndex) ); n();
463 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"Tracks : %d", numTracks) ); n();
464 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"FST Hits : %d", numFst) ); n();
465 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"FTT Hits : %d", numFtt) ); n();
469 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"WCal Clusters : %d", numWcal) ); n();
470 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"HCal Clusters : %d", numHcal) ); n();
472 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"",
"goff", 1, eventIndex );
473 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"#Tracks : %d", fwd->GetSelectedRows()) ); n();
475 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"reco.mChi2<100",
"goff", 1, eventIndex );
476 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"#Tracks (good) : %d", fwd->GetSelectedRows()) ); n();
478 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"reco.mChi2<100 && reco.mCharge==1",
"goff", 1, eventIndex );
479 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"#Pos Tracks (good) : %d", fwd->GetSelectedRows()) ); n();
480 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"reco.mChi2<100 && reco.mCharge==-1",
"goff", 1, eventIndex );
481 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"#Neg Tracks (good) : %d", fwd->GetSelectedRows()) ); n();
486 text.DrawTextNDC( 0.05, statTextY, TString::Format(
"#Seeds : %d", mTotalSeeds ) ); n();
490 int viz_event(
int eventIndex, ProjectionType projType = kRZSigned ){
492 if ( projType == kRZSigned || projType == kXZ || projType == kYZ ){
493 hFrame =
new TH2F(
"hFrame",
";z;R", 520, -30, 900, 260, -130, 130 );
494 hFrame->SetTitle(
"Event Visualization (RZ Signed)" );
497 }
else if ( projType == kRZ ){
498 hFrame =
new TH2F(
"hFrame",
";z;R", 500, 0, 900, 60, 0, 60 );
499 hFrame->SetTitle(
"Event Visualization (RZ Signed)" );
502 }
else if ( projType == kXY ){
503 hFrame =
new TH2F(
"hFrame",
";x;y", 5, -50, 50, 5, -50, 50 );
504 hFrame->SetTitle(
"Event Visualization (XY)" );
509 printf(
"Visualizing Event %d \n", eventIndex );
511 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"",
"goff", 1, eventIndex );
512 int nTrk = fwd->GetSelectedRows();
513 printf(
"Event has %lld Tracks \n", nTrk );
516 hFrame->Draw(
"colz");
518 viz_points(
"FTT",
"fttPoints.mXYZ.fX:fttPoints.mXYZ.fY:fttPoints.mXYZ.fZ", kRed, eventIndex, projType );
520 viz_points(
"FST",
"fstHits.mXYZ.fX:fstHits.mXYZ.fY:fstHits.mXYZ.fZ", kRed, eventIndex, projType );
521 viz_points(
"FCS",
"wcalClusters.mXYZ.fX:wcalClusters.mXYZ.Y():wcalClusters.mXYZ.Z():wcalClusters.mClu.mEnergy", kGray, eventIndex, projType );
523 TLine *fst1 =
new TLine(151.75, -28.3, 151.75, 28.3);
524 fst1->SetLineWidth(2);
525 fst1->SetLineColor(12);
527 TLine *fst2 =
new TLine(165.25, -28.3, 165.25, 28.3);
528 fst2->SetLineWidth(2);
529 fst2->SetLineColor(12);
531 TLine *fst3 =
new TLine(178.75, -28.3, 178.75, 28.3);
532 fst3->SetLineWidth(2);
533 fst3->SetLineColor(12);
537 viz_tracks(nTrk, eventIndex, projType,
false);
540 TLine *epd =
new TLine(375, -130, 375, 130);
541 epd->SetLineWidth(2);
542 epd->SetLineColor(12);
546 TBox *wcal =
new TBox( 720, -120, 735, 120 );
547 wcal->SetFillColorAlpha(4, 0.2);
549 TBox *hcal =
new TBox( 800, -120, 815, 120 );
550 hcal->SetFillColorAlpha(2, 0.2);
558 viz_points(
"FST",
"fst.mXYZ.fX:fst.mXYZ.fY:fst.mXYZ.fZ", kGray, eventIndex, projType,
true );
559 viz_points(
"FTT",
"ftt.mXYZ.fX:ftt.mXYZ.fY:ftt.mXYZ.fZ", kRed, eventIndex, projType );
574 void viz(
int maxEvents = 10, TString fn =
"fwdtree.root",
int view = kXY) {
576 void viz(
int mode = 0,
int maxEvents = 10, TString fn =
"fwdtree.root") {
578 fData =
new TFile( fn );
579 fwd = (TTree*)fData->Get(
"fwd" );
581 gStyle->SetOptStat(0);
583 float canWidth = 19 * 100;
584 float canHeight = 16 * 100;
585 gCan =
new TCanvas(
"g",
"", canWidth, canHeight );
586 gCan->SetMargin( 0, 0, 0, 0);
590 padRZ =
new TPad(
"padRZ",
"", 0.0, 0.5, 0.95, 0.99 );
591 padRZ->SetMargin( .05,.01,.05,.01 );
596 padXY =
new TPad(
"padXY",
"", 0.0, 0.0, 0.5, 0.5 );
597 padXY->SetMargin( .1,.02,.05,.01 );
602 padStat =
new TPad(
"padStat",
"", 0.5, 0.0, 1.0, 0.5 );
603 padStat->SetMargin( .1,.02,.05,.01 );
604 padStat->Draw(
"same");
609 int nEvents = fwd->GetEntries();
610 if (nEvents > maxEvents) nEvents = maxEvents;
612 for (
int iEvent = 0; iEvent < nEvents; iEvent ++ ){
614 printf(
"Event: %d\n", iEvent );
620 int nTrk = viz_event( iEvent, kRZSigned );
624 viz_event( iEvent, kXY );
634 gCan->Print( TString::Format(
"out_event%d.pdf", iEvent ) );
645 if ( mode != 1 )
return;
647 for (
int inEvent = 0; inEvent < nEvents; inEvent++ ){
648 fwd->Draw(
"reco.mPrimaryMomentum.fX",
"",
"goff", 1, inEvent );
649 int nTrk = fwd->GetSelectedRows();
650 printf(
"Event %d has %lld Tracks \n", inEvent, nTrk );
652 for (
int iTrack = 0; iTrack < nTrk; iTrack ++ ){
654 printf(
"Track: %d\n", iTrack );
658 viz_event( inEvent, kRZSigned,
true );
659 viz_tracks(nTrk, inEvent, kRZSigned,
true, iTrack);
661 viz_event( inEvent, kXY,
true );
662 viz_tracks(nTrk, inEvent, kXY,
true, iTrack);
672 gCan->Print( TString::Format(
"out_event%d_track%d.pdf", inEvent, iTrack ) );