107 if (gSystem->GetPathInfo(yamlfile.Data(), info) != 0) {
108 SetStateError(Form(
"File %s does not exist.", yamlfile.Data()));
112 YAML::Node yaml_all = YAML::LoadFile(yamlfile.Data());
115 YAML::Emitter emitter;
117 std::cout << emitter.c_str() << std::endl;
118 std::cout << yaml_all.size() << std::endl;
122 YAML::Node yaml_mat = yaml_all[kNodeKeyMaterial].as<YAML::Node>();
123 std::vector<TGeoMaterial *> mat_vec;
124 std::vector<TGeoMedium *> med_vec;
125 for (
decltype(yaml_mat.size()) i = 0; i < yaml_mat.size(); i++) {
126 TString name = yaml_mat[i][kNodeKeyName].as<std::string>();
127 Double_t atm_mass = yaml_mat[i][kNodeKeyAMass].as<
double>();
128 Double_t atm_num = yaml_mat[i][kNodeKeyANum].as<
double>();
129 Double_t density = yaml_mat[i][kNodeKeyDensity].as<
double>();
130 mat_vec.emplace_back(
new TGeoMaterial(name.Data(), atm_mass, atm_num, density));
131 med_vec.emplace_back(
new TGeoMedium(name.Data(), i + 1, mat_vec[mat_vec.size() - 1]));
135 YAML::Node yaml_top = yaml_all[kNodeKeyVolume][kNodeKeyTop].as<YAML::Node>();
136 TString top_name = yaml_top[kNodeKeyName].as<std::string>();
137 Int_t top_mat_id = yaml_top[kNodeKeyMaterial].as<
int>();
138 DoubleVec_t top_size = yaml_top[kNodeKeySize].as<std::vector<double>>();
139 if (top_size.size() != 3) {
140 SetStateError(
"input yaml error");
145 fGeom->MakeBox(top_name.Data(), med_vec[top_mat_id], top_size[0] / 2., top_size[1] / 2., top_size[2] / 2.);
146 fGeom->SetTopVolume(top);
149 YAML::Node yaml_prm = yaml_all[kNodeKeyConposition][kNodeKeyDetector].as<YAML::Node>();
150 YAML::Node yaml_det = yaml_all[kNodeKeyVolume][kNodeKeyDetector].as<YAML::Node>();
151 if (yaml_prm.size() != yaml_det.size()) {
152 SetStateError(
"in yaml, conposition number and detector number is different");
156 for (
decltype(yaml_det.size()) i = 0; i < yaml_det.size(); i++) {
157 if (yaml_prm[i][kNodeKeyName].as<std::string>() != yaml_det[i][kNodeKeyName].as<std::string>()) {
158 SetStateError(
"in yaml, set same order for composition and detector");
161 TString det_name = yaml_det[i][kNodeKeyName].as<std::string>();
162 Int_t det_mat_id = yaml_det[i][kNodeKeyMaterial].as<
int>();
163 DoubleVec_t det_size = yaml_det[i][kNodeKeySize].as<std::vector<double>>();
164 if (det_size.size() != 3) {
165 SetStateError(
"input yaml error, detector volume size must be 3D");
170 if (yaml_det[i][kNodeKeyType].as<std::string>() !=
"box") {
171 SetStateError(
"Currently only support only box type");
176 fGeom->MakeBox(det_name.Data(), med_vec[det_mat_id], det_size[0] / 2., det_size[1] / 2., det_size[2] / 2.);
177 DoubleVec_t rot_point = yaml_prm[i][kNodeKeyCenterRot].as<std::vector<double>>();
178 DoubleVec_t offset = yaml_prm[i][kNodeKeyOffset].as<std::vector<double>>();
179 IntVec_t det_strip = yaml_prm[i][kNodeKeyStrip].as<std::vector<int>>();
180 if (rot_point.size() != 3 || offset.size() != 3 || det_strip.size() != 2) {
181 SetStateError(
"input yaml error, detector conposition setting is wrong");
184 Double_t distance = yaml_prm[i][kNodeKeyDistance].as<
double>();
185 Double_t angle = yaml_prm[i][kNodeKeyAngle].as<
double>() *
deg2rad;
187 TVector3 det_pos(offset[0], offset[1], distance + offset[2]);
188 det_pos.RotateY(angle);
189 TVector3 rot_point_vec(rot_point[0], rot_point[1], rot_point[2]);
190 det_pos += rot_point_vec;
192 TGeoCombiTrans *det_trans =
193 new TGeoCombiTrans(det_pos.X(), det_pos.Y(), det_pos.Z(),
new TGeoRotation(
"rot", 90.0, angle /
deg2rad, 0.0));
194 top->AddNode(det, i, det_trans);
198 DoubleVec_t thickness = yaml_prm[i][kNodeKeyThickness].as<std::vector<double>>();
199 DoubleVec_t pedestal = yaml_prm[i][kNodeKeyPedestal].as<std::vector<double>>();
200 if (thickness.size() != pedestal.size()) {
201 SetStateError(
"input yaml error, thickness and pedestal array size are different");
204 std::vector<std::string> material = yaml_prm[i][kNodeKeyMaterial].as<std::vector<std::string>>();
205 StringVec_t material_vec;
206 for (
decltype(thickness.size()) j = 0; j < thickness.size(); j++) {
207 if (material.size() == 1) {
208 material_vec.emplace_back(material[0]);
209 }
else if (material.size() == thickness.size()) {
210 material_vec.emplace_back(material[j]);
212 SetStateError(
"input yaml error, composition thickness and material is wrong");
217 if (thickness.size() != material_vec.size()) {
218 SetStateError(
"something wrong happen...");
223 prm->
SetN(thickness.size());
237 YAML::Node yaml_target = yaml_all[kNodeKeyConposition][kNodeKeyTarget].as<YAML::Node>();
238 for (
decltype(yaml_target.size()) i = 0; i < yaml_target.size(); i++) {
240 TString name = yaml_target[i][kNodeKeyName].as<std::string>();
241 Bool_t is_gas = yaml_target[i][kNodeKeyIsGas].as<
bool>();
242 Double_t z = yaml_target[i][kNodeKeyZ].as<
double>();
243 Double_t thickness = yaml_target[i][kNodeKeyThickness].as<
double>();
251 fGeom->CloseGeometry();
252 fGeom->SetTopVisible();
253 top->SetLineColor(kRed);
256 gDirectory->Add(top);