コード例 #1
0
def commit_photometry(json_response, altdata, request_id, instrument_id,
                      user_id):
    """
    Commits ATLAS photometry to the database

    Parameters
    ----------
    json_response : dict
        response.json() from call to ATLAS photometry service.
    altdata: dict
        Contains ATLAS photometry api_token for the user
    request_id : int
        FollowupRequest SkyPortal ID
    instrument_id : int
        Instrument SkyPortal ID
    user_id : int
        User SkyPortal ID
    """

    from ..models import (
        DBSession,
        FollowupRequest,
        Instrument,
        User,
    )

    Session = scoped_session(
        sessionmaker(bind=DBSession.session_factory.kw["bind"]))
    session = Session()

    try:
        request = session.query(FollowupRequest).get(request_id)
        instrument = session.query(Instrument).get(instrument_id)
        user = session.query(User).get(user_id)

        result_url = json_response['result_url']
        request.status = f"Task is complete with results available at {result_url}"

        s = requests.get(
            result_url,
            headers={
                'Authorization': f"Token {altdata['api_token']}",
                'Accept': 'application/json',
            },
        )
        s.raise_for_status()

        # ATLAS response looks like
        """
     ###MJD          m      dm   uJy   duJy F err chi/N     RA       Dec        x        y     maj  min   phi  apfit mag5sig Sky   Obs
     59226.235875  16.177  0.012  1228   15 c  0  54.64 342.45960  51.26340  7768.79  7767.00 2.53 2.39 -63.4 -0.375 19.58 21.54 01a59226o0051c
     59228.242600  16.258  0.017  1140   20 c  0   7.87 342.45960  51.26340  2179.59  9252.78 3.41 3.09 -51.0 -0.396 19.28 21.28 02a59228o0102c
     59228.246262  16.582  0.021   846   18 c  0  28.37 342.45960  51.26340  2162.23  9213.32 3.53 3.25 -52.3 -0.366 19.14 21.26 02a59228o0110c
     59228.252679  16.451  0.019   954   18 c  0  13.76 342.45960  51.26340  2218.02  9291.76 3.34 3.03 -49.8 -0.389 19.17 21.24 02a59228o0124c
     59228.265532  17.223  0.049   469   23 c  0   3.90 342.45960  51.26340  2237.25  9167.94 4.31 3.88 -43.7 -0.473 18.95 21.20 02a59228o0152c
         """

        try:
            df = pd.read_csv(StringIO(s.text.replace("###MJD", "mjd")),
                             delim_whitespace=True)
        except Exception as e:
            raise ValueError(f'Format of response not understood: {e.message}')

        desired_columns = {'mjd', 'RA', 'Dec', 'm', 'dm', 'mag5sig', 'F'}
        if not desired_columns.issubset(set(df.columns)):
            raise ValueError('Missing expected column')

        df.rename(
            columns={
                'RA': 'ra',
                'Dec': 'dec',
                'm': 'mag',
                'dm': 'magerr',
                'mag5sig': 'limiting_mag',
                'F': 'filter',
            },
            inplace=True,
        )
        cyan = df['filter'] == 'c'
        orange = df['filter'] == 'o'

        snr = df['uJy'] / df['duJy'] < 5

        df.loc[cyan, 'filter'] = 'atlasc'
        df.loc[orange, 'filter'] = 'atlaso'
        df.loc[snr, 'mag'] = None
        df.loc[snr, 'magerr'] = None

        iszero = df['duJy'] == 0.0
        df.loc[iszero, 'mag'] = None
        df.loc[iszero, 'magerr'] = None

        isnan = np.isnan(df['uJy'])
        df.loc[isnan, 'mag'] = None
        df.loc[isnan, 'magerr'] = None

        df = df.replace({np.nan: None})

        drop_columns = list(
            set(df.columns.values) -
            {'mjd', 'ra', 'dec', 'mag', 'magerr', 'limiting_mag', 'filter'})

        df.drop(
            columns=drop_columns,
            inplace=True,
        )
        df['magsys'] = 'ab'

        data_out = {
            'obj_id': request.obj_id,
            'instrument_id': instrument.id,
            'group_ids': [g.id for g in user.accessible_groups],
            **df.to_dict(orient='list'),
        }

        from skyportal.handlers.api.photometry import add_external_photometry

        if len(df.index) > 0:
            add_external_photometry(data_out, request.requester)
            request.status = "Photometry committed to database"
        else:
            request.status = "No photometry to commit to database"

        session.add(request)
        session.commit()

        flow = Flow()
        flow.push(
            '*',
            "skyportal/REFRESH_SOURCE",
            payload={"obj_key": request.obj.internal_key},
        )

    except Exception as e:
        return log(f"Unable to commit photometry for {request_id}: {e}")
