Commit e9e6a485 authored by Robert Butora's avatar Robert Butora
Browse files

vlkb: implements headerwcs which lists WCS-coords related keys

parent d83d479e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ namespace fitsfiles
   void        add_cards_if_missing(const std::string pathname, unsigned int hdunum, const std::vector<struct fits_card> cards);
   int         mod_value(std::string filename, std::string token, std::string keyvalue);

   std::map<std::string, std::string> read_header_wcs_coord_type(const std::string pathname, unsigned int hdunum, char altwcs = ' ');

   double calc_nullvals(std::string pathname, unsigned int hdunum,
         unsigned long long & null_cnt, unsigned long long & total_cnt);
+25 −0
Original line number Diff line number Diff line
@@ -106,6 +106,31 @@ string fitsfiles::read_card(const std::string pathname, unsigned int hdunum, con
}


map<string, string> fitsfiles::read_header_wcs_coord_type(const std::string pathname, unsigned int hdunum, char altwcs)
{
   fits::header hdr(pathname, hdunum);

   string alt{ ( altwcs == ' ' ? string{""} : string{altwcs} ) };

   // FIXME does not support alternative calibration (one char at the end of keyname)

   set<string> keys{"SPECSYS" + alt,"SSYSOBS" + alt};

   string keyroot{"CTYPE"};
   int i=1;
   string istr{to_string(i)};
   while( hdr.contains_card( keyroot + istr + alt) )
   {
      keys.insert("CTYPE" + istr + alt);
      keys.insert("CUNIT" + istr + alt);
      istr = to_string(i++);
   }

   return hdr.parse_string_cards(keys);
}



void fitsfiles::add_cards_if_missing(const std::string pathname, unsigned int hdunum, const std::vector<struct fits_card> cards)
{
   fits::header hdr(pathname, hdunum, READWRITE);
+39 −2
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ namespace vlkb
         << "Usage: " << progname << " <command> [cmd-options] [cmd-args]" << endl
         << "\n where commands are:\n "
         << "\n\t cutout imcopy cutpixels multicutout mergefiles\n"
         << "\n\t listbounds header headermodif skyvertices overlap\n"
         << "\n\t listbounds header headermodif headerwcs skyvertices overlap\n"
         << "\n\t nullvals dropdegen checkcard addcard modcard rawdelcard\n"
         << std::endl
         << "Version: " << VERSIONSTR << " " << BUILD << std::endl;
@@ -55,7 +55,8 @@ namespace vlkb

   enum cmd_set {
      multicutout, mergefiles, cutout, imcopy, cutpixels,
      listbounds, header, headermodif, overlap, skyvertices, nullvals, dropdegen, checkcard, addcard, modcard, rawdelcard};
      listbounds, header, headermodif, headerwcs, overlap, skyvertices,
      nullvals, dropdegen, checkcard, addcard, modcard, rawdelcard};


   // from bash or interpreters usually receive params as strings
@@ -72,6 +73,7 @@ namespace vlkb
      else if(cmdstr.compare("listbounds") == 0)   cmd = listbounds;
      else if(cmdstr.compare("header") == 0)       cmd = header;
      else if(cmdstr.compare("headermodif") == 0)  cmd = headermodif;
      else if(cmdstr.compare("headerwcs") == 0)    cmd = headerwcs;
      else if(cmdstr.compare("overlap") == 0)      cmd = overlap;
      else if(cmdstr.compare("skyvertices") == 0)  cmd = skyvertices;
      else if(cmdstr.compare("nullvals") == 0)     cmd = nullvals;
@@ -320,6 +322,40 @@ int cmd_listbounds(int argc, char * argv[])
   return rc;
}

int cmd_header_wcs(int argc, char * argv[])
{
   int rc;

   if (argc < 2)
   {
      std::cerr
         << "Usage:  header_wcs <pathname.fits>...\n"
         << "\n"
         << "Prints current header WCS axes info.\n";
      rc = EXIT_FAILURE;
   }
   else
   {
      unsigned int hdunum = 1;
      char altwcs = ' ';

      for(int i=1; i<argc; i++)
      {
         string pathname(argv[i]);

         std::map<std::string, std::string> card_values{fitsfiles::read_header_wcs_coord_type(pathname, hdunum, altwcs)};

         for(auto it = card_values.cbegin(); it != card_values.cend(); ++it)
         {
            std::cout << it->first << " " << it->second << ", ";
         }
         std::cout << pathname << std::endl;
      }
      rc = EXIT_SUCCESS;
   }
   return rc;
}


int cmd_header(int argc, char * argv[])
{
@@ -679,6 +715,7 @@ int main (int argc, char * argv[])
         case vlkb::listbounds:  rc = cmd_listbounds(cmd_argc, cmd_argv); break;
         case vlkb::header:      rc = cmd_header(cmd_argc, cmd_argv); break;
         case vlkb::headermodif: rc = cmd_header_modif(cmd_argc, cmd_argv); break;
         case vlkb::headerwcs:   rc = cmd_header_wcs(cmd_argc, cmd_argv); break;
         case vlkb::skyvertices: rc = cmd_skyvertices(cmd_argc, cmd_argv); break;
         case vlkb::overlap:     rc = cmd_overlap(cmd_argc, cmd_argv); break;