Source code for pymchelper.readers.shieldhit.binary_spec

from enum import IntEnum


[docs]class SHBDOTagID(IntEnum): """ List of Tag ID numbers for BDO 2016 and 2019 formats. Must be synchronized with tags in sh_bdo.h and sh_detect.h in SH12A. """ # Hex values are used for better recognition in binary files, should they be inspected by humans. # Group 0x0000 - 0x00FF : Miscellaneous info shversion = 0x00 # [char*] full version string of SHIELD-HIT12A shbuilddate = 0x01 # [char*] date of build filedate = 0x02 # [char*] bdo file creation date, RFC 2822 compliant user = 0x03 # [char *] optional login name host = 0x04 # [char *] optional host where this file was created format = 0x05 # [int] optional ID describing which flavour the format is, to help .bdo parsers # Group 0xAA00 - 0xAAFF : Runtime variables rt_nstat = 0xAA00 # number of actually simulated particles rt_time = 0xAA01 # [unsigned long int] optional runtime in seconds rt_timesim = 0xAA02 # optional simulation time in seconds, excluding initialization. # Group 0xCB00 - 0xCBFF : Beam configuration jpart0 = 0xCB00 # [int] primary particle ID, in SH12A JPART terminology (32768 = INVALID) apro0 = 0xCB01 # [int] number of nucleons A of the projectile - only written if nucleons > 0 zpro0 = 0xCB02 # [int] charge Z of the projectile, may also be negative (32768 = INVALID) beamx = 0xCB03 # [float] start position of the beam - X coordinate beamy = 0xCB04 # [float] start position of the beam - Y coordinate beamz = 0xCB05 # [float] start position of the beam - Z coordinate sigmax = 0xCB06 # [float] lateral extension of the beam in X direction sigmay = 0xCB07 # [float] lateral extension of the beam in Y direction tmax0 = 0xCB08 # [float] initial projectile energy (unit depends on projectile type) sigmat0 = 0xCB09 # [float] energy spread of the primary particle beamtheta = 0xCB0A # [float] polar angle beamphi = 0xCB0B # [float] azimuth angle beamdivx = 0xCB0C # [float] beam divergence - X coordinate beamdivy = 0xCB0D # [float] beam divergence - Y coordinate beamdivk = 0xCB0E # [float] beam divergence - focus tmax0mev = 0xCB0F # [double] initial projectile energy, always in [MeV] tmax0amu = 0xCB10 # [double] initial projectile energy in [MeV/amu] - only written if mass > 1e-6 u tmax0nuc = 0xCB11 # [double] initial projectile energy in [MeV/nucl] - only written if nucleons > 0 # Group 0xCC00 - 0xCCFF : Configuration dele = 0xCC00 demin = 0xCC01 itypst = 0xCC02 itypms = 0xCC03 oln = 0xCC04 inucre = 0xCC05 iemtrans = 0xCC06 iextspec = 0xCC07 intrfast = 0xCC08 intrslow = 0xCC09 apzlscl = 0xCC0A ioffset = 0xCC0B irifimc = 0xCC0C irifitrans = 0xCC0D irifizone = 0xCC0E ext_nproj = 0xCC0F ext_ptvdose = 0xCC10 ixfirs = 0xCC11 # Group 0xCE00 - 0xCEFF : CT specific tags ct_ang = 0xCE00 # holds two doubles with the couch and gantry angle ct_icnt = 0xCE01 # holds three ct_len = 0xCE02 # holds three # Group 0xDD00 - 0xDD11 : old detect.f fortran Detector / page specific tags. See sh_detect.h det_geotyp = 0xDD00 # may differ from est_geotyp in case of spc det_nbin = 0xDD01 # idet(1-3) (len=3) number of bins x,y,z det_part = 0xDD02 # idet(4) particle type which was scored det_dtype = 0xDD03 # idet(5) detector type det_partz = 0xDD04 # idet(6) det_parta = 0xDD05 # idet(7) det_dmat = 0xDD06 # idet(8) det_nbine = 0xDD07 # idet(9) number of bins in diff scorer, negative means log binning det_difftype = 0xDD08 # idet(10) detector type for differential scorer (i.e. angle, energy, let) det_zonestart = 0xDD09 # idet(11) det_dsize = 0xDD0A # idet(12) det_dsizexyz = 0xDD0B # idet(13) det_xyz_start = 0xDD0C # det(1-3) det_xyz_stop = 0xDD0D # det(4-6) det_dif_start = 0xDD0E # det(7) det_dif_stop = 0xDD0F # det(8) det_voxvol = 0xDD10 # det(9) det_thresh = 0xDD11 # det(10) lower energy scoring threshold # Page: meta-data */ # Group 0xDD30 - 0xDDFF : page specific tags. */ detector_type = 0xDD30 # /* detector_type, this starts new page */ page_number = 0xDD31 # /* Number of this detector */ page_normalized = 0xDD32 # Flags for page->postproc on how to postprocess the data in SHBDO_PAG_DATA """ Given: - the data in page->data as x_j - for j instances of this simulation - which was done with I_j number of paritcles. The resulting data will be termed X and has the units given by SHBDO_PAG_DATA_UNIT 0: X = x_1 for GEOMAP type scorers 1: X = sum_j x_j COUNT, ... 2: X = (sum_j x_j) / (sum_j I_j) NORMCOUNT, ... 3: X = (sum_j x_j * I_j) / (sum_j I_j) LET, ... """ page_scale_factor = 0xDD33 # /* if set and != 1.0 the data set was multiplied with this factor */ page_offset = 0xDD34 # /* if set and != 0.0 the data set was offset with this value */ page_medium_transport = 0xDD35 # /* [future] ASCII-string for detector medium set in geo.dat */ page_medium_scoring = 0xDD36 # /* [future] ASCII-string for detector medium set in detect.dat scoring */ page_unit_ids = 0xDD37 # /* Unit IDs according to sh_units.h. Set for detector and the two diff. bins */ # /* page data */ data_block = 0xDDBB # /* data block, identical to SHBDO_DET_DATA */ detector_unit = 0xDDBC # /* ASCII string unit, including any differentials */ # /* Page differential data */ page_diff_flag = 0xDDD0 # /* flags if 1 or 2 differential binning was set. 1 for set, -1 for set as log10. */ page_diff_type = 0xDDD1 # /* array holding 1 or 2 number of bins, for type of differential */ page_diff_start = 0xDDD2 # /* array holding 1 or 2 lower bounds, for 1-D or 2-D respectively */ page_diff_stop = 0xDDD3 # /* array holding 1 or 2 upper bounds, for 1-D or 2-D respectively */ page_diff_size = 0xDDD4 # /* array holding 1 or 2 number of bins, for 1-D or 2-D respectively */ page_diff_units = 0xDDD5 # /* ASCII string of ;-separated units along each dimension. %s;%s;%s where latter # two %s are the differential units, and the first is the data in # non-differential form. */ # /* Filter data attached to page */ page_filter_name = 0xDDF0 # /* name of filter containing one or more rules */ page_filter_rules_no = 0xDDF1 # /* number of filter rules applied */ page_filter_e_min = 0xDDF2 # /* lower energy threshold, emin */ page_filter_emax = 0xDDF3 # /* upper energy threshold, emin */ # Group 0xEE00 - 0xEEFF : Estimator specific tags # Geometry, as in gE0metry geometry_type = 0xE000 # geometry type ID, see SH_SGEO_* in sh_scoredef.h geometry_name = 0xE001 # /* User-given name of this geometry */ geo_p_start = 0xE002 # /* start values, e.g xmin, ymin, zmin */ geo_q_stop = 0xE003 # /* stop values, e.g xmax, ymax, zmax */ geo_n_bins = 0xE004 # /* number of bins */ geo_rotation = 0xE005 # [future] rotation of geometry geo_volume = 0xE006 # volume size in cm3 ... WARNING: may be a list in some future geo_zones = 0xE007 # single GEMCA zone, or list of zones geo_non_equidist_grid = 0xE008 # Array of non-equidistant z-grid. Tag only used if set. geo_units = 0xE009 # [Future]: ASCII string of ;-separated units along each dimension. geo_unit_ids = 0xE00A # /* Unit IDs according to sh_units.h, one unit along each axis. */ # Group 0xEF00 - 0xEFFF : Estimator filename_or_geotype = 0xEE00 # /* filename (bdo2019 format) or geometry name (bdo2016 format)*/ estimator_number = 0xEE01 # /* Unique number for this estimator, if several files were saved, starting at 0 */ number_of_pages = 0xEE02 # /* number of detectors / pages for this estimator */ estimator_rescale_per_particle = 0xEE03 # estimator "per particle" rescaling, absent or set to 1 if no rescaling # note, that written data will *not* be multiplied with this value, it is up # to the BDO reader to multiply with this, if SHBDO_PAGE_NORMALIZE was set # /* Group 0xFFCC - 0xFFFF : Diagnostics, may be ignored by readers. */ comment = 0xFFCC # /* 0xFFCC-omment */ debug = 0xFFCD # /* 0xFFCD-ebug */ error = 0xFFCE # /* 0xFFCE-rror */
estimator_tags_to_save = ( ) page_tags_to_save = ( SHBDOTagID.detector_type, SHBDOTagID.page_number, SHBDOTagID.page_normalized, SHBDOTagID.page_scale_factor, SHBDOTagID.page_offset, SHBDOTagID.page_unit_ids, SHBDOTagID.detector_unit, SHBDOTagID.page_diff_flag, SHBDOTagID.page_diff_type, SHBDOTagID.page_diff_start, SHBDOTagID.page_diff_stop, SHBDOTagID.page_diff_size, SHBDOTagID.page_diff_units, SHBDOTagID.page_filter_name, SHBDOTagID.page_filter_rules_no, SHBDOTagID.page_filter_e_min, SHBDOTagID.page_filter_emax, ) # replace this dictionary with tuple estimator_tags_to_save detector_name_from_bdotag = { SHBDOTagID.jpart0: 'projectile_code', SHBDOTagID.apro0: 'projectile_a', SHBDOTagID.zpro0: 'projectile_z', SHBDOTagID.beamx: 'projectile_position_x', SHBDOTagID.beamy: 'projectile_position_y', SHBDOTagID.beamz: 'projectile_position_z', SHBDOTagID.sigmax: 'projectile_sigma_x', SHBDOTagID.sigmay: 'projectile_sigma_y', SHBDOTagID.sigmat0: 'projectile_sigma_energy', SHBDOTagID.beamtheta: 'projectile_polar_angle', SHBDOTagID.beamphi: 'projectile_azimuth_angle', SHBDOTagID.beamdivx: 'projectile_divergence_x', SHBDOTagID.beamdivy: 'projectile_divergence_y', SHBDOTagID.beamdivk: 'projectile_divergence_k', SHBDOTagID.shversion: 'mc_code_version', SHBDOTagID.shbuilddate: 'mc_code_build_date', SHBDOTagID.filedate: 'filedate', SHBDOTagID.user: 'user', SHBDOTagID.host: 'host', SHBDOTagID.rt_nstat: 'number_of_primaries', SHBDOTagID.number_of_pages: 'page_count', SHBDOTagID.geo_unit_ids: 'geo_unit_ids', SHBDOTagID.geo_units: 'geo_units', SHBDOTagID.geometry_name: 'geo_name', SHBDOTagID.tmax0mev: 'Tmax_MeV', SHBDOTagID.tmax0amu: 'Tmax_MeV/amu', SHBDOTagID.tmax0nuc: 'Tmax_MeV/nucl' }
[docs]class SHBDOUnitID(IntEnum): SH_SCORING_UNIT_UNKNOWN = -2 # /* e.g. for user defined scoring */ SH_SCORING_UNIT_INVALID = -1 # /* N/A (not applicable), or undefined */ SH_SCORING_UNIT_NONE = 0 # /* dimensionless */ SH_SCORING_UNIT_AU = 1 # /* arbitrary units */ SH_SCORING_UNIT_PCT = 2 # /* percent (%) */ SH_SCORING_UNIT_PMIL = 3 # /* promill (%%) */ SH_SCORING_UNIT_RELATIVE = 4 # /* dimensionless relative fraction */ SH_SCORING_UNIT_CM = 10 # /* cm */ SH_SCORING_UNIT_CM2 = 11 # /* cm^2 */ SH_SCORING_UNIT_CM3 = 12 # /* cm^3 */ SH_SCORING_UNIT_PCM = 13 # /* cm^-1 */ SH_SCORING_UNIT_PCM2 = 14 # /* cm^-2 */ SH_SCORING_UNIT_PCM3 = 15 # /* cm^-3 */ SH_SCORING_UNIT_M = 16 # /* m */ SH_SCORING_UNIT_M2 = 17 # /* m^2 */ SH_SCORING_UNIT_M3 = 18 # /* m^3 */ SH_SCORING_UNIT_PM = 19 # /* m^-1 */ SH_SCORING_UNIT_PM2 = 20 # /* m^-2 */ SH_SCORING_UNIT_PM3 = 21 # /* m^-3 */ SH_SCORING_UNIT_GPCM3 = 22 # /* density g / cm^3 */ SH_SCORING_UNIT_KGPM3 = 23 # /* density kg / m^3 */ SH_SCORING_UNIT_KEVPUM = 30 # /* keV / um */ SH_SCORING_UNIT_MEVPCM = 31 # /* MeV / cm */ SH_SCORING_UNIT_MEVCM2PG = 32 # /* MeV * cm^2 / g */ SH_SCORING_UNIT_MEVPG = 40 # /* MeV / g) */ SH_SCORING_UNIT_GY = 41 # /* Gy (J/kg) */ SH_SCORING_UNIT_GYRBE = 42 # /* Gy * RBE */ SH_SCORING_UNIT_GYRE = 43 # /* Gy * RE (quenching) */ SH_SCORING_UNIT_SV = 44 # /* Sv (J/kg) */ SH_SCORING_UNIT_DOSERAD = 45 # /* Rad ( = 1 cGy) */ SH_SCORING_UNIT_DOSEREM = 46 # /* Rem ( = 1 cSv) */ SH_SCORING_UNIT_DEGREES = 50 # /* degrees */ SH_SCORING_UNIT_RADIANS = 51 # /* radians */ SH_SCORING_UNIT_SR = 52 # /* steradian sr = rad^2*/ SH_SCORING_UNIT_COUNT = 60 # /* number # */ SH_SCORING_UNIT_MEV = 70 # /* MeV */ SH_SCORING_UNIT_MEVPNUC = 71 # /* MeV / nucleon */ SH_SCORING_UNIT_MEVPAMU = 72 # /* MeV / amu */ SH_SCORING_UNIT_NUCN = 80 # /* number of nucleons */ SH_SCORING_UNIT_MEVPC2 = 81 # /* particle mass MeV / c^2 */ SH_SCORING_UNIT_U = 82 # /* particle mass in terms of u */ SH_SCORING_UNIT_MATID = 90 # /* material ID */ SH_SCORING_UNIT_NZONE = 91 # /* zone number */
unit_name_from_unit_id = { SHBDOUnitID.SH_SCORING_UNIT_NONE: "", SHBDOUnitID.SH_SCORING_UNIT_AU: "a.u.", SHBDOUnitID.SH_SCORING_UNIT_PCT: "%", SHBDOUnitID.SH_SCORING_UNIT_PMIL: "%%", SHBDOUnitID.SH_SCORING_UNIT_RELATIVE: "rel.units", SHBDOUnitID.SH_SCORING_UNIT_CM: "cm", SHBDOUnitID.SH_SCORING_UNIT_CM2: "cm^2", SHBDOUnitID.SH_SCORING_UNIT_CM3: "cm^3", SHBDOUnitID.SH_SCORING_UNIT_PCM: "/cm", SHBDOUnitID.SH_SCORING_UNIT_PCM2: "/cm^2", SHBDOUnitID.SH_SCORING_UNIT_PCM3: "/cm^3", SHBDOUnitID.SH_SCORING_UNIT_M: "m", SHBDOUnitID.SH_SCORING_UNIT_M2: "m^2", SHBDOUnitID.SH_SCORING_UNIT_M3: "m^3", SHBDOUnitID.SH_SCORING_UNIT_PM: "/m", SHBDOUnitID.SH_SCORING_UNIT_PM2: "/m^2", SHBDOUnitID.SH_SCORING_UNIT_PM3: "/m^3", SHBDOUnitID.SH_SCORING_UNIT_GPCM3: "g/cm^3", SHBDOUnitID.SH_SCORING_UNIT_KGPM3: "kg/m^3", SHBDOUnitID.SH_SCORING_UNIT_KEVPUM: "keV/um", SHBDOUnitID.SH_SCORING_UNIT_MEVPCM: "MeV/cm", SHBDOUnitID.SH_SCORING_UNIT_MEVCM2PG: "MeV cm^2/g", SHBDOUnitID.SH_SCORING_UNIT_MEVPG: "MeV/g", SHBDOUnitID.SH_SCORING_UNIT_GY: "Gy", SHBDOUnitID.SH_SCORING_UNIT_GYRBE: "Gy(RBE)", # /* Probably there are new ICRU rules here */ SHBDOUnitID.SH_SCORING_UNIT_GYRE: "Gy(RE)", SHBDOUnitID.SH_SCORING_UNIT_SV: "Sv", SHBDOUnitID.SH_SCORING_UNIT_DOSERAD: "Rad", SHBDOUnitID.SH_SCORING_UNIT_DOSEREM: "Rem", SHBDOUnitID.SH_SCORING_UNIT_DEGREES: "deg", SHBDOUnitID.SH_SCORING_UNIT_RADIANS: "rad", SHBDOUnitID.SH_SCORING_UNIT_SR: "sr", SHBDOUnitID.SH_SCORING_UNIT_COUNT: "#", SHBDOUnitID.SH_SCORING_UNIT_MEV: "MeV", SHBDOUnitID.SH_SCORING_UNIT_MEVPNUC: "MeV/nucleon", SHBDOUnitID.SH_SCORING_UNIT_MEVPAMU: "MeV/amu", SHBDOUnitID.SH_SCORING_UNIT_NUCN: "", SHBDOUnitID.SH_SCORING_UNIT_MEVPC2: "MeV/c^2", SHBDOUnitID.SH_SCORING_UNIT_U: "u", SHBDOUnitID.SH_SCORING_UNIT_MATID: "", SHBDOUnitID.SH_SCORING_UNIT_NZONE: "", }