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' )
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
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)