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

TkrGeometrySvc.cxx

Go to the documentation of this file.
00001 
00002 #include "GaudiKernel/MsgStream.h"
00003 #include "GaudiKernel/SvcFactory.h"
00004 #include "TkrRecon/TkrGeometrySvc.h"
00005 
00006 #include "xml/IFile.h"
00007 #include "idents/TowerId.h"
00008 
00009 static const SvcFactory<TkrGeometrySvc> s_factory;
00010 const ISvcFactory& TkrGeometrySvcFactory = s_factory;
00011 
00012 
00013 //------------------------------------------------------------------------------
00016 
00017 //#############################################################################
00018 TkrGeometrySvc::TkrGeometrySvc(const std::string& name, ISvcLocator* pSvcLocator) :
00019 Service(name, pSvcLocator)
00020 //#############################################################################
00021 {
00022     //Name of the xml file to get data from
00023     declareProperty("xmlFile", m_xmlFile);
00024     
00025     return;     
00026 }
00027 
00028 //##############################################
00029 StatusCode TkrGeometrySvc::initialize()
00030 //##############################################
00031 {
00032     StatusCode sc = StatusCode::SUCCESS;
00033     
00034     Service::initialize();
00035     setProperties();
00036     MsgStream log(msgSvc(), name());
00037 
00038     
00039     xml::IFile xmlFile(m_xmlFile.c_str());
00040   
00041     if (m_xmlFile.c_str() != "")
00042     {
00043         m_numX            = xmlFile.getInt(   "tkr", "numXtowers");
00044         m_numY            = xmlFile.getInt(   "tkr", "numYtowers");
00045         m_nviews          = xmlFile.getInt(   "tkr", "nViews");
00046         m_nlayers         = xmlFile.getInt(   "tkr", "nLayers");
00047         /* no longer used
00048         m_nPbLayers       = xmlFile.getInt(   "tkr", "nPbLayers");
00049         m_nSuperGLayers   = xmlFile.getInt(   "tkr", "nSuperGLayers");
00050         */
00051         m_indMixed        = xmlFile.getInt(   "tkr", "indMixed");
00052         m_viewMixed       = xmlFile.getInt(   "tkr", "viewMixed");
00053         m_ladderMixed     = xmlFile.getInt(   "tkr", "ladderMixed");
00054 
00055         m_Z0              = xmlFile.getDouble("tkr", "Z0");      
00056         log << MSG::INFO <<  "z0 = "  << m_Z0 << endreq;
00057         m_towerPitch      = xmlFile.getDouble("tkr", "towerPitch");
00058         m_trayWidth       = xmlFile.getDouble("tkr", "trayWidth");
00059         m_trayHeight      = xmlFile.getDouble("tkr", "trayHeight");
00060         m_footHeight      = xmlFile.getDouble("tkr", "footHeight");
00061         
00062         m_ladderWidth     = xmlFile.getDouble("tkr", "ladderWidth");
00063         m_ladderLength    = xmlFile.getDouble("tkr", "ladderLength");
00064         m_ladderGap       = xmlFile.getDouble("tkr", "ladderGap");
00065         m_ladderInnerGap  = xmlFile.getDouble("tkr", "ladderInnerGap");
00066         m_ladderNStrips   = xmlFile.getInt(   "tkr", "ladderNStrips");
00067         
00068         m_siStripPitch    = xmlFile.getDouble("tkr", "siStripPitch");
00069         m_siResolution    = xmlFile.getDouble("tkr", "siResolution");
00070         m_siThickness     = xmlFile.getDouble("tkr", "siThickness");
00071         m_siDeadDistance  = xmlFile.getDouble("tkr", "siDeadDistance");
00072         
00073         /* no longer used
00074         m_thinConvHeight  = xmlFile.getDouble("tkr", "thinConvHeight");
00075         m_thickConvHeight = xmlFile.getDouble("tkr", "thickConvHeight");
00076         */
00077         
00078         m_siX0            = xmlFile.getDouble("tkr", "siX0");
00079         m_pbX0            = xmlFile.getDouble("tkr", "pbX0");
00080         
00081         m_layertype       = xmlFile.getIntVector("tkr", "layerType");
00082         // make sure we're following the correct convention:
00083         for (int i = 0; i<m_layertype.size();i++) {
00084             if      (m_layertype[i]==0) {m_layertype[i] = tkrDetGeo::X;} 
00085             else if (m_layertype[i]==1) {m_layertype[i] = tkrDetGeo::Y;} 
00086             else                        {m_layertype[i] = -1;}
00087         }
00088         
00089         m_nladders        = xmlFile.getIntVector("tkr", "nLadders");
00090         m_izgap           = xmlFile.getIntVector("tkr", "iZGap");
00091         m_zgap            = xmlFile.getDoubleVector("tkr", "zGap");
00092         m_iradthickness   = xmlFile.getIntVector("tkr", "iRadThickness");
00093         m_radthickness    = xmlFile.getDoubleVector("tkr", "radThickness");
00094         m_iXsize          = xmlFile.getIntVector("tkr", "iXSize");
00095         m_iYsize          = xmlFile.getIntVector("tkr", "iYSize");
00096         m_diesize         = xmlFile.getDoubleVector("tkr", "dieSize");
00097         m_ndies           = xmlFile.getIntVector("tkr", "nDies");
00098         
00099     }
00100     
00101     return sc;
00102 }
00103 
00104 //##############################################
00105 StatusCode TkrGeometrySvc::finalize()
00106 //##############################################
00107 {
00108     return StatusCode::SUCCESS;
00109 }
00110 
00111 //################################################
00112 double TkrGeometrySvc::pbRadLen(int ilayer)
00113 //################################################
00114 {
00115     int irad = m_iradthickness[ilayer];
00116     return m_radthickness[irad];
00117 }
00118 //################################################
00119 double TkrGeometrySvc::layerGap(int ilayer)
00120 //################################################
00121 {
00122 /*    double zgap = 0.2913;
00123 if (ilayer < 5) zgap = 0.3156;
00124     */
00125     return m_zgap[m_izgap[ilayer]];
00126 }
00127 //################################################
00128 int TkrGeometrySvc::nLadders(int ilayer, axis a)
00129 //################################################
00130 {
00131 /*    int nladders = 5;
00132 if (ilayer > 8 ) nladders = 3;
00133 if (ilayer == 8) nladders = 4;
00134     */
00135     
00136     return m_nladders[ilayer];
00137 }
00138 //################################################
00139 double TkrGeometrySvc::diceSize(int ilayer, axis a, int iladder)
00140 //################################################
00141 {
00142 /*    double size = 10.68;
00143 if (ilayer > 8 ) size = 6.4;
00144 if (ilayer == 8 && a == X) size = 6.4;  
00145 if (ilayer == 7 && a == Y) size = 6.4;
00146 if (ilayer == indMixed() && a == Y && iladder == 2) size = 10.68;
00147     */
00148     
00149     int isize;
00150     if (a==X) {
00151         isize = m_iXsize[ilayer];
00152     } else {
00153         isize = m_iYsize[ilayer];
00154     }
00155     
00156     // this is for the mixed tray... sorry!!
00157     
00158     if (ilayer==m_indMixed && m_viewMixed==a && iladder==m_ladderMixed) {
00159         isize = m_isizeMixed;
00160     }
00161     
00162     return m_diesize[isize];
00163     
00164 }
00165 
00166 //################################################
00167 int TkrGeometrySvc::nDices(int ilayer, axis a,int iladder)
00168 //################################################
00169 {
00170 /*    int ndices = 5;
00171 double size = diceSize(ilayer,a, iladder);
00172 if (size == 10.68) ndices = 3;
00173     */
00174     
00175     double size = diceSize(ilayer, a, iladder);
00176     for (int i=0; i<m_diesize.size(); i++) {
00177         if (size==m_diesize[i]) {
00178             return m_ndies[i];
00179         }
00180     }
00181     return 0;
00182 }
00183 
00184 //##############################################
00185 tkrDetGeo TkrGeometrySvc::getSiLayer(int ilayer, axis a, int tower)
00186 //##############################################
00187 {
00188     // geometrical position
00189     
00190     double zfar = 0;
00191     /*
00192     int iview = ilayer % 2;
00193     if ((iview == 0 && a == tkrDetGeo::X) ||
00194     (iview == 1 && a == tkrDetGeo::Y)) zfar = layerGap(ilayer);
00195     */
00196     
00197     if ((m_layertype[ilayer]==0 && a==tkrDetGeo::Y) ||
00198         (m_layertype[ilayer]==1 && a==tkrDetGeo::X)) zfar = layerGap(ilayer);
00199     
00200     double zpos = ilayer * m_trayHeight + m_Z0 + zfar;
00201     
00202     int nladders = nLadders(ilayer, a);
00203     double size  = nladders * m_ladderWidth + (nladders-1) * m_ladderGap;
00204     //double sizeRef  = m_trayWidth;
00205     int maxLadders = m_trayWidth/m_ladderWidth; // number of ladders in a full tray
00206     double sizeRef = maxLadders * m_ladderWidth + (maxLadders-1) * (m_ladderGap);
00207     double pos = 0.5 * (size- sizeRef);
00208     if (fabs(pos) < 1e-5) pos =0.; 
00209     
00210     double xpos = 0.;
00211     double ypos = 0.;
00212     idents::TowerId tid(tower);
00213 
00214     xpos  = pos;
00215     xpos += (tid.ix() - 0.5 * (m_numX - 1)) * m_towerPitch;
00216     ypos  = pos;
00217     ypos += (tid.iy() - 0.5 * (m_numY - 1)) * m_towerPitch;
00218     
00219     double xsize = sizeRef;
00220     double ysize = sizeRef;
00221     if (a == tkrDetGeo::X) xsize = size;
00222     else ysize = size;
00223     
00224     Point P(xpos,ypos,zpos);
00225     Point S(0.5*xsize,0.5*ysize,0.5*m_siThickness);
00226     
00227     tkrDetGeo layer(ilayer,a,ilayer,P,S);
00228     return layer;
00229 }
00230 /*
00231 //##############################################
00232 tkrDetGeo TkrGeometrySvc::getPbLayer(int ilayer, int tower)
00233 //##############################################
00234 {
00235     // geometrical position
00236     
00237     double zfar    = +layerGap(ilayer);   // the lead is always in the far side
00238     int    idlayer = ilayer+m_nlayers-m_nPbLayers; // not the same number of leads
00239     double zpos    = idlayer*m_trayHeight + zfar + m_Z0;
00240     
00241     double xpos    = 0.;
00242     double ypos    = 0.;
00243     
00244     idents::TowerId tid(tower);
00245     
00246     int nTowers = m_numY;
00247     int xrank = tid.ix();
00248     int yrank = tid.iy(); 
00249     
00250     xpos += (xrank - 0.5*(nTowers-1))*m_towerPitch;
00251     ypos += (yrank - 0.5*(nTowers-1))*m_towerPitch;
00252     
00253     double sizeRef  = m_trayWidth;
00254     double xsize = sizeRef;
00255     double ysize = sizeRef;
00256     double zsize = pbRadLen(idlayer)*m_pbX0;
00257     
00258     zpos += 0.5*m_siThickness+0.5*zsize; // lead above
00259     
00260     Point P(xpos,ypos,zpos);
00261     if (fabs(zsize) < 1e-3) zsize = 0.;
00262     Point S(0.5*xsize,0.5*ysize,0.5*zsize); 
00263     
00264     tkrDetGeo::axis  a = tkrDetGeo::PASSIVE;
00265     tkrDetGeo layer(idlayer,a, idlayer,P,S);
00266     return layer;
00267 }
00268 */
00269 
00270 //##############################################
00271 tkrDetGeo TkrGeometrySvc::getSiLadder(int ilayer, tkrDetGeo::axis a, int iladder, int tower)
00272 //##############################################
00273 {
00274     tkrDetGeo layer = getSiLayer(ilayer, a, tower);
00275     double zpos  = layer.position().z();
00276     double xpos  = layer.position().x();
00277     double ypos  = layer.position().y();
00278     
00279     double zsize = 2.*layer.size().z();
00280     
00281     //back up to the start of the tray and proceed to the specified ladder
00282     int nladders = nLadders(ilayer, a);
00283     double size = nladders*m_ladderWidth+ (nladders-1)*m_ladderGap;
00284         double pos = -0.5*size + (iladder+0.5)*m_ladderWidth + iladder*m_ladderGap;
00285     if (fabs(pos) < 1e-5) pos =0.; 
00286 
00287     if (a == tkrDetGeo::X) {
00288         xpos += pos;
00289     }
00290     else {
00291         ypos += pos;
00292     }
00293     
00294     double xsize = m_ladderLength;
00295     double ysize = m_ladderLength;
00296     if (a == tkrDetGeo::X) xsize = m_ladderWidth;
00297     else ysize = m_ladderWidth;
00298     
00299     Point P(xpos,ypos,zpos);
00300     Point S(0.5*xsize,0.5*ysize,0.5*zsize);
00301     // int id = m_ladderAdrress[ilayer][integer(a)][iladder];
00302     
00303     tkrDetGeo ladder(ilayer,a,iladder,P,S);
00304     ladder.setMaterial("SI",siX0());
00305     ladder.setName("LADDER");
00306     
00307     return ladder;
00308 }
00309 //##############################################
00310 tkrDetGeo TkrGeometrySvc::getSiDice(int ilayer, tkrDetGeo::axis a, int iladder, int idice, int tower)
00311 //##############################################
00312 {
00313     tkrDetGeo ladder = getSiLadder(ilayer,a,iladder);
00314     double xpos = 0.;
00315     double ypos = 0.;
00316     double zpos = ladder.position().z();
00317     
00318     double xsize = 0;
00319     double ysize = 0;
00320     double zsize = 2.*ladder.size().z();
00321     
00322     double length = 0.;
00323     if (a == tkrDetGeo::X) length = 2.*ladder.size().y();
00324     else length = 2.*ladder.size().x();
00325     
00326     double sizeDice = diceSize(ilayer,a,iladder);       
00327     double pos = -0.5*length + (idice+0.5)*sizeDice+(idice)*m_ladderInnerGap;
00328     if (fabs(pos) < 1e-5) pos =0.; 
00329     
00330     if (a == tkrDetGeo::X) {
00331         xpos = ladder.position().x();
00332         ypos = pos;
00333         xsize = 2.*ladder.size().x();
00334         ysize = sizeDice;
00335     } else {
00336         xpos = pos; 
00337         ypos = ladder.position().y();
00338         xsize = sizeDice;
00339         ysize = 2.*ladder.size().y();
00340     }
00341     
00342     Point P(xpos,ypos,zpos);
00343     Point S(0.5*xsize,0.5*ysize,0.5*zsize);
00344     
00345     tkrDetGeo dice(ilayer,a,iladder,P,S);
00346     dice.setMaterial("SI",siX0());
00347     dice.setName("SIDICE");
00348     
00349     return dice;
00350 }
00351 
00352 // queryInterface
00353 
00354 StatusCode  TkrGeometrySvc::queryInterface (const IID& riid, void **ppvIF)
00355 {
00356     if (IID_ITkrGeometrySvc == riid) {
00357         *ppvIF = dynamic_cast<ITkrGeometrySvc*> (this);
00358         return StatusCode::SUCCESS;
00359     }
00360     else {
00361         return Service::queryInterface (riid, ppvIF);
00362     }
00363 }
00364 
00365 // access the type of this service
00366 
00367 const IID&  TkrGeometrySvc::type () const {
00368     return IID_ITkrGeometrySvc;
00369 }

Generated at Wed Nov 21 12:21:21 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000