Files
geant4/source/processes/hadronic/models/nudex/include/private/G4NuDEXStatisticalNucleus.hh
2024-06-28 13:08:51 +02:00

264 lines
12 KiB
C++

//
// ********************************************************************
// * 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. *
// ********************************************************************
//
//
// -------------------------------------------------------------------
//
// Author: E.Mendoza
//
// Creation date: May 2024
//
// Modifications:
//
// -------------------------------------------------------------------
//
// NuDEX code (https://doi.org/10.1016/j.nima.2022.167894)
//
#ifndef NUDEXSTATISTICALNUCLEUS_HH
#define NUDEXSTATISTICALNUCLEUS_HH 1
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include "G4NuDEXRandom.hh"
class G4NuDEXLevelDensity;
class G4NuDEXInternalConversion;
class G4NuDEXPSF;
//This define remains:
//#define GENERATEEXPLICITLYALLLEVELSCHEME 1
//Class to obtain the level density for each excitation energy, spin, and parity
//All energies in MeV, all times in s
//Some of the class methods could be functions out of the class
struct Level{
G4double Energy;
G4int spinx2;
G4bool parity; //true/false --> positive,negative
unsigned int seed;
G4int KnownLevelID;
G4int NLevels;
G4double Width;
};
//multipolarity of a transition is ...,-2,-1,0,1,2,... --> ...,M2,M1,Unk,E1,E2,...
struct KnownLevel{
G4int id;
G4double Energy;
G4int spinx2;
G4bool parity; //true/false --> positive,negative
G4double T12; //half life - seconds
G4int Ndecays;
G4double* decayFraction;
std::string* decayMode;
G4int NGammas;
G4int *FinalLevelID,*multipolarity;
G4double *Eg,*cumulPtot,*Pg,*Pe,*Icc;
};
G4int ComparisonLevels(const void* va, const void* vb);
void CopyLevel(Level* a,Level* b);
void CopyLevel(KnownLevel* a,Level* b);
class G4NuDEXStatisticalNucleus{
public:
G4NuDEXStatisticalNucleus(G4int Z,G4int A);
~G4NuDEXStatisticalNucleus();
public:
//Initialize everything. All the required files should be in dirname.
//some of the data could also be in inputfname
G4int Init(const char* dirname,const char* inputfname=0);
//If InitialLevel==-1 then we start from the thermal capture level
//If ExcitationEnergy>0 then is the excitation energy of the nucleus
//If ExcitationEnergy<0 then is a capture reaction of a neutron with energy -ExcitationEnergy (MeV)
G4int GenerateCascade(G4int InitialLevel,G4double ExcitationEnergy,std::vector<char>& pType,std::vector<double>& pEnergy,std::vector<double>& pTime);
G4int GetClosestLevel(G4double Energy,G4int spinx2,G4bool parity); //if spinx2<0, then retrieves the closest level of any spin and parity
G4double GetLevelEnergy(G4int i_level);
void GetSnAndI0(G4double &sn,G4double &i0){sn=Sn; i0=I0;}
Level* GetLevel(G4int i_level);
void ChangeLevelSpinParityAndBR(G4int i_level,G4int newspinx2,G4bool newParity,G4int nlevels,G4double width,unsigned int seed=0); //if nlevels or width are negative they don't change. If seed (to generate the BR) is 0 it does not change.
void ChangeThermalCaptureLevelBR(G4double LevelEnergy,G4double absoluteIntensity);
void SetSomeInitalParameters(G4int LDtype=-1,G4int PSFFlag=-1,G4double MaxSpin=-1,G4int minlevelsperband=-1,G4double BandWidth_MeV=0,G4double maxExcEnergy=0,G4int BrOption=-1,G4int sampleGammaWidths=-1,unsigned int aseed1=0,unsigned int aseed2=0,unsigned int aseed3=0);
void SetInitialParameters02(G4int knownLevelsFlag=-1,G4int electronConversionFlag=-1,G4double primGamNormFactor=-1,G4double primGamEcut=-1,G4double ecrit=-1);
void SetBandWidth(G4double bandWidth){ if(bandWidth==0){bandWidth=-1;} BandWidth=bandWidth;} //So it is not re-written with the lib-params.
void SetBrOption(G4int BrOption){BROpt=BrOption;}
void SetRandom1Seed(unsigned int seed){theRandom1->SetSeed(seed); Rand1seedProvided=true;}
void SetRandom2Seed(unsigned int seed){theRandom2->SetSeed(seed); Rand2seedProvided=true;}
void SetRandom3Seed(unsigned int seed){theRandom3->SetSeed(seed); Rand3seedProvided=true;}
G4NuDEXRandom* GetRandom3(){return theRandom3;}
G4bool HasBeenInitialized(){return hasBeenInitialized;}
//-------------------------------------------------------
//Print:
void PrintAll(std::ostream &out);
void PrintParameters(std::ostream &out);
void PrintKnownLevels(std::ostream &out);
void PrintLevelDensity(std::ostream &out);
void PrintLevelScheme(std::ostream &out);
void PrintThermalPrimaryTransitions(std::ostream &out);
void PrintPSF(std::ostream &out);
void PrintICC(std::ostream &out);
void PrintTotalCumulBR(G4int i_level,std::ostream &out);
void PrintBR(G4int i_level,G4double MaxExcEneToPrint_MeV,std::ostream &out);
void PrintInput01(std::ostream &out);
//----------------
void PrintKnownLevelsInDEGENformat(std::ostream &out);
void PrintLevelSchemeInDEGENformat(const char* fname,G4int MaxLevelID=-1);
//-------------------------------------------------------
private:
//-------------------------------------------------------
//Used by Init():
//Read different data from files (do it in this order). If returnval<0 --> error reading file or nucleus not present in the file:
G4int ReadSpecialInputFile(const char* fname);
G4int ReadGeneralStatNuclParameters(const char* fname);
G4double ReadEcrit(const char* fname);
G4double ReadKnownLevels(const char* fname);
void CreateLevelScheme();
G4int InsertHighEnergyKnownLevels();
void ComputeKnownLevelsMissingBR();
void MakeSomeParameterChecks01();
//-------------------------------------------------------
G4double TakeTargetNucleiI0(const char* fname,G4int& check);
void CreateThermalCaptureLevel(unsigned int seed=0); //If seed (to generate the BR) is 0 it does not change.
void GenerateThermalCaptureLevelBR(const char* dirname);
//-------------------------------------------------------
//-------------------------------------------------------
//cascade generation:
G4double ComputeDecayIntensities(G4int i_level,G4double* cumulativeBR=0,G4double randnumber=-1,G4double TotGR=-1,G4bool AllowE1=false);
G4int SampleFinalLevel(G4int i_level,G4int& multipolarity,G4double &icc_fac,G4int nTransition);
G4int GetMultipolarity(Level* theInitialLevel,Level* theFinalLevel);
//-------------------------------------------------------
private:
//-------------------------------------------------------
//Used to create the unknown Levels:
G4int GenerateLevelsInBigRange(G4double Emin,G4double Emax,G4int spinx2,G4bool parity,Level* someLevels,G4int MaxNLevelsToFill); //salen sin ordenar
G4int GenerateLevelsInSmallRange(G4double Emin,G4double Emax,G4int spinx2,G4bool parity,Level* someLevels,G4int MaxNLevelsToFill); //salen sin ordenar
G4int GenerateWignerLevels(G4double Emin,G4double Emax,G4int spinx2,G4bool parity,Level* someLevels,G4int MaxNLevelsToFill); //salen ordenados
G4int GenerateBandLevels(G4int bandmin,G4int bandmax,G4int spinx2,G4bool parity,Level* someLevels,G4int MaxNLevelsToFill);
G4int GenerateAllUnknownLevels(Level* someLevels,G4int MaxNLevelsToFill); //salen ordenados
G4int CreateBandsFromLevels(G4int thisNLevels,Level* someLevels,G4int spinx2,G4bool parity);
G4int EstimateNumberOfLevelsToFill(); //to estimate the length of "theLevels" vector
//-------------------------------------------------------
private:
//General info:
G4int A_Int,Z_Int;
G4double Sn,D0,I0; //I0 es el del nucleo A-1 (el que captura)
G4bool hasBeenInitialized;
std::string theLibDir;
G4NuDEXRandom* theRandom1; //To generate the unknown level scheme
G4NuDEXRandom* theRandom2; //To calculate the Gamma-rho values (i.e. to generate the branching ratios)
G4NuDEXRandom* theRandom3; //To generate the cascades
unsigned int seed1,seed2,seed3;
G4bool Rand1seedProvided,Rand2seedProvided,Rand3seedProvided;
//--------------------------------------------------------------------------
//Parameters which will define how the level scheme will be created:
G4double Ecrit; //Energy between the known and unknown levels
G4double MaxExcEnergy,BandWidth;
G4int maxspinx2,NBands,MinLevelsPerBand; //maximum spin (x2) to consider, number of bands used to "rebin" the stat. part
G4int LevelDensityType; //if negative or cero, use the default one.
G4int PSFflag; // use IAEA PSF-data (PSFflag==0), use RIPL-3 data (PSFflag==1)
G4double E_unk_min,E_unk_max; //min and max energy where the statistical part will be generated
G4double Emin_bands,Emax_bands; //limites de energia para calcular las bandas de niveles
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Level scheme:
Level* theLevels; //known+unknown levels
KnownLevel* theKnownLevels; // known levels
G4int NKnownLevels,NUnknownLevels,NLevels,KnownLevelsVectorSize;
Level theThermalCaptureLevel;
G4int NLevelsBelowThermalCaptureLevel; //excluding the last one
G4int KnownLevelsFlag;
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Branching ratios:
G4int BROpt,SampleGammaWidths;
G4double* TotalGammaRho;
G4double* theThermalCaptureLevelCumulBR;
G4double** TotalCumulBR; //all BR
G4double PrimaryGammasIntensityNormFactor;
G4double PrimaryGammasEcut; //This variable can be used to avoid generating transitions close to the "Primary Gammas" region
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//LD,ICC, PSF:
G4int ElectronConversionFlag;
G4NuDEXLevelDensity* theLD;
G4NuDEXInternalConversion* theICC;
G4NuDEXPSF* thePSF;
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//for internal use, when generating the cascades:
G4int theSampledLevel,theSampledMultipolarity;
//--------------------------------------------------------------------------
};
//***************************************************************************************************************
//***************************************************************************************************************
#endif