Skip to content

Commit 5cfbc7c

Browse files
authored
o2-sim: provide material density scaling per module
Added feature: local density scaling (per module).
1 parent 3c0cc06 commit 5cfbc7c

4 files changed

Lines changed: 62 additions & 16 deletions

File tree

Common/SimConfig/include/SimConfig/SimParams.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ struct SimCutParams : public o2::conf::ConfigurableParamHelper<SimCutParams> {
4040

4141
// parameter influencing material manager
4242
struct SimMaterialParams : public o2::conf::ConfigurableParamHelper<SimMaterialParams> {
43+
// Local density value takes precedence over global density value, i.e. local values overwrite the global value.
4344
float globalDensityFactor = 1.f;
45+
std::string localDensityFactor; // Expected format: "SimMaterialParams.localDensityFactor=<mod1>:<value1>,<mod2>:<value2>,..."
4446

4547
O2ParamDef(SimMaterialParams, "SimMaterialParams");
4648
};

Detectors/Base/include/DetectorsBase/MaterialManager.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,18 +204,19 @@ class MaterialManager
204204
// print out all registered media
205205
void printMedia() const;
206206

207-
/// set the density scaling factor
208-
void setDensityScalingFactor(float f) { mDensityFactor = f; }
209-
/// set the density scaling factor
210-
float getDensityScalingFactor() const { return mDensityFactor; }
211-
212207
/// print all tracking media inside a logical volume (specified by name)
213208
/// and all of its daughters
214209
static void printContainingMedia(std::string const& volumename);
215210

216211
private:
217212
MaterialManager() = default;
218213

214+
bool mDensityMapInitialized = false;
215+
std::unordered_map<std::string, float> mDensityMap;
216+
217+
void initDensityMap();
218+
float getDensity(std::string const& modname);
219+
219220
// Hide details by providing these private methods so it cannot happen that special settings
220221
// are applied as default settings by accident using a boolean flag
221222
void Processes(ESpecial special, int globalindex, const std::initializer_list<std::pair<EProc, int>>& parIDValMap);
@@ -246,9 +247,6 @@ class MaterialManager
246247
std::map<std::string, int> mMaterialNameToGlobalIndexMap; // map of unique material name to global index
247248
std::map<std::string, int> mMediumNameToGlobalIndexMap; // map of unique material name to global index
248249

249-
Float_t mDensityFactor = 1.; //! factor that is multiplied to all material densities (ONLY for
250-
// systematic studies)
251-
252250
/// In general, transport cuts and processes are properties of detector media. On the other hand different
253251
/// engines might provide different cuts and processes. Further, the naming convention might differ among
254252
/// engines.

Detectors/Base/src/MaterialManager.cxx

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "rapidjson/istreamwrapper.h"
3232
#include "rapidjson/ostreamwrapper.h"
3333
#include "rapidjson/prettywriter.h"
34+
#include <algorithm>
35+
#include <SimConfig/SimParams.h>
3436

3537
using namespace o2::base;
3638
namespace 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+
94137
void 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
}

macro/o2sim.C

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,6 @@ FairRunSim* o2sim_init(bool asservice, bool evalmat = false)
150150
aligner.setValue(fmt::format("{}.mDetectors", aligner.getName()), o2::detectors::DetID::getNames(detMaskAlign, ','));
151151
}
152152

153-
// set global density scaling factor
154-
auto& matmgr = o2::base::MaterialManager::Instance();
155-
matmgr.setDensityScalingFactor(o2::conf::SimMaterialParams::Instance().globalDensityFactor);
156-
157153
// run init
158154
run->Init();
159155

@@ -207,6 +203,7 @@ FairRunSim* o2sim_init(bool asservice, bool evalmat = false)
207203
// todo: save beam information in the grp
208204

209205
// print summary about cuts and processes used
206+
auto& matmgr = o2::base::MaterialManager::Instance();
210207
std::ofstream cutfile(o2::base::NameConf::getCutProcFileName(confref.getOutPrefix()));
211208
matmgr.printCuts(cutfile);
212209
matmgr.printProcesses(cutfile);

0 commit comments

Comments
 (0)