change: model;remove: voxel organ, add bodypart command;

This commit is contained in:
liuyihui 2022-05-17 22:22:18 +08:00
parent 8da1bce0dc
commit 8f4475d3e1
22 changed files with 34 additions and 413 deletions

View File

@ -8,7 +8,9 @@
"files.associations": {
"*.icc": "cpp",
"line": "cpp",
"plane": "cpp"
"plane": "cpp",
"qrot": "cpp",
"cmath": "cpp"
}
}
}

View File

@ -185,26 +185,7 @@ $$
</div>
### 电子
由于该模型较为简单,使用`Geant4`的`General Particle Source``GPS`)可以较为方便地生成源,
```macro
/gps/source/clear
/gps/source/add 1
/gps/particle e-
/gps/pos/type Surface
/gps/pos/shape Sphere
/gps/pos/radius 15 m
/gps/ene/type Exp
/gps/ene/min 100 keV
/gps/ene/max 10 MeV
/gps/ene/ezero 0.0824
/gps/ang/type iso
/gps/ang/maxtheta 90 deg
/run/beamOn 923242
```
### 质子与俘获辐射
由于模型较为复杂,且需要发射的粒子种类繁多,因此该部分的粒子使用`G4ParticleGun`生成,关键是生成各向同性(在球面上均匀分布)的位置、方向和符合能谱的能量分布。
由于模型较为复杂,且需要发射的粒子种类繁多,因此使用`G4ParticleGun`生成各类粒子,关键是生成各向同性(在球面上均匀分布)的位置、方向和符合能谱的能量分布。
1. `Inverse Transform Method``ITM`
对于一个在$[a, b]$的分布,设其概率密度函数(PDF)为$F(x)$,对其积分可获得累积分布函数(CDF),记为$y=C(x)=\int_a^x F(u)\mathrm{d}u$,其反函数为$C^{-1}(y)$。设$y$为$[0, 1)$上均匀分布的随机数,则$x=C^{-1}(y)$满足$F(x)$的分布。
@ -236,6 +217,15 @@ $$
为了保证发射方向是朝向球面内,因此需要限制$\theta$的最大角度为$90^{\circ}$。
3. 能量
* 俘获电子的函数较为简单,采用`ITM`;(下表中$j_0$已经归一化)
<div align=center>
| $F(E)$ | $\int F(E)\mathrm{d}E$ | $C(x)=\int_a^xF(u)\mathrm{d}u$ | $C^{-1}(y)$ |
|:--------------------------:|:------------------------------------------:|:----------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------------------:|
| $j=j_0e^{-E/E_0}$ | $-j_0E_0e^{-E/E_0}$ | $j_0E_0e^{-a/E_0}-j_0E_0e^{-x/E_0}$ | $-E_0\ln(\frac{C-y}{j_0E_0}),\ C=j_0E_0e^{-a/E_0}$ |
</div>
<div align=center><img src="docs/simu-te.png" style="max-width: 50%;"></div>
* 俘获质子的函数较为简单,采用`ITM`;(下表中$j_0$已经归一化)
<div align=center>

View File

@ -1,3 +1,4 @@
TE, 1, -1, 1333680.43009, 0.0824, 32652.96179377461
TP, 1, 1, 559.76377, -1.53424, 2.40873, 1.5156509
GCR_H, 1, 1, 125.89223, 44.00673, -0.000460574, 112356, 361.781666
GCR_He, 2, 4, 0.01815, 0.000297726, 0.00184, 0.49271, 48.4143048

BIN
docs/simu-te.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -1,17 +0,0 @@
#ifndef G4CustomFemaleBuilder_h
#define G4CustomFemaleBuilder_h 1
#include "G4PhantomBuilder.h"
class G4CustomFemaleBuilder : public G4PhantomBuilder {
public:
G4CustomFemaleBuilder();
~G4CustomFemaleBuilder();
void BuildVoxelLeftBreast(const G4String&, G4bool, G4bool);
void BuildVoxelRightBreast(const G4String&, G4bool, G4bool);
void BuildLeftOvary(const G4String&, G4bool, G4bool);
void BuildRightOvary(const G4String&, G4bool, G4bool);
void BuildUterus(const G4String&, G4bool, G4bool);
};
#endif

