Пример #1
0
def readfile_xyz(fname):
    string = ""
    zmat, symbols, masses = ff.read_xyz_zmat(fname)
    xcc = intl.zmat2xcc(zmat[0],zmat[1])
    # Print more information
    ndummy = symbols.count("XX")
    natoms = len(symbols)-ndummy
    # without dummies
    symbols_wo , xcc_wo    = fncs.clean_dummies(symbols,xcc=xcc)
    symbols_wo , masses_wo = fncs.clean_dummies(symbols,masses=masses)
    molecule = Molecule()
    molecule.setvar(xcc=xcc_wo,symbols=symbols_wo,masses=masses_wo,ch=0,mtp=1)
    molecule.prepare()
    molecule.setup()
    string += "Molecular formula     : %s\n"%molecule._mform
    string += "Number of atoms       : %i\n"%natoms
    string += "Number of dummy atoms : %i\n"%ndummy
    string += "Vibrational d.o.f.    : %i\n"%molecule._nvdof
    string += "\n"
    # Cartesian Coordinates
    string += "Cartesian coordinates (in Angstrom):\n"
    sidx = "%%%si"%len(str(len(symbols)))
    at_wo = -1
    dwithout = {}
    for at,symbol in enumerate(symbols):
        xi,yi,zi = [value*pc.ANGSTROM for value in xcc[3*at : 3*at+3]]
        mass     = masses[at]*pc.AMU
        datainline = (sidx%(at+1),symbol,xi,yi,zi,mass)
        if symbol != "XX": at_wo += 1; dwithout[at] = at_wo
        else: dwithout[at] = None
        string += "[%s]  %-2s  %+12.7f  %+12.7f  %+12.7f  (%7.3f amu)\n"%datainline
    string += "\n"
    return xcc,zmat,symbols,masses,(dwithout,molecule,natoms,ndummy),string
Пример #2
0
def generate_gts_file(esfile, gtsfile, read_method):
    '''
    Generate gts file (and molden & frozen files)
    from given electronic structure (ES) file;
    The ES file is read using read_method
    '''
    # Extra files that (maybe) will be generated
    file_frozen = gtsfile + ".frozen"  # only if any frozen atom
    file_molden = gtsfile + ".molden"  # molden file
    # read file
    xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = read_method(
        PN.UFOLDER + esfile)[0:9]
    # clevel is not really clevel when using read_gtsfile as read_method
    if read_method == read_gtsfile: clevel = ""
    # symbols and atonums
    symbols, atonums = fncs.symbols_and_atonums(atonums)
    # is masses available?
    if masses is None or len(masses) == 0 or sum(masses) == 0.0:
        masses = atonums2masses(atonums)
    # is Fcc available?
    if len(atonums) != 1 and (Fcc is None or len(Fcc) == 0):
        status = -1
        cache = None
        molec = None
    else:
        # Generate Molecule instance
        molec = Molecule()
        molec.setvar(xcc=xcc, gcc=gcc, Fcc=Fcc)
        molec.setvar(atonums=atonums, masses=masses)
        molec.setvar(ch=ch, mtp=mtp, V0=E)
        molec.prepare()
        # Deal with frozen atoms [atom i is frozen if Fij=0 forall j)
        frozen_xcc, frozen_symbols = molec.remove_frozen()
        # Calculate point group (must be done after remove frozen)
        molec.calc_pgroup(force=True)
        # Deal with Hessian
        molec.setup()
        # write gts file
        molec.genfile_gts(PN.DIR1 + gtsfile, level=clevel)
        status = 1
        # write frozen (if there are frozen atoms)
        RW.write_frozen(PN.DIR1 + file_frozen, frozen_xcc, frozen_symbols)
        # write molden file
        idata = (PN.DIR1 + file_molden, molec._xcc, molec._symbols,
                 molec._ccfreqs, molec._ccFevecs)
        write_molden(*idata)
        # save to cache
        nimag = int(fncs.numimag(molec._ccfreqs))
        pgroup = str(molec._pgroup)
        mform = str(molec._mform)
        cache = [esfile, gtsfile, E, ch, mtp, nimag, mform, pgroup]
    # delete variable, just in case
    del xcc, gcc, Fcc
    del symbols, atonums, masses
    del molec
    # return
    return status, cache
Пример #3
0
def get_ts_ifreq(xcc, gcc, Fcc, E, tcommon):
    ch, mtp, atonums, masses, mu = tcommon
    ts = Molecule()
    ts.setvar(xcc=xcc, gcc=gcc, Fcc=Fcc)
    ts.setvar(atonums=atonums, masses=masses)
    ts.setvar(ch=ch, mtp=mtp, V0=E)
    ts.prepare()
    ts.setup(mu)
    ts.ana_freqs()
    [(ifreq, evec)] = ts._ccimag
    return ifreq, mu
