コード例 #1
0
 def testImageToPixels(self):
     """Tests intersection of an image (WCS and dimensions) with a
     quad-sphere pixelization.
     """
     #metadata taken from CFHT data v695856-e0/v695856-e0-c000-a00.sci_img.fits
     metadata = dafBase.PropertySet()
     metadata.set("SIMPLE", "T")
     metadata.set("BITPIX", -32)
     metadata.set("NAXIS", 2)
     metadata.set("NAXIS1", 1024)
     metadata.set("NAXIS2", 1153)
     metadata.set("RADECSYS", "FK5")
     metadata.set("EQUINOX", 2000.0)
     metadata.set("CRVAL1", 215.604025685476)
     metadata.set("CRVAL2", 53.1595451514076)
     metadata.set("CRPIX1", 1109.99981456774)
     metadata.set("CRPIX2", 560.018167811613)
     metadata.set("CTYPE1", "RA---TAN")
     metadata.set("CTYPE2", "DEC--TAN")
     metadata.set("CD1_1", 5.10808596133527E-05)
     metadata.set("CD1_2", 1.85579539217196E-07)
     metadata.set("CD2_2", -5.10281493481982E-05)
     metadata.set("CD2_1", -8.27440751733828E-07)
     wcs = afwImage.makeWcs(metadata)
     qs = skypix.createQuadSpherePixelization()
     poly = skypix.imageToPolygon(wcs, 1024, 1153)
     pixels = qs.intersect(poly)
     self.assertEqual(len(pixels), 1)
     self.assertEqual(pixels[0], 182720)
     self.assertTrue(qs.getGeometry(182720).contains(poly))
コード例 #2
0
 def testImageToPixels(self):
     """Tests intersection of an image (WCS and dimensions) with a
     quad-sphere pixelization.
     """
     # metadata taken from CFHT data v695856-e0/v695856-e0-c000-a00.sci_img.fits
     metadata = dafBase.PropertySet()
     metadata.set("SIMPLE", "T")
     metadata.set("BITPIX", -32)
     metadata.set("NAXIS", 2)
     metadata.set("NAXIS1", 1024)
     metadata.set("NAXIS2", 1153)
     metadata.set("RADECSYS", "FK5")
     metadata.set("EQUINOX", 2000.0)
     metadata.set("CRVAL1", 215.604025685476)
     metadata.set("CRVAL2", 53.1595451514076)
     metadata.set("CRPIX1", 1109.99981456774)
     metadata.set("CRPIX2", 560.018167811613)
     metadata.set("CTYPE1", "RA---TAN")
     metadata.set("CTYPE2", "DEC--TAN")
     metadata.set("CD1_1", 5.10808596133527E-05)
     metadata.set("CD1_2", 1.85579539217196E-07)
     metadata.set("CD2_2", -5.10281493481982E-05)
     metadata.set("CD2_1", -8.27440751733828E-07)
     wcs = afwImage.makeWcs(metadata)
     qs = skypix.createQuadSpherePixelization()
     poly = skypix.imageToPolygon(wcs, 1024, 1153)
     pixels = qs.intersect(poly)
     self.assertEqual(len(pixels), 1)
     self.assertEqual(pixels[0], 182720)
     self.assertTrue(qs.getGeometry(182720).contains(poly))
コード例 #3
0
def processRaft(raftDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    for fits in glob.glob(
            os.path.join(
                raftDir, "S[0-2][0-2]",
                "imsim_*_R[0-4][0-4]_S[0-2][0-2]_C[01][0-7]_E00[01].fits*")):
        m = re.search(
            r'v(\d+)-f(\w)/E00(\d)/R(\d)(\d)/S(\d)(\d)/' +
            r'imsim_\1_R\4\5_S\6\7_C(\d)(\d)_E00\3\.fits', fits)
        if not m:
            print >> sys.stderr, "Warning: Unrecognized file:", fits
            nUnrecognized += 1
            continue

        (visit, filter, snap, raft1, raft2, sensor1, sensor2, channel1,
         channel2) = m.groups()
        key = "%s_F%s_E%s_R%s,%s_S%s,%s_C%s,%s" % (visit, filter, snap, raft1,
                                                   raft2, sensor1, sensor2,
                                                   channel1, channel2)
        if key in done:
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fits)
        expTime = md.get("EXPTIME")
        mjdObs = md.get("MJD-OBS")
        taiObs = dafBase.DateTime(mjdObs, dafBase.DateTime.MJD,
                                  dafBase.DateTime.TAI).toString(
                                      dafBase.DateTime.UTC)[:-1]
        conn.execute(
            """INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?, ?, ?, ?, ?)""",
            (visit, filter, snap, "%s,%s" % (raft1, raft2), "%s,%s" %
             (sensor1, sensor2), "%s,%s" %
             (channel1, channel2), taiObs, expTime))

        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                                     md.get("NAXIS1"),
                                     md.get("NAXIS2"),
                                     padRad=0.000075)  # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                         (id, skyTileId))

        conn.commit()

        nProcessed += 1

    print >>sys.stderr, raftDir, \
        "... %d processed, %d skipped, %d unrecognized" % \
        (nProcessed, nSkipped, nUnrecognized)
