Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8063184
Added start of command retrieval with natural language
Dialpuri Jul 15, 2026
bb3ba04
Added Coot Assistant Alpha
Dialpuri Jul 15, 2026
7e24858
Added Coot Assistant Alpha
Dialpuri Jul 15, 2026
28ad048
Added shim files
Dialpuri Jul 21, 2026
fff4975
Updated source code and MMDB implementation
Dialpuri Jul 21, 2026
8404c0c
Added other shims to make Coot compile
Dialpuri Jul 21, 2026
eaeee7a
Updated stubbed functions and formatted implementations
Dialpuri Jul 22, 2026
9183e17
Updated stubbed functions and formatted implementations
Dialpuri Jul 22, 2026
4bc24bb
Fixed bug with null chains
Dialpuri Jul 22, 2026
de11b7f
Updated implementation
Dialpuri Jul 22, 2026
67e3c20
Added infrastructure for safer deletion
Dialpuri Jul 22, 2026
979c23b
Fixed bugs with implementation
Dialpuri Jul 22, 2026
8be3101
Create alternate to MMDBAtom_list in clipper
Dialpuri Jul 22, 2026
412be75
Fix issue with numeric CID defaulting to model
Dialpuri Jul 22, 2026
5a59657
Fix bug with stale owner
Dialpuri Jul 22, 2026
265f85d
Split up implementation and added architecture.md
Dialpuri Jul 23, 2026
fbb466f
CI only on master
Dialpuri Jul 23, 2026
4470831
Add filter to test-molecules-container
Dialpuri Jul 23, 2026
46b25b9
Add audit test to mmdb-shim
Dialpuri Jul 23, 2026
3f7b96f
Merge remote-tracking branch 'upstream/main' into mock-mmdb
Dialpuri Jul 23, 2026
3f29fb6
Change new files to use shims
Dialpuri Jul 23, 2026
f5ad3aa
untrack coot assistant files
Dialpuri Jul 23, 2026
dd7ace4
Removed Coot Assistant infrastructure from this branch
Dialpuri Jul 23, 2026
f90672a
Remove unnecessary files
Dialpuri Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build-coot-with-coot-zerokara.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ name: Coot CI (coot_zerokara build script)

on:
push:
branches:
- main
workflow_dispatch:

