3131#include " rapidjson/istreamwrapper.h"
3232#include " rapidjson/ostreamwrapper.h"
3333#include " rapidjson/prettywriter.h"
34+ #include < algorithm>
35+ #include < SimConfig/SimParams.h>
3436
3537using namespace o2 ::base;
3638namespace rj = rapidjson;
@@ -91,21 +93,65 @@ const std::unordered_map<ECut, const char*> MaterialManager::mCutIDToName = {
9193 {ECut::kPPCUTM , " PPCUTM" },
9294 {ECut::kTOFMAX , " TOFMAX" }};
9395
96+ // Constructing a map between module names and local material density values
97+ void MaterialManager::initDensityMap ()
98+ {
99+ auto & globalDensityFactor = o2::conf::SimMaterialParams::Instance ().globalDensityFactor ;
100+ if (globalDensityFactor < 0 ) {
101+ LOG (fatal) << " Negative value "
102+ << globalDensityFactor
103+ << " found for global material density!\n " ;
104+ }
105+ std::string token;
106+ std::istringstream input (
107+ o2::conf::SimMaterialParams::Instance ().localDensityFactor );
108+ std::vector<std::string> inputModuleNames;
109+ std::vector<std::string> inputDensityValues;
110+ while (std::getline (input, token, ' ,' )) {
111+ std::size_t pos = token.find (' :' );
112+ inputModuleNames.push_back (token.substr (0 , pos));
113+ inputDensityValues.push_back (token.substr (pos + 1 ));
114+ }
115+ for (std::size_t i = 0 ; i < inputModuleNames.size (); i++) {
116+ if (std::stof (inputDensityValues[i]) < 0 ) {
117+ LOG (fatal) << " Negative value " << std::stof (inputDensityValues[i])
118+ << " found for material density in module "
119+ << inputModuleNames[i] << " !\n " ;
120+ }
121+ mDensityMap [inputModuleNames[i]] = std::stof (inputDensityValues[i]);
122+ }
123+ mDensityMapInitialized = true ;
124+ }
125+
126+ float MaterialManager::getDensity (std::string const & modname)
127+ {
128+ if (!mDensityMapInitialized ) {
129+ initDensityMap ();
130+ }
131+ if (mDensityMap .find (modname) != mDensityMap .end ()) {
132+ return mDensityMap [modname];
133+ }
134+ return o2::conf::SimMaterialParams::Instance ().globalDensityFactor ;
135+ }
136+
94137void MaterialManager::Material (const char * modname, Int_t imat, const char * name, Float_t a, Float_t z, Float_t dens,
95138 Float_t radl, Float_t absl, Float_t* buf, Int_t nwbuf)
96139{
97140 TString uniquename = modname;
141+ auto densityFactor = getDensity (modname);
98142 uniquename.Append (" _" );
99143 uniquename.Append (name);
100144 if (TVirtualMC::GetMC ()) {
101145 // Check this!!!
102146 int kmat = -1 ;
103- TVirtualMC::GetMC ()->Material (kmat, uniquename.Data (), a, z, dens * mDensityFactor , radl, absl, buf, nwbuf);
147+ TVirtualMC::GetMC ()->Material (kmat, uniquename.Data (), a, z,
148+ dens * densityFactor, radl, absl, buf, nwbuf);
104149 mMaterialMap [modname][imat] = kmat;
105150 insertMaterialName (uniquename.Data (), kmat);
106151 } else {
107152 auto uid = gGeoManager ->GetListOfMaterials ()->GetSize ();
108- auto mat = gGeoManager ->Material (uniquename.Data (), a, z, dens * mDensityFactor , uid, radl, absl);
153+ auto mat = gGeoManager ->Material (uniquename.Data (), a, z,
154+ dens * densityFactor, uid, radl, absl);
109155 mMaterialMap [modname][imat] = uid;
110156 insertMaterialName (uniquename.Data (), uid);
111157 }
@@ -127,13 +173,15 @@ void MaterialManager::Mixture(const char* modname, Int_t imat, const char* name,
127173 Int_t nlmat, Float_t* wmat)
128174{
129175 TString uniquename = modname;
176+ auto densityFactor = getDensity (modname);
130177 uniquename.Append (" _" );
131178 uniquename.Append (name);
132179
133180 if (TVirtualMC::GetMC ()) {
134181 // Check this!!!
135182 int kmat = -1 ;
136- TVirtualMC::GetMC ()->Mixture (kmat, uniquename.Data (), a, z, dens * mDensityFactor , nlmat, wmat);
183+ TVirtualMC::GetMC ()->Mixture (kmat, uniquename.Data (), a, z,
184+ dens * densityFactor, nlmat, wmat);
137185 mMaterialMap [modname][imat] = kmat;
138186 insertMaterialName (uniquename.Data (), kmat);
139187
@@ -150,7 +198,8 @@ void MaterialManager::Mixture(const char* modname, Int_t imat, const char* name,
150198 wmat[i] *= a[i] / amol;
151199 }
152200 }
153- auto mix = gGeoManager ->Mixture (uniquename.Data (), a, z, dens * mDensityFactor , nlmat, wmat, uid);
201+ auto mix = gGeoManager ->Mixture (uniquename.Data (), a, z,
202+ dens * densityFactor, nlmat, wmat, uid);
154203 mMaterialMap [modname][imat] = uid;
155204 insertMaterialName (uniquename.Data (), uid);
156205 }
0 commit comments