From ab28cb07f281bc3da8dd19ea245e533b4c381eff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Val=C3=A9rian=20Alcindor?= <valerian.alcindor@hotmail.fr>
Date: Mon, 15 Aug 2022 09:49:54 +0200
Subject: [PATCH] Adding a three body decay process for sequential emission
 from resonant states

---
 NPSimulation/Process/ThreeBody.cc             | 532 ++++++++++++++++++
 NPSimulation/Process/ThreeBody.hh             | 107 ++++
 Projects/MultiParticleRES/.DS_Store           | Bin 0 -> 8196 bytes
 Projects/MultiParticleRES/Inputs/.DS_Store    | Bin 0 -> 6148 bytes
 Projects/MultiParticleRES/Inputs/BW.root      | Bin 0 -> 6883 bytes
 .../Inputs/ExampleSequential15F.detector      |  75 +++
 .../Inputs/ExampleSequential15F.reaction      |  38 ++
 Projects/MultiParticleRES/Inputs/simu.mac     |   2 +
 Projects/MultiParticleRES/simu.sh             |   2 +
 Projects/MultiParticleRES/utilities/BW.root   | Bin 0 -> 6883 bytes
 .../MultiParticleRES/utilities/ThreeBodyCS.cc | 267 +++++++++
 .../MultiParticleRES/utilities/rootlogon.C    |   1 +
 12 files changed, 1024 insertions(+)
 create mode 100644 NPSimulation/Process/ThreeBody.cc
 create mode 100644 NPSimulation/Process/ThreeBody.hh
 create mode 100644 Projects/MultiParticleRES/.DS_Store
 create mode 100644 Projects/MultiParticleRES/Inputs/.DS_Store
 create mode 100644 Projects/MultiParticleRES/Inputs/BW.root
 create mode 100755 Projects/MultiParticleRES/Inputs/ExampleSequential15F.detector
 create mode 100644 Projects/MultiParticleRES/Inputs/ExampleSequential15F.reaction
 create mode 100644 Projects/MultiParticleRES/Inputs/simu.mac
 create mode 100755 Projects/MultiParticleRES/simu.sh
 create mode 100644 Projects/MultiParticleRES/utilities/BW.root
 create mode 100644 Projects/MultiParticleRES/utilities/ThreeBodyCS.cc
 create mode 100644 Projects/MultiParticleRES/utilities/rootlogon.C

