Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-10 02:20:49

0001 #include <cmath>
0002 #include <algorithm>
0003 
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include "DetectorDescription/Core/interface/DDTypes.h"
0006 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0007 #include "DetectorDescription/Core/interface/DDSolid.h"
0008 #include <CLHEP/Units/SystemOfUnits.h>
0009 #include <vector>
0010 #include <string>
0011 
0012 #include "DetectorDescription/Core/interface/DDAlgorithm.h"
0013 #include "DetectorDescription/Core/interface/DDMaterial.h"
0014 
0015 using CLHEP::cm;
0016 using CLHEP::deg;
0017 using CLHEP::mm;
0018 //#define EDM_ML_DEBUG
0019 
0020 class DDEcalPreshowerAlgo : public DDAlgorithm {
0021 public:
0022   DDMaterial getMaterial(unsigned int i) const { return DDMaterial(materials_[i]); }
0023   DDMaterial getLaddMaterial() const { return DDMaterial(LaddMaterial_); }
0024   std::string getLayName(unsigned int i) const { return layName_[i]; }
0025   std::string getLadPrefix(unsigned int i) const { return ladPfx_[i]; }
0026 
0027   DDEcalPreshowerAlgo();
0028   void initialize(const DDNumericArguments& nArgs,
0029                   const DDVectorArguments& vArgs,
0030                   const DDMapArguments& mArgs,
0031                   const DDStringArguments& sArgs,
0032                   const DDStringVectorArguments& vsArgs) override;
0033   void execute(DDCompactView& pos) override;
0034 
0035 private:
0036   void doLayers(DDCompactView& pos);
0037   void doLadders(DDCompactView& pos);
0038   void doSens(DDCompactView& pos);
0039 
0040   int nmat_;                            // number of preshower layers
0041   double thickness_;                    // overall thickness of the preshower envelope
0042   std::vector<std::string> materials_;  // materials of the presh-layers
0043   std::vector<std::string> layName_;    // names of the presh-layers
0044   std::vector<std::string> ladPfx_;     // name prefix for ladders
0045   std::string LaddMaterial_;            // ladd material - air
0046   std::vector<double> thickLayers_;
0047   std::vector<double> abs1stx;
0048   std::vector<double> abs1sty;
0049   std::vector<double> abs2ndx;
0050   std::vector<double> abs2ndy;
0051   std::vector<double> asym_ladd_;
0052   std::vector<double> rminVec;
0053   std::vector<double> rmaxVec;
0054   std::vector<double> noLaddInCol_;
0055   std::vector<double> startOfFirstLadd_;
0056   std::vector<std::string> types_l5_;
0057   std::vector<std::string> types_l4_;
0058   std::vector<double> ladd_l5_map_;
0059   std::vector<double> ladd_l4_map_;
0060   std::vector<std::string> typeOfLaddRow0;
0061   std::vector<std::string> typeOfLaddRow1;
0062   std::vector<std::string> typeOfLaddRow2;
0063   std::vector<std::string> typeOfLaddRow3;
0064 
0065   double zlead1_, zlead2_, zfoam1_, zfoam2_;
0066   double waf_intra_col_sep, waf_inter_col_sep, waf_active, wedge_length, wedge_offset, zwedge_ceramic_diff,
0067       ywedge_ceramic_diff, wedge_angle, box_thick, dee_separation, In_rad_Abs_Al, In_rad_Abs_Pb;
0068   double ladder_thick, yladder_1stwedge_diff, ladder_width, ladder_length, micromodule_length;
0069   double absAlX_X_, absAlX_Y_, absAlX_subtr1_Xshift_, absAlX_subtr1_Yshift_, rMax_Abs_Al_;
0070   double absAlY_X_, absAlY_Y_, absAlY_subtr1_Xshift_, absAlY_subtr1_Yshift_;
0071   double LdrBck_Length, LdrFrnt_Length, LdrFrnt_Offset, LdrBck_Offset, ceramic_length, wedge_back_thick;
0072 };
0073 
0074 DDEcalPreshowerAlgo::DDEcalPreshowerAlgo() : DDAlgorithm() {
0075 #ifdef EDM_ML_DEBUG
0076   edm::LogVerbatim("EcalGeom") << "DDEcalPreshowerAlgo info: Creating an instance";
0077 #endif
0078 }
0079 
0080 void DDEcalPreshowerAlgo::initialize(const DDNumericArguments& nArgs,
0081                                      const DDVectorArguments& vArgs,
0082                                      const DDMapArguments& mArgs,
0083                                      const DDStringArguments& sArgs,
0084                                      const DDStringVectorArguments& vsArgs) {
0085   edm::LogVerbatim("EcalGeom") << "DDEcalPreshowerAlgo info: Initialize";
0086 
0087   asym_ladd_ = vArgs["ASYMETRIC_LADDER"];
0088   types_l5_ = vsArgs["TYPES_OF_LADD_L5"];
0089   types_l4_ = vsArgs["TYPES_OF_LADD_L4"];
0090   ladd_l5_map_ = vArgs["LADD_L5_MAP"];
0091   ladd_l4_map_ = vArgs["LADD_L4_MAP"];
0092   noLaddInCol_ = vArgs["NUMB_OF_LADD_IN_COL"];
0093   startOfFirstLadd_ = vArgs["START_OF_1ST_LADD"];
0094   typeOfLaddRow0 = vsArgs["TYPE_OF_LADD_1"];
0095   typeOfLaddRow1 = vsArgs["TYPE_OF_LADD_2"];
0096   typeOfLaddRow2 = vsArgs["TYPE_OF_LADD_3"];
0097   typeOfLaddRow3 = vsArgs["TYPE_OF_LADD_4"];
0098   thickLayers_ = vArgs["Layers"];
0099   thickness_ = double(nArgs["PRESH_Z_TOTAL"]);
0100   materials_ = vsArgs["LayMat"];
0101   layName_ = vsArgs["LayName"];
0102   rmaxVec = vArgs["R_MAX"];  // inner radii
0103   rminVec = vArgs["R_MIN"];  // outer radii
0104   waf_intra_col_sep = double(nArgs["waf_intra_col_sep"]);
0105   waf_inter_col_sep = double(nArgs["waf_inter_col_sep"]);
0106   waf_active = double(nArgs["waf_active"]);
0107   wedge_length = double(nArgs["wedge_length"]);
0108   wedge_offset = double(nArgs["wedge_offset"]);
0109   zwedge_ceramic_diff = double(nArgs["zwedge_ceramic_diff"]);
0110   ywedge_ceramic_diff = double(nArgs["ywedge_ceramic_diff"]);
0111   ceramic_length = double(nArgs["ceramic_length"]);
0112   wedge_angle = double(nArgs["wedge_angle"]);
0113   wedge_back_thick = double(nArgs["wedge_back_thick"]);
0114   ladder_thick = double(nArgs["ladder_thick"]);
0115   ladder_width = double(nArgs["ladder_width"]);
0116   micromodule_length = double(nArgs["micromodule_length"]);
0117   box_thick = double(nArgs["box_thick"]);
0118   abs1stx = vArgs["1ST_ABSX"];
0119   abs1sty = vArgs["1ST_ABSY"];
0120   abs2ndx = vArgs["2ND_ABSX"];
0121   abs2ndy = vArgs["2ND_ABSY"];
0122   ladPfx_ = vsArgs["LadPrefix"];
0123   LaddMaterial_ = sArgs["LadderMaterial"];
0124   LdrFrnt_Length = double(nArgs["LdrFrnt_Length"]);
0125   LdrFrnt_Offset = double(nArgs["LdrFrnt_Offset"]);
0126   LdrBck_Length = double(nArgs["LdrBck_Length"]);
0127   LdrBck_Offset = double(nArgs["LdrBck_Offset"]);
0128   dee_separation = double(nArgs["dee_sep"]);
0129   In_rad_Abs_Al = double(nArgs["R_MIN_Abs_Al"]);
0130   In_rad_Abs_Pb = double(nArgs["R_MIN_Abs_Pb"]);
0131   rMax_Abs_Al_ = double(nArgs["R_MAX_Abs_Al"]);
0132   absAlX_X_ = double(nArgs["AbsAlX_X"]);
0133   absAlX_Y_ = double(nArgs["AbsAlX_Y"]);
0134   absAlX_subtr1_Xshift_ = double(nArgs["AbsAlX_subtr1_Xshift"]);
0135   absAlX_subtr1_Yshift_ = double(nArgs["AbsAlX_subtr1_Yshift"]);
0136   absAlY_X_ = double(nArgs["AbsAlY_X"]);
0137   absAlY_Y_ = double(nArgs["AbsAlY_Y"]);
0138   absAlY_subtr1_Xshift_ = double(nArgs["AbsAlY_subtr1_Xshift"]);
0139   absAlY_subtr1_Yshift_ = double(nArgs["AbsAlY_subtr1_Yshift"]);
0140 }
0141 
0142 void DDEcalPreshowerAlgo::execute(DDCompactView& cpv) {
0143 #ifdef EDM_ML_DEBUG
0144   edm::LogVerbatim("EcalGeom") << "******** DDEcalPreshowerAlgo execute!";
0145 #endif
0146   // creates all the tube-like layers of the preshower
0147   doLayers(cpv);
0148   // creates and places the ladders
0149   doLadders(cpv);
0150   // places the slicon strips in active silicon wafers
0151   doSens(cpv);
0152 }
0153 
0154 void DDEcalPreshowerAlgo::doLayers(DDCompactView& cpv) {
0155   double zpos = -thickness_ / 2., sdx(0), sdy(0), bdx(0), bdy(0);
0156 
0157   for (size_t i = 0; i < thickLayers_.size(); ++i) {
0158     int I = int(i) + 1;  // FOTRAN I (offset +1)
0159 
0160     double rIn(0), rOut(0), zHalf(0);
0161 
0162     // create the name
0163     DDName ddname(getLayName(i), "esalgo");  // namespace:name
0164 
0165     // cone dimensions
0166     rIn = rminVec[i];
0167     rOut = rmaxVec[i];
0168     zHalf = thickLayers_[i] / 2.;
0169 
0170     // create a logical part representing a single layer in the preshower
0171     DDSolid solid = DDSolidFactory::tubs(ddname, zHalf, rIn, rOut, 0., 360. * CLHEP::deg);
0172 #ifdef EDM_ML_DEBUG
0173     edm::LogVerbatim("SFGeomX") << ddname << " Tubs " << zHalf << ":" << rIn << ":" << rOut << ":0:360";
0174 #endif
0175     DDLogicalPart layer = DDLogicalPart(ddname, getMaterial(i), solid);
0176 
0177     // position the logical part w.r.t. the parent volume
0178     zpos += zHalf;
0179 
0180     // create a logical part representing a single layer in the preshower
0181     // skip layers with detectors, front and rear window
0182     if (I == 2 || I == 28 || I == 13 || I == 23) {
0183       zpos += zHalf;
0184       continue;
0185     }
0186 
0187     if (I == 12) {
0188       zlead1_ = zpos + zHalf;
0189     }
0190     if (I == 22) {
0191       zlead2_ = zpos + zHalf;
0192     }
0193 
0194     if (I == 10 || I == 20) {  // New lead shape
0195 
0196       int absz = 0;
0197       double outalbx, outalby, shiftR, outalbx2, outalby2, shiftR2;
0198 
0199       absz = int(abs1stx.size());
0200       if (I == 20)
0201         absz = int(abs2ndx.size());
0202       int cutabsx = -1, cutabsy = -1;
0203 
0204       DDName dd_tmp_name_b(getLayName(i) + "Lcut", "esalgo");
0205       DDName dd_tmp_name_c(getLayName(i) + "tmpb", "esalgo");
0206       DDName dd_tmp_name_d(getLayName(i) + "LinPb", "esalgo");
0207       DDName dd_tmp_name_e(getLayName(i) + "LinAl", "esalgo");
0208       DDName dd_tmp_name_f(getLayName(i) + "LOutAl", "esalgo");
0209 
0210       std::ostringstream tmp_Alname_fin;
0211       tmp_Alname_fin << getLayName(i) << "LtmpAl" << absz - 1;
0212       DDName dd_Alname_fin(tmp_Alname_fin.str(), "esalgo");
0213 
0214       DDSolid Outer_Al = DDSolid(dd_Alname_fin);
0215 
0216       DDLogicalPart layerFinOutAl = DDLogicalPart(dd_tmp_name_f, getMaterial(i - 1), Outer_Al);
0217 
0218       DDName dd_Alname_f(getLayName(i) + "LOutAl", "esalgo");
0219       DDName dd_Alname_g(getLayName(i) + "LOutAl2", "esalgo");
0220       DDName dd_Alname_h(getLayName(i) + "LOutAltmp", "esalgo");
0221       DDName dd_Alname_i(getLayName(i) + "LOutAltmp2", "esalgo");
0222       DDName dd_Alname_j(getLayName(i) + "LOutAltmp3", "esalgo");
0223       DDName dd_Alname_k(getLayName(i) + "LOutAltmp4", "esalgo");
0224       DDName dd_Alname_l(getLayName(i) + "LOutAltmp5", "esalgo");
0225       DDName dd_Alname_m(getLayName(i) + "LOutAltmp6", "esalgo");
0226 
0227       DDSolid Out_Al =
0228           DDSolidFactory::tubs(dd_Alname_f, zHalf - 0.1 * mm, rMax_Abs_Al_ - 20 * cm, rMax_Abs_Al_, 0., 90. * deg);
0229 #ifdef EDM_ML_DEBUG
0230       edm::LogVerbatim("SFGeomX") << dd_Alname_f << " Tubs " << (zHalf - 0.1 * mm) << ":" << (rMax_Abs_Al_ - 20 * cm)
0231                                   << ":" << rMax_Abs_Al_ << ":0:90";
0232 #endif
0233 
0234       outalbx = absAlX_X_ * 0.1;
0235       outalby = rMax_Abs_Al_ + 0.1 * mm - absAlX_subtr1_Yshift_;
0236       shiftR = absAlX_subtr1_Yshift_;
0237       if (I == 20) {
0238         outalbx = absAlY_X_ * 0.1;
0239         outalby = rMax_Abs_Al_ + 0.1 * mm - absAlY_subtr1_Yshift_;
0240         shiftR = absAlY_subtr1_Xshift_;
0241       }
0242       DDSolid OutAltmp = DDSolidFactory::box(dd_Alname_h, outalbx / 2 + 0.1 * mm, outalby / 2 + 0.1 * mm, zHalf);
0243       DDSolid Out_Altmp3 = DDSolidFactory::subtraction(
0244           dd_Alname_j, Out_Al, OutAltmp, DDTranslation(outalbx / 2, outalby / 2 + shiftR, 0), DDRotation());
0245 #ifdef EDM_ML_DEBUG
0246       edm::LogVerbatim("SFGeomX") << dd_Alname_h << " Box " << (outalbx / 2 + 0.1 * mm) << ":"
0247                                   << (outalby / 2 + 0.1 * mm) << ":" << zHalf;
0248       edm::LogVerbatim("SFGeomX") << dd_Alname_j << " Subtraction " << Out_Al.name() << ":" << OutAltmp.name() << " at "
0249                                   << DDTranslation(outalbx / 2, outalby / 2 + shiftR, 0) << " no rotation";
0250 #endif
0251       outalby2 = absAlX_Y_ * 0.1;
0252       outalbx2 = rMax_Abs_Al_ + 0.1 * mm - absAlX_subtr1_Xshift_;
0253       shiftR2 = absAlX_subtr1_Xshift_;
0254       if (I == 20) {
0255         outalby2 = absAlY_Y_ * 0.1;
0256         outalbx2 = rMax_Abs_Al_ + 0.1 * mm - absAlY_subtr1_Xshift_;
0257         shiftR2 = absAlY_subtr1_Xshift_;
0258       }
0259       DDSolid OutAltmp2 = DDSolidFactory::box(dd_Alname_i, outalbx2 / 2 + 0.1 * mm, outalby2 / 2 + 0.1 * mm, zHalf);
0260       DDSolid Out_Altmp4 = DDSolidFactory::subtraction(
0261           dd_Alname_k, Out_Altmp3, OutAltmp2, DDTranslation(outalbx2 / 2 + shiftR2, outalby2 / 2, 0), DDRotation());
0262       DDSolid Out_Altmp5 = DDSolidFactory::unionSolid(
0263           dd_Alname_l, Out_Altmp4, Out_Altmp4, DDTranslation(0, 0, 0), DDRotation("esalgo:RABS90"));
0264       DDSolid Out_Altmp6 = DDSolidFactory::unionSolid(
0265           dd_Alname_m, Out_Altmp5, Out_Altmp4, DDTranslation(0, 0, 0), DDRotation("esalgo:RABS180B"));
0266       DDSolid Out_Al2 = DDSolidFactory::unionSolid(
0267           dd_Alname_g, Out_Altmp6, Out_Altmp4, DDTranslation(0, 0, 0), DDRotation("esalgo:R180"));
0268 #ifdef EDM_ML_DEBUG
0269       edm::LogVerbatim("SFGeomX") << dd_Alname_i << " Box " << (outalbx2 / 2 + 0.1 * mm) << ":"
0270                                   << (outalby2 / 2 + 0.1 * mm) << ":" << zHalf;
0271       edm::LogVerbatim("SFGeomX") << dd_Alname_k << " Subtraction " << Out_Altmp3.name() << ":" << OutAltmp2.name()
0272                                   << " at " << DDTranslation(outalbx2 / 2 + shiftR2, outalby2 / 2, 0) << " no rotation";
0273       edm::LogVerbatim("SFGeomX") << dd_Alname_l << " Union " << Out_Altmp4.name() << ":" << Out_Altmp4.name() << " at "
0274                                   << DDTranslation(0, 0, 0) << " rotation esalgo:RABS90";
0275       edm::LogVerbatim("SFGeomX") << dd_Alname_m << " Union " << Out_Altmp5.name() << ":" << Out_Altmp4.name() << " at "
0276                                   << DDTranslation(0, 0, 0) << " rotation esalgo:RABS180B";
0277       edm::LogVerbatim("SFGeomX") << dd_Alname_g << " Union " << Out_Altmp6.name() << ":" << Out_Altmp4.name() << " at "
0278                                   << DDTranslation(0, 0, 0) << " rotation esalgo:R180";
0279       edm::LogVerbatim("SFGeomX") << Outer_Al;
0280 #endif
0281 
0282       for (int L = 0; L < absz; ++L) {
0283         int K = L;
0284         std::ostringstream tmp_name_b, tmp_name_b2, tmp_FAl_name_c, tmp_FAl_name_d1, tmp_FAl_name_d2, tmp_FAl_name_d3,
0285             tmp_FAl_name_d;
0286         tmp_name_b << getLayName(i) << "L" << K;
0287         tmp_name_b2 << getLayName(i) << "Lb2" << K;
0288 
0289         if (L == 0)
0290           tmp_FAl_name_c << getLayName(i) << "LOutAl2";
0291         if (L > 0)
0292           tmp_FAl_name_c << getLayName(i) << "LtmpAl" << K - 1;
0293 
0294         tmp_FAl_name_d1 << getLayName(i) << "LtmpAl" << K << "_1";
0295         tmp_FAl_name_d2 << getLayName(i) << "LtmpAl" << K << "_2";
0296         tmp_FAl_name_d3 << getLayName(i) << "LtmpAl" << K << "_3";
0297         tmp_FAl_name_d << getLayName(i) << "LtmpAl" << K;
0298 
0299         DDName dd_tmp_name_b(tmp_name_b.str(), "esalgo");
0300         DDName dd_tmp_name_b2(tmp_name_b2.str(), "esalgo");
0301         DDName dd_FAl_name_c(tmp_FAl_name_c.str(), "esalgo");
0302         DDName dd_FAl_name_d1(tmp_FAl_name_d1.str(), "esalgo");
0303         DDName dd_FAl_name_d2(tmp_FAl_name_d2.str(), "esalgo");
0304         DDName dd_FAl_name_d3(tmp_FAl_name_d3.str(), "esalgo");
0305         DDName dd_FAl_name_d(tmp_FAl_name_d.str(), "esalgo");
0306 
0307         if (L == 0)
0308           bdx = std::abs(abs1stx[K]) / 2;
0309         if (L > 0)
0310           bdx = std::abs(abs1stx[K] - abs1stx[K - 1]) / 2;
0311         bdy = abs1sty[K];
0312         if (abs1stx[K] < rIn + 30 * cm) {
0313           bdy = abs1sty[K] / 2 - 30 * cm;
0314           cutabsx = K;
0315         }
0316 
0317         if (I == 20) {
0318           if (L == 0)
0319             bdx = std::abs(abs2ndx[K]) / 2;
0320           if (L > 0)
0321             bdx = std::abs(abs2ndx[K] - abs2ndx[K - 1]) / 2;
0322           bdy = abs2ndy[K];
0323         }
0324 
0325         if ((abs2ndx[K] < rIn + 30 * cm) && I == 20) {
0326           bdy = abs2ndy[K] / 2 - 30 * cm;
0327           cutabsy = K;
0328         }
0329 
0330         DDSolid solid_b = DDSolidFactory::box(dd_tmp_name_b, bdx, bdy, zHalf);
0331         DDSolid solid_b2 = DDSolidFactory::box(dd_tmp_name_b2, bdx + 0.1 * mm, bdy + 0.1 * mm, zHalf);
0332 #ifdef EDM_ML_DEBUG
0333         edm::LogVerbatim("SFGeomX") << dd_tmp_name_b << " Box " << bdx << ":" << bdy << ":" << zHalf;
0334         edm::LogVerbatim("SFGeomX") << dd_tmp_name_b2 << " Box " << (bdx + 0.1 * mm) << ":" << (bdy + 0.1 * mm) << ":"
0335                                     << zHalf;
0336 #endif
0337 
0338         sdx = abs1stx[K] - bdx;
0339         sdy = 0;
0340         if (abs1stx[K] < rIn + 30 * cm)
0341           sdy = abs1sty[K] - bdy;
0342 
0343         if (I == 20) {
0344           sdx = abs2ndx[K] - bdx;
0345           sdy = 0;
0346         }
0347         if ((abs2ndx[K] < rIn + 30 * cm) && I == 20)
0348           sdy = abs2ndy[K] - bdy;
0349 
0350         DDLogicalPart layer = DDLogicalPart(dd_tmp_name_b, getMaterial(i), solid_b);
0351 
0352         cpv.position(layer, layerFinOutAl, 1, DDTranslation(sdx, sdy, 0), DDRotation());
0353         cpv.position(layer, layerFinOutAl, 2, DDTranslation(-sdx, sdy, 0), DDRotation());
0354 #ifdef EDM_ML_DEBUG
0355         edm::LogVerbatim("SFGeom") << layer.name() << " copy 1 in " << layerFinOutAl.name() << " at "
0356                                    << DDTranslation(sdx, sdy, 0) << " no rotation";
0357         edm::LogVerbatim("SFGeom") << layer.name() << " copy 2 in " << layerFinOutAl.name() << " at "
0358                                    << DDTranslation(-sdx, sdy, 0) << " no rotation";
0359 #endif
0360         DDSolid solid_c = DDSolid(dd_FAl_name_c);
0361         DDSolid solid_d1 =
0362             DDSolidFactory::unionSolid(dd_FAl_name_d1, solid_c, solid_b2, DDTranslation(sdx, sdy, 0), DDRotation());
0363         DDSolid solid_d2 =
0364             DDSolidFactory::unionSolid(dd_FAl_name_d, solid_d1, solid_b2, DDTranslation(-sdx, -sdy, 0), DDRotation());
0365 #ifdef EDM_ML_DEBUG
0366         edm::LogVerbatim("SFGeomX") << dd_FAl_name_d1 << " Union " << solid_c.name() << ":" << solid_b2.name() << " at "
0367                                     << DDTranslation(sdx, sdy, 0) << " no rotation";
0368         edm::LogVerbatim("SFGeomX") << dd_FAl_name_d << " Union " << solid_d1.name() << ":" << solid_b2.name() << " at "
0369                                     << DDTranslation(-sdx, -sdy, 0) << " no rotation";
0370 #endif
0371         if (((abs1stx[K] < rIn + 30 * cm) && I == 10) || ((abs2ndx[K] < rIn + 30 * cm) && I == 20)) {
0372           cpv.position(layer, layerFinOutAl, 3, DDTranslation(sdx, -sdy, 0), DDRotation());
0373           cpv.position(layer, layerFinOutAl, 4, DDTranslation(-sdx, -sdy, 0), DDRotation());
0374 #ifdef EDM_ML_DEBUG
0375           edm::LogVerbatim("SFGeom") << layer.name() << " copy 3 in " << layerFinOutAl.name() << " at "
0376                                      << DDTranslation(sdx, -sdy, 0) << " no rotation";
0377           edm::LogVerbatim("SFGeom") << layer.name() << " copy 4 in " << layerFinOutAl.name() << " at "
0378                                      << DDTranslation(-sdx, -sdy, 0) << " no rotation";
0379 #endif
0380           DDSolid solid_c = DDSolid(dd_FAl_name_c);
0381           DDSolid solid_d1 =
0382               DDSolidFactory::unionSolid(dd_FAl_name_d1, solid_c, solid_b2, DDTranslation(sdx, sdy, 0), DDRotation());
0383           DDSolid solid_d2 =
0384               DDSolidFactory::unionSolid(dd_FAl_name_d2, solid_d1, solid_b2, DDTranslation(sdx, -sdy, 0), DDRotation());
0385           DDSolid solid_d3 =
0386               DDSolidFactory::unionSolid(dd_FAl_name_d3, solid_d2, solid_b2, DDTranslation(-sdx, sdy, 0), DDRotation());
0387           DDSolid solid_d4 =
0388               DDSolidFactory::unionSolid(dd_FAl_name_d, solid_d3, solid_b2, DDTranslation(-sdx, -sdy, 0), DDRotation());
0389 #ifdef EDM_ML_DEBUG
0390           edm::LogVerbatim("SFGeomX") << dd_FAl_name_d1 << " Union " << solid_c.name() << ":" << solid_b2.name()
0391                                       << " at " << DDTranslation(sdx, sdy, 0) << " no rotation";
0392           edm::LogVerbatim("SFGeomX") << dd_FAl_name_d2 << " Union " << solid_d1.name() << ":" << solid_b2.name()
0393                                       << " at " << DDTranslation(sdx, -sdy, 0) << " no rotation";
0394           edm::LogVerbatim("SFGeomX") << dd_FAl_name_d3 << " Union " << solid_d2.name() << ":" << solid_b2.name()
0395                                       << " at " << DDTranslation(-sdx, sdy, 0) << " no rotation";
0396           edm::LogVerbatim("SFGeomX") << dd_FAl_name_d << " Union " << solid_d3.name() << ":" << solid_b2.name()
0397                                       << " at " << DDTranslation(-sdx, -sdy, 0) << " no rotation";
0398 #endif
0399         }
0400       }
0401 
0402       bdx = abs1stx[cutabsx];
0403       if (I == 20)
0404         bdx = abs2ndx[cutabsy];
0405       bdy = 2 * 30 * cm;
0406 
0407       DDSolid solidcut = DDSolidFactory::box(dd_tmp_name_b, bdx, bdy, zHalf);
0408 
0409       DDSolid iner = DDSolidFactory::tubs(dd_tmp_name_c, zHalf + 0.1 * mm, 0, In_rad_Abs_Pb, 0., 360. * deg);
0410 
0411       DDSolid final = DDSolidFactory::subtraction(dd_tmp_name_d, solidcut, iner, DDTranslation(0, 0, 0), DDRotation());
0412 #ifdef EDM_ML_DEBUG
0413       edm::LogVerbatim("SFGeomX") << dd_tmp_name_b << " Box " << bdx << ":" << bdy << ":" << zHalf;
0414       edm::LogVerbatim("SFGeomX") << dd_tmp_name_c << " Tubs " << (zHalf + 0.1 * mm) << ":0:" << In_rad_Abs_Pb
0415                                   << ":0:360";
0416       edm::LogVerbatim("SFGeomX") << dd_tmp_name_d << " Subtraction " << solidcut.name() << ":" << iner.name()
0417                                   << " at (0,0,0) no rotation";
0418 #endif
0419 
0420       DDLogicalPart layer = DDLogicalPart(dd_tmp_name_d, getMaterial(i), final);
0421       cpv.position(layer, parent(), 1, DDTranslation(0, 0, zpos), DDRotation());
0422 #ifdef EDM_ML_DEBUG
0423       edm::LogVerbatim("SFGeom") << layer.name() << " copy 1 in " << parent().name() << " at "
0424                                  << DDTranslation(0, 0, zpos) << " no rotation";
0425 #endif
0426       DDSolid iner_Al =
0427           DDSolidFactory::tubs(dd_tmp_name_e, zHalf, In_rad_Abs_Al, In_rad_Abs_Pb - 0.01 * mm, 0., 360. * deg);
0428 #ifdef EDM_ML_DEBUG
0429       edm::LogVerbatim("SFGeomX") << dd_tmp_name_e << " Tubs " << zHalf << ":" << In_rad_Abs_Al << ":"
0430                                   << (In_rad_Abs_Pb - 0.01 * mm) << ":0:360";
0431 #endif
0432 
0433       DDLogicalPart layerAl = DDLogicalPart(dd_tmp_name_e, getMaterial(i - 1), iner_Al);
0434       cpv.position(layerAl, parent(), 1, DDTranslation(0, 0, zpos), DDRotation());
0435       cpv.position(layerFinOutAl, parent(), 1, DDTranslation(0, 0, zpos), DDRotation());
0436 #ifdef EDM_ML_DEBUG
0437       edm::LogVerbatim("SFGeom") << layerAl.name() << " copy 1 in " << parent().name() << " at "
0438                                  << DDTranslation(0, 0, zpos) << " no rotation";
0439       edm::LogVerbatim("SFGeom") << layerFinOutAl.name() << " copy 1 in " << parent().name() << " at "
0440                                  << DDTranslation(0, 0, zpos) << " no rotation";
0441 #endif
0442     } else {
0443       cpv.position(layer, parent(), 1, DDTranslation(0., 0., zpos), DDRotation());
0444 #ifdef EDM_ML_DEBUG
0445       edm::LogVerbatim("SFGeom") << layer.name() << " copy 1 in " << parent().name() << " at "
0446                                  << DDTranslation(0, 0, zpos) << " no rotation";
0447 #endif
0448     }
0449     zpos += zHalf;
0450   }
0451 }
0452 
0453 void DDEcalPreshowerAlgo::doLadders(DDCompactView& cpv) {
0454   double xpos(0), ypos(0), zpos(0), sdx(0), sdy(0), sdz(0);
0455   double prev_length_(0), ladder_new_length_(0), ladd_shift_(0), ladder_length(0);
0456   int enb(0), swed_scopy_glob(0);
0457   double sdxe[50] = {0}, sdye[50] = {0}, sdze[50] = {0};
0458   double sdxe2[50] = {0}, sdye2[50] = {0}, sdze2[50] = {0}, sdxe3[50] = {0}, sdye3[50] = {0}, sdze3[50] = {0};
0459 
0460   for (int M = 0; M < int(types_l5_.size() + types_l4_.size()); M++) {
0461     int scopy(0);
0462     double boxax(0), boxay(0), boxaz(0);
0463     int ladd_not_plain(0), ladd_subtr_no(0), ladd_upper(0), ladd_side(0);
0464 
0465     DDSolid solid_lfront = DDSolidFactory::trap(DDName("LDRFRNT", "esalgo"),
0466                                                 LdrFrnt_Length / 2,                                          // pDz
0467                                                 -wedge_angle,                                                // pTheta
0468                                                 0,                                                           // pPhi
0469                                                 ladder_width / 2,                                            // pDy1
0470                                                 (ladder_thick) / 2,                                          // pDx1
0471                                                 (ladder_thick) / 2,                                          // pDx2
0472                                                 0,                                                           // pAlp1
0473                                                 ladder_width / 2,                                            // pDy2
0474                                                 (ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2,  // pDx3
0475                                                 (ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2,  // pDx4
0476                                                 0);
0477 
0478     DDSolid solid_lbck = DDSolidFactory::trap(DDName("LDRBCK", "esalgo"),
0479                                               LdrBck_Length / 2,                                   // pDz
0480                                               -wedge_angle,                                        // pTheta
0481                                               0,                                                   // pPhi
0482                                               ladder_width / 2,                                    // pDy1
0483                                               (box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2,  // pDx1
0484                                               (box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2,  // pDx2
0485                                               0,                                                   // pAlp1
0486                                               ladder_width / 2,                                    // pDy2
0487                                               (ladder_thick - wedge_back_thick) / 2,               // pDx3
0488                                               (ladder_thick - wedge_back_thick) / 2,               // pDx4
0489                                               0);
0490 
0491     DDSolid solid_lfhalf = DDSolidFactory::trap(DDName("LDRFHALF", "esalgo"),
0492                                                 LdrFrnt_Length / 2,                                          // pDz
0493                                                 -wedge_angle,                                                // pTheta
0494                                                 0,                                                           // pPhi
0495                                                 (ladder_width / 2) / 2,                                      // pDy1
0496                                                 (ladder_thick) / 2,                                          // pDx1
0497                                                 (ladder_thick) / 2,                                          // pDx2
0498                                                 0,                                                           // pAlp1
0499                                                 (ladder_width / 2) / 2,                                      // pDy2
0500                                                 (ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2,  // pDx3
0501                                                 (ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2,  // pDx4
0502                                                 0);
0503 
0504     DDSolid solid_lbhalf = DDSolidFactory::trap(DDName("LDRBHALF", "esalgo"),
0505                                                 LdrBck_Length / 2,                                   // pDz
0506                                                 -wedge_angle,                                        // pTheta
0507                                                 0,                                                   // pPhi
0508                                                 (ladder_width / 2) / 2,                              // pDy1
0509                                                 (box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2,  // pDx1
0510                                                 (box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2,  // pDx2
0511                                                 0,                                                   // pAlp1
0512                                                 (ladder_width / 2) / 2,                              // pDy2
0513                                                 (ladder_thick - wedge_back_thick) / 2,               // pDx3
0514                                                 (ladder_thick - wedge_back_thick) / 2,               // pDx4
0515                                                 0);
0516 
0517     DDSolid solid_lfhtrunc =
0518         DDSolidFactory::trap(DDName("LDRFHTR", "esalgo"),
0519                              (LdrFrnt_Length - waf_active) / 2,                                          // pDz
0520                              -wedge_angle,                                                               // pTheta
0521                              0,                                                                          // pPhi
0522                              (ladder_width / 2) / 2,                                                     // pDy1
0523                              (ladder_thick) / 2,                                                         // pDx1
0524                              (ladder_thick) / 2,                                                         // pDx2
0525                              0,                                                                          // pAlp1
0526                              (ladder_width / 2) / 2,                                                     // pDy2
0527                              (ladder_thick - (ceramic_length - waf_active) * sin(wedge_angle * 2)) / 2,  // pDx3
0528                              (ladder_thick - (ceramic_length - waf_active) * sin(wedge_angle * 2)) / 2,  // pDx4
0529                              0);
0530 #ifdef EDM_ML_DEBUG
0531     edm::LogVerbatim("SFGeomX") << DDName("LDRFRNT", "esalgo") << " Trap " << (LdrFrnt_Length / 2) << ":"
0532                                 << -wedge_angle / CLHEP::deg << ":0:" << (ladder_width / 2) << ":" << (ladder_thick / 2)
0533                                 << ":" << (ladder_thick / 2) << ":0:" << (ladder_width / 2) << ":"
0534                                 << ((ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2) << ":"
0535                                 << ((ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2) << ":0";
0536     edm::LogVerbatim("SFGeomX") << DDName("LDRBCK", "esalgo") << " Trap " << (LdrBck_Length / 2) << ":"
0537                                 << -wedge_angle / CLHEP::deg << ":0:" << (ladder_width / 2) << ":"
0538                                 << ((box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2) << ":"
0539                                 << ((box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2) << ":0:" << (ladder_width / 2)
0540                                 << ":" << ((ladder_thick - wedge_back_thick) / 2) << ":"
0541                                 << ((ladder_thick - wedge_back_thick) / 2) << ":0";
0542     edm::LogVerbatim("SFGeomX") << DDName("LDRFHALF", "esalgo") << " Trap " << (LdrFrnt_Length / 2) << ":"
0543                                 << -wedge_angle / CLHEP::deg << ":0:" << ((ladder_width / 2) / 2) << ":"
0544                                 << (ladder_thick / 2) << ":" << (ladder_thick / 2) << ":0:" << ((ladder_width / 2) / 2)
0545                                 << ":" << ((ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2) << ":"
0546                                 << ((ladder_thick - ceramic_length * sin(wedge_angle * 2)) / 2) << ":0";
0547     edm::LogVerbatim("SFGeomX") << DDName("LDRBHALF", "esalgo") << " Trap " << (LdrBck_Length / 2) << ":"
0548                                 << -wedge_angle / CLHEP::deg << ":0:" << ((ladder_width / 2) / 2) << ":"
0549                                 << ((box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2) << ":"
0550                                 << ((box_thick / cos(wedge_angle * 2) + 0.02 * mm) / 2)
0551                                 << ":0:" << ((ladder_width / 2) / 2) << ":" << ((ladder_thick - wedge_back_thick) / 2)
0552                                 << ":" << ((ladder_thick - wedge_back_thick) / 2) << ":0";
0553     edm::LogVerbatim("SFGeomX") << DDName("LDRFHTR", "esalgo") << " Trap " << ((LdrFrnt_Length - waf_active) / 2) << ":"
0554                                 << -wedge_angle / CLHEP::deg << ":0:" << ((ladder_width / 2) / 2) << ":"
0555                                 << ((ladder_thick) / 2) << ":" << ((ladder_thick) / 2)
0556                                 << ":0:" << ((ladder_width / 2) / 2) << ":"
0557                                 << ((ladder_thick - (ceramic_length - waf_active) * sin(wedge_angle * 2)) / 2) << ":"
0558                                 << ((ladder_thick - (ceramic_length - waf_active) * sin(wedge_angle * 2)) / 2) << ":0";
0559 #endif
0560 
0561     // Creation of ladders with 5 micromodules length
0562 
0563     if (M < int(types_l5_.size())) {
0564       for (int i = 0; i <= 1; i++) {
0565         for (int j = 0; j <= 3; j++) {
0566           if (ladd_l5_map_[(i + j * 2 + M * 10)] != 1) {
0567             ladd_not_plain = 1;
0568             ladd_subtr_no++;
0569             if (j > 1)
0570               ladd_upper = 1;
0571             ladd_side = i;
0572           }
0573         }
0574       }
0575 #ifdef EDM_ML_DEBUG
0576       edm::LogVerbatim("SFGeomX") << "Side " << ladd_side << ":" << ladd_upper << ":" << ladd_subtr_no << ":"
0577                                   << ladd_not_plain << " Index " << M << ":" << types_l5_.size();
0578 #endif
0579       DDName ddname(getLadPrefix(0) + types_l5_[M], "esalgo");
0580       ladder_length = micromodule_length + 4 * waf_active + 0.1 * mm;
0581 
0582       if (ladd_not_plain) {
0583         //          enb++;
0584         std::ostringstream tmp_name_5b, tmp_name_5c, tmp_name_5d;
0585         if (ladd_upper) {
0586         }  //upper
0587         else {
0588           enb++;
0589           std::ostringstream tmp_name_5b, tmp_name_5c, tmp_name_5d;
0590           DDName dd_tmp_name_5a(getLadPrefix(2), "esalgo");
0591           tmp_name_5b << getLadPrefix(3) << enb;
0592           DDName dd_tmp_name_5b(tmp_name_5b.str(), "esalgo");
0593           tmp_name_5c << getLadPrefix(4) << enb;
0594           DDName dd_tmp_name_5c(tmp_name_5c.str(), "esalgo");
0595           tmp_name_5d << getLadPrefix(5) << enb;
0596           DDName dd_tmp_name_5d(tmp_name_5d.str(), "esalgo");
0597 
0598           DDName dd_tmp_name_5e(getLadPrefix(6), "esalgo");
0599 
0600           boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0601           boxax = ladder_width;
0602           boxaz = ladder_thick;
0603 
0604           DDSolid solid_5a = DDSolidFactory::box(dd_tmp_name_5a, boxax / 2, boxay / 2, boxaz / 2.);
0605 #ifdef EDM_ML_DEBUG
0606           edm::LogVerbatim("SFGeomX") << dd_tmp_name_5a << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0607                                       << (boxaz / 2);
0608 #endif
0609           if (ladd_side == 0)
0610             sdxe[enb] = ladder_width / 4;
0611           sdye[enb] = -boxay / 2 - LdrFrnt_Length / 2;
0612           sdze[enb] = -ladder_thick / 2. + LdrFrnt_Offset;
0613           if (ladd_side == 1)
0614             sdxe[enb] = -ladder_width / 4;
0615 
0616           DDSolid solid_5b = DDSolidFactory::unionSolid(dd_tmp_name_5b,
0617                                                         solid_5a,
0618                                                         solid_lfhalf,
0619                                                         DDTranslation(sdxe[enb], sdye[enb], sdze[enb]),
0620                                                         DDRotation("esalgo:RM1299"));
0621 #ifdef EDM_ML_DEBUG
0622           edm::LogVerbatim("SFGeomX") << dd_tmp_name_5b << " Union " << solid_5a.name() << ":" << solid_lfhalf.name()
0623                                       << " at " << DDTranslation(sdxe[enb], sdye[enb], sdze[enb])
0624                                       << " rotation esalgo:RM1299";
0625 #endif
0626 
0627           if (ladd_side == 0)
0628             sdxe2[enb] = -ladder_width / 4;
0629           sdye2[enb] = -boxay / 2 - LdrFrnt_Length / 2 + waf_active / 2;
0630           sdze2[enb] = -ladder_thick / 2. + LdrFrnt_Offset + (waf_active * sin(wedge_angle * 2)) / 4;
0631           if (ladd_side == 1)
0632             sdxe2[enb] = ladder_width / 4;
0633 
0634           DDSolid solid_5c = DDSolidFactory::unionSolid(dd_tmp_name_5c,
0635                                                         solid_5b,
0636                                                         solid_lfhtrunc,
0637                                                         DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb]),
0638                                                         DDRotation("esalgo:RM1299"));
0639 #ifdef EDM_ML_DEBUG
0640           edm::LogVerbatim("SFGeomX") << dd_tmp_name_5c << " Union " << solid_5b.name() << ":" << solid_lfhtrunc.name()
0641                                       << " at " << DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb])
0642                                       << " rotation esalgo:RM1299";
0643 #endif
0644 
0645           sdxe3[enb] = 0;
0646           sdye3[enb] = boxay / 2 + LdrBck_Length / 2;
0647           sdze3[enb] = -ladder_thick / 2. + LdrBck_Offset;
0648           DDSolid solid = DDSolidFactory::unionSolid(ddname,
0649                                                      solid_5c,
0650                                                      solid_lbck,
0651                                                      DDTranslation(sdxe3[enb], sdye3[enb], sdze3[enb]),
0652                                                      DDRotation("esalgo:RM1299"));
0653 #ifdef EDM_ML_DEBUG
0654           edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_5c.name() << ":" << solid_lbck.name() << " at "
0655                                       << DDTranslation(sdxe3[enb], sdye3[enb], sdze3[enb]) << " rotation esalgo:RM1299";
0656 #endif
0657 
0658           DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0659           DDName ddname2(getLadPrefix(1) + types_l5_[M], "esalgo");
0660           DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0661         }
0662 
0663       }  //end of not plain ladder shape
0664       else {
0665         DDName dd_tmp_name_5pa(getLadPrefix(2) + "5p", "esalgo");
0666         DDName dd_tmp_name_5pb(getLadPrefix(3) + "5p", "esalgo");
0667 
0668         boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0669         boxax = ladder_width;
0670         boxaz = ladder_thick;
0671 
0672         DDSolid solid_5pa = DDSolidFactory::box(dd_tmp_name_5pa, boxax / 2, boxay / 2, boxaz / 2.);
0673 #ifdef EDM_ML_DEBUG
0674         edm::LogVerbatim("SFGeomX") << dd_tmp_name_5pa << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0675                                     << (boxaz / 2);
0676 #endif
0677         sdx = 0;
0678         sdy = -boxay / 2 - LdrFrnt_Length / 2;
0679         sdz = -ladder_thick / 2. + LdrFrnt_Offset;
0680 
0681         DDSolid solid_5pb = DDSolidFactory::unionSolid(
0682             dd_tmp_name_5pb, solid_5pa, solid_lfront, DDTranslation(sdx, sdy, sdz), DDRotation("esalgo:RM1299"));
0683 #ifdef EDM_ML_DEBUG
0684         edm::LogVerbatim("SFGeomX") << dd_tmp_name_5pb << " Union " << solid_5pa.name() << ":" << solid_lfront.name()
0685                                     << " at " << DDTranslation(sdx, sdy, sdz) << " rotation esalgo:RM1299";
0686 #endif
0687 
0688         sdx = 0;
0689         sdy = boxay / 2 + LdrBck_Length / 2;
0690         sdz = -ladder_thick / 2. + LdrBck_Offset;
0691 
0692         DDSolid solid = DDSolidFactory::unionSolid(
0693             ddname, solid_5pb, solid_lbck, DDTranslation(sdx, sdy, sdz), DDRotation("esalgo:RM1299"));
0694 #ifdef EDM_ML_DEBUG
0695         edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_5pb.name() << ":" << solid_lbck.name() << " at "
0696                                     << DDTranslation(sdx, sdy, sdz) << " rotation esalgo:RM1299";
0697 #endif
0698 
0699         DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0700         DDName ddname2(getLadPrefix(1) + types_l5_[M], "esalgo");
0701         DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0702       }
0703     }
0704 
0705     // Creation of ladders with 4 micromodules length
0706 
0707     if (M >= int(types_l5_.size())) {
0708       int d = M - types_l5_.size();
0709 
0710       for (int i = 0; i <= 1; i++) {
0711         for (int j = 0; j <= 3; j++) {
0712           if (ladd_l4_map_[(i + j * 2 + (M - types_l5_.size()) * 8)] != 1) {
0713             ladd_not_plain = 1;
0714             ladd_subtr_no++;
0715             if (j > 1)
0716               ladd_upper = 1;
0717             ladd_side = i;
0718           }
0719         }
0720       }
0721 #ifdef EDM_ML_DEBUG
0722       edm::LogVerbatim("SFGeomX") << "Side " << ladd_side << ":" << ladd_upper << ":" << ladd_subtr_no << ":"
0723                                   << ladd_not_plain << " Index " << M << ":" << types_l5_.size();
0724 #endif
0725       DDName ddname(getLadPrefix(0) + types_l4_[d], "esalgo");
0726       ladder_length = micromodule_length + 3 * waf_active + 0.1 * mm;
0727 
0728       if (ladd_not_plain) {
0729         std::ostringstream tmp_name_b, tmp_name_c, tmp_name_d;
0730         if (ladd_upper) {
0731           enb++;
0732 
0733           DDName dd_tmp_name_a(getLadPrefix(7), "esalgo");
0734           tmp_name_b << getLadPrefix(8) << enb;
0735           DDName dd_tmp_name_b(tmp_name_b.str(), "esalgo");
0736           tmp_name_c << getLadPrefix(9) << enb;
0737           DDName dd_tmp_name_c(tmp_name_c.str(), "esalgo");
0738           tmp_name_d << getLadPrefix(10) << enb;
0739           DDName dd_tmp_name_d(tmp_name_d.str(), "esalgo");
0740           DDName dd_tmp_name_e(getLadPrefix(11), "esalgo");
0741 
0742           boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0743           boxax = ladder_width;
0744           boxaz = ladder_thick;
0745           DDSolid solid_a = DDSolidFactory::box(dd_tmp_name_a, boxax / 2, boxay / 2, boxaz / 2.);
0746 #ifdef EDM_ML_DEBUG
0747           edm::LogVerbatim("SFGeomX") << dd_tmp_name_a << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0748                                       << (boxaz / 2);
0749 #endif
0750 
0751           sdxe[enb] = 0;
0752           sdye[enb] = -boxay / 2 - LdrFrnt_Length / 2;
0753           sdze[enb] = -ladder_thick / 2. + LdrFrnt_Offset;
0754           DDSolid solid_b = DDSolidFactory::unionSolid(dd_tmp_name_b,
0755                                                        solid_a,
0756                                                        solid_lfront,
0757                                                        DDTranslation(sdxe[enb], sdye[enb], sdze[enb]),
0758                                                        DDRotation("esalgo:RM1299"));
0759 #ifdef EDM_ML_DEBUG
0760           edm::LogVerbatim("SFGeomX") << dd_tmp_name_b << " Union " << solid_a.name() << ":" << solid_lfront.name()
0761                                       << " at " << DDTranslation(sdxe[enb], sdye[enb], sdze[enb])
0762                                       << " rotation esalgo:RM1299";
0763 #endif
0764 
0765           if (ladd_side == 0)
0766             sdxe2[enb] = ladder_width / 4;
0767           sdye2[enb] = boxay / 2 + LdrBck_Length / 2;
0768           sdze2[enb] = -ladder_thick / 2. + LdrBck_Offset;
0769           if (ladd_side == 1)
0770             sdxe2[enb] = -ladder_width / 4;
0771           DDSolid solid = DDSolidFactory::unionSolid(ddname,
0772                                                      solid_b,
0773                                                      solid_lbhalf,
0774                                                      DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb]),
0775                                                      DDRotation("esalgo:RM1299"));
0776 #ifdef EDM_ML_DEBUG
0777           edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_b.name() << ":" << solid_lbhalf.name() << " at "
0778                                       << DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb]) << " rotation esalgo:RM1299";
0779 #endif
0780 
0781           DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0782           DDName ddname2(getLadPrefix(1) + types_l4_[d], "esalgo");
0783           DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0784 
0785         }  //upper
0786         else {
0787           if (ladd_subtr_no > 1) {
0788             enb++;
0789 
0790             DDName dd_tmp_name_a(getLadPrefix(7), "esalgo");
0791             tmp_name_b << getLadPrefix(8) << enb;
0792             DDName dd_tmp_name_b(tmp_name_b.str(), "esalgo");
0793             tmp_name_c << getLadPrefix(9) << enb;
0794             DDName dd_tmp_name_c(tmp_name_c.str(), "esalgo");
0795             tmp_name_d << getLadPrefix(10) << enb;
0796             DDName dd_tmp_name_d(tmp_name_d.str(), "esalgo");
0797             DDName dd_tmp_name_e(getLadPrefix(11), "esalgo");
0798 
0799             boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0800             boxax = ladder_width;
0801             boxaz = ladder_thick;
0802 
0803             DDSolid solid_a = DDSolidFactory::box(dd_tmp_name_a, boxax / 2, boxay / 2, boxaz / 2.);
0804 #ifdef EDM_ML_DEBUG
0805             edm::LogVerbatim("SFGeomX") << dd_tmp_name_a << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0806                                         << (boxaz / 2);
0807 #endif
0808             if (ladd_side == 0)
0809               sdxe[enb] = ladder_width / 4;
0810             sdye[enb] = -boxay / 2 - LdrFrnt_Length / 2;
0811             sdze[enb] = -ladder_thick / 2. + LdrFrnt_Offset;
0812             if (ladd_side == 1)
0813               sdxe[enb] = -ladder_width / 4;
0814 
0815             DDSolid solid_b = DDSolidFactory::unionSolid(dd_tmp_name_b,
0816                                                          solid_a,
0817                                                          solid_lfhalf,
0818                                                          DDTranslation(sdxe[enb], sdye[enb], sdze[enb]),
0819                                                          DDRotation("esalgo:RM1299"));
0820 #ifdef EDM_ML_DEBUG
0821             edm::LogVerbatim("SFGeomX") << dd_tmp_name_b << " Union " << solid_a.name() << ":" << solid_lfhalf.name()
0822                                         << " at " << DDTranslation(sdxe[enb], sdye[enb], sdze[enb])
0823                                         << " rotation esalgo:RM1299";
0824 #endif
0825 
0826             sdxe2[enb] = 0;
0827             sdye2[enb] = boxay / 2 + LdrBck_Length / 2;
0828             sdze2[enb] = -ladder_thick / 2. + LdrBck_Offset;
0829 
0830             DDSolid solid = DDSolidFactory::unionSolid(ddname,
0831                                                        solid_b,
0832                                                        solid_lbck,
0833                                                        DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb]),
0834                                                        DDRotation("esalgo:RM1299"));
0835 #ifdef EDM_ML_DEBUG
0836             edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_b.name() << ":" << solid_lbck.name() << " at "
0837                                         << DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb])
0838                                         << " rotation esalgo:RM1299";
0839 #endif
0840 
0841             DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0842             DDName ddname2(getLadPrefix(1) + types_l4_[d], "esalgo");
0843             DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0844           } else {
0845             enb++;
0846             DDName dd_tmp_name_a(getLadPrefix(7), "esalgo");
0847             tmp_name_b << getLadPrefix(8) << enb;
0848             DDName dd_tmp_name_b(tmp_name_b.str(), "esalgo");
0849             tmp_name_c << getLadPrefix(9) << enb;
0850             DDName dd_tmp_name_c(tmp_name_c.str(), "esalgo");
0851             tmp_name_d << getLadPrefix(10) << enb;
0852             DDName dd_tmp_name_d(tmp_name_d.str(), "esalgo");
0853             DDName dd_tmp_name_e(getLadPrefix(11), "esalgo");
0854 
0855             boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0856             boxax = ladder_width;
0857             boxaz = ladder_thick;
0858             DDSolid solid_a = DDSolidFactory::box(dd_tmp_name_a, boxax / 2, boxay / 2, boxaz / 2.);
0859 #ifdef EDM_ML_DEBUG
0860             edm::LogVerbatim("SFGeomX") << dd_tmp_name_a << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0861                                         << (boxaz / 2);
0862 #endif
0863             if (ladd_side == 0)
0864               sdxe[enb] = ladder_width / 4;
0865             sdye[enb] = -boxay / 2 - LdrFrnt_Length / 2;
0866             sdze[enb] = -ladder_thick / 2. + LdrFrnt_Offset;
0867             if (ladd_side == 1)
0868               sdxe[enb] = -ladder_width / 4;
0869 
0870             DDSolid solid_b = DDSolidFactory::unionSolid(dd_tmp_name_b,
0871                                                          solid_a,
0872                                                          solid_lfhalf,
0873                                                          DDTranslation(sdxe[enb], sdye[enb], sdze[enb]),
0874                                                          DDRotation("esalgo:RM1299"));
0875 #ifdef EDM_ML_DEBUG
0876             edm::LogVerbatim("SFGeomX") << dd_tmp_name_b << " Union " << solid_a.name() << ":" << solid_lfhalf.name()
0877                                         << " at " << DDTranslation(sdxe[enb], sdye[enb], sdze[enb])
0878                                         << " rotation esalgo:RM1299";
0879 #endif
0880 
0881             if (ladd_side == 0)
0882               sdxe2[enb] = -ladder_width / 4;
0883             sdye2[enb] = -boxay / 2 - LdrFrnt_Length / 2 + waf_active / 2;
0884             sdze2[enb] = -ladder_thick / 2. + LdrFrnt_Offset + (waf_active * sin(wedge_angle * 2)) / 4;
0885             if (ladd_side == 1)
0886               sdxe2[enb] = ladder_width / 4;
0887 
0888             DDSolid solid_c = DDSolidFactory::unionSolid(dd_tmp_name_c,
0889                                                          solid_b,
0890                                                          solid_lfhtrunc,
0891                                                          DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb]),
0892                                                          DDRotation("esalgo:RM1299"));
0893 #ifdef EDM_ML_DEBUG
0894             edm::LogVerbatim("SFGeomX") << dd_tmp_name_c << " Union " << solid_b.name() << ":" << solid_lfhtrunc.name()
0895                                         << " at " << DDTranslation(sdxe2[enb], sdye2[enb], sdze2[enb])
0896                                         << " rotation esalgo:RM1299";
0897 #endif
0898 
0899             sdxe3[enb] = 0;
0900             sdye3[enb] = boxay / 2 + LdrBck_Length / 2;
0901             sdze3[enb] = -ladder_thick / 2. + LdrBck_Offset;
0902             DDSolid solid = DDSolidFactory::unionSolid(ddname,
0903                                                        solid_c,
0904                                                        solid_lbck,
0905                                                        DDTranslation(sdxe3[enb], sdye3[enb], sdze3[enb]),
0906                                                        DDRotation("esalgo:RM1299"));
0907 #ifdef EDM_ML_DEBUG
0908             edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_c.name() << ":" << solid_lbck.name() << " at "
0909                                         << DDTranslation(sdxe3[enb], sdye3[enb], sdze3[enb])
0910                                         << " rotation esalgo:RM1299";
0911 #endif
0912 
0913             DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0914             DDName ddname2(getLadPrefix(1) + types_l4_[d], "esalgo");
0915             DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0916           }
0917         }
0918 
0919       }  //end of not plain ladder shape
0920       else {
0921         DDName dd_tmp_name_pa(getLadPrefix(2) + "p", "esalgo");
0922         DDName dd_tmp_name_pb(getLadPrefix(3) + "p", "esalgo");
0923 
0924         boxay = ladder_length - LdrFrnt_Length - LdrBck_Length;
0925         boxax = ladder_width;
0926         boxaz = ladder_thick;
0927 
0928         DDSolid solid_pa = DDSolidFactory::box(dd_tmp_name_pa, boxax / 2, boxay / 2, boxaz / 2.);
0929 #ifdef EDM_ML_DEBUG
0930         edm::LogVerbatim("SFGeomX") << dd_tmp_name_pa << " Box " << (boxax / 2) << ":" << (boxay / 2) << ":"
0931                                     << (boxaz / 2);
0932 #endif
0933         sdx = 0;
0934         sdy = -boxay / 2 - LdrFrnt_Length / 2;
0935         sdz = -ladder_thick / 2. + LdrFrnt_Offset;
0936 
0937         DDSolid solid_pb = DDSolidFactory::unionSolid(
0938             dd_tmp_name_pb, solid_pa, solid_lfront, DDTranslation(sdx, sdy, sdz), DDRotation("esalgo:RM1299"));
0939 #ifdef EDM_ML_DEBUG
0940         edm::LogVerbatim("SFGeomX") << dd_tmp_name_pb << " Union " << solid_pa.name() << ":" << solid_lfront.name()
0941                                     << " at " << DDTranslation(sdx, sdy, sdz) << " rotation esalgo:RM1299";
0942 #endif
0943 
0944         sdx = 0;
0945         sdy = boxay / 2 + LdrBck_Length / 2;
0946         sdz = -ladder_thick / 2. + LdrBck_Offset;
0947         DDSolid solid = DDSolidFactory::unionSolid(
0948             ddname, solid_pb, solid_lbck, DDTranslation(sdx, sdy, sdz), DDRotation("esalgo:RM1299"));
0949 #ifdef EDM_ML_DEBUG
0950         edm::LogVerbatim("SFGeomX") << ddname << " Union " << solid_pb.name() << ":" << solid_lbck.name() << " at "
0951                                     << DDTranslation(sdx, sdy, sdz) << " rotation esalgo:RM1299";
0952 #endif
0953         DDLogicalPart ladder = DDLogicalPart(ddname, getLaddMaterial(), solid);
0954         DDName ddname2(getLadPrefix(1) + types_l4_[d], "esalgo");
0955         DDLogicalPart ladder2 = DDLogicalPart(ddname2, getLaddMaterial(), solid);
0956       }
0957     }
0958 
0959     // insert SWED, SFBX and SFBY into ladders
0960     swed_scopy_glob++;
0961     if (M < int(types_l5_.size())) {
0962       DDName ddname(getLadPrefix(0) + types_l5_[M], "esalgo");
0963       DDName ddname2(getLadPrefix(1) + types_l5_[M], "esalgo");
0964       for (int i = 0; i <= 1; i++) {
0965         for (int j = 0; j <= 4; j++) {
0966           xpos = (i * 2 - 1) * waf_intra_col_sep / 2.;
0967           ypos = -ladder_length / 2. + 0.05 * mm - (LdrFrnt_Length - LdrBck_Length) / 2 + wedge_length / 2. +
0968                  j * waf_active;
0969           zpos = -ladder_thick / 2. + 0.005 * mm + wedge_offset;
0970           if (ladd_l5_map_[(i + j * 2 + M * 10)] == 1) {
0971             scopy++;
0972             cpv.position(DDLogicalPart("esalgo:SWED"),
0973                          ddname,
0974                          scopy + 1000 * swed_scopy_glob,
0975                          DDTranslation(xpos, ypos, zpos),
0976                          DDRotation("esalgo:RM1299"));
0977             cpv.position(DDLogicalPart("esalgo:SWED"),
0978                          ddname2,
0979                          scopy + 1000 * swed_scopy_glob + 100,
0980                          DDTranslation(xpos, ypos, zpos),
0981                          DDRotation("esalgo:RM1299"));
0982 #ifdef EDM_ML_DEBUG
0983             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SWED").name() << " copy "
0984                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname << " at "
0985                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1299";
0986             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SWED").name() << " copy "
0987                                        << (scopy + 1000 * swed_scopy_glob + 100) << " in " << ddname2 << " at "
0988                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1299";
0989 #endif
0990             ypos = ypos + ywedge_ceramic_diff;
0991             zpos = -ladder_thick / 2. + 0.005 * mm + zwedge_ceramic_diff;
0992             cpv.position(DDLogicalPart("esalgo:SFBX"),
0993                          ddname,
0994                          scopy + 1000 * swed_scopy_glob,
0995                          DDTranslation(xpos, ypos, zpos),
0996                          DDRotation("esalgo:RM1298"));
0997             cpv.position(DDLogicalPart("esalgo:SFBY"),
0998                          ddname2,
0999                          scopy + 1000 * swed_scopy_glob,
1000                          DDTranslation(xpos, ypos, zpos),
1001                          DDRotation("esalgo:RM1300A"));
1002 #ifdef EDM_ML_DEBUG
1003             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFBX").name() << " copy "
1004                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname << " at "
1005                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1298";
1006             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFBY").name() << " copy "
1007                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname2 << " at "
1008                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1300A";
1009 #endif
1010           }
1011         }
1012       }
1013     } else {
1014       int d = M - types_l5_.size();
1015       DDName ddname(getLadPrefix(0) + types_l4_[d], "esalgo");
1016       DDName ddname2(getLadPrefix(1) + types_l4_[d], "esalgo");
1017       for (int i = 0; i <= 1; i++) {
1018         for (int j = 0; j <= 3; j++) {
1019           xpos = (i * 2 - 1) * waf_intra_col_sep / 2.;
1020           ypos = -ladder_length / 2. + 0.05 * mm - (LdrFrnt_Length - LdrBck_Length) / 2 + wedge_length / 2. +
1021                  j * waf_active;
1022           zpos = -ladder_thick / 2. + 0.005 * mm + wedge_offset;
1023           if (ladd_l4_map_[(i + j * 2 + (M - types_l5_.size()) * 8)] == 1) {
1024             scopy++;
1025             cpv.position(DDLogicalPart("esalgo:SWED"),
1026                          ddname,
1027                          scopy + 1000 * swed_scopy_glob,
1028                          DDTranslation(xpos, ypos, zpos),
1029                          DDRotation("esalgo:RM1299"));
1030             cpv.position(DDLogicalPart("esalgo:SWED"),
1031                          ddname2,
1032                          scopy + 1000 * swed_scopy_glob + 100,
1033                          DDTranslation(xpos, ypos, zpos),
1034                          DDRotation("esalgo:RM1299"));
1035 #ifdef EDM_ML_DEBUG
1036             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SWED").name() << " copy "
1037                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname << " at "
1038                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1299";
1039             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SWED").name() << " copy "
1040                                        << (scopy + 1000 * swed_scopy_glob + 100) << " in " << ddname2 << " at "
1041                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1299";
1042 #endif
1043             ypos = ypos + ywedge_ceramic_diff;
1044             zpos = -ladder_thick / 2. + 0.005 * mm + zwedge_ceramic_diff;
1045             cpv.position(DDLogicalPart("esalgo:SFBX"),
1046                          ddname,
1047                          scopy + 1000 * swed_scopy_glob,
1048                          DDTranslation(xpos, ypos, zpos),
1049                          DDRotation("esalgo:RM1298"));
1050             cpv.position(DDLogicalPart("esalgo:SFBY"),
1051                          ddname2,
1052                          scopy + 1000 * swed_scopy_glob,
1053                          DDTranslation(xpos, ypos, zpos),
1054                          DDRotation("esalgo:RM1300A"));
1055 #ifdef EDM_ML_DEBUG
1056             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFBX").name() << " copy "
1057                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname << " at "
1058                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1298";
1059             edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFBY").name() << " copy "
1060                                        << (scopy + 1000 * swed_scopy_glob) << " in " << ddname2 << " at "
1061                                        << DDTranslation(xpos, ypos, zpos) << " rotation esalgo:RM1300A";
1062 #endif
1063           }
1064         }
1065       }
1066     }
1067   }
1068 
1069   // Positioning of ladders
1070 
1071   std::string type;
1072   int icopy[100] = {0};
1073 
1074   for (int I = -9; I <= 9; ++I) {
1075     prev_length_ = 0;
1076     int J = std::abs(I);
1077     for (int K = 0; K < noLaddInCol_[J]; K++) {
1078       std::string type;
1079 
1080       ladder_new_length_ = micromodule_length + 3 * waf_active;
1081       ladd_shift_ = 4 * waf_active;
1082 
1083       if (K == 0)
1084         type = typeOfLaddRow0[J];
1085       if (K == 1)
1086         type = typeOfLaddRow1[J];
1087       if (K == 2)
1088         type = typeOfLaddRow2[J];
1089       if (K == 3)
1090         type = typeOfLaddRow3[J];
1091 
1092       for (const auto& i : types_l5_)
1093         if (type == i) {
1094           ladder_new_length_ = micromodule_length + 4 * waf_active;
1095           ladd_shift_ = 5 * waf_active;
1096         }
1097 
1098       int j = 0;
1099 
1100       for (int t = 0; t < int(types_l5_.size()); t++)
1101         if (type == types_l5_[t]) {
1102           j = t;
1103           if (I < 0 && asym_ladd_[t] == 1) {
1104             j = j + 1;
1105             type = types_l5_[j];
1106           }
1107         }
1108       for (int t = 0; t < int(types_l4_.size()); t++)
1109         if (type == types_l4_[t]) {
1110           j = t + types_l5_.size();
1111           if (I < 0 && asym_ladd_[(t + types_l5_.size())] == 1) {
1112             j = j + 1;
1113             type = types_l4_[j - types_l5_.size()];
1114           }
1115         }
1116 
1117       xpos = I * (2 * waf_intra_col_sep + waf_inter_col_sep);
1118       if (I > 0)
1119         xpos = xpos + dee_separation;
1120       if (I < 0)
1121         xpos = xpos - dee_separation;
1122 
1123       int sz = 20;
1124       ypos = (sz - int(startOfFirstLadd_[J])) * waf_active - ladder_new_length_ / 2. +
1125              (LdrFrnt_Length - LdrBck_Length) / 2 + micromodule_length + 0.05 * cm - prev_length_;
1126 
1127       prev_length_ += ladd_shift_;
1128 
1129       zpos = zlead1_ + ladder_thick / 2. + 0.01 * mm;
1130       icopy[j] += 1;
1131       DDName ddname(getLadPrefix(0) + type, "esalgo");
1132 
1133       cpv.position(
1134           DDLogicalPart(ddname), DDName("SF", "esalgo"), icopy[j], DDTranslation(xpos, ypos, zpos), DDRotation());
1135 #ifdef EDM_ML_DEBUG
1136       edm::LogVerbatim("SFGeom") << DDLogicalPart(ddname).name() << " copy " << icopy[j] << " in "
1137                                  << DDName("SF", "esalgo") << " at " << DDTranslation(xpos, ypos, zpos)
1138                                  << " no rotation";
1139 #endif
1140       DDName ddname2(getLadPrefix(1) + type, "esalgo");
1141 
1142       xpos = I * (2 * waf_intra_col_sep + waf_inter_col_sep);
1143 
1144       cpv.position(DDLogicalPart(ddname2),
1145                    DDName("SF", "esalgo"),
1146                    icopy[j],
1147                    DDTranslation(ypos, -xpos, zpos - zlead1_ + zlead2_),
1148                    DDRotation("esalgo:R270"));
1149 #ifdef EDM_ML_DEBUG
1150       edm::LogVerbatim("SFGeom") << DDLogicalPart(ddname2).name() << " copy " << icopy[j] << " in "
1151                                  << DDName("SF", "esalgo") << " at "
1152                                  << DDTranslation(ypos, -xpos, zpos - zlead1_ + zlead2_) << " rotation esalgo:R270";
1153 #endif
1154       int changed = 0;
1155       for (int t = 0; t < int(types_l5_.size()); t++)
1156         if (type == types_l5_[t]) {
1157           j = t;
1158           if (asym_ladd_[t] == 2 && !changed) {
1159             j = j - 1;
1160             changed = 1;
1161           }
1162           if (asym_ladd_[t] == 1 && !changed) {
1163             j = j + 1;
1164             changed = 1;
1165           }
1166           type = types_l5_[j];
1167         }
1168       for (int t = 0; t < int(types_l4_.size()); t++)
1169         if (type == types_l4_[t]) {
1170           j = t + types_l5_.size();
1171           if (asym_ladd_[(t + types_l5_.size())] == 2 && !changed) {
1172             j = j - 1;
1173             changed = 1;
1174           }
1175           if (asym_ladd_[(t + types_l5_.size())] == 1 && !changed) {
1176             j = j + 1;
1177             changed = 1;
1178           }
1179           type = types_l4_[j - types_l5_.size()];
1180         }
1181 
1182       icopy[j] += 1;
1183 
1184       if (I > 0)
1185         xpos = xpos + dee_separation;
1186       if (I < 0)
1187         xpos = xpos - dee_separation;
1188 
1189       DDName ddname3(getLadPrefix(0) + type, "esalgo");
1190       cpv.position(DDLogicalPart(ddname3),
1191                    DDName("SF", "esalgo"),
1192                    icopy[j],
1193                    DDTranslation(xpos, -ypos, zpos),
1194                    DDRotation("esalgo:R180"));
1195 #ifdef EDM_ML_DEBUG
1196       edm::LogVerbatim("SFGeom") << DDLogicalPart(ddname3).name() << " copy " << icopy[j] << " in "
1197                                  << DDName("SF", "esalgo") << " at " << DDTranslation(xpos, -ypos, zpos)
1198                                  << " rotation esalgo:R180";
1199 #endif
1200       DDName ddname4(getLadPrefix(1) + type, "esalgo");
1201 
1202       xpos = I * (2 * waf_intra_col_sep + waf_inter_col_sep);
1203 
1204       cpv.position(DDLogicalPart(ddname4),
1205                    DDName("SF", "esalgo"),
1206                    icopy[j],
1207                    DDTranslation(-ypos, -xpos, zpos - zlead1_ + zlead2_),
1208                    DDRotation("esalgo:R090"));
1209 #ifdef EDM_ML_DEBUG
1210       edm::LogVerbatim("SFGeom") << DDLogicalPart(ddname4).name() << " copy " << icopy[j] << " in "
1211                                  << DDName("SF", "esalgo") << " at "
1212                                  << DDTranslation(-ypos, -xpos, zpos - zlead1_ + zlead2_) << " rotation esalgo:R090";
1213 #endif
1214     }
1215   }
1216 }
1217 
1218 void DDEcalPreshowerAlgo::doSens(DDCompactView& cpv) {
1219   double xpos(0), ypos(0);
1220   for (size_t i = 0; i < 32; ++i) {
1221     xpos = -waf_active / 2. + i * waf_active / 32. + waf_active / 64.;
1222     cpv.position(
1223         DDLogicalPart("esalgo:SFSX"), DDName("SFWX", "esalgo"), i + 1, DDTranslation(xpos, 0., 0.), DDRotation());
1224 #ifdef EDM_ML_DEBUG
1225     edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFSX").name() << " copy " << (i + 1) << " in "
1226                                << DDName("SFWX", "esalgo") << " at " << DDTranslation(xpos, 0., 0.) << " no rotation";
1227 #endif
1228 
1229     ypos = -waf_active / 2. + i * waf_active / 32. + waf_active / 64.;
1230     cpv.position(
1231         DDLogicalPart("esalgo:SFSY"), DDName("SFWY", "esalgo"), i + 1, DDTranslation(0., ypos, 0.), DDRotation());
1232 #ifdef EDM_ML_DEBUG
1233     edm::LogVerbatim("SFGeom") << DDLogicalPart("esalgo:SFSY").name() << " copy " << (i + 1) << " in "
1234                                << DDName("SFWY", "esalgo") << " at " << DDTranslation(0., ypos, 0.) << " no rotation";
1235 #endif
1236   }
1237 }
1238 
1239 #include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
1240 
1241 DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDEcalPreshowerAlgo, "ecal:DDEcalPreshowerAlgo");