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