Пример #4
0
def log_data(log, inpvars, fscal, folder="./"):
    if inpvars._ts: fmode = -1
    else: fmode = 0
    # name from log
    name = log.split(".")[-2]
    point = TorPESpoint(name, inpvars._tlimit)
    # Read log file
    logdata = gau.read_gaussian_log(folder + log)
    # prepare data
    logdata = prepare_log_data(logdata)
    ch, mtp, V0, symbols, symbols_wo, xcc_wo, gcc_wo, Fcc_wo, lzmat, zmatvals = logdata

    # string for fccards
    string_fccards = gau.get_fccards_string(gcc_wo, Fcc_wo)

    # generate Molecule instance
    molecule = Molecule()
    molecule.setvar(xcc=xcc_wo, Fcc=Fcc_wo, V0=V0)
    molecule.setvar(fscal=fscal)
    molecule.setvar(symbols=symbols_wo)
    molecule.setvar(ch=ch, mtp=mtp)
    molecule.prepare()
    molecule.setup()
    molecule.ana_freqs()

    # Calculate partition functions for the temperatures
    qtot, V1, qis = molecule.calc_pfns(inpvars._temps, fmode=fmode)
    qtr, qrot, qvib, qele = qis
    Qrv = np.array([xx * yy for xx, yy in zip(qrot, qvib)])
    # Calculate partition functions at target temperature
    qtot, V1, qis = molecule.calc_pfns([inpvars._temp], fmode=fmode)
    # remove rotsigma for Gibbs
    gibbs = V1 - pc.KB * inpvars._temp * np.log(qtot[0] * molecule._rotsigma)

    # imaginary frequency
    if len(molecule._ccimag) == 0: ifreq = None
    elif len(molecule._ccimag) == 1:
        ifreq = [ifreq for ifreq, ivec in list(molecule._ccimag)][0]
    else:
        ifreq = None

    # weight for this conformer
    if inpvars._enantio and molecule._pgroup.lower() == "c1": weight = 2
    else: weight = 1
    # pack and return data
    conf_tuple = (point, V0, V1, gibbs, weight, Qrv, ifreq, lzmat, zmatvals,
                  log)
    return conf_tuple, symbols, string_fccards
Пример #5
0
def get_rotcons(lzmat,zmatvals,symbols):
    xcc = zmat2xcc(lzmat,zmatvals)
    # correct symbols (just in case)
    symbols,atonums = fncs.symbols_and_atonums(symbols)
    # Data without dummies
    symbols_wo,xcc_wo = fncs.clean_dummies(symbols,xcc=list(xcc))
    # generate Molecule instance
    molecule = Molecule()
    molecule.setvar(xcc=xcc_wo)
    molecule.setvar(symbols=symbols_wo)
    molecule.setvar(V0=0)
    molecule.setvar(ch=0,mtp=1)
    molecule.prepare()
    molecule.setup()
    # in freq units (GHz)
    imoms   = [Ii * pc.KG*pc.METER**2 for Ii in molecule._imoms]
    rotcons = [pc.H_SI/(Ii*8*np.pi**2)/1E9 for Ii in imoms]
    return rotcons
Пример #6
0
def userfile_to_gtsfile(filename, gtsfile):
    '''
    Read a file given by the user and generate gts file
    if possible
    '''
    gtsfile = gtsname(gtsfile, "full")
    read_methods = []
    read_methods.append(read_gtsfile)  #(a) a gts file
    read_methods.append(read_fchk)  #(b) a fchk file
    read_methods.append(read_gauout_v1)  #(c.1) a Gaussian output file (ramos)
    read_methods.append(read_gauout_v2)  #(c.2) a Gaussian output file (ferro)
    read_methods.append(read_orca)  #(d) an Orca output file
    for read_method in read_methods:
        try:
            xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = read_method(
                filename)[0:9]
            if read_method == read_gtsfile: clevel = ""
            # in case no data in masses
            if masses is None or len(masses) == 0 or sum(masses) == 0.0:
                masses = atonums2masses(atonums)
            # Some checking
            if len(atonums) != 1 and Fcc in ([], None):
                #raise Exc.FccNotFound
                return -1, None
            # Generate Molecule instance
            molecule = Molecule()
            molecule.setvar(xcc=xcc, gcc=gcc, Fcc=Fcc)
            molecule.setvar(atonums=atonums, masses=masses)
            molecule.setvar(ch=ch, mtp=mtp, V0=E)
            molecule.prepare()
            # Deal with frozen atoms
            ffrozen = gtsfile + ".frozen"
            frozen_xcc, frozen_symbols = molecule.remove_frozen()
            RW.write_frozen(ffrozen, frozen_xcc, frozen_symbols)
            # write gts
            molecule.calc_pgroup(force=True)
            molecule.genfile_gts(gtsfile, level=clevel)
            return 1, E
        except Exc.FileType:
            continue
        except:
            continue
    return 0, None
