123 lines
2.6 KiB
C++
123 lines
2.6 KiB
C++
#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 <vector> // Added for std::vector
|
|
|
|
class G4ParticleGun;
|
|
class G4Event;
|
|
|
|
|
|
namespace uLib {
|
|
namespace Geant {
|
|
|
|
class EmitterPrimary : public G4VUserPrimaryGeneratorAction, public AffineTransform
|
|
{
|
|
public:
|
|
uLibTypeMacro(EmitterPrimary, Object)
|
|
|
|
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:
|
|
uLibTypeMacro(SkyPlaneEmitterPrimary, EmitterPrimary)
|
|
|
|
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:
|
|
uLibTypeMacro(CylinderEmitterPrimary, EmitterPrimary)
|
|
|
|
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:
|
|
uLibTypeMacro(QuadMeshEmitterPrimary, EmitterPrimary)
|
|
|
|
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<double> m_CumulativeAreas;
|
|
double m_TotalArea;
|
|
|
|
void CalculateAreas();
|
|
};
|
|
|
|
} // namespace Geant
|
|
} // namespace uLib
|
|
|
|
|
|
|
|
#endif |