コード例 #2
0
ファイル: ps1.py プロジェクト: skyportal/skyportal
def commit_photometry(text_response, request_id, instrument_id, user_id):
    """
    Commits PS1 DR2 photometry to the database

    Parameters
    ----------
    text_response : dict
        response.text from call to PS1 DR2 photometry service.
    request_id : int
        FollowupRequest SkyPortal ID
    instrument_id : int
        Instrument SkyPortal ID
    user_id : int
        User SkyPortal ID
    """

    from ..models import (
        DBSession,
        FollowupRequest,
        Instrument,
        User,
    )

    Session = scoped_session(
        sessionmaker(bind=DBSession.session_factory.kw["bind"]))
    session = Session()

    try:
        request = session.query(FollowupRequest).get(request_id)
        instrument = session.query(Instrument).get(instrument_id)
        user = session.query(User).get(user_id)

        tab = astropy.io.ascii.read(text_response)
        # good data only
        tab = tab[tab['psfQfPerfect'] > 0.9]
        id2filter = np.array(
            ['ps1::g', 'ps1::r', 'ps1::i', 'ps1::z', 'ps1::y'])
        tab['filter'] = id2filter[(tab['filterID'] - 1).data.astype(int)]
        df = tab.to_pandas()

        df.rename(
            columns={
                'obsTime': 'mjd',
                'psfFlux': 'flux',
                'psfFluxerr': 'fluxerr',
            },
            inplace=True,
        )
        df = df.replace({np.nan: None})

        df.drop(
            columns=[
                'detectID',
                'filterID',
                'psfQfPerfect',
            ],
            inplace=True,
        )
        df['magsys'] = 'ab'
        df['zp'] = 8.90

        data_out = {
            'obj_id': request.obj_id,
            'instrument_id': instrument.id,
            'group_ids': [g.id for g in user.accessible_groups],
            **df.to_dict(orient='list'),
        }

        from skyportal.handlers.api.photometry import add_external_photometry

        if len(df.index) > 0:
            add_external_photometry(data_out, request.requester)
            request.status = "Photometry committed to database"
        else:
            request.status = "No photometry to commit to database"

        session.add(request)
        session.commit()

        flow = Flow()
        flow.push(
            '*',
            "skyportal/REFRESH_SOURCE",
            payload={"obj_key": request.obj.internal_key},
        )

    except Exception as e:
        return log(f"Unable to commit photometry for {request_id}: {e}")
