Ejemplo n.º 1
0
def sep_mol(coords, distca, Type):

    import math
    import numpy       as np
    from   pprint      import detec
    from   chemData    import pTable

    atmList = []

    for ID, line in enumerate(coords):
        #print(line)
        atmDict             = {}
        atmDict["id"]       = ID
        atmDict["sym"]      = line[0]
        atmDict["x"]        = float(line[1])
        atmDict["y"]        = float(line[2])
        atmDict["z"]        = float(line[3])
        atmDict["con"]      = []
        atmDict["grp_dist"] = False
        atmDict["grp_vdw"]  = False

        for sym, data in pTable.items():
            if atmDict["sym"]  == sym:
                atmDict["nu"]  = data[0]
                atmDict["mas"] = data[1]
                atmDict["vdw"] = data[2]
        atmList.append(atmDict)

    natoms = len(atmList)
    dist   = np.zeros((natoms,natoms))
    # FIND DISTS BETWEEN ALL ATOMS i & j
    group_dist = 0
    group_vdw  = 0
    for val, i in enumerate(atmList):
        con_vwd  = False
        con_dist = False
        # SECOND ATOM < DISTCA
        for vals, j in enumerate(atmList):
            if i != j:
                a = (i["x"]-j["x"])**2 + (i["y"]-j["y"])**2\
                + (i["z"]-j["z"])**2
                dist[val,vals] = math.sqrt(a)

                # IF UNDER DISTCA ---------------------------------------
                if dist[val, vals] < distca:
                    con_dist = True
                    # IF NEITHER I NOR J PART OF A GROUP
                    # ADD THEM TO A NEW GROUP
                    if i["grp_dist"] is False and j["grp_dist"] is False:
                        i["grp_dist"], j["grp_dist"] = group_dist, group_dist
                        group_dist += 1
                    # IF BOTH HAVE BEEN ASSIGNED TO A DIFF GROUP
                    elif not i["grp_dist"] is False and not j["grp_dist"] is False:
                        if i["grp_dist"] != j["grp_dist"]:
                            grp_chng = j["grp_dist"]
                            for k in atmList:
                                if k["grp_dist"] is grp_chng:
                                    k["grp_dist"] = i["grp_dist"]
                    # IF j NOT ASSIGNED
                    elif not i["grp_dist"] is False and j["grp_dist"] is False:
                        j["grp_dist"] = i["grp_dist"]
                    # IF i NOT ASSIGNED
                    elif not j["grp_dist"] is False and i["grp_dist"] is False:
                        i["grp_dist"] = j["grp_dist"]

                # CHECK IF CONNECTED USING VDW DATA -----------------------
                #print(i["vdw"] + j["vdw"])
                if dist[val, vals] < i["vdw"] + j["vdw"]:
                    # ADD TO ATOM LIST
                    if not j["id"] in i["con"]:
                        i["con"].append(j["id"])
                        j["con"].append(i["id"])

                    con_vwd = True
                    # IF NEITHER I NOR J PART OF A GROUP
                    # ADD THEM TO A NEW GROUP
                    if i["grp_vdw"] is False and j["grp_vdw"] is False:
                        i["grp_vdw"], j["grp_vdw"] = group_vdw, group_vdw
                        group_vdw += 1
                    # IF BOTH HAVE BEEN ASSIGNED TO A DIFF GROUP
                    elif not i["grp_vdw"] is False and not j["grp_vdw"] is False:
                        if i["grp_vdw"] != j["grp_vdw"]:
                            grp_chng = j["grp_vdw"]
                            for k in atmList:
                                if k["grp_vdw"] is grp_chng:
                                    k["grp_vdw"] = i["grp_vdw"]
                    # IF j NOT ASSIGNED
                    elif not i["grp_vdw"] is False and j["grp_vdw"] is False:
                        j["grp_vdw"] = i["grp_vdw"]
                    # IF i NOT ASSIGNED
                    elif not j["grp_vdw"] is False and i["grp_vdw"] is False:
                        i["grp_vdw"] = j["grp_vdw"]


        # IF LONER ATOM PUT IN ITS OWN GROUP
        if not con_dist:
            i["grp_dist"] = group_dist
            group_dist += 1
        if not con_vwd:
            i["grp_vdw"] = group_vdw
            group_vdw += 1


    # REORDER GROUPS STARTING FROM 0
    # CREATE fragList ----------------------------------------------------------------


    if Type == 'check_dist':

        # NUMBER FRAG
        ncat, nani, nnrt, nunk, nrad = 0, 0, 0, 0, 0

        print("-"*40)
        print("SYSTEM USING CUTOFF DISTANCE:")

        totChrg  = 0
        totMult  = 1
        nfrags_dist = 0
        fragList = []

        # FIND DISTANCES
        for grp_dist in range(group_dist):
            fragDict_dist = {}
            fragDict_dist['ids'] = []
            fragDict_dist['syms'] = []
            foundnew = False
            for atm in atmList:
                if atm["grp_dist"] == grp_dist:
                    foundnew = True
                    atm["grp_dist"] = nfrags_dist
                    fragDict_dist['syms'].append(atm['sym'])
                    fragDict_dist['ids'].append(atm['id'])

            if foundnew:
                fragDict_dist['grp'] = nfrags_dist
                # FIND CHARGE/MULT
                if isCation(fragDict_dist['syms'], fragDict_dist['ids']):
                    fragDict_dist["chrg"] = 1
                    fragDict_dist["mult"] = 1
                    fragDict_dist["name"] = "cation" + str(ncat)
                    ncat += 1
                    if totChrg != '?':
                        totChrg += 1

                elif isAnion(fragDict_dist['syms'], fragDict_dist['ids']):
                    fragDict_dist["chrg"] = -1
                    fragDict_dist["mult"] = 1
                    fragDict_dist["name"] = "anion" + str(nani)
                    nani += 1
                    if totChrg != '?':
                        totChrg += -1

                elif isNeutral(fragDict_dist['syms'], fragDict_dist['ids']):
                    fragDict_dist["chrg"] = 0
                    fragDict_dist["mult"] = 1
                    fragDict_dist["name"] = "neutral" + str(nnrt)
                    nnrt += 1


                elif isRadical(fragDict_dist['syms'], fragDict_dist['ids']):
                    fragDict_dist["chrg"] = 0
                    fragDict_dist["mult"] = 2
                    fragDict_dist["name"] = "radical" + str(nrad)
                    nrad += 1
                    totMult = 2

                else:
                    # FIND CHEMICAL FORMULA
                    syms = []
                    chemForm = ''
                    for sym in fragDict_dist['syms']:
                        if sym not in syms:
                            numTimes = fragDict_dist['syms'].count(sym)
                            chemForm += sym + str(numTimes)
                            syms.append(sym)
                    detec("unknown", chemForm, " ".join(str(x+1) for x in fragDict_dist['ids']))
                    fragDict_dist["chrg"] = '?'
                    fragDict_dist["mult"] = '?'
                    fragDict_dist["name"] = "unknown" + str(nunk)
                    nunk += 1
                    totChrg = '?'
                    totMult = '?'

                # FOR NEXT FRAGMENT
                fragList.append(fragDict_dist)
                nfrags_dist += 1


    elif Type == 'check_vdw':

        # CREATE fragList --------------------------------------------------------
        print("-"*40)
        print("SYSTEM USING VDW's RADII:")

        # PROPERTIES
        totChrg = 0
        totMult = 1
        nfrags_vdw = 0
        fragList = []

        # NAMING
        ncat, nani, nntr, nunk, nrad = 0, 0, 0, 0, 0

        for grp_vdw in range(group_vdw):
            fragDict_vdw = {}
            fragDict_vdw['ids'] = []
            fragDict_vdw['syms'] = []
            foundnew = False
            for atm in atmList:
                if atm["grp_vdw"] == grp_vdw:
                    foundnew = True
                    atm["grp_vdw"] = nfrags_vdw
                    fragDict_vdw['syms'].append(atm['sym'])
                    fragDict_vdw['ids'].append(atm['id'])

            if foundnew:
                fragDict_vdw['grp'] = nfrags_vdw
                # FIND CHARGE/MULT
                if isCation(fragDict_vdw['syms'], fragDict_vdw['ids']):
                    fragDict_vdw["chrg"] = 1
                    fragDict_vdw["mult"] = 1
                    fragDict_vdw["name"] = "cation" + str(ncat)
                    ncat += 1
                    if totChrg != '?':
                        totChrg += 1

                elif isAnion(fragDict_vdw['syms'], fragDict_vdw['ids']):
                    fragDict_vdw["chrg"] = -1
                    fragDict_vdw["mult"] = 1
                    fragDict_vdw["name"] = "anion" + str(nani)
                    nani += 1
                    if totChrg != '?':
                        totChrg += -1

                elif isNeutral(fragDict_vdw['syms'], fragDict_vdw['ids']):
                    fragDict_vdw["chrg"] = 0
                    fragDict_vdw["mult"] = 1
                    fragDict_vdw["name"] = "neutral" + str(nntr)
                    nntr += 1

                elif isRadical(fragDict_vdw['syms'], fragDict_vdw['ids']):
                    fragDict_vdw["chrg"] = 0
                    fragDict_vdw["mult"] = 2
                    fragDict_vdw["name"] = "radical" + str(nrad)
                    nrad += 1
                    totMult = 2

                else:
                    # FIND CHEMICAL FORMULA
                    syms = []
                    chemForm = ''
                    for sym in fragDict_vdw['syms']:
                        if sym not in syms:
                            numTimes = fragDict_vdw['syms'].count(sym)
                            chemForm += sym + str(numTimes)
                            syms.append(sym)
                    detec("unknown", chemForm, " ".join(str(x+1) for x in fragDict_vdw['ids']))
                    fragDict_vdw["chrg"] = '?'
                    fragDict_vdw["mult"] = '?'
                    fragDict_vdw["name"] = "unknown" + str(nunk)
                    nunk += 1
                    totChrg = '?'
                    totMult = '?'

                # FOR NEXT FRAGMENT
                fragList.append(fragDict_vdw)
                nfrags_vdw += 1

        print('-'*40)

    ### fragList = {'ids': [21], 'syms': ['Cl'], 'grp_dist': 1, 'chrg': -1, 'mult': 1}
    #for i in fragList:
    #    print(i)

    ### atmList = {'id': 710, 'sym': 'H', 'x': 11.5282, 'y': 7.0276, 'z': -18.5563, 'grp_dist': 80, 'nu': 1.0}
    #for i in atmList:
    #    print(i)
    #print(fragList, atmList, totChrg, totMult)

    return atmList, fragList, totChrg, totMult
