Source code for progenner

from __future__ import division
from common import *

PRINT = 0
HALOPARENTSONLY = 1

[docs]def progenInit(objs,SN1,SN2, IDs,progenType, printer = 1, parentsOnly = 1): """Function used to initialize progen data. Parameters ---------- objs : list List of SPHGR objects SN1 : int Starting snapnum SN2 : int Ending snapnum (typically 0) IDs : list List of galaxy or halo indexes of interest progenType : string specify 'galaxy' or 'halo' Notes ----- This function does not return anything. However, it does add the following information to the root of your object (data not saved to disk): 'galaxy' ******** - obj.galaxies[n].progen_z - obj.galaxies[n].progen_indexes - obj.galaxies[n].progen_central - obj.galaxies[n].progen_cmx - obj.galaxies[n].progen_cmy - obj.galaxies[n].progen_cmz - obj.galaxies[n].progen_HMR - obj.galaxies[n].progen_FMR - obj.galaxies[n].progen_SFR - obj.galaxies[n].progen_gas_mass - obj.galaxies[n].progen_stellar_mass - obj.galaxies[n].progen_total_mass - obj.galaxies[n].progen_halo_mass - obj.galaxies[n].progen_halo_gmass - obj.galaxies[n].progen_halo_smass - obj.galaxies[n].progen_gHMR - obj.galaxies[n].progen_gFMR - obj.galaxies[n].progen_sHMR - obj.galaxies[n].progen_h2HMR - obj.galaxies[n].progen_indexes2 - obj.galaxies[n].progen_central2 - obj.galaxies[n].progen_cmx2 - obj.galaxies[n].progen_cmy2 - obj.galaxies[n].progen_cmz2 - obj.galaxies[n].progen_HMR2 - obj.galaxies[n].progen_FMR2 - obj.galaxies[n].progen_SFR2 - obj.galaxies[n].progen_gas_mass2 - obj.galaxies[n].progen_stellar_mass2 - obj.galaxies[n].progen_total_mass2 - obj.galaxies[n].progen_halo_mass2 - obj.galaxies[n].progen_halo_gmass2 - obj.galaxies[n].progen_halo_smass2 'halo' ****** - obj.halos[n].progen_z = z - obj.halos[n].progen_r = r - obj.halos[n].progen_m = m Examples -------- >>> import initSnap as iS >>> pList = iS.initSnap(SNAPNUM1,SNAPNUM1) >>> sims = [] >>> for i in range(0,len(pList)): >>> sims.append(iS.loadPickle(pList[i])) >>> progenInit(sims,SNAPNUM1,SNAPNUM2,'galaxy') """ global PRINT, HALOPARENTSONLY HALOPARENTSONLY = parentsOnly PRINT = printer snaps = np.arange(SN2,SN1+1,1) ## check for progen files ## for i in range(0,len(objs)): query_progens(objs[i],snaps,progenType) #if shape(IDs)[0] == 1: # IDs = [IDs] ## process galaxy history ## for i in range(0,len(objs)): objs[i].progenType = progenType for j in range(0,len(IDs[i])): if progenType == 'galaxy': print IDs[i][j] getGalaxyProgens(objs[i],IDs[i][j]) else: getHaloProgens(objs[i],IDs[i][j]) return
[docs]def halo_pool_helper(args): return getHaloProgens(*args)
[docs]def galaxy_pool_helper(args): return getGalaxyProgens(*args)
[docs]def multiProgenInit(objs,SN1,SN2, IDs,progenType,NPROCS=None,printFreq=60.0,parentsOnly=1): import multiprocessing as mp import time from datetime import datetime global HALOPARENTSONLY HALOPARENTSONLY = parentsOnly snaps = np.arange(SN2,SN1+1,1) #http://stackoverflow.com/questions/13689927/how-to-get-the-amount-of-work-left-to-be-done-by-a-python-multiprocessing-pool #http://stackoverflow.com/questions/3827065/can-i-use-a-multiprocessing-queue-in-a-function-called-by-pool-imap def f_init(q): getHaloProgens.q = q getGalaxyProgens.q = q for i in range(0,len(objs)): query_progens(objs[i],snaps,progenType) for i in range(0,len(objs)): job_args = [] n = len(IDs[i]) for j in range(0,n): job_args.append((objs[i],IDs[i][j])) if NPROCS == None: print 'entering pool for obj %d with %d processors' % (i,mp.cpu_count()) else: print 'entering pool for obj %d with %d processors' % (i,NPROCS) m = mp.Manager() q = m.Queue() p = mp.Pool(NPROCS, f_init, [q]) #p = Pool(processes=NPROCS) if progenType == 'galaxy': #result = p.map_async(galaxy_pool_helper, job_args) #p.close() #p.join() result = p.map_async(galaxy_pool_helper, job_args) while True: if result.ready(): print('100% complete') break else: size = q.qsize() percent = float(size)/float(n) * 100 print('%f%% (%d/%d)...%s' % (percent,size,n,datetime.now())) time.sleep(printFreq) print ' ' result = result.get() for j in range(0,len(result)): g = objs[i].galaxies[IDs[i][j]] g.progen_z = result[j]['z'] g.progen_HRM = result[j]['HMR'] g.progen_FMR = result[j]['FMR'] g.progen_SFR = result[j]['SFR'] g.progen_gas_mass = result[j]['G_M'] g.progen_stellar_mass = result[j]['S_M'] g.progen_total_mass = result[j]['T_M'] g.progen_halo_mass = result[j]['HM'] g.progen_halo_gmass = result[j]['HGM'] g.progen_halo_smass = result[j]['HSM'] g.progen_central = result[j]['CENTRAL'] g.progen_indexes = result[j]['INDEXLIST'] g.progen_cmx = result[j]['cmx'] g.progen_cmy = result[j]['cmy'] g.progen_cmz = result[j]['cmz'] g.progen_ALPHA = result[j]['ALPHA'] g.progen_BETA = result[j]['BETA'] g.progen_HRM2 = result[j]['HMR2'] g.progen_FMR2 = result[j]['FMR2'] g.progen_SFR2 = result[j]['SFR2'] g.progen_gas_mass2 = result[j]['G_M2'] g.progen_stellar_mass2 = result[j]['S_M2'] g.progen_total_mass2 = result[j]['T_M2'] g.progen_halo_mass2 = result[j]['HM2'] g.progen_halo_gmass2 = result[j]['HGM2'] g.progen_halo_smass2 = result[j]['HSM2'] g.progen_central2 = result[j]['CENTRAL2'] g.progen_indexes2 = result[j]['INDEXLIST2'] g.progen_cmx2 = result[j]['cmx2'] g.progen_cmy2 = result[j]['cmy2'] g.progen_cmz2 = result[j]['cmz2'] elif progenType == 'halo': #result = p.map(halo_pool_helper, job_args) #p.close() #p.join() result = p.map_async(halo_pool_helper, job_args) while True: if result.ready(): print('100% complete') break else: size = q.qsize() percent = float(size)/float(n) * 100 print('%f%% (%d/%d)...%s' % (percent,size,n,datetime.now())) time.sleep(printFreq) print ' ' result = result.get() for j in range(0,len(result)): h = objs[i].halos[IDs[i][j]] h.progen_z = result[j]['z'] h.progen_r = result[j]['r'] h.progen_m = result[j]['m']
[docs]def query_progens(obj,snaps,progenType): """Function to check for the exitstance of PROGEN files on disk. Parameters ---------- obj : SPHGR object snaps : numpy_array array of snapshots going from SN2-->SN1+1 See Also -------- progenInit Examples -------- >>> for i in range(0,len(objs)): >>> query_progens(objs[i],snaps) """ progens = [] missing = [] for i in snaps: #progen_tmp = '%s/%s_progens_%04d_to_%04d.npz' % (obj.locs.PROGEN_DIR, # progenType,i,i-1) progen_tmp = '%s/%s_progens_%04d_to_%04d.pickle' % (obj.locs.PROGEN_DIR, progenType,i,i-1) if os.path.isfile(progen_tmp): progens.append(progen_tmp) elif i > 0: #print 'could not find',progen_tmp missing.append(progen_tmp[-16:-4]) obj.locs.progen_files = progens obj.locs.progen_missing = missing return
[docs]def getGalaxyProgens(obj,galID): import cPickle dataLen = len(obj.locs.progen_files) if PRINT: if galID == -1: print 'PROGEN-ING all GALS' else: print 'PROGEN-ING GAL',galID j = galID obj.galaxies[galID].progen_galaxies = [] curGal = obj.galaxies[galID].getProgenGalaxy() curGal.redshift = obj.redshift obj.galaxies[galID].progen_galaxies.append(curGal) if PRINT: print 'MISSING:' for i in range(0,len(obj.locs.progen_missing)): print obj.locs.progen_missing[i] indexer = np.arange(0,len(obj.locs.progen_files)) if PRINT: print indexer for i in indexer[::-1]: ## we first read in progen_SNAPNUM1_to_SNAPNUM2, ## this gives us information about the progen ## galaxy in the previous snapshot, then we leapfrog ## backwards until a -1 is encountered in the index #print('reading in %s' % obj.progen_files[i]) progenData = cPickle.load(open(obj.locs.progen_files[i],'rb')) prevGalIndexes = progenData['previousGalaxyIndexes'] prevGalaxies = progenData['progenGalaxyList'] if prevGalIndexes[j] == -1: break prevGal = prevGalaxies[j] prevGal.redshift = progenData['prevRedshift'] obj.galaxies[galID].progen_galaxies.append(prevGal) j = prevGalIndexes[j]
""" def getGalaxyProgens(obj,galID): #Function to gather galaxy PROGEN data Parameters ---------- obj : SPHGR object galID : galaxy ID to PROGEN Notes ----- This function is responsible for filling out the progen_data within the SPHGR object. It reads in progen_SNAPNUM1_to_SNAPNUM2, and finds information about the the galaxy in the previous snapshot, then leapfrogs backwards until a -1 is encountered in the index. Examples -------- >>> for i in range(0,len(objs)): >>> getGalaxyProgens(objs[i],galaxyIDs[i]) # if hasattr(getGalaxyProgens,'q'): getHaloProgens.q.put('test') dataLen = len(obj.locs.progen_files) sHMR, gHMR, gFMR, h2HMR = [],[],[],[] z, HMR, FMR, SFR, T_M, G_M, S_M = [],[],[],[],[],[],[] HM, HGM, HSM = [],[],[] CENTRAL = [] INDEXLIST = [] cmx,cmy,cmz=[],[],[] alpha = [] beta = [] HMR2, FMR2, SFR2, T_M2, G_M2, S_M2 = [],[],[],[],[],[] cmx2,cmy2,cmz2,CENTRAL2,HM2,HGM2,HSM2 = [],[],[],[],[],[],[] INDEXLIST2=[] if PRINT: print 'PROGEN-ING GAL',galID j = galID INDEXLIST.append(int(j)) ## load in data from current snapshot object ## h = obj.h time = 1. / (1.+obj.redshift) z.append(obj.redshift) HMR.append(obj.galaxies[j].HMR * time) FMR.append(obj.galaxies[j].FMR * time) SFR.append(obj.galaxies[j].sfr) T_M.append(obj.galaxies[j].gas_mass + obj.galaxies[j].stellar_mass) G_M.append(obj.galaxies[j].gas_mass) S_M.append(obj.galaxies[j].stellar_mass) HM.append( obj.galaxies[j].halo_mass) HGM.append(obj.galaxies[j].halo_gmass) HSM.append(obj.galaxies[j].halo_smass) CENTRAL.append(obj.galaxies[j].central) cmx.append(obj.galaxies[j].cm[0]*h) cmy.append(obj.galaxies[j].cm[1]*h) cmz.append(obj.galaxies[j].cm[2]*h) alpha.append(obj.galaxies[j].ALPHA) beta.append(obj.galaxies[j].BETA) sHMR.append(obj.galaxies[j].stellar_HMR * time) gHMR.append(obj.galaxies[j].gas_HMR * time) #gFMR.append(obj.galaxies[j].gas_FMR * time) h2HMR.append(obj.galaxies[j].H2_HMR * time) HMR2.append(0) FMR2.append(0) SFR2.append(0) T_M2.append(0) G_M2.append(0) S_M2.append(0) HM2.append(0) HGM2.append(0) HSM2.append(0) cmx2.append(0) cmy2.append(0) cmz2.append(0) CENTRAL2.append(0) INDEXLIST2.append(int(j)) if PRINT: print 'MISSING:' for i in range(0,len(obj.locs.progen_missing)): print obj.locs.progen_missing[i] indexer = np.arange(0,len(obj.locs.progen_files)) if PRINT: print indexer for i in indexer[::-1]: ## we first read in progen_SNAPNUM1_to_SNAPNUM2, ## this gives us information about the progen ## galaxy in the previous snapshot, then we leapfrog ## backwards until a -1 is encountered in the index #print('reading in %s' % obj.progen_files[i]) #yum = np.load(obj.locs.progen_files[i]) #progens = yum['progen'] progens = np.load(obj.locs.progen_files[i]) #prev_index = progens[j,1] prev_index = progens['index'][j] if prev_index == -1: break redshift = progens['redshift'] time = 1.0 / (1.0 + redshift) z.append(float(redshift)) HMR.append(progens['HMR'][j] * time) FMR.append(progens['FMR'][j] * time) SFR.append(progens['sfr'][j]) G_M.append(progens['gmass'][j]) S_M.append(progens['smass'][j]) T_M.append(progens['gmass'][j]+progens['smass'][j]) sHMR.append(progens['stellar_HMR'][j] * time) gHMR.append(progens['gas_HMR'][j] * time) #gFMR.append(progens['gas_FMR'][j] * time) h2HMR.append(progens['H2_HMR'][j] * time) HM.append( progens['RS_mass'][j]) HGM.append(progens['RS_gmass'][j]) HSM.append(progens['RS_smass'][j]) CENTRAL.append(progens['central'][j]) alpha.append(progens['ALPHA'][j]) beta.append( progens['BETA'][j]) cmx.append(progens['cm'][j,0]*h) cmy.append(progens['cm'][j,1]*h) cmz.append(progens['cm'][j,2]*h) ####### SECOND MOST MASSIVE PROGEN ####### prev_index2 = progens['index2'][j] HMR2.append(progens['HMR2'][j] * time) FMR2.append(progens['FMR2'][j] * time) SFR2.append(progens['sfr2'][j]) G_M2.append(progens['gmass2'][j]) S_M2.append(progens['smass2'][j]) T_M2.append(progens['gmass2'][j]+progens['smass2'][j]) HM2.append( progens['RS_mass2'][j]) HGM2.append(progens['RS_gmass2'][j]) HSM2.append(progens['RS_smass2'][j]) CENTRAL2.append(progens['central2'][j]) cmx2.append(progens['cm'][j,0]*h) cmy2.append(progens['cm'][j,1]*h) cmz2.append(progens['cm'][j,2]*h) #redshift = progens[j,0] #time = 1./(1.+redshift) #z.append(redshift) #HMR.append(progens[j,5] * time) #FMR.append(progens[j,6] * time) #SFR.append(progens[j,9]) #G_M.append(progens[j,7]) #S_M.append(progens[j,8]) #T_M.append(progens[j,7]+progens[j,8]) #HM.append( progens[j,11]) #HGM.append(progens[j,12]) #HSM.append(progens[j,13]) #CENTRAL.append(int(progens[j,14])) #cmx.append(progens[j,2]*h) #cmy.append(progens[j,3]*h) #cmz.append(progens[j,4]*h) ####### SECOND MOST MASSIVE PROGEN ####### #prev_index2 = progens[j,15] #HMR2.append(progens[j,5+14] * time) #FMR2.append(progens[j,6+14] * time) #SFR2.append(progens[j,9+14]) #G_M2.append(progens[j,7+14]) #S_M2.append(progens[j,8+14]) #T_M2.append(progens[j,7+14]+progens[j,8+14]) #HM2.append( progens[j,11+14]) #HGM2.append(progens[j,12+14]) #HSM2.append(progens[j,13+14]) #CENTRAL2.append(int(progens[j,14+14])) #cmx2.append(progens[j,2+14]*h) #cmy2.append(progens[j,3+14]*h) #cmz2.append(progens[j,4+14]*h) ## assign index for nex iteration ## j = prev_index INDEXLIST.append(int(j)) INDEXLIST2.append(int(prev_index2)) ## assign data to object ## obj.galaxies[galID].progen_z = z obj.galaxies[galID].progen_HMR = HMR obj.galaxies[galID].progen_FMR = FMR obj.galaxies[galID].progen_SFR = SFR obj.galaxies[galID].progen_gas_mass = G_M obj.galaxies[galID].progen_stellar_mass = S_M obj.galaxies[galID].progen_total_mass = T_M obj.galaxies[galID].progen_halo_mass = HM obj.galaxies[galID].progen_halo_gmass = HGM obj.galaxies[galID].progen_halo_smass = HSM obj.galaxies[galID].progen_central = CENTRAL obj.galaxies[galID].progen_indexes = INDEXLIST obj.galaxies[galID].progen_cmx = cmx obj.galaxies[galID].progen_cmy = cmy obj.galaxies[galID].progen_cmz = cmz obj.galaxies[galID].progen_ALPHA = alpha obj.galaxies[galID].progen_BETA = beta obj.galaxies[galID].progen_sHMR = sHMR obj.galaxies[galID].progen_gHMR = gHMR obj.galaxies[galID].progen_gFMR = gFMR obj.galaxies[galID].progen_h2HMR = h2HMR ### SECOND MOST MASSIVE PROGEN ### obj.galaxies[galID].progen_HMR2 = HMR2 obj.galaxies[galID].progen_FMR2 = FMR2 obj.galaxies[galID].progen_SFR2 = SFR2 obj.galaxies[galID].progen_gas_mass2 = G_M2 obj.galaxies[galID].progen_stellar_mass2 = S_M2 obj.galaxies[galID].progen_total_mass2 = T_M2 obj.galaxies[galID].progen_halo_mass2 = HM2 obj.galaxies[galID].progen_halo_gmass2 = HGM2 obj.galaxies[galID].progen_halo_smass2 = HSM2 obj.galaxies[galID].progen_central2 = CENTRAL2 obj.galaxies[galID].progen_indexes2 = INDEXLIST2 obj.galaxies[galID].progen_cmx2 = cmx2 obj.galaxies[galID].progen_cmy2 = cmy2 obj.galaxies[galID].progen_cmz2 = cmz2 return {'z':z, 'HMR':HMR,'FMR':FMR,'SFR':SFR,'G_M':G_M,'S_M':S_M,'T_M':T_M,'HM':HM,'HGM':HGM,'HSM':HSM,'CENTRAL':CENTRAL,'INDEXLIST':INDEXLIST,'cmx':cmx,'cmy':cmy,'cmz':cmz,'ALPHA':alpha,'BETA':beta, 'HMR2':HMR2,'FMR2':FMR2,'SFR2':SFR2,'G_M2':G_M2,'S_M2':S_M2,'T_M2':T_M2,'HM2':HM2,'HGM2':HGM2,'HSM2':HSM2,'CENTRAL2':CENTRAL2,'INDEXLIST2':INDEXLIST2,'cmx2':cmx2,'cmy2':cmy2,'cmz2':cmz2} """
[docs]def getHaloProgens(obj,halID): if hasattr(getHaloProgens,'q'): getHaloProgens.q.put('test') dataLen = len(obj.locs.progen_files) z, r, m = [],[],[] CENTRAL = [] INDEXLIST = [] cmx,cmy,cmz=[],[],[] if PRINT: print 'PROGEN-ING HALO',halID j = halID INDEXLIST.append(int(j)) ## load in data from current snapshot object ## h = obj.h z.append(obj.redshift) r.append(obj.halos[j].r200 / (1.+obj.redshift)) m.append(obj.halos[j].mass) if HALOPARENTSONLY: isparent = obj.halos[j].hparent if isparent != -1: return {'z':z,'r':r,'m':m} #CENTRAL.append(obj.galaxies[j].central) #cmx.append(obj.galaxies[j].cm[0]*h) #cmy.append(obj.galaxies[j].cm[1]*h) #cmz.append(obj.galaxies[j].cm[2]*h) if PRINT: print 'MISSING:' for i in range(0,len(obj.locs.progen_missing)): print obj.locs.progen_missing[i] indexer = np.arange(0,len(obj.locs.progen_files)) for i in indexer[::-1]: ## we first read in progen_SNAPNUM1_to_SNAPNUM2, ## this gives us information about the progen ## galaxy in the previous snapshot, then we leapfrog ## backwards until a -1 is encountered in the index #print('reading in %s' % obj.progen_files[i]) progens = np.load(obj.locs.progen_files[i]) prev_index = progens['index'][j] if prev_index == -1: break redshift = progens['redshift'] time = 1.0 / (1.0 + redshift) z.append(redshift) r.append(progens['radius'][j] * time) m.append(progens['mass'][j]) """ yum = np.load(obj.locs.progen_files[i]) progens = yum['progen'] prev_index = progens[j,0] if prev_index == -1: print 'breaking at',i break redshift = progens[j,1] z.append(redshift) r.append(progens[j,3] / (1.+redshift)) m.append(progens[j,2]) #CENTRAL.append(int(progens[j,14])) #cmx.append(progens[j,2]*h) #cmy.append(progens[j,3]*h) #cmz.append(progens[j,4]*h) """ ## assign index for nex iteration ## j = prev_index INDEXLIST.append(int(j)) ## assign data to object ## obj.halos[halID].progen_z = z obj.halos[halID].progen_r = r obj.halos[halID].progen_m = m #obj.galaxies[galID].progen_central = CENTRAL #obj.galaxies[galID].progen_indexes = INDEXLIST #obj.galaxies[galID].progen_cmx = cmx #obj.galaxies[galID].progen_cmy = cmy #obj.galaxies[galID].progen_cmz = cmz return {'z':z,'r':r,'m':m}
[docs]class progenPlot(object): """Class to assist in the plotting of PROGEN data. Parameters ---------- objs : list of SPHGR objects galIDs : list of galaxy IDs to plot COLORS : list of colors LABELS : list of labels """ import pylab as plt #from pylab import * #from pylab import figure, twinx, legend def __init__(self,objs,galIDs,COLORS,LABELS): self.makeplot(objs,galIDs,COLORS,LABELS)
[docs] def makeplot(self,objs,galIDs,COLORS,LABELS): fig=plt.figure() ax1=fig.add_subplot(111) ax2=plt.twinx() legendlinestmp = [] for i in range(0,len(objs)): for j in range(0,len(galIDs[i])): FS = objs[i].rto.FS if not objs[i].snapAttribs.DM_ONLY: if objs[i].progenType == 'galaxy': curGal = objs[i].galaxies[galIDs[i][j]] x = curGal.progen_z l1 = ax1.plot(x, np.log10(curGal.progen_total_mass), '-', color=COLORS[i],lw=1.5, label='%s total M' % LABELS[i]) l2 = ax1.plot(x, np.log10(curGal.progen_stellar_mass), '*-',color=COLORS[i],mfc=COLORS[i], label='%s stellar' % LABELS[i]) l3 = ax1.plot(x, np.log10(curGal.progen_gas_mass), 'o-',color=COLORS[i],mfc=COLORS[i], label='%s gas' % LABELS[i]) l4 = ax2.plot(x, np.log10(curGal.progen_SFR), '-.',color=COLORS[i], label='%s SFR' % LABELS[i]) l5 = ax2.plot(x, np.log10(curGal.progen_HMR), '--',color=COLORS[i], label='%s HMR' % LABELS[i]) #l6 = ax1.plot(x, np.log10(curGal.progen_halo_mass) , # '-', color='k', label='RS mass') #l7 = ax1.plot(x, np.log10(curGal.progen_halo_gmass), # '--',color='k', label='RS gmass') #l8 = ax1.plot(x, np.log10(curGal.progen_halo_smass), # '-.',color='k', label='RS smass') legendlinestmp.extend((l1,l2,l3,l4,l5)) elif objs[i].progenType == 'halo': curHalo = objs[i].halos[galIDs[i][j]] x = curHalo.progen_z l1 = ax2.plot(x, np.log10(curHalo.progen_m), '-',color=COLORS[i],lw=1.5, label='%s Mass' % LABELS[i]) l2 = ax2.plot(x, np.log10(curHalo.progen_r), '-',color=COLORS[i],lw=1.5, label='%s Mass' % LABELS[i]) legendlinestmp.extend((l1,l2)) else: curHalo = objs[i].halos[galIDs[i][j]] x = curHalo.progen_z l1 = ax1.plot(x, np.log10(curHalo.progen_m), '-',color=COLORS[i],lw=1.5, label='%s Mass' % LABELS[i]) l2 = ax2.plot(x, np.log10(curHalo.progen_r), '--',color=COLORS[i], label='%s r' % LABELS[i]) legendlinestmp.extend((l1,l2)) #gca().invert_xaxis() #ax1.set_xlabel(r'$z$',fontsize=FS) #ax1.set_ylabel(r'Log M [M$_\odot$]',fontsize=FS) #ax2.set_ylabel(r'Log r [kpc]',fontsize=FS) #ax1.minorticks_on() #ax2.minorticks_on() #return legendlines = legendlinestmp[0] for i in range(1,len(legendlinestmp)): legendlines += legendlinestmp[i] legendlabels = [l.get_label() for l in legendlines] l100 = ax2.plot(0,0,'k-',label=r'M$_{total}$') l101 = ax2.plot(0,0,'*-',color='k',label=r'M$_\star$') l102 = ax2.plot(0,0,'o-',color='k',label=r'M$_{gas}$') l103 = ax2.plot(0,0,'-.',color='k',label=r'SFR') l104 = ax2.plot(0,0,'--',color='k',label=r'HMR') legendlines1 = l100+l101+l102+l103+l104 legendlabels1 = [l.get_label() for l in legendlines1] legendlines2=[] for i in range(0,len(objs)): ltmp = ax2.fill(0,0,color=COLORS[i],label=LABELS[i]) legendlines2.extend(ltmp) legendlabels2 = [l.get_label() for l in legendlines2] plt.gca().invert_xaxis() ax1.minorticks_on() ax2.minorticks_on() #ax1.legend(legendlines, legendlabels, loc=2,frameon=True,fancybox=True) legend1 = ax1.legend(legendlines1, legendlabels1, loc=2,frameon=True,fancybox=True) ax1.legend(legendlines2, legendlabels2, loc=4,frameon=True,fancybox=True) plt.gca().add_artist(legend1) ax1.set_xlabel(r'$z$',fontsize=FS) ax1.set_ylabel(r'Log M [M$_\odot$]',fontsize=FS) ax2.set_ylabel(r'Log SFR [M$_\odot$ yr$^{-1}$], Log r [kpc]', fontsize=FS)