def main(args0): args = get_parser().parse_args(args0) template="craterstats/config/default.plt" functions="craterstats/config/functions.txt" c = gm.read_textstructure(template if args.template is None else args.template) f = gm.read_textstructure(functions) if args.lcs: print(gm.bright("\nChronology systems:")) print('\n'.join(['{0} {1}'.format(i + 1, e['name']) for i, e in enumerate(f['chronology_system'])])) print(gm.bright("\nEquilibrium functions:")) print('\n'.join(['{0} {1}'.format(i + 1, e['name']) for i, e in enumerate(f['equilibrium'])])) print(gm.bright("\nEpoch systems:")) print('\n'.join(['{0} {1}'.format(i + 1, e['name']) for i, e in enumerate(f['epochs'])])) return if args.lpc: print(gm.bright("\nPlot symbols:")) print('\n'.join(['{0} {1} ({2})'.format(i, e[1], e[0]) for i, e in enumerate(cst.MARKERS)])) print(gm.bright("\nColours:")) print('\n'.join(['{0} {1}'.format(i, e[2]) for i, e in enumerate(cst.PALETTE)])) return if args.about: print('\n'.join(cst.ABOUT)) return if args.src: source_cmds(args.src) return if args.demo: demo() return cps_dict = construct_cps_dict(args, c, f) cp_dicts = construct_plot_dicts(args, c) cpl = [cst.Craterplot(d) for d in cp_dicts] cps=cst.Craterplotset(cps_dict,craterplot=cpl) if cpl: if args.autoscale or not ('xrange' in cps_dict and 'yrange' in cps_dict): cps.autoscale() drawn=False for f in cps.format: if f in {'png','jpg','pdf','svg','tif'}: if not drawn: cps.draw() drawn=True cps.fig.savefig(cps_dict['out']+'.'+f, dpi=500, transparent=args.transparent) if f in {'txt'}: cps.create_summary_table()
def test_read_textstructure(self): self.assertEqual(gm.read_textstructure('scalar=10', from_string=True), {'scalar': '10'}) self.assertEqual( gm.read_textstructure("string='this is a string.'", from_string=True), {'string': 'this is a string.'}) self.assertEqual( gm.read_textstructure('array=[1.3,15.7,6,14]', from_string=True), {'array': ['1.3', '15.7', '6', '14']}) self.assertEqual( gm.read_textstructure('array=[1,2,\n3,4]', from_string=True), {'array': ['1', '2', '3', '4']}) self.assertEqual( gm.read_textstructure('pointer=*[1,2,3]', from_string=True), {'pointer': ['1', '2', '3']}) self.assertEqual( gm.read_textstructure( 'boundary = {lon,lat\n-126.97 17.35\n-124.45 18.94\n}', from_string=True), { 'boundary': { 'lat': ['17.35', '18.94'], 'lon': ['-126.97', '-124.45'] } }) self.assertEqual( gm.read_textstructure( 'wifi={mac,name\n04f02a418c2e "ABC Wi-Fi"\n}', from_string=True), {'wifi': { 'mac': ['04f02a418c2e'], 'name': ['ABC Wi-Fi'] }}) self.assertEqual( gm.read_textstructure( 'text_block=""As the sun set and the moon rose,\n' 'she happened upon a splendid castle."\n"', from_string=True), { 'text_block': '"As the sun set and the moon rose,\nshe happened upon a splendid castle."\n' }) self.assertEqual( gm.read_textstructure('dict={\n a=30\n b=[2,3]\n}', from_string=True), {'dict': { 'a': '30', 'b': ['2', '3'] }}) self.assertEqual( gm.read_textstructure('implied=1\nimplied=2\nimplied=3', from_string=True), {'implied': ['1', '2', '3']})
def ReadDiamFile(self): s = gm.read_textstructure(self.filename) c = s['crater'] diam = [float(e) for e in c['diameter']] if 'reference_area' in c: #buffered case area = 1. #nominal area self.buffered = True frac = [area / float(e) for e in c['reference_area']] else: #normal case area = float(s['area']) frac = [float(e) for e in c['fraction'] ] if 'fraction' in c else [1.] * len(diam) if (min(frac) < 0 or max(frac) > 1) and self.buffered == 0: self.errormsg = "Crater list in " + self.filename + " has invalid crater fractions." if area == 0: self.errormsg = "Crater list in " + self.filename + " has undefined area." diam, frac = zip(*sorted(zip(diam, frac), reverse=True)) self.area = area self.diam = np.array(diam) self.fraction = np.array(frac) self.prebinned = 0
def __call__(self, parser, namespace, values, option_string=None): s=' '.join(values) d = {} for kv in re.split(',(?=\w+=)',s): # only split on commas directly preceding keys k, v = kv.split("=") if k in ('range','offset_age'): v= gm.read_textstructure(kv, from_string=True)[k] d[k] = v list_of_d = getattr(namespace, self.dest) list_of_d=[d] if list_of_d is None else list_of_d+[d] setattr(namespace, self.dest, list_of_d)
def ReadSCCfile(self): s = gm.read_textstructure(self.filename) c = s['crater'] diam = [float(e) for e in c['diam']] frac = [float(e) for e in c['fraction'] ] if 'fraction' in c else [1. for e in diam] q = [i for i, e in sorted(enumerate(diam), key=lambda x: x[1]) ] #get sorted indices self.area = float(re.findall('\s*[\d\.]*', s['Total_area'])[0]) if 'Perimeter' in s.keys(): self.perimeter = float(s['Perimeter']) self.diam = [diam[e] for e in q] self.fraction = [frac[e] for e in q] self.prebinned = 0
def ReadBinnedFile(self): s = gm.read_textstructure(self.filename) t = s['table'] diam = [float(e) for e in t['diameter']] q = [i for i, e in sorted(enumerate(diam), key=lambda x: x[1]) ] #get sorted indices self.area = float(s['area']) self.binned={'d_min':[diam[e] for e in q],\ 'n':[float(t['frequency'][e]) for e in q],\ 'n_event':[float(t['event_frequency'][e]) for e in q] if 'event_frequency' else self.binned.n} self.prebinned = 1 self.MakeBinGeometricMean() self.MakeBinNcum()
def __init__(self, source, identifier, pf, cf): if type(source) is dict: src = source else: if '\n' in source: # multiline string is definition txt = source + '\nepochs={\n name="null"\n}' # add null entry to force implied array else: # single line string is filename txt = gm.read_textfile(source, as_string=True, ignore_hash=True) src = gm.read_textstructure(txt, from_string=True) definition = next( (e for e in src['epochs'] if e['name'] == identifier), None) if definition is None: raise ValueError('Epoch system not found: ' + identifier) self.name = definition['name'] self.epoch = definition['epoch'] self.formatting = definition['formatting'] self.ref_diameter = [int(e) for e in definition['ref_diameter'] ] if 'ref_diameter' in definition else None self.density = [float(e) for e in definition['density'] ] if 'density' in definition else None self.time = [float(e) for e in definition['time'] ] if 'time' in definition else None self.reference = definition['reference'] self.pf = pf self.cf = cf if self.time is None: a0 = [ pf.fit({ 'presentation': 'cumulative', 'd': d, 'y': ncum / 1e6, 'err': 0 })[0] for d, ncum in zip(self.ref_diameter, self.density) ] self.time = [0.] + list(cf.t(a0=np.array(a0)))
def __init__(self, source, identifier, equilibrium=False): self.name = identifier pf_type = 'equilibrium' if equilibrium else 'production' if type(source) is dict: src = source else: if '\n' in source: # multiline string is definition txt = source + '\n' + pf_type + '={\n name="null"\n}' # add null entry to force implied array else: # single line string is filename txt = gm.read_textfile(source, as_string=True, ignore_hash=True) src = gm.read_textstructure(txt, from_string=True) self.definition = next( (e for e in src[pf_type] if e['name'] == identifier), None) if self.definition is None: raise ValueError(pf_type.title() + ' function not found: ' + identifier) self.type = self.definition[ 'type'] if 'type' in self.definition else 'polynomial' if 'range' in self.definition: self.range = np.float32(np.array(self.definition['range'])) else: self.range = np.array([1e-4, 2e3]) # default max range if 'yrange' in self.definition: #for fixed Hartmann plots self.yrange = np.float32(np.array(self.definition['yrange'])) if self.type == 'polynomial': self.a = [float(e) for e in self.definition['coefficients']] self.C = self.polynomial_C self.C10 = self.polynomial_C10 self.F = self.polynomial_F self.F10 = self.polynomial_F10 self.R = self.polynomial_R self.H = self.polynomial_H elif self.type == 'tabular incremental root-2': h = [float(e) for e in self.definition['H']] index_1km = int(self.definition['index_1km']) hC10 = np.log10(list(reversed(np.cumsum(list(reversed(h)))))) self.hC10 = hC10 - hC10[index_1km] d_min = np.array( [2**((i - index_1km) / 2) for i, e in enumerate(h)]) d_mean = d_min * 2**.25 self.d_min10 = np.log10(d_min) self.d_mean10 = np.log10(d_mean) self.range = d_mean[[0, -1]] self.xrange = np.log10([d_min[0], d_min[-1] * 2**.5]) # plot axis range self.C = self.hartmann_C self.C10 = self.hartmann_C10 self.F = self.hartmann_F self.F10 = self.hartmann_F10 self.R = self.hartmann_R self.H = self.hartmann_H