11 #include <beast/pindiode/geometry/PindiodeCreator.h>
12 #include <beast/pindiode/simulation/SensitiveDetector.h>
14 #include <geometry/Materials.h>
15 #include <geometry/CreatorFactory.h>
16 #include <framework/gearbox/GearDir.h>
17 #include <framework/logging/Logger.h>
20 #include <boost/format.hpp>
21 #include <boost/foreach.hpp>
22 #include <boost/algorithm/string.hpp>
24 #include <G4LogicalVolume.hh>
25 #include <G4PVPlacement.hh>
29 #include "G4SubtractionSolid.hh"
30 #include <G4UserLimits.hh>
34 #include "G4Colour.hh"
35 #include <G4VisAttributes.hh>
38 using namespace boost;
51 geometry::CreatorFactory<PindiodeCreator>
PindiodeFactory(
"PINDIODECreator");
53 PindiodeCreator::PindiodeCreator(): m_sensitive(0)
58 PindiodeCreator::~PindiodeCreator()
70 G4VisAttributes* red =
new G4VisAttributes(G4Colour(1, 0, 0));
71 red->SetForceAuxEdgeVisible(
true);
75 G4VisAttributes* green =
new G4VisAttributes(G4Colour(0, 1, 0));
76 green->SetForceAuxEdgeVisible(
true);
81 G4VisAttributes* gray =
new G4VisAttributes(G4Colour(.5, .5, .5));
82 gray->SetForceAuxEdgeVisible(
true);
83 G4VisAttributes* yellow =
new G4VisAttributes(G4Colour(1, 1, 0));
84 yellow->SetForceAuxEdgeVisible(
true);
97 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
109 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
111 int phase = activeParams.
getInt(
"phase");
112 G4double dx_pins = activeParams.
getLength(
"dx_pins") / 2.*CLHEP::cm;
113 G4double dy_pins = activeParams.
getLength(
"dy_pins") / 2.*CLHEP::cm;
114 G4double dz_pins = activeParams.
getLength(
"dz_pins") / 2.*CLHEP::cm;
129 for (
int wAu : activeParams.
getArray(
"Ch_wAu", {0})) {
130 ch_wAu[dimwAu] = wAu;
134 for (
int woAu : activeParams.
getArray(
"Ch_woAu", {0})) {
135 ch_woAu[dimwoAu] = woAu;
139 for (
double x : activeParams.
getArray(
"x", {0})) {
145 for (
double y : activeParams.
getArray(
"y", {0})) {
148 r[dimy] = sqrt(x_pos[dimy] * x_pos[dimy] + y_pos[dimy] * y_pos[dimy]);
150 if (x_pos[dimy] >= 0) Phi = TMath::ASin(y_pos[dimy] / r[dimy]) * TMath::RadToDeg();
151 else if (x_pos[dimy] < 0) Phi = -TMath::ASin(y_pos[dimy] / r[dimy]) * TMath::RadToDeg() + 180.;
152 phi[dimy] = Phi * CLHEP::deg - 90. * CLHEP::deg;
156 for (
double ThetaX : activeParams.
getArray(
"ThetaX", {0})) {
157 thetaX[dimThetaX] = ThetaX;
161 for (
double ThetaY : activeParams.
getArray(
"ThetaY", {0})) {
162 thetaY[dimThetaY] = ThetaY;
168 for (
int i = 0; i < 100; i++) {
173 for (
double Phi : activeParams.
getArray(
"Phi", {0})) {
174 phi[dimPhi] = Phi - 90. * CLHEP::deg;
177 for (
double r_pin : activeParams.
getArray(
"r_pin", {0})) {
184 for (
double z : activeParams.
getArray(
"z", {0})) {
190 for (
double ThetaZ : activeParams.
getArray(
"ThetaZ", {0})) {
191 thetaZ[dimThetaZ] = ThetaZ;
196 G4double InchtoCm = 2.54 * CLHEP::cm;
199 G4double dz_airbox = 0.563 / 2. * InchtoCm;
200 G4double dx_airbox = 1. / 2. * InchtoCm;
201 G4double dy_airbox = 0.315 / 2. * InchtoCm;
223 G4double dz_base = 0.5 / 2. * InchtoCm;
224 G4double dx_base = dx_airbox;
225 G4double dy_base = 0.25 / 2. * InchtoCm;
226 G4VSolid* s_base =
new G4Box(
"s_base", dx_base, dy_base, dz_base);
228 G4double ir_hole = 0.;
229 G4double or_hole = 5. / 2.*CLHEP::mm;
230 G4double h_hole = 0.382 / 2. * InchtoCm;
231 G4double sA_hole = 0.*CLHEP::deg;
232 G4double spA_hole = 360.*CLHEP::deg;
233 G4VSolid* s_hole =
new G4Tubs(
"s_hole", ir_hole, or_hole, h_hole, sA_hole, spA_hole);
234 G4double x_pos_hole = dx_base - 0.315 * InchtoCm;
235 G4double y_pos_hole = (0.187 - 0.250 / 2.) * InchtoCm;
236 G4double z_pos_hole = -(0.5 - 0.382) * InchtoCm;
237 s_base =
new G4SubtractionSolid(
"s_base_hole1", s_base, s_hole, 0, G4ThreeVector(x_pos_hole, y_pos_hole, z_pos_hole));
238 s_base =
new G4SubtractionSolid(
"s_base_hole2", s_base, s_hole, 0, G4ThreeVector(-x_pos_hole, y_pos_hole, z_pos_hole));
243 double iTheta[4] = {0, 90, 180, 270};
244 G4LogicalVolume* l_base =
new G4LogicalVolume(s_base, G4Material::GetMaterial(
"Al6061"),
"l_base");
245 l_base->SetVisAttributes(yellow);
246 G4Transform3D transform;
247 for (
int i = 0; i < dimz; i++) {
249 transform = G4Translate3D(x_pos[i], y_pos[i],
250 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]);
252 new G4PVPlacement(transform, l_base, TString::Format(
"p_pin_base_%d", i).Data(), &topVolume,
false, 0);
253 B2INFO(
"PIN base-" << (
int)i / 4 <<
"-" << iTheta[i - ((
int)i / 4) * 4] <<
" placed at: " << transform.getTranslation() <<
" mm ");
263 G4double dz_cover1 = dz_airbox;
264 G4double dx_cover1 = dx_airbox;
265 G4double dy_cover1 = dy_airbox - dy_base;
266 G4VSolid* s_cover1 =
new G4Box(
"s_cover1", dx_cover1, dy_cover1, dz_cover1);
268 G4double dx_shole = (0.563 - 0.406) / 2. * InchtoCm;
269 G4VSolid* s_shole =
new G4Box(
"s_shole", dx_shole, dy_cover1, dx_shole);
270 G4double x_pos_cover_hole = dx_base - 0.392 * InchtoCm + dx_shole;
272 G4double z_pos_cover_hole = dz_airbox - 0.406 * InchtoCm + dx_shole;
273 s_cover1 =
new G4SubtractionSolid(
"s_cover1_hole1", s_cover1, s_shole, 0, G4ThreeVector(x_pos_cover_hole, 0, z_pos_cover_hole));
274 s_cover1 =
new G4SubtractionSolid(
"s_cover1_hole2", s_cover1, s_shole, 0, G4ThreeVector(-x_pos_cover_hole, 0, z_pos_cover_hole));
281 G4LogicalVolume* l_cover1 =
new G4LogicalVolume(s_cover1, G4Material::GetMaterial(
"Al6061"),
"l_cover1");
282 l_cover1->SetVisAttributes(yellow);
283 for (
int i = 0; i < dimz; i++) {
285 transform = G4Translate3D(x_pos[i], y_pos[i],
286 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
287 G4Translate3D(0., dy_base + dy_cover1, (dz_cover1 - dz_base) - dy_cover1 * 2.);
290 new G4PVPlacement(transform, l_cover1, TString::Format(
"p_pin_cover1_%d", i).Data(), &topVolume,
false, 0);
300 G4double dz_cover2 = dz_airbox - dz_base;
301 G4double dx_cover2 = dx_airbox;
302 G4double dy_cover2 = dy_base;
303 G4VSolid* s_cover2 =
new G4Box(
"s_cover2", dx_cover2, dy_cover2, dz_cover2);
304 G4LogicalVolume* l_cover2 =
new G4LogicalVolume(s_cover2, G4Material::GetMaterial(
"Al6061"),
"l_cover2");
305 l_cover2->SetVisAttributes(yellow);
306 for (
int i = 0; i < dimz; i++) {
308 transform = G4Translate3D(x_pos[i], y_pos[i],
309 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
310 G4Translate3D(0., -2.*dy_cover1, - dz_base - dz_cover2);
313 new G4PVPlacement(transform, l_cover2, TString::Format(
"p_pin_cover2_%d", i).Data(), &topVolume,
false, 0);
339 G4double dx_pin = dx_pins;
340 G4double dz_pin = dz_pins;
341 G4double dy_pin = dy_pins;
343 G4VSolid* s_pin =
new G4Box(
"s_pin", dx_pin, dy_pin, dz_pin);
345 l_pin->SetVisAttributes(yellow);
346 l_pin->SetUserLimits(
new G4UserLimits(stepSize));
348 for (
int i = 0; i < dimz; i++) {
350 int detID2 = 2 * i + 1;
356 transform = G4Translate3D(x_pos[i], y_pos[i],
357 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
358 G4Translate3D((0.5 - 0.392) * InchtoCm + dx_shole, (0.187 - 0.250 / 2.) * InchtoCm + dy_pin,
359 (0.563 / 2. - 0.406) * InchtoCm + dx_shole * 2 - 0. - dz_pin);
365 new G4PVPlacement(transform, l_pin, TString::Format(
"p_pin_1_%d", i).Data(), &topVolume,
false, detID1);
366 B2INFO(
"With Au PIN-" << detID1 <<
" placed at: " << transform.getTranslation() <<
" mm");
369 transform = G4Translate3D(x_pos[i], y_pos[i],
370 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
371 G4Translate3D(-(0.5 - 0.392) * InchtoCm - dx_shole, (0.187 - 0.250 / 2.) * InchtoCm + dy_pin,
372 (0.563 / 2. - 0.406) * InchtoCm + dx_shole * 2 - dz_pin);
373 new G4PVPlacement(transform, l_pin, TString::Format(
"p_pin_2_%d", i).Data(), &topVolume,
false, detID2);
374 B2INFO(
" PIN-" << detID2 <<
" placed at: " << transform.getTranslation() <<
" mm");
383 for (
int j = 0; j < dimPhi; j++) {
384 transform = G4RotateZ3D(phi[j]) * G4Translate3D(0, r[i], z_pos[i]) * G4RotateX3D(-M_PI / 2 - thetaZ[j]);
385 new G4PVPlacement(transform, l_pin, TString::Format(
"p_pin_%d", i).Data(), &topVolume,
false, detID);
386 B2INFO(
"PIN-" << detID <<
" placed at: " << transform.getTranslation() <<
" mm");
420 G4double dx_layer = 2.65 / 2.*CLHEP::mm;
421 G4double dz_layer = 2.65 / 2.*CLHEP::mm;
422 G4double dy_layer1 = 0.01 / 2.*CLHEP::mm;
423 G4VSolid* s_layer1 =
new G4Box(
"s_layer1", dx_layer, dy_layer1, dz_layer);
425 l_layer1->SetVisAttributes(red);
426 for (
int i = 0; i < dimz; i++) {
428 transform = G4Translate3D(x_pos[i], y_pos[i],
429 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
430 G4Translate3D((0.5 - 0.392) * InchtoCm + dx_shole, (0.187 - 0.250 / 2.) * InchtoCm + dy_layer1 + 2.* dy_pin,
431 (0.563 / 2. - 0.406) * InchtoCm + dx_shole * 2 - dz_pin);
435 new G4PVPlacement(transform, l_layer1, TString::Format(
"p_pin_layer1_%d", i).Data(), &topVolume,
false, 0);
452 G4double dy_layer2 = 0.001 / 2.*InchtoCm;
453 G4VSolid* s_layer2 =
new G4Box(
"s_layer1", dx_layer, dy_layer2, dz_layer);
455 l_layer2->SetVisAttributes(green);
456 for (
int i = 0; i < dimz; i++) {
458 transform = G4Translate3D(x_pos[i], y_pos[i],
459 z_pos[i]) * G4RotateX3D(thetaX[i]) * G4RotateY3D(thetaY[i]) * G4RotateZ3D(thetaZ[i]) *
460 G4Translate3D(-(0.5 - 0.392) * InchtoCm - dx_shole, (0.187 - 0.250 / 2.) * InchtoCm + dy_layer2 + 2. * dy_pin,
461 (0.563 / 2. - 0.406) * InchtoCm + dx_shole * 2 - dz_pin);
465 new G4PVPlacement(transform, l_layer2, TString::Format(
"p_pin_layer2_%d", i).Data(), &topVolume,
false, 0);