newmen/versatile-diamond

View on GitHub
engine/hand-generations/src/reactions/typical/dimer_formation_near_bridge.cpp

Summary

Maintainability
Test Coverage
#include "dimer_formation_near_bridge.h"

const char DimerFormationNearBridge::__name[] = "dimer formation near bridge";

double DimerFormationNearBridge::RATE()
{
    static double value = getRate("DIMER_FORMATION_NEAR_BRIDGE");
    return value;
}

void DimerFormationNearBridge::find(BridgeCTsi *target)
{
    Atom *anchor = target->atom(0);
    eachNeighbour(anchor, &Diamond::front_100, [target](Atom *neighbour) {
        if (neighbour->is(5))
        {
            auto neighbourSpec = neighbour->specByRole<BridgeCRs>(5);
            assert(neighbourSpec);

            SpecificSpec *targets[2] = {
                target,
                neighbourSpec
            };

            create<DimerFormationNearBridge>(targets);
        }
    });
}

void DimerFormationNearBridge::find(BridgeCRs *target)
{
    Atom *anchor = target->atom(1);
    eachNeighbour(anchor, &Diamond::front_100, [target](Atom *neighbour) {
        if (neighbour->is(28))
        {
            auto neighbourSpec = neighbour->specByRole<BridgeCTsi>(28);
            assert(neighbourSpec);

            SpecificSpec *targets[2] = {
                neighbourSpec,
                target
            };

            create<DimerFormationNearBridge>(targets);
        }
    });
}

void DimerFormationNearBridge::doIt()
{
    SpecificSpec *bridgeCTsi = target(0);
    SpecificSpec *bridgeCRs = target(1);

    assert(bridgeCTsi->type() == BridgeCTsi::ID);
    assert(bridgeCRs->type() == BridgeCRs::ID);

    Atom *atoms[2] = { bridgeCTsi->atom(0), bridgeCRs->atom(1) };
    Atom *a = atoms[0], *b = atoms[1];

    assert(a->is(28));
    assert(b->is(5));

    a->bondWith(b);

    if (a->is(2)) a->changeType(21);
    else a->changeType(20);

    b->changeType(32);

    Finder::findAll(atoms, 2);
}