add: SD, custom command
This commit is contained in:
parent
e1e512fa18
commit
8da1bce0dc
|
@ -6,7 +6,9 @@
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.icc": "cpp"
|
"*.icc": "cpp",
|
||||||
|
"line": "cpp",
|
||||||
|
"plane": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,7 +6,6 @@
|
||||||
/run/verbose 0
|
/run/verbose 0
|
||||||
/event/verbose 0
|
/event/verbose 0
|
||||||
/tracking/verbose 0
|
/tracking/verbose 0
|
||||||
/gps/verbose 0
|
|
||||||
|
|
||||||
# 初始化
|
# 初始化
|
||||||
/run/initialize
|
/run/initialize
|
||||||
|
@ -22,4 +21,6 @@
|
||||||
/gps/ene/ezero 0.0824
|
/gps/ene/ezero 0.0824
|
||||||
/gps/ang/type iso
|
/gps/ang/type iso
|
||||||
/gps/ang/maxtheta 90 deg
|
/gps/ang/maxtheta 90 deg
|
||||||
|
/gps/verbose 0
|
||||||
|
|
||||||
/run/beamOn 923242
|
/run/beamOn 923242
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
class G4VPhysicalVolume;
|
class G4VPhysicalVolume;
|
||||||
class G4LogicalVolume;
|
class G4LogicalVolume;
|
||||||
class G4HumanPhantomMaterial;
|
class G4HumanPhantomMaterial;
|
||||||
|
class G4HumanPhantomMessenger;
|
||||||
|
|
||||||
class DetectorConstruction : public G4VUserDetectorConstruction {
|
class DetectorConstruction : public G4VUserDetectorConstruction {
|
||||||
public:
|
public:
|
||||||
|
@ -15,6 +16,12 @@ public:
|
||||||
|
|
||||||
G4VPhysicalVolume* Construct() override;
|
G4VPhysicalVolume* Construct() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void SetBodyPartSensitivity(G4String, G4bool);
|
||||||
|
void SetPhantomSex(G4String);
|
||||||
|
void SetPhantomModel(G4String);
|
||||||
|
void ConstructSDandField();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ConstructSectionSphere(G4LogicalVolume* fMotherLogical, G4double zBias);
|
void ConstructSectionSphere(G4LogicalVolume* fMotherLogical, G4double zBias);
|
||||||
void ConstructSectionCons(G4String name, G4LogicalVolume* fMotherLogical, G4double zBias, G4double pRmax1,
|
void ConstructSectionCons(G4String name, G4LogicalVolume* fMotherLogical, G4double zBias, G4double pRmax1,
|
||||||
|
@ -24,10 +31,11 @@ private:
|
||||||
void ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysics);
|
void ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysics);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
G4HumanPhantomMaterial* material;
|
G4String sex = "Male";
|
||||||
G4String model;
|
G4String model = "MIRD";
|
||||||
G4String sex;
|
|
||||||
std::map<std::string, G4bool> sensitivities;
|
std::map<std::string, G4bool> sensitivities;
|
||||||
|
G4HumanPhantomMaterial* material;
|
||||||
|
G4HumanPhantomMessenger* messenger;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
#ifndef G4HumanPhantomHit_h
|
||||||
|
#define G4HumanPhantomHit_h 1
|
||||||
|
|
||||||
|
#include "G4Allocator.hh"
|
||||||
|
#include "G4THitsCollection.hh"
|
||||||
|
#include "G4ThreeVector.hh"
|
||||||
|
#include "G4VHit.hh"
|
||||||
|
#include "tls.hh" // FOR MT
|
||||||
|
|
||||||
|
class G4HumanPhantomHit : public G4VHit {
|
||||||
|
public:
|
||||||
|
G4HumanPhantomHit();
|
||||||
|
~G4HumanPhantomHit();
|
||||||
|
G4HumanPhantomHit(const G4HumanPhantomHit&);
|
||||||
|
const G4HumanPhantomHit& operator=(const G4HumanPhantomHit&);
|
||||||
|
G4bool operator==(const G4HumanPhantomHit&) const;
|
||||||
|
|
||||||
|
inline void* operator new(size_t);
|
||||||
|
inline void operator delete(void*);
|
||||||
|
|
||||||
|
void Draw();
|
||||||
|
void Print();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void SetBodyPartID(G4String bodyPartName) { bodyPartID = bodyPartName; };
|
||||||
|
void SetEdep(G4double de) { edep = de; };
|
||||||
|
|
||||||
|
G4String GetBodyPartID() { return bodyPartID; };
|
||||||
|
G4double GetEdep() { return edep; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
G4String bodyPartID;
|
||||||
|
G4double edep;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef G4THitsCollection<G4HumanPhantomHit> G4HumanPhantomHitsCollection;
|
||||||
|
|
||||||
|
extern G4ThreadLocal G4Allocator<G4HumanPhantomHit>* G4HumanPhantomHitAllocator;
|
||||||
|
|
||||||
|
inline void* G4HumanPhantomHit::operator new(size_t) {
|
||||||
|
if (!G4HumanPhantomHitAllocator) G4HumanPhantomHitAllocator = new G4Allocator<G4HumanPhantomHit>;
|
||||||
|
return (void*)G4HumanPhantomHitAllocator->MallocSingle();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void G4HumanPhantomHit::operator delete(void* aHit) {
|
||||||
|
G4HumanPhantomHitAllocator->FreeSingle((G4HumanPhantomHit*)aHit);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,40 @@
|
||||||
|
#ifndef G4HumanPhantomMessenger_h
|
||||||
|
#define G4HumanPhantomMessenger_h 1
|
||||||
|
|
||||||
|
class DetectorConstruction;
|
||||||
|
|
||||||
|
class G4UIcommand;
|
||||||
|
class G4UIdirectory;
|
||||||
|
class G4UIcmdWithAString;
|
||||||
|
class G4UIcmdWithoutParameter;
|
||||||
|
|
||||||
|
#include "G4UImessenger.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class G4HumanPhantomMessenger : public G4UImessenger {
|
||||||
|
public:
|
||||||
|
G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm);
|
||||||
|
~G4HumanPhantomMessenger();
|
||||||
|
|
||||||
|
void SetNewValue(G4UIcommand* command, G4String newValue);
|
||||||
|
|
||||||
|
void AddBodyPart(G4String); // Set Body Parts Sensitivity
|
||||||
|
|
||||||
|
private:
|
||||||
|
DetectorConstruction* myUserPhantom;
|
||||||
|
|
||||||
|
G4UIdirectory* phantomDir;
|
||||||
|
G4UIdirectory* bpDir;
|
||||||
|
|
||||||
|
G4UIcmdWithAString* modelCmd;
|
||||||
|
G4UIcmdWithAString* sexCmd;
|
||||||
|
G4UIcmdWithAString* bodypartCmd;
|
||||||
|
G4UIcmdWithoutParameter* endCmd;
|
||||||
|
|
||||||
|
G4String bodypart;
|
||||||
|
G4bool bps;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef G4HumanPhantomSD_h
|
||||||
|
#define G4HumanPhantomSD_h 1
|
||||||
|
|
||||||
|
#include "G4HumanPhantomHit.h"
|
||||||
|
|
||||||
|
#include "G4VSensitiveDetector.hh"
|
||||||
|
|
||||||
|
class G4Step;
|
||||||
|
|
||||||
|
class G4HumanPhantomSD : public G4VSensitiveDetector {
|
||||||
|
public:
|
||||||
|
G4HumanPhantomSD(const G4String& name, const G4String& hitsCollectionName);
|
||||||
|
~G4HumanPhantomSD();
|
||||||
|
|
||||||
|
void Initialize(G4HCofThisEvent*);
|
||||||
|
G4bool ProcessHits(G4Step*, G4TouchableHistory*);
|
||||||
|
void EndOfEvent(G4HCofThisEvent*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
G4HumanPhantomHitsCollection* collection;
|
||||||
|
};
|
||||||
|
#endif
|
|
@ -3,6 +3,8 @@
|
||||||
#include "G4CustomFemaleBuilder.h"
|
#include "G4CustomFemaleBuilder.h"
|
||||||
#include "G4FemaleBuilder.h"
|
#include "G4FemaleBuilder.h"
|
||||||
#include "G4HumanPhantomMaterial.h"
|
#include "G4HumanPhantomMaterial.h"
|
||||||
|
#include "G4HumanPhantomMessenger.h"
|
||||||
|
#include "G4HumanPhantomSD.h"
|
||||||
#include "G4MaleBuilder.h"
|
#include "G4MaleBuilder.h"
|
||||||
#include "Material.h"
|
#include "Material.h"
|
||||||
|
|
||||||
|
@ -11,6 +13,7 @@
|
||||||
#include "G4IntersectionSolid.hh"
|
#include "G4IntersectionSolid.hh"
|
||||||
#include "G4LogicalVolume.hh"
|
#include "G4LogicalVolume.hh"
|
||||||
#include "G4PVPlacement.hh"
|
#include "G4PVPlacement.hh"
|
||||||
|
#include "G4SDManager.hh"
|
||||||
#include "G4Sphere.hh"
|
#include "G4Sphere.hh"
|
||||||
#include "G4SubtractionSolid.hh"
|
#include "G4SubtractionSolid.hh"
|
||||||
#include "G4SystemOfUnits.hh"
|
#include "G4SystemOfUnits.hh"
|
||||||
|
@ -18,9 +21,15 @@
|
||||||
#include "G4Tubs.hh"
|
#include "G4Tubs.hh"
|
||||||
#include "G4UnionSolid.hh"
|
#include "G4UnionSolid.hh"
|
||||||
|
|
||||||
DetectorConstruction::DetectorConstruction() { material = new G4HumanPhantomMaterial(); }
|
DetectorConstruction::DetectorConstruction() {
|
||||||
|
material = new G4HumanPhantomMaterial();
|
||||||
|
messenger = new G4HumanPhantomMessenger(this);
|
||||||
|
}
|
||||||
|
|
||||||
DetectorConstruction::~DetectorConstruction() { delete material; }
|
DetectorConstruction::~DetectorConstruction() {
|
||||||
|
delete material;
|
||||||
|
delete messenger;
|
||||||
|
}
|
||||||
|
|
||||||
void DetectorConstruction::ConstructSectionSphere(G4LogicalVolume* fMotherLogical, G4double zBias) {
|
void DetectorConstruction::ConstructSectionSphere(G4LogicalVolume* fMotherLogical, G4double zBias) {
|
||||||
G4double pRadius = 2.8 * m / 2;
|
G4double pRadius = 2.8 * m / 2;
|
||||||
|
@ -226,37 +235,22 @@ void DetectorConstruction::ConstructSectionBig(G4LogicalVolume* fMotherLogical,
|
||||||
|
|
||||||
void DetectorConstruction::ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysics) {
|
void DetectorConstruction::ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysics) {
|
||||||
material->DefineMaterials();
|
material->DefineMaterials();
|
||||||
|
|
||||||
G4BasePhantomBuilder* builder = 0;
|
G4BasePhantomBuilder* builder = 0;
|
||||||
|
|
||||||
if (sex == "Female") {
|
if (sex == "Female")
|
||||||
if (model == "MIX")
|
builder = new G4FemaleBuilder;
|
||||||
builder = new G4CustomFemaleBuilder;
|
else
|
||||||
else {
|
|
||||||
builder = new G4FemaleBuilder;
|
|
||||||
}
|
|
||||||
builder->SetModel(model);
|
|
||||||
G4cout << model << " " << sex << G4endl;
|
|
||||||
} else if (sex == "Male") {
|
|
||||||
builder = new G4MaleBuilder;
|
builder = new G4MaleBuilder;
|
||||||
builder->SetModel(model);
|
|
||||||
if (model == "MIX") {
|
|
||||||
G4cout << "Custom Male is not available!!! MIRD model is selected !" << G4endl;
|
|
||||||
model = "MIRD";
|
|
||||||
builder->SetModel(model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
builder->SetModel(model);
|
||||||
builder->SetMotherVolume(fMotherPhysics);
|
builder->SetMotherVolume(fMotherPhysics);
|
||||||
|
|
||||||
// the argument indicates the sensitivity of the volume
|
// the argument indicates the sensitivity of the volume
|
||||||
|
builder->BuildHead("blue", false, sensitivities["Head"]);
|
||||||
builder->BuildHead("black", false, sensitivities["Head"]);
|
|
||||||
builder->BuildSkull("orange", false, sensitivities["Skull"]);
|
builder->BuildSkull("orange", false, sensitivities["Skull"]);
|
||||||
builder->BuildBrain("yellow", true, sensitivities["Brain"]);
|
builder->BuildBrain("yellow", true, sensitivities["Brain"]);
|
||||||
|
|
||||||
if (model != "MIRDHead") {
|
if (model != "MIRDHead") {
|
||||||
// builder->SetModel(model);
|
|
||||||
builder->BuildTrunk("yellow", false, sensitivities["Trunk"]);
|
builder->BuildTrunk("yellow", false, sensitivities["Trunk"]);
|
||||||
|
|
||||||
builder->BuildLeftLeg("yellow", false, sensitivities["LeftLeg"]);
|
builder->BuildLeftLeg("yellow", false, sensitivities["LeftLeg"]);
|
||||||
|
@ -270,17 +264,15 @@ void DetectorConstruction::ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysi
|
||||||
|
|
||||||
builder->BuildUpperSpine("yellow", true, sensitivities["UpperSpine"]);
|
builder->BuildUpperSpine("yellow", true, sensitivities["UpperSpine"]);
|
||||||
|
|
||||||
if (model == "MIRD" || model == "MIX") {
|
builder->BuildLeftScapula("grey", true, sensitivities["LeftScapula"]);
|
||||||
builder->BuildLeftScapula("grey", true, sensitivities["LeftScapula"]);
|
builder->BuildRightScapula("grey", true, sensitivities["RightScapula"]);
|
||||||
builder->BuildRightScapula("grey", true, sensitivities["RightScapula"]);
|
builder->BuildLeftAdrenal("yellow", true, sensitivities["LeftAdrenal"]);
|
||||||
builder->BuildLeftAdrenal("yellow", true, sensitivities["LeftAdrenal"]);
|
builder->BuildRightAdrenal("yellow", true, sensitivities["RightAdrenal"]);
|
||||||
builder->BuildRightAdrenal("yellow", true, sensitivities["RightAdrenal"]);
|
builder->BuildThymus("orange", true, sensitivities["Thymus"]);
|
||||||
builder->BuildThymus("orange", true, sensitivities["Thymus"]);
|
builder->BuildLeftClavicle("grey", true, sensitivities["LeftClavicle"]);
|
||||||
builder->BuildLeftClavicle("grey", true, sensitivities["LeftClavicle"]);
|
builder->BuildRightClavicle("grey", true, sensitivities["RightClavicle"]);
|
||||||
builder->BuildRightClavicle("grey", true, sensitivities["RightClavicle"]);
|
builder->BuildSmallIntestine("orange", true, sensitivities["SmallIntestine"]);
|
||||||
builder->BuildSmallIntestine("orange", true, sensitivities["SmallIntestine"]);
|
builder->BuildRibCage("grey", true, sensitivities["RibCage"]);
|
||||||
builder->BuildRibCage("grey", true, sensitivities["RibCage"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
builder->BuildMiddleLowerSpine("yellow", true, sensitivities["MiddleLowerSpine"]);
|
builder->BuildMiddleLowerSpine("yellow", true, sensitivities["MiddleLowerSpine"]);
|
||||||
|
|
||||||
|
@ -311,7 +303,7 @@ void DetectorConstruction::ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysi
|
||||||
if (model == "MIRD") {
|
if (model == "MIRD") {
|
||||||
builder->BuildLeftBreast("purple", true, sensitivities["LeftBreast"]);
|
builder->BuildLeftBreast("purple", true, sensitivities["LeftBreast"]);
|
||||||
builder->BuildRightBreast("purple", true, sensitivities["RightBreast"]);
|
builder->BuildRightBreast("purple", true, sensitivities["RightBreast"]);
|
||||||
} else if (model == "MIX") {
|
} else {
|
||||||
builder->BuildVoxelLeftBreast("purple", false, sensitivities["LeftBreast"]);
|
builder->BuildVoxelLeftBreast("purple", false, sensitivities["LeftBreast"]);
|
||||||
builder->BuildVoxelRightBreast("purple", false, sensitivities["RightBreast"]);
|
builder->BuildVoxelRightBreast("purple", false, sensitivities["RightBreast"]);
|
||||||
}
|
}
|
||||||
|
@ -323,7 +315,7 @@ void DetectorConstruction::ConstructHumanPhantom(G4VPhysicalVolume* fMotherPhysi
|
||||||
builder->BuildRightTeste("purple", true, sensitivities["RightTeste"]);
|
builder->BuildRightTeste("purple", true, sensitivities["RightTeste"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
G4VPhysicalVolume* result = builder->GetPhantom();
|
|
||||||
delete builder;
|
delete builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,19 +328,6 @@ G4VPhysicalVolume* DetectorConstruction::Construct() {
|
||||||
G4LogicalVolume* logicWorld = new G4LogicalVolume(solidWorld, G4Material::GetMaterial("Vacuum"), "World");
|
G4LogicalVolume* logicWorld = new G4LogicalVolume(solidWorld, G4Material::GetMaterial("Vacuum"), "World");
|
||||||
G4VPhysicalVolume* physicsWorld = new G4PVPlacement(0, G4ThreeVector(), logicWorld, "World", 0, false, 0, true);
|
G4VPhysicalVolume* physicsWorld = new G4PVPlacement(0, G4ThreeVector(), logicWorld, "World", 0, false, 0, true);
|
||||||
|
|
||||||
// Debug for particle range
|
|
||||||
// G4Box* solidPlane1 = new G4Box("Plane1", 10 * m, 10 * m, 2 * mm);
|
|
||||||
// G4LogicalVolume* logicPlane1 = new G4LogicalVolume(solidPlane1, G4Material::GetMaterial("AluminumAlloySeries5"),
|
|
||||||
// "Plane1"); new G4PVPlacement(0, G4ThreeVector(), logicPlane1, "Plane1", logicWorld, false, 0, true);
|
|
||||||
|
|
||||||
// G4Box* solidPlane2 = new G4Box("Plane2", 10 * m, 10 * m, 10 * mm);
|
|
||||||
// G4LogicalVolume* logicPlane2 = new G4LogicalVolume(solidPlane2, G4Material::GetMaterial("Taparan"), "Plane2");
|
|
||||||
// new G4PVPlacement(0, G4ThreeVector(0, 0, -6), logicPlane2, "Plane2", logicWorld, false, 0, true);
|
|
||||||
|
|
||||||
// G4Box* solidPlane3 = new G4Box("Plane3", 10 * m, 10 * m, 5 * mm);
|
|
||||||
// G4LogicalVolume* logicPlane3 = new G4LogicalVolume(solidPlane3, G4Material::GetMaterial("AluminumAlloySeries5"),
|
|
||||||
// "Plane3"); new G4PVPlacement(0, G4ThreeVector(0, 0, -14.5), logicPlane3, "Plane3", logicWorld, false, 0, true);
|
|
||||||
|
|
||||||
// 节点舱
|
// 节点舱
|
||||||
ConstructSectionSphere(logicWorld, (5.18 + 0.33) * m);
|
ConstructSectionSphere(logicWorld, (5.18 + 0.33) * m);
|
||||||
// 过渡段 1
|
// 过渡段 1
|
||||||
|
@ -361,6 +340,87 @@ G4VPhysicalVolume* DetectorConstruction::Construct() {
|
||||||
0.815 * m / 2);
|
0.815 * m / 2);
|
||||||
// 大柱段
|
// 大柱段
|
||||||
ConstructSectionBig(logicWorld, 0.815 * m);
|
ConstructSectionBig(logicWorld, 0.815 * m);
|
||||||
|
// 体模
|
||||||
|
G4RotationMatrix* rotationMatrix = new G4RotationMatrix();
|
||||||
|
rotationMatrix->rotateX(90. * deg);
|
||||||
|
|
||||||
|
G4Box* solidPhantom = new G4Box("Phantom", 2. * m, 1. * m, 1. * m);
|
||||||
|
G4LogicalVolume* logicPhantom = new G4LogicalVolume(solidPhantom, G4Material::GetMaterial("Vacuum"), "Phantom");
|
||||||
|
G4VPhysicalVolume* physicsPhantom = new G4PVPlacement(rotationMatrix, G4ThreeVector(0, 0, -1 * m), logicPhantom,
|
||||||
|
"Phantom", logicWorld, false, 0, true);
|
||||||
|
ConstructHumanPhantom(physicsPhantom);
|
||||||
|
|
||||||
return physicsWorld;
|
return physicsWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DetectorConstruction::SetBodyPartSensitivity(G4String, G4bool) {
|
||||||
|
G4cout << "This method is not currently working !!!!" << G4endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DetectorConstruction::SetPhantomSex(G4String newSex) {
|
||||||
|
sex = newSex;
|
||||||
|
|
||||||
|
if (sex == "Male") G4cout << ">> Male Phantom will be built." << G4endl;
|
||||||
|
if (sex == "Female") G4cout << ">> Female Phantom will be built." << G4endl;
|
||||||
|
if ((sex != "Female") && (sex != "Male")) G4cout << sex << " can not be defined!" << G4endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DetectorConstruction::SetPhantomModel(G4String newModel) {
|
||||||
|
model = newModel;
|
||||||
|
|
||||||
|
if (model == "MIRD") G4cout << " >> Phantom " << model << " will be built." << G4endl;
|
||||||
|
if (model == "MIRDHead") G4cout << " >> Phantom " << model << " will be built." << G4endl;
|
||||||
|
if ((model != "MIRD") && (model != "MIRDHead")) G4cout << model << " can not be defined!" << G4endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DetectorConstruction::ConstructSDandField() {
|
||||||
|
G4HumanPhantomSD* SD = new G4HumanPhantomSD("SD", "HumanPhantomCollection");
|
||||||
|
G4SDManager::GetSDMpointer()->AddNewDetector(SD);
|
||||||
|
|
||||||
|
SetSensitiveDetector("logicalHead", SD);
|
||||||
|
SetSensitiveDetector("logicalSkull", SD);
|
||||||
|
SetSensitiveDetector("logicalBrain", SD);
|
||||||
|
|
||||||
|
if (model != "MIRDHead") {
|
||||||
|
SetSensitiveDetector("logicalTrunk", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftLeg", SD);
|
||||||
|
SetSensitiveDetector("logicalRightLeg", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftArmBone", SD);
|
||||||
|
SetSensitiveDetector("logicalRightArmBone", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftLegBone", SD);
|
||||||
|
SetSensitiveDetector("logicalRightLegBone", SD);
|
||||||
|
SetSensitiveDetector("logicalUpperSpine", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftScapula", SD);
|
||||||
|
SetSensitiveDetector("logicalRightScapula", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftAdrenal", SD);
|
||||||
|
SetSensitiveDetector("logicalRightAdrenal", SD);
|
||||||
|
SetSensitiveDetector("logicalThymus", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftClavicle", SD);
|
||||||
|
SetSensitiveDetector("logicalRightClavicle", SD);
|
||||||
|
SetSensitiveDetector("logicalSmallIntestine", SD);
|
||||||
|
SetSensitiveDetector("logicalRibCage", SD);
|
||||||
|
SetSensitiveDetector("logicalMiddleLowerSpine", SD);
|
||||||
|
SetSensitiveDetector("logicalStomach", SD);
|
||||||
|
SetSensitiveDetector("logicalUpperLargeIntestine", SD);
|
||||||
|
SetSensitiveDetector("logicalLowerLargeIntestine", SD);
|
||||||
|
SetSensitiveDetector("logicalSpleen", SD);
|
||||||
|
SetSensitiveDetector("logicalPancreas", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftKidney", SD);
|
||||||
|
SetSensitiveDetector("logicalRightKidney", SD);
|
||||||
|
SetSensitiveDetector("logicalUrinaryBladder", SD);
|
||||||
|
|
||||||
|
if (sex == "Female") {
|
||||||
|
SetSensitiveDetector("logicalLeftOvary", SD);
|
||||||
|
SetSensitiveDetector("logicalRightOvary", SD);
|
||||||
|
SetSensitiveDetector("logicalUterus", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftBreast", SD);
|
||||||
|
SetSensitiveDetector("logicalRightBreast", SD);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sex == "Male") {
|
||||||
|
SetSensitiveDetector("logicalMaleGenitalia", SD);
|
||||||
|
SetSensitiveDetector("logicalLeftTeste", SD);
|
||||||
|
SetSensitiveDetector("logicalRightTeste", SD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#include "G4HumanPhantomHit.h"
|
||||||
|
|
||||||
|
#include "G4Circle.hh"
|
||||||
|
#include "G4Colour.hh"
|
||||||
|
#include "G4UnitsTable.hh"
|
||||||
|
#include "G4VVisManager.hh"
|
||||||
|
#include "G4VisAttributes.hh"
|
||||||
|
|
||||||
|
// THIS IS NECESSARY FOR MT MODE
|
||||||
|
G4ThreadLocal G4Allocator<G4HumanPhantomHit>* G4HumanPhantomHitAllocator = 0;
|
||||||
|
|
||||||
|
G4HumanPhantomHit::G4HumanPhantomHit() {}
|
||||||
|
|
||||||
|
G4HumanPhantomHit::~G4HumanPhantomHit() {}
|
||||||
|
|
||||||
|
G4HumanPhantomHit::G4HumanPhantomHit(const G4HumanPhantomHit& right) : G4VHit() {
|
||||||
|
bodyPartID = right.bodyPartID;
|
||||||
|
edep = right.edep;
|
||||||
|
}
|
||||||
|
|
||||||
|
const G4HumanPhantomHit& G4HumanPhantomHit::operator=(const G4HumanPhantomHit& right) {
|
||||||
|
bodyPartID = right.bodyPartID;
|
||||||
|
edep = right.edep;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
G4bool G4HumanPhantomHit::operator==(const G4HumanPhantomHit& right) const { return (this == &right) ? true : false; }
|
||||||
|
|
||||||
|
void G4HumanPhantomHit::Draw() {}
|
||||||
|
|
||||||
|
void G4HumanPhantomHit::Print() {
|
||||||
|
G4cout << "Energy deposit: " << G4BestUnit(edep, "Energy") << "BodyPartID: " << bodyPartID << G4endl;
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include "DetectorConstruction.h"
|
||||||
|
#include "G4HumanPhantomMessenger.h"
|
||||||
|
|
||||||
|
#include "G4RunManager.hh"
|
||||||
|
#include "G4UIcmdWithAString.hh"
|
||||||
|
#include "G4UIcmdWithoutParameter.hh"
|
||||||
|
#include "G4UIdirectory.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
|
||||||
|
G4HumanPhantomMessenger::G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm)
|
||||||
|
: myUserPhantom(myUsrPhtm), bps(false) {
|
||||||
|
phantomDir = new G4UIdirectory("/phantom/");
|
||||||
|
phantomDir->SetGuidance("Set Your Phantom.");
|
||||||
|
|
||||||
|
bpDir = new G4UIdirectory("/bodypart/");
|
||||||
|
bpDir->SetGuidance("Add Body Part to Phantom");
|
||||||
|
|
||||||
|
modelCmd = new G4UIcmdWithAString("/phantom/setPhantomModel", this);
|
||||||
|
modelCmd->SetGuidance("Set sex of Phantom: MIRD, MIRDHead.");
|
||||||
|
modelCmd->SetParameterName("phantomModel", true);
|
||||||
|
modelCmd->SetDefaultValue("MIRD");
|
||||||
|
modelCmd->SetCandidates("MIRD MIRDHead");
|
||||||
|
modelCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
|
||||||
|
|
||||||
|
sexCmd = new G4UIcmdWithAString("/phantom/setPhantomSex", this);
|
||||||
|
sexCmd->SetGuidance("Set sex of Phantom: Male or Female.");
|
||||||
|
sexCmd->SetParameterName("phantomSex", true);
|
||||||
|
sexCmd->SetDefaultValue("Female");
|
||||||
|
sexCmd->SetCandidates("Male Female");
|
||||||
|
sexCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
|
||||||
|
|
||||||
|
bodypartCmd = new G4UIcmdWithAString("/bodypart/addBodyPart", this);
|
||||||
|
bodypartCmd->SetGuidance("Add a Body Part to Phantom");
|
||||||
|
bodypartCmd->SetParameterName("bpName", true);
|
||||||
|
bodypartCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
|
||||||
|
|
||||||
|
endCmd = new G4UIcmdWithoutParameter("/phantom/buildNewPhantom", this);
|
||||||
|
endCmd->SetGuidance("Build your Phantom.");
|
||||||
|
endCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
G4HumanPhantomMessenger::~G4HumanPhantomMessenger() {
|
||||||
|
delete modelCmd;
|
||||||
|
delete sexCmd;
|
||||||
|
delete bodypartCmd;
|
||||||
|
delete endCmd;
|
||||||
|
delete phantomDir;
|
||||||
|
delete bpDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
void G4HumanPhantomMessenger::SetNewValue(G4UIcommand* command, G4String newValue) {
|
||||||
|
if (command == modelCmd) {
|
||||||
|
myUserPhantom->SetPhantomModel(newValue);
|
||||||
|
}
|
||||||
|
if (command == sexCmd) {
|
||||||
|
myUserPhantom->SetPhantomSex(newValue);
|
||||||
|
}
|
||||||
|
if (command == bodypartCmd) {
|
||||||
|
AddBodyPart(newValue);
|
||||||
|
}
|
||||||
|
if (command == endCmd) {
|
||||||
|
G4cout << " ****************>>>> NEW PHANTOM CONSTRUCTION <<<<***************** " << G4endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void G4HumanPhantomMessenger::AddBodyPart(G4String newBodyPartSensitivity) {
|
||||||
|
char* str = new char[newBodyPartSensitivity.length() + 1];
|
||||||
|
|
||||||
|
strcpy(str, newBodyPartSensitivity.c_str());
|
||||||
|
|
||||||
|
std::string bpart = strtok(str, " ");
|
||||||
|
|
||||||
|
std::string sensitivity = strtok(NULL, " ");
|
||||||
|
|
||||||
|
if (sensitivity == "yes") {
|
||||||
|
bps = true;
|
||||||
|
} else {
|
||||||
|
bps = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
G4cout << " >>> Body Part = " << bpart << "\n"
|
||||||
|
<< " >>> Sensitivity = " << sensitivity << G4endl;
|
||||||
|
|
||||||
|
myUserPhantom->SetBodyPartSensitivity(bpart, bps);
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
#include "G4HumanPhantomSD.h"
|
||||||
|
|
||||||
|
#include "G4HCofThisEvent.hh"
|
||||||
|
#include "G4SDManager.hh"
|
||||||
|
#include "G4Step.hh"
|
||||||
|
#include "G4ios.hh"
|
||||||
|
|
||||||
|
G4HumanPhantomSD::G4HumanPhantomSD(const G4String& name, const G4String& hitsCollectionName)
|
||||||
|
: G4VSensitiveDetector(name) {
|
||||||
|
collectionName.insert(hitsCollectionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
G4HumanPhantomSD::~G4HumanPhantomSD() {}
|
||||||
|
|
||||||
|
void G4HumanPhantomSD::Initialize(G4HCofThisEvent* HCE) {
|
||||||
|
collection = new G4HumanPhantomHitsCollection(SensitiveDetectorName, collectionName[0]);
|
||||||
|
static G4int HCID = -1;
|
||||||
|
if (HCID < 0) {
|
||||||
|
HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
|
||||||
|
}
|
||||||
|
HCE->AddHitsCollection(HCID, collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
G4bool G4HumanPhantomSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) {
|
||||||
|
G4double edep = aStep->GetTotalEnergyDeposit();
|
||||||
|
|
||||||
|
if (edep == 0.) return false;
|
||||||
|
|
||||||
|
G4String bodypartName = aStep->GetPreStepPoint()->GetTouchable()->GetVolume()->GetLogicalVolume()->GetName();
|
||||||
|
|
||||||
|
// G4cout <<bodypartName <<":" << edep/MeV<< G4endl;
|
||||||
|
|
||||||
|
G4HumanPhantomHit* newHit = new G4HumanPhantomHit();
|
||||||
|
newHit->SetEdep(edep);
|
||||||
|
newHit->SetBodyPartID(bodypartName);
|
||||||
|
collection->insert(newHit);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void G4HumanPhantomSD::EndOfEvent(G4HCofThisEvent*) {
|
||||||
|
// G4int NbHits = collection->entries();
|
||||||
|
// G4cout << "\n-------->Hits Collection: in this event they are " << NbHits
|
||||||
|
// << " hits in the tracker chambers: " << G4endl;
|
||||||
|
// for (G4int i=0;i<NbHits;i++) (*collection)[i]->Print();
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
#include "G4VoxelBreastFactory.hh"
|
#include "G4VoxelBreastFactory.h"
|
||||||
|
#include "G4VoxelLeftBreast.h"
|
||||||
#include "G4VoxelLeftBreast.hh"
|
#include "G4VoxelRightBreast.h"
|
||||||
#include "G4VoxelRightBreast.hh"
|
|
||||||
|
|
||||||
G4VoxelBreastFactory::G4VoxelBreastFactory() {
|
G4VoxelBreastFactory::G4VoxelBreastFactory() {
|
||||||
// Map with name of the organ and pointer to the MIRDOrgan class
|
// Map with name of the organ and pointer to the MIRDOrgan class
|
||||||
|
|
1
vis.mac
1
vis.mac
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
# 设置颜色
|
# 设置颜色
|
||||||
/vis/geometry/set/visibility World 0 false
|
/vis/geometry/set/visibility World 0 false
|
||||||
|
/vis/geometry/set/visibility Phantom 0 false
|
||||||
/vis/geometry/set/visibility BigWorld 0 false
|
/vis/geometry/set/visibility BigWorld 0 false
|
||||||
/vis/geometry/set/colour BigMid 0 0.631373 0.686275 0.733333 0.584314
|
/vis/geometry/set/colour BigMid 0 0.631373 0.686275 0.733333 0.584314
|
||||||
/vis/geometry/set/colour BigAir 0 0.631373 0.686275 0.733333 0.584314
|
/vis/geometry/set/colour BigAir 0 0.631373 0.686275 0.733333 0.584314
|
||||||
|
|
Loading…
Reference in New Issue