diff --git a/NPSimulation/Process/ThreeBody.cc b/NPSimulation/Process/ThreeBody.cc
new file mode 100644
index 000000000..f8415e749
--- /dev/null
+++ b/NPSimulation/Process/ThreeBody.cc
@@ -0,0 +1,532 @@
+/*****************************************************************************
+ * 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: Valerian Alcindor                                        * 
+ * contact address: valcindor@ikp.tu-darmstadt.de                            *
+ *                                                                           *
+ * Creation Date  : 2019                                                     * 
+ * Last update    : August 2020                                              *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ * Generation of sequential three body decay from resonant states            *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+#include "ThreeBody.hh"
+#include "G4Electron.hh"
+#include "G4Gamma.hh"
+#include "G4IonTable.hh"
+#include "G4ParticleTable.hh"
+#include "G4SystemOfUnits.hh"
+#include "G4VPhysicalVolume.hh"
+#include "NPFunction.h"
+#include "NPInputParser.h"
+#include "NPOptionManager.h"
+#include "Particle.hh"
+#include "RootOutput.h"
+#include "TGenPhaseSpace.h"
+#include <iostream>
+#include <string>
+////////////////////////////////////////////////////////////////////////////////
+NPS::ThreeBody::ThreeBody(G4String modelName, G4Region* envelope)
+    : G4VFastSimulationModel(modelName, envelope) {
+  ReadConfiguration();
+  m_PreviousEnergy = 0;
+  m_PreviousLength = 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+NPS::ThreeBody::ThreeBody(G4String modelName)
+    : G4VFastSimulationModel(modelName) {}
+
+////////////////////////////////////////////////////////////////////////////////
+NPS::ThreeBody::~ThreeBody() {}
+
+////////////////////////////////////////////////////////////////////////////////
+void NPS::ThreeBody::AttachReactionConditions() {
+  // Reasssigned the branch address
+  if (RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions"))
+    RootOutput::getInstance()->GetTree()->SetBranchAddress(
+        "ReactionConditions", &m_ReactionConditions);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void NPS::ThreeBody::ReadConfiguration() {
+  NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile());
+
+  vector<NPL::InputBlock*> blocks = input.GetAllBlocksWithToken("ThreeBody");
+  if (blocks.size() > 0) {
+    m_active             = true;
+    m_ReactionConditions = new TReactionConditions();
+    AttachReactionConditions();
+    if (!RootOutput::getInstance()->GetTree()->FindBranch("ReactionConditions"))
+      RootOutput::getInstance()->GetTree()->Branch(
+          "ReactionConditions", "TReactionConditions", &m_ReactionConditions);
+
+    for (unsigned int i = 0; i < blocks.size(); i++) {
+      if (blocks[i]->HasToken("Type"))
+        m_type = blocks[i]->GetString("Type");
+
+      if (blocks[i]->HasToken("Beam"))
+        m_Beam = blocks[i]->GetString("Beam");
+
+      if (blocks[i]->HasToken("Target"))
+        m_TargetNucleus = blocks[i]->GetString("Target");
+
+      if (blocks[i]->HasToken("CompoundNucleusEnergy"))
+        m_CompoundNucleusEnergy
+            = blocks[i]->GetDouble("CompoundNucleusEnergy", "MeV");
+
+      if (blocks[i]->HasToken("CompoundNucleusStateWidth"))
+        m_CompoundNucleusStateWidth
+            = blocks[i]->GetDouble("CompoundNucleusStateWidth", "MeV");
+
+      if (blocks[i]->HasToken("IntermediaryNucleus"))
+        m_IntermediaryNucleus = blocks[i]->GetString("IntermediaryNucleus");
+
+      if (blocks[i]->HasToken("IntermediaryState"))
+        m_IntermediaryState = blocks[i]->GetDouble("IntermediaryState", "MeV");
+
+      if (blocks[i]->HasToken("IntermediaryStateWidth"))
+        m_IntermediaryStateWidth
+            = blocks[i]->GetDouble("IntermediaryStateWidth", "MeV");
+
+      if (blocks[i]->HasToken("Light1"))
+        m_Light1 = blocks[i]->GetString("Light1");
+
+      if (blocks[i]->HasToken("Heavy"))
+        m_Heavy = blocks[i]->GetString("Heavy");
+
+      if (blocks[i]->HasToken("Light2"))
+        m_Light2 = blocks[i]->GetString("Light2");
+
+      if (blocks[i]->HasToken("ExcitationEnergyHeavy"))
+        m_ExcitationEnergyHeavy
+            = blocks[i]->GetDouble("ExcitationEnergyHeavy", "MeV");
+
+      if (blocks[i]->HasToken("ShootLight1"))
+        m_ShootLight1 = blocks[i]->GetInt("ShootLight1");
+
+      if (blocks[i]->HasToken("ShootLight2"))
+        m_ShootLight2 = blocks[i]->GetInt("ShootLight2");
+
+      if (blocks[i]->HasToken("ShootHeavy"))
+        m_ShootHeavy = blocks[i]->GetInt("ShootHeavy");
+
+      m_UserEnergyCS = false;
+      if (blocks[i]->HasToken("UserEnergyCS")) {
+        m_UserEnergyCS = blocks[i]->GetInt("UserEnergyCS");
+
+        cout << m_UserEnergyCS << endl;
+
+        if (blocks[i]->HasToken("EnergyCSPath"))
+          m_EnergyCSPath = blocks[i]->GetString("EnergyCSPath");
+
+        if (blocks[i]->HasToken("EnergyCSName"))
+          m_EnergyCSName = blocks[i]->GetString("EnergyCSName");
+
+        if (m_UserEnergyCS) {
+          m_FileEnergyCS = new TFile(m_EnergyCSPath.c_str(), "open");
+          m_EnergyCS
+              = (TF1*)m_FileEnergyCS->FindObjectAny(m_EnergyCSName.c_str());
+          m_EnergyCSMax = m_EnergyCS->GetMaximum();
+          m_EnergyCS->SetNpx(1e6);
+          m_FileEnergyCS->Close();
+        }
+      } else {
+        cout << "ERROR: check your input file formatting \033[0m" << endl;
+        exit(1);
+      }
+    }
+    m_BeamName = NPL::ChangeNameToG4Standard(m_Beam);
+    m_N1       = NPL::Particle(m_Beam);
+    m_N2       = NPL::Particle(m_TargetNucleus);
+
+    m_N3 = NPL::Particle(m_Light1);
+    m_N4 = NPL::Particle(m_IntermediaryNucleus);
+
+    m_N5                     = NPL::Particle(m_Light2);
+    m_N6                     = NPL::Particle(m_Heavy);
+    m_end                    = false;
+    m_previousE              = -1000;
+    fIntermediaryStateEnergy = GetIntermediaryStateEnergy(
+        m_IntermediaryState, m_IntermediaryStateWidth);
+  } else
+    m_active = false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+G4bool NPS::ThreeBody::IsApplicable(const G4ParticleDefinition& particleType) {
+  NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile());
+
+  vector<NPL::InputBlock*> blocks = input.GetAllBlocksWithToken("ThreeBody");
+  if (!m_active)
+    return false;
+  if (!m_active)
+    return false;
+  else {
+    static std::string particleName;
+    particleName = particleType.GetParticleName();
+    if (particleName.find(m_BeamName) != std::string::npos
+        && blocks.size() > 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+G4bool NPS::ThreeBody::ModelTrigger(const G4FastTrack& fastTrack) {
+  static bool    shoot        = false;
+  static double  rand         = 0;
+  const G4Track* PrimaryTrack = fastTrack.GetPrimaryTrack();
+  G4ThreeVector  V            = PrimaryTrack->GetMomentum().unit();
+  G4ThreeVector  P            = fastTrack.GetPrimaryTrackLocalPosition();
+  G4VSolid*      solid        = fastTrack.GetPrimaryTrack()
+                        ->GetVolume()
+                        ->GetLogicalVolume()
+                        ->GetSolid();
+  double in    = solid->DistanceToOut(P, V);
+  double out   = solid->DistanceToOut(P, -V);
+  double ratio = in / (out + in);
+
+  if (out == 0) { // first step of current event
+    rand             = G4RandFlat::shoot();
+    m_PreviousLength = m_StepSize;
+    m_PreviousEnergy = PrimaryTrack->GetKineticEnergy();
+    // Clear Previous Event
+    m_ReactionConditions->Clear();
+    shoot = true;
+  } else if (in == 0) { // last step
+    return true;
+  }
+
+  // If the condition is met, the event is generated
+  if (ratio < rand) {
+    // Reset the static for next event
+    if (shoot) {
+      // && m_Reaction.IsAllowed(PrimaryTrack->GetKineticEnergy())) {
+      shoot = false;
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  // Record the situation of the current step
+  // so it can be used in the next one
+  if (!PrimaryTrack->GetStep()->IsLastStepInVolume()) {
+    m_PreviousLength = PrimaryTrack->GetStep()->GetStepLength();
+    m_PreviousEnergy = PrimaryTrack->GetKineticEnergy();
+  }
+
+  return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void NPS::ThreeBody::DoIt(const G4FastTrack& fastTrack, 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();
+
+  /////////////////////////
+  /// Beam Parameters /////
+  /////////////////////////
+  m_ReactionConditions->SetBeamParticleName(
+      PrimaryTrack->GetParticleDefinition()->GetParticleName());
+
+  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);
+
+  // Randomize within the step
+  // Assume energy loss is linear within the step
+  // Assume no scattering
+  double rand   = G4RandFlat::shoot();
+  double length = rand * (m_PreviousLength);
+  energy -= (1 - rand) * (m_PreviousEnergy - energy);
+  G4ThreeVector ldir = pdirection;
+  ldir *= length;
+  localPosition = localPosition - ldir;
+
+  m_ReactionConditions->SetBeamReactionEnergy(energy);
+  m_ReactionConditions->SetVertexPositionX(localPosition.x());
+  m_ReactionConditions->SetVertexPositionY(localPosition.y());
+  m_ReactionConditions->SetVertexPositionZ(localPosition.z());
+
+  // 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);
+
+  double Ecm = sqrt(m_N1.Mass() * m_N1.Mass() + m_N2.Mass() * m_N2.Mass()
+                    + 2 * m_N2.Mass() * (energy + m_N1.Mass()))
+               - m_N1.Mass() - m_N2.Mass();
+  if (m_UserEnergyCS == 0) {
+    Ecm = m_CompoundNucleusEnergy;
+  }
+
+  bool Allowed = false;
+  if (Ecm < m_IntermediaryState)
+    Ecm = 0;
+  if (m_UserEnergyCS) {
+    double cs_value = m_EnergyCS->Eval(Ecm) / m_EnergyCSMax;
+    double rand_cs  = G4RandFlat::shoot();
+    if (rand_cs < cs_value) {
+      Allowed = true;
+    }
+  } else if (Ecm > m_IntermediaryState) {
+    Allowed = true;
+  }
+
+  if (Allowed) {
+    /////////////////////////////////////////////////
+    //////Define the kind of particle to shoot////////
+    //////////////////////////////////////////////////
+
+    // Build the decaying particle four momenta vector:
+    double BeamEnergy = energy;
+
+    G4ThreeVector BeamMomentumG4V = pdirection;
+
+    // Before reaction
+    double m1 = m_N1.Mass();
+    double m2 = m_N2.Mass();
+
+    // After first emission
+    double m3 = m_N3.Mass();
+
+    double IntermediaryStateEnergy = 0.;
+    double SpSn = m_N4.GetBindingEnergy() - m_N6.GetBindingEnergy();
+    if (m_IntermediaryStateWidth == 0) {
+      IntermediaryStateEnergy = m_IntermediaryState;
+    } else {
+      while (true) {
+        IntermediaryStateEnergy = fIntermediaryStateEnergy->GetRandom();
+        if (IntermediaryStateEnergy > SpSn && IntermediaryStateEnergy < Ecm)
+          break;
+      }
+    }
+
+    m_N4.SetExcitationEnergy(IntermediaryStateEnergy);
+    double m4 = m_N4.Mass();
+
+    // After second emission
+    double m5 = m_N5.Mass();
+    double m6 = m_N6.Mass();
+
+    std::vector<NPL::Particle> DaughterNuclei;
+    DaughterNuclei.push_back(m_N3);
+    DaughterNuclei.push_back(m_N5);
+    DaughterNuclei.push_back(m_N6);
+
+    double T1 = BeamEnergy;
+    if (m_UserEnergyCS == 0) {
+      T1 = (pow((Ecm + m_N1.Mass() + m_N2.Mass()), 2.)
+            - (m_N1.Mass() * m_N1.Mass() + m_N2.Mass() * m_N2.Mass()))
+               / (2. * m_N2.Mass())
+           - m_N1.Mass();
+    }
+
+    TVector3 p1(BeamMomentumG4V.x(), BeamMomentumG4V.y(), BeamMomentumG4V.z());
+
+    double gamma1 = T1 / m1 + 1.;
+    double Beta1  = sqrt(1. - 1. / (gamma1 * gamma1));
+    p1.SetMag(gamma1 * m1 * Beta1);
+    TLorentzVector LV_1(p1.x(), p1.y(), p1.z(), T1 + m1);
+
+    TVector3       p2(0, 0, 0);
+    TLorentzVector LV_2(p2.x(), p2.y(), p2.z(), m2);
+
+    TLorentzVector LV_CN = LV_1 + LV_2;
+
+    /////////////////////////
+    // Sequential emission //
+    /////////////////////////
+
+    if (m_type == "sequential") {
+      // First particle emission
+      double       T3, T4 = 0;
+      unsigned int nDecay   = 2;
+      double*      masses34 = new double[nDecay];
+      masses34[0]           = m3 / 1000.;
+      masses34[1]           = m4 / 1000.;
+      double* T34           = new double[nDecay];
+      double* theta34       = new double[nDecay];
+      double* phi34         = new double[nDecay];
+
+      GetDecay(LV_CN.Vect(), LV_CN.E(), 2, masses34, T34, theta34, phi34);
+      TVector3 p3(0, 0, 1);
+      p3.SetTheta(theta34[0]);
+      p3.SetPhi(phi34[0]);
+      T3            = T34[0];
+      double gamma3 = T3 / m3 + 1;
+      double Beta3  = sqrt(1 - 1 / (gamma3 * gamma3));
+      p3.SetMag(gamma3 * m3 * Beta3);
+      G4ThreeVector p3G4 = G4ThreeVector(p3.x(), p3.y(), p3.z());
+
+      TVector3 p4(0, 0, 1);
+      p4.SetTheta(theta34[1]);
+      p4.SetPhi(phi34[1]);
+      T4            = T34[1];
+      double gamma4 = T4 / m4 + 1;
+      double Beta4  = sqrt(1 - 1 / (gamma4 * gamma4));
+      p4.SetMag(gamma4 * m4 * Beta4);
+      TLorentzVector LV_4(p4.x(), p4.y(), p4.z(), T4 + m4);
+
+      // Second particle emission
+      double T5, T6 = 0;
+      nDecay           = 2;
+      double* masses56 = new double[nDecay];
+      masses56[0]      = m5 / 1000.;
+      masses56[1]      = m6 / 1000.;
+      double* T56      = new double[nDecay];
+      double* theta56  = new double[nDecay];
+      double* phi56    = new double[nDecay];
+      GetDecay(LV_4.Vect(), LV_4.E(), 2, masses56, T56, theta56, phi56);
+      TVector3 p5(0, 0, 1);
+      p5.SetTheta(theta56[0]);
+      p5.SetPhi(phi56[0]);
+      T5            = T56[0];
+      double gamma5 = T5 / m5 + 1;
+      double Beta5  = sqrt(1 - 1 / (gamma5 * gamma5));
+      p5.SetMag(gamma5 * m5 * Beta5);
+      G4ThreeVector p5G4 = G4ThreeVector(p5.x(), p5.y(), p5.z());
+
+      TVector3 p6(0, 0, 1);
+      p6.SetTheta(theta56[1]);
+      p6.SetPhi(phi56[1]);
+      T6            = T56[1];
+      double gamma6 = T6 / m6 + 1;
+      double Beta6  = sqrt(1 - 1 / (gamma6 * gamma6));
+      p6.SetMag(gamma6 * m6 * Beta6);
+      G4ThreeVector p6G4 = G4ThreeVector(p6.x(), p6.y(), p6.z());
+
+      G4ParticleDefinition* Light1
+          = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(
+              m_N3.GetZ(), m_N3.GetA(), 0);
+
+      G4ParticleDefinition* Light2
+          = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(
+              m_N5.GetZ(), m_N5.GetA(), 0);
+
+      G4ParticleDefinition* Heavy
+          = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(
+              m_N6.GetZ(), m_N6.GetA(), m_ExcitationEnergyHeavy);
+
+      TLorentzVector LVproton1(p3.x(), p3.y(), p3.z(), T3 + m3);
+      TLorentzVector LVproton2(p5.x(), p5.y(), p5.z(), T5 + m5);
+      TLorentzVector LVHeavy(p6.x(), p6.y(), p6.z(), T6 + m6);
+
+      TLorentzVector All = LVproton1 + LVproton2 + LVHeavy;
+
+      // Emitt secondary
+      if (m_ShootLight1) {
+        G4DynamicParticle particleLight1(Light1, p3G4.unit(), T3);
+        fastStep.CreateSecondaryTrack(particleLight1, localPosition, time);
+      }
+
+      if (m_ShootLight2) {
+        G4DynamicParticle particleLight2(Light2, p5G4.unit(), T5);
+        fastStep.CreateSecondaryTrack(particleLight2, localPosition, time);
+      }
+      if (m_ShootHeavy) {
+        G4DynamicParticle particleHeavy(Heavy, p6G4.unit(), T6);
+        fastStep.CreateSecondaryTrack(particleHeavy, localPosition, time);
+      }
+      ///////////////////////////////////////
+      ///// Emitted particle Parameters /////
+      ///////////////////////////////////////
+      m_ReactionConditions->SetParticleName(Light1->GetParticleName());
+      m_ReactionConditions->SetKineticEnergy(T3);
+      m_ReactionConditions->SetTheta(theta34[0] / deg);
+      if ((phi34[0] + pi) / deg > 360)
+        m_ReactionConditions->SetPhi((phi34[0] - pi) / deg);
+      else
+        m_ReactionConditions->SetPhi((phi34[0] + pi) / deg);
+
+      m_ReactionConditions->SetParticleName(Light2->GetParticleName());
+      m_ReactionConditions->SetKineticEnergy(T5);
+      m_ReactionConditions->SetTheta(theta56[0] / deg);
+      if ((phi56[0] + pi) / deg > 360)
+        m_ReactionConditions->SetPhi((phi56[0] - pi) / deg);
+      else
+        m_ReactionConditions->SetPhi((phi56[0] + pi) / deg);
+
+      m_ReactionConditions->SetParticleName(Heavy->GetParticleName());
+      m_ReactionConditions->SetKineticEnergy(T6);
+      m_ReactionConditions->SetTheta(theta56[1] / deg);
+      if ((phi56[1] + pi) / deg > 360)
+        m_ReactionConditions->SetPhi((phi56[1] - pi) / deg);
+      else
+        m_ReactionConditions->SetPhi((phi56[1] + pi) / deg);
+    }
+  }
+
+  // Reinit for next event
+  m_PreviousEnergy = 0;
+  m_PreviousLength = 0;
+}
+
+void NPS::ThreeBody::GetDecay(TVector3 p1, double Etot1, unsigned int nDecay,
+                              double* masses, double* T, double* theta,
+                              double* phi) {
+  TGenPhaseSpace PhaseSpace;
+  TLorentzVector NucleiToDecay(p1.x() / 1000., p1.y() / 1000., p1.z() / 1000.,
+                               Etot1 / 1000.);
+
+  if (!PhaseSpace.SetDecay(NucleiToDecay, nDecay, masses)) {
+    cout << "FORBIDDEN PHASE SPACE CHECK ENERGIES" << endl;
+    for (unsigned int i = 0; i < nDecay; i++) {
+      T[i]     = (PhaseSpace.GetDecay(i)->E() - masses[i]) * 1000.;
+      theta[i] = PhaseSpace.GetDecay(i)->Theta();
+      phi[i]   = PhaseSpace.GetDecay(i)->Phi();
+    }
+    exit(1);
+  } else {
+    PhaseSpace.Generate();
+    for (unsigned int i = 0; i < nDecay; i++) {
+      T[i]     = (PhaseSpace.GetDecay(i)->E() - masses[i]) * 1000.;
+      theta[i] = PhaseSpace.GetDecay(i)->Theta();
+      phi[i]   = PhaseSpace.GetDecay(i)->Phi();
+    }
+  }
+}
+
+TF1* NPS::ThreeBody::GetIntermediaryStateEnergy(double Er, double Width) {
+
+  TF1* f
+      = new TF1("f", "1. / (pow((x - [0]), 2.) + pow(([1] / 2.), 2.))", 0, 100);
+  f->SetParameter(0, Er);
+  f->SetParameter(1, Width);
+  f->SetNpx(1e6);
+  return f;
+}
diff --git a/NPSimulation/Process/ThreeBody.hh b/NPSimulation/Process/ThreeBody.hh
new file mode 100644
index 000000000..91a3ec1be
--- /dev/null
+++ b/NPSimulation/Process/ThreeBody.hh
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ * 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: Adrien MATTA  contact address: matta@lpccaen.in2p3.fr    *
+ *                                                                           *
+ * Creation Date  : Octobre 2017                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ * Use to kill the beam track and replace it with the reaction product       *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+#ifndef ThreeBody_h
+#define ThreeBody_h
+
+#include "G4VFastSimulationModel.hh"
+#include "NPReaction.h"
+#include "PhysicsList.hh"
+#include "TReactionConditions.h"
+
+#include "TF1.h"
+#include "TFile.h"
+
+class G4VPhysicalVolume;
+namespace NPS {
+class ThreeBody : public G4VFastSimulationModel {
+public:
+  ThreeBody(G4String, G4Region*);
+  ThreeBody(G4String);
+  ~ThreeBody();
+
+public:
+  void   ReadConfiguration();
+  G4bool IsApplicable(const G4ParticleDefinition&);
+  G4bool ModelTrigger(const G4FastTrack&);
+  void   DoIt(const G4FastTrack&, G4FastStep&);
+
+private:
+  NPL::Reaction m_Reaction;
+  string        m_BeamName;
+  double        m_PreviousEnergy;
+  double        m_PreviousLength;
+  bool          m_active; // is the process active
+  double        m_StepSize;
+
+private:
+  TReactionConditions* m_ReactionConditions;
+
+public:
+  void AttachReactionConditions();
+  void SetStepSize(double step) { m_StepSize = step; };
+
+public:
+  bool         m_end;
+  double       m_previousE;
+  std::string  m_type;
+  std::string  m_Beam;
+  std::string  m_TargetNucleus;
+  double       m_CompoundNucleusEnergy;
+  double       m_CompoundNucleusStateWidth;
+  std::string  m_IntermediaryNucleus;
+  double       m_IntermediaryState;
+  double       m_IntermediaryStateWidth;
+  std::string  m_Light1;
+  std::string  m_Heavy;
+  std::string  m_Light2;
+  double       m_ExcitationEnergyHeavy;
+  int          m_ShootLight1;
+  int          m_ShootLight2;
+  int          m_ShootHeavy;
+  NPL::Particle m_N1;
+  NPL::Particle m_N2;
+
+  NPL::Particle m_N3;
+  NPL::Particle m_N4;
+
+  NPL::Particle m_N5;
+  NPL::Particle m_N6;
+
+  bool        m_UserEnergyCS;
+  std::string m_EnergyCSPath;
+  std::string m_EnergyCSName;
+  TFile*      m_FileEnergyCS;
+  TF1*        m_EnergyCS;
+  double      m_EnergyCSMax;
+  TF1*        fIntermediaryStateEnergy;
+
+public: // Managing the decay
+        // Set everything for the decay
+  void GetDecay(TVector3 p, double Etot, unsigned int nDecay, double* masses,
+                double* T, double* theta, double* phi);
+  TF1* GetIntermediaryStateEnergy(double Er, double Width);
+};
+} // namespace NPS
+
+#endif
diff --git a/Projects/MultiParticleRES/.DS_Store b/Projects/MultiParticleRES/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..778fb5116f78b23a659c81f76fafdfb8fa17de68
GIT binary patch
literal 8196
zcmeHLU2GIp6h3EK;LenvOQp0pE?uleD20|ETLF=!KSBj9vi+yJ%<haZGM%YAv%4T^
ztZ#}0G`<=C;)@y+i4P?BWa3X^G~!Phe-eB!Mtw5z#Rp#0bLY+yyQL34ASTRB?mctP
zJ?GvzXTCFc&Hw;*70k^54FJHX3(9L~xJDE6qR(kcB&jBfWDgL4pDp>5S;x!H(T)Xi
z1mXz95r`uYM<9;C{~-c&W{bw=IrrskJjM}-BXCnjK)fH4)CEmNbXwBz)j>m80uU7?
zK-lP->VVKD8PQZkrzH(dX-!!@U}TC>iGk9b=95C5Xey%9l1g(xX$~0ej8TPx;qGLY
z4AlWslEz~kfj9zlBOuaeA@qR@lTfIr-!En-9orAu+rL4js(Qh~MQjnPVGpN|d8Kq<
z1O>m#$R8Hmfaf{c^0kp2vaM2vujuyNz_48_9~#)EMJnUNwrhH&F0bI4erTJP6HH}l
zhBur#wRQ96)?{aA$5d<b)b=gyt;ua$JEo>oR@c<F^HAovGvRutr5hN%3SdcvThCVd
z<oLyI`A?!sDf{$Y*(X)2(FccywG6K<(v9~|2Daz=Lss4=n&HcQa<DJwxd-!>m><r0
zPGQ3JGkkf@aB>C52&_GhleV9*{E@&q5s0fX-^&Nxq2h>5wnCQSyx?1hEHbc*Ru7r^
z9MyLg*ClRWyP^HA9rt$cJ#cVl$<k$9tJPKv7j56pI@VyxHiKiMhM%)s({_)JQMlZ|
ze$=+|>T+yV2V7&qn&B(!8&=(_>y_H&RYnR~`|*Muoa9Z6$vqnNH7dWr#!b4B2Ru`(
zXofR-qu$KeVIl9%TQo|swoY$Rxxof}@<lGOQEOAVuMQliXDUs%XxkV!)j`L|T8<QT
zYTFs#uMQVwK&7x&+r`w8oHsE+&iGQ6(z_V{ggqiQK4ADk|D@&8-omw>MqM8j@;#<$
zndCvk%6hK%>H8V~nvMC#jJ(xfBA}J!{fvbVj^tvcUegY|tCMLl$!)i26Nc##ODMCZ
z)H(^HFrrPVcFC!9F0F!1bPDZ*aj+;$PQn>D3+Lb!cmvME1$ZAmh0ov;d;v4?1N;QP
z!5{D^0wO9{gNtz~F2mcf8Q0>SxE1fgUAP-l*ozNhKR$$qa2SuEfjKnsG4wIOB9`z;
zd>Ws@)A$0ugfHW(_!^$ai}(S4h#%qScnQD6ukbSdjKAQoctuf^Dy3SfR~nQx%37sO
z-ndfEj#0^%M@2X`E8{6UqCa-Z=(VyV(bIe14a$!17mIvYUVF=my46kVHg2ITxr!PI
zvNEpziPsRKvw$5!G<>j?@REt6B?bw@)`|J@hc6Pj#%6?eV^T}-1%z_R-qB3#LPEG?
z*S91RT%p90?54Ja#;Yi8)X-LKNodh!N2jLoYDynDvr{J)B4&4r77@w7{yi*ThqvKf
zcn>}%Sbhta;Yau#uE1ZofM8gUs|bn-Tuo41j~lQRH)03gjXQ8B0kaqPVjtd*`*8q=
za0EwjEQF<nE>2=T1m_e%a~hu_Xr95dcn+V#=kY}X=$jRw+gFC0r1(}P=!)sQ>v--_
zl9z!x+a%_$djzWF4h^FI@16hu|8>8Qc!M|saRhE$1hBd%-P1+;&-W%4wRV#F5$d7|
yy=h596B@#DoM>2%6OGF8P&Y}c!X_2bX-P>!?LYq!F#Gc|KL6wMKg8k9HvA1LJqxD*

literal 0
HcmV?d00001

diff --git a/Projects/MultiParticleRES/Inputs/.DS_Store b/Projects/MultiParticleRES/Inputs/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6
GIT binary patch
literal 6148
zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3
zem<@ulZcFPQ@L2!n>{z**<q8>++&mCkOWA81W14cNZ<zv;LbK1Poaz?KmsK2CSc!(
z0ynLxE!0092;Krf2c+FF_Fe*7ECH>lEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ
zLs35+`xjp>T0<F0fCPF1$Cyrb|F7^5{eNG?83~ZUUlGt@xh*qZDeu<Z%US-OSsOPv
j)R!Z4KLME7ReXlK;d!wEw5GODWMKRea10D2@KpjYNUI8I

literal 0
HcmV?d00001

diff --git a/Projects/MultiParticleRES/Inputs/BW.root b/Projects/MultiParticleRES/Inputs/BW.root
new file mode 100644
index 0000000000000000000000000000000000000000..2838ace698508d1f053ff30ce8ec6fab773189ca
GIT binary patch
literal 6883
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
Te19FQ|A+5|jRfk+lLGiJiN-M7

literal 0
HcmV?d00001

diff --git a/Projects/MultiParticleRES/Inputs/ExampleSequential15F.detector b/Projects/MultiParticleRES/Inputs/ExampleSequential15F.detector
new file mode 100755
index 000000000..bfc19a7ed
--- /dev/null
+++ b/Projects/MultiParticleRES/Inputs/ExampleSequential15F.detector
@@ -0,0 +1,75 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Target
+ THICKNESS= 106.5 micrometer
+ RADIUS=  30 mm
+ MATERIAL= CH2
+ ANGLE= 0 deg
+ X= 0 mm
+ Y= 0 mm 
+ Z= 0 cm
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%
+% % Experiment thickness = 34um
+% beam_dump
+%  R= 830 mm
+%  THETA = 0
+%  PHI = 0 
+%  Thickness= 45 micrometer 
+% 
+%%%%%%% Telescope 1 DSSD5 %%%%%%%     
+M2Telescope      
+ X128_Y128=	-12.05	104.5	147.54
+ X128_Y1=	-102.43	104.7	111.59
+ X1_Y1=	-114.08	12.53	140.36
+ X1_Y128=	-23.71	12.32	176.3
+ SI= 1    
+ SILI= 0    
+ CSI= 1    
+ VIS= all
+
+%%%%%%% Telescope 2 DSSD 4 %%%%%%%     
+M2Telescope      
+ X128_Y128=	-114.49	-10.46	140.4
+ X128_Y1=	-103.09	-102.67	111.64
+ X1_Y1=	-12.56	-102.58	147.47
+ X1_Y128=	-23.97	-10.38	176.22
+ SI= 1    
+ SILI= 0    
+ CSI= 1    
+ VIS= all    
+     
+%%%%%%% Telescope 3 DSSD 7 %%%%%%%     
+M2Telescope      
+ X128_Y128=	13.11	-103.21	147.01
+ X128_Y1=	103.38	-103.24	110.82
+ X1_Y1=	114.96	-10.99	139.34
+ X1_Y128=	24.66	-10.9	175.56
+ SI= 1    
+ SILI= 0    
+ CSI= 1    
+ VIS= all
+     
+%%%%%%% Telescope 4 DSSD 11 %%%%%%%
+M2Telescope      
+ X128_Y128=	115.09	11.03	140.54
+ X128_Y1=	103.67	103.32	111.26
+ X1_Y1=	13.52	103.53	147.05
+ X1_Y128=	24.94	11.24	176.34
+ SI= 1    
+ SILI= 0    
+ CSI= 1    
+ VIS= all    
+
+% %%%%%%% Telescope 5 DSSD 2 %%%%%%%
+% M2Telescope
+%  X128_Y128=	-48.51	47.21	860.3
+%  X128_Y1=	-48.84	-50.07	860.45
+%  X1_Y1=	48.45	-50.36	860.26
+%  X1_Y128=	48.81	46.91	860.11
+%  SI= 1    
+%  SILI= 0    
+%  CSI= 1    
+%  VIS= all
+
+
+
diff --git a/Projects/MultiParticleRES/Inputs/ExampleSequential15F.reaction b/Projects/MultiParticleRES/Inputs/ExampleSequential15F.reaction
new file mode 100644
index 000000000..de9c8857e
--- /dev/null
+++ b/Projects/MultiParticleRES/Inputs/ExampleSequential15F.reaction
@@ -0,0 +1,38 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Beam
+ Particle= 14O
+ Energy= 103.885 MeV
+ %Energy= 93.8 MeV
+ SigmaEnergy= 0.005 MeV
+ SigmaThetaX= 0. deg
+ SigmaPhiY= 0. deg
+ %SigmaX= 7 mm
+ %SigmaY= 7 mm
+ SigmaX= 8 mm
+ SigmaY= 8 mm
+ MeanThetaX= 0. deg
+ MeanPhiY= 0. deg
+ MeanX= -4. mm
+ MeanY= -1. mm
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ThreeBody
+ Type= sequential
+ Beam= 14O
+ Target= 1H
+ CompoundNucleusEnergy= 6.3 MeV
+ CompoundNucleusStateWidth= 0.02 MeV
+ IntermediaryNucleus= 14O
+ IntermediaryState= 0 MeV
+ IntermediaryStateWidth= 0.01 MeV
+ Light1= 1H
+ Heavy= 13N
+ Light2= 1H
+ ExcitationEnergyHeavy= 0. MeV
+ ShootLight1= 1
+ ShootLight2= 1
+ ShootHeavy= 1
+ UserEnergyCS= 1
+ EnergyCSPath= $NPTOOL/Projects/MultiParticleRES/Inputs/BW.root
+ EnergyCSName= BW
diff --git a/Projects/MultiParticleRES/Inputs/simu.mac b/Projects/MultiParticleRES/Inputs/simu.mac
new file mode 100644
index 000000000..add2e059e
--- /dev/null
+++ b/Projects/MultiParticleRES/Inputs/simu.mac
@@ -0,0 +1,2 @@
+/run/beamOn 100000
+
diff --git a/Projects/MultiParticleRES/simu.sh b/Projects/MultiParticleRES/simu.sh
new file mode 100755
index 000000000..b85e7e901
--- /dev/null
+++ b/Projects/MultiParticleRES/simu.sh
@@ -0,0 +1,2 @@
+npsimulation -D Inputs/ExampleSequential15F.detector -E Inputs/ExampleSequential15F.reaction -B Inputs/simu.mac -O testMultiParticuleRES
+
diff --git a/Projects/MultiParticleRES/utilities/BW.root b/Projects/MultiParticleRES/utilities/BW.root
new file mode 100644
index 0000000000000000000000000000000000000000..2838ace698508d1f053ff30ce8ec6fab773189ca
GIT binary patch
literal 6883
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
Te19FQ|A+5|jRfk+lLGiJiN-M7

literal 0
HcmV?d00001

diff --git a/Projects/MultiParticleRES/utilities/ThreeBodyCS.cc b/Projects/MultiParticleRES/utilities/ThreeBodyCS.cc
new file mode 100644
index 000000000..5674aae83
--- /dev/null
+++ b/Projects/MultiParticleRES/utilities/ThreeBodyCS.cc
@@ -0,0 +1,267 @@
+/*****************************************************************************
+ * 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: V. Alcindor mail: valcindor@ikp.tu-darmstadt.de          *
+ *                                                                           *
+ * Creation Date  : July 2022                                          *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This files is for the generation of 15F Breit Wigner shape in the case   *
+ *  of the sequential 2p emission 14O+p -> 15F -> 14O(1-) + p -> 13N + p     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_sf_coulomb.h>
+
+// dirty way of avoiding a header or input file...
+namespace input_conditions {
+// Incoming beam, here 14O
+NPL::Particle Beam(8, 14);
+// Target particle, here protons
+NPL::Particle Target(1, 1);
+// Intermediate state in the sequential emission (14O(1-), Ex=5.173 MeV)
+NPL::Particle Intermediate(8, 14);
+double        IntermediateState = 5.173;
+// Final particle in the exit channel, here 13N
+NPL::Particle Final(7, 13);
+} // namespace input_conditions
+
+using namespace input_conditions;
+
+double CoulombFunction(std::string type, double E, double R, double mu,
+                       Int_t Z1, Int_t Z2, double L, Int_t k = 0) {
+  gsl_sf_result F_res;
+  gsl_sf_result Fp_res;
+  gsl_sf_result G_res;
+  gsl_sf_result Gp_res;
+  double        expF;
+  double        expG;
+  double        eta, rho;
+  eta = 0.15748 * Z1 * Z2 * sqrt(mu / E);
+  rho = 0.218735 * sqrt(mu * E) * R;
+  gsl_sf_coulomb_wave_FG_e(eta, rho, L, k, &F_res, &Fp_res, &G_res, &Gp_res,
+                           &expF, &expG);
+  if (type == "F")
+    return F_res.val * exp(expF);
+  else if (type == "G")
+    return G_res.val * exp(expG);
+  else
+    return 1;
+}
+
+double rho(double* E, double* par) {
+  double R      = par[0];
+  double mu_uma = par[1];
+
+  return R * .218735 * sqrt(mu_uma * E[0]);
+} // computation of the reduced variable for the penetrability
+
+double P_l(double* E, double* par) {
+
+  gsl_sf_result F_res;
+  gsl_sf_result Fp_res;
+  gsl_sf_result G_res;
+  gsl_sf_result Gp_res;
+
+  double R             = par[0];
+  double mu_uma        = par[1];
+  double Z1            = par[2];
+  double Z2            = par[3];
+  double L             = par[4];
+  double par_P[2]      = {par[0], par[1]};
+  double coulF         = CoulombFunction("F", E[0], R, mu_uma, Z1, Z2, L, 0);
+  double coulG         = CoulombFunction("G", E[0], R, mu_uma, Z1, Z2, L, 0);
+  double Penetrability = rho(E, par_P) / (pow(coulF, 2.) + pow(coulG, 2.));
+
+  return Penetrability;
+} // computation of the penetrability cf Abrahamovitz & Stegun Ch14 et C.
+
+double f_theoretical_proton_width(double* x, double* par) {
+  double Er = par[0];
+  double l  = par[1];
+  double z  = par[2];
+  double a  = par[3];
+  double Z  = par[4];
+  double A  = par[5];
+  double E  = x[0];
+
+  double r0 = 1.2; // fm
+  double R  = r0 * (pow(A, 1. / 3.) + pow(a, 1. / 3.)); // fm
+
+  double mBeam_uma = Beam.GetA();
+  +Beam.GetMassExcess() / 1000.;
+  double mTarget_uma = Target.GetA();
+  +Target.GetMassExcess() / 1000.;
+  double mCN_uma = (mBeam_uma * mTarget_uma) / (mBeam_uma + mTarget_uma);
+
+  double P_par[5] = {R, mCN_uma, z, Z, l};
+  double P        = P_l(&E, P_par);
+
+  double h_bar_c = 197.3; // MeV.fm
+  double max_proton_width
+      = 3. * pow(h_bar_c, 2.) / (((A * a) / (A + a) * 931.5) * pow(R, 2.));
+
+  double proton_width = max_proton_width * P;
+
+  if (E > 3.339 && E < 3.99) {
+    double x1 = 3.339;
+    double x2 = 3.99;
+    P         = P_l(&x1, P_par);
+    double y1 = max_proton_width * P;
+    P         = P_l(&x2, P_par);
+    double y2 = max_proton_width * P;
+
+    return (y1 - y2) / (x1 - x2) * E + (y2 - x2 * (y1 - y2) / (x1 - x2));
+  } // trying to correct GSLCoulomb problem in this region
+
+  return proton_width;
+} // Computation of proton width using COULOMB function from GSL
+
+double f_proton_width(double* x, double* par) {
+  double Er        = par[0];
+  double res_width = par[1];
+  double l         = par[2];
+  double z         = par[3];
+  double a         = par[4];
+  double Z         = par[5];
+  double A         = par[6];
+  double E         = x[0];
+
+  double r0 = 1.2; // fm
+  double R  = r0 * (pow(A, 1. / 3.) + pow(a, 1. / 3.)); // fm
+
+  double mBeam_uma   = Beam.GetA() + Beam.GetMassExcess() / 1000.;
+  double mTarget_uma = Target.GetA() + Target.GetMassExcess() / 1000.;
+  double mCN_uma     = (mBeam_uma * mTarget_uma) / (mBeam_uma + mTarget_uma);
+
+  double P_par[5] = {R, mCN_uma, z, Z, l};
+  double P        = P_l(&E, P_par);
+  double Pr       = P_l(&Er, P_par);
+
+  double proton_width = (res_width * P / Pr);
+
+  if (E > 3.339 && E < 3.99) {
+    double x1 = 3.339;
+    double x2 = 3.99;
+    P         = P_l(&x1, P_par);
+    double y1 = (res_width * P / Pr);
+    P         = P_l(&x2, P_par);
+    double y2 = (res_width * P / Pr);
+
+    return (y1 - y2) / (x1 - x2) * E + (y2 - x2 * (y1 - y2) / (x1 - x2));
+  } // trying to correct GSLCoulomb problem in this region for 15F
+
+  return proton_width;
+} // Computation of proton width using COULOMB function from GSL
+
+double f_double_sequential_proton_cross_section(double* x, double* par) {
+  double E = x[0]; // MeV
+  if (E < 0.) {
+    std::cerr << "ENERGY IS NEGATIVE" << std::endl;
+    return 1.;
+  } else {
+
+    double Er        = par[0]; // MeV
+    double res_width = par[1]; // MeV
+
+    double J1 = par[2];
+    double J2 = par[3];
+    double J  = J1 + J2;
+    double w  = (2. * J + 1.) / ((2. * J1 + 1.) * (2. * J2 + 1.));
+
+    double li = par[4];
+    double lf = par[5];
+
+    double p      = std::sqrt(2. * 14. / 15. * E); // MeV/c
+    double h      = 4.14e-15 * 1.0e-6; // MeV.s
+    double lambda = (h / p);
+
+    double EFinal = Beam.GetBindingEnergy() - Final.GetBindingEnergy();
+
+    // Width of the entrance channel
+    double x_Gp1[1]   = {E};
+    double par_Gp1[7] = {Er,
+                         res_width,
+                         li,
+                         (double)Target.GetZ(),
+                         (double)Target.GetA(),
+                         (double)Beam.GetZ(),
+                         (double)Beam.GetA()};
+    double Gp1        = f_proton_width(x_Gp1, par_Gp1);
+
+    // Width of the direct 2p channel
+    double Gp2 = 0.;
+    if (E - EFinal > 0.) {
+      double x_Gp2[1] = {E - EFinal};
+      // 2*Target because I considered that 2p = 1H + 1H, so Z=2, A=2
+      double par_Gp2[6] = {Er - EFinal,
+                           lf,
+                           2 * (double)Target.GetZ(),
+                           2 * (double)Target.GetA(),
+                           (double)Final.GetZ(),
+                           (double)Final.GetA()};
+      Gp2               = f_theoretical_proton_width(x_Gp2, par_Gp2);
+    }
+
+    // Width of the sequential 2p channel
+    double EIntermediate = Intermediate.GetExcitationEnergy();
+    Intermediate.SetExcitationEnergy(IntermediateState);
+    double Gp3 = 1.e-3;
+    if (E - EIntermediate < 0.) {
+      Gp3 = 0.;
+    } else if (E - EIntermediate > 0.) {
+      double x_Gp3[1]   = {E - EIntermediate};
+      double par_Gp3[6] = {Er - EIntermediate,    lf,
+                           (double)Target.GetZ(), (double)Target.GetA(),
+                           (double)Beam.GetZ(),   (double)Beam.GetA()};
+      Gp3               = f_theoretical_proton_width(x_Gp3, par_Gp3);
+    }
+
+    double Gt = Gp1 + Gp2 + Gp3;
+
+    double mBeam_uma   = Beam.GetA() + Beam.GetMassExcess() / 1000.;
+    double mTarget_uma = Target.GetA() + Target.GetMassExcess() / 1000.;
+    double mCN_uma     = (mBeam_uma * mTarget_uma) / (mBeam_uma + mTarget_uma);
+
+    double CN_formation = 0.657 / (mCN_uma * E) * w * (Gp1 * Gt)
+                          / (pow((E - Er), 2.) + 1. / 4. * pow(Gt, 2.));
+    double CN_decay         = Gp3 / Gt;
+    double BW_cross_section = CN_formation * CN_decay;
+    return BW_cross_section;
+  }
+} // Breit-Wigner cross section of the reaction 14O(p,p)14O(p)13N
+
+// "Main of thsd
+void ThreeBodyCS(double Er = 6.3, double res_width = 0.02, int Npx = 1000) {
+
+  // Generating BW cross section for the 15F sequential emission, here 14O is
+  // taken as the reference, E(14Og.s.) = 0 MeV, as a consequence, the ground
+  // state of 13N is 4.628 MeV.
+
+  double J1 = 0.;
+  double J2 = 5. / 2.;
+  double li = 3.;
+  double lf = 2.;
+
+  TF1* g_double_cross_section
+      = new TF1("g_double_sequential_cross_section",
+                f_double_sequential_proton_cross_section, 0.1, 10.1, 6, 1);
+
+  g_double_cross_section->SetParameters(Er, res_width, J1, J2, li, lf);
+  g_double_cross_section->SetNpx(Npx);
+  g_double_cross_section->Draw();
+  g_double_cross_section->SetName("BW");
+  TFile* fout = new TFile("BW.root", "recreate");
+  g_double_cross_section->Write();
+}
diff --git a/Projects/MultiParticleRES/utilities/rootlogon.C b/Projects/MultiParticleRES/utilities/rootlogon.C
new file mode 100644
index 000000000..9f03d73f9
--- /dev/null
+++ b/Projects/MultiParticleRES/utilities/rootlogon.C
@@ -0,0 +1 @@
+{ int status = gSystem->Load("libgsl"); }
-- 
GitLab