Commit f84243a0 authored by eric pellegrini's avatar eric pellegrini
Browse files

Created Format package that contains the whole Format interface

parent a6012205
#MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
#------------------------------------------------------------------------------------------
#Copyright (C)
#2015- Eric C. Pellegrini Institut Laue-Langevin
#BP 156
#6, rue Jules Horowitz
#38042 Grenoble Cedex 9
#France
#pellegrini[at]ill.fr
#goret[at]ill.fr
#aoun[at]ill.fr
#
#This library 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 2.1 of the License, or (at your option) any later version.
#
#This library 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 this library; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
'''
Created on Mar 27, 2015
@author: pellegrini
'''
import os
import StringIO
import tarfile
import numpy
from MDANSE.Framework.Formats.IFormat import IFormat
class ASCIIFormat(IFormat):
type = 'ascii'
extension = ".dat"
extensions = ['.dat','.txt']
@classmethod
def write(cls, filename, data, header=""):
filename = os.path.splitext(filename)[0]
filename = "%s_%s.tar" % (filename,cls.type)
tf = tarfile.open(filename,'w')
for var in data.values():
tempStr = StringIO.StringIO()
if header:
tempStr.write(header)
tempStr.write('\n\n')
tempStr.write(var.info())
tempStr.write('\n\n')
cls.write_array(tempStr,var)
tempStr.seek(0)
info = tarfile.TarInfo(name='%s%s' % (var.name,cls.extensions[0]))
info.size=tempStr.len
tf.addfile(tarinfo=info, fileobj=tempStr)
tf.close()
@classmethod
def write_array(cls, fileobject, array, slices=None):
if slices is None:
slices = [0]*array.ndim
slices[-2:] = array.shape[-2:]
if array.ndim > 2:
for a in array:
cls.write_array(fileobject,a, slices)
slices[len(slices)-array.ndim] = slices[len(slices)-array.ndim] + 1
else:
fileobject.write('#slice:%s\n' % slices)
numpy.savetxt(fileobject, array)
fileobject.write('\n')
#MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
#------------------------------------------------------------------------------------------
#Copyright (C)
#2015- Eric C. Pellegrini Institut Laue-Langevin
#BP 156
#6, rue Jules Horowitz
#38042 Grenoble Cedex 9
#France
#pellegrini[at]ill.fr
#goret[at]ill.fr
#aoun[at]ill.fr
#
#This library 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 2.1 of the License, or (at your option) any later version.
#
#This library 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 this library; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
'''
Created on Mar 27, 2015
@author: pellegrini
'''
import abc
from MDANSE import REGISTRY
class IFormat(object):
'''
This is the base class for nmoldyn data.
'''
__metaclass__ = REGISTRY
type = "format"
@abc.abstractmethod
def write(self, filename, data, header=""):
pass
'''
MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
------------------------------------------------------------------------------------------
Copyright (C)
2015- Eric C. Pellegrini Institut Laue-Langevin
BP 156
6, rue Jules Horowitz
38042 Grenoble Cedex 9
France
pellegrini[at]ill.fr
This library 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 2.1 of the License, or (at your option) any later version.
This library 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 this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Created on Mar 23, 2015
#MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
#------------------------------------------------------------------------------------------
#Copyright (C)
#2015- Eric C. Pellegrini Institut Laue-Langevin
#BP 156
#6, rue Jules Horowitz
#38042 Grenoble Cedex 9
#France
#pellegrini[at]ill.fr
#goret[at]ill.fr
#aoun[at]ill.fr
#
#This library 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 2.1 of the License, or (at your option) any later version.
#
#This library 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 this library; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
'''
Created on Mar 27, 2015
@author: pellegrini
'''
import abc
import os
import re
import StringIO
import tarfile
import numpy
from MDANSE import REGISTRY
from MDANSE.Core.Error import Error
from MDANSE.Externals.svgfig.svgfig import _hacks, Frame, Poly
_hacks["inkscape-text-vertical-shift"] = True
class FormatError(Error):
pass
def format_unit_string(unitString):
return re.sub('[%()]','',unitString)
class Format(object):
'''
This is the base class for nmoldyn data.
'''
__metaclass__ = REGISTRY
type = "format"
@abc.abstractmethod
def write(self, filename, data, header=""):
pass
class ASCIIFormat(Format):
type = 'ascii'
extension = ".dat"
from Scientific.IO.NetCDF import NetCDFFile
extensions = ['.dat','.txt']
@classmethod
def write(cls, filename, data, header=""):
filename = os.path.splitext(filename)[0]
filename = "%s_%s.tar" % (filename,cls.type)
from MDANSE.Framework.Formats.IFormat import IFormat
tf = tarfile.open(filename,'w')
for var in data.values():
tempStr = StringIO.StringIO()
if header:
tempStr.write(header)
tempStr.write('\n\n')
tempStr.write(var.info())
tempStr.write('\n\n')
cls.write_array(tempStr,var)
tempStr.seek(0)
info = tarfile.TarInfo(name='%s%s' % (var.name,cls.extensions[0]))
info.size=tempStr.len
tf.addfile(tarinfo=info, fileobj=tempStr)
tf.close()
@classmethod
def write_array(cls, fileobject, array, slices=None):
if slices is None:
slices = [0]*array.ndim
slices[-2:] = array.shape[-2:]
if array.ndim > 2:
for a in array:
cls.write_array(fileobject,a, slices)
slices[len(slices)-array.ndim] = slices[len(slices)-array.ndim] + 1
else:
fileobject.write('#slice:%s\n' % slices)
numpy.savetxt(fileobject, array)
fileobject.write('\n')
class NetCDFFormat(Format):
class NetCDFFormat(IFormat):
type = 'netcdf'
......@@ -136,9 +59,6 @@ class NetCDFFormat(Format):
filename = "%s%s" % (filename,cls.extensions[0])
# Import the NetCDFFile function.
from Scientific.IO.NetCDF import NetCDFFile
# The NetCDF output file is opened for writing.
outputFile = NetCDFFile(filename, 'w')
......@@ -170,45 +90,3 @@ class NetCDFFormat(Format):
# The NetCDF file is closed.
outputFile.close()
class SVGFormat(Format):
type = 'svg'
extension = ".svg"
extensions = ['.svg']
@classmethod
def write(cls,filename,data, header=""):
filename = os.path.splitext(filename)[0]
filename = "%s.tar" % filename
tf = tarfile.open(filename,'w')
for var in data.values():
if var.ndim != 1:
continue
if var.axis in data:
axis = data[var.axis]
xtitle = "%s (%s)" % (axis.name,format_unit_string(axis.units))
else:
axis = numpy.arange(len(var))
xtitle = 'index'
ytitle = "%s (%s)" % (var.name,format_unit_string(var.units))
pl = Poly(zip(axis,var),stroke='blue')
svgfilename = os.path.join(os.path.dirname(filename),'%s%s' % (var.name,cls.extensions[0]))
Frame(min(axis),max(axis),min(var),max(var),pl,xtitle=xtitle,ytitle=ytitle).SVG().save(svgfilename)
tf.add(svgfilename, arcname='%s%s' % (var.name,cls.extensions[0]))
os.remove(svgfilename)
tf.close()
#MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
#------------------------------------------------------------------------------------------
#Copyright (C)
#2015- Eric C. Pellegrini Institut Laue-Langevin
#BP 156
#6, rue Jules Horowitz
#38042 Grenoble Cedex 9
#France
#pellegrini[at]ill.fr
#goret[at]ill.fr
#aoun[at]ill.fr
#
#This library 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 2.1 of the License, or (at your option) any later version.
#
#This library 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 this library; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
'''
Created on Mar 27, 2015
@author: pellegrini
'''
import os
import re
import tarfile
import numpy
from MDANSE.Externals.svgfig.svgfig import _hacks, Frame, Poly
from MDANSE.Framework.Formats.IFormat import IFormat
_hacks["inkscape-text-vertical-shift"] = True
def format_unit_string(unitString):
return re.sub('[%()]','',unitString)
class SVGFormat(IFormat):
type = 'svg'
extension = ".svg"
extensions = ['.svg']
@classmethod
def write(cls,filename,data, header=""):
filename = os.path.splitext(filename)[0]
filename = "%s.tar" % filename
tf = tarfile.open(filename,'w')
for var in data.values():
if var.ndim != 1:
continue
if var.axis in data:
axis = data[var.axis]
xtitle = "%s (%s)" % (axis.name,format_unit_string(axis.units))
else:
axis = numpy.arange(len(var))
xtitle = 'index'
ytitle = "%s (%s)" % (var.name,format_unit_string(var.units))
pl = Poly(zip(axis,var),stroke='blue')
svgfilename = os.path.join(os.path.dirname(filename),'%s%s' % (var.name,cls.extensions[0]))
Frame(min(axis),max(axis),min(var),max(var),pl,xtitle=xtitle,ytitle=ytitle).SVG().save(svgfilename)
tf.add(svgfilename, arcname='%s%s' % (var.name,cls.extensions[0]))
os.remove(svgfilename)
tf.close()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment