23 const char* detector_name =
"ecal",
24 const char* version_index =
"1_0")
26 char mothername[30] =
Form(
"%s01", detector_name);
30 Filename =
Form(
"%s_v%s\.geo", detector_name, version_index);
34 f =
new ofstream(Filename.
Data(), ios::out | ios::trunc);
36 cout <<
"filename: " << Filename.
Data() << endl;
38 *f <<
"//*****************************************************" << endl;
39 *f <<
"// ECAL detector for BMN project," << endl;
40 *f <<
"// geometry version " << version_index << endl;
41 *f <<
"// generated " << __DATE__ <<
" by macro create_geom_bmnecal.C" << endl;
42 *f <<
"//*****************************************************" << endl;
44 Int_t number_of_modules_in_one_segment_along_X = 8, number_of_modules_in_one_segment_along_Y = 10,
45 number_of_layers = 220;
50 thickness_scint = 1.5,
51 half_thickness_layer = (thickness_lead + thickness_scint) / 2, thickness_module_front_cover = 2,
56 size_z_module_delta = 150,
57 size_x_segment = size_xy_module * number_of_modules_in_one_segment_along_X,
58 size_y_segment = size_xy_module * number_of_modules_in_one_segment_along_Y,
59 size_z_segment = size_z_module + size_z_module_delta,
61 pos_x_segment_center = -300 - size_x_segment / 2, pos_y_segment_center = 0,
62 pos_z_segment_center = 7200,
63 pos_x_beam_in_ecal_place = 300
67 std::string points, position, rotation;
68 points =
"0.0 0.0 0.0";
69 position =
"0.0 0.0 0.0";
70 rotation =
"1. 0. 0. 0. 1. 0. 0. 0. 1.";
74 char mothername[30] =
Form(
"%s01", detector_name);
76 Mpdshape* mother =
new Mpdshape(f, mothername,
"cave",
"BOX",
"air", points, position, rotation, 1);
77 mother->
Fill_BOX(size_x_segment / 2, size_y_segment / 2, size_z_segment / 2);
78 mother->
SetPosition(pos_x_beam_in_ecal_place + pos_x_segment_center, pos_y_segment_center, pos_z_segment_center);
84 char modulename[30] =
Form(
"%s01mod", detector_name);
86 Mpdshape* module =
new Mpdshape(f, modulename, mothername,
"BOX",
"air", points, position, rotation, 1);
87 module->Fill_BOX(size_xy_module / 2, size_xy_module / 2, size_z_module / 2);
88 module->SetPosition(size_x_segment / 2 - size_xy_module / 2, size_y_segment / 2 - size_xy_module / 2,
89 -size_z_module_delta / 2);
90 module->DumpWithIncrement();
95 Mpdshape* front_cover =
new Mpdshape(f,
"ecal01front", modulename,
"BOX",
"steel", points, position, rotation, 1);
96 front_cover->
Fill_BOX(size_xy_module / 2, size_xy_module / 2, thickness_module_front_cover / 2);
97 front_cover->
SetPosition(0, 0, -size_z_module / 2 + thickness_module_front_cover / 2);
102 char layername[30] =
Form(
"%s01lay", detector_name);
104 Mpdshape* layer =
new Mpdshape(f, layername, modulename,
"BOX",
"air", points, position, rotation, 1);
105 layer->
Fill_BOX(size_xy_module / 2, size_xy_module / 2, half_thickness_layer);
106 layer->
SetPosition(0, 0, -size_z_module / 2 + thickness_module_front_cover + half_thickness_layer);
110 Mpdshape* lead =
new Mpdshape(f,
"ecal01lead", layername,
"BOX",
"lead", points, position, rotation, 1);
111 lead->Fill_BOX(size_xy_module / 2, size_xy_module / 2, thickness_lead / 2);
112 lead->SetPosition(0, 0, -thickness_scint / 2);
113 lead->DumpWithIncrement();
115 Mpdshape* scint =
new Mpdshape(f,
"ecal01scint", layername,
"BOX",
"FscScint", points, position, rotation, 1);
116 scint->Fill_BOX(size_xy_scint / 2, size_xy_scint / 2, thickness_scint / 2);
117 scint->SetPosition(size_xy_module / 2 - size_xy_scint / 2, size_xy_module / 2 - size_xy_scint / 2,
119 scint->DumpWithIncrement();
121 for (
int i = 0;
i < 3;
i++) {
122 for (
int j = 0; j < 3; j++) {
124 scint->SetPosition(size_xy_module / 2 - size_xy_scint / 2 - size_xy_scint *
i,
125 size_xy_module / 2 - size_xy_scint / 2 - size_xy_scint * j, thickness_lead / 2);
126 scint->DumpWithIncrement();
133 for (
int i = 1;
i < number_of_layers;
i++) {
135 -size_z_module / 2 + thickness_module_front_cover + half_thickness_layer
136 +
i * 2 * half_thickness_layer);
142 for (
int i = 0;
i < number_of_modules_in_one_segment_along_X;
i++) {
143 for (
int j = 0; j < number_of_modules_in_one_segment_along_Y; j++) {
145 module->SetPosition(size_x_segment / 2 - size_xy_module / 2 - size_xy_module * i,
146 size_y_segment / 2 - size_xy_module / 2 - size_xy_module * j,
147 -size_z_module_delta / 2);
148 module->DumpWithIncrement();
155 mother->
SetPosition(pos_x_beam_in_ecal_place - pos_x_segment_center, pos_y_segment_center, pos_z_segment_center);