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 }