DDTrackerPhiAltAlgo

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
///////////////////////////////////////////////////////////////////////////////
// File: DDTrackerPhiAltAlgo.cc
// Description: Position n copies inside and outside at alternate phi values
///////////////////////////////////////////////////////////////////////////////

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
#include "DetectorDescription/Core/interface/DDSplit.h"
#include "DetectorDescription/Core/interface/DDTypes.h"
#include "DetectorDescription/Core/interface/DDAlgorithm.h"
#include "DetectorDescription/Core/interface/DDAlgorithmFactory.h"
#include <CLHEP/Units/GlobalPhysicalConstants.h>
#include <CLHEP/Units/SystemOfUnits.h>

#include <string>
#include <vector>

using namespace std;

class DDTrackerPhiAltAlgo : public DDAlgorithm {
public:
  //Constructor and Destructor
  DDTrackerPhiAltAlgo();
  ~DDTrackerPhiAltAlgo() 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 tilt;        //Tilt of the module
  double startAngle;  //offset in phi
  double rangeAngle;  //Maximum range in phi
  double radiusIn;    //Inner radius
  double radiusOut;   //Outer radius
  double zpos;        //z position
  int number;         //Number of copies
  int startCopyNo;    //Start copy number
  int incrCopyNo;     //Increment in copy number

  string idNameSpace;  //Namespace of this and ALL sub-parts
  string childName;    //Child name
};

DDTrackerPhiAltAlgo::DDTrackerPhiAltAlgo() {
  LogDebug("TrackerGeom") << "DDTrackerPhiAltAlgo info: Creating an instance";
}

DDTrackerPhiAltAlgo::~DDTrackerPhiAltAlgo() {}

void DDTrackerPhiAltAlgo::initialize(const DDNumericArguments& nArgs,
                                     const DDVectorArguments&,
                                     const DDMapArguments&,
                                     const DDStringArguments& sArgs,
                                     const DDStringVectorArguments&) {
  tilt = nArgs["Tilt"];
  startAngle = nArgs["StartAngle"];
  rangeAngle = nArgs["RangeAngle"];
  radiusIn = nArgs["RadiusIn"];
  radiusOut = nArgs["RadiusOut"];
  zpos = nArgs["ZPosition"];
  number = int(nArgs["Number"]);
  startCopyNo = int(nArgs["StartCopyNo"]);
  incrCopyNo = int(nArgs["IncrCopyNo"]);

  LogDebug("TrackerGeom") << "DDTrackerPhiAltAlgo debug: Parameters for "
                          << "positioning--"
                          << " Tilt " << tilt << "\tStartAngle " << startAngle / CLHEP::deg << "\tRangeAngle "
                          << rangeAngle / CLHEP::deg << "\tRin " << radiusIn << "\tRout " << radiusOut << "\t ZPos "
                          << zpos << "\tCopy Numbers " << number << " Start/Increment " << startCopyNo << ", "
                          << incrCopyNo;

  idNameSpace = DDCurrentNamespace::ns();
  childName = sArgs["ChildName"];
  DDName parentName = parent().name();
  LogDebug("TrackerGeom") << "DDTrackerPhiAltAlgo debug: Parent " << parentName << "\tChild " << childName
                          << " NameSpace " << idNameSpace;
}

void DDTrackerPhiAltAlgo::execute(DDCompactView& cpv) {
  if (number > 0) {
    double theta = 90. * CLHEP::deg;
    double dphi;
    if (number == 1 || fabs(rangeAngle - 360.0 * CLHEP::deg) < 0.001 * CLHEP::deg)
      dphi = rangeAngle / number;
    else
      dphi = rangeAngle / (number - 1);
    int copyNo = startCopyNo;

    DDName mother = parent().name();
    DDName child(DDSplit(childName).first, DDSplit(childName).second);
    for (int i = 0; i < number; i++) {
      double phi = startAngle + i * dphi;
      double phix = phi - tilt + 90. * CLHEP::deg;
      double phiy = phix + 90. * CLHEP::deg;
      double phideg = phix / CLHEP::deg;

      DDRotation rotation;
      if (phideg != 0) {
        string rotstr = DDSplit(childName).first + to_string(phideg * 10.);
        rotation = DDRotation(DDName(rotstr, idNameSpace));
        if (!rotation) {
          LogDebug("TrackerGeom") << "DDTrackerPhiAltAlgo test: Creating a new"
                                  << " rotation " << rotstr << "\t"
                                  << "90., " << phix / CLHEP::deg << ", 90.," << phiy / CLHEP::deg << ", 0, 0";
          rotation = DDrot(DDName(rotstr, idNameSpace), theta, phix, theta, phiy, 0., 0.);
        }
      }

      double xpos, ypos;
      if (i % 2 == 0) {
        xpos = radiusIn * cos(phi);
        ypos = radiusIn * sin(phi);
      } else {
        xpos = radiusOut * cos(phi);
        ypos = radiusOut * sin(phi);
      }
      DDTranslation tran(xpos, ypos, zpos);

      cpv.position(child, mother, copyNo, tran, rotation);
      LogDebug("TrackerGeom") << "DDTrackerPhiAltAlgo test: " << child << " number " << copyNo << " positioned in "
                              << mother << " at " << tran << " with " << rotation;
      copyNo += incrCopyNo;
    }
  }
}

DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDTrackerPhiAltAlgo, "track:DDTrackerPhiAltAlgo");