View File

@ -14,12 +14,6 @@ public:
G4Material* GetMaterial(G4String); // returns the material
private:
// G4Material* matW;
// G4Material* matplexiglass;
// G4Material* matPb;
// G4Material* matir192;
// G4Material* Titanium;
// G4Material* matAir;
G4Material* matH2O;
G4Material* soft;
G4Material* skeleton;
@ -27,8 +21,6 @@ private:
G4Material* adipose;
G4Material* glandular;
G4Material* adipose_glandular;
// G4Material*Vacuum;
// G4Material* muscle;
G4Material* muscle;
};
#endif

View File

@ -20,21 +20,14 @@ public:
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

View File

@ -1,21 +0,0 @@
#ifndef G4VoxelBreastFactory_h
#define G4VoxelBreastFactory_h 1
#include "G4VBodyFactory.h"
#include "G4VOrgan.h"
#include <map>
class G4VBodyFactory;
class G4VPhysicalVolume;
class G4VOrgan;
class G4VoxelBreastFactory : public G4VBodyFactory {
public:
G4VoxelBreastFactory();
~G4VoxelBreastFactory();
G4VPhysicalVolume* CreateOrgan(const G4String&, G4VPhysicalVolume*, const G4String&, G4bool, G4bool);
private:
std::map<std::string, G4VOrgan*> organ;
};
#endif

View File

@ -1,16 +0,0 @@
#ifndef G4VoxelLeftBreast_h
#define G4VoxelLeftBreast_h 1
#include "G4VOrgan.h"
#include "G4VPhysicalVolume.hh"
class G4VPhysicalVolume;
class G4VoxelLeftBreast : public G4VOrgan {
public:
G4VoxelLeftBreast();
~G4VoxelLeftBreast();
G4VPhysicalVolume* Construct(const G4String&, G4VPhysicalVolume*, const G4String&, G4bool, G4bool);
};
#endif

View File

@ -1,16 +0,0 @@
#ifndef G4VoxelRightBreast_h
#define G4VoxelRightBreast_h 1
#include "G4VOrgan.h"
#include "G4VPhysicalVolume.hh"
class G4VPhysicalVolume;
class G4VoxelRightBreast : public G4VOrgan {
public:
G4VoxelRightBreast();
~G4VoxelRightBreast();
G4VPhysicalVolume* Construct(const G4String&, G4VPhysicalVolume*, const G4String&, G4bool, G4bool);
};
#endif

View File

@ -1,28 +1,25 @@
#ifndef DESCSS_PrimaryGeneratorAction_h
#define DESCSS_PrimaryGeneratorAction_h
#include "G4GeneralParticleSource.hh"
#include "G4ParticleGun.hh"
#include "G4VUserPrimaryGeneratorAction.hh"
#include "globals.hh"
class G4GeneralParticleSource;
class G4ParticleGun;
class G4Event;
extern G4String particleType;
template <typename T>
class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction {
public:
PrimaryGeneratorAction();
~PrimaryGeneratorAction();
virtual void GeneratePrimaries(G4Event*);
const T* GetParticleGun() const { return fParticleGun; }
const G4ParticleGun* GetParticleGun() const { return fParticleGun; }
private:
T* fParticleGun = nullptr;
G4ParticleGun* fParticleGun = nullptr;
};
#endif

View File

@ -4,7 +4,6 @@
#include "Randomize.hh"
extern G4String particleType;
class G4GeneralParticleSource;
class G4ParticleGun;
@ -19,8 +18,5 @@ ActionInitialization::~ActionInitialization() {}
void ActionInitialization::BuildForMaster() const {}
void ActionInitialization::Build() const {
if (particleType == "TE")
SetUserAction(new PrimaryGeneratorAction<G4GeneralParticleSource>);
else
SetUserAction(new PrimaryGeneratorAction<G4ParticleGun>);
SetUserAction(new PrimaryGeneratorAction);
}

View File

@ -1,6 +1,5 @@
#include "DetectorConstruction.h"
#include "G4BasePhantomBuilder.h"
#include "G4CustomFemaleBuilder.h"
#include "G4FemaleBuilder.h"
#include "G4HumanPhantomMaterial.h"
#include "G4HumanPhantomMessenger.h"

