56int main(
int argc,
char** argv)
59 std::cerr <<
"Usage:\n " << argv[0] <<
" out.json\n";
63 const std::string out_json = argv[1];
65 auto* nist = G4NistManager::Instance();
68 std::vector<G4String> names = nist->GetNistMaterialNames();
69 std::sort(names.begin(), names.end());
71 std::ofstream out(out_json);
73 std::cerr <<
"Cannot write: " << out_json <<
"\n";
77 out << std::fixed << std::setprecision(10);
79 <<
" \"schema\": \"g4_nist_export_v1\",\n"
80 <<
" \"count_requested\": " << names.size() <<
",\n"
81 <<
" \"materials\": {\n";
83 bool first_mat =
true;
85 size_t built_fail = 0;
87 for (
const auto& g4name : names) {
89 G4Material* mat = nist->FindOrBuildMaterial(g4name,
false,
false);
96 const std::string
name = g4name;
99 const double density_g_cm3 = mat->GetDensity() / (
g / cm3);
100 const double radlen_cm = mat->GetRadlen() / cm;
101 const double intlen_cm = mat->GetNuclearInterLength() / cm;
103 const size_t ne = mat->GetNumberOfElements();
104 const auto* elems = mat->GetElementVector();
105 const auto* fracs = mat->GetFractionVector();
111 out <<
" \"" << json_escape(
name) <<
"\": {\n";
112 out <<
" \"name\": \"" << json_escape(
name) <<
"\",\n";
113 out <<
" \"density_g_cm3\": " << density_g_cm3 <<
",\n";
114 out <<
" \"radlen_cm\": " << radlen_cm <<
",\n";
115 out <<
" \"intlen_cm\": " << intlen_cm <<
",\n";
116 out <<
" \"elements\": [\n";
118 for (
size_t i = 0;
i < ne; ++
i) {
119 const G4Element* el = (*elems)[
i];
120 const int Z =
static_cast<int>(el->GetZ());
121 const double A_g_mol = el->GetA() / (
g / mole);
122 const double w = fracs ? fracs[
i] : 0.0;
125 <<
"\"symbol\": \"" << json_escape(el->GetSymbol()) <<
"\", "
126 <<
"\"Z\": " << Z <<
", "
127 <<
"\"A_g_mol\": " << A_g_mol <<
", "
128 <<
"\"mass_fraction\": " <<
w
141 <<
" \"count_built_ok\": " << built_ok <<
",\n"
142 <<
" \"count_built_fail\": " << built_fail <<
"\n"
145 std::cerr <<
"Wrote: " << out_json <<
"\n"
146 <<
"NIST names: " << names.size() <<
", built ok: " << built_ok
147 <<
", failed: " << built_fail <<
"\n";