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  }