View File

@ -1,62 +0,0 @@
#include "G4CustomFemaleBuilder.h"
#include "G4VBodyFactory.h"
#include "G4VoxelBreastFactory.h"
G4CustomFemaleBuilder::G4CustomFemaleBuilder() {}
G4CustomFemaleBuilder::~G4CustomFemaleBuilder()
{
delete body;
}
void G4CustomFemaleBuilder::BuildUterus(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
{
if (trunkVolume == 0)
G4Exception("G4CustomFemaleBuilder::BuildUterus()", "human_phantom0001", FatalException,
"The trunk volume is missing !!!!!");
body->CreateOrgan("Uterus", trunkVolume, colourName, solidVis, sensitivity);
}
void G4CustomFemaleBuilder::BuildLeftOvary(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
{
if (trunkVolume == 0)
G4Exception("G4CustomFemaleBuilder::BuildLeftOvary()", "human_phantom0002", FatalException,
"The trunk volume is missing !!!!!");
body->CreateOrgan("LeftOvary", trunkVolume, colourName, solidVis, sensitivity);
}
void G4CustomFemaleBuilder::BuildRightOvary(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
{
if (trunkVolume == 0)
G4Exception("G4CustomFemaleBuilder::BuildRightOvary()", "human_phantom0003", FatalException,
"The trunk volume is missing !!!!!");
body->CreateOrgan("RightOvary", trunkVolume, colourName, solidVis, sensitivity);
}
void G4CustomFemaleBuilder::BuildVoxelLeftBreast(const G4String& colourName, G4bool solidVis, G4bool sensitivity) {
G4cout << "BuildVoxelLeftBreast" << G4endl;
if (motherVolume == 0)
G4Exception("G4CustomFemaleBuilder::BuildVoxelLeftBreast()", "human_phantom0004", FatalException,
"The world volume is missing !!!!!");
G4VBodyFactory* customBody = new G4VoxelBreastFactory();
customBody->CreateOrgan("LeftBreast", motherVolume, colourName, solidVis, sensitivity);
delete customBody;
}
void G4CustomFemaleBuilder::BuildVoxelRightBreast(const G4String& colourName, G4bool solidVis, G4bool sensitivity) {
if (motherVolume == 0)
G4Exception("G4CustomFemaleBuilder::BuildVoxelRightBreast()", "human_phantom0005", FatalException,
"The world volume is missing !!!!!");
G4VBodyFactory* customBody = new G4VoxelBreastFactory();
customBody->CreateOrgan("RightBreast", motherVolume, colourName, solidVis, sensitivity);
delete customBody;
}

View File

@ -170,12 +170,6 @@ void G4HumanPhantomMaterial::DefineMaterials() {
adipose_glandular = new G4Material("adipose_glandular", d, 2);
adipose_glandular->AddMaterial(adipose, 0.5);
adipose_glandular->AddMaterial(glandular, 0.5);
// Air
d = 1.290 * mg / cm3;
G4Material* matAir = new G4Material("Air", d, 2);
matAir->AddElement(elN, 0.7);
matAir->AddElement(elO, 0.3);
}
G4Material* G4HumanPhantomMaterial::GetMaterial(G4String material) {

View File

@ -7,14 +7,10 @@
#include "G4UIdirectory.hh"
#include "globals.hh"
G4HumanPhantomMessenger::G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm)
: myUserPhantom(myUsrPhtm), bps(false) {
G4HumanPhantomMessenger::G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm) : myUserPhantom(myUsrPhtm) {
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);
@ -29,11 +25,6 @@ G4HumanPhantomMessenger::G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm
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);
@ -42,10 +33,8 @@ G4HumanPhantomMessenger::G4HumanPhantomMessenger(DetectorConstruction* myUsrPhtm
G4HumanPhantomMessenger::~G4HumanPhantomMessenger() {
delete modelCmd;
delete sexCmd;
delete bodypartCmd;
delete endCmd;
delete phantomDir;
delete bpDir;
}
void G4HumanPhantomMessenger::SetNewValue(G4UIcommand* command, G4String newValue) {
@ -55,31 +44,7 @@ void G4HumanPhantomMessenger::SetNewValue(G4UIcommand* command, G4String newValu
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);
}

View File

@ -1,5 +1,4 @@
#include "G4MIRDBodyFactory.h"
#include "G4MIRDBrain.h"
#include "G4MIRDHead.h"
#include "G4MIRDHeart.h"

View File

@ -1,24 +0,0 @@
#include "G4VoxelBreastFactory.h"
#include "G4VoxelLeftBreast.h"
#include "G4VoxelRightBreast.h"
G4VoxelBreastFactory::G4VoxelBreastFactory() {
// Map with name of the organ and pointer to the MIRDOrgan class
// organ["ParameterisedRightBreast"] = new G4ParameterisedRightBreast();
organ["LeftBreast"] = new G4VoxelLeftBreast();
organ["RightBreast"] = new G4VoxelRightBreast();
}
G4VoxelBreastFactory::~G4VoxelBreastFactory() {
delete organ["RightBreast"];
organ["RightBreast"] = 0;
delete organ["LeftBreast"];
organ["LeftBreast"] = 0;
}
G4VPhysicalVolume* G4VoxelBreastFactory::CreateOrgan(const G4String& organ_name, G4VPhysicalVolume* motherVolume,
const G4String& colourName, G4bool visAttribute,
G4bool sensitivity) {
return organ[organ_name]->Construct(organ_name, motherVolume, colourName, visAttribute, sensitivity);
}

View File

@ -1,72 +0,0 @@
#include "G4HumanPhantomColour.h"
#include "G4HumanPhantomMaterial.h"
#include "G4VoxelLeftBreast.h"
#include "G4LogicalVolume.hh"
#include "G4Material.hh"
#include "G4PVPlacement.hh"
#include "G4PVReplica.hh"
#include "G4RotationMatrix.hh"
#include "G4SDManager.hh"
#include "G4SystemOfUnits.hh"
#include "G4ThreeVector.hh"
#include "G4Tubs.hh"
#include "G4VPhysicalVolume.hh"
#include "G4VisAttributes.hh"
#include "globals.hh"
G4VoxelLeftBreast::G4VoxelLeftBreast() {}
G4VoxelLeftBreast::~G4VoxelLeftBreast() {}
G4VPhysicalVolume* G4VoxelLeftBreast::Construct(const G4String& volumeName, G4VPhysicalVolume* mother,
const G4String& colourName, G4bool wireFrame, G4bool)
{
G4HumanPhantomMaterial* material = new G4HumanPhantomMaterial();
G4Material* adipose = material->GetMaterial("adipose");
G4Material* adipose_glandular = material->GetMaterial("adipose_glandular");
delete material;
G4double rmin = 0. * cm;
G4double rmax = 6. * cm;
G4double zz = 6. * cm;
G4double startPhi = 0. * degree;
G4double spanningPhi = 180. * degree;
G4Tubs* breast = new G4Tubs("out_breast", rmin, rmax, zz / 2., startPhi, spanningPhi);
G4LogicalVolume* breast_log = new G4LogicalVolume(breast, adipose, "logicalOut" + volumeName, 0, 0, 0);
rmax = 5.5 * cm;
zz = 5. * cm;
G4Tubs* innerBreast = new G4Tubs("inner_breast", rmin, rmax, zz / 2., startPhi, spanningPhi);
G4LogicalVolume* innerBreast_log =
new G4LogicalVolume(innerBreast, adipose_glandular, "logical" + volumeName, 0, 0, 0);
G4RotationMatrix* matrix = new G4RotationMatrix();
// matrix -> rotateX(-90.* degree);
// matrix -> rotateY(180.* degree);
matrix->rotateZ(18. * degree);
G4VPhysicalVolume* physBreast = new G4PVPlacement(matrix, G4ThreeVector(10. * cm, 8.7 * cm, 52. * cm),
"physicalVoxelLeftBreast", breast_log, mother, false, 0, true);
G4VPhysicalVolume* physInnerBreast =
new G4PVPlacement(0, G4ThreeVector(), "LeftBreast", innerBreast_log, physBreast, false, 0, true);
G4HumanPhantomColour* colourPointer = new G4HumanPhantomColour();
G4Colour colour = colourPointer->GetColour(colourName);
delete colourPointer;
G4VisAttributes* BreastVisAtt = new G4VisAttributes(colour);
BreastVisAtt->SetForceSolid(wireFrame);
breast_log->SetVisAttributes(BreastVisAtt);
G4VisAttributes* innerBreastVisAtt = new G4VisAttributes(colour);
innerBreastVisAtt->SetForceSolid(false);
innerBreast_log->SetVisAttributes(innerBreastVisAtt);
G4cout << "Voxel Left Breast created !!!!!! This model has to be refined" << G4endl;
return physInnerBreast;
}

View File

@ -1,74 +0,0 @@
#include "G4HumanPhantomColour.h"
#include "G4HumanPhantomMaterial.h"
#include "G4VoxelRightBreast.h"
#include "G4LogicalVolume.hh"
#include "G4Material.hh"
#include "G4PVPlacement.hh"
#include "G4PVReplica.hh"
#include "G4RotationMatrix.hh"
#include "G4SDManager.hh"
#include "G4SystemOfUnits.hh"
#include "G4ThreeVector.hh"
#include "G4Tubs.hh"
#include "G4VPhysicalVolume.hh"
#include "G4VisAttributes.hh"
#include "globals.hh"
G4VoxelRightBreast::G4VoxelRightBreast() {}
G4VoxelRightBreast::~G4VoxelRightBreast() {}
G4VPhysicalVolume* G4VoxelRightBreast::Construct(const G4String& volumeName, G4VPhysicalVolume* mother,
const G4String& colourName, G4bool wireFrame, G4bool)
{
G4cout << "Construct " << volumeName << " with mother volume " << mother->GetName() << G4endl;
G4HumanPhantomMaterial* material = new G4HumanPhantomMaterial();
G4Material* adipose = material->GetMaterial("adipose");
G4Material* adipose_glandular = material->GetMaterial("adipose_glandular");
delete material;
G4double rmin = 0. * cm;
G4double rmax = 6. * cm;
G4double zz = 6. * cm;
G4double startPhi = 0. * degree;
G4double spanningPhi = 180. * degree;
G4Tubs* breast = new G4Tubs("out_breast", rmin, rmax, zz / 2., startPhi, spanningPhi);
G4LogicalVolume* breast_log = new G4LogicalVolume(breast, adipose, "logicalOut" + volumeName, 0, 0, 0);
rmax = 5.5 * cm;
zz = 5. * cm;
G4Tubs* innerBreast = new G4Tubs("inner_breast", rmin, rmax, zz / 2., startPhi, spanningPhi);
G4LogicalVolume* innerBreast_log =
new G4LogicalVolume(innerBreast, adipose_glandular, "logical" + volumeName, 0, 0, 0);
G4RotationMatrix* matrix = new G4RotationMatrix();
matrix->rotateX(0. * degree);
matrix->rotateY(0. * degree);
matrix->rotateZ(-18. * degree);
G4VPhysicalVolume* physBreast = new G4PVPlacement(matrix, G4ThreeVector(-10. * cm, 8.7 * cm, 52. * cm),
"physicalVoxelRightBreast", breast_log, mother, false, 0, true);
G4VPhysicalVolume* physInnerBreast =
new G4PVPlacement(0, G4ThreeVector(), "RightBreast", innerBreast_log, physBreast, false, 0, true);
G4HumanPhantomColour* colourPointer = new G4HumanPhantomColour();
G4Colour colour = colourPointer->GetColour(colourName);
delete colourPointer;
G4VisAttributes* BreastVisAtt = new G4VisAttributes(colour);
BreastVisAtt->SetForceSolid(wireFrame);
breast_log->SetVisAttributes(BreastVisAtt);
G4VisAttributes* innerBreastVisAtt = new G4VisAttributes(colour);
innerBreastVisAtt->SetForceSolid(false);
innerBreast_log->SetVisAttributes(innerBreastVisAtt);
G4cout << "Voxel Right Breast created !!!!!! This model must be refined!" << G4endl;
return physInnerBreast;
}

View File

@ -14,11 +14,7 @@ G4double C1, C2, C3, C4, sum;
std::string tmp, line, name;
std::ifstream modelFile("F:/Project/Geant4/DESCSS/assets/model.txt");
PrimaryGeneratorAction<G4GeneralParticleSource>::PrimaryGeneratorAction() {
fParticleGun = new G4GeneralParticleSource();
}
PrimaryGeneratorAction<G4ParticleGun>::PrimaryGeneratorAction() {
PrimaryGeneratorAction::PrimaryGeneratorAction() {
while (std::getline(modelFile, line)) {
std::stringstream ss(line);
std::getline(ss, name, ',');
@ -28,7 +24,9 @@ PrimaryGeneratorAction<G4ParticleGun>::PrimaryGeneratorAction() {
std::getline(ss, tmp, ','), C1 = std::stof(tmp);
std::getline(ss, tmp, ','), C2 = std::stof(tmp);
std::getline(ss, tmp, ','), C3 = std::stof(tmp);
if (tmp == "TP")
if (tmp == "TE")
sum = C3;
else if (tmp == "TP")
std::getline(ss, tmp, ','), sum = std::stof(tmp);
else {
std::getline(ss, tmp, ','), C4 = std::stof(tmp);
@ -46,14 +44,11 @@ PrimaryGeneratorAction<G4ParticleGun>::PrimaryGeneratorAction() {
ion = G4ParticleTable::GetParticleTable()->FindParticle("alpha");
else
ion = G4IonTable::GetIonTable()->GetIon(Z, A, 0.);
fParticleGun->SetParticleCharge(Z * eplus);
fParticleGun->SetParticleCharge(Z * eplus);
fParticleGun->SetParticleDefinition(ion);
}
template <typename T>
PrimaryGeneratorAction<T>::~PrimaryGeneratorAction() {
delete fParticleGun;
}
PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; }
G4double randomPhi() {
G4double v = G4UniformRand();
@ -102,6 +97,11 @@ G4double ARM(G4double Emin, G4double Emax, G4double (*f)(G4double)) {
return x;
}
G4double pdfTElectronInv(G4double y) {
G4double C = - C2 * C1 * exp(- 0.1 / C2) / sum;
return - C2 * log((C - y) * sum / C1 / C2);
}
G4double pdfTProtonInv(G4double y) {
G4double C = C1 * pow(50 - C2, 1 - C3) / sum / (1 - C3);
return pow(sum * (C + y) * (1 - C3) / C1, 1 / (1 - C3)) + C2;
@ -115,17 +115,15 @@ G4double pdfGCRProton(G4double E) {
G4double pdfGCRIon(G4double E) { return C1 * exp(-C2 * E) * (1 - exp(-C3 * E + C4)) / sum; }
void PrimaryGeneratorAction<G4GeneralParticleSource>::GeneratePrimaries(G4Event* e) {
fParticleGun->GeneratePrimaryVertex(e);
}
void PrimaryGeneratorAction<G4ParticleGun>::GeneratePrimaries(G4Event* e) {
void PrimaryGeneratorAction::GeneratePrimaries(G4Event* e) {
G4double E;
G4double R = 15. * m;
G4ThreeVector pos = randomPos(R);
G4ThreeVector dir = randomDir();
if (particleType == "TP")
if (particleType == "TE")
E = ITM(0.1, 10, pdfTElectronInv);
else if (particleType == "TP")
E = ITM(50, 1000, pdfTProtonInv);
else if (particleType == "GCR_H")
E = ARM(220, 1e5, pdfGCRProton);

View File

@ -11,9 +11,6 @@ def trap_proton():
def pdf_int(E, C1=559.76377, C2=-1.53424, C3=2.40873, sum=1.5156509):
return C1 * math.pow(E - C2, 1 - C3) / (1 - C3) / sum
def pdf_sum(E):
return pdf_int(E) - pdf_int(50)
def pdf_inv(y, C1=559.76377, C2=-1.53424, C3=2.40873, sum=1.5156509):
return pow(sum * (pdf_int(50) + y) * (1 - C3) / C1, 1 / (1 - C3)) + C2