Esempio n. 1
0
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()
Esempio n. 2
0
 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']})
Esempio n. 3
0
    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
Esempio n. 4
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)
Esempio n. 5
0
    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
Esempio n. 6
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()
Esempio n. 7
0
    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)))
Esempio n. 8
0
    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