github.com/jjjabc/fitsio@v0.0.0-20161215022839-d1807e9e818e/cmd/go-fitsio-listhead/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"strings"
     9  
    10  	fits "github.com/astrogo/fitsio"
    11  )
    12  
    13  func main() {
    14  	rc := run()
    15  	os.Exit(rc)
    16  }
    17  
    18  func run() int {
    19  	var single bool
    20  
    21  	flag.Usage = func() {
    22  		const msg = `Usage: go-fitsio-listhead filename[ext]
    23  
    24  
    25  List the FITS header keywords in a single extension, or, if 
    26  ext is not given, list the keywords in all the extensions. 
    27  
    28  Examples:
    29     
    30     go-fitsio-listhead file.fits      - list every header in the file 
    31     go-fitsio-listhead file.fits[0]   - list primary array header 
    32     go-fitsio-listhead file.fits[2]   - list header of 2nd extension 
    33     go-fitsio-listhead file.fits+2    - same as above 
    34     go-fitsio-listhead file.fits[GTI] - list header of GTI extension
    35  
    36  Note that it may be necessary to enclose the input file
    37  name in single quote characters on the Unix command line.
    38  `
    39  		fmt.Fprintf(os.Stderr, "%v\n", msg)
    40  		flag.PrintDefaults()
    41  	}
    42  
    43  	flag.Parse()
    44  	if flag.NArg() != 1 {
    45  		flag.Usage()
    46  		return 1
    47  	}
    48  
    49  	fname := flag.Arg(0)
    50  	r, err := os.Open(fname)
    51  	if err != nil {
    52  		fmt.Fprintf(os.Stderr, "**error** %v\n", err)
    53  		return 1
    54  	}
    55  	defer r.Close()
    56  
    57  	f, err := fits.Open(r)
    58  	if err != nil {
    59  		fmt.Fprintf(os.Stderr, "**error** %v\n", err)
    60  		return 1
    61  	}
    62  	defer f.Close()
    63  
    64  	// list only a single header if a specific extension was given
    65  	if strings.Contains(fname, "[") {
    66  		single = true
    67  	}
    68  
    69  	for i := 0; i < len(f.HDUs()); i++ {
    70  		hdu := f.HDU(i)
    71  		hdr := hdu.Header()
    72  		fmt.Printf("Header listing for HDU #%d:\n", i)
    73  
    74  		for _, n := range hdr.Keys() {
    75  			card := hdr.Get(n)
    76  			if card == nil {
    77  				fmt.Fprintf(os.Stderr, "**error** could not retrieve card [%v]", n)
    78  				return 1
    79  			}
    80  			fmt.Printf(
    81  				"%-8s= %-29s / %s\n",
    82  				card.Name,
    83  				fmt.Sprintf("%v", card.Value),
    84  				card.Comment)
    85  		}
    86  		fmt.Printf("END\n\n")
    87  
    88  		// quit if only listing a single header
    89  		if single {
    90  			break
    91  		}
    92  	}
    93  	if err != nil && err != io.EOF {
    94  		fmt.Fprintf(os.Stderr, "**error** %v\n", err)
    95  		return 1
    96  	}
    97  
    98  	return 0
    99  }