#ifndef U_GEANT_EMITTERPRIMARY_HH #define U_GEANT_EMITTERPRIMARY_HH 1 #include "G4VUserPrimaryGeneratorAction.hh" #include "globals.hh" namespace uLib { class QuadMesh; } class EcoMug; #include "Math/QuadMesh.h" #include "Core/Object.h" #include "Math/Transform.h" #include // Added for std::vector class G4ParticleGun; class G4Event; namespace uLib { namespace Geant { class EmitterPrimary : public G4VUserPrimaryGeneratorAction, public Object, public AffineTransform { public: EmitterPrimary(); virtual ~EmitterPrimary(); // Metodo principale chiamato all'inizio di ogni evento virtual void GeneratePrimaries(G4Event*); virtual void Updated() override { ULIB_SIGNAL_EMIT(EmitterPrimary::Updated); } /// Create a clone of this emitter for multi-threading virtual EmitterPrimary* Clone() const; protected: G4ParticleGun* fParticleGun; // Puntatore al cannone di particelle }; class SkyPlaneEmitterPrimary : public EmitterPrimary { public: SkyPlaneEmitterPrimary(); virtual ~SkyPlaneEmitterPrimary(); virtual void GeneratePrimaries(G4Event*); void SetPlane(const uLib::Vector3f& p0, const uLib::Vector3f& normal); void SetSkySize(const uLib::Vector2f& size); uLib::Vector2f GetSkySize() const { return m_Size; } virtual EmitterPrimary* Clone() const override; private: EcoMug* m_EcoMug; uLib::Vector2f m_Size; }; class CylinderEmitterPrimary : public EmitterPrimary { public: CylinderEmitterPrimary(); virtual ~CylinderEmitterPrimary(); virtual void GeneratePrimaries(G4Event*); void SetRadius(float r); float GetRadius() const { return m_Radius; } void SetHeight(float h); float GetHeight() const { return m_Height; } virtual EmitterPrimary* Clone() const override; private: EcoMug* m_EcoMug; float m_Radius; float m_Height; }; class QuadMeshEmitterPrimary : public EmitterPrimary { public: QuadMeshEmitterPrimary(); virtual ~QuadMeshEmitterPrimary(); // Metodo principale chiamato all'inizio di ogni evento virtual void GeneratePrimaries(G4Event*); void SetMesh(uLib::QuadMesh* mesh); virtual EmitterPrimary* Clone() const override; private: uLib::QuadMesh* m_Mesh; std::vector m_CumulativeAreas; double m_TotalArea; void CalculateAreas(); }; } // namespace Geant } // namespace uLib #endif