コード例 #4
0
def processRaft(raftDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    for fits in glob.glob(os.path.join(raftDir, "S[0-2][0-2]",
        "imsim_*_R[0-4][0-4]_S[0-2][0-2]_C[01][0-7]_E00[01].fits*")):
        import pdb; pdb.set_trace()
        m = re.search(r'v(\d+)-f(\w)/E00(\d)/R(\d)(\d)/S(\d)(\d)/' +
                r'imsim_\1_R\4\5_S\6\7_C(\d)(\d)_E00\3\.fits', fits)
        if not m:
            print >>sys.stderr, "Warning: Unrecognized file:", fits
            nUnrecognized += 1
            continue

        (visit, filter, snap, raft1, raft2, sensor1, sensor2,
                channel1, channel2) = m.groups()
        key = "%s_F%s_E%s_R%s,%s_S%s,%s_C%s,%s" % (visit, filter,
                snap, raft1, raft2, sensor1, sensor2, channel1, channel2)
        if done.has_key(key):
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fits)
        expTime = md.get("EXPTIME")
        mjdObs = md.get("MJD-OBS")
        taiObs = dafBase.DateTime(mjdObs, dafBase.DateTime.MJD,
                dafBase.DateTime.TAI).toString()[:-1]
        conn.execute("""INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?, ?, ?, ?, ?)""",
            (visit, filter, snap, "%s,%s" % (raft1, raft2),
                "%s,%s" % (sensor1, sensor2),
                "%s,%s" % (channel1, channel2), taiObs, expTime))
   
        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                md.get("NAXIS1"), md.get("NAXIS2"),
                padRad=0.000075) # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                    (id, skyTileId))

        conn.commit()

        nProcessed += 1

    print >>sys.stderr, raftDir, \
            "... %d processed, %d skipped, %d unrecognized" % \
            (nProcessed, nSkipped, nUnrecognized)
コード例 #5
0
def findWcsCoveringSkyTile(skyPixelization, skyTileId, imageRes):
    """Computes and returns a TAN WCS such that a 2D image with the
    given WCS and the following properties completely covers the
    sky-tile with the given pixel id:

    - NAXIS1/NAXIS2 >= imageRes
    - CRPIX1 = NAXIS1 / 2 + 0.5
    - CRPIX2 = NAXIS2 / 2 + 0.5
    """
    if not isinstance(imageRes, (int, long)):
        raise TypeError("Image resolution must be an integer")
    if imageRes < 1:
        raise RuntimeError("Image resolution must be at least 1")
    crpix = afwGeom.Point2D(0.5 * (imageRes + 1), 0.5 * (imageRes + 1))
    crval = geom.sphericalCoords(skyPixelization.getCenter(skyTileId))
    crval = afwCoord.makeCoord(afwCoord.ICRS, crval[0] * afwGeom.degrees,
                               crval[1] * afwGeom.degrees)
    skyTile = skyPixelization.getGeometry(skyTileId)
    # Start with a huge TAN image centered at the sky-tile center,
    # then shrink it using binary search to determine suitable
    # CD matrix coefficients
    scale = 1000.0  # deg/pixel, ridiculously large
    delta = 0.5 * scale
    frac = 0.01  # desired relative accuracy of CD matrix coeffs
    wcs = afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
    imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
    # Make sure the initial guess really is too large
    if not imagePoly.contains(skyTile):
        raise RuntimeError("Failed to construct image WCS covering sky-tile")
    # Search for a WCS with a tight fit to the sky-tile. Note that the
    # tightness of fit could be further improved by searching for a rotation
    # and not just a pixel scale.
    while delta >= frac * scale:
        tmp = scale - delta
        wcs = afwImage.makeWcs(crval, crpix, tmp, 0.0, 0.0, tmp)
        imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
        delta *= 0.5
        if imagePoly.contains(skyTile):
            scale = tmp
    return afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
