def test_Chronologyfn(self): cf = cst.Chronologyfn(self.file_fns, 'Moon, Neukum (1983)') self.assertEqual(cf.N1(0.), 0.) N1 = 5.44E-14 * (np.exp(6.93 * 3.) - 1) + 8.38E-4 * 3. self.assertEqual(cf.N1(3.), N1) self.assertEqual(cf.a0(3.), np.log10(N1)) self.assertAlmostEqual(cf.phi(0.), 8.38E-4) self.assertAlmostEqual(cf.t(n1=N1), 3., places=4) #user defined function f = textwrap.dedent(""" chronology={ name='user_function' n1_code=" a=5.44E-14 * (exp(6.93*t)-1) b=8.38E-4 * t n1=a+b " } """) cf_user = cst.Chronologyfn(f, 'user_function') self.assertEqual(cf_user.N1(3.), N1) self.assertTrue(np.allclose(cf.getplotdata(), cf_user.getplotdata())) self.assertTrue( np.allclose( cf.getplotdata(phi=True), cf_user.getplotdata(phi=True))) # user fn same as pre-defined
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)
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)