Exemple #1
0
def main():

    brickname = '2428p117'
    objtype = 'STAR'
    lobjtype = objtype.lower()

    decals_sim_dir = '/Users/ioannis/decals_sim_dir/star/2428p117'

    zoom = [1800,2400,1800,2400]
    #zoom = [1800,2000,1800,2000]
    #zoom = None

    decals = Decals()
    brickinfo = decals.get_brick_by_name(brickname)
    brickwcs = wcs_for_brick(brickinfo)
    W, H, pixscale = brickwcs.get_width(), brickwcs.get_height(), brickwcs.pixel_scale()

    if zoom is not None:
        # See also runbrick.stage_tims()
        #(x0,x1,y0,y1) = args.zoom
        (x0,x1,y0,y1) = zoom
        W = x1-x0
        H = y1-y0
        targetwcs = brickwcs.get_subimage(x0, y0, W, H)

    bounds = brickwcs.radec_bounds()
    ra_range = bounds[1]-bounds[0]
    dec_range = bounds[3]-bounds[2]
    radec_center = brickwcs.radec_center()
    print(radec_center, ra_range, dec_range)
        
    corners = np.array([brickwcs.pixelxy2radec(x,y) for x,y in
                        [(1,1),(W,1),(W,H),(1,H),(1,1)]])
    

    # Identify the CCDs in the region of interest.
    ccdinfo = decals.ccds_touching_wcs(brickwcs)
    ccdinfo.about()
    log.info('Got {} CCDs'.format(len(ccdinfo)))

    # Generate the catalog of simulated sources here!
    simcat = fits_table('simcat-{}-{}-00.fits'.format(brickname,lobjtype))
    #simcat = fits.getdata('simcat-{}-{}-00.fits'.format(brickname,lobjtype))
    simcat.about()
    blobxy = zip(simcat.x,simcat.y)

    simdecals = SimDecals(sim_sources=simcat)

    # For testing!
    #sim = SimImage(simdecals,ccdinfo[0])
    #tim = sim.get_tractor_image(const2psf=True)

    run_brick(brickname, decals=simdecals, outdir=decals_sim_dir,
              threads=8, zoom=zoom, wise=False, sdssInit=False,
              forceAll=True, writePickles=False, blobxy=blobxy,
              pixPsf=False, stages=['tims','srcs','fitblobs',
                                    'fitblobs_finish','coadds',
                                    'writecat'])
