const float minimalAtomDistance{ 0.5 },
minEnergy{ -9.9 };
float HbondEnergy{ 0 };
- float distanceON{ 0 }, distanceCH{ 0 }, distanceOH{ 0 }, distanceCN{ 0 };
+ float distanceNO{ 0 }, distanceHC{ 0 }, distanceHO{ 0 }, distanceNC{ 0 };
if( !(Donor.is_proline) ){
+ if (Acceptor.getIndex(backboneAtomTypes::AtomC) && Acceptor.getIndex(backboneAtomTypes::AtomO)
+ && Donor.getIndex(backboneAtomTypes::AtomN) && ( Donor.getIndex(backboneAtomTypes::AtomH) || (initParams.addHydrogens) ) ) // Kinda ew
+ {
- distanceON = CalculateAtomicDistances(
- Donor.getIndex(backboneAtomTypes::AtomO), Acceptor.getIndex(backboneAtomTypes::AtomN), fr, pbc);
- distanceCN = CalculateAtomicDistances(
- Donor.getIndex(backboneAtomTypes::AtomC), Acceptor.getIndex(backboneAtomTypes::AtomN), fr, pbc);
-
- switch(initParams.mode){
- case modeType::Classique: {
- distanceOH = distanceON;
- distanceCH = distanceCN;
- break;
- }
- default: {
- distanceOH = CalculateAtomicDistances(
- Donor.getIndex(backboneAtomTypes::AtomO), Acceptor.getIndex(backboneAtomTypes::AtomH), fr, pbc);
- distanceCH = CalculateAtomicDistances(
- Donor.getIndex(backboneAtomTypes::AtomC), Acceptor.getIndex(backboneAtomTypes::AtomH), fr, pbc);
- break;
- }
- }
+ distanceNO = CalculateAtomicDistances(
+ Donor.getIndex(backboneAtomTypes::AtomN), Acceptor.getIndex(backboneAtomTypes::AtomO), fr, pbc);
+ distanceNC = CalculateAtomicDistances(
+ Donor.getIndex(backboneAtomTypes::AtomN), Acceptor.getIndex(backboneAtomTypes::AtomC), fr, pbc);
+
+ if (initParams.addHydrogens){
+ if (Acceptor.prevResi != nullptr){
+ rvec atomH{};
+ float prevCODist {CalculateAtomicDistances(Acceptor.prevResi->getIndex(backboneAtomTypes::AtomC), Acceptor.prevResi->getIndex(backboneAtomTypes::AtomO), fr, pbc)};
+ for (int i{XX}; i <= ZZ; ++i){
+ float prevCO = fr.x[Acceptor.prevResi->getIndex(backboneAtomTypes::AtomC)][i] - fr.x[Acceptor.prevResi->getIndex(backboneAtomTypes::AtomO)][i];
+ atomH[i] = prevCO / prevCODist;
+ }
+ distanceHO = CalculateAtomicDistances(Donor.getIndex(backboneAtomTypes::AtomO), atomH, fr, pbc);
+ distanceHC = CalculateAtomicDistances(Donor.getIndex(backboneAtomTypes::AtomC), atomH, fr, pbc);
+ }
+ else{
+ distanceHO = distanceNO;
+ distanceHC = distanceNC;
+ }
+ }
+ else {
+ distanceHO = CalculateAtomicDistances(
+ Donor.getIndex(backboneAtomTypes::AtomH), Acceptor.getIndex(backboneAtomTypes::AtomO), fr, pbc);
+ distanceHC = CalculateAtomicDistances(
+ Donor.getIndex(backboneAtomTypes::AtomH), Acceptor.getIndex(backboneAtomTypes::AtomC), fr, pbc);
+ }
- if (Donor.getIndex(backboneAtomTypes::AtomC) && Donor.getIndex(backboneAtomTypes::AtomO)
- && Acceptor.getIndex(backboneAtomTypes::AtomN) && ( Acceptor.getIndex(backboneAtomTypes::AtomH) || (initParams.mode == modeType::Classique) ) ) // Kinda ew
- {
if (CalculateAtomicDistances(
Donor.getIndex(backboneAtomTypes::AtomCA), Acceptor.getIndex(backboneAtomTypes::AtomCA), fr, pbc)
< minimalCAdistance)
{
- if ((distanceON < minimalAtomDistance) || (distanceCH < minimalAtomDistance)
- || (distanceOH < minimalAtomDistance) || (distanceCN < minimalAtomDistance))
+ if ((distanceNO < minimalAtomDistance) || (distanceHC < minimalAtomDistance)
+ || (distanceHO < minimalAtomDistance) || (distanceNC < minimalAtomDistance))
{
HbondEnergy = minEnergy;
{
HbondEnergy =
kCouplingConstant
- * ((1 / distanceON) + (1 / distanceCH) - (1 / distanceOH) - (1 / distanceCN));
+ * ((1 / distanceNO) + (1 / distanceHC) - (1 / distanceHO) - (1 / distanceNC));
HbondEnergy = std::round(HbondEnergy * 1000) / 1000;
+ std::cout << "Calculated ENERGY - " << HbondEnergy << std::endl;
+
if ( HbondEnergy < minEnergy ){
HbondEnergy = minEnergy;
}
// if ( HbondEnergy < -0.5 ){
-// std::cout << "HBOND exists cause of energy" << std::endl; // NOT working in original DSSP
+// std::cout << "HBOND exists cause of energy" << std::endl;
// }
return r.norm(); // TODO * gmx::c_nm2A; if not PDB, i guess????
}
+/* Calculate Distance From B to A, where A is only fake coordinates */
+float DsspTool::CalculateAtomicDistances(const int &A, const rvec &B, const t_trxframe &fr, const t_pbc *pbc)
+{
+ gmx::RVec r{ 0, 0, 0 };
+ pbc_dx(pbc, fr.x[A], B, r.as_vec());
+ return r.norm(); // TODO * gmx::c_nm2A; if not PDB, i guess????
+}
+
void DsspTool::initAnalysis(/*const TrajectoryAnalysisSettings &settings,*/const TopologyInformation& top, const initParameters &initParamz)
{
if( proLINE.compare("PRO") == 0 ){
IndexMap[i].is_proline = true;
}
+ IndexMap[i - 1].nextResi = &IndexMap[i];
+
+ IndexMap[i].prevResi = &IndexMap[i - 1];
}
std::string atomname(*(top.atoms()->atomname[static_cast<std::size_t>(*ai)]));
if (atomname == backboneAtomTypeNames[backboneAtomTypes::AtomCA])
{
IndexMap[i]._backboneIndices[static_cast<std::size_t>(backboneAtomTypes::AtomN)] = *ai;
}
- else if (atomname == backboneAtomTypeNames[backboneAtomTypes::AtomH])
+ else if (atomname == backboneAtomTypeNames[backboneAtomTypes::AtomH] && initParamz.addHydrogens == false) // Юзать водород в структуре
{
IndexMap[i]._backboneIndices[static_cast<std::size_t>(backboneAtomTypes::AtomH)] = *ai;
}
real cutoff_; // = 4.0; ???
modeType mode;
NBSearchMethod NBS;
- bool verbose, PPHelices;
+ bool verbose, PPHelices, addHydrogens;
};
enum class backboneAtomTypes : std::size_t
};
struct ResInfo {
- std::array<std::size_t, static_cast<std::size_t>(backboneAtomTypes::Count)> _backboneIndices{ 0, 0, 0, 0, 0 }; // todo something with zeroes
+ std::array<std::size_t, static_cast<std::size_t>(backboneAtomTypes::Count)> _backboneIndices{ 0, 0, 0, 0, 0 }; // TODO something with zeroes
std::size_t getIndex(backboneAtomTypes atomTypeName) const;
t_resinfo *info{nullptr}, *donor[2]{nullptr, nullptr}, *acceptor[2]{nullptr, nullptr};
+ ResInfo *prevResi{nullptr}, *nextResi{nullptr};
float donorEnergy[2]{}, acceptorEnergy[2]{};
- bool is_proline{false}, is_deformed_backbone{false};
+ bool is_proline{false};
};
ResInfo& Acceptor,
const t_trxframe& fr,
const t_pbc* pbc);
- float CalculateAtomicDistances(const int& A, const int& B, const t_trxframe& fr, const t_pbc* pbc);
+ float CalculateAtomicDistances(const int &A, const int &B, const t_trxframe &fr, const t_pbc *pbc);
+ float CalculateAtomicDistances(const int &A, const rvec &B, const t_trxframe &fr, const t_pbc *pbc);
class DsspStorage
{