Ejemplo n.º 2
0
def fmo(path, File, template, sysData, jobTemp):

    import os, re
    from supercomp import host
    from chemData import pTable
    from templates import fmo_rjnJob
    from templates import fmo_mgsJob
    from templates import fmo_stmJob
    from templates import fmo_gaiJob
    from templates import fmo_monJob
    from templates import fmo_masJob
    from templates import gms_rjnJob
    from templates import gms_mgsJob
    from templates import gms_masJob
    from templates import gms_monJob
    from templates import gms_gaiJob
    from templates import gms_stmJob
    from tempInp import fmo_ions
    from write import write_xyz
    from write import write_gmsInp
    from write import write_job

    # NAME FOR WRITING FILE, DIRS
    ions = False
    name = File.replace('.xyz', '').split('_')[0]

    # MAKE NEW DIR AND NEW PATH
    npath = newDir(path, File, template)

    # UNPACK sysData
    mp2 = False
    fragList, atmList, totChrg, totMult = sysData

    # NUMBER OF FRAGS
    nfrags = len(fragList)

    # CREATE xyzData
    xyzData = []
    for frag in fragList:
        for atm in atmList:
            if atm['id'] in frag['ids']:
                xyzData.append(
                    [atm['sym'], atm['nu'], atm["x"], atm["y"], atm["z"]])

    # TEMPLATE LINES
    input = xyzTemp(path, template, xyzData)
    fmo_input = []

    # IF RUNTYP IS ENERGY MAKE ION JOBS
    for ind in range(len(input)):
        if 'NGROUP' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'NGROUP':
                    in_grp = spl_line[val + 1]
                    if in_grp != str(nfrags):
                        #print('Changing NGROUP to', nfrags)
                        input[ind] = input[ind].\
                        replace('NGROUP=' + in_grp, 'NGROUP=' + str(nfrags))

        # CHECK NFRAG = NO. OF FOUND FRAGMENTS
        if 'NFRAG' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'NFRAG':
                    in_nfrags = spl_line[val + 1]
                    if in_nfrags != str(nfrags):
                        #print('Changing NFRAG  to', nfrags)
                        input[ind] = input[ind].\
                        replace('NFRAG=' + in_nfrags, 'NFRAG=' + str(nfrags))

        # LIST OF CHARGES FOR FRAGMENTS
        if 'ICHARG' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if 'ICHARG' in bit:
                    in_chrg = spl_line[val + 1]
                    chrgs = []
                    for frag in fragList:
                        chrgs.append(frag['chrg'])
                    input[ind] = input[ind].replace('ICHARG(1)=' + in_chrg, \
                            'ICHARG(1)=' + ','.join(str(p) for p in chrgs) + '\n')

        # MULT
        if 'MULT' in input[ind]:
            spl_line = re.split('=', input[ind])
            for val, bit in enumerate(spl_line):
                if 'MULT' in bit:
                    mults = []
                    for frag in fragList:
                        mults.append(frag['mult'])
                    in_chrg = spl_line[val + 1]
                    input[ind] = input[ind].replace('MULT(1)=' + in_chrg,\
                    'MULT(1)=' + ','.join(str(p) for p in mults) + '\n')

        # CHECK IF SPEC FOR ION CALCS
        if 'RUNTYP' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if 'RUNTYP' in bit:
                    if spl_line[val + 1] == 'ENERGY':
                        ions = True

        # MEMORY USED IN INPUT USED FOR JOB MEMORY
        if 'MWORDS' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'MWORDS' in input[ind]:
                    memory = spl_line[val + 1]

        # MEMORY USED IN INPUT FOR JOB MEMORY
        ddi = False
        if 'MEMDDI' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'MEMDDI' in input[ind]:
                    ddi = spl_line[val + 1]

        # FOR FMO_IONS
        if '$MP2' in input[ind]:
            mp2 = input[ind]

        if "GBASIS" in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'GBASIS' in input[ind]:
                    bset = spl_line[val + 1]

    # REMOVE LINES FROM INPUT WITH NEW LIST
    # FOR MANY LINE CHANGES - COORDS, INDAT, ATM LIST
    atmUniq = []
    numUniq = []
    seenA = False
    for line in input:
        if type(line) != list:
            # INDAT MAY BE DIFF NUMBER OF LINES TO NEW INDAT
            if 'INDAT' in line:
                fmo_input.append('    INDAT(1)=0,1,-' +
                                 str(len(fragList[0]['ids'])) + ',\n')
                # REMEMBER WHERE LAST FRAG FINISHED
                n = len(fragList[0]['ids']) + 1
                for frag in fragList:
                    if not frag is fragList[0]:
                        fmo_input.append(' '*13 + '0,' + str(n) + \
                                ',-' + str(n + len(frag['ids']) - 1) + ',\n')
                        n += len(frag['ids'])
                fmo_input.append(' ' * 13 + '0\n')

            # SO NOT PASSED TO ELSE // EXTRA LINES TO DETERMINE FRAGMENT
            elif re.search('^\s*0,[0-9]{1,3},-[0-9]{1,3},\s*$', line) or \
                      re.search('^\s*0\s*$', line):
                pass

            # ATOM LIST MAY BE DIFF NUMBER OF LINES TO NEW ATOM LIST
            elif re.search('^\s*[A-Za-z]*\s*[0-9]*\.0*$', line):
                if not seenA:
                    for i in xyzData:
                        atmUniq.append(i[0])
                        numUniq.append(i[1])
                    atmUniq = list(set(atmUniq))
                    for i in range(len(atmUniq)):
                        for sym, data in pTable.items():
                            if sym == atmUniq[i]:
                                fmo_input.append(' ' + str(atmUniq[i]) + ' ' + \
                                str(data[0]) + '\n')
                    seenA = True

            # EVERY OTHER LINE AS IS
            else:
                fmo_input.append(line)
        else:
            fmo_input.append(line)

    # HARDWARE FOR WRITING
    hw = host()
    if ions:
        # FOR EACH FRAGMENT
        for frag in fragList:
            ifrag = []
            for ID in frag['ids']:
                atm = atmList[ID]
                ifrag.append(
                    [atm['sym'], atm['nu'], atm["x"], atm["y"], atm["z"]])

            # MAKE FOLDER AND XYZ
            if not os.path.isdir(npath + name + '-' + frag["name"]):
                os.mkdir(npath + name + '-' + frag["name"])
            write_xyz(npath + name + '-' + frag["name"] + '/',
                      name + '-' + frag["name"], ifrag)

            # INPUT AND OUTPUT FOR JOB
            input = fmo_ions(str(frag['chrg']), ifrag, bset, mp2)
            write_gmsInp(npath + name + '-' + frag["name"] + '/',
                         name + '-' + frag["name"], input)

            # WRITE JOB
            lines = False

            if jobTemp:
                # lines = job_replace(name, jobTemp)
                lines = job_replace(name + '-' + frag["name"], jobTemp)
            else:
                if hw == 'rjn':
                    lines = gms_rjnJob(name + '-' + frag["name"])
                elif hw == 'mgs':
                    lines = gms_mgsJob(name + '-' + frag["name"])
                elif hw == 'gai':
                    lines = gms_gaiJob(name + '-' + frag["name"])
                elif hw == 'mas':
                    lines = gms_masJob(name + '-' + frag["name"])
                elif hw == 'mon':
                    lines = gms_monJob(name + '-' + frag["name"])
                elif hw == 'stm':
                    lines = gms_stmJob(name + '-' + frag["name"])

            if lines:
                write_job(npath + name + '-' + frag["name"] + '/',
                          name + '-' + frag["name"], lines)

    # -------------------------------------------------

    # WRITE INP
    write_gmsInp(npath, name, fmo_input)

    # WRITE JOB
    lines = False

    if jobTemp:
        lines = job_replace(name, jobTemp)
    else:
        if hw == 'rjn':
            lines = fmo_rjnJob(name, nfrags, memory, ddi)
        elif hw == 'mgs':
            lines = fmo_mgsJob(name, nfrags, memory, ddi)
        elif hw == 'stm':
            lines = fmo_stmJob(name, nfrags, memory, ddi)
        elif hw == 'gai':
            lines = fmo_gaiJob(name)  #, nfrags, memory, ddi)
        elif hw == 'mon':
            lines = fmo_monJob(name, nfrags, memory, ddi)
        elif hw == 'mas':
            lines = fmo_masJob(name, nfrags, memory, ddi)

    if lines:
        write_job(npath, name, lines)
