def calc_age_pdf(self,fehdist='casagrande'): """ NAME: calc_age_pdf PURPOSE: calculate the age PDF for a uniform SFH for a given metallicity distribution INPUT: fehdist= either: 1) a single metallicity 2) 'casagrande': local metallicity distribution following Casagrande et al. (2011) 3) a function giving OUTPUT: a function between 800 Myr and 10 Gyr giving the age distribution HISTORY: 2014-02-27 - Written in this form - Bovy (IAS) """ if isinstance(fehdist,(int,float,numpy.float32,numpy.float64)): pz= numpy.zeros(len(self._zs)) pz[numpy.argmin(numpy.fabs(self._zs-isodist.FEH2Z(fehdist,zsolar=zsolar())))]= 1. elif isinstance(fehdist,str) and fehdist.lower() == 'casagrande': pz= numpy.array([localfehdist(isodist.Z2FEH(z,zsolar=zsolar()))/z for z in self._zs]) else: pz= numpy.array([fehdist(isodist.Z2FEH(z,zsolar=zsolar()))/z for z in self._zs]) pz/= numpy.sum(pz) agezdist= self._omega/self._coarsemass pz= numpy.tile(pz,(len(self._coarselages),1)).T postage= numpy.nansum(pz*agezdist,axis=0)/numpy.nansum(pz,axis=0)/10.**self._coarselages postage= postage[self._coarselages > numpy.log10(0.8)] postage/= numpy.nanmax(postage) lages= self._coarselages[self._coarselages > numpy.log10(0.8)] postage_spline= interpolate.InterpolatedUnivariateSpline(lages, numpy.log(postage), k=3) return lambda x: dummy_page(x,copy.copy(postage_spline))
def get_rcsample(): """ NAME: get_rcsample PURPOSE: get the RC sample INPUT: None so far OUTPUT: sample HISTORY: 2015-02-10 - Started - Bovy (IAS@KITP) """ data = apread.rcsample() # Cut to statistical sample data = data[data['STAT'] == 1] # Add the M_H-based distances data = esutil.numpy_util.add_fields(data, [('RC_DIST_H', float), ('RC_DM_H', float), ('RC_GALR_H', float), ('RC_GALPHI_H', float), ('RC_GALZ_H', float)]) rcd = rcdist() jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) data['RC_DIST_H'] = rcd(jk, z, appmag=data['H0'], mh=True) data['RC_DM_H'] = 5. * numpy.log10(data['RC_DIST_H']) + 10. XYZ = bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST_H'], degree=True) R, phi, Z = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Xsun=8., Zsun=0.025) data['RC_GALR_H'] = R data['RC_GALPHI_H'] = phi data['RC_GALZ_H'] = Z # Add the average alpha/Fe data = esutil.numpy_util.add_fields(data, [('AVG_ALPHAFE', float)]) data['AVG_ALPHAFE'] = avg_alphafe(data) # Apply -0.1 offset in [Fe/H] data[_FEHTAG] += -0.10 # Remove locations outside of the Pan-STARRS dust map # In the Southern hemisphere data = data[data['LOCATION_ID'] != 4266] #240,-18 data = data[data['LOCATION_ID'] != 4331] #5.5,-14.2 data = data[data['LOCATION_ID'] != 4381] #5.2,-12.2 data = data[data['LOCATION_ID'] != 4332] #1,-4 data = data[data['LOCATION_ID'] != 4329] #0,-5 data = data[data['LOCATION_ID'] != 4351] #0,-2 data = data[data['LOCATION_ID'] != 4353] #358,0 data = data[data['LOCATION_ID'] != 4385] #358.6,1.4 # Close to the ecliptic pole where there's no data (is it the ecliptic pole? data = data[data['LOCATION_ID'] != 4528] #120,30 data = data[data['LOCATION_ID'] != 4217] #123,22.4 # Remove stars w/ DM < 8.49, because for standard candle RC, these cannot be in the sample data = data[data['RC_DM_H'] > 8.49] return data
def popmass(self, feh, lage): """ NAME: calc_popmass PURPOSE: calculate the mass represented by each RC star INPUT: feh - metallicity lage - log10 age OUTPUT: stellar-pop mass for each RC star HISTORY: 2014-02-28 - Written in this form - Bovy (IAS) """ if lage < numpy.log10(0.8): return numpy.nan z = isodist.FEH2Z(feh, zsolar=zsolar()) zindx = numpy.argmin(numpy.fabs(z - self._zs)) aindx = numpy.argmin((numpy.fabs(lage - self._coarselages))) return self._coarsemass[zindx, aindx] / self._omega[zindx, aindx]
def avgmass(self, feh, lage): """ NAME: calc_avgmass PURPOSE: calculate the average mass INPUT: feh - metallicity lage - log10 age OUTPUT: average mass in solar masses HISTORY: 2014-02-28 - Written in this form - Bovy (IAS) """ if lage < numpy.log10(0.8): return numpy.nan z = isodist.FEH2Z(feh, zsolar=zsolar()) zindx = numpy.argmin(numpy.fabs(z - self._zs)) aindx = numpy.argmin((numpy.fabs(lage - self._finelages))) return self._finemass[zindx, aindx]
print( "%i / %i = %i%% APOKASC CLUMP stars are in the RC catalog (COMPLETENESS)" % (numpy.sum(rcclumpseismo), numpy.sum(clumpseismo), float(numpy.sum(rcclumpseismo)) / numpy.sum(clumpseismo) * 100.)) print( "%i / %i = %i%% APOKASC non-CLUMP stars out of all stars in the RC catalog with evolutionary measurements are in the RC catalog (CONTAMINATION)" % (numpy.sum(rcnoclumpseismo), numpy.sum(rcnoclumpseismo) + numpy.sum(rcclumpseismo), float(numpy.sum(rcnoclumpseismo)) / (numpy.sum(rcnoclumpseismo) + numpy.sum(rcclumpseismo)) * 100.)) rcindx = data['RC'] == 1 #Statistics using simple seismo logg cut kascLoggTag = 'KASC_RG_LOGG_SCALE_2' try: clumplogg= (data[kascLoggTag] > 1.8)\ *(data[kascLoggTag] < rcmodel.loggteffcut(data['TEFF'], isodist.FEH2Z(data['METALS'],zsolar=0.017),upper=True))#2.8) except ValueError: kascLoggTag = 'LOGGRG' clumplogg= (data[kascLoggTag] > 1.8)\ *(data[kascLoggTag] < rcmodel.loggteffcut(data['TEFF'], isodist.FEH2Z(data['METALS'],zsolar=0.017),upper=True))#2.8) if False: rcclumplogg = clumplogg * (data['RC'] == 1) print("%i / %i = %i%% APOKASC logg clump stars are in the RC catalog" % (numpy.sum(rcclumplogg), numpy.sum(clumplogg), float(numpy.sum(rcclumplogg)) / numpy.sum(clumplogg) * 100)) rcnoclumplogg = (True ^ clumplogg) * (data['RC'] == 1) print( "%i / %i = %i%% APOKASC logg non-clump stars are in the RC catalog" % (numpy.sum(rcnoclumplogg), numpy.sum(True ^ clumplogg), float(numpy.sum(rcnoclumplogg)) / numpy.sum(True ^ clumplogg) *
def plot_nonaxi(parser): (options, args) = parser.parse_args() if len(args) == 0 or options.plotfilename is None: parser.print_help() return #Read the data print "Reading the data ..." data = readVclosData( postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, validfeh=options.indivfeh, #if indivfeh, we need validfeh cutmultiples=options.cutmultiples, jkmax=options.jkmax) #data= data[0:20] #HACK indx = (data['J0MAG'] - data['K0MAG'] < 0.5) data['J0MAG'][indx] = 0.5 + data['K0MAG'][indx] indx = (data['GLON'] <= 30.) data['GLON'][ indx] = 30.05 #Hack because the non-axi models don't go below Ro/2 #Cut outliers #data= data[(data['VHELIO'] < 200.)*(data['VHELIO'] > -200.)] #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile = open(options.isofile, 'rb') iso = pickle.load(isofile) if options.indivfeh: zs = pickle.load(isofile) elif options.varfeh: locl = pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso = [] zs = numpy.arange(0.0005, 0.03005, 0.0005) for ii in range(len(zs)): iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs = list(set(data['LOCATION'])) iso = [] for ii in range(len(locs)): indx = (data['LOCATION'] == locs[ii]) locl = numpy.mean(data['GLON'][indx] * _DEGTORAD) iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso = isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, expsfh=options.expsfh) if options.dwarf: iso = [ iso, isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, dwarf=True, expsfh=options.expsfh) ] else: iso = [iso] if not options.isofile is None: isofile = open(options.isofile, 'wb') pickle.dump(iso, isofile) if options.indivfeh: pickle.dump(zs, isofile) elif options.varfeh: pickle.dump(locl, isofile) isofile.close() df = None print "Pre-calculating isochrone distance prior ..." logpiso = numpy.zeros((len(data), _BINTEGRATENBINS)) ds = numpy.linspace(_BINTEGRATEDMIN, _BINTEGRATEDMAX, _BINTEGRATENBINS) dm = _dm(ds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm if options.indivfeh: #Find closest Z thisZ = isodist.FEH2Z(data[ii]['FEH']) indx = numpy.argmin(numpy.fabs(thisZ - zs)) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) elif options.varfeh: #Find correct iso indx = (locl == data[ii]['LOCATION']) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpiso[ii, :] = iso[0](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) if options.dwarf: logpisodwarf = numpy.zeros((len(data), _BINTEGRATENBINS)) dwarfds = numpy.linspace(_BINTEGRATEDMIN_DWARF, _BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm = _dm(dwarfds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm logpisodwarf[ii, :] = iso[1](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpisodwarf = None """ #Does not matter anyway #clean logpiso dataindx= [] for ii in range(len(data)): thislogpiso= logpiso[ii,:]-logsumexp(logpiso[ii,:]) if numpy.all(thislogpiso == 0.): dataindx.append(False) else: dataindx.append(True) dataindx= numpy.array(dataindx,dtype='bool') data= data[dataindx] logpiso= logpiso[dataindx,:] logpisodwarf= logpisodwarf[dataindx,:] """ #Calculate data means etc. #Calculate means locations = list(set(data['LOCATION'])) nlocs = len(locations) l_plate = numpy.zeros(nlocs) avg_plate = numpy.zeros(nlocs) sig_plate = numpy.zeros(nlocs) siga_plate = numpy.zeros(nlocs) for ii in range(nlocs): indx = (data['LOCATION'] == locations[ii]) l_plate[ii] = numpy.mean(data['GLON'][indx]) avg_plate[ii] = numpy.mean(data['VHELIO'][indx]) sig_plate[ii] = numpy.std(data['VHELIO'][indx]) siga_plate[ii] = numpy.std(data['VHELIO'][indx]) / numpy.sqrt( numpy.sum(indx)) #Calculate plate means and variances from the model #Load initial parameters from file savefile = open(args[0], 'rb') params = pickle.load(savefile) savefile.close() #First calculate fiducial model if not options.dwarf: logpisodwarf = None avg_plate_model_fid = calc_model(params, options, data, logpiso, logpisodwarf, df, nlocs, locations, iso) print l_plate, avg_plate_model_fid #Plot everything bovy_plot.bovy_print(fig_height=6., fig_width=7.) dx = 0.8 / 5. left, bottom, width, height = 0.1, 0.9 - dx, 0.8, dx axTop = pyplot.axes([left, bottom, width, height]) allaxes = [axTop] fig = pyplot.gcf() fig.sca(axTop) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid, 'ko', overplot=True) pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{fiducial}$', top_right=True, size=14.) thisax = pyplot.gca() thisax.set_ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() nullfmt = NullFormatter() # no labels axTop.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) bovy_plot._add_ticks() #Second is bar print "Reading bar file ..." barfile = '/work/bovy/data/bovy/nonaximw/bar/bar_rect_vr_tform-150_tsteady-4pi_51_101.sav' avg_plate_bar = calc_nonaxi(params, barfile, options, data, logpiso, nlocs, locations, 0.) print avg_plate_bar left, bottom, width, height = 0.1, 0.9 - 2. * dx, 0.8, dx thisax = pyplot.axes([left, bottom, width, height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid, 'o', overplot=True, color='0.6') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid, yerr=siga_plate, marker='o', color='0.6', linestyle='none', elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, 'o', overplot=True, color='k') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{bar}$', top_right=True, size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') thisax.set_ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) bovy_plot._add_ticks() #Third is spiral print "Reading spiral file ..." barfile = '/work/bovy/data/bovy/nonaximw/spiral/spiral_rect_vr_51_101.sav' avg_plate_bar = calc_nonaxi(params, barfile, options, data, logpiso, nlocs, locations, 0.) print avg_plate_bar left, bottom, width, height = 0.1, 0.9 - 3. * dx, 0.8, dx thisax = pyplot.axes([left, bottom, width, height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid, 'o', overplot=True, color='0.6') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid, yerr=siga_plate, marker='o', color='0.6', linestyle='none', elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, 'o', overplot=True, color='k') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{spiral}$', top_right=True, size=14.) pyplot.ylabel( r'$\bar{V}_{\mathrm{data}}-\bar{V}_{\mathrm{model}} \ [\mathrm{km\ s}^{-1}]$' ) thisax.set_ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) #Fourth is first elliptical print "Reading elliptical file ..." barfile = '/work/bovy/data/bovy/nonaximw/elliptical/el_rect_so_0.2_res_51_grid_101_tform_-150._tsteady_125._cp_0.05_nsigma_4.sav' avg_plate_bar = calc_nonaxi(params, barfile, options, data, logpiso, nlocs, locations, 0.) print avg_plate_bar left, bottom, width, height = 0.1, 0.9 - 4. * dx, 0.8, dx thisax = pyplot.axes([left, bottom, width, height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid, 'o', overplot=True, color='0.6') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid, yerr=siga_plate, marker='o', color='0.6', linestyle='none', elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, 'o', overplot=True, color='k') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{elliptical}$', top_right=True, size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') thisax.set_ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) bovy_plot._add_ticks() #Fourth is first elliptical print "Reading elliptical file ..." barfile = '/work/bovy/data/bovy/nonaximw/elliptical/el_rect_so_0.2_res_51_grid_101_tform_-150._tsteady_125._cp_0.05_nsigma_4.sav' avg_plate_bar = calc_nonaxi(params, barfile, options, data, logpiso, nlocs, locations, -45. * _DEGTORAD) print avg_plate_bar left, bottom, width, height = 0.1, 0.9 - 5. * dx, 0.8, dx thisax = pyplot.axes([left, bottom, width, height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid, 'o', overplot=True, color='0.6') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid, yerr=siga_plate, marker='o', color='0.6', linestyle='none', elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, 'o', overplot=True, color='k') pyplot.errorbar(l_plate, avg_plate - avg_plate_model_fid - avg_plate_bar, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{elliptical}$', top_right=True, size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') thisax.set_ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() #thisax.xaxis.set_major_formatter(nullfmt) pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) bovy_plot._add_ticks() #Save bovy_plot.bovy_end_print(options.plotfilename) return None
def make_rcsample(parser): options, args = parser.parse_args() savefilename = options.savefilename if savefilename is None: #Create savefilename if not given savefilename = os.path.join( appath._APOGEE_DATA, 'rcsample_' + appath._APOGEE_REDUX + '.fits') print("Saving to %s ..." % savefilename) #Read the base-sample data = apread.allStar(adddist=_ADDHAYDENDIST, rmdups=options.rmdups) #Remove a bunch of fields that we do not want to keep data = esutil.numpy_util.remove_fields(data, [ 'TARGET_ID', 'FILE', 'AK_WISE', 'SFD_EBV', 'SYNTHVHELIO_AVG', 'SYNTHVSCATTER', 'SYNTHVERR', 'SYNTHVERR_MED', 'RV_TEFF', 'RV_LOGG', 'RV_FEH', 'RV_ALPHA', 'RV_CARB', 'RV_CCFWHM', 'RV_AUTOFWHM', 'SYNTHSCATTER', 'STABLERV_CHI2', 'STABLERV_RCHI2', 'STABLERV_CHI2_PROB', 'CHI2_THRESHOLD', 'APSTAR_VERSION', 'ASPCAP_VERSION', 'RESULTS_VERSION', 'WASH_M', 'WASH_M_ERR', 'WASH_T2', 'WASH_T2_ERR', 'DDO51', 'DDO51_ERR', 'IRAC_3_6', 'IRAC_3_6_ERR', 'IRAC_4_5', 'IRAC_4_5_ERR', 'IRAC_5_8', 'IRAC_5_8_ERR', 'IRAC_8_0', 'IRAC_8_0_ERR', 'WISE_4_5', 'WISE_4_5_ERR', 'TARG_4_5', 'TARG_4_5_ERR', 'WASH_DDO51_GIANT_FLAG', 'WASH_DDO51_STAR_FLAG', 'REDUCTION_ID', 'SRC_H', 'PM_SRC' ]) if not appath._APOGEE_REDUX.lower() == 'current' \ and not 'l30' in appath._APOGEE_REDUX \ and int(appath._APOGEE_REDUX[1:]) < 500: data = esutil.numpy_util.remove_fields(data, ['ELEM']) #Select red-clump stars jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) if 'l30' in appath._APOGEE_REDUX: logg = data['LOGG'] elif appath._APOGEE_REDUX.lower() == 'current' \ or int(appath._APOGEE_REDUX[1:]) > 600: from apogee.tools import paramIndx if False: #Use my custom logg calibration that's correct for the RC logg = (1. - 0.042) * data['FPARAM'][:, paramIndx('logg')] - 0.213 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.255 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.3726 else: #Use my custom logg calibration that's correct on average logg = (1. + 0.03) * data['FPARAM'][:, paramIndx('logg')] - 0.37 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.34 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.256 else: logg = data['LOGG'] indx= (jk < 0.8)*(jk >= 0.5)\ *(z <= 0.06)\ *(z <= rcmodel.jkzcut(jk,upper=True))\ *(z >= rcmodel.jkzcut(jk))\ *(logg >= rcmodel.loggteffcut(data['TEFF'],z,upper=False))\ *(logg <= rcmodel.loggteffcut(data['TEFF'],z,upper=True)) data = data[indx] #Add more aggressive flag cut data = esutil.numpy_util.add_fields(data, [('ADDL_LOGG_CUT', numpy.int32)]) data['ADDL_LOGG_CUT'] = ( (data['TEFF'] - 4800.) / 1000. + 2.75) > data['LOGG'] if options.loggcut: data = data[data['ADDL_LOGG_CUT'] == 1] print("Making catalog of %i objects ..." % len(data)) #Add distances data = esutil.numpy_util.add_fields(data, [('RC_DIST', float), ('RC_DM', float), ('RC_GALR', float), ('RC_GALPHI', float), ('RC_GALZ', float)]) rcd = rcmodel.rcdist() jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) data['RC_DIST'] = rcd(jk, z, appmag=data['K0']) * options.distfac data['RC_DM'] = 5. * numpy.log10(data['RC_DIST']) + 10. XYZ = bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST'], degree=True) R, phi, Z = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Xsun=8., Zsun=0.025) data['RC_GALR'] = R data['RC_GALPHI'] = phi data['RC_GALZ'] = Z #Save fitsio.write(savefilename, data, clobber=True) # Add Tycho-2 matches if options.tyc2: data = esutil.numpy_util.add_fields(data, [('TYC2MATCH', numpy.int32), ('TYC1', numpy.int32), ('TYC2', numpy.int32), ('TYC3', numpy.int32)]) data['TYC2MATCH'] = 0 data['TYC1'] = -1 data['TYC2'] = -1 data['TYC3'] = -1 # Write positions posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=2', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:Tycho2', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Directly match on input RA ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, usecols=(1, 2, 7, 8, 9)) iis = numpy.arange(len(data)) mai = [iis[data['RA'] == ma[ii, 0]][0] for ii in range(len(ma))] data['TYC2MATCH'][mai] = 1 data['TYC1'][mai] = ma[:, 2] data['TYC2'][mai] = ma[:, 3] data['TYC3'][mai] = ma[:, 4] os.remove(posfilename) os.remove(resultfilename) if not options.nostat: #Determine statistical sample and add flag apo = apogee.select.apogeeSelect() statIndx = apo.determine_statistical(data) mainIndx = apread.mainIndx(data) data = esutil.numpy_util.add_fields(data, [('STAT', numpy.int32), ('INVSF', float)]) data['STAT'] = 0 data['STAT'][statIndx * mainIndx] = 1 for ii in range(len(data)): if (statIndx * mainIndx)[ii]: data['INVSF'][ii] = 1. / apo(data['LOCATION_ID'][ii], data['H'][ii]) else: data['INVSF'][ii] = -1. if options.nopm: fitsio.write(savefilename, data, clobber=True) return None #Get proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms.fits' if os.path.exists(pmfile): pmdata = fitsio.read(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:UCAC4', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999) }, usecols=(4, 5, 15, 16, 17, 18)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsio.read(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions try: #These already exist currently, but may not always exist data = esutil.numpy_util.remove_fields(data, ['PMRA', 'PMDEC']) except ValueError: pass data = esutil.numpy_util.add_fields(data, [('PMRA', numpy.float), ('PMDEC', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH', numpy.int32)]) data['PMMATCH'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA'][m2] = pmdata['PMRA'][m1] data['PMDEC'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH'] == 1 data['PMRA'][True - pmindx] = -9999.99 data['PMDEC'][True - pmindx] = -9999.99 data['PMRA_ERR'][True - pmindx] = -9999.99 data['PMDEC_ERR'][True - pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'], data['PMDEC'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vR, vT, vZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR'] = vR data['GALVT'] = vT data['GALVZ'] = vZ data['GALVR'][True - pmindx] = -9999.99 data['GALVT'][True - pmindx] = -9999.99 data['GALVZ'][True - pmindx] = -9999.99 #Get PPMXL proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms_ppmxl.fits' if os.path.exists(pmfile): pmdata = fitsio.read(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:PPMXL', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999) }, usecols=(4, 5, 15, 16, 19, 20)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsio.read(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions to ppmxl data = esutil.numpy_util.add_fields(data, [('PMRA_PPMXL', numpy.float), ('PMDEC_PPMXL', numpy.float), ('PMRA_ERR_PPMXL', numpy.float), ('PMDEC_ERR_PPMXL', numpy.float), ('PMMATCH_PPMXL', numpy.int32)]) data['PMMATCH_PPMXL'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA_PPMXL'][m2] = pmdata['PMRA'][m1] data['PMDEC_PPMXL'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR_PPMXL'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR_PPMXL'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH_PPMXL'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH_PPMXL'] == 1 data['PMRA_PPMXL'][True - pmindx] = -9999.99 data['PMDEC_PPMXL'][True - pmindx] = -9999.99 data['PMRA_ERR_PPMXL'][True - pmindx] = -9999.99 data['PMDEC_ERR_PPMXL'][True - pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR_PPMXL', numpy.float), ('GALVT_PPMXL', numpy.float), ('GALVZ_PPMXL', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA_PPMXL'], data['PMDEC_PPMXL'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vR, vT, vZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR_PPMXL'] = vR data['GALVT_PPMXL'] = vT data['GALVZ_PPMXL'] = vZ data['GALVR_PPMXL'][True - pmindx] = -9999.99 data['GALVT_PPMXL'][True - pmindx] = -9999.99 data['GALVZ_PPMXL'][True - pmindx] = -9999.99 #Save fitsio.write(savefilename, data, clobber=True) return None
def plot_distanceprior(parser): (options, args) = parser.parse_args() #Read the data print "Reading the data ..." data = readVclosData( postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, cutmultiples=options.cutmultiples, validfeh=options.indivfeh, #if indivfeh, we need validfeh jkmax=options.jkmax, datafilename=options.fakedata) l = data['GLON'] * _DEGTORAD b = data['GLAT'] * _DEGTORAD sinl = numpy.sin(l) cosl = numpy.cos(l) sinb = numpy.sin(b) cosb = numpy.cos(b) jk = data['J0MAG'] - data['K0MAG'] jk[(jk < 0.5)] = 0.5 #BOVY: FIX THIS HACK BY EMAILING GAIL h = data['H0MAG'] #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile = open(options.isofile, 'rb') iso = pickle.load(isofile) if options.indivfeh: zs = pickle.load(isofile) elif options.varfeh: locl = pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso = [] zs = numpy.arange(0.0005, 0.03005, 0.0005) for ii in range(len(zs)): iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs = list(set(data['LOCATION'])) iso = [] for ii in range(len(locs)): indx = (data['LOCATION'] == locs[ii]) locl = numpy.mean(data['GLON'][indx] * _DEGTORAD) iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso = isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, expsfh=options.expsfh) #Set up polar grid res = 51 xgrid = numpy.linspace(0., 2. * math.pi * (1. - 1. / res / 2.), 2 * res) ygrid = numpy.linspace(0.5, 2.8, res) plotxgrid = numpy.linspace(xgrid[0] - (xgrid[1] - xgrid[0]) / 2., xgrid[-1] + (xgrid[1] - xgrid[0]) / 2., len(xgrid) + 1) plotygrid = numpy.linspace(ygrid[0] - (ygrid[1] - ygrid[0]) / 2., ygrid[-1] + (ygrid[1] - ygrid[0]) / 2., len(ygrid) + 1) plotthis = numpy.zeros((2 * res, res, len(data))) - numpy.finfo( numpy.dtype(numpy.float64)).max #_BINTEGRATENBINS= 11 #For quick testing ds = numpy.linspace(_BINTEGRATEDMIN, _BINTEGRATEDMAX, _BINTEGRATENBINS) logpiso = numpy.zeros((len(data), _BINTEGRATENBINS)) dm = _dm(ds) for ii in range(len(data)): mh = h[ii] - dm if options.indivfeh: #Find closest Z thisZ = isodist.FEH2Z(data[ii]['FEH']) indx = numpy.argmin(numpy.fabs(thisZ - zs)) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + jk[ii], mh) elif options.varfeh: #Find correct iso indx = (locl == data[ii]['LOCATION']) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + jk[ii], mh) else: logpiso[ii, :] = iso(numpy.zeros(_BINTEGRATENBINS) + jk[ii], mh) for jj in range(_BINTEGRATENBINS): d = ds[jj] / _REFR0 R = numpy.sqrt(1. + d**2. - 2. * d * cosl) indx = (R == 0.) R[indx] += 0.0001 theta = numpy.arcsin(d / R * sinl) indx = (1. / cosl < d) * (cosl > 0.) theta[indx] = numpy.pi - theta[indx] indx = (theta < 0.) theta[indx] += 2. * math.pi thisout = _logpd([0., 1.], d, None, None, None, None, None, options, R, theta, 1., 0., logpiso[:, jj]) #Find bin to which these contribute thetabin = numpy.floor((theta - xgrid[0]) / (xgrid[1] - xgrid[0]) + 0.5) Rbin = numpy.floor((R - plotygrid[0]) / (plotygrid[1] - plotygrid[0])) indx = (thetabin < 0) thetabin[indx] = 0 Rbin[indx] = 0 thisout[indx] = -numpy.finfo(numpy.dtype(numpy.float64)).max indx = (thetabin >= 2 * res) thetabin[indx] = 0. #Has to be #Rbin[indx]= 0 #thisout[indx]= -numpy.finfo(numpy.dtype(numpy.float64)).max indx = (Rbin < 0) thetabin[indx] = 0 Rbin[indx] = 0 thisout[indx] = -numpy.finfo(numpy.dtype(numpy.float64)).max indx = (Rbin >= res) thetabin[indx] = 0 Rbin[indx] = 0 thisout[indx] = -numpy.finfo(numpy.dtype(numpy.float64)).max thetabin = thetabin.astype('int') Rbin = Rbin.astype('int') for ii in range(len(data)): plotthis[thetabin, Rbin, ii] = thisout[ii] #Normalize for ii in range(2 * res): for jj in range(res): plotthis[ii, jj, 0] = logsumexp(plotthis[ii, jj, :]) plotthis = plotthis[:, :, 0] plotthis -= numpy.amax(plotthis) plotthis = numpy.exp(plotthis) plotthis[(plotthis == 0.)] = numpy.nan #Get los locations = list(set(data['LOCATION'])) nlocs = len(locations) l_plate = numpy.zeros(nlocs) for ii in range(nlocs): indx = (data['LOCATION'] == locations[ii]) l_plate[ii] = numpy.mean(data['GLON'][indx]) bovy_plot.bovy_print() ax = pyplot.subplot(111, projection='galpolar') #galpolar is in bovy_plot vmin, vmax = 0., 1. out = ax.pcolor(plotxgrid, plotygrid, plotthis.T, cmap='gist_yarg', vmin=vmin, vmax=vmax, zorder=2) #Overlay los for ii in range(nlocs): lds = numpy.linspace(0., 2.95, 501) lt = numpy.zeros(len(lds)) lr = numpy.zeros(len(lds)) lr = numpy.sqrt(1. + lds**2. - 2. * lds * numpy.cos(l_plate[ii] * _DEGTORAD)) lt = numpy.arcsin(lds / lr * numpy.sin(l_plate[ii] * _DEGTORAD)) indx = (1. / numpy.cos(l_plate[ii] * _DEGTORAD) < lds) * (numpy.cos( l_plate[ii] * _DEGTORAD) > 0.) lt[indx] = numpy.pi - lt[indx] ax.plot(lt, lr, ls='--', color='w', zorder=3) from matplotlib.patches import Arrow, FancyArrowPatch arr = FancyArrowPatch(posA=(-math.pi / 2., 1.8), posB=(-math.pi / 4., 1.8), arrowstyle='->', connectionstyle='arc3,rad=%4.2f' % (-math.pi / 16.), shrinkA=2.0, shrinkB=2.0, mutation_scale=20.0, mutation_aspect=None, fc='k') ax.add_patch(arr) bovy_plot.bovy_text(-math.pi / 2., 1.97, r'$\mathrm{Galactic\ rotation}$', rotation=-22.5) radii = numpy.array([0.5, 1., 1.5, 2., 2.5]) labels = [] for r in radii: ax.plot(numpy.linspace( 0., 2. * math.pi, 501, ), numpy.zeros(501) + r, ls='-', color='0.65', zorder=1, lw=0.5) labels.append(r'$%i$' % int(r * 8.)) pyplot.rgrids(radii, labels=labels, angle=-32.5) bovy_plot.bovy_text(5.785, 2.82, r'$\mathrm{kpc}$') azs = numpy.array([0., 45., 90., 135., 180., 225., 270., 315.]) * _DEGTORAD for az in azs: ax.plot(numpy.zeros(501) + az, numpy.linspace(0., 2.8, 501), '-', color='0.6', lw=0.5, zorder=1) #Sun bovy_plot.bovy_text(0.065, .9075, r'$\odot$') pyplot.ylim(0., 2.8) bovy_plot.bovy_end_print(options.plotfile)
options.fitsratio + 2 * options.fitsratioinnerouter] if options.fitahinnerouter and data[ii]['GLON'] < 35.: ah = params[5 - options.nooutliermean + (options.rotcurve.lower() == 'linear') + (options.rotcurve.lower() == 'powerlaw') + 2 * (options.rotcurve.lower() == 'quadratic') + 3 * (options.rotcurve.lower() == 'cubic') + 2 * options.fitvpec + options.dwarf + options.fitsratio + 2 * options.fitsratioinnerouter + options.fiths + options.fitsrinnerouter + options.dwarfinnerouter + options.fitah + options.fitdm] mh = data['H0MAG'][ii] - dm + ah if options.indivfeh: #Find closest Z thisZ = isodist.FEH2Z(data[ii]['FEH']) indx = numpy.argmin(numpy.fabs(thisZ - zs)) logpiso[ii, :] = iso[0][indx]( numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) elif options.varfeh: #Find correct iso indx = (locl == data[ii]['LOCATION']) logpiso[ii, :] = iso[0][indx]( numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpiso[ii, :] = iso[0](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii] + 1.5 / 1.55 * ah, mh) elif options.fitdm:
def logl(init=None,data=None,options=None): if options is None: parser= get_options() options, args= parser.parse_args([]) if data is None: #Read data data= readVclosData(lmin=25., bmax=2., ak=True, validfeh=options.indivfeh, #if indivfeh, we need validfeh correctak=options.correctak, jkmax=1.1) #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile= open(options.isofile,'rb') iso= pickle.load(isofile) if options.indivfeh: zs= pickle.load(isofile) elif options.varfeh: locl= pickle.load(isofile) isofile.close() else: if options.indivfeh: #Load all isochrones iso= [] zs= numpy.arange(0.0005,0.03005,0.0005) for ii in range(len(zs)): iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs= list(set(data['LOCATION'])) iso= [] for ii in range(len(locs)): indx= (data['LOCATION'] == locs[ii]) locl= numpy.mean(data['GLON'][indx]*_DEGTORAD) iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso= isomodel.isomodel(Z=0.019) if options.dwarf: iso= [iso, isomodel.isomodel(Z=0.019, dwarf=True)] else: iso= [iso] if not options.isofile is None: isofile= open(options.isofile,'wb') pickle.dump(iso,isofile) if options.indivfeh: pickle.dump(zs,isofile) elif options.varfeh: pickle.dump(locl,isofile) isofile.close() df= None #Pre-calculate distance prior logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None if isinstance(init,str): #FILE #Load initial parameters from file savefile= open(init,'rb') params= pickle.load(savefile) savefile.close() else: #Array params= init #Prep data l= data['GLON']*_DEGTORAD b= data['GLAT']*_DEGTORAD sinl= numpy.sin(l) cosl= numpy.cos(l) sinb= numpy.sin(b) cosb= numpy.cos(b) jk= data['J0MAG']-data['K0MAG'] try: jk[(jk < 0.5)]= 0.5 #BOVY: FIX THIS HACK BY EMAILING GAIL except TypeError: pass #HACK h= data['H0MAG'] options.multi= 1 out= -mloglike(params,data['VHELIO'], l, b, jk, h, df,options, sinl, cosl, cosb, sinb, logpiso, logpisodwarf,True,None,iso,data['FEH']) #None iso for now return out
def imf_h_jk(plotfile,Z=None,dwarf=False,log=False,h=12.,basti=False, dartmouth=False,kroupa=False): #Read isochrones if basti: zs= numpy.array([0.0001,0.0003,0.0006,0.001,0.002,0.004,0.008, 0.01,0.0198,0.03,0.04]) elif dartmouth: zs= isodist.FEH2Z(numpy.array([-2.5,-2.,-1.5,-1.,-0.5,0.,0.2,0.3,0.5])) else: zs= numpy.arange(0.0005,0.03005,0.0005) if Z is None: Zs= zs elif not basti and not dartmouth: if Z < 0.01: Zs= [Z-0.001,Z-0.0005,Z,Z+0.0005,Z+0.001] #build up statistics else: Zs= [Z-0.0005,Z,Z+0.0005] #build up statistics else: Zs= [Z] if basti: p= isodist.BastiIsochrone(Z=Zs) elif dartmouth: p= isodist.DartmouthIsochrone(feh=isodist.Z2FEH(Zs),onlyold=True) else: p= isodist.PadovaIsochrone(Z=Zs) #Get relevant data sample= [] weights= [] for logage in p.logages(): for z in Zs: thisiso= p(logage,z) if basti: mini= thisiso['M_ini'] elif dartmouth: mini= thisiso['M'] else: mini= thisiso['M_ini'] if basti: int_IMF= isodist.imf.lognormalChabrier2001(thisiso['M_ini'], int=True) dmpm= numpy.roll(int_IMF,-1)-int_IMF elif dartmouth: int_IMF= isodist.imf.lognormalChabrier2001(thisiso['M'], int=True) dmpm= numpy.roll(int_IMF,-1)-int_IMF else: if kroupa: int_IMF= isodist.imf.kroupa2003(thisiso['M_ini'],int=True) dmpm= numpy.roll(int_IMF,-1)-int_IMF else: dmpm= numpy.roll(thisiso['int_IMF'],-1)-thisiso['int_IMF'] for ii in range(1,len(mini)-1): if basti: JK= thisiso['J'][ii]-thisiso['K'][ii] else: JK= thisiso['J'][ii]-thisiso['Ks'][ii] H= thisiso['H'][ii] if JK < 0.: # or thisiso['logg'][ii] > 3.5: continue if dmpm[ii] > 0.: if basti: sample.append([thisiso['J'][ii]-thisiso['K'][ii], thisiso['H'][ii]]) else: sample.append([thisiso['J'][ii]-thisiso['Ks'][ii], thisiso['H'][ii]]) if dartmouth: if logage > numpy.log10(5.)+9.: weights.append(2.*dmpm[ii]) #Dartmouth are linearly spaced, but spacing is bigger at > 5 Gyr else: weights.append(dmpm[ii]) #Dartmouth are linearly spaced? else: weights.append(dmpm[ii]*10**(logage-7.)) #weights.append(dmpm[ii]*10**(logage-7.)*numpy.exp((10.**(logage-7.))/800.)) else: continue #no use in continuing here #Form array sample= numpy.array(sample) weights= numpy.array(weights) #Histogram if dwarf: hist, edges= numpy.histogramdd(sample,weights=weights,bins=51, range=[[0.,1.6],[2.,9.]]) else: hist, edges= numpy.histogramdd(sample,weights=weights,bins=49, range=[[0.3,1.6],[-11.,2]]) #Normalize each J-K for ii in range(len(hist[:,0])): hist[ii,:]/= numpy.nanmax(hist[ii,:])/numpy.nanmax(hist) rev= copy.copy(hist[ii,::-1]) #reverse, but in one go does not always work hist[ii,:]= rev #Plot bovy_plot.bovy_print() if log: hist= numpy.log(hist) bovy_plot.bovy_dens2d(hist.T,origin='lower',cmap='gist_yarg', xrange=[edges[0][0],edges[0][-1]], yrange=[edges[1][-1],edges[1][0]], aspect=(edges[0][-1]-edges[0][0])/float(edges[1][-1]-edges[1][0]), xlabel=r'$(J-K_s)_0\ [\mathrm{mag}]$', ylabel=r'$M_H\ [\mathrm{mag}]$', interpolation='nearest') #Add extinction arrow djk= 0.45 dh= 1.55/1.5*djk from matplotlib.patches import FancyArrowPatch ax=pyplot.gca() ax.add_patch(FancyArrowPatch((1.,-2.),(1+djk,-2+dh), arrowstyle='->',mutation_scale=20,fill=True, lw=1.25)) bovy_plot.bovy_text(1.05,-2.05,r'$\mathrm{extinction}$', rotation=-math.atan(1.5/1.55*1.3/13.)/math.pi*180., size=14.) #Add color cut bovy_plot.bovy_plot([0.5,0.5],[-20.,20.],'--',color='0.6',overplot=True) ax.add_patch(FancyArrowPatch((0.5,-6.),(0.7,-6.), arrowstyle='->',mutation_scale=20,fill=True, lw=1.25,ls='dashed',color='0.6')) bovy_plot.bovy_text(0.43,-8.,r'$\mathrm{APOGEE\ color\ cut}$',rotation=90., size=14.) #Add twin y axis ax= pyplot.gca() def my_formatter(x, pos): """distance in kpc for m=h""" xs= 10.**((h-x)/5.-2.) return r'$%.0f$' % xs def my_formatter2(x, pos): """distance in kpc for m=h""" xs= 10.**((h-x)/5.+1.) return r'$%.0f$' % xs ax2= pyplot.twinx() if dwarf: major_formatter = FuncFormatter(my_formatter2) else: major_formatter = FuncFormatter(my_formatter) ax2.yaxis.set_major_formatter(major_formatter) ystep= ax.yaxis.get_majorticklocs() ystep= ystep[1]-ystep[0] ax2.yaxis.set_minor_locator(MultipleLocator(ystep/5.)) ax2.yaxis.tick_right() ax2.yaxis.set_label_position('right') ymin, ymax= ax.yaxis.get_view_interval() ax2.yaxis.set_view_interval(ymin,ymax,ignore=True) if dwarf: ax2.set_ylabel('$\mathrm{distance\ for}\ H_0\ =\ %.1f\ [\mathrm{pc}]$' % h) else: ax2.set_ylabel('$\mathrm{distance\ for}\ H_0\ =\ %.1f\ [\mathrm{kpc}]$' % h) xstep= ax.xaxis.get_majorticklocs() xstep= xstep[1]-xstep[0] ax2.xaxis.set_minor_locator(MultipleLocator(xstep/5.)) if Z is None: bovy_plot.bovy_end_print(plotfile) else: bovy_plot.bovy_text(r'$Z\ =\ %.3f$' % Z,top_right=True,size=14.) bovy_plot.bovy_end_print(plotfile) return None
def createFakeData(parser): options, args = parser.parse_args() if len(args) == 0: parser.print_help() return if os.path.exists(options.plotfile): print "Outfile " + options.plotfile + " exists ..." print "Returning ..." return None #Read the data numpy.random.seed(options.seed) print "Reading the data ..." data = readVclosData( postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, validfeh=options.indivfeh, #if indivfeh, we need validfeh ak=True, cutmultiples=options.cutmultiples, jkmax=options.jkmax) #HACK indx = (data['J0MAG'] - data['K0MAG'] < 0.5) data['J0MAG'][indx] = 0.5 + data['K0MAG'][indx] #Set up the isochrone #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile = open(options.isofile, 'rb') iso = pickle.load(isofile) if options.indivfeh: zs = pickle.load(isofile) elif options.varfeh: locl = pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso = [] zs = numpy.arange(0.0005, 0.03005, 0.0005) for ii in range(len(zs)): iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs = list(set(data['LOCATION'])) iso = [] for ii in range(len(locs)): indx = (data['LOCATION'] == locs[ii]) locl = numpy.mean(data['GLON'][indx] * _DEGTORAD) iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso = isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, expsfh=options.expsfh) if options.dwarf: iso = [ iso, isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, dwarf=True, expsfh=options.expsfh) ] else: iso = [iso] if not options.isofile is None: isofile = open(options.isofile, 'wb') pickle.dump(iso, isofile) if options.indivfeh: pickle.dump(zs, isofile) elif options.varfeh: pickle.dump(locl, isofile) isofile.close() df = None print "Pre-calculating isochrone distance prior ..." logpiso = numpy.zeros((len(data), _BINTEGRATENBINS)) ds = numpy.linspace(_BINTEGRATEDMIN, _BINTEGRATEDMAX, _BINTEGRATENBINS) dm = _dm(ds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm if options.indivfeh: #Find closest Z thisZ = isodist.FEH2Z(data[ii]['FEH']) indx = numpy.argmin((thisZ - zs)) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) elif options.varfeh: #Find correct iso indx = (locl == data[ii]['LOCATION']) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpiso[ii, :] = iso[0](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) if options.dwarf: logpisodwarf = numpy.zeros((len(data), _BINTEGRATENBINS)) dwarfds = numpy.linspace(_BINTEGRATEDMIN_DWARF, _BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm = _dm(dwarfds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm logpisodwarf[ii, :] = iso[1](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpisodwarf = None #Load initial parameters from file savefile = open(args[0], 'rb') params = pickle.load(savefile) savefile.close() #Prep data l = data['GLON'] * _DEGTORAD b = data['GLAT'] * _DEGTORAD sinl = numpy.sin(l) cosl = numpy.cos(l) sinb = numpy.sin(b) cosb = numpy.cos(b) jk = data['J0MAG'] - data['K0MAG'] jk[(jk < 0.5)] = 0.5 #BOVY: FIX THIS HACK BY EMAILING GAIL h = data['H0MAG'] #Re-sample vlos = numpy.linspace(-200., 200., options.nvlos) pvlos = numpy.zeros((len(data), options.nvlos)) if options.dwarf: thislogpisodwarf = logpisodwarf else: thislogpisodwarf = None if not options.multi is None and options.multi > 1: thismulti = options.multi options.multi = 1 #To avoid conflict thispvlos = multi.parallel_map( (lambda x: -mloglike(params, numpy.zeros(len(data)) + vlos[x], l, b, jk, h, df, options, sinl, cosl, cosb, sinb, logpiso, thislogpisodwarf, True, None, None, None)), range(options.nvlos), numcores=numpy.amin( [len(vlos), multiprocessing.cpu_count(), thismulti])) for jj in range(options.nvlos): pvlos[:, jj] = thispvlos[jj] else: for jj in range(options.nvlos): pvlos[:, jj] = -mloglike( params, numpy.zeros(len(data)) + vlos[jj], l, b, jk, h, df, options, sinl, cosl, cosb, sinb, logpiso, thislogpisodwarf, True, None, None, None) """ for jj in range(options.nvlos): pvlos[:,jj]= -mloglike(params,numpy.zeros(len(data))+vlos[jj], l, b, jk, h, df,options, sinl, cosl, cosb, sinb, logpiso, thislogpisodwarf,True,None,None,None) """ for ii in range(len(data)): pvlos[ii, :] -= logsumexp(pvlos[ii, :]) pvlos[ii, :] = numpy.exp(pvlos[ii, :]) pvlos[ii, :] = numpy.cumsum(pvlos[ii, :]) pvlos[ii, :] /= pvlos[ii, -1] #Draw randindx = numpy.random.uniform() kk = 0 while pvlos[ii, kk] < randindx: kk += 1 data['VHELIO'][ii] = vlos[kk] #Dump raw fitsio.write(options.plotfile, data, clobber=True)
def plot_bestfit(parser): (options, args) = parser.parse_args() if len(args) == 0 or options.plotfilename is None: parser.print_help() return #Read the data print "Reading the data ..." data = readVclosData( postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, cutmultiples=options.cutmultiples, validfeh=options.indivfeh, #if indivfeh, we need validfeh jkmax=options.jkmax, datafilename=options.fakedata) #HACK indx = (data['J0MAG'] - data['K0MAG'] < 0.5) data['J0MAG'][indx] = 0.5 + data['K0MAG'][indx] #Cut inner disk locations #data= data[(data['GLON'] > 75.)] #Cut outliers #data= data[(data['VHELIO'] < 200.)*(data['VHELIO'] > -200.)] print "Using %i data points ..." % len(data) #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile = open(options.isofile, 'rb') iso = pickle.load(isofile) if options.indivfeh: zs = pickle.load(isofile) if options.varfeh: locl = pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso = [] zs = numpy.arange(0.0005, 0.03005, 0.0005) for ii in range(len(zs)): iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs = list(set(data['LOCATION'])) iso = [] for ii in range(len(locs)): indx = (data['LOCATION'] == locs[ii]) locl = numpy.mean(data['GLON'][indx] * _DEGTORAD) iso.append( isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso = isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, expsfh=options.expsfh) if options.dwarf: iso = [ iso, isomodel.isomodel(imfmodel=options.imfmodel, Z=options.Z, dwarf=True, expsfh=options.expsfh) ] else: iso = [iso] if not options.isofile is None: isofile = open(options.isofile, 'wb') pickle.dump(iso, isofile) if options.indivfeh: pickle.dump(zs, isofile) elif options.varfeh: pickle.dump(locl, isofile) isofile.close() df = None print "Pre-calculating isochrone distance prior ..." logpiso = numpy.zeros((len(data), _BINTEGRATENBINS)) ds = numpy.linspace(_BINTEGRATEDMIN, _BINTEGRATEDMAX, _BINTEGRATENBINS) dm = _dm(ds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm if options.indivfeh: #Find closest Z thisZ = isodist.FEH2Z(data[ii]['FEH']) indx = numpy.argmin(numpy.fabs(thisZ - zs)) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) elif options.varfeh: #Find correct iso indx = (locl == data[ii]['LOCATION']) logpiso[ii, :] = iso[0][indx](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpiso[ii, :] = iso[0](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) if options.dwarf: logpisodwarf = numpy.zeros((len(data), _BINTEGRATENBINS)) dwarfds = numpy.linspace(_BINTEGRATEDMIN_DWARF, _BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm = _dm(dwarfds) for ii in range(len(data)): mh = data['H0MAG'][ii] - dm logpisodwarf[ii, :] = iso[1](numpy.zeros(_BINTEGRATENBINS) + (data['J0MAG'] - data['K0MAG'])[ii], mh) else: logpisodwarf = None #Calculate data means etc. #Calculate means locations = list(set(data['LOCATION'])) nlocs = len(locations) l_plate = numpy.zeros(nlocs) avg_plate = numpy.zeros(nlocs) sig_plate = numpy.zeros(nlocs) siga_plate = numpy.zeros(nlocs) sigerr_plate = numpy.zeros(nlocs) for ii in range(nlocs): indx = (data['LOCATION'] == locations[ii]) l_plate[ii] = numpy.mean(data['GLON'][indx]) avg_plate[ii] = numpy.mean(data['VHELIO'][indx]) sig_plate[ii] = numpy.std(data['VHELIO'][indx]) siga_plate[ii] = numpy.std(data['VHELIO'][indx]) / numpy.sqrt( numpy.sum(indx)) sigerr_plate[ii] = bootstrap_sigerr(data['VHELIO'][indx]) #Calculate plate means and variances from the model #Load initial parameters from file savefile = open(args[0], 'rb') params = pickle.load(savefile) if not options.index is None: params = params[options.index] savefile.close() #params[0]= 245./235. #params[1]= 8.5/8. avg_plate_model = numpy.zeros(nlocs) sig_plate_model = numpy.zeros(nlocs) for ii in range(nlocs): #Calculate vlos | los indx = (data['LOCATION'] == locations[ii]) thesedata = data[indx] thislogpiso = logpiso[indx, :] if options.dwarf: thislogpisodwarf = logpisodwarf[indx, :] else: thislogpisodwarf = None vlos = numpy.linspace(-200., 200., options.nvlos) pvlos = numpy.zeros(options.nvlos) if not options.multi is None: pvlos = multi.parallel_map( (lambda x: pvlosplate(params, vlos[x], thesedata, df, options, thislogpiso, thislogpisodwarf, iso)), range(options.nvlos), numcores=numpy.amin( [len(vlos), multiprocessing.cpu_count(), options.multi])) else: for jj in range(options.nvlos): print jj pvlos[jj] = pvlosplate(params, vlos[jj], thesedata, df, options, thislogpiso, thislogpisodwarf, iso) pvlos -= logsumexp(pvlos) pvlos = numpy.exp(pvlos) #Calculate mean and velocity dispersion avg_plate_model[ii] = numpy.sum(vlos * pvlos) sig_plate_model[ii]= numpy.sqrt(numpy.sum(vlos**2.*pvlos)\ -avg_plate_model[ii]**2.) #Plot everything left, bottom, width, height = 0.1, 0.4, 0.8, 0.5 axTop = pyplot.axes([left, bottom, width, height]) left, bottom, width, height = 0.1, 0.1, 0.8, 0.3 axMean = pyplot.axes([left, bottom, width, height]) #left, bottom, width, height= 0.1, 0.1, 0.8, 0.2 #axSig= pyplot.axes([left,bottom,width,height]) fig = pyplot.gcf() fig.sca(axTop) pyplot.ylabel(r'$\mathrm{Heliocentric\ velocity}\ [\mathrm{km\ s}^{-1}]$') pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) pyplot.ylim(-200., 200.) nullfmt = NullFormatter() # no labels axTop.xaxis.set_major_formatter(nullfmt) bovy_plot.bovy_plot(data['GLON'], data['VHELIO'], 'k,', yrange=[-200., 200.], xrange=[0., 360.], overplot=True) ndata_t = int(math.floor(len(data) / 1000.)) ndata_h = len(data) - ndata_t * 1000 bovy_plot.bovy_plot(l_plate, avg_plate, 'o', overplot=True, mfc='0.5', mec='none') bovy_plot.bovy_plot(l_plate, avg_plate_model, 'x', overplot=True, ms=10., mew=1.5, color='0.7') #Legend bovy_plot.bovy_plot([260.], [150.], 'k,', overplot=True) bovy_plot.bovy_plot([260.], [120.], 'o', mfc='0.5', mec='none', overplot=True) bovy_plot.bovy_plot([260.], [90.], 'x', ms=10., mew=1.5, color='0.7', overplot=True) bovy_plot.bovy_text(270., 145., r'$\mathrm{data}$') bovy_plot.bovy_text(270., 115., r'$\mathrm{data\ mean}$') bovy_plot.bovy_text(270., 85., r'$\mathrm{model\ mean}$') bovy_plot._add_ticks() #Now plot the difference fig.sca(axMean) bovy_plot.bovy_plot([0., 360.], [0., 0.], '-', color='0.5', overplot=True) bovy_plot.bovy_plot(l_plate, avg_plate - avg_plate_model, 'ko', overplot=True) pyplot.errorbar(l_plate, avg_plate - avg_plate_model, yerr=siga_plate, marker='o', color='k', linestyle='none', elinestyle='-') pyplot.ylabel(r'$\bar{V}_{\mathrm{data}}-\bar{V}_{\mathrm{model}}$') pyplot.ylim(-14.5, 14.5) pyplot.xlim(0., 360.) bovy_plot._add_ticks() #axMean.xaxis.set_major_formatter(nullfmt) pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0., 360.) bovy_plot._add_ticks() #Save bovy_plot.bovy_end_print(options.plotfilename) return None #Sigma fig.sca(axSig) pyplot.plot([0., 360.], [1., 1.], '-', color='0.5') bovy_plot.bovy_plot(l_plate, sig_plate / sig_plate_model, 'ko', overplot=True) pyplot.errorbar(l_plate, sig_plate / sig_plate_model, yerr=sigerr_plate / sig_plate_model, marker='o', color='k', linestyle='none', elinestyle='-') pyplot.ylabel( r'$\sigma_{\mathrm{los}}^{\mathrm{data}}/ \sigma_{\mathrm{los}}^{\mathrm{model}}$' ) pyplot.ylim(0.5, 1.5)
def plot_internalcomparison(parser): (options,args)= parser.parse_args() if len(args) == 0 or options.plotfilename is None: parser.print_help() return #Read the data print "Reading the data ..." data= readVclosData(postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, cutmultiples=options.cutmultiples, validfeh=options.indivfeh, #if indivfeh, we need validfeh jkmax=options.jkmax, datafilename=options.fakedata) #data= data[0:20] #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] #Cut outliers #data= data[(data['VHELIO'] < 200.)*(data['VHELIO'] > -200.)] print "Using %i data points ..." % len(data) #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile= open(options.isofile,'rb') iso= pickle.load(isofile) if options.indivfeh: zs= pickle.load(isofile) if options.varfeh: locl= pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso= [] zs= numpy.arange(0.0005,0.03005,0.0005) for ii in range(len(zs)): iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs= list(set(data['LOCATION'])) iso= [] for ii in range(len(locs)): indx= (data['LOCATION'] == locs[ii]) locl= numpy.mean(data['GLON'][indx]*_DEGTORAD) iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso= isomodel.isomodel(imfmodel=options.imfmodel,Z=options.Z, expsfh=options.expsfh) if options.dwarf: iso= [iso, isomodel.isomodel(imfmodel=options.imfmodel,Z=options.Z, dwarf=True,expsfh=options.expsfh)] else: iso= [iso] if not options.isofile is None: isofile= open(options.isofile,'wb') pickle.dump(iso,isofile) if options.indivfeh: pickle.dump(zs,isofile) elif options.varfeh: pickle.dump(locl,isofile) isofile.close() df= None print "Pre-calculating isochrone distance prior ..." logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None #Calculate data means etc. #Calculate means locations= list(set(data['LOCATION'])) nlocs= len(locations) l_plate= numpy.zeros(nlocs) avg_plate= numpy.zeros(nlocs) sig_plate= numpy.zeros(nlocs) siga_plate= numpy.zeros(nlocs) for ii in range(nlocs): indx= (data['LOCATION'] == locations[ii]) l_plate[ii]= numpy.mean(data['GLON'][indx]) avg_plate[ii]= numpy.mean(data['VHELIO'][indx]) sig_plate[ii]= numpy.std(data['VHELIO'][indx]) siga_plate[ii]= numpy.std(data['VHELIO'][indx])/numpy.sqrt(numpy.sum(indx)) #Calculate plate means and variances from the model #Load initial parameters from file savefile= open(args[0],'rb') params= pickle.load(savefile) if not options.index is None: params= params[options.index] savefile.close() #First calculate fiducial model if not options.dwarf: logpisodwarf= None avg_plate_model_fid= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) #Plot everything bovy_plot.bovy_print(fig_height=10.,fig_width=7.) dx= 0.8/9. left, bottom, width, height= 0.1, 0.9, 0.8, dx axTop= pyplot.axes([left,bottom,width,height]) allaxes= [axTop] fig= pyplot.gcf() fig.sca(axTop) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'ko',overplot=True) pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{fiducial}$',top_right=True,size=14.) pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() nullfmt = NullFormatter() # no labels axTop.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Second is Dehnen fid_dfmodel= options.dfmodel options.dfmodel= 'dehnen' avg_plate_model= avg_plate_model_fid #avg_plate_model= calc_model(params,options,data, # logpiso,logpisodwarf, # df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{Dehnen\ DF}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Third = hR= 2. kpc fid_hr= options.hr options.dfmodel= fid_dfmodel options.hr= 2. avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-2.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$h_R = 2\ \mathrm{kpc}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Fourth = hR= 4. kpc options.dfmodel= fid_dfmodel options.hr= 4. avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-3.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$h_R = 4\ \mathrm{kpc}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Fifth = hs= 5. kpc fid_hs= options.hs options.hr= fid_hr options.hs= 5. avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-4.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$h_\sigma = 5\ \mathrm{kpc}$',top_right=True,size=14.) pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}\ [\mathrm{km\ s}^{-1}]$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Sixth: multiple pops options.hs= fid_hs options.dfmodel= 'multiplepops' fid_params=copy.copy(params) params[2]= -1.8 avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-5.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{Multiple\ populations,\ SFR} = \exp\left( -t/8\ \mathrm{Gyr}\right)$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Seventh: cut multiples options.dfmodel= fid_dfmodel params= fid_params #Read the data print "Reading the data ..." data= readVclosData(postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, cutmultiples=True, jkmax=options.jkmax) #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] print "Pre-calculating isochrone distance prior ..." logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None l_plate_fid= l_plate avg_plate_fid= avg_plate siga_plate_fid= siga_plate locations= list(set(data['LOCATION'])) nlocs= len(locations) l_plate= numpy.zeros(nlocs) avg_plate= numpy.zeros(nlocs) sig_plate= numpy.zeros(nlocs) siga_plate= numpy.zeros(nlocs) for ii in range(nlocs): indx= (data['LOCATION'] == locations[ii]) l_plate[ii]= numpy.mean(data['GLON'][indx]) avg_plate[ii]= numpy.mean(data['VHELIO'][indx]) sig_plate[ii]= numpy.std(data['VHELIO'][indx]) siga_plate[ii]= numpy.std(data['VHELIO'][indx])/numpy.sqrt(numpy.sum(indx)) avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-6.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate_fid, avg_plate_fid-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate_fid,avg_plate_fid-avg_plate_model_fid, yerr=siga_plate_fid,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{Multiple\ visit\ dispersion} < 1\ \mathrm{km\ s}^{-1}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Eight b=2 options.dfmodel= fid_dfmodel params= fid_params #Read the data print "Reading the data ..." data= readVclosData(postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=10., meanb=4., ak=True, cutmultiples=options.cutmultiples, jkmax=options.jkmax) #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] print "Pre-calculating isochrone distance prior ..." logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None locations= list(set(data['LOCATION'])) nlocs= len(locations) l_plate= numpy.zeros(nlocs) avg_plate= numpy.zeros(nlocs) sig_plate= numpy.zeros(nlocs) siga_plate= numpy.zeros(nlocs) for ii in range(nlocs): indx= (data['LOCATION'] == locations[ii]) l_plate[ii]= numpy.mean(data['GLON'][indx]) avg_plate[ii]= numpy.mean(data['VHELIO'][indx]) sig_plate[ii]= numpy.std(data['VHELIO'][indx]) siga_plate[ii]= numpy.std(data['VHELIO'][indx])/numpy.sqrt(numpy.sum(indx)) avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-7.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate_fid, avg_plate_fid-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate_fid,avg_plate_fid-avg_plate_model_fid, yerr=siga_plate_fid,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$b = 4^\circ\ \mathrm{fields}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Nintht b=-2 #Read the data print "Reading the data ..." data= readVclosData(postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=10., meanb=-4., ak=True, cutmultiples=options.cutmultiples, jkmax=options.jkmax) #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] print "Pre-calculating isochrone distance prior ..." logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None locations= list(set(data['LOCATION'])) nlocs= len(locations) l_plate= numpy.zeros(nlocs) avg_plate= numpy.zeros(nlocs) sig_plate= numpy.zeros(nlocs) siga_plate= numpy.zeros(nlocs) for ii in range(nlocs): indx= (data['LOCATION'] == locations[ii]) l_plate[ii]= numpy.mean(data['GLON'][indx]) avg_plate[ii]= numpy.mean(data['VHELIO'][indx]) sig_plate[ii]= numpy.std(data['VHELIO'][indx]) siga_plate[ii]= numpy.std(data['VHELIO'][indx])/numpy.sqrt(numpy.sum(indx)) avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-8.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate_fid, avg_plate_fid-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate_fid,avg_plate_fid-avg_plate_model_fid, yerr=siga_plate_fid,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$b = -4^\circ\ \mathrm{fields}$',top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') pyplot.ylim(-14.5,14.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() #thisax.xaxis.set_major_formatter(nullfmt) pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Save bovy_plot.bovy_end_print(options.plotfilename) return None
def make_rcsample(parser): options, args = parser.parse_args() savefilename = options.savefilename if savefilename is None: #Create savefilename if not given savefilename = os.path.join( appath._APOGEE_DATA, 'rcsample_' + appath._APOGEE_REDUX + '.fits') print("Saving to %s ..." % savefilename) #Read the base-sample data = apread.allStar(adddist=_ADDHAYDENDIST, rmdups=options.rmdups) #Remove a bunch of fields that we do not want to keep data = esutil.numpy_util.remove_fields(data, [ 'TARGET_ID', 'FILE', 'AK_WISE', 'SFD_EBV', 'SYNTHVHELIO_AVG', 'SYNTHVSCATTER', 'SYNTHVERR', 'SYNTHVERR_MED', 'RV_TEFF', 'RV_LOGG', 'RV_FEH', 'RV_ALPHA', 'RV_CARB', 'RV_CCFWHM', 'RV_AUTOFWHM', 'SYNTHSCATTER', 'STABLERV_CHI2', 'STABLERV_RCHI2', 'STABLERV_CHI2_PROB', 'CHI2_THRESHOLD', 'APSTAR_VERSION', 'ASPCAP_VERSION', 'RESULTS_VERSION', 'WASH_M', 'WASH_M_ERR', 'WASH_T2', 'WASH_T2_ERR', 'DDO51', 'DDO51_ERR', 'IRAC_3_6', 'IRAC_3_6_ERR', 'IRAC_4_5', 'IRAC_4_5_ERR', 'IRAC_5_8', 'IRAC_5_8_ERR', 'IRAC_8_0', 'IRAC_8_0_ERR', 'WISE_4_5', 'WISE_4_5_ERR', 'TARG_4_5', 'TARG_4_5_ERR', 'WASH_DDO51_GIANT_FLAG', 'WASH_DDO51_STAR_FLAG', 'REDUCTION_ID', 'SRC_H', 'PM_SRC' ]) # More if appath._APOGEE_REDUX.lower() == 'l33': data = esutil.numpy_util.remove_fields(data, [ 'GAIA_SOURCE_ID', 'GAIA_PARALLAX', 'GAIA_PARALLAX_ERROR', 'GAIA_PMRA', 'GAIA_PMRA_ERROR', 'GAIA_PMDEC', 'GAIA_PMDEC_ERROR', 'GAIA_PHOT_G_MEAN_MAG', 'GAIA_PHOT_BP_MEAN_MAG', 'GAIA_PHOT_RP_MEAN_MAG', 'GAIA_RADIAL_VELOCITY', 'GAIA_RADIAL_VELOCITY_ERROR', 'GAIA_R_EST', 'GAIA_R_LO', 'GAIA_R_HI', 'TEFF_SPEC', 'LOGG_SPEC' ]) if not appath._APOGEE_REDUX.lower() == 'current' \ and not 'l3' in appath._APOGEE_REDUX \ and int(appath._APOGEE_REDUX[1:]) < 500: data = esutil.numpy_util.remove_fields(data, ['ELEM']) #Select red-clump stars jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) if 'l31' in appath._APOGEE_REDUX: logg = data['LOGG'] elif 'l30' in appath._APOGEE_REDUX: logg = data['LOGG'] elif appath._APOGEE_REDUX.lower() == 'current' \ or int(appath._APOGEE_REDUX[1:]) > 600: if False: #Use my custom logg calibration that's correct for the RC logg = (1. - 0.042) * data['FPARAM'][:, paramIndx('logg')] - 0.213 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.255 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.3726 else: #Use my custom logg calibration that's correct on average logg = (1. + 0.03) * data['FPARAM'][:, paramIndx('logg')] - 0.37 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.34 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.256 else: logg = data['LOGG'] indx= (jk < 0.8)*(jk >= 0.5)\ *(z <= 0.06)\ *(z <= rcmodel.jkzcut(jk,upper=True))\ *(z >= rcmodel.jkzcut(jk))\ *(logg >= rcmodel.loggteffcut(data['TEFF'],z,upper=False))\ *(logg+0.1*('l31' in appath._APOGEE_REDUX or 'l33' in appath._APOGEE_REDUX) \ <= rcmodel.loggteffcut(data['TEFF'],z,upper=True)) data = data[indx] #Add more aggressive flag cut data = esutil.numpy_util.add_fields(data, [('ADDL_LOGG_CUT', numpy.int32)]) data['ADDL_LOGG_CUT'] = ( (data['TEFF'] - 4800.) / 1000. + 2.75) > data['LOGG'] if options.loggcut: data = data[data['ADDL_LOGG_CUT'] == 1] print("Making catalog of %i objects ..." % len(data)) #Add distances data = esutil.numpy_util.add_fields(data, [('RC_DIST', float), ('RC_DM', float), ('RC_GALR', float), ('RC_GALPHI', float), ('RC_GALZ', float)]) rcd = rcmodel.rcdist() jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) data['RC_DIST'] = rcd(jk, z, appmag=data['K0']) * options.distfac data['RC_DM'] = 5. * numpy.log10(data['RC_DIST']) + 10. XYZ = bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST'], degree=True) RphiZ = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Xsun=8.15, Zsun=0.0208) R = RphiZ[:, 0] phi = RphiZ[:, 1] Z = RphiZ[:, 2] data['RC_GALR'] = R data['RC_GALPHI'] = phi data['RC_GALZ'] = Z #Save fitswrite(savefilename, data, clobber=True) # Add Tycho-2 matches if options.tyc2: data = esutil.numpy_util.add_fields(data, [('TYC2MATCH', numpy.int32), ('TYC1', numpy.int32), ('TYC2', numpy.int32), ('TYC3', numpy.int32)]) data['TYC2MATCH'] = 0 data['TYC1'] = -1 data['TYC2'] = -1 data['TYC3'] = -1 # Write positions posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=2', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:Tycho2', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Directly match on input RA ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, usecols=(1, 2, 7, 8, 9)) iis = numpy.arange(len(data)) mai = [iis[data['RA'] == ma[ii, 0]][0] for ii in range(len(ma))] data['TYC2MATCH'][mai] = 1 data['TYC1'][mai] = ma[:, 2] data['TYC2'][mai] = ma[:, 3] data['TYC3'][mai] = ma[:, 4] os.remove(posfilename) os.remove(resultfilename) if not options.nostat: #Determine statistical sample and add flag apo = apogee.select.apogeeSelect() statIndx = apo.determine_statistical(data) mainIndx = apread.mainIndx(data) data = esutil.numpy_util.add_fields(data, [('STAT', numpy.int32), ('INVSF', float)]) data['STAT'] = 0 data['STAT'][statIndx * mainIndx] = 1 for ii in range(len(data)): if (statIndx * mainIndx)[ii]: data['INVSF'][ii] = 1. / apo(data['LOCATION_ID'][ii], data['H'][ii]) else: data['INVSF'][ii] = -1. if options.nopm: fitswrite(savefilename, data, clobber=True) return None data = _add_proper_motions(data, savefilename) # Save fitswrite(savefilename, data, clobber=True) return None
def plot_externalcomparison(parser): (options,args)= parser.parse_args() if len(args) == 0 or options.plotfilename is None: parser.print_help() return #Read the data print "Reading the data ..." data= readVclosData(postshutdown=options.postshutdown, fehcut=options.fehcut, cohort=options.cohort, lmin=options.lmin, bmax=options.bmax, ak=True, cutmultiples=options.cutmultiples, validfeh=options.indivfeh, #if indivfeh, we need validfeh jkmax=options.jkmax, datafilename=options.fakedata) #data= data[0:20] #HACK indx= (data['J0MAG']-data['K0MAG'] < 0.5) data['J0MAG'][indx]= 0.5+data['K0MAG'][indx] #Cut outliers #data= data[(data['VHELIO'] < 200.)*(data['VHELIO'] > -200.)] #Set up the isochrone if not options.isofile is None and os.path.exists(options.isofile): print "Loading the isochrone model ..." isofile= open(options.isofile,'rb') iso= pickle.load(isofile) if options.indivfeh: zs= pickle.load(isofile) elif options.varfeh: locl= pickle.load(isofile) isofile.close() else: print "Setting up the isochrone model ..." if options.indivfeh: #Load all isochrones iso= [] zs= numpy.arange(0.0005,0.03005,0.0005) for ii in range(len(zs)): iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, Z=zs[ii])) elif options.varfeh: locs= list(set(data['LOCATION'])) iso= [] for ii in range(len(locs)): indx= (data['LOCATION'] == locs[ii]) locl= numpy.mean(data['GLON'][indx]*_DEGTORAD) iso.append(isomodel.isomodel(imfmodel=options.imfmodel, expsfh=options.expsfh, marginalizefeh=True, glon=locl)) else: iso= isomodel.isomodel(imfmodel=options.imfmodel,Z=options.Z, expsfh=options.expsfh) if options.dwarf: iso= [iso, isomodel.isomodel(imfmodel=options.imfmodel,Z=options.Z, dwarf=True,expsfh=options.expsfh)] else: iso= [iso] if not options.isofile is None: isofile= open(options.isofile,'wb') pickle.dump(iso,isofile) if options.indivfeh: pickle.dump(zs,isofile) elif options.varfeh: pickle.dump(locl,isofile) isofile.close() df= None print "Pre-calculating isochrone distance prior ..." logpiso= numpy.zeros((len(data),_BINTEGRATENBINS)) ds= numpy.linspace(_BINTEGRATEDMIN,_BINTEGRATEDMAX, _BINTEGRATENBINS) dm= _dm(ds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm if options.indivfeh: #Find closest Z thisZ= isodist.FEH2Z(data[ii]['FEH']) indx= numpy.argmin((thisZ-zs)) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) elif options.varfeh: #Find correct iso indx= (locl == data[ii]['LOCATION']) logpiso[ii,:]= iso[0][indx](numpy.zeros(_BINTEGRATENBINS)+(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpiso[ii,:]= iso[0](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) if options.dwarf: logpisodwarf= numpy.zeros((len(data),_BINTEGRATENBINS)) dwarfds= numpy.linspace(_BINTEGRATEDMIN_DWARF,_BINTEGRATEDMAX_DWARF, _BINTEGRATENBINS) dm= _dm(dwarfds) for ii in range(len(data)): mh= data['H0MAG'][ii]-dm logpisodwarf[ii,:]= iso[1](numpy.zeros(_BINTEGRATENBINS) +(data['J0MAG']-data['K0MAG'])[ii],mh) else: logpisodwarf= None #Calculate data means etc. #Calculate means locations= list(set(data['LOCATION'])) nlocs= len(locations) l_plate= numpy.zeros(nlocs) avg_plate= numpy.zeros(nlocs) sig_plate= numpy.zeros(nlocs) siga_plate= numpy.zeros(nlocs) for ii in range(nlocs): indx= (data['LOCATION'] == locations[ii]) l_plate[ii]= numpy.mean(data['GLON'][indx]) avg_plate[ii]= numpy.mean(data['VHELIO'][indx]) sig_plate[ii]= numpy.std(data['VHELIO'][indx]) siga_plate[ii]= numpy.std(data['VHELIO'][indx])/numpy.sqrt(numpy.sum(indx)) #Calculate plate means and variances from the model #Load initial parameters from file savefile= open(args[0],'rb') params= pickle.load(savefile) if not options.index is None: params= params[options.index] savefile.close() #First calculate fiducial model if not options.dwarf: logpisodwarf= None fid_logl= numpy.sum(logl.logl(init=params,data=data,options=copy.copy(options))) #Copy options, since logl sets multi=1 avg_plate_model_fid= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) #Plot everything bovy_plot.bovy_print(fig_height=6.,fig_width=7.) dx= 0.8/5. left, bottom, width, height= 0.1, 0.9-dx, 0.8, dx axTop= pyplot.axes([left,bottom,width,height]) allaxes= [axTop] fig= pyplot.gcf() fig.sca(axTop) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'ko',overplot=True) pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{fiducial}$',top_right=True,size=14.) thisax= pyplot.gca() thisax.set_ylim(-19.5,19.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() nullfmt = NullFormatter() # no labels axTop.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Second is powerlaw with beta=0.15 #fid_slope= params[5-options.nooutliermean+options.dwarf] #params[5-options.nooutliermean+options.dwarf]= 0. fid_params= copy.copy(params) if options.rotcurve.lower() == 'flat': params= list(params) params.insert(6,0.15) params= numpy.array(params) fid_rotcurve= options.rotcurve options.rotcurve= 'powerlaw' elif options.rotcurve.lower() == 'powerlaw': params[6]= 0.15 fid_rotcurve= options.rotcurve avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) #params[5-options.nooutliermean+options.dwarf]= fid_slope #Undo changes params= fid_params options.rotcurve= fid_rotcurve left, bottom, width, height= 0.1, 0.9-2.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{power\!\!-\!\!law\ rotation\ curve}, \beta = 0.15$', top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') thisax.set_ylim(-19.5,19.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Third is powerlaw with beta=-0.15 #fid_slope= params[5-options.nooutliermean+options.dwarf] #params[5-options.nooutliermean+options.dwarf]= 0. fid_params= copy.copy(params) if options.rotcurve.lower() == 'flat': params= list(params) params.insert(6,-0.15) params= numpy.array(params) fid_rotcurve= options.rotcurve options.rotcurve= 'powerlaw' elif options.rotcurve.lower() == 'powerlaw': params[6]= -0.15 fid_rotcurve= options.rotcurve avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) #params[5-options.nooutliermean+options.dwarf]= fid_slope #Undo changes params= fid_params options.rotcurve= fid_rotcurve left, bottom, width, height= 0.1, 0.9-3.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{power\!\!-\!\!law\ rotation\ curve}, \beta = -0.15$', top_right=True,size=14.) pyplot.ylabel(r'$\bar{V}_{\mathrm{data}}-\bar{V}_{\mathrm{model}}$') thisax.set_ylim(-19.5,19.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Second is vc=250 #Load initial parameters from file savefile= open(options.vo250file,'rb') params= pickle.load(savefile) savefile.close() options.fixvo= 250. options.fixro= 8.4 vo250_logl= numpy.sum(logl.logl(init=params,data=data,options=copy.copy(options))) avg_plate_modelr84= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) #Load initial parameters from file savefile= open(options.vo250r8file,'rb') paramsr8= pickle.load(savefile) savefile.close() options.fixvo= 250. options.fixro= 8. vo250r8_logl= numpy.sum(logl.logl(init=paramsr8,data=data,options=copy.copy(options))) avg_plate_modelr8= calc_model(paramsr8,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) options.fixro= None options.fixvo= None left, bottom, width, height= 0.1, 0.9-4.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True, zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_modelr84, 'x',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_modelr84, yerr=siga_plate,marker='x',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_modelr8, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_modelr8, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') #top_right=True,size=14.) bovy_plot.bovy_text(r'$\mathrm{best\!\!-\!\!fit}\ V_c(R_0) = 250\ \mathrm{km\ s}^{-1}, R_0 = %.1f\,\mathrm{kpc}, \Delta \chi^2 = %.0f\ (%.1f\sigma)$' % (8.,2.*(fid_logl-vo250r8_logl),special.erfinv(stats.chi2.cdf(2.*(fid_logl-vo250r8_logl),10.))*numpy.sqrt(2.)), top_right=True,size=13.) bovy_plot.bovy_text(r'$\mathrm{best\!\!-\!\!fit}\ V_c(R_0) = 250\ \mathrm{km\ s}^{-1}, R_0 = %.1f\,\mathrm{kpc}, \Delta \chi^2 = %.0f\ (%.1f\sigma)$' % (8.4,2.*(fid_logl-vo250_logl),special.erfinv(stats.chi2.cdf(2.*(fid_logl-vo250_logl),10.))*numpy.sqrt(2.)), bottom_right=True,size=13.) bovy_plot.bovy_plot([40.],[-15.],'kx',overplot=True) bovy_plot.bovy_plot([40.],[12.],'ko',overplot=True) thisax.set_ylim(-19.5,19.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() thisax.xaxis.set_major_formatter(nullfmt) #pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Fourth = vpec=SBD10 #Load sbd fit #Load initial parameters from file savefile= open(options.sbdfile,'rb') params= pickle.load(savefile) savefile.close() options.sbdvpec= True options.fitvpec= False sbd_logl= numpy.nansum(logl.logl(init=params,data=data,options=copy.copy(options))) avg_plate_model= calc_model(params,options,data, logpiso,logpisodwarf, df,nlocs,locations,iso) left, bottom, width, height= 0.1, 0.9-5.*dx, 0.8, dx thisax= pyplot.axes([left,bottom,width,height]) allaxes.append(thisax) fig.sca(thisax) bovy_plot.bovy_plot([0.,360.],[0.,0.],'-',color='0.5',overplot=True,zorder=-1) bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model_fid, 'o',overplot=True,color='0.6') pyplot.errorbar(l_plate,avg_plate-avg_plate_model_fid, yerr=siga_plate,marker='o',color='0.6', linestyle='none',elinestyle='-') bovy_plot.bovy_plot(l_plate, avg_plate-avg_plate_model, 'o',overplot=True,color='k') pyplot.errorbar(l_plate,avg_plate-avg_plate_model, yerr=siga_plate,marker='o',color='k', linestyle='none',elinestyle='-') bovy_plot.bovy_text(r'$\mathrm{best\!\!-\!\!fit}\ \vec{V}_\odot = \vec{V}_c(R_0) + \mathrm{SBD10}, \Delta \chi^2 = %.0f$' % (2.*(fid_logl-sbd_logl)),#,special.erfinv(stats.chi2.cdf(2.*(fid_logl-sbd_logl),10.))*numpy.sqrt(2.)), top_right=True,size=14.) #pyplot.ylabel(r'$\langle V_{\mathrm{los}}\rangle_{\mathrm{data}}-\langle V_{\mathrm{los}}\rangle_{\mathrm{model}}$') thisax.set_ylim(-19.5,19.5) pyplot.xlim(0.,360.) bovy_plot._add_ticks() #thisax.xaxis.set_major_formatter(nullfmt) pyplot.xlabel(r'$\mathrm{Galactic\ longitude}\ [\mathrm{deg}]$') pyplot.xlim(0.,360.) bovy_plot._add_ticks() #Save bovy_plot.bovy_end_print(options.plotfilename) print fid_logl, sbd_logl, 2.*(fid_logl-sbd_logl),special.erfinv(stats.chi2.cdf(2.*(fid_logl-sbd_logl),10.))*numpy.sqrt(2.) return None