00001 // 00002 // ******************************************************************** 00003 // * DISCLAIMER * 00004 // * * 00005 // * The following disclaimer summarizes all the specific disclaimers * 00006 // * of contributors to this software. The specific disclaimers,which * 00007 // * govern, are listed with their locations in: * 00008 // * http://cern.ch/geant4/license * 00009 // * * 00010 // * Neither the authors of this software system, nor their employing * 00011 // * institutes,nor the agencies providing financial support for this * 00012 // * work make any representation or warranty, express or implied, * 00013 // * regarding this software system or assume any liability for its * 00014 // * use. * 00015 // * * 00016 // * This code implementation is the intellectual property of the * 00017 // * GEANT4 collaboration. * 00018 // * By copying, distributing or modifying the Program (or any work * 00019 // * based on the Program) you indicate your acceptance of this * 00020 // * statement, and all its terms. * 00021 // ******************************************************************** 00022 // 00023 // $Id: ExtMuIonisation.h,v 1.6 2015/10/27 11:02:53 sunss Exp $ 00024 // GEANT4 tag $Name: TrkExtAlg-00-00-64 $ 00025 // 00026 // ------------------------------------------------------------------- 00027 // 00028 // GEANT4 Class header file 00029 // 00030 // 00031 // File name: ExtMuIonisation 00032 // 00033 // Author: Laszlo Urban 00034 // 00035 // Creation date: 30.05.1997 00036 // 00037 // Modifications: 00038 // 00039 // corrected by L.Urban on 24/09/97 00040 // corrected by L.Urban on 13/01/98 00041 // bugs fixed by L.Urban on 02/02/99 00042 // 10/02/00 modifications , new e.m. structure, L.Urban 00043 // 10-08-01 new methods Store/Retrieve PhysicsTable (mma) 00044 // 14-08-01 new function ComputeRestrictedMeandEdx() + 'cleanup' (mma) 00045 // 19-09-01 come back to previous process name "hIoni" 00046 // 29-10-01 all static functions no more inlined 00047 // 10-05-02 V.Ivanchenko update to new design 00048 // 09-12-02 V.Ivanchenko remove warning 00049 // 26-12-02 Secondary production moved to derived classes (VI) 00050 // 24-01-03 Make models region aware (V.Ivanchenko) 00051 // 05-02-03 Fix compilation warnings (V.Ivanchenko) 00052 // 13-02-03 SubCutoff regime is assigned to a region (V.Ivanchenko) 00053 // 23-05-03 Add fluctuation model as a member function (V.Ivanchenko) 00054 // 03-06-03 Add SetIntegral method to choose fluctuation model (V.Ivanchenko) 00055 // 03-06-03 Fix initialisation problem for STD ionisation (V.Ivanchenko) 00056 // 08-08-03 STD substitute standard (V.Ivanchenko) 00057 // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko) 00058 // 21-01-04 Migrade to G4ParticleChangeForLoss (V.Ivanchenko) 00059 // ------------------------------------------------------------------------------------ 00060 // 15-04-05 Omit the correction of momentum direction due to production of secenderies. 00061 // This is needed for my Track Extrapotation. (L.L.Wang) 00062 // ------------------------------------------------------------------------------------ 00063 //17-08-04 Rename the process "Mu" -> "mu" (V.Ivanchenko) 00064 // 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivantchenko) 00065 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko) 00066 00067 // Class Description: 00068 // 00069 // This class manages the ionisation process for muons. 00070 // it inherites from G4VContinuousDiscreteProcess via G4VEnergyLossProcess. 00071 // 00072 00073 // ------------------------------------------------------------------- 00074 // 00075 00076 #ifndef ExtMuIonisation_h 00077 #define ExtMuIonisation_h 1 00078 00079 #include "G4VEnergyLossProcess.hh" 00080 #include "G4Electron.hh" 00081 #include "G4Positron.hh" 00082 #include "globals.hh" 00083 #include "G4VEmModel.hh" 00084 00085 class G4Material; 00086 class G4VEmFluctuationModel; 00087 class G4ParticleChangeForLoss; 00088 00089 class ExtMuIonisation : public G4VEnergyLossProcess 00090 { 00091 00092 public: 00093 00094 ExtMuIonisation(const G4String& name = "ExtmuIoni"); 00095 00096 virtual ~ExtMuIonisation(); 00097 00098 G4bool IsApplicable(const G4ParticleDefinition& p) 00099 {return (p.GetPDGCharge() != 0.0 && p.GetPDGMass() > 10.0*MeV);}; 00100 00101 G4double MinPrimaryEnergy(const G4ParticleDefinition* p, 00102 const G4Material*, G4double cut); 00103 00104 /* virtual std::vector<G4Track*>* SecondariesAlongStep( 00105 const G4Step&, 00106 G4double&, 00107 G4double&, 00108 G4double&); 00109 */ 00110 00111 std::vector<G4DynamicParticle*>* SecondariesPostStep( 00112 G4VEmModel*, 00113 const G4MaterialCutsCouple*, 00114 const G4DynamicParticle*, 00115 G4double& tcut); 00116 00117 // Print out of the class parameters 00118 void PrintInfo(); 00119 00120 protected: 00121 00122 virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*, 00123 const G4ParticleDefinition*); 00124 00125 // virtual G4double MaxSecondaryEnergy(const G4DynamicParticle* dynParticle); 00126 00127 private: 00128 00129 // hide assignment operator 00130 ExtMuIonisation & operator=(const ExtMuIonisation &right); 00131 ExtMuIonisation(const ExtMuIonisation&); 00132 00133 G4double mass; 00134 G4double ratio; 00135 00136 const G4ParticleDefinition* theParticle; 00137 const G4ParticleDefinition* theBaseParticle; 00138 G4VEmFluctuationModel* flucModel; 00139 00140 G4ParticleChangeForLoss* fParticleChange; 00141 // G4bool subCutoff; 00142 G4bool isInitialised; 00143 }; 00144 00145 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00147 00148 inline G4double ExtMuIonisation::MinPrimaryEnergy(const G4ParticleDefinition*, 00149 const G4Material*, 00150 G4double cut) 00151 { 00152 G4double x = 0.5*cut/electron_mass_c2; 00153 G4double g = x*ratio + sqrt((1. + x)*(1. + x*ratio*ratio)); 00154 return mass*(g - 1.0); 00155 } 00156 00157 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00158 00159 /*inline G4double ExtMuIonisation::MaxSecondaryEnergy(const G4DynamicParticle* dynParticle) 00160 { 00161 G4double tau = dynParticle->GetKineticEnergy()/mass; 00162 G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.0)/ 00163 (1. + 2.0*(tau + 1.0)*ratio + ratio*ratio); 00164 00165 return tmax; 00166 } 00167 00168 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00169 00170 #include "G4VSubCutoffProcessor.hh" 00171 */ 00172 00173 /*inline std::vector<G4DynamicParticle*>* ExtMuIonisation::SecondariesAlongStep( 00174 const G4Step& step, 00175 G4double& tmax, 00176 G4double& eloss, 00177 G4double& kinEnergy) 00178 { 00179 std::vector<G4Track*>* newp = 0; 00180 if(subCutoff) { 00181 G4VSubCutoffProcessor* sp = SubCutoffProcessor(CurrentMaterialCutsCoupleIndex()); 00182 if (sp) { 00183 G4VEmModel* model = SelectModel(kinEnergy); 00184 newp = sp->SampleSecondaries(step,tmax,eloss,model); 00185 } 00186 } 00187 return newp; 00188 } 00189 */ 00190 00191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00192 00193 //#include "G4VEmModel.hh" 00194 00195 inline std::vector<G4DynamicParticle*>* ExtMuIonisation::SecondariesPostStep( 00196 G4VEmModel* model, 00197 const G4MaterialCutsCouple* couple, 00198 const G4DynamicParticle* dp, 00199 G4double& tcut) 00200 { 00201 // return model->SampleSecondaries(couple, dp, tcut); 00202 return NULL;//No secondaries, for Track Extrapolation.(Wang L.L.) 00203 } 00204 00205 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 00206 00207 #endif