GENIEGenerator
Loading...
Searching...
No Matches
INukeOsetTable.h
Go to the documentation of this file.
1/**
2 * @brief Table-based implementation of Oset model
3 *
4 * @author Tomasz Golan
5 * @date 2015
6 * @warning Applicable for pion with Tk < 350 MeV
7 * @remarks
8 * Tables taken from NuWro's implementation of:
9 * E. Oset et al., Nucl. Phys. A484 (1988) 557-592
10 *
11 * This implementation is kept from historical reasons.
12 * Due to different approach to cascade in GENIE and NuWro there are some normalization issues.
13 * Default Oset model can be found in INukeOsetFormula
14 *
15*/
16
17#ifndef INUKE_OSET_TABLE_H
18#define INUKE_OSET_TABLE_H
19
20#include "INukeOset.h"
21#include <vector>
22#include <string>
23
24// handle tables with Oset cross sections
26{
27 public:
28
29 //! constructor
30 INukeOsetTable (const char* filename);
31
32 //! use to set up Oset class (assign pion Tk, nuclear density etc)
33 void setupOset (const double &density, const double &pionTk, const int &pionPDG, const double &protonFraction);
34
35 private:
36
37 //! quasi-elastic piN cross section
38 /*! vector contains values in the following order:
39 * d0 e0, d0 e1, ... , d0 en, d1 e0 ... \n
40 * channel = 0 -> pi+n or pi-p, 1 -> pi+p or pi-n, 2 -> pi0
41 */
42 std::vector <double> fQelCrossSectionTable [fNChannels];
43
44 //! charge-exchange piN cross section
45 /*! vector contains values in the following order:
46 * d0 e0, d0 e1, ... , d0 en, d1 e0 ... \n
47 * channel = 0 -> pi+n or pi-p, 1 -> pi+p or pi-n, 2 -> pi0
48 */
49 std::vector <double> fCexCrossSectionTable [fNChannels];
50
51 //! pi absorption cross section
52 /*! vector contains values in the following order:
53 * d0 e0, d0 e1, ... , d0 en, d1 e0 ...
54 */
55 std::vector <double> fAbsorptionCrossSectionTable;
56
57 unsigned int fNDensityBins; //!< number of denisty bins
58 unsigned int fNEnergyBins; //!< number of energy bins
59 double fDensityBinWidth; //!< density step (must be fixed)
60 double fEnergyBinWidth; //!< energy step (must be fixed)
61
62 //! interpolate cross section (method fixed for Oset tables)
63 double interpolate (const std::vector<double> &data) const;
64
65 //! process single line from table file, push values to proper vector (method fixed for Oset tables)
66 int processLine (const std::string &line);
67
68 //! check if data in file is consistent (method fixed for Oset tables)
69 int checkIntegrity (const double &densityValue, const double &energyValue);
70
71 //! stop program and through an error if input file is corrupted (method fixed for Oset tables)
72 void badFile (const char* file, const int &errorCode, const int &line = 0) const;
73
74 //! calculalte cross sections for each channel
75 void setCrossSections ();
76
77 //! handle table's index and weights for given density and energy
79 {
80 double value; //!< exact value as read from table
81 double lowWeight; //!< distance from high boundary
82 double highWeight; //!< distance from low boundary
83 int index; //!< point index = index of low boundary
84 double binWidth; //!< bin width used to calculate distances
85 int nBins; //!< nBins to check isEdge
86 bool isEdge; //!< true if value is on edge of table (should never happen)
87
88 PointHandler () : value (-1.0) {}; //!< constructor
89
90 //! set up binWidth and nBins
91 inline void setHandler (const double &width, const int &bins)
92 {
93 binWidth = width;
94 nBins = bins;
95 }
96
97 void update (const double &newValue); //!< update point if changed
98 };
99
100 PointHandler fDensityHandler; //!< nuclear density handler
101 PointHandler fEnergyHandler; //!< pion kinetic energy handler
102};
103
104#endif // INUKE_OSET_TABLE_H
unsigned int fNDensityBins
number of denisty bins
void badFile(const char *file, const int &errorCode, const int &line=0) const
stop program and through an error if input file is corrupted (method fixed for Oset tables)
int processLine(const std::string &line)
process single line from table file, push values to proper vector (method fixed for Oset tables)
double interpolate(const std::vector< double > &data) const
interpolate cross section (method fixed for Oset tables)
unsigned int fNEnergyBins
number of energy bins
void setCrossSections()
calculalte cross sections for each channel
double fDensityBinWidth
density step (must be fixed)
INukeOsetTable(const char *filename)
constructor
PointHandler fEnergyHandler
pion kinetic energy handler
double fEnergyBinWidth
energy step (must be fixed)
std::vector< double > fQelCrossSectionTable[fNChannels]
quasi-elastic piN cross section
std::vector< double > fAbsorptionCrossSectionTable
pi absorption cross section
int checkIntegrity(const double &densityValue, const double &energyValue)
check if data in file is consistent (method fixed for Oset tables)
std::vector< double > fCexCrossSectionTable[fNChannels]
charge-exchange piN cross section
void setupOset(const double &density, const double &pionTk, const int &pionPDG, const double &protonFraction)
use to set up Oset class (assign pion Tk, nuclear density etc)
PointHandler fDensityHandler
nuclear density handler
INukeOset()
contructor
Definition INukeOset.cxx:8
static const unsigned int fNChannels
number of possible channels: pi+n, pi+p, pi0
Definition INukeOset.h:81
handle table's index and weights for given density and energy
double binWidth
bin width used to calculate distances
void setHandler(const double &width, const int &bins)
constructor
int nBins
nBins to check isEdge
bool isEdge
true if value is on edge of table (should never happen)
double value
exact value as read from table
double lowWeight
distance from high boundary
double highWeight
distance from low boundary
int index
point index = index of low boundary
void update(const double &newValue)
update point if changed