def test_stack(self): ccd = MaskedCCD(self.image_file) overscan = makeAmplifierGeometry(self.image_file) for method in ['mean', 'row', 'func']: corrected = [] for image in ccd.values(): corrected.append( imutils.unbias_and_trim(image, overscan.serial_overscan, bias_method=method, **self.kwargs).getImage()) stacked = imutils.stack(corrected) imarr = stacked.getArray() if method == 'mean': self.assertTrue(max(np.abs(imarr.flat)) < 2) else: self.assertTrue(max(np.abs(imarr.flat)) < 1e-6)
def calibrated_stack(infiles, outfile, bias_frame=None, dark_frame=None, linearity_correction=None, bitpix=32): ccds = [ MaskedCCD(infile, bias_frame=bias_frame, dark_frame=dark_frame, linearity_correction=linearity_correction) for infile in infiles ] all_amps = imutils.allAmps(infiles[0]) amp_images = {} for amp in all_amps: amp_ims = [ccd.bias_subtracted_image(amp) for ccd in ccds] amp_images[amp] = imutils.stack(amp_ims).getImage() imutils.writeFits(amp_images, outfile, infiles[0], bitpix=bitpix)
def run(self, sensor_name, infiles, bias_frame=None, dark_frame=None, linearity_correction=None): if not isinstance(infiles, list): infiles = [infiles] ## Get sensor information from header all_amps = imutils.allAmps(infiles[0]) with fits.open(infiles[0]) as hdulist: lsst_num = hdulist[0].header['LSST_NUM'] teststand = hdulist[0].header['TSTAND'] manufacturer = lsst_num[:3] ## Interface with SQL database database = self.config.database logging.info( "{0} Running CrosstalkColumnTask using database {1}".format( datetime.now(), database)) with db_session(database) as session: ## Get sensor from database try: sensor = Sensor.from_db(session, sensor_name=sensor_name) except NoResultFound: sensor = Sensor(sensor_name=sensor_name, lsst_num=lsst_num, manufacturer=manufacturer, namps=len(all_amps)) sensor.segments = { i: Segment(segment_name=AMP2SEG[i], amplifier_number=i) for i in all_amps } sensor.add_to_db(session) session.commit() logging.info("{0} New sensor {1} added to database".format( datetime.now(), sensor_name)) ## Set configuration and analysis settings ly = self.config.length_y lx = self.config.length_x threshold = self.config.threshold if len(infiles) > 1: is_coadd = True else: is_coadd = False ccds = [ MaskedCCD(infile, bias_frame=bias_frame, dark_frame=dark_frame, linearity_correction=linearity_correction) for infile in infiles ] logging.info("{0} ".format(datetime.now()) + \ "Processing files: {}".format(' '.join(map(str, infiles)))) ## Aggressor amplifiers for i in all_amps: ## Find aggressor regions exptime = 1 gain = 1 bp = BrightPixels(ccds[0], i, exptime, gain, ethresh=threshold) pixels, columns = bp.find() if len(columns) == 0: continue col = columns[0] read_noise = calculate_read_noise(ccds[0], i) * np.sqrt( 2. / len(ccds)) aggressor_images = [ ccd.unbiased_and_trimmed_image(i).getImage() for ccd in ccds ] aggressor_imarr = imutils.stack(aggressor_images).getArray() signal = np.mean(aggressor_imarr[:, col]) mask = rectangular_mask(aggressor_imarr, 1000, col, ly=ly, lx=lx) ## Victim amplifiers for j in all_amps: victim_images = [ ccd.unbiased_and_trimmed_image(j).getImage() for ccd in ccds ] victim_imarr = imutils.stack(victim_images).getArray() ## Add crosstalk result to database res = crosstalk_fit(aggressor_imarr, victim_imarr, mask, noise=read_noise) result = Result(aggressor_id=sensor.segments[i].id, victim_id=sensor.segments[j].id, aggressor_signal=signal, coefficient=res[0], error=res[4], methodology='MODEL_LSQ', image_type='brightcolumn', teststand=teststand, analysis='CrosstalkColumnTask', is_coadd=is_coadd, z_offset=res[1], y_tilt=res[2], x_tilt=res[3]) result.add_to_db(session) logging.info( "{0} Injested C({1},{2}) for signal {3:.1f}".format( datetime.now(), i, j, signal)) logging.info("{0} Task completed successfully.".format( datetime.now()))
def run(self, sensor_name, infiles, bias_frame=None, dark_frame=None, linearity_correction=None): if not isinstance(infiles, list): infiles = [infiles] ## Get sensor information from header all_amps = imutils.allAmps(infiles[0]) with fits.open(infiles[0]) as hdulist: lsst_num = hdulist[0].header['LSST_NUM'] teststand = hdulist[0].header['TSTAND'] manufacturer = lsst_num[:3] ## Interface with SQL database database = self.config.database logging.info( "{0} Running CrosstalkSatelliteTask using database {1}".format( datetime.now(), database)) with db_session(database) as session: ## Get sensor from database try: sensor = Sensor.from_db(session, sensor_name=sensor_name) except NoResultFound: sensor = Sensor(sensor_name=sensor_name, lsst_num=lsst_num, manufacturer=manufacturer, namps=len(all_amps)) sensor.segments = { i: Segment(segment_name=AMP2SEG[i], amplifier_number=i) for i in all_amps } sensor.add_to_db(session) session.commit() logging.info("{0} New sensor {1} added to database".format( datetime.now(), sensor_name)) ## Set configuration and analysis settings width = self.config.width restrict_to_side = self.config.restrict_to_side canny_sigma = self.config.canny_sigma low_threshold = self.config.low_threshold high_threshold = self.config.high_threshold if len(infiles) > 1: is_coadd = True else: is_coadd = False ccds = [ MaskedCCD(infile, bias_frame=bias_frame, dark_frame=dark_frame, linearity_correction=linearity_correction) for infile in infiles ] logging.info("{0} ".format(datetime.now()) + \ "Processing files: {}".format(' '.join(map(str, infiles)))) ## Aggressor amplifiers for i in all_amps: aggressor_images = [ ccd.unbiased_and_trimmed_image(i).getImage() for ccd in ccds ] aggressor_imarr = imutils.stack(aggressor_images).getArray() ## Find aggressor regions tested_angles = np.linspace(-np.pi / 2, np.pi / 2, 1000) edges = feature.canny(aggressor_imarr, sigma=canny_sigma, low_threshold=low_threshold, high_threshold=high_threshold) h, theta, d = hough_line(edges, theta=tested_angles) _, angle, dist = hough_line_peaks(h, theta, d) if len(angle) != 2: continue read_noise = calculate_read_noise(ccds[0], i) * np.sqrt( 2. / len(ccds)) mean_angle = np.mean(angle) mean_dist = np.mean(dist) mask = satellite_mask(aggressor_imarr, mean_angle, mean_dist, width=width) signal = np.max(aggressor_imarr[~mask]) ## Victim amplifiers if restrict_to_side: if i < 9: vic_amps = range(1, 9) else: vic_amps = range(9, 17) else: vic_amps = all_amps for j in vic_amps: victim_images = [ ccd.unbiased_and_trimmed_image(j).getImage() for ccd in ccds ] victim_imarr = imutils.stack(victim_images).getArray() res = crosstalk_fit(aggressor_imarr, victim_imarr, mask, noise=read_noise) ## Add result to database result = Result(aggressor_id=sensor.segments[i].id, victim_id=sensor.segments[j].id, aggressor_signal=signal, coefficient=res[0], error=res[4], methodology='MODEL_LSQ', teststand=teststand, image_type='satellite', analysis='CrosstalkSatelliteTask', is_coadd=is_coadd, z_offset=res[1], y_tilt=res[2], x_tilt=res[3]) result.add_to_db(session) logging.info( "{0} Injested C({1},{2}) for signal {3:.1f}".format( datetime.now(), i, j, signal)) logging.info("{0} Task completed successfully.".format( datetime.now()))
def stack_images(butler, in_files, statistic=afwMath.MEDIAN, **kwargs): """Stack a set of images Parameters ---------- butler : `Butler` or `None` Data Butler (or none) in_files : `list` Data to stack, either data_ids or filenames statistic : `int` Statisitic used to make superbias image Keywords -------- bias_type : `str` Unbiasing method to use superbias_frame : `MaskedCCD` or `None` Bias image to subtract log : `log` Logging stream Returns ------- out_dict : `dict` Mapping amplifier index to stacked image """ bias_type = kwargs.get('bias_type', 'spline') bias_type_col = kwargs.get('bias_type_col', None) superbias_frame = kwargs.get('superbias_frame', None) log = kwargs.get('log', None) gains = kwargs.get('gains', None) nlc = kwargs.get('nlc', None) stat_ctrl = kwargs.get('stat_ctrl', None) if stat_ctrl is None: stat_ctrl = afwMath.StatisticsControl() amp_stack_dict = {} out_dict = {} exp_time = 0.0 used_files = 0 for ifile, in_file in enumerate(in_files): if ifile % 10 == 0: if log is not None: log.info(" %i" % ifile) try: ccd = get_ccd_from_id(butler, in_file, mask_files=[]) except Exception: if log is not None: log.warn(" Failed to read %s, skipping" % (str(in_file))) continue used_files += 1 exp_time += get_exposure_time(ccd) amps = get_amp_list(ccd) offset = get_amp_offset(ccd, superbias_frame) for iamp, amp in enumerate(amps): regions = get_geom_regions(ccd, amp) serial_oscan = regions['serial_overscan'] parallel_oscan = regions['parallel_overscan'] img = get_raw_image(ccd, amp) superbias_im = raw_amp_image(superbias_frame, amp + offset) unbiased = unbias_amp(img, serial_oscan, bias_type=bias_type, superbias_im=superbias_im, bias_type_col=bias_type_col, parallel_oscan=parallel_oscan) if gains is not None: unbiased.image.array *= gains[iamp] if nlc is not None: unbiased.image.array = nlc(unbiased.image.array) if ifile == 0: amp_stack_dict[amp] = [unbiased] else: amp_stack_dict[amp].append(unbiased) if used_files: exp_time /= float(used_files) else: return None out_dict['METADATA'] = dict(EXPTIME=exp_time) for key, val in amp_stack_dict.items(): if butler is None: outkey = key else: outkey = key + 1 stackimage = imutil.stack(val, statistic, stat_ctrl=stat_ctrl) out_dict[outkey] = stackimage.image if log is not None: log.info("Done!") return out_dict