コード例 #6
0
def processBand(filterDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    print(filterDir, "... started", file=sys.stderr)
    for fits in glob.iglob(
            os.path.join(filterDir, "fpC*_ts_coaddNorm_NN.fit.gz")):
        m = re.search(
            r'/([ugriz])/fpC-(\d{6})-\1(\d)-(\d{4})_ts_coaddNorm_NN.fit.gz',
            fits)
        if not m:
            print("Warning: Unrecognized file:", fits, file=sys.stderr)
            nUnrecognized += 1
            continue

        (filter, run, camcol, field) = m.groups()
        camcol = int(camcol)
        run = int(run)
        field = int(field)
        key = "%d_B%s_C%d_F%d" % (run, filter, camcol, field)
        if key in done:
            nSkipped += 1
            continue

        md = readMetadata(fits)
        conn.execute(
            """INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?)""", (run, filter, camcol, field))

        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = makeSkyWcs(md)
        poly = skypix.imageToPolygon(wcs,
                                     md.get("NAXIS1"),
                                     md.get("NAXIS2"),
                                     padRad=0.000075)  # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                         (id, skyTileId))

        nProcessed += 1
        if nProcessed % 100 == 0:
            conn.commit()

    conn.commit()
    print(filterDir,
          "... %d processed, %d skipped, %d unrecognized" %
          (nProcessed, nSkipped, nUnrecognized),
          file=sys.stderr)
コード例 #7
0
ファイル: skyTileUtils.py プロジェクト: lsst-dm/legacy-ap
def findWcsCoveringSkyTile(skyPixelization, skyTileId, imageRes):
    """Computes and returns a TAN WCS such that a 2D image with the
    given WCS and the following properties completely covers the
    sky-tile with the given pixel id:

    - NAXIS1/NAXIS2 >= imageRes
    - CRPIX1 = NAXIS1 / 2 + 0.5
    - CRPIX2 = NAXIS2 / 2 + 0.5
    """
    if not isinstance(imageRes, (int, long)):
        raise TypeError("Image resolution must be an integer")
    if imageRes < 1:
        raise RuntimeError("Image resolution must be at least 1")
    crpix = afwGeom.Point2D(0.5*(imageRes + 1), 0.5*(imageRes + 1))
    crval = geom.sphericalCoords(skyPixelization.getCenter(skyTileId))
    crval = afwCoord.makeCoord(afwCoord.ICRS, crval[0] * afwGeom.degrees, crval[1] * afwGeom.degrees)
    skyTile = skyPixelization.getGeometry(skyTileId)
    # Start with a huge TAN image centered at the sky-tile center,
    # then shrink it using binary search to determine suitable
    # CD matrix coefficients
    scale = 1000.0  # deg/pixel, ridiculously large
    delta = 0.5*scale
    frac = 0.01 # desired relative accuracy of CD matrix coeffs
    wcs = afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
    imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
    # Make sure the initial guess really is too large
    if not imagePoly.contains(skyTile):
        raise RuntimeError("Failed to construct image WCS covering sky-tile")
    # Search for a WCS with a tight fit to the sky-tile. Note that the
    # tightness of fit could be further improved by searching for a rotation
    # and not just a pixel scale.
    while delta >= frac * scale:
        tmp = scale - delta
        wcs = afwImage.makeWcs(crval, crpix, tmp, 0.0, 0.0, tmp)
        imagePoly = skypix.imageToPolygon(wcs, imageRes, imageRes)
        delta *= 0.5
        if imagePoly.contains(skyTile):
            scale = tmp
    return afwImage.makeWcs(crval, crpix, scale, 0.0, 0.0, scale)
コード例 #8
0
def processBand(filterDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    print >>sys.stderr, filterDir, "... started"
    for fits in glob.iglob(
            os.path.join(filterDir, "fpC*_ts_coaddNorm_NN.fit.gz")):
        m = re.search(r'/([ugriz])/fpC-(\d{6})-\1(\d)-(\d{4})_ts_coaddNorm_NN.fit.gz', fits)
        if not m:
            print >>sys.stderr, "Warning: Unrecognized file:", fits
            nUnrecognized += 1
            continue

        (filter, run, camcol, field) = m.groups()
        camcol = int(camcol)
        run = int(run)
        field = int(field)
        key = "%d_B%s_C%d_F%d" % (run, filter, camcol, field)
        if done.has_key(key):
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fits)
        conn.execute("""INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?)""", (run, filter, camcol, field))
   
        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                md.get("NAXIS1"), md.get("NAXIS2"),
                padRad=0.000075) # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                    (id, skyTileId))

        nProcessed += 1
        if nProcessed % 100 == 0:
            conn.commit()

    conn.commit()
    print >>sys.stderr, filterDir, \
            "... %d processed, %d skipped, %d unrecognized" % \
            (nProcessed, nSkipped, nUnrecognized)
