Source code for acdc.superdark.convert_superdark

import os
import argparse
from matplotlib.backends.backend_pdf import PdfPages
import copy
import asdf
import numpy as np
import matplotlib.pyplot as plt
dirname = os.path.dirname(__file__)
stylesheet = os.path.join(dirname, "../analysis", "niceplot.mplstyle")
plt.style.use(stylesheet)

[docs] def bin_superdark(superdark, bin_x=8, bin_y=2, bin_pha=26, phastart=3, phaend=28, outdir="."): with asdf.open(superdark) as af: # First bin by PHA binned = copy.deepcopy(af.tree[f"pha3-29"]) binned_ims = {"3-29": binned} binned = copy.deepcopy(af.tree[f"pha{phastart}-{phastart+1}"]) binned_ims = {} counter = 1 for i in range(phastart+1, phaend+2): if counter == bin_pha: counter = 0 binned_ims[f"{i-bin_pha}-{i}"] = binned binned = copy.deepcopy(af.tree[f"pha{i}-{i+1}"]) else: binned += af.tree[f"pha{i}-{i+1}"] counter += 1 sh = np.shape(binned) xdim = sh[1] ydim = sh[0] b_x0 = 0 b_x1 = (xdim // bin_x) * bin_x b_y0 = 0 b_y1 = (ydim // bin_y) * bin_y plt.imshow(binned_ims["3-29"], aspect="auto", origin="lower") plt.show() cont = input("press enter") pdffile = os.path.join(outdir, superdark.replace("asdf", "pdf")) pdf = PdfPages(pdffile) for k,binned in binned_ims.items(): binned = binned[b_y0:b_y1, b_x0:b_x1] binned_sh = np.shape(binned) binned_xdim = binned_sh[1] binned_ydim = binned_sh[0] tmp = binned.reshape(binned_ydim // bin_y, bin_y, binned_xdim // bin_x, bin_x) binned = tmp.sum(axis=3).sum(axis=1) binned_ims[k] = binned rate = binned/af["total_exptime"] spl = k.split("-") print(f"For PHAs {spl[0]} through {spl[1]}:") print(f"\tTotal number of events: {np.sum(binned):,}") print(f"\tTotal exptime of superdark: {af['total_exptime']:,}") print(f"\tMinimum number of events in a binned pixel: {np.min(binned)}") print(f"\tMean number of events per binned pixel: {np.mean(binned):.1f}") print(f"\t Standard deviation: {np.std(binned):.1f}") print(f"\tMedian number of events per binned pixel: {np.median(binned):.1f}") print(f"\tMean countrate per binned pixel: {np.mean(rate):.2e}") print(f"\t Standard deviation: {np.std(rate):.2e}") print(f"\tMedian countrate per binned pixel: {np.median(rate):.2e}") fig, ax = plt.subplots(figsize=(20,5)) #vmax = np.mean(binned) * 2 vmin = np.mean(rate) - 3*np.std(rate) if vmin < 0: vmin = 0 vmax = np.mean(rate) + 3*np.std(rate) im = ax.imshow(rate, aspect="auto", origin="lower", cmap="inferno", vmin=vmin, vmax=vmax) fig.colorbar(im, label="Counts/s", format="%.2e") ax.set_title(f"{af['segment']}; HV={af['hv']}; MJD {af['mjdstarts']}-{af['mjdends']}; PHA {spl[0]}-{spl[1]}; X bin={bin_x} Y bin={bin_y}") plt.tight_layout() pdf.savefig(fig) pdf.close() print(f"Wrote {pdffile}") for k in af.keys(): if k.startswith("pha"): continue binned_ims[k] = af[k] binned_ims["bin_x"] *= bin_x binned_ims["bin_y"] *= bin_y binned_ims["bin_pha"] *= bin_pha binned_ims["xend"] = b_x1 * bin_x + af["xstart"] binned_ims["yend"] = b_y1 * bin_y + af["ystart"] binned_ims["phastart"] = phastart binned_ims["phaend"] = phaend af = asdf.AsdfFile(binned_ims) outfile = f"binned_{superdark}" af.write_to(outfile) print(f"Wrote {outfile}") return binned_ims
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument(dest="superdark", help="Name of superdark to bin") parser.add_argument("-x", "--binx", default=8, type=int, help="Amount to bin in X") parser.add_argument("-y", "--biny", default=2, type=int, help="Amount to bin in X") parser.add_argument("-p", "--binpha", default=26, type=int, help="Amount to bin in X") parser.add_argument("--phastart", default=3, type=int, help="Lower limit of PHA range") parser.add_argument("--phaend", default=28, type=int, help="Upper limit of PHA range") parser.add_argument("-o", "--outdir", default=".", help="Output directory") args = parser.parse_args() bin_superdark(args.superdark, args.binx, args.biny, args.binpha, args.phastart, args.phaend, args.outdir)