def test_Epochs(self):
     cf = cst.Chronologyfn(self.file_fns, 'Mars, Hartmann & Neukum (2001)')
     pf = cst.Productionfn(self.file_fns, 'Mars, Ivanov (2001)')
     ep = cst.Epochs(self.file_fns, 'Mars, Michael (2013)', pf, cf)
     self.assertTrue(
         np.allclose(ep.time,
                     [0.0, 0.328, 1.23, 3.37, 3.61, 3.71, 3.83, 3.94],
                     rtol=.01))  # (Michael, 2013)
 def test_Equilibriumfn(self):
     ef = cst.Productionfn(self.file_fns,
                           'Standard lunar equilibrium (Trask, 1966)',
                           equilibrium=True)
     self.assertEqual(ef.evaluate('cumulative', 1., a0=ef.a[0]),
                      10**(-1.1 - 2. * np.log10(1.)))
     self.assertEqual(ef.evaluate('cumulative', 10., a0=ef.a[0]),
                      10**(-1.1 - 2. * np.log10(10.)))
 def test_Productionfn(self):
     Npf = cst.Productionfn(self.file_fns,
                            'Moon, Neukum (1983)')  # polynomial PF
     self.assertTrue(np.allclose(Npf.range, (.01, 300.)))
     self.assertTrue(
         np.allclose(Npf.a, [
             -2.5339, -3.6269, 0.43662, 0.79347, 0.086468, -0.26485,
             -0.066382, 0.037923, 0.010596, -0.0022496, -0.00051797,
             0.0000397
         ]))
     Hpf = cst.Productionfn(self.file_fns,
                            'Mars, Hartmann (2005)')  # tabular PF
     test_a0 = 1.5
     for pf in [Npf, Hpf]:
         for presentation in ['cumulative', 'differential']:
             r = pf.getplotdata(presentation,
                                a0=test_a0)  # create isochron with given a0
             r['err'] = np.ones(len(r['y']))
             self.assertAlmostEqual(
                 pf.fit(r)[0],
                 test_a0)  # test whether fitting can recover a0
class TestPlottingClasses(unittest.TestCase):

    root = cst.gm.filename(cst.__file__, 'p')
    file_fns = root + 'config/functions.txt'
    cf = cst.Chronologyfn(file_fns, 'Mars, Hartmann & Neukum (2001)')
    pf = cst.Productionfn(file_fns, 'Mars, Ivanov (2001)')
    cc = cst.Cratercount(root + 'sample/Pickering.scc')

    def test_Craterplotset_CreatePlotSpace(self):
        cps = cst.Craterplotset()
        cps.CreatePlotSpace()
        self.assertTrue(cps.fig)
        self.assertTrue(cps.ax)

    def test_Craterplot_get_data_range(self):
        cp = cst.Craterplot(cratercount=self.cc)
        cps = cst.Craterplotset(craterplot=[cp])

        res = cp.get_data_range(cps)
        self.assertTrue(np.allclose(res, (.1, 2.7, 6.5e-4, 8.2), rtol=.05))

    def test_Craterplotset_autoscale(self):
        cp = cst.Craterplot(cratercount=self.cc)
        cps = cst.Craterplotset(craterplot=[cp])

        cps.autoscale()
        self.assertEqual(list(cps.xrange) + list(cps.yrange), [-2, 2, -5, 3])

    def test_Craterplotset_summary(self):
        cp = cst.Craterplot(cratercount=self.cc, range=[.2, .7], type='d-fit')
        cps = cst.Craterplotset(cf=self.cf, pf=self.pf, craterplot=[cp])

        def get_cps_summary():
            with patch('sys.stdout', new_callable=io.StringIO) as m:
                cps.create_summary_table()
                table = m.getvalue().split('\n')
                return table[1][:145]  # trim off source file

        # the following results are not fundamental, but verified against CraterstatsII (see demo plots):
        # name,area,binning,d_min,d_max,method,resurf,n,n_event,age,age-,age+,a0,a0-,a0+,N(1)
        self.assertEqual(
            get_cps_summary(),
            'Pickering                  3036.6 pseudo-log   0.2   0.7     d-fit      0   313.0       313   0.668   0.613   0.722 -3.488 -3.525 -3.453 3.25e-04'
        )
        cp.UpdateSettings(binning='10/decade')
        self.assertEqual(
            get_cps_summary(),
            'Pickering                  3036.6  10/decade   0.2  0.79     d-fit      0   313.0       313   0.645   0.593   0.697 -3.503 -3.539 -3.469 3.14e-04'
        )
        cp.UpdateSettings(type='c-fit', resurf=1, binning='pseudo-log')
        self.assertEqual(
            get_cps_summary(),
            'Pickering                  3036.6 pseudo-log   0.2   0.7     c-fit      1   313.0       313   0.691   0.653   0.729 -3.472 -3.497 -3.449 3.37e-04'
        )
        cp.UpdateSettings(type='poisson', range=[.22, .43], resurf=0)
        self.assertEqual(
            get_cps_summary(),
            'Pickering                  3036.6 pseudo-log  0.22  0.43   poisson      0     223       223   0.684    0.64   0.731 -3.477 -3.506 -3.448 3.34e-04'
        )
        cp.UpdateSettings(type='poisson', range=[.22, .43], binning='none')
        self.assertEqual(
            get_cps_summary(),
            'Pickering                  3036.6       none  0.22  0.43   poisson      0     223       223   0.684    0.64   0.731 -3.477 -3.506 -3.448 3.34e-04'
        )
