00001
00002
00003
00005
00006 #include <cmath>
00007 #include <algorithm>
00008 #include <cstdio>
00009
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
00012 #include "DetectorDescription/Core/interface/DDSolid.h"
00013 #include "DetectorDescription/Core/interface/DDMaterial.h"
00014 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
00015 #include "DetectorDescription/Core/interface/DDSplit.h"
00016 #include "Geometry/TrackerCommonData/plugins/DDTECModuleAlgo.h"
00017 #include "CLHEP/Units/GlobalPhysicalConstants.h"
00018 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00019
00020
00021 DDTECModuleAlgo::DDTECModuleAlgo() {
00022 LogDebug("TECGeom") << "DDTECModuleAlgo info: Creating an instance";
00023 }
00024
00025 DDTECModuleAlgo::~DDTECModuleAlgo() {}
00026
00027 void DDTECModuleAlgo::initialize(const DDNumericArguments & nArgs,
00028 const DDVectorArguments & vArgs,
00029 const DDMapArguments & ,
00030 const DDStringArguments & sArgs,
00031 const DDStringVectorArguments & vsArgs) {
00032
00033 idNameSpace = DDCurrentNamespace::ns();
00034 genMat = sArgs["GeneralMaterial"];
00035
00036 DDName parentName = parent().name();
00037
00038 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Parent " << parentName
00039 << " NameSpace " << idNameSpace << " General Material "
00040 << genMat;
00041 ringNo = (int)nArgs["RingNo"];
00042 moduleThick = nArgs["ModuleThick"];
00043 detTilt = nArgs["DetTilt"];
00044 fullHeight = nArgs["FullHeight"];
00045 dlTop = nArgs["DlTop"];
00046 dlBottom = nArgs["DlBottom"];
00047 dlHybrid = nArgs["DlHybrid"];
00048 rPos = nArgs["RPos"];
00049 standardRot = sArgs["StandardRotation"];
00050
00051 isRing6 = (ringNo == 6);
00052
00053 LogDebug("TECGeom") << "DDTECModuleAlgo debug: ModuleThick " << moduleThick
00054 << " Detector Tilt " << detTilt/CLHEP::deg << " Height "
00055 << fullHeight << " dl(Top) " << dlTop << " dl(Bottom) "
00056 << dlBottom << " dl(Hybrid) " << dlHybrid
00057 << " rPos " << rPos << " standrad rotation "
00058 << standardRot;
00059
00060 frameWidth = nArgs["FrameWidth"];
00061 frameThick = nArgs["FrameThick"];
00062 frameOver = nArgs["FrameOver"];
00063 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Frame Width " << frameWidth
00064 << " Thickness " << frameThick << " Overlap "
00065 << frameOver;
00066
00067 topFrameMat = sArgs["TopFrameMaterial"];
00068 topFrameHeight = nArgs["TopFrameHeight"];
00069 topFrameTopWidth= nArgs["TopFrameTopWidth"];
00070 topFrameBotWidth= nArgs["TopFrameBotWidth"];
00071 topFrameThick = nArgs["TopFrameThick"];
00072 topFrameZ = nArgs["TopFrameZ"];
00073 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Top Frame Material "
00074 << topFrameMat << " Height " << topFrameHeight
00075 << " Top Width " << topFrameTopWidth << " Bottom Width "
00076 << topFrameTopWidth
00077 << " Thickness " << topFrameThick <<" positioned at"
00078 << topFrameZ;
00079 double resizeH =0.96;
00080 sideFrameMat = sArgs["SideFrameMaterial"];
00081 sideFrameThick = nArgs["SideFrameThick"];
00082 sideFrameLWidth = nArgs["SideFrameLWidth"];
00083 sideFrameLHeight = resizeH*nArgs["SideFrameLHeight"];
00084 sideFrameLtheta = nArgs["SideFrameLtheta"];
00085 sideFrameRWidth = nArgs["SideFrameRWidth"];
00086 sideFrameRHeight = resizeH*nArgs["SideFrameRHeight"];
00087 sideFrameRtheta = nArgs["SideFrameRtheta"];
00088 siFrSuppBoxWidth = vArgs["SiFrSuppBoxWidth"];
00089 siFrSuppBoxHeight = vArgs["SiFrSuppBoxHeight"];
00090 siFrSuppBoxYPos = vArgs["SiFrSuppBoxYPos"];
00091 siFrSuppBoxThick = nArgs["SiFrSuppBoxThick"];
00092 siFrSuppBoxMat = sArgs["SiFrSuppBoxMaterial"];
00093 sideFrameZ = nArgs["SideFrameZ"];
00094 LogDebug("TECGeom") << "DDTECModuleAlgo debug : Side Frame Material "
00095 << sideFrameMat << " Thickness " << sideFrameThick
00096 << " left Leg's Width: " << sideFrameLWidth
00097 << " left Leg's Height: " << sideFrameLHeight
00098 << " left Leg's tilt(theta): " << sideFrameLtheta
00099 << " right Leg's Width: " << sideFrameRWidth
00100 << " right Leg's Height: " << sideFrameRHeight
00101 << " right Leg's tilt(theta): " << sideFrameRtheta
00102 << "Supplies Box's Material: " << siFrSuppBoxMat
00103 << " positioned at" << sideFrameZ;
00104 for (int i= 0; i < (int)(siFrSuppBoxWidth.size());i++){
00105 LogDebug("TECGeom") << " Supplies Box" << i << "'s Width: "
00106 << siFrSuppBoxWidth[i] << " Supplies Box" << i
00107 <<"'s Height: " << siFrSuppBoxHeight[i]
00108 << " Supplies Box" << i << "'s y Position: "
00109 << siFrSuppBoxYPos[i];
00110 }
00111 waferMat = sArgs["WaferMaterial"];
00112 sideWidthTop = nArgs["SideWidthTop"];
00113 sideWidthBottom= nArgs["SideWidthBottom"];
00114 waferRot = sArgs["WaferRotation"];
00115 waferPosition = nArgs["WaferPosition"];
00116 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Wafer Material "
00117 << waferMat << " Side Width Top" << sideWidthTop
00118 << " Side Width Bottom" << sideWidthBottom
00119 << " and positioned at "<<waferPosition
00120 << " positioned with rotation" << " matrix:"
00121 << waferRot;
00122
00123 activeMat = sArgs["ActiveMaterial"];
00124 activeHeight = nArgs["ActiveHeight"];
00125 waferThick = nArgs["WaferThick"];
00126 activeRot = sArgs["ActiveRotation"];
00127 activeZ = nArgs["ActiveZ"];
00128 backplaneThick = nArgs["BackPlaneThick"];
00129 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Active Material "
00130 << activeMat << " Height " << activeHeight
00131 << " rotated by " << activeRot
00132 << " translated by (0,0," << -0.5 * backplaneThick << ")"
00133 << " Thickness/Z"
00134 << waferThick-backplaneThick << "/" << activeZ;
00135
00136
00137 hybridMat = sArgs["HybridMaterial"];
00138 hybridHeight = nArgs["HybridHeight"];
00139 hybridWidth = nArgs["HybridWidth"];
00140 hybridThick = nArgs["HybridThick"];
00141 hybridZ = nArgs["HybridZ"];
00142 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Hybrid Material "
00143 << hybridMat << " Height " << hybridHeight
00144 << " Width " << hybridWidth << " Thickness "
00145 << hybridThick << " Z" << hybridZ;
00146
00147 pitchMat = sArgs["PitchMaterial"];
00148 pitchHeight = nArgs["PitchHeight"];
00149 pitchThick = nArgs["PitchThick"];
00150 pitchWidth = nArgs["PitchWidth"];
00151 pitchZ = nArgs["PitchZ"];
00152 pitchRot = sArgs["PitchRotation"];
00153 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Pitch Adapter Material "
00154 << pitchMat << " Height " << pitchHeight
00155 << " Thickness " << pitchThick << " position with "
00156 << " rotation " << pitchRot << " at Z" << pitchZ;
00157
00158 bridgeMat = sArgs["BridgeMaterial"];
00159 bridgeWidth = nArgs["BridgeWidth"];
00160 bridgeThick = nArgs["BridgeThick"];
00161 bridgeHeight = nArgs["BridgeHeight"];
00162 bridgeSep = nArgs["BridgeSeparation"];
00163 LogDebug("TECGeom") << "DDTECModuleAlgo debug: Bridge Material "
00164 << bridgeMat << " Width " << bridgeWidth
00165 << " Thickness " << bridgeThick << " Height "
00166 << bridgeHeight << " Separation "<< bridgeSep;
00167
00168 siReenforceWidth = vArgs["SiReenforcementWidth"];
00169 siReenforceHeight = vArgs["SiReenforcementHeight"];
00170 siReenforceYPos = vArgs["SiReenforcementPosY"];
00171 siReenforceThick = nArgs["SiReenforcementThick"];
00172 siReenforceMat = sArgs["SiReenforcementMaterial"];
00173
00174 LogDebug("TECGeom") << "FALTBOOT DDTECModuleAlgo debug : Si-Reenforcement Material "
00175 << sideFrameMat << " Thickness " << siReenforceThick;
00176
00177 for (int i= 0; i < (int)(siReenforceWidth.size());i++){
00178 LogDebug("TECGeom") << " SiReenforcement" << i << "'s Width: "
00179 << siReenforceWidth[i] << " SiReenforcement" << i
00180 << "'s Height: " << siReenforceHeight[i]
00181 << " SiReenforcement" << i << "'s y Position: "
00182 <<siReenforceYPos[i];
00183 }
00184 inactiveDy = 0;
00185 inactivePos = 0;
00186 if(ringNo > 3){
00187 inactiveDy = nArgs["InactiveDy"];
00188 inactivePos = nArgs["InactivePos"];
00189 inactiveMat = sArgs["InactiveMaterial"];
00190 }
00191
00192 noOverlapShift = nArgs["NoOverlapShift"];
00193
00194 isStereo = (int)nArgs["isStereo"] == 1;
00195 if(!isStereo){
00196 LogDebug("TECGeom") << "This is a normal module, in ring "<<ringNo<<"!";
00197 } else {
00198 LogDebug("TECGeom") << "This is a stereo module, in ring "<<ringNo<<"!";
00199 posCorrectionPhi= nArgs["PosCorrectionPhi"];
00200 topFrame2LHeight = nArgs["TopFrame2LHeight"];
00201 topFrame2RHeight = nArgs["TopFrame2RHeight"];
00202 topFrame2Width = nArgs["TopFrame2Width"];
00203 LogDebug("TECGeom") << "Phi Position corrected by " << posCorrectionPhi << "*rad";
00204 LogDebug("TECGeom") << "DDTECModuleAlgo debug: stereo Top Frame 2nd Part left Heigt "
00205 << topFrame2LHeight << " right Height " << topFrame2RHeight
00206 << " Width " << topFrame2Width ;
00207
00208 sideFrameLWidthLow = nArgs["SideFrameLWidthLow"];
00209 sideFrameRWidthLow = nArgs["SideFrameRWidthLow"];
00210
00211 LogDebug("TECGeom") << " left Leg's lower Width: " << sideFrameLWidthLow
00212 << " right Leg's lower Width: " << sideFrameRWidthLow;
00213
00214
00215
00216 }
00217 }
00218
00219 void DDTECModuleAlgo::doPos(DDLogicalPart toPos, DDLogicalPart mother,
00220 int copyNr, double x, double y, double z,
00221 std::string rotName, DDCompactView& cpv) {
00222
00223 DDTranslation tran(z, x, y);
00224 DDRotation rot;
00225 std::string rotstr = DDSplit(rotName).first;
00226 std::string rotns;
00227 if (rotstr != "NULL") {
00228 rotns = DDSplit(rotName).second;
00229 rot = DDRotation(DDName(rotstr, rotns));
00230 } else {
00231 rot = DDRotation();
00232 }
00233
00234 cpv.position(toPos, mother, copyNr, tran, rot);
00235 LogDebug("TECGeom") << "DDTECModuleAlgo test: " << toPos.name()
00236 << " positioned in "<< mother.name()
00237 << " at " << tran << " with " << rot;
00238 }
00239
00240 void DDTECModuleAlgo::doPos(DDLogicalPart toPos, double x, double y, double z,
00241 std::string rotName, DDCompactView& cpv) {
00242 int copyNr = 1;
00243 if (isStereo) copyNr = 2;
00244
00245
00246
00247 z += rPos;
00248
00249 if(isStereo){
00250
00251
00252 x+= rPos*sin(posCorrectionPhi);
00253 }
00254 if (rotName == "NULL") rotName = standardRot;
00255
00256 doPos(toPos,parent(),copyNr,x,y,z,rotName, cpv);
00257 }
00258
00259 void DDTECModuleAlgo::execute(DDCompactView& cpv) {
00260
00261 LogDebug("TECGeom") << "==>> Constructing DDTECModuleAlgo...";
00262
00263 double tmp;
00264 double dxdif, dzdif;
00265 double dxbot, dxtop;
00266
00267 double xpos, ypos, zpos;
00268
00269 double bl1, bl2;
00270 double h1;
00271 double dx, dy, dz;
00272 double thet;
00273
00274 std::string idName;
00275 std::string name;
00276 std::string tag("Rphi");
00277 if (isStereo) tag = "Stereo";
00278 char buf[5];
00279
00280 const double topFrameEndZ = 0.5 * (-waferPosition + fullHeight) + pitchHeight + hybridHeight - topFrameHeight;
00281 DDName parentName = parent().name();
00282 idName = parentName.name();
00283 LogDebug("TECGeom") << "==>> " << idName << " parent " << parentName << " namespace " << idNameSpace;
00284 DDSolid solid;
00285
00286
00287 DDName matname(DDSplit(genMat).first, DDSplit(genMat).second);
00288 DDMaterial matter(matname);
00289 dzdif = fullHeight + topFrameHeight;
00290 if(isStereo) dzdif += 0.5*(topFrame2LHeight+topFrame2RHeight);
00291
00292 dxbot = 0.5*dlBottom + frameWidth - frameOver;
00293 dxtop = 0.5*dlHybrid + frameWidth - frameOver;
00294
00295 if (isRing6) {
00296 dxbot = dxtop;
00297 dxtop = 0.5*dlTop + frameWidth - frameOver;
00298
00299 }
00300 dxdif = dxtop - dxbot;
00301
00302
00303
00304 name = idName + "SideFrameLeft";
00305 matname = DDName(DDSplit(sideFrameMat).first, DDSplit(sideFrameMat).second);
00306 matter = DDMaterial(matname);
00307
00308 h1 = 0.5 * sideFrameThick;
00309 dz = 0.5 * sideFrameLHeight;
00310 bl1 = bl2 = 0.5 * sideFrameLWidth;
00311 thet = sideFrameLtheta;
00312
00313 if(isStereo) bl1 = 0.5 * sideFrameLWidthLow;
00314 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, thet, 0, h1, bl1,
00315 bl1, 0, h1, bl2, bl2, 0);
00316 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00317 << " Trap made of " << matname << " of dimensions "
00318 << dz << ", "<<thet<<", 0, " << h1 << ", " << bl1 << ", "
00319 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00320 << ", 0";
00321 DDLogicalPart sideFrameLeft(solid.ddname(), matter, solid);
00322
00323 xpos = - 0.5*topFrameBotWidth +bl2+ tan(fabs(thet)) * dz;
00324 ypos = sideFrameZ;
00325 zpos = topFrameEndZ -dz;
00326
00327 if (isRing6){
00328 zpos *= -1;
00329 xpos -= 2*tan(fabs(thet)) * dz;
00330 }
00331
00332 if(isStereo) {
00333 xpos = - 0.5*topFrameBotWidth + bl2*cos(detTilt) + dz*sin(fabs(thet)+detTilt)/cos(fabs(thet));
00334 xpos = -xpos;
00335 zpos = topFrameEndZ -topFrame2LHeight- 0.5*sin(detTilt)*(topFrameBotWidth - topFrame2Width)-dz*cos(detTilt+fabs(thet))/cos(fabs(thet))+bl2*sin(detTilt)-0.1*CLHEP::mm;
00336 }
00337
00338 doPos(sideFrameLeft,xpos,ypos,zpos,waferRot, cpv);
00339
00340
00341 name = idName + "SideFrameRight";
00342 matname = DDName(DDSplit(sideFrameMat).first, DDSplit(sideFrameMat).second);
00343 matter = DDMaterial(matname);
00344
00345 h1 = 0.5 * sideFrameThick;
00346 dz = 0.5 * sideFrameRHeight;
00347 bl1 = bl2 = 0.5 * sideFrameRWidth;
00348 thet = sideFrameRtheta;
00349 if(isStereo) bl1 = 0.5 * sideFrameRWidthLow;
00350 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, thet, 0, h1, bl1,
00351 bl1, 0, h1, bl2, bl2, 0);
00352 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00353 << " Trap made of " << matname << " of dimensions "
00354 << dz << ", "<<thet<<", 0, " << h1 << ", " << bl1 << ", "
00355 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00356 << ", 0";
00357 DDLogicalPart sideFrameRight(solid.ddname(), matter, solid);
00358
00359 xpos = 0.5*topFrameBotWidth -bl2- tan(fabs(thet)) * dz;
00360 ypos = sideFrameZ;
00361 zpos = topFrameEndZ -dz ;
00362 if (isRing6){
00363 zpos *= -1;
00364 xpos += 2*tan(fabs(thet)) * dz;
00365 }
00366 if(isStereo){
00367 xpos = 0.5*topFrameBotWidth - bl2*cos(detTilt) - dz*sin(fabs(detTilt-fabs(thet)))/cos(fabs(thet));
00368 xpos = -xpos;
00369 zpos = topFrameEndZ -topFrame2RHeight+ 0.5*sin(detTilt)*(topFrameBotWidth - topFrame2Width)-dz*cos(detTilt-fabs(thet))/cos(fabs(thet))-bl2*sin(detTilt)-0.1*CLHEP::mm;
00370 }
00371
00372 doPos(sideFrameRight,xpos,ypos,zpos,waferRot, cpv);
00373
00374
00375
00376 for (int i= 0; i < (int)(siFrSuppBoxWidth.size());i++){
00377 sprintf(buf,"%i",i);
00378 name = idName + "SuppliesBox"+buf;
00379 matname = DDName(DDSplit(siFrSuppBoxMat).first, DDSplit(siFrSuppBoxMat).second);
00380 matter = DDMaterial(matname);
00381
00382 h1 = 0.5 * siFrSuppBoxThick;
00383 dz = 0.5 * siFrSuppBoxHeight[i];
00384 bl1 = bl2 = 0.5 * siFrSuppBoxWidth[i];
00385 thet = sideFrameRtheta;
00386 if(isStereo) thet = -atan(fabs(sideFrameRWidthLow-sideFrameRWidth)/(2*sideFrameRHeight)-tan(fabs(thet)));
00387
00388
00389 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, thet,0, h1, bl1,
00390 bl1, 0, h1, bl2, bl2, 0);
00391 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00392 << " Trap made of " << matname << " of dimensions "
00393 << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
00394 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00395 << ", 0";
00396 DDLogicalPart siFrSuppBox(solid.ddname(), matter, solid);
00397
00398 xpos = 0.5*topFrameBotWidth -sideFrameRWidth - bl1-siFrSuppBoxYPos[i]*tan(fabs(thet));
00399 ypos = sideFrameZ*(0.5+(siFrSuppBoxThick/sideFrameThick));
00400 zpos = topFrameEndZ - siFrSuppBoxYPos[i];
00401 if (isRing6){
00402 xpos += 2*fabs(tan(thet))* siFrSuppBoxYPos[i];
00403 zpos *= -1;
00404 }
00405 if(isStereo){
00406 xpos = 0.5*topFrameBotWidth - (sideFrameRWidth+bl1)*cos(detTilt) -sin(fabs(detTilt-fabs(thet)))*(siFrSuppBoxYPos[i]+dz*(1/cos(thet)- cos(detTilt))+bl1*sin(detTilt));
00407 xpos =-xpos;
00408 zpos = topFrameEndZ - topFrame2RHeight - 0.5*sin(detTilt)*(topFrameBotWidth - topFrame2Width) - siFrSuppBoxYPos[i]-sin(detTilt)*sideFrameRWidth;
00409 }
00410
00411 doPos(siFrSuppBox,xpos,ypos,zpos,waferRot,cpv);
00412 }
00413
00414 name = idName + "Hybrid";
00415 matname = DDName(DDSplit(hybridMat).first, DDSplit(hybridMat).second);
00416 matter = DDMaterial(matname);
00417 dx = 0.5 * hybridWidth;
00418 dy = 0.5 * hybridThick;
00419 dz = 0.5 * hybridHeight;
00420 solid = DDSolidFactory::box(DDName(name, idNameSpace), dx, dy, dz);
00421 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00422 << " Box made of " << matname << " of dimensions "
00423 << dx << ", " << dy << ", " << dz;
00424 DDLogicalPart hybrid(solid.ddname(), matter, solid);
00425
00426 ypos = hybridZ;
00427 zpos = 0.5 * (-waferPosition + fullHeight + hybridHeight)+pitchHeight;
00428 if (isRing6) zpos *=-1;
00429
00430 doPos(hybrid,0,ypos,zpos,"NULL", cpv);
00431
00432
00433 name = idName + tag +"Wafer";
00434 matname = DDName(DDSplit(waferMat).first, DDSplit(waferMat).second);
00435 matter = DDMaterial(matname);
00436 bl1 = 0.5 * dlBottom;
00437 bl2 = 0.5 * dlTop;
00438 h1 = 0.5 * waferThick;
00439 dz = 0.5 * fullHeight;
00440 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl1,
00441 bl1, 0, h1, bl2, bl2, 0);
00442 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00443 << " Trap made of " << matname << " of dimensions "
00444 << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
00445 << bl1 << ", 0, " << h1 << ", " << bl2 << ", "
00446 << bl2 << ", 0";
00447 DDLogicalPart wafer(solid.ddname(), matter, solid);
00448
00449 ypos = activeZ;
00450 zpos =-0.5 * waferPosition;
00451 if (isRing6) zpos *= -1;
00452
00453 doPos(wafer,0,ypos,zpos,waferRot,cpv);
00454
00455
00456 name = idName + tag +"Active";
00457 matname = DDName(DDSplit(activeMat).first, DDSplit(activeMat).second);
00458 matter = DDMaterial(matname);
00459 bl1 -= sideWidthBottom;
00460 bl2 -= sideWidthTop;
00461 dz = 0.5 * (waferThick-backplaneThick);
00462 h1 = 0.5 * activeHeight;
00463 if (isRing6) {
00464 tmp = bl2; bl2 =bl1; bl1 = tmp;
00465 }
00466 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl2,
00467 bl1, 0, h1, bl2, bl1, 0);
00468 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00469 << " Trap made of " << matname << " of dimensions "
00470 << dz << ", 0, 0, " << h1 << ", " << bl2 << ", "
00471 << bl1 << ", 0, " << h1 << ", " << bl2 << ", "
00472 << bl1 << ", 0";
00473 DDLogicalPart active(solid.ddname(), matter, solid);
00474 doPos(active, wafer, 1, -0.5 * backplaneThick,0,0, activeRot, cpv);
00475
00476 if(ringNo > 3){
00477 inactivePos -= fullHeight-activeHeight;
00478 name = idName + tag +"Inactive";
00479 matname = DDName(DDSplit(inactiveMat).first, DDSplit(inactiveMat).second);
00480 matter = DDMaterial(matname);
00481 bl1 = 0.5*dlBottom-sideWidthBottom
00482 + ((0.5*dlTop-sideWidthTop-0.5*dlBottom+sideWidthBottom)/activeHeight)
00483 *(activeHeight-inactivePos-inactiveDy);
00484 bl2 = 0.5*dlBottom-sideWidthBottom
00485 + ((0.5*dlTop-sideWidthTop-0.5*dlBottom+sideWidthBottom)/activeHeight)
00486 *(activeHeight-inactivePos+inactiveDy);
00487 dz = 0.5 * (waferThick-backplaneThick);
00488 h1 = inactiveDy;
00489 if (isRing6) {
00490 tmp = bl2; bl2 =bl1; bl1 = tmp;
00491 }
00492 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl2,
00493 bl1, 0, h1, bl2, bl1, 0);
00494 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00495 << " Trap made of " << matname << " of dimensions "
00496 << dz << ", 0, 0, " << h1 << ", " << bl2 << ", "
00497 << bl1 << ", 0, " << h1 << ", " << bl2 << ", "
00498 << bl1 << ", 0";
00499 DDLogicalPart inactive(solid.ddname(), matter, solid);
00500 ypos = inactivePos - 0.5*activeHeight;
00501 doPos(inactive,active, 1, ypos,0,0, "NULL", cpv);
00502 }
00503
00504 name = idName + "PA";
00505 matname = DDName(DDSplit(pitchMat).first, DDSplit(pitchMat).second);
00506 matter = DDMaterial(matname);
00507
00508 if (!isStereo) {
00509 dx = 0.5 * pitchWidth;
00510 dy = 0.5 * pitchThick;
00511 dz = 0.5 * pitchHeight;
00512 solid = DDSolidFactory::box(DDName(name, idNameSpace), dx, dy, dz);
00513 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00514 << " Box made of " << matname <<" of dimensions "
00515 << dx << ", " << dy << ", " << dz;
00516 } else {
00517 dz = 0.5 * pitchWidth;
00518 h1 = 0.5 * pitchThick;
00519 bl1 = 0.5 * pitchHeight + 0.5 * dz * sin(detTilt);
00520 bl2 = 0.5 * pitchHeight - 0.5 * dz * sin(detTilt);
00521 double thet = atan((bl1-bl2)/(2.*dz));
00522 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, thet, 0, h1,
00523 bl1, bl1, 0, h1, bl2, bl2, 0);
00524 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00525 << " Trap made of " << matname
00526 << " of dimensions " << dz << ", " << thet/CLHEP::deg
00527 << ", 0, " << h1 << ", " << bl1 << ", " << bl1
00528 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00529 << ", 0";
00530 }
00531 xpos = 0;
00532 ypos = pitchZ;
00533 zpos = 0.5 * (-waferPosition + fullHeight + pitchHeight);
00534 if (isRing6) zpos *= -1;
00535 if(isStereo) xpos = 0.5 * fullHeight * sin(detTilt);
00536
00537 DDLogicalPart pa(solid.ddname(), matter, solid);
00538 if(isStereo)doPos(pa, xpos, ypos,zpos, pitchRot, cpv);
00539 else doPos(pa, xpos, ypos,zpos, "NULL", cpv);
00540
00541 name = idName + "TopFrame";
00542 matname = DDName(DDSplit(topFrameMat).first, DDSplit(topFrameMat).second);
00543 matter = DDMaterial(matname);
00544
00545 h1 = 0.5 * topFrameThick;
00546 dz = 0.5 * topFrameHeight;
00547 bl1 = 0.5 * topFrameBotWidth;
00548 bl2 = 0.5 * topFrameTopWidth;
00549 if (isRing6) {
00550 bl1 = 0.5 * topFrameTopWidth;
00551 bl2 = 0.5 * topFrameBotWidth;
00552 }
00553
00554 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl1,
00555 bl1,0, h1, bl2, bl2, 0);
00556 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00557 << " Trap made of " << matname << " of dimensions "
00558 << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
00559 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00560 << ", 0";
00561 DDLogicalPart topFrame(solid.ddname(), matter, solid);
00562
00563 if(isStereo){
00564 name = idName + "TopFrame2";
00565
00566 dz = 0.5 * topFrame2Width;
00567 h1 = 0.5 * topFrameThick;
00568 bl1 = 0.5 * topFrame2LHeight;
00569 bl2 = 0.5 * topFrame2RHeight;
00570 double thet = atan((bl1-bl2)/(2.*dz));
00571
00572 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, thet, 0, h1,
00573 bl1, bl1, 0, h1, bl2, bl2, 0);
00574 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00575 << " Trap made of " << matname << " of dimensions "
00576 << dz << ", " << thet/CLHEP::deg << ", 0, " << h1
00577 << ", " << bl1 << ", " << bl1 << ", 0, " << h1
00578 << ", " << bl2 << ", " << bl2 << ", 0";
00579 }
00580
00581
00582 ypos = topFrameZ;
00583 zpos = 0.5 * (-waferPosition + fullHeight - topFrameHeight)+ pitchHeight + hybridHeight;
00584 if(isRing6){
00585 zpos *=-1;
00586 }
00587
00588 doPos(topFrame, 0,ypos,zpos,"NULL", cpv);
00589 if(isStereo){
00590
00591 DDLogicalPart topFrame2(solid.ddname(), matter, solid);
00592 zpos -= 0.5*(topFrameHeight + 0.5*(topFrame2LHeight+topFrame2RHeight));
00593 doPos(topFrame2, 0,ypos,zpos,pitchRot, cpv);
00594 }
00595
00596
00597 for (int i= 0; i < (int)(siReenforceWidth.size());i++){
00598 char buf[5];
00599 sprintf(buf,"%i",i);
00600 name = idName + "SiReenforce"+buf;
00601 matname = DDName(DDSplit(siReenforceMat).first, DDSplit(siReenforceMat).second);
00602 matter = DDMaterial(matname);
00603
00604 h1 = 0.5 * siReenforceThick;
00605 dz = 0.5 * siReenforceHeight[i];
00606 bl1 = bl2 = 0.5 * siReenforceWidth[i];
00607
00608 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl1,
00609 bl1, 0, h1, bl2, bl2, 0);
00610 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00611 << " Trap made of " << matname << " of dimensions "
00612 << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
00613 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00614 << ", 0";
00615 DDLogicalPart siReenforce(solid.ddname(), matter, solid);
00616
00617 xpos =0 ;
00618 ypos = sideFrameZ;
00619 zpos = topFrameEndZ -dz -siReenforceYPos[i];
00620
00621 if (isRing6) zpos *= -1;
00622 if(isStereo){
00623 xpos = (-siReenforceYPos[i]+0.5*fullHeight)*sin(detTilt);
00624
00625
00626
00627 zpos -= topFrame2RHeight + sin (fabs(detTilt))* 0.5*topFrame2Width;
00628 }
00629 doPos(siReenforce,xpos,ypos,zpos,waferRot, cpv);
00630 }
00631
00632
00633 if (bridgeMat != "None") {
00634 name = idName + "Bridge";
00635 matname = DDName(DDSplit(bridgeMat).first, DDSplit(bridgeMat).second);
00636 matter = DDMaterial(matname);
00637 bl2 = 0.5*bridgeSep + bridgeWidth;
00638 bl1 = bl2 - bridgeHeight * dxdif / dzdif;
00639 h1 = 0.5 * bridgeThick;
00640 dz = 0.5 * bridgeHeight;
00641 solid = DDSolidFactory::trap(DDName(name,idNameSpace), dz, 0, 0, h1, bl1,
00642 bl1, 0, h1, bl2, bl2, 0);
00643 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00644 << " Trap made of " << matname << " of dimensions "
00645 << dz << ", 0, 0, " << h1 << ", " << bl1 << ", "
00646 << bl1 << ", 0, " << h1 << ", " << bl2 << ", " << bl2
00647 << ", 0";
00648 DDLogicalPart bridge(solid.ddname(), matter, solid);
00649
00650 name = idName + "BridgeGap";
00651 matname = DDName(DDSplit(genMat).first, DDSplit(genMat).second);
00652 matter = DDMaterial(matname);
00653 bl1 = 0.5*bridgeSep;
00654 solid = DDSolidFactory::box(DDName(name,idNameSpace), bl1, h1, dz);
00655 LogDebug("TECGeom") << "DDTECModuleAlgo test:\t" << solid.name()
00656 << " Box made of " << matname << " of dimensions "
00657 << bl1 << ", " << h1 << ", " << dz;
00658 DDLogicalPart bridgeGap(solid.ddname(), matter, solid);
00659 cpv.position(bridgeGap, bridge, 1, DDTranslation(0.0, 0.0, 0.0), DDRotation());
00660 LogDebug("TECGeom") << "DDTECModuleAlgo test: " << bridgeGap.name()
00661 << " number 1 positioned in " << bridge.name()
00662 << " at (0,0,0) with no rotation";
00663 }
00664
00665 LogDebug("TECGeom") << "<<== End of DDTECModuleAlgo construction ...";
00666 }