Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: XrayFluoPlanePrimaryGeneratorAction.cc >> 28 // GEANT4 tag $Name: 27 // 29 // 28 // Author: Alfonso Mantero (Alfonso.Mantero@ge 30 // Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it) 29 // 31 // 30 // History: 32 // History: 31 // ----------- 33 // ----------- 32 // 02 Sep 2003 Alfonso Mantero created 34 // 02 Sep 2003 Alfonso Mantero created 33 // 35 // 34 // ------------------------------------------- 36 // ------------------------------------------------------------------- 35 37 36 #include "XrayFluoPlanePrimaryGeneratorAction. 38 #include "XrayFluoPlanePrimaryGeneratorAction.hh" 37 #include "XrayFluoPlaneDetectorConstruction.hh 39 #include "XrayFluoPlaneDetectorConstruction.hh" 38 #include "XrayFluoPlanePrimaryGeneratorMesseng 40 #include "XrayFluoPlanePrimaryGeneratorMessenger.hh" 39 #include "XrayFluoRunAction.hh" 41 #include "XrayFluoRunAction.hh" 40 #include "XrayFluoAnalysisManager.hh" 42 #include "XrayFluoAnalysisManager.hh" 41 #include "XrayFluoDataSet.hh" 43 #include "XrayFluoDataSet.hh" 42 #include "G4PhysicalConstants.hh" 44 #include "G4PhysicalConstants.hh" 43 #include "G4SystemOfUnits.hh" 45 #include "G4SystemOfUnits.hh" 44 #include "G4UnitsTable.hh" 46 #include "G4UnitsTable.hh" 45 #include "G4DataVector.hh" 47 #include "G4DataVector.hh" 46 #include "G4Event.hh" 48 #include "G4Event.hh" 47 #include "G4ParticleGun.hh" 49 #include "G4ParticleGun.hh" 48 #include "G4ParticleTable.hh" 50 #include "G4ParticleTable.hh" 49 #include "G4ParticleDefinition.hh" 51 #include "G4ParticleDefinition.hh" 50 #include "Randomize.hh" 52 #include "Randomize.hh" 51 53 52 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 53 55 54 XrayFluoPlanePrimaryGeneratorAction::XrayFluoP << 56 XrayFluoPlanePrimaryGeneratorAction::XrayFluoPlanePrimaryGeneratorAction(XrayFluoPlaneDetectorConstruction* XrayFluoDC) 55 :rndmFlag("on"),beam("off"),spectrum("off"), 57 :rndmFlag("on"),beam("off"),spectrum("off"),isoVert("off") 56 { 58 { 57 59 58 XrayFluoDetector = XrayFluoDC; 60 XrayFluoDetector = XrayFluoDC; 59 61 60 G4int n_particle = 1; 62 G4int n_particle = 1; 61 particleGun = new G4ParticleGun(n_particle) 63 particleGun = new G4ParticleGun(n_particle); 62 64 63 //create a messenger for this class 65 //create a messenger for this class 64 gunMessenger = new XrayFluoPlanePrimaryGener 66 gunMessenger = new XrayFluoPlanePrimaryGeneratorMessenger(this); 65 runManager = new XrayFluoRunAction(); 67 runManager = new XrayFluoRunAction(); 66 68 67 // default particle kinematic 69 // default particle kinematic 68 70 69 G4ParticleTable* particleTable = G4ParticleT 71 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); 70 G4String particleName; 72 G4String particleName; 71 G4ParticleDefinition* particle 73 G4ParticleDefinition* particle 72 = particleTable->FindParticle(particleName 74 = particleTable->FindParticle(particleName="gamma"); 73 particleGun->SetParticleDefinition(particle) 75 particleGun->SetParticleDefinition(particle); 74 particleGun->SetParticleMomentumDirection(G4 76 particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.)); 75 77 76 78 77 particleGun->SetParticleEnergy(10.*keV); 79 particleGun->SetParticleEnergy(10.*keV); 78 G4double position = -0.5*(XrayFluoDetector-> 80 G4double position = -0.5*(XrayFluoDetector->GetWorldSizeZ()); 79 particleGun->SetParticlePosition(G4ThreeVect 81 particleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,position)); 80 82 81 G4cout << "XrayFluoPlanePrimaryGeneratorActi 83 G4cout << "XrayFluoPlanePrimaryGeneratorAction created UUUUUUUUUUAAAAAAAAAAAAAAAAAAAAAAAaa" << G4endl; 82 84 83 } 85 } 84 86 85 87 86 //....oooOO0OOooo........oooOO0OOooo........oo 88 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 87 89 88 XrayFluoPlanePrimaryGeneratorAction::~XrayFluo 90 XrayFluoPlanePrimaryGeneratorAction::~XrayFluoPlanePrimaryGeneratorAction() 89 { 91 { 90 delete particleGun; 92 delete particleGun; 91 delete gunMessenger; 93 delete gunMessenger; 92 delete runManager; 94 delete runManager; 93 95 94 G4cout << "XrayFluoPlanePrimaryGeneratorActi 96 G4cout << "XrayFluoPlanePrimaryGeneratorAction deleted" << G4endl; 95 97 96 } 98 } 97 99 98 //....oooOO0OOooo........oooOO0OOooo........oo 100 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 99 101 100 void XrayFluoPlanePrimaryGeneratorAction::Gene 102 void XrayFluoPlanePrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) 101 { 103 { 102 //this function is called at the begining of 104 //this function is called at the begining of event 103 // 105 // 104 G4double z0 = -0.5*(XrayFluoDetector->GetWor 106 G4double z0 = -0.5*(XrayFluoDetector->GetWorldSizeZ()); 105 G4double y0 = 0.*m, x0 = 0.*m; 107 G4double y0 = 0.*m, x0 = 0.*m; 106 G4double dX = 0.5*(XrayFluoDetector->GetWorl 108 G4double dX = 0.5*(XrayFluoDetector->GetWorldSizeXY())-(XrayFluoDetector->GetPlaneSizeXY()); 107 if (rndmFlag == "on") 109 if (rndmFlag == "on") 108 110 109 {y0 = (XrayFluoDetector->GetPlaneSizeXY()) 111 {y0 = (XrayFluoDetector->GetPlaneSizeXY())*(G4UniformRand()-0.5); 110 x0 = (XrayFluoDetector->GetPlaneSizeXY())* 112 x0 = (XrayFluoDetector->GetPlaneSizeXY())*(G4UniformRand()-0.5) + dX; 111 } 113 } 112 114 113 z0 = -1 * dX; 115 z0 = -1 * dX; 114 116 115 particleGun->SetParticleMomentumDirection(G4 117 particleGun->SetParticleMomentumDirection(G4ThreeVector(-1.,0.,1.)); 116 118 117 particleGun->SetParticlePosition(G4ThreeVect 119 particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); 118 120 119 //randomize starting point 121 //randomize starting point 120 if (beam == "on") 122 if (beam == "on") 121 { 123 { 122 G4double radius = 0.5 * mm; 124 G4double radius = 0.5 * mm; 123 G4double rho = radius*std::sqrt(G4Unifor 125 G4double rho = radius*std::sqrt(G4UniformRand()); 124 G4double theta = 2*pi*G4UniformRand()*ra 126 G4double theta = 2*pi*G4UniformRand()*rad; 125 G4double position = -0.5*(XrayFluoDetect 127 G4double position = -0.5*(XrayFluoDetector->GetWorldSizeZ()); 126 128 127 G4double y = rho * std::sin(theta); 129 G4double y = rho * std::sin(theta); 128 G4double x = rho * std::cos(theta); 130 G4double x = rho * std::cos(theta); 129 131 130 particleGun->SetParticlePosition(G4Three 132 particleGun->SetParticlePosition(G4ThreeVector(x,y,position)); 131 } 133 } 132 //shoot particles according to a certain spe 134 //shoot particles according to a certain spectrum 133 if (spectrum =="on") 135 if (spectrum =="on") 134 { 136 { 135 G4String particle = particleGun->GetPar 137 G4String particle = particleGun->GetParticleDefinition() 136 ->GetParticleName(); 138 ->GetParticleName(); 137 if(particle == "proton"|| particle == "a 139 if(particle == "proton"|| particle == "alpha") 138 { 140 { 139 G4DataVector* energies = runManager->GetE 141 G4DataVector* energies = runManager->GetEnergies(); 140 G4DataVector* data = runManager->GetData( 142 G4DataVector* data = runManager->GetData(); 141 143 142 G4double sum = runManager->GetDataSum(); 144 G4double sum = runManager->GetDataSum(); 143 G4double partSum = 0; 145 G4double partSum = 0; 144 G4int j = 0; 146 G4int j = 0; 145 G4double random= sum*G4UniformRand(); 147 G4double random= sum*G4UniformRand(); 146 while (partSum<random) 148 while (partSum<random) 147 { 149 { 148 partSum += (*data)[j]; 150 partSum += (*data)[j]; 149 j++; 151 j++; 150 } 152 } 151 153 152 particleGun->SetParticleEnergy((*energies) 154 particleGun->SetParticleEnergy((*energies)[j]); 153 155 154 } 156 } 155 else if (particle == "gamma") 157 else if (particle == "gamma") 156 { 158 { 157 const XrayFluoDataSet* dataSet = runManage 159 const XrayFluoDataSet* dataSet = runManager->GetGammaSet(); 158 160 159 G4int i = 0; 161 G4int i = 0; 160 G4int id = 0; 162 G4int id = 0; 161 G4double minEnergy = 0. * keV; 163 G4double minEnergy = 0. * keV; 162 G4double particleEnergy= 0.; 164 G4double particleEnergy= 0.; 163 G4double maxEnergy = 10. * keV; 165 G4double maxEnergy = 10. * keV; 164 G4double energyRange = maxEnergy - minEner 166 G4double energyRange = maxEnergy - minEnergy; 165 167 166 while ( i == 0) 168 while ( i == 0) 167 { 169 { 168 G4double random = G4UniformRand(); 170 G4double random = G4UniformRand(); 169 171 170 G4double randomNum = G4UniformRand(); 172 G4double randomNum = G4UniformRand(); //*5.0E6; 171 173 172 particleEnergy = (random*energyRange) 174 particleEnergy = (random*energyRange) + minEnergy; 173 175 174 if ((dataSet->FindValue(particleEnergy 176 if ((dataSet->FindValue(particleEnergy,id)) > randomNum) 175 { 177 { 176 i = 1; 178 i = 1; 177 179 178 } 180 } 179 } 181 } 180 particleGun->SetParticleEnergy(particleEn 182 particleGun->SetParticleEnergy(particleEnergy); 181 } 183 } 182 } 184 } 183 185 184 if (isoVert == "on") 186 if (isoVert == "on") 185 { 187 { 186 G4double rho = 1. *m; 188 G4double rho = 1. *m; 187 //theta in [0;pi/2] 189 //theta in [0;pi/2] 188 G4double theta = (pi/2)*G4UniformRand(); 190 G4double theta = (pi/2)*G4UniformRand(); 189 //phi in [-pi;pi] 191 //phi in [-pi;pi] 190 G4double phi = (G4UniformRand()*2*pi)- p 192 G4double phi = (G4UniformRand()*2*pi)- pi; 191 G4double x = rho*std::sin(theta)*std::si 193 G4double x = rho*std::sin(theta)*std::sin(phi); 192 G4double y = rho*std::sin(theta)*std::co 194 G4double y = rho*std::sin(theta)*std::cos(phi); 193 G4double z = -(rho*std::cos(theta)); 195 G4double z = -(rho*std::cos(theta)); 194 particleGun->SetParticlePosition(G4Three 196 particleGun->SetParticlePosition(G4ThreeVector(x,y,z)); 195 197 196 G4double Xdim = XrayFluoDetector->GetPla 198 G4double Xdim = XrayFluoDetector->GetPlaneSizeXY(); 197 G4double Ydim = XrayFluoDetector->GetPla 199 G4double Ydim = XrayFluoDetector->GetPlaneSizeXY(); 198 200 199 G4double Dx = Xdim*(G4UniformRand()-0.5) 201 G4double Dx = Xdim*(G4UniformRand()-0.5); 200 202 201 G4double Dy = Ydim*(G4UniformRand()-0.5) 203 G4double Dy = Ydim*(G4UniformRand()-0.5); 202 204 203 particleGun->SetParticleMomentumDirectio 205 particleGun->SetParticleMomentumDirection(G4ThreeVector(-x+Dx,-y+Dy,-z)); 204 206 205 } 207 } 206 #ifdef G4ANALYSIS_USE 208 #ifdef G4ANALYSIS_USE 207 209 208 G4double partEnergy = particleGun->GetPartic 210 G4double partEnergy = particleGun->GetParticleEnergy(); 209 XrayFluoAnalysisManager* analysis = XrayFlu 211 XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); 210 analysis->analysePrimaryGenerator(partEnergy 212 analysis->analysePrimaryGenerator(partEnergy/keV); 211 213 212 #endif 214 #endif 213 215 214 particleGun->GeneratePrimaryVertex(anEvent); 216 particleGun->GeneratePrimaryVertex(anEvent); 215 } 217 } 216 218 217 //....oooOO0OOooo........oooOO0OOooo........oo 219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 218 220 219 221 220 222 221 223 222 224 223 225 224 226 225 227 226 228 227 229