@@ -123,22 +123,51 @@ void MaterialManager::initDensityMap()
123123 mDensityMapInitialized = true ;
124124}
125125
126- float MaterialManager::getDensity (std::string const & modname)
126+ float MaterialManager::getDensity (std::string const & modname, std::string const & matname )
127127{
128+ // This function returns the final density for a material of name matname inside module modname.
129+ // The priority is
130+ // - return density for a specific module + material if it exists in the lookup
131+ // - return density for the module if it exists in the the lookup
132+ // - return global density factor
133+
134+ auto debug = getenv (" O2SIM_MATMGR_LOCALDENSITY_DEBUG" );
135+
128136 if (!mDensityMapInitialized ) {
129137 initDensityMap ();
130138 }
131- if (mDensityMap .find (modname) != mDensityMap .end ()) {
132- return mDensityMap [modname];
139+ // density on final material level
140+ // (this works by a name lookup of pair "modname/matname")
141+ std::string lookupstring = modname + " /" + matname;
142+ auto iter = mDensityMap .find (lookupstring);
143+ if (iter != mDensityMap .end ()) {
144+ if (debug) {
145+ LOG (info) << " MatManager - " << modname << " /" << matname << " : applying density " << iter->second << " from material match" ;
146+ }
147+ return iter->second ;
133148 }
134- return o2::conf::SimMaterialParams::Instance ().globalDensityFactor ;
149+ // density on module level
150+ iter = mDensityMap .find (modname);
151+ if (iter != mDensityMap .end ()) {
152+ if (debug) {
153+ LOG (info) << " MatManager - " << modname << " /" << matname << " : applying density " << iter->second << " from module match" ;
154+ }
155+ return iter->second ;
156+ }
157+ // global factor
158+ const auto global = o2::conf::SimMaterialParams::Instance ().globalDensityFactor ;
159+ if (debug && global != 1.0 ) {
160+ LOG (info) << " MatManager - " << modname << " /" << matname << " : applying global density " << iter->second ;
161+ }
162+ return global;
135163}
136164
137165void MaterialManager::Material (const char * modname, Int_t imat, const char * name, Float_t a, Float_t z, Float_t dens,
138166 Float_t radl, Float_t absl, Float_t* buf, Int_t nwbuf)
139167{
140168 TString uniquename = modname;
141- auto densityFactor = getDensity (modname);
169+ auto densityFactor = getDensity (modname, name);
170+
142171 uniquename.Append (" _" );
143172 uniquename.Append (name);
144173 if (TVirtualMC::GetMC ()) {
@@ -173,7 +202,7 @@ void MaterialManager::Mixture(const char* modname, Int_t imat, const char* name,
173202 Int_t nlmat, Float_t* wmat)
174203{
175204 TString uniquename = modname;
176- auto densityFactor = getDensity (modname);
205+ auto densityFactor = getDensity (modname, name );
177206 uniquename.Append (" _" );
178207 uniquename.Append (name);
179208
0 commit comments