from ..formatHandlerBase import formatHandlerBase from ..formatName import formatName from ...data import dataFileBase,DataType,method,excitationValue,datafileSelector,AbsDataFile,getSubtablesRange,state from ...LaTeX import newCommand,extractMath import re from TexSoup import TexSoup import numpy as np from ...utils import getValFromCell @formatName("doubleColumn") class doubleColumnHandler(formatHandlerBase): def readFromTable(self,table): datalist=list() datacls=dict() subtablesMol=getSubtablesRange(table) for rangeMol in subtablesMol: mymolecule=str(table[rangeMol[0],0]) moltable=table[rangeMol,:] subtablestrans=getSubtablesRange(moltable,firstindex=0,column=1,count=2) for rangeTrans in subtablestrans: mytrans=moltable[rangeTrans,:] mytransdesc=mytrans[0:2,1] for i in range(2): mathsoup=extractMath(mytransdesc[i],Soup=True,commands=self.Commands) mytransdesc[i]=str(mathsoup) for colindex in range(3,np.size(table,1)): col=mytrans[:,colindex] mybasis=str(table[1,colindex]) for index,cell in enumerate(col): methodnameAT1=str(mytrans[index,2]) PTString=r"($\%T_1$)" HasT1=methodnameAT1.endswith(PTString) if HasT1: methodname=methodnameAT1[:-len(PTString)] else: methodname=str(methodnameAT1) mymethod=method(methodname,mybasis) strcell=str(cell) if strcell!="": if HasT1: m=re.match(r"^(?P[-+]?\d+\.?\d*)\s*(?:\((?P\d+\.?\d*)\\\%\))?",strcell) val,unsafe=getValFromCell(TexSoup(m.group("value"))) T1=m.group("T1") else: m=re.match(r"^[-+]?\d+\.?\d*",strcell) val,unsafe=getValFromCell(TexSoup(m.group(0))) T1=None if (mymolecule,mymethod.name,mymethod.basis) in datacls: data=datacls[(mymolecule,mymethod.name,mymethod.basis)] else: data=AbsDataFile() data.molecule=mymolecule data.method=mymethod datacls[(mymolecule,mymethod.name,mymethod.basis)]=data infin=mytransdesc[0].split(r"\rightarrow") for i,item in enumerate(infin): m=re.match(r"^(?P\d)\\[,:;\s]\s*\^(?P\d)(?P\S*)",item.strip()) infin[i]=state(m.group("number"),m.group("multiplicity"),m.group("sym")) data.excitations.append(excitationValue(infin[0],infin[1],val,type=mytransdesc[1],isUnsafe=unsafe,T1=T1)) for value in datacls.values(): datalist.append(value) return datalist