The included code contains a couple of useful libraries written in C++ which may be useful to those writing software.
A simple FITS image library, contained within the FITS subdirectory of the distribution, is included. The code isn't great (I'm in the process a redesign and rewrite), but it does the job and is probably fine for small projects.
It can load and save FITS format images. It contains a class for the easy manipulation of images in memory. It converts all images to double format two-dimensional images on loading.
#include <FITS/FITSFile.h> #include <FITS/FITSImage.h> ... // load images CFITSFile inputfile1("image1.fits", CFITSFile::existingro); CFITSFile inputfile2("image2.fits", CFITSFile::existingro); // multiply the images CFITSImage manip = inputfile1.GetImage(); manip *= inputfile2.GetImage(); // square root result manip.Sqrt(); // do something pointless to the individual pixels for(int y=0; y<manip.GetYW(); y++) for(int x=0; x<manip.GetXW(); x++) manip.SetPixel(x, y, manip.GetPixel(x, y) + x); { // save the output image CFITSFile outputfile("out.fits", CFITSFile::create); outputfile.SetImage(manip); // set output image outputfile.SetPosn(inputfile1.GetPosn()); // copy WCS information outputfile.WriteImage(); }
Parammm is quite a useful library to handle parameters and GNU-style switches to programs. I wrote it because I didn't like the way popt does things. The library is extensible and I'm fairly happy with the OOP way in which it does things. Here is a list of features:
#include <string> #include <parammm/parammm.hh> using std::string; ... int main(int argc, char *argv[]) { parammm::param params(argc, argv); // define param object int minchan=0, maxchan=1024, noslices=1; string sliceoutfilename, backgrndfilename; params.add_switch( parammm::pswitch("minchan", 'i', parammm::pint_opt(&minchan), "set minimum channel", "CHAN")); // take an integer switch ( --minchan=xx or -i xx ) // note how the return variable and type are specified // the final param specifies the help text and the quantity // "unit" being taken. params.add_switch( parammm::pswitch("maxchan", 'x', parammm::pint_opt(&maxchan), "set maximum channel", "CHAN" )); // another int parameter params.add_switch( parammm::pswitch("noslices", 'n', parammm::pint_opt(&noslices), "set number of slices", "NUM" )); // another int params.add_switch( parammm::pswitch("sliceout", 'o', parammm::pstring_opt(&sliceoutfilename), "set output filename", "FILE" )); // string parameter params.add_switch( parammm::pswitch("background", 'b', parammm::pstring_opt(&backgrndfilename), "set background filename", "FILE")); // string parameter params.set_autohelp("Usage: EqualSpec [OPTION]... inputspectrum.fits\n" "divide a spectrum into equal slices (count-wise)\n" "written by Jeremy Sanders, 2000.", "Report bugs to <jss@ast.cam.ac.uk>"); // text to output at the top and bottoms of the automatic help // text. params.enable_autohelp(); // if we get a dodgy parameter, show automatic help and // exit the program params.interpret_and_catch(); // actually process argv if(params.args().size() != 1) params.show_autohelp(); // actual parameters (non-switches) are stored in the vector<string> // params.args(). show_autohelp() shows the autohelp text and exits string filename = params.args()[0]; // copy the first parameter (program name not stored) ... return(0); }This is the personal page of Jeremy Sanders (Impressium).