Beispiel #1
0
    def selector(self,
                 array_kind='TWELVE-M',
                 prj_status=("Ready", "InProgress"),
                 sb_status=("Ready", "Suspended", "Running", "CalibratorCheck",
                            "Waiting"),
                 cycle=("2013.A", "2013.1", "2015.1", "2015.A"),
                 letterg=("A", "B", "C"),
                 bands=("ALMA_RB_03", "ALMA_RB_04", "ALMA_RB_06", "ALMA_RB_07",
                        "ALMA_RB_08", "ALMA_RB_09", "ALMA_RB_10"),
                 check_count=True,
                 conf=None,
                 calc_blratio=False,
                 numant=None,
                 array_id=None,
                 horizon=20.,
                 minha=-3.,
                 maxha=3.,
                 pwv=0.):

        """

        :param array_kind:
        :param prj_status:
        :param sb_status:
        :param cycle:
        :param letterg:
        :param bands:
        :param check_count:
        :param conf:
        :param calc_blratio:
        :param numant:
        :param array_id:
        :param horizon:
        :param minha:
        :param maxha:
        :param pwv:
        :param mintrans:
        :return:
        """
        if float(pwv) > 8:
            pwv = 8.0
        print self._time_astropy

        self._aggregate_dfs()
        self.master_wto_df['array'] = self.master_wto_df.apply(
            lambda x: 'SEVEN-M' if x['array'] == "ACA" else
            x['array'], axis=1
        )
        self.selection_df = self.master_wto_df[['SB_UID']].copy()

        # select array kind

        self.selection_df['selArray'] = (
            self.master_wto_df['array'] == array_kind)

        # select valid Prj States
        self.selection_df['selPrjState'] = (
            self.master_wto_df.apply(
                lambda x: True if x['PRJ_STATUS'] in prj_status else False,
                axis=1))

        # select valid SB States
        self.selection_df['selSBState'] = (
            self.master_wto_df.apply(
                lambda x: True if x['SB_STATE'] in sb_status else False,
                axis=1))

        # select By grades
        self.selection_df['selGrade'] = (
            self.master_wto_df.apply(
                lambda x: True if
                x['CYCLE'] in cycle and x['DC_LETTER_GRADE'] in letterg else
                False, axis=1)
        )

        # select by band
        self.selection_df['selBand'] = (
            self.master_wto_df.apply(
                lambda x: True if x['band'] in bands else False,
                axis=1
            )
        )

        # select if still some observations are left

        self.selection_df['selCount'] = True

        if check_count:
            self.selection_df['selCount'] = (
                self.master_wto_df.EXECOUNT > self.master_wto_df.Observed)

        self.selection_df['selConf'] = True

        # Array Configuraton Selection (12m)

        if array_kind == "TWELVE-M":

            self.master_wto_df['blmax'] = self.master_wto_df.apply(
                lambda row: rUV.compute_bl(row['minAR'] / 0.8, 100.), axis=1)
            self.master_wto_df['blmin'] = self.master_wto_df.apply(
                lambda row: rUV.compute_bl(row['LAScor'], 100., las=True),
                axis=1)

            if conf:
                qstring = ''
                l = len(conf) - 1
                for i, c in enumerate(conf):
                    col = c.replace('-', '_')
                    if i == l:
                        qstring += '%s == "%s"' % (col, c)
                    else:
                        qstring += '%s == "%s" or ' % (col, c)
                sbs_sel = self.master_wto_df.query(qstring).SB_UID.unique()
                self.selection_df['selConf'] = self.selection_df.apply(
                    lambda x: True if x['SB_UID'] in sbs_sel else False,
                    axis=1
                )

                self.master_wto_df['bl_ratio'] = 1.
                self.master_wto_df['array_ar_cond'] = self.master_wto_df.apply(
                    lambda x: CONFRES[x['BestConf']] if x['BestConf'] in conf
                    else pd.np.NaN,
                    axis=1
                )
                self.master_wto_df['num_bl_use'] = 630.

                if calc_blratio:
                    try:
                        array_id = self.bl_arrays.iloc[0, 3]
                    except AttributeError:
                        self._query_array()
                        array_id = self.bl_arrays.iloc[0, 3]
                    array_ar, num_bl, num_ant, ruv = self._get_bl_prop(array_id)
                    self.master_wto_df[['array_ar_cond', 'num_bl_use']] = (
                        self.master_wto_df.apply(
                            lambda x: self._get_sbbased_bl_prop(
                                ruv, x['blmin'] * 0.9, x['blmax'] * 1.1),
                            axis=1)
                    )
                    self.master_wto_df['bl_ratio'] = self.master_wto_df.apply(
                        lambda x: calc_bl_ratio(
                            x['array'], x['CYCLE'], x['num_bl_use'],
                            self.selection_df.ix[x.name, 'selConf']),
                        axis=1
                    )

            else:
                if array_id == 'last':
                    self._query_array()
                    array_id = self.bl_arrays.iloc[0, 3]

                ar, numbl, numant, ruv = self._get_bl_prop(array_id)
                self.master_wto_df[['array_ar_cond', 'num_bl_use']] = (
                    self.master_wto_df.apply(
                        lambda x: self._get_sbbased_bl_prop(
                            ruv, x['blmin'] * 0.9, x['blmax'] * 1.1), axis=1)
                )

                self.selection_df['selConf'] = self.master_wto_df.apply(
                    lambda x: True if (x['array_ar_cond'] > x['minAR']) and
                                      (x['array_ar_cond'] < x['maxAR']) else
                    False, axis=1
                )

                self.master_wto_df['bl_ratio'] = self.master_wto_df.apply(
                    lambda x: calc_bl_ratio(
                        x['array'], x['CYCLE'], x['num_bl_use'],
                        self.selection_df.ix[x.name, 'selConf']),
                    axis=1
                )

        # Array Configuration Selection (7m or ACA)

        elif array_kind == "SEVEN-M":
            if numant is None:
                numant = 10.
            self.selection_df['selConf'] = self.master_wto_df.apply(
                lambda x: True if x['array'] == "SEVEN-M" else
                False, axis=1
            )
            self.master_wto_df['blmax'] = pd.np.NaN
            self.master_wto_df['blmin'] = pd.np.NaN
            self.master_wto_df['array_ar_cond'] = pd.np.NaN
            self.master_wto_df['num_bl_use'] = pd.np.NaN
            self.master_wto_df['bl_ratio'] = self.master_wto_df.apply(
                lambda x: calc_bl_ratio(
                    x['array'], x['CYCLE'], x['num_bl_use'],
                    self.selection_df.ix[x.name, 'selConf'], numant=numant),
                axis=1
            )

        # Array Configuration selection (TP)
        else:
            if numant is None:
                numant = 10.
            self.selection_df['selConf'] = self.master_wto_df.apply(
                lambda x: True if x['array'] == "TP-Array" else
                False, axis=1
            )
            self.master_wto_df['blmax'] = pd.np.NaN
            self.master_wto_df['blmin'] = pd.np.NaN
            self.master_wto_df['array_ar_cond'] = pd.np.NaN
            self.master_wto_df['num_bl_use'] = pd.np.NaN
            self.master_wto_df['bl_ratio'] = 1.

        # select observable: elev, ha, moon & sun distance

        try:
            c = SkyCoord(
                ra=self.master_wto_df.RA*u.degree,
                dec=self.master_wto_df.DEC*u.degree,
                location=ALMA, obstime=self._time_astropy)
        except IndexError:
            print("Nothing to observe? %s" % len(self.master_wto_df))
            self._availableobs = False
            return

        ha = self._time_astropy.sidereal_time('apparent') - c.ra
        self.master_wto_df['HA'] = ha.wrap_at(180*u.degree).value
        self.master_wto_df['RAh'] = c.ra.hour
        self.master_wto_df['elev'] = c.transform_to(
            AltAz(obstime=self._time_astropy, location=ALMA)).alt.value
        corr_el = ((self.master_wto_df.ephem != 'N/A') &
                   (self.master_wto_df.ephem != 'OK'))
        self.master_wto_df.ix[corr_el, 'elev'] = -90.
        self.master_wto_df.ix[corr_el, 'HA'] = -24.

        self.selection_df['selElev'] = (
            self.master_wto_df.elev >= horizon)

        self.selection_df['selHA'] = (
            (self.master_wto_df.HA >= minha) &
            (self.master_wto_df.HA <= maxha)
        )

        # Sel Conditions, exec. frac

        ind1 = pd.np.around(self.master_wto_df.repfreq, decimals=1)

        pwv_str = (str(int(pwv / 0.05) * 0.05 +
                   (0.05 if (pwv % 0.05) > 0.02 else 0.)))

        self.master_wto_df['transmission'] = self.pwvdata.ix[
            ind1, pwv_str].values
        self.master_wto_df['tau'] = self.tau.ix[ind1, pwv_str].values
        self.master_wto_df['tsky'] = self.tsky.ix[ind1, pwv_str].values
        self.master_wto_df['airmass'] = self.master_wto_df.apply(
            lambda x: calc_airmass(x['elev'], transit=False), axis=1)
        self.master_wto_df['tsys'] = (
            self.master_wto_df.apply(
                lambda x: calc_tsys(x['band'], x['tsky'], x['tau'],
                                    x['airmass']), axis=1))
        self.master_wto_df['tsys_ratio'] = self.master_wto_df.apply(
            lambda x: (x['tsys'] / x['tsys_ot'])**2. if x['tsys'] <= 25000. else
            pd.np.inf, axis=1)

        self.master_wto_df['Exec. Frac'] = self.master_wto_df.apply(
            lambda x: 1 / (x['bl_ratio'] * x['tsys_ratio']) if
            (x['bl_ratio'] * x['tsys_ratio']) <= 100. else 0., axis=1)

        self.master_wto_df.set_index('SB_UID', drop=False, inplace=True)
        self.selection_df.set_index('SB_UID', drop=False, inplace=True)

        savedate = ALMA1.date
        savehoriz = ALMA1.horizon
        ALMA1.horizon = 0.0
        lstdate = str(ALMA1.sidereal_time()).split(':')
        lstdate0 = dt.datetime.strptime(
            '2014-12-31 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        lstdate1 = dt.datetime.strptime(
            '2015-01-01 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        lstdate2 = dt.datetime.strptime(
            '2015-01-02 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        sunrisedate = ALMA1.previous_rising(ephem.Sun())
        ALMA1.date = sunrisedate
        sunriselst = str(ALMA1.sidereal_time()).split(':')
        sunriselst_h = dt.datetime.strptime(
            '2015-01-01 ' + str(sunriselst[0]) + ':' +
            str(sunriselst[1]), '%Y-%m-%d %H:%M')
        sunsetdate = ALMA1.next_setting(ephem.Sun())
        ALMA1.date = sunsetdate
        sunsetlst = str(ALMA1.sidereal_time()).split(':')
        sunsetlst_h = dt.datetime.strptime(
            '2015-01-01 ' + str(sunsetlst[0]) + ':' +
            str(sunriselst[1]), '%Y-%m-%d %H:%M')

        self.inputs = pd.DataFrame(
            pd.np.array([lstdate0, lstdate1, lstdate2,
                         sunsetlst_h - dt.timedelta(1), sunriselst_h,
                         sunsetlst_h, sunriselst_h + dt.timedelta(1)]),
            index=['lst0', 'lst1', 'lst2', 'set1', 'rise1', 'set2', 'rise2'],
            columns=['2013.A']).transpose()
        self.inputs.ix['2013.1', :] = self.inputs.ix['2013.A', :]
        self.inputs.ix['2015.A', :] = self.inputs.ix['2013.A', :]
        self.inputs.ix['2015.1', :] = self.inputs.ix['2013.A', :]
        ALMA1.date = savedate
        ALMA1.horizon = savehoriz
Beispiel #2
0
    def selector(self,
                 array_kind='TWELVE-M',
                 prj_status=("Ready", "InProgress"),
                 sb_status=("Ready", "Suspended", "Running", "CalibratorCheck",
                            "Waiting"),
                 letterg=("A", "B", "C"),
                 bands=("ALMA_RB_03", "ALMA_RB_04", "ALMA_RB_06", "ALMA_RB_07",
                        "ALMA_RB_08", "ALMA_RB_09", "ALMA_RB_10"),
                 check_count=True,
                 conf=None,
                 calc_blratio=False,
                 numant=None,
                 array_id=None,
                 horizon=20.,
                 minha=-3.,
                 maxha=3.,
                 pwv=0.,
                 sim=False):

        """

        Args:
            array_kind: 
            prj_status: 
            sb_status: 
            letterg:
            bands: 
            check_count: 
            conf: 
            calc_blratio: 
            numant: 
            array_id: 
            horizon: 
            minha: 
            maxha: 
            pwv: 
            sim: 

        """
        if float(pwv) > 8:
            pwv = 8.0
        # print self._time_astropy

        if sim:
            self._aggregate_dfs(sim=True)
        else:
            self._aggregate_dfs()

        self.master_dsa_df['array'] = self.master_dsa_df.apply(
            lambda x: 'SEVEN-M' if x['array'] == "ACA" else
            x['array'], axis=1
        )
        self.master_dsa_df['isToo'] = self.master_dsa_df.apply(
            lambda x: True if str(x['CODE']).endswith('.T') else
            False, axis=1
        )

        self.selection_df = self.master_dsa_df[['SB_UID']].copy()

        # select array kind

        self.selection_df['selArray'] = (
            self.master_dsa_df['array'] == array_kind)

        # select valid Prj States
        self.selection_df['selPrjState'] = (
            self.master_dsa_df.apply(
                lambda x: True if x['PRJ_STATUS'] in prj_status else False,
                axis=1))

        # select valid SB States
        self.selection_df['selSBState'] = (
            self.master_dsa_df.apply(
                lambda x: True if x['SB_STATE'] in sb_status else False,
                axis=1))

        # select By grades

        sbuid_ex = self.exception_df.SB_UID.unique()

        self.selection_df['selGrade'] = (
            self.master_dsa_df.apply(
                lambda x: True if
                (x['CYCLE'] in
                 ["2015.1", "2015.A"] and x['DC_LETTER_GRADE'] in letterg) or
                (x['CYCLE'] not in
                 ["2015.1", "2015.A"] and x['DC_LETTER_GRADE'] == "A") or
                (x['SB_UID'] in sbuid_ex) else
                False, axis=1)
        )

        # select by band
        self.selection_df['selBand'] = (
            self.master_dsa_df.apply(
                lambda x: True if x['band'] in bands else False,
                axis=1
            )
        )

        if not sim:
            self.selection_df = self.selection_df.query(
                'selArray == True and selPrjState == True and '
                'selSBState == True and selGrade == True and selBand == True')
            sb_fsel = self.selection_df.SB_UID.unique()
            self.master_dsa_df = self.master_dsa_df.query('SB_UID in @sb_fsel')

        # select if still some observations are left

        self.selection_df['selCount'] = True

        if check_count:
            self.selection_df['selCount'] = (
                self.master_dsa_df.EXECOUNT > self.master_dsa_df.Observed)

        self.selection_df['selConf'] = True

        # Array Configuration Selection (12m)

        if array_kind == "TWELVE-M":

            self.master_dsa_df['blmax'] = self.master_dsa_df.apply(
                lambda row: rUV.compute_bl(row['minAR'] / 0.8, 100.), axis=1)
            self.master_dsa_df['blmin'] = self.master_dsa_df.apply(
                lambda row: rUV.compute_bl(row['LAScor'], 100., las=True) if
                ((row['LAScor'] > row['minAR']) and
                 (row['LAScor'] > 5 * row['ARcordec']))
                else rUV.compute_bl(10., 100., las=True),
                axis=1)

            if conf:
                # Not Working For Exceptions!!!
                qstring = ''
                l = len(conf) - 1
                for i, c in enumerate(conf):
                    col = c.replace('-', '_')
                    if i == l:
                        qstring += '%s == "%s"' % (col, c)
                    else:
                        qstring += '%s == "%s" or ' % (col, c)
                sbs_sel = self.master_dsa_df.query(qstring).SB_UID.unique()
                self.selection_df['selConf'] = self.selection_df.apply(
                    lambda x: True if (x['SB_UID'] in sbs_sel) or
                    ((x['lenconf'] > 0) and
                     (x['minAR'] <= self.ar <= x['maxAR']))
                    else False,
                    axis=1
                )

                self.ar = CONFRES[conf[0]]

                self.master_dsa_df['bl_ratio'] = 1.
                self.master_dsa_df['array_ar_cond'] = self.master_dsa_df.apply(
                    lambda x: CONFRES[x['BestConf']] if x['BestConf'] in conf
                    else pd.np.NaN,
                    axis=1
                )
                self.master_dsa_df['num_bl_use'] = 630.

                if calc_blratio:
                    self._query_array()
                    array_id = self.arrays.iloc[0, 3]
                    array_ar, num_bl, num_ant, ruv = self._get_bl_prop(array_id)
                    self.master_dsa_df[['array_ar_cond', 'num_bl_use']] = (
                        self.master_dsa_df.apply(
                            lambda x: self._get_sbbased_bl_prop(
                                ruv, x['blmin'] * 0.9, x['blmax'] * 1.1,
                                x['array']),
                            axis=1)
                    )
                    self.master_dsa_df['bl_ratio'] = self.master_dsa_df.apply(
                        lambda x: 1. / calc_bl_ratio(
                            x['array'], x['CYCLE'], x['num_bl_use'],
                            self.selection_df.ix[x.name, 'selConf']),
                        axis=1
                    )

            else:
                self._query_array()
                try:
                    a = self._last_array_used
                except AttributeError:
                    self._last_array_used = ''

                if array_id == 'last':
                    array_id = self.arrays.iloc[0, 3]

                if self._last_array_used == array_id:
                    self.master_dsa_df['array_ar_cond'] = \
                        self.arr_cache['array_ar_cond']
                    self.master_dsa_df['num_bl_use'] = \
                        self.arr_cache['num_bl_use']
                else:
                    self.ar, numbl, numant, ruv = self._get_bl_prop(array_id)
                    self.master_dsa_df[['array_ar_cond', 'num_bl_use']] = (
                        self.master_dsa_df.apply(
                            lambda x: self._get_sbbased_bl_prop(
                                ruv, x['blmin'] * 0.9, x['blmax'] * 1.1,
                                x['array']),
                            axis=1)
                        )
                self.arr_cache = self.master_dsa_df[
                    ['array_ar_cond', 'num_bl_use']].copy()
                self._last_array_used = array_id

                self.selection_df['selConf'] = self.master_dsa_df.apply(
                    lambda x: True if
                    ((x['array_ar_cond'] > x['minAR']) and
                     (self.ar > 0.5 * x['ARcordec']) and
                     (x['array_ar_cond'] < (x['maxAR'] * 1.3)) and
                     (x['array_ar_cond'] < (x['ARcordec'] * 1.15))) or
                    ((x['lenconf'] > 2) and
                     (x['minAR'] <= self.ar) and
                     (self.ar <= x['maxAR']) and
                     (x['array'] == "TWELVE-M"))
                    else False, axis=1)

                self.master_dsa_df['bl_ratio'] = self.master_dsa_df.apply(
                    lambda x: 1. / calc_bl_ratio(
                        x['array'], x['CYCLE'], x['num_bl_use'],
                        self.selection_df.ix[x.name, 'selConf']),
                    axis=1
                )

        # Array Configuration Selection (7m or ACA)

        elif array_kind == "SEVEN-M":
            if numant is None:
                numant = 10.
            self.selection_df['selConf'] = self.master_dsa_df.apply(
                lambda x: True if x['array'] == "SEVEN-M" else
                False, axis=1
            )
            self.master_dsa_df['blmax'] = pd.np.NaN
            self.master_dsa_df['blmin'] = pd.np.NaN
            self.master_dsa_df['array_ar_cond'] = pd.np.NaN
            self.master_dsa_df['num_bl_use'] = pd.np.NaN
            self.master_dsa_df['bl_ratio'] = self.master_dsa_df.apply(
                lambda x: 1. / calc_bl_ratio(
                    x['array'], x['CYCLE'], x['num_bl_use'],
                    self.selection_df.ix[x.name, 'selConf'], numant=numant),
                axis=1
            )

        # Array Configuration selection (TP)
        else:
            if numant is None:
                numant = 2.

            # Until we have a clear idea on how to handle TP ampcals, removing
            # them from the DSA output

            # noinspection PyUnusedLocal
            selsb = self.master_dsa_df.query(
                    'array == "TP-Array"').SB_UID.unique()
            selsb1 = self.master_dsa_df[
                self.master_dsa_df.sbNote.str.contains('TP ampcal')
            ].SB_UID.unique()

            selsb2 = pd.merge(
                pd.merge(
                    self.data.orderedtar.query('SB_UID in @selsb'),
                    self.data.target,
                    on=['SB_UID', 'targetId']),
                self.data.fieldsource,
                on=['SB_UID', 'fieldRef']).query(
                    'name_y == "Amplitude"').SB_UID.unique()

            self.selection_df['selConf'] = self.master_dsa_df.apply(
                lambda x: True if (x['array'] == "TP-Array") and
                                  ((x['SB_UID'] not in selsb1) and
                                   (x['SB_UID'] not in selsb2)) else
                False, axis=1
            )
            self.master_dsa_df['blmax'] = pd.np.NaN
            self.master_dsa_df['blmin'] = pd.np.NaN
            self.master_dsa_df['array_ar_cond'] = pd.np.NaN
            self.master_dsa_df['num_bl_use'] = pd.np.NaN
            self.master_dsa_df['bl_ratio'] = 1.

        # select observable: elev, ha, moon & sun distance

        polarization = self.master_dsa_df.query('PolCalibrator != ""').copy()
        try:
            cpol = SkyCoord(
                ra=polarization.RA_pol * u.degree,
                dec=polarization.DEC_pol * u.degree,
                location=ALMA, obstime=self._time_astropy)
        except IndexError:
            cpol = polarization.copy()

        try:
            c = SkyCoord(
                ra=self.master_dsa_df.RA * u.degree,
                dec=self.master_dsa_df.DEC * u.degree,
                location=ALMA, obstime=self._time_astropy)
        except IndexError:
            print("Nothing to observe? %s" % len(self.master_dsa_df))
            self._availableobs = False
            return

        ha = self._time_astropy.sidereal_time('apparent') - c.ra
        self.master_dsa_df['HA'] = ha.wrap_at(180 * u.degree).value
        self.master_dsa_df['RAh'] = c.ra.hour
        self.master_dsa_df['elev'] = c.transform_to(
            AltAz(obstime=self._time_astropy, location=ALMA)).alt.value
        corr_el = ((self.master_dsa_df.ephem != 'N/A') &
                   (self.master_dsa_df.ephem != 'OK'))
        self.master_dsa_df.ix[corr_el, 'elev'] = -90.
        self.master_dsa_df.ix[corr_el, 'HA'] = -24.

        self.selection_df['selElev'] = (
            (self.master_dsa_df.elev >= horizon) &
            (self.master_dsa_df.RA != 0) &
            (self.master_dsa_df.DEC != 0)
        )

        self.selection_df.set_index('SB_UID', drop=False, inplace=True)

        if len(cpol) > 0:
            ha = self._time_astropy.sidereal_time('apparent') - cpol.ra
            polarization['HA_pol'] = ha.wrap_at(180 * u.degree).value
            polarization['RAh_pol'] = cpol.ra.hour
            polarization['elev_pol'] = cpol.transform_to(
                AltAz(obstime=self._time_astropy, location=ALMA)).alt.value
            parall = pd.np.arctan(
                    pd.np.sin(ha.radian) /
                    (pd.np.tan(ALMA.latitude.radian) *
                     pd.np.cos(cpol.dec.radian) -
                     pd.np.sin(cpol.dec.radian) * pd.np.cos(ha.radian)
                     ))
            polarization['parallactic'] = pd.np.degrees(parall)
            corr_el = ((polarization.ephem != 'N/A') &
                       (polarization.ephem != 'OK'))
            polarization.ix[corr_el, 'elev_pol'] = -90.
            polarization.ix[corr_el, 'HA_pol'] = -24.
            self.polarization = polarization
            self.selection_df.loc[
                polarization[polarization.elev_pol < 20].SB_UID.values,
                'selElev'] = False

        self.selection_df['selHA'] = (
            (self.master_dsa_df.set_index('SB_UID').HA >= minha) &
            (self.master_dsa_df.set_index('SB_UID').HA <= maxha)
        )

        # Sel Conditions, exec. frac

        ind1 = pd.np.around(self.master_dsa_df.repfreq, decimals=1)

        pwv_str = (str(int(pwv / 0.05) * 0.05 +
                   (0.05 if (int(pwv * 100) % 5) > 2 else 0.)))

        self.master_dsa_df['transmission'] = self.pwvdata.ix[
            ind1, pwv_str].values
        self.master_dsa_df['tau'] = self.tau.ix[ind1, pwv_str].values
        self.master_dsa_df['tsky'] = self.tsky.ix[ind1, pwv_str].values
        self.master_dsa_df['airmass'] = self.master_dsa_df.apply(
            lambda x: calc_airmass(x['elev'], transit=False), axis=1)
        self.master_dsa_df['tsys'] = (
            self.master_dsa_df.apply(
                lambda x: calc_tsys(x['band'], x['tsky'], x['tau'],
                                    x['airmass']), axis=1))
        self.master_dsa_df['tsys_ratio'] = self.master_dsa_df.apply(
            lambda x: 1. / (x['tsys'] / x['tsys_ot'])**2.
            if x['tsys'] <= 25000. else
            0., axis=1)

        self.master_dsa_df['Exec. Frac'] = self.master_dsa_df.apply(
            lambda x: (x['bl_ratio'] * x['tsys_ratio']) if
            (x['bl_ratio'] * x['tsys_ratio']) <= 100. else 0., axis=1)

        self.selection_df['selCond'] = self.master_dsa_df.set_index(
                'SB_UID').apply(
            lambda x: True if x['Exec. Frac'] >= 0.70 else False,
            axis=1
        )

        self.master_dsa_df.set_index('SB_UID', drop=False, inplace=True)
        self.selection_df.set_index('SB_UID', drop=False, inplace=True)

        savedate = ALMA1.date
        savehoriz = ALMA1.horizon
        ALMA1.horizon = 0.0
        lstdate = str(ALMA1.sidereal_time()).split(':')
        lstdate0 = dt.datetime.strptime(
            '2014-12-31 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        lstdate1 = dt.datetime.strptime(
            '2015-01-01 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        lstdate2 = dt.datetime.strptime(
            '2015-01-02 ' + str(lstdate[0]) + ':' +
            str(lstdate[1]), '%Y-%m-%d %H:%M')
        sunrisedate = ALMA1.previous_rising(ephem.Sun())
        ALMA1.date = sunrisedate
        sunriselst = str(ALMA1.sidereal_time()).split(':')
        sunriselst_h = dt.datetime.strptime(
            '2015-01-01 ' + str(sunriselst[0]) + ':' +
            str(sunriselst[1]), '%Y-%m-%d %H:%M')
        sunsetdate = ALMA1.next_setting(ephem.Sun())
        ALMA1.date = sunsetdate
        sunsetlst = str(ALMA1.sidereal_time()).split(':')
        sunsetlst_h = dt.datetime.strptime(
            '2015-01-01 ' + str(sunsetlst[0]) + ':' +
            str(sunriselst[1]), '%Y-%m-%d %H:%M')

        self.inputs = pd.DataFrame(
            pd.np.array([lstdate0, lstdate1, lstdate2,
                         sunsetlst_h, sunriselst_h,
                         sunsetlst_h + dt.timedelta(1),
                         sunriselst_h + dt.timedelta(1)]),
            index=['lst0', 'lst1', 'lst2', 'set1', 'rise1', 'set2', 'rise2'],
            columns=['2013.A']).transpose()
        self.inputs.ix['2013.1', :] = self.inputs.ix['2013.A', :]
        self.inputs.ix['2015.A', :] = self.inputs.ix['2013.A', :]
        self.inputs.ix['2015.1', :] = self.inputs.ix['2013.A', :]
        ALMA1.date = savedate
        ALMA1.horizon = savehoriz