diff --git a/tools/datafileBuilder.py b/tools/datafileBuilder.py index 40d01ac6..85522bed 100755 --- a/tools/datafileBuilder.py +++ b/tools/datafileBuilder.py @@ -28,7 +28,7 @@ elif args.file!=None: else: texOps=dfbOptions() commands=[LaTeX.newCommand(cmd) for cmd in soup.find_all("newcommand")] - dat=LaTeX.tabularToData(soup.tabular,commands) + dat=LaTeX.tabularToData(soup.tabular,commands,texOps.excludeColumns) scriptpath=Path(sys.argv[0]).resolve() datapath=scriptpath.parents[1]/"static"/"data" if args.debug: diff --git a/tools/lib/LaTeX.py b/tools/lib/LaTeX.py index c0d27385..cee348a4 100644 --- a/tools/lib/LaTeX.py +++ b/tools/lib/LaTeX.py @@ -4,6 +4,7 @@ from .utils import * import itertools from enum import Enum from abc import ABCMeta + class commandBase(metaclass=ABCMeta): def __init__(self,source,supportedTexType): if not (source.name==supportedTexType): @@ -15,7 +16,6 @@ class commandBase(metaclass=ABCMeta): def __repr__(self): return self.source.__repr__() - class newCommand(commandBase): def __init__(self,source): super(newCommand, self).__init__(source,"newcommand") @@ -96,7 +96,7 @@ class multiColumn(commandBase): @property def contents(self): return nodify(list(self.source.args[2].contents)) -def tabularToData(table,commands=None): +def tabularToData(table,commands=None,excludeColumn=set()): if table.name=="tabular": ctable=str(table) ctable=ctable.split("\n") @@ -136,6 +136,7 @@ def tabularToData(table,commands=None): raise ValueError("This tabular is not supported because lines have not the same column numbers for each row the coulumns numbers are {}".format(lens)) import numpy as np table=np.array(lnewtable,TexNode) + table=np.delete(table,list(excludeColumn),1) return table else: raise ValueError("Only tabular LaTeX environment is supported") diff --git a/tools/lib/dfbOptions.py b/tools/lib/dfbOptions.py index cf4ebab8..755e5199 100644 --- a/tools/lib/dfbOptions.py +++ b/tools/lib/dfbOptions.py @@ -1,6 +1,6 @@ from TexSoup import TexSoup,TexCmd from . import formats -from .data import dataFileBase,DataType,state +from .data import dataFileBase,DataType, method, state, exSet from collections import defaultdict class dfbOptions(object): @@ -10,6 +10,10 @@ class dfbOptions(object): self.suffix=None self.initialStates=defaultdict(lambda : state(1,1,"A_1")) self.isDouble=False + self.defaultBasis="aug-cc-pVTZ" + self.geometries = defaultdict(lambda :method("CC3","aug-cc-pVTZ")) + self.set = '' + self.excludeColumns=set() @staticmethod def readFromEnv(lateEnv): dfb_Opt=dfbOptions() @@ -37,8 +41,8 @@ class dfbOptions(object): vRArgs=[arg.value for arg in initialState.args if arg.type=="required"] vOArgs=[arg.value for arg in initialState.args if arg.type=="optional"] if len(vOArgs)==0: - defaultstate=state.fromString("1 "+vRArgs[0]) - dfb_Opt.initialStates.default_factory=lambda : defaultstate + defaultgeometry=state.fromString("1 "+vRArgs[0]) + dfb_Opt.initialStates.default_factory=lambda : defaultgeometry else: mystate=state.fromString("1 "+vRArgs[0]) dfb_Opt.initialStates[vOArgs[0]]=mystate @@ -58,4 +62,41 @@ class dfbOptions(object): raise ValueError("\isDouble must be 'true' or 'false'.") else: raise ValueError("Arguments error on '\isDouble'. Only one optional argument is supported.") + dfbDefaultBasisNode=lateEnv.defaultBasis + if dfbDefaultBasisNode!=None: + dfbDefaultBasis=dfbDefaultBasisNode.expr + if type(dfbDefaultBasis) is TexCmd: + dfb_Opt.defaultBasis=dfbDefaultBasis.args[0].value + dfbgeometryNodes=list(lateEnv.find_all("geometry")) + for node in dfbgeometryNodes: + geometry=node.expr + if type(geometry) is TexCmd: + vRArgs=[arg.value for arg in geometry.args if arg.type=="required"] + vOArgs=[arg.value for arg in geometry.args if arg.type=="optional"] + if len(vOArgs)==0: + defaultgeometry=method(vRArgs[0],vRArgs[1]) + dfb_Opt.geometries.default_factory=lambda : defaultgeometry + else: + mygeometry=method(vRArgs[0],vRArgs[1]) + dfb_Opt.geometries[vOArgs[0]]=mygeometry + dfbSetNode=lateEnv.set + if dfbSetNode!=None: + dfbSet=dfbSetNode.expr + if type(dfbSet) is TexCmd: + setname=dfbSet.args[0].value + index=dfbSet.args[1].value + dfb_Opt.set=exSet(setname,index=int(index)) + else: + dfbStrSetNode=lateEnv.strSet + if dfbStrSetNode!=None: + dfbStrSet=dfbStrSetNode.expr + if type(dfbStrSet) is TexCmd: + dfb_Opt.set=setname=dfbStrSet.args[0].value + dfbexcludeColumnsNodes=list(lateEnv.find_all("excludecolumns")) + for node in dfbexcludeColumnsNodes: + excludeColumns=node.expr + if type(excludeColumns) is TexCmd: + commas_string=excludeColumns.args[0].value + ints=[int(x.strip()) for x in commas_string.split(",")] + dfb_Opt.excludeColumns.update(ints) return dfb_Opt \ No newline at end of file diff --git a/tools/lib/formats/default/TBEHandler.py b/tools/lib/formats/default/TBEHandler.py index 34b2d67a..e50b1ec8 100644 --- a/tools/lib/formats/default/TBEHandler.py +++ b/tools/lib/formats/default/TBEHandler.py @@ -4,14 +4,14 @@ from ...data import dataFileBase,DataType,method,excitationValue,datafileSelecto from ...utils import getValFromCell, checkFloat @formatName("TBE") class TBEHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() subtablesRange=getSubtablesRange(table) for myrange in subtablesRange: datacls=dict() mymolecule=str(table[myrange[0],0]) initialState=self.TexOps.initialStates[mymolecule] - mymethod=(method("TBE","aug-cc-pVTZ"),method("TBE(Full)","CBS")) + mymethod=(method("TBE",self.TexOps.defaultBasis),method("TBE(Full)","CBS")) finsts=dataFileBase.convertState(table[myrange,1],initialState,default=self.TexOps.defaultType,commands=self.Commands) for index,row in enumerate(table[myrange,]): oscilatorForces=checkFloat(str(row[2])) diff --git a/tools/lib/formats/default/columnHandler.py b/tools/lib/formats/default/columnHandler.py index ea1ef50a..a579a0dd 100644 --- a/tools/lib/formats/default/columnHandler.py +++ b/tools/lib/formats/default/columnHandler.py @@ -5,7 +5,7 @@ from ...utils import getValFromCell import numpy as np @formatName("column") class columnHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() subtablesRange=getSubtablesRange(table) for myrange in subtablesRange: diff --git a/tools/lib/formats/default/doubleColumnHandler.py b/tools/lib/formats/default/doubleColumnHandler.py index 6a962cff..b3e30042 100644 --- a/tools/lib/formats/default/doubleColumnHandler.py +++ b/tools/lib/formats/default/doubleColumnHandler.py @@ -8,7 +8,7 @@ import numpy as np from ...utils import getValFromCell @formatName("doubleColumn") class doubleColumnHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() datacls=dict() subtablesMol=getSubtablesRange(table) diff --git a/tools/lib/formats/default/doubleTBEHandler.py b/tools/lib/formats/default/doubleTBEHandler.py index 27196872..b80702d1 100644 --- a/tools/lib/formats/default/doubleTBEHandler.py +++ b/tools/lib/formats/default/doubleTBEHandler.py @@ -7,7 +7,7 @@ from TexSoup import TexSoup import re @formatName("doubleTBE") class doubleTBEHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() subtablesMol=getSubtablesRange(table) for rangeMol in subtablesMol: diff --git a/tools/lib/formats/default/exoticColumnHandler.py b/tools/lib/formats/default/exoticColumnHandler.py index 5e30d86f..314487f2 100644 --- a/tools/lib/formats/default/exoticColumnHandler.py +++ b/tools/lib/formats/default/exoticColumnHandler.py @@ -8,7 +8,7 @@ import numpy as np import json @formatName("exoticColumn") class exoticColumnHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() subtablesRange=getSubtablesRange(table) for myrange in subtablesRange: diff --git a/tools/lib/formats/default/fromXLSToLaTeXHandler.py b/tools/lib/formats/default/fromXLSToLaTeXHandler.py index e5994b14..12ed1ba8 100644 --- a/tools/lib/formats/default/fromXLSToLaTeXHandler.py +++ b/tools/lib/formats/default/fromXLSToLaTeXHandler.py @@ -56,7 +56,7 @@ class fromXLSToLaTeXHandler(formatHandlerBase): else: return resultstr - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() subtablesRange=getSubtablesRange(table,firstindex=1,column=1) for myrange in subtablesRange: @@ -65,7 +65,7 @@ class fromXLSToLaTeXHandler(formatHandlerBase): initialState=self.TexOps.initialStates[mymolecule] for col in itertools.chain(range(8,11), range(14,np.size(table,1))): col=table[:,col] - basis="aug-cc-pVTZ" + basis=self.TexOps.defaultBasis mymethcell=list(col[0]) if len(mymethcell)==0: continue diff --git a/tools/lib/formats/default/lineHandler.py b/tools/lib/formats/default/lineHandler.py index 1e33a263..c9ebbd3d 100644 --- a/tools/lib/formats/default/lineHandler.py +++ b/tools/lib/formats/default/lineHandler.py @@ -5,7 +5,7 @@ from ...utils import getValFromCell import numpy as np @formatName("line") class lineHandler(formatHandlerBase): - def readFromTable(self,table): + def _readFromTableCore(self,table): datalist=list() for col in range(1,np.size(table,1)): col=table[:,col] diff --git a/tools/lib/formats/formatHandlerBase.py b/tools/lib/formats/formatHandlerBase.py index ec0ae01e..86c4d8a7 100644 --- a/tools/lib/formats/formatHandlerBase.py +++ b/tools/lib/formats/formatHandlerBase.py @@ -4,5 +4,15 @@ class formatHandlerBase(object, metaclass=ABCMeta): self.TexOps=TexOps self.Commands=commands @abstractmethod + def _readFromTableCore(self,table): + raise NotImplementedError() + def readFromTable(self,table): - raise NotImplementedError() \ No newline at end of file + dataFiles=self._readFromTableCore(table) + for file in dataFiles: + self.__applyMetadataFromOptions(file) + return dataFiles + def __applyMetadataFromOptions(self,file): + if hasattr(file, "geometry"): + file.geometry = self.TexOps.geometries[file.molecule] + file.set = self.TexOps.set