def calculate_charge_resolutions(parser, chargeres_cmdlines): run = 0 num_runs = len(chargeres_cmdlines) chargeres_dict = {} for name, cmdline in chargeres_cmdlines.items(): args, excess_args = parser.parse_known_args(cmdline) run += 1 log.info("[run] Calculating charge resolution {}/{}".format( run, num_runs)) # Print event/args values log.info("[files] {}".format(args.input_paths)) telescopes = "All" if args.tel is None else args.tel log.info("[origin] {}".format(args.origin)) log.info("[telescopes] {}".format(telescopes)) # Obtain InputFiles (to check files exist) input_file_list = [] for filepath in args.input_paths: tilde_filepath = os.path.expanduser(filepath) for globfile in glob.glob(tilde_filepath): input_file_list.append(InputFile(globfile, args.origin)) # Find maxpe maxpe = args.maxpe if maxpe is None: maxpe = 0 for input_file in input_file_list: file_maxpe = input_file.find_max_true_npe(args.tel) if file_maxpe > maxpe: maxpe = file_maxpe log.info("[maxpe] {}".format(maxpe)) params, unknown_args = calibration_parameters(excess_args, args.origin, args.calib_help) chargeres = ChargeResolution(maxpe) for input_file in input_file_list: source = input_file.read() calibrated_source = calibrate_source(source, params) chargeres.add_source(calibrated_source, args.tel) # Plot comparison graphs if args.comparison is not None: hist = chargeres.variation_hist hist[hist == 0.0] = np.nan xedges = chargeres.variation_xedges yedges = chargeres.variation_yedges fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111) ax.set_title(name) x, y = np.meshgrid(xedges, yedges) x = np.power(10, x) y = np.power(10, y) hist_mask = np.ma.masked_where(np.isnan(hist), hist) im = ax.pcolormesh(x, y, hist_mask, norm=LogNorm(), cmap=plt.cm.viridis) cb = plt.colorbar(im) ax.set_aspect('equal') ax.grid() ax.set_xscale('log') ax.set_yscale('log') ax.set_xlabel(r'True Charge $Q_T$ (p.e.)') ax.set_ylabel(r'Measured Charge $Q_M$ (p.e.)') cb.ax.set_ylabel("Count") line = np.linspace(*ax.get_xlim(), 100) ax.plot(line, line, c='0.75', ls='--') # Add minor ticks lmin = floor(log10(hist_mask.min())) lmax = ceil(log10(hist_mask.max())) logticks = np.tile(np.arange(lmin, 10), lmax) * (np.power( 10, np.arange(lmax * 10) // 10)) logticks = im.norm( logticks[(logticks != 0) & (logticks >= hist_mask.min()) & (logticks <= hist_mask.max())]) cb.ax.yaxis.set_ticks(logticks, minor=True) cb.ax.yaxis.set_tick_params(which='minor', length=5) cb.ax.tick_params(length=10) args.comparison = os.path.expanduser(args.comparison) output_dir = dirname(args.comparison) if not os.path.exists(output_dir): log.info("[output] Creating directory: {}".format(output_dir)) os.makedirs(output_dir) log.info("[output] {}".format(args.comparison)) warnings.filterwarnings("ignore", module="matplotlib") with warnings.catch_warnings(): warnings.simplefilter("ignore") fig.savefig(args.comparison, bbox_inches='tight') chargeres_dict[name] = chargeres log.info('[run] Charge resolution calculations finished') return chargeres_dict