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");
|