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: DDPixFwdDiskAlgo.cc
// Description: Position n copies at given z-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/PhysicalConstants.h>
#include <CLHEP/Units/SystemOfUnits.h>
#include <cmath>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
using namespace std;
class DDPixFwdDiskAlgo : public DDAlgorithm {
public:
//Constructor and Destructor
DDPixFwdDiskAlgo();
~DDPixFwdDiskAlgo() 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:
string idNameSpace; //Namespace of this and ALL sub-parts
string childName; //Child name
string rotName; //Name of the base rotation matrix
string flagString; //Flag if a blade is present
int nBlades; //Number of blades
int startCopyNo; //Start Copy number
double bladeAngle; //Angle of blade rotation aroung y-axis
double zPlane; //Common shift in z for all blades
vector<double> bladeZShift; //Shift in Z of individual blades
double anchorR; //Distance of beam line to anchor point
double bladeTilt; //Tilt of the blade around x-axis
};
DDPixFwdDiskAlgo::DDPixFwdDiskAlgo() { LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo info: Creating an instance"; }
DDPixFwdDiskAlgo::~DDPixFwdDiskAlgo() {}
void DDPixFwdDiskAlgo::initialize(const DDNumericArguments& nArgs,
const DDVectorArguments& vArgs,
const DDMapArguments&,
const DDStringArguments& sArgs,
const DDStringVectorArguments& vsArgs) {
startCopyNo = int(nArgs["StartCopyNo"]);
nBlades = int(nArgs["NumberOfBlades"]);
bladeAngle = nArgs["BladeAngle"];
bladeTilt = nArgs["BladeTilt"];
zPlane = nArgs["BladeCommonZ"];
bladeZShift = vArgs["BladeZShift"];
anchorR = nArgs["AnchorRadius"];
idNameSpace = DDCurrentNamespace::ns();
childName = sArgs["ChildName"];
rotName = sArgs["RotationName"];
flagString = sArgs["FlagString"];
DDName parentName = parent().name();
LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo debug: Parent " << parentName << "\tChild " << childName << " NameSpace "
<< idNameSpace << "\tRot Name " << rotName << "\tCopyNo (Start/Total) " << startCopyNo << ", "
<< nBlades << "\tAngles " << bladeAngle / CLHEP::deg << ", " << bladeTilt / CLHEP::deg
<< "\tZshifts " << zPlane << "\tAmnchor Radius " << anchorR;
for (int iBlade = 0; iBlade < nBlades; ++iBlade) {
LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo: Blade " << iBlade << " flag " << flagString[iBlade] << " zshift "
<< bladeZShift[iBlade];
}
}
void DDPixFwdDiskAlgo::execute(DDCompactView& cpv) {
int copy = startCopyNo;
DDName mother = parent().name();
DDName child(DDSplit(childName).first, DDSplit(childName).second);
string flagSelector = "Y";
double deltaPhi = (360. / nBlades) * CLHEP::deg;
string rotns = DDSplit(rotName).second;
for (int iBlade = 0; iBlade < nBlades; ++iBlade) {
if (flagString[iBlade] == flagSelector[0]) {
string rotstr = DDSplit(rotName).first + to_string(double(copy));
double phi = (iBlade + 0.5) * deltaPhi;
// double phi = (iBlade+0.5)*deltaPhi - 90.*CLHEP::deg;
double phix = atan2(sin(phi) * cos(bladeAngle), cos(phi) * cos(bladeAngle));
double thetx = acos(-sin(bladeAngle));
double phiy = atan2((cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt)),
(-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt)));
double thety = acos(cos(bladeAngle) * sin(bladeTilt));
double phiz = atan2((-cos(phi) * sin(bladeTilt) + sin(phi) * sin(bladeAngle) * cos(bladeTilt)),
(sin(phi) * sin(bladeTilt) + cos(phi) * sin(bladeAngle) * cos(bladeTilt)));
double thetz = acos(cos(bladeAngle) * cos(bladeTilt));
DDRotation rot = DDRotation(DDName(rotstr, rotns));
if (!rot) {
LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: Creating a new "
<< "rotation: " << rotstr << "\t" << thetx / CLHEP::deg << ", " << phix / CLHEP::deg
<< ", " << thety / CLHEP::deg << ", " << phiy / CLHEP::deg << ", " << thetz / CLHEP::deg
<< ", " << phiz / CLHEP::deg;
LogDebug("TrackerGeom") << "Rotation Matrix (" << phi / CLHEP::deg << ", " << bladeAngle / CLHEP::deg << ", "
<< bladeTilt / CLHEP::deg << ") " << cos(phi) * cos(bladeAngle) << ", "
<< (-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt)) << ", "
<< (sin(phi) * sin(bladeTilt) + cos(phi) * sin(bladeAngle) * cos(bladeTilt)) << ", "
<< sin(phi) * cos(bladeAngle) << ", "
<< (cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt)) << ", "
<< (-cos(phi) * sin(bladeTilt) + sin(phi) * sin(bladeAngle) * cos(bladeTilt)) << ", "
<< -sin(bladeAngle) << ", " << cos(bladeAngle) * sin(bladeTilt) << ", "
<< cos(bladeAngle) * cos(bladeTilt);
rot = DDrot(DDName(rotstr, rotns), thetx, phix, thety, phiy, thetz, phiz);
}
double xpos = anchorR * (-sin(phi) * cos(bladeTilt) + cos(phi) * sin(bladeAngle) * sin(bladeTilt));
double ypos = anchorR * (cos(phi) * cos(bladeTilt) + sin(phi) * sin(bladeAngle) * sin(bladeTilt));
double zpos = anchorR * (cos(bladeAngle) * sin(bladeTilt)) + zPlane + bladeZShift[iBlade];
DDTranslation tran(xpos, ypos, zpos);
cpv.position(child, mother, copy, tran, rot);
LogDebug("TrackerGeom") << "DDPixFwdDiskAlgo test: " << child << " number " << copy << " positioned in " << mother
<< " at " << tran << " with " << rot;
}
copy++;
}
}
DEFINE_EDM_PLUGIN(DDAlgorithmFactory, DDPixFwdDiskAlgo, "track:DDPixFwdDiskAlgo");
|