302 Double_t xHalfSizeZone1 = x_zone_sizes[0];
303 Double_t yHalfSizeZone1 = y_zone_sizes[0];
305 Double_t xHalfSizeZone2 = x_zone_sizes[1];
306 Double_t yHalfSizeZone2 = y_zone_sizes[1];
308 Double_t xHalfSizeZone3 = x_zone_sizes[2];
309 Double_t yHalfSizeZone3 = y_zone_sizes[2];
311 Double_t xHalfSizeZone4 = x_zone_sizes[3];
312 Double_t yHalfSizeZone4 = y_zone_sizes[3];
315 Double_t vpart_xsize_zone1 = xHalfSizeZone1 - xHalfSizeZone2;
316 Double_t vpart_ysize_zone1 = yHalfSizeZone1;
317 Double_t hpart_xsize_zone1 = xHalfSizeZone2;
318 Double_t hpart_ysize_zone1 = yHalfSizeZone1 - yHalfSizeZone2;
320 Double_t vpart_xsize_zone2 = xHalfSizeZone2 - xHalfSizeZone3;
321 Double_t vpart_ysize_zone2 = yHalfSizeZone2;
322 Double_t hpart_xsize_zone2 = xHalfSizeZone3;
323 Double_t hpart_ysize_zone2 = yHalfSizeZone2 - yHalfSizeZone3;
325 Double_t vpart_xsize_zone3 = xHalfSizeZone3 - xHalfSizeZone4;
326 Double_t vpart_ysize_zone3 = yHalfSizeZone3;
327 Double_t hpart_xsize_zone3 = xHalfSizeZone4;
328 Double_t hpart_ysize_zone3 = yHalfSizeZone3 - yHalfSizeZone4;
330 Double_t part_xsize_zone4 = xHalfSizeZone4;
331 Double_t part_ysize_zone4 = yHalfSizeZone4;
334 TString vpart_zone1S_name =
Form(
"vpart_zone1_%s", station_name.
Data());
335 TString hpart_zone1S_name =
Form(
"hpart_zone1_%s", station_name.
Data());
344 new TGeoTranslation(vpart_xsize_zone1 / 2 + xHalfSizeZone2, yHalfSizeZone1 / 2, 0);
346 new TGeoTranslation(hpart_xsize_zone1 / 2, hpart_ysize_zone1 / 2 + yHalfSizeZone2, 0);
347 TString vpart_zone1S_trans_name =
Form(
"vpart_zone1_trans_%s", station_name.
Data());
348 TString hpart_zone1S_trans_name =
Form(
"hpart_zone1_trans_%s", station_name.
Data());
349 vpart_zone1_trans->
SetName(vpart_zone1S_trans_name);
350 hpart_zone1_trans->
SetName(hpart_zone1S_trans_name);
353 TString bool_expression_zone1 =
354 vpart_zone1S_name +
":" + vpart_zone1S_trans_name +
" + " + hpart_zone1S_name +
":" + hpart_zone1S_trans_name;
355 if (xHalfSizeZone2 < hole_radius || yHalfSizeZone2 < hole_radius)
356 bool_expression_zone1 +=
" - " + hole_zone1S_name;
360 TString vpart_zone2S_name =
Form(
"vpart_zone2_%s", station_name.
Data());
361 TString hpart_zone2S_name =
Form(
"hpart_zone2_%s", station_name.
Data());
370 new TGeoTranslation(vpart_xsize_zone2 / 2 + xHalfSizeZone3, yHalfSizeZone2 / 2, 0);
372 new TGeoTranslation(hpart_xsize_zone2 / 2, hpart_ysize_zone2 / 2 + yHalfSizeZone3, 0);
373 TString vpart_zone2S_trans_name =
Form(
"vpart_zone2_trans_%s", station_name.
Data());
374 TString hpart_zone2S_trans_name =
Form(
"hpart_zone2_trans_%s", station_name.
Data());
375 vpart_zone2_trans->
SetName(vpart_zone2S_trans_name);
376 hpart_zone2_trans->
SetName(hpart_zone2S_trans_name);
379 TString bool_expression_zone2 =
380 vpart_zone2S_name +
":" + vpart_zone2S_trans_name +
" + " + hpart_zone2S_name +
":" + hpart_zone2S_trans_name;
381 if (xHalfSizeZone3 < hole_radius || yHalfSizeZone3 < hole_radius)
382 bool_expression_zone2 +=
" - " + hole_zone2S_name;
386 TString vpart_zone3S_name =
Form(
"vpart_zone3_%s", station_name.
Data());
387 TString hpart_zone3S_name =
Form(
"hpart_zone3_%s", station_name.
Data());
396 new TGeoTranslation(vpart_xsize_zone3 / 2 + xHalfSizeZone4, yHalfSizeZone3 / 2, 0);
398 new TGeoTranslation(hpart_xsize_zone3 / 2, hpart_ysize_zone3 / 2 + yHalfSizeZone4, 0);
399 TString vpart_zone3S_trans_name =
Form(
"vpart_zone3_trans_%s", station_name.
Data());
400 TString hpart_zone3S_trans_name =
Form(
"hpart_zone3_trans_%s", station_name.
Data());
401 vpart_zone3_trans->
SetName(vpart_zone3S_trans_name);
402 hpart_zone3_trans->
SetName(hpart_zone3S_trans_name);
405 TString bool_expression_zone3 =
406 vpart_zone3S_name +
":" + vpart_zone3S_trans_name +
" + " + hpart_zone3S_name +
":" + hpart_zone3S_trans_name;
407 if (xHalfSizeZone4 < hole_radius || yHalfSizeZone4 < hole_radius)
408 bool_expression_zone3 +=
" - " + hole_zone3S_name;
419 TString part_zone4S_trans_name =
Form(
"part_zone4_trans_%s", station_name.
Data());
420 part_zone4_trans->
SetName(part_zone4S_trans_name);
422 TString bool_expression_zone4 = part_zone4S_name +
":" + part_zone4S_trans_name +
" - " + hole_zone4S_name;
462 Fatal(
"Main",
"Invalid medium for zones!");
467 vertical_frameV->
SetMedium(frame_medium);
468 horizontal_frameV->
SetMedium(frame_medium);
469 circle_inner_frameV->
SetMedium(frame_medium);
471 Fatal(
"Main",
"Invalid medium for frames!");
481 quadrant_right_top_position->
ReflectX(
true);
482 stationA->
AddNode(zone1V, 1, quadrant_right_top_position);
483 stationA->
AddNode(zone2V, 1, quadrant_right_top_position);
484 stationA->
AddNode(zone3V, 1, quadrant_right_top_position);
485 stationA->
AddNode(zone4V, 1, quadrant_right_top_position);
489 quadrant_left_bottom_position->
ReflectY(
true);
490 stationA->
AddNode(zone1V, 2, quadrant_left_bottom_position);
491 stationA->
AddNode(zone2V, 2, quadrant_left_bottom_position);
492 stationA->
AddNode(zone3V, 2, quadrant_left_bottom_position);
493 stationA->
AddNode(zone4V, 2, quadrant_left_bottom_position);
497 quadrant_right_bottom_position->
ReflectY(
true);
498 quadrant_right_bottom_position->
ReflectX(
true);
499 stationA->
AddNode(zone1V, 3, quadrant_right_bottom_position);
500 stationA->
AddNode(zone2V, 3, quadrant_right_bottom_position);
501 stationA->
AddNode(zone3V, 3, quadrant_right_bottom_position);
502 stationA->
AddNode(zone4V, 3, quadrant_right_bottom_position);
513 stationA->
AddNode(vertical_frameV, 0, left_vertical_frame_pos);
514 stationA->
AddNode(vertical_frameV, 1, right_vertical_frame_pos);
515 stationA->
AddNode(horizontal_frameV, 0, top_horizontal_frame_pos);
516 stationA->
AddNode(horizontal_frameV, 1, bottom_horizontal_frame_pos);
517 stationA->
AddNode(circle_inner_frameV, 0);
525 mother_volume->
AddNode(stationA, 0, station_pos);
573 TGeoVolume* vertical_outer_frameV =
new TGeoVolume(
"vertical_outer_frame", vertical_outer_frameS);
574 TGeoVolume* horizontal_outer_frameV =
new TGeoVolume(
"horizontal_outer_frame", horizontal_outer_frameS);
575 TGeoVolume* vertical_inner_frameV =
new TGeoVolume(
"vertical_inner_frame", vertical_inner_frameS);
576 TGeoVolume* horizontal_inner_frameV =
new TGeoVolume(
"horizontal_inner_frame", horizontal_inner_frameS);
585 if (sensitive_medium) {
589 Fatal(
"Main",
"Invalid medium for sensitive modules!");
594 vertical_outer_frameV->
SetMedium(frame_medium);
595 horizontal_outer_frameV->
SetMedium(frame_medium);
596 vertical_inner_frameV->
SetMedium(frame_medium);
597 horizontal_inner_frameV->
SetMedium(frame_medium);
598 composite_frameV->
SetMedium(frame_medium);
600 Fatal(
"Main",
"Invalid medium for frames!");
611 module_left_bottom_position->
ReflectY(
true);
617 module_right_bottom_position->
ReflectX(
true);
618 module_right_bottom_position->
ReflectY(
true);
624 module_right_top_position->
ReflectX(
true);
653 comp_frame_left_bottom_position->
ReflectZ(
true);
654 comp_frame_left_bottom_position->
ReflectY(
true);
658 comp_frame_right_bottom_position->
RotateX(180.0);
659 comp_frame_right_bottom_position->
RotateY(180.0);
663 comp_frame_right_top_position->
RotateY(180.0);
670 moduleV->
AddNode(hot_zoneV, 0, hot_zone_trans);
672 composite_frameV->
AddNode(vertical_outer_frameV, 0, left_outer_frame_position);
673 composite_frameV->
AddNode(horizontal_outer_frameV, 0, top_outer_frame_position);
674 composite_frameV->
AddNode(vertical_inner_frameV, 0, right_inner_frame_position);
675 composite_frameV->
AddNode(horizontal_inner_frameV, 0, bottom_inner_frame_position);
677 stationA->
AddNode(moduleV, 0, module_left_bottom_position);
678 stationA->
AddNode(moduleV, 1, module_right_bottom_position);
679 stationA->
AddNode(moduleV, 2, module_right_top_position);
680 stationA->
AddNode(moduleV, 3, module_left_top_position);
682 stationA->
AddNode(composite_frameV, 0, comp_frame_left_bottom_position);
683 stationA->
AddNode(composite_frameV, 1, comp_frame_right_bottom_position);
684 stationA->
AddNode(composite_frameV, 2, comp_frame_right_top_position);
685 stationA->
AddNode(composite_frameV, 3, comp_frame_left_top_position);
693 mother_volume->
AddNode(stationA, 0, station_pos);
702 Bool_t start_positive_angle,
710 Double_t XOuterZoneSize = outer_zone_sizes[0];
711 Double_t YOuterZoneSize = outer_zone_sizes[1];
713 Double_t XRectangleZoneSize = hot_zone_sizes_rect[0];
714 Double_t YRectangleZoneSize = hot_zone_sizes_rect[1];
716 Double_t XMinSlopeZoneSize = hot_zone_sizes_slope[0];
717 Double_t XMaxSlopeZoneSize = hot_zone_sizes_slope[1];
718 Double_t YSlopeZoneSize = hot_zone_sizes_slope[2];
721 TString part_module_name =
"part_moduleS_" + station_name;
726 TString part_rectangle_inner_zone_name =
"part_rectangle_inner_zoneS_" + station_name;
727 TGeoShape* part_rectangle_inner_zoneS =
new TGeoBBox(part_rectangle_inner_zone_name, XRectangleZoneSize / 2,
730 TString part_slope_inner_zone_name =
"part_slope_inner_zoneS_" + station_name;
732 part_slope_inner_zoneS->
SetName(part_slope_inner_zone_name);
733 Double_t x_pos[4] = {XMaxSlopeZoneSize / 2, XMaxSlopeZoneSize / 2 - (XMaxSlopeZoneSize - XMinSlopeZoneSize),
734 -XMaxSlopeZoneSize / 2, -XMaxSlopeZoneSize / 2};
735 Double_t y_pos[4] = {-YSlopeZoneSize / 2, YSlopeZoneSize / 2, YSlopeZoneSize / 2, -YSlopeZoneSize / 2};
741 TString hole_name =
"holeS_" + station_name;
746 TString hole_module_trans_name =
"hole_module_trans_name_" + station_name;
748 new TGeoTranslation(hole_module_trans_name, -XOuterZoneSize / 2, -YOuterZoneSize / 2, 0);
751 TString hole_rectangle_inner_zone_trans_name =
"hole_rectangle_inner_zone_trans_name_" + station_name;
753 new TGeoTranslation(hole_rectangle_inner_zone_trans_name, -XRectangleZoneSize / 2, -YRectangleZoneSize / 2, 0);
756 TString hole_slope_inner_zone_trans_name =
"hole_slope_inner_zone_trans_name_" + station_name;
758 new TGeoTranslation(hole_slope_inner_zone_trans_name, -XMaxSlopeZoneSize / 2, -YSlopeZoneSize / 2, 0);
762 TString bool_expression_module = part_module_name +
" - " + hole_name +
":" + hole_module_trans_name;
765 TString bool_expression_rectangle_inner_zone =
766 part_rectangle_inner_zone_name +
" - " + hole_name +
":" + hole_rectangle_inner_zone_trans_name;
769 TString bool_expression_slope_inner_zone =
770 part_slope_inner_zone_name +
" - " + hole_name +
":" + hole_slope_inner_zone_trans_name;
792 TGeoVolume* horizontal_long_frameV =
new TGeoVolume(
"horizontal_long_frame", horizontal_long_frameS);
793 TGeoVolume* horizontal_short_frameV =
new TGeoVolume(
"horizontal_short_frame", horizontal_short_frameS);
799 if (sensitive_medium) {
800 module_with_slope_inner_zoneV->
SetMedium(sensitive_medium);
801 module_with_rect_inner_zoneV->
SetMedium(sensitive_medium);
802 rectangle_inner_zoneV->
SetMedium(sensitive_medium);
803 slope_inner_zoneV->
SetMedium(sensitive_medium);
805 Fatal(
"Main",
"Invalid medium for sensitive modules!");
810 vertical_frameV->
SetMedium(frame_medium);
811 horizontal_long_frameV->
SetMedium(frame_medium);
812 horizontal_short_frameV->
SetMedium(frame_medium);
813 circle_inner_frameV->
SetMedium(frame_medium);
814 composite_frameV->
SetMedium(frame_medium);
816 Fatal(
"Main",
"Invalid medium for frames!");
832 new TGeoTranslation(-XOuterZoneSize / 2 + XMaxSlopeZoneSize / 2, -YOuterZoneSize / 2 + YSlopeZoneSize / 2, 0);
834 -YOuterZoneSize / 2 + YRectangleZoneSize / 2, 0);
841 right_top_module_position->
RotateY(180.0);
845 right_bottom_module_position->
RotateY(180.0);
846 right_bottom_module_position->
RotateX(180.0);
850 left_bottom_module_position->
RotateX(180.0);
875 module_with_slope_inner_zoneV->
AddNode(slope_inner_zoneV, 0, slope_inner_zone_position);
876 module_with_rect_inner_zoneV->
AddNode(rectangle_inner_zoneV, 0, rect_inner_zone_position);
878 if (start_positive_angle) {
879 stationA->
AddNode(module_with_slope_inner_zoneV, 0, left_top_module_position);
880 stationA->
AddNode(module_with_rect_inner_zoneV, 1, right_top_module_position);
881 stationA->
AddNode(module_with_rect_inner_zoneV, 2, right_bottom_module_position);
882 stationA->
AddNode(module_with_slope_inner_zoneV, 3, left_bottom_module_position);
884 stationA->
AddNode(module_with_rect_inner_zoneV, 0, left_top_module_position);
885 stationA->
AddNode(module_with_slope_inner_zoneV, 1, right_top_module_position);
886 stationA->
AddNode(module_with_slope_inner_zoneV, 2, right_bottom_module_position);
887 stationA->
AddNode(module_with_rect_inner_zoneV, 3, left_bottom_module_position);
891 composite_frameV->
AddNode(vertical_frameV, 0, left_top_frame_position);
892 composite_frameV->
AddNode(vertical_frameV, 1, right_top_frame_position);
893 composite_frameV->
AddNode(horizontal_long_frameV, 0, top_long_frame_position);
894 composite_frameV->
AddNode(horizontal_short_frameV, 0, left_top_short_frame_position);
895 composite_frameV->
AddNode(horizontal_short_frameV, 1, right_top_short_frame_position);
898 stationA->
AddNode(composite_frameV, 0, upper_frame_trans);
899 stationA->
AddNode(composite_frameV, 1, lower_frame_trans);
907 mother_volume->
AddNode(stationA, 0, station_pos);