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 // 28 29 #include "G4RTPrimaryGeneratorAction.hh" 30 #include "G4ParticleDefinition.hh" 31 #include "G4ParticleTable.hh" 32 #include "G4TransportationManager.hh" 33 #include "G4Event.hh" 34 #include "G4PrimaryVertex.hh" 35 #include "G4PrimaryParticle.hh" 36 37 #include "G4TheMTRayTracer.hh" 38 39 G4RTPrimaryGeneratorAction::G4RTPrimaryGenerat 40 { 41 G4ThreeVector zero; 42 particle_definition = 0; 43 particle_energy = 1.0*CLHEP::GeV; 44 particle_time = 0.0; 45 particle_polarization = zero; 46 47 pWorld = 0; 48 whereisit = kInside; 49 50 nRow = 0; 51 nColumn = 0; 52 53 eyePosition = zero; 54 eyeDirection = zero; 55 up = G4ThreeVector(0,1,0); 56 headAngle = 0.0; 57 viewSpan = 0.0; 58 stepAngle = 0.0; 59 viewSpanX = 0.0; 60 viewSpanY = 0.0; 61 62 distortionOn = false; 63 } 64 65 G4RTPrimaryGeneratorAction::~G4RTPrimaryGenera 66 {;} 67 68 void G4RTPrimaryGeneratorAction::GeneratePrima 69 { 70 // Note: We don't use G4ParticleGun here, as 71 // object causes creation of UI commands an 72 // that interfare with normal G4ParticleGun 73 74 // evId = iRow * nColumn + iColumn 75 G4int evId = anEvent->GetEventID(); 76 G4int iRow = evId / nColumn; 77 G4int iColumn = evId % nColumn; 78 G4double angleX = -(viewSpanX/2. - G4double( 79 G4double angleY = viewSpanY/2. - G4double(iR 80 G4ThreeVector rayDirection; 81 if(distortionOn) 82 { rayDirection = G4ThreeVector(-std::tan(ang 83 else 84 { rayDirection = G4ThreeVector(-std::tan(ang 85 G4double cp = std::cos(eyeDirection.phi()); 86 G4double sp = std::sqrt(1.-cp*cp); 87 G4double ct = std::cos(eyeDirection.theta()) 88 G4double st = std::sqrt(1.-ct*ct); 89 G4double gam = std::atan2(ct*cp*up.x()+ct*sp 90 rayDirection.rotateZ(-gam); 91 rayDirection.rotateZ(headAngle); 92 rayDirection.rotateUz(eyeDirection); 93 94 G4ThreeVector rayPosition(eyePosition); 95 if (whereisit != kInside) { 96 // Eye position is outside the world, so m 97 G4double outsideDistance = pWorld->GetLogi 98 DistanceToIn(rayPosition,rayDirection); 99 if(outsideDistance != kInfinity) 100 { rayPosition = rayPosition + (outsideDist 101 else 102 { 103 // Ray does not intercept world at all. 104 // Return without primary particle. 105 return; 106 } 107 } 108 109 // create a new vertex 110 G4PrimaryVertex* vertex = new G4PrimaryVerte 111 112 // create new primaries and set them to the 113 G4double mass = particle_definition->GetPDGM 114 G4PrimaryParticle* particle = new G4PrimaryP 115 particle->SetKineticEnergy( particle_energy 116 particle->SetMass( mass ); 117 particle->SetMomentumDirection( rayDirection 118 particle->SetPolarization(particle_polarizat 119 particle_polarizat 120 particle_polarizat 121 vertex->SetPrimary( particle ); 122 123 anEvent->AddPrimaryVertex( vertex ); 124 } 125 126 void G4RTPrimaryGeneratorAction::SetUp() 127 { 128 G4ParticleTable* particleTable = G4ParticleT 129 particle_definition = particleTable->FindPar 130 if(!particle_definition) 131 { 132 G4String msg; 133 msg = " G4RayTracer uses geantino to trac 134 msg += "define G4Geantino. Please add G4Ge 135 G4Exception("G4RTPrimaryGeneratorAction::S 136 } 137 138 G4TheMTRayTracer* rt = G4TheMTRayTracer::the 139 nRow = rt->nRow; 140 nColumn = rt->nColumn; 141 eyePosition = rt->eyePosition; 142 eyeDirection = rt->eyeDirection; 143 viewSpan = rt->viewSpan; 144 stepAngle = viewSpan/100.; 145 viewSpanX = stepAngle*nColumn; 146 viewSpanY = stepAngle*nRow; 147 distortionOn = rt->distortionOn; 148 149 pWorld = G4TransportationManager::GetTranspo 150 GetNavigatorForTracking()->GetWorldVol 151 whereisit = pWorld->GetLogicalVolume()->GetS 152 } 153 154