CMS 3D CMS Logo

DDHCalXtalAlgo.cc
Go to the documentation of this file.
1 // File: DDHCalXtalAlgo.cc
3 // Description: Positioning the crystal (layers) in the mother volume
5 
6 #include <cmath>
7 #include <algorithm>
8 
9 namespace std{} using namespace std;
14 #include "CLHEP/Units/GlobalSystemOfUnits.h"
15 
17  LogDebug("HCalGeom") << "DDHCalXtalAlgo info: Creating an instance";
18 }
19 
21 
23  const DDVectorArguments & ,
24  const DDMapArguments & ,
25  const DDStringArguments & sArgs,
26  const DDStringVectorArguments & vsArgs) {
27 
28  radius = nArgs["Radius"];
29  offset = nArgs["Offset"];
30  dx = nArgs["Dx"];
31  dz = nArgs["Dz"];
32  angwidth = nArgs["AngWidth"];
33  iaxis = int (nArgs["Axis"]);
34  names = vsArgs["Names"];
35 
36  LogDebug("HCalGeom") << "DDHCalXtalAlgo debug: Parameters for positioning:: "
37  << "Axis " << iaxis << "\tRadius " << radius
38  << "\tOffset " << offset << "\tDx " << dx << "\tDz "
39  << dz << "\tAngWidth " << angwidth/CLHEP::deg
40  << "\tNumbers " << names.size();
41  for (unsigned int i = 0; i < names.size(); i++)
42  LogDebug("HCalGeom") << "\tnames[" << i << "] = " << names[i];
43 
44  idNameSpace = DDCurrentNamespace::ns();
45  idName = sArgs["ChildName"];
46  DDName parentName = parent().name();
47  LogDebug("HCalGeom") << "DDHCalXtalAlgo debug: Parent " << parentName
48  << "\tChild " << idName << " NameSpace " << idNameSpace;
49 }
50 
52 
53  double theta[3], phi[3], pos[3];
54  phi[0] = 0;
55  phi[1] = 90*CLHEP::deg;
56  theta[1-iaxis] = 90*CLHEP::deg;
57  pos[1-iaxis] = 0;
58  int number = (int)(names.size());
59  for (int i=0; i<number; i++) {
60  double angle = 0.5*angwidth*(2*i+1-number);
61  theta[iaxis] = 90*CLHEP::deg + angle;
62  if (angle>0) {
63  theta[2] = angle;
64  phi[2] = 90*iaxis*CLHEP::deg;
65  } else {
66  theta[2] =-angle;
67  phi[2] = 90*(2-3*iaxis)*CLHEP::deg;
68  }
69  pos[iaxis] = angle*(dz+radius);
70  pos[2] = dx*abs(sin(angle)) + offset;
71 
73  string rotstr = names[i];
74  DDTranslation tran(pos[0], pos[1], pos[2]);
75  DDName parentName = parent().name();
76 
77  if (abs(angle) > 0.01*CLHEP::deg) {
78  LogDebug("HCalGeom") << "DDHCalXtalAlgo test: Creating a new rotation "
79  << rotstr << "\t" << theta[0]/CLHEP::deg << ","
80  << phi[0]/CLHEP::deg << "," << theta[1]/CLHEP::deg
81  << "," << phi[1]/CLHEP::deg << ","
82  << theta[2]/CLHEP::deg << "," << phi[2]/CLHEP::deg;
83  rotation = DDrot(DDName(rotstr, idNameSpace), theta[0], phi[0], theta[1],
84  phi[1], theta[2], phi[2]);
85  }
86  cpv.position(DDName(idName, idNameSpace), parentName, i+1, tran, rotation);
87  LogDebug("HCalGeom") << "DDHCalXtalAlgo test: "
88  << DDName(idName,idNameSpace) << " number " << i+1
89  << " positioned in " << parentName << " at " << tran
90  << " with " << rotation;
91  }
92 }
#define LogDebug(id)
static const HistoName names[]
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
static std::string & ns()
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:83
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:67
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
~DDHCalXtalAlgo() override
DDRotation DDrot(const DDName &name, DDRotationMatrix *rot)
Definition of a uniquely identifiable rotation matrix named by DDName name.
Definition: DDRotation.cc:90
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=0)
void execute(DDCompactView &cpv) override
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11