Skip to content
Snippets Groups Projects
isisraw.cpp 31.5 KiB
Newer Older
#include "isisraw.h"
#include "vms_convert.h"
#include "byte_rel_comp.h"

#define SUCCESS 0
#define FAILURE 1

/// stuff
ISISRAW::ISISRAW() : m_crpt(0), dat1(0) {
  int i, j;
  // section 1
  frmt_ver_no = 2; // format version number VER1 (=2)
  data_format = 0; // data section format (0 = by TC, 1 = by spectrum)
  // section 2
  ver2 = 1;                              // run section version number VER2 (=1)
  r_number = 0;                          // run number
  memset(r_title, ' ', sizeof(r_title)); // run title
  // section 3
  ver3 = 2;                            // instrument section version number (=2)
  memset(i_inst, ' ', sizeof(i_inst)); // instrument name
  i_det = 1;                           // number of detectors NDET
  i_mon = 1;                           // number of monitors NMON
  i_use = 1;                           // number of user defined UTn tables NUSE
  // I_TABLES is address of MDET
  mdet = new int[i_mon]; // detector number for monitors (size NMON)
  monp = new int[i_mon]; // prescale value for each monitor (size NMON)
  for (i = 0; i < i_mon; i++) {
    mdet[i] = i + 1;
    monp[i] = 1;
  }
  spec = new int[i_det];   // spectrum number table (size NDET)
  delt = new float[i_det]; // hold off table (size NDET)
  len2 = new float[i_det]; // L2 table (size NDET)
  code = new int[i_det];   // code for UTn tables (size NDET)
  tthe = new float[i_det]; // 2theta scattering angle (size NDET)
  ut = new float[i_use *
                 i_det]; // nuse UT* user tables (total size NUSE*NDET) ut01=phi
  for (i = 0; i < i_det; i++) {
    spec[i] = i + 1; // we have t_nsp1 = i_det
    delt[i] = (float)i;
    len2[i] = (float)i;
    code[i] = i + 1;
    tthe[i] = (float)i;
  }
  for (i = 0; i < i_use; i++) {
    for (j = 0; j < i_det; j++) {
      ut[i * i_det + j] = (float)j;
    }
  }
  // section 4
  ver4 = 2;                         // SE section version number (=2)
  e_nse = 1;                        // number of controlled SEPs NSEP
  e_seblock = new SE_STRUCT[e_nse]; // NSEP SE parameter blocks (total size
                                    // NSEP*32*4 bytes)
  // section 5
  ver5 = 2;              // DAE section version number (=2)
  crat = new int[i_det]; // crate number for each detector (size NDET)
  modn = new int[i_det]; // module number for each detector (size NDET)
  mpos = new int[i_det]; // module position for each detector (size NDET)
  timr = new int[i_det]; // time regime for each detector (size NDET)
  udet = new int[i_det]; // user detector number for each detector (size NDET)
  for (i = 0; i < i_det; i++) {
    crat[i] = 1;
    modn[i] = 1;
    mpos[i] = i;
    timr[i] = 1;
    udet[i] = i;
  }
  // section 6
  ver6 = 1;   // TCB section version number (=1)
  t_ntrg = 1; // number of time regimes (=1)
  t_nfpp = 1; // number of frames per period
  t_nper = 1; // number of periods
  for (i = 0; i < 256; i++) {
    t_pmap[i] = 1; // period number for each basic period
  }
  t_nsp1 = i_det;                    // number of spectra in time regime 1
  t_ntc1 = 10;                       // number of time channels in time regime 1
  memset(t_tcm1, 0, sizeof(t_tcm1)); // time channel mode
  memset(t_tcp1, 0, sizeof(t_tcp1)); // time channel parameters
  t_pre1 = 1;                        // prescale for 32MHz clock
  t_tcb1 = new int[t_ntc1 +
                   1]; // time channel boundaries in clock pulses (size NTC1+1)
  for (i = 0; i < t_ntc1 + 1; i++) {
    t_tcb1[i] = i;
  }
  // section 7
  // write NCHAN = NTC1+1 time channel boundaries
  ver7 = 1; // user version number (=1)
  u_len = 1;
  u_dat = new float[u_len]; // user defined data (ULEN, max size 400 words)
  for (i = 0; i < u_len; i++) {
    u_dat[i] = (float)i;
  }
  // section 8
  ver8 = 2; // data version number (=2)
  // D_DATA points at ddes
  ddes = new DDES_STRUCT[(t_nsp1 + 1) * t_nper]; // (NSP1+1)*NPER items, totoal
                                                 // size (NSP1+1)*NPER*2*4 bytes
  dat1 =
      new uint32_t[(t_ntc1 + 1) * (t_nsp1 + 1) *
                   t_nper]; // compressed data for (NTC1+1)*(NSP1+1)*NPER values
  for (i = 0; i < (t_ntc1 + 1) * (t_nsp1 + 1) * t_nper; i++) {
    dat1[i] = i;
  }
Campbell, Stuart's avatar
Campbell, Stuart committed
#if defined(_WIN32)
// disable warning about strcpy
#pragma warning(disable : 4996)
Campbell, Stuart's avatar
Campbell, Stuart committed
#endif
  logsect.nlines = 1;
  logsect.lines = new LOG_LINE[logsect.nlines];
  for (i = 0; i < logsect.nlines; i++) {
    // logsect.lines[i].data = "test log line"; //Deprecated
    logsect.lines[i].data = (char *)malloc(16);
    strcpy(logsect.lines[i].data, "test log line");
    logsect.lines[i].len = static_cast<int>(strlen(logsect.lines[i].data));
  }
  addItems();
/// stuff
int ISISRAW::addItems() {
  static const int hdr_size = sizeof(hdr) / sizeof(char);
  static const int rrpb_size = sizeof(rpb) / sizeof(float);
  static const int irpb_size = sizeof(rpb) / sizeof(int);
  m_char_items.addItem("HDR", (const char *)&hdr, false, &hdr_size);
  m_real_items.addItem("RRPB", (float *)&rpb, false, &rrpb_size);
  m_int_items.addItem("IRPB", (int *)&rpb, false, &irpb_size);
  return 0;
/// stuff
ISISRAW::ISISRAW(ISISCRPT_STRUCT *crpt)
    : m_crpt(crpt), frmt_ver_no(0), data_format(0), ver2(0), r_number(0),
      ver3(0), i_det(0), i_mon(0), i_use(0), mdet(0), monp(0), spec(0), delt(0),
      len2(0), code(0), tthe(0), ut(0), ver4(0), ver5(0), crat(0), modn(0),
      mpos(0), timr(0), udet(0), ver6(0), t_ntrg(0), t_nfpp(0), t_nper(0),
      t_nsp1(0), t_ntc1(0), t_pre1(0), t_tcb1(0), ver7(0), u_dat(0), ver8(0),
      ddes(0), dat1(0) {
  memset(r_title, ' ', sizeof(r_title));
  memset(i_inst, ' ', sizeof(i_inst));
  for (int i = 0; i < 256; i++) {
    t_pmap[i] = 1; // period number for each basic period
  }
  memset(t_tcm1, 0, sizeof(t_tcm1)); // time channel mode
  memset(t_tcp1, 0, sizeof(t_tcp1)); // time channel parameters
  e_nse = 0;
  e_seblock = 0;
  u_len = 0;
  logsect.nlines = 0;
  logsect.lines = 0;
  addItems();
  updateFromCRPT();
Nick Draper's avatar
Nick Draper committed
// create one bound to a CRPT
/// stuff
ISISRAW::ISISRAW(ISISCRPT_STRUCT *crpt, bool doUpdateFromCRPT)
    : m_crpt(crpt), frmt_ver_no(0), data_format(0), ver2(0), r_number(0),
      ver3(0), i_det(0), i_mon(0), i_use(0), mdet(0), monp(0), spec(0), delt(0),
      len2(0), code(0), tthe(0), ut(0), ver4(0), ver5(0), crat(0), modn(0),
      mpos(0), timr(0), udet(0), ver6(0), t_ntrg(0), t_nfpp(0), t_nper(0),
      t_nsp1(0), t_ntc1(0), t_pre1(0), t_tcb1(0), ver7(0), u_dat(0), ver8(0),
      ddes(0), dat1(0) {
  memset(r_title, ' ', sizeof(r_title));
  memset(i_inst, ' ', sizeof(i_inst));
  for (int i = 0; i < 256; i++) {
    t_pmap[i] = 1; // period number for each basic period
  }
  memset(t_tcm1, 0, sizeof(t_tcm1)); // time channel mode
  memset(t_tcp1, 0, sizeof(t_tcp1)); // time channel parameters
  e_nse = 0;
  e_seblock = 0;
  u_len = 0;
  logsect.nlines = 0;
  logsect.lines = 0;
  addItems();
  if (doUpdateFromCRPT) {
    updateFromCRPT();
Nick Draper's avatar
Nick Draper committed
  }
}

/// stuff
int ISISRAW::updateFromCRPT() {
  if (m_crpt == NULL) {
    return 0;
  }
  int i;
  char buffer[256];
  spacePadCopy(hdr.inst_abrv, m_crpt->inst_abrv, sizeof(hdr.inst_abrv));
  sprintf(buffer, "%05d", m_crpt->run_number);
  spacePadCopy(hdr.hd_run, buffer, sizeof(hdr.hd_run));
  spacePadCopy(hdr.hd_user, m_crpt->user_name, sizeof(hdr.hd_user));
Loading
Loading full blame...