Introduction and example

The table model file is used in xspec to provide grids of model calculations on which to interpolate when fitting a model to data. The table class can be used to create these files. The example code below sets up a grid with two parameters.

#include "table.h"

using namespace std;
using namespace heasp;

int main(int argc, char* argv[])
{

  table test;

  // set table descriptors and the energy array

  test.setModelName("Test");
  test.setModelUnits(" ");
  test.setisRedshift(true);
  test.setisAdditive(true);
  test.setisError(false);

  RealVector energy(100);
  for (size_t i=0; i<100; i++) energy[i] = 0.1+i*0.1;
  test.setEnergies(energy);
  test.setEnergyUnits("keV");

  test.setNumIntParams(2);
  test.setNumAddParams(0);


  // define first parameter and give it 11 values ranging from
  // 0.0 to 2.0 in steps of 0.2.

  tableParameter testpar;

  testpar.setName("param1");
  testpar.setInterpolationMethod(0);
  testpar.setInitialValue(1.0);
  testpar.setDelta(0.1);
  testpar.setMinimum(0.0);
  testpar.setBottom(0.0);
  testpar.setTop(2.0);
  testpar.setMaximum(2.0);

  RealVector tabVals(11);
  for (size_t i=0; i<11; i++) tabVals[i] = 0.2*i;
  testpar.setTabulatedValues(tabVals);

  // and push it onto the vector of parameters

  test.pushParameters(testpar);

  // define the second parameter and give it 5 values ranging from
  // 4.6 to 5.4 in steps of 0.2. Use the load constructor as an
  // illustration in this case

  tabVals.resize(5);
  for (size_t i=0; i<5; i++) tabVals[i] = 4.6+0.2*i;

  tableParameter testpar2("param2", 0, 5.0, 0.1, 4.6, 4.6, 5.4, 5.4, tabVals);  

  // and push it onto the vector of parameters

  test.pushParameters(testpar);

  // now set up the spectra. these are arbitrarily calculated, in a real program 
  // this step would read a file or call a routine.

  RealVector flux(99);
  tabVals.resize(2);

  for (size_t i1=0; i1<11; i1++) {
    for (size_t i2=0; i2<5; i2++) {
      tabVals[0] = 0.2*i1;
      tabVals[1] = 4.6+0.2*i2;
      for (size_t j=0; j<99; j++) {
        flux[j] = tabVals[0]+10*tabVals[1];
      }
      tableSpectrum testspec(tabVals, flux);
      test.Spectra.push_back(testspec);
    }
  }

  // now write out the table.

  test.write("test.mod");

  exit(0);
}