#!/usr/bin/env python

##############################################################################
##
# This file is part of Sardana
##
# http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
##
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
##
# Sardana is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
##
# Sardana is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
##
# You should have received a copy of the GNU Lesser General Public License
# along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################

'''
Script for extracting "scan tables" from Sardana Spec files into single-scan tab-separated ASCII tables.
When data from multiple scans are extracted from a file, each table is stored in a different file.
The output files for a given input file are stored in a directory whose name matches the input scan ID

Usage:
python spectoascii.py <specfile> [<scan_ID_1> [<scan_ID_2>] ...]

If no scan IDs are provided, all scans from the given Spec file will be extracted.

Note that this is not a generic Spec conversor. Spec files created by means other than the Sardana
SPEC_FileRecorder may not be converted properly.

'''


import sys
import os


def main():
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    else:
        print "Usage:\nspectoascii <specfile> [<scan_ID_1> [<scan_ID_2>] ...] "
        sys.exit(1)

    scanids = sys.argv[2:] or None

    f = open(fname, 'r')
    s = f.read()
    f.close()

    dirname, ext = os.path.splitext(fname)
    try:
        os.makedirs(dirname)
    except:
        print 'Cannot create dir "%s". Skipping.' % dirname

    for scan in s.split('\n\n'):
        lines = scan.split('\n')
        if not lines[0].startswith('#S '):
            continue
        scan_name = lines[0].split()[1]
        if scanids is None or scan_name in scanids:  # extract only selected ids
            ofname = os.path.join(dirname, "%s.dat" % scan_name)
            print "Extracting %s:%s to %s" % (fname, scan_name, ofname)
            try:
                ofile = open(ofname, 'w')
            except:
                print 'Cannot create file "%s". Skipping.' % ofname
                continue
            for line in lines[1:]:
                if line.startswith('#L '):
                    ofile.write('\t'.join(line[3:].split('  ')) + '\n')
                elif line.startswith('#'):
                    continue
                else:
                    ofile.write('\t'.join(line.split()) + '\n')
            ofile.close()


if __name__ == "__main__":
    main()
