Installation and setup instructions =================================== Requirements ------------ The following are required: * An HEASOFT installation (see below). Reltrans requires users to have a functioning `HEASOFT installation `_ (at least v6.30). This is a requirement regardless of whether you are compiling for use within or outside of XSPEC, as the models and libraries HEASOFT installs are dependencies of Reltrans. * (Normalised) `XILLVER tables `_. In particular, ``xillverCp_v3.4.fits``, ``xilverD-5.fits`` and ``xilver-a-Ec5.fits``. These can either be normalised yourself using a provided script (detailed below), or you can use the pre-normalised tables from `our test suite `_ (Note: these are not intended for science!). If you are normalising your own tables, set the ``RELTRANS_TABLES`` environment variable to point to the directory with the tables. The normalisation script additionally requires Python3, along with `numpy `_ and `astropy `: .. code-block:: bash export RELTRANS_TABLES="/directory/with/xillver/tables" make tables This will write the ``*_normalised.fits`` tables into the ``RELTRANS_TABLES`` directory. Normalising tables can take some time and requires both several GB of memory and disc space. After these tables have been created, their un-normalised counterparts may be safely removed. Installation ------------ Clone the source code repository and run ``make``: .. code-block:: bash git clone https://github.com/reltrans/reltrans cd reltrans make .. note:: The makefile assumes you are compiling with ``gfortran``. If you use a different Fortran compiler, you can overwrite which compiler is used with ``make FC=my-fortran-compiler``. This will compile Reltrans as a shared library into the ``build/lib`` directory. If you are using Reltrans in XSPEC, use the ``xspec`` target: .. code-block:: bash make xspec This will generate the compile the requisite files and libraries for using Reltrans in XSPEC to ``build/xspec``. It may then be loaded into XSPEC with .. code-block:: bash lmod xsreltrans ./build/xspec You will now be be able to call the model identically to any other additive model in Xspec. Debugging --------- To compile Reltrans for debugging, use: .. code-block:: bash make DEBUG=1 which will compile the library with debug symbols and without compiler optimisations. There is a small C command line interface for Reltrans which you can use as the entry point to easily attach a debugger (see ``utils/cli.c``). This can be built with: .. code-block:: bash make DEBUG=1 exe See the Makefile for more details. .. _environmentvars: Environmental variables ----------------------- There are a number of environmental variables that are set across all model flavours of reltrans. These relate both to the physics of the model, but also makes model calling faster in some cases. If environment variables are not set, the model uses default parameters. * ``ION_ZONES`` [integer > 0; default 20]: It sets the number of radial zones of the disk to calculate the ionisation profile of the disk. The default value is 50 zones, but the number used in previous works of the reltrans team is 20. If it is set to 1 the disk is considered to have the same ionisation and the same density everywhere. * ``A_DENSITY`` [possible options 0 or 1; default 0]: It sets the type to density profile in the disk. There are two options: * ``A_DENSITY = 0`` -> constant density * ``A_DENSITY = 1`` -> Shakura & Suniev zone A density profile. Keep in mind that if you set the ION_ZONES = 1, it doesn't matter which density profile you choose because you have a single radial zone disk. * ``MU_ZONES`` [integer > 0; default 5 ]: it sets the zones for the emitting angle (they are different from the radial zones). In previous work we noticed that the angle dependence does not change dramatically the spectrum, thus we have used MU_ZONES set to 1 to speed up the code. * ``RELTRANS_TABLES`` [character string, NO default]: sets the path to where the Xillver tables to be used in the model are. .. note:: These tables should be the re-normalised tables produced by running the configuration file, NOT the tables that come directly from the website. * ``RMF_SET`` and ``ARF_SET`` [character string; NO default]: they pre-set the path of the response matrix and the arf. This is not necessary if you are interested in the time-averaged energy spectrum since Xspec applies the response matrix automatically. If you work with either the real and imaginary part of the cross-spectrum or directly with the lag energy spectrum you may want to consider to pre-set the path of the response matrix and arf to avoid the code asking for it. If the two variables are not set the code will ask for the path: "Enter name the response file (with full path)" If users are modelling cross spectra from two different instruments (for example XMM and NuSTAR), then they also needs to specify the path to the second set of responses by additionally setting the RMF_SET2 and ARF_SET2. * ``EMIN_REF`` and ``EMAX_REF`` [numbers > 0, NO default]: the minimum and maximum energies used to define the reference band used when calculating the model cross spectrum. If users are modelling cross spectra from two different instruments (for example XMM and NuSTAR), then they also need to specify the reference band of the second instrument by additionally setting EMIN_REF2 and EMAX_REF2. * ``REV_VERB`` [integer > 0, default 0]: A verbosity switch to print information to terminal every time the model is run. Set to 0 during fits to avoid cluttering the terminal. * ``BACKSCL`` [number > 0, default 1]: used to re-scale the background when running the simulation model flavours; it is identical to the BACKSCL parameter in the Xspec fakeit routine. * ``SEED_SIML`` [number > 0, NO default]: the seed used to initialize the random number generator for the simulator model flavours. An example file to initialize these quantites can be found in the Reltrans repository (``example_set_reltrans_env``). If you want to use this file to initialize the enviornment variables, edit the paths to the instrument responses you're interested in to set RMF\_SET and ARF\_SET correctly, and then simply source the file in your terminal. Running the model outside of Xspec ---------------------------------- It is also possible to run the model outside of Xspec, using a Python wrapper included in the repository (``f2py_interface.py``). The wrapper uses f2py (``https://numpy.org/doc/stable/f2py/``) to call the Reltrans Fortran functions directly in Python, by passing the need to e.g. interface with PyXspec. The wrapper works as follows: it imports the compiled library file that is created by the bash scripts, defines the appopriate C-types to interface Python and C/Fortran arrays, and then defines the wrapper functions that Xspec uses to differentiate model flavours: .. code-block:: python import ctypes as ct import os.path import numpy as np # prepare a few pointer types for fortran type_double_p = ct.POINTER(ct.c_double) type_float_p = ct.POINTER(ct.c_float) type_int_p = ct.POINTER(ct.c_int) #load the compiled library file lib = ct.cdll.LoadLibrary(os.path.dirname(__file__) + "/lib_reltrans.so") #define the function we want to call, and the types of its arguments #this is the standard Xspec model function input: #an energy array (ear), its size (ne), the model parameters (param), the #ifl spectrum flag, and the output spectrum (photar) wDCp = lib.tdreltransdcp_ wDCp.argtypes = [type_float_p, type_int_p, type_float_p, type_int_p, type_float_p] wDCp.restype = None #define a generic wrapper for all the possible model flavour wrappers def gen_wrap(ear, params, func): ''' Takes: ear : numpy array of energies params: array of parameters (double) Returns: photar: numpy.array (double) ''' # to be extra sure you could put the following # but it could slow down the code # # ear = numpy.array(ear) # params = numpy.array(params) ne = len(ear) - 1 photar = np.zeros(ne, dtype = np.float32) func(ear.ctypes.data_as(type_float_p), ct.byref(ct.c_int(ne)), params.ctypes.data_as(type_float_p), ct.byref(ct.c_int(1)), photar.ctypes.data_as(type_float_p)) return photar #define the function that we will use to call reltransDCp through the #generic wrapper def reltransDCp(ear, params): return gen_wrap(ear, params, wDCp) .. note:: The code above reads a library called lib_reltrans.so. This is because on some systems, the files produced by the Xspec compilation (libreltrans.so or libreltrans.dylib) may not play nicely with the f2py interface. If this is the case, we provide a makefile that is entirely independent of Xspec, and which can be used to produce the lib_reltrans.so library file by calling ``make revmakefile lib`` in the terminal.