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
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
00048
00049
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
00074
00075
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
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
00123
00124
00125 return m_zgap[m_izgap[ilayer]];
00126 }
00127
00128 int TkrGeometrySvc::nLadders(int ilayer, axis a)
00129
00130 {
00131
00132
00133
00134
00135
00136 return m_nladders[ilayer];
00137 }
00138
00139 double TkrGeometrySvc::diceSize(int ilayer, axis a, int iladder)
00140
00141 {
00142
00143
00144
00145
00146
00147
00148
00149 int isize;
00150 if (a==X) {
00151 isize = m_iXsize[ilayer];
00152 } else {
00153 isize = m_iYsize[ilayer];
00154 }
00155
00156
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
00171
00172
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
00189
00190 double zfar = 0;
00191
00192
00193
00194
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
00205 int maxLadders = m_trayWidth/m_ladderWidth;
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
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
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
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
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
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
00366
00367 const IID& TkrGeometrySvc::type () const {
00368 return IID_ITkrGeometrySvc;
00369 }