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

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