jobs:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ class AtomPropertyRampColorRule : public ColorRule {
if (value > endValue) value = endValue;
}
else if (rampType == BFactor){
value= atom->tempFactor;
value= atom->tempFactor();
if (value < startValue) value = startValue;
if (value > endValue) value = endValue;
} else {
Expand Down
4 changes: 2 additions & 2 deletions MoleculesToTriangles/CXXClasses/BondsPrimitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void BondsPrimitive::evaluateGLPrimitives(std::map<std::shared_ptr<ColorRule>, i
unsigned long midpointIndex = 0;
int iBond = 0;
for (; centralAtomPntr != bonds.end(); ++centralAtomPntr, iAtom++){
FCXXCoord atom1Coord(centralAtomPntr->first->x, centralAtomPntr->first->y, centralAtomPntr->first->z, 0.);
FCXXCoord atom1Coord(centralAtomPntr->first->x(), centralAtomPntr->first->y(), centralAtomPntr->first->z(), 0.);
FCXXCoord atom1Color = colorScheme->colorForAtom(centralAtomPntr->first, handles);
for (int i=0; i<4; i++) {
vertexColorArray[iAtom].vertex[i] = atom1Coord[i];
Expand All @@ -54,7 +54,7 @@ void BondsPrimitive::evaluateGLPrimitives(std::map<std::shared_ptr<ColorRule>, i
std::vector<mmdb::Atom *>::iterator bondedAtomPntr = centralAtomPntr->second.begin();
for (; bondedAtomPntr != centralAtomPntr->second.end(); ++bondedAtomPntr, iMidpoint++){
midpointIndex = bonds.size() + iMidpoint;
FCXXCoord atom2Coord((*bondedAtomPntr)->x, (*bondedAtomPntr)->y, (*bondedAtomPntr)->z, 0.);
FCXXCoord atom2Coord((*bondedAtomPntr)->x(), (*bondedAtomPntr)->y(), (*bondedAtomPntr)->z(), 0.);
FCXXCoord midpoint = (atom1Coord + atom2Coord) / 2.;
for (int i=0; i<4; i++) {
vertexColorArray[midpointIndex].vertex[i] = midpoint[i];
Expand Down
4 changes: 2 additions & 2 deletions MoleculesToTriangles/CXXClasses/CylindersPrimitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@

void CylindersPrimitive::addHalfAtomBond(mmdb::Atom* atom1, FCXXCoord &atom1Color, mmdb::Atom* atom2, FCXXCoord &atom2Color, float cylinderRadius)
{
FCXXCoord coord1(atom1->x, atom1->y, atom1->z);
FCXXCoord coord2(atom2->x, atom2->y, atom2->z);
FCXXCoord coord1(atom1->x(), atom1->y(), atom1->z());
FCXXCoord coord2(atom2->x(), atom2->y(), atom2->z());

addHalfAtomBondWithCoords(coord1, atom1, atom1Color, coord2,atom2, atom2Color, cylinderRadius);
}
Expand Down
8 changes: 4 additions & 4 deletions MoleculesToTriangles/CXXClasses/DiscreteSegment.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,25 +54,25 @@ class DiscreteSegment {
}
void addCalpha(mmdb::Atom* calpha){
calphas.push_back(calpha);
calphaCoords.push_back(FCXXCoord (calpha->x, calpha->y, calpha->z, 1.0f));
calphaCoords.push_back(FCXXCoord (calpha->x(), calpha->y(), calpha->z(), 1.0f));
anisoValues.push_back(std::make_tuple(1.0f, 1.0f, 1.0f));
}
void addCalpha(mmdb::Atom* calpha, float radius){
calphas.push_back(calpha);
calphaCoords.push_back(FCXXCoord (calpha->x, calpha->y, calpha->z, radius));
calphaCoords.push_back(FCXXCoord (calpha->x(), calpha->y(), calpha->z(), radius));
anisoValues.push_back(std::make_tuple(1.0f, 1.0f, 1.0f));
}
void addCalpha(mmdb::Atom* calpha, float ax, float ay, float az){
calphas.push_back(calpha);
calphaCoords.push_back(FCXXCoord (calpha->x, calpha->y, calpha->z, 1.0f));
calphaCoords.push_back(FCXXCoord (calpha->x(), calpha->y(), calpha->z(), 1.0f));
anisoValues.push_back(std::make_tuple(ax, ay, az));
}
std::tuple<float, float, float> anisoFor(float xVal) {
FCXXCoord aniso = anisoSpline.coordForXEquals(xVal);
return std::make_tuple(aniso.x(), aniso.y(), aniso.z());
}
FCXXCoord operator [] (int i) {
return FCXXCoord (calphas[i]->x, calphas[i]->y, calphas[i]->z);
return FCXXCoord (calphas[i]->x(), calphas[i]->y(), calphas[i]->z());
}
int nCalphas() {
return int(calphas.size());
Expand Down
6 changes: 3 additions & 3 deletions MoleculesToTriangles/CXXClasses/FlatFanPrimitive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ void FlatFanPrimitive::generateArrays()
int index = 0;
for (; iAtom<atoms.size(); iAtom++){
mmdb::Atom* atom = atoms[iAtom];
FCXXCoord atomCoord(atom->x, atom->y, atom->z);
FCXXCoord atomCoord(atom->x(), atom->y(), atom->z());
centre += atomCoord;
size_t lastIAtom = iAtom-1;
if (iAtom == 0) lastIAtom = atoms.size()-1;
mmdb::Atom* lastAtom = atoms[lastIAtom];
FCXXCoord lastAtomCoord(lastAtom->x, lastAtom->y, lastAtom->z);
FCXXCoord lastAtomCoord(lastAtom->x(), lastAtom->y(), lastAtom->z());

size_t nextIAtom = iAtom+1;
if (nextIAtom == atoms.size()) nextIAtom = 0;
mmdb::Atom* nextAtom = atoms[nextIAtom];
FCXXCoord nextAtomCoord(nextAtom->x, nextAtom->y, nextAtom->z);
FCXXCoord nextAtomCoord(nextAtom->x(), nextAtom->y(), nextAtom->z());

FCXXCoord vecAB(lastAtomCoord-atomCoord);
FCXXCoord vecAC(nextAtomCoord-atomCoord);
Expand Down
44 changes: 22 additions & 22 deletions MoleculesToTriangles/CXXClasses/MolecularRepresentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ int MolecularRepresentation::drawSpheres()
for (int i=0; i<nSelAtoms; i++){
mmdb::Atom* atom1 = SelAtom[i];
FCXXCoord atom1Color = colorScheme->colorForAtom(atom1, handles);
FCXXCoord atom1Coord(atom1->x,atom1->y, atom1->z);
FCXXCoord atom1Coord(atom1->x(),atom1->y(), atom1->z());
float atomRadius = CXXUtils::getAtomRadius(mmdb, atom1) * radiusMultiplier;

balls->addBall(atom1Coord, atom1Color, atomRadius);
Expand Down Expand Up @@ -147,7 +147,7 @@ int MolecularRepresentation::drawBondsAsCylinders()
if (atom1->isInSelection(selHnd)){
FCXXCoord atom1Color = colorScheme->colorForAtom(atom1, handles);

FCXXCoord atom1Coord(atom1->x,atom1->y, atom1->z);
FCXXCoord atom1Coord(atom1->x(),atom1->y(), atom1->z());
balls->addBall(atom1Coord, atom1Color, ballRadius);

//Because we might be restricted to GL_SHORT_INTs in the index array (don't ask !)
Expand All @@ -165,21 +165,21 @@ int MolecularRepresentation::drawBondsAsCylinders()
int nBondedAtoms;
mmdb::AtomBond* bondedAtoms;
atom1->GetBonds(bondedAtoms, nBondedAtoms);
FCXXCoord coord1(atom1->x, atom1->y, atom1->z);
FCXXCoord coord1(atom1->x(), atom1->y(), atom1->z());
for (int iOtherAtom = 0; iOtherAtom < nBondedAtoms; iOtherAtom++){
mmdb::Atom* atom2 = bondedAtoms[iOtherAtom].atom;
if (atom2->GetIndex()>iAtom && atom2->isInSelection(selHnd)){

//Nasty kludge here...MMDB's MakeBonds screws up where there are multiple conformations
bool doContinue = false;
if (!strcmp(atom1->altLoc,"") &&
!strcmp(atom2->altLoc,"")) {
if (!strcmp(atom1->altLoc(),"") &&
!strcmp(atom2->altLoc(),"")) {
doContinue = true;
}
else {
float dx = atom1->x - atom2->x;
float dy = atom1->y - atom2->y;
float dz = atom1->z - atom2->z;
float dx = atom1->x() - atom2->x();
float dy = atom1->y() - atom2->y();
float dz = atom1->z() - atom2->z();
float dist = sqrtf (dx*dx + dy*dy + dz*dz);
if (dist < 1.9f) doContinue = true;
}
Expand Down Expand Up @@ -242,8 +242,8 @@ int MolecularRepresentation::drawHydrogenBonds()
mmdb::Atom* atom2 = selAtoms[contact.id2];
mmdb::Residue* residue1 = atom1->GetResidue();
mmdb::Residue* residue2 = atom2->GetResidue();
std::string atom1Name = std::string(atom1->name);
std::string atom2Name = std::string(atom2->name);
std::string atom1Name = std::string(atom1->GetAtomName());
std::string atom2Name = std::string(atom2->GetAtomName());
#ifdef DEBUG_MINE
std::cout << residue1->GetSeqNum() << " [" << atom1Name << "]" << residue2->GetSeqNum() << "[" << atom2Name << "[" << std::string(" N ") << "]\n";
#endif
Expand All @@ -256,8 +256,8 @@ int MolecularRepresentation::drawHydrogenBonds()
(atom1Name.compare(std::string(" O "))==0 && atom2Name.compare(std::string(" N "))==0)
)
){
FCXXCoord atom1Coord(atom1->x, atom1->y, atom1->z);
FCXXCoord atom2Coord(atom2->x, atom2->y, atom2->z);
FCXXCoord atom1Coord(atom1->x(), atom1->y(), atom1->z());
FCXXCoord atom2Coord(atom2->x(), atom2->y(), atom2->z());
FCXXCoord diff = atom2Coord - atom1Coord;
for (int iStep = 1; iStep < 7; iStep++){
float step = (float)iStep / 8.;
Expand Down Expand Up @@ -308,15 +308,15 @@ int MolecularRepresentation::drawBondsAsNewSticks()
atom2->isInSelection(selHnd)){

//Nasty kludge here...MMDB's MakeBonds screws up where there are multiple conformations
if (!strcmp(atom1->altLoc,"") &&
!strcmp(atom2->altLoc,"")) {
if (!strcmp(atom1->altLoc(),"") &&
!strcmp(atom2->altLoc(),"")) {
sticks->addPair(atom1, atom2);
nBonds++;
}
else {
float dx = atom1->x - atom2->x;
float dy = atom1->y - atom2->y;
float dz = atom1->z - atom2->z;
float dx = atom1->x() - atom2->x();
float dy = atom1->y() - atom2->y();
float dz = atom1->z() - atom2->z();
float dist = sqrtf (dx*dx + dy*dy + dz*dz);
if (dist < 1.9f) {
sticks->addPair(atom1, atom2);
Expand Down Expand Up @@ -384,7 +384,7 @@ int MolecularRepresentation::drawDishyBases()

auto riboseAtomIter = dishyBaseIter->ribose_atoms.begin();
for (; riboseAtomIter!= dishyBaseIter->ribose_atoms.end(); ++ riboseAtomIter){
FCXXCoord coord((*riboseAtomIter)->x, (*riboseAtomIter)->y, (*riboseAtomIter)->z);
FCXXCoord coord((*riboseAtomIter)->x(), (*riboseAtomIter)->y(), (*riboseAtomIter)->z());
FCXXCoord atomColor = colorScheme->colorForAtom(*riboseAtomIter, handles);
balls->addBall(coord, atomColor, ballRadius);
if (balls->getBalls().size()%100 == 0){
Expand All @@ -403,9 +403,9 @@ int MolecularRepresentation::drawDishyBases()
}
// Draw a stick from ribose_atoms[1] to 1/3 of the way to
// centre.
FCXXCoord atom1Coord(dishyBaseIter->ribose_atoms[1]->x,
dishyBaseIter->ribose_atoms[1]->y,
dishyBaseIter->ribose_atoms[1]->z);
FCXXCoord atom1Coord(dishyBaseIter->ribose_atoms[1]->x(),
dishyBaseIter->ribose_atoms[1]->y(),
dishyBaseIter->ribose_atoms[1]->z());
FCXXCoord basePseudoAtomPosition = atom1Coord + (dishyBaseIter->centre - atom1Coord) / 3.;
cylinder->addHalfAtomBondWithCoords(atom1Coord, dishyBaseIter->ribose_atoms[1], atom1Color,
basePseudoAtomPosition, dishyBaseIter->ribose_atoms[1], atom1Color,
Expand Down Expand Up @@ -500,7 +500,7 @@ int MolecularRepresentation::drawStickBases() {
FCXXCoord atom1Color = colorScheme->colorForAtom(atom_1, handles);
FCXXCoord atom2Color = colorScheme->colorForAtom(atom_2, handles);
cylinder->addHalfAtomBond(atom_1, atom1Color, atom_2, atom2Color, cylinderRadius);
FCXXCoord atom1Coord(atom_2->x,atom_2->y, atom_2->z);
FCXXCoord atom1Coord(atom_2->x(),atom_2->y(), atom_2->z());
balls->addBall(atom1Coord, atom1Color, ballRadius);
}
}
Expand Down
30 changes: 15 additions & 15 deletions MoleculesToTriangles/CXXClasses/MyMolecule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -326,13 +326,13 @@ int MyMolecule::identifySegments(std::vector<DiscreteSegment *> &segments, int s
mmdb::Atom* calpha = atomsOfResidue[iAtom];
if (std::string(calpha->segID) == *segIDIter){
//std::cout << calpha->segID << "oops\n";
if (!strcmp(calpha->name," CA ") &&
if (!strcmp(calpha->GetAtomName()," CA ") &&
calpha->isInSelection(selHnd)){
//Consider only the main alternative location
if (!strcmp(calpha->altLoc,"") ||
!strcmp(calpha->altLoc,"A") ||
calpha->occupancy > 0.5){
FCXXCoord calphaPosition(calpha->x, calpha->y, calpha->z);
if (!strcmp(calpha->altLoc(),"") ||
!strcmp(calpha->altLoc(),"A") ||
calpha->occupancy() > 0.5){
FCXXCoord calphaPosition(calpha->x(), calpha->y(), calpha->z());
FCXXCoord difference = calphaPosition - lastCoord;
float distance = difference.get3DLength();
if (distance > 4.1){
Expand Down Expand Up @@ -370,11 +370,11 @@ int MyMolecule::identifySegments(std::vector<DiscreteSegment *> &segments, int s
residue_p->GetAtomTable(residue_atoms, nAtoms);
for (int iAtom=0; iAtom < nAtoms; iAtom++){
mmdb::Atom* atom_p = residue_atoms[iAtom];
std::string atom_name(atom_p->name);
std::string atom_name(atom_p->GetAtomName());
// if (atom_name == " P ") {
if (atom_name == " C3'") {
if (atom_p->isInSelection(selHnd)) {
FCXXCoord atom_pos(atom_p->x, atom_p->y, atom_p->z);
FCXXCoord atom_pos(atom_p->x(), atom_p->y(), atom_p->z());
FCXXCoord difference = atom_pos - lastCoord;
float distance = difference.get3DLength();
// std::cout << "distance " << distance << std::endl; almost all less than 7.5A
Expand Down Expand Up @@ -475,7 +475,7 @@ int MyMolecule::identifyDishyBases(std::map<mmdb::Chain *, DishyBaseContainer_t>
for (int iAtom=0; iAtom < nAtoms; iAtom++){
mmdb::Atom* atom_p = residue_atoms[iAtom];
if (! atom_p->isTer()) {
std::string atom_alt_conf(atom_p->altLoc);
std::string atom_alt_conf(atom_p->altLoc());
residue_alt_confs_set.insert(atom_alt_conf);
}
}
Expand Down Expand Up @@ -503,8 +503,8 @@ int MyMolecule::identifyDishyBases(std::map<mmdb::Chain *, DishyBaseContainer_t>
std::vector<mmdb::Atom *> ribose_atoms(5,0);
for (int iAtom=0; iAtom < nAtoms; iAtom++){
mmdb::Atom* atom_p = residue_atoms[iAtom];
std::string atom_name(atom_p->name);
std::string atom_alt_conf(atom_p->altLoc);
std::string atom_name(atom_p->GetAtomName());
std::string atom_alt_conf(atom_p->altLoc());
if (atom_alt_conf.empty() ||
(residue_alt_confs_set.find(atom_alt_conf) != residue_alt_confs_set.end())) {
if (std::find(ref_base_names.begin(), ref_base_names.end(), atom_name) != ref_base_names.end()) {
Expand All @@ -530,19 +530,19 @@ int MyMolecule::identifyDishyBases(std::map<mmdb::Chain *, DishyBaseContainer_t>
//
FCXXCoord ribose_centre;
for (std::size_t i=0; i<5; i++) {
FCXXCoord pos(ribose_atoms[i]->x, ribose_atoms[i]->y, ribose_atoms[i]->z);
FCXXCoord pos(ribose_atoms[i]->x(), ribose_atoms[i]->y(), ribose_atoms[i]->z());
ribose_centre += pos;
}
ribose_centre *= 0.2;
FCXXCoord base_centre;
for (std::size_t i=0; i<base_atoms.size(); i++) {
FCXXCoord pos(base_atoms[i]->x, base_atoms[i]->y, base_atoms[i]->z);
FCXXCoord pos(base_atoms[i]->x(), base_atoms[i]->y(), base_atoms[i]->z());
base_centre += pos;
}
base_centre /= float(base_atoms.size());
std::vector<FCXXCoord> base_atom_positions(base_atoms.size());
for (unsigned int i=0; i<base_atoms.size(); i++)
base_atom_positions[i] = FCXXCoord(base_atoms[i]->x, base_atoms[i]->y, base_atoms[i]->z);
base_atom_positions[i] = FCXXCoord(base_atoms[i]->x(), base_atoms[i]->y(), base_atoms[i]->z());
DishyPlaneLSQ_t lsq(base_atom_positions);
FCXXCoord base_normal = lsq.normal();
DishyBase_t db(base_centre, base_normal, radius, ribose_atoms, ribose_centre);
Expand Down Expand Up @@ -598,8 +598,8 @@ int MyMolecule::identifyBonds()
mmdb::Atom* CA_i = residue->GetAtom("CA", " C", "*");
mmdb::Atom* CA_i_minus_1 = lastResidue->GetAtom("CA", " C", "*");
if (CA_i != 0 && CA_i_minus_1 != 0) {
FCXXCoord Coord_CA_i( CA_i->x, CA_i->y, CA_i->z);
FCXXCoord Coord_CA_i_minus_1( CA_i_minus_1->x, CA_i_minus_1->y, CA_i_minus_1->z);
FCXXCoord Coord_CA_i( CA_i->x(), CA_i->y(), CA_i->z());
FCXXCoord Coord_CA_i_minus_1( CA_i_minus_1->x(), CA_i_minus_1->y(), CA_i_minus_1->z());
FCXXCoord delta = (Coord_CA_i-Coord_CA_i_minus_1);
if(delta.get3DLength()<4.1){
mmdb::Atom* N_i = residue->GetAtom("N", " N", "*");
Expand Down
2 changes: 1 addition & 1 deletion MoleculesToTriangles/CXXClasses/SecondaryColorScheme.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class SecondaryColorScheme : public ColorScheme {
FCXXCoord result = FCXXCoord (1.,1.,1.,0.);
std::vector<SecondaryColorPair>::iterator pair = pairs.begin();
while (pair != pairs.end()){
if (atom->residue->SSE == pair->getSecondary()){
if (atom->GetResidue()->SSE == pair->getSecondary()){
result = pair->getColor();
}
pair++;
Expand Down
Loading