Ejemplo n.º 3
0
def g09_geom(path, File, opt):
    import os, re
    from general import eof
    from chemData import pTable

    ginc = False
    vals = False
    end = False
    coords = []
    geom = []
    hold = []
    pattern = "-?[0-9]*\.[0-9]*\s*"

    lines = eof(path, File, 0.4)
    # GRAB GINC VALUES
    if opt:
        for line in lines:
            if re.search("GINC", line):
                # FINDS LAST CASE OF 'GINC'
                coords = []
                ginc = True
            if ginc:
                coords.append(line)
        j = ''
        # FOR ALL LINES
        for i in coords:
            # SUM ALL LINES TOGETHER AS CONTINUOUR STRING
            j = j + i
        j = j.replace('\n', '')
        j = j.replace(' ', '')
        j = j.split('\\')

        # AND OPT GEOM
        geom = []
        pat = ",-?[0-9]*\.[0-9]*"
        for line in j:
            if re.search("^[A-Z]{1,2},?[a-z]?[0-9]*" + \
            pat + pat + pat + "$", line):
                line = line.split(',')
                # SOMETIMES AN EXTRA COLUMN RETRIEVED?
                geom.append([line[0], line[len(line) - 3],\
                line[len(line) - 2], line[len(line) - 1]])

    # FIND SECOND LAST STEP; LAST MAY NOT BE FINISHED
    else:
        with open(path + File, 'r+') as f:
            try:
                for line in f:
                    if vals:
                        if end:
                            if re.search("------------*", line):
                                vals = False
                        if re.search(pattern + pattern + pattern, line):
                            hold.append(line)
                            end = True
                    if "Coordinates" in line:
                        vals = True
                        end = False
                        coords = hold
                        hold = []
            except:
                print("Corrupt line passed in file ", File)

            hold = []
            for i in coords:
                i = i.split()
                hold.append([i[1], i[3], i[4], i[5]])
            for i in hold:
                for el, data in pTable.items():
                    if data[0] == int(i[0]):
                        geom.append([el, i[1], i[2], i[3]])
                        break

    return geom
