DDGEMAngular

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
///////////////////////////////////////////////////////////////////////////////
// File: DDGEMAngular.cc
// Description: Position inside the mother according to (eta,phi)
///////////////////////////////////////////////////////////////////////////////

#include <cmath>
#include <algorithm>
#include <map>
#include <string>
#include <vector>

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/PluginManager/interface/PluginFactory.h"
#include "DetectorDescription/Core/interface/DDLogicalPart.h"
#include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
#include "DataFormats/Math/interface/angle_units.h"
#include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
#include "DetectorDescription/Core/interface/DDTypes.h"
#include "DetectorDescription/Core/interface/DDAlgorithm.h"

//#define EDM_ML_DEBUG

using namespace angle_units::operators;

class DDGEMAngular : public DDAlgorithm {
public:
  //Constructor and Destructor
  DDGEMAngular();
  ~DDGEMAngular() override;

  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 startAngle;  //Start angle
  double stepAngle;   //Step  angle
  int invert;         //inverted or forward
  double rPos;        //Radial position of center
  double zoffset;     //Offset in z
  int n;              //Mumber of copies
  int startCopyNo;    //Start copy Number
  int incrCopyNo;     //Increment copy Number

  std::string rotns;        //Namespace for rotation matrix
  std::string idNameSpace;  //Namespace of this and ALL sub-parts
  std::string childName;    //Children name
};

DDGEMAngular::DDGEMAngular() {
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("MuonGeom") << "DDGEMAngular: Creating an instance";
#endif
}

DDGEMAngular::~DDGEMAngular() {}

void DDGEMAngular::initialize(const DDNumericArguments& nArgs,
                              const DDVectorArguments&,
                              const DDMapArguments&,
                              const DDStringArguments& sArgs,
                              const DDStringVectorArguments&) {
  startAngle = nArgs["startAngle"];
  stepAngle = nArgs["stepAngle"];
  invert = int(nArgs["invert"]);
  rPos = nArgs["rPosition"];
  zoffset = nArgs["zoffset"];
  n = int(nArgs["n"]);
  startCopyNo = int(nArgs["startCopyNo"]);
  incrCopyNo = int(nArgs["incrCopyNo"]);
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("MuonGeom") << "DDGEMAngular: Parameters for positioning-- " << n << " copies in steps of "
                               << convertRadToDeg(stepAngle) << " from " << convertRadToDeg(startAngle)
                               << " (inversion flag " << invert << ") \trPos " << rPos << " Zoffest " << zoffset
                               << "\tStart and inremental "
                               << "copy nos " << startCopyNo << ", " << incrCopyNo;
#endif

  rotns = sArgs["RotNameSpace"];
  idNameSpace = DDCurrentNamespace::ns();
  childName = sArgs["ChildName"];
#ifdef EDM_ML_DEBUG
  edm::LogVerbatim("MuonGeom") << "DDGEMAngular: Parent " << parent().name() << "\tChild " << childName
                               << "\tNameSpace " << idNameSpace << "\tRotation Namespace " << rotns;
#endif
}

void DDGEMAngular::execute(DDCompactView& cpv) {
  double phi = startAngle;
  int copyNo = startCopyNo;

  for (int ii = 0; ii < n; ii++) {
    double phitmp = phi;
    if (phitmp >= 2._pi)
      phitmp -= 2._pi;
    DDRotation rotation;
    std::string rotstr("RG");

    if (invert > 0)
      rotstr += "I";
    rotstr += formatAsDegrees(phitmp);
    rotation = DDRotation(DDName(rotstr, rotns));
    if (!rotation) {
      double thetax = 90.0_deg;
      double phix = invert == 0 ? (90.0_deg + phitmp) : (-90.0_deg + phitmp);
      double thetay = invert == 0 ? 0.0 : 180.0_deg;
      double phiz = phitmp;
#ifdef EDM_ML_DEBUG
      edm::LogVerbatim("MuonGeom") << "DDGEMAngular: Creating a new rotation " << DDName(rotstr, idNameSpace) << "\t "
                                   << convertRadToDeg(thetax) << ", " << convertRadToDeg(phix) << ", "
                                   << convertRadToDeg(thetay) << ", 0, " << convertRadToDeg(thetax) << ", "
                                   << convertRadToDeg(phiz);
#endif
      rotation = DDrot(DDName(rotstr, rotns), thetax, phix, thetay, 0., thetax, phiz);
    }

    DDTranslation tran(rPos * cos(phitmp), rPos * sin(phitmp), zoffset);

    DDName parentName = parent().name();
    cpv.position(DDName(childName, idNameSpace), parentName, copyNo, tran, rotation);
#ifdef EDM_ML_DEBUG
    edm::LogVerbatim("MuonGeom") << "DDGEMAngular: " << DDName(childName, idNameSpace) << " number " << copyNo
                                 << " positioned in " << parentName << " at " << tran << " with " << rotstr << " "
                                 << rotation;
#endif
    phi += stepAngle;
    copyNo += incrCopyNo;
  }
}

DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDGEMAngular, "muon:DDGEMAngular");