Example #1
0
bool InchiLineFormat::read(const std::string &formula, chemkit::Molecule *molecule)
{
    // verify formula
    if(formula.empty()){
        return 0;
    }

    QString formulaString = formula.c_str();

    // add `InChI=` to the start if it is not there
    if(formula.compare(0, 6, "InChI=") != 0){
        formulaString.prepend("InChI=");
    }

    // setup input struct
    inchi_InputINCHI input;

    input.szInChI = new char[formulaString.size()+1];
    strncpy(input.szInChI, formulaString.toAscii().data(), formulaString.size()+1);
    input.szOptions = 0;

    // get inchi output
    inchi_OutputStruct output;
    int ret = GetStructFromStdINCHI(&input, &output);
    Q_UNUSED(ret);

    // build molecule from inchi output
    QVector<chemkit::Atom *> atoms(output.num_atoms);

    bool addHydrogens = option("add-hydrogens").toBool();

    // add atoms
    for(int i = 0; i < output.num_atoms; i++){
        inchi_Atom *inchiAtom = &output.atom[i];

        chemkit::Atom *atom = molecule->addAtom(inchiAtom->elname);
        atoms[i] = atom;

        // add implicit hydrogens (if enabled)
        if(addHydrogens){
            for(int j = 0; j < inchiAtom->num_iso_H[0]; j++){
                chemkit::Atom *hydrogen = molecule->addAtom(chemkit::Atom::Hydrogen);
                molecule->addBond(atom, hydrogen);
            }
        }
    }

    // add bonds
    for(int i = 0; i < output.num_atoms; i++){
        inchi_Atom *inchiAtom = &output.atom[i];

        chemkit::Atom *atom = atoms[i];

        for(int j = 0; j < inchiAtom->num_bonds; j++){
            chemkit::Atom *neighbor = atoms[inchiAtom->neighbor[j]];
            molecule->addBond(atom, neighbor, inchiAtom->bond_type[j]);
        }
    }

    // free input and output structures
    delete [] input.szInChI;
    FreeStructFromStdINCHI(&output);

    return true;
}