void GSMS::Source::generate_G4(G4GeneralParticleSource* dst, G4double dAngle) { if (!dst) return; for(int i=0; i<m_gamma.size(); i++) { G4float ene = m_gamma[i].first; G4float act = m_gamma[i].second; dst->AddaSource(act); dst->SetParticleDefinition(G4Gamma::Gamma()); G4SingleParticleSource* src = dst->GetCurrentSource(); src->GetEneDist()->SetMonoEnergy(ene); src->GetAngDist()->SetAngDistType("iso"); src->GetPosDist()->SetPosDisType("Point"); src->GetEneDist()->SetEnergyDisType("Mono"); //src->GetPosDist()->SetCentreCoords(get_coords()); //src->GetPosDist()->SetCentreCoords(G4ThreeVector(1., 0., 0.)); src->GetPosDist()->SetCentreCoords(G4ThreeVector(m_x, m_y, m_z)); G4double basePhi = 0.0; m_x != 0.0 ? basePhi = std::atan(m_y/m_x) : m_y > 0 ? basePhi = pi/2 : basePhi = -pi/2; if(m_x < 0.0 ) basePhi = -pi + basePhi; std::cerr << "X: " << m_x << " Y: " << m_y << " Phi: " << basePhi << std::endl; G4double dPhi = GSMS::get_hull().get_delta_phi(get_coords()); G4double baseTheta = pi/2;//TODO G4double dTheta = GSMS::get_hull().get_delta_theta(get_coords()); std::cerr << "dPhi: " << dPhi*360/2/pi << "; dTheta" << dTheta*360/2/pi << std::endl; //dPhi = 3*pi/2/180;//2*pi/2/180; //dTheta = 16*pi/2/180;//6*pi/2/180; src->GetAngDist()->SetMinPhi(basePhi - dPhi); src->GetAngDist()->SetMaxPhi(basePhi + dPhi); src->GetAngDist()->SetMinTheta(baseTheta - dTheta); src->GetAngDist()->SetMaxTheta(baseTheta + dTheta); std::cerr << ene << std::endl; std::cerr << act << std::endl; } }
void Geant4ShowerGenerator:: generate_showers(unsigned num_events, calin::simulation::tracker::ParticleType type, double total_energy, const Eigen::Vector3d& x0, const Eigen::Vector3d& u0, double weight) { G4GeneralParticleSource* gps = new G4GeneralParticleSource(); // default particle kinematic G4ParticleTable* particle_table = G4ParticleTable::GetParticleTable(); G4ParticleDefinition* particle = particle_table->FindParticle(particle_type_to_pdg_type(type)); if(total_energy * CLHEP::MeV < particle->GetPDGMass()) throw std::invalid_argument( "Total energy must be larger than particle rest mass (" + std::to_string(particle->GetPDGMass()/CLHEP::MeV) + " MeV)"); G4ThreeVector position; eigen_to_g4vec(position, x0, CLHEP::cm); G4ThreeVector momentum_direction; eigen_to_g4vec(momentum_direction, u0); G4SingleParticleSource* sps = gps->GetCurrentSource(); sps->SetParticleDefinition(particle); sps->GetPosDist()->SetPosDisType("Point"); sps->GetPosDist()->SetCentreCoords(position); sps->GetAngDist()->SetAngDistType("planar"); sps->GetAngDist()->SetParticleMomentumDirection(momentum_direction); sps->GetEneDist()->SetEnergyDisType("Mono"); sps->GetEneDist()->SetMonoEnergy(total_energy * CLHEP::MeV - particle->GetPDGMass()); gen_action_->setGPS(gps); // start a run run_manager_->BeamOn(num_events); }