Exemple #2
0
def main():
    """Main routine which parses the optional inputs."""

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description='DECaLS simulations.')
    parser.add_argument('-n',
                        '--nobj',
                        type=long,
                        default=None,
                        metavar='',
                        help='number of objects to simulate (required input)')
    parser.add_argument('-c',
                        '--chunksize',
                        type=long,
                        default=500,
                        metavar='',
                        help='divide NOBJ into CHUNKSIZE chunks')
    parser.add_argument('-b',
                        '--brick',
                        type=str,
                        default='2428p117',
                        metavar='',
                        help='simulate objects in this brick')
    parser.add_argument('-o',
                        '--objtype',
                        type=str,
                        default='STAR',
                        metavar='',
                        help='object type (STAR, ELG, LRG, QSO, LSB)')
    parser.add_argument(
        '-t',
        '--threads',
        type=int,
        default=8,
        metavar='',
        help='number of threads to use when calling The Tractor')
    parser.add_argument('-s',
                        '--seed',
                        type=long,
                        default=None,
                        metavar='',
                        help='random number seed')
    parser.add_argument('-z',
                        '--zoom',
                        nargs=4,
                        type=int,
                        metavar='',
                        help='see runbrick.py; (default is 0 3600 0 3600)')
    parser.add_argument('--rmag-range',
                        nargs=2,
                        type=float,
                        default=(18, 25),
                        metavar='',
                        help='r-band magnitude range')
    parser.add_argument('--no-qaplots',
                        action='store_true',
                        help='do not generate QAplots')
    parser.add_argument('-v',
                        '--verbose',
                        dest='verbose',
                        action='count',
                        default=0,
                        help='toggle on verbose output')

    args = parser.parse_args()
    if args.nobj is None:
        parser.print_help()
        sys.exit(1)

    # Set the debugging level
    if args.verbose:
        lvl = logging.DEBUG
    else:
        lvl = logging.INFO
    logging.basicConfig(format='%(message)s', level=lvl, stream=sys.stdout)
    log = logging.getLogger('__name__')

    brickname = args.brick
    objtype = args.objtype.upper()
    lobjtype = objtype.lower()

    if objtype == 'LRG':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype == 'LSB':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype == 'QSO':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)

    # Determine how many chunks we need
    nobj = args.nobj
    chunksize = args.chunksize
    nchunk = long(np.ceil(nobj / chunksize))

    log.info('Object type = {}'.format(objtype))
    log.info('Number of objects = {}'.format(nobj))
    log.info('Chunksize = {}'.format(chunksize))
    log.info('Number of chunks = {}'.format(nchunk))

    # Optionally zoom into a portion of the brick
    decals = Decals()
    brickinfo = decals.get_brick_by_name(brickname)
    brickwcs = wcs_for_brick(brickinfo)
    W, H, pixscale = brickwcs.get_width(), brickwcs.get_height(
    ), brickwcs.pixel_scale()

    log.info('Brick = {}'.format(brickname))
    if args.zoom is not None:  # See also runbrick.stage_tims()
        (x0, x1, y0, y1) = args.zoom
        W = x1 - x0
        H = y1 - y0
        brickwcs = brickwcs.get_subimage(x0, y0, W, H)
        log.info('Zoom (pixel boundaries) = {}'.format(args.zoom))

    radec_center = brickwcs.radec_center()
    log.info('RA, Dec center = {}'.format(radec_center))
    log.info('Brick = {}'.format(brickname))

    if args.seed is not None:
        log.info('Random seed = {}'.format(args.seed))

    # Pack the input parameters into a meta-data table.
    meta = Table()
    meta['brickname'] = Column([brickname], dtype='S10')
    meta['objtype'] = Column([objtype], dtype='S10')
    if args.seed is not None:
        meta['seed'] = Column([args.seed], dtype='i4')
    meta['nobj'] = Column([args.nobj], dtype='i4')
    meta['chunksize'] = Column([args.chunksize], dtype='i2')
    meta['nchunk'] = Column([nchunk], dtype='i2')
    #meta['RA'] = Column([ra_range],dtype='f8')
    #meta['DEC'] = Column([dec_range],dtype='f8')
    if args.zoom is None:
        meta['zoom'] = Column([[0, 3600, 0, 3600]], dtype='i4')
    else:
        meta['zoom'] = Column([args.zoom], dtype='i4')
    meta['rmag_range'] = Column([args.rmag_range], dtype='f4')

    print('Hack!')
    decals_sim_dir = './'
    metafile = os.path.join(decals_sim_dir,
                            'metacat-' + brickname + '-' + lobjtype + '.fits')
    log.info('Writing {}'.format(metafile))
    if os.path.isfile(metafile):
        os.remove(metafile)
    meta.write(metafile)

    # Work in chunks.
    for ichunk in range(nchunk):
        log.info('Working on chunk {:02d}/{:02d}'.format(ichunk + 1, nchunk))
        chunksuffix = '{:02d}'.format(ichunk)

        # There's probably a smarter way to do this
        if ((ichunk + 1) * chunksize) > nobj:
            nobjchunk = (ichunk + 1) * chunksize - nobj
        else:
            nobjchunk = chunksize
        print(nobjchunk)

        # Build and write out the simulated object catalog.
        simcat = build_simcat(nobjchunk, brickname, brickwcs, meta)
        simcatfile = os.path.join(
            decals_sim_dir, 'simcat-' + brickname + '-' + lobjtype + '-' +
            chunksuffix + '.fits')
        log.info('Writing {}'.format(simcatfile))
        if os.path.isfile(simcatfile):
            os.remove(simcatfile)
        simcat.write(simcatfile)
        #fitsio.write(simcatfile,simcat)

        # Use Tractor to just process the blobs containing the simulated sources.
        simdecals = SimDecals(sim_sources=simcat)

        # Test code
        ccdinfo = decals.ccds_touching_wcs(brickwcs)
        sim = SimImage(simdecals, ccdinfo[0])
        tim = sim.get_tractor_image(const2psf=True)
