Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

TkrDisplay.cxx

Go to the documentation of this file.
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   // Note: All measurements in cm.  Numbers are half what they are in reality.  
00017   // This is to accomadate the fact that TBrik accept half lengths as input variables.
00018   // Coordinate system center in the center of the tower frame.
00019 
00020   m_TkrHeight           = 19.405;    // Tracker height
00021   m_TkrWidth            = 16.;       // Tracker width (1600*200um)
00022   m_TkrHeightOffset     = 19.405;    // Offset for tracker node 
00023   m_NumStrips           = 1600;      // Total number of strip
00024   m_StripDisplayWidth   = 0.5;
00025   m_StripHeight         = 0.5;       // Height of tracker log
00026   m_StripLength         = 16.;       // Length of tracker log
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   // Zero TObjArray pointers.
00036 
00037   m_TkrNodeList = 0;
00038   m_TkrHitList = 0;
00039   m_TkrReconHitList = 0;
00040   m_TkrReconNodeList = 0;
00041 
00042 
00043 
00044   // The BRIK which represents the outline of the tracker.
00045   TBRIK* tkrFrame = new TBRIK( "tkrFrame", "tkrFrame", "void", m_TkrWidth, m_TkrWidth, m_TkrHeight );
00046   tkrFrame->SetLineColor( 1 );
00047 
00048   // Top-level node for the tracker.
00049   m_tkrFrameNode = new TNode( "tkrFrameNode", "tkrFrameNode", "tkrFrame", 0.0, 0.0, m_TkrHeightOffset );
00050 
00051   m_tkrFrameNode->cd();
00052 
00053   // Top-level node for hits on strips parallel to Y-axis ( measured coordinate is X ).
00054   m_AllHitsX = new TNode( "AllHitsX", "AllHitsX", "tkrFrame" );
00055   m_AllHitsX->SetParent( m_tkrFrameNode );
00056 
00057   // Top-level node for hits on strips parallel to X-axis ( measured coordinate is Y ).
00058   m_tkrFrameNode->cd();
00059   m_AllHitsY = new TNode( "AllHitsY", "AllHitsY", "tkrFrame" );
00060   m_AllHitsY->SetParent( m_tkrFrameNode );
00061  
00062   // Z-coord of Si layers.
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   // Create nodes for displaying of layers.
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;  // ( Max. 5 ladders per layer. )
00084 
00085     Int_t isY = !( ilay%2 );   // First layer ( layer 0 ) has strips parallel to X.
00086 
00087     if ( isY ) {  // If isY = 1, Y is measured ==> strips along X
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     // Draw Superglast absorbers.
00122 
00123     TBRIK *sglayer;
00124     Float_t sgZ;
00125     Char_t* sg_name;
00126 
00127     m_tkrFrameNode->cd();  // Remove this if want to split sg layers into X and Y.
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   // Draw displays the current event.
00152 
00153   TNNode *newnode;
00154   THits *tkrStrip;
00155     
00156   Char_t* tkr_name = 0;    // Names of TNode and shapes in Tracker Lists.
00157   Char_t* hit_name = 0;    // Names of elements in TkrHitList.
00158   Char_t* view;
00159     
00160   Float_t x, y, z;
00161   Int_t nhit = 0;
00162 
00163 
00164   // Delete the old hit and node arrays
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   // Retrieve info for this event.
00173 
00174   m_event = event;
00175   m_recon = recon;
00176 
00177   m_event->getTkrDigi()->Sort();
00178 
00179   Int_t nTKR = m_event->getTkrDigi()->GetEntries();   // Number of tracker layers.
00180     
00181   for (Int_t ilay = 0; ilay < nTKR; ilay++) {  // Loop over layers.
00182 
00183     const TkrLayer* layer =  m_event->getTkrLayer( ilay );
00184       
00185     Int_t isY = (Int_t)layer->getXY(); // if isY = 1 Y is measured ==> strips along X.
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 ];  // Layer z-coord.
00196        
00197     m_LayerWidth = m_TkrWidth * DieXlayer[ LayerNum ] / 5;
00198   
00199 
00200 
00201     for ( Int_t iStrip=0; iStrip < nStrips; iStrip++ ) {  // Loop over strips.
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; // Out of boundary!!!
00209       }
00210 
00211       tkr_name = getTkrName( LayerNum, stripID );
00212 
00213       hit_name = tkr_name;
00214 
00215       if ( isY ) {  // Assign node for hit on strips parallel to X-axis.
00216 
00217         m_AllHitsY->cd();
00218 
00219         view = "Y"; // Y is measured coordinate - strips along X
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 {  // Assign node for hit on strips parallel to Y-axis.
00236 
00237         m_AllHitsX->cd();
00238 
00239         view = "X"; // X is measured coordinate - strips along Y.
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); // read TOT left
00257       Int_t bTot = ( ( TkrLayer* )layer )->getToT(1); // read TOT right
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     }  // End loop over strips.
00274 
00275   }  // End loop over layers.
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   // Draw reconstructed hits in the tracker: hit position and direction.
00341 
00342   // For the moment only in 2D.
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   // Create a new list of reconstructed hits.
00364 
00365   if ( m_TkrReconHitList ) m_TkrReconHitList->Delete();
00366   m_TkrReconHitList = new TObjArray();
00367   
00368   // Create a new list of nodes.
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     // Loop over all tracks for this event.
00377 
00378 
00379     TkrTrack *track = ( TkrTrack* )trackList->At( itrack );  // Retrieve a track.
00380 
00381     TObjArray *hitList = track->getHits();   // Get list of hits for this track.
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       // Loop over all hits in the track.
00395 
00396       TkrHit *hit = ( TkrHit* )hitList->At( ihit );  // Retrieve a hit.
00397 
00398       TkrLocator* locator = hit->getLocator();  // Get locator for this hit.
00399 
00400       TVector3 position = locator->getPosition();
00401 
00402 
00403       x = position.X();
00404 
00405       y = position.Y();
00406 
00407       z = -m_TkrHeight - /*m_reconOffsetZ*/ Dz + position.Z();
00408 
00409 
00410 
00411       // Slopes in degrees ( for rotation matrix ).
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       // Hits in X have position.Y() all zero; hits in Y have position.X() all zero.  Use this to determine which
00419 
00420       // projection the hit refers to.  Obviously not perfect solution!  Angle of hit specified via the rotation
00421 
00422       // matrix of the hit TNode.
00423 
00424 
00425 
00426       if ( fabs( 1000000*angleX ) > fabs( 1000000*angleY ) ) {
00427 
00428         if ( nHitsX > 0 ) {
00429 
00430           m_AllHitsX->cd();
00431 
00432           // Start constructing track segements when have more than one recon point...
00433 
00434           Float_t dX = x - xLast;
00435           Float_t dZ = z - zLastX;
00436 
00437           // Determine length and angle of segment.
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 );  // Name of hit ( unique for this event ).
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 );  // Add to list of recon hits.
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 );  // Rotation matrix name.
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           // Start constructing track segments when have more than one recon point...
00492 
00493           Float_t dY = y - yLast;
00494           Float_t dZ = z - zLastY;
00495 
00496           // Determine length and angle of segment.
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 );  // Name of hit ( unique for this event ).
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 );  // Add to list of recon hits.
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 );  // Rotation matrix name.
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   // Set visibility of tracker planes and hits.
00554   // Note: -2 = "node not drawn, sons not drawn", 2 = "node not drawn, sons drawn".
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 

Generated at Mon Nov 26 18:20:07 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000