Ejemplo n.º 4
0
def fmo(path, File, template, sysData, jobTemp):

    import os, re
    from general import hardware
    from chemData import pTable
    from templates import fmo_rjnJob
    from templates import fmo_mgsJob
    from templates import fmo_gaiJob
    from templates import gms_rjnJob
    from templates import gms_mgsJob
    from templates import gms_gaiJob
    from tempInp import fmo_ions
    from write import write_xyz
    from write import write_gmsInp
    from write import write_job

    # NAME FOR WRITING FILE, DIRS
    name = File.replace('.xyz', '').split('_')[0]

    # MAKE NEW DIR AND NEW PATH
    npath = newDir(path, File, template)

    # UNPACK sysData
    fmo = True
    mp2 = False
    fragList, atmList, totChrg, totMult = sysData

    # NUMBER OF FRAGS
    nfrags = len(fragList)

    # MAKE xyzData
    xyzData = []
    # USE LIST OF IDS TO APPEND
    for frag in fragList:
        for ID in frag['ids']:
            atm = atmList[ID]
            xyzData.append(
                [atm['sym'], atm['nu'], atm["x"], atm["y"], atm["z"]])

    # TEMPLATE LINES
    input = xyzTemp(path, template, xyzData)
    #print(input)
    fmo_input = []
    # ONE LINE REPLACEMENTS - NO MULT YET ***
    # IF RUNTYP IS ENERGY MAKE ION JOBS
    ions = False
    for ind in range(len(input)):
        if 'NGROUP' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'NGROUP':
                    in_grp = spl_line[val + 1]
                    if in_grp != str(nfrags):
                        #print('Changing NGROUP to', nfrags)
                        input[ind] = input[ind].\
                        replace('NGROUP=' + in_grp, 'NGROUP=' + str(nfrags))

        # CHECK NFRAG = NO. OF FOUND FRAGMENTS
        if 'NFRAG' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'NFRAG':
                    in_nfrags = spl_line[val + 1]
                    if in_nfrags != str(nfrags):
                        #print('Changing NFRAG  to', nfrags)
                        input[ind] = input[ind].\
                        replace('NFRAG=' + in_nfrags, 'NFRAG=' + str(nfrags))

        # LIST OF CHARGES FOR FRAGMENTS
        if 'ICHARG' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if 'ICHARG' in bit:
                    in_chrg = spl_line[val + 1]
                    chrgs = []
                    for frag in fragList:
                        chrgs.append(frag['chrg'])
                    input[ind] = input[ind].replace('ICHARG(1)=' + in_chrg, \
                            'ICHARG(1)=' + ','.join(str(p) for p in chrgs) + '\n')

        # MULT
        if 'MULT' in input[ind]:
            spl_line = re.split('=', input[ind])
            for val, bit in enumerate(spl_line):
                if 'MULT' in bit:
                    mults = []
                    for frag in fragList:
                        mults.append(frag['mult'])
                    in_chrg = spl_line[val + 1]
                    input[ind] = input[ind].replace('MULT(1)=' + in_chrg,\
                    'MULT(1)=' + ','.join(str(p) for p in mults) + '\n')

        # CHECK IF SPEC FOR ION CALCS
        if 'RUNTYP' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if 'RUNTYP' in bit:
                    if spl_line[val + 1] == 'ENERGY':
                        ions = True

        # MEMORY USED IN INPUT USED FOR JOB MEMORY
        if 'MWORDS' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'MWORDS' in input[ind]:
                    memory = spl_line[val + 1]

        # MEMORY USED IN INPUT FOR JOB MEMORY
        ddi = False
        if 'MEMDDI' in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'MEMDDI' in input[ind]:
                    ddi = spl_line[val + 1]

        # FOR FMO_IONS
        if '$MP2' in input[ind]:
            mp2 = input[ind]

        if "GBASIS" in input[ind]:
            spl_line = re.split('=| ', input[ind])
            for val, bit in enumerate(spl_line):
                if bit == 'GBASIS' in input[ind]:
                    bset = spl_line[val + 1]

    # REMOVE LINES FROM INPUT WITH NEW LIST
    # FOR MANY LINE CHANGES - COORDS, INDAT, ATM LIST
    atmUniq = []
    numUniq = []
    seenA = False
    for line in input:
        if type(line) != list:
            # INDAT MAY BE DIFF NUMBER OF LINES TO NEW INDAT
            if 'INDAT' in line:
                fmo_input.append('    INDAT(1)=0,1,-' +
                                 str(fragList[0]['ids'][-1] + 1) + ',\n')
                for frag in fragList:
                    if not frag is fragList[0]:
                        fmo_input.append(' '*13 + '0,' + str(frag['ids'][0] + 1) + \
                                ',-' + str(frag['ids'][-1] + 1) + ',\n')
                fmo_input.append(' ' * 13 + '0\n')

            # SO NOT PASSED TO ELSE // EXTRA LINES TO DETERMINE FRAGMENT
            elif re.search('^\s*0,[0-9]{1,3},-[0-9]{1,3},\s*$', line) or \
                      re.search('^\s*0\s*$', line):
                pass
            # ATOM LIST MAY BE DIFF NUMBER OF LINES TO NEW ATOM LIST
            elif re.search('^\s*[A-Za-z]*\s*[0-9]*\.0*$', line):
                if not seenA:
                    for i in xyzData:
                        atmUniq.append(i[0])
                        numUniq.append(i[1])
                    atmUniq = list(set(atmUniq))
                    for i in range(len(atmUniq)):
                        for sym, data in pTable.items():
                            if sym == atmUniq[i]:
                                fmo_input.append(' ' + str(atmUniq[i]) + ' ' + \
                                str(data[0]) + '\n')
                    seenA = True
            # EVERY OTHER LINE AS IS
            else:
                fmo_input.append(line)
        else:
            fmo_input.append(line)

    # HARDWARE FOR WRITING
    hw = hardware()
    # XYZ OF IONS ------------------------------------
    if ions:
        ncat = 0
        nani = 0
        nnrt = 0
        nunk = 0
        # FOR EACH FRAGMENT
        for i, frag in enumerate(fragList):
            ifrag = []
            for val, atm in enumerate(xyzData):
                if val in frag['ids']:
                    ifrag.append(atm)

            # IN CASE QUESTION MARK
            try:
                if frag['chrg'] < 0:
                    ion = 'anion' + str(nani)
                    nani += 1
                elif frag['chrg'] > 0:
                    ion = 'cation' + str(ncat)
                    ncat += 1
                else:
                    ion = 'neutral' + str(nnrt)
                    nnrt += 1
            except:
                if frag['chrg'] == '?':
                    ion = 'unknown' + str(nunk)
                    nunk += 1

            # MAKE FOLDER AND XYZ
            if not os.path.isdir(npath + ion):
                os.mkdir(npath + ion)
            write_xyz(npath + ion + '/', ion, ifrag)

            # INPUT AND OUTPUT FOR JOB
            input = fmo_ions(str(frag['chrg']), ifrag, bset, mp2)
            write_gmsInp(npath + ion + '/', ion, input)

            # WRITE JOB
            if hw == 'rjn':
                lines = gms_rjnJob(ion, memory, ddi)
            if hw == 'mgs':
                lines = gms_mgsJob(ion, memory, ddi)
            if hw == 'gai':
                lines = gms_gaiJob(ion, memory, ddi)
            write_job(npath + fol + '/', ion, lines)

    # -------------------------------------------------

    # WRITE INP
    write_gmsInp(npath, name, fmo_input)

    # WRITE JOB
    if jobTemp:
        lines = job_replace(name, jobTemp)
    else:
        if hw == 'rjn':
            lines = fmo_rjnJob(name, nfrags, memory, ddi)
        if hw == 'mgs':
            lines = fmo_mgsJob(name, nfrags, memory, ddi)
        if hw == 'gai':
            lines = fmo_gaiJob(name)  #, nfrags, memory, ddi)

    write_job(npath, name, lines)