Exemple #3
0
def main():
    """Main routine which parses the optional inputs."""

    parser = argparse.ArgumentParser(formatter_class=argparse.
                                     ArgumentDefaultsHelpFormatter,
                                     description='DECaLS simulations.')
    parser.add_argument('-n', '--nobj', type=long, default=None, metavar='', 
                        help='number of objects to simulate (required input)')
    parser.add_argument('-c', '--chunksize', type=long, default=500, metavar='', 
                        help='divide NOBJ into CHUNKSIZE chunks')
    parser.add_argument('-b', '--brick', type=str, default='2428p117', metavar='', 
                        help='simulate objects in this brick')
    parser.add_argument('-o', '--objtype', type=str, default='STAR', metavar='', 
                        help='object type (STAR, ELG, LRG, QSO, LSB)') 
    parser.add_argument('-t', '--threads', type=int, default=8, metavar='', 
                        help='number of threads to use when calling The Tractor')
    parser.add_argument('-s', '--seed', type=long, default=None, metavar='', 
                        help='random number seed')
    parser.add_argument('-z', '--zoom', nargs=4, type=int, metavar='', 
                        help='see runbrick.py; (default is 0 3600 0 3600)')
    parser.add_argument('--rmag-range', nargs=2, type=float, default=(18,25), metavar='', 
                        help='r-band magnitude range')
    parser.add_argument('--test', action='store_true',
                        help='run the test code and write out test images')
    parser.add_argument('-v', '--verbose', action='store_true', 
                        help='toggle on verbose output')

    args = parser.parse_args()
    if args.nobj is None:
        parser.print_help()
        sys.exit(1)

    # Set the debugging level
    if args.verbose:
        lvl = logging.DEBUG
    else:
        lvl = logging.INFO
    logging.basicConfig(format='%(message)s',level=lvl,stream=sys.stdout)
    log = logging.getLogger('__name__')

    brickname = args.brick
    objtype = args.objtype.upper()
    lobjtype = objtype.lower()

    if objtype=='LRG':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype=='LSB':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype=='QSO':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)

    # Determine how many chunks we need
    nobj = args.nobj
    chunksize = args.chunksize
    nchunk = long(np.ceil(nobj/chunksize))

    log.info('Object type = {}'.format(objtype))
    log.info('Number of objects = {}'.format(nobj))
    log.info('Chunksize = {}'.format(chunksize))
    log.info('Number of chunks = {}'.format(nchunk))

    # Optionally zoom into a portion of the brick
    decals = Decals()
    brickinfo = decals.get_brick_by_name(brickname)
    brickwcs = wcs_for_brick(brickinfo)
    W, H, pixscale = brickwcs.get_width(), brickwcs.get_height(), brickwcs.pixel_scale()
    print(W, H, pixscale)

    log.info('Brick = {}'.format(brickname))
    if args.zoom is not None: # See also runbrick.stage_tims()
        (x0,x1,y0,y1) = args.zoom
        W = x1-x0
        H = y1-y0
        brickwcs = brickwcs.get_subimage(x0, y0, W, H)
        log.info('Zoom (pixel boundaries) = {}'.format(args.zoom))
    targetrd = np.array([brickwcs.pixelxy2radec(x,y) for x,y in
                         [(1,1),(W,1),(W,H),(1,H),(1,1)]])
 
    radec_center = brickwcs.radec_center()
    log.info('RA, Dec center = {}'.format(radec_center))
    log.info('Brick = {}'.format(brickname))

    if args.seed is not None:
        log.info('Random seed = {}'.format(args.seed))

    # Pack the input parameters into a meta-data table.
    metacat = Table()
    metacat['brickname'] = Column([brickname],dtype='S10')
    metacat['objtype'] = Column([objtype],dtype='S10')
    if args.seed is not None:
        metacat['seed'] = Column([args.seed],dtype='i4')
    metacat['nobj'] = Column([args.nobj],dtype='i4')
    metacat['chunksize'] = Column([args.chunksize],dtype='i2')
    metacat['nchunk'] = Column([nchunk],dtype='i2')
    #metacat['RA'] = Column([ra_range],dtype='f8')
    #metacat['DEC'] = Column([dec_range],dtype='f8')
    if args.zoom is None:
        metacat['zoom'] = Column([[0,3600,0,3600]],dtype='i4')
    else:
        metacat['zoom'] = Column([args.zoom],dtype='i4')
    metacat['rmag_range'] = Column([args.rmag_range],dtype='f4')

    print('Hack!')
    decals_sim_dir = './'
    metafile = os.path.join(decals_sim_dir,'metacat-'+brickname+'-'+lobjtype+'.fits')
    log.info('Writing {}'.format(metafile))
    if os.path.isfile(metafile):
        os.remove(metafile)
    metacat.write(metafile)

    # Work in chunks.
    for ichunk in range(nchunk):
        log.info('Working on chunk {:02d}/{:02d}'.format(ichunk+1,nchunk))
        chunksuffix = '{:02d}'.format(ichunk)

        # There's probably a smarter way to do this
        nobjchunk = np.min((nobj,chunksize))
        if (nchunk>1) and (ichunk==(nchunk-1)):
            nobjchunk = np.max((nobjchunk,nobj%((nchunk-1)*chunksize)))

        # Build and write out the simulated object catalog.
        simcat = build_simcat(nobjchunk,brickname,brickwcs,metacat)
        simcatfile = os.path.join(decals_sim_dir,'simcat-'+brickname+'-'+
                                  lobjtype+'-'+chunksuffix+'.fits')
        log.info('Writing {}'.format(simcatfile))
        if os.path.isfile(simcatfile):
            os.remove(simcatfile)
        simcat.write(simcatfile)

