Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 /// \file optical/wls/src/WLSPrimaryGeneratorA 28 /// \brief Implementation of the WLSPrimaryGen 29 // 30 // 31 32 #include "WLSPrimaryGeneratorAction.hh" 33 34 #include "WLSDetectorConstruction.hh" 35 #include "WLSPrimaryGeneratorMessenger.hh" 36 37 #include "G4AutoLock.hh" 38 #include "G4Event.hh" 39 #include "G4GeneralParticleSource.hh" 40 #include "G4Material.hh" 41 #include "G4MaterialPropertiesTable.hh" 42 #include "G4OpticalPhoton.hh" 43 #include "G4PhysicsTable.hh" 44 #include "G4SystemOfUnits.hh" 45 #include "G4UImanager.hh" 46 #include "Randomize.hh" 47 48 namespace 49 { 50 G4Mutex gen_mutex = G4MUTEX_INITIALIZER; 51 } 52 53 //....oooOO0OOooo........oooOO0OOooo........oo 54 55 G4bool WLSPrimaryGeneratorAction::fFirst = fal 56 57 WLSPrimaryGeneratorAction::WLSPrimaryGenerator 58 { 59 fDetector = dc; 60 61 fParticleGun = new G4GeneralParticleSource() 62 fGunMessenger = new WLSPrimaryGeneratorMesse 63 } 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 66 67 WLSPrimaryGeneratorAction::~WLSPrimaryGenerato 68 { 69 delete fParticleGun; 70 delete fGunMessenger; 71 if (fIntegralTable) { 72 fIntegralTable->clearAndDestroy(); 73 delete fIntegralTable; 74 } 75 } 76 77 //....oooOO0OOooo........oooOO0OOooo........oo 78 79 void WLSPrimaryGeneratorAction::SetDecayTimeCo 80 { 81 fTimeConstant = time; 82 } 83 84 //....oooOO0OOooo........oooOO0OOooo........oo 85 86 void WLSPrimaryGeneratorAction::BuildEmissionS 87 { 88 if (fIntegralTable) return; 89 90 const G4MaterialTable* theMaterialTable = G4 91 G4int numOfMaterials = G4Material::GetNumber 92 93 if (!fIntegralTable) fIntegralTable = new G4 94 95 for (G4int i = 0; i < numOfMaterials; ++i) { 96 auto vec = new G4PhysicsFreeVector(); 97 98 G4MaterialPropertiesTable* MPT = (*theMate 99 100 if (MPT) { 101 G4MaterialPropertyVector* theWLSVector = 102 103 if (theWLSVector) { 104 G4double currentIN = (*theWLSVector)[0 105 if (currentIN >= 0.0) { 106 G4double currentPM = theWLSVector->E 107 G4double currentCII = 0.0; 108 vec->InsertValues(currentPM, current 109 G4double prevPM = currentPM; 110 G4double prevCII = currentCII; 111 G4double prevIN = currentIN; 112 113 for (size_t j = 1; j < theWLSVector- 114 currentPM = theWLSVector->Energy(j 115 currentIN = (*theWLSVector)[j]; 116 currentCII = 0.5 * (prevIN + curre 117 currentCII = prevCII + (currentPM 118 vec->InsertValues(currentPM, curre 119 prevPM = currentPM; 120 prevCII = currentCII; 121 prevIN = currentIN; 122 } 123 } 124 } 125 } 126 fIntegralTable->insertAt(i, vec); 127 } 128 } 129 130 //....oooOO0OOooo........oooOO0OOooo........oo 131 132 void WLSPrimaryGeneratorAction::GeneratePrimar 133 { 134 if (!fFirst) { 135 fFirst = true; 136 BuildEmissionSpectrum(); 137 } 138 139 if (fUseSampledEnergy) { 140 const G4MaterialTable* theMaterialTable = 141 142 G4double sampledEnergy = 3. * eV; 143 144 for (size_t j = 0; j < theMaterialTable->s 145 G4Material* fMaterial = (*theMaterialTab 146 if (fMaterial->GetName() == "PMMA") { 147 auto WLSIntensity = fMaterial->GetMate 148 149 if (WLSIntensity) { 150 auto WLSIntegral = (G4PhysicsFreeVec 151 152 G4double CIImax = WLSIntegral->GetMa 153 G4double CIIvalue = G4UniformRand() 154 155 sampledEnergy = WLSIntegral->GetEner 156 } 157 } 158 } 159 160 // this does not work. 161 G4String cmd = "/gun/energy " + G4UIcomman 162 G4UImanager::GetUIpointer()->ApplyCommand( 163 } 164 165 // The code behind this line is not thread s 166 // and time are randomly selected and GPS pr 167 168 G4AutoLock l(&gen_mutex); 169 if (fParticleGun->GetParticleDefinition() == 170 SetOptPhotonPolar(); 171 SetOptPhotonTime(); 172 } 173 174 fParticleGun->GeneratePrimaryVertex(anEvent) 175 } 176 177 //....oooOO0OOooo........oooOO0OOooo........oo 178 179 void WLSPrimaryGeneratorAction::SetOptPhotonPo 180 { 181 G4double angle = G4UniformRand() * 360.0 * d 182 SetOptPhotonPolar(angle); 183 } 184 185 //....oooOO0OOooo........oooOO0OOooo........oo 186 187 void WLSPrimaryGeneratorAction::SetOptPhotonPo 188 { 189 if (fParticleGun->GetParticleDefinition()->G 190 G4cout << "-> warning from WLSPrimaryGener 191 << ": the ParticleGun is not an op 192 return; 193 } 194 195 G4ThreeVector normal(1., 0., 0.); 196 G4ThreeVector kphoton = fParticleGun->GetPar 197 G4ThreeVector product = normal.cross(kphoton 198 G4double modul2 = product * product; 199 200 G4ThreeVector e_perpend(0., 0., 1.); 201 if (modul2 > 0.) e_perpend = (1. / std::sqrt 202 G4ThreeVector e_paralle = e_perpend.cross(kp 203 204 G4ThreeVector polar = std::cos(angle) * e_pa 205 fParticleGun->SetParticlePolarization(polar) 206 } 207 208 //....oooOO0OOooo........oooOO0OOooo........oo 209 210 void WLSPrimaryGeneratorAction::SetOptPhotonTi 211 { 212 G4double time = -std::log(G4UniformRand()) * 213 fParticleGun->SetParticleTime(time); 214 } 215