BOSS 7.1.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BgsPhysicsList.cc
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2// File and Version Information:
3// $Id: BgsPhysicsList.cc,v 1.4 2022/01/06 03:49:07 maqm Exp $
4//
5// Description:
6// BgsPhysicsList
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author List:
12// Torre Wenaus, David Williams, Marc Verderi, Bill Lockman, Dennis
13//Wright
14//
15// Copyright Information:
16// Copyright (C) 2001 SLAC
17//
18// Created:
19// Modification history:
20//
21//-----------------------------------------------------------------------------
22
23#include "BaBar.hh"
24#include <math.h>
25#include "BgsPhysicsList.hh"
26#include <iomanip>
27//#include "Bogus/BgsPDGEncode.hh"
28//#include "Bogus/BgsControl.hh"
29//#include "Bogus/BgsLooperDeath.hh"
30//#include "Bogus/BgsChargedStepDeath.hh"
31//#include "Bogus/BgsPhysicsRegistrar.hh"
32#include "BgsGenocide.hh"
33#include "BgsGentleGenocide.hh"
34//#include "Bogus/BgsLimitedTransportation.hh"
35
36//#include "ErrLogger/ErrLog.hh"
37
38#include "G4ParticleDefinition.hh"
39#include "G4ParticleWithCuts.hh"
40#include "G4ProcessManager.hh"
41#include "G4ProcessVector.hh"
42#include "G4ParticleTypes.hh"
43#include "G4ParticleTable.hh"
44#include "G4FastSimulationManagerProcess.hh"
45#include "G4ComptonScattering.hh"
46#include "G4GammaConversion.hh"
47#include "G4PhotoElectricEffect.hh"
48#include "G4VMultipleScattering.hh"
49//#include "G4MultipleScattering.hh"
50#include "G4eIonisation.hh"
51#include "G4eBremsstrahlung.hh"
52#include "G4eplusAnnihilation.hh"
53#include "G4MuIonisation.hh"
54#include "G4MuBremsstrahlung.hh"
55#include "G4MuPairProduction.hh"
56#include "G4hIonisation.hh"
57#include "G4Decay.hh"
58#include "G4Material.hh"
59#include "G4ProductionCuts.hh"
60#include "G4ProductionCutsTable.hh"
61#include "G4MaterialCutsCouple.hh"
62//
63// Gamma- and electro-nuclear models and processes
64//
65//#include "G4GammaNuclearReaction.hh"
66//#include "G4ElectroNuclearReaction.hh"
67#include "G4TheoFSGenerator.hh"
68#include "G4GeneratorPrecompoundInterface.hh"
69#include "G4QGSModel.hh"
70#include "G4GammaParticipants.hh"
71#include "G4QGSMFragmentation.hh"
72#include "G4ExcitedStringDecay.hh"
73#include "G4PhotoNuclearProcess.hh"
74#include "G4ElectronNuclearProcess.hh"
75#include "G4PositronNuclearProcess.hh"
76//
77// Hadronic processes
78//
79#include "G4HadronElasticProcess.hh"
80#include "G4HadronCaptureProcess.hh"
81#include "G4HadronFissionProcess.hh"
82#include "G4PionPlusInelasticProcess.hh"
83#include "G4PionMinusInelasticProcess.hh"
84#include "G4KaonPlusInelasticProcess.hh"
85#include "G4KaonMinusInelasticProcess.hh"
86#include "G4KaonZeroLInelasticProcess.hh"
87#include "G4KaonZeroSInelasticProcess.hh"
88#include "G4ProtonInelasticProcess.hh"
89#include "G4AntiProtonInelasticProcess.hh"
90#include "G4NeutronInelasticProcess.hh"
91#include "G4AntiNeutronInelasticProcess.hh"
92#include "G4LambdaInelasticProcess.hh"
93#include "G4AntiLambdaInelasticProcess.hh"
94#include "G4DeuteronInelasticProcess.hh"
95#include "G4TritonInelasticProcess.hh"
96#include "G4AlphaInelasticProcess.hh"
97#include "G4ShortLivedConstructor.hh"
98//
99// Hadronic interaction models
100// Low energy (E < 20 GeV) part only
101//
102/*#include "G4LElastic.hh"
103#include "G4LEAntiProtonInelastic.hh"
104#include "G4LEAntiNeutronInelastic.hh"
105#include "G4LEAntiLambdaInelastic.hh"
106#include "G4LEDeuteronInelastic.hh"
107#include "G4LETritonInelastic.hh"
108#include "G4LEAlphaInelastic.hh"
109
110#include "G4NeutronHPElastic.hh"
111#include "G4NeutronHPElasticData.hh"
112#include "G4NeutronHPInelastic.hh"
113#include "G4NeutronHPInelasticData.hh"
114#include "G4NeutronHPFission.hh"
115#include "G4NeutronHPFissionData.hh"
116#include "G4NeutronHPCapture.hh"
117#include "G4NeutronHPCaptureData.hh"
118#include "G4LFission.hh"
119#include "G4LCapture.hh"
120*/
121#include "G4CascadeInterface.hh"
122#include "CLHEP/Random/RanecuEngine.h"
123//
124// Pi+/pi- inelastic cross sections
125//
126#include "G4PiNuclearCrossSection.hh"
127using std::ostream;
128
129//BgsPhysicsList::BgsPhysicsList( BgsControl *theControl,
130// BgsPhysicsRegistrar *pr)
131BgsPhysicsList::BgsPhysicsList() : G4VUserPhysicsList(),//bes
132// control(theControl),
133// first(true),
134 first(false) //bes
135// physicsRegistrar(pr),
136// theLooperDeath(0) // looperdeath process
137{
138 SetVerboseLevel(2);
139 bertini_model = new G4CascadeInterface;
140}
141
142
144{
145// delete theLooperDeath;
146}
147
148void
150{
151
152 // In this method, static member functions should be called
153 // for all particles which you want to use.
154 // This ensures that objects of these particle types will be
155 // created in the program.
156
162/*
163 if (first) {
164 first = false;
165
166 //
167 // Check to make sure our particles have valid PDG encodings
168 //
169 BgsPDGEncode encode(false);
170
171 G4ParticleTable *table = G4ParticleTable::GetParticleTable();
172
173 G4int nProb = 0;
174 G4int n = table->entries();
175 while(n--) {
176 G4ParticleDefinition *part = table->GetParticle(n);
177 if (encode.pdt(part) == 0) {
178 nProb++;
179 std::cerr << "The Geant4 particle \""
180 << part->GetParticleName()
181 << "\" is not recognized by BgsPDGEncode" << std::endl;
182 }
183 }
184
185 if(nProb > 0) std::cerr << "One or more PDG encoding errors" <<
186std::endl;
187 }
188*/
189 // Add short lived particles for high energy models,
190 // but don't check PDG codes - they are not propagated in Bogus anyway
191
192 G4ShortLivedConstructor shortLived;
193 shortLived.ConstructParticle();
194}
195
196void
198{
199 // pseudo-particles
200 G4Geantino::GeantinoDefinition();
201 G4ChargedGeantino::ChargedGeantinoDefinition();
202
203 // gamma
204 G4Gamma::GammaDefinition();
205
206 // optical photon
207 G4OpticalPhoton::OpticalPhotonDefinition();
208}
209
210void
212{
213 // leptons
214 G4Electron::ElectronDefinition();
215 G4Positron::PositronDefinition();
216 G4MuonPlus::MuonPlusDefinition();
217 G4MuonMinus::MuonMinusDefinition();
218 G4TauPlus::TauPlusDefinition();
219 G4TauMinus::TauMinusDefinition();
220
221 G4NeutrinoE::NeutrinoEDefinition();
222 G4AntiNeutrinoE::AntiNeutrinoEDefinition();
223 G4NeutrinoMu::NeutrinoMuDefinition();
224 G4AntiNeutrinoMu::AntiNeutrinoMuDefinition();
225 G4NeutrinoTau::NeutrinoTauDefinition();
226 G4AntiNeutrinoTau::AntiNeutrinoTauDefinition();
227}
228
229void
231{
232 // mesons
233 G4PionPlus ::PionPlusDefinition();
234 G4PionMinus ::PionMinusDefinition();
235 G4PionZero ::PionZeroDefinition();
236 G4Eta ::EtaDefinition();
237 G4EtaPrime ::EtaPrimeDefinition();
238 // G4RhoZero ::RhoZeroDefinition();
239 G4KaonPlus ::KaonPlusDefinition();
240 G4KaonMinus ::KaonMinusDefinition();
241 G4KaonZero ::KaonZeroDefinition();
242 G4AntiKaonZero ::AntiKaonZeroDefinition();
243 G4KaonZeroLong ::KaonZeroLongDefinition();
244 G4KaonZeroShort::KaonZeroShortDefinition();
245}
246
247void
249{
250 // baryons
251 G4Proton ::ProtonDefinition();
252 G4AntiProton ::AntiProtonDefinition();
253 G4Neutron ::NeutronDefinition();
254 G4AntiNeutron ::AntiNeutronDefinition();
255 G4Lambda ::LambdaDefinition();
256 G4AntiLambda ::AntiLambdaDefinition();
257 G4SigmaPlus ::SigmaPlusDefinition();
258 G4SigmaZero ::SigmaZeroDefinition();
259 G4SigmaMinus ::SigmaMinusDefinition();
260 G4AntiSigmaPlus ::AntiSigmaPlusDefinition();
261 G4AntiSigmaZero ::AntiSigmaZeroDefinition();
262 G4AntiSigmaMinus::AntiSigmaMinusDefinition();
263 G4XiZero ::XiZeroDefinition();
264 G4XiMinus ::XiMinusDefinition();
265 G4AntiXiZero ::AntiXiZeroDefinition();
266 G4AntiXiMinus ::AntiXiMinusDefinition();
267 G4OmegaMinus ::OmegaMinusDefinition();
268 G4AntiOmegaMinus::AntiOmegaMinusDefinition();
269 G4Deuteron ::DeuteronDefinition();
270 G4Triton ::TritonDefinition();
271 G4He3 ::He3Definition();
272 G4Alpha ::AlphaDefinition();
273}
274
275void
277{
278 G4GenericIon::GenericIonDefinition();
279}
280
281void
283{
284 //if (control->UseBgsTran()) {
285/* if(0) {
286 AddBgsTransportation(control->GetMaxTrackingStepSize(),
287 control->GetMaxVacStepSize(),
288 control->GetVacName());
289 std::cout << "+^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^+ " <<
290 std::endl;
291 std::cout << "+v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v+ " <<
292 std::endl;
293 std::cout << " +--- ---+ " <<
294 std::endl;
295 std::cout << " +--- BgsTransportation ---+ " <<
296 std::endl;
297 std::cout << " +--- USED !! ---+ " <<
298 std::endl;
299 std::cout << " +--- ---+ " <<
300 std::endl;
301 std::cout << "+^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^+ " <<
302 std::endl;
303 std::cout << "+v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v+ " <<
304 std::endl;
305
306 }
307 else {
308 */
309 /*
310 AddTransportation();
311 std::cout << "+^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^+ " <<
312 std::endl;
313 std::cout << "+v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v+ " <<
314 std::endl;
315 std::cout << " +--- ---+ " <<
316 std::endl;
317 std::cout << " +--- G4Transportation ---+ " <<
318 std::endl;
319 std::cout << " +--- USED !! ---+ " <<
320 std::endl;
321 std::cout << " +--- ---+ " <<
322 std::endl;
323 std::cout << "+^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^+ " <<
324 std::endl;
325 std::cout << "+v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v+ " <<
326 std::endl;
327// }
328 // AddParameterisation();
329 ConstructEM();
330 ConstructLeptHad();
331 ConstructHad();
332 ConstructGeneral();
333 ConstructNeutrinoGenocide();
334 ConstructIonFix();
335 ConstructNeutronFix();*/
336}
337/*
338void
339BgsPhysicsList::AddBgsTransportation( G4double maxTrackStepSize, G4double
340maxVacStepSize, const G4String& vacName )
341{
342 static const bool beParanoid = false;
343 BgsTransportation *theTransportationProcess =
344 new BgsLimitedTransportation(maxTrackStepSize*mm, maxVacStepSize*mm,
345vacName, beParanoid );
346
347 // loop over all particles in G4ParticleTable
348 theParticleIterator->reset();
349 while( (*theParticleIterator)() ){
350 G4ParticleDefinition* particle = theParticleIterator->value();
351 G4ProcessManager* pmanager = particle->GetProcessManager();
352 if (!particle->IsShortLived()) {
353 // Add transportation process for all particles other than
354"shortlived"
355 if ( pmanager == 0) {
356 // Error !! no process manager
357 ErrMsg(fatal) << "G4VUserPhysicsList::AddTransportation : no process
358manager" << endmsg;
359 } else {
360 // add transportation with ordering = ( -1, "first", "first" )
361 pmanager ->AddProcess(theTransportationProcess);
362 pmanager ->SetProcessOrderingToFirst(theTransportationProcess,
363 idxAlongStep);
364 pmanager ->SetProcessOrderingToFirst(theTransportationProcess,
365 idxPostStep);
366 physicsRegistrar->Register( theTransportationProcess, pmanager,
367 "transport" );
368 }
369 } else {
370 // shortlived particle case
371 }
372 }
373}
374*/
375// **************************** EM Processes********************************
376
377void
379{
380 /* theParticleIterator->reset();
381 while( (*theParticleIterator)() ){
382 G4ParticleDefinition* particle = theParticleIterator->value();
383 G4ProcessManager* pmanager = particle->GetProcessManager();
384 G4String particleName = particle->GetParticleName();
385
386 if (particleName == "gamma") {
387 // gamma
388 // Construct processes for gamma
389
390 pmanager->AddDiscreteProcess( new G4PhotoElectricEffect());
391 pmanager->AddDiscreteProcess( new G4ComptonScattering());
392 pmanager->AddDiscreteProcess( new G4GammaConversion());
393
394 } else if (particleName == "e-") {
395 //electron
396 // Construct processes for electron
397 //change for geant4.9.0.p01
398 //G4MultipleScattering* ms = new G4MultipleScattering();
399 ms->MscStepLimitation(false,0.02);
400 ms->SetRangeFactor(0.02);
401
402 // ms->SetLateralDisplasmentFlag(false);
403
404 G4eIonisation *ionizationProcess = new G4eIonisation();
405 // ionizationProcess->SetLinearLossLimit(1.0);
406
407 pmanager->AddProcess( ms, -1, 1,1);
408 pmanager->AddProcess( ionizationProcess, -1, 2,2);
409 pmanager->AddProcess( new G4eBremsstrahlung(), -1,-1,3);
410
411 } else if (particleName == "e+") {
412 //positron
413 // Construct processes for positron
414
415 //change for geant4.9.p01
416 G4MultipleScattering* ms = new G4MultipleScattering();
417 //ms->MscStepLimitation(false,0.02);
418 ms->SetRangeFactor(0.02);
419
420 // ms->SetLateralDisplasmentFlag(false);
421
422 G4eIonisation *ionizationProcess = new G4eIonisation();
423 // ionizationProcess->SetLinearLossLimit(1.0);
424
425 pmanager->AddProcess( ms, -1, 1,1);
426 pmanager->AddProcess( ionizationProcess, -1, 2,2);
427 pmanager->AddProcess( new G4eBremsstrahlung(), -1,-1,3);
428 pmanager->AddProcess( new G4eplusAnnihilation(), 0,-1,4);
429
430 } else if( particleName == "mu+" ||
431 particleName == "mu-" ) {
432 //muon
433 // Construct processes for muon+
434
435 //change for geant4.9.0.p01
436 G4MultipleScattering* ms = new G4MultipleScattering();
437 //ms->MscStepLimitation(false,0.02);
438 ms->SetRangeFactor(0.02);
439
440 // ms->SetLateralDisplasmentFlag(false);
441
442 G4MuIonisation *ionizationProcess = new G4MuIonisation();
443 // ionizationProcess->SetLinearLossLimit(1.0);
444
445 pmanager->AddProcess( ms, -1, 1,1);
446 pmanager->AddProcess( ionizationProcess, -1, 2,2);
447 pmanager->AddProcess( new G4MuBremsstrahlung(), -1,-1,3);
448 pmanager->AddProcess( new G4MuPairProduction(), -1,-1,4);
449
450 } else if ((!particle->IsShortLived()) &&
451 (particle->GetPDGCharge() != 0.0) &&
452 (particle->GetParticleName() != "chargedgeantino")) {
453 // all others charged particles except geantino
454 G4int AP=1;
455 if (particle->GetParticleName() == "GenericIon") {
456 //ostream& o = ErrMsg(warning);
457 std::cerr <<"*********************************************************************" <<std::endl;
458 std::cerr << "*** Disabling G4MultipleScattering process for particle " <<particle->GetParticleName() << std::endl;
459 std::cerr <<"*********************************************************************" <<std::endl;
460 } else {
461 //change for Geant4.9.0.p01
462 G4MultipleScattering* ms = new G4MultipleScattering();
463 //ms->MscStepLimitation(false,0.02);
464 ms->SetRangeFactor(0.02);
465
466 // ms->SetLateralDisplasmentFlag(false);
467 pmanager->AddProcess( ms, -1,AP,AP);
468 AP++;
469 }
470 G4hIonisation *ionizationProcess = new G4hIonisation();
471 // ionizationProcess->SetLinearLossLimit(1.0);
472
473 pmanager->AddProcess( ionizationProcess, -1,AP,AP);
474 }
475 }*/
476}
477
478/*
479void BgsPhysicsList::AddProcess( G4VProcess *process,
480 G4int ordAtRestDoIt,
481 G4int ordAlongStepDoIt,
482 G4int ordPostStepDoIt,
483 G4ProcessManager *manager,
484 const char *category,
485 GVertex::Cause cause )
486{
487 manager->AddProcess( process, ordAtRestDoIt, ordAlongStepDoIt,
488 ordPostStepDoIt );
489 physicsRegistrar->Register( process, manager, category, cause );
490}
491
492
493void BgsPhysicsList::AddDiscreteProcess( G4VProcess *process,
494 G4ProcessManager *manager,
495 const char *category,
496 GVertex::Cause cause )
497{
498 manager->AddDiscreteProcess( process );
499 physicsRegistrar->Register( process, manager, category, cause );
500}
501
502
503void BgsPhysicsList::AddElasticHadronProcess(G4HadronElasticProcess
504*process,
505 G4LElastic *model,
506 G4ProcessManager *manager,
507 const char *category,
508 GVertex::Cause cause )
509{
510 process->RegisterMe(model); // Register interaction model with process
511 manager->AddDiscreteProcess(process);
512 physicsRegistrar->Register(process,manager,category,cause);
513}
514*/
515
516
517void
519{
520}
521
522// ************************** Parameterisation******************************
523/*
524void
525BgsPhysicsList::AddParameterisation()
526{
527 G4FastSimulationManagerProcess* theFastSimulationManagerProcess =
528 new G4FastSimulationManagerProcess();
529 theParticleIterator->reset();
530 while( (*theParticleIterator)() ){
531 G4ParticleDefinition* particle = theParticleIterator->value();
532 G4ProcessManager* pmanager = particle->GetProcessManager();
533 pmanager->AddDiscreteProcess( theFastSimulationManagerProcess );
534 }
535}
536*/
537// ************************** Generic Processes******************************
538
539void
541{
542/* // Add Decay Process
543 G4Decay* theDecayProcess = new G4Decay();
544 theParticleIterator->reset();
545 while( (*theParticleIterator)() ){
546 G4ParticleDefinition* particle = theParticleIterator->value();
547 G4ProcessManager* pmanager = particle->GetProcessManager();
548 if (theDecayProcess->IsApplicable(*particle)) {
549 pmanager ->AddProcess( theDecayProcess );
550 // set ordering for PostStepDoIt and AtRestDoIt
551 pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep);
552 pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest);
553// physicsRegistrar->
554// Register( theDecayProcess, pmanager, "dcay", GVertex::decay );
555 }
556 }*/
557/*
558 if (control->GetLooperCut()>0) {
559
560 // Set special process to kill loopers
561 theLooperDeath = new BgsLooperDeath( control->GetLooperCut()*MeV );
562 theParticleIterator->reset();
563 while( (*theParticleIterator)() ){
564 G4ParticleDefinition* particle = theParticleIterator->value();
565 if (theLooperDeath->IsApplicable(*particle)) {
566 G4ProcessManager* pmanager = particle->GetProcessManager();
567 pmanager->AddProcess(theLooperDeath, -1, -1, 5);
568 physicsRegistrar->
569 Register( theLooperDeath, pmanager, "loop", GVertex::looperDeath
570);
571 }
572 }
573 ErrMsg(warning) << "Loopers with pt < " << control->GetLooperCut()
574 << " MeV will be killed" << endmsg;
575 }
576
577 if (control->GetMaxNumberOfSteps()>0) {
578
579 //
580 // Set special process to kill runaway particles
581 // Only needed if dE/dx is turned off!
582 //
583 // Do not abuse!
584 //
585 theStepDeath = new BgsChargedStepDeath( control->GetMaxNumberOfSteps()
586);
587
588 theParticleIterator->reset();
589 while( (*theParticleIterator)() ){
590 G4ParticleDefinition* particle = theParticleIterator->value();
591 if (theStepDeath->IsApplicable(*particle)) {
592 G4ProcessManager* pmanager = particle->GetProcessManager();
593 pmanager->AddProcess(theStepDeath, -1, -1, 5);
594 physicsRegistrar->
595 Register( theStepDeath, pmanager, "maxStep", GVertex::runAway );
596 }
597 }
598 ErrMsg(warning)
599 << "\n Charged particles will be killed if they take more than "
600 << control->GetMaxNumberOfSteps() << " steps.\n"
601 << " If you do not understand this message, you should be very
602concerned.\n"
603 << " If this message appears in production, you should be very
604upset." << endmsg;
605 }
606 */
607}
608
609// ************************** Hadronic Processes******************************
610
611void
613{
614 //
615 // Gamma-nuclear process
616 //
617
618 // low energy part
619 /* G4GammaNuclearReaction* lowEGammaModel = new G4GammaNuclearReaction();
620 lowEGammaModel->SetMaxEnergy(3.5*GeV);
621 G4PhotoNuclearProcess* thePhotoNuclearProcess = new
622G4PhotoNuclearProcess();
623 thePhotoNuclearProcess->RegisterMe(lowEGammaModel);
624 */
625 // bias the cross section
626 //
627/* double thePhotoNuclearBias = control->GetPhotoNuclearBias();
628 if (thePhotoNuclearBias != 1.) {
629 thePhotoNuclearProcess->BiasCrossSectionByFactor(thePhotoNuclearBias);
630
631 // print out a warning if biasing
632 //
633 ErrMsg(warning) << "*** Biasing the photo-nuclear process by factor "
634 << thePhotoNuclearBias << endmsg;
635 }
636*/
637 // high energy part
638 /*G4TheoFSGenerator* highEGammaModel = new G4TheoFSGenerator();
639 G4GeneratorPrecompoundInterface* preComModel =
640 new G4GeneratorPrecompoundInterface();
641 highEGammaModel->SetTransport(preComModel);
642
643 G4QGSModel<G4GammaParticipants>* theStringModel =
644 new G4QGSModel<G4GammaParticipants>;
645 G4QGSMFragmentation* fragModel = new G4QGSMFragmentation();
646 G4ExcitedStringDecay* stringDecay =
647 new G4ExcitedStringDecay(fragModel);
648 theStringModel->SetFragmentationModel(stringDecay);
649
650 highEGammaModel->SetHighEnergyGenerator(theStringModel);
651 highEGammaModel->SetMinEnergy(3.*GeV);
652 highEGammaModel->SetMaxEnergy(20.*GeV);
653
654 thePhotoNuclearProcess->RegisterMe(highEGammaModel);
655
656 G4ProcessManager* gamMan = G4Gamma::Gamma()->GetProcessManager();
657
658 gamMan->AddDiscreteProcess(thePhotoNuclearProcess);
659 //
660 // Electron-nuclear process
661 //
662 G4ElectroNuclearReaction* theElectronReaction =
663 new G4ElectroNuclearReaction();
664 G4ElectronNuclearProcess* theElectronNuclearProcess =
665 new G4ElectronNuclearProcess();
666 theElectronNuclearProcess->RegisterMe(theElectronReaction);
667
668 G4ProcessManager* electronMan =
669G4Electron::Electron()->GetProcessManager();
670
671 electronMan->AddProcess(theElectronNuclearProcess, -1, -1, 4);
672*/
673 // bias the cross section
674 //
675/*
676 G4double theElectroNuclearBias = control->GetElectroNuclearBias();
677 if (theElectroNuclearBias != 1.) {
678
679theElectronNuclearProcess->BiasCrossSectionByFactor(theElectroNuclearBias);
680
681 // print out a warning if biasing
682 //
683 ErrMsg(warning) << "*** Biasing the electron-nuclear process by factor "
684 << theElectroNuclearBias << endmsg;
685 }
686*/
687 //
688 // Positron-nuclear process
689 //
690 /*G4PositronNuclearProcess* thePositronNuclearProcess =
691 new G4PositronNuclearProcess();
692 thePositronNuclearProcess->RegisterMe(theElectronReaction);
693
694 G4ProcessManager* positronMan =
695G4Positron::Positron()->GetProcessManager();
696 positronMan->AddProcess(thePositronNuclearProcess, -1, -1, 5);
697*/
698 // bias the cross section
699 //
700/*
701 if (theElectroNuclearBias != 1.) {
702
703thePositronNuclearProcess->BiasCrossSectionByFactor(theElectroNuclearBias);
704 ErrMsg(warning) << "*** Biasing the positron-nuclear process by factor "
705 << theElectroNuclearBias << endmsg;
706 }
707 */
708}
709
710void
712{
713 // One process handles hadronic elastic processes for all hadrons.
714 // However hadronic inelastic processes are unique to each hadron.
715
716 // For pi+ and pi- only, substitute pi-Nuclear cross sections
717/* G4PiNuclearCrossSection* piNucCS = new G4PiNuclearCrossSection();
718
719 theParticleIterator->reset();
720 while( (*theParticleIterator)() ){
721 G4ParticleDefinition* particle = theParticleIterator->value();
722 G4ProcessManager* pmanager = particle->GetProcessManager();
723 G4String particleName = particle->GetParticleName();
724 // *******
725 // * pi+ *
726 // *******
727 if (particleName == "pi+") {
728
729 // Elastic process
730 G4HadronElasticProcess *process = new G4HadronElasticProcess();
731 G4LElastic *model = new G4LElastic();
732 process->RegisterMe(model);
733 pmanager->AddDiscreteProcess(process);
734
735 // Inelastic process
736
737 G4PionPlusInelasticProcess *inel_process = new
738G4PionPlusInelasticProcess();
739 inel_process->AddDataSet(piNucCS);
740 inel_process->RegisterMe(bertini_model);
741 pmanager->AddDiscreteProcess(inel_process);
742// physicsRegistrar->Register(inel_process,pmanager,"hadi",
743// GVertex::hadronInelastic);
744 // *******
745 // * pi- *
746 // *******
747 } else if (particleName == "pi-") {
748
749 // Elastic process
750 G4HadronElasticProcess *process = new G4HadronElasticProcess();
751 G4LElastic *model = new G4LElastic();
752 process->RegisterMe(model);
753 pmanager->AddDiscreteProcess(process);
754
755 // Inelastic process
756
757 G4PionMinusInelasticProcess *inel_process = new
758G4PionMinusInelasticProcess();
759 inel_process->AddDataSet(piNucCS);
760 inel_process->RegisterMe(bertini_model);
761 pmanager->AddDiscreteProcess(inel_process);
762// physicsRegistrar->Register(inel_process,pmanager,"hadi",
763// GVertex::hadronInelastic);
764 // *******
765 // * K+ *
766 // *******
767 } else if (particleName == "kaon+") {
768
769 // Elastic process
770 G4HadronElasticProcess *process = new G4HadronElasticProcess();
771 G4LElastic *model = new G4LElastic();
772 process->RegisterMe(model);
773 pmanager->AddDiscreteProcess(process);
774
775 // Inelastic process
776
777 G4KaonPlusInelasticProcess* inel_process = new
778G4KaonPlusInelasticProcess();
779 inel_process->RegisterMe(bertini_model);
780 pmanager->AddDiscreteProcess(inel_process);
781// physicsRegistrar->Register(inel_process,pmanager,"hadi",
782// GVertex::hadronInelastic);
783 // *******
784 // * K- *
785 // *******
786 } else if (particleName == "kaon-") {
787
788 // Elastic process
789 G4HadronElasticProcess *process = new G4HadronElasticProcess();
790 G4LElastic *model = new G4LElastic();
791 process->RegisterMe(model);
792 pmanager->AddDiscreteProcess(process);
793
794 // Inelastic process
795
796 G4KaonMinusInelasticProcess* inel_process = new
797G4KaonMinusInelasticProcess();
798 inel_process->RegisterMe(bertini_model);
799 pmanager->AddDiscreteProcess(inel_process);
800// physicsRegistrar->Register(inel_process,pmanager,"hadi",
801// GVertex::hadronInelastic);
802 // *******
803 // * K0L *
804 // *******
805 } else if (particleName == "kaon0L") {
806
807 // Elastic process
808 G4HadronElasticProcess *process = new G4HadronElasticProcess();
809 G4LElastic *model = new G4LElastic();
810 process->RegisterMe(model);
811 pmanager->AddDiscreteProcess(process);
812
813 // Inelastic process
814
815 G4KaonZeroLInelasticProcess* inel_process = new
816G4KaonZeroLInelasticProcess();
817 inel_process->RegisterMe(bertini_model);
818 pmanager->AddDiscreteProcess(inel_process);
819// physicsRegistrar->Register(inel_process,pmanager,"hadi",
820// GVertex::hadronInelastic);
821 // *******
822 // * K0S *
823 // *******
824 } else if (particleName == "kaon0S") {
825
826 // Elastic process
827 G4HadronElasticProcess *process = new G4HadronElasticProcess();
828 G4LElastic *model = new G4LElastic();
829 process->RegisterMe(model);
830 pmanager->AddDiscreteProcess(process);
831
832 // Inelastic process
833
834 G4KaonZeroSInelasticProcess* inel_process =
835 new G4KaonZeroSInelasticProcess();
836 inel_process->RegisterMe(bertini_model);
837 pmanager->AddDiscreteProcess(inel_process);
838// physicsRegistrar->Register(inel_process,pmanager,"hadi",
839// GVertex::hadronInelastic);
840 // *******
841 // * p *
842 // *******
843 } else if (particleName == "proton") {
844
845 // Elastic process
846 G4HadronElasticProcess *process = new G4HadronElasticProcess();
847 G4LElastic *model = new G4LElastic();
848 process->RegisterMe(model);
849 pmanager->AddDiscreteProcess(process);
850
851 // Inelastic process
852
853 G4ProtonInelasticProcess *inel_process = new
854G4ProtonInelasticProcess();
855 inel_process->RegisterMe(bertini_model);
856 pmanager->AddDiscreteProcess(inel_process);
857// physicsRegistrar->Register(inel_process,pmanager,"hadi",
858// GVertex::hadronInelastic);
859 // *********
860 // * p-bar *
861 // *********
862 } else if (particleName == "anti_proton") {
863
864 // Elastic process
865 G4HadronElasticProcess *process = new G4HadronElasticProcess();
866 G4LElastic *model = new G4LElastic();
867 process->RegisterMe(model);
868 pmanager->AddDiscreteProcess(process);
869
870 // Inelastic process
871
872 G4AntiProtonInelasticProcess *inel_process =
873 new G4AntiProtonInelasticProcess();
874 G4LEAntiProtonInelastic *inel_model = new G4LEAntiProtonInelastic();
875 inel_process->RegisterMe(inel_model);
876 pmanager->AddDiscreteProcess(inel_process);
877// physicsRegistrar->Register(inel_process,pmanager,"hadi",
878// GVertex::hadronInelastic);
879 // *******
880 // * n *
881 // *******
882 } else if (particleName == "neutron") {
883
884 //if (control->UseHPNeutrons()) {
885 if(1){
886 G4cout << "High precision neutron models chosen" << G4endl;
887
888 putenv("G4NEUTRONHPDATA=/afs/ihep.ac.cn/bes3/offline/sw/packages/geant4/4.9.0/slc4_ia32_gcc346/geant4.9.0.p01/data/G4NDL3.11/");
889
890 // Elastic process
891 G4HadronElasticProcess* el_process = new G4HadronElasticProcess();
892
893 // High precision model and data below 20 MeV
894 G4NeutronHPElastic* hpel_model = new G4NeutronHPElastic();
895 G4NeutronHPElasticData* el_data = new G4NeutronHPElasticData();
896 el_process->AddDataSet(el_data);
897 el_process->RegisterMe(hpel_model);
898
899 // LEP model above 20 MeV
900 G4LElastic* el_model = new G4LElastic();
901 el_model->SetMinEnergy(19.9*MeV);
902 el_process->RegisterMe(el_model);
903
904 pmanager->AddDiscreteProcess(el_process);
905 //physicsRegistrar->Register(el_process,pmanager,"hade",
906 // GVertex::hadronElastic);
907
908 // Inelastic process
909 G4NeutronInelasticProcess* inel_process =
910 new G4NeutronInelasticProcess();
911
912 // High precision model and data below 20 MeV
913 G4NeutronHPInelastic* hpinel_model = new G4NeutronHPInelastic();
914 G4NeutronHPInelasticData* hpinel_data = new
915G4NeutronHPInelasticData();
916 inel_process->AddDataSet(hpinel_data);
917 inel_process->RegisterMe(hpinel_model);
918
919 // Bertini model above 20 MeV
920 G4CascadeInterface* neutron_bertini = new G4CascadeInterface;
921 neutron_bertini->SetMinEnergy(19.9*MeV);
922 inel_process->RegisterMe(neutron_bertini);
923
924 pmanager->AddDiscreteProcess(inel_process);
925 //physicsRegistrar->Register(inel_process,pmanager,"hadi",
926 // GVertex::hadronInelastic);
927
928 // Capture process
929 G4HadronCaptureProcess* cap_process = new G4HadronCaptureProcess();
930
931 // High precision model and data below 20 MeV
932 G4NeutronHPCapture* hpcap_model = new G4NeutronHPCapture();
933 G4NeutronHPCaptureData* hpcap_data = new G4NeutronHPCaptureData();
934 cap_process->AddDataSet(hpcap_data);
935 cap_process->RegisterMe(hpcap_model);
936
937 // LEP model above 20 MeV - default cross sections are used here
938 // hence no need to explicitly invoke AddDataSet method
939 G4LCapture* cap_model = new G4LCapture();
940 cap_model->SetMinEnergy(19.9*MeV);
941 cap_process->RegisterMe(cap_model);
942
943 pmanager->AddDiscreteProcess(cap_process);
944 // Note: need to update GVertex to include hadronCapture
945// physicsRegistrar->Register(cap_process,pmanager,"hadi",
946// GVertex::hadronInelastic);
947
948 // Fission process
949 G4HadronFissionProcess* fis_process = new G4HadronFissionProcess();
950
951 // High precision model and data below 20 MeV
952 G4NeutronHPFission* hpfis_model = new G4NeutronHPFission();
953 G4NeutronHPFissionData* hpfis_data = new G4NeutronHPFissionData();
954 fis_process->AddDataSet(hpfis_data);
955 fis_process->RegisterMe(hpfis_model);
956
957 // LEP model above 20 MeV - default cross sections are used here
958 // hence no need to explicitly invoke AddDataSet method
959 G4LFission* fis_model = new G4LFission();
960 fis_model->SetMinEnergy(19.9*MeV);
961 fis_process->RegisterMe(fis_model);
962
963 pmanager->AddDiscreteProcess(fis_process);
964 // Note: need to update GVertex to include hadronFission
965// physicsRegistrar->Register(fis_process,pmanager,"hadi",
966// GVertex::hadronInelastic);
967
968 } else {
969
970 // Elastic process
971 G4HadronElasticProcess *process = new G4HadronElasticProcess();
972 G4LElastic *model = new G4LElastic();
973 process->RegisterMe(model);
974 pmanager->AddDiscreteProcess(process);
975
976 // Inelastic process
977 G4NeutronInelasticProcess *inel_process =
978 new G4NeutronInelasticProcess();
979 inel_process->RegisterMe(bertini_model);
980 pmanager->AddDiscreteProcess(inel_process);
981// physicsRegistrar->Register(inel_process,pmanager,"hadi",
982// GVertex::hadronInelastic);
983 }
984 // *********
985 // * n-bar *
986 // *********
987 } else if (particleName == "anti_neutron") {
988
989 // Elastic process
990 G4HadronElasticProcess *process = new G4HadronElasticProcess();
991 G4LElastic *model = new G4LElastic();
992 process->RegisterMe(model);
993 pmanager->AddDiscreteProcess(process);
994
995 // Inelastic process
996
997 G4AntiNeutronInelasticProcess *inel_process =
998 new G4AntiNeutronInelasticProcess();
999 G4LEAntiNeutronInelastic *inel_model = new G4LEAntiNeutronInelastic();
1000 inel_process->RegisterMe(inel_model);
1001 pmanager->AddDiscreteProcess(inel_process);
1002// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1003// GVertex::hadronInelastic);
1004 // **********
1005 // * lambda *
1006 // **********
1007 } else if (particleName == "lambda") {
1008
1009 // Elastic process
1010 G4HadronElasticProcess *process = new G4HadronElasticProcess();
1011 G4LElastic *model = new G4LElastic();
1012 process->RegisterMe(model);
1013 pmanager->AddDiscreteProcess(process);
1014
1015 // Inelastic process
1016
1017 G4LambdaInelasticProcess* inel_process = new
1018G4LambdaInelasticProcess();
1019 inel_process->RegisterMe(bertini_model);
1020 pmanager->AddDiscreteProcess(inel_process);
1021// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1022// GVertex::hadronInelastic);
1023 // **************
1024 // * lambda-bar *
1025 // **************
1026 } else if (particleName == "anti_lambda") {
1027
1028 // Elastic process
1029 G4HadronElasticProcess *process = new G4HadronElasticProcess();
1030 G4LElastic *model = new G4LElastic();
1031 process->RegisterMe(model);
1032 pmanager->AddDiscreteProcess(process);
1033
1034 // Inelastic process
1035
1036 G4AntiLambdaInelasticProcess *inel_process =
1037 new G4AntiLambdaInelasticProcess();
1038 G4LEAntiLambdaInelastic *inel_model = new G4LEAntiLambdaInelastic();
1039 inel_process->RegisterMe(inel_model);
1040 pmanager->AddDiscreteProcess(inel_process);
1041// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1042// GVertex::hadronInelastic);
1043 // **************
1044 // * deuteron *
1045 // **************
1046 } else if (particleName == "deuteron") {
1047
1048 // Elastic process
1049 G4HadronElasticProcess *process = new G4HadronElasticProcess();
1050 G4LElastic *model = new G4LElastic();
1051 process->RegisterMe(model);
1052 pmanager->AddDiscreteProcess(process);
1053
1054 // Inelastic process
1055
1056 G4DeuteronInelasticProcess *inel_process =
1057 new G4DeuteronInelasticProcess();
1058 G4LEDeuteronInelastic *inel_model = new G4LEDeuteronInelastic();
1059 inel_process->RegisterMe(inel_model);
1060 pmanager->AddDiscreteProcess(inel_process);
1061// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1062// GVertex::hadronInelastic);
1063 // **************
1064 // * triton *
1065 // **************
1066 } else if (particleName == "triton") {
1067
1068 // Elastic process
1069 G4HadronElasticProcess *process = new G4HadronElasticProcess();
1070 G4LElastic *model = new G4LElastic();
1071 process->RegisterMe(model);
1072 pmanager->AddDiscreteProcess(process);
1073
1074 // Inelastic process
1075
1076 G4TritonInelasticProcess *inel_process =
1077 new G4TritonInelasticProcess();
1078 G4LETritonInelastic *inel_model = new G4LETritonInelastic();
1079 inel_process->RegisterMe(inel_model);
1080 pmanager->AddDiscreteProcess(inel_process);
1081// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1082// GVertex::hadronInelastic);
1083 // **************
1084 // * alpha *
1085 // **************
1086 } else if (particleName == "alpha") {
1087
1088 // Elastic process
1089 G4HadronElasticProcess *process = new G4HadronElasticProcess();
1090 G4LElastic *model = new G4LElastic();
1091 process->RegisterMe(model);
1092 pmanager->AddDiscreteProcess(process);
1093
1094 // Inelastic process
1095
1096 G4AlphaInelasticProcess *inel_process = new G4AlphaInelasticProcess();
1097 G4LEAlphaInelastic *inel_model = new G4LEAlphaInelastic();
1098 inel_process->RegisterMe(inel_model);
1099 pmanager->AddDiscreteProcess(inel_process);
1100// physicsRegistrar->Register(inel_process,pmanager,"hadi",
1101// GVertex::hadronInelastic);
1102 }
1103 } // while */
1104}
1105
1106
1107//
1108// ConstructNeutrinoGenocide
1109//
1111{
1112/* BgsGenocide *genocide = new BgsGenocide();
1113
1114 theParticleIterator->reset();
1115 while( (*theParticleIterator)() ){
1116 G4ParticleDefinition* particle = theParticleIterator->value();
1117 G4ProcessManager* pmanager = particle->GetProcessManager();
1118 G4String particleName = particle->GetParticleName();
1119
1120 if (particleName == "nu_e" ||
1121 particleName == "nu_mu" ||
1122 particleName == "nu_tau" ||
1123 particleName == "anti_nu_e" ||
1124 particleName == "anti_nu_mu" ||
1125 particleName == "anti_nu_tau" ||
1126
1127 // temporary fix for K0, K0bar until CHIPS photonuclear model isfixed
1128
1129 particleName == "kaon0" ||
1130 particleName == "anti_kaon0" ) {
1131
1132 pmanager->AddProcess(genocide, -1, -1, 5);
1133// physicsRegistrar->Register( genocide, pmanager, "neutrinoDeath",
1134// GVertex::neutrino );
1135 }
1136 }*/
1137}
1138
1139
1140//
1141// ConstructIonFix
1142//
1144{/*
1145 BgsGenocide *genocide = new
1146//BgsGentleGenocide(control->GetIonEnergyCut()*MeV,
1147// 60);
1148 BgsGentleGenocide(0.01*MeV,
1149 60);
1150
1151 theParticleIterator->reset();
1152 while( (*theParticleIterator)() ){
1153 G4ParticleDefinition* particle = theParticleIterator->value();
1154 G4ProcessManager* pmanager = particle->GetProcessManager();
1155 G4String particleName = particle->GetParticleName();
1156
1157 if ( particleName == "triton" ||
1158 particleName == "alpha" ||
1159 particleName == "proton" ||
1160 particleName == "deuteron" ) {
1161
1162 pmanager->AddProcess(genocide, -1, -1, 5);
1163// physicsRegistrar->Register( genocide, pmanager, "ionFix",
1164// GVertex::minimumEnergy );
1165 }
1166 }*/
1167}
1168
1169
1170//
1171// ConstructNeutronFix
1172//
1174{/*
1175 BgsGenocide *genocide = new
1176BgsGentleGenocide(0.01*MeV,0);
1177
1178 theParticleIterator->reset();
1179 while( (*theParticleIterator)() ){
1180 G4ParticleDefinition* particle = theParticleIterator->value();
1181 G4ProcessManager* pmanager = particle->GetProcessManager();
1182 G4String particleName = particle->GetParticleName();
1183
1184 if ( particleName == "neutron" ) {
1185
1186 pmanager->AddProcess(genocide, -1, -1, 1);
1187// physicsRegistrar->Register( genocide, pmanager, "neutronFix",
1188// GVertex::minimumEnergy );
1189 }
1190 }*/
1191}
1192
1193
1194// ****************************** Cuts***************************************
1195
1196
1198{/*
1199 // Set default cuts, all volumes
1200
1201 SetDefaultCutValue(0.7*mm);
1202 SetCutsWithDefault();
1203*/
1204 // Enable print out of cuts after tables are built
1205 // This is now done in BgsRunAction
1206 //
1207 // if (verboseLevel > 1) DumpCutValuesTable();
1208}
void ConstructParticle()
virtual ~BgsPhysicsList()
void ConstructNeutronFix()
void ConstructNeutrinoGenocide()
void SetStatusEmProcess()