Ejemplo n.º 1
0
void dsp::Archiver::set (Pulsar::Archive* archive, const PhaseSeries* phase)
try
{
  if (verbose > 2)
    cerr << "dsp::Archiver::set Pulsar::Archive" << endl;

  if (!archive)
    throw Error (InvalidParam, "dsp::Archiver::set Pulsar::Archive",
        	 "no Archive");

  if (!phase)
    throw Error (InvalidParam, "dsp::Archiver::set Pulsar::Archive",
        	 "no PhaseSeries");

  const unsigned npol  = get_npol (phase);
  const unsigned nchan = phase->get_nchan();
  const unsigned nbin  = phase->get_nbin();
  const unsigned nsub  = 1;

  if (verbose > 2)
    cerr << "dsp::Archiver::set Pulsar::Archive nsub=" << nsub 
         << " npol=" << npol << " nchan=" << nchan 
         << " nbin=" << nbin << " fourth=" << fourth_moments << endl;

  archive-> resize (nsub, npol, nchan, nbin);

  Pulsar::FITSHdrExtension* ext;
  ext = archive->get<Pulsar::FITSHdrExtension>();
  
  if (ext)
  {
    if (verbose > 2)
      cerr << "dsp::Archiver::set Pulsar::Archive FITSHdrExtension" << endl;

    // Make sure the start time is aligned with pulse phase zero
    // as this is what the PSRFITS format expects.

    MJD initial = phase->get_start_time();

    if (phase->has_folding_predictor())
    {
      Pulsar::Phase inphs = phase->get_folding_predictor()->phase(initial);
      double dtime = inphs.fracturns() * phase->get_folding_period();
      initial -= dtime;
    }

    ext->set_start_time (initial);

    // In keeping with tradition, I'll set this to a value that should
    // work in most places for the next 50 years or so ;)

    ext->set_coordmode("J2000");

    // Set the ASCII date stamp from the system clock (in UTC)

    time_t thetime;
    time(&thetime);
    string time_str = asctime(gmtime(&thetime));

    // Cut off the line feed character
    time_str = time_str.substr(0,time_str.length() - 1);

    ext->set_date_str(time_str);
  }

  archive-> set_telescope ( phase->get_telescope() );
  archive-> set_type ( phase->get_type() );

  switch (phase->get_state())
  {
  case Signal::NthPower:
  case Signal::PP_State:
  case Signal::QQ_State:
    archive->set_state (Signal::Intensity);
    break;
  
  case Signal::FourthMoment:
    archive->set_state (Signal::Stokes);
    break;

  default:
    archive-> set_state ( phase->get_state() );
  }

  archive-> set_scale ( Signal::FluxDensity );

  if (verbose > 2)
    cerr << "dsp::Archiver::set Archive source=" << phase->get_source()
         << "\n  coord=" << phase->get_coordinates()
         << "\n  bw=" << phase->get_bandwidth()
         << "\n  freq=" << phase->get_centre_frequency () << endl;

  archive-> set_source ( phase->get_source() );
  archive-> set_coordinates ( phase->get_coordinates() );
  archive-> set_bandwidth ( phase->get_bandwidth() );
  archive-> set_centre_frequency ( phase->get_centre_frequency() );
  archive-> set_dispersion_measure ( phase->get_dispersion_measure() );

  archive-> set_dedispersed( archive_dedispersed );
  archive-> set_faraday_corrected (false);

  /* *********************************************************************
     *********************************************************************

     Set any available extensions

     *********************************************************************
     ********************************************************************* */

  /*
    A valid Backend extension may have already been created; e.g. by
    the OutputArchive extension class.  Therefore, if the Backend extension
    already exists, do not modifiy it.
  */

  Pulsar::Backend* backend = archive -> get<Pulsar::Backend>();
  if (!backend)
  {
    backend = new Pulsar::Backend;

    if (verbose > 2)
      cerr << "dsp::Archiver::set Pulsar::Backend extension" << endl;

    set (backend);

    archive->add_extension( backend );
  }


  // Note, this is now called before the set(Integration,...) call below
  // so that the DigitiserCounts extension gets set up correctly the
  // first time.

  Pulsar::dspReduction* dspR = archive -> getadd<Pulsar::dspReduction>();
  if (dspR)
  {
    if (verbose > 2)
      cerr << "dsp::Archiver::set Pulsar::dspReduction extension" << endl;
    set (dspR);
  }

  for (unsigned isub=0; isub < nsub; isub++)
    set (archive->get_Integration(isub), phase, isub, nsub);

  if (store_dynamic_extensions)
  {
    Pulsar::TwoBitStats* tbc = archive -> getadd<Pulsar::TwoBitStats>();
    if (tbc)
    {
      if (verbose > 2)
        cerr << "dsp::Archiver::set Pulsar::TwoBitStats extension" << endl;
      set (tbc);
    }

    Pulsar::Passband* pband = archive -> getadd<Pulsar::Passband>();
    if (pband)
    {
      if (verbose > 2)
        cerr << "dsp::Archiver::set Pulsar::Passband extension" << endl;
      set (pband);
    }
  }

  Pulsar::Telescope* telescope = archive -> getadd<Pulsar::Telescope>();

  try
  {
    telescope->set_coordinates ( phase -> get_telescope() );
  }
  catch (Error& error)
  {
    if (verbose > 2)
      cerr << "dsp::Archiver WARNING could not set telescope coordinates\n\t"
           << error.get_message() << endl;
  }

  // default Receiver extension
  Pulsar::Receiver* receiver = archive -> getadd<Pulsar::Receiver>();
  receiver->set_name ( phase -> get_receiver() );
  receiver->set_basis ( phase -> get_basis() );

  for (unsigned iext=0; iext < extensions.size(); iext++)
    archive -> add_extension ( extensions[iext] );

  // set_model must be called after the Integration::MJD has been set
  if( phase->has_folding_predictor() )
  {
    if (verbose > 2)
      cerr << "dsp::Archiver::set has predictor" << endl;
    archive-> set_model ( phase->get_folding_predictor(), false );
  }
  else if (verbose > 2)
    cerr << "dsp::Archiver::set PhaseSeries has no predictor" << endl;

  if (phase->has_pulsar_ephemeris())
    archive-> set_ephemeris( phase->get_pulsar_ephemeris(), false );

  archive-> set_filename (get_filename (phase));

  if (verbose > 2) cerr << "dsp::Archiver set archive filename to '"
        	    << archive->get_filename() << "'" << endl;
}
catch (Error& error)
{
  throw error += "dsp::Archiver::set Pulsar::Archive";
}