ggasoftware / indigo

Indigo: a cheminformatics toolkit. Bingo: RDBMS data cartridge for Oracle, MS SQL Server, and PostgreSQL
https://lifescience.opensource.epam.com/indigo
47 stars 15 forks source link

Saving reaction as CML outputs malformed data #10

Open abhimanyusirohi opened 9 years ago

abhimanyusirohi commented 9 years ago

The following code can be used to reproduce the problem. Only the "reactantlist" part is written as CML to out buffer or file. The written CML data is not well formed.

const char* rxnV2 = "$RXN\r\nDiels Alder V2000\r\n  \r\n\r\n  2  1\r\n$MOL\r\n\r\n\r\n\r\n  6  5  0  0  0  0  0  0  0  0999 V2000\r\n    0.6489    0.9959    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.0656    0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.0656   -0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.6489   -0.9959    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.6489    0.8250    0.0000 R1  0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.6489   -0.8250    0.0000 R2  0  0  0  0  0  0  0  0  0  0  0  0\r\n  1  2  2  0        0\r\n  2  3  1  0        0\r\n  3  4  2  0        0\r\n  2  5  1  0        0\r\n  3  6  1  0        0\r\nM  END\r\n$MOL\r\n\r\n\r\n\r\n  4  3  0  0  0  0  0  0  0  0999 V2000\r\n   -0.2917    0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.2917   -0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.2917    0.9959    0.0000 R3  0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.2917   -0.9959    0.0000 R4  0  0  0  0  0  0  0  0  0  0  0  0\r\n  1  2  2  0        0\r\n  1  3  1  0        0\r\n  2  4  1  0        0\r\nM  END\r\n$MOL\r\n\r\n\r\n\r\n 10 10  0  0  0  0  0  0  0  0999 V2000\r\n   -0.7145    0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.7145   -0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.0000   -0.8250    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.7145   -0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    0.7145    0.4125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n   -0.0000    0.8250    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\r\n    1.4289    0.8250    0.0000 R3  0  0  0  0  0  0  0  0  0  0  0  0\r\n    1.4289   -0.8250    0.0000 R4  0  0  0  0  0  0  0  0  0  0  0  0\r\n   -1.4289    0.8250    0.0000 R1  0  0  0  0  0  0  0  0  0  0  0  0\r\n   -1.4289   -0.8250    0.0000 R2  0  0  0  0  0  0  0  0  0  0  0  0\r\n  1  2  2  0        0\r\n  2  3  1  0        0\r\n  3  4  1  0        0\r\n  4  5  1  0        0\r\n  5  6  1  0        0\r\n  6  1  1  0        0\r\n  5  7  1  0        0\r\n  4  8  1  0        0\r\n  1  9  1  0        0\r\n  2 10  1  0        0\r\nM  END\r\n";
    int rxn = indigoLoadReactionFromBuffer(rxnV2, strlen(rxnV2) + 1);
    int bufHandle = indigoWriteBuffer();
    int saver = indigoCreateSaver(bufHandle, "cml");
    indigoAppend(saver, rxn);
    indigoClose(saver);

    char* out;
    int outSize = 0;
    char* tempBuffer;
    if((indigoToBuffer(bufHandle, &tempBuffer, &outSize) > 0) && (outSize > 0))
    {
        out = new char[outSize];
        memcpy_s(out, outSize, tempBuffer, outSize);
    }

The output is:

<?xml version="1.0" ?>
<cml>
<reaction title="Diels Alder V2000">
<reactantList>
<molecule title="">
  <atomArray>
    <atom id="a0" elementType="C"
         x2="0.648900" y2="0.995900"/>
    <atom id="a1" elementType="C"
         x2="0.065600" y2="0.412500"/>
    <atom id="a2" elementType="C"
         x2="0.065600" y2="-0.412500"/>
    <atom id="a3" elementType="C"
         x2="0.648900" y2="-0.995900"/>
    <atom id="a4" elementType="R1"