00001
00002
00003 #include "globals.hh"
00004 #include "G4ios.hh"
00005 #include "musrPhysicsList.hh"
00006 #include "G4VPhysicsConstructor.hh"
00007 #include "G4ProcessManager.hh"
00008 #include "G4ParticleTypes.hh"
00009
00010 #include "G4MuonDecayChannel.hh"
00011 #include "G4DecayTable.hh"
00012 #include "musrMuonDecayChannel.hh"
00013 #include "musrDecay.hh"
00014
00015
00016
00017
00018
00019 musrPhysicsList::musrPhysicsList(): G4VUserPhysicsList()
00020 {
00021 defaultCutValue = 1.0*cm;
00022 SetVerboseLevel(0);
00023 }
00024
00025
00026
00027 musrPhysicsList::~musrPhysicsList()
00028 {}
00029
00030
00031
00032 void musrPhysicsList::ConstructParticle()
00033 {
00034
00035 ConstructBosons();
00036 ConstructLeptons();
00037 ConstructMesons();
00038 ConstructBaryons();
00039 }
00040
00041
00042
00043 void musrPhysicsList::ConstructBosons()
00044 {
00045
00046 G4Geantino::GeantinoDefinition();
00047 G4ChargedGeantino::ChargedGeantinoDefinition();
00048
00049
00050 G4Gamma::GammaDefinition();
00051 }
00052
00053
00054
00055 void musrPhysicsList::ConstructLeptons()
00056 {
00057
00058
00059 G4Electron::ElectronDefinition();
00060 G4Positron::PositronDefinition();
00061
00062 G4MuonPlus::MuonPlusDefinition();
00063 G4MuonMinus::MuonMinusDefinition();
00064 G4DecayTable* MuonPlusDecayTable = new G4DecayTable();
00065 MuonPlusDecayTable -> Insert(new musrMuonDecayChannel("mu+",1.00));
00066 G4MuonPlus::MuonPlusDefinition() -> SetDecayTable(MuonPlusDecayTable);
00067
00068 G4NeutrinoE::NeutrinoEDefinition();
00069 G4AntiNeutrinoE::AntiNeutrinoEDefinition();
00070
00071 G4NeutrinoMu::NeutrinoMuDefinition();
00072 G4AntiNeutrinoMu::AntiNeutrinoMuDefinition();
00073 }
00074
00075
00076
00077 void musrPhysicsList::ConstructMesons()
00078 {
00079
00080
00081 G4PionPlus::PionPlusDefinition();
00082 G4PionMinus::PionMinusDefinition();
00083 G4PionZero::PionZeroDefinition();
00084 G4Eta::EtaDefinition();
00085 G4EtaPrime::EtaPrimeDefinition();
00086 G4KaonPlus::KaonPlusDefinition();
00087 G4KaonMinus::KaonMinusDefinition();
00088 G4KaonZero::KaonZeroDefinition();
00089 G4AntiKaonZero::AntiKaonZeroDefinition();
00090 G4KaonZeroLong::KaonZeroLongDefinition();
00091 G4KaonZeroShort::KaonZeroShortDefinition();
00092 }
00093
00094
00095
00096 void musrPhysicsList::ConstructBaryons()
00097 {
00098
00099 G4Proton::ProtonDefinition();
00100 G4AntiProton::AntiProtonDefinition();
00101
00102 G4Neutron::NeutronDefinition();
00103 G4AntiNeutron::AntiNeutronDefinition();
00104 }
00105
00106
00107
00108 void musrPhysicsList::ConstructProcess()
00109 {
00110 AddTransportation();
00111 ConstructEM();
00112 ConstructGeneral();
00113 }
00114
00115
00116
00117 #include "G4ComptonScattering.hh"
00118 #include "G4GammaConversion.hh"
00119 #include "G4PhotoElectricEffect.hh"
00120
00121 #include "G4MultipleScattering.hh"
00122
00123 #include "G4eIonisation.hh"
00124 #include "G4eBremsstrahlung.hh"
00125 #include "G4eplusAnnihilation.hh"
00126
00127 #include "G4MuIonisation.hh"
00128 #include "G4MuBremsstrahlung.hh"
00129 #include "G4MuPairProduction.hh"
00130
00131 #include "G4hIonisation.hh"
00132
00133 #include "G4UserSpecialCuts.hh"
00134
00135 #include "musrAtRestSpinRotation.hh"
00136
00137
00138
00139
00140
00141
00142 void musrPhysicsList::ConstructEM()
00143 {
00144 theParticleIterator->reset();
00145 while( (*theParticleIterator)() ){
00146 G4ParticleDefinition* particle = theParticleIterator->value();
00147 G4ProcessManager* pmanager = particle->GetProcessManager();
00148 G4String particleName = particle->GetParticleName();
00149
00150 if (particleName == "gamma") {
00151
00152 pmanager->AddDiscreteProcess(new G4PhotoElectricEffect);
00153 pmanager->AddDiscreteProcess(new G4ComptonScattering);
00154 pmanager->AddDiscreteProcess(new G4GammaConversion);
00155
00156 } else if (particleName == "e-") {
00157
00158 pmanager->AddProcess(new G4MultipleScattering,-1, 1,1);
00159 pmanager->AddProcess(new G4eIonisation, -1, 2,2);
00160 pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3);
00161
00162 } else if (particleName == "e+") {
00163
00164 pmanager->AddProcess(new G4MultipleScattering,-1, 1,1);
00165 pmanager->AddProcess(new G4eIonisation, -1, 2,2);
00166 pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3);
00167 pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4);
00168
00169 } else if( particleName == "mu+" ||
00170 particleName == "mu-" ) {
00171
00172
00173 pmanager->AddProcess(new G4MultipleScattering,-1, 1,1);
00174 pmanager->AddProcess(new G4MuIonisation, -1, 2,2);
00175 pmanager->AddProcess(new G4MuBremsstrahlung, -1, 3,3);
00176 pmanager->AddProcess(new G4MuPairProduction, -1, 4,4);
00177 pmanager->AddProcess(new musrAtRestSpinRotation, 1, -1, -1);
00178 musrDecay* theDecayProcess = new musrDecay();
00179 pmanager->AddProcess(theDecayProcess);
00180 pmanager ->SetProcessOrderingToLast(theDecayProcess, idxAtRest);
00181 pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep);
00182
00183
00184 } else if ((!particle->IsShortLived()) &&
00185 (particle->GetPDGCharge() != 0.0) &&
00186 (particle->GetParticleName() != "chargedgeantino")) {
00187
00188 pmanager->AddProcess(new G4MultipleScattering,-1, 1,1);
00189 pmanager->AddProcess(new G4hIonisation, -1, 2,2);
00191 }
00192 }
00193 }
00194
00195
00196
00197 #include "G4Decay.hh"
00198 void musrPhysicsList::ConstructGeneral()
00199 {
00200
00201 }
00202
00203
00204
00205 void musrPhysicsList::SetCuts()
00206 {
00207
00208
00209
00210 SetCutsWithDefault();
00211
00212 if (verboseLevel>0) DumpCutValuesTable();
00213 }
00214
00215
00216