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

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	fits "github.com/astrogo/fitsio"
    10  )
    11  
    12  func main() {
    13  
    14  	flag.Usage = func() {
    15  		const msg = `Usage: go-fitsio-mergefiles -o outfname file1 file2 [file3 ...]
    16  
    17  Merge FITS tables into a single file/table.
    18  
    19  `
    20  		fmt.Fprintf(os.Stderr, "%v\n", msg)
    21  		flag.PrintDefaults()
    22  	}
    23  
    24  	outfname := flag.String("o", "out.fits", "path to merged FITS file")
    25  
    26  	flag.Parse()
    27  	if flag.NArg() < 2 {
    28  		flag.Usage()
    29  		os.Exit(1)
    30  	}
    31  
    32  	_, err := os.Stat(*outfname)
    33  	if err == nil {
    34  		err = os.Remove(*outfname)
    35  		if err != nil {
    36  			panic(err)
    37  		}
    38  	}
    39  
    40  	start := time.Now()
    41  	defer func() {
    42  		delta := time.Since(start)
    43  		fmt.Printf("::: timing: %v\n", delta)
    44  	}()
    45  
    46  	fmt.Printf("::: creating merged file [%s]...\n", *outfname)
    47  	w, err := os.Create(*outfname)
    48  	if err != nil {
    49  		panic(err)
    50  	}
    51  	defer w.Close()
    52  
    53  	out, err := fits.Create(w)
    54  	if err != nil {
    55  		panic(err)
    56  	}
    57  	defer out.Close()
    58  
    59  	infiles := make([]string, 0, flag.NArg())
    60  	for i := 0; i < flag.NArg(); i++ {
    61  		fname := flag.Arg(i)
    62  		infiles = append(infiles, fname)
    63  	}
    64  
    65  	var table *fits.Table
    66  	fmt.Printf("::: merging [%d] FITS files...\n", len(infiles))
    67  	for i, fname := range infiles {
    68  		r, err := os.Open(fname)
    69  		if err != nil {
    70  			panic(err)
    71  		}
    72  		defer r.Close()
    73  		f, err := fits.Open(r)
    74  		if err != nil {
    75  			panic(err)
    76  		}
    77  		defer f.Close()
    78  		hdu := f.HDU(1).(*fits.Table)
    79  		nrows := hdu.NumRows()
    80  		fmt.Printf("::: reading [%s] -> nrows=%d\n", fname, nrows)
    81  		if i == 0 {
    82  			// get header from first input file
    83  			err = fits.CopyHDU(out, f, 0)
    84  			if err != nil {
    85  				panic(err)
    86  			}
    87  
    88  			// get schema from first input file
    89  			cols := hdu.Cols()
    90  			table, err = fits.NewTable(hdu.Name(), cols, hdu.Type())
    91  			if err != nil {
    92  				panic(err)
    93  			}
    94  			defer table.Close()
    95  		}
    96  
    97  		err = fits.CopyTable(table, hdu)
    98  		if err != nil {
    99  			panic(err)
   100  		}
   101  
   102  	}
   103  	err = out.Write(table)
   104  	if err != nil {
   105  		panic(err)
   106  	}
   107  
   108  	fmt.Printf("::: merging [%d] FITS files... [done]\n", len(infiles))
   109  	fmt.Printf("::: nrows: %d\n", table.NumRows())
   110  }