Skip to content
Snippets Groups Projects
Commit 9668739f authored by Pierre Morfouace's avatar Pierre Morfouace
Browse files

updating VAMOS simu and removing PISTA.detector

parent 4b8ab5f0
No related branches found
No related tags found
No related merge requests found
/*****************************************************************************
* Copyright (C) 2009-2016 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: Elia Pilotto, Omar Nasr *
* contact address: pilottoelia@gmail.com, omar.nasr@etu.unicaen.fr *
* *
* Creation Date : September 2021 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* Use to kill the beam track and replace it with the reaction product *
* *
* *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
*****************************************************************************/
//C++ libraries
#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
#include <Randomize.hh>
#include <fstream>
//G4 libraries
#include "G4Electron.hh"
#include "G4Gamma.hh"
#include "G4IonTable.hh"
#include "G4EmCalculator.hh"
#include "G4VPhysicalVolume.hh"
#include "G4IonTable.hh"
#include "G4UserLimits.hh"
#include "G4SystemOfUnits.hh"
#include "G4PhysicalConstants.hh"
//nptool libraries
#include "NPFunction.h"
#include "NPInputParser.h"
#include "NPOptionManager.h"
#include "NPSFunction.hh"
//other
#include "ChargeStateDistribution.hh"
#include "RootOutput.h"
#include "TLorentzVector.h"
using namespace std;
////////////////////////////////////////////////////////////////////////////////
NPS::ChargeStateDistribution::ChargeStateDistribution(G4String modelName, G4Region* envelope)
: G4VFastSimulationModel(modelName, envelope) {
m_StepSize = 5*mm;
}
////////////////////////////////////////////////////////////////////////////////
NPS::ChargeStateDistribution::ChargeStateDistribution(G4String modelName)
: G4VFastSimulationModel(modelName) {}
////////////////////////////////////////////////////////////////////////////////
NPS::ChargeStateDistribution::~ChargeStateDistribution() {}
////////////////////////////////////////////////////////////////////////////////
G4bool NPS::ChargeStateDistribution::IsApplicable(const G4ParticleDefinition& particleType) {
if (particleType.GetPDGCharge() < 10) return false;
else return true;
}
////////////////////////////////////////////////////////////////////////////////
G4bool NPS::ChargeStateDistribution::ModelTrigger(const G4FastTrack& fastTrack) {
cout << "////////////////// MODEL TRIGGER ///////////////////" << endl;
const G4Track* PrimaryTrack = fastTrack.GetPrimaryTrack();
G4ThreeVector V = PrimaryTrack->GetMomentum().unit();
G4ThreeVector P = fastTrack.GetPrimaryTrackLocalPosition();
G4VSolid* solid = fastTrack.GetPrimaryTrack()->GetVolume()->GetLogicalVolume()->GetSolid();
double to_exit = solid->DistanceToOut(P, V);
double to_entrance = solid->DistanceToOut(P, -V);
bool is_first = (to_entrance == 0);
bool is_end = (to_exit == 0);
if (is_first && m_shoot) {
m_shoot = false;
}
if (is_first) {
m_shoot = true;
}
cout << "m_StepSize= " << m_StepSize << endl;
cout << "to_entrance= " << to_entrance << endl;
cout << "to_exit= " << to_exit << endl;
cout << "is_first= " << is_first << endl;
cout << "m_shoot= " << m_shoot << endl;
cout << "Model trigger Q = " << PrimaryTrack->GetDynamicParticle()->GetCharge() << endl;
return m_shoot;
}
////////////////////////////////////////////////////////////////////////////////
void NPS::ChargeStateDistribution::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep) {
m_shoot = false;
cout << "////////////////// DO IT ///////////////////" << endl;
G4ThreeVector localPosition = fastTrack.GetPrimaryTrackLocalPosition();
G4ThreeVector localDirection = fastTrack.GetPrimaryTrackLocalDirection();
const G4Track* track = fastTrack.GetPrimaryTrack();
G4double time = track->GetGlobalTime();
G4ThreeVector pdirection = track->GetMomentum().unit();
G4ThreeVector Momentum = track->GetMomentum();
G4ThreeVector worldPosition = track->GetPosition();
G4double originalKineticEnergy = track->GetKineticEnergy();
G4int Z = track->GetParticleDefinition()->GetAtomicNumber();
G4int A = track->GetParticleDefinition()->GetAtomicMass();
G4double Q = track->GetDynamicParticle()->GetCharge();
//G4DynamicParticle* dynamicParticle = const_cast<G4DynamicParticle*>(fastTrack.GetPrimaryTrack()->GetDynamicParticle());
//dynamicParticle->SetCharge(Q + 5); // Modify the particle's charge
//G4double newQ = track->GetDynamicParticle()->GetCharge();
//const G4DynamicParticle* dynamicParticle = fastTrack.GetPrimaryTrack()->GetDynamicParticle();
//G4ParticleDefinition* particleDef = const_cast<G4ParticleDefinition*>(dynamicParticle->GetDefinition());
/*
fastStep.SetPrimaryTrackFinalKineticEnergy(originalKineticEnergy);
fastStep.ProposePrimaryTrackFinalMomentumDirection(localDirection,true);
fastStep.SetPrimaryTrackFinalPosition(localPosition+G4ThreeVector(0,0,1),true);
fastStep.ProposePrimaryTrackFinalTime(time);
fastStep.SetTotalEnergyDeposited(0);
fastStep.ProposePrimaryTrackPathLength(m_StepSize);
*/
// Set the end of the step conditions
fastStep.SetPrimaryTrackFinalKineticEnergyAndDirection(0, localDirection);
fastStep.SetPrimaryTrackFinalPosition(localPosition+G4ThreeVector(0,0,1),true);
fastStep.SetTotalEnergyDeposited(0);
fastStep.SetPrimaryTrackFinalTime(time); // FIXME
fastStep.KillPrimaryTrack();
fastStep.SetPrimaryTrackPathLength(0.0);
G4int newCharge = Q+5;
static G4IonTable* IonTable = G4ParticleTable::GetParticleTable()->GetIonTable();
G4ParticleDefinition* particleDef;
particleDef = IonTable->GetIon(Z,A);
G4DynamicParticle dynamicParticle(particleDef,Momentum.unit(),originalKineticEnergy);
fastStep.CreateSecondaryTrack(dynamicParticle,localPosition+G4ThreeVector(0,0,2),time);
cout << Q << " " << dynamicParticle.GetCharge() << endl;
return;
}
/*****************************************************************************
* Copyright (C) 2009-2016 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: Pierre Morfouace *
* contact address: pierre.morfouace@cea.fr *
* *
* Creation Date : January 2023 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: Based On SamuraiFieldPropagation *
* Use to kill the beam track and replace it with the reaction product *
* *
* *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
*****************************************************************************/
#ifndef ChargeStateDistribution_h
#define ChargeStateDistribution_h
#include "G4VFastSimulationModel.hh"
#include "G4Abla.hh"
#include "G4AblaInterface.hh"
#include "G4Fragment.hh"
#include "G4VPhysicalVolume.hh"
#include "G4Region.hh"
#include "GladFieldMap.h"
#include <string>
#include <vector>
#include <fstream>
#include <iomanip>
namespace NPS{
class ChargeStateDistribution : public G4VFastSimulationModel{
public:
ChargeStateDistribution (G4String, G4Region*);
ChargeStateDistribution (G4String);
~ChargeStateDistribution ();
public:
G4bool IsApplicable(const G4ParticleDefinition&);
G4bool ModelTrigger(const G4FastTrack &);
void DoIt(const G4FastTrack&, G4FastStep&);
void RungeKuttaPropagation (const G4FastTrack& fastTrack, G4FastStep& fastStep);
public:
void SetStepSize(double step){m_StepSize=step;};
private:
double m_StepSize;
bool m_shoot;
};
}
#endif
...@@ -38,6 +38,9 @@ ...@@ -38,6 +38,9 @@
#include "G4Transform3D.hh" #include "G4Transform3D.hh"
#include "G4UnionSolid.hh" #include "G4UnionSolid.hh"
#include "G4VisAttributes.hh" #include "G4VisAttributes.hh"
#include "G4RegionStore.hh"
#include "G4FastSimulationManager.hh"
#include "G4UserLimits.hh"
// NPTool header // NPTool header
#include "CalorimeterScorers.hh" #include "CalorimeterScorers.hh"
...@@ -49,6 +52,7 @@ ...@@ -49,6 +52,7 @@
#include "NPSHitsMap.hh" #include "NPSHitsMap.hh"
#include "RootOutput.h" #include "RootOutput.h"
#include "Vamos.hh" #include "Vamos.hh"
#include "ChargeStateDistribution.hh"
// CLHEP header // CLHEP header
#include "CLHEP/Random/RandGauss.h" #include "CLHEP/Random/RandGauss.h"
...@@ -108,8 +112,8 @@ namespace Vamos_NS { ...@@ -108,8 +112,8 @@ namespace Vamos_NS {
const G4double TMW2_Thickness = 5 * mm; const G4double TMW2_Thickness = 5 * mm;
// FPMW // FPMW
const G4double FPMW1_Width = 200 * mm; const G4double FPMW1_Width = 70 * mm;
const G4double FPMW1_Length = 400 * mm; const G4double FPMW1_Length = 95 * mm;
const G4double FPMW1_Thickness = 5 * mm; const G4double FPMW1_Thickness = 5 * mm;
...@@ -139,7 +143,8 @@ Vamos::Vamos() { ...@@ -139,7 +143,8 @@ Vamos::Vamos() {
m_DC4 = 0; m_DC4 = 0;
m_DC1 = 0; m_DC1 = 0;
m_DC2 = 0; m_DC2 = 0;
m_ChargeStateRegion = 0;
m_StepSize = 5*mm;
ICcounter = 0; ICcounter = 0;
// RGB Color + Transparency // RGB Color + Transparency
...@@ -315,7 +320,7 @@ G4AssemblyVolume* Vamos::BuildTMW1() { ...@@ -315,7 +320,7 @@ G4AssemblyVolume* Vamos::BuildTMW1() {
G4LogicalVolume* mylar_volume = new G4LogicalVolume(box_mylar, MylarMaterial, "logic_Vamos_mylar1", 0, 0, 0); G4LogicalVolume* mylar_volume = new G4LogicalVolume(box_mylar, MylarMaterial, "logic_Vamos_mylar1", 0, 0, 0);
mylar_volume->SetVisAttributes(m_VisMylar); mylar_volume->SetVisAttributes(m_VisMylar);
gas_volume->SetSensitiveDetector(m_InterScorer); //gas_volume->SetSensitiveDetector(m_InterScorer);
G4ThreeVector pos_gas = G4ThreeVector(0,0,0); G4ThreeVector pos_gas = G4ThreeVector(0,0,0);
m_TMW1->AddPlacedVolume(gas_volume, pos_gas, 0); m_TMW1->AddPlacedVolume(gas_volume, pos_gas, 0);
...@@ -355,6 +360,23 @@ G4AssemblyVolume* Vamos::BuildTMW2() { ...@@ -355,6 +360,23 @@ G4AssemblyVolume* Vamos::BuildTMW2() {
pos_mylar = G4ThreeVector(0,0,0.5*TMW2_Thickness + 0.5*Mylar_Thickness); pos_mylar = G4ThreeVector(0,0,0.5*TMW2_Thickness + 0.5*Mylar_Thickness);
m_TMW2->AddPlacedVolume(mylar_volume, pos_mylar, 0); m_TMW2->AddPlacedVolume(mylar_volume, pos_mylar, 0);
/*m_ChargeStateRegion = G4RegionStore::GetInstance()->FindOrCreateRegion("ChargeStateProcess");
m_ChargeStateRegion->AddRootLogicalVolume(gas_volume);
m_ChargeStateRegion->SetUserLimits(new G4UserLimits(m_StepSize));
G4FastSimulationManager* mng = m_ChargeStateRegion->GetFastSimulationManager();
unsigned int size = m_ChargeStateModel.size();
for(unsigned int i=0; i<size; i++)
mng->RemoveFastSimulationModel(m_ChargeStateModel[i]);
m_ChargeStateModel.clear();
G4VFastSimulationModel* fsm;
fsm = new NPS::ChargeStateDistribution("ChargeStateDistribution",m_ChargeStateRegion);
//((NPS::ChargeStateDistribution*) fsm)->SetStepSize(m_StepSize);
m_ChargeStateModel.push_back(fsm);*/
} }
return m_TMW2; return m_TMW2;
} }
...@@ -368,23 +390,41 @@ G4AssemblyVolume* Vamos::BuildFPMW1() { ...@@ -368,23 +390,41 @@ G4AssemblyVolume* Vamos::BuildFPMW1() {
G4Material* DetectorMaterial = MaterialManager::getInstance()->GetGasFromLibrary(m_Gas_FPMW1, m_Pressure_FPMW1, 295 * kelvin); G4Material* DetectorMaterial = MaterialManager::getInstance()->GetGasFromLibrary(m_Gas_FPMW1, m_Pressure_FPMW1, 295 * kelvin);
G4Material* MylarMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Mylar"); G4Material* MylarMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Mylar");
G4Material* Vaccuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vaccuum");
G4LogicalVolume* gas_volume = new G4LogicalVolume(box, DetectorMaterial, "logic_Vamos_FPMW1", 0, 0, 0);
gas_volume->SetVisAttributes(m_VisGasC4H10); G4LogicalVolume* gas_volume_FPMW1 = new G4LogicalVolume(box, Vaccuum, "logic_Vamos_FPMW1", 0, 0, 0);
gas_volume_FPMW1->SetVisAttributes(m_VisGasC4H10);
gas_volume_FPMW1->SetSensitiveDetector(m_InterScorer);
G4LogicalVolume* mylar_volume = new G4LogicalVolume(box_mylar, MylarMaterial, "logic_Vamos_mylar3", 0, 0, 0); G4LogicalVolume* mylar_volume = new G4LogicalVolume(box_mylar, MylarMaterial, "logic_Vamos_mylar3", 0, 0, 0);
mylar_volume->SetVisAttributes(m_VisMylar); mylar_volume->SetVisAttributes(m_VisMylar);
gas_volume->SetSensitiveDetector(m_InterScorer);
G4ThreeVector pos_gas = G4ThreeVector(0,0,0); G4ThreeVector pos_gas = G4ThreeVector(0,0,0);
m_FPMW1->AddPlacedVolume(gas_volume, pos_gas, 0); m_FPMW1->AddPlacedVolume(gas_volume_FPMW1, pos_gas, 0);
//G4ThreeVector pos_mylar = G4ThreeVector(0,0,-0.5*FPMW1_Thickness - 0.5*Mylar_Thickness);
//m_FPMW1->AddPlacedVolume(mylar_volume, pos_mylar, 0);
//pos_mylar = G4ThreeVector(0,0,0.5*FPMW1_Thickness + 0.5*Mylar_Thickness);
//m_FPMW1->AddPlacedVolume(mylar_volume, pos_mylar, 0);
/*m_ChargeStateRegion = G4RegionStore::GetInstance()->FindOrCreateRegion("ChargeStateProcess");
m_ChargeStateRegion->AddRootLogicalVolume(gas_volume_FPMW1);
m_ChargeStateRegion->SetUserLimits(new G4UserLimits(m_StepSize));
G4FastSimulationManager* mng = m_ChargeStateRegion->GetFastSimulationManager();
unsigned int size = m_ChargeStateModel.size();
for(unsigned int i=0; i<size; i++)
mng->RemoveFastSimulationModel(m_ChargeStateModel[i]);
/*G4ThreeVector pos_mylar = G4ThreeVector(0,0,-0.5*FPMW1_Thickness - 0.5*Mylar_Thickness); m_ChargeStateModel.clear();
m_FPMW1->AddPlacedVolume(mylar_volume, pos_mylar, 0); G4VFastSimulationModel* fsm;
fsm = new NPS::ChargeStateDistribution("ChargeStateDistribution",m_ChargeStateRegion);
((NPS::ChargeStateDistribution*) fsm)->SetStepSize(m_StepSize);
m_ChargeStateModel.push_back(fsm);*/
pos_mylar = G4ThreeVector(0,0,0.5*FPMW1_Thickness + 0.5*Mylar_Thickness);
m_FPMW1->AddPlacedVolume(mylar_volume, pos_mylar, 0);*/
} }
return m_FPMW1; return m_FPMW1;
} }
......
...@@ -33,6 +33,7 @@ using namespace std; ...@@ -33,6 +33,7 @@ using namespace std;
#include "G4AssemblyVolume.hh" #include "G4AssemblyVolume.hh"
#include "G4MultiFunctionalDetector.hh" #include "G4MultiFunctionalDetector.hh"
#include "G4UnionSolid.hh" #include "G4UnionSolid.hh"
#include "G4VFastSimulationModel.hh"
// NPTool header // NPTool header
#include "NPSVDetector.hh" #include "NPSVDetector.hh"
...@@ -135,6 +136,12 @@ class Vamos : public NPS::VDetector{ ...@@ -135,6 +136,12 @@ class Vamos : public NPS::VDetector{
private: private:
TVamosData* m_Event ; TVamosData* m_Event ;
private:
G4Region* m_ChargeStateRegion;
vector<G4VFastSimulationModel*> m_ChargeStateModel;
int m_StepSize;
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
///////////////Private intern Data////////////////// ///////////////Private intern Data//////////////////
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
......
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Target
THICKNESS= 0.44 micrometer
RADIUS= 20 mm
MATERIAL= C
ANGLE= 0 deg
X= 0 mm
Y= 0 mm
Z= 0 mm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 315 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 270 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 225 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 180 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 135 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 90 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 45 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PISTA
R= 100 mm
THETA= 39 deg
PHI= 0 deg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Vamos Configuration
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Vamos
% R= 0.3 m
% Theta= 0 deg
%
%Vamos DC
% Z= 60 mm
% Gas= iC4H10
% Pressure= 0.01 bar
% Temperature= 295 kelvin
%
%Vamos DC
% Z= 200 mm
% Gas= iC4H10
% Pressure= 0.01 bar
% Temperature= 295 kelvin
%
%Vamos BeamCatcher
% Material= BC400
% Width= 30 mm
% Length= 80 mm
% Thickness= 30 mm
% Pos= 0 0 600 mm
%
%Vamos MWPPAC
% Z= 750 mm
% Gas= iC4H10
% Pressure= 0.01 bar
% Temperature= 295 kelvin
%
%Vamos DC
% Z= 940 mm
% Gas= iC4H10
% Pressure= 0.01 bar
% Temperature= 295 kelvin
%
%Vamos DC
% Z= 1060 mm
% Gas= iC4H10
% Pressure= 0.01 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1200 mm
% Thickness= 50 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1250 mm
% Thickness= 50 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1300 mm
% Thickness= 50 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1375 mm
% Thickness= 100 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1525 mm
% Thickness= 200 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
%
%Vamos IC
% Z= 1725 mm
% Thickness= 200 mm
% Gas= CF4
% Pressure= 0.2 bar
% Temperature= 295 kelvin
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment