feat: implement Geant Material class, add object registration, and update PropertyWidget signal handling and read-only state
This commit is contained in:
@@ -27,6 +27,8 @@ set(SOURCES
|
||||
Scene.cpp
|
||||
Solid.cpp
|
||||
EmitterPrimary.cpp
|
||||
Matter.cpp
|
||||
GeantRegistration.cpp
|
||||
DetectorConstruction.cpp
|
||||
PhysicsList.cpp
|
||||
ActionInitialization.cpp
|
||||
|
||||
22
src/HEP/Geant/GeantRegistration.cpp
Normal file
22
src/HEP/Geant/GeantRegistration.cpp
Normal file
@@ -0,0 +1,22 @@
|
||||
#include "Core/ObjectFactory.h"
|
||||
#include "HEP/Geant/Matter.h"
|
||||
#include "HEP/Geant/Solid.h"
|
||||
#include "HEP/Geant/Scene.h"
|
||||
#include "HEP/Geant/EmitterPrimary.hh"
|
||||
#include "HEP/Geant/GeantEvent.h"
|
||||
|
||||
namespace uLib {
|
||||
namespace Geant {
|
||||
|
||||
ULIB_REGISTER_OBJECT(Material)
|
||||
ULIB_REGISTER_OBJECT(Solid)
|
||||
ULIB_REGISTER_OBJECT(TessellatedSolid)
|
||||
ULIB_REGISTER_OBJECT(BoxSolid)
|
||||
ULIB_REGISTER_OBJECT(Scene)
|
||||
ULIB_REGISTER_OBJECT(SkyPlaneEmitterPrimary)
|
||||
ULIB_REGISTER_OBJECT(CylinderEmitterPrimary)
|
||||
ULIB_REGISTER_OBJECT(QuadMeshEmitterPrimary)
|
||||
ULIB_REGISTER_OBJECT(GeantEvent)
|
||||
|
||||
} // namespace Geant
|
||||
} // namespace uLib
|
||||
21
src/HEP/Geant/Matter.cpp
Normal file
21
src/HEP/Geant/Matter.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
#include "HEP/Geant/Matter.h"
|
||||
#include <Geant4/G4Material.hh>
|
||||
#include <Geant4/G4NistManager.hh>
|
||||
|
||||
using namespace uLib::Geant;
|
||||
|
||||
Material::Material() : m_G4Data(nullptr) {}
|
||||
|
||||
Material::Material(const char *name) : m_G4Data(nullptr) {
|
||||
this->SetFromNist(name);
|
||||
}
|
||||
|
||||
Material::~Material() {
|
||||
if(m_G4Data) delete m_G4Data;
|
||||
}
|
||||
|
||||
void Material::SetFromNist(const char *name) {
|
||||
G4NistManager* man = G4NistManager::Instance();
|
||||
m_G4Data = man->FindOrBuildMaterial(name);
|
||||
}
|
||||
@@ -29,9 +29,10 @@
|
||||
#define MATTER_H
|
||||
|
||||
#include "Core/Object.h"
|
||||
#include <Geant4/G4Material.hh>
|
||||
#include <Geant4/G4NistManager.hh>
|
||||
|
||||
class G4Element;
|
||||
class G4Material;
|
||||
|
||||
namespace uLib {
|
||||
namespace Geant {
|
||||
@@ -55,19 +56,55 @@ private:
|
||||
//// MATERIAL //////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// TODO: finish from G4NistMaterialBuilder
|
||||
|
||||
class Material : public Object {
|
||||
public:
|
||||
|
||||
enum State {
|
||||
Undefined = 0,
|
||||
Solid,
|
||||
Liquid,
|
||||
Gas
|
||||
};
|
||||
|
||||
virtual const char* GetClassName() const override { return "Geant.Material"; }
|
||||
|
||||
uLibRefMacro(G4Data,G4Material *)
|
||||
Material();
|
||||
Material(const char *name);
|
||||
~Material();
|
||||
|
||||
void SetFromNist(const char *name);
|
||||
|
||||
template <typename Ar>
|
||||
void serialize(Ar &ar) {
|
||||
ar & HRP("name", m_G4Data->GetName());
|
||||
ar & HRP("density", m_G4Data->GetDensity());
|
||||
ar & serialization::make_hrp_enum("state", m_G4Data->GetState(), {"Undefined", "Solid", "Liquid", "Gas"});
|
||||
}
|
||||
|
||||
G4Material *GetG4Material() { return m_G4Data; }
|
||||
|
||||
private:
|
||||
G4Material *m_G4Data;
|
||||
|
||||
};
|
||||
|
||||
// class MaterialCompound : public Material {
|
||||
// public:
|
||||
|
||||
|
||||
// MaterialCompound(const char *name) {}
|
||||
|
||||
// void AddMaterial(Material *m, double fractionmass) { m_Materials.push_back(std::make_pair(m, fractionmass)); }
|
||||
// void AddElement(Element *e, double fractionmass) { m_Elements.push_back(std::make_pair(e, fractionmass)); }
|
||||
// void SetDensity(double density) { m_Density = density; }
|
||||
|
||||
// private:
|
||||
// std::vector<std::pair<Material *, double>> m_Materials;
|
||||
// std::vector<std::pair<Element *, double>> m_Elements;
|
||||
// double m_Density;
|
||||
// };
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -146,6 +146,9 @@ void Solid::SetParent(Solid *parent) {
|
||||
|
||||
|
||||
|
||||
TessellatedSolid::TessellatedSolid()
|
||||
: BaseClass("unnamed_tessellated"), m_Solid(new G4TessellatedSolid("unnamed_tessellated")) {}
|
||||
|
||||
TessellatedSolid::TessellatedSolid(const char *name)
|
||||
: BaseClass(name), m_Solid(new G4TessellatedSolid(name)) {
|
||||
}
|
||||
@@ -173,9 +176,15 @@ void TessellatedSolid::Update() {
|
||||
|
||||
|
||||
|
||||
BoxSolid::BoxSolid(const char *name) :
|
||||
BaseClass(name),
|
||||
m_ContainerBox(new ContainerBox()),
|
||||
m_Solid(new G4Box(name, 1, 1, 1))
|
||||
{}
|
||||
|
||||
BoxSolid::BoxSolid(const char *name, ContainerBox *box) : BaseClass(name) {
|
||||
m_Solid = new G4Box(name, 1,1,1);
|
||||
m_Object = box;
|
||||
m_Solid = new G4Box(name, 1, 1, 1);
|
||||
m_ContainerBox = box;
|
||||
Object::connect(box, &ContainerBox::Updated, this, &BoxSolid::Update);
|
||||
if (m_Logical) {
|
||||
m_Logical->SetSolid(m_Solid);
|
||||
@@ -184,27 +193,30 @@ BoxSolid::BoxSolid(const char *name, ContainerBox *box) : BaseClass(name) {
|
||||
}
|
||||
|
||||
void BoxSolid::Update() {
|
||||
if (m_Object) {
|
||||
Vector3f size = m_Object->GetSize();
|
||||
if (m_ContainerBox) {
|
||||
Vector3f size = m_ContainerBox->GetSize();
|
||||
m_Solid->SetXHalfLength(size(0) * 0.5);
|
||||
m_Solid->SetYHalfLength(size(1) * 0.5);
|
||||
m_Solid->SetZHalfLength(size(2) * 0.5);
|
||||
|
||||
// Geant4 placement is relative to center. uLib Box is anchored at corner.
|
||||
// 1. Get position and rotation (clean, without scale)
|
||||
Vector3f pos = m_Object->GetPosition();
|
||||
Matrix3f rot = m_Object->GetRotation();
|
||||
Vector3f pos = m_ContainerBox->GetPosition();
|
||||
Matrix3f rot = m_ContainerBox->GetRotation();
|
||||
|
||||
// 2. Center = Corner + Rotation * (Half-Size)
|
||||
// We must rotate the offset vector because uLib box can be rotated.
|
||||
Vector3f center = pos + rot * (size * 0.5);
|
||||
|
||||
uLib::AffineTransform t;
|
||||
uLib::AffineTransform t;
|
||||
t.SetPosition(center);
|
||||
t.SetRotation(rot);
|
||||
|
||||
this->SetTransform(t.GetMatrix());
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
|
||||
void SetNistMaterial(const char *name);
|
||||
void SetMaterial(G4Material *material);
|
||||
|
||||
void SetSizeUnit(const char *unit);
|
||||
// Implementiamo SetParent qui, per tutti.
|
||||
virtual void SetParent(Solid *parent);
|
||||
@@ -69,6 +70,14 @@ public:
|
||||
return m_Logical ? m_Logical->GetName().c_str() : m_Name.c_str();
|
||||
}
|
||||
|
||||
template < typename Ar >
|
||||
void serialize(Ar &ar, const unsigned int version) {
|
||||
ar & m_Name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
std::string m_Name;
|
||||
@@ -89,6 +98,7 @@ public:
|
||||
|
||||
virtual const char* GetClassName() const override { return "Geant.TessellatedSolid"; }
|
||||
|
||||
TessellatedSolid();
|
||||
TessellatedSolid(const char *name);
|
||||
void SetMesh(TriangleMesh &mesh);
|
||||
uLibGetMacro(Solid, G4TessellatedSolid *)
|
||||
@@ -116,16 +126,23 @@ public:
|
||||
|
||||
virtual const char* GetClassName() const override { return "Geant.BoxSolid"; }
|
||||
|
||||
BoxSolid(const char *name = "");
|
||||
BoxSolid(const char *name, ContainerBox *box);
|
||||
virtual G4VSolid* GetG4Solid() const override { return (G4VSolid*)m_Solid; }
|
||||
|
||||
ContainerBox* GetObject() const { return m_Object; }
|
||||
ContainerBox* GetObject() const { return m_ContainerBox; }
|
||||
|
||||
template < typename Ar >
|
||||
void serialize(Ar &ar, const unsigned int version) {
|
||||
ar & boost::serialization::base_object<BaseClass>(*this);
|
||||
ar & m_ContainerBox;
|
||||
}
|
||||
|
||||
public slots:
|
||||
void Update();
|
||||
|
||||
private:
|
||||
ContainerBox *m_Object;
|
||||
ContainerBox *m_ContainerBox;
|
||||
G4Box *m_Solid;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user