Files
2025-12-05 08:54:02 +01:00

161 lines
5.5 KiB
C++

#ifndef IAEA_HEADER
#define IAEA_HEADER
/* *********************************************************************** */
#include "iaea_record.h"
// defines
#define SEGMENT_BEG_TOKEN '$'
#define SEGMENT_END_TOKEN ':'
#ifndef MAX_STR_LEN
#define MAX_STR_LEN 512 /* maximum length of a string */
#endif
#define MAX_NUMB_LINES 30 /* maximum number of lines in a block */
#define MAX_NUMB_EXTRALONG_TYPES 7 /* maximum number of extra long allowed */
// 0: User defined generic type
// 1: Incremental history number n_hist
// n_hist = 0 if previous primary particle scored
// n_hist > 0 indicates how many primary particle read before the current one
// 2: LATCH (EGS)
// 3: ILB5 (PENELOPE)
// 4: ILB4 (PENELOPE)
// 5: ILB3 (PENELOPE)
// 6: ILB2 (PENELOPE)
// 7: ILB1 (PENELOPE)
// more to be defined
#define MAX_NUMB_EXTRAFLOAT_TYPES 3 /* maximum number of extra float allowed */
// 0: User defined generic type
// 1: XLAST (x coord. of the last interaction)
// 2: YLAST (y coord. of the last interaction)
// 3: ZLAST (z coord. of the last interaction)
// more to be defined
struct iaea_header_type
{
FILE *fheader;
// ******************************************************************************
// 1. PHSP format
int file_type; // 0 = phsp file ; 1 = phsp generator
int byte_order; // as defined by get_byte_order routine
int record_contents[9]; // record_contents[i] = 1 or 0 (variable or constant)
// correspond to the following logical variables :
// ix,iy,iz,iu.iv,iw;
// iweight,iextrafloat,iextralong;
float record_constant[7]; // if record_contents[i<7] = 0
// then record_constant[i] contents the constant value
// extra floats and longs are always variable
// so no need to store them
// contains the keyword describing each stored extrafloat
int extrafloat_contents[NUM_EXTRA_FLOAT];
// contains the keyword describing each stored extralong
int extralong_contents[NUM_EXTRA_LONG];
int record_length;
// record_length = 1 + (particle)
// 4 + (energy)
// SUM(i=0;i<3) {record_contents[i]*4} (ix,iy,iz)
// SUM(i=3;i<6) {record_contents[i]*4} (iu,iv,iw)
// record_contents[6]*4 + (iweigth)
// record_contents[7]*4 + (iextrafloat)
// record_contents[8]*4 + (iextralong)
IAEA_I64 checksum;
// ******************************************************************************
// 2. Mandatory description of the phsp
char coordinate_system_description[MAX_STR_LEN*MAX_NUMB_LINES+1];
// Counters for phsp file
IAEA_I64 orig_histories;
IAEA_I64 nParticles;
IAEA_I64 particle_number[MAX_NUM_PARTICLES];
// Event generator input file
char input_file_for_event_generator[MAX_STR_LEN*MAX_NUMB_LINES+1];
// ******************************************************************************
// 3. Mandatory additional information
unsigned int iaea_index; // Agency ID
char title[MAX_STR_LEN*MAX_NUMB_LINES+1];
char machine_type[MAX_STR_LEN*MAX_NUMB_LINES+1];
char MC_code_and_version[MAX_STR_LEN*MAX_NUMB_LINES+1];
float global_photon_energy_cutoff;
float global_particle_energy_cutoff;
char transport_parameters[MAX_STR_LEN*MAX_NUMB_LINES+1];
// ******************************************************************************
// 4. Optional description
char beam_name[MAX_STR_LEN*MAX_NUMB_LINES+1];
char field_size[MAX_STR_LEN*MAX_NUMB_LINES+1];
char nominal_SSD[MAX_STR_LEN*MAX_NUMB_LINES+1];
char variance_reduction_techniques[MAX_STR_LEN*MAX_NUMB_LINES+1];
char initial_source_description[MAX_STR_LEN*MAX_NUMB_LINES+1];
// Documentation sub-section
char MC_input_filename[MAX_STR_LEN*MAX_NUMB_LINES+1];
// Assumed to be the preferred citation
char published_reference[MAX_STR_LEN*MAX_NUMB_LINES+1];
char authors[MAX_STR_LEN*MAX_NUMB_LINES+1];
char institution[MAX_STR_LEN*MAX_NUMB_LINES+1];
char link_validation[MAX_STR_LEN*MAX_NUMB_LINES+1];
char additional_notes[MAX_STR_LEN*MAX_NUMB_LINES+1];
// ******************************************************************************
// 5. Optional statistical information
double averageKineticEnergy[MAX_NUM_PARTICLES];
double sumParticleWeight[MAX_NUM_PARTICLES];
double maximumKineticEnergy[MAX_NUM_PARTICLES];
double minimumKineticEnergy[MAX_NUM_PARTICLES];
double minimumX, maximumX;
double minimumY, maximumY;
double minimumZ, maximumZ;
double minimumWeight[MAX_NUM_PARTICLES];
double maximumWeight[MAX_NUM_PARTICLES];
IAEA_I64 read_indep_histories;
// CLASS FUNCTIONS
public:
int read_header();
int write_header();
int print_header();
int set_record_contents(iaea_record_type *p_iaea_record);
int get_record_contents(iaea_record_type *p_iaea_record);
void initialize_counters();
void update_counters(iaea_record_type *p_iaea_record);
private:
int read_block(char *lineread, const char *blockname);
int get_block(char *lineread);
int get_blockname(char *line, const char *blockname);
int write_blockname(const char *blockname);
int check_byte_order();
void print_statistics();
};
#endif