43int main(
int argc,
char** argv)
46 std::cerr <<
"Usage:\n " << argv[0] <<
" out.json\n";
50 const std::string out_json = argv[1];
52 auto* nist = G4NistManager::Instance();
55 std::vector<G4String> names = nist->GetNistMaterialNames();
56 std::sort(names.begin(), names.end());
58 std::ofstream out(out_json);
60 std::cerr <<
"Cannot write: " << out_json <<
"\n";
64 out << std::fixed << std::setprecision(10);
66 <<
" \"schema\": \"g4_nist_export_v1\",\n"
67 <<
" \"count_requested\": " << names.size() <<
",\n"
68 <<
" \"materials\": {\n";
70 bool first_mat =
true;
72 size_t built_fail = 0;
74 for (
const auto& g4name : names) {
76 G4Material* mat = nist->FindOrBuildMaterial(g4name,
false,
false);
83 const std::string
name = g4name;
86 const double density_g_cm3 = mat->GetDensity() / (
g / cm3);
87 const double radlen_cm = mat->GetRadlen() / cm;
88 const double intlen_cm = mat->GetNuclearInterLength() / cm;
90 const size_t ne = mat->GetNumberOfElements();
91 const auto* elems = mat->GetElementVector();
92 const auto* fracs = mat->GetFractionVector();
98 out <<
" \"" << json_escape(
name) <<
"\": {\n";
99 out <<
" \"name\": \"" << json_escape(
name) <<
"\",\n";
100 out <<
" \"density_g_cm3\": " << density_g_cm3 <<
",\n";
101 out <<
" \"radlen_cm\": " << radlen_cm <<
",\n";
102 out <<
" \"intlen_cm\": " << intlen_cm <<
",\n";
103 out <<
" \"elements\": [\n";
105 for (
size_t i = 0;
i < ne; ++
i) {
106 const G4Element* el = (*elems)[
i];
107 const int Z =
static_cast<int>(el->GetZ());
108 const double A_g_mol = el->GetA() / (
g / mole);
109 const double w = fracs ? fracs[
i] : 0.0;
112 <<
"\"symbol\": \"" << json_escape(el->GetSymbol()) <<
"\", "
113 <<
"\"Z\": " << Z <<
", "
114 <<
"\"A_g_mol\": " << A_g_mol <<
", "
115 <<
"\"mass_fraction\": " <<
w
128 <<
" \"count_built_ok\": " << built_ok <<
",\n"
129 <<
" \"count_built_fail\": " << built_fail <<
"\n"
132 std::cerr <<
"Wrote: " << out_json <<
"\n"
133 <<
"NIST names: " << names.size() <<
", built ok: " << built_ok
134 <<
", failed: " << built_fail <<
"\n";