diff --git a/Processes/Sibyll/Interaction.h b/Processes/Sibyll/Interaction.h index eb45a570dd45dd679ff99437948a484aa7663c75..23af2bf2a3ebf4f919c5f8b063a37e2017c1370c 100644 --- a/Processes/Sibyll/Interaction.h +++ b/Processes/Sibyll/Interaction.h @@ -64,8 +64,8 @@ namespace corsika::process::sibyll { // FOR NOW: assume target is oxygen const int kTarget = corsika::particles::Oxygen::GetNucleusA(); - hep::EnergyType Etot = - p.GetEnergy() + kTarget * corsika::particles::Proton::GetMass(); + const hep::MassType nucleon_mass = 0.5*(corsika::particles::Proton::GetMass()+corsika::particles::Neutron::GetMass()); + hep::EnergyType Etot = p.GetEnergy() + nucleon_mass; MomentumVector Ptot(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); // FOR NOW: assume target is at rest MomentumVector pTarget(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); @@ -128,11 +128,22 @@ namespace corsika::process::sibyll { << process::sibyll::CanInteract(p.GetPID()) << endl; if (process::sibyll::CanInteract(p.GetPID())) { const CoordinateSystem& rootCS = - RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + Point pOrig = p.GetPosition(); TimeType tOrig = p.GetTime(); - + // sibyll CS has z along particle momentum + // FOR NOW: hard coded z-axis for corsika frame + QuantityVector<length_d> const zAxis{0_m, 0_m, 1_m}; + QuantityVector<length_d> const xAxis{1_m, 0_m, 0_m}; + auto pt = []( MomentumVector p ){ + return sqrt(p.GetComponents()[0] * p.GetComponents()[0] + p.GetComponents()[1] * p.GetComponents()[1]); + }; + double theta = acos( p.GetMomentum().GetComponents()[2] / p.GetMomentum().norm()); + cout << "ProcessSibyll: polar angle between sibyllCS and rootCS: " << theta << endl; + double phi = asin( p.GetMomentum().GetComponents()[0]/pt(p.GetMomentum() ) ); + CoordinateSystem sibyllCS = rootCS.rotate(xAxis, theta); + /* the target should be defined by the Environment, ideally as full particle object so that the four momenta @@ -143,14 +154,18 @@ namespace corsika::process::sibyll { */ // FOR NOW: set target to oxygen const int kTarget = corsika::particles::Oxygen:: - GetNucleusA(); // env.GetTargetParticle().GetPID(); + GetNucleusA(); // env.GetTargetParticle().GetPID(); // FOR NOW: target is always at rest - const EnergyType Etarget = 0_GeV + corsika::particles::Proton::GetMass(); + const hep::MassType nucleon_mass = 0.5*(corsika::particles::Proton::GetMass()+corsika::particles::Neutron::GetMass()); + const EnergyType Etarget = 0_GeV + nucleon_mass; const auto pTarget = MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); cout << "target momentum (GeV/c): " << pTarget.GetComponents() / 1_GeV << endl; cout << "beam momentum (GeV/c): " << p.GetMomentum().GetComponents() / 1_GeV << endl; + cout << "beam momentum in sibyll frame (GeV/c): " << p.GetMomentum().GetComponents(sibyllCS) / 1_GeV + << endl; + cout << "position of interaction: " << pOrig.GetCoordinates() << endl; cout << "time: " << tOrig << endl; @@ -209,23 +224,31 @@ namespace corsika::process::sibyll { // add particles from sibyll to stack // link to sibyll stack + // here we need to pass projectile momentum and energy to define the local sibyll frame + // and the boosts to the lab. frame SibStack ss; - // SibStack does not know about momentum yet so we need counter to access // momentum array in Sibyll - int i = -1; MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); EnergyType E_final = 0_GeV, Ecm_final = 0_GeV; for (auto& psib : ss) { - ++i; + // skip particles that have decayed in Sibyll - if (abs(s_plist_.llist[i]) > 100) continue; + if( psib.HasDecayed()) continue; // transform energy to lab. frame, primitve // compute beta_vec * p_vec // arbitrary Lorentz transformation based on sibyll routines const auto gammaBetaComponents = gambet.GetComponents(); - const auto pSibyllComponents = psib.GetMomentum().GetComponents(); + // FOR NOW: fill vector in sibCS and then rotate into rootCS + // can be done in SibStack by passing sibCS + // get momentum vector in sibyllCS + const auto pSibyllComponentsSibCS = psib.GetMomentum().GetComponents(); + // temporary vector in sibyllCS + auto SibVector = MomentumVector( sibyllCS, pSibyllComponentsSibCS); + // rotatate to rootCS + const auto pSibyllComponents = SibVector.GetComponents(rootCS); + // boost to lab. frame hep::EnergyType en_lab = 0. * 1_GeV; hep::MomentumType p_lab_components[3]; en_lab = psib.GetEnergy() * gamma; @@ -244,7 +267,6 @@ namespace corsika::process::sibyll { auto pnew = s.NewParticle(); pnew.SetEnergy(en_lab); pnew.SetPID(process::sibyll::ConvertFromSibyll(psib.GetPID())); - corsika::geometry::QuantityVector<energy_hep_d> p_lab_c{ p_lab_components[0], p_lab_components[1], p_lab_components[2]}; pnew.SetMomentum(MomentumVector(rootCS, p_lab_c)); diff --git a/Processes/Sibyll/SibStack.h b/Processes/Sibyll/SibStack.h index 7398d40003402d3c45aa83c4b2fc0eae2e9d1fa3..d78273822c700edaaae9e2c6bbefdfbfabb2a9e8 100644 --- a/Processes/Sibyll/SibStack.h +++ b/Processes/Sibyll/SibStack.h @@ -20,7 +20,7 @@ namespace corsika::process::sibyll { void Clear() { s_plist_.np = 0; } int GetSize() const { return s_plist_.np; } -#warning check actual capacity of sibyll stack + int GetCapacity() const { return 8000; } void SetId(const int i, const int v) { s_plist_.llist[i] = v; } @@ -80,6 +80,10 @@ namespace corsika::process::sibyll { corsika::units::hep::EnergyType GetEnergy() const { return GetStackData().GetEnergy(GetIndex()); } + bool HasDecayed() const + { + return abs(GetStackData().GetId(GetIndex()))>100 ? true : false; + } void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); } corsika::process::sibyll::SibyllCode GetPID() const { return static_cast<corsika::process::sibyll::SibyllCode>(