diff --git a/.gitignore b/.gitignore index 971d6cf..b494a64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /cmake-build-debug/ /.idea/ + +*.DS_Store diff --git a/CMakeLists.txt b/CMakeLists.txt index f0c0e33..ae42d0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,8 +34,21 @@ find_library(MCINI NAMES McIniData PATHS $ENV{MCINI}/build) #---------------------------------------------------------------------------- # Locate sources and headers for this project # -file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc ${PROJECT_SOURCE_DIR}/FermiBreakUp/*.cc ${PROJECT_SOURCE_DIR}/photon_evaporation/src/*.cc ${PROJECT_SOURCE_DIR}/Evaporation/src/*.cc ${PROJECT_SOURCE_DIR}/Fission/src/*.cc ${PROJECT_SOURCE_DIR}/Multifragmentation/src/*.cc) # ${PROJECT_SOURCE_DIR}/Abla/src/*.cc) -file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh ${PROJECT_SOURCE_DIR}/FermiBreakUp/*.hh ${PROJECT_SOURCE_DIR}/photon_evaporation/include/*.hh ${PROJECT_SOURCE_DIR}/Evaporation/include/*.hh ${PROJECT_SOURCE_DIR}/Fission/include/*.hh ${PROJECT_SOURCE_DIR}/Multifragmentation/include/*.hh) #${PROJECT_SOURCE_DIR}/Abla/include/*.hh) +file(GLOB sources + ${PROJECT_SOURCE_DIR}/src/*.cc + ${PROJECT_SOURCE_DIR}/photon_evaporation/src/*.cc + ${PROJECT_SOURCE_DIR}/Evaporation/src/*.cc + ${PROJECT_SOURCE_DIR}/Fission/src/*.cc + ${PROJECT_SOURCE_DIR}/Multifragmentation/src/*.cc + ${PROJECT_SOURCE_DIR}/PureNeutrons/src/*.cc) # ${PROJECT_SOURCE_DIR}/Abla/src/*.cc) + +file(GLOB headers + ${PROJECT_SOURCE_DIR}/include/*.hh + ${PROJECT_SOURCE_DIR}/photon_evaporation/include/*.hh + ${PROJECT_SOURCE_DIR}/Evaporation/include/*.hh + ${PROJECT_SOURCE_DIR}/Fission/include/*.hh + ${PROJECT_SOURCE_DIR}/Multifragmentation/include/*.hh + ${PROJECT_SOURCE_DIR}/PureNeutrons/include/*.hh) #${PROJECT_SOURCE_DIR}/Abla/include/*.hh) include_directories(ROOT_BUG) include_directories(/usr/local/include) @@ -49,16 +62,18 @@ include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/Fission/include/ ${PROJECT_SOURCE_DIR}/Multifragmentation/include/ ${PROJECT_SOURCE_DIR}/photon_evaporation/include/ + ${PROJECT_SOURCE_DIR} ${Geant4_INCLUDE_DIR} ${ROOT_INCLUDE_DIRS}) add_subdirectory(TGlauber) +add_subdirectory(FermiBreakUp) link_directories(${ROOT_LIBRARY_DIR}) link_directories(/usr/local/lib) #---------------------------------------------------------------------------- # Add the executable, and link it to the Geant4 libraries add_executable(GRATE GRATE.cc ${sources} ${headers}) #target_link_libraries(GRATE TGlauNucleon TGlauNucleus TGlauberMC ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} TGlauberLib) -target_link_libraries(GRATE ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} TGlauberLib McIniData) +target_link_libraries(GRATE ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} TGlauberLib McIniData AAMCCFermiBreakUp) #---------------------------------------------------------------------------- # Install the executable to 'bin' directory under CMAKE_INSTALL_PREFIX diff --git a/FermiBreakUp/AAMCCFermiBreakUp.cc b/FermiBreakUp/AAMCCFermiBreakUp.cc new file mode 100644 index 0000000..09ed0b0 --- /dev/null +++ b/FermiBreakUp/AAMCCFermiBreakUp.cc @@ -0,0 +1,35 @@ +// +// Created by Artem Novikov on 20.05.2023. +// + +#include + +#include "G4Fragment.hh" +#include "AAMCCFermiBreakUp.hh" +#include "FermiBreakUp.h" + +AAMCCFermiBreakUp::AAMCCFermiBreakUp() : fermi_model_(std::make_unique()) {} + +AAMCCFermiBreakUp::AAMCCFermiBreakUp(std::unique_ptr&& model) : fermi_model_(std::move(model)) {} + +void AAMCCFermiBreakUp::BreakFragment(G4FragmentVector* fragments_ptr, G4Fragment* fragment) { + auto results = fermi_model_->BreakItUp(FermiParticle(MassNumber(fragment->GetA_asInt()), + ChargeNumber(fragment->GetZ_asInt()), + fragment->GetMomentum())); + + for (auto& particle : results) { + fragments_ptr->push_back(new G4Fragment(G4int(particle.GetMassNumber()), + G4int(particle.GetChargeNumber()), + G4LorentzVector(particle.GetMomentum()))); + } +} + +void AAMCCFermiBreakUp::Initialise() {} + +G4bool AAMCCFermiBreakUp::IsFermiPossible(G4int Z, G4int A, [[maybe_unused]] G4double excitation_energy) { + return Z < 9 && A < 19; +} + +G4bool AAMCCFermiBreakUp::IsApplicable(G4int Z, G4int A, G4double excitation_energy) const { + return IsFermiPossible(Z, A, excitation_energy); +} diff --git a/FermiBreakUp/AAMCCFermiBreakUp.hh b/FermiBreakUp/AAMCCFermiBreakUp.hh new file mode 100644 index 0000000..6ee8b4e --- /dev/null +++ b/FermiBreakUp/AAMCCFermiBreakUp.hh @@ -0,0 +1,31 @@ +// +// Created by Artem Novikov on 20.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_AAMCCFERMIBREAKUP_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_AAMCCFERMIBREAKUP_H_ + +#include + +#include "G4VFermiBreakUp.hh" +#include "VFermiBreakUp.h" + +class AAMCCFermiBreakUp : public G4VFermiBreakUp { + public: + AAMCCFermiBreakUp(); + + AAMCCFermiBreakUp(std::unique_ptr&& model); + + void Initialise() override; + + void BreakFragment(G4FragmentVector* fragments_ptr, G4Fragment* fragment) override; + + static G4bool IsFermiPossible(G4int Z, G4int A, G4double excitation_energy); + + G4bool IsApplicable(G4int Z, G4int A, G4double excitation_energy) const override; + + private: + std::unique_ptr fermi_model_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_AAMCCFERMIBREAKUP_H_ diff --git a/FermiBreakUp/CMakeLists.txt b/FermiBreakUp/CMakeLists.txt new file mode 100644 index 0000000..540ced2 --- /dev/null +++ b/FermiBreakUp/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.16) +project(AAMCCFermiBreakUp) + +set(CMAKE_CXX_STANDARD 17) + +set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic -Werror") + +find_package(Geant4 REQUIRED) + +include(${Geant4_USE_FILE}) + +add_library(AAMCCFermiBreakUp STATIC AAMCCFermiBreakUp.cc) + +add_subdirectory(lib) +target_link_libraries(AAMCCFermiBreakUp FermiBreakUp ${Geant4_LIBRARIES}) + diff --git a/FermiBreakUp/G4B9FermiFragment.cc b/FermiBreakUp/G4B9FermiFragment.cc deleted file mode 100644 index 03ad113..0000000 --- a/FermiBreakUp/G4B9FermiFragment.cc +++ /dev/null @@ -1,95 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4B9FermiFragment.cc,v 1.7 2006/06/29 20:12:39 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4B9FermiFragment.hh" -#include "G4IonTable.hh" -#include "G4HadronicException.hh" - -G4B9FermiFragment::G4B9FermiFragment() -{ -} - -G4B9FermiFragment::G4B9FermiFragment(const G4B9FermiFragment &) : G4UnstableFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4B9FermiFragment::copy_constructor meant to not be accessable"); -} - - -G4B9FermiFragment::~G4B9FermiFragment() -{ -} - - -const G4B9FermiFragment & G4B9FermiFragment::operator=(const G4B9FermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4B9FermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4B9FermiFragment::operator==(const G4B9FermiFragment &) const -{ - return false; -} - -G4bool G4B9FermiFragment::operator!=(const G4B9FermiFragment &) const -{ - return true; -} - - - -G4B9FermiFragment::G4B9FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4UnstableFermiFragment(anA,aZ,Pol,ExE) -{ - // B9 ----> alpha + alpha + proton - - G4double alpha_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(2,4); - G4double proton_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(1,1); - - G4double b9_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(5,9); - //std::cout << "Hello from G4B9FermiFragment, Q = " << (b9_mass - 2.*alpha_mass - proton_mass)/keV <<" keV"<< '\n'; - - - Masses.push_back(alpha_mass); - Masses.push_back(alpha_mass); - Masses.push_back(proton_mass); - - AtomNum.push_back(4); - AtomNum.push_back(4); - AtomNum.push_back(1); - - Charges.push_back(2); - Charges.push_back(2); - Charges.push_back(1); - -} diff --git a/FermiBreakUp/G4B9FermiFragment.hh b/FermiBreakUp/G4B9FermiFragment.hh deleted file mode 100644 index 98a1389..0000000 --- a/FermiBreakUp/G4B9FermiFragment.hh +++ /dev/null @@ -1,59 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4B9FermiFragment.hh,v 1.3 2006/06/29 20:10:55 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4B9FermiFragment_h -#define G4B9FermiFragment_h 1 - -#include "G4UnstableFermiFragment.hh" - -class G4B9FermiFragment : public G4UnstableFermiFragment -{ -public: - G4B9FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE); - - virtual ~G4B9FermiFragment(); - -private: - G4B9FermiFragment(); - - G4B9FermiFragment(const G4B9FermiFragment &right); - - const G4B9FermiFragment & operator=(const G4B9FermiFragment &right); - G4bool operator==(const G4B9FermiFragment &right) const; - G4bool operator!=(const G4B9FermiFragment &right) const; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4Be8FermiFragment.cc b/FermiBreakUp/G4Be8FermiFragment.cc deleted file mode 100644 index 93ec775..0000000 --- a/FermiBreakUp/G4Be8FermiFragment.cc +++ /dev/null @@ -1,91 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4Be8FermiFragment.cc,v 1.7 2006/06/29 20:12:46 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4Be8FermiFragment.hh" -#include "G4IonTable.hh" -#include "G4HadronicException.hh" -#include "G4PhysicalConstants.hh" - -G4Be8FermiFragment::G4Be8FermiFragment() -{ -} - -G4Be8FermiFragment::G4Be8FermiFragment(const G4Be8FermiFragment &) : G4UnstableFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4Be8FermiFragment::copy_constructor meant to not be accessable"); -} - - -G4Be8FermiFragment::~G4Be8FermiFragment() -{ -} - - -const G4Be8FermiFragment & G4Be8FermiFragment::operator=(const G4Be8FermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4Be8FermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4Be8FermiFragment::operator==(const G4Be8FermiFragment &) const -{ - return false; -} - -G4bool G4Be8FermiFragment::operator!=(const G4Be8FermiFragment &) const -{ - return true; -} - - - -G4Be8FermiFragment::G4Be8FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4UnstableFermiFragment(anA,aZ,Pol,ExE) -{ - // Be8 ----> alpha + alpha - G4double alpha_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(2,4); - - G4double be8_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(4,8); - //std::cout << "Hello from G4Be8FermiFragment, Q = " << (be8_mass - 2.*alpha_mass)/keV <<" keV"<< '\n'; - - - Masses.push_back(alpha_mass); - Masses.push_back(alpha_mass); - - AtomNum.push_back(4); - AtomNum.push_back(4); - - Charges.push_back(2); - Charges.push_back(2); - -} diff --git a/FermiBreakUp/G4Be8FermiFragment.hh b/FermiBreakUp/G4Be8FermiFragment.hh deleted file mode 100644 index a7e708a..0000000 --- a/FermiBreakUp/G4Be8FermiFragment.hh +++ /dev/null @@ -1,60 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4Be8FermiFragment.hh,v 1.3 2006/06/29 20:10:57 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4Be8FermiFragment_h -#define G4Be8FermiFragment_h 1 - -#include "G4UnstableFermiFragment.hh" - - -class G4Be8FermiFragment : public G4UnstableFermiFragment -{ -public: - G4Be8FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE); - - virtual ~G4Be8FermiFragment(); - -private: - G4Be8FermiFragment(); - - G4Be8FermiFragment(const G4Be8FermiFragment &right); - - const G4Be8FermiFragment & operator=(const G4Be8FermiFragment &right); - G4bool operator==(const G4Be8FermiFragment &right) const; - G4bool operator!=(const G4Be8FermiFragment &right) const; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4FermiBreakUp.cc b/FermiBreakUp/G4FermiBreakUp.cc deleted file mode 100644 index 2ecbc51..0000000 --- a/FermiBreakUp/G4FermiBreakUp.cc +++ /dev/null @@ -1,116 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4FermiBreakUp.hh" -#include "G4HadronicException.hh" - -G4FermiBreakUp::G4FermiBreakUp() -{ -} - -G4FermiBreakUp::G4FermiBreakUp(const G4FermiBreakUp &) : VFermiBreakUp() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4FermiBreakUp::copy_constructor meant to not be accessable"); -} - - -G4FermiBreakUp::~G4FermiBreakUp() -{ -} - - -const G4FermiBreakUp & G4FermiBreakUp::operator=(const G4FermiBreakUp &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4FermiBreakUp::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4FermiBreakUp::operator==(const G4FermiBreakUp &) const -{ - return false; -} - -G4bool G4FermiBreakUp::operator!=(const G4FermiBreakUp &) const -{ - return true; -} - - - -G4FragmentVector * G4FermiBreakUp::BreakItUp(const G4Fragment &theNucleus) -{ - // CHECK that Excitation Energy > 0 - if (theNucleus.GetExcitationEnergy() <= 0) - { - G4FragmentVector * theResult = new G4FragmentVector; - theResult->push_back(new G4Fragment(theNucleus)); - return theResult; - } - - // Total energy of nucleus in nucleus rest frame - G4double TotalEnergyRF = theNucleus.GetMomentum().m(); - // G4double TotalEnergyRF = theNucleus.GetExcitationEnergy() + - // G4ParticleTable::GetParticleTable()->GetIonTable()-> - // GetIonMass(static_cast(theNucleus.GetZ()),static_cast(theNucleus.GetA())); - - - G4FermiConfigurationList theConfigurationList; - - - // Split the nucleus - G4bool Split = theConfigurationList.Initialize(static_cast(theNucleus.GetA()), - static_cast(theNucleus.GetZ()), - TotalEnergyRF); - if ( !Split ) - { - G4FragmentVector * theResult = new G4FragmentVector; - theResult->push_back(new G4Fragment(theNucleus)); - - return theResult; - } - - // Chose a configuration - G4FermiConfiguration theConfiguration(theConfigurationList.ChooseConfiguration()); - - - // Get the fragments corresponding to chosen configuration. - G4FragmentVector * theResult = theConfiguration.GetFragments(theNucleus); -#ifdef PRECOMPOUND_TEST - for (G4FragmentVector::iterator i = theResult->begin(); i != theResult->end(); i++) - { - (*i)->SetCreatorModel("G4FermiBreakUp"); - } -#endif - return theResult; - -} - - diff --git a/FermiBreakUp/G4FermiBreakUp.hh b/FermiBreakUp/G4FermiBreakUp.hh deleted file mode 100644 index 25414a4..0000000 --- a/FermiBreakUp/G4FermiBreakUp.hh +++ /dev/null @@ -1,63 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4FermiBreakUp.hh,v 1.3 2006/06/29 20:11:17 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4FermiBreakUp_h -#define G4FermiBreakUp_h 1 - -#include "VFermiBreakUp.hh" -//#include "G4VFermiBreakUp.hh" -#include "G4FermiConfiguration.hh" -#include "G4FermiConfigurationList.hh" -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" - -class G4FermiBreakUp : public VFermiBreakUp -{ -public: - G4FermiBreakUp(); - ~G4FermiBreakUp(); - -private: - G4FermiBreakUp(const G4FermiBreakUp &right); - - const G4FermiBreakUp & operator=(const G4FermiBreakUp &right); - G4bool operator==(const G4FermiBreakUp &right) const; - G4bool operator!=(const G4FermiBreakUp &right) const; - -public: - G4FragmentVector * BreakItUp(const G4Fragment &theNucleus); -}; - - -#endif - - diff --git a/FermiBreakUp/G4FermiConfiguration.cc b/FermiBreakUp/G4FermiConfiguration.cc deleted file mode 100644 index e4ef83e..0000000 --- a/FermiBreakUp/G4FermiConfiguration.cc +++ /dev/null @@ -1,213 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4FermiConfiguration.cc,v 1.9 2006/06/29 20:12:52 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) -// -// - - -#include "G4FermiConfiguration.hh" -#include "G4FermiPhaseSpaceDecay.hh" -#include - -// Kappa = V/V_0 it is used in calculation of Coulomb energy -// Kappa is adimensional -const G4double G4FermiConfiguration::Kappa = 1.0; - -// r0 is the nuclear radius -const G4double G4FermiConfiguration::r0 = 1.3*fermi; - - -G4double G4FermiConfiguration::CoulombBarrier(void) -{ - // Calculates Coulomb Barrier (MeV) for given channel with K fragments. - const G4double Coef = (3./5.)*(elm_coupling/r0)*std::pow(1./(1.+Kappa), 1./3.); - - G4double SumA = 0; - G4double SumZ = 0; - G4double CoulombEnergy = 0.; - for (std::vector::iterator i = Configuration.begin(); - i != Configuration.end(); i++) - { - G4double z = static_cast((*i)->GetZ()); - G4double a = static_cast((*i)->GetA()); - CoulombEnergy += (z*z) / std::pow(a, 1./3.); - SumA += a; - SumZ += z; - } - CoulombEnergy -= SumZ*SumZ/std::pow(SumA, 1./3.); - return -Coef * CoulombEnergy; -} - - - - -G4double G4FermiConfiguration::DecayProbability(const G4int A, const G4double TotalE) - // Decay probability for a given channel with K fragments -{ - // A: Atomic Weight - // TotalE: Total energy of nucleus - - - G4double KineticEnergy = TotalE; // MeV - G4double ProdMass = 1.0; - G4double SumMass = 0.0; - G4double S_n = 1.0; - std::set combSet; - std::multiset combmSet; - - for (std::vector::iterator i = Configuration.begin(); - i != Configuration.end(); i++) - { - G4int a = (*i)->GetA(); - combSet.insert(a); - combmSet.insert(a); - G4double m = (*i)->GetFragmentMass(); - ProdMass *= m; - SumMass += m; - // Spin factor S_n - S_n *= (*i)->GetPolarization(); - KineticEnergy -= m + (*i)->GetExcitationEnergy(); - } - - // Check that there is enough energy to produce K fragments - if (KineticEnergy <= 0.0) return 0.0; - if ((KineticEnergy -= this->CoulombBarrier()) <= 0.0) return 0.0; - - - G4double MassFactor = ProdMass/SumMass; - MassFactor *= std::sqrt(MassFactor); - - // Number of fragments - G4int K = Configuration.size(); - - // This is the constant (doesn't depend on nucleus) part - const G4double ConstCoeff = std::pow(r0/hbarc,3.0)*Kappa*std::sqrt(2.0/pi)/3.0; - G4double Coeff = std::pow(ConstCoeff*A,K-1); - - - // Calculation of 1/Gamma(3(k-1)/2) - G4double Gamma = 1.0; - G4double arg = 3.0*(K-1)/2.0 - 1.0; - while (arg > 1.1) - { - Gamma *= arg; - arg--; - } - if ((K-1)%2 == 1) Gamma *= std::sqrt(pi); - - - - // Permutation Factor G_n - G4double G_n = 1.0; - for (std::set::iterator s = combSet.begin(); s != combSet.end(); ++s) - { - for (G4int ni = combmSet.count(*s); ni > 1; ni--) G_n *= ni; - } - - G4double Weight = Coeff * MassFactor * (S_n / G_n) / Gamma; - Weight *= std::pow(KineticEnergy,3.0*(K-1)/2.0)/KineticEnergy; - - return Weight; -} - - -G4FragmentVector * G4FermiConfiguration::GetFragments(const G4Fragment & theNucleus) -{ - - G4FermiPhaseSpaceDecay thePhaseSpace; - - // Calculate Momenta of K fragments - G4double M = theNucleus.GetMomentum().m(); - std::vector m; - m.reserve(Configuration.size()); - std::vector::iterator i; - for (i = Configuration.begin(); i != Configuration.end(); ++i) - { - m.push_back( (*i)->GetTotalEnergy() ); - } - std::vector* MomentumComponents = - thePhaseSpace.Decay(M,m); - - G4FragmentVector * theResult = new G4FragmentVector; - - G4ThreeVector boostVector = theNucleus.GetMomentum().boostVector(); - - - // Go back to the Lab Frame - for (i = Configuration.begin(); i != Configuration.end(); ++i) - { -#ifdef G4NO_ISO_VECDIST - std::vector::difference_type n = 0; - std::distance(Configuration.begin(), i, n); - G4LorentzVector FourMomentum(*(MomentumComponents->operator[](n))); -#else - G4LorentzVector FourMomentum(*(MomentumComponents-> - operator[](std::distance(Configuration.begin(),i)))); -#endif - - // Lorentz boost - FourMomentum.boost(boostVector); - - G4FragmentVector * fragment = (*i)->GetFragment(FourMomentum); - - - for (G4FragmentVector::reverse_iterator ri = fragment->rbegin(); - ri != fragment->rend(); ++ri) - { - theResult->push_back(*ri); - } - delete fragment; - } - - if (!MomentumComponents->empty()) - { - std::for_each(MomentumComponents->begin(),MomentumComponents->end(), - DeleteFragment()); - } - - delete MomentumComponents; - - return theResult; -} - - -G4ParticleMomentum G4FermiConfiguration::IsotropicVector(const G4double Magnitude) - // Samples a isotropic random vectorwith a magnitud given by Magnitude. - // By default Magnitude = 1.0 -{ - G4double CosTheta = 1.0 - 2.0*G4UniformRand(); - G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta); - G4double Phi = twopi*G4UniformRand(); - G4ParticleMomentum Vector(Magnitude*std::cos(Phi)*SinTheta, - Magnitude*std::sin(Phi)*SinTheta, - Magnitude*CosTheta); - return Vector; -} diff --git a/FermiBreakUp/G4FermiConfiguration.hh b/FermiBreakUp/G4FermiConfiguration.hh deleted file mode 100644 index c09ecc2..0000000 --- a/FermiBreakUp/G4FermiConfiguration.hh +++ /dev/null @@ -1,102 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4FermiConfiguration.hh,v 1.4 2006/06/29 20:11:44 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4FermiConfiguration_h -#define G4FermiConfiguration_h 1 - -#include - -#include "globals.hh" -#include "Randomize.hh" -#include "G4VFermiFragment.hh" -#include "G4ParticleMomentum.hh" -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" -#include "G4Fragment.hh" - -using namespace CLHEP; - -class G4FermiConfiguration -{ -public: - // Constructors - inline G4FermiConfiguration(); - inline ~G4FermiConfiguration(); - inline G4FermiConfiguration(const std::vector&); - inline G4FermiConfiguration(const G4FermiConfiguration &); - - // Operators - inline const G4FermiConfiguration & operator=(const G4FermiConfiguration &); - inline G4bool operator==(const G4FermiConfiguration &) const; - inline G4bool operator!=(const G4FermiConfiguration &) const; - - - inline void SetConfiguration(const std::vector&); - - G4double DecayProbability(const G4int A, const G4double TotalE); - - G4FragmentVector * GetFragments(const G4Fragment & theNucleus); - - inline G4int GetNumberOfFragments() const; - -private: - - G4double CoulombBarrier(void); - - G4ParticleMomentum IsotropicVector(const G4double Magnitude = 1.0); - - -private: - // Kappa = V/V_0 it is used in calculation of Coulomb energy - static const G4double Kappa; - - // Nuclear radius r0 (is a model parameter) - static const G4double r0; - - std::vector Configuration; - - struct DeleteFragment - { - template - void operator()(const T* ptr) const - { - delete ptr; - } - }; - -}; - -#include "G4FermiConfiguration.icc" - -#endif - - diff --git a/FermiBreakUp/G4FermiConfiguration.icc b/FermiBreakUp/G4FermiConfiguration.icc deleted file mode 100644 index 9ea6a31..0000000 --- a/FermiBreakUp/G4FermiConfiguration.icc +++ /dev/null @@ -1,83 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// By V. Lara - - -inline G4FermiConfiguration::G4FermiConfiguration() -{ -} - -inline G4FermiConfiguration::~G4FermiConfiguration() -{ -} - - -inline G4FermiConfiguration::G4FermiConfiguration(const G4FermiConfiguration &right) - : Configuration(right.Configuration) -{ -} - - -inline G4FermiConfiguration::G4FermiConfiguration(const std::vector& conf) - : Configuration(conf) -{ -} - -inline const G4FermiConfiguration & G4FermiConfiguration:: -operator=(const G4FermiConfiguration & right) -{ - Configuration.clear(); - Configuration.reserve(right.Configuration.size()); - Configuration.insert(Configuration.begin(),right.Configuration.begin(),right.Configuration.end()); - return *this; -} - - -inline G4bool G4FermiConfiguration::operator==(const G4FermiConfiguration &right) const -{ - return (Configuration == right.Configuration); -} - -inline G4bool G4FermiConfiguration::operator!=(const G4FermiConfiguration &right) const -{ - return (Configuration != right.Configuration); -} - -inline void G4FermiConfiguration:: -SetConfiguration(const std::vector& conf) -{ - Configuration.clear(); - Configuration = conf; - return; -} - -inline G4int G4FermiConfiguration:: -GetNumberOfFragments() const -{ - return Configuration.size(); -} diff --git a/FermiBreakUp/G4FermiConfigurationList.cc b/FermiBreakUp/G4FermiConfigurationList.cc deleted file mode 100644 index d58592a..0000000 --- a/FermiBreakUp/G4FermiConfigurationList.cc +++ /dev/null @@ -1,141 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4FermiConfigurationList.hh" -#include "G4FermiSplitter.hh" -#include "G4HadronicException.hh" - -G4FermiFragmentsPool & G4FermiConfigurationList::GetFragmentsPoolInstance() -{ - static G4FermiFragmentsPool theFragmentsPool; - return theFragmentsPool; -} - -G4FermiConfigurationList::G4FermiConfigurationList() -{ -} - -G4FermiConfigurationList::G4FermiConfigurationList(const G4FermiConfigurationList &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4FermiConfigurationList::copy_constructor meant to not be accessable"); -} - - -const G4FermiConfigurationList & G4FermiConfigurationList:: -operator=(const G4FermiConfigurationList &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4FermiConfigurationList::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4FermiConfigurationList::operator==(const G4FermiConfigurationList &) const -{ - return false; -} - -G4bool G4FermiConfigurationList::operator!=(const G4FermiConfigurationList &) const -{ - return true; -} - - - -G4bool G4FermiConfigurationList:: -Initialize(const G4int A, const G4int Z, const G4double TotalEnergyRF) -{ - // - // let's split nucleus into k = 2,...,A fragments - // - Configurations.clear(); - NormalizedWeights.clear(); - G4FermiSplitter aSplitter(&GetFragmentsPoolInstance()); - G4double NormStatWeight = 0.0; - for (G4int k = 2; k <= A; k++) - { - // Initialize Configuration for k fragments - aSplitter.Initialize(A,Z,k); - for (G4int i = 0; i < aSplitter.GetNumberOfSplits(); i++) - { - // Create a configuration from a split - G4FermiConfiguration * aConfiguration = new G4FermiConfiguration(aSplitter.GetSplit(i)); - - // Store configuration - Configurations.push_back(aConfiguration); - - // Non-Normalized statistical weight for given channel with k fragments - G4double StatWeight = aConfiguration->DecayProbability(A,TotalEnergyRF); - NormStatWeight += StatWeight; - // Statistical weights (it will be normalized...) - NormalizedWeights.push_back(StatWeight); - } - } - - if (NormStatWeight > 0.0) - { - // Let's normalize statistical weights of channels - std::transform(NormalizedWeights.begin(), NormalizedWeights.end(), - NormalizedWeights.begin(), - std::bind2nd(std::divides(),NormStatWeight)); - return true; - } - - return false; -} - - - -G4FermiConfiguration G4FermiConfigurationList::ChooseConfiguration(void) -{ - G4double RandomWeight = G4UniformRand(); - G4double AcumWeight = 0.0; - std::vector::iterator thisConfig; - for (thisConfig = NormalizedWeights.begin(); thisConfig != NormalizedWeights.end(); ++thisConfig) - { - // We are adding the prob. of each configuration - AcumWeight += *thisConfig; - if (AcumWeight >= RandomWeight) break; - } - if (thisConfig == NormalizedWeights.end()) - { - throw G4HadronicException(__FILE__, __LINE__, "G4FermiConfigurationList::ChooseConfigration: Cannot choose a configuration"); - G4FermiConfiguration dummy; - return dummy; - } - else - { -#ifdef G4NO_ISO_VECDIST - std::vector::difference_type n = 0; - std::distance(NormalizedWeights.begin(),thisConfig,n); - return *(Configurations[n]); -#else - return *(Configurations[std::distance(NormalizedWeights.begin(),thisConfig)]); -#endif - } -} diff --git a/FermiBreakUp/G4FermiConfigurationList.hh b/FermiBreakUp/G4FermiConfigurationList.hh deleted file mode 100644 index 0ddcaec..0000000 --- a/FermiBreakUp/G4FermiConfigurationList.hh +++ /dev/null @@ -1,91 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4FermiConfigurationList.hh,v 1.5 2006/06/29 20:12:11 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4FermiConfigurationList_h -#define G4FermiConfigurationList_h 1 - -#include "globals.hh" -#include "G4FermiConfiguration.hh" -#include "Randomize.hh" -#include "G4FermiFragmentsPool.hh" - -class G4FermiConfigurationList -{ -public: - G4FermiConfigurationList(); - - ~G4FermiConfigurationList() - { - std::for_each(Configurations.begin(),Configurations.end(), - DeleteConfiguration()); - } - -private: - G4FermiConfigurationList(const G4FermiConfigurationList &right); - - const G4FermiConfigurationList & operator=(const G4FermiConfigurationList &right); - G4bool operator==(const G4FermiConfigurationList &right) const; - G4bool operator!=(const G4FermiConfigurationList &right) const; - -public: - - G4bool Initialize(const G4int A, const G4int Z, const G4double TotalEnergyRF); - - G4FermiConfiguration ChooseConfiguration(void); - - G4FermiFragmentsPool & GetFragmentsPoolInstance(); - -private: - - - enum {MaxNumOfFragments = 16}; - - std::vector NormalizedWeights; - - std::vector Configurations; - - struct DeleteConfiguration - { - template - void operator()(const T* ptr) const - { - delete ptr; - } - }; - - -}; - - -#endif - - diff --git a/FermiBreakUp/G4FermiFragmentsPool.cc b/FermiBreakUp/G4FermiFragmentsPool.cc deleted file mode 100644 index 895ab0f..0000000 --- a/FermiBreakUp/G4FermiFragmentsPool.cc +++ /dev/null @@ -1,203 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara -// - - -#include "G4FermiFragmentsPool.hh" - -G4bool G4FermiFragmentsPool::MapIsEmpty(true); - - -std::multimap, const G4VFermiFragment* , std::less > > & -G4FermiFragmentsPool::GetMap() -{ - static std::vector fragment_pool; - // A Z Pol ExcitE - static const G4StableFermiFragment Fragment00( 1, 0, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment00); - static const G4StableFermiFragment Fragment01( 1, 1, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment01); - static const G4StableFermiFragment Fragment02( 2, 1, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment02); - static const G4StableFermiFragment Fragment03( 3, 1, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment03); - static const G4StableFermiFragment Fragment04( 3, 2, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment04); - static const G4StableFermiFragment Fragment05( 4, 2, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment05); - static const G4He5FermiFragment Fragment06( 5, 2, 4, 16.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment06);// He5 - static const G4Li5FermiFragment Fragment07( 5, 3, 4, 16.66*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment07);// Li5 - static const G4StableFermiFragment Fragment08( 6, 2, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment08); - static const G4StableFermiFragment Fragment09( 6, 3, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment09); - - static const G4StableFermiFragment Fragment10( 6, 3, 1, 3.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment10); - static const G4StableFermiFragment Fragment11( 7, 3, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment11); - static const G4StableFermiFragment Fragment12( 7, 3, 2, 0.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment12); - static const G4StableFermiFragment Fragment13( 7, 4, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment13); - static const G4StableFermiFragment Fragment14( 7, 4, 2, 0.43*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment14); - static const G4StableFermiFragment Fragment15( 8, 3, 5, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment15); - static const G4StableFermiFragment Fragment16( 8, 3, 3, 0.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment16); - static const G4Be8FermiFragment Fragment17( 8, 4, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment17); // Be8 - static const G4StableFermiFragment Fragment18( 9, 4, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment18); - static const G4B9FermiFragment Fragment19( 9, 5, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment19); // B9 - - static const G4StableFermiFragment Fragment20( 10, 4, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment20); - static const G4StableFermiFragment Fragment21( 10, 4, 5, 3.37*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment21); - static const G4StableFermiFragment Fragment22( 10, 4, 8, 5.96*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment22); - static const G4StableFermiFragment Fragment23( 10, 4, 1, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment23); - static const G4StableFermiFragment Fragment24( 10, 4, 5, 6.26*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment24); - static const G4StableFermiFragment Fragment25( 10, 5, 7, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment25); - static const G4StableFermiFragment Fragment26( 10, 5, 3, 0.72*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment26); - static const G4StableFermiFragment Fragment27( 10, 5, 1, 1.74*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment27); - static const G4StableFermiFragment Fragment28( 10, 5, 3, 2.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment28); - static const G4StableFermiFragment Fragment29( 10, 5, 5, 3.59*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment29); - - static const G4StableFermiFragment Fragment30( 10, 6, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment30); - static const G4StableFermiFragment Fragment31( 10, 6, 5, 3.35*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment31); - static const G4StableFermiFragment Fragment32( 11, 5, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment32); - static const G4StableFermiFragment Fragment33( 11, 5, 2, 2.13*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment33); - static const G4StableFermiFragment Fragment34( 11, 5, 6, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment34); - static const G4StableFermiFragment Fragment35( 11, 5, 4, 5.02*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment35); - static const G4StableFermiFragment Fragment36( 11, 5, 10, 6.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment36); - static const G4StableFermiFragment Fragment37( 11, 5, 6, 7.29*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment37); - static const G4StableFermiFragment Fragment38( 11, 5, 4, 7.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment38); - static const G4StableFermiFragment Fragment39( 11, 5, 6, 8.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment39); - - static const G4StableFermiFragment Fragment40( 11, 6, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment40); - static const G4StableFermiFragment Fragment41( 11, 6, 2, 2.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment41); - static const G4StableFermiFragment Fragment42( 11, 6, 6, 4.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment42); - static const G4StableFermiFragment Fragment43( 11, 6, 4, 4.80*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment43); - static const G4StableFermiFragment Fragment44( 11, 6, 2, 6.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment44); - static const G4StableFermiFragment Fragment45( 11, 6, 8, 6.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment45); - static const G4StableFermiFragment Fragment46( 11, 6, 6, 6.90*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment46); - static const G4StableFermiFragment Fragment47( 11, 6, 4, 7.50*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment47); - static const G4StableFermiFragment Fragment48( 11, 6, 4, 8.10*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment48); - static const G4StableFermiFragment Fragment49( 11, 6, 6, 8.42*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment49); - - static const G4StableFermiFragment Fragment50( 11, 6, 8, 8.66*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment50); - static const G4StableFermiFragment Fragment51( 12, 5, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment51); - static const G4StableFermiFragment Fragment52( 12, 5, 5, 0.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment52); - static const G4StableFermiFragment Fragment53( 12, 5, 5, 1.67*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment53); - static const G4StableFermiFragment Fragment54( 12, 5, 4, 2.65*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment54); - static const G4StableFermiFragment Fragment55( 12, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment55); - static const G4StableFermiFragment Fragment56( 12, 6, 5, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment56); - static const G4StableFermiFragment Fragment57( 13, 6, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment57); - static const G4StableFermiFragment Fragment58( 13, 6, 2, 3.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment58); - static const G4StableFermiFragment Fragment59( 13, 6, 4, 3.68*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment59); - - static const G4StableFermiFragment Fragment60( 13, 6, 6, 3.85*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment60); - static const G4StableFermiFragment Fragment61( 13, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment61); - static const G4StableFermiFragment Fragment62( 14, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment62); - static const G4StableFermiFragment Fragment63( 14, 6, 3, 6.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment63); - static const G4StableFermiFragment Fragment64( 14, 6, 8, 6.69*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment64); - static const G4StableFermiFragment Fragment65( 14, 6, 6, 6.96*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment65); - static const G4StableFermiFragment Fragment66( 14, 6, 5, 7.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment66); - static const G4StableFermiFragment Fragment67( 14, 7, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment67); - static const G4StableFermiFragment Fragment68( 14, 7, 1, 2.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment68); - static const G4StableFermiFragment Fragment69( 14, 7, 3, 3.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment69); - - static const G4StableFermiFragment Fragment70( 14, 7, 1, 4.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment70); - static const G4StableFermiFragment Fragment71( 14, 7, 5, 5.11*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment71); - static const G4StableFermiFragment Fragment72( 14, 7, 3, 5.69*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment72); - static const G4StableFermiFragment Fragment73( 14, 7, 7, 5.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment73); - static const G4StableFermiFragment Fragment74( 14, 7, 3, 6.20*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment74); - static const G4StableFermiFragment Fragment75( 14, 7, 7, 6.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment75); - static const G4StableFermiFragment Fragment76( 14, 7, 5, 7.03*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment76); - static const G4StableFermiFragment Fragment77( 15, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment77); - static const G4StableFermiFragment Fragment78( 15, 7, 8, 5.28*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment78); - static const G4StableFermiFragment Fragment79( 15, 7, 4, 6.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment79); - - static const G4StableFermiFragment Fragment80( 15, 7, 10, 7.22*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment80); - static const G4StableFermiFragment Fragment81( 15, 7, 8, 7.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment81); - static const G4StableFermiFragment Fragment82( 15, 7, 2, 8.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment82); - static const G4StableFermiFragment Fragment83( 15, 7, 4, 8.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment83); - static const G4StableFermiFragment Fragment84( 15, 7, 14, 9.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment84); - static const G4StableFermiFragment Fragment85( 15, 7, 14, 9.79*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment85); - static const G4StableFermiFragment Fragment86( 15, 7, 8, 10.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment86); - static const G4StableFermiFragment Fragment87( 15, 8, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment87); - static const G4StableFermiFragment Fragment88( 15, 8, 8, 5.22*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment88); - static const G4StableFermiFragment Fragment89( 15, 8, 4, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment89); - - static const G4StableFermiFragment Fragment90( 15, 8, 10, 6.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment90); - static const G4StableFermiFragment Fragment91( 15, 8, 8, 7.28*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment91); - static const G4StableFermiFragment Fragment92( 16, 7, 5, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment92); - static const G4StableFermiFragment Fragment93( 16, 7, 1, 0.12*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment93); - static const G4StableFermiFragment Fragment94( 16, 7, 7, 0.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment94); - static const G4StableFermiFragment Fragment95( 16, 7, 3, 0.40*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment95); - static const G4StableFermiFragment Fragment96( 16, 8, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment96); - static const G4StableFermiFragment Fragment97( 16, 8, 8, 6.10*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment97); - static const G4StableFermiFragment Fragment98( 16, 8, 5, 6.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment98); - static const G4StableFermiFragment Fragment99( 16, 8, 3, 7.12*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment99); - - static std::multimap, const G4VFermiFragment* , std::less > > - theMapOfFragments; - - if (MapIsEmpty) - { - for(size_t i=0; i, const G4VFermiFragment* >(std::pair(fragment_pool[i]->GetA(),fragment_pool[i]->GetZ()),fragment_pool[i])); - } - MapIsEmpty = false; - } - - return theMapOfFragments; -} - - -G4FermiFragmentsPool::G4FermiFragmentsPool() -{ -} - - - -G4FermiFragmentsPool::~G4FermiFragmentsPool() -{ -} - - - - - -G4FermiFragmentsPool::G4FermiFragmentsPool(const G4FermiFragmentsPool&) -{ - // It is meant to not be accesable -} - -const G4FermiFragmentsPool & G4FermiFragmentsPool::operator=(const G4FermiFragmentsPool& ) -{ - // It is meant to not be accesable - return *this; -} - -G4bool G4FermiFragmentsPool::operator==(const G4FermiFragmentsPool&) const -{ - // It is meant to not be accesable - return false; -} - -G4bool G4FermiFragmentsPool::operator!=(const G4FermiFragmentsPool&) const -{ - // It is meant to not be accesable - return true; -} diff --git a/FermiBreakUp/G4FermiFragmentsPool.hh b/FermiBreakUp/G4FermiFragmentsPool.hh deleted file mode 100644 index 129208f..0000000 --- a/FermiBreakUp/G4FermiFragmentsPool.hh +++ /dev/null @@ -1,90 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - - -#ifndef G4FermiFragmentsPool_hh -#define G4FermiFragmentsPool_hh - -#include "G4VFermiFragment.hh" -#include "G4StableFermiFragment.hh" -#include "G4B9FermiFragment.hh" -#include "G4Be8FermiFragment.hh" -#include "G4He5FermiFragment.hh" -#include "G4Li5FermiFragment.hh" - -#include -#include - -using namespace CLHEP; - -class G4FermiFragmentsPool -{ -public: - G4FermiFragmentsPool(); - ~G4FermiFragmentsPool(); - - - G4int Count(const std::pair& az) - { - return GetMap().count(az); - } - - std::multimap, const G4VFermiFragment*, - std::less > >::iterator - LowerBound(const std::pair & az) - { - return GetMap().lower_bound(az); - } - - std::multimap, const G4VFermiFragment*, - std::less > >::iterator - UpperBound(const std::pair & az) - { - return GetMap().upper_bound(az); - } - - -private: - G4FermiFragmentsPool(const G4FermiFragmentsPool&); - const G4FermiFragmentsPool & operator=(const G4FermiFragmentsPool&); - G4bool operator==(const G4FermiFragmentsPool&) const; - G4bool operator!=(const G4FermiFragmentsPool&) const; - - std::multimap, const G4VFermiFragment* , - std::less > > & - GetMap(); - - -private: - - static G4bool MapIsEmpty; - -}; -#endif - diff --git a/FermiBreakUp/G4FermiIntegerPartition.cc b/FermiBreakUp/G4FermiIntegerPartition.cc deleted file mode 100644 index 6f6431e..0000000 --- a/FermiBreakUp/G4FermiIntegerPartition.cc +++ /dev/null @@ -1,113 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - - -#include "G4FermiIntegerPartition.hh" - -void G4FermiIntegerPartition::Initialize(const G4int N, const G4int size) -{ - total = N; - int S(size); - if (!enableNull) - { - S = std::min(size,N); - } - partition.clear(); - partition.reserve(S); - G4int ini(1); - if (enableNull) - { - ini = 0; - partition.push_back(total); - } - else - { - partition.push_back(total-S+1); - } - for (G4int i = 1; i < S; i++) partition.push_back(ini); - -#ifdef G4FermiIntegerPartition_debug - this->TestPartition(); -#endif - - return; -} - - -G4bool G4FermiIntegerPartition::Next() -{ - std::vector::iterator first = partition.begin(); - std::vector::iterator i = first+1; - - while ( i != partition.end() && (*first) <= (*i)+1 ) i++; - - if ( i == partition.end() ) - { - return false; - } - else - { - (*i)++; - G4int d = -1; - for (std::vector::iterator j = i-1; j != first; j--) - { - d += (*j) - (*i); - (*j) = (*i); - } - (*first) += d; - } - -#ifdef G4FermiIntegerPartition_debug - this->TestPartition(); -#endif - - return true; -} - -#ifdef G4FermiIntegerPartition_debug - -void G4FermiIntegerPartition::TestPartition() -{ - G4int tmp = this->GetSum(); - if (total != tmp) - { - std::cerr << "G4FermiIntegerPartition Error: " - << "Partition of " << total << " into " << partition.size() - << " is ["; - for (std::vector::iterator it = partition.begin(); - it != partition.end(); ++it) - { - std::cerr << *it << ','; - } - std::cerr << "\b\b] = " << tmp << '\n'; - } - return; -} - -#endif diff --git a/FermiBreakUp/G4FermiIntegerPartition.hh b/FermiBreakUp/G4FermiIntegerPartition.hh deleted file mode 100644 index 2c25f2e..0000000 --- a/FermiBreakUp/G4FermiIntegerPartition.hh +++ /dev/null @@ -1,73 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - - -#ifndef G4FermiIntegerPartition_hh -#define G4FermiIntegerPartition_hh - -#define G4FermiIntegerPartition_debug 1 -#include "globals.hh" -#include - -#ifdef G4FermiIntegerPartition_debug -#include -#endif - - -class G4FermiIntegerPartition -{ -public: - inline G4FermiIntegerPartition(); - inline ~G4FermiIntegerPartition(); - inline G4FermiIntegerPartition(const G4FermiIntegerPartition&); - - inline const G4FermiIntegerPartition & operator=(const G4FermiIntegerPartition&); - G4bool operator==(const G4FermiIntegerPartition&); - G4bool operator!=(const G4FermiIntegerPartition&); - - inline void EnableNull(const G4bool v=true); - void Initialize(const G4int, const G4int); - G4bool Next(); - inline std::vector GetPartition() const; - -private: -#ifdef G4FermiIntegerPartition_debug - inline G4int GetSum(); - void TestPartition(); -#endif - -private: - G4int total; - G4bool enableNull; - std::vector partition; -}; - -#include "G4FermiIntegerPartition.icc" - -#endif diff --git a/FermiBreakUp/G4FermiIntegerPartition.icc b/FermiBreakUp/G4FermiIntegerPartition.icc deleted file mode 100644 index 12c7b15..0000000 --- a/FermiBreakUp/G4FermiIntegerPartition.icc +++ /dev/null @@ -1,91 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - -inline G4FermiIntegerPartition::G4FermiIntegerPartition() - : total(0), enableNull(false) -{ -} - -inline G4FermiIntegerPartition::~G4FermiIntegerPartition() -{ -} - -inline G4FermiIntegerPartition::G4FermiIntegerPartition(const G4FermiIntegerPartition& right) - : total(right.total), enableNull(right.enableNull), partition(right.partition) -{ -} - - -inline const G4FermiIntegerPartition& -G4FermiIntegerPartition::operator=(const G4FermiIntegerPartition& right) -{ - total=right.total; - enableNull=right.enableNull; - partition=right.partition; - return *this; -} - -inline G4bool G4FermiIntegerPartition:: -operator==(const G4FermiIntegerPartition& right) -{ - return (total == right.total && - enableNull == enableNull && - partition == right.partition); -} - -inline G4bool G4FermiIntegerPartition:: -operator!=(const G4FermiIntegerPartition& right) -{ - return (total != right.total || - enableNull != right.enableNull || - partition != right.partition); -} - -inline std::vector G4FermiIntegerPartition:: -GetPartition() const -{ - return partition; -} - -inline void G4FermiIntegerPartition:: -EnableNull(const G4bool v) -{ - enableNull=v; - return; -} - -#ifdef G4FermiIntegerPartition_debug - -inline G4int G4FermiIntegerPartition::GetSum() -{ - return std::accumulate(partition.begin(), partition.end(), 0); -} - -#endif - diff --git a/FermiBreakUp/G4FermiPhaseSpaceDecay.cc b/FermiBreakUp/G4FermiPhaseSpaceDecay.cc deleted file mode 100644 index 3bf4498..0000000 --- a/FermiBreakUp/G4FermiPhaseSpaceDecay.cc +++ /dev/null @@ -1,233 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - - -#include "G4FermiPhaseSpaceDecay.hh" -#include "G4HadronicException.hh" -#include "Randomize.hh" - -#include -#include -#include - - -std::vector * -G4FermiPhaseSpaceDecay::KopylovNBodyDecay(const G4double M, const std::vector& m) const - // Calculates momentum for N fragments (Kopylov's method of sampling is used) -{ - G4int N = m.size(); - - std::vector* P = new std::vector; - P->insert(P->begin(), N, static_cast(0)); - - G4double mtot = std::accumulate( m.begin(), m.end(), 0.0); - G4double mu = mtot; - G4double PFragMagCM = 0.0; - G4double Mass = M; - G4double T = M-mtot; - G4LorentzVector PFragCM(0.0,0.0,0.0,0.0); - G4LorentzVector PFragLab(0.0,0.0,0.0,0.0); - G4LorentzVector PRestCM(0.0,0.0,0.0,0.0); - G4LorentzVector PRestLab(0.0,0.0,0.0,Mass); - - for (G4int k = N-1; k > 0; k--) - { - mu -= m[k]; - if (k>1) T *= BetaKopylov(k); - else T = 0.0; - - G4double RestMass = mu + T; - - PFragMagCM = PtwoBody(Mass,m[k],RestMass); - if (PFragMagCM < 0) - { - throw G4HadronicException(__FILE__, __LINE__, "G4FermiPhaseSpaceDecay::KopylovNBodyDecay: Error sampling fragments momenta!!"); - } - - - // Create a unit vector with a random direction isotropically distributed - G4ParticleMomentum RandVector(IsotropicVector(PFragMagCM)); - - PFragCM.setVect(RandVector); - PFragCM.setE(std::sqrt(RandVector.mag2()+m[k]*m[k])); - - PRestCM.setVect(-RandVector); - PRestCM.setE(std::sqrt(RandVector.mag2()+RestMass*RestMass)); - - - G4ThreeVector BoostV = PRestLab.boostVector(); - - PFragLab = PFragCM; - PFragLab.boost(BoostV); - PRestLab = PRestCM; - PRestLab.boost(BoostV); - - P->operator[](k) = new G4LorentzVector(PFragLab); - - Mass = RestMass; - } - - P->operator[](0) = new G4LorentzVector(PRestLab); - - return P; - -} - - - -std::vector * -G4FermiPhaseSpaceDecay::NBodyDecay(const G4double M, const std::vector& m) const -{ - // Number of fragments - G4int N = m.size(); - G4int i, j; - // Total Daughters Mass - G4double mtot = std::accumulate( m.begin(), m.end(), 0.0); - G4double Emax = M - mtot + m[0]; - G4double Emin = 0.0; - G4double Wmax = 1.0; - for (i = 1; i < N; i++) - { - Emax += m[i]; - Emin += m[i-1]; - Wmax *= this->PtwoBody(Emax, Emin, m[i]); - } - - G4int ntries = 0; - G4double weight = 1.0; - std::vector p(N); - do - { - // Sample uniform random numbers in increasing order - std::vector r; - r.reserve(N); - r.push_back(0.0); - for (i = 1; i < N-1; i++) r.push_back(G4UniformRand()); - r.push_back(1.0); - std::sort(r.begin(),r.end(), std::less()); - - // Calculate virtual masses - std::vector vm(N); - vm[0] = 0.0; - std::partial_sum(m.begin(), m.end(), vm.begin()); - std::transform(r.begin(), r.end(), r.begin(), std::bind2nd(std::multiplies(), M-mtot)); - std::transform(r.begin(), r.end(), vm.begin(), vm.begin(), std::plus()); - r.clear(); - - // Calcualte daughter momenta - weight = 1.0; - for (j = 0; j < N-1; j++) - { - p[j] = PtwoBody(vm[j+1],vm[j],m[j+1]); - if (p[j] < 0.0) - { - G4cerr << "G4FermiPhaseSpaceDecay::Decay: Daughter momentum less than zero\n"; - weight = 0.0; - break; - } - else - { - weight *= p[j]; - } - } - p[N-1] = PtwoBody(vm[N-2], m[N-2], m[N-1]); - - - if (ntries++ > 1000000) - { - throw G4HadronicException(__FILE__, __LINE__, "G4FermiPhaseSpaceDecay::Decay: Cannot determine decay kinematics"); - } - } - while ( weight < G4UniformRand()*Wmax ); - - std::vector * P = new std::vector; - P->insert(P->begin(),N, static_cast(0)); - - G4ParticleMomentum a3P = this->IsotropicVector(p[0]); - - P->operator[](0) = new G4LorentzVector( a3P, std::sqrt(a3P.mag2()+m[0]*m[0]) ); - P->operator[](1) = new G4LorentzVector(-a3P, std::sqrt(a3P.mag2()+m[1]*m[1]) ); - for (i = 2; i < N; i++) - { - a3P = this->IsotropicVector(p[i-1]); - P->operator[](i) = new G4LorentzVector(a3P, std::sqrt(a3P.mag2() + m[i]*m[i])); - G4ThreeVector Beta = (-1.0)*P->operator[](i)->boostVector(); - // boost already created particles - for (j = 0; j < i; j++) - { - P->operator[](j)->boost(Beta); - } - } - - return P; -} - - - - -std::vector * -G4FermiPhaseSpaceDecay:: -TwoBodyDecay(const G4double M, const std::vector& m) const -{ - G4double m0 = m.front(); - G4double m1 = m.back(); - G4double psqr = this->PtwoBody(M,m0,m1); - G4ParticleMomentum p = this->IsotropicVector(std::sqrt(psqr)); - - G4LorentzVector * P41 = new G4LorentzVector; - P41->setVect(p); - P41->setE(std::sqrt(psqr+m0*m0)); - - G4LorentzVector * P42 = new G4LorentzVector; - P42->setVect(-p); - P42->setE(std::sqrt(psqr+m1*m1)); - - std::vector * result = new std::vector; - result->push_back(P41); - result->push_back(P42); - return result; -} - - - - -G4ParticleMomentum G4FermiPhaseSpaceDecay::IsotropicVector(const G4double Magnitude) const - // Samples a isotropic random vectorwith a magnitud given by Magnitude. - // By default Magnitude = 1.0 -{ - G4double CosTheta = 1.0 - 2.0*G4UniformRand(); - G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta); - G4double Phi = twopi*G4UniformRand(); - G4ParticleMomentum Vector(Magnitude*std::cos(Phi)*SinTheta, - Magnitude*std::sin(Phi)*SinTheta, - Magnitude*CosTheta); - return Vector; -} - - diff --git a/FermiBreakUp/G4FermiPhaseSpaceDecay.hh b/FermiBreakUp/G4FermiPhaseSpaceDecay.hh deleted file mode 100644 index 58c6914..0000000 --- a/FermiBreakUp/G4FermiPhaseSpaceDecay.hh +++ /dev/null @@ -1,76 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - -#ifndef G4FermiPhaseSpaceDecay_hh -#define G4FermiPhaseSpaceDecay_hh - - -#include "G4LorentzVector.hh" -#include "G4ParticleMomentum.hh" -#include -#include "G4SystemOfUnits.hh" - -#include -#include - -using namespace CLHEP; - -class G4FermiPhaseSpaceDecay -{ -public: - inline G4FermiPhaseSpaceDecay(); - inline ~G4FermiPhaseSpaceDecay(); - - inline std::vector * - Decay(const G4double, const std::vector&) const; - -private: - inline G4FermiPhaseSpaceDecay(const G4FermiPhaseSpaceDecay&); - inline const G4FermiPhaseSpaceDecay & operator=(const G4FermiPhaseSpaceDecay &); - inline G4bool operator==(const G4FermiPhaseSpaceDecay&); - inline G4bool operator!=(const G4FermiPhaseSpaceDecay&); - - inline G4double PtwoBody(G4double E, G4double P1, G4double P2) const; - - G4ParticleMomentum IsotropicVector(const G4double Magnitude = 1.0) const; - - inline G4double BetaKopylov(const G4int) const; - - std::vector * - TwoBodyDecay(const G4double, const std::vector&) const; - - std::vector * - NBodyDecay(const G4double, const std::vector&) const; - - std::vector * - KopylovNBodyDecay(const G4double, const std::vector&) const; -}; - -#include "G4FermiPhaseSpaceDecay.icc" - -#endif diff --git a/FermiBreakUp/G4FermiPhaseSpaceDecay.icc b/FermiBreakUp/G4FermiPhaseSpaceDecay.icc deleted file mode 100644 index 7b2e637..0000000 --- a/FermiBreakUp/G4FermiPhaseSpaceDecay.icc +++ /dev/null @@ -1,97 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - -inline G4FermiPhaseSpaceDecay::G4FermiPhaseSpaceDecay() -{ -} - -inline G4FermiPhaseSpaceDecay::~G4FermiPhaseSpaceDecay() -{ -} - -inline G4FermiPhaseSpaceDecay::G4FermiPhaseSpaceDecay(const G4FermiPhaseSpaceDecay&) -{ - // This is meant to not be used -} - -inline const G4FermiPhaseSpaceDecay & -G4FermiPhaseSpaceDecay::operator=(const G4FermiPhaseSpaceDecay&) -{ - //This is menat to not be used - return *this; -} - -inline G4bool -G4FermiPhaseSpaceDecay::operator==(const G4FermiPhaseSpaceDecay&) -{ - // This is meant to not be used - return false; -} - -inline G4bool -G4FermiPhaseSpaceDecay::operator!=(const G4FermiPhaseSpaceDecay&) -{ - // This is meant to not be used - return true; -} - - -inline G4double -G4FermiPhaseSpaceDecay::PtwoBody(G4double E, G4double P1, G4double P2) const -{ - G4double P = (E+P1+P2)*(E+P1-P2)*(E-P1+P2)*(E-P1-P2)/(4.0*E*E); - if (P>0.0) return std::sqrt(P); - else return -1.0; -} - - -inline std::vector * G4FermiPhaseSpaceDecay:: -Decay(const G4double parent_mass, const std::vector& fragment_masses) const -{ - // if (fragment_masses.size() == 2) - // { - // return this->TwoBodyDecay(parent_mass,fragment_masses); - // } - // else return this->NBodyDecay(parent_mass,fragment_masses); - // else - // { - return this->KopylovNBodyDecay(parent_mass,fragment_masses); - // } -} - -inline G4double -G4FermiPhaseSpaceDecay::BetaKopylov(const G4int K) const -{ - // Notice that alpha > beta always - const G4double beta = 1.5; - G4double alpha = 1.5*(K-1); - G4double Y1 = CLHEP::RandGamma::shoot(alpha,1); - G4double Y2 = CLHEP::RandGamma::shoot(beta,1); - - return Y1/(Y1+Y2); -} diff --git a/FermiBreakUp/G4FermiSplitter.cc b/FermiBreakUp/G4FermiSplitter.cc deleted file mode 100644 index 9c02725..0000000 --- a/FermiBreakUp/G4FermiSplitter.cc +++ /dev/null @@ -1,147 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - -#include "G4FermiSplitter.hh" -#include "G4FermiIntegerPartition.hh" -#include "G4HadronicException.hh" -#include - - -G4int G4FermiSplitter::Initialize(const G4int a, const G4int z, const G4int n) -{ - // Check argument correctness - if (a < 0 || z < 0 || n < 0) - { - std::ostringstream errOs; - errOs << "G4FermiSplitter::Initialize() Error: Non valid arguments A = " - << a << " Z = " << z << " #fragments = " << n; - throw G4HadronicException(__FILE__, __LINE__, errOs.str()); - } - if (z > a || n > a) - { - std::ostringstream errOs; - errOs << "G4FermiSplitter::Initialize() Error: Non physical arguments = " - << a << " Z = " << z << " #fragments = " << n; - throw G4HadronicException(__FILE__, __LINE__, errOs.str()); - } - A = a; - Z = z; - K = n; - splits.clear(); - - - // Form all possible partition by combination - // of A partitions and Z partitions (Z partitions include null parts) - G4FermiIntegerPartition PartitionA; - PartitionA.Initialize(A,K); - do // for each partition of A - { - G4FermiIntegerPartition PartitionZ; - PartitionZ.EnableNull(); - PartitionZ.Initialize(Z,K); - std::vector partA = PartitionA.GetPartition(); - std::vector multiplicities; - do // for each partition of Z - { - std::vector partZ = PartitionZ.GetPartition(); - // Get multiplicities - // provided that for each a,z pair there could be several - // posibilities, we have to count them in order to create - // all possible combinations. - multiplicities.clear(); - G4int num_rows = 1; - std::pair az_pair; - for (G4int i = 0; i < K; i++) - { - az_pair = std::make_pair(partA[i],partZ[i]); - G4int m = theFragmentsPool->Count(az_pair); - if (m > 0) - { - multiplicities.push_back(m); - num_rows *= m; - } - else - { - break; - } - } - // if size of multiplicities is equal to K, it - // means that all combinations a,z exist in the - // fragments pool - if (static_cast(multiplicities.size()) == K) - { - std::vector > tsplits; - tsplits.clear(); - tsplits.resize(num_rows); - G4int group_size = num_rows; - for (G4int i = 0; i < K; i++) - { - az_pair = std::make_pair(partA[i],partZ[i]); - group_size /= multiplicities[i]; - std::multimap, const G4VFermiFragment*, - std::less > >::iterator pos; - pos = theFragmentsPool->LowerBound(az_pair); - for (G4int k = 0; k < num_rows/group_size; k++) - { - if (pos == theFragmentsPool->UpperBound(az_pair)) - { - pos = theFragmentsPool->LowerBound(az_pair); - } - for (G4int l = 0; l < group_size; l++) - { - tsplits[k*group_size+l].push_back(pos->second); - } - pos++; - } - } - // Remove wrong splits - for (std::vector >::iterator - itsplits1 = tsplits.begin(); itsplits1 != tsplits.end(); itsplits1++) - { - std::sort((itsplits1)->begin(), (itsplits1)->end(), - std::greater()); - } - // add splits (eliminating a few of them that are repeated) - std::vector >::iterator - itlastsplit = tsplits.begin(); - splits.push_back((*itlastsplit)); - for (std::vector >::iterator - itsplits2 = itlastsplit+1; itsplits2 != tsplits.end(); itsplits2++) - { - if ( (*itsplits2) != (*itlastsplit)) splits.push_back((*itsplits2)); - itlastsplit++; - } - } - } - while (PartitionZ.Next()); - } // partition of A - while (PartitionA.Next()); - - return splits.size(); -} diff --git a/FermiBreakUp/G4FermiSplitter.hh b/FermiBreakUp/G4FermiSplitter.hh deleted file mode 100644 index d36d20e..0000000 --- a/FermiBreakUp/G4FermiSplitter.hh +++ /dev/null @@ -1,70 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara - - -#ifndef G4FermiSplitter_hh -#define G4FermiSplitter_hh - - -#include "G4VFermiFragment.hh" -#include "G4FermiFragmentsPool.hh" -#include - -class G4FermiSplitter -{ -public: - inline G4FermiSplitter(G4FermiFragmentsPool*); - inline ~G4FermiSplitter(); - - inline G4FermiSplitter(const G4FermiSplitter&); - - inline const G4FermiSplitter& operator=(const G4FermiSplitter&); - inline G4bool operator==(const G4FermiSplitter&); - inline G4bool operator!=(const G4FermiSplitter&); - - G4int Initialize(const G4int a, const G4int z, const G4int n); - - inline G4int GetNumberOfSplits() const; - inline std::vector GetSplit(const G4int i); - -private: - inline G4FermiSplitter(); - -private: - - G4FermiFragmentsPool * theFragmentsPool; - G4int A; - G4int Z; - G4int K; - std::vector > splits; -}; - -#include "G4FermiSplitter.icc" - -#endif diff --git a/FermiBreakUp/G4FermiSplitter.icc b/FermiBreakUp/G4FermiSplitter.icc deleted file mode 100644 index d5fd760..0000000 --- a/FermiBreakUp/G4FermiSplitter.icc +++ /dev/null @@ -1,83 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -inline G4FermiSplitter::G4FermiSplitter(G4FermiFragmentsPool* pool) - : theFragmentsPool(pool), A(0), Z(0), K(0) -{ -} - -inline G4FermiSplitter::G4FermiSplitter() - : theFragmentsPool(0), A(0), Z(0), K(0) -{ - // This is meant to not be accesable -} - -inline G4FermiSplitter::~G4FermiSplitter() -{ -} - -inline G4FermiSplitter::G4FermiSplitter(const G4FermiSplitter& right) - : A(right.A), Z(right.Z), K(right.K), splits(right.splits) -{ -} - -inline const G4FermiSplitter& -G4FermiSplitter::operator=(const G4FermiSplitter& right) -{ - A = right.A; - Z = right.Z; - K = right.Z; - splits = right.splits; - return *this; -} - -inline G4bool -G4FermiSplitter::operator==(const G4FermiSplitter& right) -{ - return (A == right.A && Z == right.Z && K == right.K && - splits == right.splits); -} - -inline G4bool -G4FermiSplitter::operator!=(const G4FermiSplitter& right) -{ - return (A != right.A || Z != right.Z || K != right.K || - splits != right.splits); -} - -inline G4int G4FermiSplitter::GetNumberOfSplits() const -{ - return splits.size(); -} - -inline std::vector G4FermiSplitter::GetSplit(const G4int i) -{ - if (i >= 0 && i < static_cast(splits.size())) return splits[i]; - else - { - std::vector dummy; - return dummy; - } -} diff --git a/FermiBreakUp/G4He5FermiFragment.cc b/FermiBreakUp/G4He5FermiFragment.cc deleted file mode 100644 index 12b6e81..0000000 --- a/FermiBreakUp/G4He5FermiFragment.cc +++ /dev/null @@ -1,92 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4He5FermiFragment.cc,v 1.7 2006/06/29 20:13:05 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4He5FermiFragment.hh" -#include "G4IonTable.hh" -#include "G4HadronicException.hh" - -G4He5FermiFragment::G4He5FermiFragment() -{ -} - -G4He5FermiFragment::G4He5FermiFragment(const G4He5FermiFragment &) : G4UnstableFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4He5FermiFragment::copy_constructor meant to not be accessable"); -} - - -G4He5FermiFragment::~G4He5FermiFragment() -{ -} - - -const G4He5FermiFragment & G4He5FermiFragment::operator=(const G4He5FermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4He5FermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4He5FermiFragment::operator==(const G4He5FermiFragment &) const -{ - return false; -} - -G4bool G4He5FermiFragment::operator!=(const G4He5FermiFragment &) const -{ - return true; -} - - - - -G4He5FermiFragment::G4He5FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4UnstableFermiFragment(anA,aZ,Pol,ExE) -{ - // He5 ----> alpha + neutron - G4double alpha_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(2,4); - G4double neutron_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(0,1); - - G4double h5_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(2,5); - //std::cout << "Hello from G4He5FermiFragment, Q = " << (h5_mass - alpha_mass - neutron_mass)/keV <<" keV"<< '\n'; - - - - Masses.push_back(alpha_mass); - Masses.push_back(neutron_mass); - - AtomNum.push_back(4); - AtomNum.push_back(1); - - Charges.push_back(2); - Charges.push_back(0); -} diff --git a/FermiBreakUp/G4He5FermiFragment.hh b/FermiBreakUp/G4He5FermiFragment.hh deleted file mode 100644 index 4d12d77..0000000 --- a/FermiBreakUp/G4He5FermiFragment.hh +++ /dev/null @@ -1,59 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4He5FermiFragment.hh,v 1.3 2006/06/29 20:12:27 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4He5FermiFragment_h -#define G4He5FermiFragment_h 1 - -#include "G4UnstableFermiFragment.hh" - -class G4He5FermiFragment : public G4UnstableFermiFragment -{ -public: - G4He5FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE); - - ~G4He5FermiFragment(); - -private: - G4He5FermiFragment(); - - G4He5FermiFragment(const G4He5FermiFragment &right); - - const G4He5FermiFragment & operator=(const G4He5FermiFragment &right); - G4bool operator==(const G4He5FermiFragment &right) const; - G4bool operator!=(const G4He5FermiFragment &right) const; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4Li5FermiFragment.cc b/FermiBreakUp/G4Li5FermiFragment.cc deleted file mode 100644 index 17cf42b..0000000 --- a/FermiBreakUp/G4Li5FermiFragment.cc +++ /dev/null @@ -1,89 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4Li5FermiFragment.cc,v 1.7 2006/06/29 20:13:07 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4Li5FermiFragment.hh" -#include "G4IonTable.hh" -#include "G4HadronicException.hh" - -G4Li5FermiFragment::G4Li5FermiFragment() -{ -} - -G4Li5FermiFragment::G4Li5FermiFragment(const G4Li5FermiFragment &) : G4UnstableFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4Li5FermiFragment::copy_constructor meant to not be accessable"); -} - - -G4Li5FermiFragment::~G4Li5FermiFragment() -{ -} - - -const G4Li5FermiFragment & G4Li5FermiFragment::operator=(const G4Li5FermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4Li5FermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4Li5FermiFragment::operator==(const G4Li5FermiFragment &) const -{ - return false; -} - -G4bool G4Li5FermiFragment::operator!=(const G4Li5FermiFragment &) const -{ - return true; -} - - -G4Li5FermiFragment::G4Li5FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4UnstableFermiFragment(anA,aZ,Pol,ExE) -{ - // Li5 ----> alpha + proton - G4double alpha_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(2,4); - G4double proton_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(1,1); - - G4double li5_mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(3,5); - //std::cout << "Hello from G4Li5FermiFragment, Q = " << (li5_mass - alpha_mass - proton_mass)/keV <<" keV"<< '\n'; - - - Masses.push_back(alpha_mass); - Masses.push_back(proton_mass); - - AtomNum.push_back(4); - AtomNum.push_back(1); - - Charges.push_back(2); - Charges.push_back(1); -} diff --git a/FermiBreakUp/G4Li5FermiFragment.hh b/FermiBreakUp/G4Li5FermiFragment.hh deleted file mode 100644 index 8c6657f..0000000 --- a/FermiBreakUp/G4Li5FermiFragment.hh +++ /dev/null @@ -1,59 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4Li5FermiFragment.hh,v 1.3 2006/06/29 20:12:29 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4Li5FermiFragment_h -#define G4Li5FermiFragment_h 1 - -#include "G4UnstableFermiFragment.hh" - -class G4Li5FermiFragment : public G4UnstableFermiFragment -{ -public: - G4Li5FermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE); - - ~G4Li5FermiFragment(); - -private: - G4Li5FermiFragment(); - - G4Li5FermiFragment(const G4Li5FermiFragment &right); - - const G4Li5FermiFragment & operator=(const G4Li5FermiFragment &right); - G4bool operator==(const G4Li5FermiFragment &right) const; - G4bool operator!=(const G4Li5FermiFragment &right) const; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4StableFermiFragment.cc b/FermiBreakUp/G4StableFermiFragment.cc deleted file mode 100644 index 2b74734..0000000 --- a/FermiBreakUp/G4StableFermiFragment.cc +++ /dev/null @@ -1,77 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4StableFermiFragment.cc,v 1.5 2006/06/29 20:13:09 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4StableFermiFragment.hh" -#include "G4HadronicException.hh" - -G4StableFermiFragment::G4StableFermiFragment() -{ -} - -G4StableFermiFragment::G4StableFermiFragment(const G4StableFermiFragment &) : G4VFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4StableFermiFragment::copy_constructor meant to not be accessable"); -} - - -G4StableFermiFragment::~G4StableFermiFragment() -{ -} - - -const G4StableFermiFragment & G4StableFermiFragment::operator=(const G4StableFermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4StableFermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4StableFermiFragment::operator==(const G4StableFermiFragment &) const -{ - return false; -} - -G4bool G4StableFermiFragment::operator!=(const G4StableFermiFragment &) const -{ - return true; -} - - - -G4FragmentVector * G4StableFermiFragment::GetFragment(const G4LorentzVector & aMomentum) const -{ - G4FragmentVector * theResult = new G4FragmentVector; - - theResult->push_back(new G4Fragment(A,Z,aMomentum)); - - return theResult; -} diff --git a/FermiBreakUp/G4StableFermiFragment.hh b/FermiBreakUp/G4StableFermiFragment.hh deleted file mode 100644 index 7407b28..0000000 --- a/FermiBreakUp/G4StableFermiFragment.hh +++ /dev/null @@ -1,66 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4StableFermiFragment.hh,v 1.3 2006/06/29 20:12:31 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4StableFermiFragment_h -#define G4StableFermiFragment_h 1 - -#include "G4VFermiFragment.hh" - -class G4StableFermiFragment : public G4VFermiFragment -{ -public: - G4StableFermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4VFermiFragment(anA,aZ,Pol,ExE) - { - } - - virtual ~G4StableFermiFragment(); - -private: - G4StableFermiFragment(); - - G4StableFermiFragment(const G4StableFermiFragment &right); - - const G4StableFermiFragment & operator=(const G4StableFermiFragment &right); - G4bool operator==(const G4StableFermiFragment &right) const; - G4bool operator!=(const G4StableFermiFragment &right) const; - -public: - - virtual G4FragmentVector * GetFragment(const G4LorentzVector & aMomentum) const; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4UnstableFermiFragment.cc b/FermiBreakUp/G4UnstableFermiFragment.cc deleted file mode 100644 index 87b23fd..0000000 --- a/FermiBreakUp/G4UnstableFermiFragment.cc +++ /dev/null @@ -1,101 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4UnstableFermiFragment.cc,v 1.8 2006/06/29 20:13:11 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4UnstableFermiFragment.hh" -#include "G4FermiPhaseSpaceDecay.hh" -#include "G4HadronicException.hh" -#include - -G4UnstableFermiFragment::G4UnstableFermiFragment() -{ -} - -G4UnstableFermiFragment::G4UnstableFermiFragment(const G4UnstableFermiFragment &) : G4VFermiFragment() -{ - throw G4HadronicException(__FILE__, __LINE__, "G4UnstableFermiFragment::copy_constructor meant to not be accessable"); -} - - -G4UnstableFermiFragment::~G4UnstableFermiFragment() -{ -} - - -const G4UnstableFermiFragment & G4UnstableFermiFragment::operator=(const G4UnstableFermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4UnstableFermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4UnstableFermiFragment::operator==(const G4UnstableFermiFragment &) const -{ - return false; -} - -G4bool G4UnstableFermiFragment::operator!=(const G4UnstableFermiFragment &) const -{ - return true; -} - - - -G4FragmentVector * G4UnstableFermiFragment::GetFragment(const G4LorentzVector& aMomentum) const -{ - G4FermiPhaseSpaceDecay thePhaseSpace; - - std::vector * P_i = thePhaseSpace.Decay(aMomentum.m(), Masses); - - G4ThreeVector Beta = aMomentum.boostVector(); - - G4FragmentVector * theResult = new G4FragmentVector; - - for (std::vector::iterator i = P_i->begin(); i != P_i->end(); i++) - { -#ifdef G4NO_ISO_VECDIST - std::vector::difference_type tmp_n = 0; - std::distance(P_i->begin(),i,tmp_n); - G4int n = tmp_n; -#else - G4int n = std::distance(P_i->begin(),i); -#endif - (*i)->boost(Beta); - theResult->push_back(new G4Fragment(static_cast(AtomNum[n]), - static_cast(Charges[n]), - *(*i))); - - delete *i; - } - delete P_i; - - return theResult; -} diff --git a/FermiBreakUp/G4UnstableFermiFragment.hh b/FermiBreakUp/G4UnstableFermiFragment.hh deleted file mode 100644 index e11bc60..0000000 --- a/FermiBreakUp/G4UnstableFermiFragment.hh +++ /dev/null @@ -1,75 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4UnstableFermiFragment.hh,v 1.3 2006/06/29 20:12:33 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4UnstableFermiFragment_h -#define G4UnstableFermiFragment_h 1 - -#include "G4VFermiFragment.hh" -#include "Randomize.hh" -#include "G4SystemOfUnits.hh" - -class G4UnstableFermiFragment : public G4VFermiFragment -{ -public: - virtual ~G4UnstableFermiFragment(); - -protected: - G4UnstableFermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE) - : G4VFermiFragment(anA,aZ,Pol,ExE) - { - } - - G4UnstableFermiFragment(); - -private: - G4UnstableFermiFragment(const G4UnstableFermiFragment &right); - - const G4UnstableFermiFragment & operator=(const G4UnstableFermiFragment &right); - G4bool operator==(const G4UnstableFermiFragment &right) const; - G4bool operator!=(const G4UnstableFermiFragment &right) const; - -public: - - G4FragmentVector * GetFragment(const G4LorentzVector&) const; - -protected: - - std::vector Masses; - std::vector Charges; - std::vector AtomNum; - -}; - - -#endif - - diff --git a/FermiBreakUp/G4VFermiBreakUp.cc b/FermiBreakUp/G4VFermiBreakUp.cc deleted file mode 100644 index e78c038..0000000 --- a/FermiBreakUp/G4VFermiBreakUp.cc +++ /dev/null @@ -1,69 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiBreakUp.cc,v 1.5 2006/06/29 20:13:13 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4VFermiBreakUp.hh" -#include "G4HadronicException.hh" - -G4VFermiBreakUp::G4VFermiBreakUp() -{ -} - -G4VFermiBreakUp::G4VFermiBreakUp(const G4VFermiBreakUp &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4VFermiBreakUp::copy_constructor meant to not be accessable"); -} - - -G4VFermiBreakUp::~G4VFermiBreakUp() -{ -} - - -const G4VFermiBreakUp & G4VFermiBreakUp::operator=(const G4VFermiBreakUp &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4VFermiBreakUp::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4VFermiBreakUp::operator==(const G4VFermiBreakUp &) const -{ - return false; -} - -G4bool G4VFermiBreakUp::operator!=(const G4VFermiBreakUp &) const -{ - return true; -} - - - diff --git a/FermiBreakUp/G4VFermiBreakUp.hh b/FermiBreakUp/G4VFermiBreakUp.hh deleted file mode 100644 index cc5cbee..0000000 --- a/FermiBreakUp/G4VFermiBreakUp.hh +++ /dev/null @@ -1,59 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiBreakUp.hh,v 1.3 2006/06/29 20:12:35 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4VFermiBreakUp_h -#define G4VFermiBreakUp_h 1 - -#include "globals.hh" -#include "G4FragmentVector.hh" - -class G4VFermiBreakUp -{ -public: - G4VFermiBreakUp(); - virtual ~G4VFermiBreakUp(); - -private: - G4VFermiBreakUp(const G4VFermiBreakUp &right); - - const G4VFermiBreakUp & operator=(const G4VFermiBreakUp &right); - G4bool operator==(const G4VFermiBreakUp &right) const; - G4bool operator!=(const G4VFermiBreakUp &right) const; - -public: - virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus) = 0; -}; - - -#endif - - diff --git a/FermiBreakUp/G4VFermiFragment.cc b/FermiBreakUp/G4VFermiFragment.cc deleted file mode 100644 index 94bfa2b..0000000 --- a/FermiBreakUp/G4VFermiFragment.cc +++ /dev/null @@ -1,60 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiFragment.cc,v 1.5 2006/06/29 20:13:15 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "G4VFermiFragment.hh" -#include "G4HadronicException.hh" - -G4VFermiFragment::G4VFermiFragment(const G4VFermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4VFermiFragment::copy_constructor meant to not be accessable"); -} - - -const G4VFermiFragment & G4VFermiFragment::operator=(const G4VFermiFragment &) -{ - throw G4HadronicException(__FILE__, __LINE__, "G4VFermiFragment::operator= meant to not be accessable"); - return *this; -} - - -G4bool G4VFermiFragment::operator==(const G4VFermiFragment &) const -{ - return false; -} - -G4bool G4VFermiFragment::operator!=(const G4VFermiFragment &) const -{ - return true; -} - - - diff --git a/FermiBreakUp/G4VFermiFragment.hh b/FermiBreakUp/G4VFermiFragment.hh deleted file mode 100644 index 544db4b..0000000 --- a/FermiBreakUp/G4VFermiFragment.hh +++ /dev/null @@ -1,114 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiFragment.hh,v 1.3 2006/06/29 20:12:37 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef G4VFermiFragment_h -#define G4VFermiFragment_h 1 - -#include "G4FragmentVector.hh" -#include "G4NucleiProperties.hh" -#include "G4ParticleTable.hh" -#include "G4IonTable.hh" - -class G4VFermiFragment -{ -public: - G4VFermiFragment(const G4int anA, const G4int aZ, const G4int Pol, const G4double ExE): - A(anA), - Z(aZ), - Polarization(Pol), - ExcitEnergy(ExE) - {} - - virtual ~G4VFermiFragment() {}; - -protected: - G4VFermiFragment() {}; - -private: - - G4VFermiFragment(const G4VFermiFragment &right); - - const G4VFermiFragment & operator=(const G4VFermiFragment &right); - G4bool operator==(const G4VFermiFragment &right) const; - G4bool operator!=(const G4VFermiFragment &right) const; - -public: - - virtual G4FragmentVector * GetFragment(const G4LorentzVector & aMomentum) const = 0; - - G4int GetA(void) const - { - return A; - } - - G4int GetZ(void) const - { - return Z; - } - - G4int GetPolarization(void) const - { - return Polarization; - } - - G4double GetExcitationEnergy(void) const - { - return ExcitEnergy; - } - - G4double GetFragmentMass(void) const - { - return G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z,A); - } - - G4double GetTotalEnergy(void) const - { - return this->GetFragmentMass() + this->GetExcitationEnergy(); - } - -protected: - - G4int A; - - G4int Z; - - G4int Polarization; - - G4double ExcitEnergy; - - -}; - - -#endif - - diff --git a/FermiBreakUp/VFermiBreakUp.cc b/FermiBreakUp/VFermiBreakUp.cc deleted file mode 100644 index 57cf36e..0000000 --- a/FermiBreakUp/VFermiBreakUp.cc +++ /dev/null @@ -1,69 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiBreakUp.cc,v 1.5 2006/06/29 20:13:13 gunter Exp $ -// GEANT4 tag $Name: geant4-08-02 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#include "VFermiBreakUp.hh" -#include "G4HadronicException.hh" - -VFermiBreakUp::VFermiBreakUp() -{ -} - -VFermiBreakUp::VFermiBreakUp(const VFermiBreakUp &) -{ - throw G4HadronicException(__FILE__, __LINE__, "VFermiBreakUp::copy_constructor meant to not be accessable"); -} - - -VFermiBreakUp::~VFermiBreakUp() -{ -} - - -const VFermiBreakUp & VFermiBreakUp::operator=(const VFermiBreakUp &) -{ - throw G4HadronicException(__FILE__, __LINE__, "VFermiBreakUp::operator= meant to not be accessable"); - return *this; -} - - -G4bool VFermiBreakUp::operator==(const VFermiBreakUp &) const -{ - return false; -} - -G4bool VFermiBreakUp::operator!=(const VFermiBreakUp &) const -{ - return true; -} - - - diff --git a/FermiBreakUp/VFermiBreakUp.hh b/FermiBreakUp/VFermiBreakUp.hh deleted file mode 100644 index 6a1206c..0000000 --- a/FermiBreakUp/VFermiBreakUp.hh +++ /dev/null @@ -1,59 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// $Id: G4VFermiBreakUp.hh,v 1.3 2006/06/29 20:12:35 gunter Exp $ -// GEANT4 tag $Name: geant4-08-01-ref-01 $ -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (Nov 1998) - -#ifndef VFermiBreakUp_h -#define VFermiBreakUp_h 1 - -#include "globals.hh" -#include "G4FragmentVector.hh" - -class VFermiBreakUp -{ -public: - VFermiBreakUp(); - virtual ~VFermiBreakUp(); - -private: - VFermiBreakUp(const VFermiBreakUp &right); - - const VFermiBreakUp & operator=(const VFermiBreakUp &right); - G4bool operator==(const VFermiBreakUp &right) const; - G4bool operator!=(const VFermiBreakUp &right) const; - -public: - virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus) = 0; -}; - - -#endif - - diff --git a/FermiBreakUp/lib/CMakeLists.txt b/FermiBreakUp/lib/CMakeLists.txt new file mode 100644 index 0000000..95f885c --- /dev/null +++ b/FermiBreakUp/lib/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.16) +project(FermiBreakUp) + +set(CMAKE_CXX_STANDARD 17) + +set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic -Werror") + +find_package(CLHEP REQUIRED) + +set(Utilities + Utilities/DataTypes.cpp + Utilities/IntegerPartition.cpp + Utilities/NucleiProperties/VNucleiProperties.cpp + Utilities/NucleiProperties/FermiNucleiProperties.cpp + Utilities/NucleiProperties/Builder/CSVBuilder.cpp + Utilities/NucleiProperties/Builder/DefaultBuilder.cpp + Utilities/ConfigurationProperties.cpp + Utilities/Randomizer.cpp) + +set(PhaseSpace + PhaseDecay/VDecay.cpp + PhaseDecay/Decay.cpp + PhaseDecay/KopylovDecay.cpp) + +set(FragmentPool + FragmentPool/FermiFragmentPool.cpp + FragmentPool/Builder/DefaultBuilder.cpp + FragmentPool/Fragments/FermiFragment.cpp + FragmentPool/Fragments/StableFermiFragment.cpp + FragmentPool/Fragments/UnstableFermiFragment.cpp + FragmentPool/Fragments/B9FermiFragment.cpp + FragmentPool/Fragments/Be8FermiFragment.cpp + FragmentPool/Fragments/Li5FermiFragment.cpp + FragmentPool/Fragments/He5FermiFragment.cpp) + +set(FermiBreakUpModel + VFermiBreakUp.cpp + FermiParticle.cpp + FermiSplit.cpp + FermiConfigurations.cpp + CachedFermiConfigurations.cpp + FermiBreakUp.cpp) + +set(Sources ${FermiBreakUpModel} ${FragmentPool} ${Utilities} ${PhaseSpace}) + +add_library(FermiBreakUp STATIC ${Sources}) + +target_link_libraries(FermiBreakUp CLHEP::CLHEP) + +target_include_directories(FermiBreakUp PUBLIC ${PROJECT_SOURCE_DIR}) diff --git a/FermiBreakUp/lib/CachedFermiConfigurations.cpp b/FermiBreakUp/lib/CachedFermiConfigurations.cpp new file mode 100644 index 0000000..998b486 --- /dev/null +++ b/FermiBreakUp/lib/CachedFermiConfigurations.cpp @@ -0,0 +1,64 @@ +// +// Created by Artem Novikov on 24.05.2023. +// + +#include "CachedFermiConfigurations.h" +#include "Utilities/ConfigurationProperties.h" +#include "Utilities/Randomizer.h" + +CachedFermiConfigurations::CachedFermiConfigurations(NucleiData nuclei_data, FermiFloat total_energy) { + CachedFermiConfigurations::GenerateSplits(nuclei_data, total_energy); +} + +VFermiConfigurations& CachedFermiConfigurations::GenerateSplits(NucleiData nuclei_data, FermiFloat total_energy) { + auto max_fragments_count = FermiUInt(nuclei_data.mass_number); + if (nuclei_data != last_nuclei_) { + last_nuclei_ = nuclei_data; + cached_configurations_.clear(); + + for (uint32_t particle_count = 2; particle_count <= max_fragments_count; particle_count++) { + for (auto& split : FermiSplit(nuclei_data, particle_count)) { + cached_configurations_.emplace_back(std::move(split)); /// split is moved! + } + } + } + + configurations_.clear(); + weights_.clear(); + + FermiFloat total_weight = 0; + for(size_t i = 0; i < cached_configurations_.size(); ++i) { + auto split_weight = ConfigurationProperties::DecayProbability(cached_configurations_[i], nuclei_data.mass_number, total_energy); + + if (split_weight != 0) { + total_weight += split_weight; + + weights_.push_back(split_weight); + configurations_.emplace_back(i); + } + } + + std::transform(weights_.begin(), weights_.end(), + weights_.begin(), std::bind(std::divides(), std::placeholders::_1, total_weight)); + + return *this; +} + +std::optional CachedFermiConfigurations::ChooseSplit() { + if (configurations_.empty()) { + return {}; + } + + FermiFloat wheel_result = Randomizer::UniformRealDistribution(); + FermiFloat accumulated_weight = 0; + + for (size_t i = 0; i < weights_.size(); ++i) { + accumulated_weight += weights_[i]; + + if (accumulated_weight >= wheel_result) { + return cached_configurations_[configurations_[i]]; + } + } + + throw std::runtime_error("No split chosen, something went wrong!"); +} diff --git a/FermiBreakUp/lib/CachedFermiConfigurations.h b/FermiBreakUp/lib/CachedFermiConfigurations.h new file mode 100644 index 0000000..925d6d3 --- /dev/null +++ b/FermiBreakUp/lib/CachedFermiConfigurations.h @@ -0,0 +1,29 @@ +// +// Created by Artem Novikov on 24.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_CACHEDFERMICONFIGURATIONS_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_CACHEDFERMICONFIGURATIONS_H_ + +#include "FermiSplit.h" +#include "VFermiConfigurations.h" + +class CachedFermiConfigurations : public VFermiConfigurations { + public: + CachedFermiConfigurations() = default; + + CachedFermiConfigurations(NucleiData nuclei_data, FermiFloat total_energy); + + VFermiConfigurations& GenerateSplits(NucleiData nuclei_data, FermiFloat total_energy) override; + + std::optional ChooseSplit() override; + + private: + std::vector configurations_; + std::vector weights_; + + std::vector cached_configurations_; + NucleiData last_nuclei_{}; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_CACHEDFERMICONFIGURATIONS_H_ diff --git a/FermiBreakUp/lib/FermiBreakUp.cpp b/FermiBreakUp/lib/FermiBreakUp.cpp new file mode 100644 index 0000000..080ecd7 --- /dev/null +++ b/FermiBreakUp/lib/FermiBreakUp.cpp @@ -0,0 +1,33 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#include "FermiBreakUp.h" +#include "Utilities/DataTypes.h" + +FermiBreakUp::FermiBreakUp() : fermi_configurations_(DefaultConfigurations()) {} + +FermiBreakUp::FermiBreakUp(std::unique_ptr&& configurations) + : fermi_configurations_(std::move(configurations)) {} + +ParticleVector FermiBreakUp::BreakItUp(const FermiParticle& nucleus) { + /// CHECK that Excitation Energy > 0 + if (nucleus.GetExcitationEnergy() < 0) { + return {nucleus}; + } + + /// Total energy of nucleus in nucleus rest frame + FermiFloat total_energy = nucleus.GetMomentum().m(); + + /// Split the nucleus + auto fragment_split = fermi_configurations_->GenerateSplits(nucleus.GetNucleiData(), total_energy).ChooseSplit(); + if (!fragment_split.has_value()) { + return {nucleus}; + } + + return ConvertToParticles(nucleus, fragment_split.value()); +} + +std::unique_ptr FermiBreakUp::DefaultConfigurations() { + return std::make_unique(); +} diff --git a/FermiBreakUp/lib/FermiBreakUp.h b/FermiBreakUp/lib/FermiBreakUp.h new file mode 100644 index 0000000..7ce219d --- /dev/null +++ b/FermiBreakUp/lib/FermiBreakUp.h @@ -0,0 +1,31 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FERMIBREAKUP_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FERMIBREAKUP_H_ + +#include + +#include "FermiParticle.h" +#include "FermiConfigurations.h" +#include "VFermiBreakUp.h" +#include "VFermiConfigurations.h" + +class FermiBreakUp : public VFermiBreakUp { + public: + FermiBreakUp(); + + FermiBreakUp(std::unique_ptr&& configurations); + + ParticleVector BreakItUp(const FermiParticle& nucleus) override; + + ~FermiBreakUp() = default; + + private: + static std::unique_ptr DefaultConfigurations(); + + std::unique_ptr fermi_configurations_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FERMIBREAKUP_H_ diff --git a/FermiBreakUp/lib/FermiConfigurations.cpp b/FermiBreakUp/lib/FermiConfigurations.cpp new file mode 100644 index 0000000..ffa0014 --- /dev/null +++ b/FermiBreakUp/lib/FermiConfigurations.cpp @@ -0,0 +1,61 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#include + +#include "FermiConfigurations.h" +#include "Utilities/ConfigurationProperties.h" +#include "Utilities/Randomizer.h" + +FermiConfigurations::FermiConfigurations(NucleiData nuclei_data, FermiFloat total_energy) { + FermiConfigurations::GenerateSplits(nuclei_data, total_energy); +} + +VFermiConfigurations& FermiConfigurations::GenerateSplits(NucleiData nuclei_data, FermiFloat total_energy) { + configurations_.clear(); + weights_.clear(); + + /// let's split nucleus into 2,...,A fragments + FermiFloat total_weight = 0; + auto max_fragments_count = FermiUInt(nuclei_data.mass_number); + + for (uint32_t particle_count = 2; particle_count <= max_fragments_count; particle_count++) { + /// initialize configuration for k fragments + for (auto& split : FermiSplit(nuclei_data, particle_count)) { + /// non-normalized statistical weight for given channel with k fragments + auto split_weight = ConfigurationProperties::DecayProbability(split, nuclei_data.mass_number, total_energy); + if (split_weight != 0) { + total_weight += split_weight; + + weights_.push_back(split_weight); + configurations_.emplace_back(std::move(split)); /// split is moved! + } + } + } + + /// let's normalize statistical weights of channels + std::transform(weights_.begin(), weights_.end(), + weights_.begin(), std::bind(std::divides(), std::placeholders::_1, total_weight)); + + return *this; +} + +std::optional FermiConfigurations::ChooseSplit() { + if (configurations_.empty()) { + return {}; + } + + FermiFloat wheel_result = Randomizer::UniformRealDistribution(); + FermiFloat accumulated_weight = 0; + + for (size_t i = 0; i < weights_.size(); ++i) { + accumulated_weight += weights_[i]; + + if (accumulated_weight >= wheel_result) { + return configurations_[i]; + } + } + + throw std::runtime_error("No split chosen, something went wrong!"); +} diff --git a/FermiBreakUp/lib/FermiConfigurations.h b/FermiBreakUp/lib/FermiConfigurations.h new file mode 100644 index 0000000..9887084 --- /dev/null +++ b/FermiBreakUp/lib/FermiConfigurations.h @@ -0,0 +1,28 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FERMICONFIGURATIONS_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FERMICONFIGURATIONS_H_ + +#include + +#include "FermiSplit.h" +#include "VFermiConfigurations.h" + +class FermiConfigurations : public VFermiConfigurations { + public: + FermiConfigurations() = default; + + FermiConfigurations(NucleiData nuclei_data, FermiFloat total_energy); + + VFermiConfigurations& GenerateSplits(NucleiData nuclei_data, FermiFloat total_energy) override; + + std::optional ChooseSplit() override; + + private: + std::vector configurations_; + std::vector weights_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FERMICONFIGURATIONS_H_ diff --git a/FermiBreakUp/lib/FermiParticle.cpp b/FermiBreakUp/lib/FermiParticle.cpp new file mode 100644 index 0000000..c84c6f4 --- /dev/null +++ b/FermiBreakUp/lib/FermiParticle.cpp @@ -0,0 +1,104 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include +#include + +#include "Utilities/NucleiProperties/NucleiProperties.h" +#include "FermiParticle.h" + +FermiParticle::FermiParticle(MassNumber mass_number, ChargeNumber charge_number, const LorentzVector& momentum) + : mass_number_(mass_number), charge_number_(charge_number), momentum_(momentum) { + CalculateGroundStateMass(); + CalculateExcitationEnergy(); +} + +NucleiData FermiParticle::GetNucleiData() const { + return {mass_number_, charge_number_}; +} + + +MassNumber FermiParticle::GetMassNumber() const { + return mass_number_; +} + +ChargeNumber FermiParticle::GetChargeNumber() const { + return charge_number_; +} + +const LorentzVector& FermiParticle::GetMomentum() const { + return momentum_; +} + +FermiFloat FermiParticle::GetExcitationEnergy() const { + return excitation_energy_; +} + +FermiFloat FermiParticle::GetGroundStateMass() const { + return ground_state_mass_; +} + +FermiFloat FermiParticle::GetBindingEnergy() const { + return (FermiUInt(mass_number_) - FermiUInt(charge_number_)) * CLHEP::neutron_mass_c2 + + FermiFloat(charge_number_) * CLHEP::proton_mass_c2 - ground_state_mass_; +} + +bool FermiParticle::IsStable() const { + return excitation_energy_ <= 0; +} + +void FermiParticle::SetMassAndCharge(MassNumber mass_number, ChargeNumber charge_number) { + mass_number_ = mass_number; + charge_number_ = charge_number; + CalculateGroundStateMass(); +} + +void FermiParticle::SetMomentum(const LorentzVector& momentum) { + momentum_ = momentum; + CalculateExcitationEnergy(); +} + +void FermiParticle::CalculateExcitationEnergy() { + excitation_energy_ = momentum_.mag() - ground_state_mass_; + if (excitation_energy_ < 0) { +// if (excitation_energy_ < -10 * CLHEP::eV) { +// throw std::runtime_error("Excitation Energy is negative"); +// } /// TODO sometimes is raised in collaboration with other models + excitation_energy_ = 0; + } +} + +void FermiParticle::CalculateGroundStateMass() { + ground_state_mass_ = properties::NucleiProperties().GetNuclearMass(mass_number_, charge_number_); +} + +std::ostream& operator<<(std::ostream& out, const FermiParticle& particle) { + auto old_float_field = out.flags(); + out.setf(std::ios::floatfield); + + out << "Fragment: A = " << std::setw(3) << particle.GetMassNumber() + << ", Z = " << std::setw(3) << particle.GetChargeNumber(); + out.setf(std::ios::scientific, std::ios::floatfield); + + // Store user's precision setting and reset to (3) here: back-compatibility + std::streamsize old_user_precision = out.precision(); + + out << std::setprecision(3) + << ", U = " << particle.GetExcitationEnergy() / CLHEP::MeV + << " MeV IsGroundState= " << particle.IsStable() << std::endl + << " P = (" + << particle.GetMomentum().x() / CLHEP::MeV << "," + << particle.GetMomentum().y() / CLHEP::MeV << "," + << particle.GetMomentum().z() / CLHEP::MeV + << ") MeV E = " + << particle.GetMomentum().t() / CLHEP::MeV << " MeV" + << std::endl; + + /// What about Angular momentum??? + + out.setf(old_float_field, std::ios::floatfield); + out.precision(old_user_precision); + + return out; +} diff --git a/FermiBreakUp/lib/FermiParticle.h b/FermiBreakUp/lib/FermiParticle.h new file mode 100644 index 0000000..e5188f3 --- /dev/null +++ b/FermiBreakUp/lib/FermiParticle.h @@ -0,0 +1,63 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_PARTICLE_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_PARTICLE_H_ + +#include + +#include "Utilities/DataTypes.h" + +class FermiParticle; + +using ParticleVector = std::vector; + +class FermiParticle { + public: + FermiParticle() = delete; + + FermiParticle(const FermiParticle&) = default; + + FermiParticle& operator=(const FermiParticle&) = default; + + FermiParticle(MassNumber mass_number, ChargeNumber charge_number, const LorentzVector& momentum); + + NucleiData GetNucleiData() const; + + MassNumber GetMassNumber() const; + + ChargeNumber GetChargeNumber() const; + + const LorentzVector& GetMomentum() const; + + FermiFloat GetExcitationEnergy() const; + + FermiFloat GetGroundStateMass() const; + + FermiFloat GetBindingEnergy() const; + + bool IsStable() const; + + void SetMassAndCharge(MassNumber mass_number, ChargeNumber charge_number); + + void SetMomentum(const LorentzVector& momentum); + + ~FermiParticle() = default; + + private: + void CalculateExcitationEnergy(); + + void CalculateGroundStateMass(); + + MassNumber mass_number_; + ChargeNumber charge_number_; + LorentzVector momentum_; + + FermiFloat excitation_energy_ = 0; + FermiFloat ground_state_mass_ = 0; +}; + +std::ostream& operator<<(std::ostream&, const FermiParticle&); + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_PARTICLE_H_ diff --git a/FermiBreakUp/lib/FermiSplit.cpp b/FermiBreakUp/lib/FermiSplit.cpp new file mode 100644 index 0000000..b9da5c5 --- /dev/null +++ b/FermiBreakUp/lib/FermiSplit.cpp @@ -0,0 +1,139 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include +#include + +#include "FermiSplit.h" +#include "FragmentPool/FermiFragmentPool.h" +#include "Utilities/IntegerPartition.h" + +FermiSplit::FermiSplit(NucleiData nuclei_data, const uint32_t fragment_count) { + auto error = ValidateInputs(nuclei_data, fragment_count); + if (!error.empty()) { + throw std::runtime_error(error); + } + + /// Form all possible partition by combination of A partitions and Z partitions (Z partitions include null parts) + for (auto& mass_partition : IntegerPartition(nuclei_data.mass_number, fragment_count, 1)) { + for (auto& charge_partition : IntegerPartition(nuclei_data.charge_number, fragment_count, 0)) { + /// Get multiplicities provided that for each a,z pair there could be several possibilities, + /// we have to count them in order to create all possible combinations. + auto fragment_variations = FragmentVariations(mass_partition, charge_partition); + + /// if size of multiplicities is equal to K, it means that all combinations a,z exist in the fragments pool + if (fragment_variations.size() == fragment_count) { + auto additional_splits = GeneratePossibleSplits(mass_partition, charge_partition, fragment_variations); + + AddValidSplits(additional_splits); + } + } + } +} + +FermiSplit::iterator FermiSplit::begin() { + return splits_.begin(); +} + +FermiSplit::const_iterator FermiSplit::begin() const { + return splits_.cbegin(); +} + +FermiSplit::const_iterator FermiSplit::cbegin() const { + return splits_.cbegin(); +} + +FermiSplit::iterator FermiSplit::end() { + return splits_.end(); +} + +FermiSplit::const_iterator FermiSplit::end() const { + return splits_.cend(); +} + +FermiSplit::const_iterator FermiSplit::cend() const { + return splits_.cend(); +} + +const std::vector& FermiSplit::GetSplits() const { + return splits_; +} + +std::string FermiSplit::ValidateInputs(NucleiData nuclei_data, uint32_t fragment_count) { + std::string error_message = ""; + if (nuclei_data.mass_number < 0_m || nuclei_data.charge_number < 0_c) { + error_message = "Non valid arguments A = " + std::to_string(nuclei_data.mass_number) + " Z = " + + std::to_string(nuclei_data.charge_number) + " #fragments = " + std::to_string(fragment_count); + } + if (FermiUInt(nuclei_data.charge_number) > FermiUInt(nuclei_data.mass_number) + || fragment_count > FermiUInt(nuclei_data.mass_number)) { + error_message = "Non physical arguments = " + std::to_string(nuclei_data.mass_number) + " Z = " + + std::to_string(nuclei_data.charge_number) + " #fragments = " + std::to_string(fragment_count); + } + + return error_message; +} + +std::vector FermiSplit::FragmentVariations(const Partition& mass_partition, const Partition& charge_partition) { + pool::FermiFragmentPool fragment_pool; + + auto fragment_count = mass_partition.size(); + + std::vector fragment_variations; + fragment_variations.reserve(fragment_count); + + for (size_t fragment_idx = 0; fragment_idx < fragment_count; ++fragment_idx) { + auto possible_fragments = fragment_pool.Count(MassNumber(mass_partition[fragment_idx]), + ChargeNumber(charge_partition[fragment_idx])); + if (possible_fragments <= 0) { + return fragment_variations; + } + fragment_variations.push_back(possible_fragments); + } + return fragment_variations; +} + +std::vector FermiSplit::GeneratePossibleSplits( + const Partition& mass_partition, const Partition& charge_partition, const std::vector& fragment_variation) { + pool::FermiFragmentPool fragment_pool; + + size_t splits_count = + std::accumulate(fragment_variation.begin(), fragment_variation.end(), 1, std::multiplies()); + + auto fragment_count = mass_partition.size(); + + std::vector splits; + splits.resize(splits_count); + for (auto& split : splits) { + split.reserve(fragment_count); + } + + for (size_t fragment_idx = 0; fragment_idx < fragment_count; ++fragment_idx) { + auto fragment_range = fragment_pool.GetFragments(MassNumber(mass_partition[fragment_idx]), + ChargeNumber(charge_partition[fragment_idx])); + size_t offset = 0; + size_t step = fragment_variation[fragment_idx]; + for (auto fragment_it = fragment_range.first; fragment_it != fragment_range.second; ++fragment_it) { + for (size_t pos = offset++; pos < splits_count; pos += step) { + splits[pos].push_back(fragment_it->second); + } + } + } + return splits; +} + +void FermiSplit::AddValidSplits(const std::vector& possible_splits) { + for (auto split : possible_splits) { + std::sort(split.begin(), split.end(), std::greater()); + /// greater, because they already partially sorted by greater + } + /// move splits into main vector (eliminating a few of them that are repeated) + splits_.emplace_back(possible_splits[0]); + for (auto& split : possible_splits) { + if (splits_.back() == split) { + continue; + } + splits_.emplace_back(split); + } +} diff --git a/FermiBreakUp/lib/FermiSplit.h b/FermiBreakUp/lib/FermiSplit.h new file mode 100644 index 0000000..4b560ea --- /dev/null +++ b/FermiBreakUp/lib/FermiSplit.h @@ -0,0 +1,47 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FERMIPARTICLESPLIT_ICC_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FERMIPARTICLESPLIT_ICC_ + +#include +#include + +#include "FragmentPool/Fragments/FermiFragment.h" +#include "Utilities/IntegerPartition.h" + +using FragmentVector = std::vector; + +class FermiSplit { + public: + using iterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + + FermiSplit(NucleiData nuclei_data, uint32_t fragment_count); + + iterator begin(); + const_iterator begin() const; + const_iterator cbegin() const; + + iterator end(); + const_iterator end() const; + const_iterator cend() const; + + const std::vector& GetSplits() const; + + private: + static std::string ValidateInputs(NucleiData nuclei_data, uint32_t fragment_count); + + static std::vector FragmentVariations(const Partition& mass_partition, const Partition& charge_partition); + + static std::vector GeneratePossibleSplits(const Partition& mass_partition, + const Partition& charge_partition, + const std::vector& fragment_variation); + + void AddValidSplits(const std::vector& possible_splits); + + std::vector splits_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FERMIPARTICLESPLIT_ICC_ diff --git a/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.cpp b/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.cpp new file mode 100644 index 0000000..f35f48c --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.cpp @@ -0,0 +1,135 @@ +// +// Created by Artem Novikov on 25.05.2023. +// + +#include + +#include "DefaultBuilder.h" + +#include "../Fragments/StableFermiFragment.h" +#include "../Fragments/B9FermiFragment.h" +#include "../Fragments/Be8FermiFragment.h" +#include "../Fragments/He5FermiFragment.h" +#include "../Fragments/Li5FermiFragment.h" + +using CLHEP::MeV; + +namespace pool { + +void DefaultBuilder::Build(FermiFragmentPool::Map& map) const { + static const StableFermiFragment Fragment00( 1_m, 0_c, 2, 0.00*MeV ); AddFragment(map, Fragment00); + static const StableFermiFragment Fragment01( 1_m, 1_c, 2, 0.00*MeV ); AddFragment(map, Fragment01); + static const StableFermiFragment Fragment02( 2_m, 1_c, 3, 0.00*MeV ); AddFragment(map, Fragment02); + static const StableFermiFragment Fragment03( 3_m, 1_c, 2, 0.00*MeV ); AddFragment(map, Fragment03); + static const StableFermiFragment Fragment04( 3_m, 2_c, 2, 0.00*MeV ); AddFragment(map, Fragment04); + static const StableFermiFragment Fragment05( 4_m, 2_c, 1, 0.00*MeV ); AddFragment(map, Fragment05); + static const He5FermiFragment Fragment06( 5_m, 2_c, 4, 16.76*MeV ); AddFragment(map, Fragment06); /// He5 + static const Li5FermiFragment Fragment07( 5_m, 3_c, 4, 16.66*MeV ); AddFragment(map, Fragment07); /// Li5 + static const StableFermiFragment Fragment08( 6_m, 2_c, 1, 0.00*MeV ); AddFragment(map, Fragment08); + static const StableFermiFragment Fragment09( 6_m, 3_c, 3, 0.00*MeV ); AddFragment(map, Fragment09); + + static const StableFermiFragment Fragment10( 6_m, 3_c, 1, 3.56*MeV ); AddFragment(map, Fragment10); + static const StableFermiFragment Fragment11( 7_m, 3_c, 4, 0.00*MeV ); AddFragment(map, Fragment11); + static const StableFermiFragment Fragment12( 7_m, 3_c, 2, 0.48*MeV ); AddFragment(map, Fragment12); + static const StableFermiFragment Fragment13( 7_m, 4_c, 4, 0.00*MeV ); AddFragment(map, Fragment13); + static const StableFermiFragment Fragment14( 7_m, 4_c, 2, 0.43*MeV ); AddFragment(map, Fragment14); + static const StableFermiFragment Fragment15( 8_m, 3_c, 5, 0.00*MeV ); AddFragment(map, Fragment15); + static const StableFermiFragment Fragment16( 8_m, 3_c, 3, 0.98*MeV ); AddFragment(map, Fragment16); + static const Be8FermiFragment Fragment17( 8_m, 4_c, 1, 0.00*MeV ); AddFragment(map, Fragment17); /// Be8 + static const StableFermiFragment Fragment18( 9_m, 4_c, 4, 0.00*MeV ); AddFragment(map, Fragment18); + static const B9FermiFragment Fragment19( 9_m, 5_c, 4, 0.00*MeV ); AddFragment(map, Fragment19); /// B9 + + static const StableFermiFragment Fragment20( 10_m, 4_c, 1, 0.00*MeV ); AddFragment(map, Fragment20); + static const StableFermiFragment Fragment21( 10_m, 4_c, 5, 3.37*MeV ); AddFragment(map, Fragment21); + static const StableFermiFragment Fragment22( 10_m, 4_c, 8, 5.96*MeV ); AddFragment(map, Fragment22); + static const StableFermiFragment Fragment23( 10_m, 4_c, 1, 6.18*MeV ); AddFragment(map, Fragment23); + static const StableFermiFragment Fragment24( 10_m, 4_c, 5, 6.26*MeV ); AddFragment(map, Fragment24); + static const StableFermiFragment Fragment25( 10_m, 5_c, 7, 0.00*MeV ); AddFragment(map, Fragment25); + static const StableFermiFragment Fragment26( 10_m, 5_c, 3, 0.72*MeV ); AddFragment(map, Fragment26); + static const StableFermiFragment Fragment27( 10_m, 5_c, 1, 1.74*MeV ); AddFragment(map, Fragment27); + static const StableFermiFragment Fragment28( 10_m, 5_c, 3, 2.15*MeV ); AddFragment(map, Fragment28); + static const StableFermiFragment Fragment29( 10_m, 5_c, 5, 3.59*MeV ); AddFragment(map, Fragment29); + + static const StableFermiFragment Fragment30( 10_m, 6_c, 3, 0.00*MeV ); AddFragment(map, Fragment30); + static const StableFermiFragment Fragment31( 10_m, 6_c, 5, 3.35*MeV ); AddFragment(map, Fragment31); + static const StableFermiFragment Fragment32( 11_m, 5_c, 4, 0.00*MeV ); AddFragment(map, Fragment32); + static const StableFermiFragment Fragment33( 11_m, 5_c, 2, 2.13*MeV ); AddFragment(map, Fragment33); + static const StableFermiFragment Fragment34( 11_m, 5_c, 6, 4.44*MeV ); AddFragment(map, Fragment34); + static const StableFermiFragment Fragment35( 11_m, 5_c, 4, 5.02*MeV ); AddFragment(map, Fragment35); + static const StableFermiFragment Fragment36( 11_m, 5_c, 10, 6.76*MeV ); AddFragment(map, Fragment36); + static const StableFermiFragment Fragment37( 11_m, 5_c, 6, 7.29*MeV ); AddFragment(map, Fragment37); + static const StableFermiFragment Fragment38( 11_m, 5_c, 4, 7.98*MeV ); AddFragment(map, Fragment38); + static const StableFermiFragment Fragment39( 11_m, 5_c, 6, 8.56*MeV ); AddFragment(map, Fragment39); + + static const StableFermiFragment Fragment40( 11_m, 6_c, 4, 0.00*MeV ); AddFragment(map, Fragment40); + static const StableFermiFragment Fragment41( 11_m, 6_c, 2, 2.00*MeV ); AddFragment(map, Fragment41); + static const StableFermiFragment Fragment42( 11_m, 6_c, 6, 4.32*MeV ); AddFragment(map, Fragment42); + static const StableFermiFragment Fragment43( 11_m, 6_c, 4, 4.80*MeV ); AddFragment(map, Fragment43); + static const StableFermiFragment Fragment44( 11_m, 6_c, 2, 6.34*MeV ); AddFragment(map, Fragment44); + static const StableFermiFragment Fragment45( 11_m, 6_c, 8, 6.48*MeV ); AddFragment(map, Fragment45); + static const StableFermiFragment Fragment46( 11_m, 6_c, 6, 6.90*MeV ); AddFragment(map, Fragment46); + static const StableFermiFragment Fragment47( 11_m, 6_c, 4, 7.50*MeV ); AddFragment(map, Fragment47); + static const StableFermiFragment Fragment48( 11_m, 6_c, 4, 8.10*MeV ); AddFragment(map, Fragment48); + static const StableFermiFragment Fragment49( 11_m, 6_c, 6, 8.42*MeV ); AddFragment(map, Fragment49); + + static const StableFermiFragment Fragment50( 11_m, 6_c, 8, 8.66*MeV ); AddFragment(map, Fragment50); + static const StableFermiFragment Fragment51( 12_m, 5_c, 3, 0.00*MeV ); AddFragment(map, Fragment51); + static const StableFermiFragment Fragment52( 12_m, 5_c, 5, 0.95*MeV ); AddFragment(map, Fragment52); + static const StableFermiFragment Fragment53( 12_m, 5_c, 5, 1.67*MeV ); AddFragment(map, Fragment53); + static const StableFermiFragment Fragment54( 12_m, 5_c, 4, 2.65*MeV ); AddFragment(map, Fragment54); + static const StableFermiFragment Fragment55( 12_m, 6_c, 1, 0.00*MeV ); AddFragment(map, Fragment55); + static const StableFermiFragment Fragment56( 12_m, 6_c, 5, 4.44*MeV ); AddFragment(map, Fragment56); + static const StableFermiFragment Fragment57( 13_m, 6_c, 2, 0.00*MeV ); AddFragment(map, Fragment57); + static const StableFermiFragment Fragment58( 13_m, 6_c, 2, 3.09*MeV ); AddFragment(map, Fragment58); + static const StableFermiFragment Fragment59( 13_m, 6_c, 4, 3.68*MeV ); AddFragment(map, Fragment59); + + static const StableFermiFragment Fragment60( 13_m, 6_c, 6, 3.85*MeV ); AddFragment(map, Fragment60); + static const StableFermiFragment Fragment61( 13_m, 7_c, 2, 0.00*MeV ); AddFragment(map, Fragment61); + static const StableFermiFragment Fragment62( 14_m, 6_c, 1, 0.00*MeV ); AddFragment(map, Fragment62); + static const StableFermiFragment Fragment63( 14_m, 6_c, 3, 6.09*MeV ); AddFragment(map, Fragment63); + static const StableFermiFragment Fragment64( 14_m, 6_c, 8, 6.69*MeV ); AddFragment(map, Fragment64); + static const StableFermiFragment Fragment65( 14_m, 6_c, 6, 6.96*MeV ); AddFragment(map, Fragment65); + static const StableFermiFragment Fragment66( 14_m, 6_c, 5, 7.34*MeV ); AddFragment(map, Fragment66); + static const StableFermiFragment Fragment67( 14_m, 7_c, 3, 0.00*MeV ); AddFragment(map, Fragment67); + static const StableFermiFragment Fragment68( 14_m, 7_c, 1, 2.31*MeV ); AddFragment(map, Fragment68); + static const StableFermiFragment Fragment69( 14_m, 7_c, 3, 3.95*MeV ); AddFragment(map, Fragment69); + + static const StableFermiFragment Fragment70( 14_m, 7_c, 1, 4.92*MeV ); AddFragment(map, Fragment70); + static const StableFermiFragment Fragment71( 14_m, 7_c, 5, 5.11*MeV ); AddFragment(map, Fragment71); + static const StableFermiFragment Fragment72( 14_m, 7_c, 3, 5.69*MeV ); AddFragment(map, Fragment72); + static const StableFermiFragment Fragment73( 14_m, 7_c, 7, 5.83*MeV ); AddFragment(map, Fragment73); + static const StableFermiFragment Fragment74( 14_m, 7_c, 3, 6.20*MeV ); AddFragment(map, Fragment74); + static const StableFermiFragment Fragment75( 14_m, 7_c, 7, 6.44*MeV ); AddFragment(map, Fragment75); + static const StableFermiFragment Fragment76( 14_m, 7_c, 5, 7.03*MeV ); AddFragment(map, Fragment76); + static const StableFermiFragment Fragment77( 15_m, 7_c, 2, 0.00*MeV ); AddFragment(map, Fragment77); + static const StableFermiFragment Fragment78( 15_m, 7_c, 8, 5.28*MeV ); AddFragment(map, Fragment78); + static const StableFermiFragment Fragment79( 15_m, 7_c, 4, 6.32*MeV ); AddFragment(map, Fragment79); + + static const StableFermiFragment Fragment80( 15_m, 7_c, 10, 7.22*MeV ); AddFragment(map, Fragment80); + static const StableFermiFragment Fragment81( 15_m, 7_c, 8, 7.57*MeV ); AddFragment(map, Fragment81); + static const StableFermiFragment Fragment82( 15_m, 7_c, 2, 8.31*MeV ); AddFragment(map, Fragment82); + static const StableFermiFragment Fragment83( 15_m, 7_c, 4, 8.57*MeV ); AddFragment(map, Fragment83); + static const StableFermiFragment Fragment84( 15_m, 7_c, 14, 9.15*MeV ); AddFragment(map, Fragment84); + static const StableFermiFragment Fragment85( 15_m, 7_c, 14, 9.79*MeV ); AddFragment(map, Fragment85); + static const StableFermiFragment Fragment86( 15_m, 7_c, 8, 10.00*MeV ); AddFragment(map, Fragment86); + static const StableFermiFragment Fragment87( 15_m, 8_c, 2, 0.00*MeV ); AddFragment(map, Fragment87); + static const StableFermiFragment Fragment88( 15_m, 8_c, 8, 5.22*MeV ); AddFragment(map, Fragment88); + static const StableFermiFragment Fragment89( 15_m, 8_c, 4, 6.18*MeV ); AddFragment(map, Fragment89); + + static const StableFermiFragment Fragment90( 15_m, 8_c, 10, 6.83*MeV ); AddFragment(map, Fragment90); + static const StableFermiFragment Fragment91( 15_m, 8_c, 8, 7.28*MeV ); AddFragment(map, Fragment91); + static const StableFermiFragment Fragment92( 16_m, 7_c, 5, 0.00*MeV ); AddFragment(map, Fragment92); + static const StableFermiFragment Fragment93( 16_m, 7_c, 1, 0.12*MeV ); AddFragment(map, Fragment93); + static const StableFermiFragment Fragment94( 16_m, 7_c, 7, 0.30*MeV ); AddFragment(map, Fragment94); + static const StableFermiFragment Fragment95( 16_m, 7_c, 3, 0.40*MeV ); AddFragment(map, Fragment95); + static const StableFermiFragment Fragment96( 16_m, 8_c, 1, 0.00*MeV ); AddFragment(map, Fragment96); + static const StableFermiFragment Fragment97( 16_m, 8_c, 8, 6.10*MeV ); AddFragment(map, Fragment97); + static const StableFermiFragment Fragment98( 16_m, 8_c, 5, 6.92*MeV ); AddFragment(map, Fragment98); + static const StableFermiFragment Fragment99( 16_m, 8_c, 3, 7.12*MeV ); AddFragment(map, Fragment99); +} + +void DefaultBuilder::AddFragment(FermiFragmentPool::Map& map, const FermiFragment& fragment) const { + map.emplace(NucleiData{fragment.GetMassNumber(), fragment.GetChargeNumber()}, &fragment); +} + +} // namespace pool diff --git a/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.h b/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.h new file mode 100644 index 0000000..c5a39cb --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Builder/DefaultBuilder.h @@ -0,0 +1,23 @@ +// +// Created by Artem Novikov on 25.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_BUILDER_DEFAULTBUILDER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_BUILDER_DEFAULTBUILDER_H_ + +#include "VPoolBuilder.h" +#include "../Fragments/FermiFragment.h" + +namespace pool { + +class DefaultBuilder : public VPoolBuilder { + public: + void Build(FermiFragmentPool::Map& map) const override; + + private: + void AddFragment(FermiFragmentPool::Map& map, const FermiFragment& fragment) const; +}; + +} // namespace pool + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_BUILDER_DEFAULTBUILDER_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Builder/VPoolBuilder.h b/FermiBreakUp/lib/FragmentPool/Builder/VPoolBuilder.h new file mode 100644 index 0000000..a89c083 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Builder/VPoolBuilder.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 25.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_VPOOLBUILDER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_VPOOLBUILDER_H_ + +#include "../FermiFragmentPool.h" + +namespace pool { + +class VPoolBuilder { + public: + virtual void Build(FermiFragmentPool::Map& map) const = 0; + + virtual ~VPoolBuilder() = default; +}; + +} // namespace pool + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTPOOL_VPOOLBUILDER_H_ diff --git a/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.cpp b/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.cpp new file mode 100644 index 0000000..631d1d6 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.cpp @@ -0,0 +1,53 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include "FermiFragmentPool.h" + +#include "Fragments/StableFermiFragment.h" +#include "Fragments/B9FermiFragment.h" +#include "Fragments/Be8FermiFragment.h" +#include "Fragments/He5FermiFragment.h" +#include "Fragments/Li5FermiFragment.h" + +#include "Builder/DefaultBuilder.h" + +using namespace CLHEP; + +namespace pool { + +std::unique_ptr FermiFragmentPool::fragments_pool_ = nullptr; + +FermiFragmentPool::FermiFragmentPool() { + if (fragments_pool_ == nullptr) { + Build(DefaultBuilder()); + } +} + +FermiFragmentPool::FermiFragmentPool(const VPoolBuilder& builder) { + Build(builder); +} + +size_t FermiFragmentPool::Count(MassNumber mass_number, ChargeNumber charge_number) const { + return Count({mass_number, charge_number}); +} + +size_t FermiFragmentPool::Count(NucleiData nuclei) const { + return fragments_pool_->count(nuclei); +} + +FermiFragmentPool::RangeIterators FermiFragmentPool::GetFragments(MassNumber mass_number, + ChargeNumber charge_number) const { + return GetFragments({mass_number, charge_number}); +} + +FermiFragmentPool::RangeIterators FermiFragmentPool::GetFragments(NucleiData nuclei) const { + return fragments_pool_->equal_range(nuclei); +} + +void FermiFragmentPool::Build(const VPoolBuilder& builder) { + fragments_pool_ = std::make_unique(); + builder.Build(*fragments_pool_); +} + +} // namespace pool diff --git a/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.h b/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.h new file mode 100644 index 0000000..a18e00f --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/FermiFragmentPool.h @@ -0,0 +1,45 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FERMIFRAGMENTPOOL_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FERMIFRAGMENTPOOL_H_ + +#include +#include + +#include "Utilities/DataTypes.h" +#include "Fragments/FermiFragment.h" + +namespace pool { + +class VPoolBuilder; + +class FermiFragmentPool { + private: + using RangeIterators = std::pair::const_iterator, + std::multimap::const_iterator>; + public: + using Map = std::multimap; + + FermiFragmentPool(); + + FermiFragmentPool(const VPoolBuilder& builder); + + size_t Count(MassNumber mass_number, ChargeNumber charge_number) const; + + size_t Count(NucleiData nuclei) const; + + RangeIterators GetFragments(MassNumber mass_number, ChargeNumber charge_number) const; + + RangeIterators GetFragments(NucleiData nuclei) const; + + private: + void Build(const VPoolBuilder& builder); + + static std::unique_ptr fragments_pool_; +}; + +} // namespace pool + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FERMIFRAGMENTPOOL_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.cpp new file mode 100644 index 0000000..4e33915 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.cpp @@ -0,0 +1,17 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include "B9FermiFragment.h" + +B9FermiFragment::B9FermiFragment(MassNumber mass_number, + ChargeNumber charge_number, + int polarization, + FermiFloat excitation_energy) + : UnstableFermiFragment(mass_number, charge_number, polarization, excitation_energy) { + // B9 ----> alpha + alpha + proton + + Build({NucleiData{4_m, 2_c}, + NucleiData{4_m, 2_c}, + NucleiData{1_m, 1_c}}); +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.h new file mode 100644 index 0000000..7d50850 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/B9FermiFragment.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_B9FERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_B9FERMIFRAGMENT_H_ + +#include "UnstableFermiFragment.h" + +class B9FermiFragment : public UnstableFermiFragment { + public: + B9FermiFragment(MassNumber mass_number, ChargeNumber charge_number, int polarization, FermiFloat excitation_energy); + + B9FermiFragment() = delete; + + B9FermiFragment(const B9FermiFragment&) = delete; + + B9FermiFragment& operator=(const B9FermiFragment&) = delete; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_B9FERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.cpp new file mode 100644 index 0000000..1c0eeac --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.cpp @@ -0,0 +1,16 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include "Be8FermiFragment.h" + +Be8FermiFragment::Be8FermiFragment(MassNumber mass_number, + ChargeNumber charge_number, + int polarization, + FermiFloat excitation_energy) + : UnstableFermiFragment(mass_number, charge_number, polarization, excitation_energy) { + // Be8 ----> alpha + alpha + + Build({NucleiData{4_m, 2_c}, + NucleiData{4_m, 2_c}}); +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.h new file mode 100644 index 0000000..c6795f0 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/Be8FermiFragment.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_BE8FERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_BE8FERMIFRAGMENT_H_ + +#include "UnstableFermiFragment.h" + +class Be8FermiFragment : public UnstableFermiFragment { + public: + Be8FermiFragment(MassNumber mass_number, ChargeNumber charge_number, int polarization, FermiFloat excitation_energy); + + Be8FermiFragment() = delete; + + Be8FermiFragment(const Be8FermiFragment&) = delete; + + Be8FermiFragment& operator=(const Be8FermiFragment&) = delete; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_BE8FERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.cpp new file mode 100644 index 0000000..fb56403 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.cpp @@ -0,0 +1,45 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include "FermiFragment.h" +#include "Utilities/NucleiProperties/NucleiProperties.h" + +FermiFragment::FermiFragment(MassNumber mass_number, ChargeNumber charge_number, + int polarization, FermiFloat excitation_energy) + : mass_number_(mass_number), charge_number_(charge_number), + polarization(polarization), excitation_energy_(excitation_energy) {} + +MassNumber FermiFragment::GetA() const { + return GetMassNumber(); +} + +MassNumber FermiFragment::GetMassNumber() const { + return mass_number_; +} + +ChargeNumber FermiFragment::GetZ() const { + return GetChargeNumber(); +} + +ChargeNumber FermiFragment::GetChargeNumber() const { + return charge_number_; +} + +int32_t FermiFragment::GetPolarization() const { + return polarization; +} + +FermiFloat FermiFragment::GetExcitationEnergy() const { + return excitation_energy_; +} + +FermiFloat FermiFragment::GetFragmentMass() const { + return properties::NucleiProperties().GetNuclearMass(mass_number_, charge_number_); +} + +FermiFloat FermiFragment::GetTotalEnergy() const { + return GetFragmentMass() + GetExcitationEnergy(); +} + +FermiFragment::~FermiFragment() = default; diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.h new file mode 100644 index 0000000..060f11d --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/FermiFragment.h @@ -0,0 +1,48 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_FERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_FERMIFRAGMENT_H_ + +#include + +#include "Utilities/DataTypes.h" +#include "FermiParticle.h" + +class FermiFragment { + public: + FermiFragment(MassNumber mass_number, ChargeNumber charge_number, int polarization, FermiFloat excitation_energy); + + FermiFragment(const FermiFragment&) = delete; + + FermiFragment& operator=(const FermiFragment&) = delete; + + virtual ParticleVector GetFragment(const LorentzVector& momentum) const = 0; + + MassNumber GetA() const; + + MassNumber GetMassNumber() const; + + ChargeNumber GetZ() const; + + ChargeNumber GetChargeNumber() const; + + int32_t GetPolarization() const; + + FermiFloat GetExcitationEnergy() const; + + FermiFloat GetFragmentMass() const; + + FermiFloat GetTotalEnergy() const; + + virtual ~FermiFragment() = 0; + + protected: + MassNumber mass_number_; /// A + ChargeNumber charge_number_; /// Z + int32_t polarization; + FermiFloat excitation_energy_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_FERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.cpp new file mode 100644 index 0000000..e6b73f0 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.cpp @@ -0,0 +1,16 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include "He5FermiFragment.h" + +He5FermiFragment::He5FermiFragment(MassNumber mass_number, + ChargeNumber charge_number, + int polarization, + FermiFloat excitation_energy) + : UnstableFermiFragment(mass_number, charge_number, polarization, excitation_energy) { + // He5 ----> alpha + neutron + + Build({NucleiData{4_m, 2_c}, + NucleiData{1_m, 0_c}}); +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.h new file mode 100644 index 0000000..e71d114 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/He5FermiFragment.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_HE5FERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_HE5FERMIFRAGMENT_H_ + +#include "UnstableFermiFragment.h" + +class He5FermiFragment : public UnstableFermiFragment { + public: + He5FermiFragment(MassNumber mass_number, ChargeNumber charge_number, int polarization, FermiFloat excitation_energy); + + He5FermiFragment() = delete; + + He5FermiFragment(const He5FermiFragment&) = delete; + + He5FermiFragment& operator=(const He5FermiFragment&) = delete; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_HE5FERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.cpp new file mode 100644 index 0000000..e71e074 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.cpp @@ -0,0 +1,16 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include "Li5FermiFragment.h" + +Li5FermiFragment::Li5FermiFragment(MassNumber mass_number, + ChargeNumber charge_number, + int polarization, + FermiFloat excitation_energy) + : UnstableFermiFragment(mass_number, charge_number, polarization, excitation_energy) { + // Li5 ----> alpha + proton + + Build({NucleiData{4_m, 2_c}, + NucleiData{1_m, 1_c}}); +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.h new file mode 100644 index 0000000..4fe5893 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/Li5FermiFragment.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_LI5FERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_LI5FERMIFRAGMENT_H_ + +#include "UnstableFermiFragment.h" + +class Li5FermiFragment : public UnstableFermiFragment { + public: + Li5FermiFragment(MassNumber mass_number, ChargeNumber charge_number, int polarization, FermiFloat excitation_energy); + + Li5FermiFragment() = delete; + + Li5FermiFragment(const Li5FermiFragment&) = delete; + + Li5FermiFragment& operator=(const Li5FermiFragment&) = delete; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_LI5FERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.cpp new file mode 100644 index 0000000..cd3c1ef --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.cpp @@ -0,0 +1,9 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include "StableFermiFragment.h" + +ParticleVector StableFermiFragment::GetFragment(const LorentzVector& momentum) const { + return {FermiParticle(GetMassNumber(), GetChargeNumber(), momentum)}; +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.h new file mode 100644 index 0000000..e9ad073 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/StableFermiFragment.h @@ -0,0 +1,23 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_STABLEFERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_STABLEFERMIFRAGMENT_H_ + +#include "FermiFragment.h" + +class StableFermiFragment : public FermiFragment { + public: + using FermiFragment::FermiFragment; + + StableFermiFragment() = delete; + + StableFermiFragment(const StableFermiFragment&) = delete; + + StableFermiFragment& operator=(const StableFermiFragment&) = delete; + + ParticleVector GetFragment(const LorentzVector& momentum) const override; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_STABLEFERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.cpp b/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.cpp new file mode 100644 index 0000000..4a418c4 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.cpp @@ -0,0 +1,43 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include "UnstableFermiFragment.h" +#include "PhaseDecay/FermiPhaseSpaceDecay.h" +#include "Utilities/NucleiProperties/NucleiProperties.h" + +ParticleVector UnstableFermiFragment::GetFragment(const LorentzVector& momentum) const { + ParticleVector fragments_; + FermiPhaseSpaceDecay phase_decay; + + std::vector fragments_momentum = phase_decay.CalculateDecay(momentum, masses_); + + auto boost_vector = momentum.boostVector(); + + for (size_t i = 0; i < decay_data_.size(); ++i) { + fragments_.emplace_back(decay_data_[i].mass_number, decay_data_[i].charge_number, + fragments_momentum[i].boost(boost_vector)); + } + + return fragments_; +} + +void UnstableFermiFragment::Build(const std::vector& decay_data) { + decay_data_ = decay_data; + + FillMasses(); +} + +void UnstableFermiFragment::Build(std::vector&& decay_data) { + decay_data_ = std::move(decay_data); + + FillMasses(); +} + +void UnstableFermiFragment::FillMasses() { + properties::NucleiProperties properties; + masses_.reserve(decay_data_.size()); + for (const auto& decay_fragment : decay_data_) { + masses_.push_back(properties.GetNuclearMass(decay_fragment.mass_number, decay_fragment.charge_number)); + } +} diff --git a/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.h b/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.h new file mode 100644 index 0000000..8613a62 --- /dev/null +++ b/FermiBreakUp/lib/FragmentPool/Fragments/UnstableFermiFragment.h @@ -0,0 +1,36 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_UNSTABLEFERMIFRAGMENT_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_UNSTABLEFERMIFRAGMENT_H_ + +#include + +#include "FermiFragment.h" + +class UnstableFermiFragment : public FermiFragment { + public: + using FermiFragment::FermiFragment; + + UnstableFermiFragment() = delete; + + UnstableFermiFragment(const UnstableFermiFragment&) = delete; + + const UnstableFermiFragment& operator=(const UnstableFermiFragment&) = delete; + + ParticleVector GetFragment(const LorentzVector& momentum) const override; + + protected: + void Build(const std::vector& decay_data); + + void Build(std::vector&& decay_data); + + void FillMasses(); + + private: + std::vector decay_data_; + std::vector masses_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_FRAGMENTS_UNSTABLEFERMIFRAGMENT_H_ diff --git a/FermiBreakUp/lib/PhaseDecay/Decay.cpp b/FermiBreakUp/lib/PhaseDecay/Decay.cpp new file mode 100644 index 0000000..e0527ff --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/Decay.cpp @@ -0,0 +1,114 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#include +#include +#include + +#include "Decay.h" +#include "Utilities/Randomizer.h" + +static const size_t MaxTryCount = 1e6; + +std::vector Decay::CalculateDecay(const LorentzVector& momentum, + const std::vector& fragments_mass) const { + std::vector result; + result.reserve(fragments_mass.size()); + auto total_energy = momentum.m(); + + /// 2 bodies case is faster + if (fragments_mass.size() == 2) { + auto momentum4 = TwoBodyDecay(total_energy, fragments_mass[0], fragments_mass[1]); + result.push_back(momentum4.first); + result.push_back(momentum4.second); + return result; + } + + /// N body case + FermiFloat total_mass = std::accumulate(fragments_mass.begin(), fragments_mass.end(), FermiFloat(0)); + FermiFloat max_energy = total_energy - total_mass + fragments_mass[0]; + FermiFloat max_weight = CalculateMaxWeight(fragments_mass, max_energy); + + size_t try_count = 0; + FermiFloat configuration_weight = 0; + std::vector momentum_magnitudes(fragments_mass.size()); + while (configuration_weight < Randomizer::UniformRealDistribution() * max_weight) { + auto virtual_masses = CalculateVirtualMasses(fragments_mass, total_energy - total_mass); + + configuration_weight = CalculateMomentumMagnitudes(momentum_magnitudes, fragments_mass, virtual_masses); + + if (try_count++ > MaxTryCount) { + throw std::runtime_error("FermiPhaseSpaceDecay::Decay: Cannot determine decay kinematics"); + } + } + + ParticleMomentum pivot_momentum = Randomizer::IsotropicVector(momentum_magnitudes[0]); + result.emplace_back(pivot_momentum, std::sqrt(pivot_momentum.mag2() + std::pow(fragments_mass[0], 2))); // 0 + result.emplace_back(-pivot_momentum, std::sqrt(pivot_momentum.mag2() + std::pow(fragments_mass[1], 2))); // 1 + + for (size_t i = 2; i < fragments_mass.size(); ++i) { + pivot_momentum = Randomizer::IsotropicVector(momentum_magnitudes[i - 1]); + result.emplace_back(pivot_momentum, std::sqrt(pivot_momentum.mag2() + std::pow(fragments_mass[i], 2))); + Vector3 boost_vector = (-1.0) * result.back().boostVector(); + /// boost already created particles + for (auto& fragment_momentum: result) { + fragment_momentum.boost(boost_vector); + } + } + + return result; +} + +std::vector Decay::CalculateVirtualMasses(const std::vector& masses, FermiFloat energy) { + auto probability_distribution = Randomizer::ProbabilityDistribution(masses.size()); + + /// Calculate virtual masses + std::vector virtual_masses(masses.size()); + virtual_masses[0] = 0; + std::partial_sum(masses.begin(), masses.end(), virtual_masses.begin()); + + std::transform(probability_distribution.begin(), + probability_distribution.end(), + probability_distribution.begin(), + std::bind(std::multiplies(), std::placeholders::_1, energy)); + + std::transform(probability_distribution.begin(), + probability_distribution.end(), + virtual_masses.begin(), + virtual_masses.begin(), + std::plus()); + return virtual_masses; +} + +FermiFloat Decay::CalculateMomentumMagnitudes(std::vector& daughter_momentum, + const std::vector& masses, + const std::vector& virtual_masses) { + size_t sz = daughter_momentum.size(); + FermiFloat weight = 1; + for (size_t i = 0; i < sz - 1; ++i) { + daughter_momentum[i] = TwoBodyMomentum(virtual_masses[i + 1], virtual_masses[i], masses[i + 1]); + weight *= daughter_momentum[i]; + + if (daughter_momentum[i] < 0) { + std::cerr << "FermiPhaseSpaceDecay::Decay: Daughter momentum less than zero\n"; + return 0; + } + } + daughter_momentum[sz - 1] = TwoBodyMomentum(virtual_masses[sz - 2], masses[sz - 2], masses[sz - 1]); + return weight; +} + +FermiFloat Decay::CalculateMaxWeight(const std::vector& masses, FermiFloat max_energy) { + FermiFloat min_energy = 0; + FermiFloat max_weight = 1.0; + for (size_t i = 0; i < masses.size(); ++i) { + max_energy += masses[i]; + min_energy += masses[i - 1]; + max_weight *= TwoBodyMomentum(max_energy, min_energy, masses[i]); + } + return max_weight; +} + + + diff --git a/FermiBreakUp/lib/PhaseDecay/Decay.h b/FermiBreakUp/lib/PhaseDecay/Decay.h new file mode 100644 index 0000000..5e9eecc --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/Decay.h @@ -0,0 +1,26 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_DECAY_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_DECAY_H_ + +#include "VDecay.h" + +class Decay : public VDecay { + public: + std::vector CalculateDecay(const LorentzVector& momentum, + const std::vector& fragments_mass) const override; + + private: + static std::vector CalculateVirtualMasses(const std::vector& masses, FermiFloat energy); + + /// modifies vector for a optimization purposes + static FermiFloat CalculateMomentumMagnitudes(std::vector& daughter_momentum, + const std::vector& masses, + const std::vector& virtual_masses); + + static FermiFloat CalculateMaxWeight(const std::vector& masses, FermiFloat max_energy); +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_DECAY_H_ diff --git a/FermiBreakUp/lib/PhaseDecay/FermiPhaseSpaceDecay.h b/FermiBreakUp/lib/PhaseDecay/FermiPhaseSpaceDecay.h new file mode 100644 index 0000000..38d3418 --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/FermiPhaseSpaceDecay.h @@ -0,0 +1,16 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMIPHASESPACEDECAY_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMIPHASESPACEDECAY_H_ + +#include "VDecay.h" +#include "Decay.h" +#include "KopylovDecay.h" + +using FermiPhaseSpaceDecay = KopylovDecay; /// or just Decay + +static_assert(std::is_base_of::value, "Incorrect phase sampler"); + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMIPHASESPACEDECAY_H_ diff --git a/FermiBreakUp/lib/PhaseDecay/KopylovDecay.cpp b/FermiBreakUp/lib/PhaseDecay/KopylovDecay.cpp new file mode 100644 index 0000000..9efe189 --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/KopylovDecay.cpp @@ -0,0 +1,62 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#include +#include +#include + +#include "KopylovDecay.h" +#include "Utilities/Randomizer.h" + +std::vector KopylovDecay::CalculateDecay(const LorentzVector& momentum, + const std::vector& fragments_mass) const { + std::vector result(fragments_mass.size()); + + FermiFloat parent_mass = momentum.m(); + FermiFloat total_fragments_mass = std::accumulate(fragments_mass.begin(), fragments_mass.end(), FermiFloat(0)); + FermiFloat mu = total_fragments_mass; + FermiFloat mass = parent_mass; + FermiFloat kinetic_energy = parent_mass - total_fragments_mass; + + auto momentum_rest_lab = LorentzVector(0, 0, 0, parent_mass); + for (size_t i = fragments_mass.size() - 1; i > 0; --i) { + mu -= fragments_mass[i]; + kinetic_energy *= i > 1 ? BetaKopylov(i) : 0; + auto rest_mass = mu + kinetic_energy; + + auto momentum_magnitude_fragments_cm = TwoBodyMomentum(mass, fragments_mass[i], rest_mass); + if (momentum_magnitude_fragments_cm < 0) { + throw std::runtime_error("FermiPhaseSpaceDecay::KopylovNBodyDecay: Error sampling fragments momenta!!"); + } + + ParticleMomentum random_momentum = Randomizer::IsotropicVector(momentum_magnitude_fragments_cm); + auto momentum_fragments_cm = LorentzVector(random_momentum, + std::sqrt(random_momentum.mag2() + std::pow(fragments_mass[i], 2))); + auto momentum_rest_cm = LorentzVector(-random_momentum, std::sqrt(random_momentum.mag2() + std::pow(rest_mass, 2))); + + /// change framework + Vector3 boost_vector = momentum_rest_lab.boostVector(); + + momentum_rest_lab = LorentzVector(momentum_rest_cm).boost(boost_vector); + auto momentum_fragments_lab = LorentzVector(momentum_fragments_cm).boost(boost_vector); + + result[i] = momentum_fragments_lab; + + mass = rest_mass; + } + + result[0] = momentum_rest_lab; + + return result; +} + +FermiFloat KopylovDecay::BetaKopylov(size_t k) { + /// Notice that alpha > beta always + static const FermiFloat beta = 1.5; + FermiFloat alpha = 1.5 * static_cast(k - 1); + FermiFloat y1 = CLHEP::RandGamma::shoot(alpha, 1); + FermiFloat y2 = CLHEP::RandGamma::shoot(beta, 1); + + return y1 / (y1 + y2); +} diff --git a/FermiBreakUp/lib/PhaseDecay/KopylovDecay.h b/FermiBreakUp/lib/PhaseDecay/KopylovDecay.h new file mode 100644 index 0000000..67b4720 --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/KopylovDecay.h @@ -0,0 +1,19 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_KOPYLOVDECAY_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_KOPYLOVDECAY_H_ + +#include "VDecay.h" + +class KopylovDecay : public VDecay{ + public: + std::vector CalculateDecay(const LorentzVector& momentum, + const std::vector& fragments_mass) const override; + + private: + static FermiFloat BetaKopylov(size_t k); +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_KOPYLOVDECAY_H_ diff --git a/FermiBreakUp/lib/PhaseDecay/VDecay.cpp b/FermiBreakUp/lib/PhaseDecay/VDecay.cpp new file mode 100644 index 0000000..ada0b6b --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/VDecay.cpp @@ -0,0 +1,30 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#include "VDecay.h" +#include "Utilities/Randomizer.h" + +VDecay::~VDecay() = default; + +FermiFloat VDecay::TwoBodyMomentum(FermiFloat total_energy, FermiFloat mass1, FermiFloat mass2) { + FermiFloat sq_probability = + (total_energy + mass1 + mass2) * (total_energy + mass1 - mass2) * (total_energy - mass1 + mass2) + * (total_energy - mass1 - mass2) / (4.0 * std::pow(total_energy, 2)); + + if (sq_probability <= 0) { return -1; } + + return std::sqrt(sq_probability); +} + +std::pair VDecay::TwoBodyDecay(FermiFloat total_energy, + FermiFloat mass1, + FermiFloat mass2) { + auto psqr = TwoBodyMomentum(total_energy, mass1, mass2); + ParticleMomentum momentum = Randomizer::IsotropicVector(std::sqrt(psqr)); + + std::pair momentum4 = {LorentzVector(momentum, std::sqrt(psqr + std::pow(mass1, 2))), + LorentzVector(-momentum, std::sqrt(psqr + std::pow(mass2, 2)))}; + + return momentum4; +} \ No newline at end of file diff --git a/FermiBreakUp/lib/PhaseDecay/VDecay.h b/FermiBreakUp/lib/PhaseDecay/VDecay.h new file mode 100644 index 0000000..7b996a8 --- /dev/null +++ b/FermiBreakUp/lib/PhaseDecay/VDecay.h @@ -0,0 +1,27 @@ +// +// Created by Artem Novikov on 21.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VDECAY_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VDECAY_H_ + +#include +#include "Utilities/DataTypes.h" + +class VDecay { + public: + VDecay() = default; + + virtual std::vector CalculateDecay(const LorentzVector& momentum, + const std::vector& fragments_mass) const = 0; + + virtual ~VDecay() = 0; + + protected: + static FermiFloat TwoBodyMomentum(FermiFloat total_energy, FermiFloat mass1, FermiFloat mass2); + + static std::pair TwoBodyDecay( + FermiFloat total_energy, FermiFloat mass1, FermiFloat mass2); +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VDECAY_H_ diff --git a/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.cpp b/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.cpp new file mode 100644 index 0000000..74614ce --- /dev/null +++ b/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.cpp @@ -0,0 +1,2817 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#include + +#include "NucleiPropertiesTable.h" +#include "CLHEP/Units/PhysicalConstants.h" + +const MassNumber NucleiPropertiesTable::MaxMassNumber = 339_m; + +const ChargeNumber NucleiPropertiesTable::MaxChargeNumber = 136_c; + +const size_t NucleiPropertiesTable::ParticleCount = 8979; + +const size_t NucleiPropertiesTable::ShortTableCount = 137; + +NucleiPropertiesTable::NucleiPropertiesTable() { + assert(ShortTable.size() == ShortTableCount); + + assert(AtomicMassExcess.size() == ParticleCount); + assert(IndexCharge.size() == ParticleCount); + assert(IndexMass.size() == ParticleCount); +} + +FermiFloat NucleiPropertiesTable::GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const { + if (VerifyNuclei(mass_number, charge_number)) { + return GetAtomicMass(mass_number, charge_number) + - FermiFloat(charge_number) * CLHEP::electron_mass_c2 + ElectronicBindingEnergy(charge_number); + } + return 0; +} + +bool NucleiPropertiesTable::ContainsParticle(MassNumber mass_number, ChargeNumber charge_number) const { + try { + return VerifyNuclei(mass_number, charge_number); + } catch (...) { + return false; + } +} + +size_t NucleiPropertiesTable::GetIndex(MassNumber mass_number, ChargeNumber charge_number) const { + for (size_t i = ShortTable[FermiUInt(charge_number) - 8]; i < ShortTable[FermiUInt(charge_number) - 8 + 1]; ++i) { + if (IndexMass[i] == FermiUInt(mass_number)) { return i; } + } + + return -1; +} + +FermiFloat NucleiPropertiesTable::GetAtomicMass(MassNumber mass_number, ChargeNumber charge_number) const { + return AtomicMassExcess[GetIndex(mass_number, charge_number)] * CLHEP::MeV + FermiFloat(mass_number) * CLHEP::amu_c2; +} + +bool NucleiPropertiesTable::VerifyNuclei(MassNumber mass_number, ChargeNumber charge_number) const { + if (mass_number > MaxMassNumber) { + throw std::runtime_error("Nucleon number larger than 339"); + } + if (mass_number < 16_m) { + throw std::runtime_error("Nucleon number smaller than 16"); + } + if (charge_number > MaxChargeNumber) { + throw std::runtime_error("Proton number larger than 136"); + } + if (charge_number < 8_c) { + throw std::runtime_error("Proton number smaller than 8"); + } + if (FermiUInt(charge_number) > FermiUInt(mass_number)) { + throw std::runtime_error("Nucleon number smaller than Z"); + } + + return GetIndex(mass_number, charge_number) != -1; +} + +FermiFloat NucleiPropertiesTable::ElectronicBindingEnergy(ChargeNumber charge_number) { + const FermiFloat ael = 1.433e-5 * CLHEP::MeV; // electronic-binding constant + return ael * std::pow(charge_number, 2.39); +} + +std::ostream& operator<<(std::ostream& out, const NucleiPropertiesTable& table) { + out << "A Z mass\n"; + for (size_t i = 1; i < 400; ++i) { + for (size_t j = 0; j < 200; ++j) { + if (table.ContainsParticle(MassNumber(i), ChargeNumber(j))) { + out << i << ' ' << j << ' ' << table.GetNuclearMass(MassNumber(i), ChargeNumber(j)) << '\n'; + } + } + } + return out; +} + +const std::vector NucleiPropertiesTable::AtomicMassExcess = { + -4.84, -0.17, -2.62, 2.56, 2.57, 8.20, 10.41, 17.72, 22.14, 30.93, + 36.75, 46.58, 53.73, 65.03, 72.83, 82.30, 91.32, 104.63, 113.70, 1.90, + 1.21, -3.08, 0.10, -0.68, 3.08, 4.24, 9.32, 12.81, 19.94, 24.99, + 33.22, 39.88, 49.32, 53.55, 63.38, 72.02, 83.79, 93.12, 104.00, 110.24, + 124.51, 3.21, 0.47, -7.72, -5.87, -8.69, -5.01, -5.98, -0.98, 1.02, + 7.25, 10.02, 17.83, 22.44, 29.13, 33.32, 42.96, 49.56, 60.85, 68.78, + 79.59, 84.85, 98.86, 107.82, 118.93, 11.47, 6.16, -2.82, -4.93, -9.82, + -7.43, -8.97, -5.89, -5.18, -0.73, 2.48, 8.21, 12.25, 18.44, 23.14, + 30.00, 36.19, 45.38, 52.41, 61.44, 68.78, 80.14, 88.51, 99.15, 107.71, + 118.77, 16.07, 9.86, -1.50, -5.84, -14.08, -12.52, -16.39, -12.54, -14.50, + -9.34, -9.14, -3.55, -1.42, 5.36, 7.89, 14.92, 19.16, 27.56, 32.74, + 41.12, 45.42, 58.18, 65.52, 76.28, 78.06, 95.37, 101.10, 115.53, 26.48, + 18.04, 6.45, 0.40, -8.45, -10.77, -16.90, -15.48, -16.44, -14.48, -14.40, + -10.76, -9.07, -4.21, -1.54, 4.39, 8.29, 15.18, 20.06, 28.15, 30.43, + 41.11, 49.47, 58.38, 61.22, 76.24, 84.70, 95.83, 105.02, 115.13, 123.86, + 33.17, 23.60, 9.82, 3.20, -8.35, -12.73, -21.10, -20.38, -22.48, -20.51, + -22.30, -19.29, -19.51, -14.76, -13.37, -7.95, -5.73, 0.88, 4.82, 9.78, + 12.87, 22.62, 29.17, 38.44, 42.28, 55.21, 62.62, 73.26, 81.03, 92.00, + 99.17, 109.51, 117.75, 45.66, 33.78, 20.52, 11.39, 1.05, -6.50, -15.89, + -17.43, -21.94, -21.75, -24.00, -22.78, -23.46, -20.42, -19.44, -15.19, -13.41, + -8.35, -5.48, 0.62, 3.19, 11.64, 17.18, 24.86, 29.18, 39.81, 46.60, + 56.55, 64.34, 73.74, 81.71, 91.06, 98.86, 109.64, 118.58, 55.74, 43.40, + 27.74, 17.22, 3.88, -2.70, -12.30, -16.59, -23.75, -24.37, -28.32, -27.57, + -29.95, -27.26, -27.78, -24.30, -23.88, -19.20, -17.79, -12.15, -9.38, -2.64, + 1.72, 9.22, 14.05, 22.25, 27.65, 37.67, 44.48, 53.87, 60.74, 70.61, + 77.62, 87.57, 95.55, 108.22, 117.20, 70.02, 54.31, 39.29, 28.26, 14.83, + 4.91, -5.38, -11.47, -19.01, -23.12, -28.11, -28.40, -31.19, -30.27, -31.12, + -28.68, -28.57, -25.27, -24.05, -19.91, -18.31, -12.63, -8.64, -2.06, 2.62, + 9.89, 15.29, 23.56, 30.24, 38.73, 45.90, 54.66, 61.71, 69.42, 76.33, + 85.75, 92.41, 102.60, 111.67, 64.71, 45.81, 35.41, 19.95, 10.79, -2.12, + -7.76, -17.03, -22.48, -29.56, -30.96, -35.38, -34.77, -36.53, -34.39, -35.62, + -32.88, -33.30, -30.03, -28.99, -24.03, -21.24, -14.88, -11.47, -4.48, -0.29, + 7.56, 12.86, 20.22, 24.98, 34.13, 40.49, 49.31, 55.56, 64.38, 70.32, + 80.57, 88.39, 99.44, 108.94, 119.56, 61.63, 48.08, 32.16, 20.62, 7.40, + -0.99, -10.68, -16.91, -24.93, -28.87, -34.39, -35.36, -37.78, -36.97, -38.55, + -37.32, -38.06, -35.71, -35.44, -31.61, -28.86, -23.51, -19.78, -13.77, -9.53, + -2.68, 2.52, 8.92, 14.11, 21.93, 27.01, 34.92, 40.78, 48.96, 55.59, + 66.21, 72.98, 82.44, 89.86, 99.39, 107.00, 117.43, 72.94, 58.76, 40.83, + 28.78, 13.66, 4.90, -6.51, -13.13, -22.88, -27.99, -35.44, -36.65, -40.86, + -40.40, -43.48, -42.47, -44.70, -43.06, -43.79, -40.30, -38.65, -33.55, -31.07, + -25.39, -22.46, -16.25, -12.82, -5.29, -1.99, 5.59, 10.47, 17.78, 23.10, + 31.94, 37.53, 46.38, 52.43, 61.47, 67.90, 77.27, 83.65, 94.58, 102.73, + 113.66, 70.75, 54.23, 40.37, 25.05, 14.67, 2.91, -5.46, -15.45, -22.21, + -29.89, -33.58, -38.70, -39.83, -43.29, -43.77, -46.43, -45.66, -46.89, -44.53, + -43.40, -39.36, -36.84, -32.03, -29.17, -23.84, -20.44, -14.59, -10.99, -4.83, + -1.02, 6.67, 11.68, 18.97, 24.37, 32.16, 37.96, 46.09, 52.34, 60.76, + 67.62, 77.04, 84.94, 94.90, 103.72, 114.94, 63.45, 49.64, 33.53, 22.63, + 9.21, 0.58, -10.40, -17.48, -26.90, -31.52, -38.83, -40.25, -45.10, -45.86, + -49.89, -50.13, -52.30, -50.34, -50.22, -46.56, -45.53, -41.20, -39.58, -34.26, + -32.12, -26.47, -23.95, -18.00, -14.68, -7.55, -4.07, 3.59, 7.75, 15.43, + 20.41, 28.39, 33.65, 41.82, 47.47, 57.16, 64.43, 74.62, 82.79, 93.69, + 102.38, 111.73, 120.75, 62.54, 45.71, 33.84, 19.86, 10.22, -0.89, -9.43, + -19.20, -25.27, -32.96, -36.43, -42.36, -45.59, -48.85, -50.49, -52.84, -52.14, + -52.25, -49.73, -49.21, -45.76, -44.44, -40.31, -38.49, -33.56, -31.18, -26.17, + -23.29, -16.89, -13.49, -7.82, -3.08, 3.40, 8.08, 15.15, 20.46, 27.63, + 33.32, 42.08, 49.41, 58.85, 66.68, 76.33, 84.45, 94.33, 102.91, 113.18, + 122.23, 55.65, 43.31, 28.04, 17.70, 5.44, -3.49, -14.66, -21.08, -30.12, + -34.64, -42.51, -46.29, -50.60, -52.76, -56.35, -55.99, -57.47, -55.16, -55.80, + -52.64, -52.48, -48.68, -47.91, -42.70, -41.18, -36.03, -34.95, -28.74, -26.33, + -20.50, -17.34, -11.09, -7.36, -0.33, 4.13, 11.23, 16.02, 24.73, 31.21, + 40.44, 47.29, 56.85, 65.14, 74.81, 82.57, 92.36, 100.53, 110.96, 119.45, + 56.06, 40.12, 28.84, 15.02, 5.47, -5.92, -13.80, -23.16, -30.03, -38.58, + -42.74, -49.11, -51.49, -55.42, -56.16, -57.70, -56.57, -57.42, -55.50, -55.57, + -52.95, -52.15, -48.42, -47.19, -42.98, -40.95, -36.25, -34.48, -29.29, -26.39, + -20.94, -17.44, -11.52, -7.38, -1.26, 3.38, 11.38, 17.99, 26.46, 33.35, + 42.24, 49.42, 59.16, 67.00, 76.19, 83.85, 93.54, 101.79, 111.75, 119.89, + 49.40, 37.99, 23.62, 12.91, -0.02, -8.12, -18.93, -25.08, -34.60, -40.82, + -48.35, -51.93, -57.08, -58.12, -60.72, -60.01, -61.98, -60.19, -61.49, -59.16, + -59.41, -56.02, -55.99, -52.41, -51.52, -46.53, -45.36, -40.23, -38.25, -33.08, + -30.56, -24.74, -21.61, -15.59, -11.98, -3.97, 1.85, 10.08, 16.55, 25.49, + 31.98, 41.16, 48.57, 57.77, 64.45, 74.04, 81.63, 91.22, 98.68, 109.43, + 116.36, 50.51, 34.72, 23.33, 9.58, 0.26, -11.21, -18.71, -28.68, -35.08, + -43.78, -48.21, -54.92, -56.56, -59.80, -59.90, -61.97, -61.39, -62.70, -61.17, + -61.80, -59.49, -59.61, -56.92, -56.24, -52.58, -51.44, -47.38, -45.50, -41.22, + -38.83, -34.02, -31.17, -26.07, -22.48, -15.36, -9.68, -2.05, 4.18, 12.34, + 18.72, 27.49, 34.78, 43.11, 49.91, 58.60, 65.96, 74.96, 82.19, 92.22, + 100.32, 109.53, 117.79, 127.66, 44.73, 32.20, 17.59, 7.83, -4.66, -12.38, + -23.57, -30.40, -40.40, -46.39, -54.40, -56.88, -60.84, -61.30, -64.64, -64.18, + -66.44, -65.26, -66.96, -65.23, -66.27, -64.12, -64.31, -60.41, -60.47, -56.32, + -55.19, -51.09, -49.52, -45.13, -43.12, -38.13, -36.04, -28.49, -24.12, -16.22, + -11.16, -2.51, 3.21, 11.68, 18.35, 26.81, 32.82, 41.43, 47.92, 56.83, + 63.58, 73.09, 80.57, 90.14, 97.41, 107.10, 114.88, 124.74, 44.97, 29.68, + 19.13, 5.94, -2.78, -14.28, -21.97, -32.20, -38.65, -47.74, -50.88, -56.15, + -57.63, -61.22, -61.95, -64.63, -64.43, -66.51, -65.57, -66.94, -65.24, -65.73, + -63.26, -63.22, -60.38, -59.74, -56.49, -55.25, -51.52, -49.68, -45.52, -42.95, + -36.82, -32.14, -25.29, -20.33, -13.11, -7.67, 0.04, 6.55, 14.26, 19.90, + 27.81, 34.40, 42.49, 49.19, 58.21, 65.67, 74.64, 81.89, 90.96, 98.51, + 108.34, 116.71, 126.40, 29.04, 15.18, 6.18, -6.70, -14.62, -25.95, -32.89, + -42.47, -46.80, -53.60, -55.53, -60.33, -61.27, -65.07, -65.32, -68.34, -67.72, + -69.95, -68.37, -69.92, -67.56, -68.54, -65.88, -66.56, -63.43, -63.13, -59.44, + -58.51, -54.28, -52.62, -46.70, -42.79, -36.26, -32.18, -25.27, -20.72, -13.00, + -7.58, 0.25, 5.25, 13.30, 19.10, 26.89, 32.87, 41.66, 48.48, 57.33, + 63.84, 72.48, 79.38, 89.41, 97.17, 106.79, 114.54, 124.36, 27.90, 17.64, + 4.68, -4.40, -15.73, -23.83, -33.78, -39.03, -46.22, -49.83, -55.42, -57.65, + -61.74, -62.96, -65.92, -66.38, -68.75, -68.35, -69.94, -68.64, -69.71, -68.34, + -68.85, -66.61, -66.48, -63.76, -62.96, -59.74, -57.90, -53.08, -49.16, -43.55, + -39.58, -33.38, -28.95, -22.29, -17.26, -10.18, -5.34, 1.79, 7.27, 14.77, + 20.93, 29.16, 35.53, 43.59, 50.06, 58.15, 64.90, 73.89, 81.50, 90.57, + 98.18, 107.28, 114.25, 123.36, 27.47, 13.35, 4.02, -8.37, -16.59, -27.38, + -33.22, -41.36, -45.86, -53.04, -55.58, -60.78, -62.12, -66.48, -66.83, -70.17, + -69.95, -72.51, -71.50, -73.34, -71.72, -73.60, -71.53, -72.36, -69.79, -69.82, + -66.48, -65.49, -60.78, -58.06, -52.47, -49.33, -43.32, -39.65, -33.20, -29.07, + -22.19, -17.83, -11.03, -6.22, 1.29, 6.61, 14.51, 20.00, 27.85, 33.52, + 41.52, 47.71, 56.60, 63.54, 72.41, 79.39, 88.52, 95.77, 104.30, 111.82, + 121.12, 128.93, 25.99, 15.47, 2.86, -6.25, -17.27, -24.05, -32.72, -38.35, + -45.88, -49.97, -55.96, -58.46, -63.03, -64.33, -67.78, -68.58, -71.23, -71.24, + -73.23, -72.51, -74.36, -73.23, -74.26, -72.63, -72.70, -70.52, -69.58, -65.67, + -63.05, -58.20, -55.12, -49.89, -46.38, -40.77, -36.82, -30.76, -26.46, -20.33, + -15.69, -8.95, -3.72, 3.21, 8.52, 15.55, 21.35, 28.69, 34.64, 42.81, + 49.55, 57.86, 64.73, 73.08, 80.34, 88.59, 96.14, 104.78, 112.34, 119.06, + 126.63, 25.08, 11.39, 2.03, -9.77, -16.93, -26.65, -32.56, -41.17, -46.05, + -53.55, -56.33, -61.87, -63.39, -67.77, -68.56, -72.32, -72.50, -75.49, -74.93, + -77.46, -76.51, -78.45, -77.01, -78.11, -75.72, -75.68, -71.78, -70.18, -65.41, + -63.17, -58.14, -55.44, -49.91, -46.82, -40.94, -37.50, -31.51, -27.56, -20.95, + -16.44, -9.67, -5.36, 1.57, 6.70, 13.90, 19.27, 27.30, 33.43, 41.62, + 47.78, 56.23, 62.90, 71.29, 77.70, 86.49, 93.49, 100.31, 107.45, 117.57, + 126.43, 23.96, 14.19, 1.58, -6.60, -16.71, -23.58, -32.48, -38.43, -46.35, + -50.58, -56.79, -59.45, -63.81, -65.91, -69.40, -70.62, -73.73, -74.12, -76.20, + -76.48, -78.66, -78.15, -79.44, -77.86, -78.22, -75.10, -73.51, -69.62, -67.23, + -63.01, -60.52, -55.83, -52.82, -48.04, -44.71, -39.51, -35.72, -29.83, -25.46, + -19.38, -14.98, -8.72, -3.87, 2.81, 8.15, 15.48, 21.50, 29.12, 35.41, + 44.34, 50.96, 57.17, 63.75, 71.66, 78.54, 84.55, 91.52, 101.17, 109.96, + 120.63, 129.85, 23.84, 10.20, 1.72, -9.41, -16.44, -26.39, -32.55, -41.50, + -46.39, -54.03, -56.86, -62.87, -64.83, -69.56, -69.96, -74.16, -74.78, -77.50, + -77.83, -80.88, -80.92, -82.86, -81.68, -83.00, -79.93, -79.10, -75.24, -73.69, + -69.61, -67.95, -63.33, -61.31, -56.71, -54.16, -49.11, -46.04, -40.31, -36.71, + -30.72, -26.93, -20.77, -16.76, -10.04, -5.39, 1.82, 7.40, 14.91, 21.65, + 29.64, 35.60, 41.50, 47.40, 55.20, 61.10, 67.64, 73.83, 83.49, 91.71, + 102.13, 110.81, 121.10, 130.40, 13.70, 2.21, -5.77, -15.92, -23.38, -32.51, + -38.30, -46.43, -51.16, -57.79, -61.01, -65.68, -67.65, -70.72, -72.22, -75.24, + -76.36, -79.62, -80.23, -82.65, -82.43, -83.91, -81.65, -80.86, -77.70, -76.29, + -73.11, -71.59, -67.89, -66.04, -62.26, -59.90, -55.58, -52.61, -47.65, -44.13, + -38.86, -35.12, -29.56, -25.65, -19.74, -14.99, -8.65, -3.19, 4.03, 10.57, + 18.01, 22.26, 29.11, 34.80, 42.01, 47.79, 53.74, 59.72, 68.90, 76.97, + 86.94, 95.40, 105.34, 114.48, 125.42, 133.43, 143.15, 10.57, 2.43, -8.72, + -15.85, -26.07, -32.38, -41.62, -47.04, -54.97, -58.35, -64.06, -66.15, -68.84, + -70.65, -75.50, -76.77, -80.88, -81.61, -85.02, -85.01, -87.54, -85.21, -85.12, + -82.05, -81.23, -77.99, -77.55, -74.19, -73.01, -69.31, -67.71, -63.46, -61.29, + -56.47, -53.69, -48.51, -45.45, -40.04, -36.74, -30.86, -26.80, -20.32, -15.34, + -8.38, -2.73, 3.47, 8.08, 14.85, 20.04, 27.18, 32.40, 38.20, 43.66, + 52.85, 60.41, 69.99, 78.10, 87.88, 97.04, 107.55, 114.98, 125.01, 132.79, + 142.58, 13.76, 2.51, -5.78, -16.01, -23.35, -32.77, -39.18, -47.42, -52.11, + -58.50, -61.44, -66.13, -66.79, -71.82, -73.93, -78.22, -79.82, -83.41, -84.19, + -87.12, -85.41, -85.41, -83.07, -82.57, -79.91, -79.43, -76.82, -76.06, -73.09, + -71.70, -68.15, -66.11, -62.01, -59.34, -54.88, -51.89, -47.16, -43.92, -38.78, + -34.83, -28.93, -24.20, -17.43, -12.76, -6.44, -1.92, 4.09, 9.15, 15.66, + 21.10, 26.39, 31.47, 40.17, 47.65, 56.72, 64.77, 74.05, 82.79, 92.72, + 100.30, 109.44, 117.40, 126.55, 134.84, 144.50, 11.34, 2.98, -8.30, -15.84, + -26.07, -32.69, -41.82, -47.18, -54.84, -58.01, -61.74, -64.61, -70.53, -72.82, + -77.96, -79.72, -84.19, -85.24, -88.98, -87.33, -88.16, -85.94, -86.00, -83.60, + -83.69, -81.08, -81.04, -78.16, -77.53, -74.13, -72.83, -68.82, -66.89, -62.49, + -60.16, -55.56, -52.97, -47.97, -44.62, -38.86, -34.87, -28.15, -24.43, -18.49, + -14.52, -8.54, -4.18, 2.25, 7.10, 12.36, 16.81, 25.50, 32.39, 41.44, + 48.87, 58.56, 66.78, 76.38, 83.62, 92.47, 100.00, 109.24, 116.91, 126.56, + 134.49, 144.18, 14.39, 3.47, -4.97, -15.46, -22.94, -32.41, -38.71, -46.55, + -51.02, -56.89, -59.25, -65.35, -68.51, -73.80, -76.41, -81.03, -82.88, -86.62, + -86.07, -86.97, -85.53, -85.80, -84.27, -84.44, -82.42, -82.39, -80.16, -79.73, + -77.08, -75.94, -72.63, -70.76, -67.01, -64.76, -60.73, -58.24, -53.90, -50.71, + -45.63, -41.20, -35.87, -32.22, -27.05, -23.14, -17.79, -13.49, -7.74, -2.88, + 1.44, 6.15, 14.14, 20.97, 29.51, 36.72, 46.20, 54.11, 63.08, 70.29, + 78.69, 86.10, 94.85, 102.49, 111.56, 119.43, 128.59, 136.59, 145.83, 3.59, + -7.05, -14.10, -25.37, -31.76, -39.59, -44.99, -51.84, -55.75, -62.72, -66.03, + -72.20, -74.96, -80.44, -82.42, -87.17, -86.59, -88.34, -87.03, -88.20, -86.64, + -87.44, -85.47, -85.99, -83.71, -83.80, -81.27, -80.77, -77.66, -76.52, -72.86, + -71.28, -67.36, -65.57, -61.31, -58.78, -53.14, -50.47, -45.52, -42.55, -37.43, + -34.12, -28.85, -25.19, -19.57, -15.34, -11.06, -7.17, 0.77, 7.16, 15.57, + 22.39, 32.27, 39.15, 48.07, 54.83, 63.35, 70.24, 78.98, 86.12, 95.18, + 102.50, 111.68, 119.20, 128.43, 136.03, 145.19, 152.83, 4.14, -3.93, -14.12, + -21.25, -30.65, -36.95, -43.89, -49.02, -56.54, -60.65, -67.02, -70.60, -76.22, + -79.00, -83.88, -84.06, -85.93, -85.38, -86.95, -86.04, -86.90, -85.64, -86.09, + + -84.53, -84.75, -82.73, -82.32, -79.80, -78.86, -75.89, -73.69, -70.46, -68.85, + -65.21, -63.06, -58.89, -56.31, -51.97, -49.05, -44.60, -41.39, -36.69, -33.14, + -28.09, -23.95, -20.28, -16.50, -9.13, -2.81, 5.08, 12.09, 21.03, 27.83, + 36.18, 42.99, 50.99, 57.69, 66.04, 73.12, 81.64, 88.83, 97.54, 105.09, + 113.79, 121.32, 130.06, 137.76, 147.14, 155.86, 4.83, -6.24, -12.24, -22.44, + -28.92, -38.44, -44.10, -52.79, -57.10, -64.29, -68.01, -74.48, -77.39, -83.08, + -83.32, -85.97, -85.54, -87.88, -87.11, -88.68, -87.52, -88.63, -87.06, -87.82, + -85.79, -86.01, -83.58, -83.26, -80.43, -79.41, -76.30, -75.35, -71.81, -70.32, + -66.24, -64.29, -60.04, -57.81, -53.41, -50.84, -46.31, -43.37, -38.45, -35.80, + -31.63, -28.43, -21.08, -15.33, -7.50, -1.35, 7.72, 14.21, 22.49, 28.94, + 37.01, 43.25, 51.56, 58.11, 66.58, 73.29, 81.92, 88.92, 97.67, 104.75, + 113.57, 120.76, 130.18, 138.22, 148.07, 156.12, 4.91, -2.38, -12.71, -19.93, + -29.66, -36.11, -44.99, -50.43, -58.13, -62.58, -69.20, -72.87, -78.68, -79.82, + -82.70, -83.22, -85.33, -85.33, -86.99, -86.53, -87.73, -86.68, -87.35, -86.18, + -86.33, -84.72, -84.01, -81.95, -81.60, -79.15, -78.31, -75.40, -74.03, -70.57, + -68.76, -65.10, -62.94, -59.19, -56.79, -52.83, -50.05, -45.71, -43.16, -39.55, + -36.50, -29.62, -24.02, -16.76, -10.17, -2.10, 4.26, 12.03, 18.37, 26.07, + 32.20, 39.88, 46.47, 54.41, 61.01, 69.14, 76.08, 84.24, 91.33, 99.71, + 106.96, 115.86, 123.93, 133.12, 141.15, 150.34, 158.34, -4.96, -12.35, -22.89, + -29.51, -39.23, -45.16, -54.03, -58.68, -66.27, -69.98, -76.69, -77.84, -81.55, + -81.83, -84.88, -85.03, -87.43, -87.01, -88.89, -87.94, -89.30, -88.05, -88.95, + -87.39, -87.91, -85.46, -85.80, -83.45, -83.28, -80.41, -79.75, -76.35, -75.20, + -71.67, -70.31, -66.60, -64.83, -60.85, -59.04, -55.16, -53.37, -49.45, -46.84, + -40.23, -35.20, -27.93, -22.40, -13.92, -7.99, -0.12, 5.60, 13.43, 19.12, + 26.76, 32.69, 40.67, 46.84, 54.95, 61.39, 69.58, 76.17, 84.62, 91.41, + 100.25, 107.69, 116.86, 124.40, 133.57, 141.03, 150.23, 157.78, -2.49, -13.22, + -20.66, -30.54, -37.20, -46.25, -52.02, -59.94, -64.56, -71.14, -73.37, -77.08, + -78.31, -81.33, -82.28, -84.66, -84.85, -86.82, -86.54, -87.92, -87.21, -88.21, + -87.15, -87.79, -86.17, -86.56, -84.89, -84.82, -82.57, -82.03, -79.21, -78.31, + -75.19, -73.94, -70.75, -69.64, -66.32, -64.89, -61.50, -59.66, -56.31, -53.81, + -47.74, -42.78, -36.06, -30.64, -22.56, -16.97, -9.43, -3.84, 3.71, 9.47, + 16.57, 22.41, 29.90, 36.04, 43.62, 50.00, 57.69, 64.22, 72.20, 78.97, + 87.26, 94.56, 103.29, 110.72, 119.38, 126.76, 135.48, 142.97, 151.65, 159.27, + 168.47, -5.41, -13.00, -23.71, -30.60, -40.44, -46.68, -55.85, -60.53, -68.17, + -70.19, -74.89, -75.95, -79.52, -80.59, -83.64, -84.13, -86.73, -86.64, -88.76, + -88.19, -89.83, -88.78, -90.07, -88.68, -89.61, -87.80, -88.30, -86.10, -86.24, + -83.51, -83.64, -80.85, -80.41, -77.26, -76.94, -73.84, -72.78, -69.43, -68.29, + -65.03, -63.12, -57.08, -52.68, -45.93, -41.01, -33.96, -28.85, -20.76, -15.43, + -7.49, -2.18, 4.90, 10.21, 17.69, 23.32, 30.91, 36.77, 44.44, 50.47, + 58.38, 64.73, 72.92, 79.73, 88.36, 95.36, 104.01, 110.90, 119.53, 126.59, + 135.28, 142.50, 151.61, 159.41, 168.36, -3.38, -14.30, -21.98, -31.99, -39.01, + -48.22, -54.13, -62.17, -64.96, -69.54, -71.53, -75.21, -76.75, -79.79, -80.92, + -83.61, -84.18, -86.35, -86.31, -88.08, -87.64, -89.04, -88.21, -89.21, -87.94, + -88.66, -87.12, -87.52, -85.68, -85.77, -83.58, -83.43, -80.97, -80.63, -77.99, + -77.40, -74.60, -73.62, -70.56, -68.69, -63.32, -59.03, -52.73, -47.92, -41.35, + -36.23, -28.82, -23.75, -16.63, -10.59, -3.98, 1.39, 8.41, 13.94, 21.03, + 26.88, 34.04, 40.04, 47.43, 53.74, 61.52, 68.24, 76.26, 83.04, 91.24, + 98.17, 106.39, 113.36, 121.89, 129.26, 137.89, 145.11, 153.62, 161.20, 169.87, + -6.70, -14.52, -25.33, -32.52, -42.58, -48.73, -57.87, -60.99, -66.38, -68.34, + -72.70, -74.20, -78.00, -78.85, -82.21, -82.72, -85.83, -85.95, -88.50, -88.04, + -90.30, -89.57, -91.26, -90.18, -91.43, -89.91, -90.92, -89.31, -90.01, -88.00, + -88.49, -86.19, -86.36, -83.84, -83.71, -80.92, -80.55, -77.56, -76.41, -70.99, + -67.20, -61.00, -56.67, -50.21, -45.70, -38.92, -34.20, -26.77, -21.90, -14.24, + -9.49, -2.50, 2.60, 9.66, 15.08, 22.20, 27.71, 35.10, 40.91, 48.61, + 54.87, 62.90, 69.25, 77.42, 84.04, 92.18, 98.71, 107.28, 113.94, 122.46, + 129.33, 137.91, 144.77, 153.39, 160.55, 169.28, -12.31, -20.22, -30.29, -37.33, + -46.60, -50.66, -56.49, -59.35, -63.92, -66.33, -70.32, -72.14, -75.68, -77.08, + -80.07, -80.92, -83.52, -83.94, -86.25, -86.32, -88.25, -87.90, -89.34, -88.55, + -89.61, -88.41, -89.18, -87.71, -88.26, -86.45, -86.85, -84.85, -85.12, -82.83, + -82.64, -80.12, -78.97, -74.29, -70.44, -64.92, -60.69, -54.09, -49.88, -43.73, + -39.25, -32.36, -27.86, -21.64, -16.91, -10.61, -5.62, 1.01, 6.28, 12.99, + 18.51, 25.41, 31.19, 38.38, 44.58, 52.09, 58.44, 66.18, 72.77, 80.48, + 87.15, 95.16, 101.88, 109.92, 116.68, 124.86, 131.61, 139.89, 147.02, 155.59, + 163.20, 171.46, -10.02, -21.09, -27.92, -38.03, -42.42, -49.33, -52.26, -57.94, + -60.36, -65.25, -67.26, -71.54, -73.04, -76.80, -77.93, -81.15, -81.95, -84.72, + -84.61, -87.18, -86.97, -89.07, -88.43, -90.01, -88.92, -90.29, -88.87, -89.96, + -88.25, -89.23, -87.54, -88.03, -85.90, -86.26, -83.86, -83.30, -78.63, -75.50, + -69.96, -66.31, -59.97, -56.23, -50.11, -46.36, -40.39, -36.51, -30.43, -26.21, + -19.97, -15.50, -9.02, -4.24, 2.49, 7.53, 14.37, 19.62, 26.66, 32.41, + 39.93, 45.85, 53.57, 59.71, 67.45, 73.69, 81.56, 87.91, 96.07, 102.40, + 110.50, 117.15, 125.08, 131.85, 140.56, 147.23, 155.80, 162.51, 170.64, 177.49, + -8.07, -15.83, -25.60, -31.23, -38.44, -42.45, -48.52, -51.95, -57.01, -59.87, + -64.31, -66.69, -70.55, -72.53, -75.85, -77.28, -80.16, -81.06, -83.52, -83.97, + -85.78, -85.76, -87.40, -86.90, -88.20, -87.41, -88.41, -87.38, -88.19, -86.88, + -87.55, -86.08, -86.57, -84.68, -84.28, -80.21, -77.15, -71.50, -68.25, -63.15, + -59.69, -54.35, -50.77, -45.37, -41.55, -36.14, -31.97, -26.30, -21.91, -15.91, + -11.24, -5.16, -0.18, 6.12, 11.34, 17.78, 23.47, 30.54, 36.41, 43.63, + 49.67, 57.01, 63.16, 70.68, 77.16, 84.81, 91.25, 98.83, 105.50, 113.35, + 119.75, 128.00, 134.85, 142.97, 149.80, 157.41, 164.26, 172.08, 179.34, -5.29, + -15.87, -21.52, -29.50, -34.24, -41.38, -45.02, -50.91, -53.86, -59.20, -61.76, + -66.46, -68.54, -72.61, -74.07, -77.67, -78.66, -81.79, -82.30, -84.95, -85.04, + -87.10, -86.77, -88.42, -87.65, -89.08, -88.02, -89.24, -87.98, -89.20, -87.92, + -88.75, -86.99, -87.16, -83.23, -80.61, -75.52, -72.75, -67.98, -65.22, -60.19, + -57.05, -51.75, -48.66, -43.39, -39.79, -34.15, -30.24, -24.43, -20.26, -14.27, + -9.91, -3.76, 0.92, 7.48, 12.69, 19.70, 25.14, 32.32, 37.90, 45.23, + 50.99, 58.50, 64.39, 72.07, 78.24, 85.94, 92.01, 100.01, 106.28, 114.25, + 120.75, 128.77, 135.08, 142.86, 149.35, 157.03, 164.04, 174.40, 183.49, -9.41, + -17.67, -23.33, -30.69, -35.75, -42.19, -45.81, -51.16, -54.42, -59.48, -62.19, + -66.42, -68.53, -72.20, -73.86, -77.10, -78.30, -80.98, -81.73, -83.72, -83.98, + -85.68, -85.48, -86.88, -86.38, -87.43, -86.60, -87.67, -86.75, -87.95, -86.81, + -87.03, -83.75, -81.11, -76.57, -74.21, -70.26, -67.60, -63.32, -60.28, -55.51, + -52.51, -47.80, -44.23, -39.19, -35.35, -30.17, -26.10, -20.61, -16.37, -10.76, + -6.15, -0.09, 5.07, 11.66, 16.99, 23.72, 29.27, 36.17, 41.91, 48.99, + 54.79, 62.08, 68.18, 75.50, 81.68, 89.03, 95.35, 102.74, 109.59, 117.18, + 123.50, 130.82, 137.28, 144.60, 151.48, 161.46, 170.38, 180.69, 189.70, -7.99, + -13.81, -22.22, -27.53, -34.70, -38.58, -44.94, -48.50, -54.38, -57.23, -62.13, + -64.36, -68.68, -70.41, -74.31, -75.60, -78.94, -79.75, -82.49, -82.75, -84.90, + -84.75, -86.57, -86.07, -87.63, -86.80, -88.38, -87.45, -89.18, -88.09, -88.92, + -85.60, -83.76, -79.29, -77.60, -73.83, -71.92, -67.67, -65.20, -60.74, -58.30, + -53.78, -50.82, -45.94, -42.60, -37.44, -33.90, -28.51, -24.74, -19.21, -15.16, + -9.10, -4.45, 2.06, 6.95, 13.66, 18.78, 25.62, 30.96, 38.01, 43.45, + 50.54, 56.29, 63.62, 69.40, 76.64, 82.69, 90.11, 96.61, 104.03, 110.13, + 117.45, 123.51, 130.71, 137.38, 147.29, 155.59, 165.93, 174.64, 184.20, 192.49, + 201.88, -2.10, -10.61, -16.45, -24.34, -29.40, -36.14, -40.53, -46.59, -50.10, + -55.15, -57.92, -62.31, -64.68, -68.64, -70.50, -73.89, -75.27, -78.02, -78.84, + -81.00, -81.38, -83.21, -83.24, -84.84, -84.57, -85.97, -85.58, -87.39, -86.84, + -87.78, -84.92, -83.26, -79.31, -77.87, -74.78, -73.05, -69.24, -66.98, -63.41, + -61.12, -57.23, -54.36, -50.01, -46.78, -42.14, -38.63, -33.72, -30.01, -24.98, + -21.02, -15.38, -10.77, -4.70, 0.18, 6.41, 11.51, 17.98, 23.25, 29.79, + 35.20, 41.81, 47.53, 54.42, 60.19, 67.00, 73.03, 80.05, 86.75, 93.62, + 99.69, 106.52, 112.62, 119.49, 126.04, 135.32, 143.79, 153.73, 162.31, 171.38, + 179.70, 188.78, 197.28, 206.60, -7.19, -15.56, -21.22, -29.21, -33.80, -40.57, + -44.27, -50.01, -52.95, -57.99, -60.41, -64.93, -66.87, -70.82, -72.24, -75.54, + -76.39, -79.17, -79.43, -81.89, -81.96, -84.02, -83.76, -85.67, -85.32, -87.62, + -87.15, -88.68, -85.88, -84.78, -81.04, -80.23, -77.19, -76.00, -72.33, -70.83, + -67.49, -65.80, -62.05, -59.78, -55.56, -52.90, -48.38, -45.40, -40.55, -37.29, + -32.32, -28.70, -23.23, -19.01, -13.04, -8.62, -2.43, 2.23, 8.61, 13.43, + 20.03, 25.00, 31.56, 36.82, 43.72, 49.07, 55.93, 61.53, 68.90, 74.94, + 81.87, 87.48, 94.39, 99.94, 106.82, 112.90, 122.33, 130.13, 140.24, 148.27, + 157.28, 165.15, 174.31, 182.80, 191.68, 199.33, 208.78, -4.41, -10.87, -19.11, + -24.69, -31.87, -36.33, -42.19, -45.75, -50.83, -53.85, -58.42, -60.93, -64.94, + -66.90, -70.28, -71.62, -74.36, -75.26, -77.64, -78.10, -80.13, -80.46, -82.35, + -82.54, -84.83, -84.88, -86.53, -84.30, -83.28, -80.25, -79.41, -76.97, -75.79, + -72.98, -71.86, -69.09, -67.47, -64.31, -62.17, -58.51, -55.93, -51.91, -48.99, + -44.64, -41.53, -36.93, -33.35, -28.36, -24.30, -18.68, -14.34, -8.58, -3.95, + 2.04, 6.85, 13.00, 17.96, 24.18, 29.23, 35.70, 41.05, 47.50, 53.07, + 60.01, 66.04, 72.60, 78.28, 84.66, 90.22, 96.72, 102.75, 111.73, 119.62, + 129.22, 137.07, 145.58, 153.46, 162.71, 170.70, 179.17, 186.87, 195.76, 203.76, + 212.89, -10.69, -16.66, -24.83, -29.40, -35.90, -39.56, -45.30, -48.36, -53.54, + -56.13, -60.75, -62.80, -66.76, -68.17, -71.49, -72.20, -75.13, -75.73, -78.32, + -78.62, -81.01, -81.30, -84.10, -84.29, -86.48, -84.33, -83.82, -80.85, -80.52, + -78.22, -77.71, -75.16, -74.70, -72.02, -71.02, -67.89, -66.40, -62.80, -60.82, + -56.90, -54.54, -50.28, -47.66, -43.19, -40.19, -35.20, -31.54, -25.93, -21.93, + -16.24, -12.08, -6.12, -1.75, 4.34, 8.84, 15.04, 19.68, 26.15, 31.07, + 37.70, 42.76, 50.26, 55.31, 61.95, 67.17, 73.55, 78.66, 85.13, 90.81, + 99.77, 107.12, 116.69, 124.06, 132.73, 140.25, 149.41, 156.90, 165.55, 172.75, + 181.49, 189.06, 198.12, 205.85, 215.01, -5.91, -14.24, -19.75, -26.63, -30.93, + -36.77, -40.49, -45.73, -48.91, -53.60, -56.27, -60.30, -62.37, -65.72, -67.06, + -69.88, -71.07, -73.61, -74.29, -76.71, -77.48, -80.31, -81.01, -83.33, -81.75, + -81.31, -78.92, -78.78, -77.10, -76.77, -74.78, -74.42, -72.29, -71.40, -68.87, + -67.47, -64.44, -62.61, -59.24, -57.02, -53.31, -50.77, -46.78, -43.86, -39.34, + -35.76, -30.61, -26.65, -21.28, -17.19, -11.70, -7.32, -1.60, 2.89, 8.66, + 13.28, 19.33, 24.22, 30.49, 35.47, 42.49, 47.54, 53.71, 59.00, 65.05, + 70.05, 76.10, 81.76, 90.31, 97.64, 106.53, 113.82, 122.34, 129.78, 138.62, + 145.94, 154.04, 161.31, 169.65, 177.20, 185.84, 193.52, 202.32, 209.86, 218.65, + 226.49, -11.09, -18.86, -23.29, -29.69, -33.54, -39.44, -42.68, -48.05, -50.77, + -55.56, -57.62, -61.59, -63.07, -66.52, -67.74, -70.83, -71.55, -74.51, -75.34, + -78.66, -79.44, -82.32, -80.79, -80.90, -78.62, -78.94, -77.22, -77.47, -75.50, + -75.77, -73.72, -73.38, -70.90, -70.09, -67.13, -65.82, -62.62, -60.95, -57.38, + -55.36, -51.45, -49.05, -44.58, -41.38, -36.32, -32.98, -27.77, -24.17, -18.73, + -14.83, -9.19, -5.15, 0.59, 4.76, 10.77, 15.33, 21.65, 26.21, 33.19, + 37.81, 44.06, 48.88, 54.94, 59.57, 65.65, 70.90, 79.42, 86.32, 95.18, + 102.04, 110.64, 117.72, 126.42, 133.39, 141.42, 148.21, 156.66, 163.80, 172.34, + 179.75, 188.41, 195.92, 204.27, 211.71, 220.34, 228.05, -7.59, -12.81, -19.70, + -24.24, -30.30, -34.22, -39.75, -43.16, -48.03, -50.66, -54.73, -56.74, -60.23, + -62.01, -65.27, -66.40, -69.30, -70.65, -73.96, -75.19, -78.19, -77.11, -77.41, + -75.78, -76.29, -75.08, -75.42, -74.03, -74.28, -72.71, -72.46, -70.47, -69.70, + -67.34, -66.15, -63.48, -61.95, -58.87, -56.95, -53.56, -51.25, -47.34, -44.37, + -39.87, -36.46, -31.73, -28.21, -23.22, -19.35, -14.11, -10.05, -4.74, -0.56, + 4.97, 9.51, 15.38, 20.00, 26.42, 31.00, 36.86, 41.71, 47.39, 52.11, + 57.69, 62.91, 71.03, 77.92, 86.18, 93.00, 101.43, 108.40, 116.71, 123.55, + 131.24, 138.07, 146.06, 153.18, 161.38, 168.63, 176.91, 184.01, 192.37, 199.79, + 208.00, 215.57, 224.44, 232.48, -11.35, -16.06, -22.81, -26.88, -33.15, -36.68, + -42.20, -44.94, -49.60, -51.71, -55.99, -57.68, -61.56, -62.03, -66.21, -67.64, + -71.33, -72.78, -76.25, -75.24, -76.07, -74.49, -75.43, -74.22, -75.10, -73.68, + -74.46, -72.92, -73.18, -71.24, -71.02, -68.74, -68.12, -65.50, -64.51, -61.54, + -60.18, -56.87, -55.03, -51.24, -48.79, -44.40, -41.71, -37.12, -34.10, -29.19, + -25.83, -20.64, -17.05, -11.76, -8.00, -2.46, 1.67, 7.49, 11.80, 18.13, + 22.27, 28.15, 32.60, 38.32, 42.68, 48.26, 53.09, 61.18, 67.64, 75.96, + 82.40, 90.76, 97.33, 105.50, 112.08, 119.79, 126.15, 134.18, 140.88, 149.05, + 155.87, 164.12, 170.89, 179.21, 186.13, 194.48, 201.74, 210.42, 218.04, 227.25, + 235.17, -5.60, -12.75, -17.52, -23.89, -28.11, -33.76, -37.11, -41.80, -44.47, + -48.65, -51.14, -54.99, -55.96, -60.09, -62.05, -65.74, -67.50, -71.18, -70.56, + -71.59, -70.67, -71.76, -71.13, -72.06, -71.16, -71.97, -70.92, -71.21, -69.77, + -69.64, -67.83, -67.35, -65.21, -64.40, -61.92, -60.63, -57.82, -56.13, -52.84, + -50.53, -46.72, -44.13, -40.03, -37.08, -32.66, -29.33, -24.56, -20.92, -16.17, + -12.39, -7.33, -3.19, 2.26, 6.59, 12.41, 16.52, 21.96, 26.43, 31.85, + 36.20, 41.57, 46.17, 53.98, 60.47, 68.28, 74.75, 82.56, 89.07, 96.85, + 105.54, 110.69, 117.04, 124.66, 131.30, 139.11, 145.85, 153.73, 160.72, 168.42, + 175.25, 183.29, 190.54, 198.95, 206.54, 215.34, 223.18, 231.88, 239.82, 248.91, + -9.38, -16.42, -20.71, -27.02, -30.48, -35.79, -38.62, -43.46, -45.83, -50.28, + -51.27, -56.03, -58.06, -62.21, -64.25, -68.31, -67.96, -69.43, -68.41, -69.93, + -69.27, -70.72, -69.84, -71.11, -70.09, -70.91, -69.49, -69.90, -68.16, -68.24, + -66.17, -65.91, -63.52, -62.78, -60.06, -58.90, -55.76, -53.96, -50.28, -48.22, + -44.24, -41.85, -37.49, -34.67, -30.00, -26.92, -22.08, -18.77, -13.70, -10.01, + -4.55, -0.64, 5.13, 8.79, 14.27, 18.33, 23.73, 27.69, 32.98, 37.30, + 45.08, 50.95, 58.94, 65.18, 73.01, 79.10, 86.85, 92.93, 100.31, 106.25, + 113.87, 120.12, 127.87, 134.21, 142.12, 148.64, 156.62, 162.96, 170.96, 177.70, + 186.08, 193.32, 201.99, 209.43, 218.09, 225.61, 234.80, 242.69, 252.07, -11.27, + -17.71, -21.75, -27.16, -30.52, -35.28, -38.43, -42.85, -44.24, -48.99, -51.57, + -55.76, -58.00, -62.17, -62.24, -63.96, -63.64, -65.25, -65.08, -66.64, -66.29, + -67.58, -67.03, -67.85, -66.98, -67.47, -66.26, -66.43, -64.89, -64.72, -62.88, + -62.21, -60.02, -59.00, -56.34, -54.66, -51.53, -49.61, -46.19, -43.84, -39.95, + -37.17, -32.97, -29.86, -25.50, -22.19, -17.56, -13.88, -8.90, -4.86, 0.40, + 4.02, 9.15, 13.16, 18.14, 22.10, 27.13, 31.35, 38.71, 44.62, 52.39, + 58.51, 65.85, 71.88, 79.23, 85.22, 92.22, 98.17, 105.38, 111.59, 118.96, + 125.27, 132.77, 139.37, 146.87, 153.22, 160.84, 167.70, 175.62, 182.73, 190.97, + 198.31, 206.55, 214.01, 222.69, 230.64, 239.60, 247.63, 256.62, -9.87, -14.06, + -19.98, -23.50, -28.87, -31.96, -36.92, -38.51, -43.84, -46.49, -51.23, -53.58, + -58.27, -58.42, -60.67, -60.48, -62.46, -62.24, -64.22, -63.86, -65.56, -65.07, + -66.48, -65.62, -66.64, -65.50, -66.18, -64.76, -65.10, -63.35, -63.24, -61.15, + -60.58, -58.06, -56.93, -53.92, -52.52, -49.21, -47.40, -43.61, -41.31, -37.23, + -34.62, -30.33, -27.49, -22.87, -19.63, -14.68, -11.05, -5.88, -2.68, 2.44, + 6.02, 10.98, 14.54, 19.43, 23.39, 30.73, 36.14, 43.95, 49.71, 57.18, + 62.81, 70.14, 75.77, 82.86, 88.44, 95.64, 101.46, 108.84, 114.77, 122.22, + 128.40, 136.06, 142.20, 149.63, 155.96, 163.90, 170.58, 178.75, 185.64, 193.84, + 200.90, 209.60, 217.05, 225.94, 233.52, 242.53, 250.21, 259.20, -10.36, -14.38, + -19.78, -23.60, -28.63, -30.62, -36.00, -39.22, -44.02, -46.62, -51.30, -52.02, + -54.31, -54.76, -56.82, -57.16, -59.18, -59.30, -61.04, -60.91, -62.40, -62.06, + -63.12, -62.53, -63.27, -62.35, -62.79, -61.58, -61.53, -59.94, -59.49, -57.44, + -56.45, -53.96, -52.70, -49.97, -48.21, -44.93, -42.72, -39.08, -36.52, -32.67, + -29.86, -25.68, -22.52, -17.98, -14.37, -9.57, -6.44, -1.72, 1.85, 6.36, + 9.92, 14.42, 18.28, 25.28, 30.66, 38.11, 44.02, 50.80, 56.47, 63.45, + 69.08, 75.80, 81.40, 88.19, 93.98, 100.96, 106.86, 113.92, 120.07, 127.28, + 133.39, 140.79, 146.90, 154.32, 161.04, 168.81, 175.67, 183.49, 190.51, 198.80, + 206.21, 214.66, 222.23, 230.79, 238.42, 247.05, 254.75, 263.47, -6.29, -12.28, + -16.12, -20.17, -23.95, -29.94, -33.21, -38.62, -41.28, -46.54, -47.30, -50.13, + -50.26, -53.05, -53.45, -55.81, -55.93, -58.14, -58.01, -59.90, -59.64, -61.25, + -60.65, -61.95, -61.03, -61.99, -60.80, -61.29, -59.73, -59.80, -57.83, -57.35, + -55.06, -54.29, -51.65, -50.48, -47.29, -45.61, -42.08, -40.10, -36.19, -33.97, + -29.90, -27.12, -22.65, -19.54, -14.73, -12.04, -7.39, -4.28, 0.16, 3.29, + 7.75, 11.25, 18.05, 23.13, 30.69, 36.13, 43.01, 48.33, 55.18, 60.62, + 67.44, 72.68, 79.47, 84.88, 91.84, 97.36, 104.46, 110.18, 117.37, 123.25, + 130.49, 136.26, 143.78, 150.02, 157.71, 164.18, 171.98, 178.63, 186.91, 193.94, + 202.36, 209.50, 217.99, 225.24, 233.72, 240.99, 249.63, 257.10, 266.35, 274.47, + -6.43, -10.80, -15.08, -21.14, -24.92, -30.34, -33.53, -38.84, -40.15, -43.04, + -43.79, -46.59, -47.49, -49.92, -50.52, -52.72, -53.04, -54.90, -55.04, -56.78, + -56.65, -57.91, -57.46, -58.49, -57.73, -58.29, -57.23, -57.32, -55.90, -55.53, + -53.72, -53.15, -51.01, -49.94, -47.24, -45.69, -42.67, -40.68, -37.52, -35.20, + -31.63, -28.98, -24.99, -21.91, -17.38, -14.75, -10.56, -7.50, -3.52, -0.41, + 3.69, 7.21, 13.47, 18.53, 25.61, 31.13, 37.62, 42.93, 49.43, 54.84, + 61.28, 66.56, 73.04, 78.38, 84.94, 90.45, 97.17, 102.84, 109.68, 115.52, + 122.41, 128.44, 135.59, 141.46, 148.82, 155.24, 162.66, 169.27, 177.17, 184.14, + 192.20, 199.32, 207.44, 214.61, 222.71, 229.91, 238.15, 245.56, 254.49, 262.42, + 271.52, 279.64, -7.26, -13.98, -17.85, -23.90, -27.26, -33.25, -34.53, -37.99, + -38.82, -41.80, -42.83, -45.74, -46.32, -48.98, -49.32, -51.63, -51.73, -53.82, + -53.74, -55.55, -55.11, -56.58, -55.85, -56.89, -55.82, -56.47, -55.09, -55.26, + -53.54, -53.45, -51.40, -50.79, -48.17, -47.16, -44.23, -42.82, -39.50, -37.92, + -34.42, -32.29, -28.30, -26.01, -21.47, -19.31, -15.22, -12.77, -8.74, -6.09, + -2.00, 1.06, 7.30, 11.93, 18.79, 23.98, 30.78, 35.71, 42.34, 47.18, + 53.89, 58.81, 65.27, 70.30, 76.86, 81.96, 88.67, 93.99, 100.81, 106.25, + 113.18, 118.82, 125.97, 131.77, 138.85, 144.85, 152.32, 158.48, 166.48, 173.01, + 181.33, 187.99, 196.02, 202.56, 210.60, 217.40, 225.59, 232.60, 241.44, 249.11, + 258.02, 265.78, 274.82, 284.42, -4.33, -8.78, -14.92, -18.78, -24.87, -26.64, + -30.22, -31.44, -34.62, -36.09, -38.97, -40.09, -42.75, -43.55, -45.88, -46.42, + -48.52, -48.80, -50.67, -50.69, -52.19, -51.89, -52.97, -52.32, -53.04, -52.14, + -52.39, -51.13, -51.21, -49.59, -49.09, -47.00, -46.00, -43.64, -42.33, -39.64, + -38.15, -35.03, -33.03, -29.53, -27.47, -23.15, -21.05, -17.44, -15.07, -11.47, + -8.86, -5.17, -2.12, 3.69, 8.27, 14.81, 19.88, 26.22, 31.21, 37.40, + 42.29, 48.66, 53.58, 59.71, 64.78, 70.91, 76.01, 82.34, 87.64, 94.14, + 99.55, 106.22, 111.83, 118.56, 124.34, 131.25, 137.23, 144.36, 150.26, 158.12, + 164.57, 172.37, 178.98, 186.62, 193.28, 200.78, 207.51, 215.35, 222.30, 230.76, + 238.24, 246.86, 254.57, 263.86, 272.55, 281.49, 289.21, -7.65, -11.70, -18.17, + -20.16, -24.28, -25.42, -29.04, -30.43, -33.85, -35.00, -38.11, -38.95, -41.74, + -42.31, -44.83, -45.11, -47.40, -47.40, -49.31, -49.02, -50.55, -49.90, -51.14, + -50.22, -51.05, -49.83, -50.41, -48.85, -48.84, -46.83, -46.39, -44.03, -43.33, + -40.73, -39.60, -36.68, -35.11, -32.17, -30.47, -26.17, -24.55, -21.04, -19.22, + -15.68, -13.61, -10.01, -7.34, -1.53, 2.56, 8.94, 13.62, 20.22, 24.84, + 31.24, 35.71, 41.97, 46.72, 52.92, 57.58, 63.81, 68.54, 74.88, 79.81, + 86.29, 91.33, 97.92, 103.21, 109.92, 115.36, 122.25, 127.87, 135.00, 140.85, + 148.38, 154.59, 162.19, 168.40, 176.02, 182.30, 189.91, 196.29, 204.09, 210.65, + 218.95, 226.16, 234.84, 242.39, 251.19, 259.53, 268.15, 275.33, 286.50, 293.78, + 303.29, -2.46, -9.06, -11.49, -15.71, -17.48, -21.03, -22.96, -26.33, -27.89, + -31.03, -32.30, -35.04, -36.11, -38.63, -39.36, -41.65, -42.12, -44.02, -44.24, + -45.81, -45.69, -46.92, -46.47, -47.41, -46.62, -47.24, -46.18, -46.33, -44.74, + -44.33, -42.44, -41.71, -39.61, -38.51, -36.13, -34.95, -32.49, -30.90, -27.60, + -25.41, -22.34, -20.66, -17.53, -15.50, -12.13, -9.53, -4.19, 0.00, 6.05, + 10.56, 16.57, 21.18, 27.16, 31.72, 37.61, 42.40, 48.26, 52.95, 58.83, + 63.56, 69.51, 74.44, 80.56, 85.59, 91.84, 97.05, 103.46, 108.86, 115.37, + 121.01, 127.72, 133.55, 140.75, 146.82, 154.05, 160.26, 167.61, 173.85, 181.15, + 187.42, 194.94, 201.42, 209.40, 216.63, 224.90, 232.80, 241.49, 248.80, 257.09, + 265.14, 275.02, 282.39, 291.34, 298.72, 307.22, -4.33, -9.07, -10.71, -14.69, + -16.41, -20.24, -21.84, -25.44, -26.77, -30.02, -30.97, -33.98, -34.77, -37.45, + -37.92, -40.34, -40.35, -42.45, -42.30, -44.04, -43.56, -45.06, -44.26, -45.39, + -44.33, -45.02, -43.45, -43.56, -41.72, -41.35, -39.26, -38.69, -36.53, -36.02, + -33.62, -32.62, -29.61, -27.97, -25.09, -23.90, -20.85, -19.29, -16.14, -13.90, + -8.64, -4.89, 1.11, 5.25, 11.39, 15.66, 21.82, 26.04, 31.94, 36.26, + 42.33, 46.68, 52.60, 57.00, 63.03, 67.58, 73.74, 78.36, 84.62, 89.48, + 95.84, 100.85, 107.40, 112.64, 119.39, 124.86, 132.04, 137.76, 145.00, 150.89, + 158.30, 164.19, 171.49, 177.43, 184.90, 190.99, 199.02, 205.99, 214.46, 221.93, + 230.19, 237.37, 247.15, 254.94, 262.36, 269.33, 278.66, 285.71, 294.13, 301.56, + 309.85, -2.20, -6.12, -8.16, -11.88, -13.83, -17.37, -19.15, -22.34, -23.76, + -26.70, -27.81, -30.40, -31.29, -33.66, -34.51, -36.33, -36.81, -38.70, -38.63, + -40.17, -39.67, -40.92, -40.26, -41.10, -39.97, -39.92, -38.41, -38.28, -36.82, + -36.53, -34.80, -34.41, -32.39, -31.68, -29.22, -27.92, -25.77, -24.52, -21.89, + -20.39, -17.62, -15.43, -10.43, -6.88, -1.25, 2.80, 8.64, 12.89, 18.71, + 22.93, 28.50, 32.80, 38.61, 42.93, 48.61, 52.97, 58.62, 63.16, 68.96, + 73.68, 79.57, 84.44, 90.41, 95.43, 101.56, 106.79, 113.18, 118.67, 125.51, + 131.31, 138.35, 144.20, 151.35, 157.22, 164.22, 170.13, 177.14, 183.28, 190.97, + 197.88, 206.21, 213.16, 221.12, 229.40, 237.59, 245.03, 251.82, 258.80, 267.75, + 275.06, 283.15, 290.38, 298.28, 305.96, 315.23, -0.81, -5.00, -6.77, -10.63, + -12.53, -16.11, -17.53, -20.93, -22.18, -25.25, -26.25, -29.00, -29.58, -32.18, + -32.41, -34.58, -34.64, -36.47, -36.20, -37.78, -37.15, -38.22, -37.25, -37.14, + -35.88, -36.56, -35.09, -35.54, -33.88, -34.13, -32.29, -32.27, -30.01, -29.64, + -27.49, -26.73, -24.16, -23.06, -20.35, -18.54, -13.71, -10.43, -4.80, -1.12, + 4.53, 8.44, 14.23, 18.21, 23.85, 27.85, 33.54, 37.53, 43.29, 47.35, + 53.06, 57.27, 63.08, 67.39, 73.27, 77.79, 83.82, 88.48, 94.68, 99.56, + 105.94, 111.08, 117.93, 123.36, 130.26, 135.90, 142.98, 148.59, 155.59, 161.18, + 168.20, 174.01, 181.68, 188.15, 196.49, 203.11, 213.16, 218.80, 227.03, 233.85, + 241.76, 248.14, 256.18, 262.89, 271.06, 277.93, 285.36, 292.68, 301.92, 309.21, + 317.96, 325.59, 3.73, 1.51, -2.35, -4.29, -7.89, -9.55, -12.87, -14.30, + -17.34, -18.52, -21.32, -22.28, -24.82, -25.53, -27.81, -28.24, -30.25, -30.37, + -32.01, -31.82, -33.13, -32.55, -33.57, -32.80, -33.56, -32.55, -33.10, -31.86, + -32.19, -30.76, -30.81, -29.10, -28.72, -27.04, -26.32, -24.14, -23.14, -20.86, + -19.18, -14.62, -11.47, -6.39, -2.60, 2.69, 6.55, 11.83, 15.79, 21.24, + 25.23, 30.71, 34.71, 40.17, 44.23, 49.60, 53.86, 59.34, 63.62, 69.19, + 73.69, 79.40, 84.06, 89.91, 94.77, 100.84, 105.94, 112.47, 117.89, 124.45, + 130.04, 136.76, 142.31, 149.22, 154.63, 161.41, 167.18, 174.55, 181.31, 191.25, + 197.39, 204.69, 210.56, 218.20, 224.54, 230.82, 237.45, 245.17, 253.03, 260.85, + 266.77, 274.74, 281.97, 290.84, 298.14, 306.56, 314.17, 322.81, 330.90, 4.84, + 2.89, -1.16, -2.88, -6.64, -8.11, -11.61, -12.79, -16.01, -16.99, -19.94, + -20.68, -23.41, -23.86, -26.33, -26.52, -28.58, -28.48, -30.27, -29.81, -31.33, + -30.64, -31.89, -30.94, -31.94, -30.80, -31.66, -30.17, -30.75, -29.12, -29.30, + -27.45, -27.28, -25.19, -24.66, -22.52, -21.20, -16.78, -13.99, -8.95, -5.58, + -0.32, 3.13, 8.51, 12.02, 17.64, 21.35, 27.01, 30.71, 36.12, 39.80, + 45.08, 48.98, 54.46, 58.38, 63.93, 68.09, 73.77, 78.07, 83.92, 88.46, + 94.53, 99.29, 105.83, 110.91, 117.58, 122.73, 129.44, 134.67, 141.45, 146.62, + 153.48, 158.99, 166.22, 174.31, 181.55, 187.02, 194.06, 199.57, 206.79, 212.82, + 220.37, 226.60, 234.34, 240.85, 248.57, 255.16, 263.17, 270.06, 278.76, 285.76, + 294.19, 301.45, 310.04, 317.82, 327.93, 336.39, 8.00, 5.92, 2.12, 0.30, + -3.24, -4.87, -8.17, -9.50, -12.57, -13.65, -16.44, -17.26, -19.74, -20.36, + -22.51, -22.88, -24.76, -24.84, -26.49, -26.30, -27.71, -27.19, -28.42, -27.75, + -28.59, -27.68, -28.22, -27.10, -27.33, -26.04, -25.90, -24.19, -23.78, -21.92, + -20.71, -16.64, -13.89, -9.19, -5.97, -1.22, 2.25, 7.20, 10.79, 15.99, + 19.59, 24.49, 28.27, 33.67, 37.68, 42.63, 46.54, 51.67, 55.60, 60.85, + 65.00, 70.30, 74.60, 80.08, 84.59, 90.31, 95.07, 101.26, 106.37, 112.64, + 117.82, 124.19, 129.43, 135.79, 142.95, 149.60, 154.92, 161.71, 167.21, 174.17, + 179.92, 186.81, 192.57, 199.73, 205.79, 213.09, 219.19, 226.63, 232.99, 240.47, + 246.56, 254.41, 261.17, 268.89, 275.88, 283.92, 291.14, 299.52, 307.30, 317.11, + 325.54, 335.77, 344.56, 13.72, 9.42, 7.45, 3.43, 1.77, -2.03, -3.43, + -6.93, -8.09, -11.24, -12.09, -14.99, -15.52, -18.18, -18.52, -20.87, -20.88, + -23.09, -22.83, -24.79, -24.30, -25.96, -25.26, -26.61, -25.67, -26.71, -25.61, + -26.30, -24.99, -25.44, -23.90, -23.98, -22.02, -21.15, -17.17, -14.80, -10.16, + -7.39, -2.52, 0.41, 5.32, 8.34, 13.27, 16.48, 21.60, 25.00, 30.97, + 34.32, 39.22, 42.66, 47.86, 51.37, 56.54, 60.31, 65.59, 69.54, 75.01, + 79.18, 84.85, 89.32, 95.51, 100.26, 106.57, 111.45, 117.79, 122.71, 129.10, + 135.49, 142.10, 147.08, 153.85, 158.81, 165.92, 171.32, 178.19, 183.64, 190.79, + 196.46, 203.74, 209.64, 217.07, 223.13, 230.65, 236.76, 244.28, 250.57, 258.31, + 265.00, 272.99, 279.93, 288.32, 295.78, 305.61, 313.71, 323.86, 332.27, 342.06, + 350.38, 360.04, 18.31, 14.27, 12.10, 8.53, 6.41, 3.02, 1.39, -1.93, + -3.30, -6.28, -7.35, -10.05, -10.88, -13.31, -13.86, -16.05, -16.32, -18.25, + -18.23, -19.94, -19.75, -21.14, -20.68, -21.73, -21.06, -21.81, -20.90, -21.31, + -20.11, -20.20, -18.74, -17.99, -14.43, -12.05, -7.87, -5.18, -0.66, 2.14, + 6.55, 9.48, 13.94, 17.17, 21.81, 25.08, 29.89, 33.19, 37.74, 41.29, + 46.03, 49.54, 54.34, 58.13, 63.04, 66.99, 72.09, 76.27, 81.61, 86.04, + 91.89, 96.63, 102.60, 107.45, 113.47, 118.38, 124.44, 130.81, 137.18, 142.12, + 148.51, 153.72, 160.18, 165.60, 172.09, 177.56, 184.38, 190.12, 197.04, 202.88, + 210.00, 216.07, 223.26, 229.21, 236.65, 243.05, 250.39, 257.04, 264.77, 271.72, + 279.79, 287.29, 296.79, 304.87, 314.72, 323.08, 332.57, 340.92, 350.23, 358.71, + 370.62, 20.06, 15.55, 13.24, 9.13, 7.20, 3.63, 2.22, -0.77, -1.66, + -4.43, -5.06, -8.06, -8.57, -10.85, -11.19, -13.40, -13.54, -15.53, -15.32, + -17.17, -16.70, -18.22, -17.57, -18.74, -17.86, -18.83, -17.72, -18.23, -16.78, + -16.33, -12.84, -10.94, -6.77, -4.46, -0.09, 2.29, 6.39, 8.88, 13.47, + 16.24, 20.76, 23.61, 27.99, 30.89, 35.35, 38.45, 43.12, 46.24, 51.00, + 54.40, 59.22, 62.81, 67.91, 71.72, 77.01, 81.12, 86.95, 91.38, 97.37, + 101.92, 107.96, 112.56, 118.61, 123.27, 129.45, 134.37, 142.14, 146.84, 153.41, + 158.51, 164.98, 170.12, 176.96, 182.35, 189.27, 194.19, 201.90, 207.65, 214.77, + 220.53, 227.92, 234.01, 241.36, 247.62, 255.37, 261.99, 270.07, 277.24, 286.75, + 294.49, 304.23, 312.30, 321.64, 329.64, 338.90, 349.46, 358.45, 366.19, 375.51, + 22.63, 18.32, 15.97, 12.34, 10.59, 7.44, 6.14, 3.59, 2.28, -0.47, + -1.43, -3.78, -4.30, -6.37, -6.69, -8.64, -8.90, -10.62, -10.66, -12.09, + -12.06, -12.96, -12.77, -13.58, -12.77, -13.28, -12.27, -11.87, -8.75, -6.99, + -3.23, -0.96, 2.94, 4.89, 8.46, 10.94, 14.61, 17.20, 21.35, 24.14, + 28.09, 30.90, 34.95, 37.98, 42.25, 45.33, 49.71, 53.07, 57.54, 61.14, + 65.86, 69.68, 74.60, 78.55, 84.22, 88.61, 94.35, 98.86, 104.56, 109.14, + 114.87, 119.52, 125.40, 130.27, 137.69, 142.60, 148.83, 153.87, 160.07, 165.14, + 171.59, 177.02, 183.61, 188.29, 195.95, 201.68, 208.53, 214.22, 221.32, 227.40, + 234.61, 240.89, 248.31, 254.96, 262.70, 269.90, 279.08, 286.78, 296.28, 304.32, + 313.44, 321.30, 332.15, 339.79, 348.48, 356.23, 365.01, 373.06, 382.03, 25.91, + 23.49, 19.43, 17.57, 14.04, 12.79, 9.69, 8.70, 5.75, 4.74, 1.93, + 1.27, -1.13, -1.53, -3.66, -3.82, -6.10, -6.14, -8.06, -7.92, -9.28, + -8.93, -10.06, -9.30, -10.27, -9.28, -9.26, -6.17, -4.77, -1.04, 0.70, + 4.14, 5.92, 9.20, 11.07, 14.60, 16.93, 20.93, 23.23, 27.08, 29.47, + 33.43, 36.00, 40.16, 42.87, 47.17, 50.15, 54.60, 57.82, 62.56, 66.00, + 70.92, 74.51, 80.22, 84.24, 89.91, 94.15, 99.88, 104.15, 109.88, 114.19, + 120.04, 124.59, 130.74, 136.77, 143.18, 147.86, 153.93, 158.73, 165.13, 170.23, + 176.82, 181.16, 188.87, 194.31, 201.16, 206.37, 213.44, 219.40, 226.59, 232.60, + 240.09, 246.45, 254.19, 261.08, 270.26, 277.61, 287.05, 294.65, 303.68, 311.29, + 321.35, 328.68, 337.33, 344.75, 353.67, 361.37, 370.38, 377.82, 386.97, 394.85, + 28.99, 26.71, 23.09, 21.23, 18.12, 16.90, 13.92, 13.01, 10.15, 9.04, + 6.52, 5.77, 3.55, 3.02, 1.00, 0.67, -1.45, -1.69, -3.18, -2.96, + -4.09, -3.67, -4.64, -4.03, -4.01, -1.35, -0.07, 3.24, 5.00, 7.45, + 8.84, 11.72, 13.40, 16.73, 18.80, 22.28, 24.41, 27.92, 30.28, 33.90, + 36.37, 40.14, 42.82, 46.74, 49.67, 53.79, 57.01, 61.36, 64.82, 69.35, + 72.91, 78.18, 82.36, 87.70, 91.91, 97.35, 101.64, 107.00, 111.31, 116.81, + 121.38, 127.18, 133.34, 139.31, 144.00, 149.87, 154.58, 160.69, 165.72, 171.97, + 176.41, 183.75, 189.28, 195.75, 200.91, 207.69, 213.77, 220.65, 226.72, 233.82, + 240.21, 247.62, 254.51, 263.37, 270.71, 279.88, 287.50, 297.14, 304.34, 312.65, + 319.95, 328.30, 335.70, 344.44, 352.00, 361.10, 369.18, 376.95, 384.87, 395.70, + 403.74, 30.70, 28.93, 25.37, 24.02, 20.70, 19.44, 16.76, 15.60, 12.76, + 11.91, 9.34, 8.77, 6.31, 5.93, 3.47, 3.26, 1.38, 1.59, 0.15, + 0.53, -0.81, -0.17, -0.62, 1.93, 2.85, 6.05, 7.36, 9.36, 10.48, + 13.13, 14.34, 17.74, 19.38, 22.47, 24.24, 27.68, 29.62, 33.12, 35.15, + 38.86, 41.14, 45.02, 47.63, 51.63, 54.46, 58.78, 61.88, 66.51, 69.71, + 74.98, 78.85, 84.18, 87.99, 93.41, 97.41, 102.78, 106.79, 112.29, 116.49, + 122.34, 126.99, 134.26, 138.77, 144.51, 148.98, 154.98, 159.74, 165.99, 169.94, + 177.48, 182.65, 189.16, 193.90, 200.79, 206.46, 213.51, 219.24, 226.41, 232.47, + 239.91, 246.49, 255.35, 262.35, 271.45, 278.74, 287.65, 294.55, 302.79, 309.74, + 318.10, 325.40, 334.03, 341.32, 350.58, 358.02, 366.85, 373.41, 384.15, 391.86, + 398.87, 406.70, 34.82, 32.90, 29.58, 28.05, 25.38, 24.33, 21.42, 20.17, + 17.52, 16.52, 14.05, 13.27, 11.01, 10.50, 8.34, 8.24, 6.86, 6.93, + 5.60, 5.80, 5.28, 7.48, 8.35, 10.90, 12.24, 13.43, 14.34, 16.53, + 17.92, 20.69, 22.05, 24.74, 26.40, 29.40, 31.28, 34.32, 36.30, 39.63, + 41.86, 45.41, 48.00, 51.64, 54.46, 58.40, 61.48, 65.58, 68.94, 73.87, + 77.59, 82.74, 86.59, 91.69, 95.63, 100.69, 104.69, 109.89, 114.12, 119.61, + 124.26, 131.31, 135.91, 141.45, 145.76, 151.54, 156.23, 162.23, 166.06, 173.25, + 178.42, 184.59, 189.47, 195.92, 201.59, 208.40, 214.14, 220.99, 227.09, 234.20, + 240.79, 249.30, 256.30, 265.08, 272.35, 280.23, 287.06, 295.06, 301.99, 309.98, + 317.17, 325.39, 332.81, 341.42, 348.86, 356.74, 364.33, 374.70, 382.37, 389.17, + 397.03, 405.88, 413.93, 37.16, 35.54, 32.23, 31.36, 28.40, 27.14, 24.10, + 23.07, 20.17, 19.32, 16.58, 16.01, 13.66, 13.50, 11.76, 11.75, 10.12, + 10.30, 9.42, 11.52, 11.96, 14.40, 15.10, 16.37, 16.85, 19.01, 20.20, + 22.51, 23.78, 26.21, 27.33, 30.07, 31.39, 34.36, 35.94, 39.22, 41.09, + 44.62, 46.79, 50.40, 52.85, 56.81, 59.52, 63.59, 66.59, 71.51, 74.87, + 80.03, 83.53, 88.54, 92.23, 97.27, 100.93, 106.12, 109.99, 115.55, 119.90, + 125.91, 131.18, 136.72, 140.86, 146.44, 150.96, 156.88, 160.60, 167.72, 172.61, + 178.78, 183.39, 189.84, 195.16, 202.06, 207.46, 214.33, 220.09, 227.26, 233.53, + 242.07, 248.71, 257.41, 264.23, 271.66, 278.18, 286.18, 292.88, 300.84, 307.65, + 315.87, 322.96, 331.55, 338.23, 346.65, 355.49, 364.01, 371.40, 378.38, 385.93, + 394.77, 402.52, 411.69, 419.97, 428.76, 44.94, 41.61, 40.40, 37.18, 35.65, + 32.78, 31.34, 28.68, 27.41, 24.67, 23.73, 21.37, 20.93, 19.17, 18.83, + 17.19, 17.01, 16.08, 17.83, 18.21, 20.70, 21.47, 21.25, 21.76, 23.67, + 24.38, 26.64, 27.19, 29.25, 30.33, 32.60, 33.90, 36.49, 38.01, 40.86, + 42.73, 45.85, 48.06, 51.26, 53.69, 57.31, 59.99, 63.88, 66.62, 71.01, + 74.56, 79.44, 82.89, 87.57, 91.20, 95.95, 99.62, 104.48, 108.38, 113.58, + 117.95, 123.75, 128.02, 134.18, 138.34, 143.82, 148.19, 153.87, 157.57, 164.41, + 169.29, 175.22, 179.75, 185.89, 191.21, 197.80, 203.22, 209.77, 215.56, 222.43, + 228.71, 236.92, 243.54, 251.86, 257.73, 265.19, 271.80, 279.43, 286.06, 293.68, + 300.50, 308.34, 315.35, 323.38, 330.46, 338.62, 347.19, 355.38, 362.74, 371.18, + 377.29, 385.80, 393.71, 402.65, 410.66, 420.19, 426.83, 435.92, 48.07, 44.58, + 43.06, 39.87, 38.37, 35.33, 34.26, 31.08, 30.11, 27.35, 26.82, 24.75, + 24.39, 22.38, 22.17, 20.87, 22.64, 22.50, 23.98, 24.12, 25.12, 25.22, + 27.14, 27.45, 29.08, 29.29, 31.21, 31.85, 34.08, 34.90, 37.40, 38.52, + 41.34, 42.84, 45.93, 47.77, 50.95, 53.01, 56.59, 58.90, 62.75, 65.16, + 69.48, 72.72, 77.54, 80.63, 85.32, 88.60, 93.31, 96.63, 101.48, 105.04, + 110.28, 114.35, 119.79, 124.13, 129.57, 133.89, 139.49, 143.75, 149.42, 152.90, + 159.56, 164.14, 170.02, 174.40, 180.55, 185.52, 192.16, 197.27, 203.82, 209.32, + 216.17, 222.13, 230.37, 236.67, 244.89, 250.18, 257.60, 263.79, 271.39, 277.80, + 285.48, 291.97, 299.80, 306.58, 314.63, 321.38, 329.57, 337.51, 345.73, 352.64, + 361.00, 368.28, 377.08, 383.52, 392.31, 400.18, 408.10, 415.60, 424.67, 434.44, + 441.78, 52.26, 49.04, 47.41, 44.31, 42.85, 39.93, 38.55, 35.82, 34.88, + 32.85, 32.15, 30.21, 29.73, 28.29, 29.70, 29.47, 31.48, 29.80, 31.09, + 31.22, 32.45, 32.32, 33.55, 33.69, 35.22, 35.76, 37.54, 38.28, 40.38, + 41.42, 43.90, 45.33, 48.08, 49.69, 52.65, 54.68, 57.90, 60.15, 63.67, + 66.01, 70.02, 73.19, 77.49, 80.82, 85.16, 88.44, 92.82, 96.15, 100.66, + 104.19, 109.11, 113.15, 118.30, 122.71, 127.85, 132.09, 137.42, 141.79, 147.07, + 150.66, 156.99, 161.62, 167.19, 171.55, 177.38, 182.37, 188.77, 193.95, 200.22, + 205.76, 212.23, 218.20, 226.08, 232.35, 238.88, 244.93, 251.97, 258.12, 265.49, + 271.77, 279.16, 285.70, 293.27, 300.10, 308.21, 315.01, 323.52, 330.19, 337.95, + 344.94, 352.88, 360.13, 368.35, 375.83, 383.51, 390.80, 399.15, 406.65, 415.45, + 425.18, 432.29, 440.34, 449.62, 55.05, 51.65, 50.09, 46.92, 45.63, 42.50, + 41.55, 39.12, 38.38, 36.04, 35.46, 33.72, 35.05, 34.45, 35.15, 34.48, + 35.58, 35.22, 36.49, 35.90, 37.11, 36.81, 38.31, 38.38, 40.12, 40.45, + 42.48, 43.10, 45.51, 46.53, 49.08, 50.44, 53.37, 54.99, 58.11, 59.98, + 63.19, 65.39, 69.33, 72.19, 76.46, 79.39, 83.68, 86.59, 90.97, 93.94, + 98.44, 101.63, 106.54, 110.27, 115.46, 119.59, 124.75, 128.48, 134.08, 138.13, + 143.38, 146.74, 152.98, 157.22, 162.84, 166.83, 172.76, 177.41, 183.80, 188.66, + 194.90, 200.10, 206.67, 212.32, 220.13, 226.12, 233.74, 238.44, 245.40, 251.34, + 258.46, 264.53, 271.93, 278.28, 286.19, 292.54, 300.27, 307.15, 314.90, 321.43, + 329.12, 335.70, 343.78, 350.55, 358.93, 365.57, 373.73, 380.72, 389.07, 396.25, + 405.07, 412.70, 421.54, 429.41, 438.44, 446.28, 455.37, 463.11, 59.43, 56.16, + 54.83, 51.72, 50.44, 47.94, 46.86, 44.56, 43.72, 41.81, 42.89, 42.08, + 43.62, 41.70, 42.45, 41.77, 42.34, 41.67, 42.49, 42.15, 43.26, 43.23, + 44.57, 44.79, 46.44, 46.99, 48.99, 49.98, 52.12, 53.40, 55.94, 57.52, + 60.27, 62.11, 64.96, 67.14, 70.72, 73.55, 77.50, 80.40, 84.34, 87.23, + 91.24, 94.21, 98.40, 101.58, 106.16, 109.88, 114.76, 118.92, 123.71, 127.51, + 132.64, 136.95, 141.88, 145.30, 151.10, 155.43, 160.72, 164.74, 170.26, 175.02, + 181.15, 186.03, 192.01, 197.22, 203.51, 209.18, 216.47, 222.43, 228.50, 234.18, + 240.91, 246.72, 253.58, 260.77, 266.77, 273.27, 280.52, 287.16, 294.50, 300.81, + 308.24, 314.75, 322.21, 328.71, 336.52, 343.25, 351.10, 358.07, 365.99, 372.99, + 381.04, 388.23, 396.75, 404.39, 412.96, 420.77, 429.41, 437.38, 445.97, 453.73, + 462.59, 470.48, 62.34, 59.13, 57.80, 54.87, 53.77, 51.05, 50.10, 47.88, + 48.81, 47.42, 49.22, 46.91, 47.76, 46.63, 47.20, 46.13, 46.93, 46.18, + 47.25, 46.82, 48.12, 47.92, 49.55, 49.69, 51.63, 52.04, 54.24, 55.12, + 57.39, 58.52, 61.21, 62.59, 65.61, 67.32, 70.89, 73.35, 77.24, 79.65, + 83.75, 86.25, 90.25, 92.85, 96.99, 99.82, 104.37, 107.78, 112.65, 116.26, + 121.41, 124.85, 129.74, 134.02, 138.96, 142.19, 147.82, 151.82, 157.10, 160.93, + 166.43, 170.87, 176.93, 181.49, 187.47, 192.36, 198.65, 203.99, 211.33, 216.91, + 224.15, 229.88, 236.41, 241.71, 248.53, 254.05, 261.06, 266.77, 273.98, 279.85, + 287.15, 293.15, 300.55, 306.72, 314.25, 320.56, 328.13, 334.68, 342.54, 349.22, + 357.15, 363.84, 371.88, 378.78, 387.30, 394.61, 403.17, 410.67, 419.30, 426.83, + 435.49, 442.94, 451.83, 459.44, 468.46, 476.48, 67.33, 64.39, 62.90, 60.21, + 59.00, 56.63, 57.27, 55.55, 57.01, 54.97, 54.92, 53.54, 53.82, 52.70, + 53.13, 52.36, 53.04, 52.53, 53.45, 53.19, 54.45, 54.49, 55.89, 56.39, + 58.19, 58.80, 60.83, 61.91, 64.21, 65.54, 68.15, 69.82, 73.02, 75.19, + 79.00, 81.38, 85.15, 87.64, 91.29, 93.88, 97.68, 100.49, 104.70, 108.08, + 112.67, 116.21, 121.17, 124.63, 129.20, 133.41, 138.23, 141.51, 146.74, 150.70, + 155.71, 159.60, 164.78, 169.23, 175.04, 179.59, 185.27, 190.20, 196.21, 201.56, + 208.40, 213.93, 220.76, 226.05, 232.40, 237.69, 244.19, 249.70, 256.40, 262.09, + 268.96, 274.81, 281.74, 287.79, 294.79, 300.89, 308.11, 314.45, 321.69, 328.22, + 335.75, 342.67, 350.36, 357.02, 364.75, 371.65, 379.69, 386.97, 395.38, 402.82, + 411.21, 418.72, 427.02, 434.47, 443.11, 450.73, 459.46, 467.46, 476.41, 484.61, + 70.47, 67.36, 66.11, 63.38, 63.87, 61.92, 63.26, 60.91, 60.87, 59.17, + 59.38, 57.92, 58.39, 57.21, 57.85, 56.97, 57.84, 57.20, 58.42, 58.05, + 59.39, 59.44, 61.01, 61.37, 63.37, 64.04, 66.26, 67.21, 69.74, 70.89, + 74.18, 76.00, 79.76, 81.77, 85.30, 87.59, 91.21, 93.42, 97.19, 99.61, + 103.76, 106.84, 111.44, 114.69, 119.66, 122.72, 127.37, 131.25, 136.03, 139.16, + 144.20, 147.82, 152.84, 156.51, 161.68, 165.79, 171.53, 175.78, 181.46, 186.07, + 192.09, 197.13, 204.00, 209.20, 215.92, 221.02, 227.35, 232.32, 238.81, 244.01, + 250.67, 256.04, 262.88, 268.42, 275.40, 281.01, 288.05, 293.80, 300.96, 306.98, + 314.31, 320.57, 328.03, 334.51, 342.26, 348.90, 356.53, 363.22, 371.24, 378.23, + 386.60, 393.73, 402.07, 409.30, 417.51, 424.93, 433.28, 440.55, 449.26, 457.04, + 465.91, 473.83, 482.94, 494.22, 502.69, 75.58, 72.85, 72.93, 70.75, 71.80, + 69.02, 68.60, 66.88, 66.72, 65.29, 65.34, 64.13, 64.42, 63.44, 63.96, + 63.22, 64.05, 63.58, 64.67, 64.69, 65.82, 66.13, 67.73, 68.34, 70.18, + 71.03, 73.01, 74.28, 77.23, 79.00, 82.39, 84.39, 87.54, 89.68, 93.09, + 95.28, 98.66, 101.06, 104.91, 107.91, 112.21, 115.42, 120.20, 123.25, 127.59, + 131.33, 135.81, 139.39, 143.86, 147.48, 152.15, 156.15, 160.79, 164.89, 170.29, + 174.61, 179.98, 184.65, 190.31, 195.33, 201.66, 206.90, 213.50, 218.22, 224.24, + 229.20, 235.38, 240.54, 246.88, 252.24, 258.76, 264.27, 270.85, 276.51, 283.17, + 288.95, 295.76, 301.76, 308.79, 315.04, 322.34, 328.80, 336.31, 342.88, 350.30, + 357.02, 364.70, 371.68, 379.62, 386.59, 394.77, 401.95, 409.89, 417.33, 425.41, + 432.67, 441.07, 448.81, 457.44, 465.34, 474.14, 482.19, 493.92, 500.95, 509.65, + 80.20, 80.22, 77.89, 78.71, 75.75, 75.28, 73.20, 72.97, 71.18, 71.31, + 69.72, 70.01, 68.64, 69.14, 68.10, 68.88, 68.05, 69.08, 68.69, 69.77, + 69.69, 71.23, 71.43, 73.22, 73.66, 75.56, 76.43, 79.34, 80.71, 83.79, + 85.66, 88.77, 90.51, 93.69, 95.61, 98.98, 101.00, 104.79, 107.45, 111.78, + 114.64, 119.42, 122.18, 126.49, 129.89, 134.38, 137.62, 142.04, 145.33, 150.00, + 153.69, 158.42, 162.19, 167.52, 171.52, 176.88, 181.29, 186.94, 191.63, 198.01, + 203.51, 209.32, 214.13, 220.14, 224.76, 230.91, 235.78, 242.10, 247.14, 253.63, + 258.84, 265.38, 270.74, 277.36, 282.74, 289.57, 295.29, 302.23, 308.19, 315.76, + 321.72, 329.40, 335.71, 343.13, 349.57, 357.23, 363.86, 371.98, 378.43, 386.57, + 393.38, 401.60, 408.41, 416.44, 423.40, 431.78, 439.24, 447.82, 455.43, 464.22, + 471.96, 483.60, 490.35, 499.07, 506.73, 515.87, 87.43, 87.92, 84.91, 84.01, + 81.87, 81.26, 79.38, 79.16, 77.60, 77.55, 76.26, 76.38, 75.22, 75.62, + 74.77, 75.43, 75.00, 75.96, 75.56, 76.71, 76.83, 78.24, 78.58, 80.12, + 80.91, 83.40, 84.72, 87.36, 89.20, 91.87, 93.54, 96.34, 98.23, 101.23, + 103.21, 106.65, 109.30, 113.30, 116.15, 120.35, 123.51, 127.51, 130.57, 135.12, + 138.15, 142.44, 145.71, 150.07, 153.74, 158.26, 162.01, 167.06, 171.05, 176.13, + 180.53, 185.86, 190.50, 197.20, 201.38, 207.42, 212.22, 217.92, 222.51, 228.35, + 233.19, 239.21, 244.23, 250.41, 255.61, 261.85, 267.12, 273.45, 278.83, 285.33, + 291.00, 297.75, 303.72, 310.98, 317.03, 324.22, 330.56, 337.89, 344.31, 351.66, + 358.43, 365.89, 372.47, 380.20, 387.00, 394.60, 401.71, 409.42, 416.43, 424.47, + 431.85, 440.17, 447.75, 456.29, 464.03, 475.54, 482.30, 490.73, 498.43, 507.28, + 515.09, 523.88, 93.03, 91.63, 89.12, 88.47, 86.22, 85.89, 83.98, 84.03, + 82.29, 82.43, 80.98, 81.37, 80.13, 80.76, 79.95, 80.86, 80.08, 81.21, + 80.93, 82.30, 82.20, 83.84, 84.05, 86.55, 87.42, 90.03, 91.44, 94.05, + 95.32, 98.17, 99.52, 102.45, 104.04, 107.45, 109.74, 113.74, 116.21, 120.35, + 123.20, 127.18, 129.92, 134.41, 137.14, 141.39, 144.33, 148.66, 152.01, 156.66, + 160.09, 165.02, 168.69, 173.81, 177.83, 183.22, 187.62, 193.55, 198.16, 204.22, + 210.66, 214.69, 218.98, 224.81, 229.32, 235.32, 240.05, 246.22, 251.08, 257.29, + 262.26, 268.56, 273.64, 280.11, 285.50, 292.28, 297.95, 305.18, 311.22, 318.43, + 324.49, 331.83, 337.97, 345.36, 351.55, 358.99, 365.25, 372.93, 379.38, 386.99, + 393.47, 401.44, 407.85, 416.10, 423.04, 431.38, 438.70, 447.15, 454.59, 465.94, + 472.46, 480.94, 488.31, 497.20, 504.80, 513.56, 521.31, 530.11, 537.99, 98.57, + 97.54, 95.24, 94.54, 92.55, 92.13, 90.48, 90.33, 88.87, 88.86, 87.62, + 87.89, 87.01, 87.55, 86.74, 87.46, 87.09, 88.09, 87.89, 89.15, 89.30, + 91.42, 92.20, 94.42, 95.71, 97.96, 99.16, 101.64, 102.91, 105.51, 107.04, + 110.05, 112.32, 115.99, 118.50, 122.39, 125.24, 128.86, 131.54, 135.62, 138.38, + 142.50, 145.43, 149.45, 152.79, 157.22, 160.62, 165.25, 168.92, 173.73, 177.76, + 182.84, 187.13, 192.73, 197.31, 204.67, 209.63, 213.35, 217.60, 223.11, 227.62, + 233.33, 238.05, 243.85, 248.69, 254.66, 259.50, 265.55, 270.53, 276.71, 282.00, + 288.49, 294.23, 301.14, 307.03, 314.00, 319.99, 327.11, 333.16, 340.36, 346.62, + 353.82, 360.04, 367.42, 373.82, 381.12, 387.58, 394.99, 401.68, 409.41, 416.54, + 424.53, 431.85, 440.01, 447.45, 458.62, 465.16, 473.35, 480.74, 489.33, 496.95, + 505.50, 513.13, 521.70, 529.59, 102.93, 102.09, 99.85, 99.41, 97.47, 97.32, + 95.46, 95.45, 93.83, 94.09, 92.81, 93.31, 92.12, 92.81, 92.05, 92.96, + 92.39, 93.46, 93.38, 95.37, 95.80, 97.95, 98.81, 100.98, 101.79, 104.07, + 105.07, 107.59, 108.68, 111.71, 113.62, 117.26, 119.45, 123.33, 125.86, 129.44, + 131.81, 135.98, 138.33, 142.21, 144.78, 148.81, 151.81, 156.35, 159.41, 163.96, + 167.40, 172.14, 175.80, 180.88, 184.93, 190.59, 195.49, 202.05, 205.13, 211.01, + 214.92, 220.41, 224.61, 230.30, 234.65, 240.49, 245.01, 250.86, 255.49, 261.48, + 266.14, 272.34, 277.33, 283.85, 289.29, 296.06, 301.66, 308.62, 314.35, 321.37, + 327.18, 334.30, 340.26, 347.39, 353.53, 360.74, 366.96, 374.25, 380.42, 387.81, + 394.19, 401.91, 408.72, 416.74, 423.76, 431.92, 438.98, 449.82, 456.05, 464.27, + 471.41, 480.01, 487.40, 495.91, 503.40, 511.99, 109.27, 108.41, 106.45, 105.95, + 104.08, 103.70, 102.06, 101.91, 100.60, 100.72, 99.50, 99.80, 98.94, 99.54, + 98.83, 99.55, 99.40, 100.97, 101.34, 103.07, 103.85, 105.66, 106.41, 108.33, + 109.16, 111.42, 112.42, 115.12, 117.04, 120.32, 122.53, 126.05, 128.68, 131.94, + 134.26, 137.95, 140.46, 144.03, 146.57, 150.27, 153.26, 157.62, 160.68, 164.88, + 168.17, 172.80, 176.46, 181.21, 185.23, 191.28, 195.51, 200.21, 204.69, 210.48, + 214.37, 219.55, 223.72, 229.08, 233.43, 238.94, 243.41, 248.97, 253.53, 259.25, + 263.91, 269.77, 274.82, 281.07, 286.38, 292.85, 298.47, 305.10, 310.76, 317.45, + 323.20, 329.93, 335.91, 342.77, 348.71, 355.71, 361.77, 368.89, 375.30, 382.42, + 388.77, 396.20, 402.98, 410.77, 417.67, 425.54, 432.66, 443.15, 449.46, 457.40, + 464.56, 472.89, 480.30, 488.52, 496.02, 113.98, 113.66, 111.44, 111.01, 109.02, + 108.87, 107.16, 107.26, 105.64, 105.89, 104.66, 105.12, 104.00, 104.79, 104.27, + 105.67, 105.73, 107.43, 107.83, 109.57, 109.94, 111.78, 112.24, 114.35, 115.09, + 117.74, 119.26, 122.54, 124.43, 127.95, 130.19, 133.43, 135.48, 139.30, 141.24, + 144.62, 146.79, 150.42, 153.10, 157.46, 160.10, 164.27, 167.38, 171.80, 175.16, + 179.89, 183.68, 189.66, 193.13, 198.59, 202.81, 208.30, 212.56, 217.78, 221.59, + 226.94, 230.98, 236.45, 240.59, 246.15, 250.39, 256.05, 260.40, 266.30, 270.96, + 277.22, 282.21, 288.70, 293.96, 300.55, 305.91, 312.52, 317.94, 324.67, 330.17, + 337.08, 342.90, 350.05, 355.94, 363.31, 368.97, 376.01, 382.21, 389.64, 396.26, + 403.86, 410.53, 418.39, 427.96, 435.12, 441.05, 449.06, 455.95, 464.21, 471.51, + 479.82, 120.61, 120.06, 118.01, 117.50, 115.61, 115.32, 113.79, 113.69, 112.34, + 112.51, 111.38, 111.77, 111.13, 112.24, 112.15, 113.45, 113.68, 115.14, 115.43, + 116.90, 117.30, 119.04, 119.71, 122.03, 123.50, 126.43, 128.30, 131.45, 133.76, + 136.68, 138.63, 142.20, 144.12, 147.17, 149.34, 152.63, 155.31, 159.15, 162.04, + 165.85, 168.97, 173.06, 176.39, 180.82, 184.59, 189.79, 193.76, 198.93, 203.15, + 208.35, 212.92, 217.76, 221.58, 226.61, 230.66, 235.80, 239.94, 245.18, 249.38, + 254.75, 259.11, 264.67, 269.34, 275.31, 280.29, 286.45, 291.70, 297.95, 303.27, + 309.56, 314.95, 321.30, 326.84, 333.45, 339.30, 346.24, 352.13, 359.21, 365.16, + 371.71, 377.88, 384.99, 391.53, 398.87, 405.46, 412.99, 422.26, 429.14, 435.05, + 442.80, 449.71, 457.71, 465.09, 125.82, 125.31, 123.16, 122.85, 120.83, 120.71, + 119.03, 119.17, 117.67, 118.05, 117.07, 118.05, 117.57, 118.80, 118.73, 120.02, + 119.94, 121.34, 121.36, 123.05, 123.36, 125.60, 126.72, 129.59, 131.15, 134.36, + 136.18, 139.12, 141.14, 143.95, 145.47, 148.47, 150.34, 153.61, 155.90, 159.68, + 162.27, 165.99, 168.74, 172.79, 175.89, 180.32, 183.79, 189.20, 192.91, 198.18, + 202.13, 207.41, 212.97, 216.76, 220.32, 225.36, 229.04, 234.18, 238.01, 243.25, + 247.17, 252.53, 256.61, 262.17, 266.55, 272.51, 277.20, 283.35, 288.30, 294.54, + 299.56, 305.83, 310.90, 317.26, 322.51, 329.09, 334.68, 341.61, 347.46, 354.32, + 360.05, 366.55, 375.46, 382.71, 388.52, 395.62, 399.43, 409.43, 414.97, 421.83, + 427.46, 435.21, 441.88, 449.89, 132.66, 131.99, 130.05, 129.61, 127.75, 127.55, + 126.01, 126.04, 125.02, 125.82, 125.23, 126.03, 125.72, 126.65, 126.59, 127.60, + 127.48, 128.85, 129.03, 130.89, 131.96, 134.51, 135.99, 138.78, 140.57, 143.25, + 145.12, 147.55, 149.14, 151.85, 153.63, 156.60, 158.94, 162.42, 164.85, 168.18, + 170.95, 174.68, 177.76, 181.88, 185.34, 190.49, 194.19, 199.24, 203.21, 209.47, + 212.27, 217.33, 221.10, 225.84, 229.52, 234.36, 238.20, 243.17, 247.08, 252.15, + 256.28, 261.45, 265.95, 271.61, 276.30, 282.13, 287.05, 292.97, 297.97, 303.91, + 308.97, 315.03, 320.27, 326.59, 332.19, 338.82, 344.47, 351.04, 356.80, 365.92, + 371.83, 378.82, 384.62, 391.48, 397.42, 404.44, 409.92, 416.50, 422.11, 429.60, + 436.29, 137.92, 137.46, 135.36, 135.08, 133.30, 133.34, 131.99, 132.57, 131.59, + 132.37, 131.78, 132.64, 132.10, 133.08, 132.68, 133.94, 133.82, 135.57, 136.29, + 138.76, 139.87, 142.71, 143.98, 146.47, 147.65, 150.09, 151.32, 153.99, 155.46, + 158.40, 160.37, 163.87, 165.68, 169.05, 171.49, 175.21, 177.99, 182.11, 185.26, + 190.54, 193.85, 199.17, 203.07, 208.04, 212.49, 216.97, 220.78, 225.28, 228.73, + 233.58, 237.13, 242.07, 245.72, 250.75, 254.55, 259.81, 264.00, 269.65, 274.05, + 279.89, 284.52, 290.46, 295.14, 301.11, 305.89, 311.95, 316.93, 323.24, 328.55, + 335.18, 340.47, 347.14, 354.30, 361.18, 366.73, 373.40, 378.91, 385.79, 391.61, + 398.29, 403.39, 409.96, 415.28, 422.79, 144.95, 144.39, 142.55, 142.23, 140.87, + 141.11, 140.11, 140.51, 139.80, 140.34, 139.77, 140.42, 140.02, 140.93, 140.79, + 142.14, 142.77, 144.84, 145.89, 148.32, 149.34, 151.34, 152.36, 154.46, 155.64, + 158.00, 159.44, 162.05, 163.94, 167.06, 168.78, 171.87, 174.30, 177.73, 180.49, + 184.34, 187.46, 192.39, 195.71, 201.00, 204.52, 209.95, 213.30, 218.24, 222.08, + 227.07, 229.97, 234.55, 238.09, 242.72, 246.37, 251.16, 254.95, 259.95, 264.15, + 269.52, 273.91, 279.46, 284.12, 289.77, 294.50, 300.23, 305.01, 310.83, 315.77, + 321.85, 327.30, 333.51, 338.76, 345.42, 351.19, 357.80, 363.33, 369.90, 375.39, + 382.11, 387.61, 394.09, 399.02, 405.30, 410.60, 150.53, 150.23, 148.55, 148.72, + 147.39, 147.76, 146.70, 147.22, 146.30, 146.90, 146.13, 147.01, 146.50, 147.86, + 148.09, 150.08, 151.01, 153.00, 153.42, 155.27, 155.82, 157.91, 158.77, 161.11, + 162.23, 164.82, 166.23, 169.03, 170.44, 173.53, 175.61, 178.99, 181.44, 185.29, + 188.11, 192.96, 196.03, 201.26, 204.60, 209.84, 213.37, 218.49, 222.07, 227.19, + 231.38, 234.53, 237.73, 242.40, 245.79, 250.52, 254.02, 258.98, 262.83, 268.23, + 272.50, 278.05, 282.41, 288.05, 292.49, 298.19, 302.71, 308.45, 313.74, 319.70, + 324.39, 330.53, 335.52, 341.87, 347.10, 353.80, 358.97, 365.51, 370.70, 377.34, + 382.32, 388.68, 393.27, 399.54, 158.26, 156.83, 156.80, 155.67, 155.83, 154.84, + 155.11, 154.30, 154.82, 154.34, 155.25, 155.37, 157.12, 157.82, 158.73, 159.01, + 160.52, 161.12, 162.91, 163.76, 165.79, 166.89, 169.18, 170.32, 172.92, 174.27, + 177.07, 179.20, 182.33, 184.81, 188.35, 191.16, 195.88, 198.75, 203.72, 206.99, + 211.92, 215.44, 220.33, 223.92, 229.20, 232.45, 236.01, 239.48, 243.87, 247.22, + 251.68, 255.20, 259.91, 263.66, 268.85, 273.01, 278.44, 282.81, 288.17, 292.61, + 298.06, 302.59, 308.02, 313.26, 318.96, 323.52, 329.29, 334.18, 340.34, 345.44, + 351.69, 356.82, 362.93, 368.06, 374.19, 379.17, 385.19, 389.80, 164.74, 163.23, + 163.38, 162.06, 162.34, 161.21, 161.78, 160.89, 161.76, 161.57, 162.33, 162.12, + 163.44, 163.44, 165.00, 165.28, 167.04, 167.64, 169.64, 170.36, 172.40, 173.15, + 175.69, 176.91, 179.70, 181.48, 184.59, 186.72, 190.28, 192.78, 197.50, 200.05, + 205.02, 207.96, 213.00, 216.10, 221.21, 224.40, 229.58, 232.84, 238.09, 241.42, + 244.12, 247.23, 251.75, 254.94, 259.65, 263.15, 268.25, 272.23, 277.55, 281.80, + 287.18, 291.37, 296.83, 301.08, 306.47, 311.26, 316.94, 321.21, 326.98, 331.71, + 337.79, 342.54, 348.76, 353.48, 359.62, 364.23, 370.21, 374.66, 380.64, 172.65, + 171.29, 171.28, 170.11, 170.29, 169.37, 169.91, 169.04, 169.68, 169.37, 170.34, + 170.32, 171.49, 171.75, 173.19, 173.79, 175.46, 176.21, 178.13, 178.97, 181.14, + 182.22, 184.58, 186.34, 189.18, 191.36, 194.61, 197.10, 201.50, 204.03, 208.67, + 211.60, 216.31, 219.40, 224.19, 227.37, 232.12, 235.43, 238.65, 241.95, 246.13, + 249.27, 253.55, 256.79, 261.19, 264.69, 269.52, 273.47, 278.54, 282.79, 287.91, + 292.28, 297.33, 301.61, 306.92, 311.19, 316.70, 321.03, 326.64, 331.11, 336.88, + 341.62, 347.42, 352.11, 357.95, 362.53, 368.15, 372.79, 179.26, 177.77, 177.93, + 176.67, 177.20, 175.74, 176.35, 175.65, 176.56, 176.15, 177.32, 177.28, 178.72, + 179.02, 180.73, 181.18, 183.18, 183.61, 185.76, 186.55, 188.96, 190.44, 193.29, + 195.13, 198.37, 200.55, 204.72, 207.15, 211.76, 214.39, 219.06, 221.84, 226.54, + 229.54, 234.11, 237.23, 240.27, 243.07, 247.46, 249.95, 254.19, 257.19, 261.61, + 264.80, 269.62, 273.28, 278.42, 282.30, 287.54, 291.48, 296.56, 300.58, 305.84, + 310.10, 315.50, 319.61, 325.14, 329.51, 335.30, 339.56, 345.30, 349.71, 355.51, + 359.95, 365.40, 187.18, 185.55, 186.17, 184.42, 184.65, 183.96, 184.51, 184.08, + 184.94, 184.83, 185.93, 186.15, 187.51, 187.94, 189.59, 190.31, 192.23, 192.98, + 194.93, 196.39, 198.94, 200.79, 203.74, 205.91, 209.77, 212.17, 216.45, 219.08, + 223.47, 226.21, 230.52, 231.88, 237.98, 240.88, 243.45, 246.51, 250.86, 252.64, + 256.67, 259.64, 263.83, 266.95, 271.55, 275.22, 280.07, 283.96, 288.92, 292.89, + 297.74, 301.80, 306.80, 310.94, 316.09, 320.23, 325.46, 329.77, 335.09, 339.35, + 344.80, 349.21, 354.69, 359.12, 194.15, 192.01, 192.33, 191.26, 191.84, 191.12, + 191.86, 191.45, 192.50, 192.51, 193.70, 193.81, 195.43, 195.88, 197.79, 198.32, + 200.29, 201.48, 204.02, 205.58, 208.54, 210.40, 214.43, 216.31, 220.59, 222.88, + 227.14, 229.66, 233.86, 236.66, 240.60, 243.15, 241.27, 243.77, 247.65, 253.91, + 258.05, 260.74, 264.90, 267.87, 272.33, 275.71, 280.56, 284.18, 289.12, 292.81, + 297.79, 301.59, 305.24, 309.00, 314.23, 319.58, 324.84, 328.92, 334.20, 338.17, + 343.60, 347.69, 353.15, 201.62, 200.64, 200.81, 199.83, 200.32, 200.05, 200.73, + 200.46, 201.52, 201.46, 202.74, 203.25, 205.09, 205.48, 207.16, 208.20, 210.50, + 212.08, 214.74, 216.59, 220.31, 222.18, 226.16, 228.41, 232.31, 234.82, 238.65, + 241.12, 245.06, 247.56, 245.07, 247.43, 251.02, 257.08, 261.12, 263.81, 267.77, + 270.77, 274.97, 278.36, 282.97, 286.58, 291.22, 294.94, 299.61, 303.39, 306.40, + 310.25, 315.21, 321.18, 326.09, 330.08, 335.04, 338.96, 344.06, 348.14, 208.74, + 207.61, 208.15, 207.32, 208.20, 207.76, 208.61, 208.23, 209.48, 209.92, 211.39, + 211.66, 213.32, 214.14, 216.38, 217.62, 220.29, 221.83, 225.44, 227.09, 231.00, + 233.04, 236.74, 238.94, 242.67, 244.76, 248.54, 250.67, 247.69, 249.74, 253.31, + 255.71, 263.23, 265.72, 269.58, 272.28, 276.47, 279.61, 284.17, 287.48, 292.12, + 295.53, 300.23, 303.83, 308.60, 312.25, 315.22, 321.24, 326.47, 330.02, 335.09, + 338.73, 343.82, 217.46, 216.59, 217.07, 216.61, 217.31, 217.09, 218.04, 218.24, + 219.51, 219.69, 221.01, 221.76, 223.76, 225.00, 227.37, 228.90, 232.47, 233.90, + 237.40, 239.36, 242.61, 244.73, 248.04, 250.07, 253.48, 255.58, 252.06, 254.25, + 257.40, 259.80, 266.97, 269.51, 273.17, 275.77, 279.80, 282.89, 287.25, 290.50, + 294.89, 298.52, 302.73, 306.21, 310.79, 314.42, 317.18, 323.36, 328.12, 332.07, + 336.78, 340.59, 224.38, 225.13, 224.69, 225.84, 225.57, 226.90, 226.33, 227.71, + 228.13, 230.45, 231.38, 233.74, 234.97, 238.29, 239.70, 242.92, 244.62, 247.68, + 249.40, 252.64, 254.30, 257.61, 259.37, 255.40, 257.14, 260.41, 262.52, 265.98, + 272.03, 275.68, 277.98, 281.98, 284.78, 289.11, 292.11, 296.46, 299.59, 304.03, + 307.22, 311.78, 315.15, 320.04, 324.05, 328.83, 332.33, 337.36, 234.01, 235.01, + 234.65, 235.62, 234.93, 235.87, 235.79, 238.76, 239.66, 241.72, 242.97, 245.96, + 247.31, 250.04, 251.60, 254.25, 255.90, 258.77, 260.38, 263.36, 265.08, 260.46, + 262.33, 265.18, 267.26, 270.44, 276.47, 279.96, 282.23, 285.93, 288.73, 292.77, + 295.75, 299.85, 302.97, 307.19, 310.38, 314.67, 318.00, 322.62, 326.67, 331.28, + 334.76, 242.74, 243.53, 241.88, 242.78, 242.39, 243.57, 246.88, 248.93, 249.94, + 252.65, 253.72, 256.22, 257.42, 259.99, 261.29, 264.09, 265.34, 261.91, 261.74, + 264.49, 265.93, 268.87, 270.65, 273.80, 275.80, 283.21, 285.28, 288.88, 291.40, + 295.40, 298.09, 302.13, 304.98, 309.17, 312.07, 316.35, 319.38, 324.00, 326.86, + 332.59, 250.56, 251.22, 250.73, 255.51, 256.12, 257.95, 258.95, 261.21, 262.37, + 264.23, 265.28, 267.49, 268.73, 271.11, 272.40, 267.90, 267.79, 270.26, 271.78, + 274.30, 276.06, 278.92, 280.90, 288.19, 286.41, 293.54, 296.05, 299.76, 302.36, + 306.20, 308.94, 312.95, 315.87, 319.89, 322.90, 327.21, 330.26, 257.99, 258.83, + 264.13, 265.90, 266.31, 268.43, 268.89, 271.04, 271.83, 273.97, 274.88, 277.17, + 278.17, 272.96, 274.40, 274.99, 276.08, 278.67, 280.11, 282.94, 284.63, 292.15, + 293.92, 297.23, 299.42, 303.11, 305.47, 309.23, 311.83, 315.64, 318.26, 322.26, + 325.00, 329.34, 275.64, 275.96, 277.61, 277.98, 279.79, 280.39, 282.32, 283.17, + 276.14, 277.25, 279.70, 281.12, 281.46, 282.50, 284.81, 286.24, 288.80, 290.46, + 293.35, 295.36, 302.60, 304.77, 308.17, 310.52, 314.02, 316.46, 320.05, 322.65, + 326.43, 329.15, 285.38, 285.56, 287.19, 287.61, 289.35, 289.89, 282.37, 283.24, + 285.61, 286.75, 289.49, 287.60, 289.89, 290.99, 293.48, 294.86, 297.73, 299.45, + 307.10, 308.94, 312.25, 314.35, 317.76, 319.98, 323.59, 325.92, 329.49, 296.53, + 296.78, 288.14, 288.56, 290.39, 291.23, 293.26, 294.35, 296.77, 294.70, 296.68, + 297.77, 299.97, 301.32, 303.90, 305.61, 313.17, 315.00, 318.02, 320.10, 323.31, + 325.60, 329.08, 330.86, 305.95, 306.12, 297.60, 298.05, 300.12, 300.84, 299.98, + 300.52, 302.47, 303.27, 305.46, 306.52, 314.46, 310.49, 318.26, 319.80, 322.84, + 324.61, 327.63, 329.54, 333.08, 306.67, 308.50, 309.25, 307.78, 308.31, 309.96, + 310.72, 312.63, 313.65, 315.93, 317.31, 325.03, 326.64, 329.30, 330.62, 333.57, + 335.52, 316.48, 314.59, 314.83, 316.45, 316.93, 318.81, 319.54, 327.64, 328.48, + 330.77, 332.12, 334.81, 336.27, 338.59, 323.27, 324.61, 325.06, 326.65, 332.80, + 335.40, 336.34, 338.20, 339.41, 341.93, 342.57, 337.21, 339.08, 339.57, 342.19, + 342.65, 344.65, 345.52, 347.87, 350.58, 351.04, 352.67, 353.55, 359.66 +}; + +const std::vector NucleiPropertiesTable::IndexCharge = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, + 134, 134, 134, 134, 135, 135, 135, 135, 136 +}; + +const std::vector NucleiPropertiesTable::IndexMass = { + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 332, 333, 334, 335, + 336, 337, 338, 339, 336, 337, 338, 339, 339 +}; + +const std::vector NucleiPropertiesTable::ShortTable = { + 0, 19, 41, 65, 91, 119, 150, 183, 218, 255, + 294, 335, 377, 421, 466, 513, 561, 610, 660, 711, + 764, 818, 873, 928, 984, 1042, 1101, 1161, 1222, 1284, + 1347, 1411, 1476, 1542, 1609, 1677, 1746, 1816, 1887, 1958, + 2031, 2105, 2180, 2256, 2332, 2410, 2489, 2569, 2649, 2731, + 2814, 2897, 2981, 3065, 3151, 3237, 3324, 3411, 3500, 3589, + 3678, 3768, 3858, 3950, 4042, 4134, 4227, 4321, 4416, 4511, + 4606, 4702, 4799, 4896, 4993, 5092, 5191, 5290, 5389, 5490, + 5591, 5692, 5793, 5895, 5998, 6101, 6204, 6308, 6412, 6516, + 6620, 6725, 6830, 6936, 7042, 7149, 7254, 7356, 7455, 7551, + 7644, 7734, 7821, 7905, 7986, 8064, 8138, 8209, 8277, 8342, + 8404, 8463, 8519, 8572, 8622, 8668, 8711, 8751, 8788, 8822, + 8852, 8879, 8903, 8924, 8941, 8955, 8966, 8974, 8978, 0, + 0, 0, 0, 0, 0, 0, 8979 +}; + +FermiUInt NucleiPropertiesTable::GetMaxMass() const { + return 339; +} + +FermiUInt NucleiPropertiesTable::GetMaxCharge() const { + return 0; +} diff --git a/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.h b/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.h new file mode 100644 index 0000000..e93bf98 --- /dev/null +++ b/FermiBreakUp/lib/TableValues/NucleiPropertiesTable.h @@ -0,0 +1,54 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLE_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLE_H_ + +#include + +#include "Utilities/DataTypes.h" + +class NucleiPropertiesTable { + public: + NucleiPropertiesTable(); + + FermiFloat GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const; + + bool ContainsParticle(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiUInt GetMaxMass() const; + + FermiUInt GetMaxCharge() const; + + ~NucleiPropertiesTable() = default; + + private: + static FermiFloat ElectronicBindingEnergy(ChargeNumber charge_number); + + size_t GetIndex(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiFloat GetAtomicMass(MassNumber mass_number, ChargeNumber charge_number) const; + + bool VerifyNuclei(MassNumber mass_number, ChargeNumber charge_number) const; + + static const MassNumber MaxMassNumber; + + static const ChargeNumber MaxChargeNumber; + + static const size_t ParticleCount; + + static const std::vector AtomicMassExcess; + + static const std::vector IndexCharge; + + static const std::vector IndexMass; + + static const size_t ShortTableCount; + + static const std::vector ShortTable; +}; + +std::ostream& operator<<(std::ostream& out, const NucleiPropertiesTable& table); + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLE_H_ diff --git a/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.cpp b/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.cpp new file mode 100644 index 0000000..47948f1 --- /dev/null +++ b/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.cpp @@ -0,0 +1,1540 @@ +// +// Created by Artem Novikov on 26.02.2023. +// + +#include + +#include "NucleiPropertiesTableAME12.h" + +const MassNumber NucleiPropertiesTableAME12::MaxMassNumber = 295_m; + +const ChargeNumber NucleiPropertiesTableAME12::MaxChargeNumber = 120_c; + +const size_t NucleiPropertiesTableAME12::ParticleCount = 3353; + +const size_t NucleiPropertiesTableAME12::ShortTableCount = FermiUInt(MaxMassNumber); + +std::vector* NucleiPropertiesTableAME12::electron_mass_ = nullptr; + +NucleiPropertiesTableAME12::NucleiPropertiesTableAME12() { + assert(ShortTableCount == ShortTable.size()); + + assert(ParticleCount == IndexCharge.size()); + assert(ParticleCount == IndexMass.size()); + assert(ParticleCount == MassExcess.size()); + assert(ParticleCount == BetaEnergy.size()); + + /// calculate electron mass in orbit with binding energy + if (electron_mass_ == nullptr) { + electron_mass_ = new std::vector(FermiUInt(MaxChargeNumber)); + auto& electron_mass = *electron_mass_; + for (FermiUInt iz = 1; iz < FermiUInt(MaxChargeNumber); ++iz) { + electron_mass[iz] = static_cast(iz) * CLHEP::electron_mass_c2 + - (14.4381 * std::pow(FermiFloat(iz), 2.39)) * CLHEP::eV + - (1.55468 * 1e-6 * std::pow(FermiFloat(iz), 5.35)) * CLHEP::eV; + } + } + + assert(FermiUInt(MaxChargeNumber) == electron_mass_->size()); +} + +FermiFloat NucleiPropertiesTableAME12::GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const { + if (VerifyNuclei(mass_number, charge_number)) { + return GetAtomicMass(mass_number, charge_number) - electron_mass_->operator[](FermiUInt(charge_number)); + } + + return 0; +} + +FermiFloat NucleiPropertiesTableAME12::GetMassExcess(MassNumber mass_number, ChargeNumber charge_number) const { + if (VerifyNuclei(mass_number, charge_number)) { + return MassExcess[GetIndex(mass_number, charge_number)] * CLHEP::keV; + } + + return 0; +} + +FermiFloat NucleiPropertiesTableAME12::GetBindingEnergy(MassNumber mass_number, ChargeNumber charge_number) const { + return ((FermiFloat(mass_number) - FermiFloat(charge_number)) * MassExcess[0] + + FermiFloat(charge_number) * MassExcess[1] - MassExcess[GetIndex(mass_number, charge_number)]) * CLHEP::keV; +} + +FermiFloat NucleiPropertiesTableAME12::GetBetaDecayEnergy(MassNumber mass_number, ChargeNumber charge_number) const { + return BetaEnergy[GetIndex(mass_number, charge_number)] * CLHEP::keV; +} + +bool NucleiPropertiesTableAME12::ContainsParticle(MassNumber mass_number, ChargeNumber charge_number) const { + try { + return VerifyNuclei(mass_number, charge_number); + } catch (...) { + return false; + } +} + +size_t NucleiPropertiesTableAME12::GetIndex(MassNumber mass_number, ChargeNumber charge_number) const { + for (size_t i = ShortTable[FermiUInt(mass_number) - 1]; i < ShortTable[FermiUInt(mass_number)]; ++i) { + if (IndexCharge[i] == FermiUInt(charge_number)) { return i; } + } + + return -1; +} + +FermiFloat NucleiPropertiesTableAME12::GetAtomicMass(MassNumber mass_number, ChargeNumber charge_number) const { + return MassExcess[GetIndex(mass_number, charge_number)] * CLHEP::keV + FermiFloat(mass_number) * CLHEP::amu_c2; +} + +bool NucleiPropertiesTableAME12::VerifyNuclei(MassNumber mass_number, ChargeNumber charge_number) const { + if (mass_number > MaxMassNumber) { + throw std::runtime_error("Nucleon number larger than 293"); + } + if (mass_number < 1_m) { + throw std::runtime_error("Nucleon number is negative"); + } + if (FermiUInt(charge_number) > FermiUInt(mass_number)) { + throw std::runtime_error("Nucleon number smaller than Z"); + } + + return GetIndex(mass_number, charge_number) != -1; +} + +FermiUInt NucleiPropertiesTableAME12::GetMaxMass() const { + return MaxMassNumber; +} + +FermiUInt NucleiPropertiesTableAME12::GetMaxCharge() const { + return MaxChargeNumber; +} + +std::ostream& operator<<(std::ostream& out, const NucleiPropertiesTableAME12& table) { + out << "A Z mass mass_excess binding_energy beta_decay_energy\n"; + for (size_t i = 1; i <= table.GetMaxMass(); ++i) { + for (size_t j = 0; j <= table.GetMaxCharge(); ++j) { + if (table.ContainsParticle(MassNumber(i), ChargeNumber(j))) { + out << i << ' ' << j << ' ' + << table.GetNuclearMass(MassNumber(i), ChargeNumber(j)) << ' ' + << table.GetMassExcess(MassNumber(i), ChargeNumber(j)) << ' ' + << table.GetBindingEnergy(MassNumber(i), ChargeNumber(j)) << ' ' + << table.GetBetaDecayEnergy(MassNumber(i), ChargeNumber(j)) << '\n'; + } + } + } + return out; +} + +const std::vector NucleiPropertiesTableAME12::MassExcess = { + 8071.31714, 7288.97059, 13135.72174, 14949.80611, 14931.21551, 28667, 24621.123, 2424.91561, 25323.186, 32892.440, + 11231.233, 11678.886, 37139, 41875.717, 17592.095, 14086.87893, 18375.034, 47320, 49135, 26073.126, + 14907.10520, 15768.999, 27676.550, 31609.681, 20945.804, 4941.671, 22921.577, 35064.269, 40935.896, 24954.902, + 11348.453, 12416.488, 28910.970, 49172.316, 33052.624, 12607.488, 12050.690, 15698.755, 38800.107, 40728.254, + 20177.167, 8667.883, 10650.295, 24303.642, 48919.571, 25077.759, 13369.416, 0.0, 17338.072, 31914.696, + 58340.888, 33659.076, 16562.119, 3125.00875, 5345.481, 23115.439, 39954.498, 23663.685, 3019.89278, 2863.41669, + 8007.457, 31964.410, 49760, 28957.988, 9873.144, 101.43866, 2855.605, 16806.810, 57447.132, 37112.271, + 13694.128, 5683.907, -4737.00137, 10680.254, 23986.154, 43770.816, 21030.778, 7870.075, -808.76361, 1951.701, + 16500.451, 51847.133, 24918.124, 13113.168, -782.81558, 873.113, 5317.623, 25036.931, 58777, 32412.612, + 15855.521, 3332.858, -1487.44434, 1752.054, 12929.391, 31828.392, 67133, 37557.610, 21765.110, 3796.168, + -17.463, -7041.93055, 6850.604, 17558.667, 75721, 45643, 25251.164, 8061.907, -47.609, -5731.776, + -2184.637, 10913.515, 26990, 53590.244, 32038.675, 9283.322, 2793.377, -8024.714, -5181.518, -399.939, + 18201, 33338, 64171, 38322, 14620.657, 3313.042, -5154.044, -9529.85249, -5473.264, 6748.070, + 23697, 46938, 18500.402, 7559.527, -5951.641, -8417.958, -13933.569, -47.614, 10744.353, 33320, + 55983, 27347.719, 11363.509, -2059.806, -9357.817, -13192.771, -8916.165, 3827.331, 19738, 34733.037, + 18665.061, 479.445, -6860.780, -16214.546, -12210.112, -7140.977, 10973, 27079, 44451, 24629.633, + 7035.824, -5517.676, -14586.614, -17196.747, -12384.389, -722.461, 17028, 52080, 32920.950, 11291.569, + -988.315, -15018.730, -16850.530, -21492.79459, -7147.740, 4073.205, 27516, 39626, 18399.801, 2679.976, + -10602.829, -18204.662, -21895.07867, -16952.451, -3156.408, 13767, 48112, 23039.573, 8474.670, -8883.727, + -15872.452, -24432.961, -20200.608, -14059.007, 4443, 21490, 55618, 30820.342, 12260.935, -3122.337, + -14954.976, -22949.036, -24440.54111, -19042.525, -7066.124, 11294, 36999, 18809.658, -828.807, -11098.528, + -24077.686, -24304.874, -26015.53353, -13334.674, -2200.351, 21098, 45997, 23967, 4962.204, -8468.233, + -20514.326, -26337.346, -26585.85432, -21003.337, -9384.293, 7042, 52842, 31289, 8323.347, -3068.901, + -19956.729, -24548.698, -29931.693, -24440.087, -18378.293, -1220, 13851, 37840, 15639.784, -219.833, + -14360.399, -24857.791, -28846.217, -29013.540, -23047.410, -11172.891, 4788, 45912, 20380.157, 5950.384, + -12393.323, -20251.028, -30664.124, -29522.017, -30231.540, -17417.065, -6451.150, 15351, 53143, 28289, + 9809.563, -6594.287, -18996.105, -26896.410, -31761.521, -30947.648, -24800.199, -13136.066, 3484, 34074, + 16209.859, -4170.299, -14669.556, -26861.187, -29798.087, -34714.820, -28800.754, -22058.500, -4546, 10666, + 42275, 20996, 2320.352, -12829.273, -23162.346, -29800.192, -33242.190, -33807.19022, -27282.702, -14172.710, + 2198, 48605, 27973, 5429.679, -8074.425, -22837.846, -27557.813, -35039.89464, -33535.492, -34846.386, + -20523.336, -8850.386, 11886, 33888, 12119.668, -4979.767, -19008.577, -27307.189, -33067.505, -35559.54329, + -35137.887, -28642.411, -15697.537, 196, 40837, 16562, 1009.739, -17637.746, -24912.990, -34422.675, + -35022.026, -38547.243, -32121.143, -25104.663, -7620, 6241, 47944, 23101, 4679.826, -12195.459, + -24322.627, -32009.808, -36575.389, -38408.815, -36188.100, -29321.084, -17916.356, -2301, 28513, 10442, + -9204.234, -20609.730, -32673.255, -35781.492, -41468.658, -37815.978, -37548.570, -24116.380, -13637, 6660, + 37213, 15323, -3989.589, -18359.747, -29770.796, -36615.638, -40812.152, -41071.177, -39009.121, -31880.549, + -19514.799, -5133, 13431, 22784, 37, -13810.330, -29730.762, -35413.924, -43138.396, -41760.499, + -44126.996, -37074.602, -29473.531, -12957, 587, 29240, 7405, -10097, -25211.011, -35711.976, + -42343.453, -44335.630, -44936.400, -42005.801, -34560.887, -22565.442, -7592, 9846, 12761, -4061, + -22440, -32284.477, -44224.759, -44503.420, -48491.734, -44476.768, -42821.654, -29323.431, -18416, 866, + 16477, 21203, 1146, -16860, -29611.491, -41299.895, -46561.073, -48562.809, -47960.953, -45332.693, + -37636.738, -24750.727, -10330, 7173, 8430, -12920, -25727.848, -39589.224, -44547.514, -51430.681, + -49223.856, -50261.709, -42627.232, -34488.631, -17782, -4900, 14475, -5868, -22516.039, -36338.529, + -43228.814, -49731.858, -52203.685, -51451.054, -48243.495, -40202.330, -27342.143, -12938, -969, -16543, + -34263.009, -40166.506, -49468.845, -51443.612, -55418.089, -50706.854, -48332.293, -33990, -23474, -3065, + 6791, -11681, -28457, -38107.420, -46829.991, -51849.991, -55285.894, -54689.045, -50946.734, -42658.627, + -29630.824, -14354, -5002, -24778, -33598.989, -45597.053, -49892.107, -56933.697, -55556.524, -56253.867, + -48009.320, -39222.917, -21741, -7416, 708, -18350, -29976.509, -41667.530, -49143.620, -55108.643, + -57711.725, -57480.637, -54029.258, -45335.224, -31635.399, -14923, 7927, -13898, -24731, -39205.322, + -46123.102, -55281.245, -56910.845, -60606.422, -56039.798, -53906.909, -38238, -25579, -4322, -6874, + -20707, -33867.607, -44228.389, -52524.139, -57486.131, -60181.180, -59344.948, -56083.219, -47308.253, -32546, + -15649, -1919, -14876, -31112, -40319.499, -51834.726, -55827.560, -62154.467, -59846.558, -60228.153, + -51667.134, -42298.153, -23492, -7713, -10302, -25644, -37832.015, -47891.490, -55525.320, -60664.164, + -62229.119, -61156.118, -56357.732, -47214.955, -33972, -16310, -4052, -22328, -33241.956, -46503.876, + -52967.938, -61412.375, -61649.720, -64472.533, -58344.551, -54173.732, -39784, -27609, -5701, 931, + -16348, -30506.429, -42455.089, -51742.122, -58920.494, -62897.623, -64221.322, -61983.834, -56348.691, -47134.542, + -33729, -17587, -12566, -25476, -40894.961, -48481, -58878.048, -61423.824, -66745.863, -62786.966, + -61167.512, -51986.446, -41899, -24582, -5822, -21993, -35722.114, -46887.053, -55635.621, -61850.999, + -65512.321, -65579.298, -62213.111, -56547.092, -46921.216, -33627, -16171, -33459, -42989.034, -54969.544, + -59791.888, -67098.478, -65424.094, -66003.789, -58832.751, -54315.496, -39652, -26929, -11644, -27982, + -40967.338, -51221.492, -59185.198, -65125.242, -67263.457, -65911.798, -62657.328, -56478.216, -46937.051, -33161, + -5608, -24536, -36750.387, -50067.840, -56408.533, -66006.285, -66258.070, -68899.062, -63724.062, -61607.033, + -52025.077, -41368, -18481, -33310, -46068.530, -55321.775, -63742.680, -67318.779, -67880.067, -66878.896, + -62658.004, -56587.225, -46580.289, -32928, -14876, -28299, -43825.349, -51923.721, -63463.814, -65567.034, + -70006.846, -67085.746, -66978.789, -58894.519, -54189.441, -38441, -24536, -39058, -50169.085, -59978.648, + -65736.212, -68417.599, -69327.799, -67100.654, -63112.163, -56434.706, -46111.471, -32435, -19217, -36310, + -46919.353, -59213.860, -62976.372, -69564.709, -68910.131, -70561.835, -64341.835, -61929.891, -51425.620, -40948, + -15202, -31000, -44369.925, -55406.228, -62711.126, -67328.775, -70139.097, -69906.457, -67893.057, -63146.507, + -56502.418, -46327.205, -32304, -28103, -39784, -54226.061, -59782.998, -68145.486, -68588.256, -72585.901, + -68229.798, -67868.180, -59067.321, -53940.575, -38117, -22617, -36896, -50108.152, -58987.437, -65593.402, + -69699.335, -71297.523, -70952.749, -68227.388, -63647.585, -56551.750, -46082, -31950, -19235, -32463, + -48456, -56006.205, -65756.712, -68049.617, -73422.442, -70860.055, -72213.202, -65288.249, -62331.834, -51915.985, + -40827, -29100, -44246, -54471.341, -62558.908, -68464.580, -71856.965, -73034.190, -72169.481, -69107.118, + -64323.623, -57218.694, -46618.694, -24098, -41610, -50975.985, -62303.016, -66296.639, -73212.889, -72291.372, + -75251.950, -70289.069, -69014.137, -60479.081, -54247.638, -38601, -36747, -48512, -58789.195, -65992.344, + -71212.862, -73916.319, -74599.485, -73234.805, -70169.442, -64830.491, -57803.436, -46779, -34130, -44497.468, + -57483.234, -63705.950, -71862.053, -72816.961, -77025.909, -73452.125, -74179.577, -66935.418, -63173.941, -52527, + -41302, -27710, -41899, -53432.294, -62547.678, -69526.594, -73636.069, -75917.425, -76068.055, -74442.277, + -70802.985, -65476.889, -58356.889, -47059, -36431, -51648.612, -59223.667, -69535.305, -72214.460, -77759.477, + -75889.014, -77893.313, -72175.467, -70311.480, -61146.903, -55517.043, -31790, -46199.663, -57627.954, -66291.686, + -72533.314, -76389.007, -77975.651, -77694.814, -75456.663, -71528.125, -65711.726, -58396.391, -46947, -25670, + -42607, -52930.718, -65415.066, -70103.089, -77593.919, -77497.277, -80590.318, -76187.803, -76010.046, -68062.962, + -63943, -52201, -36738, -49257.122, -60976.434, -69669.322, -75340.567, -79013.401, -79990.031, -79070.629, + -76797.605, -72204.524, -65910.513, -58410.513, -46686, -32410, -44283, -58148.427, -65853.559, -75947.721, + -77783.084, -82439.33541, -79758.960, -80649.555, -73893.476, -71420.533, -61021, -54502, -25840, -40064, + -53123.419, -63189.143, -72413.635, -78575.468, -81480.330, -82167.33008, -81103.276, -77842.123, -73174.025, + -66279.675, + -57509.752, -46034, -34456, -49760, -58962.142, -70503.166, -75632.251, -83265.66488, -82747.010, -84523.199, + -79283.199, -77968.652, -69132.879, -64110.244, -51297, -29580, -44078, -55617.906, -66426.124, -73891.676, + -80709.521, -84597.790, -84880.033, -83018.343, -79346.533, -73873.299, -66884.808, -57690.044, -45932, -40138, + -50720, -63884.195, -70715.958, -79691.285, -82608.994, -87921.351, -84298.751, -83628.329, -76175.987, -72686.543, + -61681.314, -54399, -33729, -46798, -58992.390, -68274.262, -76535.784, -81712.239, -86208.750, -87709.151, + -84876.390, -80625.395, -75014.934, -67394.848, -58107, -46030, -29221, -41330, -55800.217, -64000.297, + -74959.250, -79364.730, -85948.917, -86494.860, -88773.558, -82662.222, -80172.886, -70724.686, -64883.792, -51959, + -36896, -50338, -61107.293, -70973.964, -77745.126, -83652.406, -86351.877, -87896.158, -86638.575, -82208.712, + -75986.253, -68239.518, -58796, -46277, -30981, -46724, -56232.805, -68769.319, -74772.524, -82867.392, + -84817.054, -88459.630, -86453.745, -86807.827, -78925.692, -74301.201, -62999.087, -55070, -40716, -52970.338, + -64135.994, -72619.953, -80085.915, -84227.656, -87122.683, -87212.984, -86806.320, -83605.357, -77216.712, + -69011.800, + -59140, -46267, -36803, -47599, -61347.771, -68562.789, -78845.748, -82352.842, -87270.901, -86369.207, + -88412.843, -84157.095, -82583.591, -72907.613, -66101.047, -52411, -30460, -43771, -56158.912, -65893.881, + -75122.251, -81211.319, -85661.557, -86785.057, -87710.624, -86020.106, -83456.497, -78340.606, -69964.665, -59597, + -46631, -38163, -53079.678, -61354.361, -72929.855, -78341.593, -85444.610, -85606.827, -88793.627, -85820.385, + -86079.123, -79686.469, -76182.159, -64511.635, -55573, -34055, -47423.491, -58519.121, -68582.214, -76127.179, + -82948.417, -85608.088, -87543.559, -87218.851, -86119.303, -82596.303, -77805.842, -70825.842, -60454, -47189, + -28448, -44311, -54318.333, -66425.976, -72300.590, -81292.514, -83530.365, -88114.842, -86431.125, -88224.765, + -83175.112, -81320.975, -73066.415, -67636.415, -53896, -38759, -51205.403, -62511.942, -70655.702, -77624.426, + -82331.795, -85968.970, -87326.776, -87621.838, -85577.994, -82181.239, -76712.473, -69931.122, -61376, -47944, + -35052, -46547, -59830.146, -67333.330, -76381.971, -79803.334, -86189.480, -86019.859, -89223.846, -85588.217, + -85227.225, -78137.959, -74194.596, -64312.972, -57282.972, -29128, -42812, -55561.993, -65066.993, -73170.750, + -78887.990, -83516.403, -86341.057, -87954.577, -87410.826, -85430.657, -81334.373, -75836.455, -68614, -60305.625, + -37707, -52358.366, -61173.366, -71593.762, -76310.599, -83570.462, -84570.589, -89102.900, -86780.428, -87930.996, + -82246.534, -79659.534, -70693.745, -64933.745, -33608, -47422, -58457.765, -67821.446, -75025.099, -80966.783, + -84601.889, -87263.637, -88028.052, -87485.032, -84800.290, -80651.995, -74629.515, -66969.515, -56178, -44106, + -54064, -65730.230, -71825.182, -80355.913, -82507.185, -88093.734, -86955.692, -89394.976, -85116.322, -83968.236, + -76182.664, -71627.041, -59170.544, -38610, -50822, -61470.962, -69911.912, -77343.235, -82292.947, -85932.515, + -87850.550, -88417.759, -87070.828, -84333.837, -79640.571, -73337.986, -64016.090, -52811.510, -34790, -46053, + -58908, -66199.683, -76140.819, -79775.384, -86322.384, -86361.788, -89907.404, -86942.262, -87132.015, -80608.012, + -77353.680, -66473.291, -58218.688, -28900, -42364, -54269, -63720.100, -72557.908, -78747.902, -83860.500, + -86863.855, -88372.517, -88406.595, -86990.248, -83564.248, -78512.227, -70653.222, -60536.329, -49574, -37297, + -51353, -59545.965, -70762.348, -75920.745, -83659.318, -85031.920, -89524.361, -87606.688, -89252.551, -84119.941, + -82069.943, -72445.330, -65781.671, -52646.529, -33200, -46193, -56619.931, -66672.465, -74280.725, -80736.351, + -84999.925, -87606.632, -88719.883, -88504.363, -86487.931, -82630.914, -76251.054, -67715.390, -57673.183, + -46169.627, + -42886, -52136, -64549.112, -71032.441, -80070.575, -82828.978, -88331.527, -87457.761, -90348.765, -86470.765, + -85841.983, -77449.733, -72229.823, -60464.175, -51918.586, -37560, -48875, -59937.674, -69022.535, -76783.184, + -82304.658, -85986.510, -88216.279, -89253.079, -88390.901, -85939.518, -80836.736, -73587.477, -64953.808, + -54392.537, + -33810, -44274, -57464, -65255.055, -75628.711, -79732.885, -86321.830, -86583.717, -90575.805, -87991.071, + -88655.990, -81598.964, -77567.508, -67063.329, -60026.421, -46287.280, -40511, -52769, -62811.539, -71870.352, + -78767.745, -83591.301, -87026.789, -89043.251, -89365.821, -88328.240, -84417.076, -78347.029, -71119.507, + -62203.632, + -51763.919, -35387, -49807, -58768, -70222.022, -75713.421, -83491.154, -84930.799, -90014.842, -88568.397, + -90557.336, -84495.645, -81888.569, -72796, -67085.889, -54682.260, -45959.505, -31354, -44749, -55908, + -66303.837, -74229.276, -80426.583, -84982.661, -88084.389, -89536.343, -90033.833, -87003.403, -82062.759, + -76337.796, + -68656.747, -59699, -49025, -41500, -51456, -64068.907, -70739.025, -79831.849, -82542.653, -88712.556, + -88249.746, -91525.995, -86821.654, -85268.961, -77492.236, -73046.723, -62063, -54697, -40702, -36170, + -48382, -59519.672, -68897.589, -76424.685, -82182.050, -86418.465, -88943.073, -90397.782, -88639.564, -85095.425, + -80436.079, -74185.336, -66493.091, -57621.687, -46588, -43790, -57259, -64887.678, -75388.883, -79553.791, + -86701.720, -87228.250, -91652.886, -87996.246, -87696.780, -80971.048, -78079.056, -68409.367, -62354, -49621, + -40371, -52564, -62822.792, -71408.122, -78645.771, -83977.117, -87699.500, -90065.063, -89474.217, -87181.217, + -83765.530, -78794.412, -72305.051, -64590.086, -54967, -44050, -35518, -50012, -58815, -70280.208, + -75651.501, -83957.354, -85728.591, -91098.591, -88417.983, -89368.186, -83753.186, -82172.423, -73888.638, + -68888.638, + -57687, -49798, -45047, -56430, -66182.327, -74402.820, -81073.825, -85836.183, -89197.486, -89598.575, + -88544.269, -86251.640, -82480.985, -77102.331, -70744.836, -62270, -52769, -41619, -42411, -52173, + -64616.159, -71106.108, -80612.373, -83572.954, -89941.545, -88333.624, -90314.440, -86080.440, -85354.976, + -78144.759, + -74608.944, -64543, -57874, -44945, -37362, -49509, -60417, -69548.078, -77414.181, -83430.454, + -87816.391, -89224.825, -89172.136, -87943.711, -85248.694, -81043.645, -75654.952, -68651, -60286, -50338, + -34419, -45168, -58554, -66200.133, -76701.671, -80870.217, -88234.237, -87621.004, -90525.302, -87365.715, + -87661.052, -81731.334, -79089.775, -70258.610, -64916, -53151, -44525, -42206, -54222, -64230.237, + -73348.094, -80476.840, -85896.420, -88256.255, -89022.955, -88837.185, -87193.012, -84087.840, -79668.965, + -73759.484, + -66658, -58032, -47599, -37763, -52015, -60780, -72256.802, -77772.929, -86015.286, -86393.286, + -90065.330, -87911.302, -89145.566, -84350.454, -82669.902, -74973.468, -70820.558, -60324, -52993, -39197, + -47441, -58582, -68490.514, -76898.298, -83471.230, -86699.477, -88281.659, -88983.895, -88321.546, -86240.151, + -82817.944, -77896.108, -71979.336, -64543, -55536, -44786, -44870, -54902, -67241.890, -74145.950, + -83362.021, -84630.302, -88993.745, -87738.709, -89860.278, -85931.564, -85378.907, -78625.430, -75533.917, + -66330.756, + -60314, -47786, -38732, -52210, -63509, -72837.892, -80607.102, -84629.337, -87004.837, -88507.142, + -88696.05676, -87499.252, -85063.288, -81324.613, -76287.496, -69773.558, -62315, -52881, -42141, -45920, + -61533.861, -69883.861, -80132.861, -82286.266, -87352.947, -86936.155, -89880.462, -86899.743, -87261.734, + -81627.365, + -79422.905, -71175.457, -66596.232, -55396, -47506, -33824, -55331, -68025.582, -77272.128, -81981.906, + -85211.010, -87442.784, -88413.631, -88058.879, -86683.922, -83769.256, -79708.439, -74300.656, -67768.033, -59923, + -50133, -39270, -50263, -62408.912, -76543.912, -79635.573, -85188.185, -85703.490, -89278.96289, -87156.248, + -88434.990, -83723.632, -82470.963, -75213.483, -71425.807, -61628, -55079, -42225, -43920, -57464, + -70874.208, -78922.507, -82932.060, -85886.571, -87643.571, -88070.931, -87553.588, -85494.383, -82418.214, + -77937.580, + -72332.372, -65407.646, -57231, -47236, -36021, -51661, -66432.229, -74020.541, -82535.996, -84059.102, + -88124.303, -86891.154, -88950.055, -85218.650, -84832.889, -78527.991, -75646.432, -66738.751, -61376, -49928, + -41302, -46528, -60632.243, -69689.625, -77727.859, -83788.959, -86416.766, -87581.815, -87850.713, -86643.508, + -84616.356, -80935.860, -76213.609, -70026.925, -62857.215, -54148, -44293, -32825, -55899, -64509.798, + -74425.804, -79545.478, -86429.152, -86338.914, -88887.138, -86037.478, -86508.588, -81340.426, -79199.286, + -71180.500, + -66810.889, -56244, -49090, -36058, -49788, -60030.131, -69304.222, -76356.251, -82383.396, -86545.824, + -87721.453, -87140.904, -85918.804, -83201.836, -79584.566, -74072.847, -68026.525, -60119, -51214, -40967, + -44861, -54539, -65696.198, -71979.892, -79972.231, -82887.048, -88261.856, -86521.895, -87568.736, -83131.736, + -82018.309, -74940.483, -71497.762, -61749.669, -55657, -43668, -34931, -49788, -60205.071, -68459.027, + -75644.575, -80701.140, -84913.969, -87228.585, -86950.204, -84821.133, -82014.648, -77500.608, -72380.218, + -65398.041, + -57632, -48130, -37642, -43939, -56356.721, -63595.890, -72986.451, -77050.330, -83270.226, -84318.245, + -88079.178, -84691.178, -84253.772, -78208.572, -75455.934, -66985.934, -61782.271, -50482.271, -42830, -29259, + -50487, -59904, -68197.298, -74477.145, -79732.781, -82934.609, -85436.002, -86016.422, -84193.408, -80522.920, + -75933.866, -69925.620, -63224.224, -54540.837, -45382, -34364, -46370, -54769.984, -65229.639, -70517.830, + -77842.734, -80023.821, -84532.731, -83788.251, -85949.886, -81142.059, -78986.606, -71313.606, -66959.515, + -56559.515, + -50120, -37250, -27852, -40278, -50627, -60202.873, -67673.666, -73937.063, -78171.430, -81606.215, + -83068.031, -84002.139, -82960.475, -79516.703, -74241.300, -68231.300, -60419.183, -52168.941, -42048, -31093, + -45280, -56872.292, -63270.507, -71767.080, -74849.652, -80431.769, -80750.415, -83747.855, -81415.932, -81965.449, + -75619.099, -71759.503, -62368.181, -56570.082, -44609.513, -36608, -22092, -40939, -51493.329, -60055.807, + -67516.176, -72835.315, -77066.944, -79625.824, -81431.837, -81267.322, -80651.229, -77991.543, -72924.037, + -66301.929, + -58242.598, -49120.105, -39076, -27583, -47954.942, -55568.953, -64940.303, -69046.831, -75635.066, -76680.726, + -80925.751, -79454.206, -80996.206, -77117.420, -76085.532, -67763.409, -62554.917, -51238.218, -44322.012, -30892, + -42607, -52018.205, -60264.029, -66678.390, -72013.882, -75444.011, -78146.631, -79041.934, -79266.008, -77544.399, + -75356.575, -70742.509, -64196.037, -55757.092, -46607.806, -35974.400, -39002, -47296.480, -57593.735, -62708.735, + -70398.380, -72535.360, -77407.809, -76865.073, -79336.065, -76299.378, -76269.321, -70531.280, -67853.216, + -57991.157, + -51478.988, -38765.027, -30199, -43762, -53021, -60219.913, -66669.913, -71039.365, -74375.279, -76063.679, + -77135.097, -76440.481, -75126.744, -71488.858, -67699.408, -61662.438, -53741.615, -43883, -33198, -38815, + -50254, -56383, -64846.847, -68300.398, -73679.080, -73596.464, -77050.464, -74791.823, -75763.602, -71105.649, + -69309.428, -61945.833, -57831.276, -46491, -38638, -24640, -34857, -45392, -53729, -61225.051, + -66779.471, -70942.314, -73385.389, -74575.599, -74651.975, -74187.955, -71622.947, -68752.115, -63622.582, + -58266.284, + -50777.717, -41542.306, -30108, -42094, -49537, -59057, -63758.063, -70148.749, -71253.533, -74761.968, + -72887.371, -74706.290, -70716.290, -70117.944, -63599.035, -60493.935, -51770.574, -46320.681, -33422, -36924, + -46239, -55023, -61568.457, -67330.270, -70647.592, -72559.051, -73366.327, -72881.928, -71312.942, -69142.584, + -65012.292, -60472.180, -53989.298, -47208, -38423.145, -27302, -41759, -52350, -58194.398, -65684.398, + -68491.327, -72454.527, -71737.183, -73705.338, -70155.687, -70393.674, -64639.317, -62604.927, -54427.163, + -49932.125, + -39715, -32733, -38182, -47925, -55415.247, -62283.702, -66939.908, -70190.170, -71817.156, -72069.250, + -71249.466, -69154.966, -66039.153, -62208.978, -56625.836, -50502.687, -42550.087, -34363, -23991, -44870, + -51568, -60473.620, -64163.620, -69362.706, -70085.148, -72534.282, -70090.097, -70528.335, -65478.335, -64210.384, + -56828.983, -53258.450, -43749.924, -37867.276, -26054, -40008, -48540, -56461.520, -62297.021, -66677.553, + -69458.297, -70822.822, -70762.778, -69423.633, -66830.570, -63389.417, -58736.174, -53425.513, -46456.710, -38903, + -29643.709, -19710, -44330, -54055, -59089.187, -65250.220, -67255.165, -70688.892, -69469.940, -70406.159, + -66186.403, -65303.808, -58703.194, -56010.223, -47212.300, -42102.511, -31167, -23695, -41088, -49807, + -56554.259, -62207.753, -66042.861, -68560.782, -69531.640, -69166.263, -67328.663, -64560.163, -60570.397, + -55838.758, + -49708.604, -42852.758, -34444.267, -25487, -14737, -47134, -53002, -60234.770, -63480.441, -67940.926, + -67835.532, -69671.423, -66381.423, -66064.228, -60302.028, -58164.901, -50269.937, -45931.271, -35874.153, + -29376.914, + -16931, -42588, -50235, -56671.937, -61791.501, -65505.009, -67460.822, -68054.493, -67196.536, -65200.295, + -61898.708, -57839.128, -52562.344, -46315.400, -38701.466, -30556, -20890.661, -10220, -46370, -54530, + -58694.590, -64279.590, -65674.649, -68180.170, -66040.806, -66333.211, -61476.483, -59826.502, -52831.753, + -49169.062, + -39780.305, -34000.330, -22501, -14503, -43249, -50720, -56638.864, -61313.864, -64594.769, -66379.861, + -66377.306, -65166.577, -62727.577, -59299.250, -54791.409, -49263.973, -42534.708, -34908.351, -26007.442, -16385, + -48102, -53334, -59774, -62076.660, -65966.660, -64980.767, -65941.586, -61903.724, -61017.575, -54642.370, + -51818.224, -43282.800, -38227.878, -27522.974, -20472.643, -7537, -43808, -50686, -56486, -60566, + -63611.300, -64898.272, -64520.401, -62928.809, -60295.381, -56442.241, -51635.507, -45847.601, -38861.195, + -30643.674, + -21795, -11643, -46929, -54530, -57883.483, -62583.483, -63070.595, -64925.569, -61887.902, -61595.275, + -56020.981, -53858.983, -46097.775, -41888.158, -31893.589, -25436.794, -13354, -4792, -43883, -50813, + -55927, -59931.039, -62281.039, -63290.716, -62544.054, -60590.901, -57501.125, -53467.756, -48351.059, -42099.281, + -34843, -26502.151, -17077.717, -6805, -48363, -52723, -58559.979, -60060.709, -62990.709, -61313.348, + -61581.439, -57067.388, -55360.552, -48393.908, -44892.853, -35794.885, -29986.887, -18716.842, -11058.077, -44153, + -50329, -55597.587, -58797.587, -60922.642, -61275.641, -60377.101, -58084.101, -54716.889, -50290.430, -44917.716, + -38409.165, -30722.931, -22077.816, -12513, -1788, -46724, -53663, -56239.094, -60109.094, -59796.295, + -60764.729, -57307.034, -56253.854, -50137.665, -47290.471, -38917.753, -33926.451, -23360, -16304.550, -3752, + -44032, -50189, -54519.391, -57719.391, -59211.468, -59308.029, -57829.979, -55431.345, -51720.273, -47086.090, + -41250.280, -34303.227, -26416.935, -17469.939, -7567.651, 3288, -48009, -51484, -56484.065, -57374.888, + -59256.179, -56738.135, -56402.225, -51329.977, -49097.186, -41526.314, -37243.629, -27379.369, -21097.480, + -9368.702, + -1109.439, -43939, -49351, -53654, -56254.440, -57552.229, -56882.585, -55411.784, -52396.538, -48727.383, + -43553.865, -37438.173, -30268.305, -21943.150, -12816.496, -2710, -45690, -51949, -53865.547, -56945.547, + -55572.136, -55846.659, -51740.766, -50227.088, -43673.096, -39995.085, -30868.738, -25318.446, -14236, -6646.444, + -43203, -48652, -52311.585, -54696.585, -55167.553, -54483.841, -52408.647, -49632.795, -45288.307, -40105.182, + -33394.442, -25700.179, -17415.479, -7972.892, -46631, -49369.695, -53489.695, -53384.219, -54578.442, -51365.374, + -50641.603, -45062.885, -42097.940, -33859.444, -28933.729, -18396.604, -11773.280, 581.278, -42858, -47469, + -50984.778, -52385.802, -52883.041, -51717.041, -49701.725, -46269.170, -41949.247, -36047.421, -29370.436, + -21545.047, + -12782.594, -3324.661, -44116, -49693.859, -50339.782, -52437.678, -50601, -50409.378, -45653.453, -43543.966, + -36251.884, -31997.263, -22326.122, -16316.264, -4794, 3568.780, -41601, -46537, -49060.918, -50465.352, + -50359.774, -49297.416, -46584.825, -43019.298, -38079.308, -32267.927, -24988.580, -16924.007, -8280.333, 2050.323, + -44600, -46678.794, -49781.794, -48936.193, -49638.565, -45837.359, -44361.950, -37977.526, -34435.511, -25594.291, + -20250.367, -9262.288, -1929.789, -41088, -44797.410, -47405.277, -48441.629, -48253.454, -46520.978, -43549.963, + -39471.633, -34374.375, -27871.188, -20661.122, -12798.747, -3117.421, -41880, -46051.959, -46433.249, -48247.714, + -45447.714, -44609.073, -39051.678, -36168.213, -28300.768, -23576.717, -13308.106, -6825.554, -39716.110, + -43286.112, + -45296.112, -46367.212, -45811.212, -43664.042, -40203.311, -35772.347, -30189.129, -23804.531, -16587.263, + -7571.092, + -36412, -41501.557, -42841.557, -45707.557, -44224.718, -44256.643, -39610.851, -37338.832, -30318.710, -26348.678, + -16873.221, -11051.523, 1187.428, -33888, -38319.800, -41396.446, -43389.946, -43822.614, -42809.843, -40335.553, + -36688.140, -31866.811, -26175.551, -19757.872, -11541.207, -2236, -36424.210, -38609.805, -42510.805, -41930.648, + -43002.379, -39174.769, -37864.474, -31714.852, -28538.859, -19886.613, -14681.900, -3126.391, 4092.278, -32817, + -36900.203, -39906.282, -41218.543, -41221.010, -39549.372, -36685.050, -33027.838, -28117.679, -22443.092, + -14986.905, + -6383.356, 2832.724, -30879, -33612.030, -38669.876, -39018.876, -41139.270, -38351.382, -37829.006, -32276.833, + -30211.250, -22336.400, -17814.995, -7184.666, -544.393, -27162, -31829, -35617.536, -37980.718, -38988.462, + -38456.703, -36485.425, -33581.954, -29626.234, -24602.181, -17878.164, -10064.807, -1421.991, -28513, -34380.894, + -35634.992, -38709.442, -36755.621, -37325.237, -32883.237, -31370.170, -24379, -20416.486, -10598.947, -4563.790, + -26492, -31176.173, -34352.054, -36396.860, -36710.837, -35701.452, -33811.138, -30592.908, -26282.849, -20235.776, + -13239.737, -5068.760, 3863.753, -23157, -29649, -31588.825, -35883.945, -34837.645, -36292.174, -32775.833, + -32011.069, -25872.246, -22565.434, -13535.485, -8070.533, 2935.796, -26287, -30235.364, -33396.044, -34538.319, + -34481.690, -33405.930, -31062.849, -27477.212, -22194.490, -15872.832, -8359.526, -67.609, 9042.924, -24526, + -27237, -32437.191, -32533.791, -34762.564, -32213.155, -32183.944, -26937.491, -24207.433, -16036, -11004.576, + -711.531, 5723.462, -25579, -29511.593, -31694.334, -32796.302, -32569.478, -30999.617, -28155.088, -23713.115, + -18025.544, -11060.995, -3475.827, 5050.256, -22542, -28278.795, -29437.900, -32646.917, -31139.930, -31826.765, + -27496.591, -25360.638, -18009.031, -13482.535, -3912.629, 1971.040, -20502, -25309, -28265.798, -30421.954, + -31140.975, -30541.036, -28339.875, -24748.709, -19687.033, -13358.069, -6344.231, 1476.065, -17139, -23837, + -25821, -29905.689, -29581.995, -30954.847, -27494.847, -26050.089, -19369.486, -15472.924, -6721, -1230.357, + -20484, -24400.204, -27390.372, -29094.952, -29546.390, -28059.394, -25231.676, -20797.457, -15213.984, -8823.433, + -1499.839, 6761.337, -18779, -21611, -26600.853, -27240.185, -29503.591, -27047.551, -26250.532, -20370.675, + -16954.318, -8987.971, -4014.338, 6134.822, -15239, -19897, -23740.883, -26400.883, -27662.727, -27178.934, + -25259.399, -21414.660, -16524.884, -10789.358, -4072.482, 3601.709, 11841, -13087, -16776, -22692.125, + -24352.979, -27345.496, -25986.409, -25940.221, -20740.775, -17924.127, -10590.805, -6274.285, 3092, 9091.143, + -14690, -19627, -23143.484, -25268.789, -25760.846, -24786.006, -21524.237, -17310.760, -12162.526, -6159.279, + 876.284, 8666.876, -9688, -17922, -20650, -24690.197, -24345.620, -25109.370, -20645.575, -18340.801, + -11875.432, -7982.976, 607.390, 6047.135, -12966, -18770, -22287.468, -23820.349, -23769.717, -21064.159, + -17509.208, -12970.252, -7713.850, -1309.812, 5838.833, -9632, -14215, -20945.200, -22252.843, -23785.062, + -20027.757, -18188.360, -12428.986, -9115.396, -1242.490, 3565.809, 13462, -10805, -16487.444, -21033.402, + -22451.523, -20054.113, -17145.300, -13226.905, -8634.713, -2844.337, 3538.895, 11146.100, -6101, -13265.406, + -16749.192, -21748.074, -18869.711, -17469.152, -12469.628, -9655.227, -2665.813, 1714.994, 10759.134, 16674.000, + -2468, -8644, -13637.674, -17614.122, -18258.150, -16365.570, -12882.361, -8928.826, -3767.956, 1854.098, + 8844.314, 16536.789, 2329, -5365, -9246.048, -14727.981, -14791.467, -15952.695, -11971.655, -9604.535, + -3332.504, 460.315, 8789.626, 14059.638, -624, -6077.998, -10491.300, -11858.159, -12432.126, -11646.829, + -8755.009, -4139.817, 832.024, 7202.218, 13906.710, 2757, -1551, -7547.241, -8117.014, -10369.040, + -8627.788, -8659.243, -3515.782, -198.673, 7277.922, 12097.868, 21613.450, 7666, 1783.811, -3201.643, + -5230.276, -6653.080, -6579.162, -5697.884, -3552.680, 357.934, 6156.263, 12118.013, 19663.130, 11178, + 6465, -180.786, -1199.832, -4469.603, -3379.399, -4319.378, -958.197, 92.896, 6444.531, 10712.329, + 19485.441, 16208, 9911, 4416, 1648.580, -540.130, -1254.862, -1168.195, 318.420, 2534.055, + 6030.969, 10921.557, 17868.783, 19859, 14718, 7480, 5873.992, 1783.984, 2257.527, 253.235, + 2971.341, 3291.363, 8144.502, 10298.604, 17799.838, 18313, 12240, 8729.962, 5885.328, 4395.928, + 3658.925, 4314.943, 5887.719, 8703.762, 12218.129, 17069.966, 22971, 23092, 15453, 13216.037, + 8358.805, 8099.083, 5217.844, 7059.470, 6651.455, 10844.119, 12366.823, 18684.447, 21911.973, 20279, + 16283, 12681.359, 10397.195, 8830.900, 8618.581, 9394.568, 11569.836, 14473.071, 18540.484, 23286.540, + 29277, 23669, 20819, 15263.461, 14375.747, 10613.564, 11483.181, 10270.534, 13744.058, 14669.306, + 20218, 22934, 30311, 24098, 19773.755, 16782.727, 14472.693, 13278.600, 12964.236, 14523.463, + 16938.354, 20376.377, 24483, 29845, 28671, 22486.265, 20953.026, 16374.031, 16349.762, 14321.577, + 16621.748, 17203.317, 22155, 24222, 31019, 32137, 27079, 23428.006, 20389.739, 18383.978, + 17234.808, 17826.697, 19386.117, 22321.032, 25838.886, 30600, 36766, 29910, 27711.015, 22445.098, + 21795.097, 18827.328, 20234.997, 19993.944, 23862.654, 25714.044, 31876, 34530, 30395, 26534.142, + 23820.800, 21994.303, 21638.594, 22310.551, 24340.878, 27377.867, 31587.793, 37549, 34614, 28747.193, + 27540.552, 23669.571, 24310.487, 23197.352, 26033.471, 27329.197, 32777, 42281, 37483, 32885.834, + 29685.782, 27179.458, 25851.085, 25806.321, 26832.012, 29022.347, 32562.356, 41684, 35243.465, 33369.073, + 28942.197, 28896.386, 26772.323, 28924.447, 29222.357, 33596.070, 36079.083, 44823, 39362.400, 35674.357, + 32548.508, 30698.209, 29586.778, 29898.383, 31210.899, 33779.829, 37393.536, 42048, 39510.575, 34516.307, + 33838.383, 30864.244, 32174.778, 31614.997, 35236.487, 36934.002, 42932, 46454, 42064.406, 38216.486, + 35762.849, 33817.544, 33425.957, 33807.514, 35625.328, 38285.812, 42439, 45986, 40496.954, 39154.419, + 35448.712, 35947.972, 34610.869, 37361, 38363.191, 43268, 46404, 49034, 44322.348, 41308.033, + 38733.643, 37490.046, 36920.254, 37949.987, 40052.115, 43263, 47291.952, 46893.271, 44841.190, 40614.449, + 40340.361, 38146.828, 39956.674, 40349.887, 44461, 46723.960, 53344, 51204, 47357.155, 44017.749, + 42288.896, 40920.654, 41044.874, 42183.829, 44626.243, 48011, 52704, 51220.992, 46255.198, 45333.950, + 42446.515, 43379.438, 42902.852, 46042, 47855.018, 53542, 54278, 49955.092, 47527.618, 45392.055, + 44873.466, 45093.467, 46571, 49247.430, 53188, 57936.868, 52626, 50894.038, 47309.112, 47456.463, + 46164.946, 48423.290, 49445.025, 54216, 57278, 56607, 53337, 50574.046, 49312.586, 48590.073, + 49392.190, 51148.445, 54251, 58246, 63556, 56803, 52716.372, 52317.758, 50127.186, 51511.976, + 51725.565, 55666, 57990.838, 64199, 59690, 56197, 54261.981, 52956.981, 52936.198, 53703.583, + 56034, 59327, 63863, 69126, 58621, 57418.575, 54718.575, 55469.876, 54805.418, 57735, + 59386.724, 64801, 68400, 62401, 59877, 57755.978, 57176.315, 57183.788, 58691.380, 60991, + 64748, 69364, 63202, 59806.815, 59881.141, 58453.841, 60715.692, 61479.351, 66027, 68966, + 65950, 63179.566, 61902.280, 61004.897, 61815.639, 63386.935, 66368, 70187, 75272, 65395.964, + 64995, 62618.605, 63968.605, 64091.940, 67902, 70188.512, 76115, 69108, 67154, 65534.451, + 65490.830, 66103.904, 68578.468, 71674, 75937, 70563, 67393.463, 68081, 67239.957, 70301, + 71898.728, 77149, 80621, 73104, 70751.410, 69850.571, 69725.962, 71177, 73520.540, 77234, + 81782, 72990.299, 72951.535, 71171.958, 73227, 74073.366, 78632, 81563, 76649.327, 75229.327, + 74136.327, 74513.546, 75953.919, 78966.824, 82850, 87728, 79056, 78535, 76035.247, 77295.247, + 76817.572, 80511, 82872.142, 88738, 80929, 79302.276, 79014.646, 79348.918, 81175, 84359.919, + 88577, 93557, 84393, 81342.027, 81992.151, 80904.351, 83454, 84724.653, 89873, 93198, + 84811, 84090.583, 83800.963, 84844.339, 86807.235, 89947.301, 94331, 99733, 87041, 87187, + 85487.368, 87457, 87823.929, 91746.599, 94222.685, 100499, 89403, 88590.741, 88997.161, 90250.433, + 92607, 95867.612, 100208, 92702, 90427, 91688.349, 91479, 94784, 96342.263, 101799, + 105243, 93705, 93625, 94111, 95853, 98362, 101991.017, 106559, 95766, 96552, + 95612, 98277, 99149, 103673, 106548.108, 113324, 98578, 98456, 99562, 101321.771, + 104250, 108006.228, 113135, 101627, 100102, 102103, 102394, 106257, 108366.919, 114543, + 103130, 103730, 104788, 107112, 110190, 114496, 119718, 105011, 106377, 106077, + 109362, 110784, 116058, 119563.699, 108233, 108691, 110487, 112797, 116357, 120901.389, + 126680, 111622, 110077, 112738, 113619, 118108, 121137.442, 127963, 113445, 114075, + 115838, 118767, 122653, 127791, 133919, 115476, 117062, 116802, 120807, 122831, + 129151, 133649, 119148, 119815, 121482, 124590, 129312, 134835.736, 122357, 121492, + 124227, 125090, 130714, 134679.272, 124758, 125990, 127773, 131102, 135947, 126580, + 128792, 129007, 133582, 136016, 142773, 130018, 130633, 131973, 134507, 138383, + 142636, 133714, 133487, 137158, 139175, 144617, 135691, 136621, 138625, 141618, + 145257, 138285, 141209, 142542, 147487, 150352, 141493, 142768, 145233, 148172, + 152430, 145599, 146282, 150430, 152910, 158893, 147246, 149130, 151574, 155133, + 159239, 150260, 153825, 155697, 161083, 153241, 154963, 158117, 161596, 157534, + 158816, 163638, 158861, 161400, 164475, 162225, 166483, 164983, 167415, 171062, + 169725, 171613, 170825, 173987, 177639, 174722, 179536, 177374, 180363, 184587, + 182550, 185030, 183570, 187302, 191454, 187921, 193251, 190479, 193970, 198932, + 196044, 199266, 201427 +}; + +const std::vector NucleiPropertiesTableAME12::BetaEnergy = { + 782.347, 0, 0, 18.591, -13736, 0, 22196.208, -22898.270, 0, 21661.208, + -447.653, -25460, 0, 24283.622, 3505.216, -4288.155, -28945, 0, 23062, 11166.021, + -861.893, -11907.551, 0, 10663.878, 16004.133, -17979.906, -12142.691, 0, 15980.994, 13606.450, + -1068.035, -16494.482, 0, 16119.692, 20445.136, 556.797, -3648.064, -23101.353, 0, 20551.087, + 11509.284, -1982.412, -13653.347, 0, 23841.813, 11708.343, 13369.416, -17338.072, -14576.623, 0, + 24681.813, 17096.957, 13437.110, -2220.472, -17769.959, 0, 16290.813, 20643.792, 156.476, -5144.040, + -23956.953, 0, 20802, 19084.844, 9771.705, -2754.166, -13951.205, 0, 20334.862, 23418.142, + 8010.221, 10420.908, -15417.256, -13305.900, 0, 22740.038, 13160.703, 8678.839, -2760.465, -14548.749, + 0, 26929.008, 11804.956, 13895.984, -1655.929, -4444.510, -19719.308, 0, 26365, 16557.091, + 12522.664, 4820.302, -3239.498, -11177.337, -18899.001, 0, 29575, 15792.500, 17968.942, 3813.632, + 7024.467, -13892.535, -10708.063, 0, 30078, 20392, 17189.257, 8109.516, 5684.167, -3547.138, + -13098.152, -16077, 0, 21551.569, 22755.353, 6489.946, 10818.091, -2843.196, -4781.580, -18601, + -15137, 0, 25849, 23701, 11307.616, 8467.086, 4375.808, -4056.588, -12221.335, -16949, + 0, 28438, 10940.876, 13511.167, 2466.317, 5515.611, -13885.955, -10791.968, -22575, 0, + 28635, 15984.210, 13423.315, 7298.011, 3834.954, -4276.606, -12743.496, -15911, 0, 16067.976, + 18185.615, 7340.225, 9353.766, -4004.433, -5069.136, -18114, -16106, 0, 19821, 17593.809, + 12553.499, 9068.939, 2610.133, -4812.359, -11661.928, -17750, 0, 19159, 21629.381, 12279.884, + 14030.415, 1831.800, 4642.264, -14345.055, -11220.945, -23443, 0, 21226, 15719.825, 13282.806, + 7601.833, 3690.417, -4942.628, -13796.043, -16924, 0, 25072, 14564.903, 17358.397, 6988.725, + 8560.508, -4232.352, -6141.601, -18502, -17046, 0, 24798, 18559.407, 15383.272, 11832.639, + 7994.060, 1491.505, -5398.016, -11976.401, -18360, 0, 18189, 19638.465, 10269.721, 12979.158, + 227.188, 1710.660, -12680.859, -11134.323, -23299, 0, 22030, 19005, 13430.437, 12046.093, + 5823.021, 248.508, -5582.517, -11619.044, -16426, 0, 21553, 22966, 11392.249, 16887.828, + 4591.970, 5382.994, -5491.605, -6061.795, -17158, -15072, 0, 22200, 15859.617, 14140.566, + 10497.392, 3988.426, 167.323, -5966.130, -11874.519, -15961, 0, 25531, 14429.774, 18343.707, + 7857.705, 10413.096, -1142.107, 709.522, -12814.475, -10965.915, -21802, 0, 24853, 18480, + 16403.851, 12401.817, 7900.306, 4865.111, -813.873, -6147.449, -11664.133, -16620, 0, 17864, + 20380.157, 10499.257, 12191.631, 2936.900, 4916.733, -5914.066, -6742.253, -17513, -15211, 0, + 21279, 18676, 15149.625, 10333.073, 6637.846, 3441.998, 565.000, -6524.488, -13109.992, -16371, + 0, 20633, 22543, 13504.103, 14763.421, 4719.967, 7482.082, -1504.403, 1310.894, -14323.050, + -11672.950, -20736, 0, 21768, 17099.435, 14028.810, 8298.611, 5760.317, 2492.038, -421.656, + -6495.476, -12944.874, -15893, 0, 24275, 15552, 18647.485, 7275.244, 9509.686, 599.351, + 3525.217, -6426.100, -7016.480, -17485, -13861, 0, 24843, 18421, 16875.285, 12127.168, + 7687.181, 4565.581, 1833.426, -2220.715, -6867.016, -11404.728, -15616, 0, 18071, 19646, + 11405.496, 12063.525, 3108.237, 5687.166, -3652.680, -267.407, -13432.191, -10479, -20297, 0, + 21890, 19313, 14370.158, 11411.050, 6844.841, 4196.514, 259.025, -2062.055, -7128.572, -12365.750, + -14382, -18564, 0, 22747, 13848, 15920.432, 5683.162, 7724.473, -1377.897, 2366.496, + -7052.394, -7601.071, -16516, -13544, 0, 21834, 17503, 15114, 10500.966, 6631.477, + 1992.177, 600.770, -2930.599, -7444.914, -11995.445, -14974, -17438, 0, 16823, 18378, + 9845, 11940.282, 278.661, 3988.314, -4014.966, -1655.114, -13498.222, -10908, -19282, -15610, + 0, 20057, 18006, 12751, 11688.404, 5261.178, 2001.737, -601.856, -2628.260, -7695.955, + -12886.011, -14420, -17503, 0, 21350, 12808, 13861.376, 4958.290, 6883.167, -2206.825, + 1037.853, -7634.477, -8138.601, -16706, -12883, 0, 20344, 16648, 13822.490, 6890.284, + 6503.044, 2471.826, -752.630, -3207.559, -8041.165, -12860.187, -14404, 0, 15575, 17720, + 5903.497, 9302.339, 1974.766, 3974.477, -4711.235, -2374.561, -14342, -10517, -20409, 0, + 18472, 16776, 9650, 8722.572, 5020.000, 3435.903, -596.849, -3742.311, -8288.106, -13027.803, + -15277, 0, 19776, 8821, 11998.064, 4295.054, 7041.591, -1377.174, 697.343, -8244.547, + -8786.402, -17482, -14325, 0, 19058, 11626, 11691.021, 7476.090, 5965.023, 2603.082, + -231.088, -3451.379, -8694.034, -13699.825, -16713, 0, 21825, 10833, 14474, 6917.780, + 9158.143, 1629.600, 3695.577, -4566.624, -2132.889, -15669, -12659, -21257, 0, 13833, + 13160, 10360.782, 8295.751, 4961.992, 2695.049, -836.232, -3261.729, -8774.967, -14762, -16897, + 0, 12957, 16236, 9208, 11515.227, 3992.834, 6326.907, -2307.909, 381.595, -8561.019, + -9368.981, -18806, -15780, 0, 15342, 12188, 10059.475, 7633.830, 5138.843, 1564.956, + -1073.001, -4798.386, -9142.777, -13243, -17661, 0, 18276, 10914, 13261.920, 6464.062, + 8444.437, 237.345, 2822.813, -6127.982, -4170.819, -14390, -12175, -21909, 0, 17279, + 14159, 11948.660, 9287.033, 7178.372, 3977.129, 1323.699, -2237.488, -5635.144, -9214.149, -13405, + -16143, 0, 12911, 15419, 7586, 10397, 2545.776, 5322.039, -3958.896, -1619.455, + -9181.066, -10088, -17316, 0, 16171, 13730, 11164.939, 8748.568, 6215.378, 3661.322, + 66.977, -3366.187, -5666.019, -9625.876, -13294, 0, 17289, 9530, 11980.510, 4822.343, + 7306.591, -1674.385, 579.696, -7171.039, -4517.255, -14663, -12723, 0, 16338, 12985, + 10254.154, 7963.706, 5940.044, 2138.215, -1351.659, -3254.470, -6179.112, -9541.165, -13776, 0, + 18928, 12215, 13317.453, 6340.694, 9597.751, 251.785, 2640.993, -5175.000, -2117.030, -9581.956, + -10657, 0, 14829, 12758, 9253.245, 8420.904, 3576.099, 561.288, -1001.171, -4220.892, + -6070.780, -10006.936, -13652, 0, 13423, 15527, 8098.373, 11540.093, 2103.220, 4439.812, + -2921.100, -106.957, -8084.271, -4705.077, -15748, 0, 14522, 11112, 9809.563, 5757.564, + 2681.387, 910.200, -2227.146, -3988.490, -6677.457, -10323.236, -13677, 0, 17093, 10610, + 12294.507, 3762.512, 6588.337, -654.578, 1651.704, -6220.000, -2411.943, -10504.272, -10477, 0, + 15798, 13370, 11036.302, 7304.898, 4617.649, 2810.322, -232.641, -2013.400, -4746.550, -6644.089, + -10175.212, -14023, 0, 11681, 14442, 5556.938, 8362.487, 442.770, 3997.645, -4356.102, + -361.618, -8800.859, -5126.746, -15824, 0, 14280, 13212, 8879.285, 6605.965, 4105.932, + 1598.189, -344.774, -2725.361, -4579.803, -7095.834, -10470, -14131, 0, 13227, 15994, + 7550, 9750.507, 2292.905, 5372.825, -2562.387, 1353.147, -6924.952, -2956.415, -10415.849, -11089, + 0, 15146, 10225, 8087.566, 5905.672, 3392.385, 1177.226, -864.709, -3062.363, -4783.495, + -7104.929, -10600.000, 0, 17512, 9366, 11327.031, 3993.624, 6916.250, -921.517, 2960.578, + -4962.881, -1274.931, -8535.057, -6231.442, -15647, 0, 11765, 10277, 7203.149, 5220.518, + 2703.457, 683.166, -1364.680, -3065.363, -5338.951, -7027.056, -11025, 0, 10368, 12985.766, + 6222.716, 8156.103, 954.907, 4208.949, -3573.784, 727.452, -7244.158, -3761.477, -10647, -11225, + 0, 14189, 11534, 9115.384, 6978.916, 4109.475, 2281.356, 150.630, -1625.778, -3639.292, + -5326.096, -7120.000, -11298, 0, 15218, 7575.055, 10311.639, 2679.155, 5545.017, -1870.463, + 2004.299, -5717.846, -1863.987, -9164.578, -5629.860, 0, 14410, 11428.291, 8663.733, 6241.628, + 3855.693, 1586.644, -280.837, -2238.151, -3928.538, -5816.399, -7315.335, -11449, 0, 16936, + 10324, 12484.348, 4688.023, 7490.829, -96.642, 3093.041, -4402.515, -177.757, -7947.084, -4120, + -11742, 0, 12519, 11719.312, 8692.888, 5671.245, 3672.833, 976.630, -919.402, -2273.024, + -4593.081, -6294.012, -7500.000, -11724, 0, 11873, 13865, 7705.132, 10094.161, 1835.364, + 4656.251, -2680.375, 890.595, -6756.079, -2472.943, -10400, -6519, 0, 14224, 13060, + 10065.724, 9224.492, 6161.833, 2904.862, 687.000, -1064.054, -3261.153, -4668.098, -6894.349, -8769.923, + -11475, 0, 15304, 9202, 11541.024, 5129.085, 7633.414, -518.655, 1776.189, -5240.000, + -1314.546, -8835.774, -5022.634, -12813, 0, 14499, 11540, 10808.218, 7465.552, 6817.845, + 3888.269, 282.243, -1861.690, -3671.810, -5473.234, -6988.491, -9194.764, -11758, 0, 10582, + 13164, 6831.763, 8975.327, 2917.709, 5312.357, -3622.600, -670.422, -7452.342, -3489.443, -11005.229, + -7282, 0, 13069, 12194, 9281.872, 8261.522, 5176.454, 4496.511, 1500.401, -2832.760, + -4250.996, -5610.460, -7620.087, -9288, -12076, 0, 12109, 14470, 8200.081, 10958.952, + 4405.480, 6584.187, 545.944, 2278.698, -6111.336, -2489.336, -9448.200, -5840.894, -12925, 0, + 13441, 10769, 9866.671, 6771.161, 5907.281, 2699.470, 1544.281, -1257.582, -4429.863, -6222.459, + -7746.735, -9444, -12519, 0, 15742, 9509, 12536.515, 6003.204, 8094.868, 1949.662, + 3642.576, -2005.885, 354.082, -7882.135, -4624.492, -11302.114, -7929, 0, 12255, 11165.656, + 8483.959, 7465.963, 4141.741, 2895.027, 90.301, -406.665, -3200.963, -6388.644, -8204.913, -9872, + -12872, 0, 10796, 13748, 7215.018, 10282.959, 3507.094, 4918.059, -901.694, 2043.636, + -4255.748, -1573.504, -9675.978, -6806.567, -13690, 0, 13311, 12388, 9734.969, 9228.370, + 6089.067, 4450.238, 1123.500, 925.567, -1690.518, -2563.609, -5115.891, -8375.941, -10368, -12966, + 0, 14916, 8274.683, 11575.494, 5411.738, 7103.017, 162.217, 3186.800, -2973.242, 258.738, + -6392.653, -3504.311, -11670.523, -8939, 0, 13368, 11095.629, 10063.093, 7544.965, 6821.237, + 2659.671, 1935.471, -324.708, -1099.548, -3523.000, -4790.461, -6980.000, -10372, -13264, 0, + 15863, 10007, 12107.643, 5874.614, 8991.924, 2237.851, 4584.477, -1683.717, 1793.640, -5049.653, + -1854.137, -8254.560, -5430.000, -13740, 0, 12446, 11306.539, 8143.760, 6968.724, 4707.369, + 3637.175, 1357.806, 295.062, -2043.844, -3396.755, -5468.766, -6781.350, -8555, -13432, 0, + 11495, 13283, 7503.184, 9048.641, 3421.362, 6386.146, -169.620, 3203.986, -3635.629, -360.992, + -7089.266, -3943.363, -9881.624, -7030.000, 0, 13684, 12750, 9505.000, 8103.757, 5717.240, + 4628.414, 2824.654, 1613.520, -543.751, -1980.169, -4096.283, -5497.918, -7223, -8308, 0, + 14651, 8815.000, 10420.396, 4716.837, 7259.862, 1000.127, 4532.311, -2322.473, 1150.568, -5684.462, + -2587.000, -8965.789, -5760.000, 0, 13814, 11035, 9363.681, 7203.653, 5941.683, 3635.106, + 2661.748, 764.415, -543.020, -2684.742, -4148.295, -6022.480, -7660.000, -10791, 0, 9958, + 11666, 6094.952, 8530.732, 2151.272, 5586.549, -1138.042, 2439.284, -4278.653, -1148.087, -7785.571, + -4555.623, -12456.496, 0, 12212, 10649, 8440.950, 7431.323, 4949.711, 3639.569, 1918.035, + 567.208, -1346.930, -2736.991, -4693.266, -6302.586, -9321.896, -11204.580, 0, 11263, 12855, + 7292, 9941.136, 3634.565, 6547.000, 39.405, 3545.616, -2965.142, 189.753, -6524.003, -3254.332, + -10880.389, -8254.603, 0, 13465, 11904, 9451, 8837.808, 6189.994, 5112.598, 3003.355, + 1508.662, 34.078, -1416.347, -3426.000, -5052.021, -7859.005, -10116.893, -10962, 0, 14056, + 8193, 11216.383, 5158.397, 7738.573, 1372.602, 4492.440, -1917.673, 1645.863, -5132.610, -2049.998, + -9624.613, -6663.659, -13135.142, 0, 12992, 10427, 10052.534, 7608.260, 6455.626, 4263.574, + 2606.706, 1113.251, -215.521, -2016.432, -3857.018, -6379.860, -8535.664, -10042.207, -11503.556, 0, + 9250, 12413, 6483.328, 9038.135, 2758.402, 5502.549, -873.766, 2891.004, -3878.000, -628.781, + -8392.250, -5219.910, -11765.648, -8545.589, 0, 11316, 11062, 9084.861, 7760.649, 5521.474, + 3681.852, 2229.769, 1036.800, -862.178, -2451.383, -5102.783, -7249.259, -8633.669, -10561.271, 0, + 10463, 13190, 7791, 10373.656, 4104.174, 6588.945, 261.888, 3992.088, -2584.734, 664.919, + -7057.026, -4031.457, -10504.178, -7036.908, -13739.142, 0, 12258, 10042, 9058.813, 6897.393, + 4823.555, 3435.488, 2016.462, 322.571, -1037.581, -3911.164, -6070.047, -7227.523, -8915.874, -10439.713, + 0, 14420, 8961, 11454, 5491.399, 7777.733, 1439.645, 5084.043, -1446.445, 1988.939, + -6061.691, -2607.075, -9092, -5710, -12403.629, -8722.755, 0, 13395, 11159, 10396, + 7925.439, 6197.307, 4556.078, 3101.728, 1451.955, 497.490, -3030.430, -4940.644, -5724.962, -7681.049, + -8957, -10675, 0, 9956, 12613, 6670.118, 9092.824, 2710.804, 6169.903, -462.810, + 3276.249, -4704.341, -1552.693, -7776.725, -4445.512, -10984, -7365, -13995, 0, 12212, + 11138, 9377.917, 7527.095, 5757.366, 4236.414, 2524.608, 1454.710, -1758.218, -3544.139, -4659.346, + -6250.743, -7692.245, -8871.404, -11033, 0, 13469, 7629, 10501.206, 4164.908, 7147.929, + 526.530, 4424.635, -3656.640, -299.466, -6725.732, -2891.991, -9669.689, -6055, -12734, 0, + 12193, 10259, 8585.330, 7237.648, 5331.346, 3722.384, 2365.563, -590.846, -2293.000, -3415.687, + -4971.117, -6489.361, -7714.965, -9623, -10917, 0, 14494, 8803, 11466, 5371.293, + 8305.853, 1771.237, 5370.000, -2680.608, 950.204, -5615.000, -1580.763, -8283.785, -5000.000, -11201, + -7890, 0, 11383, 9752, 8220.493, 6671.005, 4762.358, 3361.303, 401.089, -1054.306, + -2292.629, -3770.655, -5378.654, -6357.495, -8474, -9501, -11150, 0, 9762, 12443, + 6489.949, 9506.265, 2960.581, 6368.591, -1607.921, 1980.816, -4234.000, -725.464, -7210.218, -3535.815, + -10066, -6669, -12929, 0, 12147, 10908, 9131, 7866.103, 6016.274, 4385.936, + 1408.435, -52.689, -1228.425, -2695.017, -4205.048, -5388.693, -7004, -8365, -9948, 0, + 10749, 13386, 7646, 10501.538, 4168.546, 7364.020, -613.233, 2904.299, -3159.587, 295.337, + -5929.718, -2641.560, -8831.165, -5343, -11765, -8626, 0, 12016, 10008, 9117.857, + 7128.746, 5419.579, 2359.836, 766.700, -185.770, -1644.173, -3105.172, -4418.875, -5909.481, -7102, + -8626, -10433, 0, 14252, 8765, 11477, 5516.127, 8242.357, 378.000, 3672.043, + -2154.027, 1234.264, -4795.112, -1680.553, -7696.434, -4152.910, -10497, -7331, -13795, 0, + 11141, 9909, 8407.785, 6572.931, 3228.247, 1582.183, 702.236, -662.349, -2081.396, -3422.207, + -4921.836, -5916.772, -7436, -9008, -10749, 0, 10032, 12340, 6904.060, 9216.071, + 1268.282, 4363.443, -1255.036, 2121.568, -3928.713, -552.657, -6753.477, -3091.513, -9203.161, -6017, + -12529, -9054, 0, 11299, 9329, 7769.210, 4022.234, 2375.500, 1502.305, 188.915, + -1196.805, -2435.964, -3738.675, -5037.117, -6513.938, -7459, -9434, -10740, 0, 15614, + 8350.000, 10249.000, 2153.406, 5066.681, -416.792, 2944.307, -2980.719, 361.992, -5634.369, -2204.461, + -8247.448, -4579.225, -11200, -7890, -13682, 0, 12695, 9246.546, 4709.778, 3229.104, + 2231.774, 970.848, -354.752, -1374.958, -2914.666, -4060.816, -5407.784, -6532.623, -7845, -9790, + -10863, 0, 12145, 14135.000, 3091.660, 5552.613, 515.305, 3575.473, -2122.715, 1278.742, + -4711.358, -1252.669, -7257.479, -3787.676, -9798, -6548, -12855, 0, 13544, 13410, + 8048.300, 4009.553, 2954.511, 1757.000, 427.360, -517.343, -2059.206, -3076.168, -4480.634, -5605.208, + -6924.726, -8177, -9995, -11215, 0, 14772, 7588.311, 8515.455, 1523.107, 4065.201, + -1233.149, 2058.901, -3731.405, -385.760, -6304.898, -2881.559, -8907.681, -5363, -11448, -8626, + 0, 14104, 9057.382, 8038.234, 6061.100, 2627.807, 1165.048, 268.898, -1207.205, -2027.152, + -3680.496, -4722.252, -6186.684, -7169.709, -8709, -9855, -11467, 0, 8611, 9916.006, + 5119.674, 6883.674, -90.238, 2548.224, -2849.660, 471.110, -5168.163, -2141.140, -8018.786, -4369.611, + -10567, -7154, -13032, 0, 10242, 9274.091, 7052.029, 6027.146, 4162.428, 1175.629, + -580.548, -1222.100, -2716.969, -3617.269, -5511.719, -6046.323, -7908, -8905, -10246, 0, + 9678, 11157, 6283.694, 7992.339, 2914.817, 5374.808, -1739.960, 1046.841, -4437.000, -1113.427, + -7077.827, -3442.721, -9748.093, -6093, -11988, -8737, 0, 10417, 8253.957, 7185.548, + 5056.565, 4212.829, 2314.616, -278.382, -2129.070, -2806.486, -4514.039, -5120.390, -6982.177, -7767, + -9501, -10489, 0, 12418, 7239.169, 9390.561, 4063.879, 6219.896, 1048.019, 3760.933, + -3388.000, -437.406, -6045.200, -2752.638, -8470.000, -5203.663, -11300.000, -7652, -13571, 0, + 9417, 8293, 6279.847, 5255.636, 3201.827, 2501.393, 580.420, -1823.014, -3670.488, -4589.054, + -6008.246, -6701.396, -8683.387, -9158, -11018, 0, 8400, 10459.654, 5288.192, 7324.904, + 2181.086, 4508.911, -744.480, 2161.635, -4807.827, -2155.453, -7673.000, -4354.091, -10400.000, -6440, + -12869, -9399, 0, 10349, 9576, 7470.793, 6263.397, 4234.368, 3434.784, 1461.816, + 934.108, -1041.664, -3443.772, -5275.403, -6010.000, -7812.117, -8250.242, -10121, -10954, 0, + 11592, 6398.215, 8496.573, 3082.572, 5582.117, 318.646, 2997.440, -2331.923, 549.516, -6346.349, + -3859.596, -9391.323, -5798.099, -11960.569, -8002, -14515, 0, 10554, 8562.479, 7460.368, + 5319.139, 4231.629, 2558.881, 1806.013, -164.515, -616.093, -2659.686, -5067.506, -6622.108, -8059.331, + -9122.493, -10044, -11494, 0, 7614.011, 9371.350, 4106.527, 6588.235, 1045.660, 4245.025, + -1471.545, 1542.000, -3878.786, -1031.888, -8322.123, -5208.492, -11316.698, -6916.206, -13431, 0, + 9412, 8245.824, 6414.361, 5335.492, 3430.129, 2702.620, 895.303, 224.074, -1721.609, -2187.824, + -4614.066, -6546.472, -8438.945, -9149.286, -10633.406, 0, 8295, 10297.255, 5115.000, 7689.645, + 2136.980, 4872.449, -542.735, 2470.992, -3036.687, -30.057, -5738.041, -2678.064, -9862.059, -6512.169, + -12713.962, -8566, 0, 9259, 7199, 6450.000, 4369.452, 3335.913, 1688.400, 1071.418, + -694.616, -1313.737, -3637.887, -3789.450, -6036.970, -7920.823, -9859, -10684, 0, 11439, + 6129, 8464, 3453.551, 5378.682, -82.616, 3454.000, -2258.642, 971.780, -4657.953, -1796.221, + -7363.595, -4114.557, -11340, -7852, -13998, 0, 10535, 8337, 7496, 5554.420, + 4162.843, 2443.076, 1190.210, 76.376, -464.021, -2565.008, -2870.832, -5129.533, -5356.298, -7488.567, + -9235.411, -11434, 0, 7443, 9520, 4701, 6390.686, 1104.784, 3508.436, -1874.597, + 1818.919, -3990.000, -598.346, -6518.909, -3105.100, -8723.362, -5449.892, -12899, 0, 9315, + 8784, 6545, 5761.813, 3317.322, 1911.459, 807.276, -484.399, -1568.987, -2170.358, -4130.292, + -4540.112, -6482.882, -6781, -8785, -11121, 0, 10591, 5844, 7490.000, 2806.930, + 3963.200, -717.345, 1968.156, -3549.651, 237.987, -5754.357, -2034.390, -8177.764, -4495.038, -10217, + -6982, 0, 9743, 7490, 6868.455, 4656.206, 3250.262, 1626.986, 252.094, -819.784, + -2094.500, -3115.813, -3830.175, -5583.141, -6123.149, -7952.600, -8187, -10372, 0, 6697, + 8906, 3690.000, 5199.086, 722.442, 2449.134, -2444.184, 438.238, -5050.000, -1267.951, -7381.401, + -3570.533, -9508.527, -5882.648, -11813, 0, 8532, 7921, 5835.500, 4380.533, 2780.744, + 1364.524, -60.044, -1339.145, -2593.062, -3441.154, -4653.243, -5310.661, -6968.803, -7553, -9260, + -9933, 0, 9725, 5035, 6161.033, 2004.946, 3433.727, -1218.952, 936.219, -4219.755, + -882.595, -6600.615, -2692.971, -8797.922, -5109.789, -10936, -7471, 0, 8719, 6747, + 5653.494, 3835.109, 2517.920, 970.858, -365.377, -1837.600, -2768.500, -3989.765, -4731.639, -6130.155, + -6855.846, -8408.491, -8957, -10750, 0, 5868, 7233, 3245.671, 4460.485, -105.394, + 1835.891, -3290.000, -317.196, -5762.200, -2137.127, -7894.964, -4338.665, -10057.118, -6497.240, -12445, + 0, 7648, 6436, 5119.564, 3713.508, 1955.813, 593.672, -857.957, -1996.241, -3301.587, + -4059.580, -5276.784, -6246.944, -7613.934, -8146, -9665, -10671, 0, 8160, 4165, + 5585.000, 1395.059, 2505.521, -2139.364, 292.405, -4856.728, -1649.980, -6994.749, -3662.691, -9388.757, + -5779.975, -11499, -7998, 0, 7471, 5919, 4675.000, 3280.905, 1785.092, -2.555, + -1210.729, -2439.000, -3428.327, -4507.842, -5527.435, -6729.266, -7626.357, -8900.909, -9622, 0, + 5232, 6440.000, 2303, 3890.000, -985.893, 960.819, -4037.862, -886.149, -6375.206, -2824.146, + -8535.424, -5054.923, -10704.904, -7050.331, -12936, 0, 6878, 5800.000, 4080, 3046, + 1286.972, -377.871, -1591.591, -2633.428, -3853.140, -4806.734, -5787.906, -6986.406, -8217.521, -8849, + -10152, 0, 7601, 3354, 4700.000, 487.112, 1854.974, -3037.667, -292.628, -5574.294, + -2161.998, -7761.208, -4209.617, -9994.569, -6456.795, -12083, -8562, 0, 6930, 5114, + 4004, 2350.000, 1009.677, -746.662, -1953.153, -3089.776, -4033.369, -5116.697, -6251.778, -7257, + -8341, -9424.435, -10273, 0, 4359, 5837, 1500.730, 2930.000, -1677.361, 268.091, + -4514.051, -1706.837, -6966.644, -3501.055, -9097.968, -5807.998, -11270.045, -7658.765, 0, 6176, + 5269, 3200.000, 2125.054, 352.999, -898.540, -2293.000, -3367.211, -4426.459, -5372.713, -6508.552, + -7686.234, -8645.115, -9565, -10724, 0, 6940, 2576, 3870.000, -312.798, 968.433, + -3457.695, -1053.179, -6116.190, -2847.193, -8372.718, -4991.302, -10567, -7055, -12553, 0, + 6157, 4330, 3200.000, 1492.076, 96.561, -1478.049, -2398.634, -3711.072, -4634.183, -5835.810, + -6947.054, -7886.292, -8946.996, -9902.288, -10855, 0, 3474, 5000, 890.823, 1881.291, + -2518.043, -335.910, -5072.248, -2232.791, -7570.872, -4282.685, -9864.260, -6281.889, -11728.779, -8259.262, + 0, 5412, 4304, 2600, 1297.789, -669.644, -1470.802, -3015.246, -3669.155, -5173.518, + -6115.692, -7169.868, -8325.155, -9126.654, -10107, 0, 6260, 1916, 3080.000, -1373.411, + 274.523, -4105.893, -1513.678, -6553.992, -3678.011, -9126.348, -5550.291, -11083, -7589, 0, + 5449, 3660, 2385.000, 470.968, -683.712, -2075.194, -2775.852, -4344.488, -5183.125, -6710.740, + -7694.263, -8284.700, -9442.587, 0, 2739, 4120.000, -105.476, 1194.223, -3213.068, -723.771, + -5578.718, -2964.945, -8238.496, -4925.715, -10537.126, -6623.324, -12354.558, 0, 4611, 3516, + 1401.024, 497.239, -1166.000, -2015.315, -3432.555, -4319.923, -5901.826, -6676.984, -7825.389, -8762.453, + -9457.933, 0, 5578, 645.923, 2097.896, -1837, -191, -4755.926, -2109.487, -7292.082, + -4254.621, -9671.141, -6009.858, -11523, -8362, 0, 4937, 2523, 1404.435, -105.578, + -1062.358, -2712.592, -3565.527, -4939.989, -5811.382, -7279.346, -8064.573, -8643.674, -10330.656, 0, + 2079, 3103.000, -845.601, 702.372, -3801.207, -1475.409, -6384.424, -3542.014, -8841.221, -5343.923, + -10988.079, -7332.499, 0, 3709, 2607.868, 1036.352, -188.175, -1732.476, -2971.015, -4078.330, + -5097.258, -6503.187, -7210.066, -7862.376, -9681.326, 0, 4172, 381.290, 1814.465, -2800.000, + -838.641, -5557.395, -2883.465, -7867.445, -4724.051, -10268.611, -6482.553, 0, 3570.002, 2010.000, + 1071.100, -556.000, -2147.169, -3460.732, -4430.964, -5583.218, -6384.599, -7217.268, -9016.171, 0, + 5089, 1340.000, 2866.000, -1482.839, 31.925, -4645.792, -2272.019, -7020.122, -3970.032, -9475.458, + -5821.698, -12238.950, 0, 4432, 3076.646, 1993.500, 432.668, -1012.771, -2474.289, -3647.414, + -4821.329, -5691.260, -6417.679, -8216.665, -9305, 0, 2185.595, 3901.000, -580.156, 1071.731, + -3827.610, -1310.295, -6149.622, -3175.993, -8652.247, -5204.713, -11555.509, -7218.669, 0, 4084, + 3006.079, 1312.261, 2.467, -1671.638, -2864.323, -3657.212, -4910.159, -5674.587, -7456.187, -8603.549, + -9216.080, 0, 2733, 5057.847, 349.000, 2120.394, -2787.888, -522.376, -5552.173, -2065.584, + -7874.849, -4521.405, -10630.329, -6640.273, 0, 4667, 3788, 2363.182, 1007.744, -531.759, + -1971.278, -2903.471, -3955.720, -5024.054, -6724.016, -7813.358, -8642.816, 0, 5868, 1254.097, + 3074.450, -1953.820, 569.616, -4442.000, -1513.068, -6991, -3963, -9817.539, -6035.157, 0, + 4684, 3175.881, 2044.806, 313.977, -1009.384, -1890.315, -3218.230, -4310.059, -6047.073, -6996.039, + -8170.977, -8932.513, 0, 6493, 1939, 4295.120, -1046.300, 1454.529, -3516.341, -764.764, + -6138.823, -3306.812, -9029.950, -5464.952, -11006.330, 0, 3949, 3160.680, 1142.275, -56.628, + -1075.761, -2343.081, -3585.637, -5282.722, -6321.658, -7513.305, -8291.917, -9110.533, 0, 2711, + 5200, 96.600, 2228.772, -2549.409, -29.210, -5246.454, -2730.058, -8171, -5032, -10293.044, + -6434.994, 0, 3933, 2182.741, 1101.968, -226.824, -1569.861, -2844.529, -4441.973, -5687.571, + -6964.549, -7585.169, -8526.083, 0, 5737, 1159.106, 3209.016, -1506.987, 686.836, -4330.174, + -2135.953, -7351.608, -4526.495, -9569.906, -5883.669, 0, 4807, 2957, 2156.155, 719.021, + -599.939, -2201.161, -3591.166, -5061.676, -6328.964, -7013.838, -7820.295, 0, 6697, 1984, + 4085, -323.694, 1372.852, -3460.000, -1444.758, -6680.603, -3896.563, -8752, -5491, 0, + 3917, 2990.167, 1704.580, 451.438, -1486.996, -2827.718, -4434.219, -5583.473, -6390.551, -7323.594, + -8261.176, 0, 2832, 4990, 639.332, 2263.406, -2456.040, -797.019, -5879.857, -3416.357, + -7966.347, -4973.633, -10149.160, 0, 4657, 3844, 2660.000, 1261.844, -483.793, -1919.535, + -3844.740, -4889.775, -5735.526, -6716.876, -7674.191, -8239, 0, 3689, 5916, 1660.854, + 2992.517, -1359.088, -46.188, -5199.446, -2816.648, -7333.321, -4316.520, -9366, -5999, 0, + 4937, 3517, 2125.305, 492.056, -974.840, -3261.769, -4213.477, -5148.234, -6003.247, -7035.563, + -7790.592, 0, 8234, 2728, 4040, -344.578, 763.750, -4463.795, -2304.774, -6465.369, + -3892.456, -8590.365, -5439.745, 0, 5803, 3518, 1532.881, -50.632, -2705.559, -3554.951, + -4538.956, -5256.401, -6404.038, -7148.645, 0, 4583, 6731, 1307.643, 1532.219, -3757.306, + -1839.397, -5759.374, -3313.590, -7872.906, -4808.299, -9896, 0, 5682, 4545.959, 1418.121, + -2397.410, -2908.813, -3918.395, -4592.192, -5790.376, -6383.231, -7607.205, 0, 7164, 3483.786, + 4998.882, -2878.363, -1400.559, -4999.524, -2814.402, -6989.414, -4380.807, -9044.140, -5914.866, 0, + 6176, 4993, 3976.448, 644.028, -1892.580, -3483.209, -3953.536, -5160.869, -5622.054, -6990.216, + -7692.475, 0, 7694, 3881, 5481.933, 63.486, 1161.228, -3981.039, -2367.121, -6272.031, + -3792.820, -8329.310, -5270.012, 0, 5454, 4413.302, 1366.859, 573.967, -785.297, -2891.820, + -4615.192, -4971.841, -6370.194, -6704.492, 0, 4308, 5996, 569.773, 2252.026, -1741.252, + 31.455, -5143.461, -3317.109, -7476.596, -4819.945, -9515.582, 0, 5882, 4985.454, 2028.633, + 1422.804, -73.918, -881.278, -2145.205, -3910.614, -5798.329, -5961.751, -7545.116, 0, 4713, + 6645, 1019.046, 3269.771, -1090.204, 939.980, -3361.181, -1051.093, -6351.635, -4267.798, -8773.112, + 0, 6297, 5495, 2768, 2188.710, 714.732, -86.667, -1486.616, -2215.635, -3496.913, + -4890.588, -6947.227, 0, 5142, 7238, 1606, 4090.007, -473.543, 2004.292, -2718.105, + -320.022, -4853.139, -2154.103, -7501.234, 0, 6073, 3510, 2844.634, 1489.400, 737.003, + -656.018, -1572.776, -2816.043, -3514.367, -4851.837, -5901, 0, 7638, 2237, 4857.232, + 259.722, 2881.239, -1841.626, 408.015, -4192.664, -1522.704, -6317.624, -3227.527, 0, 3996, + 3601, 2284.165, 1566.295, 212.319, -775.987, -2175.268, -2903.235, -4067.413, -4746.056, -5990, + 0, 2850, 5555, 887.714, 3762.183, -869.617, 1212.647, -3473.524, -925.248, -5549, + -2715, -7377, 0, 4324, 2991.027, 2310.034, 1194.094, 314.364, -1559.227, -2414.892, + -3438.023, -4107, -5362, 0, 6185, 1533.239, 4578.995, 24.269, 2028.185, -2300.171, + -581.568, -4952, -2067, -6797, 0, 5058, 3651, 3038.267, 2005.761, 1149.170, + -591.889, -1559.420, -2934.915, -3517.855, -4761, 0, 6856, 2199, 5265.917, 650.001, + 2967.769, -1407.669, 241.053, -3868.710, -1851.390, -6162, 0, 4136, 3861, 2713.342, + 1826.497, 355.709, -671.957, -2030.327, -3036.988, -4209.926, 0, 2934, 5867, 1206.641, + 3870.981, -640.917, 1113.135, -2836.119, -1295.725, -5448, 0, 4797, 4597, 3200.052, + 2506.324, 1328.372, 44.764, -1025.691, -2190.335, -3540.009, 0, 6441, 1874.392, 4426.876, + 45.811, 2124.063, -2152.124, -297.909, -4373.713, -2483.014, 0, 5461, 3688.043, 3125.849, + 1850.300, 1111.431, -311.606, -1312.516, -2568.930, -3613.708, 0, 2537, 4994.268, 677.924, + 2974.139, -1310.534, 559.782, -3621.490, -1697.515, -5998, 0, 4389, 3847.920, 2453.636, + 1945.305, 391.587, -381.556, -1817.814, -2660.484, -4153, 0, 5489, 1342.535, 3705.706, + -499.260, 1337.103, -2750, -1002, -4905, -3136, 0, 4711, 3014.315, 2574.390, + 1243.596, 569.792, -1029.733, -2102.128, -3211, -4029, 0, 2052.081, 4226.740, 274.088, + 2193.533, -1809.846, -393.213, -4112, -2263, -6620, 0, 3847, 3339.406, 1728.853, + 1368.242, -124.220, -1138.955, -2442.414, -3384, -4693, 0, 4965.795, 921.248, 2887.435, + -932.923, 476.585, -3139, -1813, -5687, 0, 4323, 2427.473, 2135.563, 518.590, + -220.001, -1478, -2676, -3941, -4749, 0, 1732, 3584.926, -147.351, 1291.516, + -2258.343, -1021.735, -4771, -3061, 0, 3270, 2763, 1261.461, 722.513, -802.117, + -1756.255, -3103, -3995, -5310, 0, 4086, 398.614, 2190.573, -1384.790, -213.589, + -3940, -2325, -6208, 0, 3493, 1935, 1305.000, 20.783, -767.384, -2330, + -3293, -4536, -5263, 0, 1202, 2700.000, -751.301, 664.458, -2930, -1651, + -5415, -3598, 0, 2524, 2121, 579.663, -7.473, -1507.591, -2300, -3757, + -4616, 0, 3395, -74.326, 1427.300, -2261.850, -763.659, -4547, -2939, 0, + 2770, 1277.287, 897.383, -810.742, -1571.296, -2981, -3820, -5085, 0, 401, + 2377, -1350.000, -123.335, -3810, -2286, -5926, 0, 1953, 1620, 43.621, + -613.073, -2474.564, -3095, -4264, 0, 3170, -687, 841, -3061, -1598, + -5250, -3472, 0, 2352, 900.839, 124.609, -1451, -2344, -3713, -4549, + 0, 38.764, 1779.577, -2055, -846, -4558, -2932, 0, 1420.000, 1093.000, + -377.219, -1440.373, -3012.904, -3884, -4878, 0, 521, 2500, -1260.000, 477.674, + -3693, -2362, -5866, 0, 1626, 287.630, -334.272, -1826, -3185, -4217, + -4980, 0, 3051, -650.123, 1087.800, -2550, -1270, -5148, -3325, 0, + 720, 289.620, -1043.376, -1962.896, -3140.066, -4383, -5402, 0, -147, 1700, + -1969, -367, -3922.670, -2476.086, -6276, 0, 813, -406.420, -1253.272, -2357, + -3261, -4341, 0, 2275, -1261, 209, -3304, -1559, -5456, -3445, + 0, 80, -486, -1742, -2509, -3629, -4568, 0, -787, 940, + -2665, -872, -4524, -2875, -6776, 0, 123, -1106, -1760, -2928, + -3756, -5128, 0, 1525, -2001, -291, -3863, -2110, -6176, 0, + -600, -1058, -2324, -3078, -4306, -5222, 0, -1367, 300, -3285, + -1422, -5274, -3506, 0, -457, -1796, -2310, -3559, -4545, -5778, + 0, 1545, -2661, -881, -4489, -3029, -6826, 0, -630, -1763, + -2929, -3886, -5138, -6128, 0, -1587, 260, -4005, -2024, -6319, + -4498, 0, -667, -1667, -3108, -4721, -5524, 0, 865, -2735, + -863, -5624, -3965, 0, -1232, -1783, -3329, -4846, 0, -2211, + -215, -4575, -2434, -6756, 0, -615, -1340, -2534, -3876, -4253, + 0, 227, -3671, -2017, -5442, 0, -930, -2005, -2993, -3639, + 0, -2924, -1333, -4945, -2866, 0, -1275, -2465, -2939, -4259, + 0, -683, -4148, -2480, -5983, 0, -1884, -2445, -3559, -4106, + 0, -3565, -1871, -5386, 0, -1722, -3154, -3478, 0, -1283, + -4821, 0, -2539, -3075, 0, -4258, 0, -2431, -3647, 0, + -1888, 0, -3161, -3653, 0, -4814, 0, -2988, -4224, 0, + -2480, 0, -3731, -4153, 0, -5329, 0, -3492, -4962, 0, + -3222, 0, 0 +}; + +const std::vector NucleiPropertiesTableAME12::IndexCharge = { + 0, 1, 1, 1, 2, 3, 1, 2, 3, 1, + 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, + 3, 4, 5, 2, 3, 4, 5, 6, 2, 3, + 4, 5, 6, 2, 3, 4, 5, 6, 7, 3, + 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, + 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, + 8, 9, 4, 5, 6, 7, 8, 9, 4, 5, + 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, + 10, 5, 6, 7, 8, 9, 10, 11, 5, 6, + 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, + 9, 10, 11, 12, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 93, 94, 95, 96, 97, 98, 99, 100, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 94, + 95, 96, 97, 98, 99, 100, 101, 94, 95, 96, + 97, 98, 99, 100, 101, 95, 96, 97, 98, 99, + 100, 101, 102, 95, 96, 97, 98, 99, 100, 101, + 102, 96, 97, 98, 99, 100, 101, 102, 96, 97, + 98, 99, 100, 101, 102, 103, 96, 97, 98, 99, + 100, 101, 102, 103, 97, 98, 99, 100, 101, 102, + 103, 104, 97, 98, 99, 100, 101, 102, 103, 104, + 98, 99, 100, 101, 102, 103, 104, 105, 98, 99, + 100, 101, 102, 103, 104, 105, 99, 100, 101, 102, + 103, 104, 105, 99, 100, 101, 102, 103, 104, 105, + 106, 100, 101, 102, 103, 104, 105, 106, 100, 101, + 102, 103, 104, 105, 106, 107, 101, 102, 103, 104, + 105, 106, 107, 101, 102, 103, 104, 105, 106, 107, + 102, 103, 104, 105, 106, 107, 108, 102, 103, 104, + 105, 106, 107, 108, 103, 104, 105, 106, 107, 108, + 109, 103, 104, 105, 106, 107, 108, 109, 104, 105, + 106, 107, 108, 109, 110, 104, 105, 106, 107, 108, + 109, 110, 105, 106, 107, 108, 109, 110, 105, 106, + 107, 108, 109, 110, 106, 107, 108, 109, 110, 106, + 107, 108, 109, 110, 111, 106, 107, 108, 109, 110, + 111, 107, 108, 109, 110, 111, 107, 108, 109, 110, + 111, 108, 109, 110, 111, 112, 108, 109, 110, 111, + 112, 109, 110, 111, 112, 113, 109, 110, 111, 112, + 113, 110, 111, 112, 113, 110, 111, 112, 113, 111, + 112, 113, 111, 112, 113, 112, 113, 112, 113, 114, + 113, 114, 113, 114, 115, 114, 115, 114, 115, 116, + 115, 116, 115, 116, 117, 116, 117, 116, 117, 118, + 117, 118, 118 +}; + +const std::vector NucleiPropertiesTableAME12::IndexMass = { + 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, + 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, + 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, + 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, + 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, + 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 190, 190, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 246, + 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, + 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, + 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, + 249, 250, 250, 250, 250, 250, 250, 250, 251, 251, + 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, + 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, + 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, + 255, 255, 255, 255, 255, 255, 255, 255, 256, 256, + 256, 256, 256, 256, 256, 256, 257, 257, 257, 257, + 257, 257, 257, 258, 258, 258, 258, 258, 258, 258, + 258, 259, 259, 259, 259, 259, 259, 259, 260, 260, + 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, + 261, 261, 261, 262, 262, 262, 262, 262, 262, 262, + 263, 263, 263, 263, 263, 263, 263, 264, 264, 264, + 264, 264, 264, 264, 265, 265, 265, 265, 265, 265, + 265, 266, 266, 266, 266, 266, 266, 266, 267, 267, + 267, 267, 267, 267, 267, 268, 268, 268, 268, 268, + 268, 268, 269, 269, 269, 269, 269, 269, 270, 270, + 270, 270, 270, 270, 271, 271, 271, 271, 271, 272, + 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, + 273, 274, 274, 274, 274, 274, 275, 275, 275, 275, + 275, 276, 276, 276, 276, 276, 277, 277, 277, 277, + 277, 278, 278, 278, 278, 278, 279, 279, 279, 279, + 279, 280, 280, 280, 280, 281, 281, 281, 281, 282, + 282, 282, 283, 283, 283, 284, 284, 285, 285, 285, + 286, 286, 287, 287, 287, 288, 288, 289, 289, 289, + 290, 290, 291, 291, 291, 292, 292, 293, 293, 293, + 294, 294, 295 +}; + +const std::vector NucleiPropertiesTableAME12::ShortTable = { + 0, 2, 3, 6, 9, 13, 18, 23, 28, 33, + 39, 44, 50, 56, 62, 68, 75, 81, 88, 96, + 104, 113, 122, 131, 140, 149, 158, 167, 177, 186, + 196, 206, 216, 226, 237, 247, 258, 269, 280, 291, + 303, 314, 326, 338, 350, 363, 375, 388, 401, 414, + 426, 438, 450, 462, 474, 486, 499, 511, 524, 536, + 549, 562, 574, 586, 598, 610, 622, 634, 646, 658, + 670, 683, 695, 708, 721, 733, 746, 758, 771, 784, + 796, 809, 822, 835, 848, 862, 875, 889, 902, 916, + 930, 944, 958, 972, 986, 1001, 1015, 1030, 1045, 1060, + 1075, 1090, 1104, 1119, 1133, 1148, 1163, 1179, 1194, 1210, + 1225, 1240, 1256, 1271, 1287, 1303, 1319, 1335, 1350, 1366, + 1382, 1398, 1414, 1430, 1447, 1463, 1480, 1496, 1513, 1529, + 1546, 1562, 1578, 1595, 1611, 1628, 1644, 1660, 1677, 1693, + 1710, 1726, 1743, 1760, 1777, 1794, 1810, 1826, 1843, 1859, + 1876, 1893, 1909, 1926, 1942, 1959, 1975, 1992, 2008, 2025, + 2041, 2058, 2074, 2090, 2106, 2122, 2138, 2154, 2169, 2185, + 2200, 2216, 2231, 2246, 2260, 2274, 2288, 2302, 2316, 2330, + 2343, 2356, 2368, 2380, 2393, 2406, 2419, 2432, 2445, 2458, + 2470, 2483, 2496, 2509, 2522, 2534, 2546, 2558, 2570, 2582, + 2594, 2607, 2620, 2632, 2644, 2655, 2667, 2678, 2690, 2702, + 2714, 2725, 2737, 2749, 2761, 2773, 2785, 2797, 2809, 2821, + 2833, 2844, 2855, 2866, 2877, 2887, 2897, 2907, 2917, 2927, + 2937, 2947, 2957, 2967, 2977, 2987, 2996, 3006, 3015, 3025, + 3034, 3044, 3053, 3062, 3070, 3079, 3087, 3095, 3103, 3111, + 3118, 3126, 3134, 3142, 3150, 3158, 3166, 3173, 3181, 3188, + 3196, 3203, 3210, 3217, 3224, 3231, 3238, 3245, 3252, 3258, + 3264, 3269, 3275, 3281, 3286, 3291, 3296, 3301, 3306, 3311, + 3315, 3319, 3322, 3325, 3327, 3330, 3332, 3335, 3337, 3340, + 3342, 3345, 3347, 3350, 3352 +}; + diff --git a/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.h b/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.h new file mode 100644 index 0000000..1d4bbfd --- /dev/null +++ b/FermiBreakUp/lib/TableValues/NucleiPropertiesTableAME12.h @@ -0,0 +1,62 @@ +// +// Created by Artem Novikov on 26.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLEAME12_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLEAME12_H_ + +#include + +#include "Utilities/DataTypes.h" + +class NucleiPropertiesTableAME12 { + public: + NucleiPropertiesTableAME12(); + + FermiFloat GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiFloat GetMassExcess(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiFloat GetBindingEnergy(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiFloat GetBetaDecayEnergy(MassNumber mass_number, ChargeNumber charge_number) const; + + bool ContainsParticle(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiUInt GetMaxMass() const; + + FermiUInt GetMaxCharge() const; + + ~NucleiPropertiesTableAME12() = default; + + private: + size_t GetIndex(MassNumber mass_number, ChargeNumber charge_number) const; + + FermiFloat GetAtomicMass(MassNumber mass_number, ChargeNumber charge_number) const; + + bool VerifyNuclei(MassNumber mass_number, ChargeNumber charge_number) const; + + static const MassNumber MaxMassNumber; + + static const ChargeNumber MaxChargeNumber; + + static const size_t ParticleCount; + + static const std::vector MassExcess; + + static const std::vector BetaEnergy; + + static const std::vector IndexCharge; + + static const std::vector IndexMass; + + static const size_t ShortTableCount; + + static const std::vector ShortTable; + + static std::vector* electron_mass_; +}; + +std::ostream& operator<<(std::ostream& out, const NucleiPropertiesTableAME12& table); + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_TABLEVALUES_NUCLEIPROPERTIESTABLEAME12_H_ diff --git a/FermiBreakUp/lib/Utilities/ConfigurationProperties.cpp b/FermiBreakUp/lib/Utilities/ConfigurationProperties.cpp new file mode 100644 index 0000000..7a53f84 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/ConfigurationProperties.cpp @@ -0,0 +1,149 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#include "ConfigurationProperties.h" +#include "CLHEP/Units/PhysicalConstants.h" + +/// Kappa = V/V_0 it is used in calculation of Coulomb energy, Kappa is dimensionless +const FermiFloat ConfigurationProperties::Kappa = 1.0; + +/// r0 is the nuclear radius +const FermiFloat ConfigurationProperties::r0 = 1.3 * CLHEP::fermi; + +FermiFloat ConfigurationProperties::DecayProbability( + const FragmentVector& split, uint32_t atomic_weight, FermiFloat total_energy) { + FermiFloat kinetic_energy = CalculateKineticEnergy(split, total_energy); /// in MeV + /// Check that there is enough energy to produce K fragments + if (kinetic_energy <= 0) { return 0; } + + /// Spin factor + FermiFloat S_n = CalculateSpinFactor(split); + + /// Calculate MassFactor + auto mass_factor = CalculateMassFactor(split); + + /// This is the constant (doesn't depend on nucleus) part + auto coefficient = CalculateConstFactor(atomic_weight, split.size()); + + /// Calculation of 1/gamma(3(k-1)/2) + auto gamma = CalculateGammaFactor(split.size()); + + /// Permutation Factor G_n + auto G_n = CalculateConfigurationFactor(split); + + auto Weight = coefficient * mass_factor * (S_n / G_n) / gamma; + Weight *= std::pow(kinetic_energy, 3.0 * static_cast(split.size() - 1) / 2.0 - 1.); + + return Weight; +} + +FermiFloat ConfigurationProperties::CoulombBarrier(const FragmentVector& split) { + /// Calculates Coulomb Barrier (MeV) for given channel with K fragments. + static const FermiFloat coefficient = (3. / 5.) * (CLHEP::elm_coupling / r0) * std::pow(1. / (1. + Kappa), 1. / 3.); + + FermiFloat mass_sum = 0; + FermiFloat charge_sum = 0; + FermiFloat CoulombEnergy = 0; + for (auto& fragment_ptr : split) { + auto mass = static_cast(fragment_ptr->GetMassNumber()); + auto charge = static_cast(fragment_ptr->GetChargeNumber()); + CoulombEnergy += std::pow(charge, 2) / std::pow(mass, 1. / 3.); + mass_sum += mass; + charge_sum += charge; + } + CoulombEnergy -= std::pow(charge_sum, 2) / std::pow(mass_sum, 1. / 3.); + return -coefficient * CoulombEnergy; +} + +FermiFloat ConfigurationProperties::CalculateSpinFactor(const FragmentVector& split) { + FermiFloat S_n = 1; + + for (auto fragment_ptr : split) { + auto& fragment = *fragment_ptr; + S_n *= fragment.GetPolarization(); + } + return S_n; +} + +FermiFloat ConfigurationProperties::CalculateKineticEnergy(const FragmentVector& split, FermiFloat total_energy) { + for (auto fragment_ptr : split) { + auto& fragment = *fragment_ptr; + total_energy -= fragment.GetFragmentMass() + fragment.GetExcitationEnergy(); + } + if (total_energy > 0) { + total_energy -= CoulombBarrier(split); + } + if (total_energy <= 0) { + total_energy = 0; + } + return total_energy; +} + +FermiFloat ConfigurationProperties::CalculateMassFactor(const FragmentVector& split) { + FermiFloat mass_sum = 0; + FermiFloat mass_product = 1; + for (auto fragment_ptr : split) { + auto& fragment = *fragment_ptr; + auto fragment_mass = fragment.GetFragmentMass(); + mass_product *= fragment_mass; + mass_sum += fragment_mass; + } + auto mass_factor = mass_product / mass_sum; + mass_factor *= std::sqrt(mass_factor); + return mass_factor; +} + +FermiFloat ConfigurationProperties::CalculateConfigurationFactor(const FragmentVector& split) { + /// get all mass numbers and count repetitions + std::vector masses; + masses.reserve(split.size()); + for(auto fragment_ptr: split){ + masses.push_back(fragment_ptr->GetMassNumber()); + } + std::sort(masses.begin(), masses.end()); + + std::vector mass_repeats; + mass_repeats.reserve(split.size()); + mass_repeats.push_back(0); + MassNumber last_mass(masses[0]); + for (auto fragment_mass : masses) { + if (last_mass == fragment_mass) { + ++mass_repeats.back(); + } else { + last_mass = fragment_mass; + mass_repeats.push_back(1); + } + } + + FermiFloat G_n = 1; + for (auto count : mass_repeats) { + auto factorial = [](size_t n) -> size_t { + size_t factorial = 1; + for (size_t i = 2; i < n; ++i) { factorial *= i; } + return factorial; + }; + G_n *= static_cast(factorial(count)); + } + + return G_n; +} + +FermiFloat ConfigurationProperties::CalculateConstFactor(uint32_t atomic_weight, size_t fragments_count) { + static const FermiFloat constant_part = std::pow(r0 / CLHEP::hbarc, 3.0) * Kappa * std::sqrt(2.0 / CLHEP::pi) / 3.0; + FermiFloat coefficient = std::pow(constant_part * atomic_weight, fragments_count - 1); + return coefficient; +} + +FermiFloat ConfigurationProperties::CalculateGammaFactor(size_t fragments_count) { + FermiFloat gamma = 1.0; + FermiFloat arg = 3.0 * static_cast(fragments_count - 1) / 2.0 - 1.0; + while (arg > 1.1) { + gamma *= arg; + arg--; + } + + if (fragments_count % 2 == 0) { gamma *= std::sqrt(CLHEP::pi); } + + return gamma; +} diff --git a/FermiBreakUp/lib/Utilities/ConfigurationProperties.h b/FermiBreakUp/lib/Utilities/ConfigurationProperties.h new file mode 100644 index 0000000..d347da6 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/ConfigurationProperties.h @@ -0,0 +1,38 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_CONFIGURATIONPROPERTIES_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_CONFIGURATIONPROPERTIES_H_ + +#include + +#include "FermiSplit.h" + +class ConfigurationProperties { + public: + static FermiFloat DecayProbability(const FragmentVector& split, uint32_t atomic_weight, FermiFloat total_energy); + + static FermiFloat CoulombBarrier(const FragmentVector& split); + + static FermiFloat CalculateSpinFactor(const FragmentVector& split); + + static FermiFloat CalculateKineticEnergy(const FragmentVector& split, FermiFloat total_energy); + + static FermiFloat CalculateMassFactor(const FragmentVector& split); + + static FermiFloat CalculateConfigurationFactor(const FragmentVector& split); + + private: + static FermiFloat CalculateConstFactor(uint32_t atomic_weight, size_t fragments_count); + + static FermiFloat CalculateGammaFactor(size_t fragments_count); + + /// Kappa = V/V_0 it is used in calculation of Coulomb energy + static const FermiFloat Kappa; + + /// Nuclear radius r0 (is a model parameter) + static const FermiFloat r0; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_CONFIGURATIONPROPERTIES_H_ diff --git a/FermiBreakUp/lib/Utilities/DataTypes.cpp b/FermiBreakUp/lib/Utilities/DataTypes.cpp new file mode 100644 index 0000000..89f1ee5 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/DataTypes.cpp @@ -0,0 +1,49 @@ +// +// Created by Artem Novikov on 07.03.2023. +// + +#include "DataTypes.h" + +ChargeNumber operator ""_c(unsigned long long charge) { + return ChargeNumber(charge); +} + +namespace std { +std::string to_string(ChargeNumber charge) { + return std::to_string(FermiUInt(charge)); +} +} + +std::ostream& operator<<(std::ostream& out, ChargeNumber charge) { + out << FermiUInt(charge); + return out; +} + +std::istream& operator>>(std::istream& in, ChargeNumber& charge) { + FermiUInt val; + in >> val; + charge = ChargeNumber(val); + return in; +} + +MassNumber operator ""_m(unsigned long long mass) { + return MassNumber(mass); +} + +namespace std { +std::string to_string(MassNumber mass) { + return std::to_string(FermiUInt(mass)); +} +} + +std::ostream& operator<<(std::ostream& out, const MassNumber& mass) { + out << FermiUInt(mass); + return out; +} + +std::istream& operator>>(std::istream& in, MassNumber& mass) { + FermiUInt val; + in >> val; + mass = MassNumber(val); + return in; +} \ No newline at end of file diff --git a/FermiBreakUp/lib/Utilities/DataTypes.h b/FermiBreakUp/lib/Utilities/DataTypes.h new file mode 100644 index 0000000..3617896 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/DataTypes.h @@ -0,0 +1,136 @@ +// +// Created by Artem Novikov on 07.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_DATATYPES_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_DATATYPES_H_ + +#include + +using FermiInt = int; + +using FermiUInt = uint32_t; + +using FermiFloat = double; + +using LorentzVector = CLHEP::HepLorentzVector; + +using Vector3 = CLHEP::Hep3Vector; + +using ParticleMomentum = Vector3; + +class MassNumber { + public: + using ValueType = FermiUInt; + + MassNumber() = default; + + explicit MassNumber(ValueType mass) : mass_(mass) {} + + MassNumber(const MassNumber& other) = default; + + MassNumber(MassNumber&& other) = default; + + MassNumber& operator=(const MassNumber& other) = default; + + MassNumber& operator=(MassNumber&& other) = default; + + operator FermiUInt() const { return mass_; } + + operator FermiInt() const { return mass_; } + + operator FermiFloat() const { return mass_; } + + bool operator<(const MassNumber& other) const { return mass_ < other.mass_; } + + bool operator>(const MassNumber& other) const { return mass_ > other.mass_; } + + bool operator<=(const MassNumber& other) const { return mass_ <= other.mass_; } + + bool operator>=(const MassNumber& other) const { return mass_ >= other.mass_; } + + bool operator==(const MassNumber& other) const { return mass_ == other.mass_; } + + bool operator!=(const MassNumber& other) const { return mass_ != other.mass_; } + + private: + uint32_t mass_; +}; + +MassNumber operator ""_m(unsigned long long mass); + +namespace std { +std::string to_string(MassNumber mass); +} + +std::ostream& operator<<(std::ostream& out, const MassNumber& mass); + +std::istream& operator>>(std::istream& in, MassNumber& mass); + +class ChargeNumber { + public: + using ValueType = FermiUInt; + + ChargeNumber() = default; + + explicit ChargeNumber(ValueType charge) : charge_(charge) {} + + ChargeNumber(const ChargeNumber& other) = default; + + ChargeNumber(ChargeNumber&& other) = default; + + ChargeNumber& operator=(const ChargeNumber& other) = default; + + ChargeNumber& operator=(ChargeNumber&& other) = default; + + operator FermiUInt() const { return charge_; } + + operator FermiInt() const { return charge_; } + + operator FermiFloat() const { return charge_; } + + bool operator<(const ChargeNumber& other) const { return charge_ < other.charge_; } + + bool operator>(const ChargeNumber& other) const { return charge_ > other.charge_; } + + bool operator<=(const ChargeNumber& other) const { return charge_ <= other.charge_; } + + bool operator>=(const ChargeNumber& other) const { return charge_ >= other.charge_; } + + bool operator==(const ChargeNumber& other) const { return charge_ == other.charge_; } + + bool operator!=(const ChargeNumber& other) const { return charge_ != other.charge_; } + + private: + uint32_t charge_; +}; + +ChargeNumber operator ""_c(unsigned long long charge); + +namespace std { +std::string to_string(ChargeNumber charge); +} + +std::ostream& operator<<(std::ostream& out, ChargeNumber charge); + +std::istream& operator>>(std::istream& in, ChargeNumber& charge); + +struct NucleiData { + MassNumber mass_number; + ChargeNumber charge_number; + + bool operator<(const NucleiData& other) const { + return mass_number < other.mass_number + || (mass_number == other.mass_number && charge_number < other.charge_number); + } + + bool operator==(const NucleiData& other) const { + return mass_number == other.mass_number && charge_number == other.charge_number; + } + + bool operator!=(const NucleiData& other) const { + return mass_number != other.mass_number || charge_number != other.charge_number; + } +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_DATATYPES_H_ diff --git a/FermiBreakUp/lib/Utilities/IntegerPartition.cpp b/FermiBreakUp/lib/Utilities/IntegerPartition.cpp new file mode 100644 index 0000000..8fa68bb --- /dev/null +++ b/FermiBreakUp/lib/Utilities/IntegerPartition.cpp @@ -0,0 +1,76 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#include "IntegerPartition.h" + +IntegerPartition::IntegerPartition(uint32_t number, uint32_t terms_count, uint32_t base) + : number_(number), terms_count_(terms_count), base_(base) {} + +IntegerPartition::Iterator IntegerPartition::begin() const { + return {number_, terms_count_, base_}; +} + +IntegerPartition::Iterator IntegerPartition::end() const { + return {0}; +} + +//////////////////////////////////////////////////////ITERATOR//////////////////////////////////////////// + +IntegerPartition::Iterator::pointer IntegerPartition::Iterator::operator->() const { + return &partition_; +} + +IntegerPartition::Iterator::reference IntegerPartition::Iterator::operator*() const { + return partition_; +} + +IntegerPartition::Iterator& IntegerPartition::Iterator::operator++() { + NextPartition(); + return *this; +} + +IntegerPartition::Iterator IntegerPartition::Iterator::operator++(int) { + auto copy = *this; + NextPartition(); + return copy; +} + +bool IntegerPartition::Iterator::operator==(IntegerPartition::Iterator& other) const { + return partition_ == other.partition_; +} + +bool IntegerPartition::Iterator::operator!=(IntegerPartition::Iterator& other) const { + return partition_ != other.partition_; +} + +IntegerPartition::Iterator::Iterator(uint32_t terms_count) { + partition_.resize(terms_count, 0); /// end partition +} + +IntegerPartition::Iterator::Iterator(uint32_t number, uint32_t terms_count, uint32_t base) : Iterator(terms_count) { + /// No possible partitions + if (number < base * terms_count || terms_count == 0 || number == 0) { return; } + + std::fill(partition_.begin(), partition_.end(), base); + partition_[0] = number - base * (terms_count - 1); +} + +void IntegerPartition::Iterator::NextPartition() { + uint32_t accumulated = 0; + for (auto partition_last = std::next(partition_.begin()); partition_last != partition_.end(); ++partition_last) { + if (partition_.front() >= *partition_last + 2) { + --partition_.front(); + ++(*partition_last); + + auto new_value = *partition_last; + std::fill(std::next(partition_.begin()), partition_last, new_value); + partition_.front() += accumulated - new_value * (std::distance(partition_.begin(), partition_last) - 1); + return; + } + accumulated += *partition_last; + } + + /// last partition + partition_.clear(); +} \ No newline at end of file diff --git a/FermiBreakUp/lib/Utilities/IntegerPartition.h b/FermiBreakUp/lib/Utilities/IntegerPartition.h new file mode 100644 index 0000000..43c7b7f --- /dev/null +++ b/FermiBreakUp/lib/Utilities/IntegerPartition.h @@ -0,0 +1,72 @@ +// +// Created by Artem Novikov on 17.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_INTEGERPARTITION_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_INTEGERPARTITION_H_ + +#include +#include +#include + +using Partition = std::vector; + +class IntegerPartition { + public: + class Iterator; + + Iterator begin() const; + + Iterator end() const; + + IntegerPartition(uint32_t number, uint32_t terms_count, uint32_t base = 1); + + private: + uint32_t number_; + uint32_t terms_count_; + uint32_t base_; +}; + +class IntegerPartition::Iterator { + public: + friend class IntegerPartition; + + using difference_type = size_t; + + using value_type = Partition; + + using reference = const Partition&; + + using pointer = const Partition*; + + using iterator_category = std::forward_iterator_tag; + + Iterator() = delete; + + Iterator(const Iterator&) = default; + + Iterator& operator=(const Iterator&) = default; + + pointer operator->() const; + + reference operator*() const; + + Iterator& operator++(); + + Iterator operator++(int); + + bool operator==(Iterator& other) const; + + bool operator!=(Iterator& other) const; + + private: + Iterator(uint32_t terms_count); + + Iterator(uint32_t number, uint32_t terms_count, uint32_t base); + + void NextPartition(); + + Partition partition_; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_INTEGERPARTITION_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.cpp b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.cpp new file mode 100644 index 0000000..a12f4b8 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.cpp @@ -0,0 +1,98 @@ +// +// Created by Artem Novikov on 21.05.2023. +// + +#include + +#include "CSVBuilder.h" + +namespace properties { + +CSVBuilder::CSVBuilder(const std::string& csv_filename, const std::string& mass_number_name, + const std::string& charge_number_name, const std::string& mass_name) + : csv_filename_(csv_filename), + mass_number_name_(mass_number_name), + charge_number_name_(charge_number_name), + mass_name_(mass_name) {} + +void CSVBuilder::BuildTable(FermiNucleiProperties::MassMap& data) const { + std::ifstream in(csv_filename_); + + if (!in.is_open()) { + throw std::runtime_error("invalid CSV file path"); + } + + int mass_number_idx = -1, charge_number_idx = -1, mass_idx = -1; + + std::string line; + in >> line; + line += ','; + int column_idx = 0; + uint start = 0; + auto comma = line.find(',', start); + while (comma != std::string::npos) { + if (line.substr(start, comma - start) == mass_number_name_) { + mass_number_idx = column_idx; + } + + if (line.substr(start, comma - start) == charge_number_name_) { + charge_number_idx = column_idx; + } + + if (line.substr(start, comma - start) == mass_name_) { + mass_idx = column_idx; + } + + ++column_idx; + start = comma + 1; + comma = line.find(',', start); + } + int columns_count = column_idx; + + if (mass_number_idx == -1) { + throw std::runtime_error("no mass number found"); + } + + if (charge_number_idx == -1) { + throw std::runtime_error("no charge number found"); + } + + if (mass_idx == -1) { + throw std::runtime_error("no nuclei mass found"); + } + + MassNumber m = 0_m; + ChargeNumber c = 0_c; + FermiFloat mass; + while (in >> line) { + line += ','; + column_idx = 0; + start = 0; + comma = line.find(',', start); + while (comma != std::string::npos) { + if (column_idx == mass_number_idx) { + m = MassNumber(std::stoi(line.substr(start, comma - start))); + } + + if (column_idx == charge_number_idx) { + c = ChargeNumber(std::stoi(line.substr(start, comma - start))); + } + + if (column_idx == mass_idx) { + mass = FermiFloat(std::stod(line.substr(start, comma - start))); + } + + ++column_idx; + start = comma + 1; + comma = line.find(',', start); + } + + if (columns_count != column_idx) { + throw std::runtime_error("invalid row format: " + line); + } + + data.emplace(NucleiData{m, c}, mass); + } +} + +} // namespace properties diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.h b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.h new file mode 100644 index 0000000..94ce43c --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/CSVBuilder.h @@ -0,0 +1,28 @@ +// +// Created by Artem Novikov on 21.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_CSVBUILDER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_CSVBUILDER_H_ + +#include "VFermiPropertiesBuilder.h" + +namespace properties { + +class CSVBuilder : public VFermiPropertiesBuilder { + public: + CSVBuilder(const std::string& csv_filename, const std::string& mass_number_name = "A", + const std::string& charge_number_name = "Z", const std::string& mass_name = "mass"); + + void BuildTable(FermiNucleiProperties::MassMap& data) const override; + + private: + std::string csv_filename_; + std::string mass_number_name_; + std::string charge_number_name_; + std::string mass_name_; +}; + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_CSVBUILDER_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.cpp b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.cpp new file mode 100644 index 0000000..659ef37 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.cpp @@ -0,0 +1,116 @@ +// +// Created by Artem Novikov on 20.05.2023. +// + +#include "DefaultBuilder.h" + +namespace properties { + +void DefaultBuilder::BuildTable(FermiNucleiProperties::MassMap& data) const { + data.emplace(NucleiData{1_m, 0_c}, 939.565); + data.emplace(NucleiData{1_m, 1_c}, 938.272); + data.emplace(NucleiData{2_m, 1_c}, 1875.61); + data.emplace(NucleiData{3_m, 1_c}, 2808.92); + data.emplace(NucleiData{3_m, 2_c}, 2808.39); + data.emplace(NucleiData{3_m, 3_c}, 2821.62); + data.emplace(NucleiData{4_m, 1_c}, 3750.09); + data.emplace(NucleiData{4_m, 2_c}, 3727.38); + data.emplace(NucleiData{4_m, 3_c}, 3749.77); + data.emplace(NucleiData{5_m, 1_c}, 4689.85); + data.emplace(NucleiData{5_m, 2_c}, 4667.68); + data.emplace(NucleiData{5_m, 3_c}, 4667.62); + data.emplace(NucleiData{5_m, 4_c}, 4692.57); + data.emplace(NucleiData{6_m, 1_c}, 5630.33); + data.emplace(NucleiData{6_m, 2_c}, 5605.53); + data.emplace(NucleiData{6_m, 3_c}, 5601.52); + data.emplace(NucleiData{6_m, 4_c}, 5605.3); + data.emplace(NucleiData{6_m, 5_c}, 5633.73); + data.emplace(NucleiData{7_m, 1_c}, 6569.08); + data.emplace(NucleiData{7_m, 2_c}, 6545.51); + data.emplace(NucleiData{7_m, 3_c}, 6533.83); + data.emplace(NucleiData{7_m, 4_c}, 6534.18); + data.emplace(NucleiData{7_m, 5_c}, 6545.58); + data.emplace(NucleiData{8_m, 2_c}, 7482.54); + data.emplace(NucleiData{8_m, 3_c}, 7471.37); + data.emplace(NucleiData{8_m, 4_c}, 7454.85); + data.emplace(NucleiData{8_m, 5_c}, 7472.32); + data.emplace(NucleiData{8_m, 6_c}, 7483.95); + data.emplace(NucleiData{9_m, 2_c}, 8423.36); + data.emplace(NucleiData{9_m, 3_c}, 8406.87); + data.emplace(NucleiData{9_m, 4_c}, 8392.75); + data.emplace(NucleiData{9_m, 5_c}, 8393.31); + data.emplace(NucleiData{9_m, 6_c}, 8409.29); + data.emplace(NucleiData{10_m, 2_c}, 9363.09); + data.emplace(NucleiData{10_m, 3_c}, 9346.46); + data.emplace(NucleiData{10_m, 4_c}, 9325.5); + data.emplace(NucleiData{10_m, 5_c}, 9324.44); + data.emplace(NucleiData{10_m, 6_c}, 9327.57); + data.emplace(NucleiData{10_m, 7_c}, 9350.16); + data.emplace(NucleiData{11_m, 3_c}, 10285.6); + data.emplace(NucleiData{11_m, 4_c}, 10264.6); + data.emplace(NucleiData{11_m, 5_c}, 10252.5); + data.emplace(NucleiData{11_m, 6_c}, 10254.0); + data.emplace(NucleiData{11_m, 7_c}, 10267.2); + data.emplace(NucleiData{12_m, 3_c}, 11225.3); + data.emplace(NucleiData{12_m, 4_c}, 11201.0); + data.emplace(NucleiData{12_m, 5_c}, 11188.7); + data.emplace(NucleiData{12_m, 6_c}, 11174.9); + data.emplace(NucleiData{12_m, 7_c}, 11191.7); + data.emplace(NucleiData{12_m, 8_c}, 11205.8); + data.emplace(NucleiData{13_m, 3_c}, 12166.2); + data.emplace(NucleiData{13_m, 4_c}, 12141.0); + data.emplace(NucleiData{13_m, 5_c}, 12123.4); + data.emplace(NucleiData{13_m, 6_c}, 12109.5); + data.emplace(NucleiData{13_m, 7_c}, 12111.2); + data.emplace(NucleiData{13_m, 8_c}, 12128.5); + data.emplace(NucleiData{14_m, 4_c}, 13078.8); + data.emplace(NucleiData{14_m, 5_c}, 13062.0); + data.emplace(NucleiData{14_m, 6_c}, 13040.9); + data.emplace(NucleiData{14_m, 7_c}, 13040.2); + data.emplace(NucleiData{14_m, 8_c}, 13044.8); + data.emplace(NucleiData{14_m, 9_c}, 13068.3); + data.emplace(NucleiData{15_m, 4_c}, 14020.1); + data.emplace(NucleiData{15_m, 5_c}, 13998.8); + data.emplace(NucleiData{15_m, 6_c}, 13979.2); + data.emplace(NucleiData{15_m, 7_c}, 13968.9); + data.emplace(NucleiData{15_m, 8_c}, 13971.2); + data.emplace(NucleiData{15_m, 9_c}, 13984.6); + data.emplace(NucleiData{16_m, 4_c}, 14959.3); + data.emplace(NucleiData{16_m, 5_c}, 14938.5); + data.emplace(NucleiData{16_m, 6_c}, 14914.5); + data.emplace(NucleiData{16_m, 7_c}, 14906.0); + data.emplace(NucleiData{16_m, 8_c}, 14895.1); + data.emplace(NucleiData{16_m, 9_c}, 14910.0); + data.emplace(NucleiData{16_m, 10_c}, 14922.8); + data.emplace(NucleiData{17_m, 5_c}, 15876.6); + data.emplace(NucleiData{17_m, 6_c}, 15853.4); + data.emplace(NucleiData{17_m, 7_c}, 15839.7); + data.emplace(NucleiData{17_m, 8_c}, 15830.5); + data.emplace(NucleiData{17_m, 9_c}, 15832.8); + data.emplace(NucleiData{17_m, 10_c}, 15846.8); + data.emplace(NucleiData{18_m, 5_c}, 16816.2); + data.emplace(NucleiData{18_m, 6_c}, 16788.7); + data.emplace(NucleiData{18_m, 7_c}, 16776.4); + data.emplace(NucleiData{18_m, 8_c}, 16762.0); + data.emplace(NucleiData{18_m, 9_c}, 16763.2); + data.emplace(NucleiData{18_m, 10_c}, 16767.1); + data.emplace(NucleiData{18_m, 11_c}, 16786.3); + data.emplace(NucleiData{19_m, 5_c}, 17754.6); + data.emplace(NucleiData{19_m, 6_c}, 17727.7); + data.emplace(NucleiData{19_m, 7_c}, 17710.7); + data.emplace(NucleiData{19_m, 8_c}, 17697.6); + data.emplace(NucleiData{19_m, 9_c}, 17692.3); + data.emplace(NucleiData{19_m, 10_c}, 17695.0); + data.emplace(NucleiData{19_m, 11_c}, 17705.7); + data.emplace(NucleiData{19_m, 12_c}, 17724.1); + data.emplace(NucleiData{20_m, 5_c}, 18694.5); + data.emplace(NucleiData{20_m, 6_c}, 18664.4); + data.emplace(NucleiData{20_m, 7_c}, 18648.1); + data.emplace(NucleiData{20_m, 8_c}, 18629.6); + data.emplace(NucleiData{20_m, 9_c}, 18625.3); + data.emplace(NucleiData{20_m, 10_c}, 18617.7); + data.emplace(NucleiData{20_m, 11_c}, 18631.1); + data.emplace(NucleiData{20_m, 12_c}, 18641.3); +} + +} // namespace properties diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.h b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.h new file mode 100644 index 0000000..427030b --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/DefaultBuilder.h @@ -0,0 +1,19 @@ +// +// Created by Artem Novikov on 20.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_DEFAULTBUILDER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_DEFAULTBUILDER_H_ + +#include "VFermiPropertiesBuilder.h" + +namespace properties { + +class DefaultBuilder : public VFermiPropertiesBuilder { + public: + void BuildTable(FermiNucleiProperties::MassMap& data) const override; +}; + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_DEFAULTBUILDER_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/VFermiPropertiesBuilder.h b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/VFermiPropertiesBuilder.h new file mode 100644 index 0000000..8c47249 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/Builder/VFermiPropertiesBuilder.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 11.03.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_VFERMIPROPERTIESBUILDER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_VFERMIPROPERTIESBUILDER_H_ + +#include "../FermiNucleiProperties.h" + +namespace properties { + +class VFermiPropertiesBuilder { + public: + virtual void BuildTable(FermiNucleiProperties::MassMap& data) const = 0; + + virtual ~VFermiPropertiesBuilder() = default; +}; + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_VFERMIPROPERTIESBUILDER_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.cpp b/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.cpp new file mode 100644 index 0000000..d964653 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.cpp @@ -0,0 +1,47 @@ +// +// Created by Artem Novikov on 09.03.2023. +// + +#include "FermiNucleiProperties.h" +#include "Builder/DefaultBuilder.h" + +namespace properties { + +std::unique_ptr FermiNucleiProperties::nuclei_mass_ = nullptr; + +FermiNucleiProperties::FermiNucleiProperties() { + if (nuclei_mass_ == nullptr) { + Build(DefaultBuilder()); + } +} + +FermiNucleiProperties::FermiNucleiProperties(const VFermiPropertiesBuilder& builder) { + Build(builder); +} + +FermiFloat FermiNucleiProperties::GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const { + auto it = nuclei_mass_->find(NucleiData{mass_number, charge_number}); + if (it != nuclei_mass_->end()) { + return it->second; + } + +// throw std::runtime_error("Unknown particle"); +// std::cerr << "Unknown particle A = " + std::to_string(mass_number) + ", Z = " + std::to_string(charge_number) << '\n'; + return NuclearMass(mass_number, charge_number); +} + +bool FermiNucleiProperties::IsStable(MassNumber mass_number, ChargeNumber charge_number) const { + if (IsInvalidNuclei(mass_number, charge_number)) { + std::cerr << "Unsupported values for A = " << mass_number << " and Z = " << charge_number << std::endl; + return false; + } + + return nuclei_mass_->find(NucleiData{mass_number, charge_number}) != nuclei_mass_->end(); +} + +void FermiNucleiProperties::Build(const VFermiPropertiesBuilder& builder) { + nuclei_mass_ = std::make_unique(); + builder.BuildTable(*nuclei_mass_); +} + +} // namespace properties diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.h b/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.h new file mode 100644 index 0000000..c03a2c0 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/FermiNucleiProperties.h @@ -0,0 +1,37 @@ +// +// Created by Artem Novikov on 09.03.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMINUCLEIPROPERTIES_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMINUCLEIPROPERTIES_H_ + +#include +#include + +#include "VNucleiProperties.h" + +namespace properties { + +class VFermiPropertiesBuilder; + +class FermiNucleiProperties : public VNucleiProperties { + public: + using MassMap = std::map; + + FermiNucleiProperties(); + + FermiNucleiProperties(const VFermiPropertiesBuilder& builder); + + [[nodiscard]] FermiFloat GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const override; + + [[nodiscard]] bool IsStable(MassNumber mass_number, ChargeNumber charge_number) const override; + + private: + static void Build(const VFermiPropertiesBuilder& builder); + + static std::unique_ptr nuclei_mass_; +}; + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_FERMINUCLEIPROPERTIES_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/NucleiProperties.h b/FermiBreakUp/lib/Utilities/NucleiProperties/NucleiProperties.h new file mode 100644 index 0000000..54be237 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/NucleiProperties.h @@ -0,0 +1,20 @@ +// +// Created by Artem Novikov on 18.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_H_ + +#include "Utilities/DataTypes.h" +#include "VNucleiProperties.h" +#include "FermiNucleiProperties.h" + +namespace properties { + +using NucleiProperties = FermiNucleiProperties; + +static_assert(std::is_base_of::value, "Incorrect Nuclei properties class"); + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_NUCLEIPROPERTIES_H_ diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.cpp b/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.cpp new file mode 100644 index 0000000..8137a7b --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.cpp @@ -0,0 +1,56 @@ +// +// Created by Artem Novikov on 09.03.2023. +// + +#include + +#include "VNucleiProperties.h" + +namespace properties { + +VNucleiProperties::~VNucleiProperties() = default; + +FermiFloat VNucleiProperties::AtomicMass(MassNumber mass_number, ChargeNumber charge_number) { + static const FermiFloat hydrogen_mass_excess = 7.28897; + static const FermiFloat neutron_mass_excess = 8.07132; + + FermiFloat mass = FermiFloat(FermiUInt(mass_number) - FermiUInt(charge_number)) * neutron_mass_excess + + FermiFloat(charge_number) * hydrogen_mass_excess - BindingEnergy(mass_number, charge_number) + + FermiFloat(mass_number) * CLHEP::amu_c2; + + return mass; +} + +FermiFloat VNucleiProperties::NuclearMass(MassNumber mass_number, ChargeNumber charge_number) { + FermiFloat mass = AtomicMass(mass_number, charge_number); + /// atomic mass is converted to nuclear mass according formula in AME03 + mass -= FermiFloat(charge_number) * CLHEP::electron_mass_c2; + mass += (14.4381 * std::pow(charge_number, 2.39) + 1.55468 * 1e-6 * std::pow(charge_number, 5.35)) * CLHEP::eV; + + return mass; +} + +FermiFloat VNucleiProperties::BindingEnergy(MassNumber mass_number, ChargeNumber charge_number) { + /// Weitzsaecker's Mass formula + FermiInt N_pairing = (FermiInt(mass_number) - FermiInt(charge_number)) % 2; /// pairing + FermiInt Z_pairing = FermiInt(charge_number) % 2; + + FermiFloat binding = + -15.67 * FermiFloat(mass_number) /// nuclear volume + + 17.23 * std::pow(mass_number, 2. / 3.) /// surface energy + + 93.15 * std::pow(FermiFloat(mass_number) / 2. - FermiFloat(charge_number), 2) + / FermiFloat(mass_number) /// asymmetry + + 0.6984523 * std::pow(FermiUInt(charge_number), 2) * std::pow(mass_number, -1. / 3.); /// coulomb + + if (N_pairing == Z_pairing) { + binding += (N_pairing + Z_pairing - 1) * 12.0 / std::sqrt(FermiFloat(mass_number)); /// pairing + } + + return -binding * CLHEP::MeV; +} + +bool VNucleiProperties::IsInvalidNuclei(MassNumber mass_number, ChargeNumber charge_number) { + return mass_number < 1_m || charge_number < 0_c || FermiUInt(charge_number) > FermiUInt(mass_number); +} + +} // namespace properties diff --git a/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.h b/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.h new file mode 100644 index 0000000..d549937 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/NucleiProperties/VNucleiProperties.h @@ -0,0 +1,32 @@ +// +// Created by Artem Novikov on 09.03.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VNUCLEIPROPERTIES_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VNUCLEIPROPERTIES_H_ + +#include "Utilities/DataTypes.h" + +namespace properties { + +class VNucleiProperties { + public: + virtual FermiFloat GetNuclearMass(MassNumber mass_number, ChargeNumber charge_number) const = 0; + + virtual bool IsStable(MassNumber mass_number, ChargeNumber charge_number) const = 0; + + virtual ~VNucleiProperties() = 0; + + protected: + static FermiFloat AtomicMass(MassNumber mass_number, ChargeNumber charge_number); + + static FermiFloat NuclearMass(MassNumber mass_number, ChargeNumber charge_number); + + static FermiFloat BindingEnergy(MassNumber mass_number, ChargeNumber charge_number); + + static bool IsInvalidNuclei(MassNumber mass_number, ChargeNumber charge_number); +}; + +} // namespace properties + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_VNUCLEIPROPERTIES_H_ diff --git a/FermiBreakUp/lib/Utilities/Randomizer.cpp b/FermiBreakUp/lib/Utilities/Randomizer.cpp new file mode 100644 index 0000000..75acab2 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/Randomizer.cpp @@ -0,0 +1,48 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#include +#include + +#include "Randomizer.h" + +FermiFloat Randomizer::UniformRealDistribution() { + static std::random_device device; + static std::mt19937 generator(device()); + static std::uniform_real_distribution distribution(0, 1); + return distribution(generator); +} + +FermiFloat Randomizer::NormalDistribution(FermiFloat mean, FermiFloat deviation) { + static std::random_device device; + static std::mt19937 generator(device()); + static std::normal_distribution distribution(0, 1); + return mean + distribution(generator) * deviation; +} + +ParticleMomentum Randomizer::IsotropicVector(FermiFloat magnitude) { + auto cos = 1.0 - 2.0 * UniformRealDistribution(); + auto sin = std::sqrt(1.0 - std::pow(cos, 2)); + auto phi = CLHEP::twopi * UniformRealDistribution(); + ParticleMomentum momentum(magnitude * std::cos(phi) * sin, + magnitude * std::sin(phi) * sin, + magnitude * cos); +// ParticleMomentum momentum(NormalDistribution(), NormalDistribution(), NormalDistribution()); +// momentum = momentum * (magnitude) / momentum.mag(); + return momentum; +} + +std::vector Randomizer::ProbabilityDistribution(size_t point_count) { + /// Sample uniform random numbers in increasing order + std::vector probability_distribution; + probability_distribution.reserve(point_count); + + probability_distribution.push_back(0); + std::generate_n(std::back_inserter(probability_distribution), point_count - 2, Randomizer::UniformRealDistribution); + probability_distribution.push_back(1); + + std::sort(probability_distribution.begin(), probability_distribution.end()); + + return probability_distribution; +} diff --git a/FermiBreakUp/lib/Utilities/Randomizer.h b/FermiBreakUp/lib/Utilities/Randomizer.h new file mode 100644 index 0000000..018be43 --- /dev/null +++ b/FermiBreakUp/lib/Utilities/Randomizer.h @@ -0,0 +1,24 @@ +// +// Created by Artem Novikov on 19.02.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_RANDOMIZER_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_RANDOMIZER_H_ + +#include +#include + +#include "DataTypes.h" + +class Randomizer { + public: + static FermiFloat UniformRealDistribution(); + + static FermiFloat NormalDistribution(FermiFloat mean = 0, FermiFloat deviation = 1); + + static ParticleMomentum IsotropicVector(FermiFloat magnitude = 1); + + static std::vector ProbabilityDistribution(size_t point_count); +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_UTILITIES_RANDOMIZER_H_ diff --git a/FermiBreakUp/lib/VFermiBreakUp.cpp b/FermiBreakUp/lib/VFermiBreakUp.cpp new file mode 100644 index 0000000..05e2244 --- /dev/null +++ b/FermiBreakUp/lib/VFermiBreakUp.cpp @@ -0,0 +1,34 @@ +// +// Created by Artem Novikov on 21.05.2023. +// + +#include "VFermiBreakUp.h" +#include "PhaseDecay/FermiPhaseSpaceDecay.h" + +ParticleVector VFermiBreakUp::ConvertToParticles(const FermiParticle& source_nucleus, const FragmentVector& split) { + ParticleVector particle_split; + particle_split.reserve(2 * split.size()); + + std::vector split_masses; + split_masses.reserve(split.size()); + for (auto fragment_ptr : split) { + split_masses.push_back(fragment_ptr->GetTotalEnergy()); + } + + FermiPhaseSpaceDecay phase_sampler; + std::vector + particles_momentum = phase_sampler.CalculateDecay(source_nucleus.GetMomentum(), split_masses); + + Vector3 boost_vector = source_nucleus.GetMomentum().boostVector(); + + /// Go back to the Lab Frame + for (size_t fragment_idx = 0; fragment_idx < split.size(); ++fragment_idx) { + ParticleVector fragment_particles = split[fragment_idx]->GetFragment( + particles_momentum[fragment_idx].boost(boost_vector)); + + particle_split.insert(particle_split.end(), std::make_move_iterator(fragment_particles.begin()), + std::make_move_iterator(fragment_particles.end())); + } + + return particle_split; +} \ No newline at end of file diff --git a/FermiBreakUp/lib/VFermiBreakUp.h b/FermiBreakUp/lib/VFermiBreakUp.h new file mode 100644 index 0000000..ead9c9a --- /dev/null +++ b/FermiBreakUp/lib/VFermiBreakUp.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 21.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_VFERMIBREAKUP_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_VFERMIBREAKUP_H_ + +#include "FermiParticle.h" +#include "FermiSplit.h" + +class VFermiBreakUp { + public: + virtual ParticleVector BreakItUp(const FermiParticle& nucleus) = 0; + + virtual ~VFermiBreakUp() = default; + + protected: + static ParticleVector ConvertToParticles(const FermiParticle& source_nucleus, const FragmentVector& split); +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_VFERMIBREAKUP_H_ diff --git a/FermiBreakUp/lib/VFermiConfigurations.cpp b/FermiBreakUp/lib/VFermiConfigurations.cpp new file mode 100644 index 0000000..4baff8a --- /dev/null +++ b/FermiBreakUp/lib/VFermiConfigurations.cpp @@ -0,0 +1,5 @@ +// +// Created by Artem Novikov on 24.05.2023. +// + +#include "VFermiConfigurations.h" \ No newline at end of file diff --git a/FermiBreakUp/lib/VFermiConfigurations.h b/FermiBreakUp/lib/VFermiConfigurations.h new file mode 100644 index 0000000..fcd4694 --- /dev/null +++ b/FermiBreakUp/lib/VFermiConfigurations.h @@ -0,0 +1,21 @@ +// +// Created by Artem Novikov on 21.05.2023. +// + +#ifndef FERMIBREAKUP_MYFERMIBREAKUP_VFERMICONFIGURATIONS_H_ +#define FERMIBREAKUP_MYFERMIBREAKUP_VFERMICONFIGURATIONS_H_ + +#include + +#include "Utilities/DataTypes.h" + +class VFermiConfigurations { + public: + virtual VFermiConfigurations& GenerateSplits(NucleiData nuclei_data, FermiFloat total_energy) = 0; + + virtual std::optional ChooseSplit() = 0; + + virtual ~VFermiConfigurations() = default; +}; + +#endif //FERMIBREAKUP_MYFERMIBREAKUP_VFERMICONFIGURATIONS_H_ diff --git a/GRATE.cc b/GRATE.cc index 81025de..4f12eef 100644 --- a/GRATE.cc +++ b/GRATE.cc @@ -43,6 +43,7 @@ #include "AAMCC.hh" #include "AAMCCWriter.hh" #include "MCiniWriter.hh" +#include "DeexcitationHandler.hh" #include @@ -135,22 +136,19 @@ int main() } //Setting up ExcitationHandler - DeexcitationHandler* handlerNew = new DeexcitationHandler(); - //handlerNew->SetMinEForMultiFrag(3*MeV); - handlerNew->SetMaxAandZForFermiBreakUp(19, 9); - handlerNew->SetMinExcitation(1e-4*MeV); - handlerNew->SetMaxAforFermiBreakUp(19); - handlerNew->SetMaxZforFermiBreakUp(9); - handlerNew->SetMaxAforPureNeutronFragments(200); - handlerNew->SetMinExForFermiBreakUp(0.01*MeV); - handlerNew->SetExForMF(3*MeV, 5*MeV); + DeexcitationHandler handler; + handler.SetStableThreshold(1e-4 * MeV); + handler.SetFermiBreakUpCondition([](const G4Fragment& fragment) { + return fragment.GetA_asInt() < 19 && fragment.GetZ_asInt() < 9 + && fragment.GetExcitationEnergy() > 0.01 * MeV * fragment.GetA_asInt(); + }); //Setting up Glauber code //histoManager.CalcXsectNN(); G4float omega = -1; G4float signn = histoManager.GetXsectNN(); auto seed = static_cast(*CLHEP::HepRandom::getTheSeeds()); //setting the same seed to TGlauber - TGlauberMC *mcg=new TGlauberMC(histoManager.GetInitialContidions().GetSysA(),histoManager.GetInitialContidions().GetSysB(),signn,omega,seed); + TGlauberMC *mcg = new TGlauberMC(histoManager.GetInitialContidions().GetSysA(),histoManager.GetInitialContidions().GetSysB(),signn,omega,seed); mcg->SetMinDistance(0.4); //mcg->SetNodeDistance(0); mcg->SetCalcLength(0); @@ -295,17 +293,16 @@ int main() // HANDLER - G4ReactionProductVector * theProduct = handlerNew->BreakUp(aFragment, histoManager.GetDeexModel()); - - thisEventNumFragments = theProduct->size(); + auto products = handler.BreakUp(aFragment, histoManager.GetDeexModel()); + thisEventNumFragments = products.size(); //histoManager.GetHisto(1)->Fill(thisEventNumFragments);//newData - for (G4ReactionProductVector::iterator iVector = theProduct->begin(); iVector != theProduct->end(); ++iVector) { + for (auto& product: products) { G4double thisFragmentZ = 0; G4double thisFragmentA = 0; - const G4ParticleDefinition *pd = (*iVector)->GetDefinition(); + const G4ParticleDefinition *pd = product.GetDefinition(); G4String particleEmitted = pd->GetParticleName(); @@ -316,9 +313,8 @@ int main() event.MassOnSideA.push_back(thisFragmentA); event.ChargeOnSideA.push_back(thisFragmentZ); - G4double eeA = (*iVector)->GetTotalEnergy(); - G4LorentzVector product_p4((*iVector)->GetMomentum().x(), (*iVector)->GetMomentum().y(), - (*iVector)->GetMomentum().z(), eeA); + G4double eeA = product.GetTotalEnergy(); + G4LorentzVector product_p4(product.GetMomentum()); G4double pXonA = product_p4.x() / MeV; G4double pYonA = product_p4.y() / MeV; G4double pZonA = product_p4.z() / MeV; @@ -353,10 +349,8 @@ int main() //newData histoManager.GetHisto(6)->Fill(thisFragmentZ); //newData histoManager.GetHisto(7)->Fill(thisFragmentA); //newData histoManager.GetHisto2(2)->Fill(thisFragmentZ, thisFragmentA); - delete (*iVector); } //if(p4.mag() > 0.01) std::cout<<"p4.mag() = "<BreakUp(aFragmentB, histoManager.GetDeexModel()); + auto productsB = handler.BreakUp(aFragmentB, histoManager.GetDeexModel()); - for (G4ReactionProductVector::iterator kVector = theProductB->begin(); kVector != theProductB->end(); ++kVector) { + for (auto& product: productsB) { G4int thisFragmentZb = 0; G4int thisFragmentAb = 0; - const G4ParticleDefinition *pdB = (*kVector)->GetDefinition(); + const G4ParticleDefinition *pdB = product.GetDefinition(); G4String particleEmittedB = pdB->GetParticleName(); @@ -387,8 +381,8 @@ int main() event.MassOnSideB.push_back(thisFragmentAb); event.ChargeOnSideB.push_back(thisFragmentZb); - G4double eeB = (*kVector)->GetTotalEnergy(); - G4LorentzVector product_p4b((*kVector)->GetMomentum().x(), (*kVector)->GetMomentum().y(), (*kVector)->GetMomentum().z(), eeB); + G4double eeB = product.GetTotalEnergy(); + G4LorentzVector product_p4b(product.GetMomentum()); G4double pXonB = product_p4b.x() / MeV; G4double pYonB = product_p4b.y() / MeV; G4double pZonB = product_p4b.z() / MeV; @@ -402,9 +396,7 @@ int main() event.pseudorapidity_B.push_back(eta_B); } //newData histoManager.GetHisto(0)->Fill(thisFragmentZb); - delete (*kVector); } - delete theProductB; } event.ClustNumB = event.Ab_cl.size(); @@ -462,7 +454,6 @@ int main() delete pMciniWriter; delete runManager; delete clusters; - delete handlerNew; delete mcg; delete ExEnA; delete ExEnB; diff --git a/PureNeutrons/include/PureNeutrons.hh b/PureNeutrons/include/PureNeutrons.hh new file mode 100644 index 0000000..4d604cb --- /dev/null +++ b/PureNeutrons/include/PureNeutrons.hh @@ -0,0 +1,28 @@ +// +// Created by Artem Novikov on 25.11.2023. +// + +#ifndef GRATE_PURENEUTRONS_SRC_PURENEUTRONS_H_ +#define GRATE_PURENEUTRONS_SRC_PURENEUTRONS_H_ + +#include "G4Fragment.hh" + +class PureNeutrons { + public: + PureNeutrons(G4double neutron_mass = CLHEP::neutron_mass_c2); + + PureNeutrons(PureNeutrons&&) = default; + + PureNeutrons(const PureNeutrons&) = delete; + + PureNeutrons& operator=(const PureNeutrons&) = delete; + + PureNeutrons& operator=(PureNeutrons&&) = default; + + G4FragmentVector BreakItUp(const G4Fragment& fragment) const; + + private: + G4double neutron_mass_; +}; + +#endif //GRATE_PURENEUTRONS_SRC_PURENEUTRONS_H_ diff --git a/PureNeutrons/src/PureNeutrons.cc b/PureNeutrons/src/PureNeutrons.cc new file mode 100644 index 0000000..15389e6 --- /dev/null +++ b/PureNeutrons/src/PureNeutrons.cc @@ -0,0 +1,25 @@ +// +// Created by Artem Novikov on 25.11.2023. +// + +#include "G4FermiPhaseSpaceDecay.hh" + +#include "../include/PureNeutrons.hh" + +PureNeutrons::PureNeutrons(G4double neutron_mass) : neutron_mass_(neutron_mass) {} + +G4FragmentVector PureNeutrons::BreakItUp(const G4Fragment& fragment) const { + G4FermiPhaseSpaceDecay phase_decay; + + auto fragments = G4FragmentVector(); + fragments.reserve(fragment.GetA_asInt()); + + auto boost_vector = fragment.GetMomentum().boostVector(); + auto fragments_momentum = std::move(*phase_decay.Decay(fragment.GetMomentum().m(), + std::vector(fragment.GetA_asInt(), neutron_mass_))); + for (auto momentum_ptr: fragments_momentum) { + fragments.push_back(new G4Fragment(1, 0, momentum_ptr->boost(boost_vector))); + } + + return fragments; +} diff --git a/include/DeexcitationHandler.hh b/include/DeexcitationHandler.hh index 3cd5f17..6de300f 100644 --- a/include/DeexcitationHandler.hh +++ b/include/DeexcitationHandler.hh @@ -1,67 +1,67 @@ +// +// Created by Artem Novikov on 25.11.2023. +// -#include -#include - - #include "G4ExcitationHandler.hh" - #include "G4SystemOfUnits.hh" - #include "G4LorentzVector.hh" - #include "G4NistManager.hh" - #include "G4ParticleTable.hh" - #include "G4ParticleTypes.hh" - #include "G4Ions.hh" - #include "G4Evaporation.hh" - #include "G4StatMF.hh" - #include "G4PhotonEvaporation.hh" - #include "G4Pow.hh" - #include "G4FermiPhaseSpaceDecay.hh" - #include "../FermiBreakUp/G4FermiBreakUp.hh" - #include "../Multifragmentation/include/G4StatMF.hh" - - class DeexcitationHandler: public G4ExcitationHandler { +#ifndef GRATE_INCLUDE_MYDEEXCITATIONHANDLER_H_ +#define GRATE_INCLUDE_MYDEEXCITATIONHANDLER_H_ + +#include +#include "G4ParticleTypes.hh" + +#include "PureNeutrons/include/PureNeutrons.hh" + +#include "ExcitationHandler.hh" + +class DeexcitationHandler : public ExcitationHandler { public: - DeexcitationHandler(); - ~DeexcitationHandler(); - - G4ReactionProductVector* G4BreakItUp(const G4Fragment &theInitialFragment); - G4ReactionProductVector* BreakUpPureNeutrons(const G4Fragment &theInitialFragment); - G4ReactionProductVector* AAMCCBreakItUp(const G4Fragment &theInitialFragment); - G4ReactionProductVector* BreakUp(const G4Fragment &theInitialFragment, G4String modelName); - - inline void SetMaxAforPureNeutronFragments(G4int in_A) {MaxAforFermiBreakUpForPureNeutronFragments = in_A;}; - inline void SetMaxAforFermiBreakUp(G4int in_A) {MaxAforFermiBreakUp = in_A;}; - inline void SetMaxZforFermiBreakUp(G4int in_Z) {MaxZforFermiBreakUp = in_Z;}; - inline void SetMinExForFermiBreakUp(G4double in_Ex) {minExForFBU = in_Ex;}; - - inline void SetExForMF(G4double in_lowEx, G4double in_upEx) { - lowBoundTransitionForMF = in_lowEx; upBoundTransitionForMF = in_upEx; - aE = 1/(2.*(upBoundTransitionForMF - lowBoundTransitionForMF)); - E0 = (upBoundTransitionForMF + lowBoundTransitionForMF)/2.; - }; - - inline void SetMinEx(G4double in_minEx) {minEx = in_minEx;}; + DeexcitationHandler(); + + DeexcitationHandler(const DeexcitationHandler&) = delete; + + DeexcitationHandler(DeexcitationHandler&&) = default; + + DeexcitationHandler& operator=(const DeexcitationHandler&) = delete; + + DeexcitationHandler& operator=(DeexcitationHandler&&) = default; + + std::vector G4BreakItUp(const G4Fragment &fragment); + + std::vector BreakUpPureNeutrons(const G4Fragment &fragment); + + std::vector AAMCCBreakItUp(const G4Fragment &fragment); + + std::vector BreakUp(const G4Fragment &fragment, const G4String& modelName); + + /// parameters setters + + ExcitationHandler& SetPureNeutrons(std::unique_ptr&& model = DefaultPureNeutrons()) { + pure_neutrons_ = std::move(model); + return *this; + } + + template + ExcitationHandler& SetPureNeutronsCondition(F&& f) { + pure_neutrons_ = std::forward(f); + return *this; + } + + /// parameters getters + std::unique_ptr& GetPureNeutrons() { return pure_neutrons_; } + + const std::unique_ptr& GetPureNeutrons() const { return pure_neutrons_; } + + Condition& GetPureNeutronsCondition() { return pure_neutrons_condition_; } + + const Condition& GetPureNeutronsCondition() const { return pure_neutrons_condition_; } + private: - G4int MaxAforFermiBreakUpForPureNeutronFragments = 200; - G4int MaxAforFermiBreakUp = 19; - G4int MaxZforFermiBreakUp = 9; - G4double minExForFBU = 0.1*MeV; - G4double mn = 939.5731*MeV;//TODO switch nucelon mass to Geant4 nucleon mass. ALSO FOR FERMI MOMENTUM. - G4double lowBoundTransitionForMF = 3*MeV; - G4double upBoundTransitionForMF = 5*MeV; - G4double minEx = 0.001*MeV; - - G4double aE = 1; - G4double E0 = 0; - - static G4Fragment* toFragment(G4ReactionProduct* product); - G4ReactionProduct* toReactionProduct(G4Fragment* fragment); - static G4ParticleDefinition* toParticleDefinition(G4int A, G4int Z) ; - bool isMultifragmentation(G4double A, G4double Z, G4double Ex); - bool isFermiBreakUp(G4double A, G4double Z, G4double Ex); - bool isDecay(G4double A, G4double Z, G4double Ex); - bool isDecayOfPureNeutrons(G4double A, G4double Z); - - G4FermiPhaseSpaceDecay PhaseSpaceDecay; - G4FermiBreakUp FermiBreakUp; - G4StatMF theMultifragmentation; + static std::unique_ptr DefaultPureNeutrons(); + + static Condition DefaultPureNeutronsCondition(); + std::unique_ptr pure_neutrons_; + + Condition pure_neutrons_condition_; }; + +#endif //GRATE_INCLUDE_DEEXCITATIONHANDLER_H_ diff --git a/include/ExcitationHandler.hh b/include/ExcitationHandler.hh new file mode 100644 index 0000000..a679f5f --- /dev/null +++ b/include/ExcitationHandler.hh @@ -0,0 +1,201 @@ +// +// Created by Artem Novikov on 17.05.2023. +// + +#ifndef FERMIBREAKUP_HANDLER_EXCITATIONHANDLER_H_ +#define FERMIBREAKUP_HANDLER_EXCITATIONHANDLER_H_ + +#include +#include +#include +#include + +#include "G4Fragment.hh" +#include "G4ReactionProductVector.hh" +#include "G4IonTable.hh" +#include "G4DeexPrecoParameters.hh" +#include "G4Fragment.hh" +#include "G4NistManager.hh" + +#include "G4VMultiFragmentation.hh" +#include "G4PhotonEvaporation.hh" +#include "Evaporation/include/G4VEvaporation.hh" +#include "Evaporation/include/G4VEvaporationChannel.hh" +#include "Evaporation/include/G4Evaporation.hh" +#include "G4StatMF.hh" +#include "G4VFermiBreakUp.hh" + +class ExcitationHandler { + public: + using Condition = std::function; + + ExcitationHandler(); + + ExcitationHandler(const ExcitationHandler&) = delete; + + ExcitationHandler(ExcitationHandler&&) = default; + + ExcitationHandler& operator=(const ExcitationHandler&) = delete; + + ExcitationHandler& operator=(ExcitationHandler&&) = default; + + std::vector BreakItUp(const G4Fragment& fragment); + + /// parameters setters + ExcitationHandler& SetMultiFragmentation(std::unique_ptr&& model = DefaultMultiFragmentation()) { + multi_fragmentation_model_ = std::move(model); + return *this; + } + + ExcitationHandler& SetFermiBreakUp(std::unique_ptr&& model = DefaultFermiBreakUp()) { + fermi_break_up_model_ = std::move(model); + return *this; + } + + ExcitationHandler& SetEvaporation(std::unique_ptr&& model = DefaultEvaporation()) { + evaporation_model_ = std::move(model); + return *this; + } + + ExcitationHandler& SetPhotonEvaporation(std::unique_ptr&& model = DefaultPhotonEvaporation()) { + evaporation_model_->SetPhotonEvaporation(model.release()); + return *this; + } + + template + ExcitationHandler& SetMultiFragmentationCondition(F&& f) { + multi_fragmentation_condition_ = std::forward(f); + return *this; + } + + ExcitationHandler& SetMultiFragmentationCondition() { + return SetPhotonEvaporationCondition(DefaultMultiFragmentationCondition()); + } + + template + ExcitationHandler& SetFermiBreakUpCondition(F&& f) { + fermi_condition_ = std::forward(f); + return *this; + } + + ExcitationHandler& SetFermiBreakUpCondition() { + return SetPhotonEvaporationCondition(DefaultFermiBreakUpCondition()); + } + + template + ExcitationHandler& SetEvaporationCondition(F&& f) { + evaporation_condition_ = std::forward(f); + return *this; + } + + ExcitationHandler& SetEvaporationCondition() { + return SetPhotonEvaporationCondition(DefaultEvaporationCondition()); + } + + template + ExcitationHandler& SetPhotonEvaporationCondition(F&& f) { + photon_evaporation_condition_ = std::forward(f); + return *this; + } + + ExcitationHandler& SetPhotonEvaporationCondition() { + return SetPhotonEvaporationCondition(DefaultPhotonEvaporationCondition()); + } + + ExcitationHandler& SetStableThreshold(Float threshold) { + stable_threshold_ = threshold; + return *this; + } + + /// parameters getters + std::unique_ptr& GetMultiFragmentation() { return multi_fragmentation_model_; } + + const std::unique_ptr& GetMultiFragmentation() const { return multi_fragmentation_model_; } + + std::unique_ptr& GetFermiBreakUp() { return fermi_break_up_model_; } + + const std::unique_ptr& GetFermiBreakUp() const { return fermi_break_up_model_; } + + std::unique_ptr& GetEvaporation() { return evaporation_model_; } + + const std::unique_ptr& GetEvaporation() const { return evaporation_model_; } + + Condition& GetMultiFragmentationCondition() { return multi_fragmentation_condition_; } + + const Condition& GetMultiFragmentationCondition() const { return multi_fragmentation_condition_; } + + Condition& GetFermiBreakUpCondition() { return fermi_condition_; } + + const Condition& GetFermiBreakUpCondition() const { return fermi_condition_; } + + Condition& GetEvaporationCondition() { return evaporation_condition_; } + + const Condition& GetEvaporationCondition() const { return evaporation_condition_; } + + Condition& GetPhotonEvaporationCondition() { return photon_evaporation_condition_; } + + const Condition& GetPhotonEvaporationCondition() const { return photon_evaporation_condition_; } + + Float GetStableThreshold() const { return stable_threshold_; } + + protected: + static G4ParticleDefinition* SpecialParticleDefinition(const G4Fragment& fragment); + + static void EvaporationError(const G4Fragment& fragment, const G4Fragment& current_fragment, size_t iter); + + /// default models and conditions + static std::unique_ptr DefaultMultiFragmentation(); + + static std::unique_ptr DefaultFermiBreakUp(); + + static std::unique_ptr DefaultEvaporation(); + + static std::unique_ptr DefaultPhotonEvaporation(); + + static Condition DefaultMultiFragmentationCondition(); + + static Condition DefaultFermiBreakUpCondition(); + + static Condition DefaultEvaporationCondition(); + + static Condition DefaultPhotonEvaporationCondition(); + + static void CleanUp(G4FragmentVector& v, std::queue& q1, std::queue& q2); + + bool IsGroundState(const G4Fragment& fragment) const; + + bool IsStable(const G4Fragment& fragment, const G4NistManager*nist) const; + + void ApplyMultiFragmentation(std::unique_ptr fragment, G4FragmentVector& results, + std::queue& next_stage); + + void ApplyFermiBreakUp(std::unique_ptr fragment, G4FragmentVector& results, + std::queue& next_stage); + + void ApplyEvaporation(std::unique_ptr fragment, G4FragmentVector& results, + std::queue& next_stage); + + void ApplyPhotonEvaporation(std::unique_ptr fragment, G4FragmentVector& results); + + void GroupFragments(const G4FragmentVector& fragments, G4FragmentVector& results, + std::queue& next_stage); + + std::vector ConvertResults(const G4FragmentVector& results); + + std::unique_ptr multi_fragmentation_model_; + std::unique_ptr fermi_break_up_model_; + std::unique_ptr evaporation_model_; + + Condition multi_fragmentation_condition_; + Condition fermi_condition_; + Condition evaporation_condition_; + Condition photon_evaporation_condition_; + + Float stable_threshold_ = 0; + + static const size_t EvaporationIterationThreshold; + + static const char* ErrorNoModel; +}; + +#endif //FERMIBREAKUP_HANDLER_EXCITATIONHANDLER_H_ diff --git a/include/G4ExcitationHandler.hh b/include/G4ExcitationHandler.hh deleted file mode 100644 index 9616951..0000000 --- a/include/G4ExcitationHandler.hh +++ /dev/null @@ -1,194 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (May 1998) -// -// Modifications: -// 30 June 1998 by V. Lara: -// -Using G4ParticleTable and therefore G4IonTable -// it can return all kind of fragments produced in -// deexcitation -// -It uses default algorithms for: -// Evaporation: G4StatEvaporation -// MultiFragmentation: G4DummyMF (a dummy one) -// Fermi Breakup model: G4StatFermiBreakUp -// -// 03 September 2008 by J. M. Quesada for external choice of inverse -// cross section option -// 06 September 2008 JMQ Also external choices have been added for -// superimposed Coulomb barrier (if useSICBis set true, by default is false) -// 23 January 2012 by V.Ivanchenko remove obsolete data members; added access -// methods to deexcitation components -// - -#ifndef G4ExcitationHandler_h -#define G4ExcitationHandler_h 1 - -#include "globals.hh" -#include "G4Fragment.hh" -#include "G4ReactionProductVector.hh" -#include "G4IonTable.hh" -#include "G4DeexPrecoParameters.hh" -#include "../FermiBreakUp/G4FermiBreakUp.hh" - -class G4VMultiFragmentation; -class G4VFermiBreakUp; -class G4VEvaporation; -class G4VEvaporationChannel; -class G4NistManager; - -class G4ExcitationHandler -{ -public: - - explicit G4ExcitationHandler(); - ~G4ExcitationHandler(); - - G4ReactionProductVector* BreakItUp(const G4Fragment &theInitialState); - - // short model description used for automatic web documentation - void ModelDescription(std::ostream& outFile) const; - - void Initialise(); - - // user defined sub-models - // deletion is responsibility of this handler if isLocal=true - void SetMultiFragmentation(G4VMultiFragmentation* ptr); - void SetFermiModel(G4VFermiBreakUp* ptr); - void SetFermiModel_old(VFermiBreakUp* ptr); - void SetPhotonEvaporation(G4VEvaporationChannel* ptr); - void SetDeexChannelsType(G4DeexChannelType val); - G4bool isMulti(G4double A, G4double Z, G4double Ex); - - //======== Obsolete methods to be removed ===== - - // parameters of sub-models - inline void SetMaxAandZForFermiBreakUp(G4int anA,G4int aZ); - inline void SetMinEForMultiFrag(G4double anE); - inline void SetMinExcitation(G4double E); - - // access methods - inline G4VEvaporation* GetEvaporation(); - inline G4VMultiFragmentation* GetMultiFragmentation(); - inline G4VFermiBreakUp* GetFermiModel(); - inline G4VEvaporationChannel* GetPhotonEvaporation(); - - // for inverse cross section choice - inline void SetOPTxs(G4int opt); - // for superimposed Coulomb Barrir for inverse cross sections - inline void UseSICB(); - - //============================================== - -private: - - void SetParameters(); - - G4ExcitationHandler(const G4ExcitationHandler &right) = delete; - const G4ExcitationHandler & operator - =(const G4ExcitationHandler &right) = delete; - G4bool operator==(const G4ExcitationHandler &right) const = delete; - G4bool operator!=(const G4ExcitationHandler &right) const = delete; - - G4VEvaporation* theEvaporation; - G4VMultiFragmentation* theMultiFragmentation; - G4VFermiBreakUp* theFermiModel; - VFermiBreakUp* theFermiModel_old; - G4VEvaporationChannel* thePhotonEvaporation; - - const G4ParticleDefinition* electron; - G4int icID; - - G4int maxZForFermiBreakUp; - G4int maxAForFermiBreakUp; - G4double minEForMultiFrag; - G4double minExcitation; - - G4IonTable* theTableOfIons; - G4NistManager* nist; - - G4int fVerbose; - G4bool isInitialised; - G4bool isEvapLocal; - G4bool isActive; - - // list of fragments to store final result - std::vector theResults; - - // list of fragments to store intermediate result - std::vector results; - - // list of fragments to apply PhotonEvaporation - std::vector thePhotoEvapList; - - // list of fragments to apply Evaporation or Fermi Break-Up - std::vector theEvapList; -}; - -inline void G4ExcitationHandler::SetMaxAandZForFermiBreakUp(G4int anA,G4int aZ) -{ - maxAForFermiBreakUp = anA; - maxZForFermiBreakUp = aZ; -} - -inline void G4ExcitationHandler::SetMinExcitation(G4double E) -{ - minExcitation = E; -} - -inline void G4ExcitationHandler::SetMinEForMultiFrag(G4double anE) -{ - minEForMultiFrag = anE; -} - -inline G4VEvaporation* G4ExcitationHandler::GetEvaporation() -{ - return theEvaporation; -} - -inline G4VMultiFragmentation* G4ExcitationHandler::GetMultiFragmentation() -{ - return theMultiFragmentation; -} - -inline G4VFermiBreakUp* G4ExcitationHandler::GetFermiModel() -{ - return theFermiModel; -} - -inline G4VEvaporationChannel* G4ExcitationHandler::GetPhotonEvaporation() -{ - return thePhotonEvaporation; -} - -inline void G4ExcitationHandler::SetOPTxs(G4int) -{} - -inline void G4ExcitationHandler::UseSICB() -{} - -#endif diff --git a/src/DeexcitationHandler.cc b/src/DeexcitationHandler.cc index d4672d0..3e21888 100644 --- a/src/DeexcitationHandler.cc +++ b/src/DeexcitationHandler.cc @@ -1,159 +1,140 @@ +// +// Created by Artem Novikov on 25.11.2023. +// + +#include + #include "DeexcitationHandler.hh" +DeexcitationHandler::DeexcitationHandler() : + pure_neutrons_(DefaultPureNeutrons()), + pure_neutrons_condition_(DefaultPureNeutronsCondition()) {} -DeexcitationHandler::DeexcitationHandler(){ - aE = 1/(2.*(upBoundTransitionForMF - lowBoundTransitionForMF)); - E0 = (upBoundTransitionForMF + lowBoundTransitionForMF)/2.; +std::vector DeexcitationHandler::G4BreakItUp(const G4Fragment& fragment) { + if (pure_neutrons_condition_(fragment)) { + return BreakUpPureNeutrons(fragment); + } + return ExcitationHandler::BreakItUp(fragment); } -DeexcitationHandler::~DeexcitationHandler() = default; - +std::vector DeexcitationHandler::BreakUpPureNeutrons(const G4Fragment& fragment) { + auto fragments = pure_neutrons_->BreakItUp(fragment); + auto reaction_products = ConvertResults(fragments); + for (auto fragment_ptr : fragments) { + delete fragment_ptr; + } + return reaction_products; +} -G4ReactionProductVector *DeexcitationHandler::G4BreakItUp(const G4Fragment &theInitialFragment) { - if(isDecayOfPureNeutrons(theInitialFragment.GetA(),theInitialFragment.GetZ())){return BreakUpPureNeutrons(theInitialFragment);} - else{ return BreakItUp(theInitialFragment);} //parent class method -} +std::vector DeexcitationHandler::AAMCCBreakItUp(const G4Fragment& fragment) { + if (pure_neutrons_condition_(fragment)) { + return BreakUpPureNeutrons(fragment); + } + + auto nist = G4NistManager::Instance(); + G4FragmentVector results; + std::queue secondary_decay; + + auto initial_fragment_ptr = std::make_unique(fragment); + if (IsStable(fragment, nist)) { + results.push_back(initial_fragment_ptr.get()); + return ConvertResults(results); + } + + auto is_multi_fragmentation = multi_fragmentation_condition_(fragment); + if (is_multi_fragmentation) { + ApplyMultiFragmentation(std::move(initial_fragment_ptr), results, secondary_decay); + } else if (fermi_condition_(fragment)) { + ApplyFermiBreakUp(std::move(initial_fragment_ptr), results, secondary_decay); + } else if (evaporation_condition_(fragment)) { + G4FragmentVector fragments; + evaporation_model_->BreakFragment(&fragments, initial_fragment_ptr.get()); + results.insert(results.end(), fragments.begin(), fragments.end()); + } else { + throw std::runtime_error(ErrorNoModel); + } + + auto reaction_products = ConvertResults(results); + + /// prevent secondary MF + Condition mf_condition; + if (is_multi_fragmentation) { + mf_condition = std::move(multi_fragmentation_condition_); + multi_fragmentation_condition_ = [](const G4Fragment& frag) { return false; }; + } + + try { + while (!secondary_decay.empty()) { + auto fragment_ptr = std::unique_ptr(secondary_decay.back()); + secondary_decay.pop(); + + auto fragment_reaction_products = BreakItUp(*fragment_ptr); + for (auto& product : fragment_reaction_products) { + reaction_products.emplace_back(std::move(product)); + } + } + } catch(...) { + /// exception safety + if (is_multi_fragmentation) { + multi_fragmentation_condition_ = std::move(mf_condition); + } + for (auto& fragment_ptr : results) { + delete fragment_ptr; + } + throw; + } -G4ReactionProductVector *DeexcitationHandler::AAMCCBreakItUp(const G4Fragment &theInitialFragment) { //legacy - G4FragmentVector *tempResult = new G4FragmentVector(); - G4ReactionProductVector *theResult = new G4ReactionProductVector(); - //G4ReactionProductVector* ablaTempResult = new G4ReactionProductVector(); - G4ReactionProductVector *evapTempResult = new G4ReactionProductVector(); - G4FragmentVector *toDecayVector = new G4FragmentVector(); + /// change MF back + if (is_multi_fragmentation) { + multi_fragmentation_condition_ = std::move(mf_condition); + } - //if(ablaEvaporation.GetFreezeOutT() < 0) ablaEvaporation.SetFreezeOutT(1e100); + for (auto& fragment_ptr : results) { + delete fragment_ptr; + } - G4double Ain = theInitialFragment.GetA(); - G4double Zin = theInitialFragment.GetZ(); - G4double exEn = theInitialFragment.GetExcitationEnergy(); - bool isMF = isMultifragmentation(Ain, Zin, exEn); //not to apply FBU for one fragment twice + return reaction_products; +} - if (isDecayOfPureNeutrons(Ain, Zin)) { return BreakUpPureNeutrons(theInitialFragment); } +enum class Models { + G4 = 0, + AAMCC = 1, + NONE = 2 +}; - if (isDecay(Ain, Zin, exEn)) { - if (isMF) { - tempResult = theMultifragmentation.BreakItUp(theInitialFragment); - } else if (isFermiBreakUp(Ain, Zin, exEn)) { - tempResult = FermiBreakUp.BreakItUp(theInitialFragment); - } else { - //theResult = ablaEvaporation.DeExcite(theInitialFragment); - this->GetEvaporation()->BreakFragment(tempResult, new G4Fragment(theInitialFragment)); - return theResult; - } - } else { - theResult->push_back(toReactionProduct(const_cast(&theInitialFragment))); - return theResult; - } +Models HashModelName(const G4String& name) { + if (name == "G4") { + return Models::G4; + } + if (name == "AAMCC") { + return Models::AAMCC; + } - for (G4FragmentVector::iterator j = tempResult->begin(); j != tempResult->end(); ++j) { - if (!isDecay((*j)->GetA(), (*j)->GetZ(), (*j)->GetExcitationEnergy())) { - theResult->push_back(toReactionProduct((*j))); - } else { toDecayVector->push_back((*j)); } - } - tempResult->clear(); - //TODO remove double MF call - G4FragmentVector::iterator j = toDecayVector->begin(); - while (j != toDecayVector->end()) { - evapTempResult = this->BreakItUp(*(*j)); - theResult->insert(theResult->end(), evapTempResult->begin(), evapTempResult->end()); - j = toDecayVector->erase(j); - } - delete tempResult; - delete toDecayVector; - - return theResult; -} -G4ReactionProductVector *DeexcitationHandler::BreakUpPureNeutrons(const G4Fragment &theInitialFragment) { - G4ParticleDefinition *neutron = G4Neutron::NeutronDefinition(); - G4ReactionProductVector *outVec = new G4ReactionProductVector(); - std::vector mr; - mr.reserve(theInitialFragment.GetA_asInt()); - G4double M = theInitialFragment.GetMomentum().m(); - Hep3Vector momInitPerNucleon = theInitialFragment.GetMomentum().vect() / theInitialFragment.GetA(); - - for (G4int k = 0; k < theInitialFragment.GetA_asInt(); k++) { - mr.push_back(mn); - } - std::vector *mom = PhaseSpaceDecay.Decay(M, mr); - for (G4int k = 0; k < theInitialFragment.GetA_asInt(); k++) { - G4ReactionProduct *New = new G4ReactionProduct(neutron); - New->SetMomentum(mom->at(k)->vect() + momInitPerNucleon); - //Needs an additional boost since now; - double etot = mn + New->GetMomentum().mag() * c_light; - New->SetTotalEnergy(etot); - outVec->push_back(New); - } - return outVec; -} - -G4ReactionProductVector *DeexcitationHandler::BreakUp(const G4Fragment &theInitialFragment, G4String modelName) { - if (modelName == "G4") return G4BreakItUp(theInitialFragment); - else if (modelName == "AAMCC") return AAMCCBreakItUp(theInitialFragment); - else std::cout<<"Wrong model name "<GetTotalEnergy(), product->GetMomentum()); - G4Fragment* newFrag = new G4Fragment(fragLorentzVector, product->GetDefinition()); - return newFrag; -} +std::vector DeexcitationHandler::BreakUp(const G4Fragment& fragment, + const G4String& modelName) { + switch (HashModelName(modelName)) { + case Models::G4:return G4BreakItUp(fragment); -G4ReactionProduct *DeexcitationHandler::toReactionProduct(G4Fragment* fragment) { - const G4ParticleDefinition *def = toParticleDefinition(fragment->GetA(), fragment->GetZ()); - if(def == nullptr) {return nullptr;} - G4ReactionProduct* newProduct = new G4ReactionProduct(def); - const G4LorentzVector LV = fragment->GetMomentum(); - newProduct->SetMomentum(LV.px(), LV.py(), LV.pz()); - newProduct->SetTotalEnergy(LV.e()); - newProduct->SetFormationTime(fragment->GetCreationTime()); - return newProduct; -} + case Models::AAMCC:return AAMCCBreakItUp(fragment); -G4ParticleDefinition *DeexcitationHandler::toParticleDefinition(G4int A, G4int Z) { - if (A == 1 && Z == 1) return G4Proton::Proton(); - else if(A == 1 && Z == 0) return G4Neutron::Neutron(); - else if(A == -1 && Z == 1) return G4PionPlus::PionPlus(); - else if(A == -1 && Z == -1) return G4PionMinus::PionMinus(); - else if(A == -1 && Z == 0) return G4PionZero::PionZero(); - else if(A == 0 && Z == 0) return G4Gamma::Gamma(); - else if(A == 2 && Z == 1) return G4Deuteron::Deuteron(); - else if(A == 3 && Z == 1) return G4Triton::Triton(); - else if(A == 3 && Z == 2) return G4He3::He3(); - else if(A == 4 && Z == 2) return G4Alpha::Alpha(); - else if(A > 0 && Z > 0 && A >= Z) { // Returns ground state ion definition - return G4IonTable::GetIonTable()->GetIon(Z, A, 0); - } else { // Error, unrecognized particle - G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << " to G4ParticleDefinition, trouble ahead" << G4endl; - return nullptr; + default: { + std::cout << "Wrong model name " << modelName << ". G4, ABLAXX, AAMCC or MIX are available \n"; + return AAMCCBreakItUp(fragment); } + } } -bool DeexcitationHandler::isMultifragmentation(G4double A, G4double Z, G4double Ex) { - if(isFermiBreakUp(A,Z,Ex)){return false;} - G4double w = G4RandFlat::shoot(); - G4double transF = 0.5*tanh((Ex/A - E0)/aE) + 0.5; - if (Ex < lowBoundTransitionForMF*A) {return false;} - else if (w < transF && Ex < upBoundTransitionForMF*A){return true;} - else if (w > transF && Ex < upBoundTransitionForMF*A){return false;} - else if (Ex > upBoundTransitionForMF*A) {return true;} - else {return false;} +std::unique_ptr DeexcitationHandler::DefaultPureNeutrons() { + return std::make_unique(); } -bool DeexcitationHandler::isFermiBreakUp(G4double A, G4double Z, G4double Ex) { - if(A < MaxAforFermiBreakUp && Z < MaxZforFermiBreakUp && Ex > minExForFBU*A){return true;} - else{return false;} +ExcitationHandler::Condition DeexcitationHandler::DefaultPureNeutronsCondition() { + return [](const G4Fragment& fragment) -> bool { + return fragment.GetZ_asInt() == 0 && fragment.GetA_asInt() > 0; + }; } - -bool DeexcitationHandler::isDecay(G4double A, G4double Z, G4double Ex) { - if(A > 1 && Ex > minEx){return true;} - else{return false;} -} - -bool DeexcitationHandler::isDecayOfPureNeutrons(G4double A, G4double Z) { - if(A > 0 && Z==0) return true; - else return false; -} - - diff --git a/src/ExcitationHandler.cc b/src/ExcitationHandler.cc new file mode 100644 index 0000000..0cb84ed --- /dev/null +++ b/src/ExcitationHandler.cc @@ -0,0 +1,406 @@ +// +// Created by Artem Novikov on 17.05.2023. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "G4LorentzVector.hh" +#include "G4NistManager.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleTypes.hh" +#include "G4Ions.hh" +#include "G4Electron.hh" + +#include "G4Evaporation.hh" +#include "G4PhotonEvaporation.hh" +#include "G4StatMF.hh" +#include "FermiBreakUp/AAMCCFermiBreakUp.hh" +#include "ExcitationHandler.hh" + +const size_t ExcitationHandler::EvaporationIterationThreshold = 1e3; + +const char* ExcitationHandler::ErrorNoModel = "no model was applied, check conditions"; + +ExcitationHandler::ExcitationHandler() + : multi_fragmentation_model_(DefaultMultiFragmentation()), + fermi_break_up_model_(DefaultFermiBreakUp()), + evaporation_model_(DefaultEvaporation()), + multi_fragmentation_condition_(DefaultMultiFragmentationCondition()), + fermi_condition_(DefaultFermiBreakUpCondition()), + evaporation_condition_(DefaultEvaporationCondition()), + photon_evaporation_condition_(DefaultPhotonEvaporationCondition()) { + G4BosonConstructor pCBos; + pCBos.ConstructParticle(); + + G4LeptonConstructor pCLept; + pCLept.ConstructParticle(); + + G4MesonConstructor pCMes; + pCMes.ConstructParticle(); + + G4BaryonConstructor pCBar; + pCBar.ConstructParticle(); + + G4IonConstructor pCIon; + pCIon.ConstructParticle(); + + G4GenericIon* gion = G4GenericIon::GenericIon(); + gion->SetProcessManager(new G4ProcessManager(gion)); + + G4StateManager::GetStateManager()->SetNewState(G4State_Init); // To let create ions + G4ParticleTable* partTable = G4ParticleTable::GetParticleTable(); + G4IonTable* ion_table = partTable->GetIonTable(); + partTable->SetReadiness(); + ion_table->CreateAllIon(); + ion_table->CreateAllIsomer(); +} + +void ExcitationHandler::CleanUp(G4FragmentVector& v, std::queue& q1, std::queue& q2) { + for (auto ptr : v) { + delete ptr; + } + while (!q1.empty()) { + delete q1.front(); + q1.pop(); + } + while (!q2.empty()) { + delete q2.front(); + q2.pop(); + } +} + +std::vector ExcitationHandler::BreakItUp(const G4Fragment& fragment) { + auto nist = G4NistManager::Instance(); + G4FragmentVector results; + std::queue evaporation_queue; + std::queue photon_evaporation_queue; + + /// In case A <= 1 the fragment will not perform any nucleon emission + auto initial_fragment_ptr = std::make_unique(fragment); + if (IsStable(fragment, nist)) { + results.push_back(initial_fragment_ptr.release()); + } else { + if (multi_fragmentation_condition_(fragment)) { + ApplyMultiFragmentation(std::move(initial_fragment_ptr), results, evaporation_queue); + } else { + evaporation_queue.push(initial_fragment_ptr.release()); + } + + for (size_t iteration_count = 0; !evaporation_queue.empty(); ++iteration_count) { + auto fragment_ptr = std::unique_ptr(evaporation_queue.front()); + evaporation_queue.pop(); + + /// infinite loop + if (iteration_count == EvaporationIterationThreshold) { + /// exception safety + CleanUp(results, evaporation_queue, photon_evaporation_queue); + + EvaporationError(fragment, *fragment_ptr, iteration_count); + /// process is dead + } + + /// FermiBreakUp part + if (fermi_condition_(*fragment_ptr)) { + ApplyFermiBreakUp(std::move(fragment_ptr), results, photon_evaporation_queue); + continue; + } + + /// Evaporation part + if (evaporation_condition_(*fragment_ptr)) { + ApplyEvaporation(std::move(fragment_ptr), results, evaporation_queue); + continue; + } + + /// exception safety + CleanUp(results, evaporation_queue, photon_evaporation_queue); + throw std::runtime_error(ErrorNoModel); + } + + /// Photon Evaporation part + while (!photon_evaporation_queue.empty()) { + auto fragment_ptr = std::unique_ptr(photon_evaporation_queue.front()); + photon_evaporation_queue.pop(); + + if (photon_evaporation_condition_(*fragment_ptr)) { + ApplyPhotonEvaporation(std::move(fragment_ptr), results); + continue; + } + + /// exception safety + CleanUp(results, evaporation_queue, photon_evaporation_queue); + throw std::runtime_error(ErrorNoModel); + } + } + + auto reaction_products = ConvertResults(results); + + for (auto ptr : results) { + delete ptr; + } + + return reaction_products; +} + +std::unique_ptr ExcitationHandler::DefaultMultiFragmentation() { + return std::make_unique(); +} + +std::unique_ptr ExcitationHandler::DefaultFermiBreakUp() { + return std::make_unique(); +} + +std::unique_ptr ExcitationHandler::DefaultEvaporation() { + auto evaporation = std::make_unique(DefaultPhotonEvaporation().release()); + evaporation->SetFermiBreakUp(DefaultFermiBreakUp().release()); + return evaporation; +} + +std::unique_ptr ExcitationHandler::DefaultPhotonEvaporation() { + return std::make_unique(); +} + +ExcitationHandler::Condition ExcitationHandler::DefaultMultiFragmentationCondition() { + static const G4int max_A = 19; + static const G4int max_Z = 9; + + return [](const G4Fragment& fragment) { + auto A = fragment.GetA_asInt(); + auto Z = fragment.GetZ_asInt(); + auto Ex = fragment.GetExcitationEnergy(); + if (A < max_A && Z < max_Z) { return false; } + G4double lower_bound_transition_MF = 3 * CLHEP::MeV; + G4double upper_bound_transition_MF = 5 * CLHEP::MeV; + G4double aE = 1 / (2. * (upper_bound_transition_MF - lower_bound_transition_MF)); + G4double E0 = (upper_bound_transition_MF + lower_bound_transition_MF) / 2.; + G4double w = G4RandFlat::shoot(); + G4double transF = 0.5 * std::tanh((Ex / A - E0) / aE) + 0.5; + + if (Ex < lower_bound_transition_MF * A) { return false; } + + if (w < transF && Ex < upper_bound_transition_MF * A) { return true; } + + if (w > transF && Ex < upper_bound_transition_MF * A) { return false; } + + if (Ex > upper_bound_transition_MF * A) { return true; } + + return false; + }; +} + +ExcitationHandler::Condition ExcitationHandler::DefaultFermiBreakUpCondition() { + return [](const G4Fragment& fragment) { + return AAMCCFermiBreakUp::IsFermiPossible(fragment.GetZ_asInt(), + fragment.GetA_asInt(), + fragment.GetExcitationEnergy()); + }; +} + +ExcitationHandler::Condition ExcitationHandler::DefaultEvaporationCondition() { + return [](const G4Fragment&) { return true; }; +} + +ExcitationHandler::Condition ExcitationHandler::DefaultPhotonEvaporationCondition() { + return [](const G4Fragment&) { return true; }; +} + +bool ExcitationHandler::IsGroundState(const G4Fragment& fragment) const { + return fragment.GetExcitationEnergy() < stable_threshold_; +} + +bool ExcitationHandler::IsStable(const G4Fragment& fragment, const G4NistManager* nist) const { + return fragment.GetA_asInt() <= 1 + || (IsGroundState(fragment) && nist->GetIsotopeAbundance(fragment.GetZ_asInt(), fragment.GetA_asInt()) > 0); +} + +void ExcitationHandler::ApplyMultiFragmentation(std::unique_ptr fragment, + G4FragmentVector& results, + std::queue& next_stage) { + auto fragments = std::unique_ptr(multi_fragmentation_model_->BreakItUp(*fragment)); + if (fragments == nullptr || fragments->size() <= 1) { + next_stage.push(fragment.release()); + return; + } + + GroupFragments(*fragments, results, next_stage); +} + +void ExcitationHandler::ApplyFermiBreakUp(std::unique_ptr fragment, + G4FragmentVector& results, + std::queue& next_stage) { + G4FragmentVector fragments; + fermi_break_up_model_->BreakFragment(&fragments, fragment.get()); + // auto fragments = std::unique_ptr(fermi_break_up_model_->BreakItUp(fragment.get())) + + if (fragments.size() == 1) { + next_stage.emplace(fragment.release()); + return; + } + + GroupFragments(fragments, results, next_stage); +} + +void ExcitationHandler::ApplyEvaporation(std::unique_ptr fragment, + G4FragmentVector& results, + std::queue& next_stage) { + G4FragmentVector fragments; + evaporation_model_->BreakFragment(&fragments, fragment.get()); + // auto fragments = std::unique_ptr(evaporation_model_->BreakItUp(fragment.get())) + + /// because evaporation adjusts it + auto fragment_ptr = fragment.release(); + if (fragments.empty() || fragments.back() != fragment_ptr) { + fragments.emplace_back(fragment_ptr); + } + + if (fragments.size() == 1) { + results.emplace_back(fragment_ptr); + return; + } + + GroupFragments(fragments, results, next_stage); +} + +void ExcitationHandler::ApplyPhotonEvaporation(std::unique_ptr fragment, G4FragmentVector& results) { + /// photon de-excitation only for hot fragments + if (!IsGroundState(*fragment)) { + G4FragmentVector fragments; + + evaporation_model_->GetPhotonEvaporation()->BreakUpChain(&fragments, fragment.get()); + + for (auto fragment_ptr : fragments) { + results.emplace_back(fragment_ptr); + } + } + + /// primary fragment is kept + results.emplace_back(fragment.release()); +} + +void ExcitationHandler::GroupFragments(const G4FragmentVector& fragments, + G4FragmentVector& results, + std::queue& next_stage) { + auto nist = G4NistManager::Instance(); + + for (auto fragment_ptr : fragments) { /// fragment pointers is moved to unique and will be deleted later + /// gamma, p, n or stable nuclei + if (IsStable(*fragment_ptr, nist)) { + results.emplace_back(fragment_ptr); + } else { + next_stage.emplace(fragment_ptr); + } + } +} + +constexpr G4int HashParticle(G4int A, G4int Z) { return A * 1000 + Z; } + +G4ParticleDefinition* ExcitationHandler::SpecialParticleDefinition(const G4Fragment& fragment) { + switch (HashParticle(fragment.GetA_asInt(), fragment.GetZ_asInt())) { + case HashParticle(0, 0): { + return G4Gamma::GammaDefinition(); + } + + case HashParticle(0, -1): { + return G4Electron::ElectronDefinition(); + } + + case HashParticle(-1, 1): { + return G4PionPlus::PionPlus(); + } + + case HashParticle(-1, -1): { + return G4PionMinus::PionMinus(); + } + + case HashParticle(-1, 0): { + return G4PionZero::PionZero(); + } + + case HashParticle(1, 0): { + return G4Neutron::NeutronDefinition(); + } + + case HashParticle(1, 1): { + return G4Proton::ProtonDefinition(); + } + + case HashParticle(2, 1): { + return G4Deuteron::DeuteronDefinition(); + } + + case HashParticle(3, 1): { + return G4Triton::TritonDefinition(); + } + + case HashParticle(3, 2): { + return G4He3::He3Definition(); + } + + case HashParticle(4, 2): { + return G4Alpha::AlphaDefinition(); + } + } + + return nullptr; +} + +std::vector ExcitationHandler::ConvertResults(const G4FragmentVector& results) { + std::vector reaction_products; + reaction_products.reserve(results.size()); + auto ion_table = G4ParticleTable::GetParticleTable()->GetIonTable(); + + for (auto& fragment_ptr : results) { + auto fragment_definition = SpecialParticleDefinition(*fragment_ptr); + if (fragment_definition == nullptr) { + auto excitation_energy = fragment_ptr->GetExcitationEnergy(); + auto level = fragment_ptr->GetFloatingLevelNumber(); + if (IsGroundState(*fragment_ptr)) { + excitation_energy = 0; + level = 0; + } + fragment_definition = ion_table->GetIon(fragment_ptr->GetZ_asInt(), fragment_ptr->GetA_asInt(), + excitation_energy, G4Ions::FloatLevelBase(level)); + } + /// fragment wasn't found, ground state is created + if (fragment_definition == nullptr) { + fragment_definition = ion_table->GetIon(fragment_ptr->GetZ_asInt(), fragment_ptr->GetA_asInt(), 0, noFloat, 0); + if (fragment_definition == nullptr) { + throw std::runtime_error("ion table isn't created"); + } + G4double ion_mass = fragment_definition->GetPDGMass(); + if (fragment_ptr->GetMomentum().e() <= ion_mass) { + fragment_ptr->SetMomentum(G4LorentzVector(ion_mass)); + } else { + auto momentum = fragment_ptr->GetMomentum(); + G4double momentum_modulus = std::sqrt((momentum.e() - ion_mass) * (momentum.e() + ion_mass)); + momentum.setVect(momentum.vect().unit() * momentum_modulus); + fragment_ptr->SetMomentum(momentum); + } + } + + reaction_products.emplace_back(fragment_definition); + reaction_products.back().SetMomentum(fragment_ptr->GetMomentum().vect()); + reaction_products.back().SetTotalEnergy((fragment_ptr->GetMomentum()).e()); + reaction_products.back().SetFormationTime(fragment_ptr->GetCreationTime()); + } + + return reaction_products; +} + +void ExcitationHandler::EvaporationError(const G4Fragment& fragment, const G4Fragment& current_fragment, size_t iter) { + G4ExceptionDescription ed; + ed << "Infinite loop in the de-excitation module: " << iter + << " iterations \n" + << " Initial fragment: \n" << fragment + << "\n Current fragment: \n" << current_fragment; + G4Exception("ExcitationHandler::BreakItUp", "", FatalException, + ed, "Stop execution"); +} diff --git a/src/G4ExcitationHandler.cc b/src/G4ExcitationHandler.cc deleted file mode 100644 index 905311d..0000000 --- a/src/G4ExcitationHandler.cc +++ /dev/null @@ -1,554 +0,0 @@ -// -// ******************************************************************** -// * License and Disclaimer * -// * * -// * The Geant4 software is copyright of the Copyright Holders of * -// * the Geant4 Collaboration. It is provided under the terms and * -// * conditions of the Geant4 Software License, included in the file * -// * LICENSE and available at http://cern.ch/geant4/license . These * -// * include a list of copyright holders. * -// * * -// * Neither the authors of this software system, nor their employing * -// * institutes,nor the agencies providing financial support for this * -// * work make any representation or warranty, express or implied, * -// * regarding this software system or assume any liability for its * -// * use. Please see the license in the file LICENSE and URL above * -// * for the full disclaimer and the limitation of liability. * -// * * -// * This code implementation is the result of the scientific and * -// * technical work of the GEANT4 collaboration. * -// * By using, copying, modifying or distributing the software (or * -// * any work based on the software) you agree to acknowledge its * -// * use in resulting scientific publications, and indicate your * -// * acceptance of all terms of the Geant4 Software license. * -// ******************************************************************** -// -// -// Hadronic Process: Nuclear De-excitations -// by V. Lara (May 1998) -// -// -// Modified: -// 30 June 1998 by V. Lara: -// -Modified the Transform method for use G4ParticleTable and -// therefore G4IonTable. It makes possible to convert all kind -// of fragments (G4Fragment) produced in deexcitation to -// G4DynamicParticle -// -It uses default algorithms for: -// Evaporation: G4Evaporation -// MultiFragmentation: G4StatMF -// Fermi Breakup model: G4FermiBreakUp -// 24 Jul 2008 by M. A. Cortes Giraldo: -// -Max Z,A for Fermi Break-Up turns to 9,17 by default -// -BreakItUp() reorganised and bug in Evaporation loop fixed -// -Transform() optimised -// (September 2008) by J. M. Quesada. External choices have been added for : -// -inverse cross section option (default OPTxs=3) -// -superimposed Coulomb barrier (if useSICB is set true, by default it is false) -// September 2009 by J. M. Quesada: -// -according to Igor Pshenichnov, SMM will be applied (just in case) only once. -// 27 Nov 2009 by V.Ivanchenko: -// -cleanup the logic, reduce number internal vectors, fixed memory leak. -// 11 May 2010 by V.Ivanchenko: -// -FermiBreakUp activated, used integer Z and A, used BreakUpFragment method for -// final photon deexcitation; used check on adundance of a fragment, decay -// unstable fragments with A <5 -// 22 March 2011 by V.Ivanchenko: general cleanup and addition of a condition: -// products of Fermi Break Up cannot be further deexcited by this model -// 30 March 2011 by V.Ivanchenko removed private inline methods, moved Set methods -// to the source -// 23 January 2012 by V.Ivanchenko general cleanup including destruction of -// objects, propagate G4PhotonEvaporation pointer to G4Evaporation class and -// not delete it here - -#include "G4ExcitationHandler.hh" -#include "G4SystemOfUnits.hh" -#include "G4LorentzVector.hh" -#include "G4NistManager.hh" -#include "G4ParticleTable.hh" -#include "G4ParticleTypes.hh" -#include "G4Ions.hh" -#include "G4Electron.hh" - -#include "G4VMultiFragmentation.hh" -#include "G4VFermiBreakUp.hh" -#include "G4FermiFragmentsPoolVI.hh" - -#include "../Evaporation/include/G4VEvaporation.hh" -#include "../Evaporation/include/G4VEvaporationChannel.hh" -#include "../Evaporation/include/G4Evaporation.hh" -#include "G4PhotonEvaporation.hh" -#include "G4StatMF.hh" -#include "G4FermiBreakUpVI.hh" -#include "G4NuclearLevelData.hh" -#include "../FermiBreakUp/G4FermiBreakUp.hh" -#include "G4Pow.hh" -#include - -G4ExcitationHandler::G4ExcitationHandler() - : maxZForFermiBreakUp(9),maxAForFermiBreakUp(19), - fVerbose(0),isInitialised(false),isEvapLocal(true) -{ - theTableOfIons = G4ParticleTable::GetParticleTable()->GetIonTable(); - nist = G4NistManager::Instance(); - - theMultiFragmentation = nullptr; - theFermiModel = nullptr; - theFermiModel_old = nullptr; - G4Pow::GetInstance(); - theEvaporation = new G4Evaporation(); - thePhotonEvaporation = theEvaporation->GetPhotonEvaporation(); - theResults.reserve(60); - results.reserve(30); - theEvapList.reserve(30); - thePhotoEvapList.reserve(10); - SetParameters(); - electron = G4Electron::Electron(); - - if(fVerbose > 1) { G4cout << "### New handler " << this << G4endl; } -} - -G4ExcitationHandler::~G4ExcitationHandler() -{ - //G4cout << "### Delete handler " << this << G4endl; - delete theMultiFragmentation; - delete theFermiModel; - if(isEvapLocal) { delete theEvaporation; } - delete theFermiModel_old; -} - -void G4ExcitationHandler::SetParameters() -{ - G4DeexPrecoParameters* param = - G4NuclearLevelData::GetInstance()->GetParameters(); - isActive = true; - if(fDummy == param->GetDeexChannelsType()) { isActive = false; } - minEForMultiFrag = param->GetMinExPerNucleounForMF(); - minExcitation = param->GetMinExcitation(); - icID = param->GetInternalConversionID(); - if(isActive) { - if(!thePhotonEvaporation) { - SetPhotonEvaporation(new G4PhotonEvaporation()); - } - if(!theFermiModel) { SetFermiModel(new G4FermiBreakUpVI()); } - if(!theFermiModel_old) { SetFermiModel_old(new G4FermiBreakUp()); } - if(!theMultiFragmentation) { SetMultiFragmentation(new G4StatMF()); } - } -} - -void G4ExcitationHandler::Initialise() -{ - if(isInitialised) { return; } - if(fVerbose > 0) { - G4cout << "G4ExcitationHandler::Initialise() started " << this << G4endl; - } - G4DeexPrecoParameters* param = - G4NuclearLevelData::GetInstance()->GetParameters(); - isInitialised = true; - SetParameters(); - if(isActive) { - theFermiModel->Initialise(); - SetDeexChannelsType(fEvaporation); - } - if(G4Threading::IsMasterThread() && false) { - G4cout << "Number of de-excitation channels in G4Evaporation is: " - << theEvaporation->GetNumberOfChannels(); - } - G4cout << G4endl; -} - -void G4ExcitationHandler::SetMultiFragmentation(G4VMultiFragmentation* ptr) -{ - if(ptr && ptr != theMultiFragmentation) { - delete theMultiFragmentation; - theMultiFragmentation = ptr; - } -} - -void G4ExcitationHandler::SetFermiModel(G4VFermiBreakUp* ptr) -{ - if(ptr && ptr != theFermiModel) { - delete theFermiModel; - theFermiModel = ptr; - theEvaporation->SetFermiBreakUp(theFermiModel); - } -} - -void G4ExcitationHandler::SetFermiModel_old(VFermiBreakUp* ptr) -{ - if(ptr && ptr != theFermiModel_old){ - delete theFermiModel_old; - theFermiModel_old = ptr; - } -} - -void G4ExcitationHandler::SetPhotonEvaporation(G4VEvaporationChannel* ptr) -{ - if(ptr && ptr != thePhotonEvaporation) { - thePhotonEvaporation = ptr; - theEvaporation->SetPhotonEvaporation(ptr); - thePhotonEvaporation = theEvaporation->GetPhotonEvaporation(); - } -} - -void G4ExcitationHandler::SetDeexChannelsType(G4DeexChannelType val) -{ - G4Evaporation* evap = static_cast(theEvaporation); - if(val == fDummy) { - isActive = false; - return; - } - if(!evap) { return; } - if(val == fEvaporation) { - evap->SetDefaultChannel(); - } else if(val == fCombined) { - evap->SetCombinedChannel(); - } else if(val == fGEM) { - evap->SetGEMChannel(); - } - evap->InitialiseChannels(); -} - -G4bool G4ExcitationHandler::isMulti(G4double A, G4double Z, G4double Ex) { - if(A < maxAForFermiBreakUp && Z < maxZForFermiBreakUp){return false;} - G4double lowBoundTransitionForMF = 3*MeV; - G4double upBoundTransitionForMF = 5*MeV; - G4double aE = 1/(2.*(upBoundTransitionForMF - lowBoundTransitionForMF)); - G4double E0 = (upBoundTransitionForMF + lowBoundTransitionForMF)/2.; - G4double w = G4RandFlat::shoot(); - G4double transF = 0.5*tanh((Ex/A - E0)/aE) + 0.5; - if (Ex < lowBoundTransitionForMF*A) {return false;} - else if (w < transF && Ex < upBoundTransitionForMF*A){return true;} - else if (w > transF && Ex < upBoundTransitionForMF*A){return false;} - else if (Ex > upBoundTransitionForMF*A) {return true;} - else {return false;} -} - - -G4ReactionProductVector * G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState){ - // Variables existing until end of method - G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState); - if(!isInitialised) { Initialise(); } - // pointer to fragment vector which receives temporal results - G4FragmentVector * theTempResult = nullptr; - - theResults.clear(); - thePhotoEvapList.clear(); - theEvapList.clear(); - - // Variables to describe the excited configuration - G4double exEnergy = theInitialState.GetExcitationEnergy(); - G4int A = theInitialState.GetA_asInt(); - G4int Z = theInitialState.GetZ_asInt(); - - // In case A <= 1 the fragment will not perform any nucleon emission - if (A <= 1 || !isActive) { - theResults.push_back( theInitialStatePtr ); - // check if a fragment is stable - } else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0) { - theResults.push_back( theInitialStatePtr ); - // JMQ 150909: first step in de-excitation is treated separately - // Fragments after the first step are stored in theEvapList - } else { - if(!isMulti(A, Z, exEnergy)) { - theEvapList.push_back(theInitialStatePtr); // To Evaporation or FermiBreakUp - // Statistical Multifragmentation will take place only once - } else { - theTempResult = theMultiFragmentation->BreakItUp(theInitialState); - if(!theTempResult) { - theEvapList.push_back(theInitialStatePtr); - } else { - size_t nsec = theTempResult->size(); - - // no fragmentation - if(0 == nsec) { - theEvapList.push_back(theInitialStatePtr); - // secondary are produced - sort out secondary fragments - } else { - G4bool deletePrimary = true; - G4FragmentVector::iterator j; - for (j = theTempResult->begin(); j != theTempResult->end(); ++j) { - if((*j) == theInitialStatePtr) { deletePrimary = false; } - A = (*j)->GetA_asInt(); - - // gamma, p, n - if(A <= 1) { - theResults.push_back(*j); - // Analyse fragment A > 1 - } else { - G4double exEnergyFrag = (*j)->GetExcitationEnergy(); - // cold fragments - if(exEnergyFrag < minExcitation) { - Z = (*j)->GetZ_asInt(); - if(nist->GetIsotopeAbundance(Z, A) > 0.0) { - theResults.push_back(*j); // stable fragment - } else { - theEvapList.push_back(*j); - } - // hot fragments are unstable - } else { - theEvapList.push_back(*j); - } - } - } - if( deletePrimary ) { delete theInitialStatePtr; } - } - delete theTempResult; // end multifragmentation - } - } - } - if(fVerbose > 2) { - G4cout << "## After first step " << theEvapList.size() << " for evap; " - << thePhotoEvapList.size() << " for photo-evap; " - << theResults.size() << " results. " << G4endl; - } - // ----------------------------------- - // FermiBreakUp and De-excitation loop - // ----------------------------------- - - static const G4int countmax = 1000; - G4Fragment* frag; - size_t kk; - for (kk=0; kk= countmax) { - G4ExceptionDescription ed; - ed << "Infinite loop in the de-excitation module: " << kk - << " iterations \n" - << " Initial fragment: \n" << theInitialState - << "\n Current fragment: \n" << *frag; - G4Exception("G4ExcitationHandler::BreakItUp","had0333",FatalException, - ed,"Stop execution"); - } - A = frag->GetA_asInt(); - Z = frag->GetZ_asInt(); - results.clear(); - - // ----------------------- - // Fermi break-up - // ----------------------- - if(A < maxAForFermiBreakUp && Z < maxZForFermiBreakUp && A > 0) { - G4Fragment theExcitedNucleus = *frag; - theTempResult = theFermiModel_old->BreakItUp(theExcitedNucleus); - for (G4FragmentVector::iterator j = theTempResult->begin(); j != theTempResult->end(); j++){ - G4int A = (*j)->GetA_asInt(); - // gamma, e-, p, n - if(A <= 1) { - theResults.push_back(*j); - } else if ((*j)->GetExcitationEnergy() < minExcitation){ - G4int Z = (*j)->GetZ_asInt(); - if(nist->GetIsotopeAbundance(Z, A) > 0.0) { - theResults.push_back(*j); - } - else { - thePhotoEvapList.push_back(*j); - } - } else { - thePhotoEvapList.push_back(*j); - } - } - theTempResult->clear(); - theTempResult = NULL; - continue; - } - // apply Evaporation, residual nucleus is always added to the results - theEvaporation->BreakFragment(&results, frag); - size_t nsec = results.size(); - - // no evaporation - if(1 >= nsec) { - theResults.push_back(frag); - continue; - } - - // Sort out secondary fragments - for (size_t j = 0; jGetA_asInt(); - if(A <= 1) { - theResults.push_back(results[j]); // gamma, p, n - continue; - } - exEnergy = results[j]->GetExcitationEnergy(); - - // hot fragment - if(exEnergy >= minExcitation) { - theEvapList.push_back(results[j]); - // cold fragment - } else { - Z = results[j]->GetZ_asInt(); - - // natural isotope - if(nist->GetIsotopeAbundance(Z, A) > 0.0) { - theResults.push_back(results[j]); // stable fragment - - } else { - theEvapList.push_back(results[j]); - } - } - } // end of loop on secondary - } // end of the loop over theEvapList - if(fVerbose > 2) { - G4cout << "## After 2nd step " << theEvapList.size() << " was evap; " - << thePhotoEvapList.size() << " for photo-evap; " - << theResults.size() << " results. " << G4endl; - } - // ----------------------- - // Photon-Evaporation loop - // ----------------------- - - // at this point only photon evaporation is possible - size_t kkmax = thePhotoEvapList.size(); - for (kk=0; kk 2) { - G4cout << "Next photon evaporate: " << thePhotonEvaporation << G4endl; - G4cout << *frag << G4endl; - } - exEnergy = frag->GetExcitationEnergy(); - // photon de-excitation only for hot fragments - if(exEnergy > minExcitation) { - thePhotonEvaporation->BreakUpChain(&theResults, frag); - } - - // primary fragment is kept - theResults.push_back(frag); - } // end of photon-evaporation loop - if(fVerbose > 2) { - G4cout << "## After 3d step " << theEvapList.size() << " was evap; " - << thePhotoEvapList.size() << " was photo-evap; " - << theResults.size() << " results. " << G4endl; - } - G4ReactionProductVector * theReactionProductVector = - new G4ReactionProductVector(); - - // MAC (24/07/08) - // To optimise the storing speed, we reserve space in memory for the vector - theReactionProductVector->reserve( theResults.size() ); - - G4int theFragmentA, theFragmentZ; - - if(fVerbose > 1) { - G4cout << "### ExcitationHandler provides " << theResults.size() - << " evaporated products:" << G4endl; - } - kkmax = theResults.size(); - for (kk=0; kkGetGroundStateMass(); - G4double ptot = (frag->GetMomentum()).vect().mag(); - G4double etot = (frag->GetMomentum()).e(); - G4double fac = (etot <= mass || 0.0 == ptot) ? 0.0 - : std::sqrt((etot - mass)*(etot + mass))/ptot; - G4LorentzVector lv((frag->GetMomentum()).px()*fac, - (frag->GetMomentum()).py()*fac, - (frag->GetMomentum()).pz()*fac, etot); - frag->SetMomentum(lv); - } - if(fVerbose > 1) { - G4cout << kk << "-th fragment " << frag; - if(frag->NuclearPolarization()) { - G4cout << " " << frag->NuclearPolarization(); - } - G4cout << G4endl; - G4cout << *frag << G4endl; - } - - theFragmentA = frag->GetA_asInt(); - theFragmentZ = frag->GetZ_asInt(); - G4double etot= frag->GetMomentum().e(); - G4double eexc = 0.0; - const G4ParticleDefinition* theKindOfFragment = nullptr; - if (theFragmentA == 0 && theFragmentZ == 0) { // photon - theKindOfFragment = G4Gamma::GammaDefinition(); - } else if (theFragmentA == 0 && theFragmentZ == -1) { // electron - theKindOfFragment = G4Electron::ElectronDefinition(); - } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron - theKindOfFragment = G4Neutron::NeutronDefinition(); - } else if (theFragmentA == 1 && theFragmentZ == 1) { // proton - theKindOfFragment = G4Proton::ProtonDefinition(); - } else if (theFragmentA == 2 && theFragmentZ == 1) { // deuteron - theKindOfFragment = G4Deuteron::DeuteronDefinition(); - } else if (theFragmentA == 3 && theFragmentZ == 1) { // triton - theKindOfFragment = G4Triton::TritonDefinition(); - } else if (theFragmentA == 3 && theFragmentZ == 2) { // helium3 - theKindOfFragment = G4He3::He3Definition(); - } else if (theFragmentA == 4 && theFragmentZ == 2) { // alpha - theKindOfFragment = G4Alpha::AlphaDefinition();; - } else { - // fragment - eexc = frag->GetExcitationEnergy(); - G4int idxf = frag->GetFloatingLevelNumber(); - if(eexc < minExcitation) { - eexc = 0.0; - idxf = 0; - } - - theKindOfFragment = theTableOfIons->GetIon(theFragmentZ,theFragmentA,eexc, - G4Ions::FloatLevelBase(idxf)); - if(fVerbose > 1) { - G4cout << "### EXCH: Find ion Z= " << theFragmentZ << " A= " << theFragmentA - << " Eexc(MeV)= " << eexc/MeV << " idx= " << idxf - << " " << theKindOfFragment << G4endl; - } - } - // fragment identified - if(theKindOfFragment) { - G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment); - theNew->SetMomentum(frag->GetMomentum().vect()); - theNew->SetTotalEnergy(etot); - theNew->SetFormationTime(frag->GetCreationTime()); - if(theKindOfFragment == electron) { theNew->SetCreatorModel(icID); } - theReactionProductVector->push_back(theNew); - - // fragment not found out ground state is created - } else { - theKindOfFragment = theTableOfIons->GetIon(theFragmentZ,theFragmentA,0.0,noFloat,0); - if(theKindOfFragment) { - G4ThreeVector mom(0.0,0.0,0.0); - G4double ionmass = theKindOfFragment->GetPDGMass(); - if(etot <= ionmass) { - etot = ionmass; - } else { - G4double ptot = std::sqrt((etot - ionmass)*(etot + ionmass)); - mom = (frag->GetMomentum().vect().unit())*ptot; - } - G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment); - theNew->SetMomentum(mom); - theNew->SetTotalEnergy(etot); - theNew->SetFormationTime(frag->GetCreationTime()); - theReactionProductVector->push_back(theNew); - if(fVerbose > 2) { - G4cout << "### Find ion Z= " << theFragmentZ << " A= " << theFragmentA - << " ground state, energy corrected E(MeV)= " << etot << G4endl; - } - } - } - delete frag; - if(fVerbose > 1) { G4cout << "G4Fragment #" << kk << " is deleted" << G4endl; } - } - if(fVerbose > 2) { - G4cout << "@@@@@@@@@@ End G4Excitation Handler "<< G4endl; - } - return theReactionProductVector; -} - -void G4ExcitationHandler::ModelDescription(std::ostream& outFile) const -{ - outFile << "G4ExcitationHandler description\n" - << "This class samples de-excitation of excited nucleus using\n" - << "Fermi Break-up model for light fragments (Z < 9, A < 17), " - << "evaporation, fission, and photo-evaporation models. Evaporated\n" - << "particle may be proton, neutron, and other light fragment \n" - << "(Z < 13, A < 29). During photon evaporation produced gamma \n" - << "or electrons due to internal conversion \n"; -} - - - - - -