DDHGCalWafer8

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
#include "DetectorDescription/Core/interface/DDAlgorithm.h"
#include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
#include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
#include "DetectorDescription/Core/interface/DDLogicalPart.h"
#include "DetectorDescription/Core/interface/DDMaterial.h"
#include "DetectorDescription/Core/interface/DDSolid.h"
#include "DetectorDescription/Core/interface/DDSplit.h"
#include "DetectorDescription/Core/interface/DDTypes.h"
#include "DetectorDescription/Core/interface/DDutils.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/PluginManager/interface/PluginFactory.h"
#include "Geometry/HGCalCommonData/interface/HGCalTypes.h"

#include <string>
#include <vector>

//#define EDM_ML_DEBUG

class DDHGCalWafer8 : public DDAlgorithm {
public:
  // Constructor and Destructor
  DDHGCalWafer8() {}

  void initialize(const DDNumericArguments& nArgs,
                  const DDVectorArguments& vArgs,
                  const DDMapArguments& mArgs,
                  const DDStringArguments& sArgs,
                  const DDStringVectorArguments& vsArgs) override;
  void execute(DDCompactView& cpv) override;

private:
  double waferSize_;                    // Wafer size
  double waferT_;                       // Wafer thickness
  double waferSepar_;                   // Sensor separation
  int nCells_;                          // Half number of cells along u-v axis
  int cellType_;                        // Cell Type (0,1,2: Fine, Course 2/3)
  std::string material_;                // Material name for module with gap
  std::vector<std::string> cellNames_;  // Name of the cells
  std::string nameSpace_;               // Namespace to be used
};

void DDHGCalWafer8::initialize(const DDNumericArguments& nArgs,
                               const DDVectorArguments&,
                               const DDMapArguments&,
                               const DDStringArguments& sArgs,
                               const DDStringVectorArguments& vsArgs) {
  waferSize_ = nArgs["WaferSize"];
  waferT_ = nArgs["WaferThick"];
  waferSepar_ = nArgs["SensorSeparation"];
  nCells_ = (int)(nArgs["NCells"]);
  cellType_ = (int)(nArgs["CellType"]);
  material_ = sArgs["Material"];
  cellNames_ = vsArgs["CellNames"];
  nameSpace_ = DDCurrentNamespace::ns();
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer8: Wafer 2r " << waferSize_ << " T " << waferT_ << " Half Separation "
                                << waferSepar_ << " Cells/Wafer " << nCells_ << " Cell Type " << cellType_
                                << " Material " << material_ << " Names " << parent().name() << " NameSpace "
                                << nameSpace_ << ": # of cells " << cellNames_.size();
  for (unsigned int k = 0; k < cellNames_.size(); ++k)
    edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer8: Cell[" << k << "] " << cellNames_[k];
#endif
}

void DDHGCalWafer8::execute(DDCompactView& cpv) {
  static const double sqrt3 = std::sqrt(3.0);
  double rM = 0.5 * (waferSize_ + waferSepar_);
  double RM2 = rM / sqrt3;
  double R = waferSize_ / (3.0 * nCells_);
  double r = 0.5 * R * sqrt3;

  // First the full cell
  std::vector<double> xM = {rM, 0, -rM, -rM, 0, rM};
  std::vector<double> yM = {RM2, 2 * RM2, RM2, -RM2, -2 * RM2, -RM2};
  std::vector<double> zw = {-0.5 * waferT_, 0.5 * waferT_};
  std::vector<double> zx(2, 0), zy(2, 0), scale(2, 1.0);
  DDName parentName = parent().name();
  DDSolid solid = DDSolidFactory::extrudedpolygon(parentName, xM, yM, zw, zx, zy, scale);
  DDName matName(DDSplit(material_).first, DDSplit(material_).second);
  DDMaterial matter(matName);
  DDLogicalPart glog = DDLogicalPart(solid.ddname(), matter, solid);
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer8: " << solid.name() << " extruded polygon made of " << matName
                                << " z|x|y|s (0) " << zw[0] << ":" << zx[0] << ":" << zy[0] << ":" << scale[0]
                                << " z|x|y|s (1) " << zw[1] << ":" << zx[1] << ":" << zy[1] << ":" << scale[1]
                                << " and " << xM.size() << " edges";
  for (unsigned int k = 0; k < xM.size(); ++k)
    edm::LogVerbatim("HGCalGeom") << "[" << k << "] " << xM[k] << ":" << yM[k];
  int counter(0);
#endif

  DDRotation rot;
  for (int u = 0; u < 2 * nCells_; ++u) {
    for (int v = 0; v < 2 * nCells_; ++v) {
      if (((v - u) < nCells_) && (u - v) <= nCells_) {
#ifdef EDM_ML_DEBUG
        counter++;
#endif
        int n2 = nCells_ / 2;
        double yp = (u - 0.5 * v - n2) * 2 * r;
        double xp = (1.5 * (v - nCells_) + 1.0) * R;
        int cell(0);
        if ((u == 0) && (v == 0))
          cell = 7;
        else if ((u == 0) && (v == nCells_ - 1))
          cell = 8;
        else if ((u == nCells_) && (v == 2 * nCells_ - 1))
          cell = 9;
        else if ((u == 2 * nCells_ - 1) && (v == 2 * nCells_ - 1))
          cell = 10;
        else if ((u == 2 * nCells_ - 1) && (v == nCells_ - 1))
          cell = 11;
        else if ((u == nCells_) && (v == 0))
          cell = 12;
        else if (u == 0)
          cell = 1;
        else if ((v - u) == (nCells_ - 1))
          cell = 4;
        else if (v == (2 * nCells_ - 1))
          cell = 2;
        else if (u == (2 * nCells_ - 1))
          cell = 5;
        else if ((u - v) == nCells_)
          cell = 3;
        else if (v == 0)
          cell = 6;
        DDTranslation tran(xp, yp, 0);
        int copy = HGCalTypes::packCellTypeUV(cellType_, u, v);
        cpv.position(DDName(cellNames_[cell]), glog, copy, tran, rot);
#ifdef EDM_ML_DEBUG
        edm::LogVerbatim("HGCalGeom") << "DDHGCalWafer8: " << cellNames_[cell] << " number " << copy << " position in "
                                      << glog.name() << " at " << tran << " with no rotation";
#endif
      }
    }
  }
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("HGCalGeom") << "\nDDHGCalWafer8::Counter : " << counter << "\n===============================\n";
#endif
}

DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDHGCalWafer8, "hgcal:DDHGCalWafer8");