コード例 #3
0
def commit_photometry(url, altdata, df_request, request_id, instrument_id,
                      user_id):
    """
    Commits ZTF forced photometry to the database

    Parameters
    ----------
    url : str
        ZTF forced photometry service data file location.
    altdata: dict
        Contains ZTF photometry api_token for the user
    df_request: pandas.DataFrame
        DataFrame containing request parameters (ra, dec, start jd, end jd)
    request_id : int
        FollowupRequest SkyPortal ID
    instrument_id : int
        Instrument SkyPortal ID
    user_id: int
        User SkyPortal ID
    """

    from ..models import (
        DBSession,
        FollowupRequest,
        Instrument,
        User,
    )

    Session = scoped_session(
        sessionmaker(bind=DBSession.session_factory.kw["bind"]))
    session = Session()

    try:
        request = session.query(FollowupRequest).get(request_id)
        instrument = session.query(Instrument).get(instrument_id)
        user = session.query(User).get(user_id)

        r = requests.get(
            url,
            auth=HTTPBasicAuth(altdata['ipac_http_user'],
                               altdata['ipac_http_password']),
        )
        df = ascii.read(r.content.decode(),
                        header_start=0,
                        data_start=1,
                        comment='#').to_pandas()

        df.columns = df.columns.str.replace(',', '')
        desired_columns = {
            'jd',
            'forcediffimflux',
            'forcediffimfluxunc',
            'diffmaglim',
            'zpdiff',
            'filter',
        }
        if not desired_columns.issubset(set(df.columns)):
            raise ValueError('Missing expected column')
        df['ra'] = df_request['ra']
        df['dec'] = df_request['dec']
        df.rename(
            columns={'diffmaglim': 'limiting_mag'},
            inplace=True,
        )
        df = df.replace({"null": np.nan})
        df['mjd'] = astropy.time.Time(df['jd'], format='jd').mjd
        df['filter'] = df['filter'].str.replace('_', '')
        df['filter'] = df['filter'].str.lower()
        df = df.astype({
            'forcediffimflux': 'float64',
            'forcediffimfluxunc': 'float64'
        })

        df['mag'] = df['zpdiff'] - 2.5 * np.log10(df['forcediffimflux'])
        df['magerr'] = 1.0857 * df['forcediffimfluxunc'] / df['forcediffimflux']

        snr = df['forcediffimflux'] / df['forcediffimfluxunc'] < 5
        df['mag'].loc[snr] = None
        df['magerr'].loc[snr] = None

        iszero = df['forcediffimfluxunc'] == 0.0
        df['mag'].loc[iszero] = None
        df['magerr'].loc[iszero] = None

        isnan = np.isnan(df['forcediffimflux'])
        df['mag'].loc[isnan] = None
        df['magerr'].loc[isnan] = None

        df = df.replace({np.nan: None})

        drop_columns = list(
            set(df.columns.values) - set([
                'mjd', 'ra', 'dec', 'mag', 'magerr', 'limiting_mag', 'filter'
            ]))

        df.drop(
            columns=drop_columns,
            inplace=True,
        )
        df['magsys'] = 'ab'

        data_out = {
            'obj_id': request.obj_id,
            'instrument_id': instrument.id,
            'group_ids': [g.id for g in user.accessible_groups],
            **df.to_dict(orient='list'),
        }

        from skyportal.handlers.api.photometry import add_external_photometry

        add_external_photometry(data_out, request.requester)

        request.status = "Photometry committed to database"
        session.add(request)
        session.commit()

        flow = Flow()
        flow.push(
            '*',
            "skyportal/REFRESH_SOURCE",
            payload={"obj_key": request.obj.internal_key},
        )
    except Exception as e:
        return log(f"Unable to commit photometry for {request_id}: {e}")
    finally:
        Session.remove()
コード例 #4
0
def test_post_external_photometry(upload_data_token, super_admin_token,
                                  super_admin_user, public_group):

    obj_id = str(uuid.uuid4())
    status, data = api(
        "POST",
        "sources",
        data={
            "id": obj_id,
            "ra": 234.22,
            "dec": -22.33,
            "group_ids": [public_group.id],
        },
        token=upload_data_token,
    )
    assert status == 200
    assert data["data"]["id"] == obj_id

    name = str(uuid.uuid4())
    status, data = api(
        'POST',
        'telescope',
        data={
            'name': name,
            'nickname': name,
            'lat': 0.0,
            'lon': 0.0,
            'elevation': 0.0,
            'diameter': 10.0,
        },
        token=super_admin_token,
    )
    assert status == 200
    assert data['status'] == 'success'
    telescope_id = data['data']['id']

    instrument_name = str(uuid.uuid4())
    status, data = api(
        'POST',
        'instrument',
        data={
            'name': instrument_name,
            'type': 'imager',
            'band': 'NIR',
            'filters': ['atlaso', 'atlasc'],
            'telescope_id': telescope_id,
        },
        token=super_admin_token,
    )
    assert status == 200
    assert data['status'] == 'success'
    instrument_id = data['data']['id']

    datafile = f'{os.path.dirname(__file__)}/../data/ZTFrlh6cyjh_ATLAS.csv'
    df = pd.read_csv(datafile)
    df.drop(columns=['index'], inplace=True)

    data_out = {
        'obj_id': obj_id,
        'instrument_id': instrument_id,
        'group_ids': 'all',
        **df.to_dict(orient='list'),
    }

    add_external_photometry(data_out, super_admin_user)

    # Check the photometry sent back with the source
    status, data = api(
        "GET",
        f"sources/{obj_id}",
        params={"includePhotometry": "true"},
        token=super_admin_token,
    )
    assert status == 200
    assert len(data["data"]["photometry"]) == 384

    assert all(p['obj_id'] == obj_id for p in data["data"]["photometry"])
    assert all(p['instrument_id'] == instrument_id
               for p in data["data"]["photometry"])