def bigplots(agb_tracks, infile): if type(agb_tracks[0]) == str: agb_tracks = [fileIO.get_numeric_data(a) for a in agb_tracks] out_fig = os.path.join(infile.diagnostic_dir, 'hrd_%.4f.png' % agb_tracks[0].metallicity) plot_title = '$\dot{M}_{\\rm M13}\ Z=%.4f$' % agb_tracks[0].metallicity nagb_tracks = len(agb_tracks) fig, (axs) = rspg.setup_multiplot(nagb_tracks, ylabel='$\log\ L\ (L_\odot)$', xlabel='$\log\ T_{\\rm eff}\ (K)$', title =plot_title, subplots_kwargs={'figsize': (30,30), 'squeeze': True}) axs = axs.flatten() [hrd_slopes(agb_tracks[i], ax=axs[i]) for i in range(nagb_tracks)] plt.savefig(out_fig, dpi=300) ylabel = ['$C/O$', '$\log\ L\ (L_\odot)$', '$\log\ T_{\\rm eff}\ (K)$'] ycol = ['C/O', 'logl', 'logt'] for i in range(len(ylabel)): fig, (axs) = rspg.setup_multiplot(nagb_tracks, ylabel=ylabel[i], xlabel='${\\rm Age (yr)}$', title =plot_title, subplots_kwargs={'figsize': (30,30), 'squeeze': True}) axs = axs.flatten() [age_vs_plot(agb_tracks[j], infile, ycol=ycol[i], ax=axs[j], annotate=True, xlabels=False, ylabels=False, save_plot=False) for j in range(len(agb_tracks))] out_fig = out_fig.replace('hrd', 'age_v_%s' % ycol[i].lower().replace('c/o', 'co')) plt.savefig(out_fig, dpi=300)
def do_everything(infile): ''' This script formats Paola's tracks and creates the files needed to use them with TRILEGAL as well as the option to make diagnostic plots. infile is an input_file object. See class InputFile WHAT'S GOING ON: Here is what it takes to go from Paola's agb tracks to trilegal: 1. Paola's tracks 2. Paola's tracks formatted for trilegal 3. trilegal files that link to Paola's formatted tracks 1. Paola's tracks should have naming scheme [mix]/[set]/[Trash]_[metallicity]_[Y]/[track_identifier] ex agb_caf09_z0.008/S1/agb_*Z*.dat ex CAF09/S_SCS/*Z*/agb_*Z*.dat These can go anywhere, and do not need to be included in trilegal directories. 2. Paola's tracks are formatted for trilegal with no header file. These go in trilegal_1.3/isotrack/AGB_TRACKS/Z[metallicity]_[mix]_[set].dat They only include the quiescent phases and also a column with dL/dT See AGBTracks class. 3. trilegal needs two files to link to Paola's formatted tracks a. track file goes here: trilegal_1.3/isotrack/tracce_[mix]_[set].dat b. cmd_input_file that links to the track file goes here trilegal_1.3/cmd_input_[mix]_[set].dat ''' # set up file names and directories, cd to paola's tracks. AGB_file_setup(infile) # list of isofiles, zs, and ys to send to tracce file. isofiles, Zs, Ys = [], [], [] imfr_data = np.array([]) lifetime_data = np.array([]) for metal_dir in infile.metal_dirs: metallicity, Y = metallicity_from_dir(metal_dir) print 'Z = %.4f' % metallicity if infile.diagnostic_dir0 is not None: diagnostic_dir = os.path.join(infile.diagnostic_dir0, infile.agb_mix, infile.set_name, metal_dir) + '/' rsp.fileIO.ensure_dir(diagnostic_dir) # update infile class to place plots in this directory infile.diagnostic_dir = diagnostic_dir agb_tracks = rsp.fileIO.get_files(os.path.join(infile.working_dir, metal_dir), infile.track_identifier) agb_tracks.sort() iso_name_conv = '_'.join(('Z%.4f' % metallicity, infile.name_conv)) isofile = os.path.join(infile.home, infile.isotrack_dir, iso_name_conv) if infile.over_write is False and os.path.isfile(isofile): print 'not over writing %s' % isofile out = None if infile.over_write is True: out = open(isofile, 'w') out.write('# age(yr) logL logTe m_act mcore c/o period ip') out.write(' Mdot(Msun/yr) logTe X Y CNO dlogTe/dlogL \n') isofile_rel_name = os.path.join('isotrack', infile.isotrack_dir, iso_name_conv) print 'found %i tracks' % len(agb_tracks) for agb_track in agb_tracks: # load track track = fileIO.get_numeric_data(agb_track) if track == -1: continue if track.bad_track is True: continue #if not track.mass in infile.masses: # continue assert metallicity == track.metallicity, \ 'directory and track metallicity do not match' # make iso file for trilegal if out is not None: fileIO.make_iso_file(track, out) # save information for lifetime file. lifetime_datum = np.array([metallicity, track.mass, track.tauc, track.taum]) lifetime_data = np.append(lifetime_data, lifetime_datum) # make diagnostic plots if infile.diagnostic_dir0 is not None and infile.diag_plots is True: assert metallicity_from_dir(infile.diagnostic_dir)[0] == \ track.metallicity, 'diag dir met wrong!' graphics.diag_plots(track, infile) # save information for imfr if infile.make_imfr is True: M_s = track.get_col('M_star') imfr_datum = np.array([M_s[0], M_s[-1], float(metallicity)]) imfr_data = np.append(imfr_data, imfr_datum) if out is not None: out.close() print 'wrote', isofile fileIO.make_local_copy(isofile, dest=infile.make_copy) # keep information for tracce file isofiles.append(isofile_rel_name) Ys.append(Y) Zs.append(metallicity) #graphics.bigplots(agb_tracks, infile) # make file to link cmd_input to formatted agb tracks fileIO.make_met_file(infile.tracce_file, Zs, Ys, isofiles) fileIO.make_local_copy(infile.tracce_file, dest=infile.make_copy) # make cmd_input file cmd_in_kw = {'cmd_input_file': infile.cmd_input_file, 'file_tpagb': infile.tracce_file_rel, 'mass_loss': infile.mass_loss, 'file_isotrack': infile.file_isotrack} fileIO.write_cmd_input_file(**cmd_in_kw) if infile.make_imfr is True and infile.diagnostic_dir0 is not None: ifmr_file = os.path.join(infile.diagnostic_dir0, infile.agb_mix, infile.set_name, '_'.join(('ifmr', infile.name_conv))) ncols = 3 nrows = imfr_data.size/ncols fileIO.savetxt(ifmr_file, imfr_data.reshape(nrows, ncols), header='# M_i M_f Z \n') graphics.plot_ifmr(ifmr_file) if infile.diagnostic_dir0 is not None and infile.diag_plots is True: lifetime_file = os.path.join(infile.diagnostic_dir0, infile.agb_mix, infile.set_name, '_'.join(('tau_cm', infile.name_conv))) ncols = 4 nrows = lifetime_data.size/ncols fileIO.savetxt(lifetime_file, lifetime_data.reshape(nrows, ncols), header='# z mass tauc taum\n') graphics.plot_cluster_test(lifetime_file, infile) os.chdir(infile.home) return infile.cmd_input_file
def compare_mass_loss(masses=1.0, z=0.001, sets=['NOV13', 'OCT13', 'NOV13eta0'], paola=False): ''' made to plot a comparison between several mass prescriptions. Labels for the plot are set up stupidly, maybe in in_dict or labels arg... ''' from matplotlib.ticker import NullFormatter teff_max = 3.5 track_files = None if paola is True: # hack to use specific tracks from paola track_dir = research_path + '/TP-AGBcalib/AGBTracks/plots_for_paperI/' file_end = '_Mc0.00_dMc0.00_Tbd6.40_L0.00_dL0.00_C0.00_Nr3.00_rates0_KOPv_KMOLv.dat' if masses == 2.0: track_files = \ [track_dir + 'agb_2.00_Z0.00100000_Mdot50_eta0.00' + file_end, track_dir + 'agb_2.00_Z0.00100000_Mdot49_eta0.40' + file_end, track_dir + 'agb_2.00_Z0.00100000_Mdot48_eta8.00' + file_end, track_dir + 'agb_2.00_Z0.00100000_Mdot50_eta0.40' + file_end] teff_max = 3.4 if masses == 1.0: track_files = \ [track_dir + 'agb_1.00_Z0.00100000_Mdot50_eta0.00' + file_end, track_dir + 'agb_1.00_Z0.00100000_Mdot49_eta0.40' + file_end, track_dir + 'agb_1.00_Z0.00100000_Mdot48_eta8.00' + file_end, track_dir + 'agb_1.00_Z0.00100000_Mdot50_eta0.40' + file_end] teff_max = 3.4 labels = ['$\\dot{M}_{\\rm{pre-dust}}=0.0$','$\\rm{R75}$', '$\\rm{SC05}$', '$\\rm{mSC05}$'] if track_files is not None: nrows = len(track_files) else: nrows = len(sets) fig, axs = plt.subplots(nrows=nrows, ncols=2, figsize=(8, 8)) anorm = 1e6 xlab0 = '\\rm{Age}\ (10^6\ \\rm{yr})' ylab0 = '\log\ \dot{M}\ (\\rm{M_\odot\ yr}^{-1})' ylab1 = '\log\ L\ (L_\odot)' xlab1 = '\log\ T_{\\rm eff}\ (\\rm{K})' agb_tracks_dir = research_path + 'TP-AGBcalib/AGBTracks/CAF09' if type(masses) is not list: masses = [masses] cols = ['k'] for j, mass in enumerate(masses): if track_files is None: tnames = [] labels = [] for tset in sets: label = translate_model_name(tset) direc = os.path.join(agb_tracks_dir, 'S_' + tset) direc, = [os.path.join(direc, d) for d in os.listdir(direc) if str(z) in d] tname = rsp.fileIO.get_files(direc, 'agb_%.2f*' % mass)[0] tnames.append(tname) labels.append('$%s$' % label) tracks = [fileIO.get_numeric_data(t) for t in tnames] else: tracks = [fileIO.get_numeric_data(t) for t in track_files] for i in range(len(tracks)): axs[i][0].plot(tracks[i].data_array['ageyr']/anorm, tracks[i].data_array['dMdt'], label='$M=%g\ M_\odot$' % mass, lw=1, color=cols[j]) axs[i][0].plot(tracks[i].data_array['ageyr'][tracks[i].cstar]/anorm, tracks[i].data_array['dMdt'][tracks[i].cstar], lw=1, color='darkred') axs[i][1].plot(tracks[i].data_array['T_star'], tracks[i].data_array['L_star'], label='$M=%g\ M_\odot$' % mass, lw=1, color=cols[j]) axs[i][1].plot(tracks[i].data_array['T_star'][tracks[i].cstar], tracks[i].data_array['L_star'][tracks[i].cstar], lw=1, color='darkred') axs[i][0].annotate(labels[i], (0.03, 0.96), fontsize=fontlarge, xycoords='axes fraction', va='top') axs[-1, 0].set_xlabel('$%s$' % xlab0, fontsize=fontlarge) axs[-1, 1].set_xlabel('$%s$' % xlab1, fontsize=fontlarge) plt.annotate('$%s$' % ylab0, (0.03, 0.5), fontsize=fontlarge, va='center', xycoords='figure fraction', rotation='vertical') plt.annotate('$%s$' % ylab1, (0.95, 0.5), fontsize=fontlarge, va='center', xycoords='figure fraction', rotation='vertical') [ax.yaxis.tick_right() for ax in axs.flatten()[1::2]] [ax.xaxis.set_major_formatter(NullFormatter()) for ax in axs.flatten()[:-2]] # mass loss [ax.set_ylim(-11.5, -4.5) for ax in axs[:, 0]] # log l [ax.set_ylim(2.81, 4.25) for ax in axs[:, 1]] # log te [ax.set_xlim(3.66, teff_max) for ax in axs[:, 1]] # age Myr [ax.set_xlim(0, 2.45) for ax in axs[:, 0]] # top left plot only if paola is False: [ax.legend(loc=4, fontsize=fontlarge, frameon=False) for ax in [axs.flatten()[0]]] fig.subplots_adjust(wspace=0.02, hspace=0.02) plt.savefig('compare_massloss_M%g_Z%g.png' % (masses[0], z), dpi=150) return axs
def compare_agb_lifetimes(): import glob track_loc = research_path + \ 'TP-AGBcalib/AGBTracks/plots_for_paperI/agbz001_3dup/' models = ['NOV13', 'NOV13eta0', 'OCT13'] model_name = translate_model_name('nov13') # these two have to line up: search_formats = ['*dL0.0*', '*dL0.50*', '*dL2*'] labels = [r'%s' % model_name, r'%s: $0.5\lambda$' % model_name, r'%s: $2\lambda$' % model_name] track_sets = [rsp.fileIO.get_files(track_loc, sf) for sf in search_formats] cols1 = ['k', '#d73027', '#fee090', '#e0f3f8', '#91bfdb', '#4575b4'] bmap = brewer2mpl.get_map('Blues', 'Sequential', 9) cols2 = bmap.mpl_colors[3::2] fig, axs = plt.subplots(ncols=2, figsize=(10, 5), sharex=True, sharey=True) for i, track_set in enumerate(track_sets): tracks = np.array([fileIO.get_numeric_data(t) for t in track_set]) tracks = tracks[np.argsort([t.mass for t in tracks])] masses = np.array([t.mass for t in tracks]) taus = np.array([np.sum(t.data_array['dt']) for t in tracks]) plt_kw = {'lw': 3, 'label': labels[i], 'color': cols1[i]} if i == 0: for ax in axs: ax.plot(masses, taus/1e6, lw=4, color='k') plt_kw['color'] = cols2[0] ax.plot(masses, taus/1e6, **plt_kw) else: axs[1].plot(masses, taus/1e6, lw=4, color='k') axs[1].plot(masses, taus/1e6, **plt_kw) for j in range(len(models)): model_name = models[j].replace('.dat', '').split('_')[-1] if models[j].lower() == 'nov13': continue base = research_path + \ 'TP-AGBcalib/AGBTracks/CAF09/S_%s' % model_name agb_track_loc = os.path.join(base, glob.glob1(base, '*0.001*')[0]) track_names = [os.path.join(agb_track_loc, a) for a in os.listdir(agb_track_loc) if a.startswith('agb_') and not 'b_1.75' in a and not 'b_1.80' in a] tracks = [fileIO.get_numeric_data(t) for t in track_names] tracks = [t for t in tracks if not t == -1 and t.data_array.size > 1] tracks = np.array(tracks)[np.argsort([t.mass for t in tracks])] masses = np.array([t.mass for t in tracks]) taus = np.array([np.sum(t.data_array['dt']) for t in tracks]) model_name = translate_model_name(model_name) plt_kw = {'lw': 3, 'label': model_name, 'color': cols2[j]} axs[0].plot(masses, taus/1e6, lw=4, color='k') axs[0].plot(masses, taus/1e6, **plt_kw) for ax in axs: ax.legend(loc=0, frameon=False, fontsize=fontsmall) ax.set_xlim(1, 2.95) ax.set_ylim(.25, 3.7) ax.set_xlabel(r'${\rm Initial\ Mass\ (M_\odot)}$', fontsize=fontlarge) ax.tick_params(labelsize=fontmid) fig.subplots_adjust(left=0.08, right=0.98, bottom=0.15, top=0.95, wspace=0.01) axs[0].set_ylabel(r'${\rm Lifetime\ (Myr)}$', fontsize=fontlarge) plt.savefig('lambda_plot.png', dpi=150) return axs
def agb_lifetimes(models, z=0.002): import glob tauss = [] btauss = [] for j in range(len(models)): print models[j] print fig, ax = plt.subplots() fig2, ax2 = plt.subplots() model_name = models[j].replace('.dat', '').split('_')[-1] agb_track_loc = research_path + \ 'TP-AGBcalib/AGBTracks/CAF09/S_%s/' % model_name base = research_path + \ 'TP-AGBcalib/AGBTracks/CAF09/S_%s' % model_name if z == 'all': zs = np.array([d.split('_')[1].replace('Z','') for d in glob.glob1(base, '*')], dtype=float) else: zs = [z] zs = np.array([i for i in zs if i <= 0.008]) if len(zs) > 8.: zs = zs[::2] print zs cnum = np.max([len(zs), 3]) bmap = brewer2mpl.get_map('Blues', 'Sequential', cnum + 1) cols = bmap.mpl_colors[1:] for i, z in enumerate(np.sort(zs)): try: agb_track_loc = os.path.join(base, glob.glob1(base, '*%g*' % z)[0]) except IndexError: print 'no Z=%g tracks in %s' % (z, base) continue if not os.path.isdir(agb_track_loc) is True: print model_name, 'no agb tracks found' model_name = translate_model_name(models[j]) agb_track_names = [os.path.join(agb_track_loc, a) for a in os.listdir(agb_track_loc) if a.startswith('agb_')] tracks = [fileIO.get_numeric_data(agb_track) for agb_track in agb_track_names] tracks = [t for t in tracks if not t == -1 and t.data_array.size > 1] masses = np.array([t.mass for t in tracks]) sort = np.argsort(masses) masses = masses[sort] tracks = np.array(tracks)[sort] logls = np.array([t.get_col('L_star') for t in tracks]) brights = np.array([np.nonzero(logl > 3.4)[0] for logl in logls]) #m_cs = np.array([t.get_col('M_c')[0] for t in tracks]) #ax2.plot(masses, m_cs, lw=2, color='black') taus = np.array([np.sum(t.data_array['dt']) for t in tracks]) btaus = np.array([np.sum(t.data_array['dt'][b]) for t, b in zip(tracks, brights)]) tauss.append(taus) btauss.append(btaus) plt_kw = {'lw': 3, 'label': '$Z=%g$' % z, 'color': cols[i]} ax.plot(masses, taus/1e6, lw=4, color='k') ax2.plot(masses, btaus/1e6, lw=4, color='k') ax.plot(masses, taus/1e6, **plt_kw) ax2.plot(masses, btaus/1e6, **plt_kw) with open('tpagb_lifetimes_S_%s_Z%g.dat' % (models[j], z), 'w') as out: out.write('# mass tpagb_tau tpagb_tau_bright \n') np.savetxt(out, np.array([masses, taus, btaus]).T, fmt='%.3f') for ax in [ax, ax2]: ax.set_xlabel('${\\rm Initial\ Mass\ (M_\odot)}$', fontsize=fontlarge) ax.set_ylabel('${\\rm Lifetime\ (Myr)}$', fontsize=fontlarge) ax.legend(loc=0, frameon=False) ax.set_xlim(0, 5) ax.set_ylim(0, 5) ax2.annotate('$\log L/L_\odot > 3.4$', (0.03, 0.97), xycoords='axes fraction', fontsize=fontlarge, va='top') ax2.set_ylabel(ax2.get_ylabel().replace('(Myr)', '(Myr)')) #ax2.set_ylabel('${\\rm Pre\!-\!Flash\ Core\ Mass\ (M_\odot)}$', fontsize=24) fig.savefig('tpagb_lifetime_%s.png' % (models[j]), dpi=150) fig2.savefig('tpagb_lifetime_bright_%s.png' % (models[j]), dpi=150) return