github.com/astrogo/cfitsio@v0.1.0/examples/go-cfitsio-mergefiles/main.go (about)

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