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

AcdDisplay.cxx

Go to the documentation of this file.
00001 
00002 #include "bfemDisplay/AcdDisplay.h"
00003 
00004 ClassImp(AcdDisplay)
00005 
00006 AcdDisplay::AcdDisplay( TNode *parent, TObjArray *acdpeds ) {
00007 
00008   m_acdpeds = acdpeds;
00009   //m_xgtpeds = xgtpeds;
00010 
00011 
00012   parent->cd();
00013 
00014   TBRIK* acdFrame = new TBRIK( "acdFrame", "acdFrame", "void", 0.0, 0.0, 0.0 );
00015   acdFrame->SetLineColor( 1 );
00016 
00017   m_acdFrameNode  = new TNode( "acdFrameNode", "acdFrameNode", "acdFrame" );
00018 
00019   m_AcdNodeList = 0;
00020   m_AcdShapeList = 0;
00021 
00022   m_XgtNodeList = 0;
00023   m_XgtShapeList = 0;
00024  
00025   // Checked position and dimension of ADC tiles according to document:
00026   // Detector Geometry used for G4 Balloon Test - Gloria 15/05/2001
00027 
00028 
00032 
00033 
00034   //  if (m_tileSizes != 0) delete m_tileSizes;
00035 
00036   m_tileSizes = new TObjArray(6);
00037 
00038   TVector3* type0Size = new TVector3(44.2,30.0,1.); // BIG
00039 
00040   m_tileSizes->AddAt(type0Size,0);
00041 
00042   TVector3* type1Size = new TVector3(1.,43.2,29.7); // 310, 110
00043 
00044   m_tileSizes->AddAt(type1Size,1);
00045 
00046   TVector3* type2Size = new TVector3(1.,43.2,28.4); // 300, 100
00047 
00048   m_tileSizes->AddAt(type2Size,2);
00049 
00050   TVector3* type3Size = new TVector3(43.2,1.,29.7); // 210, 410
00051 
00052   m_tileSizes->AddAt(type3Size,3);                   
00053 
00054   TVector3* type4Size = new TVector3(43.2,1.,28.4); // 400, 200
00055 
00056   m_tileSizes->AddAt(type4Size,4);
00057 
00058   TVector3* type5Size = new TVector3(20.4,20.4,1.); // TOP:000, 010, 010, 011
00059 
00060   m_tileSizes->AddAt(type5Size,5);
00061 
00062 
00063   //  if (m_tileCenters != 0) delete m_tileCenters;
00064 
00065   m_tileCenters = new TObjArray(20);
00066 
00067   TVector3* acd14Pos = new TVector3(-10.35,-10.35,56.57); // 000
00068 
00069   m_tileCenters->AddAt(acd14Pos,0);
00070 
00071   TVector3* acd13Pos = new TVector3(10.35,-10.35,56.57); // 001
00072 
00073   m_tileCenters->AddAt(acd13Pos,1);
00074  
00075   TVector3* acd20Pos = new TVector3(-10.35,10.35,56.57); // 010
00076 
00077   m_tileCenters->AddAt(acd20Pos,2);
00078 
00079   TVector3* acd19Pos = new TVector3(10.35,10.35,56.57); // 011
00080 
00081   m_tileCenters->AddAt(acd19Pos,3);
00082 
00083   TVector3* acd8Pos = new TVector3(-21.1,0.,44.87); // 100
00084 
00085   m_tileCenters->AddAt(acd8Pos,4);
00086 
00087   TVector3* acd2Pos = new TVector3(-22.1,0.,17.29); // 110
00088 
00089   m_tileCenters->AddAt(acd2Pos,5);
00090 
00091   TVector3* acd9Pos = new TVector3(0.,-21.1,44.87); // 200
00092 
00093   m_tileCenters->AddAt(acd9Pos,6);
00094 
00095   TVector3* acd3Pos = new TVector3(0.,-22.1,17.29); // 210
00096 
00097   m_tileCenters->AddAt(acd3Pos,7);
00098 
00099   TVector3* acd7Pos = new TVector3(21.1,0.,44.87); // 300
00100 
00101   m_tileCenters->AddAt(acd7Pos,8);
00102 
00103   TVector3* acd1Pos = new TVector3(22.1,0.,17.29); // 310
00104 
00105   m_tileCenters->AddAt(acd1Pos,9);                   
00106 
00107   TVector3* acd6Pos = new TVector3(0.,21.1,44.87); // 400
00108 
00109   m_tileCenters->AddAt(acd6Pos,10);
00110 
00111   TVector3* acd18Pos = new TVector3(0.,22.1,17.29); //410
00112 
00113   m_tileCenters->AddAt(acd18Pos,11);
00114 
00115   TVector3* acd12Pos = new TVector3(0.,0.,57.67); // BIG
00116 
00117   m_tileCenters->AddAt(acd12Pos,12);
00118 
00119 
00120   // Checked position and dimension of XGT  according to document:
00121   // Detector Geometry used for G4 Balloon Test - Gloria 15/05/2001 
00122   // 
00123 
00124   //  if(m_XgtCenters != 0) delete m_XgtCenters;
00125 
00126   m_XgtCenters = new TObjArray(4);
00127 
00128   TVector3* Xgt2pos = new TVector3(-12.374,-12.374,69.67);//X000
00129 
00130   m_XgtCenters->AddAt(Xgt2pos,0);
00131 
00132   TVector3* Xgt1pos = new TVector3(12.374,-12.374,69.67); //X001
00133 
00134   m_XgtCenters->AddAt(Xgt1pos,1);
00135 
00136   TVector3* Xgt3pos = new TVector3(-12.374,12.374,69.67); //X010
00137 
00138   m_XgtCenters->AddAt(Xgt3pos,2);
00139 
00140   TVector3* Xgt0pos = new TVector3(12.374,12.374,69.67);  //X011 
00141 
00142   m_XgtCenters->AddAt(Xgt0pos,3);
00143 
00144 
00145   m_XgtSize = new TVector3(5.,10.,5.);
00146 
00147 
00148  
00149 }
00150 
00151 void AcdDisplay::DrawEvents( DigiEvent *event ) {
00152 
00153   m_event = event;
00154 
00155   m_acdFrameNode->cd();
00156 
00157   drawAcdEvents();
00158 
00159   setXGTthr();
00160 
00161   drawXgtEvents();
00162 
00163 }
00164 
00165 
00166 void AcdDisplay::setXGTthr() {
00167 
00168 
00169 
00170   for (Int_t i=0; i<4; i++) {
00171 
00172     m_xgtthr[0][i] = 50. + 300.*m_mip[i];
00173     m_xgtthr[1][i] = 150.+ 230.*m_mip[i];
00174     m_xgtthr[2][i] = 140.+ 240.*m_mip[i];
00175     m_xgtthr[3][i] = 130.+ 230.*m_mip[i];
00176 
00177   }
00178   
00179   return;
00180 
00181 }
00182 
00183 
00184 void AcdDisplay::drawAcdEvents() {
00185 
00186 
00187   // Draw displays the current event
00188   // delete the old hit node and shape arrays  
00189 
00190   if ( m_AcdNodeList ) m_AcdNodeList->Delete();
00191   m_AcdNodeList = new TObjArray();
00192 
00193   if (m_AcdShapeList != 0) m_AcdShapeList->Delete();
00194   m_AcdShapeList = new TObjArray();
00195 
00196   Char_t* acd_name=0;
00197 
00198   Int_t nACD = m_event->getAcdDigi()->GetEntries();
00199 
00200   for (Int_t ihit=0; ihit < nACD; ihit++) {
00201 
00202     m_event->getAcdDigi()->Sort();
00203 
00204     AcdTile *hit = (AcdTile*)m_event->getAcdDigi()->At(ihit);
00205 
00206     AcdId *tile = (AcdId*)hit->getId();
00207 
00208     Int_t id = tile->getId();
00209 
00210     if (id > 1000) continue;
00211 
00212     acd_name = getAcdName(id);
00213 
00214     Float_t acdPH = ( ( AcdTile* )m_event->getAcdTile(id) )->getPulseHeight();
00215 
00216     Float_t eTotal = getACDEnergy(id, nACD, acdPH); // in MeV
00217 
00218     if ( eTotal > m_acd_lev[ 0 ] ) {
00219 
00220       // Figure out position of Tile
00221 
00222       Float_t width, length, height;
00223       Int_t index;
00224 
00225       if (id == 1000) index = 0;
00226       if (id == 110 || id == 310) index = 1;
00227       if (id == 100 || id == 300) index = 2;
00228       if (id == 210 || id == 410) index = 3;
00229       if (id == 200 || id == 400) index = 4;
00230       if (id < 100) index = 5;
00231 
00232       width = ((TVector3*) m_tileSizes->At(index))->X()/2.;
00233       length = ((TVector3*) m_tileSizes->At(index))->Y()/2.;
00234       height = ((TVector3*) m_tileSizes->At(index))->Z()/2.;
00235       
00236       TBRIK *acdTile = new TBRIK(acd_name,acd_name,"void",width,length,height);
00237       m_AcdShapeList->Add(acdTile);
00238 
00239       Double_t x = ((TVector3*) m_tileCenters->At(ihit))->X();
00240       Double_t y = ((TVector3*) m_tileCenters->At(ihit))->Y();
00241       Double_t z = ((TVector3*) m_tileCenters->At(ihit))->Z();
00242 
00243       // Define colour of acd based on the deposited energy
00244       
00245       if ( eTotal > m_acd_lev[ 3 ] ) acdTile->SetLineColor(5);
00246 
00247       if ( eTotal > m_acd_lev[ 2 ] && eTotal < m_acd_lev[ 3 ] ) acdTile->SetLineColor(2);
00248 
00249       if ( eTotal > m_acd_lev[ 1 ] && eTotal < m_acd_lev[ 2 ] ) acdTile->SetLineColor(4); 
00250 
00251       if ( eTotal > m_acd_lev[ 0 ] && eTotal < m_acd_lev[ 1 ] ) acdTile->SetLineColor(3); 
00252 
00253       
00254       m_AcdNodeList->Add(new TNode(acd_name,acd_name,acd_name,x,y,z));
00255 
00256     }
00257 
00258   }
00259 
00260 }
00261 
00262 Float_t AcdDisplay::getACDEnergy(Int_t id, Int_t nACD, Float_t acdPH){
00263   
00264   Float_t acdEn, acdPed;
00265   
00266   TVector *acd_id, *acd_ped;
00267  
00268   nACD = 13; // 
00269 
00270   if ( m_acdpeds ) {
00271     
00272     acd_id = (TVector *)m_acdpeds->At(0);
00273     acd_ped = (TVector *)m_acdpeds->At(1);
00274 
00275      
00276     for ( Int_t j=0; j<nACD; j++){
00277       
00278       if ( acd_id->operator() (j) == id )  acdPed = acd_ped->operator() (j);
00279 
00280     }
00281 
00282     //acdEn = (acdPH - acdPed) * 2./ 350.; // Energy lost in ACD (MeV) // Alex 20/11/2001
00283     acdEn = (acdPH - acdPed) / 350.; // Energy lost in ACD (MIP) // Alex 20/11/2001
00284 
00285     return acdEn;
00286 
00287   }
00288     
00289   return 0.0;
00290   
00291 }
00292 
00293 
00295 
00296 void AcdDisplay::drawXgtEvents(){
00297 
00298  
00299   // delete the old hit node and shape arrays
00300 
00301   if ( m_XgtNodeList ) m_XgtNodeList->Delete();
00302   m_XgtNodeList = new TObjArray();
00303 
00304   if ( m_XgtShapeList ) m_XgtShapeList->Delete();
00305   m_XgtShapeList = new TObjArray();
00306 
00307   
00308   // xgt_name is the title of elements in XgtNodeList and XgtShapeList 
00309 
00310   Char_t* xgt_name=0; 
00311 
00312   Int_t nXGT = m_event->getXgtDigi()->GetEntries();
00313    
00314   for (Int_t ihit=0; ihit < nXGT; ihit++) {
00315 
00316     m_event->getXgtDigi()->Sort();
00317 
00318     AcdTile *hit = (AcdTile*)m_event->getXgtDigi()->At(ihit);
00319 
00320     AcdId *tile = (AcdId*) hit->getId();
00321 
00322     Int_t id = tile->getId();
00323 
00324     xgt_name = getXgtName(id);    
00325 
00326     Float_t xgtPH = ( ( AcdTile* )m_event->getXgt(id))->getPulseHeight();
00327 
00328     //Float_t eTotal = getXGTEnergy( Int_t id, Int_t nXGT, Float_t acdPH);
00329 
00330  
00331     if ( xgtPH > m_xgtthr[ihit][0] ) {
00332 
00333       // !Figure out position of Tile
00334 
00335       Float_t width, length, height;
00336 
00337 
00338       width = m_XgtSize->X()/2.;
00339 
00340       length = m_XgtSize->Y()/2.;
00341 
00342       height = m_XgtSize->Z()/2.;
00343 
00344 
00345 
00346       TBRIK *xgt = new TBRIK(xgt_name,xgt_name,"void",width,length,height);
00347 
00348       m_XgtShapeList->Add(xgt);
00349 
00350 
00351 
00352       Float_t x = ((TVector3*) m_XgtCenters->At(ihit))->X();
00353 
00354       Float_t y = ((TVector3*) m_XgtCenters->At(ihit))->Y();
00355 
00356       Float_t z = ((TVector3*) m_XgtCenters->At(ihit))->Z();
00357 
00358 
00359    // Define colour of xgt based on the deposited energy
00360 
00361       
00362       if ( xgtPH > m_xgtthr[ihit][3] ) xgt->SetLineColor(5);
00363          
00364       if ( xgtPH > m_xgtthr[ihit][2] && xgtPH < m_xgtthr[ihit][3] ) xgt->SetLineColor(2);
00365         
00366       if ( xgtPH > m_xgtthr[ihit][1] && xgtPH < m_xgtthr[ihit][2] ) xgt->SetLineColor(4); 
00367         
00368       if ( xgtPH > m_xgtthr[ihit][0] && xgtPH < m_xgtthr[ihit][1] ) xgt->SetLineColor(3); 
00369         
00370 
00371       if (id == 2000 || id == 2011) {
00372         
00373         m_XgtRot1 = new TRotMatrix("xgtrot1", "xgtrot1", 90., -45., 90.,45.,0., 0.);
00374       
00375         m_XgtNodeList->Add(new TNode(xgt_name,xgt_name,xgt_name,x,y,z, "xgtrot1"));
00376 
00377       }
00378       
00379       else {
00380         
00381         m_XgtRot2 = new TRotMatrix("xgtrot2", "xgtrot2", 90., 45., 90.,135.,0., 0.);
00382 
00383         m_XgtNodeList->Add(new TNode(xgt_name,xgt_name,xgt_name,x,y,z, "xgtrot2"));
00384       
00385       }
00386 
00387     }
00388 
00389   }
00390 
00391 }
00392 
00393 
00394 void AcdDisplay::setThresholds( Float_t threshAcd[ 4 ], Float_t threshXgt[ 4 ] ) {
00395 
00396   for ( Int_t lev=0; lev<4; ++lev ) {
00397     m_acd_lev[ lev ] = threshAcd[ lev ]; // ACD thresholds.
00398     m_mip[ lev ] = threshXgt[ lev ];     // XGT thresholds.
00399   }
00400 
00401 }
00402 
00403 
00404 
00406 
00407 Char_t* AcdDisplay::getXgtName(Int_t id){
00408 
00409   Char_t cs[40];
00410 
00411    TString* XgtName = new TString("XGT");
00412 
00413    sprintf(cs,"%d",id);
00414 
00415    XgtName->Append(cs);
00416 
00417    return (Char_t*)XgtName->Data();
00418 
00419 }
00420 
00421 
00423 
00424 Char_t* AcdDisplay::getAcdName(Int_t id) {
00425 
00426   Char_t cs[40];
00427 
00428   TString *AcdName = new TString("Tile ");
00429   
00430   sprintf(cs,"%d",id);
00431 
00432   AcdName->Append(cs);   
00433 
00434   return (Char_t*)AcdName->Data();
00435 
00436 }

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