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 }