130 if (!particle->GetProcessManager()) {
132 message =
"Cannot add EM model to ";
133 message += particle->GetParticleName().c_str();
134 message +=
" : particle has not defined process manager";
140 G4ProcessVector* processVector =
141 particle->GetProcessManager()->GetProcessList();
142 for (
size_t i = 0; i < processVector->length(); i++) {
147 G4int currentSubType = (*processVector)[i]->GetProcessSubType();
150 G4cout <<
"TG4EmModelPhysics::AddModel, processing "
151 << (*processVector)[i]->GetProcessName() << G4endl;
155 if (currentSubType == fIonisation &&
157 subType = currentSubType;
161 G4bool applyToTransportationProcess =
false;
163 ((currentSubType == fMultipleScattering) ||
164 (currentSubType == TRANSPORTATION_WITH_MSC))) {
165 subType = currentSubType;
166 applyToTransportationProcess = (currentSubType == TRANSPORTATION);
169 if (subType == 0)
continue;
172 G4String processName = (*processVector)[i]->GetProcessName();
175 G4BiasingProcessInterface* biasingProcess =
176 dynamic_cast<G4BiasingProcessInterface*
>((*processVector)[i]);
177 if (biasingProcess) {
178 processName = biasingProcess->GetWrappedProcess()->GetProcessName();
180 G4cout <<
"Unwrapping biasing process: " << processName << G4endl;
184 if (applyToTransportationProcess) {
192 G4VEmModel* g4EmModel = 0;
193 G4VEmFluctuationModel* g4FluctModel = 0;
197 G4PAIModel* pai =
new G4PAIModel(particle,
"PAIModel");
198 if (verboseLevel > 2) {
199 G4cout <<
"New G4PAIModel" << G4endl;
206 if (verboseLevel > 2) {
207 G4cout <<
"New G4PAIPhotModel" << G4endl;
209 G4PAIPhotModel* paiPhot =
new G4PAIPhotModel(particle,
"PAIPhotModel");
211 g4FluctModel = paiPhot;
215 if (verboseLevel > 2) {
216 G4cout <<
"New TG4SpecialUrbanMscModel" << G4endl;
222 for (G4int j = 0; j < G4int(regions.size()); ++j) {
224 G4String regionName = regions[j];
228 <<
" to particle: " << particle->GetParticleName()
229 <<
" process: " << processName
230 <<
" region(=material): " << regionName << G4endl;
233 G4LossTableManager::Instance()->EmConfigurator()->SetExtraEmModel(
234 particle->GetParticleName(), processName, g4EmModel, regionName, 0.0,
235 DBL_MAX, g4FluctModel);
238 if (!regions.size()) {
240 G4LogicalVolume* worldLV =
242 G4String regionName = worldLV->GetRegion()->GetName();
244 G4LossTableManager::Instance()->EmConfigurator()->SetExtraEmModel(
245 particle->GetParticleName(), processName, g4EmModel, regionName, 0.0,
246 DBL_MAX, g4FluctModel);
253 const std::vector<TG4ModelConfiguration*>& models)
259 G4cout <<
"TG4EmModelPhysics::AddModels" << G4endl;
260 std::vector<TG4ModelConfiguration*>::const_iterator it;
261 for (it = models.begin(); it != models.end(); it++) {
266 std::vector<TG4ModelConfiguration*>::const_iterator it;
267 for (it = models.begin(); it != models.end(); it++) {
271 const std::vector<G4String>& regions = (*it)->GetRegions();
273 if (!regions.size()) {
276 message =
"No regions are defined for ";
277 message += (*it)->GetModelName().data();
283 auto aParticleIterator = GetParticleIterator();
284 aParticleIterator->reset();
285 while ((*aParticleIterator)()) {
287 G4String particleName = particle->GetParticleName();
290 if (! (*it)->HasParticle(particleName) )
continue;
293 if (particle->GetParticleName() ==
"monopole") {
294 G4cout <<
"TG4EmModelPhysics::AddModels - skipping monopole" << G4endl;
298 AddModel(emModel, particle, regions);