diff --git a/.gitignore b/.gitignore index 908556d1c514536da6b9f731b228ff3fc5199e4b..621be815e2f98baff327cfc0d5e685e50e46e59d 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ npsimulation NPData/* Projects/T40/*cxx Inputs/EnergyLoss/*.G4table +Inputs/CrossSection/*.dat .ls_return Documentation/user_guide.log *.bbl @@ -49,4 +50,4 @@ Projects/T40/configs/*.dat Outputs Outputs/* Outputs/*/*.* -NPLib/Utility/npspectra_test \ No newline at end of file +NPLib/Utility/npspectra_test diff --git a/NPSimulation/Process/BeamReaction.cc b/NPSimulation/Process/BeamReaction.cc index 056b70a05acd474d54836c565c12c1b744ec0d88..909451f77a4352b35356b7a9a624d86eb48b114a 100644 --- a/NPSimulation/Process/BeamReaction.cc +++ b/NPSimulation/Process/BeamReaction.cc @@ -25,6 +25,7 @@ #include "G4Electron.hh" #include "G4Gamma.hh" #include "G4SystemOfUnits.hh" +#include "G4EmCalculator.hh" #include "G4VPhysicalVolume.hh" #include "NPFunction.h" #include "NPInputParser.h" @@ -34,71 +35,61 @@ #include <string> //////////////////////////////////////////////////////////////////////////////// NPS::BeamReaction::BeamReaction(G4String modelName, G4Region* envelope) - : G4VFastSimulationModel(modelName, envelope) { - ReadConfiguration(); - m_PreviousEnergy = 0; - m_PreviousLength = 0; - m_PreviousDirection.set(0,0,0); - m_shoot=false; - m_rand=0; - m_reverse=false; -} + : G4VFastSimulationModel(modelName, envelope) { + ReadConfiguration(); + m_shoot=false; + m_rand=0; + m_Z=0; + } //////////////////////////////////////////////////////////////////////////////// NPS::BeamReaction::BeamReaction(G4String modelName) - : G4VFastSimulationModel(modelName) {} + : G4VFastSimulationModel(modelName) {} -//////////////////////////////////////////////////////////////////////////////// -NPS::BeamReaction::~BeamReaction() {} + //////////////////////////////////////////////////////////////////////////////// + NPS::BeamReaction::~BeamReaction() {} -//////////////////////////////////////////////////////////////////////////////// -void NPS::BeamReaction::AttachReactionConditions() { - // Reasssigned the branch address - if (RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) - RootOutput::getInstance()->GetTree()->SetBranchAddress( - "ReactionConditions", &m_ReactionConditions); -} + //////////////////////////////////////////////////////////////////////////////// + void NPS::BeamReaction::AttachReactionConditions() { + // Reasssigned the branch address + if (RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) + RootOutput::getInstance()->GetTree()->SetBranchAddress( + "ReactionConditions", &m_ReactionConditions); + } //////////////////////////////////////////////////////////////////////////////// void NPS::BeamReaction::ReadConfiguration() { NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile()); - //vector<NPL::InputBlock*> blocks; - //blocks = input.GetAllBlocksWithToken("TwoBodyReaction"); - //if(blocks.size()>0) m_ReactionType ="TwoBodyReaction"; - // - //blocks = input.GetAllBlocksWithToken("QFSReaction"); - //if(blocks.size()>0) m_ReactionType ="QFSReaction"; - if(input.GetAllBlocksWithToken("TwoBodyReaction").size()>0) m_ReactionType ="TwoBodyReaction"; else if(input.GetAllBlocksWithToken("QFSReaction").size()>0) m_ReactionType ="QFSReaction"; if (m_ReactionType=="TwoBodyReaction" ) { - m_Reaction.ReadConfigurationFile(input); - m_BeamName = NPL::ChangeNameToG4Standard(m_Reaction.GetNucleus1()->GetName()); - if(m_Reaction.GetNucleus3()->GetName() != ""){ - m_active = true; - m_ReactionConditions = new TReactionConditions(); - AttachReactionConditions(); - if (!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) - RootOutput::getInstance()->GetTree()->Branch( - "ReactionConditions", "TReactionConditions", &m_ReactionConditions); - } - } - - else if (m_ReactionType=="QFSReaction") { - m_QFS.ReadConfigurationFile(input); - m_BeamName = NPL::ChangeNameToG4Standard(m_QFS.GetNucleusA()->GetName()); + m_Reaction.ReadConfigurationFile(input); + m_BeamName = NPL::ChangeNameToG4Standard(m_Reaction.GetNucleus1()->GetName()); + if(m_Reaction.GetNucleus3()->GetName() != ""){ m_active = true; m_ReactionConditions = new TReactionConditions(); AttachReactionConditions(); if (!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) - RootOutput::getInstance()->GetTree()->Branch( - "ReactionConditions", "TReactionConditions", &m_ReactionConditions); + RootOutput::getInstance()->GetTree()->Branch( + "ReactionConditions", "TReactionConditions", &m_ReactionConditions); + } + } + + else if (m_ReactionType=="QFSReaction") { + m_QFS.ReadConfigurationFile(input); + m_BeamName = NPL::ChangeNameToG4Standard(m_QFS.GetNucleusA()->GetName()); + m_active = true; + m_ReactionConditions = new TReactionConditions(); + AttachReactionConditions(); + if (!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions")) + RootOutput::getInstance()->GetTree()->Branch( + "ReactionConditions", "TReactionConditions", &m_ReactionConditions); } else { - m_active = false; + m_active = false; } } @@ -127,485 +118,483 @@ G4bool NPS::BeamReaction::ModelTrigger(const G4FastTrack& fastTrack) { 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); + ->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_last = (abs(to_exit-m_StepSize)<=1e-9); - if(is_first && m_shoot){ + if(is_first && m_shoot){ std::cout << "Something went wrong in beam reaction, m_shoot cannot be true at beginning of event" << std::endl; std::cout << "rand: " << m_rand << std::endl; m_shoot = false; } - if(is_first){ - m_rand = G4RandFlat::shoot()*(to_exit+to_entrance); // random Z in the Volume - m_PreviousLength = m_StepSize; - m_PreviousEnergy = PrimaryTrack->GetKineticEnergy(); - m_PreviousDirection = PrimaryTrack->GetMomentumDirection(); - // Clear Previous Event - m_ReactionConditions->Clear(); - m_shoot=true; - - if((to_exit+to_entrance)-m_rand<m_StepSize){ // reaction happen in last step - // the last step in the volume is not at the volume boundary but one step - // back, so for this case, the reaction must happen in reverse, ahead of - // the current position, not after - m_reverse=true; + m_rand = G4RandFlat::shoot(); + // random Z in the Volume + m_Z = m_rand*(to_exit+to_entrance)-0.5*(to_exit+to_entrance); + // Clear Previous Event + m_ReactionConditions->Clear(); + m_shoot=true; } - else - m_reverse=false; - return false; - } - - - + + // curviligne coordinate along beam patch + double S = to_entrance - 0.5*(to_exit+to_entrance); + m_length = m_Z-S; // If the condition is met, the event is generated -// cout << to_exit << " " << to_entrance << " " << m_rand << endl; - if (m_shoot && (to_entrance > m_rand || is_last)) { + if (m_shoot && m_length < m_StepSize) { if(m_ReactionType=="QFSReaction"){ - if ( m_QFS.IsAllowed() ) { - return true; - } - else{ - m_shoot=false; - std::cout << "QFS not allowed" << std::endl; - } + if ( m_QFS.IsAllowed() ) { + return true; + } + else{ + m_shoot=false; + std::cout << "QFS not allowed" << std::endl; + } } - + else if(m_ReactionType=="TwoBodyReaction"){ - if ( m_Reaction.IsAllowed(PrimaryTrack->GetKineticEnergy()) ) { - return true; - } - else{ - m_shoot=false; - std::cout << "Two body reaction not allowed" << std::endl; - } + if ( m_Reaction.IsAllowed(PrimaryTrack->GetKineticEnergy()) ) { + return true; + } + else{ + m_shoot=false; + std::cout << "Two body reaction not allowed" << std::endl; + } } } - // Record the situation of the current step - // so it can be used in the next one - m_PreviousLength = PrimaryTrack->GetStep()->GetStepLength(); - m_PreviousEnergy = PrimaryTrack->GetKineticEnergy(); - m_PreviousDirection = PrimaryTrack->GetMomentumDirection(); - return false; } //////////////////////////////////////////////////////////////////////////////// void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack, - G4FastStep& fastStep) { - - // std::cout << "DOIT" << std::endl; - m_shoot=false; + G4FastStep& fastStep) { - // Get the track info - const G4Track* PrimaryTrack = fastTrack.GetPrimaryTrack(); - G4ThreeVector pdirection = PrimaryTrack->GetMomentum().unit(); - G4ThreeVector localdir = fastTrack.GetPrimaryTrackLocalDirection(); - - G4ThreeVector worldPosition = PrimaryTrack->GetPosition(); - G4ThreeVector localPosition = fastTrack.GetPrimaryTrackLocalPosition(); - - double energy = PrimaryTrack->GetKineticEnergy(); - double time = PrimaryTrack->GetGlobalTime(); - - // Randomize vertex and energy within the step - // convention: go backward from end point in the step to vertex - // Assume energy loss is linear within the step - // rand = 0 beginning of step - // rand = 1 end of step - // Assume no scattering - double rand = G4RandFlat::shoot(); - double length = (1-rand) * (m_PreviousLength); - double reac_energy ; - if(!m_reverse) - reac_energy = energy + (1-rand) * (m_PreviousEnergy - energy); - else - reac_energy = energy - (1-rand) * (m_PreviousEnergy - energy); + // std::cout << "DOIT" << std::endl; + m_shoot=false; - G4ThreeVector ldir = m_PreviousDirection; - ldir *= length; - if(!m_reverse) - localPosition = localPosition - ldir; - else - localPosition = localPosition + ldir; - - // Set the end of the step conditions - fastStep.SetPrimaryTrackFinalKineticEnergyAndDirection(0, pdirection); - fastStep.SetPrimaryTrackFinalPosition(worldPosition); - fastStep.SetTotalEnergyDeposited(0); - fastStep.SetPrimaryTrackFinalTime(time); - fastStep.KillPrimaryTrack(); - fastStep.SetPrimaryTrackPathLength(0.0); - - - if (m_ReactionType=="TwoBodyReaction" ) { - - /////////////////////////////// - // Two-Body Reaction Case ///// - /////////////////////////////// - - //////Define the kind of particle to shoot//////// - // Nucleus 3 - int LightZ = m_Reaction.GetNucleus3()->GetZ(); - int LightA = m_Reaction.GetNucleus3()->GetA(); - static G4IonTable* IonTable - = G4ParticleTable::GetParticleTable()->GetIonTable(); - - G4ParticleDefinition* LightName; - - if (LightZ == 0 && LightA == 1) // neutron is special case - { - LightName = G4Neutron::Definition(); - } else { - if (m_Reaction.GetUseExInGeant4()) - LightName - = IonTable->GetIon(LightZ, LightA, m_Reaction.GetExcitation3() * MeV); - else - LightName = IonTable->GetIon(LightZ, LightA); - } - - // Nucleus 4 - G4int HeavyZ = m_Reaction.GetNucleus4()->GetZ(); - G4int HeavyA = m_Reaction.GetNucleus4()->GetA(); - - // Generate the excitation energy if a distribution is given - m_Reaction.ShootRandomExcitationEnergy(); - - // Use to clean up the IonTable in case of the Ex changing at every event - G4ParticleDefinition* HeavyName; - - if (m_Reaction.GetUseExInGeant4()) - HeavyName - = IonTable->GetIon(HeavyZ, HeavyA, m_Reaction.GetExcitation4() * MeV); - else - HeavyName = IonTable->GetIon(HeavyZ, HeavyA); - - // Set the Energy of the reaction - m_Reaction.SetBeamEnergy(reac_energy); - - double Beam_theta = pdirection.theta(); - double Beam_phi = pdirection.phi(); - - /////////////////////////// - ///// Beam Parameters ///// - /////////////////////////// - m_ReactionConditions->SetBeamParticleName( - PrimaryTrack->GetParticleDefinition()->GetParticleName()); - - m_ReactionConditions->SetBeamReactionEnergy(reac_energy); - m_ReactionConditions->SetVertexPositionX(localPosition.x()); - m_ReactionConditions->SetVertexPositionY(localPosition.y()); - m_ReactionConditions->SetVertexPositionZ(localPosition.z()); - - G4ThreeVector U(1, 0, 0); - G4ThreeVector V(0, 1, 0); - G4ThreeVector ZZ(0, 0, 1); - m_ReactionConditions->SetBeamEmittanceTheta( - PrimaryTrack->GetMomentumDirection().theta() / deg); - m_ReactionConditions->SetBeamEmittancePhi( - PrimaryTrack->GetMomentumDirection().phi() / deg); - m_ReactionConditions->SetBeamEmittanceThetaX( - PrimaryTrack->GetMomentumDirection().angle(U) / deg); - m_ReactionConditions->SetBeamEmittancePhiY( - PrimaryTrack->GetMomentumDirection().angle(V) / deg); - - ////////////////////////////////////////////////////////// - ///// Build rotation matrix to go from the incident ////// - ///// beam frame to the "world" frame ////// - ////////////////////////////////////////////////////////// - - - // G4ThreeVector col1(cos(Beam_theta) * cos(Beam_phi), - // cos(Beam_theta) * sin(Beam_phi), - // -sin(Beam_theta)); - // G4ThreeVector col2(-sin(Beam_phi), - // cos(Beam_phi), - // 0); - // G4ThreeVector col3(sin(Beam_theta) * cos(Beam_phi), - // sin(Beam_theta) * sin(Beam_phi), - // cos(Beam_theta)); - // G4RotationMatrix BeamToWorld(col1, col2, col3); - - ///////////////////////////////////////////////////////////////// - ///// Angles for emitted particles following Cross Section ////// - ///// Angles are in the beam frame ////// - ///////////////////////////////////////////////////////////////// - - // Angles - // Shoot and Set a Random ThetaCM - m_Reaction.ShootRandomThetaCM(); - double phi = G4RandFlat::shoot() * 2. * pi; - - ////////////////////////////////////////////////// - ///// Momentum and angles from kinematics ///// - ///// Angles are in the beam frame ///// - ////////////////////////////////////////////////// - // Variable where to store results - double Theta3, Energy3, Theta4, Energy4; - - // Compute Kinematic using previously defined ThetaCM - m_Reaction.KineRelativistic(Theta3, Energy3, Theta4, Energy4); - // Momentum in beam frame for light particle - G4ThreeVector momentum_kine3_beam(sin(Theta3) * cos(phi), - sin(Theta3) * sin(phi), cos(Theta3)); - // Momentum in World frame //to go from the incident beam frame to the "world" - // frame - G4ThreeVector momentum_kine3_world = momentum_kine3_beam; - momentum_kine3_world.rotate(Beam_theta, - V); // rotation of Beam_theta on Y axis - momentum_kine3_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - // Momentum in beam frame for heavy particle - G4ThreeVector momentum_kine4_beam(sin(Theta4) * cos(phi + pi), - sin(Theta4) * sin(phi + pi), cos(Theta4)); - // Momentum in World frame - G4ThreeVector momentum_kine4_world = momentum_kine4_beam; - momentum_kine4_world.rotate(Beam_theta, - V); // rotation of Beam_theta on Y axis - momentum_kine4_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - // Emitt secondary - if (m_Reaction.GetShoot3()) { - G4DynamicParticle particle3(LightName, momentum_kine3_world, Energy3); - fastStep.CreateSecondaryTrack(particle3, localPosition, time); - } - - if (m_Reaction.GetShoot4()) { - G4DynamicParticle particle4(HeavyName, momentum_kine4_world, Energy4); - fastStep.CreateSecondaryTrack(particle4, localPosition, time); - } - - // Reinit for next event - m_PreviousEnergy = 0; - m_PreviousLength = 0; - m_PreviousDirection.set(0,0,0); - - /////////////////////////////////////// - ///// Emitted particle Parameters ///// - /////////////////////////////////////// - // Names 3 and 4// - m_ReactionConditions->SetParticleName(LightName->GetParticleName()); - m_ReactionConditions->SetParticleName(HeavyName->GetParticleName()); - // Angle 3 and 4 // - m_ReactionConditions->SetTheta(Theta3 / deg); - m_ReactionConditions->SetTheta(Theta4 / deg); - - m_ReactionConditions->SetPhi(phi / deg); - if ((phi + pi) / deg > 360) - m_ReactionConditions->SetPhi((phi - pi) / deg); - else - m_ReactionConditions->SetPhi((phi + pi) / deg); - - // Energy 3 and 4 // - m_ReactionConditions->SetKineticEnergy(Energy3); - m_ReactionConditions->SetKineticEnergy(Energy4); - // ThetaCM and Ex// - m_ReactionConditions->SetThetaCM(m_Reaction.GetThetaCM() / deg); - m_ReactionConditions->SetExcitationEnergy3(m_Reaction.GetExcitation3()); - m_ReactionConditions->SetExcitationEnergy4(m_Reaction.GetExcitation4()); - // Momuntum X 3 and 4 // - m_ReactionConditions->SetMomentumDirectionX(momentum_kine3_world.x()); - m_ReactionConditions->SetMomentumDirectionX(momentum_kine4_world.x()); - // Momuntum Y 3 and 4 // - m_ReactionConditions->SetMomentumDirectionY(momentum_kine3_world.y()); - m_ReactionConditions->SetMomentumDirectionY(momentum_kine4_world.y()); - // Momuntum Z 3 and 4 // - m_ReactionConditions->SetMomentumDirectionZ(momentum_kine3_world.z()); - m_ReactionConditions->SetMomentumDirectionZ(momentum_kine4_world.z()); - - }// end if TwoBodyReaction - - else if (m_ReactionType=="QFSReaction" ) { - - //////Define the kind of particle to shoot//////// - // A --> T ==> B + (c -> T) => B + 1 + 2 - - int Light1_Z = m_QFS.GetNucleus1()->GetZ(); - int Light1_A = m_QFS.GetNucleus1()->GetA(); - int Light2_Z = m_QFS.GetNucleus2()->GetZ(); - int Light2_A = m_QFS.GetNucleus2()->GetA(); - - static G4IonTable* IonTable - = G4ParticleTable::GetParticleTable()->GetIonTable(); - - G4ParticleDefinition* Light1Name; - G4ParticleDefinition* Light2Name; - - if (Light1_Z == 0 && Light1_A == 1) // neutron is special case - { - Light1Name = G4Neutron::Definition(); - } else { - Light1Name = IonTable->GetIon(Light1_Z, Light1_A); - } - - if (Light2_Z == 0 && Light2_A == 1) // neutron is special case - { - Light2Name = G4Neutron::Definition(); - } else { - Light2Name = IonTable->GetIon(Light2_Z, Light2_A); - } - - // Nucleus B - G4int Heavy_Z = m_QFS.GetNucleusB()->GetZ(); - G4int Heavy_A = m_QFS.GetNucleusB()->GetA(); - - G4ParticleDefinition* HeavyName; - HeavyName = IonTable->GetIon(Heavy_Z, Heavy_A); - - // Set the Energy of the reaction - m_QFS.SetBeamEnergy(reac_energy); - - double Beam_theta = pdirection.theta(); - double Beam_phi = pdirection.phi(); - - - ///////////////////////////////////////////////////////////////// - ///// Angles for emitted particles following Cross Section ////// - ///// Angles are in the beam frame ////// - ///////////////////////////////////////////////////////////////// - - // Shoot and Set a Random ThetaCM - double theta = G4RandFlat::shoot() * pi; - double phi = G4RandFlat::shoot() * 2. * pi - pi; //rand in [-pi,pi] - m_QFS.SetThetaCM(theta); - m_QFS.SetPhiCM(phi); - - // Shoot and set internal momentum for the removed cluster - // if a momentum Sigma is given then shoot in 3 indep. Gaussians - // if input files are given for distributions use them instead - m_QFS.ShootInternalMomentum(); - - ////////////////////////////////////////////////// - ///// Momentum and angles from kinematics ///// - ////////////////////////////////////////////////// - // Variable where to store results - double Theta1, Phi1, TKE1, Theta2, Phi2, TKE2, ThetaB, PhiB, TKEB; - - // Compute Kinematic using previously defined ThetaCM - m_QFS.KineRelativistic(Theta1, Phi1, TKE1, Theta2, Phi2, TKE2); - - G4ThreeVector U(1, 0, 0); - G4ThreeVector V(0, 1, 0); - G4ThreeVector ZZ(0, 0, 1); - - // Momentum in beam and world frame for light particle 1 - G4ThreeVector momentum_kine1_beam(sin(Theta1) * cos(Phi1), - sin(Theta1) * sin(Phi1), cos(Theta1)); - G4ThreeVector momentum_kine1_world = momentum_kine1_beam; - momentum_kine1_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis - momentum_kine1_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - // Momentum in beam and world frame for light particle 2 - G4ThreeVector momentum_kine2_beam(sin(Theta2) * cos(Phi2), - sin(Theta2) * sin(Phi2), cos(Theta2)); - G4ThreeVector momentum_kine2_world = momentum_kine2_beam; - momentum_kine2_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis - momentum_kine2_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - // Momentum in beam and world frame for heavy residual - // - //G4ThreeVector momentum_kineB_beam(sin(ThetaB) * cos(PhiB + pi), - // sin(ThetaB) * sin(PhiB + pi), cos(ThetaB)); - //G4ThreeVector momentum_kineB_world = momentum_kineB_beam; - //momentum_kineB_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis - //momentum_kineB_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - TLorentzVector* P_A = m_QFS.GetEnergyImpulsionLab_A(); - TLorentzVector* P_B = m_QFS.GetEnergyImpulsionLab_B(); - - G4ThreeVector momentum_kineB_beam( P_B->Px(), P_B->Py(), P_B->Pz() ); - momentum_kineB_beam = momentum_kineB_beam.unit(); - TKEB = m_QFS.GetEnergyImpulsionLab_B()->Energy() - m_QFS.GetNucleusB()->Mass(); - G4ThreeVector momentum_kineB_world = momentum_kineB_beam; - momentum_kineB_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis - momentum_kineB_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis - - ThetaB = P_B->Angle(P_A->Vect()); - if (ThetaB < 0) ThetaB += M_PI; - PhiB = M_PI + P_B->Vect().Phi(); - if (fabs(PhiB) < 1e-6) PhiB = 0; + // Get the track info + const G4Track* PrimaryTrack = fastTrack.GetPrimaryTrack(); + G4ThreeVector pdirection = PrimaryTrack->GetMomentum().unit(); + G4ThreeVector localdir = fastTrack.GetPrimaryTrackLocalDirection(); + + G4ThreeVector worldPosition = PrimaryTrack->GetPosition(); + G4ThreeVector localPosition = fastTrack.GetPrimaryTrackLocalPosition(); + G4Material* material = fastTrack.GetPrimaryTrack() + ->GetVolume() + ->GetLogicalVolume() + ->GetMaterial(); + double energy = PrimaryTrack->GetKineticEnergy(); + double speed = PrimaryTrack->GetVelocity(); + double time = PrimaryTrack->GetGlobalTime()+m_length/speed; + + + double reac_energy = SlowDownBeam ( + PrimaryTrack->GetParticleDefinition(), + energy, + m_length, + material); - // Emitt secondary - if (m_QFS.GetShoot1()) { - G4DynamicParticle particle1(Light1Name, momentum_kine1_world, TKE1); - fastStep.CreateSecondaryTrack(particle1, localPosition, time); - } - - if (m_QFS.GetShoot2()) { - G4DynamicParticle particle2(Light2Name, momentum_kine2_world, TKE2); - fastStep.CreateSecondaryTrack(particle2, localPosition, time); - } - if (m_QFS.GetShootB()) { - G4DynamicParticle particleB(HeavyName, momentum_kineB_world, TKEB); - fastStep.CreateSecondaryTrack(particleB, localPosition, time); - } - - // Reinit for next event - m_PreviousEnergy = 0; - m_PreviousLength = 0; - m_PreviousDirection.set(0,0,0); - - - /////////////////////////////////// - ///// Reaction Condition Save ///// - /////////////////////////////////// - m_ReactionConditions->SetBeamParticleName( - PrimaryTrack->GetParticleDefinition()->GetParticleName()); - m_ReactionConditions->SetBeamReactionEnergy(reac_energy); - m_ReactionConditions->SetVertexPositionX(localPosition.x()); - m_ReactionConditions->SetVertexPositionY(localPosition.y()); - m_ReactionConditions->SetVertexPositionZ(localPosition.z()); - m_ReactionConditions->SetBeamEmittanceTheta( - PrimaryTrack->GetMomentumDirection().theta() / deg); - m_ReactionConditions->SetBeamEmittancePhi( - PrimaryTrack->GetMomentumDirection().phi() / deg); - m_ReactionConditions->SetBeamEmittanceThetaX( - PrimaryTrack->GetMomentumDirection().angle(U) / deg); - m_ReactionConditions->SetBeamEmittancePhiY( - PrimaryTrack->GetMomentumDirection().angle(V) / deg); - - // Names 1,2 and B// - m_ReactionConditions->SetParticleName(Light1Name->GetParticleName()); - m_ReactionConditions->SetParticleName(Light2Name->GetParticleName()); - m_ReactionConditions->SetParticleName(HeavyName->GetParticleName()); - // Angle 1,2 and B // - m_ReactionConditions->SetTheta(Theta1 / deg); - m_ReactionConditions->SetTheta(Theta2 / deg); - m_ReactionConditions->SetTheta(ThetaB / deg); - m_ReactionConditions->SetPhi(Phi1 / deg); - m_ReactionConditions->SetPhi(Phi2 / deg); - m_ReactionConditions->SetPhi(PhiB / deg); - // Energy 1,2 and B // - m_ReactionConditions->SetKineticEnergy(TKE1); - m_ReactionConditions->SetKineticEnergy(TKE2); - m_ReactionConditions->SetKineticEnergy(TKEB); - // ThetaCM, Ex and Internal Momentum of removed cluster// - m_ReactionConditions->SetThetaCM(m_QFS.GetThetaCM() / deg); - m_ReactionConditions->SetInternalMomentum(m_QFS.GetInternalMomentum()); - //m_ReactionConditions->SetExcitationEnergy3(m_QFS.GetExcitation3()); - //m_ReactionConditions->SetExcitationEnergy4(m_QFS.GetExcitation4()); - // Momuntum X 3 and 4 // - m_ReactionConditions->SetMomentumDirectionX(momentum_kine1_world.x()); - m_ReactionConditions->SetMomentumDirectionX(momentum_kine2_world.x()); - m_ReactionConditions->SetMomentumDirectionX(momentum_kineB_world.x()); - // Momuntum Y 3 and 4 // - m_ReactionConditions->SetMomentumDirectionY(momentum_kine1_world.y()); - m_ReactionConditions->SetMomentumDirectionY(momentum_kine2_world.y()); - m_ReactionConditions->SetMomentumDirectionY(momentum_kineB_world.y()); - // Momuntum Z 3 and 4 // - m_ReactionConditions->SetMomentumDirectionZ(momentum_kine1_world.z()); - m_ReactionConditions->SetMomentumDirectionZ(momentum_kine2_world.z()); - m_ReactionConditions->SetMomentumDirectionZ(momentum_kineB_world.z()); + G4ThreeVector ldir = pdirection; + ldir *= m_length; + localPosition = localPosition + ldir; + // Set the end of the step conditions + fastStep.SetPrimaryTrackFinalKineticEnergyAndDirection(0, pdirection); + fastStep.SetPrimaryTrackFinalPosition(worldPosition); + fastStep.SetTotalEnergyDeposited(0); + fastStep.SetPrimaryTrackFinalTime(time);// FIXME + fastStep.KillPrimaryTrack(); + fastStep.SetPrimaryTrackPathLength(0.0); + + if (m_ReactionType=="TwoBodyReaction" ) { + + /////////////////////////////// + // Two-Body Reaction Case ///// + /////////////////////////////// + + //////Define the kind of particle to shoot//////// + // Nucleus 3 + int LightZ = m_Reaction.GetNucleus3()->GetZ(); + int LightA = m_Reaction.GetNucleus3()->GetA(); + static G4IonTable* IonTable + = G4ParticleTable::GetParticleTable()->GetIonTable(); + + G4ParticleDefinition* LightName; + + if (LightZ == 0 && LightA == 1) // neutron is special case + { + LightName = G4Neutron::Definition(); + } else { + if (m_Reaction.GetUseExInGeant4()) + LightName + = IonTable->GetIon(LightZ, LightA, m_Reaction.GetExcitation3() * MeV); + else + LightName = IonTable->GetIon(LightZ, LightA); + } + + // Nucleus 4 + G4int HeavyZ = m_Reaction.GetNucleus4()->GetZ(); + G4int HeavyA = m_Reaction.GetNucleus4()->GetA(); + + // Generate the excitation energy if a distribution is given + m_Reaction.ShootRandomExcitationEnergy(); + + // Use to clean up the IonTable in case of the Ex changing at every event + G4ParticleDefinition* HeavyName; + + if (m_Reaction.GetUseExInGeant4()) + HeavyName + = IonTable->GetIon(HeavyZ, HeavyA, m_Reaction.GetExcitation4() * MeV); + else + HeavyName = IonTable->GetIon(HeavyZ, HeavyA); + + // Set the Energy of the reaction + m_Reaction.SetBeamEnergy(reac_energy); + + double Beam_theta = pdirection.theta(); + double Beam_phi = pdirection.phi(); + + /////////////////////////// + ///// Beam Parameters ///// + /////////////////////////// + m_ReactionConditions->SetBeamParticleName( + PrimaryTrack->GetParticleDefinition()->GetParticleName()); + + m_ReactionConditions->SetBeamReactionEnergy(reac_energy); + m_ReactionConditions->SetVertexPositionX(localPosition.x()); + m_ReactionConditions->SetVertexPositionY(localPosition.y()); + m_ReactionConditions->SetVertexPositionZ(localPosition.z()); + + G4ThreeVector U(1, 0, 0); + G4ThreeVector V(0, 1, 0); + G4ThreeVector ZZ(0, 0, 1); + m_ReactionConditions->SetBeamEmittanceTheta( + PrimaryTrack->GetMomentumDirection().theta() / deg); + m_ReactionConditions->SetBeamEmittancePhi( + PrimaryTrack->GetMomentumDirection().phi() / deg); + m_ReactionConditions->SetBeamEmittanceThetaX( + PrimaryTrack->GetMomentumDirection().angle(U) / deg); + m_ReactionConditions->SetBeamEmittancePhiY( + PrimaryTrack->GetMomentumDirection().angle(V) / deg); + + ////////////////////////////////////////////////////////// + ///// Build rotation matrix to go from the incident ////// + ///// beam frame to the "world" frame ////// + ////////////////////////////////////////////////////////// + + + // G4ThreeVector col1(cos(Beam_theta) * cos(Beam_phi), + // cos(Beam_theta) * sin(Beam_phi), + // -sin(Beam_theta)); + // G4ThreeVector col2(-sin(Beam_phi), + // cos(Beam_phi), + // 0); + // G4ThreeVector col3(sin(Beam_theta) * cos(Beam_phi), + // sin(Beam_theta) * sin(Beam_phi), + // cos(Beam_theta)); + // G4RotationMatrix BeamToWorld(col1, col2, col3); + + ///////////////////////////////////////////////////////////////// + ///// Angles for emitted particles following Cross Section ////// + ///// Angles are in the beam frame ////// + ///////////////////////////////////////////////////////////////// + + // Angles + // Shoot and Set a Random ThetaCM + m_Reaction.ShootRandomThetaCM(); + double phi = G4RandFlat::shoot() * 2. * pi; + + ////////////////////////////////////////////////// + ///// Momentum and angles from kinematics ///// + ///// Angles are in the beam frame ///// + ////////////////////////////////////////////////// + // Variable where to store results + double Theta3, Energy3, Theta4, Energy4; + + // Compute Kinematic using previously defined ThetaCM + m_Reaction.KineRelativistic(Theta3, Energy3, Theta4, Energy4); + // Momentum in beam frame for light particle + G4ThreeVector momentum_kine3_beam(sin(Theta3) * cos(phi), + sin(Theta3) * sin(phi), cos(Theta3)); + // Momentum in World frame //to go from the incident beam frame to the "world" + // frame + G4ThreeVector momentum_kine3_world = momentum_kine3_beam; + momentum_kine3_world.rotate(Beam_theta, + V); // rotation of Beam_theta on Y axis + momentum_kine3_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + // Momentum in beam frame for heavy particle + G4ThreeVector momentum_kine4_beam(sin(Theta4) * cos(phi + pi), + sin(Theta4) * sin(phi + pi), cos(Theta4)); + // Momentum in World frame + G4ThreeVector momentum_kine4_world = momentum_kine4_beam; + momentum_kine4_world.rotate(Beam_theta, + V); // rotation of Beam_theta on Y axis + momentum_kine4_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + // Emitt secondary + if (m_Reaction.GetShoot3()) { + G4DynamicParticle particle3(LightName, momentum_kine3_world, Energy3); + fastStep.CreateSecondaryTrack(particle3, localPosition, time); } + + if (m_Reaction.GetShoot4()) { + G4DynamicParticle particle4(HeavyName, momentum_kine4_world, Energy4); + fastStep.CreateSecondaryTrack(particle4, localPosition, time); + } + + /////////////////////////////////////// + ///// Emitted particle Parameters ///// + /////////////////////////////////////// + // Names 3 and 4// + m_ReactionConditions->SetParticleName(LightName->GetParticleName()); + m_ReactionConditions->SetParticleName(HeavyName->GetParticleName()); + // Angle 3 and 4 // + m_ReactionConditions->SetTheta(Theta3 / deg); + m_ReactionConditions->SetTheta(Theta4 / deg); + + m_ReactionConditions->SetPhi(phi / deg); + if ((phi + pi) / deg > 360) + m_ReactionConditions->SetPhi((phi - pi) / deg); + else + m_ReactionConditions->SetPhi((phi + pi) / deg); + + // Energy 3 and 4 // + m_ReactionConditions->SetKineticEnergy(Energy3); + m_ReactionConditions->SetKineticEnergy(Energy4); + // ThetaCM and Ex// + m_ReactionConditions->SetThetaCM(m_Reaction.GetThetaCM() / deg); + m_ReactionConditions->SetExcitationEnergy3(m_Reaction.GetExcitation3()); + m_ReactionConditions->SetExcitationEnergy4(m_Reaction.GetExcitation4()); + // Momuntum X 3 and 4 // + m_ReactionConditions->SetMomentumDirectionX(momentum_kine3_world.x()); + m_ReactionConditions->SetMomentumDirectionX(momentum_kine4_world.x()); + // Momuntum Y 3 and 4 // + m_ReactionConditions->SetMomentumDirectionY(momentum_kine3_world.y()); + m_ReactionConditions->SetMomentumDirectionY(momentum_kine4_world.y()); + // Momuntum Z 3 and 4 // + m_ReactionConditions->SetMomentumDirectionZ(momentum_kine3_world.z()); + m_ReactionConditions->SetMomentumDirectionZ(momentum_kine4_world.z()); + + }// end if TwoBodyReaction + + else if (m_ReactionType=="QFSReaction" ) { + + //////Define the kind of particle to shoot//////// + // A --> T ==> B + (c -> T) => B + 1 + 2 + + int Light1_Z = m_QFS.GetNucleus1()->GetZ(); + int Light1_A = m_QFS.GetNucleus1()->GetA(); + int Light2_Z = m_QFS.GetNucleus2()->GetZ(); + int Light2_A = m_QFS.GetNucleus2()->GetA(); + + static G4IonTable* IonTable + = G4ParticleTable::GetParticleTable()->GetIonTable(); + + G4ParticleDefinition* Light1Name; + G4ParticleDefinition* Light2Name; + + if (Light1_Z == 0 && Light1_A == 1) // neutron is special case + { + Light1Name = G4Neutron::Definition(); + } else { + Light1Name = IonTable->GetIon(Light1_Z, Light1_A); + } + + if (Light2_Z == 0 && Light2_A == 1) // neutron is special case + { + Light2Name = G4Neutron::Definition(); + } else { + Light2Name = IonTable->GetIon(Light2_Z, Light2_A); + } + + // Nucleus B + G4int Heavy_Z = m_QFS.GetNucleusB()->GetZ(); + G4int Heavy_A = m_QFS.GetNucleusB()->GetA(); + + G4ParticleDefinition* HeavyName; + HeavyName = IonTable->GetIon(Heavy_Z, Heavy_A); + + // Set the Energy of the reaction + m_QFS.SetBeamEnergy(reac_energy); + + double Beam_theta = pdirection.theta(); + double Beam_phi = pdirection.phi(); + + + ///////////////////////////////////////////////////////////////// + ///// Angles for emitted particles following Cross Section ////// + ///// Angles are in the beam frame ////// + ///////////////////////////////////////////////////////////////// + + // Shoot and Set a Random ThetaCM + double theta = G4RandFlat::shoot() * pi; + double phi = G4RandFlat::shoot() * 2. * pi - pi; //rand in [-pi,pi] + m_QFS.SetThetaCM(theta); + m_QFS.SetPhiCM(phi); + + // Shoot and set internal momentum for the removed cluster + // if a momentum Sigma is given then shoot in 3 indep. Gaussians + // if input files are given for distributions use them instead + m_QFS.ShootInternalMomentum(); + + ////////////////////////////////////////////////// + ///// Momentum and angles from kinematics ///// + ////////////////////////////////////////////////// + // Variable where to store results + double Theta1, Phi1, TKE1, Theta2, Phi2, TKE2, ThetaB, PhiB, TKEB; + + // Compute Kinematic using previously defined ThetaCM + m_QFS.KineRelativistic(Theta1, Phi1, TKE1, Theta2, Phi2, TKE2); + + G4ThreeVector U(1, 0, 0); + G4ThreeVector V(0, 1, 0); + G4ThreeVector ZZ(0, 0, 1); + + // Momentum in beam and world frame for light particle 1 + G4ThreeVector momentum_kine1_beam(sin(Theta1) * cos(Phi1), + sin(Theta1) * sin(Phi1), cos(Theta1)); + G4ThreeVector momentum_kine1_world = momentum_kine1_beam; + momentum_kine1_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis + momentum_kine1_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + // Momentum in beam and world frame for light particle 2 + G4ThreeVector momentum_kine2_beam(sin(Theta2) * cos(Phi2), + sin(Theta2) * sin(Phi2), cos(Theta2)); + G4ThreeVector momentum_kine2_world = momentum_kine2_beam; + momentum_kine2_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis + momentum_kine2_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + // Momentum in beam and world frame for heavy residual + // + //G4ThreeVector momentum_kineB_beam(sin(ThetaB) * cos(PhiB + pi), + // sin(ThetaB) * sin(PhiB + pi), cos(ThetaB)); + //G4ThreeVector momentum_kineB_world = momentum_kineB_beam; + //momentum_kineB_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis + //momentum_kineB_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + TLorentzVector* P_A = m_QFS.GetEnergyImpulsionLab_A(); + TLorentzVector* P_B = m_QFS.GetEnergyImpulsionLab_B(); + + G4ThreeVector momentum_kineB_beam( P_B->Px(), P_B->Py(), P_B->Pz() ); + momentum_kineB_beam = momentum_kineB_beam.unit(); + TKEB = m_QFS.GetEnergyImpulsionLab_B()->Energy() - m_QFS.GetNucleusB()->Mass(); + G4ThreeVector momentum_kineB_world = momentum_kineB_beam; + momentum_kineB_world.rotate(Beam_theta, V); // rotation of Beam_theta on Y axis + momentum_kineB_world.rotate(Beam_phi, ZZ); // rotation of Beam_phi on Z axis + + ThetaB = P_B->Angle(P_A->Vect()); + if (ThetaB < 0) ThetaB += M_PI; + PhiB = M_PI + P_B->Vect().Phi(); + if (fabs(PhiB) < 1e-6) PhiB = 0; + + + // Emitt secondary + if (m_QFS.GetShoot1()) { + G4DynamicParticle particle1(Light1Name, momentum_kine1_world, TKE1); + fastStep.CreateSecondaryTrack(particle1, localPosition, time); + } + + if (m_QFS.GetShoot2()) { + G4DynamicParticle particle2(Light2Name, momentum_kine2_world, TKE2); + fastStep.CreateSecondaryTrack(particle2, localPosition, time); + } + if (m_QFS.GetShootB()) { + G4DynamicParticle particleB(HeavyName, momentum_kineB_world, TKEB); + fastStep.CreateSecondaryTrack(particleB, localPosition, time); + } + + /////////////////////////////////// + ///// Reaction Condition Save ///// + /////////////////////////////////// + m_ReactionConditions->SetBeamParticleName( + PrimaryTrack->GetParticleDefinition()->GetParticleName()); + m_ReactionConditions->SetBeamReactionEnergy(reac_energy); + m_ReactionConditions->SetVertexPositionX(localPosition.x()); + m_ReactionConditions->SetVertexPositionY(localPosition.y()); + m_ReactionConditions->SetVertexPositionZ(localPosition.z()); + m_ReactionConditions->SetBeamEmittanceTheta( + PrimaryTrack->GetMomentumDirection().theta() / deg); + m_ReactionConditions->SetBeamEmittancePhi( + PrimaryTrack->GetMomentumDirection().phi() / deg); + m_ReactionConditions->SetBeamEmittanceThetaX( + PrimaryTrack->GetMomentumDirection().angle(U) / deg); + m_ReactionConditions->SetBeamEmittancePhiY( + PrimaryTrack->GetMomentumDirection().angle(V) / deg); + + // Names 1,2 and B// + m_ReactionConditions->SetParticleName(Light1Name->GetParticleName()); + m_ReactionConditions->SetParticleName(Light2Name->GetParticleName()); + m_ReactionConditions->SetParticleName(HeavyName->GetParticleName()); + // Angle 1,2 and B // + m_ReactionConditions->SetTheta(Theta1 / deg); + m_ReactionConditions->SetTheta(Theta2 / deg); + m_ReactionConditions->SetTheta(ThetaB / deg); + m_ReactionConditions->SetPhi(Phi1 / deg); + m_ReactionConditions->SetPhi(Phi2 / deg); + m_ReactionConditions->SetPhi(PhiB / deg); + // Energy 1,2 and B // + m_ReactionConditions->SetKineticEnergy(TKE1); + m_ReactionConditions->SetKineticEnergy(TKE2); + m_ReactionConditions->SetKineticEnergy(TKEB); + // ThetaCM, Ex and Internal Momentum of removed cluster// + m_ReactionConditions->SetThetaCM(m_QFS.GetThetaCM() / deg); + m_ReactionConditions->SetInternalMomentum(m_QFS.GetInternalMomentum()); + //m_ReactionConditions->SetExcitationEnergy3(m_QFS.GetExcitation3()); + //m_ReactionConditions->SetExcitationEnergy4(m_QFS.GetExcitation4()); + // Momuntum X 3 and 4 // + m_ReactionConditions->SetMomentumDirectionX(momentum_kine1_world.x()); + m_ReactionConditions->SetMomentumDirectionX(momentum_kine2_world.x()); + m_ReactionConditions->SetMomentumDirectionX(momentum_kineB_world.x()); + // Momuntum Y 3 and 4 // + m_ReactionConditions->SetMomentumDirectionY(momentum_kine1_world.y()); + m_ReactionConditions->SetMomentumDirectionY(momentum_kine2_world.y()); + m_ReactionConditions->SetMomentumDirectionY(momentum_kineB_world.y()); + // Momuntum Z 3 and 4 // + m_ReactionConditions->SetMomentumDirectionZ(momentum_kine1_world.z()); + m_ReactionConditions->SetMomentumDirectionZ(momentum_kine2_world.z()); + m_ReactionConditions->SetMomentumDirectionZ(momentum_kineB_world.z()); + + + + } +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Return the slow down beam in given thickness of material +double NPS::BeamReaction::SlowDownBeam(const G4ParticleDefinition* Beam, + double IncidentEnergy, + double Thickness, + G4Material* Material){ + + + if(Beam->GetParticleName()=="neutron"){ + return IncidentEnergy; + } + + double dedx,de; + int NbSlice = 100; + static G4EmCalculator emCalculator; + + if(Thickness!=0){ + for (G4int i = 0; i < NbSlice; i++){ + dedx = emCalculator.ComputeTotalDEDX(IncidentEnergy, Beam, Material); + de = dedx * Thickness / NbSlice; + IncidentEnergy -= de; + if(IncidentEnergy<0){ + IncidentEnergy = 0; + break; + } + } + } + + return IncidentEnergy; + } + diff --git a/NPSimulation/Process/BeamReaction.hh b/NPSimulation/Process/BeamReaction.hh index 7cd2c579a0e9d49ebcd02b6e6c0c2074cfbcc9c9..2d1dc6336f7d442b22ba2587a5166f8fff4d6b65 100644 --- a/NPSimulation/Process/BeamReaction.hh +++ b/NPSimulation/Process/BeamReaction.hh @@ -48,16 +48,16 @@ namespace NPS{ NPL::QFS m_QFS; string m_BeamName; string m_ReactionType; - double m_PreviousEnergy; - double m_PreviousLength; - G4ThreeVector m_PreviousDirection; bool m_active;// is the process active bool m_shoot; - bool m_reverse; double m_StepSize; + double m_Z; double m_rand; + double m_length; int m_Parent_ID; - + double SlowDownBeam(const G4ParticleDefinition* Beam, double IncidentEnergy, double Thickness,G4Material* Material); + + private: TReactionConditions* m_ReactionConditions; diff --git a/Projects/MUGAST/configs/ConfigMugast.dat b/Projects/MUGAST/configs/ConfigMugast.dat index 841d10d8db1acbc98a785b95142005bcc507e27c..e4c1c6fb23fd185f6eef4360c05b1dc4acf6fd45 100644 --- a/Projects/MUGAST/configs/ConfigMugast.dat +++ b/Projects/MUGAST/configs/ConfigMugast.dat @@ -1,6 +1,5 @@ ConfigMugast TAKE_E_X= 1 - %raw channel 86 corresponds to stripY 46 DISABLE_CHANNEL_Y= 3 123 MAX_STRIP_MULTIPLICITY= 100 STRIP_ENERGY_MATCHING= 1 MeV diff --git a/Projects/Strasse/strasse.detector b/Projects/Strasse/strasse.detector index 7d67b6877719cac8e5031e44cb994298c0b807e7..f7c6dff26f60f29ae5618fa91fe7d566b7dc7bc7 100644 --- a/Projects/Strasse/strasse.detector +++ b/Projects/Strasse/strasse.detector @@ -1,14 +1,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 150 mm + THICKNESS= 100 mm ANGLE= 0 deg RADIUS= 50 mm MATERIAL= LH2 X= 0 mm Y= 0 mm Z= 0 mm - NbSlices= 10000 + NbSlices= 10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Strasse Info