Exemplo n.º 1
0
def push_data(data_in_dict):
    if not data_in_dict or len(data_in_dict) == 0:
        raise Exception('Empty_data_from_HA')
    connection_str = f'mysql+pymysql://{SETTINGS["Database"]["username"]}:{SETTINGS["Database"]["password"]}@{SETTINGS["Database"]["ip"]}:{SETTINGS["Database"]["port"]}/{SETTINGS["Database"]["base"]}'
    engine = create_engine(connection_str,
                           echo=SETTINGS['Database']['echo_debug'])
    Base.metadata.create_all(bind=engine)
    Session = sessionmaker(bind=engine, autocommit=False)
    session = Session()
    session.execute(sa_text('''Truncate table HAhosts'''))
    counter_insert = 0
    for h in data_in_dict:
        if h['svname'] in ('BACKEND', 'FRONTEND'):
            continue
        if h['pxname'] not in SETTINGS['HAproxy']['pxname_filter']:
            continue
        host1 = Host()
        host1.pxname = h['pxname']
        host1.svname = h['svname']
        host1.status = h['status']
        host1.scur = h['scur']
        host1.addr, host1.port = h['addr'].split(':')
        host1.algo = h['algo']
        session.add(host1)
        counter_insert += 1
    session.commit()
    logging.info(f'Inserted {counter_insert} lines')
    session.close()
Exemplo n.º 2
0
    def get(request):
        """Get a forced photometry request result from ZTF.

        Parameters
        ----------
        request : skyportal.models.FollowupRequest
            The request to retrieve ZTF forced photometry.
        """

        from ..models import (
            DBSession,
            FollowupRequest,
            FacilityTransaction,
            Allocation,
            Instrument,
        )

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

        req = (session.query(FollowupRequest).filter(
            FollowupRequest.id == request.id).one())

        instrument = (Instrument.query_records_accessible_by(
            req.requester).join(Allocation).join(FollowupRequest).filter(
                FollowupRequest.id == request.id).first())

        altdata = request.allocation.altdata

        if not altdata:
            raise ValueError('Missing allocation information.')

        keys = ['ra', 'dec', 'jdstart', 'jdend']

        content = req.transactions[-1].response["content"]
        df_request = pd.read_html(content)[0]
        if df_request.shape[0] == 0:
            raise ValueError(
                'Missing response from forced photometry service.')
        df_request.columns = df_request.columns.str.lower()
        if not set(keys).issubset(df_request.columns):
            raise ValueError(
                "RA, Dec, jdstart, and jdend required in response.")
        df_request = df_request.iloc[0]
        df_request = df_request.replace({np.nan: None})

        requestgroup = {
            "email": altdata["ipac_email"],
            "userpass": altdata["ipac_userpass"],
            "option": "All recent jobs",
            "action": "Query Database",
        }
        params = urllib.parse.urlencode(requestgroup)
        url = f"{ZTF_FORCED_URL}/cgi-bin/getForcedPhotometryRequests.cgi?{params}"

        r = requests.get(
            url,
            auth=HTTPBasicAuth(altdata['ipac_http_user'],
                               altdata['ipac_http_password']),
        )
        if r.status_code == 200:
            df_result = pd.read_html(r.text)[0]
            df_result.rename(inplace=True,
                             columns={
                                 'startJD': 'jdstart',
                                 'endJD': 'jdend'
                             })
            df_result = df_result.replace({np.nan: None})
            if not set(keys).issubset(df_result.columns):
                raise ValueError(
                    "RA, Dec, jdstart, and jdend required in response.")
            index_match = None
            for index, row in df_result.iterrows():
                if not all(
                    [np.isclose(row[key], df_request[key]) for key in keys]):
                    continue
                index_match = index
            if index_match is None:
                raise ValueError(
                    'No matching response from forced photometry service. Please try again later.'
                )
            else:
                row = df_result.loc[index_match]
                if row['lightcurve'] is None:
                    raise ValueError(
                        'Light curve not yet available. Please try again later.'
                    )
                else:
                    lightcurve = row['lightcurve']
                    dataurl = f"{ZTF_FORCED_URL}/{lightcurve}"
                    IOLoop.current().run_in_executor(
                        None,
                        lambda: commit_photometry(
                            dataurl,
                            altdata,
                            df_request,
                            req.id,
                            instrument.id,
                            request.requester.id,
                        ),
                    )
        else:
            req.status = f'error: {r.content}'

        transaction = FacilityTransaction(
            request=http.serialize_requests_request(r.request),
            response=http.serialize_requests_response(r),
            followup_request=req,
            initiator_id=req.last_modified_by_id,
        )

        session.add(transaction)
        session.commit()
Exemplo n.º 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()
Exemplo n.º 4
0

class People(base):
    __tablename__ = "people"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    count = Column(Integer)


results = session.query(People).filter_by(name='jill')
for person in results:
    print(person.id, person.name, person.count)

#新增資料時,用類別建立個新的資料物件,加到session物件
new_person = People(name='jane', count=5)
session.add(new_person)
session.commit()

results = session.query(People).all()
for person in results:
    print(person.id, person.name, person.count)

#更新
jill = session.query(People).filter_by(name='jill').first()
print(jill.name, jill.count)
jill.count = 22
session.add(jill)
session.commit()
results = session.query(People).all()
for person in results:
    print(person.id, person.name, person.count)