matteoferla/Fragmenstein

View on GitHub
documentation/logging_and_debugging.md

Summary

Maintainability
Test Coverage
## Logging

Logging is handled via the `logging` module. The handler is not defined however.
This is true for `Victor`, `Fragmenstein`, `Igor`, `Rectifier` and the dependency `Params`.

In `Victor` the logger is a class attribute called `.journal`, in the other it's simply `.log`.

Victor has a shorthand for adding a file or console handler.

    import logging
    Victor.enable_stdout(level=logging.DEBUG)
    Victor.enable_logfile(level=logging.DEBUG)

To change the level quickly just run it again.

## Error

If an error occurs, it will be caught and logged and the user will just get a log error.
If instead one wants to have the error be left uncaught:

    Victor.error_to_catch = ()
    
The error `ConnectionError` gets used internally (for bond problems, not internet ones) 
and is caught regardless of this.

## Steps

During merging and rectification, odd things are bound to happen.
Given a `Victor` instance `victor`, this could be done to make a pymol session to see what happened
at each step:

    import pymol2
    from rdkit import Chem
    with pymol2.PyMOL() as pymol:
        for hit in victor.fragmenstein.hits:
            # this may differ from victor.hits —the latter are not collapsed.
            pymol.cmd.read_molstr(Chem.MolToMolBlock(hit, kekulize=False), hit.GetProp('_Name'))
        for i, mod in enumerate(victor.modifications):
            pymol.cmd.read_molstr(Chem.MolToMolBlock(mod, kekulize=False), f'step{i}')
        pymol.cmd.save('test.pse')

The `Monster` class can trip up, and this can happen at various steps.
`victor.modifications` contains a stack of the various step, such as the collapsed rings to the rectification.