00001
00002 #include "bfemDisplay/TkrDisplay.h"
00003 #include "bfemDisplay/Enum.h"
00004
00005 ClassImp(TkrDisplay)
00006
00007 Float_t ZLayer[ 26 ] = { 0.0 };
00008
00009 Int_t DieXlayer[ 26 ] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3 };
00010
00011
00012 TkrDisplay::TkrDisplay( TNode *parent ) {
00013
00014
00015 parent->cd();
00016
00017
00018
00019
00020
00021 m_TkrHeight = 19.405;
00022 m_TkrWidth = 16.;
00023 m_TkrHeightOffset = 19.405;
00024 m_NumStrips = 1600;
00025 m_StripDisplayWidth = 0.5;
00026 m_StripHeight = 0.5;
00027 m_StripLength = 16.;
00028
00029 m_StripWidth = m_TkrWidth / ( Float_t )m_NumStrips;
00030 m_LayerHeight = 0.84375;
00031 m_reconOffsetZ = 3.7;
00032
00033 m_numTkrLayers = 26;
00034
00035
00036
00037
00038 m_TkrNodeList = 0;
00039 m_TkrHitList = 0;
00040 m_TkrReconHitList = 0;
00041 m_TkrReconNodeList = 0;
00042
00043
00044
00045
00046 TBRIK* tkrFrame = new TBRIK( "tkrFrame", "tkrFrame", "void", m_TkrWidth, m_TkrWidth, m_TkrHeight );
00047 tkrFrame->SetLineColor( 1 );
00048
00049
00050 m_tkrFrameNode = new TNode( "tkrFrameNode", "tkrFrameNode", "tkrFrame", 0.0, 0.0, m_TkrHeightOffset );
00051
00052 m_tkrFrameNode->cd();
00053
00054
00055 m_AllHitsX = new TNode( "AllHitsX", "AllHitsX", "tkrFrame" );
00056 m_AllHitsX->SetParent( m_tkrFrameNode );
00057
00058
00059 m_tkrFrameNode->cd();
00060 m_AllHitsY = new TNode( "AllHitsY", "AllHitsY", "tkrFrame" );
00061 m_AllHitsY->SetParent( m_tkrFrameNode );
00062
00063
00064
00065 ZLayer[ 0 ] = 0.0;
00066 ZLayer[ 1 ] = 0.3316;
00067
00068 for ( Int_t i = 2; i < m_numTkrLayers; ++i ) {
00069 if ( i%2 ) ZLayer[ i ] = ZLayer[ 1 ] + Dz * ( i / 2 );
00070 else ZLayer[ i ] = Dz * ( i / 2 );
00071 }
00072
00073
00074
00075 TBRIK *layerBrik;
00076 TNode *layNode;
00077
00078 Float_t x, y;
00079
00080 for ( Int_t ilay = 0; ilay < m_numTkrLayers; ilay++ ) {
00081
00082 Float_t z = -m_TkrHeight + ZLayer[ ilay ];
00083
00084 m_LayerWidth = m_TkrWidth * DieXlayer[ ilay ] / 5;
00085
00086 Int_t isY = !( ilay%2 );
00087
00088 if ( isY ) {
00089
00090 x = 0.0;
00091 y = -m_TkrWidth + m_LayerWidth;
00092
00093 layerBrik = new TBRIK( "layerBrik", "layerBrik", "void", m_TkrWidth, m_LayerWidth, 0.005 );
00094
00095 m_AllHitsY->cd();
00096
00097 layerBrik->SetLineColor( 4 );
00098 layerBrik->SetLineStyle( 3 );
00099
00100 layNode = new TNode( "layerNode", "layerNode", layerBrik, x, y, z );
00101 layNode->SetParent( m_AllHitsY );
00102
00103 }
00104
00105 else {
00106
00107 y = 0.0;
00108 x = -m_TkrWidth + m_LayerWidth;
00109
00110 layerBrik = new TBRIK( "layerBrik", "layerBrik", "void", m_LayerWidth, m_TkrWidth, 0.005 );
00111
00112 m_AllHitsX->cd();
00113
00114 layerBrik->SetLineColor( 4 );
00115 layerBrik->SetLineStyle( 3 );
00116
00117 layNode = new TNode( "layerNode", "layerNode", layerBrik, x, y, z );
00118 layNode->SetParent( m_AllHitsX );
00119
00120 }
00121
00122
00123
00124 TBRIK *sglayer;
00125 Float_t sgZ;
00126 Char_t* sg_name;
00127
00128 m_tkrFrameNode->cd();
00129
00130 if ( ilay < 3 ) {
00131
00132 sgZ = -m_TkrHeight + ZLayer[ 1 ] + ( ilay + 2 )*Dz;
00133
00134 sg_name = getSGName( ilay );
00135
00136 sglayer = new TBRIK( sg_name, "sglayer", "void", m_TkrWidth, m_TkrWidth, 0.1 );
00137 sglayer->SetLineColor( 2 );
00138 m_sgNode = new TNode( "supergNode", "supergNode", sg_name, 0.0, 0.0, sgZ );
00139
00140 }
00141
00142 }
00143
00144 }
00145
00146
00147
00148
00149 void TkrDisplay::DrawEvents( DigiEvent *event, Recon *recon ) {
00150
00151
00152
00153
00154 TNNode *newnode;
00155 THits *tkrStrip;
00156
00157 Char_t* tkr_name = 0;
00158 Char_t* hit_name = 0;
00159 Char_t* view;
00160
00161 Float_t x, y, z;
00162 Int_t nhit = 0;
00163
00164
00165
00166
00167 if ( m_TkrNodeList ) m_TkrNodeList->Delete();
00168 m_TkrNodeList = new TObjArray();
00169
00170 if ( m_TkrHitList ) m_TkrHitList->Delete();
00171 m_TkrHitList = new TObjArray();
00172
00173
00174
00175 m_event = event;
00176 m_recon = recon;
00177
00178 m_event->getTkrDigi()->Sort();
00179
00180 Int_t nTKR = m_event->getTkrDigi()->GetEntries();
00181
00182 for (Int_t ilay = 0; ilay < nTKR; ilay++) {
00183
00184 const TkrLayer* layer = m_event->getTkrLayer( ilay );
00185
00186 Int_t isY = (Int_t)layer->getXY();
00187
00188 Int_t LayerNum = layer->getLayerNum();
00189
00190 TObjArray *stripList = 0;
00191
00192 stripList = ( ( TkrLayer* )layer )->getStrips();
00193
00194 Int_t nStrips = stripList->GetEntries();
00195
00196 z = -m_TkrHeight + ZLayer[ LayerNum ];
00197
00198 m_LayerWidth = m_TkrWidth * DieXlayer[ LayerNum ] / 5;
00199
00200
00201
00202 for ( Int_t iStrip=0; iStrip < nStrips; iStrip++ ) {
00203
00204 StripId* strip = ( StripId* )( stripList->At( iStrip ) );
00205 Int_t stripID = strip->getId();
00206
00207 if ( stripID < 0 || stripID > 1600 ) {
00208 printf("==> Strip %i ==> out of boudary!!!\n",stripID);
00209 continue;
00210 }
00211
00212 tkr_name = getTkrName( LayerNum, stripID );
00213
00214 hit_name = tkr_name;
00215
00216 if ( isY ) {
00217
00218 m_AllHitsY->cd();
00219
00220 view = "Y";
00221
00222 x = 0.0;
00223 y = -m_TkrWidth + ( 1.0 + 2.0*( Float_t )stripID )*m_StripWidth;
00224
00225 tkrStrip = new THits( tkr_name, tkr_name, "Si", m_StripLength, m_StripDisplayWidth, m_StripHeight );
00226
00227 newnode = new TNNode( hit_name, hit_name, hit_name, x, y, z);
00228
00229 newnode->setObject( tkrStrip );
00230 newnode->SetParent( m_AllHitsY );
00231
00232 m_TkrNodeList->Add( newnode );
00233
00234 }
00235
00236 else {
00237
00238 m_AllHitsX->cd();
00239
00240 view = "X";
00241
00242 y = 0.0;
00243 x = -m_TkrWidth + ( 1.0 + 2.0*( Float_t )stripID )*m_StripWidth;
00244
00245 tkrStrip = new THits( tkr_name,tkr_name, "Si", m_StripDisplayWidth, m_StripLength, m_StripHeight );
00246
00247 newnode = new TNNode( hit_name, hit_name, hit_name, x, y, z);
00248
00249 newnode->setObject( tkrStrip );
00250 newnode->SetParent( m_AllHitsX );
00251
00252 m_TkrNodeList->Add( newnode );
00253
00254 }
00255
00256
00257 Int_t aTot = ( ( TkrLayer* )layer )->getToT(0);
00258 Int_t bTot = ( ( TkrLayer* )layer )->getToT(1);
00259
00260 tkrStrip->SetLineColor( 1 );
00261 tkrStrip->SetX(x);
00262 tkrStrip->SetY(y);
00263 tkrStrip->SetZ(ZLayer[LayerNum]);
00264 tkrStrip->SetLayer(LayerNum);
00265 tkrStrip->SetView(view);
00266 tkrStrip->SetElement(stripID);
00267 tkrStrip->SetTot(aTot,0);
00268 tkrStrip->SetTot(bTot,1);
00269
00270 m_TkrHitList->Add( tkrStrip );
00271
00272 nhit++;
00273
00274 }
00275
00276 }
00277
00278 if ( m_recon ) drawTkrRecon();
00279
00280 }
00281
00282
00284
00285 Char_t* TkrDisplay::getTkrName(Int_t i, Int_t stripID) {
00286
00287 Char_t cs[40];
00288
00289 TString *TkrName = new TString("TKRlayer");
00290
00291 sprintf(cs,"%d",i);
00292
00293 TkrName->Append(cs);
00294
00295 TkrName->Append("_id");
00296
00297 sprintf(cs,"%d",stripID);
00298
00299 TkrName->Append(cs);
00300
00301 return (Char_t*)TkrName->Data();
00302
00303 }
00304
00306
00307 Char_t* TkrDisplay::getLayerName(Int_t i) {
00308
00309 Char_t cs[40];
00310
00311 TString *LayerName = new TString("Layer");
00312
00313 sprintf(cs,"%d",i);
00314
00315 LayerName->Append(cs);
00316
00317 return (Char_t*)LayerName->Data();
00318
00319 }
00320
00322
00323 Char_t* TkrDisplay::getSGName(Int_t i) {
00324
00325 Char_t cs[40];
00326
00327 TString *SGName = new TString("SGLayer");
00328
00329 sprintf(cs,"%d",i);
00330
00331 SGName->Append(cs);
00332
00333 return (Char_t*)SGName->Data();
00334
00335 }
00336
00337 void TkrDisplay::drawTkrRecon() {
00338
00339
00340
00341
00342
00343
00344
00345
00346 TkrRecon *tkrRecon = m_recon->getTkrRecon();
00347
00348 TObjArray *trackList = tkrRecon->getTracks();
00349
00350
00351
00352
00353
00354 Char_t hitName[ 30 ];
00355 Char_t rmName[ 30 ];
00356
00357 Int_t nhit = 0;
00358
00359 Double_t x, y, z;
00360
00361
00362 Int_t numTracks = trackList->GetEntries();
00363
00364
00365
00366 if ( m_TkrReconHitList ) m_TkrReconHitList->Delete();
00367 m_TkrReconHitList = new TObjArray();
00368
00369
00370
00371 if ( m_TkrReconNodeList ) m_TkrReconNodeList->Delete();
00372 m_TkrReconNodeList = new TObjArray();
00373
00374
00375 for ( Int_t itrack=0; itrack<numTracks; ++itrack ) {
00376
00377
00378
00379
00380 TkrTrack *track = ( TkrTrack* )trackList->At( itrack );
00381
00382 TObjArray *hitList = track->getHits();
00383
00384 Int_t it = track->getId( );
00385
00386
00387
00388
00389 Int_t numHits = hitList->GetEntries();
00390
00391 Int_t nHitsX = 0;
00392 Int_t nHitsY = 0;
00393
00394 Float_t xLast, yLast, zLastX, zLastY;
00395
00396
00397 for ( Int_t ihit=0; ihit<numHits; ++ihit ) {
00398
00399
00400
00401 TkrHit *hit = ( TkrHit* )hitList->At( ihit );
00402
00403 TkrLocator* locator = hit->getLocator();
00404
00405 TVector3 position = locator->getPosition();
00406
00407
00408 x = position.X();
00409
00410 y = position.Y();
00411
00412 z = -m_TkrHeight - Dz + position.Z();
00413
00414
00415
00416
00417
00418 Double_t angleX = locator->getSlopeX() * 360/( 2*3.14159 );
00419
00420 Double_t angleY = locator->getSlopeY() * 360/( 2*3.14159 );
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431 if ( fabs( 1000000*angleX ) > fabs( 1000000*angleY ) ) {
00432
00433 if ( nHitsX > 0 ) {
00434
00435 m_AllHitsX->cd();
00436
00437
00438
00439 Float_t dX = x - xLast;
00440 Float_t dZ = z - zLastX;
00441
00442
00443
00444 Double_t angle = 180.0/3.14159*atan( dX / dZ );
00445
00446 Float_t markerLength;
00447
00448 if ( dZ != 0.0 ) markerLength = sqrt( dX*dX + dZ*dZ );
00449 else markerLength = 0.0;
00450
00451 sprintf( hitName, "TRK%d_SEG%d", itrack, ihit );
00452 TReconHits *reconHit = new TReconHits( hitName, hitName, "Si" );
00453 Float_t secZ = 0.0;
00454 for ( Int_t secNum=0; secNum<10; ++secNum ) {
00455 secZ += markerLength / 10.0;
00456 reconHit->DefineSection( secNum, secZ, 0.0, 0.05 );
00457 }
00458 m_TkrReconHitList->Add( reconHit );
00459
00460 reconHit->SetX( x );
00461 reconHit->SetY( y );
00462 reconHit->SetZ( z );
00463 reconHit->SetAngleX( angleX );
00464 reconHit->SetAngleY( angleY );
00465
00466 reconHit->SetLineColor( 2 );
00467
00468 sprintf( rmName, "Angle%s", hitName );
00469 TRotMatrix *rm = new TRotMatrix( rmName, rmName, 90, 0, 90, 90, angle, 0 );
00470
00471 TNNode *newnode = new TNNode( hitName, hitName, reconHit, x, 0.0, z, rm );
00472
00473 newnode->setObject( reconHit );
00474 newnode->SetParent( m_AllHitsX );
00475
00476 m_TkrReconNodeList->Add( newnode );
00477
00478 ++nhit;
00479
00480 }
00481
00482 xLast = x;
00483
00484 zLastX = z;
00485
00486 ++nHitsX;
00487
00488 }
00489
00490 else {
00491
00492 if ( nHitsY > 0 ) {
00493
00494 m_AllHitsY->cd();
00495
00496
00497
00498 Float_t dY = y - yLast;
00499 Float_t dZ = z - zLastY;
00500
00501
00502
00503 Double_t angle = 180.0/3.14159*atan( dY / dZ );
00504
00505 Float_t markerLength;
00506
00507 if ( dZ != 0.0 ) markerLength = sqrt( dY*dY + dZ*dZ );
00508 else markerLength = 0.0;
00509
00510 sprintf( hitName, "TRK%d_SEG%d", itrack, ihit );
00511 TReconHits *reconHit = new TReconHits( hitName, hitName, "Si" );
00512 Float_t secZ = 0.0;
00513 for ( Int_t secNum=0; secNum<10; ++secNum ) {
00514 secZ += markerLength / 10.0;
00515 reconHit->DefineSection( secNum, secZ, 0.0, 0.05 );
00516 }
00517 m_TkrReconHitList->Add( reconHit );
00518
00519 reconHit->SetX( x );
00520 reconHit->SetY( y );
00521 reconHit->SetZ( z );
00522 reconHit->SetAngleX( angleX );
00523 reconHit->SetAngleY( angleY );
00524
00525 reconHit->SetLineColor( 2 );
00526
00527 sprintf( rmName, "Angle%s", hitName );
00528 TRotMatrix *rm = new TRotMatrix( rmName, rmName, 90, 0, 90, 90, angle, 90 );
00529
00530 TNNode *newnode = new TNNode( hitName, hitName, reconHit, 0.0, y, z, rm );
00531
00532 newnode->setObject( reconHit );
00533 newnode->SetParent( m_AllHitsY );
00534
00535 m_TkrReconNodeList->Add( newnode );
00536
00537 ++nhit;
00538
00539 }
00540
00541 yLast = y;
00542
00543 zLastY = z;
00544
00545 ++nHitsY;
00546
00547 }
00548
00549 }
00550
00551 }
00552
00553 }
00554
00555
00556 void TkrDisplay::setVisibility( Int_t vis ) {
00557
00558
00559
00560
00561 switch( vis ) {
00562
00563 case( kHideX ):
00564 m_AllHitsX->SetVisibility( -2 );
00565 m_AllHitsY->SetVisibility( 2 );
00566 break;
00567
00568 case( kHideY ):
00569 m_AllHitsX->SetVisibility( 2 );
00570 m_AllHitsY->SetVisibility( -2 );
00571 break;
00572
00573 case( kHideAll ):
00574 m_AllHitsX->SetVisibility( -2 );
00575 m_AllHitsY->SetVisibility( -2 );
00576 break;
00577
00578 case( kHideNone ):
00579 m_AllHitsX->SetVisibility( 2 );
00580 m_AllHitsY->SetVisibility( 2 );
00581 break;
00582
00583 }
00584
00585 }
00586
00587
00588
00589
00590
00591