Add --csv option to pysawsim.parameter_scan.
[sawsim.git] / pysawsim / parameter_scan.py
index ff34a44661a34a99b4ba1366a631a3b3c5926990..439fd0b1bbfbdb6ee2dda74190c6611fb522ebe9 100644 (file)
@@ -157,7 +157,7 @@ class HistogramMatcher (object):
     ...     '-s "unfolded,wlc,{0.39e-9,28e-9}" '
     ...     '-k "folded,unfolded,bell,{%g,%g}" -q folded')
     >>> m = ThreadManager()
-    >>> sr = SawsimRunner(sawsim='bin/sawsim', manager=m)
+    >>> sr = SawsimRunner(manager=m)
     >>> hm = HistogramMatcher(histogram_stream, param_format_string, sr, N=3)
     >>> hm.plot([[1e-5,1e-3,3],[0.1e-9,1e-9,3]], logx=True, logy=False)
     >>> m.teardown()
@@ -260,7 +260,10 @@ class HistogramMatcher (object):
         log().debug('residual %s: %g' % (params, residual))
         return residual
 
-    def plot(self, param_ranges, logx=False, logy=False, contour=False):
+    def plot(self, param_ranges, logx=False, logy=False, contour=False,
+             csv=None):
+        if csv:
+            csv.write(','.join(('param 1', 'param 2', 'fit quality')) + '\n')
         xranges = param_ranges[0]
         yranges = param_ranges[1]
         if logx == False:
@@ -281,6 +284,8 @@ class HistogramMatcher (object):
                            % (i, j, i*(len(y)-1) + j, (len(x)-1)*(len(y)-1)))
                 params = (xi,yj)
                 r = self.residual(params)
+                if csv:
+                    csv.write(','.join([str(v) for v in (xi,yj,r)]) + '\n')
                 C[j,i] = numpy.log(r) # better resolution in valleys
                 if MEM_DEBUG == True:
                     log().debug('RSS: %d KB' % rss())
@@ -343,8 +348,7 @@ def main(argv=None):
     >>> f = tempfile.NamedTemporaryFile()
     >>> f.write(EXAMPLE_HISTOGRAM_FILE_CONTENTS)
     >>> f.flush()
-    >>> main(['-s', 'bin/sawsim',
-    ...       '-r', '[1e-5,1e-3,3],[0.1e-9,1e-9,3]',
+    >>> main(['-r', '[1e-5,1e-3,3],[0.1e-9,1e-9,3]',
     ...       '-N', '2',
     ...       f.name])
     >>> f.close()
@@ -413,12 +417,15 @@ def main(argv=None):
     parser.add_option('-c','--contour-plot', dest='contour_plot',
                       help='Select contour plot (vs. the default pseudocolor plot).',
                       default=False, action='store_true')
+    parser.add_option('--csv', dest='csv', metavar='FILE',
+                      help='Save fit qualities to a comma-separated value file FILE.'),
 
     options,args = parser.parse_args(argv)
 
     initial_params = [float(p) for p in options.initial_params.split(",")]
     param_ranges = parse_param_ranges_string(options.param_range)
     histogram_file = args[0]
+    csv = None
     sr_call_params = sr.initialize_from_options(options)
 
     try:
@@ -428,7 +435,11 @@ def main(argv=None):
             sawsim_runner=sr, residual_type=options.residual,
             plot=options.plot_residuals, **sr_call_params)
         #hm.fit(initial_params)
+        if options.csv:
+            csv = open(options.csv, 'w')
         hm.plot(param_ranges, logx=options.logx, logy=options.logy,
-                contour=options.contour_plot)
+                contour=options.contour_plot, csv=csv)
     finally:
         sr.teardown()
+        if csv:
+            csv.close()