コード例 #9
0
def processRawDir(rawDir, conn, done, qsp):
    print(rawDir, "... started")
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    for fitsPath in glob.glob(os.path.join(rawDir, "*.fits*")):
        m = re.search(r'raw_v(\d*)_f(.+)\.fits', fitsPath)
        if not m:
            sys.stderr.write("Warning: Unrecognized file: %r\n" % (fitsPath,))
            nUnrecognized += 1
            continue

        visit, filterName = m.groups()
        key = "%s_f%s" % (visit, filterName)
        if done.has_key(key):
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fitsPath)
        expTime = md.get("EXPTIME")
        mjdObs = md.get("MJD-OBS")
        taiObs = dafBase.DateTime(mjdObs, dafBase.DateTime.MJD,
                dafBase.DateTime.TAI).toString()[:-1]
        conn.execute("""INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?)""",
            (visit, filterName, taiObs, expTime))
   
        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                md.get("NAXIS1"), md.get("NAXIS2"),
                padRad=0.000075) # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                    (id, skyTileId))

        conn.commit()

        nProcessed += 1

    print("%s... %d processed, %d skipped, %d unrecognized" %
            (rawDir, nProcessed, nSkipped, nUnrecognized))
コード例 #10
0
                                      dafBase.DateTime.UTC).toString()[:-1]
        except:
            dateObsCard = md.get("DATE-OBS")
            if dateObsCard.find('T') == -1:
                dateObsCard += "T00:00:00Z"
            taiObs = dafBase.DateTime(dateObsCard).toString()[:-1]

    if md.get("CTYPE1").strip() == "CPX" and md.get(
            "CTYPE2").strip() == "CPY":  # HSC pixel WCS
        pix = []
    else:
        wcs = afwImage.makeWcs(fixSubaruHeader(md))

        try:
            poly = skypix.imageToPolygon(wcs,
                                         md.get("NAXIS1"),
                                         md.get("NAXIS2"),
                                         padRad=math.radians(15.0 / 3600))
        except ZeroDivisionError, e:
            print >> sys.stderr, "\nFailure finding polygon for %s: %s" % (
                fits, e)
            poly = None

        if poly:
            pix = qsp.intersect(poly)
        else:
            pix = []

    cmd = "INSERT INTO raw VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)"
    if cursor:
        try:
            data = (field, visit, filterId, ccd, dateObs, taiObs, expTime,
コード例 #11
0
def processRun(runDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    print(runDir, "... started", file=sys.stderr)
    for fits in glob.iglob(
            os.path.join(runDir, "*", "corr", "[1-6]", "fpC*.fit.gz")):
        m = re.search(
            r'(\d+)/corr/([1-6])/fpC-(\d{6})-([ugriz])\2-(\d{4}).fit.gz', fits)
        if not m:
            print("Warning: Unrecognized file:", fits, file=sys.stderr)
            nUnrecognized += 1
            continue

        (rerun, camcol, run, filter, field) = m.groups()
        rerun = int(rerun)
        camcol = int(camcol)
        run = int(run)
        field = int(field)
        key = "%d_R%d_B%s_C%d_F%d" % (run, rerun, filter, camcol, field)
        if key in done or rerun < 40:
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fits)
        date = md.get("DATE-OBS")
        if date.find("-") != -1:
            (year, month, day) = md.get("DATE-OBS").split("-")
        else:
            (day, month, year) = md.get("DATE-OBS").split("/")
            year = 1900 + int(year)
        (hour, minute, second) = md.get("TAIHMS").split(":")
        seconds = float(second)
        second = int(seconds)
        taiObs = dafBase.DateTime(int(year), int(month), int(day), int(hour),
                                  int(minute), second, dafBase.DateTime.TAI)
        taiObs = dafBase.DateTime(
            taiObs.nsecs() + int((seconds - second) * 1000000000),
            dafBase.DateTime.TAI)
        taiObs = taiObs.toString(dafBase.DateTime.UTC)[:-1]
        strip = "%d%s" % (md.get('STRIPE'), md.get('STRIP'))
        conn.execute(
            """INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?, ?, ?, ?)""",
            (run, rerun, filter, camcol, field, taiObs, strip))

        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                                     md.get("NAXIS1"),
                                     md.get("NAXIS2"),
                                     padRad=0.000075)  # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                         (id, skyTileId))

        nProcessed += 1
        if nProcessed % 100 == 0:
            conn.commit()

    conn.commit()
    print(runDir, \
        "... %d processed, %d skipped, %d unrecognized" % \
        (nProcessed, nSkipped, nUnrecognized), file=sys.stderr)
