CMS 3D CMS Logo

DDHCalTestBeamAlgo.cc
Go to the documentation of this file.
1 #include "DD4hep/DetFactoryHelper.h"
5 
6 //#define EDM_ML_DEBUG
7 using namespace geant_units::operators;
8 
9 static long algorithm(dd4hep::Detector& /* description */,
11  xml_h e,
12  dd4hep::SensitiveDetector& /* sens */) {
13  cms::DDNamespace ns(ctxt, e, true);
14  cms::DDAlgoArguments args(ctxt, e);
15  // Header section
16  double eta = args.value<double>("Eta"); //Eta at which beam is focussed
17  double phi = args.value<double>("Phi"); //Phi ................
18  double theta = 2.0 * atan(exp(-eta)); //Corresponding theta value
19  double distance = args.value<double>("Dist"); //Distance of the centre of rotation
20  double distanceZ = args.value<double>("DistZ"); //Distance along x-axis of the centre of rotation
21  double dist = (distance + distanceZ / sin(theta)); //Overall distance
22  int copyNumber = args.value<int>("Number"); //Copy Number
23  std::string childName = args.value<std::string>("ChildName"); //Children name
24  double dz = args.value<double>("Dz"); //Half length along z of the volume to be placed
25 #ifdef EDM_ML_DEBUG
26  edm::LogVerbatim("HCalGeom") << "DDHCalTestBeamAlgo: Parameters for position"
27  << "ing--"
28  << " Eta " << eta << "\tPhi " << convertRadToDeg(phi) << "\tTheta "
29  << convertRadToDeg(theta) << "\tDistance " << convertCmToMm(distance) << "/"
30  << convertCmToMm(distanceZ) << "/" << convertCmToMm(dist) << "\tDz " << convertCmToMm(dz)
31  << "\tcopyNumber " << copyNumber;
32  edm::LogVerbatim("HCalGeom") << "DDHCalTestBeamAlgo:Parent " << args.parentName() << "\tChild " << childName
33  << " NameSpace " << ns.name();
34 #endif
35 
37 
38  double thetax = 90._deg + theta;
39  double sthx = sin(thetax);
40  if (std::abs(sthx) > 1.e-12)
41  sthx = 1. / sthx;
42  else
43  sthx = 1.;
44  double phix = atan2(sthx * cos(theta) * sin(phi), sthx * cos(theta) * cos(phi));
45  double thetay = 90._deg;
46  double phiy = 90._deg + phi;
47  double thetaz = theta;
48  double phiz = phi;
49 
50  dd4hep::Rotation3D rotation = cms::makeRotation3D(thetax, phix, thetay, phiy, thetaz, phiz);
51 #ifdef EDM_ML_DEBUG
52  edm::LogVerbatim("HCalGeom") << "DDHCalTestBeamAlgo: Creating a rotation \t" << convertRadToDeg(thetax) << ","
53  << convertRadToDeg(phix) << "," << convertRadToDeg(thetay) << ","
54  << convertRadToDeg(phiy) << "," << convertRadToDeg(thetaz) << ","
55  << convertRadToDeg(phiz);
56 #endif
57 
58  double r = dist * sin(theta);
59  double xpos = r * cos(phi);
60  double ypos = r * sin(phi);
61  double zpos = dist * cos(theta);
62  dd4hep::Position tran(xpos, ypos, zpos);
63 
64  if (strchr(childName.c_str(), NAMESPACE_SEP) == nullptr)
65  childName = ns.name() + childName;
66  dd4hep::Volume child = ns.volume(childName);
67  parent.placeVolume(child, copyNumber, dd4hep::Transform3D(rotation, tran));
68 #ifdef EDM_ML_DEBUG
69  edm::LogVerbatim("HCalGeom") << "DDHCalTestBeamAlgo: " << child.name() << " number " << copyNumber
70  << " positioned in " << parent.name() << " at (" << convertCmToMm(xpos) << ", "
71  << convertCmToMm(ypos) << ", " << convertCmToMm(zpos) << ") with rotation: " << rotation;
72 #endif
73  xpos = (dist - dz) * sin(theta) * cos(phi);
74  ypos = (dist - dz) * sin(theta) * sin(phi);
75  zpos = (dist - dz) * cos(theta);
76 
77  edm::LogInfo("HCalGeom") << "DDHCalTestBeamAlgo: Suggested Beam position "
78  << "(" << convertCmToMm(xpos) << ", " << convertCmToMm(ypos) << ", " << convertCmToMm(zpos)
79  << ") and (dist, eta, phi) = (" << convertCmToMm(dist - dz) << ", " << eta << ", " << phi
80  << ")";
81 
82  return 1;
83 }
84 
85 // first argument is the type from the xml file
86 DECLARE_DDCMS_DETELEMENT(DDCMS_hcal_DDHCalTestBeamAlgo, algorithm);
dd4hep::Volume volume(const std::string &name, bool exc=true) const
Definition: DDNamespace.cc:184
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T value(const std::string &name) const
Geom::Theta< T > theta() const
dd4hep::Rotation3D makeRotation3D(double thetaX, double phiX, double thetaY, double phiY, double thetaZ, double phiZ)
std::string_view name() const
Definition: DDNamespace.h:68
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
constexpr NumType convertCmToMm(NumType centimeters)
Definition: GeantUnits.h:68
dd4hep::Volume Volume
static long algorithm(dd4hep::Detector &, cms::DDParsingContext &ctxt, xml_h e, dd4hep::SensitiveDetector &)
#define DECLARE_DDCMS_DETELEMENT(name, func)
Definition: DDPlugins.h:30
std::string parentName() const
Access value of rParent child node.
#define NAMESPACE_SEP
Definition: DDNamespace.h:79