示例#5
0
文件: cli.py 项目: rbeyer/craterstats
def construct_cps_dict(args,c,f):
    cpset=c['set']
    if 'presentation' in vars(args):
        if args.presentation is not None:
            cpset['presentation'] = cst.PRESENTATIONS[decode_abbreviation(cst.PRESENTATIONS, args.presentation,one_based=True)]
    if cpset['presentation'] in ['chronology', 'rate']: #possible to overwrite with user-choice
        cpset['xrange'] = cst.DEFAULT_XRANGE[cpset['presentation']]
        cpset['yrange'] = cst.DEFAULT_YRANGE[cpset['presentation']]
    cpset['format'] = set(cpset['format']) if 'format' in cpset else {}

    for k,v in vars(args).items():
        if v is None:
            if k == 'out': cpset[k] = 'out' # don't set as default in parse_args: need to detect None in source_cmds
        else:
            if k in ('title',
                     'subtitle',
                     'isochrons',
                     'show_isochrons',
                     'legend',
                     'print_dimensions',
                     'pt_size',
                     'ref_diameter',
                     'cite_functions',
                     'sig_figs',
                     'randomness',
                     'mu',
                     'invert',
                     'show_title',
                     'show_subtitle',
                     'style',
                     'xrange', 'yrange',
                     ):
                cpset[k]=v
            elif k in ('chronology_system','equilibrium','epochs'):
                names = [e['name'] for e in f[k]]
                cpset[k]=f[k][decode_abbreviation(names, v, one_based=True)]['name']

            elif k == 'out':
                cpset[k] = gm.filename(v, 'pn')
                ext= gm.filename(v, 'e').lstrip('.')
                if ext: cpset['format'].add(ext)
            elif k == 'format':
                cpset[k]=set(v)


    cs=next((e for e in f['chronology_system'] if e['name'] == cpset['chronology_system']), None)
    if cs is None: sys.exit('Chronology system not found:' + cpset['chronology_system'])

    cpset['cf'] = cst.Chronologyfn(f, cs['cf'])
    cpset['pf'] = cst.Productionfn(f, cs['pf'])

    if 'equilibrium' in cpset and cpset['equilibrium'] not in (None,''):
        cpset['ef'] = cst.Productionfn(f, cpset['equilibrium'], equilibrium=True)
    if 'epochs' in cpset and cpset['epochs'] not in (None,''):
        cpset['ep'] = cst.Epochs(f, cpset['epochs'],cpset['pf'],cpset['cf'])

    if cpset['presentation'] == 'Hartmann':
        if hasattr(cpset['pf'],'xrange'): #not possible to overwrite with user choice
            cpset['xrange'] = cpset['pf'].xrange
            cpset['yrange'] = cpset['pf'].yrange
        else:
            cpset['xrange'] = cst.DEFAULT_XRANGE['Hartmann']
            cpset['yrange'] = cst.DEFAULT_YRANGE['Hartmann']

    return cpset
示例#6
0
    def oplot(self, cps):
        """
        Overplot epoch system on crater count plot

        :param cps: Craterplotset instance
        :return: none
        """
        a0 = [self.cf.a0(t) for t in self.time[1:]]
        iso = [self.pf.getisochron(cps.presentation, e, cps.ef) for e in a0]
        _, colour, _, boundary = self.decode_formatting()

        for i, (a, b) in enumerate(zip(iso, iso[1:])):
            x = np.concatenate((a['d'], b['d'][::-1]))
            y = np.concatenate((a['y'], b['y'][::-1]))
            cps.ax.fill(np.log10(x),
                        y,
                        color=cps.grey[3 - colour[i + 1]],
                        edgecolor=None,
                        lw=0)

            if boundary[i]:
                cps.ax.plot(np.log10(a['d']), a['y'], color=cps.grey[0], lw=.3)


if __name__ == '__main__':
    f = "config/functions.txt"
    cf = cst.Chronologyfn(f, 'Moon, Neukum (1983)')
    pf = cst.Productionfn(f, 'Moon, Neukum (1983)')
    ep = Epochs(f, 'Moon, Wilhelms (1987)', pf, cf)