#       # Use Tractor to just process the blobs containing the simulated sources. 
        if args.test:
            # Test code
            simdecals = SimDecals(metacat=metacat, simcat=simcat, test=True)
            ccdinfo = decals.ccds_touching_wcs(brickwcs)
            sim = SimImage(simdecals, ccdinfo[19])
            tim = sim.get_tractor_image(const2psf=True, radecpoly=targetrd)
            #for ii, ccd in enumerate(ccdinfo):
            #    log.info('Working on CCD {}'.format(ii))
            #    sim = SimImage(simdecals,ccd)
            #    tim = sim.get_tractor_image(const2psf=True, radecpoly=targetrd, test=args.test)
        else:
            simdecals = SimDecals(metacat=metacat,simcat=simcat)
            blobxy = zip(simcat['x'],simcat['y'])
            run_brick(brickname, decals=simdecals, outdir=decals_sim_dir,
                      threads=8, zoom=args.zoom, wise=False, sdssInit=False,
                      forceAll=True, writePickles=False, do_calibs=False,
                      write_metrics=False, pixPsf=False, blobxy=blobxy, 
                      early_coadds=False, stages=['writecat'])
Exemple #4
0
        print 'File', fn
        (h,t) = os.path.split(fn)
        (h,t) = os.path.split(h)
        print 'Brick:', t
        brickname = t
        bricknames.append(brickname)

    for brickname in bricknames:
        scaledfns = glob('data/scaled/decals-dr2/*/%s/image-%s-*.fits' %
                         (brickname[:3], brickname))
        for s in scaledfns:
            print 'Deleting', s
            os.unlink(s)

    for brickname in bricknames:
        brick = decals.get_brick_by_name(brickname)
        print 'Got brick:', brick
        bwcs = wcs_for_brick(brick)

        for zoom in list(reversed(range(5, 13))):
            print 'Zoom', zoom
            xx,yy = tiles_touching_wcs(bwcs, zoom)
            print len(xx), 'tiles touching WCS'

            for x,y in zip(xx,yy):
                v = 2
                map_decals_dr2(req, v, zoom, x, y, savecache=True, forcecache=True,
                               ignoreCached=True,
                               hack_jpeg=True, drname='decals-dr2')