Пример #7
0
def get_imag_freq(log, fscal):
    try:
        # Read log file
        logdata = gau.read_gaussian_log(log)
        logdata = prepare_log_data(logdata)
        ch, mtp, V0, symbols, symbols_wo, xcc_wo, gcc_wo, Fcc_wo, lzmat, zmatvals = logdata

        # diagonalize Fcc
        molecule = Molecule()
        molecule.setvar(xcc=xcc_wo, Fcc=Fcc_wo, V0=V0)
        molecule.setvar(fscal=fscal)
        molecule.setvar(symbols=symbols_wo)
        molecule.setvar(ch=ch, mtp=mtp)
        molecule.prepare()
        molecule.setup()
        molecule.ana_freqs()
        ifreq = molecule._ccimag[0][0]
    except:
        ifreq = None
    # return
    return ifreq
Пример #8
0
def path2vadi(tcommon,drst,Eref=None,ics=None,boolint=False,lowfq={},freqscal=1.0,icsbw=None,icsfw=None,symmetry=None):
    '''
    lowfq: in case of imaginary frequencies
    '''
    # boolint as boolean
    if   boolint in [False,"no","No","n","N",None]: boolint = False
    elif boolint in [True,"yes","YES","y","Y"]    : boolint = True
    # check there are internal coordinates if required
    if boolint and ics in [None,False,[]]: raise Exc.NoICS(Exception)
    # expand data in tcommon
    ch,mtp,atnums,masses,mu = tcommon
    # Sorted labels (by s)
    slabels = sd.sorted_points(drst,hess=True)
    # Reference energy
    if Eref is None: lbw, lfw, sbw, sfw, Eref, Efw = sd.rstlimits(drst)
    # Independent variable
    data_x = [drst[label][0] for label in slabels]
    # mep energy (relative value)
    listV0 = [drst[label][1]-Eref for label in slabels]

    # Initializing data
    lcc_tzpe, lcc_frqs, lcc_Vadi = [], [], []
    lic_tzpe, lic_frqs, lic_Vadi = [], [], []
    dMols = {}

    # Updating data
    for label in slabels:
        # data in drst
        s_i, E_i, xms_i,gms_i,Fms_i,v0_i,v1_i,t_i = drst[label]
        # project gradient
        if s_i == 0.0: bool_pg = False
        else         : bool_pg = True
        # lowfq
        if   s_i == 0.0: dlowfq = {}
        elif s_i  < 0.0: dlowfq = lowfq.get("bw",{})
        elif s_i  > 0.0: dlowfq = lowfq.get("fw",{})
        # mass-scaled --> Cartesian coords
        xcc = fncs.ms2cc_x(xms_i,masses,mu)
        gcc = fncs.ms2cc_g(gms_i,masses,mu)
        Fcc = fncs.ms2cc_F(Fms_i,masses,mu)
        # create Molecule instance
        mol = Molecule()
        mol.setvar(xcc=xcc,gcc=gcc,Fcc=Fcc)
        mol.setvar(atonums=atnums,masses=masses)
        mol.setvar(ch=ch,mtp=mtp,V0=E_i)
        mol.setvar(fscal=freqscal)
        if symmetry is not None:
            mol.setvar(pgroup=symmetry[0])
            mol.setvar(rotsigma=symmetry[1])
        mol.prepare()
        mol.setup(mu,projgrad=bool_pg)
        mol.clean_freqs("cc")       # it may be needed with orca
        mol.deal_lowfq(dlowfq,"cc") # deal with low frequencies
        mol.ana_freqs("cc")         # calculate zpe
        # append data
        lcc_tzpe.append(float(mol._cczpe)   )
        lcc_Vadi.append(mol._ccV1 - Eref    )
        lcc_frqs.append(list(mol._ccfreqs))
        # internal coordinates
        if boolint:
           if   s_i < 0.0 and icsbw is not None: mol.icfreqs(icsbw,bool_pg)
           elif s_i > 0.0 and icsfw is not None: mol.icfreqs(icsfw,bool_pg)
           else                                : mol.icfreqs(ics  ,bool_pg)
           mol.deal_lowfq(dlowfq,"ic")
           mol.ana_freqs("ic")
           # append data
           lic_tzpe.append(float(mol._iczpe) )
           lic_Vadi.append(mol._icV1 - Eref  )
           lic_frqs.append(list(mol._icfreqs))
        # save instance
        dMols[label] = (s_i,mol)

    # package data
    tuple_cc = (data_x,lcc_frqs,lcc_tzpe)
    tuple_ic = (data_x,lic_frqs,lic_tzpe)
    # Generate splines
    Vadi_cc = VadiSpline(data_x,lcc_Vadi)
    if boolint: Vadi_ic = VadiSpline(data_x,lic_Vadi)
    else      : Vadi_ic = None
    # Return data
    return dMols, Vadi_cc, Vadi_ic, tuple_cc, tuple_ic, listV0