示例#1
0
 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)
示例#2
0
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)
示例#3
0
    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()))
示例#4
0
    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()))
示例#5
0
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