コード例 #12
0
            mjdObs = md.get("MJD")
            taiObs = dafBase.DateTime(mjdObs, dafBase.DateTime.MJD,
                                      dafBase.DateTime.UTC).toString()[:-1]
        except:
            dateObsCard = md.get("DATE-OBS")
            if dateObsCard.find('T') == -1:
                dateObsCard += "T00:00:00Z"
            taiObs = dafBase.DateTime(dateObsCard).toString()[:-1]

    if md.get("CTYPE1").strip() == "CPX" and md.get("CTYPE2").strip() == "CPY": # HSC pixel WCS
        pix = []
    else:
        wcs = afwImage.makeWcs(fixSubaruHeader(md))

        try:
            poly = skypix.imageToPolygon(wcs, md.get("NAXIS1"), md.get("NAXIS2"),
                                         padRad=math.radians(15.0/3600))
        except ZeroDivisionError, e:
            print >> sys.stderr, "\nFailure finding polygon for %s: %s" % (fits, e)
            poly = None

        if poly:
            pix = qsp.intersect(poly)
        else:
            pix = []

    cmd = "INSERT INTO raw VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)"
    if cursor:
        try:
            data = (field, visit, filterId, ccd, dateObs, taiObs, expTime, pointing)
            cursor.execute(cmd, data)
        except Exception, e:
コード例 #13
0
def processRun(runDir, conn, done, qsp):
    nProcessed = 0
    nSkipped = 0
    nUnrecognized = 0
    print >>sys.stderr, runDir, "... started"
    for fits in glob.iglob(
            os.path.join(runDir, "*", "corr", "[1-6]", "fpC*.fit.gz")):
        m = re.search(r'(\d+)/corr/([1-6])/fpC-(\d{6})-([ugriz])\2-(\d{4}).fit.gz', fits)
        if not m:
            print >>sys.stderr, "Warning: Unrecognized file:", fits
            nUnrecognized += 1
            continue

        (rerun, camcol, run, filter, field) = m.groups()
        rerun = int(rerun)
        camcol = int(camcol)
        run = int(run)
        field = int(field)
        key = "%d_R%d_B%s_C%d_F%d" % (run, rerun, filter, camcol, field)
        if done.has_key(key) or rerun < 40:
            nSkipped += 1
            continue

        md = afwImage.readMetadata(fits)
        date = md.get("DATE-OBS")
        if date.find("-") != -1:
            (year, month, day) = md.get("DATE-OBS").split("-")
        else:
            (day, month, year) = md.get("DATE-OBS").split("/")
            year = 1900 + int(year)
        (hour, minute, second) = md.get("TAIHMS").split(":")
        seconds = float(second)
        second = int(seconds)
        taiObs = dafBase.DateTime(int(year), int(month), int(day), int(hour),
                int(minute), second, dafBase.DateTime.TAI)
        taiObs = dafBase.DateTime(taiObs.nsecs() +
                long((seconds - second) * 1000000000), dafBase.DateTime.TAI)
        taiObs = taiObs.toString()[:-1]
        strip = "%d%s" % (md.get('STRIPE'), md.get('STRIP'))
        conn.execute("""INSERT INTO raw VALUES
            (NULL, ?, ?, ?, ?, ?, ?, ?)""",
            (run, rerun, filter, camcol, field, taiObs, strip))
   
        for row in conn.execute("SELECT last_insert_rowid()"):
            id = row[0]
            break

        wcs = afwImage.makeWcs(md)
        poly = skypix.imageToPolygon(wcs,
                md.get("NAXIS1"), md.get("NAXIS2"),
                padRad=0.000075) # about 15 arcsec
        pix = qsp.intersect(poly)
        for skyTileId in pix:
            conn.execute("INSERT INTO raw_skyTile VALUES(?, ?)",
                    (id, skyTileId))

        nProcessed += 1
        if nProcessed % 100 == 0:
            conn.commit()

    conn.commit()
    print >>sys.stderr, runDir, \
            "... %d processed, %d skipped, %d unrecognized" % \
            (nProcessed, nSkipped, nUnrecognized)