Exemple #5
0
        print 'File', fn
        (h, t) = os.path.split(fn)
        (h, t) = os.path.split(h)
        print 'Brick:', t
        brickname = t
        bricknames.append(brickname)

    for brickname in bricknames:
        scaledfns = glob('data/scaled/decals-dr2/*/%s/image-%s-*.fits' %
                         (brickname[:3], brickname))
        for s in scaledfns:
            print 'Deleting', s
            os.unlink(s)

    for brickname in bricknames:
        brick = decals.get_brick_by_name(brickname)
        print 'Got brick:', brick
        bwcs = wcs_for_brick(brick)

        for zoom in list(reversed(range(5, 13))):
            print 'Zoom', zoom
            xx, yy = tiles_touching_wcs(bwcs, zoom)
            print len(xx), 'tiles touching WCS'

            for x, y in zip(xx, yy):
                v = 2
                map_decals_dr2(req,
                               v,
                               zoom,
                               x,
                               y,
Exemple #6
0
def main():
    """Main routine which parses the optional inputs."""

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description='DECaLS simulations.')
    parser.add_argument('-n',
                        '--nobj',
                        type=long,
                        default=None,
                        metavar='',
                        help='number of objects to simulate (required input)')
    parser.add_argument('-c',
                        '--chunksize',
                        type=long,
                        default=500,
                        metavar='',
                        help='divide NOBJ into CHUNKSIZE chunks')
    parser.add_argument('-b',
                        '--brick',
                        type=str,
                        default='2428p117',
                        metavar='',
                        help='simulate objects in this brick')
    parser.add_argument('-o',
                        '--objtype',
                        type=str,
                        default='STAR',
                        metavar='',
                        help='object type (STAR, ELG, LRG, QSO, LSB)')
    parser.add_argument(
        '-t',
        '--threads',
        type=int,
        default=8,
        metavar='',
        help='number of threads to use when calling The Tractor')
    parser.add_argument('-s',
                        '--seed',
                        type=long,
                        default=None,
                        metavar='',
                        help='random number seed')
    parser.add_argument('-z',
                        '--zoom',
                        nargs=4,
                        type=int,
                        metavar='',
                        help='see runbrick.py; (default is 0 3600 0 3600)')
    parser.add_argument('--rmag-range',
                        nargs=2,
                        type=float,
                        default=(18, 26),
                        metavar='',
                        help='r-band magnitude range')
    parser.add_argument('-v',
                        '--verbose',
                        action='store_true',
                        help='toggle on verbose output')

    args = parser.parse_args()
    if args.nobj is None:
        parser.print_help()
        sys.exit(1)

    # Set the debugging level
    if args.verbose:
        lvl = logging.DEBUG
    else:
        lvl = logging.INFO
    logging.basicConfig(format='%(message)s', level=lvl, stream=sys.stdout)
    log = logging.getLogger('__name__')

    brickname = args.brick
    objtype = args.objtype.upper()
    lobjtype = objtype.lower()

    if objtype == 'LRG':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype == 'LSB':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)
    elif objtype == 'QSO':
        log.warning('{} objtype not yet supported!'.format(objtype))
        sys.exit(1)

    # Determine how many chunks we need
    nobj = args.nobj
    chunksize = args.chunksize
    nchunk = long(np.ceil(nobj / chunksize))

    log.info('Object type = {}'.format(objtype))
    log.info('Number of objects = {}'.format(nobj))
    log.info('Chunksize = {}'.format(chunksize))
    log.info('Number of chunks = {}'.format(nchunk))

    # Optionally zoom into a portion of the brick
    decals = Decals()
    brickinfo = decals.get_brick_by_name(brickname)
    brickwcs = wcs_for_brick(brickinfo)
    W, H, pixscale = brickwcs.get_width(), brickwcs.get_height(
    ), brickwcs.pixel_scale()
    print(W, H, pixscale)

    log.info('Brick = {}'.format(brickname))
    if args.zoom is not None:  # See also runbrick.stage_tims()
        (x0, x1, y0, y1) = args.zoom
        W = x1 - x0
        H = y1 - y0
        brickwcs = brickwcs.get_subimage(x0, y0, W, H)
        log.info('Zoom (pixel boundaries) = {}'.format(args.zoom))
    targetrd = np.array([
        brickwcs.pixelxy2radec(x, y)
        for x, y in [(1, 1), (W, 1), (W, H), (1, H), (1, 1)]
    ])

    radec_center = brickwcs.radec_center()
    log.info('RA, Dec center = {}'.format(radec_center))
    log.info('Brick = {}'.format(brickname))

    # Pack the input parameters into a meta-data table.
    metacat = Table()
    metacat['brickname'] = Column([brickname], dtype='S10')
    metacat['objtype'] = Column([objtype], dtype='S10')
    metacat['nobj'] = Column([args.nobj], dtype='i4')
    metacat['chunksize'] = Column([args.chunksize], dtype='i2')
    metacat['nchunk'] = Column([nchunk], dtype='i2')
    #metacat['RA'] = Column([ra_range],dtype='f8')
    #metacat['DEC'] = Column([dec_range],dtype='f8')
    if args.zoom is None:
        metacat['zoom'] = Column([[0, 3600, 0, 3600]], dtype='i4')
    else:
        metacat['zoom'] = Column([args.zoom], dtype='i4')
    metacat['rmag_range'] = Column([args.rmag_range], dtype='f4')

    # Deal with the random seed
    if args.seed is not None:
        log.info('Random seed = {}'.format(args.seed))
        metacat['seed'] = Column([args.seed], dtype='i4')
    rand = np.random.RandomState(args.seed)
    seeds = rand.random_integers(0, 2**18, nchunk)

    if 'DECALS_SIM_DIR' in os.environ:
        decals_sim_dir = os.getenv('DECALS_SIM_DIR')
    else:
        decals_sim_dir = '.'
    if not os.path.exists(os.path.join(decals_sim_dir, brickname)):
        os.makedirs(os.path.join(decals_sim_dir, brickname))

    metafile = os.path.join(decals_sim_dir, brickname,
                            'metacat-' + brickname + '-' + lobjtype + '.fits')
    log.info('Writing {}'.format(metafile))
    if os.path.isfile(metafile):
        os.remove(metafile)
    metacat.write(metafile)

    # Work in chunks.
    for ichunk in range(nchunk):
        log.info('Working on chunk {:02d}/{:02d}'.format(ichunk + 1, nchunk))
        chunksuffix = '{:02d}'.format(ichunk)

        # There's probably a smarter way to do this
        nobjchunk = np.min((nobj, chunksize))
        if (nchunk > 1) and (ichunk == (nchunk - 1)):
            nobjchunk = np.max((nobjchunk, nobj % ((nchunk - 1) * chunksize)))

        # Build and write out the simulated object catalog.
        simcat = build_simcat(nobjchunk, brickname, brickwcs, metacat,
                              seeds[ichunk])
        simcatfile = os.path.join(
            decals_sim_dir, brickname, 'simcat-' + brickname + '-' + lobjtype +
            '-' + chunksuffix + '.fits')
        log.info('Writing {}'.format(simcatfile))
        if os.path.isfile(simcatfile):
            os.remove(simcatfile)
        simcat.write(simcatfile)

        #       # Use Tractor to just process the blobs containing the simulated sources.
        simdecals = SimDecals(metacat=metacat, simcat=simcat)
        blobxy = zip(simcat['x'], simcat['y'])
        run_brick(brickname,
                  decals=simdecals,
                  outdir=os.path.join(decals_sim_dir, brickname),
                  threads=args.threads,
                  zoom=args.zoom,
                  wise=False,
                  sdssInit=False,
                  forceAll=True,
                  writePickles=False,
                  do_calibs=True,
                  write_metrics=False,
                  pixPsf=True,
                  blobxy=blobxy,
                  early_coadds=False,
                  stages=['writecat'],
                  splinesky=True)

        log.info('Cleaning up...')
        shutil.move(
            os.path.join(decals_sim_dir, brickname, 'tractor', brickname[:3],
                         'tractor-' + brickname + '.fits'),
            os.path.join(
                decals_sim_dir, brickname, 'tractor-' + brickname + '-' +
                lobjtype + '-' + chunksuffix + '.fits'))
        shutil.move(
            os.path.join(decals_sim_dir, brickname, 'coadd', brickname[:3],
                         brickname, 'decals-' + brickname + '-image.jpg'),
            os.path.join(
                decals_sim_dir, brickname, 'qa-' + brickname + '-' + lobjtype +
                '-image-' + chunksuffix + '.jpg'))
        shutil.move(
            os.path.join(decals_sim_dir, brickname, 'coadd', brickname[:3],
                         brickname, 'decals-' + brickname + '-resid.jpg'),
            os.path.join(
                decals_sim_dir, brickname, 'qa-' + brickname + '-' + lobjtype +
                '-resid-' + chunksuffix + '.jpg'))

        shutil.rmtree(os.path.join(decals_sim_dir, brickname, 'coadd'))
        shutil.rmtree(os.path.join(decals_sim_dir, brickname, 'tractor'))
        #shutil.rmtree(os.path.join(decals_sim_dir,brickname,'images'))
        #shutil.rmtree(os.path.join(decals_sim_dir,brickname,'metrics'))

        # Write a log file

    log.info('All done!')