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

Generated at Wed Nov 14 20:41:42 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000