ocelot.task package¶
Submodules¶
ocelot.task.bzcal module¶
-
class
ocelot.task.bzcal.
DispersionRelationLine
(scheme: str, reci_mat: numpy.ndarray, kcoords: numpy.ndarray, eigens_up: numpy.ndarray, eigens_down: numpy.ndarray, ivb: int, icb: int, linekdata=None, efermi=None)[source]¶ Bases:
object
-
__init__
(scheme: str, reci_mat: numpy.ndarray, kcoords: numpy.ndarray, eigens_up: numpy.ndarray, eigens_down: numpy.ndarray, ivb: int, icb: int, linekdata=None, efermi=None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
plotlinebs
(fname='bands.eps', fitdensity=50, nexbands=2, zerofermi=True, channel='up', yrange=- 2.0, 2.0)[source]¶
-
-
class
ocelot.task.bzcal.
LineSegment
(begin_label: str, end_label: str, kcoords: numpy.ndarray, eigens: numpy.ndarray, iband: int, reci_mat: numpy.ndarray, pltstart: float = 0.0)[source]¶ Bases:
object
-
__init__
(begin_label: str, end_label: str, kcoords: numpy.ndarray, eigens: numpy.ndarray, iband: int, reci_mat: numpy.ndarray, pltstart: float = 0.0)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
fit
(fitdensity=100)[source]¶ fit band structure with spline at a predefined fit density using scipy.interpolate.splev
- Parameters
fitdensity (int) – number of data points along one SEGMENT
- Returns
-
property
frac_direction
¶
-
property
length
¶ length in k space
-
property
max_wi
¶
-
property
min_wi
¶
-
property
pltend
¶
-
ocelot.task.calec module¶
-
class
ocelot.task.calec.
ElectronicCoupling
(sysname, mono_a, mono_b, caltype='gauss')[source]¶ Bases:
object
class to calculate electronic couplings from Gaussian w. fmo formalism
micro wf:
get 2 monomer structure in cart coords, label them mono_a and mono_b
concatenate 2 input structure to give dimer structure, fmo requires site sequence remains intact
run calculations to give mono_a_fchk, mono_b_fchk, dimer_fchk, dimer_log.
suggested keywords nosymm pop=full iop(3/33=1,3/59=8) int(acc2e=12)
four files in 3. will be used to give ec, the results is a list of lists,
fields are [‘#mo_a’, ‘#mo_b’, ‘e_mo_a’, ‘e_mo_b’, ‘J_12’, ‘S_12’, ‘e^eff_1’, ‘e^eff_2’, ‘J^eff_12’, ‘dE_12’]
all in eV
-
__init__
(sysname, mono_a, mono_b, caltype='gauss')[source]¶ setup ec calculations :param sysname: :param mono_a: pmg mol obj :param mono_b: pmg mol obj :param caltype: ‘gauss’ or ‘zindo’
-
static
calculate_coupling_gauss
(mono_a_fchk_string, mono_b_fchk_string, dimer_fchk_string, dimer_log_string, homo1=0, lumo1=0, homo2=0, lumo2=0)[source]¶
-
static
create_matrix
(matrix, elements, nbf)[source]¶ create lower triangular matrix from list of matrix elements indexed like so:
[[0,0,0,…,0], [1,2,0,…,0], [3,4,5,…,0]]
nbf is number of basis functions
elements is a list of matrix elements indexed like above, e.g. [0,1,2,3,…]
Gaussian prints every 5 columns, so the mod5 accounts for this
-
static
g09_calculate_coupling
(homo_monomer_a, lumo_monomer_a, homo_monomer_b, lumo_monomer_b, nbf_monomer_a, f_d, s_d, cfrag)[source]¶ - Parameters
homo_monomer_a –
lumo_monomer_a –
homo_monomer_b –
lumo_monomer_b –
nbf_monomer_a –
f_d –
s_d –
cfrag –
- Returns
“MO 1”, “MO 2”, “e 1, eV”, “e 2, eV”, “J_12, eV”, “S_12”, “e^eff_1, eV”, “e^eff_2, eV”, “J^eff_12, eV”, “dE_12, eV”
-
static
get_overlap
(g09logstring, nbf)[source]¶ Extracts the overlap matrix from a Gaussian logfile string. Returns a numpy matrix.
ocelot.task.confgen module¶
given a molecular specification (smiles) get distinct conformers via rdkit
the molecule should already have hydrogen explicitly added, i.e. from hsmiles or addhs
- workflow:
rdkit conf gen [prune_in_gen] –> [ff minimize] –> prune_by_energy –> prune_by_rmsd
ref http://rdkit.blogspot.com/2014/08/optimizing-diversity-picking-in-rdkit.html https://squonk.it/docs/cells/RDKit%20Diverse%20Subset%20Picker/ https://github.com/skearnes/rdkit-utils/blob/master/rdkit_utils/conformers.py https://new.pharmacelera.com/scripts/rdkit-conformation-generation-script/ https://www.rdkit.org/UGM/2012/Ebejer_20110926_RDKit_1stUGM.pdf http://rdkit.org/docs_temp/Cookbook.html#parallel-conformation-generation
-
class
ocelot.task.confgen.
ConfGen
(m: rdkit.Chem.rdchem.Mol, mol_name='rdmol', nconf=None, mingen=50, maxgen=300, nthread=0, rngseed=- 1, prune_in_gen=None, minimize=True, ff='MMFF94s', prune_by_energy=100)[source]¶ Bases:
object
-
static
GetBestRMSMatrix
(mol)[source]¶ the problem of AllChem.GetConformerRMSMatrix(m) is that it uses AlignMolConformers this assumes atom order is the same, which may not be the case if the molecule has symmetry
-
__init__
(m: rdkit.Chem.rdchem.Mol, mol_name='rdmol', nconf=None, mingen=50, maxgen=300, nthread=0, rngseed=- 1, prune_in_gen=None, minimize=True, ff='MMFF94s', prune_by_energy=100)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
static
cluster_by_rmsd
(m: rdkit.Chem.rdchem.Mol, energies, rmsd_threshold: float)[source]¶ conformer in m should be assigned consecutive ids with delta=1
- Parameters
energies –
m –
rmsd_threshold –
- Returns
-
static
ideal_conf_num
(some_molecule: rdkit.Chem.rdchem.Mol, min=50, max=300)[source]¶ return the number of conformers that need to be generated to sample the conf space of a molecule
-
static
ocelot.task.dbwrite module¶
-
class
ocelot.task.dbwrite.
DBChromophore
(hsmiles: str = None, smiles: str = None, ChromophoreConfs: [<class 'str'>] = None)[source]¶ Bases:
monty.json.MSONable
-
class
ocelot.task.dbwrite.
DBChromophoreConformer
(geo: dict = None, index: int = None, anion_geo: int = None, cation_geo: int = None, AIP: float = None, AEA: float = None, reorg: float = None, tddft: dict = None, vs0s1: float = None, vs0t1: float = None, as0t1: float = None, Chromophore: str = None)[source]¶ Bases:
ocelot.task.dbwrite.DBschema
-
__init__
(geo: dict = None, index: int = None, anion_geo: int = None, cation_geo: int = None, AIP: float = None, AEA: float = None, reorg: float = None, tddft: dict = None, vs0s1: float = None, vs0t1: float = None, as0t1: float = None, Chromophore: str = None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
ocelot.task.dbwrite.
DBConfiguration
(calculation_stage: str = None, unwrap_structure: pymatgen.core.structure.Structure = None, molconformers: [<class 'str'>] = None, z: int = None, occupancy: float = None, backbone_structure: pymatgen.core.structure.Structure = None, crystal: str = None, config_index: int = None, is_major: bool = None, packing_data: dict = None, hop_data_geodict: dict = None, hop_data_zindo: dict = None, hop_data_dft: dict = None, fb_opt_structure: pymatgen.core.structure.Structure = None, ar_opt_structure: pymatgen.core.structure.Structure = None, fb_opt_ebs: dict = None, ar_opt_ebs: dict = None, energetics: dict = None)[source]¶ Bases:
ocelot.task.dbwrite.DBschema
-
__init__
(calculation_stage: str = None, unwrap_structure: pymatgen.core.structure.Structure = None, molconformers: [<class 'str'>] = None, z: int = None, occupancy: float = None, backbone_structure: pymatgen.core.structure.Structure = None, crystal: str = None, config_index: int = None, is_major: bool = None, packing_data: dict = None, hop_data_geodict: dict = None, hop_data_zindo: dict = None, hop_data_dft: dict = None, fb_opt_structure: pymatgen.core.structure.Structure = None, ar_opt_structure: pymatgen.core.structure.Structure = None, fb_opt_ebs: dict = None, ar_opt_ebs: dict = None, energetics: dict = None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
ocelot.task.dbwrite.
DBCrystal
(lattice: pymatgen.core.lattice.Lattice = None, smiles: str = None, hsmiles: str = None, chromophore: str = None, elements: str = None, identifier: str = None, source: str = None, cif_string: str = None, disorder_location: str = None, disorder_class: str = None, configurations: [<class 'str'>] = None, major_configuration: [<class 'str'>] = None, results: dict = None)[source]¶ Bases:
ocelot.task.dbwrite.DBschema
-
__init__
(lattice: pymatgen.core.lattice.Lattice = None, smiles: str = None, hsmiles: str = None, chromophore: str = None, elements: str = None, identifier: str = None, source: str = None, cif_string: str = None, disorder_location: str = None, disorder_class: str = None, configurations: [<class 'str'>] = None, major_configuration: [<class 'str'>] = None, results: dict = None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
ocelot.task.dbwrite.
DBMolConformer
(mc_index: int = None, molconformer: dict = None, Configuration: str = None, GeoBoneConf: dict = None, GeoBoneConf_descriptors: dict = None, GeoScsConf: dict = None, GeoScsConf_descriptors: dict = None, ChromBoneConf: dict = None, ChromBoneConf_descriptors: dict = None, ChromScsConf: dict = None, ChromScsConf_descriptors: dict = None)[source]¶ Bases:
ocelot.task.dbwrite.DBschema
-
__init__
(mc_index: int = None, molconformer: dict = None, Configuration: str = None, GeoBoneConf: dict = None, GeoBoneConf_descriptors: dict = None, GeoScsConf: dict = None, GeoScsConf_descriptors: dict = None, ChromBoneConf: dict = None, ChromBoneConf_descriptors: dict = None, ChromScsConf: dict = None, ChromScsConf_descriptors: dict = None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
ocelot.task.dftd3 module¶
-
class
ocelot.task.dftd3.
DFTD3
(jobname, structure, func='pbe', damping='bj', dftd2=False, cutoff=94.8683, cnthr=40)[source]¶ Bases:
object
-
__init__
(jobname, structure, func='pbe', damping='bj', dftd2=False, cutoff=94.8683, cnthr=40)[source]¶ init a dftd3 calculation
- Parameters
jobname –
structure –
func –
damping –
dftd2 – DFT-D2 version.10
cutoff – a cutoff value for the dispersion interaction. The default value is 95 a.u.
cnthr – a cutoff value for the calculation of the CN. The default value is 40 a.u. and should be kept fixed
-
property
cmd_option_string
¶
-
ocelot.task.emtensor module¶
-
class
ocelot.task.emtensor.
EmTensor
(kcoord, iband: int, stepsize: float, reci_mat: numpy.ndarray, eigens=None, st=3)[source]¶ Bases:
object
-
__init__
(kcoord, iband: int, stepsize: float, reci_mat: numpy.ndarray, eigens=None, st=3)[source]¶ init a effective tensor calculation
- Parameters
kcoord – in frac, center of the stencil
iband – starts from 0
stepsize – in 1/A
reci_mat – in 1/A, physics convention (with 2 pi)
eigens – in eV
st (int) – size of the stencil, 3 or 5
-
eigens
: np.ndarray = None¶
-
property
kcart
¶
-
property
kmesh
¶
-
ocelot.task.hop module¶
-
class
ocelot.task.hop.
Hop
(config, zindobin=None, zindoctbin=None, zindolib=None, wdir='/home/ai/ocelot_api/doc', gaussbin=None)[source]¶ Bases:
object
-
__init__
(config, zindobin=None, zindoctbin=None, zindolib=None, wdir='/home/ai/ocelot_api/doc', gaussbin=None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
static
group_dimers
(dimers)[source]¶ subgroup into dimercollection such that all dimers in one collection share the same ref_omol
- Parameters
dimers –
- Returns
dimercolls: a dict of dimer lists, dimercolls[x] are dimers with i==x
-
static
hopping
(supercell_data, supercell_mesh, cutoff, workdir, motype)[source]¶ a molecule is defined by meshpoint in the supercell mesh (mp_i) and mol index (mol_i) in a cell hopdata[x] gives a list of molecules (represented by [mp_i, mol_i]) that are connected to the molecule [mp_i=0, mol_i=x], including the molecule itself
- Parameters
motype –
supercell_mesh – 3xn meshpoints
supercell_data –
cutoff – in meV
workdir –
- Returns
-
run
(alldimers, calculator='zindo', njobs=None)[source]¶ you should screen alldimers based on geodist before this run
- Parameters
alldimers –
calculator –
njobs –
- Returns
-
static
screen_dimers
(dimer_array, close=True, unique=True)[source]¶ - Parameters
dimer_array – ijk array as in config.get_dimers_array()
close –
unique – apply symmetry in dimer_array
:return a list of dimers that are unique and close
-
static
supercell_proj
(dimer_array, transv_fcs, symdata, super_cell_size, motype, workdir)[source]¶ we look at a supercell, in which the coupling is represented as augmented_data[mp_i][mp_j][i][j] which is the coupling between supercellmesh[mp_i] ith mol and supercellmesh[mp_j] jth mol
- Parameters
motype –
workdir –
dimer_array –
transv_fcs –
symdata –
super_cell_size – 3x1 int tuple e.g. (6, 6, 6)
- Returns
supercellmesh, augmented_data
-
static
unique_ijk
(leni, lenj, lenk)[source]¶ given dimer_array from config.get_dimers_array with symm=False get unique ijk combinations using symmetry dimer_array[i][j][k1] == dimer_array[j][i][k2] where transv_fcs[k1] == -transv_fcs[k2] note there is another symmetry in transv_fcs from cart product, transv_fcs[i] == -transv_fcs[len-i-1] that is k2 == len-k1-1
- Parameters
leni –
lenj –
lenk –
- Returns
-
ocelot.task.idchg module¶
ocelot.task.nics module¶
-
class
ocelot.task.nics.
NICSjob
(omol: ocelot.schema.conformer.MolConformer, nmrscheme='GIAO')[source]¶ Bases:
object
-
__init__
(omol: ocelot.schema.conformer.MolConformer, nmrscheme='GIAO')[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
gen_input
(step_size, nrings, maxnbq, height=1.7, normaldirection=0, charge=None, spin_multiplicity=None, title=None, functional='HF', basis_set='6-31G(d)', route_parameters=None, input_parameters=None, link0_parameters=None, dieze_tag='#P', gen_basis=None)[source]¶ this will return two lists of gauss input string, xticks, xnumbers, pt_idx(ring idx) for plotting
pts are cart coords for bqs
return None if failed
one problem is if the number of ghost atoms cannot be too large, so the param maxnbq is introduced as the max number of ghost atoms that is allowed to show in one input file for other param docs see nics_line_scan_path and pymatgen.io.gassian
-
static
get_zzmstensor
(logstring, tensor_kw='GIAO Magnetic shielding tensor')[source]¶ - Parameters
logstring – string of gauss log file
tensor_kw – default ‘GIAO Magnetic shielding tensor’
- Returns
a list of floats, zz components of magnetic shield tensor from log string
-
lgfr
: [RingConformer] = None¶
-
nics_line_scan_path
(step_size, nrings, height=1.7, normaldirection=0)[source]¶ pts, n x 3 array, cart coords for path
ring_idx, n x 1 array, ring_idx[i] represents the ring idx of the ring in which pts[i] reside
xnumbers, the path travelled
xticks, seg ends position on path
- Parameters
step_size – in AA
nrings – only look at this # of rings in lfr
height – default 1.7 is suggested by Stanger, Chemistry–A European Journal 20.19 (2014): 5673-5688
normaldirection – 0 or 1, as it’s possible to have two different paths for bent molecules
- Returns
pts, ring_idx, xnumbers, xticks
-
nics_sigma_structure
(normal_idx=0)[source]¶ add hydrogen to all sites on lfr(largest fused rings), and sites that are connected to lfr with double bonds notice this could be different from backbone, as backbone contains other fr connected to lfr with single bond (eg. BDT 3mer)
- param normal_idx
0, 1
- Returns
a MSitelist objects
-
ocelot.task.pkid module¶
-
class
ocelot.task.pkid.
PackingIdentifier
(boneconfig)[source]¶ Bases:
object
-
__init__
(boneconfig)[source]¶ identify packing pattern
the input should be a pbc config of terminated backbones
- heuristic rules
10.1039/c7tc02553j, that worked only for small acenes, we want more J. AM. CHEM. SOC. 2004, 126, 4318-4328, this seems quite primitive
finger print Hirshfield 10.1039/c1ce05763d
-
identify_heuristic
()[source]¶ return a dictionary, keys are
n_close_azm_and_parallel, n_close_azm_and_notparallel, n_close_vertical_and_parallel, n_close_vertical_and_notparallel, n_parallel_and_overlap, n_notparallel_and_overlap, packing
these keys are defined based on: close_vertical: d.oslip within [1.5, 4] parallel: d.oangle < 15 deg close_azm: d.oslip <= 1.5 overlap: overlap > 1e-5
variables used: 1. is_not_identical: slip vector norm >= 1e-5 2. is_close: minbonedist < 5.5 3. overlap: project sites onto the plane defined by ovector of ref_mol and ref_mol.geoc,
then get overlap of concave/convex hulls
mindist2d: min distance between two hulls
d.oslip: vertical slip
d.oangle: angle between o_vector
workflow: 1. from bone config get all bone dimers, maxfold=2 2. for each molecule (a) in the unit cell
get first 27*z dimers, sorted by vslipnorm, whose ref_mol is (a)
if identical or not_close, do nothing
get values for the keys
apply classification based on the keys
- Returns
-
ocelot.task.readcif module¶
-
class
ocelot.task.readcif.
ReadCif
(cifstring, source, identifier=None)[source]¶ Bases:
object
-
__init__
(cifstring, source, identifier=None)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
static
where_is_disorder
(c: ocelot.schema.configuration.Config)[source]¶ data[imol] = disorder info in conformer_properties
-
ocelot.task.reorg module¶
-
class
ocelot.task.reorg.
Reorganization
(nopt='nopt.log', copt='copt.log', aopt='aopt.log', ngeo_a='nasp.log', ngeo_c='ncsp.log', ageo_n='ansp.log', cgeo_n='cnsp.log')[source]¶ Bases:
object
class to calculate reorganization energy for holes and electrons from Gaussian output files.
ocelot.task.wtuning module¶
originally written by Sean M. Ryno, Cheng Zhong, Haitao Sun, see /legacy/aw_tuning.py for a certain mol, get tuned w default keywords for gaussian ‘scf=(xqc,fermi,noincfock,ndamp=35,conver=6,vshift=500,novaracc)’ dev-ing
-
class
ocelot.task.wtuning.
WtuningJob
(func='uLC-wHPBE', basis='def2tzvp', name='', nproc=16, mem=50, n_charge=0, n_spin=1, wdir='./', rps={'scf': {'conver': '6', 'fermi': '', 'ndamp': '35', 'noincfock': '', 'novaracc': '', 'vshift': '500', 'xqc': ''}}, scheme='Jh', wbmin=0.05, wbmax=0.5, abmin=0.05, abmax=0.5, gauss_cmd='g16')[source]¶ Bases:
object
-
__init__
(func='uLC-wHPBE', basis='def2tzvp', name='', nproc=16, mem=50, n_charge=0, n_spin=1, wdir='./', rps={'scf': {'conver': '6', 'fermi': '', 'ndamp': '35', 'noincfock': '', 'novaracc': '', 'vshift': '500', 'xqc': ''}}, scheme='Jh', wbmin=0.05, wbmax=0.5, abmin=0.05, abmax=0.5, gauss_cmd='g16')[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
property
alpha_iopstr
¶
-
property
beta_iopstr
¶
-
property
iop_route_params
¶
-
omega_FindC
()[source]¶ Calculate scheme value from extracted data Set the optimization criterion (the value to minimize), available options are: J2—((HOMO-IP)^2+(A_HOMO+EA)^2) Jh—(HOMO-IP) Jl—(LUMO+EA) Jn2—((HOMO-IP)^2+(LUMO+EA)^2) O2—((A_HOMO-LUMO)^2+(C_LUMO-HOMO)^2) :return: Jn, Jl, Jh value (depending on scheme)
-
static
omega_extract
(fn)[source]¶ Pull important data from Log Files after run :param fn: Filename of Log File to be read :return: Energies of Molecule, HOMO and LUMO in eV
-
omega_format
()[source]¶ Format IOp strings based off of omega value, then update route parameters dictionary and input filenames
-
omega_gauss_do
()[source]¶ Run Gaussian in subprocess and wait for termination. Extract data from output when done
-
property
omega_iopstr
¶
-
ocelot.task.zindo module¶
-
class
ocelot.task.zindo.
ZindoJob
(jobname, pmgmol, isdimer=False, mol_A=None, mol_D=None, upconvert=True)[source]¶ Bases:
object
-
__init__
(jobname, pmgmol, isdimer=False, mol_A=None, mol_D=None, upconvert=True)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
static
dimer_run
(jobname, wdir, zindobin, zindoctbin, zindolib, pmgmola, pmgmolb)[source]¶ perfrom zindo calculation for a dimer system, return parsed tmo.dat as NAxND array
- Parameters
jobname –
wdir – working dir
zindobin – binary path
zindoctbin – binary path
zindolib – dir path
pmgmola –
pmgmolb –
- Returns
tmo parsed data, # of AMOs, # of DMOs
-
static
get_hh_coupling
(coupling_data, nmo_a, nmo_d)[source]¶ - Parameters
nmo_a –
nmo_d –
coupling_data – the return value of self.dimer_run()
- Returns
the HOMO-HOMO electronic coupling in meV
-
static
get_ll_coupling
(coupling_data, nmo_a, nmo_d)[source]¶ - Parameters
nmo_a –
nmo_d –
coupling_data – the return value of self.dimer_run()
- Returns
the HOMO-HOMO electronic coupling in meV
-
static
get_valence_electrons
(pmgmol)[source]¶ pymatgen has a weird valence property for element, e.g. for carbon valence is 2 this is just for neutral mol
- Parameters
pmgmol –
- Returns
-
static
inpstring
(pmgmol, RUNTYP='ENERGY', SCFTYP='RHF', ITMAX=500, SCFTOL=1e-06, CISIZE=0, ACTSPC=0, ONAME='zindoout')[source]¶ string of input file, charge and mult will be inherited from pmgmol
- Parameters
pmgmol – pymatgen mol object
RUNTYP – can be ‘ENERGY’ or ‘GEO’ or ‘RPA’ or ‘CI’
SCFTYP – type of scf
ITMAX – max # of iteration
SCFTOL – scf tol
CISIZE – CI basis size
ACTSPC – # of active orbitals in CI
ONAME – output name
- Returns
-
property
legit
¶
-
parse_tmo
(tmofn='tmo.dat')[source]¶ parse tmo.dat as NAxND array, NA is number of MOs in A, ND is number of MOs in D NA, ND is decided by the number of valence eletrons, which is auto-gen by zindo # of valence electronis by zindo auto-gen may NOT be identical to the real # of valence electrons!
- Parameters
tmofn –
- Returns
data[i][j] is the ti of i+1th MO of A and j+1th MO of B
-
Module contents¶
calec: electronic coupling calculation for dimer
nics_scan: io for nics_xy_pi scan
pkid: packing identification
awtuning: tune w/a for lc functional
optic: optical response
hopper: give electronic coupling of dimers, identify whether there’s a percolation route
bands: parse band structure data
geodes: geometric descriptors
emc: effective mass calculations
massage: ec-slip relation
nics: nics scan
homa: HOMA descriptor for aroma
fitbox: get plausible conformation for a pre-defined box (GIXD)
ipae: calculate IP and AE, both intrinsic and apparent
cales: excited state calculations
defgen: generate defects
inspector: sanity check for raw data and inputs generation for other tasks