Beispiel #1
0
void Pulsar::UVMArchive::load_header (const char* filename)
{
  int newscan = 0;

  uvm_header* header = new uvm_header;
  header_ptr = header;
  
  if (uvm_getheader (filename, &program, &newscan, header) < 0)
    throw Error (InvalidState, "Pulsar::UVMArchive::load_header",
		 "%s is not a UVM archive", filename);

  cerr << "newscan=" << newscan << endl;

  char buffer[80];
  uvm_get_source (header, buffer);
  source = buffer;

  uvm_get_observatory (header, buffer);
  telescope = buffer;
  telescope = "Arecibo";

  uvm_get_windows (header, buffer);
  cerr << "Pulsar::UVMArchive::load_header windows=" << buffer
       << " nwins=" << header->nwins << endl;

  centre_frequency = header->obfreq;
  bandwidth = header->abandwd;

  npol = header->anumsbc;
  if (npol == 4)
    set_state (Signal::Stokes);

  cerr << "anumsbc=" << header->anumsbc << endl;

  /*
  if (header->apoladd)
    npol = 1;
  */

  dispersion_measure = header->adm;
  rotation_measure = header->arm;

  if (header->nwins == 0)
  {
    nbin = header->apbins;
    cerr << "nbin = apbins = " << nbin;
  }
  else
  {
    nbin = 0;
    for (int iwin=0; iwin < header->nwins; iwin++)
    {
      cerr << "nbin += " <<  header->nwbins[iwin] << endl;
      nbin += header->nwbins[iwin];
    }
  }

  nchan = 1;
  
  if (Profile::no_amps)
  {
    cerr << "no amps" << endl;
    return;
  }

  cerr << "date (dddyy)=" << header->date << endl;
  cerr << "start sec=" << header->startime << endl;

  utc_t utc;
  utc.tm_yday = header->date / 100;
  utc.tm_year = 1900 + header->date % 100;
  utc.tm_min = header->scantime / 60;
  utc.tm_sec = header->scantime - utc.tm_min * 60;
  utc.tm_hour = utc.tm_min / 60;
  utc.tm_min -= utc.tm_hour * 60;

  MJD mjd_start (utc);

  // load all BasicIntegration attributes and data from filename
  uvm_data data;
  unsigned loaded_subints = 0;

  while (uvm_getdata (program, header, &data) >= 0)
  {
    loaded_subints ++;
    resize (loaded_subints);

    Integration* integration = get_Integration(loaded_subints-1);

    // cerr << "start usec=" << header->scantime << endl;
    epoch = mjd_start + header->scantime * 1e-6;
    
    integration->set_folding_period (header->period);
    integration->set_duration (header->period);
    integration->set_epoch (epoch);
    integration->set_centre_frequency(0, centre_frequency);
    

    // scaleI is the scale to convert to microJy
    double scale = header->scaleI * 1e-3;
    double offset = header->baseval;
  
    for (unsigned ipol=0; ipol < get_npol(); ipol++)
    {
      float* amps = integration->get_Profile(ipol, 0) -> get_amps();

      for (unsigned ibin=0; ibin < get_nbin(); ibin++)
      {
	amps[ibin] = (data.data[ipol][ibin] + offset) * scale;
      }
    }
  }
}