github.com/astrogo/cfitsio@v0.1.0/examples/go-cfitsio-tablist/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "strings" 8 9 cfitsio "github.com/astrogo/cfitsio" 10 ) 11 12 func main() { 13 14 flag.Usage = func() { 15 const msg = `Usage: go-cfitsio-tablist filename[ext][col filter][row filter] 16 17 List the contents of a FITS table 18 19 Examples: 20 tablist tab.fits[GTI] - list the GTI extension 21 tablist tab.fits[1][#row < 101] - list first 100 rows 22 tablist tab.fits[1][col X;Y] - list X and Y cols only 23 tablist tab.fits[1][col -PI] - list all but the PI col 24 tablist tab.fits[1][col -PI][#row < 101] - combined case 25 26 Display formats can be modified with the TDISPn keywords. 27 ` 28 fmt.Fprintf(os.Stderr, "%v\n", msg) 29 flag.PrintDefaults() 30 } 31 32 flag.Parse() 33 if flag.NArg() != 1 { 34 flag.Usage() 35 os.Exit(1) 36 } 37 38 fname := flag.Arg(0) 39 f, err := cfitsio.Open(fname, cfitsio.ReadOnly) 40 if err != nil { 41 panic(err) 42 } 43 defer f.Close() 44 45 ihdu := f.HDUNum() // get the current HDU position 46 if ihdu == 0 { 47 // this is the primary array. 48 // try to move to the first extension and see if it is a table 49 ihdu = 1 50 } 51 if ihdu >= len(f.HDUs()) { 52 fmt.Printf("Error: input file has no extension\n") 53 os.Exit(1) 54 } 55 hdu := f.HDU(ihdu) 56 57 if hdu.Type() == cfitsio.IMAGE_HDU { 58 fmt.Printf("Error: this program only displays tables, not images\n") 59 os.Exit(1) 60 } 61 62 table := hdu.(*cfitsio.Table) 63 nrows := table.NumRows() 64 rows, err := table.Read(0, nrows) 65 if err != nil { 66 fmt.Printf("Error: %v\n", err) 67 os.Exit(1) 68 } 69 w := os.Stdout 70 hdrline := strings.Repeat("=", 80-15) 71 maxname := 10 72 for _, col := range table.Cols() { 73 if len(col.Name) > maxname { 74 maxname = len(col.Name) 75 } 76 } 77 rowfmt := fmt.Sprintf("%%-%ds | %%v\n", maxname) 78 for irow := 0; rows.Next(); irow++ { 79 err = rows.Scan() 80 if err != nil { 81 fmt.Printf("Error: (row=%v) %v\n", irow, err) 82 } 83 fmt.Fprintf(w, "== %05d/%05d %s\n", irow, nrows, hdrline) 84 for _, col := range table.Cols() { 85 fmt.Fprintf(w, rowfmt, col.Name, col.Value) 86 } 87 } 88 89 err = rows.Err() 90 if err != nil { 91 fmt.Printf("Error: %v\n", err) 92 os.Exit(1) 93 } 94 }