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 }