_ZN9OpenBabel9AliasDataC2Ev:
   61|  5.45k|  AliasData(): OBGenericData("Alias", AliasDataType){ }
_ZNK9OpenBabel9AliasData5CloneEPNS_6OBBaseE:
   63|  2.40k|  virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new AliasData(*this);}
_ZN9OpenBabel9AliasData8SetAliasERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   66|  5.45k|  void SetAlias(const std::string& alias) {_alias = alias;}
_ZN9OpenBabel9AliasData5tableEv:
  111|  7.36k|  {
  112|  7.36k|    static SuperAtomTable t;
  113|  7.36k|    if(t.empty())
  ------------------
  |  Branch (113:8): [True: 7.36k, False: 0]
  ------------------
  114|  7.36k|      LoadFile(t);
  115|  7.36k|    return t;
  116|  7.36k|  }

_ZN9OpenBabel21OBAtomAtomIterAdaptorC2ENSt3__111__wrap_iterIPKPNS_6OBBondEEEPKNS_6OBAtomE:
   82|  40.3M|        : m_iter(iter), m_atom(atom)
   83|  40.3M|      {
   84|  40.3M|      }
_ZN9OpenBabel21OBAtomAtomIterAdaptorppEv:
   89|  96.6M|      {
   90|  96.6M|        ++m_iter;
   91|  96.6M|        return *this;
   92|  96.6M|      }
_ZNK9OpenBabel21OBAtomAtomIterAdaptorneERKS0_:
  107|   116M|      {
  108|   116M|        return m_iter != other.m_iter;
  109|   116M|      }
_ZN9OpenBabel6OBAtom7SetFlagEi:
  154|  1.50M|      void SetFlag(int flag)  { _flags |= flag;   }
_ZN9OpenBabel6OBAtom9UnsetFlagEi:
  156|  4.52M|      void UnsetFlag(int flag) { _flags &= (~(flag)); }
_ZN9OpenBabel6OBAtom7HasFlagEi:
  158|   235M|      bool HasFlag(int flag)  {  return((_flags & flag) ? true : false); }
  ------------------
  |  Branch (158:41): [True: 27.3M, False: 208M]
  ------------------
_ZN9OpenBabel6OBAtom6SetIdxEi:
  187|  1.61G|      void SetIdx(int idx)    { _idx = idx; _cidx = (idx-1)*3; }
_ZN9OpenBabel6OBAtom5SetIdEm:
  188|  10.7M|      void SetId(unsigned long id) { _id = id; }
_ZN9OpenBabel6OBAtom6SetHybEi:
  190|  6.06M|      void SetHyb(int hyb)    { _hyb = hyb; }
_ZN9OpenBabel6OBAtom12SetAtomicNumEi:
  192|  1.30M|      void SetAtomicNum(int atomicnum)    { _ele = (char)atomicnum; }
_ZN9OpenBabel6OBAtom17SetImplicitHCountEj:
  196|  1.44M|      void SetImplicitHCount(unsigned int val)    { _imph = (unsigned char)val; }
_ZN9OpenBabel6OBAtom15SetFormalChargeEi:
  198|   141k|      void SetFormalCharge(int fcharge)   { _fcharge = fcharge; }
_ZN9OpenBabel6OBAtom19SetSpinMultiplicityEs:
  200|   112k|      void SetSpinMultiplicity(short spin){ _spinmultiplicity = spin; }
_ZN9OpenBabel6OBAtom16SetPartialChargeEd:
  206|   509k|      void SetPartialCharge(double pcharge){ _pcharge = pcharge; }
_ZN9OpenBabel6OBAtom11SetCoordPtrEPPd:
  212|  1.60G|      void SetCoordPtr(double **c)        { _c = c; _cidx = GetIdx() ? (GetIdx()-1)*3 : 0; }
  ------------------
  |  Branch (212:61): [True: 1.60G, False: 0]
  ------------------
_ZN9OpenBabel6OBAtom10SetResidueEPNS_9OBResidueE:
  216|  3.98M|      void SetResidue(OBResidue *res)     { _residue=res; }
_ZN9OpenBabel6OBAtom9SetParentEPNS_5OBMolE:
  218|  10.7M|      void SetParent(OBMol *ptr)          { _parent=ptr; }
_ZN9OpenBabel6OBAtom11SetAromaticEb:
  220|  1.97M|      void SetAromatic(bool value=true)                  { SET_OR_UNSET_FLAG(OB_AROMATIC_ATOM); }
  ------------------
  |  |   65|  1.97M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (65:7): [True: 333k, False: 1.63M]
  |  |  ------------------
  |  |   66|  1.97M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel6OBAtom9SetInRingEb:
  222|  4.05M|      void SetInRing(bool value=true)         { SET_OR_UNSET_FLAG(OB_RING_ATOM); }
  ------------------
  |  |   65|  4.05M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (65:7): [True: 1.17M, False: 2.88M]
  |  |  ------------------
  |  |   66|  4.05M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel6OBAtom13ClearCoordPtrEv:
  224|  1.59G|      void ClearCoordPtr()     { _c = nullptr; _cidx=0; }
_ZNK9OpenBabel6OBAtom15GetFormalChargeEv:
  230|  71.8M|      int          GetFormalCharge()  const { return(_fcharge);    }
_ZNK9OpenBabel6OBAtom12GetAtomicNumEv:
  232|  1.00G|      unsigned int GetAtomicNum()     const { return((unsigned int)_ele); }
_ZNK9OpenBabel6OBAtom10GetIsotopeEv:
  234|  50.5M|      unsigned short int GetIsotope() const { return(_isotope);    }
_ZNK9OpenBabel6OBAtom19GetSpinMultiplicityEv:
  237|  57.2M|      int          GetSpinMultiplicity() const { return(_spinmultiplicity); }
_ZNK9OpenBabel6OBAtom6GetIdxEv:
  245|  5.37G|      unsigned int GetIdx()           const { return((int)_idx);  }
_ZNK9OpenBabel6OBAtom8GetIndexEv:
  246|  1.51G|      unsigned int GetIndex() const { return _idx - 1; }
_ZNK9OpenBabel6OBAtom5GetIdEv:
  247|  15.9M|      unsigned long GetId() const { return _id; }
_ZNK9OpenBabel6OBAtom16GetCoordinateIdxEv:
  250|   480k|      unsigned int GetCoordinateIdx() const { return((int)_cidx); }
_ZNK9OpenBabel6OBAtom17GetExplicitDegreeEv:
  252|  17.5M|      unsigned int GetExplicitDegree() const { return (unsigned int)_vbond.size(); }
_ZNK9OpenBabel6OBAtom14GetTotalDegreeEv:
  254|  3.31M|      unsigned int GetTotalDegree() const { return (unsigned int)(_vbond.size() + _imph); }
_ZNK9OpenBabel6OBAtom17GetImplicitHCountEv:
  262|  52.2M|      unsigned char GetImplicitHCount() const { return _imph; };
_ZNK9OpenBabel6OBAtom4GetXEv:
  271|   475M|      double      GetX() const   {        return(x());    }
_ZNK9OpenBabel6OBAtom4GetYEv:
  273|   475M|      double      GetY() const  {        return(y());    }
_ZNK9OpenBabel6OBAtom4GetZEv:
  275|   475M|      double      GetZ() const  {        return(z());    }
_ZNK9OpenBabel6OBAtom1xEv:
  280|   475M|      double      x() const {
  281|   475M|        if (_c)            return((*_c)[_cidx]);
  ------------------
  |  Branch (281:13): [True: 1.29M, False: 474M]
  ------------------
  282|   474M|        else               return _v.x();
  283|   475M|      }
_ZNK9OpenBabel6OBAtom1yEv:
  285|   475M|      double      y() const {
  286|   475M|        if (_c)            return((*_c)[_cidx+1]);
  ------------------
  |  Branch (286:13): [True: 1.30M, False: 474M]
  ------------------
  287|   474M|        else               return _v.y();
  288|   475M|      }
_ZNK9OpenBabel6OBAtom1zEv:
  290|   475M|      double      z() const {
  291|   475M|        if (_c)            return((*_c)[_cidx+2]);
  ------------------
  |  Branch (291:13): [True: 1.29M, False: 474M]
  ------------------
  292|   474M|        else               return _v.z();
  293|   475M|      }
_ZN9OpenBabel6OBAtom9GetParentEv:
  311|   762M|      OBMol     *GetParent()        {return((OBMol*)_parent);}
_ZN9OpenBabel6OBAtom10BeginBondsEv:
  324|     31|        { return(_vbond.begin()); }
_ZNK9OpenBabel6OBAtom8GetBondsEv:
  329|   119M|      OBAtomBondRange GetBonds() const { return {_vbond.begin(), _vbond.end()}; }
_ZNK9OpenBabel6OBAtom7GetNbrsEv:
  337|  20.1M|      OBAtomAtomRange GetNbrs() const { return { {_vbond.begin(), this}, {_vbond.end()} }; }
_ZN9OpenBabel6OBAtom7AddBondEPNS_6OBBondE:
  377|  27.0M|      void AddBond(OBBond *bond) { _vbond.push_back(bond); }
_ZN9OpenBabel6OBAtom10InsertBondERNSt3__111__wrap_iterIPPNS_6OBBondEEES4_:
  381|  39.5k|        {
  382|  39.5k|          _vbond.insert(i, bond);
  383|  39.5k|        }
_ZN9OpenBabel6OBAtom10HasResidueEv:
  427|   219k|      bool HasResidue()    { return(_residue != nullptr);    }
_ZN9OpenBabel6OBAtom13HasSingleBondEv:
  507|   175k|      bool HasSingleBond()    {        return(HasBondOfOrder(1));    }
_ZN9OpenBabel6OBAtom13HasDoubleBondEv:
  509|   507k|      bool HasDoubleBond()    {        return(HasBondOfOrder(2));    }

_ZN9OpenBabel13OBGenericDataD2Ev:
  202|  3.13M|    virtual ~OBGenericData()    {}
_ZN9OpenBabel13OBGenericData12SetAttributeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  208|  1.12M|    {        _attr = v;        }
_ZN9OpenBabel13OBGenericData9SetOriginENS_10DataOriginE:
  210|  2.78M|    void SetOrigin(const DataOrigin s) { _source = s; }
_ZNK9OpenBabel13OBGenericData12GetAttributeEv:
  213|  7.19M|    {        return(_attr);    }
_ZNK9OpenBabel13OBGenericData11GetDataTypeEv:
  216|   139M|    {        return(_type);    }
_ZN9OpenBabel6OBBaseD2Ev:
  234|  25.9M|        {
  235|  25.9M|          if (!_vdata.empty())
  ------------------
  |  Branch (235:15): [True: 2.19M, False: 23.7M]
  ------------------
  236|  2.19M|            {
  237|  2.19M|              std::vector<OBGenericData*>::iterator m;
  238|  4.95M|              for (m = _vdata.begin();m != _vdata.end();m++)
  ------------------
  |  Branch (238:39): [True: 2.76M, False: 2.19M]
  ------------------
  239|  2.76M|                delete *m;
  240|  2.19M|              _vdata.clear();
  241|  2.19M|            }
  242|  25.9M|        }
_ZN9OpenBabel6OBBase7SetDataEPNS_13OBGenericDataE:
  298|  3.14M|        {
  299|  3.14M|          if(d) _vdata.push_back(d);
  ------------------
  |  Branch (299:14): [True: 3.12M, False: 22.7k]
  ------------------
  300|  3.14M|        }
_ZN9OpenBabel6OBBase9BeginDataEv:
  324|  18.4M|        { return(_vdata.begin());        }
_ZN9OpenBabel6OBBase7EndDataEv:
  327|  20.4M|        { return(_vdata.end());          }
_ZN9OpenBabel7OBRangeIPNS_6OBAtomENS_21OBAtomAtomIterAdaptorEEC2ES3_S3_:
  338|  20.1M|      OBRange(Iter begin, Iter end) : m_begin{begin}, m_end{end}
  339|  20.1M|      {
  340|  20.1M|      }
_ZN9OpenBabel7OBRangeIPNS_6OBAtomENSt3__111__wrap_iterIPKS2_EEEC2ES7_S7_:
  338|  1.91M|      OBRange(Iter begin, Iter end) : m_begin{begin}, m_end{end}
  339|  1.91M|      {
  340|  1.91M|      }
_ZN9OpenBabel7OBRangeIPNS_6OBBondENSt3__111__wrap_iterIPKS2_EEEC2ES7_S7_:
  338|   120M|      OBRange(Iter begin, Iter end) : m_begin{begin}, m_end{end}
  339|   120M|      {
  340|   120M|      }
_ZNK9OpenBabel7OBRangeIPNS_6OBAtomENS_21OBAtomAtomIterAdaptorEE5beginEv:
  342|  20.1M|      Iter begin() const { return m_begin; }
_ZNK9OpenBabel7OBRangeIPNS_6OBAtomENS_21OBAtomAtomIterAdaptorEE3endEv:
  343|  20.1M|      Iter end() const { return m_end; }
_ZNK9OpenBabel7OBRangeIPNS_6OBAtomENSt3__111__wrap_iterIPKS2_EEE5beginEv:
  342|  1.91M|      Iter begin() const { return m_begin; }
_ZNK9OpenBabel7OBRangeIPNS_6OBAtomENSt3__111__wrap_iterIPKS2_EEE3endEv:
  343|  1.91M|      Iter end() const { return m_end; }
_ZNK9OpenBabel7OBRangeIPNS_6OBBondENSt3__111__wrap_iterIPKS2_EEE5beginEv:
  342|   120M|      Iter begin() const { return m_begin; }
_ZNK9OpenBabel7OBRangeIPNS_6OBBondENSt3__111__wrap_iterIPKS2_EEE3endEv:
  343|   120M|      Iter end() const { return m_end; }
_ZN9OpenBabel6OBBase12CastAndClearINS_5OBMolEEEPT_b:
  267|  15.3k|        {
  268|  15.3k|          T* pOb = dynamic_cast<T*>(this);
  269|  15.3k|          if(pOb && clear)// Clear only if this is of target class
  ------------------
  |  Branch (269:14): [True: 15.3k, False: 0]
  |  Branch (269:21): [True: 15.3k, False: 0]
  ------------------
  270|  15.3k|            Clear();
  271|  15.3k|          return pOb;
  272|  15.3k|        }

_ZN9OpenBabel8OBBitVecC2Ev:
   74|  25.0M|	  :_set(STARTWORDS, 0)
  ------------------
  |  |   45|  25.0M|#define STARTWORDS 10
  ------------------
   75|  25.0M|        { _size = _set.size(); }
_ZN9OpenBabel8OBBitVecC2Ej:
   83|   540k|	  :_set(WORDSIZE_OF_BITSIZE(size_in_bits), 0)
  ------------------
  |  |   42|   540k|#define WORDSIZE_OF_BITSIZE( bit_size ) ( ( bit_size >> WORDROLL ) + (( bit_size & WORDMASK ) ? 1 : 0) )
  |  |  ------------------
  |  |  |  |   38|   540k|#define WORDROLL 5
  |  |  ------------------
  |  |               #define WORDSIZE_OF_BITSIZE( bit_size ) ( ( bit_size >> WORDROLL ) + (( bit_size & WORDMASK ) ? 1 : 0) )
  |  |  ------------------
  |  |  |  |   40|   540k|#define WORDMASK 31
  |  |  ------------------
  |  |  |  Branch (42:71): [True: 529k, False: 11.1k]
  |  |  ------------------
  ------------------
   84|   540k|        { _size = _set.size(); }
_ZN9OpenBabel8OBBitVecC2ERKS0_:
   91|  5.55M|	  :_size(0)
   92|  5.55M|	  	{ (*this) = bv; }
_ZNK9OpenBabel8OBBitVec8FirstBitEj:
  109|   783k|        {
  110|   783k|          return (BitIsSet(bit_offset) ? 0  : NextBit(bit_offset));
  ------------------
  |  Branch (110:19): [True: 799, False: 782k]
  ------------------
  111|   783k|        }
_ZNK9OpenBabel8OBBitVec6EndBitEv:
  115|   443M|      int EndBit() const {  return -1; }
_ZNK9OpenBabel8OBBitVec7GetSizeEv:
  117|  12.1G|      size_t GetSize() const    { return(_size);    }
_ZN9OpenBabel8OBBitVec6ResizeEj:
  129|  1.07M|	  	{
  130|  1.07M|		return ResizeWords( WORDSIZE_OF_BITSIZE(size_in_bits) );
  ------------------
  |  |   42|  1.07M|#define WORDSIZE_OF_BITSIZE( bit_size ) ( ( bit_size >> WORDROLL ) + (( bit_size & WORDMASK ) ? 1 : 0) )
  |  |  ------------------
  |  |  |  |   38|  1.07M|#define WORDROLL 5
  |  |  ------------------
  |  |               #define WORDSIZE_OF_BITSIZE( bit_size ) ( ( bit_size >> WORDROLL ) + (( bit_size & WORDMASK ) ? 1 : 0) )
  |  |  ------------------
  |  |  |  |   40|  1.07M|#define WORDMASK 31
  |  |  ------------------
  |  |  |  Branch (42:71): [True: 1.07M, False: 6.98k]
  |  |  ------------------
  ------------------
  131|  1.07M|		}
_ZN9OpenBabel8OBBitVec11ResizeWordsEj:
  138|  4.64M|	  	{
  139|  4.64M|		if (size_in_words <= _size)
  ------------------
  |  Branch (139:7): [True: 1.00M, False: 3.64M]
  ------------------
  140|  1.00M|		  return false;
  141|  3.64M|		_set.resize(size_in_words, 0); // increase the vector with zeroed bits
  142|  3.64M|		_size = _set.size();
  143|  3.64M|		return true;
  144|  4.64M|		}
_ZNK9OpenBabel8OBBitVec8BitIsSetEj:
  151|  2.70G|        {
  152|  2.70G|		  bool rtn = false;
  153|  2.70G|		  unsigned word_offset = bit_offset >> WORDROLL;
  ------------------
  |  |   38|  2.70G|#define WORDROLL 5
  ------------------
  154|  2.70G|		  if (word_offset < GetSize())
  ------------------
  |  Branch (154:9): [True: 2.47G, False: 230M]
  ------------------
  155|  2.47G|		  	{
  156|  2.47G|			  bit_offset &= WORDMASK;
  ------------------
  |  |   40|  2.47G|#define WORDMASK 31
  ------------------
  157|  2.47G|			  rtn = (( _set[word_offset] >> bit_offset ) & 1);
  158|  2.47G|			}
  159|  2.70G|          return rtn;
  160|  2.70G|        }
_ZN9OpenBabel8OBBitVecoREi:
  199|  59.7M|        {
  200|  59.7M|          SetBitOn(bit_offset);
  201|  59.7M|          return(*this);
  202|  59.7M|        }
_ZNK9OpenBabel8OBBitVecixEi:
  215|  83.4M|        { return BitIsSet(bit_offset); }

_ZNK9OpenBabel21OBAtomAtomIterAdaptordeEv:
  264|  96.7M|  {
  265|  96.7M|    auto bond = *m_iter;
  266|  96.7M|    return m_atom != bond->GetBeginAtom() ? bond->GetBeginAtom() : bond->GetEndAtom();
  ------------------
  |  Branch (266:12): [True: 42.6M, False: 54.1M]
  ------------------
  267|  96.7M|  }
_ZN9OpenBabel6OBBond10GetEndAtomEv:
  172|   558M|      OBAtom *GetEndAtom()      { return(_end);    }
_ZNK9OpenBabel6OBBond7HasFlagEi:
   73|   171M|      bool HasFlag(int flag) const { return ((_flags & flag) != 0); }
_ZN9OpenBabel6OBBond12GetBeginAtomEv:
  168|   647M|      OBAtom *GetBeginAtom()    { return(_bgn);    }
_ZN9OpenBabel6OBBond10GetNbrAtomEPNS_6OBAtomE:
  179|  4.34G|        {
  180|  4.34G|          return((ptr != _bgn)? _bgn : _end);
  ------------------
  |  Branch (180:18): [True: 2.67G, False: 1.67G]
  ------------------
  181|  4.34G|        }
_ZN9OpenBabel6OBBond8SetBeginEPNS_6OBAtomE:
  115|  13.5M|      void SetBegin(OBAtom *begin){          _bgn = begin;      }
_ZN9OpenBabel6OBBond6SetEndEPNS_6OBAtomE:
  117|  13.5M|      void SetEnd(OBAtom *end)    {          _end = end;        }
_ZNK9OpenBabel6OBBond12GetBondOrderEv:
  158|   608M|      unsigned int     GetBondOrder()     const { return(_order); }
_ZNK9OpenBabel6OBBond6GetIdxEv:
  155|  66.3M|      unsigned int     GetIdx()           const { return(_idx);  }
_ZNK9OpenBabel6OBBond15GetBeginAtomIdxEv:
  163|  29.9M|        { return (_bgn ? _bgn->GetIdx() : 0); }
  ------------------
  |  Branch (163:19): [True: 29.9M, False: 0]
  ------------------
_ZNK9OpenBabel6OBBond13GetEndAtomIdxEv:
  166|  10.4M|        { return (_end ? _end->GetIdx() : 0); }
  ------------------
  |  Branch (166:19): [True: 10.4M, False: 0]
  ------------------
_ZNK9OpenBabel6OBBond8GetFlagsEv:
  160|  10.0M|      unsigned int     GetFlags()         const { return(_flags);      }
_ZNK9OpenBabel6OBBond5GetIdEv:
  156|  5.54M|      unsigned long GetId()           const { return _id; }
_ZN9OpenBabel6OBBond7SetFlagEi:
   77|  15.1M|      void SetFlag(int flag) { _flags |= flag; }
_ZN9OpenBabel6OBBond9UnsetFlagEi:
   81|  6.48M|      void UnsetFlag(int flag) { _flags &= (~(flag)); }
_ZN9OpenBabel6OBBond6SetIdxEi:
  110|  12.5G|      void SetIdx(int idx)        {          _idx = idx;        }
_ZN9OpenBabel6OBBond5SetIdEm:
  111|  13.5M|      void SetId(unsigned long id) { _id = id; }
_ZN9OpenBabel6OBBond9SetParentEPNS_5OBMolE:
  119|  13.5M|      void SetParent(OBMol *ptr)  {        _parent= ptr;        }
_ZN9OpenBabel6OBBond11SetAromaticEb:
  128|  1.36M|      void SetAromatic(bool value=true)    { SET_OR_UNSET_FLAG(OB_AROMATIC_BOND); }
  ------------------
  |  |   54|  1.36M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (54:7): [True: 4.94k, False: 1.35M]
  |  |  ------------------
  |  |   55|  1.36M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel6OBBond9SetInRingEb:
  144|  3.90M|      void SetInRing(bool value=true) { SET_OR_UNSET_FLAG(OB_RING_BOND); }
  ------------------
  |  |   54|  3.90M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (54:7): [True: 1.33M, False: 2.56M]
  |  |  ------------------
  |  |   55|  3.90M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel6OBBond10SetClosureEb:
  149|  2.78M|      void SetClosure(bool value=true)     { SET_OR_UNSET_FLAG(OB_CLOSURE_BOND); }
  ------------------
  |  |   54|  2.78M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (54:7): [True: 222k, False: 2.56M]
  |  |  ------------------
  |  |   55|  2.78M|  else     UnsetFlag(X);
  ------------------
_ZNK9OpenBabel6OBBond12GetBeginAtomEv:
  170|   118M|        { return(_bgn);    }
_ZNK9OpenBabel6OBBond10GetEndAtomEv:
  174|   118M|        { return(_end);    }
_ZN9OpenBabel6OBBond9GetParentEv:
  183|   290M|      OBMol  *GetParent()                 {return(_parent);}
_ZN9OpenBabel6OBBond13GetNbrAtomIdxEPNS_6OBAtomE:
  193|   857M|        {
  194|   857M|          if (ptr!=_bgn)
  ------------------
  |  Branch (194:15): [True: 322M, False: 534M]
  ------------------
  195|   322M|            return (_bgn ? _bgn->GetIdx() : 0);
  ------------------
  |  Branch (195:21): [True: 322M, False: 0]
  ------------------
  196|   534M|          else
  197|   534M|            return (_end ? _end->GetIdx() : 0);
  ------------------
  |  Branch (197:21): [True: 534M, False: 0]
  ------------------
  198|   857M|        }
_ZNK9OpenBabel6OBBond13IsWedgeOrHashEv:
  250|  24.5k|      bool IsWedgeOrHash() const { return(HasFlag(WedgeOrHash)); }

_ZN9OpenBabel11OBBondTyper7GetSizeEv:
   42|      1|    size_t GetSize() override { return _fgbonds.size(); }

_ZN9OpenBabel9OBBuilderC2Ev:
   45|  8.44k|      OBBuilder(): _keeprings(false) {}

_ZN9OpenBabel13OBChargeModel6TypeIDEv:
   37|      8|    const char* TypeID() override { return "charges"; }

_ZN9OpenBabel16OBGlobalDataBaseC2Ev:
   60|     11|      OBGlobalDataBase(): _init(false), _dataptr(nullptr) { }
_ZN9OpenBabel16OBGlobalDataBaseD2Ev:
   62|      3|      virtual ~OBGlobalDataBase()                  {}
_ZN9OpenBabel11OBTypeTable7GetSizeEv:
  202|      1|      size_t GetSize() override { return _table.size(); }
_ZN9OpenBabel13OBResidueData7GetSizeEv:
  248|      1|      size_t GetSize() override { return _resname.size(); }

_ZN9OpenBabel12OBDescriptor6TypeIDEv:
   39|     36|  const char* TypeID() override { return "descriptors"; }

_ZN9OpenBabel13OBFingerprint6TypeIDEv:
   46|     18|	{
   47|     18|		return "fingerprints";
   48|     18|	}

_ZN9OpenBabel16OBFFCalculation2D2Ev:
  152|  4.46k|    {
  153|  4.46k|    }
_ZN9OpenBabel12OBForceField14ClearGradientsEv:
  508|  1.78k|    {
  509|       |      // We cannot use memset because IEEE floating point representations
  510|       |      // are not guaranteed by C/C++ standard, but this loop can be
  511|       |      // unrolled or vectorized by compilers
  512|  6.60k|      for (unsigned int i = 0; i < _ncoords; ++i)
  ------------------
  |  Branch (512:32): [True: 4.81k, False: 1.78k]
  ------------------
  513|  4.81k|        _gradientPtr[i] = 0.0;
  514|       |      //      memset(_gradientPtr, '\0', sizeof(double)*_ncoords);
  515|  1.78k|    }
_ZN9OpenBabel12OBForceField6TypeIDEv:
  592|     10|    {
  593|     10|      return "forcefields";
  594|     10|    }
_ZN9OpenBabel12OBForceField11GetGradientEPNS_6OBAtomEi:
  892|    733|    {
  893|    733|      const int coordIdx = (a->GetIdx() - 1) * 3;
  894|    733|      return _gradientPtr + coordIdx;
  895|    733|    }

_ZN9OpenBabel8OBFormatC2Ev:
   52|    234|    OBFormat(){}
_ZN9OpenBabel8OBFormat6TypeIDEv:
   54|    322|    const char* TypeID() override { return "formats"; }
_ZN9OpenBabel8OBFormat5FlagsEv:
  123|  35.3k|    virtual unsigned int Flags() { return 0;};
_ZN9OpenBabel8OBFormat14FormatsMIMEMapEv:
  157|     94|    {
  158|     94|      static PluginMapType m;
  159|     94|      return m;
  160|     94|    }

_ZNK9OpenBabel13OBCommentData5CloneEPNS_6OBBaseE:
   52|    223|    OBGenericData* Clone(OBBase* /*parent*/) const override { return new OBCommentData(*this); }
_ZN9OpenBabel13OBCommentData7SetDataERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   57|    327|    { _data = data; Trim(_data); }
_ZN9OpenBabel14OBExternalBondD2Ev:
   78|    210|    ~OBExternalBond()   {}
_ZNK9OpenBabel10OBPairData5CloneEPNS_6OBBaseE:
  119|  81.5k|      {return new OBPairData(*this);}
_ZN9OpenBabel10OBPairData8SetValueEPKc:
  120|    926|    void    SetValue(const char *v)        {      _value = v;    }
_ZN9OpenBabel10OBPairData8SetValueERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  121|   600k|    void    SetValue(const std::string &v) {      _value = v;    }
_ZNK9OpenBabel10OBPairData8GetValueEv:
  123|  70.0k|    {      return(_value);    }
_ZNK9OpenBabel10OBRingData5CloneEPNS_6OBBaseE:
  267|  22.7k|    OBGenericData* Clone(OBBase* /*parent*/) const override { return nullptr; }
_ZN9OpenBabel10OBRingData7SetDataERNSt3__16vectorIPNS_6OBRingENS1_9allocatorIS4_EEEE:
  273|  27.5k|    {
  274|  27.5k|      _vr = vr;
  275|  27.5k|    }
_ZN9OpenBabel10OBRingData7GetDataEv:
  281|  1.91M|      {
  282|  1.91M|        return(_vr);
  283|  1.91M|      }
_ZNK9OpenBabel10OBUnitCell5CloneEPNS_6OBBaseE:
  322|     17|    {return new OBUnitCell(*this);}
_ZN9OpenBabel10OBUnitCellD2Ev:
  323|     61|    ~OBUnitCell()    {}
_ZN9OpenBabel10OBUnitCell13SetSpaceGroupENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  364|     44|    void SetSpaceGroup(const std::string sg) { _spaceGroup = SpaceGroup::GetSpaceGroup (sg);
  365|     44|                                               _spaceGroupName = sg; }
_ZN9OpenBabel9OBTorsionC2Ev:
  610|  9.31k|    OBTorsion(): _bc((OBAtom *)nullptr, (OBAtom *)nullptr)      {      }
_ZN9OpenBabel9OBTorsionD2Ev:
  618|   906k|    ~OBTorsion()      {}
_ZN9OpenBabel9OBTorsion5EmptyEv:
  623|  2.48M|    bool Empty()    {      return(_bc.first == 0 && _bc.second == 0);    }
  ------------------
  |  Branch (623:35): [True: 531k, False: 1.95M]
  |  Branch (623:53): [True: 531k, False: 0]
  ------------------
_ZNK9OpenBabel9OBTorsion7GetSizeEv:
  635|   284k|    size_t GetSize() const    {      return _ads.size();    }
_ZNK9OpenBabel13OBTorsionData5CloneEPNS_6OBBaseE:
  672|  10.6k|    {return new OBTorsionData(*this);}
_ZN9OpenBabel7OBAngleD2Ev:
  722|  1.68M|      {
  723|  1.68M|        _vertex = nullptr;
  724|  1.68M|      }
_ZNK9OpenBabel11OBAngleData5CloneEPNS_6OBBaseE:
  769|  10.6k|    {return new OBAngleData(*this);}
_ZN9OpenBabel14OBPairTemplateIiEC2Ev:
  136|  9.45k|    OBGenericData("PairData", OBGenericDataType::PairData) {};
_ZNK9OpenBabel14OBPairTemplateIiE5CloneEPNS_6OBBaseE:
  138|  35.9k|      {return new OBPairTemplate<ValueT>(*this);}
_ZN9OpenBabel14OBPairTemplateIiE8SetValueEi:
  139|  9.45k|    void SetValue(const ValueT t)             { _value = t;     }
_ZN9OpenBabel14OBPairTemplateIdEC2Ev:
  136|   282k|    OBGenericData("PairData", OBGenericDataType::PairData) {};
_ZNK9OpenBabel14OBPairTemplateIdE5CloneEPNS_6OBBaseE:
  138|  1.60M|      {return new OBPairTemplate<ValueT>(*this);}
_ZN9OpenBabel14OBPairTemplateIdE8SetValueEd:
  139|   282k|    void SetValue(const ValueT t)             { _value = t;     }

_ZN9OpenBabel14OBGroupContribC2EPKcS2_S2_:
   55|      6|    : OBDescriptor(ID, false), _filename(filename), _descr(descr), _debug(false){}

_ZN9OpenBabel19LineEndingExtractorclERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEE:
  173|  54.7M|  {
  174|  54.7M|    int ch( src.get() ) ;
  175|  54.7M|    switch (ch)
  176|  54.7M|    {
  177|  66.7k|      case 13: //CR or CRLF
  ------------------
  |  Branch (177:7): [True: 66.7k, False: 54.7M]
  ------------------
  178|  66.7k|        if(src.peek() == 10)
  ------------------
  |  Branch (178:12): [True: 765, False: 65.9k]
  ------------------
  179|    765|          src.get(); //CRLF
  180|       |        //fall through
  181|   567k|      case 10: //LF
  ------------------
  |  Branch (181:7): [True: 501k, False: 54.2M]
  ------------------
  182|   567k|        return '\n';
  183|      0|        break;
  184|  54.2M|      default:
  ------------------
  |  Branch (184:7): [True: 54.2M, False: 567k]
  ------------------
  185|  54.2M|        return ch;
  186|  54.7M|    }
  187|  54.7M|  }
_ZN9OpenBabel20FilteringInputStreamINS_19LineEndingExtractorEEC1ERNSt3__113basic_istreamIcNS3_11char_traitsIcEEEE:
  204|  15.3k|        FilteringInputStreambuf<Extractor>(&istream),std::istream(this) {}
_ZN9OpenBabel23FilteringInputStreambufINS_19LineEndingExtractorEEC2EPNSt3__113basic_istreamIcNS3_11char_traitsIcEEEE:
  121|  15.3k|    : mySource(source)
  122|  15.3k|  {
  123|  15.3k|    setg( &myBuffer , &myBuffer , &myBuffer ) ;
  124|  15.3k|  }
_ZN9OpenBabel20FilteringInputStreamINS_19LineEndingExtractorEED2Ev:
  205|  15.3k|    virtual ~FilteringInputStream() {}
_ZN9OpenBabel23FilteringInputStreambufINS_19LineEndingExtractorEE7seekoffExNSt3__18ios_base7seekdirEj:
   75|    119|    {
   76|    119|      setg(  &myBuffer , &myBuffer , &myBuffer  ) ; //ensure next character is from new position
   77|    119|      mySource->seekg(off, way);
   78|    119|      std::streampos ret = mySource->tellg();
   79|       |//      sync();
   80|    119|      return ret;
   81|    119|    };
_ZN9OpenBabel23FilteringInputStreambufINS_19LineEndingExtractorEE7seekposENSt3__14fposI11__mbstate_tEEj:
   85|     31|    {
   86|     31|      setg(  &myBuffer , &myBuffer , &myBuffer  ) ;
   87|       |      //slight hack - if mySource has read past the end, won't let us seek
   88|       |      //and there's no good way to propagate a clear to the original stream
   89|     31|      mySource->clear();
   90|     31|      mySource->seekg(sp);
   91|     31|      std::streampos ret = mySource->tellg();
   92|       |//      sync();
   93|     31|      return ret;
   94|     31|    };
_ZN9OpenBabel23FilteringInputStreambufINS_19LineEndingExtractorEE9underflowEv:
  130|  54.7M|  {
  131|  54.7M|    int result( EOF ) ;
  132|  54.7M|    if( gptr() < egptr() )
  ------------------
  |  Branch (132:9): [True: 0, False: 54.7M]
  ------------------
  133|      0|      result = *gptr() ;
  134|  54.7M|    else if ( mySource != nullptr )
  ------------------
  |  Branch (134:15): [True: 54.7M, False: 0]
  ------------------
  135|  54.7M|    {
  136|  54.7M|      result = myExtractor( *mySource ) ;
  137|  54.7M|      if ( result != EOF )
  ------------------
  |  Branch (137:12): [True: 54.7M, False: 14.5k]
  ------------------
  138|  54.7M|      {
  139|  54.7M|        if( result < 0 || result > UCHAR_MAX )
  ------------------
  |  Branch (139:13): [True: 0, False: 54.7M]
  |  Branch (139:27): [True: 0, False: 54.7M]
  ------------------
  140|      0|          std::cerr << "FilteringInputStreambuf error" << std::endl;
  141|  54.7M|        myBuffer = static_cast<char>(static_cast<unsigned char>(result)) ;
  142|  54.7M|        setg( &myBuffer , &myBuffer , &myBuffer + 1 ) ;
  143|  54.7M|      }
  144|  54.7M|    }
  145|  54.7M|    return result ;
  146|  54.7M|  }

_ZN9OpenBabel9matrix3x3C2Ev:
   50|  16.4k|        {
   51|       |          // Loops are typically unrolled and/or vectorized
   52|  65.9k|          for (unsigned int i = 0; i < 3; ++i)
  ------------------
  |  Branch (52:36): [True: 49.4k, False: 16.4k]
  ------------------
   53|   197k|            for (unsigned int j = 0; j < 3; ++j)
  ------------------
  |  Branch (53:38): [True: 148k, False: 49.4k]
  ------------------
   54|   148k|              ele[i][j] = 0.0;
   55|  16.4k|        }
_ZN9OpenBabel9matrix3x3D2Ev:
   96|  31.7k|      ~matrix3x3() {}
_ZN9OpenBabel9matrix3x3C2Ed:
   59|     44|        {
   60|       |          // Loops are typically unrolled and/or vectorized
   61|    176|          for (unsigned int i = 0; i < 3; ++i)
  ------------------
  |  Branch (61:36): [True: 132, False: 44]
  ------------------
   62|    528|            for (unsigned int j = 0; j < 3; ++j)
  ------------------
  |  Branch (62:38): [True: 396, False: 132]
  ------------------
   63|    396|              ele[i][j] = 0.0;
   64|       |
   65|    176|          for (unsigned int i = 0; i < 3; ++i)
  ------------------
  |  Branch (65:36): [True: 132, False: 44]
  ------------------
   66|    132|            ele[i][i] = s;
   67|     44|        }
_ZN9OpenBabel9matrix3x3C2ENS_7vector3ES1_S1_:
   71|  6.96k|        {
   72|  6.96k|          ele[0][0] = row1.x();
   73|  6.96k|          ele[0][1] = row1.y();
   74|  6.96k|          ele[0][2] = row1.z();
   75|  6.96k|          ele[1][0] = row2.x();
   76|  6.96k|          ele[1][1] = row2.y();
   77|  6.96k|          ele[1][2] = row2.z();
   78|  6.96k|          ele[2][0] = row3.x();
   79|  6.96k|          ele[2][1] = row3.y();
   80|  6.96k|          ele[2][2] = row3.z();
   81|  6.96k|        }
_ZNK9OpenBabel9matrix3x3clEii:
  112|  50.6M|      {
  113|  50.6M|        return ele[row][column];
  114|  50.6M|      }
_ZN9OpenBabel9matrix3x3clEii:
  119|  31.8k|      {
  120|  31.8k|        return ele[row][column];
  121|  31.8k|      }

_ZN9OpenBabel10SpaceGroup11SetHallNameEPKc:
   43|      1|          { m_Hall = name; }
_ZN9OpenBabel10SpaceGroup5SetIdEj:
   45|      1|          { m_id = n; }

_ZN9OpenBabel11transform3dC2ERKNS_9matrix3x3ERKNS_7vector3E:
   42|  9.09k|      transform3d(const matrix3x3 &m, const vector3 &v): matrix3x3(m), vector3(v)
   43|  9.09k|        {
   44|  9.09k|          Normalize();
   45|  9.09k|        }

_ZN9OpenBabel7vector3C2Eddd:
   52|  10.8G|      _vx(inX), _vy(inY), _vz(inZ)
   53|  10.8G|      {}
_ZN9OpenBabel7vector3C2EPd:
   55|    733|      _vx(inV[0]), _vy(inV[1]), _vz(inV[2])
   56|    733|      {}
_ZN9OpenBabel7vector3C2ERKS0_:
   59|  2.09M|      _vx(v._vx), _vy(v._vy), _vz(v._vz)
   60|  2.09M|        { }
_ZN9OpenBabel7vector3D2Ev:
   63|  10.8G|    ~vector3() { }
_ZN9OpenBabel7vector33SetEddd:
   88|  1.61G|    {
   89|  1.61G|      _vx = inX;
   90|  1.61G|      _vy = inY;
   91|  1.61G|      _vz = inZ;
   92|  1.61G|    }
_ZN9OpenBabel7vector34SetXEd:
  102|   200k|    {
  103|   200k|      _vx = inX;
  104|   200k|    }
_ZN9OpenBabel7vector34SetYEd:
  107|   200k|    {
  108|   200k|      _vy = inY;
  109|   200k|    }
_ZN9OpenBabel7vector34SetZEd:
  112|   200k|    {
  113|   200k|      _vz = inZ;
  114|   200k|    }
_ZN9OpenBabel7vector33GetEPd:
  133|  1.60G|    {
  134|  1.60G|      c[0]=_vx;
  135|  1.60G|      c[1]=_vy;
  136|  1.60G|      c[2]=_vz;
  137|  1.60G|    }
_ZN9OpenBabel7vector3aSERKS0_:
  143|  1.86G|      {
  144|  1.86G|        _vx = v._vx;
  145|  1.86G|        _vy = v._vy;
  146|  1.86G|        _vz = v._vz;
  147|  1.86G|        return *this;
  148|  1.86G|      }
_ZN9OpenBabel7vector3pLERKS0_:
  159|   810k|      {
  160|   810k|        _vx += v._vx;
  161|   810k|        _vy += v._vy;
  162|   810k|        _vz += v._vz;
  163|   810k|        return *this;
  164|   810k|      };
_ZN9OpenBabel7vector3mIERKS0_:
  168|  66.0k|      {
  169|  66.0k|        _vx -= v._vx;
  170|  66.0k|        _vy -= v._vy;
  171|  66.0k|        _vz -= v._vz;
  172|  66.0k|        return *this;
  173|  66.0k|      };
_ZN9OpenBabel7vector3mLERKd:
  195|  1.74G|      {
  196|  1.74G|        _vx *= c;
  197|  1.74G|        _vy *= c;
  198|  1.74G|        _vz *= c;
  199|  1.74G|        return *this;
  200|  1.74G|      };
_ZN9OpenBabel7vector3dVERKd:
  205|  1.74G|      {
  206|  1.74G|        double inv = 1.0 / c;
  207|  1.74G|        return( (*this) *= inv );
  208|  1.74G|      };
_ZNK9OpenBabel7vector38length_2Ev:
  228|  1.99G|    {
  229|  1.99G|      return _vx*_vx + _vy*_vy + _vz*_vz;
  230|  1.99G|    };
_ZNK9OpenBabel7vector36lengthEv:
  233|  1.79G|    {
  234|  1.79G|      return sqrt( length_2() );
  235|  1.79G|    };
_ZNK9OpenBabel7vector31xEv:
  238|  20.5G|    {
  239|  20.5G|      return _vx ;
  240|  20.5G|    } ;
_ZNK9OpenBabel7vector31yEv:
  243|  20.5G|    {
  244|  20.5G|      return _vy ;
  245|  20.5G|    } ;
_ZNK9OpenBabel7vector31zEv:
  248|  20.5G|    {
  249|  20.5G|      return _vz ;
  250|  20.5G|    } ;
_ZN9OpenBabel7vector31xEv:
  253|  2.21G|    {
  254|  2.21G|      return _vx ;
  255|  2.21G|    } ;
_ZN9OpenBabel7vector31yEv:
  258|  2.21G|    {
  259|  2.21G|      return _vy ;
  260|  2.21G|    } ;
_ZN9OpenBabel7vector31zEv:
  263|  2.21G|    {
  264|  2.21G|      return _vz ;
  265|  2.21G|    } ;
_ZN9OpenBabelplERKNS_7vector3ES2_:
  318|  2.63G|  {
  319|  2.63G|    return vector3(v1.x()+v2.x(), v1.y()+v2.y(), v1.z()+v2.z());
  320|  2.63G|  }
_ZN9OpenBabelmiERKNS_7vector3ES2_:
  323|  1.98G|  {
  324|  1.98G|    return vector3(v1.x()-v2.x(), v1.y()-v2.y(), v1.z()-v2.z());
  325|  1.98G|  }
_ZN9OpenBabelngERKNS_7vector3E:
  328|  9.26k|  {
  329|  9.26k|    return vector3(-v.x(), -v.y(), -v.z());
  330|  9.26k|  }
_ZN9OpenBabelmlERKdRKNS_7vector3E:
  333|  4.35G|    {
  334|  4.35G|      return vector3( c*v.x(), c*v.y(), c*v.z());
  335|  4.35G|    }
_ZN9OpenBabelmlERKNS_7vector3ERKd:
  338|   549k|    {
  339|   549k|      return vector3( c*v.x(), c*v.y(), c*v.z());
  340|   549k|    }
_ZN9OpenBabeldvERKNS_7vector3ERKd:
  343|    714|  {
  344|    714|    return vector3( v.x()/c, v.y()/c, v.z()/c);
  345|    714|  }
_ZN9OpenBabel3dotERKNS_7vector3ES2_:
  358|  2.54M|  {
  359|  2.54M|    return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z() ;
  360|  2.54M|  }

_ZN9OpenBabel5OBMol12ReserveAtomsEi:
  173|  1.98k|    {
  174|  1.98k|      const int kMaxReservedAtoms = 10000000;
  175|  1.98k|      if (natoms > kMaxReservedAtoms)
  ------------------
  |  Branch (175:11): [True: 2, False: 1.97k]
  ------------------
  176|      2|        natoms = kMaxReservedAtoms;
  177|  1.98k|      if (natoms > 0 && _mod) {
  ------------------
  |  Branch (177:11): [True: 1.70k, False: 273]
  |  Branch (177:25): [True: 1.60k, False: 101]
  ------------------
  178|  1.60k|        _vatom.reserve(natoms);
  179|  1.60k|        _atomIds.reserve(natoms);
  180|  1.60k|      }
  181|  1.98k|    }
_ZN9OpenBabel5OBMol12IncrementModEv:
  262|  3.76k|    void IncrementMod()    {      _mod++;          }
_ZN9OpenBabel5OBMol12DecrementModEv:
  265|  3.76k|    void DecrementMod()    {      _mod--;          }
_ZNK9OpenBabel5OBMol8NumAtomsEv:
  276|   631M|    unsigned int NumAtoms() const         {  return(_natoms); }
_ZNK9OpenBabel5OBMol8NumBondsEv:
  278|  5.44M|    unsigned int NumBonds() const         {  return(_nbonds); }
_ZNK9OpenBabel5OBMol11NumResiduesEv:
  282|  1.96M|    unsigned int NumResidues() const      { return(static_cast<unsigned int> (_residue.size())); }
_ZNK9OpenBabel5OBMol9GetEnergyEv:
  331|   615k|    double       GetEnergy() const { return _energy; }
_ZNK9OpenBabel5OBMol12GetDimensionEv:
  341|  1.92M|    unsigned short int GetDimension() const { return _dimension; }
_ZN9OpenBabel5OBMol14GetCoordinatesEv:
  343|  5.26k|    double      *GetCoordinates() { return(_c); }
_ZN9OpenBabel5OBMol22AutomaticPartialChargeEv:
  351|   849k|    bool AutomaticPartialCharge()  { return(_autoPartialCharge); }
_ZN9OpenBabel5OBMol12SetDimensionEt:
  366|   268k|    void   SetDimension(unsigned short int d) { _dimension = d; }
_ZN9OpenBabel5OBMol24SetAutomaticFormalChargeEb:
  380|  6.28k|    { _autoFormalCharge=val;  }
_ZN9OpenBabel5OBMol25SetAutomaticPartialChargeEb:
  383|  2.94k|    { _autoPartialCharge=val; }
_ZN9OpenBabel5OBMol20SetAromaticPerceivedEb:
  386|  30.3k|    void   SetAromaticPerceived(bool value = true)    { SET_OR_UNSET_FLAG(OB_AROMATIC_MOL);    }
  ------------------
  |  |  113|  30.3k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 24.0k, False: 6.31k]
  |  |  ------------------
  |  |  114|  30.3k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol16SetSSSRPerceivedEb:
  388|  3.99M|    void   SetSSSRPerceived(bool value = true)        { SET_OR_UNSET_FLAG(OB_SSSR_MOL);        }
  ------------------
  |  |  113|  3.99M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 263k, False: 3.72M]
  |  |  ------------------
  |  |  114|  3.99M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol16SetLSSRPerceivedEb:
  390|  3.77M|    void   SetLSSRPerceived(bool value = true)        { SET_OR_UNSET_FLAG(OB_LSSR_MOL);        }
  ------------------
  |  |  113|  3.77M|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 49.6k, False: 3.72M]
  |  |  ------------------
  |  |  114|  3.77M|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol29SetRingAtomsAndBondsPerceivedEb:
  392|   263k|    void   SetRingAtomsAndBondsPerceived(bool value = true) { SET_OR_UNSET_FLAG(OB_RINGFLAGS_MOL); }
  ------------------
  |  |  113|   263k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 263k, False: 0]
  |  |  ------------------
  |  |  114|   263k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol21SetAtomTypesPerceivedEb:
  394|  7.72k|    void   SetAtomTypesPerceived(bool value = true)   { SET_OR_UNSET_FLAG(OB_ATOMTYPES_MOL);   }
  ------------------
  |  |  113|  7.72k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 7.72k, False: 0]
  |  |  ------------------
  |  |  114|  7.72k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol18SetChainsPerceivedEb:
  398|  12.3k|    void   SetChainsPerceived(bool value = true)      { SET_OR_UNSET_FLAG(OB_CHAINS_MOL);      }
  ------------------
  |  |  113|  12.3k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 12.3k, False: 0]
  |  |  ------------------
  |  |  114|  12.3k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol21SetChiralityPerceivedEb:
  400|   277k|    void   SetChiralityPerceived(bool value = true)   { SET_OR_UNSET_FLAG(OB_CHIRALITY_MOL);   }
  ------------------
  |  |  113|   277k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 277k, False: 0]
  |  |  ------------------
  |  |  114|   277k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol26SetPartialChargesPerceivedEb:
  402|  2.80k|    void   SetPartialChargesPerceived(bool value = true) { SET_OR_UNSET_FLAG(OB_PCHARGE_MOL);  }
  ------------------
  |  |  113|  2.80k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 1.86k, False: 939]
  |  |  ------------------
  |  |  114|  2.80k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol25SetHybridizationPerceivedEb:
  404|   275k|    void   SetHybridizationPerceived(bool value = true)  { SET_OR_UNSET_FLAG(OB_HYBRID_MOL);   }
  ------------------
  |  |  113|   275k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 275k, False: 0]
  |  |  ------------------
  |  |  114|   275k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol24SetClosureBondsPerceivedEb:
  406|   263k|    void   SetClosureBondsPerceived(bool value = true)   { SET_OR_UNSET_FLAG(OB_CLOSURE_MOL);  }
  ------------------
  |  |  113|   263k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 263k, False: 0]
  |  |  ------------------
  |  |  114|   263k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol17SetHydrogensAddedEb:
  409|  8.06k|    void   SetHydrogensAdded(bool value = true) { SET_OR_UNSET_FLAG(OB_H_ADDED_MOL); }
  ------------------
  |  |  113|  8.06k|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 5.59k, False: 2.47k]
  |  |  ------------------
  |  |  114|  8.06k|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol13SetIsReactionEb:
  414|     87|    void   SetIsReaction(bool value = true)               { SET_OR_UNSET_FLAG(OB_REACTION_MOL); }
  ------------------
  |  |  113|     87|  if (value) SetFlag(X); \
  |  |  ------------------
  |  |  |  Branch (113:7): [True: 87, False: 0]
  |  |  ------------------
  |  |  114|     87|  else     UnsetFlag(X);
  ------------------
_ZN9OpenBabel5OBMol7HasFlagEi:
  418|   564M|    bool   HasFlag(int flag)   { return (_flags & flag) ? true : false; }
  ------------------
  |  Branch (418:41): [True: 422M, False: 142M]
  ------------------
_ZN9OpenBabel5OBMol7SetFlagEi:
  419|  4.13M|    void   SetFlag(int flag)   { _flags |= flag; }
_ZN9OpenBabel5OBMol9UnsetFlagEi:
  420|  7.46M|    void   UnsetFlag(int flag) { _flags &= (~(flag)); }
_ZN9OpenBabel5OBMol20HasAromaticPerceivedEv:
  584|   175M|    bool HasAromaticPerceived()     { return(HasFlag(OB_AROMATIC_MOL)); }
  ------------------
  |  |   77|   175M|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
_ZN9OpenBabel5OBMol16HasSSSRPerceivedEv:
  586|  3.89M|    bool HasSSSRPerceived()         { return(HasFlag(OB_SSSR_MOL));     }
  ------------------
  |  |   73|  3.89M|#define OB_SSSR_MOL              (1<<1)
  ------------------
_ZN9OpenBabel5OBMol16HasLSSRPerceivedEv:
  588|   102k|    bool HasLSSRPerceived()         { return(HasFlag(OB_LSSR_MOL));     }
  ------------------
  |  |  103|   102k|#define OB_LSSR_MOL              (1<<20)
  ------------------
_ZN9OpenBabel5OBMol29HasRingAtomsAndBondsPerceivedEv:
  590|   224M|    bool HasRingAtomsAndBondsPerceived(){return(HasFlag(OB_RINGFLAGS_MOL));}
  ------------------
  |  |   75|   224M|#define OB_RINGFLAGS_MOL         (1<<2)
  ------------------
_ZN9OpenBabel5OBMol21HasAtomTypesPerceivedEv:
  592|   757k|    bool HasAtomTypesPerceived()    { return(HasFlag(OB_ATOMTYPES_MOL));}
  ------------------
  |  |   79|   757k|#define OB_ATOMTYPES_MOL         (1<<4)
  ------------------
_ZN9OpenBabel5OBMol21HasChiralityPerceivedEv:
  596|  1.11M|    bool HasChiralityPerceived()    { return(HasFlag(OB_CHIRALITY_MOL));}
  ------------------
  |  |   81|  1.11M|#define OB_CHIRALITY_MOL         (1<<5)
  ------------------
_ZN9OpenBabel5OBMol26HasPartialChargesPerceivedEv:
  598|  24.8k|    bool HasPartialChargesPerceived() { return(HasFlag(OB_PCHARGE_MOL));}
  ------------------
  |  |   83|  24.8k|#define OB_PCHARGE_MOL           (1<<6)
  ------------------
_ZN9OpenBabel5OBMol25HasHybridizationPerceivedEv:
  600|  9.93M|    bool HasHybridizationPerceived() { return(HasFlag(OB_HYBRID_MOL));  }
  ------------------
  |  |   85|  9.93M|#define OB_HYBRID_MOL            (1<<8)
  ------------------
_ZN9OpenBabel5OBMol24HasClosureBondsPerceivedEv:
  602|  5.32M|    bool HasClosureBondsPerceived() { return(HasFlag(OB_CLOSURE_MOL));  }
  ------------------
  |  |   87|  5.32M|#define OB_CLOSURE_MOL           (1<<11)
  ------------------
_ZN9OpenBabel5OBMol18HasChainsPerceivedEv:
  604|  1.69M|    bool HasChainsPerceived() { return(HasFlag(OB_CHAINS_MOL));         }
  ------------------
  |  |   93|  1.69M|#define OB_CHAINS_MOL            (1<<15)
  ------------------
_ZN9OpenBabel5OBMol17HasHydrogensAddedEv:
  606|  5.59k|    bool HasHydrogensAdded() { return(HasFlag(OB_H_ADDED_MOL));         }
  ------------------
  |  |   89|  5.59k|#define OB_H_ADDED_MOL           (1<<12)
  ------------------
_ZN9OpenBabel5OBMol16IsCorrectedForPHEv:
  608|  5.59k|    bool IsCorrectedForPH() { return(HasFlag(OB_PH_CORRECTED_MOL));     }
  ------------------
  |  |   91|  5.59k|#define OB_PH_CORRECTED_MOL      (1<<13)
  ------------------
_ZN9OpenBabel5OBMol10IsReactionEv:
  612|   498k|    bool IsReaction()                  { return HasFlag(OB_REACTION_MOL); }
  ------------------
  |  |  107|   498k|#define OB_REACTION_MOL          (1<<22)
  ------------------
_ZN9OpenBabel5OBMol10IsPeriodicEv:
  614|   134M|    bool IsPeriodic() { return(HasFlag(OB_PERIODIC_MOL)); }
  ------------------
  |  |  109|   134M|#define OB_PERIODIC_MOL          (1<<23)
  ------------------
_ZN9OpenBabel5OBMol5EmptyEv:
  617|  19.1M|    bool Empty()                       { return(_natoms == 0);          }
_ZN9OpenBabel5OBMol13NumConformersEv:
  623|  1.26M|    int     NumConformers()    { return((_vconf.empty())?0:static_cast<int> (_vconf.size())); }
  ------------------
  |  Branch (623:41): [True: 243k, False: 1.02M]
  ------------------
_ZNK9OpenBabel5OBMol8GetAtomsEv:
  670|  1.91M|    OBMolAtomRange GetAtoms() const { return {_vatom.begin(), _vatom.begin() + NumAtoms()}; }
_ZNK9OpenBabel5OBMol8GetBondsEv:
  676|   801k|    OBMolBondRange GetBonds() const { return {_vbond.begin(), _vbond.begin() + NumBonds()}; }
_ZN9OpenBabel5OBMol12BeginResidueERNSt3__111__wrap_iterIPPNS_9OBResidueEEE:
  703|   889k|    {
  704|   889k|      i = _residue.begin();
  705|   889k|      return((i == _residue.end()) ? nullptr:*i);
  ------------------
  |  Branch (705:14): [True: 300k, False: 588k]
  ------------------
  706|   889k|    }
_ZN9OpenBabel5OBMol11NextResidueERNSt3__111__wrap_iterIPPNS_9OBResidueEEE:
  710|  2.43M|    {
  711|  2.43M|      ++i;
  712|  2.43M|      return((i == _residue.end()) ? nullptr:*i);
  ------------------
  |  Branch (712:14): [True: 393k, False: 2.04M]
  ------------------
  713|  2.43M|    }

_ZN9OpenBabel10OBGastChrgC2Ev:
   65|    926|    OBGastChrg()    {}
_ZN9OpenBabel14GasteigerStateD2Ev:
   39|   105k|    ~GasteigerState() {}
_ZN9OpenBabel14GasteigerState9SetValuesEdddd:
   42|  23.9k|    {
   43|  23.9k|        a = _a;
   44|  23.9k|        b = _b;
   45|  23.9k|        c = _c;
   46|  23.9k|        denom=a+b+c;
   47|  23.9k|        q = _q;
   48|  23.9k|    }

_ZNK9OpenBabel12OBConversion11GetInStreamEv:
  107|  15.3k|      std::istream* GetInStream() const {return pInput;};
_ZNK9OpenBabel12OBConversion12GetOutStreamEv:
  108|   242k|      std::ostream* GetOutStream() const {return pOutput;};
_ZN9OpenBabel12OBConversion11StreamStateC2Ev:
  355|   242k|          StreamState(): pStream(nullptr) {}
_ZN9OpenBabel12OBConversion11StreamStateD2Ev:
  357|   242k|          {
  358|       |            assert(ownedStreams.size() == 0); //should be popped
  359|   242k|          }

_ZN9OpenBabel16OBMessageHandler11StopLoggingEv:
  128|  15.3k|      void StopLogging()  { _logging = false; }
_ZN9OpenBabel16OBMessageHandler14GetOutputLevelEv:
  142|  1.12M|      obMessageLevel GetOutputLevel() { return _outputLevel; }

_ZN9OpenBabel4impl11AtomGetNbrsEPKNS_6OBAtomE:
  413|  20.1M|    inline OBAtomAtomRange AtomGetNbrs(const OpenBabel::OBAtom *atom) { return atom->GetNbrs(); }
_ZN9OpenBabel4impl11MolGetAtomsERKNS_5OBMolE:
  403|  1.06M|    inline OBMolAtomRange MolGetAtoms(const OpenBabel::OBMol &mol) { return mol.GetAtoms(); }
_ZN9OpenBabel4impl11MolGetBondsERKNS_5OBMolE:
  406|   306k|    inline OBMolBondRange MolGetBonds(const OpenBabel::OBMol &mol) { return mol.GetBonds(); }
_ZNK9OpenBabel16OBMolAtomDFSItercvbEv:
   85|  1.06M|    operator bool() const        { return _ptr != nullptr; }
_ZNK9OpenBabel16OBMolAtomDFSIterptEv:
   91|  6.66M|    OBAtom* operator->() const   { return _ptr;      }
_ZNK9OpenBabel16OBMolAtomDFSIterdeEv:
   93|   807k|    OBAtom& operator*() const    { return *_ptr;     }
_ZN9OpenBabel16OBMolAtomDFSIterD2Ev:
   81|   824k|    ~OBMolAtomDFSIter() { }
_ZN9OpenBabel4impl12AtomGetBondsEPKNS_6OBAtomE:
  410|   119M|    inline OBAtomBondRange AtomGetBonds(const OpenBabel::OBAtom *atom) { return atom->GetBonds(); }
_ZN9OpenBabel16OBMolAtomDFSIter4nextEv:
   96|   807k|    {
   97|   807k|      if(_stack.empty())
  ------------------
  |  Branch (97:10): [True: 243k, False: 564k]
  ------------------
   98|   243k|        return nullptr; //end of a disconnected fragment
   99|   564k|      else
  100|   564k|        return _stack.top(); //the next atom
  101|   807k|    }
_ZN9OpenBabel14OBMolAngleIterD2Ev:
  308|    424|    ~OBMolAngleIter() { }
_ZNK9OpenBabel14OBMolAngleItercvbEv:
  312|    424|    operator bool() const        { return (_i != _vangle.end()); }
_ZN9OpenBabel16OBMolTorsionIterD2Ev:
  332|    424|    ~OBMolTorsionIter() { }
_ZNK9OpenBabel16OBMolTorsionItercvbEv:
  336|    424|    operator bool() const        { return (_i != _vtorsion.end()); }
_ZN9OpenBabel13OBMolPairIterD2Ev:
  359|    762|    ~OBMolPairIter() { }
_ZNK9OpenBabel13OBMolPairItercvbEv:
  363|    762|    operator bool() const        { return _pair.size()>0; }
_ZNK9OpenBabel13OBMolPairIterdeEv:
  368|    172|    std::vector<unsigned int> operator*() const    { return _pair;     }
_ZN9OpenBabel4impl11MolGetAtomsEPKNS_5OBMolE:
  404|   853k|    inline OBMolAtomRange MolGetAtoms(const OpenBabel::OBMol *mol) { return mol->GetAtoms(); }
_ZN9OpenBabel4impl11MolGetBondsEPKNS_5OBMolE:
  407|   494k|    inline OBMolBondRange MolGetBonds(const OpenBabel::OBMol *mol) { return mol->GetBonds(); }

_ZN9OpenBabel16OBMoleculeFormatC2Ev:
   62|    218|  {
   63|    218|    if(!OptionsRegistered)
  ------------------
  |  Branch (63:8): [True: 2, False: 216]
  ------------------
   64|      2|    {
   65|      2|      OptionsRegistered=true;
   66|      2|      OBConversion::RegisterOptionParam("b",         this, 0, OBConversion::INOPTIONS);
   67|      2|      OBConversion::RegisterOptionParam("s",         this, 0, OBConversion::INOPTIONS);
   68|      2|      OBConversion::RegisterOptionParam("title",     this, 1, OBConversion::GENOPTIONS);
   69|      2|      OBConversion::RegisterOptionParam("addtotitle",this, 1, OBConversion::GENOPTIONS);
   70|      2|      OBConversion::RegisterOptionParam("property",  this, 2, OBConversion::GENOPTIONS);
   71|      2|      OBConversion::RegisterOptionParam("C",         this, 0, OBConversion::GENOPTIONS);
   72|      2|      OBConversion::RegisterOptionParam("j",         this, 0, OBConversion::GENOPTIONS);
   73|      2|      OBConversion::RegisterOptionParam("join",      this, 0, OBConversion::GENOPTIONS);
   74|      2|      OBConversion::RegisterOptionParam("separate",  this, 0, OBConversion::GENOPTIONS);
   75|       |
   76|       |      //The follow are OBMol options, which should not be in OBConversion.
   77|       |      //But here isn't entirely appropriate either, since one could have
   78|       |      //OBMol formats loaded but which don't derived from this class.
   79|       |      //However, this possibility is remote.
   80|      2|      OBConversion::RegisterOptionParam("s", nullptr, 1,OBConversion::GENOPTIONS);
   81|      2|      OBConversion::RegisterOptionParam("v", nullptr, 1,OBConversion::GENOPTIONS);
   82|      2|      OBConversion::RegisterOptionParam("h", nullptr, 0,OBConversion::GENOPTIONS);
   83|      2|      OBConversion::RegisterOptionParam("d", nullptr, 0,OBConversion::GENOPTIONS);
   84|      2|      OBConversion::RegisterOptionParam("b", nullptr, 0,OBConversion::GENOPTIONS);
   85|      2|      OBConversion::RegisterOptionParam("c", nullptr, 0,OBConversion::GENOPTIONS);
   86|      2|      OBConversion::RegisterOptionParam("p", nullptr, 1,OBConversion::GENOPTIONS);
   87|      2|      OBConversion::RegisterOptionParam("t", nullptr, 0,OBConversion::GENOPTIONS);
   88|      2|      OBConversion::RegisterOptionParam("k", nullptr, 0,OBConversion::GENOPTIONS);
   89|      2|      OBConversion::RegisterOptionParam("filter", nullptr, 1,OBConversion::GENOPTIONS);
   90|      2|      OBConversion::RegisterOptionParam("add", nullptr, 1,OBConversion::GENOPTIONS);
   91|      2|      OBConversion::RegisterOptionParam("delete", nullptr, 1,OBConversion::GENOPTIONS);
   92|      2|      OBConversion::RegisterOptionParam("append", nullptr, 1,OBConversion::GENOPTIONS);
   93|      2|    }
   94|    218|  }

_ZN9OpenBabel8IsApproxERKdS1_d:
  230|    236|  {
  231|    236|    return( fabs(a - b) <= precision * std::min<const double>( fabs(a), fabs(b) ) );
  232|    236|  }
_ZN9OpenBabel6tripleIPNS_6OBAtomES2_dEC2ERKS2_S5_RKd:
  274|  1.24M|      first(a), second(b), third(c)
  275|  1.24M|      {}

_ZN9OpenBabel4OBOp6TypeIDEv:
   41|     36|  const char* TypeID() override { return "ops"; }

_ZN9OpenBabel15OBSmartsPatternC2Ev:
  183|  46.2k|  OBSmartsPattern() : _pat(nullptr), _buffer(nullptr), LexPtr(nullptr), MainPtr(nullptr) { }
_ZNK9OpenBabel15OBSmartsPattern8NumAtomsEv:
  233|  2.49k|    {
  234|  2.49k|      return _pat ? _pat->acount : 0;
  ------------------
  |  Branch (234:14): [True: 2.49k, False: 0]
  ------------------
  235|  2.49k|    }
_ZNK9OpenBabel15OBSmartsPattern8NumBondsEv:
  238|    322|    {
  239|    322|      return _pat ? _pat->bcount : 0;
  ------------------
  |  Branch (239:14): [True: 322, False: 0]
  ------------------
  240|    322|    }
_ZNK9OpenBabel15OBSmartsPattern16GetVectorBindingEi:
  255|  2.37k|    {
  256|  2.37k|      return(_pat->atom[idx].vb);
  257|  2.37k|    }
_ZN9OpenBabel15OBSmartsMatcherC2Ev:
  360|  35.0M|    OBSmartsMatcher() {}
_ZN9OpenBabel15OBSmartsMatcherD2Ev:
  361|  35.0M|    virtual ~OBSmartsMatcher() {}

_ZN9OpenBabel10OBChemTsfmC2Ev:
   39|     38|    OBChemTsfm()    {}
_ZN9OpenBabel10OBChemTsfmD2Ev:
   40|     38|    ~OBChemTsfm()   {}
_ZN9OpenBabel9OBPhModel7GetSizeEv:
  118|      1|    size_t GetSize() override { return _vtsfm.size(); }

_ZN9OpenBabel12OBForceField8FindTypeEPKc:
  221|  7.77k|  static BaseClass* FindType(const char* ID) {\
  222|  7.77k|    if (!ID || *ID==0 || *ID==' ') {\
  ------------------
  |  Branch (222:9): [True: 0, False: 7.77k]
  |  Branch (222:16): [True: 0, False: 7.77k]
  |  Branch (222:26): [True: 0, False: 7.77k]
  ------------------
  223|      0|      return Default();\
  224|      0|    }\
  225|  7.77k|    return static_cast<BaseClass*>(BaseFindType(Map(),ID));\
  226|  7.77k|  }
_ZN9OpenBabel12OBForceField7DefaultEv:
  205|      6|  static BaseClass*& Default() {\
  206|      6|    static BaseClass* d;\
  207|      6|    return d;\
  208|      6|  }\
_ZN9OpenBabel12OBForceField3MapEv:
  197|  7.80k|  static PluginMapType& Map() {\
  198|  7.80k|    static PluginMapType m;\
  199|  7.80k|    return m;\
  200|  7.80k|  }\
_ZNK9OpenBabel11CharPtrLessclEPKcS2_:
   44|   211k|  { return strcasecmp(p1,p2)<0; }
_ZN9OpenBabel8OBPlugin9PluginMapEv:
  134|    433|  {
  135|    433|    static PluginMapType m;
  136|    433|    return m;
  137|    433|  }
_ZN9OpenBabel8OBFormat3MapEv:
  197|  24.4k|  static PluginMapType& Map() {\
  198|  24.4k|    static PluginMapType m;\
  199|  24.4k|    return m;\
  200|  24.4k|  }\
_ZNK9OpenBabel8OBFormat6GetMapEv:
  201|    644|  PluginMapType& GetMap() const override {\
  202|    644|    return Map();\
  203|    644|  }\
_ZN9OpenBabel8OBFormat7DefaultEv:
  205|      8|  static BaseClass*& Default() {\
  206|      8|    static BaseClass* d;\
  207|      8|    return d;\
  208|      8|  }\
_ZN9OpenBabel8OBFormat8FindTypeEPKc:
  221|  23.7k|  static BaseClass* FindType(const char* ID) {\
  222|  23.7k|    if (!ID || *ID==0 || *ID==' ') {\
  ------------------
  |  Branch (222:9): [True: 0, False: 23.7k]
  |  Branch (222:16): [True: 0, False: 23.7k]
  |  Branch (222:26): [True: 0, False: 23.7k]
  ------------------
  223|      0|      return Default();\
  224|      0|    }\
  225|  23.7k|    return static_cast<BaseClass*>(BaseFindType(Map(),ID));\
  226|  23.7k|  }
_ZN9OpenBabel12OBForceFieldC2EPKcb:
  209|     10|  BaseClass(const char* ID, bool IsDefault=false) {\
  210|     10|    _id=ID;\
  211|     10|    if (ID&&*ID) {\
  ------------------
  |  Branch (211:9): [True: 10, False: 0]
  |  Branch (211:13): [True: 10, False: 0]
  ------------------
  212|     10|      if (IsDefault || Map().empty()) {\
  ------------------
  |  Branch (212:11): [True: 6, False: 4]
  |  Branch (212:24): [True: 0, False: 4]
  ------------------
  213|      6|        Default() = this;\
  214|      6|      }\
  215|     10|      if (Map().count(ID) == 0) {\
  ------------------
  |  Branch (215:11): [True: 10, False: 0]
  ------------------
  216|     10|        Map()[ID] = this;\
  217|     10|        PluginMap()[TypeID()] = this;\
  218|     10|      }\
  219|     10|    }\
  220|     10|  }\
_ZN9OpenBabel4OBOp7DefaultEv:
  205|      2|  static BaseClass*& Default() {\
  206|      2|    static BaseClass* d;\
  207|      2|    return d;\
  208|      2|  }\
_ZN9OpenBabel4OBOp3MapEv:
  197|    108|  static PluginMapType& Map() {\
  198|    108|    static PluginMapType m;\
  199|    108|    return m;\
  200|    108|  }\
_ZN9OpenBabel12OBDescriptor3MapEv:
  197|    108|  static PluginMapType& Map() {\
  198|    108|    static PluginMapType m;\
  199|    108|    return m;\
  200|    108|  }\
_ZN9OpenBabel12OBDescriptor7DefaultEv:
  205|      2|  static BaseClass*& Default() {\
  206|      2|    static BaseClass* d;\
  207|      2|    return d;\
  208|      2|  }\
_ZN9OpenBabel12OBDescriptorC2EPKcb:
  209|     36|  BaseClass(const char* ID, bool IsDefault=false) {\
  210|     36|    _id=ID;\
  211|     36|    if (ID&&*ID) {\
  ------------------
  |  Branch (211:9): [True: 36, False: 0]
  |  Branch (211:13): [True: 36, False: 0]
  ------------------
  212|     36|      if (IsDefault || Map().empty()) {\
  ------------------
  |  Branch (212:11): [True: 0, False: 36]
  |  Branch (212:24): [True: 2, False: 34]
  ------------------
  213|      2|        Default() = this;\
  214|      2|      }\
  215|     36|      if (Map().count(ID) == 0) {\
  ------------------
  |  Branch (215:11): [True: 36, False: 0]
  ------------------
  216|     36|        Map()[ID] = this;\
  217|     36|        PluginMap()[TypeID()] = this;\
  218|     36|      }\
  219|     36|    }\
  220|     36|  }\
_ZN9OpenBabel4OBOpC2EPKcb:
  209|     36|  BaseClass(const char* ID, bool IsDefault=false) {\
  210|     36|    _id=ID;\
  211|     36|    if (ID&&*ID) {\
  ------------------
  |  Branch (211:9): [True: 36, False: 0]
  |  Branch (211:13): [True: 36, False: 0]
  ------------------
  212|     36|      if (IsDefault || Map().empty()) {\
  ------------------
  |  Branch (212:11): [True: 0, False: 36]
  |  Branch (212:24): [True: 2, False: 34]
  ------------------
  213|      2|        Default() = this;\
  214|      2|      }\
  215|     36|      if (Map().count(ID) == 0) {\
  ------------------
  |  Branch (215:11): [True: 36, False: 0]
  ------------------
  216|     36|        Map()[ID] = this;\
  217|     36|        PluginMap()[TypeID()] = this;\
  218|     36|      }\
  219|     36|    }\
  220|     36|  }\
_ZN9OpenBabel13OBFingerprint3MapEv:
  197|     52|  static PluginMapType& Map() {\
  198|     52|    static PluginMapType m;\
  199|     52|    return m;\
  200|     52|  }\
_ZN9OpenBabel13OBFingerprint7DefaultEv:
  205|      2|  static BaseClass*& Default() {\
  206|      2|    static BaseClass* d;\
  207|      2|    return d;\
  208|      2|  }\
_ZN9OpenBabel13OBFingerprintC2EPKcb:
  209|     18|  BaseClass(const char* ID, bool IsDefault=false) {\
  210|     18|    _id=ID;\
  211|     18|    if (ID&&*ID) {\
  ------------------
  |  Branch (211:9): [True: 18, False: 0]
  |  Branch (211:13): [True: 18, False: 0]
  ------------------
  212|     18|      if (IsDefault || Map().empty()) {\
  ------------------
  |  Branch (212:11): [True: 2, False: 16]
  |  Branch (212:24): [True: 0, False: 16]
  ------------------
  213|      2|        Default() = this;\
  214|      2|      }\
  215|     18|      if (Map().count(ID) == 0) {\
  ------------------
  |  Branch (215:11): [True: 18, False: 0]
  ------------------
  216|     18|        Map()[ID] = this;\
  217|     18|        PluginMap()[TypeID()] = this;\
  218|     18|      }\
  219|     18|    }\
  220|     18|  }\
_ZN9OpenBabel13OBChargeModel7DefaultEv:
  205|      2|  static BaseClass*& Default() {\
  206|      2|    static BaseClass* d;\
  207|      2|    return d;\
  208|      2|  }\
_ZN9OpenBabel13OBChargeModel3MapEv:
  197|     24|  static PluginMapType& Map() {\
  198|     24|    static PluginMapType m;\
  199|     24|    return m;\
  200|     24|  }\
_ZN9OpenBabel13OBChargeModelC2EPKcb:
  209|      8|  BaseClass(const char* ID, bool IsDefault=false) {\
  210|      8|    _id=ID;\
  211|      8|    if (ID&&*ID) {\
  ------------------
  |  Branch (211:9): [True: 8, False: 0]
  |  Branch (211:13): [True: 8, False: 0]
  ------------------
  212|      8|      if (IsDefault || Map().empty()) {\
  ------------------
  |  Branch (212:11): [True: 0, False: 8]
  |  Branch (212:24): [True: 2, False: 6]
  ------------------
  213|      2|        Default() = this;\
  214|      2|      }\
  215|      8|      if (Map().count(ID) == 0) {\
  ------------------
  |  Branch (215:11): [True: 8, False: 0]
  ------------------
  216|      8|        Map()[ID] = this;\
  217|      8|        PluginMap()[TypeID()] = this;\
  218|      8|      }\
  219|      8|    }\
  220|      8|  }\

_ZN9OpenBabel6OBRing8IsInRingEi:
   92|  35.6M|    {
   93|  35.6M|      return(_pathset.BitIsSet(i));
   94|  35.6M|    }
_ZN9OpenBabel6OBRing9SetParentEPNS_5OBMolE:
   97|  18.0M|    void   SetParent(OBMol *m)  {    _parent = m;    }
_ZN9OpenBabel6OBRingC2ERNSt3__16vectorIiNS1_9allocatorIiEEEENS_8OBBitVecE:
   55|   673k|    OBRing(std::vector<int>& path, OBBitVec set) : _path(path), _pathset(set) {}
_ZNK9OpenBabel6OBRing4SizeEv:
   63|  12.6M|    size_t    Size()     const  {    return(_path.size());  }
_ZN9OpenBabel6OBRing9GetParentEv:
   99|  21.6k|    OBMol *GetParent()          {    return(_parent);}
_ZN9OpenBabel12OBRingSearch9SortRingsEv:
  133|  27.5k|    {
  134|  27.5k|      std::vector<OBRing*>::iterator j;
  135|  27.5k|      int ring_id; // for each ring, assign a unique id to ensure a stable sort
  136|       |      
  137|   701k|      for (j = _rlist.begin(), ring_id = 0; j != _rlist.end(); ++j, ++ring_id)
  ------------------
  |  Branch (137:45): [True: 673k, False: 27.5k]
  ------------------
  138|   673k|        (*j)->ring_id = ring_id;
  139|  27.5k|      std::sort(_rlist.begin(),_rlist.end(),CompareRingSize);
  140|  27.5k|    }
_ZN9OpenBabel12OBRingSearch10BeginRingsEv:
  155|  27.5k|      {
  156|  27.5k|        return(_rlist.begin());
  157|  27.5k|      }
_ZN9OpenBabel12OBRingSearch8EndRingsEv:
  160|   355k|      {
  161|   355k|        return(_rlist.end());
  162|   355k|      }
_ZN9OpenBabel7OBRTreeD2Ev:
  177|  30.1M|    ~OBRTree()    {}

_ZNK9OpenBabel16OBCisTransStereo6ConfigneERKS1_:
  191|  6.76k|      {
  192|  6.76k|        return !(*this == other);
  193|  6.76k|      }
_ZN9OpenBabel16OBCisTransStereo6ConfigC2Ev:
  105|   143k|      Config() : begin(OBStereo::NoRef), end(OBStereo::NoRef), shape(OBStereo::ShapeU),
  106|   143k|          specified(true)
  107|   143k|      {  }
_ZNK9OpenBabel16OBCisTransStereo7GetTypeEv:
  222|   863k|    OBStereo::Type GetType() const { return OBStereo::CisTrans; }

_ZN9OpenBabel8OBStereo8MakeRefsEmmmm:
  176|  8.20k|    {
  177|  8.20k|      Refs refs(3);
  178|  8.20k|      refs[0] = ref1;
  179|  8.20k|      refs[1] = ref2;
  180|  8.20k|      refs[2] = ref3;
  181|  8.20k|      if (ref4 != NoRef)
  ------------------
  |  Branch (181:11): [True: 8.20k, False: 0]
  ------------------
  182|  8.20k|        refs.push_back(ref4);
  183|  8.20k|      return refs;
  184|  8.20k|    }
_ZN9OpenBabel12OBStereoUnitC2ENS_8OBStereo4TypeEmb:
  272|   102k|        type(_type), id(_id), para(_para)
  273|   102k|    {
  274|   102k|    }
_ZN9OpenBabel12OBStereoBaseC2EPNS_5OBMolE:
  331|   230k|        OBGenericData("StereoData", OBGenericDataType::StereoData, perceived),
  332|   230k|        m_mol(mol), m_specified(true)
  333|   230k|      {
  334|   230k|      }
_ZN9OpenBabel12OBStereoBaseD2Ev:
  338|   234k|      virtual ~OBStereoBase() { m_mol = nullptr; }
_ZN9OpenBabel14OBStereoFacadeC2EPNS_5OBMolEb:
  395|  4.46M|          m_mol(mol), m_init(false), m_perceive(perceive)
  396|  4.46M|      {
  397|  4.46M|      }
_ZN9OpenBabel14OBStereoFacade10EnsureInitEv:
  478|  2.67M|      inline void EnsureInit() { if (!m_init) InitMaps(); }
  ------------------
  |  Branch (478:38): [True: 670k, False: 2.00M]
  ------------------

_ZNK9OpenBabel19OBTetrahedralStereo6ConfigneERKS1_:
  156|    634|      {
  157|    634|        return !(*this == other);
  158|    634|      }
_ZN9OpenBabel19OBTetrahedralStereo6ConfigC2Ev:
   91|   189k|      Config() : center(OBStereo::NoRef), from(OBStereo::NoRef),
   92|   189k|          winding(OBStereo::Clockwise), view(OBStereo::ViewFrom),
   93|   189k|          specified(true)
   94|   189k|      {  }
_ZN9OpenBabel19OBTetrahedralStereo6ConfigC2EmmRKNSt3__16vectorImNS2_9allocatorImEEEENS_8OBStereo7WindingENS9_4ViewE:
  106|     76|          OBStereo::View _view = OBStereo::ViewFrom) : center(_center),
  107|     76|          from(from_or_towards), refs(_refs), winding(_winding), view(_view),
  108|     76|          specified(true)
  109|     76|      {  }
_ZNK9OpenBabel19OBTetrahedralStereo7GetTypeEv:
  199|   371k|    OBStereo::Type GetType() const { return OBStereo::Tetrahedral; }

_ZN9OpenBabel22OBTetraNonPlanarStereo8ToConfigINS_19OBTetrahedralStereo6ConfigEEET_RKS4_mNS_8OBStereo7WindingENS7_4ViewE:
  148|   351k|      {
  149|   351k|        if (cfg.from == OBStereo::NoRef) {
  ------------------
  |  Branch (149:13): [True: 0, False: 351k]
  ------------------
  150|      0|          obErrorLog.ThrowError(__FUNCTION__,
  151|      0|              "OBTetraNonPlanarStereo::ToConfig : Invalid from in ConfigType struct.", obError);
  152|      0|          return ConfigType();
  153|      0|        }
  154|   351k|        if (cfg.refs.size() != 3) {
  ------------------
  |  Branch (154:13): [True: 0, False: 351k]
  ------------------
  155|      0|          obErrorLog.ThrowError(__FUNCTION__,
  156|      0|              "OBTetraNonPlanarStereo::ToConfig : Invalid refs size.", obError);
  157|      0|          return ConfigType();
  158|      0|        }
  159|       |
  160|       |        // copy the internal refs
  161|   351k|        ConfigType result = cfg;
  162|   351k|        result.from = from_or_towards;
  163|   351k|        result.winding = winding;
  164|   351k|        result.view = view;
  165|       |
  166|       |        // keep track of the permuations by using the oddness
  167|   351k|        bool odd = false;
  168|       |
  169|       |        // find id
  170|   351k|        if (cfg.from != from_or_towards) {
  ------------------
  |  Branch (170:13): [True: 2.47k, False: 349k]
  ------------------
  171|       |          // move id to front and remove it = 1 permutation
  172|  5.07k|          for (int i = 0; i < 3; ++i) {
  ------------------
  |  Branch (172:27): [True: 5.06k, False: 2]
  ------------------
  173|  5.06k|            if (cfg.refs.at(i) == from_or_towards) {
  ------------------
  |  Branch (173:17): [True: 2.47k, False: 2.59k]
  ------------------
  174|  2.47k|              result.refs[i] = cfg.from;
  175|  2.47k|              break;
  176|  2.47k|            }
  177|  5.06k|          }
  178|       |          // 1 permutation perfromed --> odd = true
  179|  2.47k|          odd = true;
  180|  2.47k|        }
  181|       |
  182|       |        // clockwise <-> anti-clockwise : odd = true
  183|   351k|        if (winding == cfg.winding)
  ------------------
  |  Branch (183:13): [True: 162k, False: 189k]
  ------------------
  184|   162k|          odd = !odd;
  185|       |        // ViewFrom <-> ViewTowards : odd = true
  186|   351k|        if (view == cfg.view)
  ------------------
  |  Branch (186:13): [True: 351k, False: 0]
  ------------------
  187|   351k|          odd = !odd;
  188|       |
  189|       |        // make sure we actually found id
  190|   351k|        if (result.refs.size() == 3) {
  ------------------
  |  Branch (190:13): [True: 351k, False: 0]
  ------------------
  191|   351k|          if (odd)
  ------------------
  |  Branch (191:15): [True: 191k, False: 160k]
  ------------------
  192|   191k|            OBStereo::Permutate(result.refs, 1, 2);
  193|   351k|          return result;
  194|   351k|        }
  195|       |
  196|      0|        obErrorLog.ThrowError(__FUNCTION__,
  197|      0|            "OBTetraNonPlanarStereo::ToConfig : Parameter id not found in internal refs.", obError);
  198|      0|        return result;
  199|   351k|      }

_ZN9OpenBabel19OBTetraPlanarStereo8ToConfigINS_16OBCisTransStereo6ConfigEEET_RKS4_mNS_8OBStereo5ShapeE:
   92|  1.09M|      {
   93|  1.09M|        ConfigType result = cfg;
   94|  1.09M|        result.shape = shape;
   95|       |
   96|       |        // convert from U/Z/4 to U shape
   97|  1.09M|        switch (cfg.shape) {
  ------------------
  |  Branch (97:17): [True: 1.09M, False: 0]
  ------------------
   98|  1.08M|          case OBStereo::ShapeU:
  ------------------
  |  Branch (98:11): [True: 1.08M, False: 7.00k]
  ------------------
   99|  1.08M|            break;
  100|  7.00k|          case OBStereo::ShapeZ:
  ------------------
  |  Branch (100:11): [True: 7.00k, False: 1.08M]
  ------------------
  101|  7.00k|            OBStereo::Permutate(result.refs, 2, 3); // convert to U shape
  102|  7.00k|            break;
  103|      0|          case OBStereo::Shape4:
  ------------------
  |  Branch (103:11): [True: 0, False: 1.09M]
  ------------------
  104|      0|            OBStereo::Permutate(result.refs, 1, 2); // convert to U shape
  105|      0|            break;
  106|  1.09M|        }
  107|       |
  108|       |
  109|       |        // since refs are U shaped we can rotate the refs lexicographically
  110|  4.05M|        for (int i = 0; i < 4; ++i) {
  ------------------
  |  Branch (110:25): [True: 4.05M, False: 0]
  ------------------
  111|  4.05M|          std::rotate(result.refs.begin(), result.refs.begin() + 1, result.refs.end());
  112|       |          // start at refs[0]?
  113|  4.05M|          if (result.refs.at(0) == start)
  ------------------
  |  Branch (113:15): [True: 1.09M, False: 2.95M]
  ------------------
  114|  1.09M|            break;
  115|  4.05M|        }
  116|       |
  117|       |        // convert from U to desired U/Z/4
  118|       |        // (don't change refs[0]!)
  119|  1.09M|        switch (shape) {
  ------------------
  |  Branch (119:17): [True: 1.09M, False: 0]
  ------------------
  120|  1.09M|          case OBStereo::ShapeU:
  ------------------
  |  Branch (120:11): [True: 1.09M, False: 0]
  ------------------
  121|  1.09M|            break;
  122|      0|          case OBStereo::ShapeZ:
  ------------------
  |  Branch (122:11): [True: 0, False: 1.09M]
  ------------------
  123|      0|            OBStereo::Permutate(result.refs, 2, 3); // convert to Z shape
  124|      0|            break;
  125|      0|          case OBStereo::Shape4:
  ------------------
  |  Branch (125:11): [True: 0, False: 1.09M]
  ------------------
  126|      0|            OBStereo::Permutate(result.refs, 1, 2); // convert to 4 shape
  127|      0|            break;
  128|  1.09M|        }
  129|       |
  130|  1.09M|        return result;
  131|  1.09M|      }

_ZN9OpenBabel11OBAtomTyper7GetSizeEv:
   54|      1|    size_t GetSize() override { return _vinthyb.size(); }
_ZN9OpenBabel15OBAromaticTyperC2Ev:
   76|      1|    OBAromaticTyper() {};
_ZN9OpenBabel15OBAromaticTyperD2Ev:
   77|      1|    ~OBAromaticTyper() {};

_ZN9OpenBabel9AliasData6ExpandERNS_5OBMolEj:
   48|  3.75k|  {
   49|       |    /*
   50|       |    Interprets the alias text and adds atom(s) as appropriate to mol.
   51|       |    Tries the following in turn until one is successful:
   52|       |    1) If starts with number treat as isotope+element e.g. 2H
   53|       |    2) Looks up alias in superatom.txt e.g. COOH Pr
   54|       |    3) If of the form Rn stored as a * atom with Atom Class data
   55|       |    Returns false if none are successful.
   56|       |    */
   57|       |
   58|       |    //parse as isotopic atom
   59|  3.75k|    if(isdigit(_alias[0]))
  ------------------
  |  Branch (59:8): [True: 2.20k, False: 1.55k]
  ------------------
   60|  2.20k|    {
   61|  2.20k|      std::stringstream ss(_alias);
   62|  2.20k|      int iso;
   63|  2.20k|      std::string el;
   64|  2.20k|      ss >> iso >>el;
   65|  2.20k|      unsigned int elemno = OBElements::GetAtomicNum(el.c_str());
   66|  2.20k|      if(elemno > 0)
  ------------------
  |  Branch (66:10): [True: 73, False: 2.13k]
  ------------------
   67|     73|      {
   68|     73|        OBAtom* pAtom = mol.GetAtom(atomindex);
   69|     73|        if(!pAtom)
  ------------------
  |  Branch (69:12): [True: 0, False: 73]
  ------------------
   70|      0|          return false;
   71|     73|        pAtom->SetIsotope(iso);
   72|     73|        pAtom->SetAtomicNum(elemno);
   73|     73|        return true;
   74|     73|      }
   75|  2.20k|    }
   76|       |
   77|  3.68k|    if(FromNameLookup(mol, atomindex))
  ------------------
  |  Branch (77:8): [True: 0, False: 3.68k]
  ------------------
   78|      0|      return true;
   79|       |
   80|       |    // Rn is stored as an atom with 0 atomic number and atomclass = n
   81|       |    // R', R'' etc. are treated as R1, R2
   82|       |    // Note that if the name contains anything after the number it is ignored.
   83|  3.68k|    if(_alias[0]=='R' && (_alias[1]=='\'' || isdigit(_alias[1])))
  ------------------
  |  Branch (83:8): [True: 1.16k, False: 2.51k]
  |  Branch (83:27): [True: 579, False: 588]
  |  Branch (83:46): [True: 72, False: 516]
  ------------------
   84|    651|    {
   85|    651|      unsigned int n = 1;
   86|    651|      if(_alias[1]=='\'')
  ------------------
  |  Branch (86:10): [True: 579, False: 72]
  ------------------
   87|    858|        while(n<_alias.size()-1 && _alias[n]==_alias[n+1]) n++;
  ------------------
  |  Branch (87:15): [True: 418, False: 440]
  |  Branch (87:36): [True: 279, False: 139]
  ------------------
   88|     72|      else
   89|     72|        n = atoi(_alias.c_str()+1);
   90|       |
   91|    651|      OBPairInteger *atomclass = new OBPairInteger();
   92|    651|      atomclass->SetAttribute("Atom Class");
   93|    651|      atomclass->SetValue(n);
   94|    651|      mol.GetAtom(atomindex)->SetData(atomclass);
   95|       |
   96|    651|      if(atomindex <= mol.NumAtoms()) //needed for Rn aliases in mdlformat
  ------------------
  |  Branch (96:10): [True: 651, False: 0]
  ------------------
   97|    651|        mol.GetAtom(atomindex)->SetAtomicNum(0);
   98|       |
   99|    651|      _right_form = _alias;
  100|    651|      return true;
  101|    651|    }
  102|       |
  103|  3.03k|    obErrorLog.ThrowError(__FUNCTION__, "Alias " + _alias +
  104|  3.03k|      " was not chemically interpreted\n", obWarning, onceOnly);
  105|  3.03k|    return false;
  106|  3.68k|  }
_ZN9OpenBabel9AliasData14FromNameLookupERNS_5OBMolEj:
  109|  3.68k|{
  110|       |  /*Converts an alias name (like COOH) to real chemistry:
  111|       |    looks up in a table loaded from superatom.txt;
  112|       |    converts the SMILES of the fragment and adds it to the molecule.
  113|       |    If the molecule already has atom coordinates, generates coordinates
  114|       |    for the new atoms, using builder for 3D and MCDL for 2D.
  115|       |  */
  116|       |
  117|  3.68k|  OBAtom* XxAtom = mol.GetAtom(atomindex);
  118|  3.68k|  if(!XxAtom)
  ------------------
  |  Branch (118:6): [True: 0, False: 3.68k]
  ------------------
  119|      0|    return false;
  120|       |/*  if(XxAtom->GetExplicitDegree()>1)
  121|       |  {
  122|       |    obErrorLog.ThrowError(__FUNCTION__, _alias + " is multivalent, which is currently not supported.", obWarning);
  123|       |    return false;
  124|       |  }
  125|       |*/
  126|  3.68k|  SuperAtomTable::iterator pos = table().find(_alias);
  127|  3.68k|  if(pos==table().end())
  ------------------
  |  Branch (127:6): [True: 3.68k, False: 0]
  ------------------
  128|  3.68k|    return false;
  129|       |
  130|      0|  int dimension=0;
  131|      0|  if(mol.Has3D())
  ------------------
  |  Branch (131:6): [True: 0, False: 0]
  ------------------
  132|      0|    dimension=3;
  133|      0|  else if(mol.Has2D())
  ------------------
  |  Branch (133:11): [True: 0, False: 0]
  ------------------
  134|      0|    dimension=2;
  135|      0|  mol.SetDimension(dimension);
  136|       |
  137|       |  //Convert SMILES of alias
  138|      0|  OBConversion conv;
  139|      0|  OBMol obFrag;
  140|      0|  obFrag.SetIsPatternStructure();
  141|      0|  if(conv.SetInFormat("smi"))
  ------------------
  |  Branch (141:6): [True: 0, False: 0]
  ------------------
  142|      0|  {
  143|      0|    conv.ReadString(&obFrag, '*' + pos->second.smiles);//Add dummy atom to SMILES
  144|      0|    _right_form = pos->second.right_form;
  145|      0|    _color      = pos->second.color;
  146|      0|  }
  147|       |  // Need at least the dummy * plus one real atom to expand the alias.
  148|      0|  if(obFrag.NumAtoms() < 2)
  ------------------
  |  Branch (148:6): [True: 0, False: 0]
  ------------------
  149|      0|    return false;
  150|      0|  obFrag.SetDimension(dimension);//will be same as parent
  151|       |
  152|       |  //Find index of *first* atom to which XxAtom is attached (could be NULL)
  153|      0|  OBBondIterator bi;
  154|      0|  OBAtom* firstAttachAtom = XxAtom->BeginNbrAtom(bi);
  155|      0|  unsigned mainAttachIdx = firstAttachAtom ? firstAttachAtom->GetIdx() : 0;
  ------------------
  |  Branch (155:28): [True: 0, False: 0]
  ------------------
  156|      0|  unsigned int firstAttachFlags = 0;
  157|      0|  unsigned int firstAttachOrder = 1;
  158|      0|  if (firstAttachAtom) {
  ------------------
  |  Branch (158:7): [True: 0, False: 0]
  ------------------
  159|      0|    OBBond* attachBond = mol.GetBond(XxAtom, firstAttachAtom);
  160|      0|    if (attachBond) {
  ------------------
  |  Branch (160:9): [True: 0, False: 0]
  ------------------
  161|      0|      firstAttachFlags = attachBond->GetFlags();
  162|      0|      firstAttachOrder = attachBond->GetBondOrder();
  163|      0|    }
  164|      0|  }
  165|       |  //++Make list of other attachments* of XxAtom
  166|       |  // (Added later so that the existing bonding of the XXAtom are retained)
  167|      0|  vector<pair<OBAtom*, unsigned> > otherAttachments;
  168|      0|  OBAtom* pAttach;
  169|      0|  while(firstAttachAtom && (pAttach = XxAtom->NextNbrAtom(bi)) ) // extra parentheses to minimize warnings
  ------------------
  |  Branch (169:9): [True: 0, False: 0]
  |  Branch (169:28): [True: 0, False: 0]
  ------------------
  170|      0|    otherAttachments.push_back(make_pair(pAttach, (*bi)->GetBondOrder()));
  171|       |
  172|       |  //Copy coords of XxAtom to the first real atom in the fragment
  173|       |  //so that the connecting bond is well defined for 2D case
  174|      0|  obFrag.GetAtom(2)->SetVector( XxAtom->GetVector());
  175|       |
  176|       |  //delete original Xx atom
  177|      0|  mol.DeleteAtom(XxAtom, false);//delay deletion of the OBAtom object because this is attached to it
  178|       |  //Correct indices for the deletion
  179|      0|  if(atomindex<mainAttachIdx)
  ------------------
  |  Branch (179:6): [True: 0, False: 0]
  ------------------
  180|      0|    --mainAttachIdx;
  181|       |
  182|       |  //Find the eventual index of first atom in fragment
  183|      0|  unsigned newFragIdx = mol.NumAtoms()+1;
  184|       |
  185|       |  //Give the fragment appropriate coordinates
  186|      0|  if(dimension==3)
  ------------------
  |  Branch (186:6): [True: 0, False: 0]
  ------------------
  187|      0|  {
  188|      0|    OBBuilder builder;
  189|       |
  190|      0|    builder.Build(obFrag);
  191|      0|    obFrag.DeleteAtom(obFrag.GetAtom(1));//remove dummy atom
  192|      0|    mol += obFrag; //Combine with main molecule
  193|      0|    if(mainAttachIdx) {
  ------------------
  |  Branch (193:8): [True: 0, False: 0]
  ------------------
  194|      0|      builder.Connect(mol, mainAttachIdx, newFragIdx,XxAtom->GetVector(),firstAttachOrder);
  195|      0|    }
  196|      0|  }
  197|      0|  else // 0D, 2D
  198|      0|  {
  199|      0|    obFrag.DeleteAtom(obFrag.GetAtom(1));//remove dummy atom
  200|      0|    mol += obFrag; //Combine with main molecule and connect
  201|      0|    if(mainAttachIdx)
  ------------------
  |  Branch (201:8): [True: 0, False: 0]
  ------------------
  202|      0|      mol.AddBond(mainAttachIdx, newFragIdx, 1, firstAttachFlags);
  203|      0|  }
  204|       |
  205|      0|  if(dimension==2)//Use MCDL
  ------------------
  |  Branch (205:6): [True: 0, False: 0]
  ------------------
  206|      0|    groupRedraw(&mol, mol.NumBonds()-1, newFragIdx, true);
  207|       |
  208|       |  //++Add bonds from list to newFragIdx
  209|      0|  while(!otherAttachments.empty())
  ------------------
  |  Branch (209:9): [True: 0, False: 0]
  ------------------
  210|      0|  {
  211|      0|    mol.AddBond(otherAttachments.back().first->GetIdx(), newFragIdx, otherAttachments.back().second);
  212|      0|    otherAttachments.pop_back();
  213|      0|  }
  214|       |
  215|       |  //Store the ids of the atoms which replace the alias (the last atoms in the combined molecule).
  216|       |  //The ids do not change when other atoms are deleted.
  217|      0|  for(unsigned i=obFrag.NumAtoms();i;--i)
  ------------------
  |  Branch (217:36): [True: 0, False: 0]
  ------------------
  218|      0|    _expandedatoms.push_back(mol.GetAtom(mol.NumAtoms()-i +1)->GetId());
  219|       |
  220|       |  //Make a copy of this AliasData object (currently attached to XxAtom)
  221|       |  //and attach it to the first atom of the fragment.
  222|      0|  if (OBAtom* newFragAtom = mol.GetAtom(newFragIdx))
  ------------------
  |  Branch (222:15): [True: 0, False: 0]
  ------------------
  223|      0|    newFragAtom->CloneData(this);
  224|       |
  225|      0|  delete(XxAtom);
  226|      0|  return true;
  227|      0|}
_ZN9OpenBabel9AliasData8LoadFileERNSt3__13mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS0_9AliasItemENS1_4lessIS8_EENS6_INS1_4pairIKS8_S9_EEEEEE:
  230|  7.36k|{
  231|       |  //In table: key=alias left-form; value=pair<alias right-form, SMILES>
  232|  7.36k|  ifstream ifs;
  233|  7.36k|  if (OpenDatafile(ifs, "superatom.txt").length() == 0)
  ------------------
  |  Branch (233:7): [True: 7.36k, False: 0]
  ------------------
  234|  7.36k|  {
  235|  7.36k|    obErrorLog.ThrowError(__FUNCTION__, "Cannot open superatom.txt", obError);
  236|  7.36k|    return false;
  237|  7.36k|  }
  238|      0|  string ln;
  239|      0|  while(getline(ifs, ln))
  ------------------
  |  Branch (239:9): [True: 0, False: 0]
  ------------------
  240|      0|  {
  241|      0|    if (ln[0]=='#' || ln.empty())
  ------------------
  |  Branch (241:9): [True: 0, False: 0]
  |  Branch (241:23): [True: 0, False: 0]
  ------------------
  242|      0|      continue;
  243|      0|    std::vector<string> vec;
  244|      0|    if(tokenize(vec, ln) && vec.size()>=3)
  ------------------
  |  Branch (244:8): [True: 0, False: 0]
  |  Branch (244:29): [True: 0, False: 0]
  ------------------
  245|      0|    {
  246|       |      //table[ vec[0] ] = make_pair(vec[1], vec[2]);
  247|      0|      AliasItem item;
  248|      0|      item.right_form = vec[1];
  249|      0|      item.smiles     = vec[2];
  250|      0|      item.color      = vec.size()>=4 ? vec[3] : "";
  ------------------
  |  Branch (250:25): [True: 0, False: 0]
  ------------------
  251|      0|      table[ vec[0] ] = item;
  252|      0|    }
  253|      0|  }
  254|      0|  return true;
  255|  7.36k|}
_ZN9OpenBabel10OpGenAliasC2EPKc:
  398|      2|  OpGenAlias(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel6OBAtomC2Ev:
  117|  11.0M|  {
  118|  11.0M|    _parent = nullptr;
  119|  11.0M|    Clear();
  120|  11.0M|  }
_ZN9OpenBabel6OBAtomD2Ev:
  123|  11.0M|  {
  124|  11.0M|    if (_residue != nullptr)
  ------------------
  |  Branch (124:9): [True: 394, False: 11.0M]
  ------------------
  125|    394|      {
  126|    394|        _residue->RemoveAtom(this);
  127|    394|      }
  128|       |    /*
  129|       |      if (!_vdata.empty())
  130|       |      {
  131|       |      vector<OBGenericData*>::iterator m;
  132|       |      for (m = _vdata.begin();m != _vdata.end();++m)
  133|       |      delete *m;
  134|       |      _vdata.clear();
  135|       |      }
  136|       |    */
  137|  11.0M|  }
_ZN9OpenBabel6OBAtom5ClearEv:
  140|  11.0M|  {
  141|  11.0M|    _c = nullptr;
  142|  11.0M|    _cidx = 0;
  143|  11.0M|    _flags=0;
  144|  11.0M|    _idx = 0;
  145|  11.0M|    _hyb = 0;
  146|  11.0M|    _ele = (char)0;
  147|  11.0M|    _isotope = 0;
  148|  11.0M|    _spinmultiplicity=0; // CM 18 Sept 2003
  149|  11.0M|    _imph = 0;
  150|  11.0M|    _fcharge = 0;
  151|  11.0M|    _type[0] = '\0';
  152|  11.0M|    _pcharge = 0.0;
  153|  11.0M|    _vbond.clear();
  154|  11.0M|    _vbond.reserve(4);
  155|  11.0M|    _residue = nullptr;
  156|  11.0M|    _id = NoId;
  157|       |
  158|  11.0M|    return(OBBase::Clear());
  159|  11.0M|  }
_ZN9OpenBabel6OBAtomaSERS0_:
  164|  9.72M|  {
  165|  9.72M|    if (this != &src) {
  ------------------
  |  Branch (165:9): [True: 9.72M, False: 0]
  ------------------
  166|  9.72M|      _idx = src.GetIdx();
  167|  9.72M|      Duplicate(&src);
  168|  9.72M|    }
  169|  9.72M|    return(*this);
  170|  9.72M|  }
_ZN9OpenBabel6OBAtom9DuplicateEPS0_:
  173|  9.72M|  {
  174|  9.72M|    if (!src)
  ------------------
  |  Branch (174:9): [True: 0, False: 9.72M]
  ------------------
  175|      0|      return;
  176|       |
  177|  9.72M|    _hyb = src->_hyb;
  178|  9.72M|    _ele = src->_ele;
  179|  9.72M|    _imph = src->_imph;
  180|  9.72M|    _isotope = src->_isotope;
  181|  9.72M|    _fcharge = src->_fcharge;
  182|  9.72M|    _spinmultiplicity = src->_spinmultiplicity;
  183|  9.72M|    strncpy(_type,src->_type, sizeof(_type) - 1);
  184|  9.72M|    _type[sizeof(_type) - 1] = '\0';
  185|  9.72M|    _pcharge = src->_pcharge;
  186|  9.72M|    _v = src->GetVector();
  187|  9.72M|    _flags = src->_flags;
  188|  9.72M|    _residue = nullptr;
  189|  9.72M|    _id = src->_id;
  190|       |
  191|  9.72M|    _vdata.clear();
  192|       |    //Copy all the OBGenericData, providing the new atom
  193|  9.72M|    vector<OBGenericData*>::iterator itr;
  194|  11.3M|    for(itr=src->BeginData();itr!=src->EndData();++itr)
  ------------------
  |  Branch (194:30): [True: 1.64M, False: 9.72M]
  ------------------
  195|  1.64M|      {
  196|  1.64M|        OBGenericData* pCopiedData = (*itr)->Clone(this);
  197|  1.64M|        SetData(pCopiedData);
  198|  1.64M|      }
  199|  9.72M|  }
_ZN9OpenBabel6OBAtom11IsConnectedEPS0_:
  202|  67.7M|  {
  203|  67.7M|    OBBondIterator i;
  204|  67.7M|    OBBond *bond;
  205|       |
  206|   459M|    for (bond = BeginBond(i);bond;bond = NextBond(i))
  ------------------
  |  Branch (206:30): [True: 394M, False: 65.1M]
  ------------------
  207|   394M|      if (bond->GetBeginAtom() == a1 || bond->GetEndAtom() == a1)
  ------------------
  |  Branch (207:11): [True: 2.37M, False: 391M]
  |  Branch (207:41): [True: 221k, False: 391M]
  ------------------
  208|  2.59M|        return(true);
  209|       |
  210|  65.1M|    return(false);
  211|  67.7M|  }
_ZN9OpenBabel6OBAtom10IsOneThreeEPS0_:
  214|     86|  {
  215|     86|    OBAtom *atom1,*atom2;
  216|     86|    OBBond *bond1,*bond2;
  217|     86|    OBBondIterator i,j;
  218|     86|    atom1 = this;
  219|     86|    atom2 = a1;
  220|       |
  221|     86|    for (bond1 = atom1->BeginBond(i);bond1;bond1 = atom1->NextBond(i))
  ------------------
  |  Branch (221:38): [True: 0, False: 86]
  ------------------
  222|      0|      for (bond2 = atom2->BeginBond(j);bond2;bond2 = atom2->NextBond(j))
  ------------------
  |  Branch (222:40): [True: 0, False: 0]
  ------------------
  223|      0|        if (bond1->GetNbrAtom(atom1) == bond2->GetNbrAtom(atom2))
  ------------------
  |  Branch (223:13): [True: 0, False: 0]
  ------------------
  224|      0|          return(true);
  225|       |
  226|     86|    return(false);
  227|     86|  }
_ZN9OpenBabel6OBAtom14HasBondOfOrderEj:
  289|   683k|  {
  290|   683k|    OBBond *bond;
  291|   683k|    OBBondIterator i;
  292|  2.78M|    for (bond = BeginBond(i);bond;bond = NextBond(i))
  ------------------
  |  Branch (292:30): [True: 2.37M, False: 414k]
  ------------------
  293|  2.37M|      if (bond->GetBondOrder() == order)
  ------------------
  |  Branch (293:11): [True: 269k, False: 2.10M]
  ------------------
  294|   269k|        return(true);
  295|       |
  296|   414k|    return(false);
  297|   683k|  }
_ZN9OpenBabel6OBAtom16HasNonSingleBondEv:
  324|  33.3k|  {
  325|  33.3k|    OBBond *bond;
  326|  33.3k|    OBBondIterator i;
  327|  64.8k|    for (bond = BeginBond(i);bond;bond = NextBond(i))
  ------------------
  |  Branch (327:30): [True: 35.6k, False: 29.2k]
  ------------------
  328|  35.6k|      if (bond->GetBondOrder() != 1)
  ------------------
  |  Branch (328:11): [True: 4.11k, False: 31.5k]
  ------------------
  329|  4.11k|        return(true);
  330|       |
  331|  29.2k|    return(false);
  332|  33.3k|  }
_ZN9OpenBabel6OBAtom9GetVectorEv:
  377|  1.63G|  {
  378|  1.63G|    if (!_c)
  ------------------
  |  Branch (378:9): [True: 1.61G, False: 17.0M]
  ------------------
  379|  1.61G|      return(_v);
  380|       |
  381|  17.0M|    _v.Set((*_c)[_cidx],(*_c)[_cidx+1],(*_c)[_cidx+2]);
  382|  17.0M|    return(_v);
  383|  1.63G|  }
_ZN9OpenBabel6OBAtom9SetVectorEv:
  395|  1.59G|  {
  396|       |    //    obAssert(_c);
  397|  1.59G|    if (_c)
  ------------------
  |  Branch (397:9): [True: 1.59G, False: 0]
  ------------------
  398|  1.59G|      _v.Set((*_c)[_cidx],(*_c)[_cidx+1],(*_c)[_cidx+2]);
  399|  1.59G|  }
_ZN9OpenBabel6OBAtom9SetVectorERKNS_7vector3E:
  402|  1.43M|  {
  403|  1.43M|    if (!_c)
  ------------------
  |  Branch (403:9): [True: 282k, False: 1.15M]
  ------------------
  404|   282k|      _v = v;
  405|  1.15M|    else
  406|  1.15M|      {
  407|  1.15M|        (*_c)[_cidx  ] = v.x();
  408|  1.15M|        (*_c)[_cidx+1] = v.y();
  409|  1.15M|        (*_c)[_cidx+2] = v.z();
  410|  1.15M|      }
  411|  1.43M|  }
_ZN9OpenBabel6OBAtom9SetVectorEddd:
  414|  16.8k|  {
  415|  16.8k|    if (!_c)
  ------------------
  |  Branch (415:9): [True: 16.8k, False: 0]
  ------------------
  416|  16.8k|      _v.Set(v_x,v_y,v_z);
  417|      0|    else
  418|      0|      {
  419|      0|        (*_c)[_cidx  ] = v_x;
  420|      0|        (*_c)[_cidx+1] = v_y;
  421|      0|        (*_c)[_cidx+2] = v_z;
  422|      0|      }
  423|  16.8k|  }
_ZN9OpenBabel6OBAtom7SetTypeEPKc:
  426|   429k|  {
  427|   429k|    strncpy(_type,type, sizeof(_type) - 1);
  428|   429k|    _type[sizeof(_type) - 1] = '\0';
  429|   429k|    if (_ele == 1 && type[0] == 'D')
  ------------------
  |  Branch (429:9): [True: 37.1k, False: 392k]
  |  Branch (429:22): [True: 0, False: 37.1k]
  ------------------
  430|      0|      _isotope = 2;
  431|   429k|  }
_ZN9OpenBabel6OBAtom7SetTypeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  434|  15.5k|  {
  435|  15.5k|    strncpy(_type,type.c_str(), sizeof(_type) - 1);
  436|  15.5k|    _type[sizeof(_type) - 1] = '\0';
  437|  15.5k|    if (_ele == 1 && type[0] == 'D')
  ------------------
  |  Branch (437:9): [True: 23, False: 15.4k]
  |  Branch (437:22): [True: 0, False: 23]
  ------------------
  438|      0|      _isotope = 2;
  439|  15.5k|  }
_ZN9OpenBabel6OBAtom10SetIsotopeEj:
  442|  20.1k|  {
  443|  20.1k|    _isotope = iso;
  444|  20.1k|  }
_ZN9OpenBabel6OBAtom10GetResidueEv:
  447|  1.44M|  {
  448|  1.44M|    OBMol *mol = this->GetParent();
  449|  1.44M|    if (!mol->HasChainsPerceived())
  ------------------
  |  Branch (449:9): [True: 0, False: 1.44M]
  ------------------
  450|      0|      chainsparser.PerceiveChains(*mol);
  451|       |
  452|  1.44M|    return _residue;
  453|  1.44M|  }
_ZNK9OpenBabel6OBAtom13GetAtomicMassEv:
  456|   393k|  {
  457|   393k|    if (_isotope == 0)
  ------------------
  |  Branch (457:9): [True: 381k, False: 12.3k]
  ------------------
  458|   381k|      return OBElements::GetMass(_ele);
  459|  12.3k|    else
  460|  12.3k|      return OBElements::GetExactMass(_ele, _isotope);
  461|   393k|  }
_ZNK9OpenBabel6OBAtom12GetExactMassEv:
  464|   393k|  {
  465|   393k|    return OBElements::GetExactMass(_ele, _isotope);
  466|   393k|  }
_ZN9OpenBabel6OBAtom7GetTypeEv:
  469|   757k|  {
  470|   757k|    OBMol *mol = (OBMol*)GetParent();
  471|   757k|    if (mol)
  ------------------
  |  Branch (471:9): [True: 757k, False: 0]
  ------------------
  472|   757k|      if (!mol->HasAtomTypesPerceived())
  ------------------
  |  Branch (472:11): [True: 198, False: 757k]
  ------------------
  473|    198|        atomtyper.AssignTypes(*((OBMol*)GetParent()));
  474|       |
  475|   757k|    if (strlen(_type) == 0) // Somehow we still don't have a type!
  ------------------
  |  Branch (475:9): [True: 3.48k, False: 754k]
  ------------------
  476|  3.48k|      {
  477|  3.48k|        char num[6];
  478|  3.48k|        string fromType = ttab.GetFromType(); // save previous types
  479|  3.48k|        string toType = ttab.GetToType();
  480|       |
  481|  3.48k|        ttab.SetFromType("ATN");
  482|  3.48k|        ttab.SetToType("INT");
  483|  3.48k|        snprintf(num, 6, "%d", GetAtomicNum());
  484|  3.48k|        ttab.Translate(_type, num);
  485|       |
  486|  3.48k|        ttab.SetFromType(fromType.c_str());
  487|  3.48k|        ttab.SetToType(toType.c_str());
  488|  3.48k|      }
  489|   757k|    if (_ele == 1 && _isotope == 2)
  ------------------
  |  Branch (489:9): [True: 87.3k, False: 670k]
  |  Branch (489:22): [True: 86, False: 87.2k]
  ------------------
  490|     86|      snprintf(_type, 6, "%s", "D");
  491|       |
  492|   757k|    return(_type);
  493|   757k|  }
_ZNK9OpenBabel6OBAtom6GetHybEv:
  496|  9.93M|  {
  497|       |    //hybridization is assigned when atoms are typed
  498|  9.93M|    OBMol *mol = (OBMol*)((OBAtom*)this)->GetParent();
  499|  9.93M|    if (mol && !mol->HasHybridizationPerceived())
  ------------------
  |  Branch (499:9): [True: 9.93M, False: 0]
  |  Branch (499:16): [True: 258k, False: 9.67M]
  ------------------
  500|   258k|      atomtyper.AssignHyb(*mol);
  501|       |
  502|  9.93M|    return(_hyb);
  503|  9.93M|  }
_ZNK9OpenBabel6OBAtom12GetHvyDegreeEv:
  507|   598k|  {
  508|   598k|    unsigned int count=0;
  509|       |
  510|   598k|    OBBond *bond;
  511|   598k|    OBBondIterator i;
  512|  2.14M|    for (bond = ((OBAtom*)this)->BeginBond(i); bond; bond = ((OBAtom*)this)->NextBond(i))
  ------------------
  |  Branch (512:48): [True: 1.54M, False: 598k]
  ------------------
  513|  1.54M|      if (bond->GetNbrAtom((OBAtom*)this)->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (513:11): [True: 1.13M, False: 415k]
  ------------------
  514|  1.13M|        count++;
  515|       |
  516|   598k|    return(count);
  517|   598k|  }
_ZN9OpenBabel6OBAtom16GetPartialChargeEv:
  532|   848k|  {
  533|   848k|    if (!GetParent())
  ------------------
  |  Branch (533:9): [True: 0, False: 848k]
  ------------------
  534|      0|      return(_pcharge);
  535|   848k|    if (!((OBMol*)GetParent())->AutomaticPartialCharge())
  ------------------
  |  Branch (535:9): [True: 824k, False: 24.8k]
  ------------------
  536|   824k|      return(_pcharge);
  537|       |
  538|  24.8k|    if (!((OBMol*)GetParent())->HasPartialChargesPerceived())
  ------------------
  |  Branch (538:9): [True: 926, False: 23.9k]
  ------------------
  539|    926|      {
  540|       |        //seed partial charges are set in the atom typing procedure
  541|    926|        OBAtom *atom;
  542|    926|        OBMol *mol = (OBMol*)GetParent();
  543|    926|        vector<OBAtom*>::iterator i;
  544|   105k|        for (atom = mol->BeginAtom(i); atom; atom = mol->NextAtom(i))
  ------------------
  |  Branch (544:40): [True: 104k, False: 926]
  ------------------
  545|   104k|          atom->SetPartialCharge(0.0);
  546|       |
  547|    926|        phmodel.AssignSeedPartialCharge(*((OBMol*)GetParent()));
  548|    926|        OBGastChrg gc;
  549|    926|        gc.AssignPartialCharges(*((OBMol*)GetParent()));
  550|    926|      }
  551|       |
  552|  24.8k|    return(_pcharge);
  553|   848k|  }
_ZN9OpenBabel6OBAtom16IsCarboxylOxygenEv:
  595|   447k|  {
  596|   447k|    if (GetAtomicNum() != OBElements::Oxygen)
  ------------------
  |  Branch (596:9): [True: 437k, False: 9.97k]
  ------------------
  597|   437k|      return(false);
  598|  9.97k|    if (GetHvyDegree() != 1)
  ------------------
  |  Branch (598:9): [True: 6.02k, False: 3.95k]
  ------------------
  599|  6.02k|      return(false);
  600|       |
  601|  3.95k|    OBAtom *atom;
  602|  3.95k|    OBBond *bond;
  603|  3.95k|    OBBondIterator i;
  604|       |
  605|  3.95k|    atom = nullptr;
  606|  7.12k|    for (bond = BeginBond(i);bond;bond = NextBond(i))
  ------------------
  |  Branch (606:30): [True: 3.95k, False: 3.17k]
  ------------------
  607|  3.95k|      if ((bond->GetNbrAtom(this))->GetAtomicNum() == OBElements::Carbon)
  ------------------
  |  Branch (607:11): [True: 777, False: 3.17k]
  ------------------
  608|    777|        {
  609|    777|          atom = bond->GetNbrAtom(this);
  610|    777|          break;
  611|    777|        }
  612|  3.95k|    if (!atom)
  ------------------
  |  Branch (612:9): [True: 3.17k, False: 777]
  ------------------
  613|  3.17k|      return(false);
  614|    777|    if (!(atom->CountFreeOxygens() == 2)
  ------------------
  |  Branch (614:9): [True: 720, False: 57]
  ------------------
  615|    720|      && !(atom->CountFreeOxygens() == 1 && atom->CountFreeSulfurs() == 1))
  ------------------
  |  Branch (615:12): [True: 674, False: 46]
  |  Branch (615:45): [True: 9, False: 665]
  ------------------
  616|    711|      return(false);
  617|       |
  618|       |    //atom is connected to a carbon that has a total
  619|       |    //of 2 attached free oxygens or 1 free oxygen and 1 free sulfur
  620|     66|    return(true);
  621|    777|  }
_ZNK9OpenBabel6OBAtom10IsAromaticEv:
  775|  12.7M|  {
  776|  12.7M|    OBMol *mol = ((OBAtom*)this)->GetParent();
  777|  12.7M|    if (!mol->HasAromaticPerceived())
  ------------------
  |  Branch (777:9): [True: 3.62k, False: 12.7M]
  ------------------
  778|  3.62k|      aromtyper.AssignAromaticFlags(*mol);
  779|       |
  780|  12.7M|    if (((OBAtom*)this)->HasFlag(OB_AROMATIC_ATOM))
  ------------------
  |  |   56|  12.7M|#define OB_AROMATIC_ATOM  (1<<3)
  ------------------
  |  Branch (780:9): [True: 865k, False: 11.8M]
  ------------------
  781|   865k|      return true;
  782|       |
  783|  11.8M|    return false;
  784|  12.7M|  }
_ZNK9OpenBabel6OBAtom8IsInRingEv:
  787|   221M|  {
  788|   221M|    OBMol *mol = ((OBAtom*)this)->GetParent();
  789|   221M|    if (!mol->HasRingAtomsAndBondsPerceived())
  ------------------
  |  Branch (789:9): [True: 4.53k, False: 221M]
  ------------------
  790|  4.53k|      mol->FindRingAtomsAndBonds();
  791|       |
  792|   221M|    if (((OBAtom*)this)->HasFlag(OB_RING_ATOM))
  ------------------
  |  |   58|   221M|#define OB_RING_ATOM      (1<<4)
  ------------------
  |  Branch (792:9): [True: 25.8M, False: 195M]
  ------------------
  793|  25.8M|      return true;
  794|       |
  795|   195M|    return false;
  796|   221M|  }
_ZNK9OpenBabel6OBAtom10IsPeriodicEv:
  807|  1.86M|  {
  808|  1.86M|    OBMol *mol = (OBMol*)((OBAtom*)this)->GetParent();
  809|  1.86M|    if (mol == nullptr)
  ------------------
  |  Branch (809:9): [True: 0, False: 1.86M]
  ------------------
  810|      0|      return false;
  811|  1.86M|    return mol->IsPeriodic();
  812|  1.86M|  }
_ZNK9OpenBabel6OBAtom12IsInRingSizeEi:
  815|  1.75M|  {
  816|  1.75M|    vector<OBRing*> rlist;
  817|  1.75M|    vector<OBRing*>::iterator i;
  818|       |
  819|  1.75M|    OBMol *mol = (OBMol*)((OBAtom*)this)->GetParent();
  820|  1.75M|    if (!mol->HasSSSRPerceived())
  ------------------
  |  Branch (820:9): [True: 0, False: 1.75M]
  ------------------
  821|      0|      mol->FindSSSR();
  822|       |
  823|  1.75M|    if (!((OBAtom*)this)->HasFlag(OB_RING_ATOM))
  ------------------
  |  |   58|  1.75M|#define OB_RING_ATOM      (1<<4)
  ------------------
  |  Branch (823:9): [True: 1.12M, False: 623k]
  ------------------
  824|  1.12M|      return(false);
  825|       |
  826|   623k|    rlist = mol->GetSSSR();
  827|  9.12M|    for (i = rlist.begin();i != rlist.end();++i)
  ------------------
  |  Branch (827:28): [True: 8.80M, False: 319k]
  ------------------
  828|  8.80M|      if ((*i)->IsInRing(GetIdx()) && static_cast<int>((*i)->Size()) == size)
  ------------------
  |  Branch (828:11): [True: 742k, False: 8.06M]
  |  Branch (828:39): [True: 304k, False: 438k]
  ------------------
  829|   304k|        return(true);
  830|       |
  831|   319k|    return(false);
  832|   623k|  }
_ZN9OpenBabel6OBAtom17SmallestBondAngleEv:
  896|   360k|  {
  897|   360k|    OBAtom *b, *c;
  898|   360k|    vector3 v1, v2;
  899|   360k|    double degrees, minDegrees;
  900|       |    //    vector<OBAtom*>::iterator i;
  901|   360k|    OBBondIterator j,k;
  902|       |
  903|   360k|    minDegrees = 360.0;
  904|       |
  905|  1.10M|    for (b = BeginNbrAtom(j); b; b = NextNbrAtom(j))
  ------------------
  |  Branch (905:31): [True: 745k, False: 360k]
  ------------------
  906|   745k|      {
  907|   745k|        k = j;
  908|  2.04M|        for (c = NextNbrAtom(k); c; c = NextNbrAtom(k))
  ------------------
  |  Branch (908:34): [True: 1.30M, False: 745k]
  ------------------
  909|  1.30M|          {
  910|  1.30M|            degrees = b->GetAngle((OBAtom*)this, c);
  911|  1.30M|            if (degrees < minDegrees)
  ------------------
  |  Branch (911:17): [True: 89.8k, False: 1.21M]
  ------------------
  912|  89.8k|              minDegrees = degrees;
  913|  1.30M|          }
  914|   745k|      }
  915|   360k|    return minDegrees;
  916|   360k|  }
_ZN9OpenBabel6OBAtom16AverageBondAngleEv:
  919|   460k|  {
  920|   460k|    OBAtom *b, *c;
  921|   460k|    vector3 v1, v2;
  922|   460k|    double degrees, avgDegrees;
  923|       |    //    vector<OBAtom*>::iterator i;
  924|   460k|    OBBondIterator j,k;
  925|   460k|    int n=0;
  926|       |
  927|   460k|    avgDegrees = 0.0;
  928|       |
  929|   783k|    for (b = BeginNbrAtom(j); b; b = NextNbrAtom(j))
  ------------------
  |  Branch (929:31): [True: 323k, False: 460k]
  ------------------
  930|   323k|      {
  931|   323k|        k = j;
  932|   889k|        for (c = NextNbrAtom(k); c; c = NextNbrAtom(k))
  ------------------
  |  Branch (932:34): [True: 566k, False: 323k]
  ------------------
  933|   566k|          {
  934|   566k|            degrees = b->GetAngle((OBAtom*)this, c);
  935|   566k|            avgDegrees += degrees;
  936|   566k|            n++;
  937|   566k|          }
  938|   323k|      }
  939|       |
  940|   460k|    if (n >=1)
  ------------------
  |  Branch (940:9): [True: 70.8k, False: 389k]
  ------------------
  941|  70.8k|      avgDegrees /= n;
  942|       |
  943|   460k|    return avgDegrees;
  944|   460k|  }
_ZNK9OpenBabel6OBAtom16CountFreeOxygensEv:
  947|  3.75k|  {
  948|  3.75k|    unsigned int count = 0;
  949|  3.75k|    OBAtom *atom;
  950|  3.75k|    OBBond *bond;
  951|  3.75k|    OBBondIterator i;
  952|       |
  953|  13.8k|    for (bond = ((OBAtom*)this)->BeginBond(i);bond;bond = ((OBAtom*)this)->NextBond(i))
  ------------------
  |  Branch (953:47): [True: 10.1k, False: 3.75k]
  ------------------
  954|  10.1k|      {
  955|  10.1k|        atom = bond->GetNbrAtom((OBAtom*)this);
  956|  10.1k|        if (atom->GetAtomicNum() == OBElements::Oxygen && atom->GetHvyDegree() == 1)
  ------------------
  |  Branch (956:13): [True: 1.96k, False: 8.17k]
  |  Branch (956:59): [True: 1.77k, False: 186]
  ------------------
  957|  1.77k|          count++;
  958|  10.1k|      }
  959|       |
  960|  3.75k|    return(count);
  961|  3.75k|  }
_ZNK9OpenBabel6OBAtom16CountFreeSulfursEv:
  964|    674|  {
  965|    674|    unsigned int count = 0;
  966|    674|    OBAtom *atom;
  967|    674|    OBBond *bond;
  968|    674|    OBBondIterator i;
  969|       |
  970|  2.50k|    for (bond = ((OBAtom*)this)->BeginBond(i);bond;bond = ((OBAtom*)this)->NextBond(i))
  ------------------
  |  Branch (970:47): [True: 1.82k, False: 674]
  ------------------
  971|  1.82k|      {
  972|  1.82k|        atom = bond->GetNbrAtom((OBAtom*)this);
  973|  1.82k|        if (atom->GetAtomicNum() == OBElements::Sulfur && atom->GetHvyDegree() == 1)
  ------------------
  |  Branch (973:13): [True: 70, False: 1.75k]
  |  Branch (973:59): [True: 15, False: 55]
  ------------------
  974|     15|          count++;
  975|  1.82k|      }
  976|       |
  977|    674|    return(count);
  978|    674|  }
_ZNK9OpenBabel6OBAtom18GetExplicitValenceEv:
  981|  11.5M|  {
  982|  11.5M|    unsigned int bosum = 0;
  983|       |
  984|  11.5M|    OBBondIterator i;
  985|   429M|    for (OBBond *bond = ((OBAtom*)this)->BeginBond(i); bond; bond = ((OBAtom*)this)->NextBond(i))
  ------------------
  |  Branch (985:56): [True: 417M, False: 11.5M]
  ------------------
  986|   417M|      bosum += bond->GetBondOrder();
  987|       |
  988|  11.5M|    return bosum;
  989|  11.5M|  }
_ZNK9OpenBabel6OBAtom15GetTotalValenceEv:
  992|   120k|  {
  993|   120k|    return GetExplicitValence() + _imph;
  994|   120k|  }
_ZNK9OpenBabel6OBAtom21ExplicitHydrogenCountEb:
  997|  49.4M|  {
  998|       |    //If ExcludeIsotopes is true, H atoms with _isotope!=0 are not included.
  999|       |    //This excludes D, T and H when _isotope exlicitly set to 1 rather than the default 0.
 1000|  49.4M|    int numH=0;
 1001|  49.4M|    OBAtom *atom;
 1002|  49.4M|    OBBondIterator i;
 1003|   415M|    for (atom = ((OBAtom*)this)->BeginNbrAtom(i);atom;atom = ((OBAtom*)this)->NextNbrAtom(i))
  ------------------
  |  Branch (1003:50): [True: 366M, False: 49.4M]
  ------------------
 1004|   366M|      if (atom->GetAtomicNum() == OBElements::Hydrogen && !(ExcludeIsotopes && atom->GetIsotope()!=0))
  ------------------
  |  Branch (1004:11): [True: 2.46M, False: 363M]
  |  Branch (1004:61): [True: 0, False: 2.46M]
  |  Branch (1004:80): [True: 0, False: 0]
  ------------------
 1005|  2.46M|        numH++;
 1006|       |
 1007|  49.4M|    return(numH);
 1008|  49.4M|  }
_ZN9OpenBabel6OBAtom10DeleteBondEPNS_6OBBondE:
 1055|  7.44M|  {
 1056|  7.44M|    OBBondIterator i;
 1057|  42.2M|    for (i = _vbond.begin();i != _vbond.end();++i)
  ------------------
  |  Branch (1057:29): [True: 42.2M, False: 0]
  ------------------
 1058|  42.2M|      if ((OBBond*)bond == *i)
  ------------------
  |  Branch (1058:11): [True: 7.44M, False: 34.8M]
  ------------------
 1059|  7.44M|        {
 1060|  7.44M|          _vbond.erase(i);
 1061|  7.44M|          return(true);
 1062|  7.44M|        }
 1063|      0|    return(false);
 1064|  7.44M|  }
_ZN9OpenBabel6OBAtom9BeginBondERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 1085|   326M|  {
 1086|   326M|    i = _vbond.begin();
 1087|   326M|    return i == _vbond.end() ? nullptr : (OBBond*)*i;
  ------------------
  |  Branch (1087:12): [True: 2.65M, False: 323M]
  ------------------
 1088|   326M|  }
_ZN9OpenBabel6OBAtom8NextBondERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 1091|  1.61G|  {
 1092|  1.61G|    i++;
 1093|  1.61G|    return i == _vbond.end() ? nullptr : (OBBond*)*i;
  ------------------
  |  Branch (1093:12): [True: 317M, False: 1.29G]
  ------------------
 1094|  1.61G|  }
_ZN9OpenBabel6OBAtom12BeginNbrAtomERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 1097|   629M|  {
 1098|   629M|    i = _vbond.begin();
 1099|   629M|    return i != _vbond.end() ? ((OBBond*) *i)->GetNbrAtom(this) : nullptr;
  ------------------
  |  Branch (1099:12): [True: 626M, False: 2.63M]
  ------------------
 1100|   629M|  }
_ZN9OpenBabel6OBAtom11NextNbrAtomERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 1103|  2.98G|  {
 1104|  2.98G|    i++;
 1105|  2.98G|    return i != _vbond.end() ? ((OBBond*) *i)->GetNbrAtom(this) : nullptr;
  ------------------
  |  Branch (1105:12): [True: 2.85G, False: 131M]
  ------------------
 1106|  2.98G|  }
_ZN9OpenBabel6OBAtom11GetDistanceEPS0_:
 1109|    505|  {
 1110|    505|    if (!IsPeriodic())
  ------------------
  |  Branch (1110:9): [True: 505, False: 0]
  ------------------
 1111|    505|      {
 1112|    505|        return(( this->GetVector() - b->GetVector() ).length());
 1113|    505|      }
 1114|      0|    else
 1115|      0|      {
 1116|      0|        OBUnitCell *box = (OBUnitCell*)GetParent()->GetData(OBGenericDataType::UnitCell);
 1117|      0|        return (box->MinimumImageCartesian(this->GetVector() - b->GetVector())).length();
 1118|      0|      }
 1119|    505|  }
_ZN9OpenBabel6OBAtom8GetAngleEPS0_S1_:
 1133|  1.86M|  {
 1134|  1.86M|    vector3 v1,v2;
 1135|       |
 1136|  1.86M|    v1 = this->GetVector() - b->GetVector();
 1137|  1.86M|    v2 = c->GetVector() - b->GetVector();
 1138|  1.86M|    if (IsPeriodic())
  ------------------
  |  Branch (1138:9): [True: 0, False: 1.86M]
  ------------------
 1139|      0|      {
 1140|      0|        OBUnitCell *box = (OBUnitCell*)GetParent()->GetData(OBGenericDataType::UnitCell);
 1141|      0|        v1 = box->MinimumImageCartesian(v1);
 1142|      0|        v2 = box->MinimumImageCartesian(v2);
 1143|      0|      }
 1144|       |
 1145|  1.86M|    if (fabs(v1.length()) < 1.0e-3
  ------------------
  |  Branch (1145:9): [True: 135, False: 1.86M]
  ------------------
 1146|  1.86M|      || fabs(v2.length()) < 1.0e-3) {
  ------------------
  |  Branch (1146:10): [True: 24, False: 1.86M]
  ------------------
 1147|    159|        return(0.0);
 1148|    159|    }
 1149|       |
 1150|  1.86M|    return(vectorAngle(v1, v2));
 1151|  1.86M|  }
_ZN9OpenBabel6OBAtom16GetNewBondVectorERNS_7vector3Ed:
 1160|  11.7k|  {
 1161|  11.7k|    v = OBBuilder::GetNewBondVector(this, length);
 1162|  11.7k|    return(true);
 1163|  11.7k|  }
_ZN9OpenBabel6OBAtom7GetBondEPS0_:
 1595|  3.45M|  {
 1596|  3.45M|    OBBond *bond;
 1597|  3.45M|    vector<OBBond *>::iterator i;
 1598|  22.6M|    for (bond = BeginBond(i) ; bond ; bond = NextBond(i))
  ------------------
  |  Branch (1598:32): [True: 22.6M, False: 0]
  ------------------
 1599|  22.6M|      if (bond->GetNbrAtom(this) == nbr)
  ------------------
  |  Branch (1599:11): [True: 3.45M, False: 19.1M]
  ------------------
 1600|  3.45M|        return bond;
 1601|      0|    return nullptr;
 1602|  3.45M|  }

_ZN9OpenBabel6OBBase5ClearEv:
   79|  11.9M|  {
   80|  11.9M|    if (!_vdata.empty()) //clean up generic data
  ------------------
  |  Branch (80:9): [True: 16.9k, False: 11.8M]
  ------------------
   81|  16.9k|      {
   82|  16.9k|        OBDataIterator m;
   83|   115k|        for (m = _vdata.begin();m != _vdata.end();++m)
  ------------------
  |  Branch (83:33): [True: 98.0k, False: 16.9k]
  ------------------
   84|  98.0k|          delete *m;
   85|  16.9k|        _vdata.clear();
   86|  16.9k|      }
   87|       |
   88|  11.9M|    return(true);
   89|  11.9M|  }
_ZN9OpenBabel6OBBase7HasDataERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   93|   410k|  {
   94|   410k|    if (_vdata.empty())
  ------------------
  |  Branch (94:9): [True: 258k, False: 152k]
  ------------------
   95|   258k|      return(false);
   96|       |
   97|   152k|    OBDataIterator i;
   98|       |
   99|   628k|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (99:29): [True: 549k, False: 78.7k]
  ------------------
  100|   549k|      if (*i && (*i)->GetAttribute() == s)
  ------------------
  |  Branch (100:11): [True: 549k, False: 0]
  |  Branch (100:17): [True: 73.8k, False: 475k]
  ------------------
  101|  73.8k|        return(true);
  102|       |
  103|  78.7k|    return(false);
  104|   152k|  }
_ZN9OpenBabel6OBBase7HasDataEPKc:
  107|   313k|  {
  108|   313k|    string temp(s);
  109|   313k|    return(HasData(temp));
  110|   313k|  }
_ZN9OpenBabel6OBBase7HasDataEj:
  115|  10.7M|  {
  116|  10.7M|    if (_vdata.empty())
  ------------------
  |  Branch (116:9): [True: 10.2M, False: 525k]
  ------------------
  117|  10.2M|      return(false);
  118|       |
  119|   525k|    OBDataIterator i;
  120|       |
  121|  3.45M|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (121:29): [True: 2.92M, False: 525k]
  ------------------
  122|  2.92M|      if (*i && (*i)->GetDataType() == dt)
  ------------------
  |  Branch (122:11): [True: 2.92M, False: 0]
  |  Branch (122:17): [True: 415, False: 2.92M]
  ------------------
  123|    415|        return(true);
  124|       |
  125|   525k|    return(false);
  126|   525k|  }
_ZN9OpenBabel6OBBase7GetDataERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  130|  78.9k|  {
  131|  78.9k|    OBDataIterator i;
  132|       |
  133|   341k|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (133:29): [True: 332k, False: 8.89k]
  ------------------
  134|   332k|      if (*i && (*i)->GetAttribute() == s)
  ------------------
  |  Branch (134:11): [True: 332k, False: 0]
  |  Branch (134:17): [True: 70.0k, False: 262k]
  ------------------
  135|  70.0k|        return *i;
  136|       |
  137|  8.89k|    return nullptr;
  138|  78.9k|  }
_ZN9OpenBabel6OBBase7GetDataEPKc:
  142|  2.70M|  {
  143|  2.70M|    OBDataIterator i;
  144|       |
  145|  6.86M|    for (i = _vdata.begin(); i != _vdata.end(); ++i)
  ------------------
  |  Branch (145:30): [True: 5.80M, False: 1.06M]
  ------------------
  146|  5.80M|      if (*i && strcmp((*i)->GetAttribute().c_str(), s)==0)
  ------------------
  |  Branch (146:11): [True: 5.80M, False: 0]
  |  Branch (146:17): [True: 1.63M, False: 4.16M]
  ------------------
  147|  1.63M|        return *i;
  148|       |
  149|  1.06M|    return nullptr;
  150|  2.70M|  }
_ZN9OpenBabel6OBBase7GetDataEj:
  153|  1.67M|  {
  154|  1.67M|    OBDataIterator i;
  155|  21.9M|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (155:29): [True: 20.2M, False: 1.67M]
  ------------------
  156|  20.2M|      if (*i && (*i)->GetDataType() == dt)
  ------------------
  |  Branch (156:11): [True: 20.2M, False: 0]
  |  Branch (156:17): [True: 898, False: 20.2M]
  ------------------
  157|    898|        return(*i);
  158|  1.67M|    return nullptr;
  159|  1.67M|  }
_ZN9OpenBabel6OBBase10GetAllDataEj:
  162|  1.62M|  {
  163|  1.62M|    std::vector<OBGenericData *> matches;
  164|       |
  165|       |    // return all values matching this type
  166|  1.62M|    OBDataIterator i;
  167|  6.70M|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (167:29): [True: 5.07M, False: 1.62M]
  ------------------
  168|  5.07M|      if (*i && (*i)->GetDataType() == dt)
  ------------------
  |  Branch (168:11): [True: 5.07M, False: 0]
  |  Branch (168:17): [True: 1.18M, False: 3.88M]
  ------------------
  169|  1.18M|        matches.push_back(*i);
  170|       |
  171|  1.62M|    return(matches);
  172|  1.62M|  }
_ZN9OpenBabel6OBBase10DeleteDataEj:
  201|  11.6M|  {
  202|  11.6M|    vector<OBGenericData*> vdata;
  203|  11.6M|    OBDataIterator i;
  204|   123M|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (204:29): [True: 111M, False: 11.6M]
  ------------------
  205|   111M|      if (*i && (*i)->GetDataType() == dt)
  ------------------
  |  Branch (205:11): [True: 111M, False: 0]
  |  Branch (205:17): [True: 12.6k, False: 111M]
  ------------------
  206|  12.6k|        delete *i;
  207|   111M|      else if (*i)
  ------------------
  |  Branch (207:16): [True: 111M, False: 0]
  ------------------
  208|   111M|        vdata.push_back(*i);
  209|  11.6M|    _vdata = vdata;
  210|  11.6M|  }
_ZN9OpenBabel6OBBase10DeleteDataERNSt3__16vectorIPNS_13OBGenericDataENS1_9allocatorIS4_EEEE:
  213|  6.05k|  {
  214|  6.05k|    vector<OBGenericData*> vdata;
  215|  6.05k|    OBDataIterator i,j;
  216|       |
  217|  6.05k|    bool del;
  218|  32.7k|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (218:29): [True: 26.7k, False: 6.05k]
  ------------------
  219|  26.7k|      {
  220|  26.7k|        del = false;
  221|  26.7k|        for (j = vg.begin();j != vg.end();++j)
  ------------------
  |  Branch (221:29): [True: 0, False: 26.7k]
  ------------------
  222|      0|          if (*i == *j)
  ------------------
  |  Branch (222:15): [True: 0, False: 0]
  ------------------
  223|      0|            {
  224|      0|              del = true;
  225|      0|              break;
  226|      0|            }
  227|  26.7k|        if (del)
  ------------------
  |  Branch (227:13): [True: 0, False: 26.7k]
  ------------------
  228|      0|          delete *i;
  229|  26.7k|        else
  230|  26.7k|          vdata.push_back(*i);
  231|  26.7k|      }
  232|  6.05k|    _vdata = vdata;
  233|  6.05k|  }
_ZN9OpenBabel6OBBase10DeleteDataEPNS_13OBGenericDataE:
  236|    538|  {
  237|    538|    OBDataIterator i;
  238|  1.31k|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (238:29): [True: 1.31k, False: 0]
  ------------------
  239|  1.31k|      if (*i == gd)
  ------------------
  |  Branch (239:11): [True: 538, False: 781]
  ------------------
  240|    538|        {
  241|    538|          delete *i;
  242|    538|          _vdata.erase(i);
  243|    538|          return; //Must stop since iterators invalidated by erase
  244|    538|        }
  245|    538|  }
_ZN9OpenBabel6OBBase10DeleteDataERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  248|   491k|  {
  249|   491k|    OBDataIterator i;
  250|   758k|    for (i = _vdata.begin();i != _vdata.end();++i)
  ------------------
  |  Branch (250:29): [True: 513k, False: 244k]
  ------------------
  251|   513k|    {
  252|   513k|      if (*i && (*i)->GetAttribute() == s)
  ------------------
  |  Branch (252:11): [True: 513k, False: 0]
  |  Branch (252:17): [True: 246k, False: 266k]
  ------------------
  253|   246k|      {
  254|   246k|        delete *i;
  255|   246k|          _vdata.erase(i);
  256|   246k|          return true;
  257|   246k|      }
  258|   513k|    }
  259|   244k|    return false;//not found
  260|   491k|  }

_ZN9OpenBabel8OBBitVec8SetBitOnEj:
   87|   463M|  {
   88|   463M|    unsigned word_offset = bit_offset >> WORDROLL;
  ------------------
  |  |   38|   463M|#define WORDROLL 5
  ------------------
   89|   463M|    bit_offset &= WORDMASK;
  ------------------
  |  |   40|   463M|#define WORDMASK 31
  ------------------
   90|       |
   91|   463M|    if (word_offset >= GetSize())
  ------------------
  |  Branch (91:9): [True: 2.90M, False: 460M]
  ------------------
   92|  2.90M|      ResizeWords(word_offset + 1);
   93|   463M|    _set[word_offset] |= (1<<bit_offset);
   94|   463M|  }
_ZN9OpenBabel8OBBitVec9SetBitOffEj:
  100|  2.41M|  {
  101|  2.41M|    unsigned word_offset = bit_offset >> WORDROLL;
  ------------------
  |  |   38|  2.41M|#define WORDROLL 5
  ------------------
  102|  2.41M|    bit_offset &= WORDMASK;
  ------------------
  |  |   40|  2.41M|#define WORDMASK 31
  ------------------
  103|       |
  104|  2.41M|    if (word_offset < GetSize())
  ------------------
  |  Branch (104:9): [True: 2.41M, False: 0]
  ------------------
  105|  2.41M|      _set[word_offset] &= (~(1 << bit_offset));
  106|  2.41M|  }
_ZN9OpenBabel8OBBitVec10SetRangeOnEjj:
  114|  16.8k|  {
  115|  16.8k|    if (lo_bit_offset > hi_bit_offset)
  ------------------
  |  Branch (115:9): [True: 0, False: 16.8k]
  ------------------
  116|      0|      return;
  117|  16.8k|    else if (lo_bit_offset == hi_bit_offset)
  ------------------
  |  Branch (117:14): [True: 3.04k, False: 13.8k]
  ------------------
  118|  3.04k|      SetBitOn(hi_bit_offset);
  119|  13.8k|    else
  120|  13.8k|      {
  121|  13.8k|        unsigned lo_word_offset = lo_bit_offset >> WORDROLL;
  ------------------
  |  |   38|  13.8k|#define WORDROLL 5
  ------------------
  122|  13.8k|        unsigned hi_word_offset = hi_bit_offset >> WORDROLL;
  ------------------
  |  |   38|  13.8k|#define WORDROLL 5
  ------------------
  123|  13.8k|        lo_bit_offset &= WORDMASK;
  ------------------
  |  |   40|  13.8k|#define WORDMASK 31
  ------------------
  124|  13.8k|        hi_bit_offset &= WORDMASK;
  ------------------
  |  |   40|  13.8k|#define WORDMASK 31
  ------------------
  125|       |
  126|  13.8k|        if (hi_word_offset >= GetSize())
  ------------------
  |  Branch (126:13): [True: 0, False: 13.8k]
  ------------------
  127|      0|          ResizeWords(hi_word_offset + 1);
  128|       |
  129|  13.8k|        if (lo_word_offset == hi_word_offset)
  ------------------
  |  Branch (129:13): [True: 8.71k, False: 5.11k]
  ------------------
  130|  8.71k|          {
  131|  94.7k|            for ( unsigned i = lo_bit_offset ; i <= hi_bit_offset ; i++ )
  ------------------
  |  Branch (131:48): [True: 86.0k, False: 8.71k]
  ------------------
  132|  86.0k|              _set[lo_word_offset] |= (1<<i);
  133|  8.71k|          }
  134|  5.11k|        else
  135|  5.11k|          {
  136|   168k|            for ( unsigned i = lo_bit_offset ; i < SETWORD ; ++ i )
  ------------------
  |  |   36|   168k|#define SETWORD 32
  ------------------
  |  Branch (136:48): [True: 163k, False: 5.11k]
  ------------------
  137|   163k|              _set[lo_word_offset] |= (1<<i);
  138|  45.1k|            for ( unsigned i = lo_word_offset + 1 ; i < hi_word_offset ; ++ i )
  ------------------
  |  Branch (138:53): [True: 40.0k, False: 5.11k]
  ------------------
  139|  40.0k|              _set[i] = ~0;
  140|  83.4k|            for ( unsigned i = 0 ; i <= hi_bit_offset ; ++ i )
  ------------------
  |  Branch (140:36): [True: 78.2k, False: 5.11k]
  ------------------
  141|  78.2k|              _set[hi_word_offset] |= (1<<i);
  142|  5.11k|          }
  143|  13.8k|      }
  144|  16.8k|  }
_ZNK9OpenBabel8OBBitVec7NextBitEi:
  218|   541M|  {
  219|   541M|    unsigned s;
  220|   541M|    int bit;
  221|   541M|    unsigned wrdcnt;
  222|   541M|    ++ last_bit_offset;
  223|       |
  224|   541M|    wrdcnt = (unsigned)last_bit_offset >> WORDROLL;
  ------------------
  |  |   38|   541M|#define WORDROLL 5
  ------------------
  225|       |
  226|   541M|    if (wrdcnt >= GetSize())
  ------------------
  |  Branch (226:9): [True: 160k, False: 541M]
  ------------------
  227|   160k|      return(-1);
  228|       |
  229|   541M|    if (_set[wrdcnt] != 0)
  ------------------
  |  Branch (229:9): [True: 442M, False: 98.8M]
  ------------------
  230|   442M|      {
  231|   442M|        s = _set[wrdcnt] & bitsoff[last_bit_offset & WORDMASK];
  ------------------
  |  |   40|   442M|#define WORDMASK 31
  ------------------
  232|   442M|        if (s)
  ------------------
  |  Branch (232:13): [True: 248M, False: 194M]
  ------------------
  233|   248M|          {
  234|   248M|            LowBit(s,bit);
  ------------------
  |  |   69|   248M|  {int m;                                                       \
  |  |   70|   248M|    if (set != 0)                                               \
  |  |  ------------------
  |  |  |  Branch (70:9): [True: 248M, False: 0]
  |  |  ------------------
  |  |   71|   248M|      {                                                         \
  |  |   72|   248M|        bit = 31;                                               \
  |  |   73|   248M|        if (set != 0x80000000) {                                \
  |  |  ------------------
  |  |  |  Branch (73:13): [True: 239M, False: 8.57M]
  |  |  ------------------
  |  |   74|   239M|          if ((m = (set & 0x0000ffff))!=0) {set = m; bit -= 16;}   \
  |  |  ------------------
  |  |  |  Branch (74:15): [True: 110M, False: 129M]
  |  |  ------------------
  |  |   75|   239M|          if ((m = (set & 0x00ff00ff))!=0) {set = m; bit -= 8;}    \
  |  |  ------------------
  |  |  |  Branch (75:15): [True: 116M, False: 123M]
  |  |  ------------------
  |  |   76|   239M|          if ((m = (set & 0x0f0f0f0f))!=0) {set = m; bit -= 4;}    \
  |  |  ------------------
  |  |  |  Branch (76:15): [True: 119M, False: 119M]
  |  |  ------------------
  |  |   77|   239M|          if ((m = (set & 0x33333333))!=0) {set = m; bit -= 2;}    \
  |  |  ------------------
  |  |  |  Branch (77:15): [True: 121M, False: 118M]
  |  |  ------------------
  |  |   78|   239M|          if ((m = (set & 0x55555555))!=0) {set = m; bit -= 1;}}}  \
  |  |  ------------------
  |  |  |  Branch (78:15): [True: 121M, False: 118M]
  |  |  ------------------
  |  |   79|   248M|    else bit = -1;}
  ------------------
  235|   248M|            if (bit != -1)
  ------------------
  |  Branch (235:17): [True: 248M, False: 0]
  ------------------
  236|   248M|              return(bit + (wrdcnt << WORDROLL));
  ------------------
  |  |   38|   248M|#define WORDROLL 5
  ------------------
  237|   248M|          }
  238|   442M|      }
  239|   293M|    ++ wrdcnt;
  240|       |
  241|  3.80G|    while(wrdcnt < GetSize())
  ------------------
  |  Branch (241:11): [True: 3.69G, False: 112M]
  ------------------
  242|  3.69G|      {
  243|  3.69G|        if (_set[wrdcnt] != 0)
  ------------------
  |  Branch (243:13): [True: 180M, False: 3.51G]
  ------------------
  244|   180M|          {
  245|   180M|            s = _set[wrdcnt];
  246|   180M|            LowBit(s, bit);
  ------------------
  |  |   69|   180M|  {int m;                                                       \
  |  |   70|   180M|    if (set != 0)                                               \
  |  |  ------------------
  |  |  |  Branch (70:9): [True: 180M, False: 0]
  |  |  ------------------
  |  |   71|   180M|      {                                                         \
  |  |   72|   180M|        bit = 31;                                               \
  |  |   73|   180M|        if (set != 0x80000000) {                                \
  |  |  ------------------
  |  |  |  Branch (73:13): [True: 176M, False: 4.05M]
  |  |  ------------------
  |  |   74|   176M|          if ((m = (set & 0x0000ffff))!=0) {set = m; bit -= 16;}   \
  |  |  ------------------
  |  |  |  Branch (74:15): [True: 110M, False: 65.9M]
  |  |  ------------------
  |  |   75|   176M|          if ((m = (set & 0x00ff00ff))!=0) {set = m; bit -= 8;}    \
  |  |  ------------------
  |  |  |  Branch (75:15): [True: 101M, False: 75.7M]
  |  |  ------------------
  |  |   76|   176M|          if ((m = (set & 0x0f0f0f0f))!=0) {set = m; bit -= 4;}    \
  |  |  ------------------
  |  |  |  Branch (76:15): [True: 95.9M, False: 80.8M]
  |  |  ------------------
  |  |   77|   176M|          if ((m = (set & 0x33333333))!=0) {set = m; bit -= 2;}    \
  |  |  ------------------
  |  |  |  Branch (77:15): [True: 92.9M, False: 83.8M]
  |  |  ------------------
  |  |   78|   176M|          if ((m = (set & 0x55555555))!=0) {set = m; bit -= 1;}}}  \
  |  |  ------------------
  |  |  |  Branch (78:15): [True: 93.0M, False: 83.7M]
  |  |  ------------------
  |  |   79|   180M|    else bit = -1;}
  ------------------
  247|       |
  248|   180M|            if (bit != -1)
  ------------------
  |  Branch (248:17): [True: 180M, False: 0]
  ------------------
  249|   180M|              return(bit + (wrdcnt << WORDROLL));
  ------------------
  |  |   38|   180M|#define WORDROLL 5
  ------------------
  250|   180M|          }
  251|  3.51G|        ++ wrdcnt;
  252|  3.51G|      }
  253|       |
  254|   112M|    return(-1);
  255|   293M|  }
_ZNK9OpenBabel8OBBitVec9CountBitsEv:
  280|  19.0M|  {
  281|  19.0M|    unsigned count = 0;
  282|   226M|    for (word_vector::const_iterator sx = _set.begin(), sy = _set.end(); sx != sy; ++ sx)
  ------------------
  |  Branch (282:74): [True: 207M, False: 19.0M]
  ------------------
  283|   207M|      {
  284|   207M|      uint32_t word = *sx;
  285|   352M|      while (word)
  ------------------
  |  Branch (285:14): [True: 144M, False: 207M]
  ------------------
  286|   144M|        {
  287|   144M|        count += nibble_bit_count[word & 0xF];
  288|   144M|        word >>= 4;
  289|   144M|        }
  290|   207M|      }
  291|  19.0M|    return count;
  292|  19.0M|  }
_ZNK9OpenBabel8OBBitVec7IsEmptyEv:
  298|   110M|  {
  299|  1.64G|    for (word_vector::const_iterator sx = _set.begin(), sy = _set.end(); sx != sy; ++ sx)
  ------------------
  |  Branch (299:74): [True: 1.64G, False: 2.03M]
  ------------------
  300|  1.64G|      if (* sx)
  ------------------
  |  Branch (300:11): [True: 108M, False: 1.53G]
  ------------------
  301|   108M|        return(false);
  302|       |
  303|  2.03M|    return(true);
  304|   110M|  }
_ZN9OpenBabel8OBBitVec10FromVecIntERKNSt3__16vectorIiNS1_9allocatorIiEEEE:
  310|   333k|  {
  311|  2.01M|    for (std::vector<int>::const_iterator i = bit_offsets.begin(), j = bit_offsets.end(); i != j; ++i)
  ------------------
  |  Branch (311:91): [True: 1.68M, False: 333k]
  ------------------
  312|  1.68M|      SetBitOn(* i);
  313|   333k|  }
_ZNK9OpenBabel8OBBitVec8ToVecIntERNSt3__16vectorIiNS1_9allocatorIiEEEE:
  371|   119k|  {
  372|   119k|    bit_offsets.clear();
  373|   119k|    bit_offsets.reserve(CountBits());
  374|  68.8M|    for (int i = NextBit(-1);i != -1;i = NextBit(i))
  ------------------
  |  Branch (374:30): [True: 68.7M, False: 119k]
  ------------------
  375|  68.7M|      bit_offsets.push_back(i);
  376|   119k|  }
_ZN9OpenBabel8OBBitVec5ClearEv:
  382|   114M|  {
  383|  3.94G|    for (word_vector::iterator wx = _set.begin(), wy = _set.end(); wx != wy; ++wx)
  ------------------
  |  Branch (383:68): [True: 3.82G, False: 114M]
  ------------------
  384|  3.82G|      * wx = 0;
  385|   114M|  }
_ZN9OpenBabel8OBBitVecaSERKS0_:
  392|   117M|  {
  393|   117M|    _set = bv._set;
  394|   117M|    _size = _set.size();
  395|   117M|    return(*this);
  396|   117M|  }
_ZN9OpenBabel8OBBitVecaNERKS0_:
  403|  2.04M|  {
  404|  2.04M|    unsigned min = (bv.GetSize() < _size) ? bv.GetSize() : _size;
  ------------------
  |  Branch (404:20): [True: 85.8k, False: 1.96M]
  ------------------
  405|  2.04M|    unsigned i;
  406|       |
  407|  38.0M|    for (i = 0;i < min;++i)
  ------------------
  |  Branch (407:16): [True: 35.9M, False: 2.04M]
  ------------------
  408|  35.9M|      _set[i] &= bv._set[i];
  409|  2.83M|    for (;i < _size;++i)
  ------------------
  |  Branch (409:11): [True: 783k, False: 2.04M]
  ------------------
  410|   783k|      _set[i] = 0;
  411|       |
  412|  2.04M|    return(*this);
  413|  2.04M|  }
_ZN9OpenBabel8OBBitVecoRERKS0_:
  420|   157M|  {
  421|   157M|    if (_size < bv.GetSize())
  ------------------
  |  Branch (421:9): [True: 668k, False: 156M]
  ------------------
  422|   668k|      ResizeWords(bv.GetSize());
  423|       |
  424|  4.43G|    for (unsigned i = 0;i < bv.GetSize(); ++i)
  ------------------
  |  Branch (424:25): [True: 4.27G, False: 157M]
  ------------------
  425|  4.27G|      _set[i] |= bv._set[i];
  426|       |
  427|   157M|    return(*this);
  428|   157M|  }
_ZN9OpenBabelorERKNS_8OBBitVecES2_:
  476|   510k|  {
  477|   510k|    OBBitVec bv(bv1);
  478|   510k|    bv |= bv2;
  479|   510k|    return(bv);
  480|   510k|  }
_ZN9OpenBabelanERKNS_8OBBitVecES2_:
  488|  2.04M|  {
  489|  2.04M|    OBBitVec bv(bv1);
  490|  2.04M|    bv &= bv2;
  491|  2.04M|    return(bv);
  492|  2.04M|  }
_ZN9OpenBabeleqERKNS_8OBBitVecES2_:
  526|   914k|  {
  527|   914k|    if (bv1.GetSize() < bv2.GetSize())
  ------------------
  |  Branch (527:9): [True: 5.03k, False: 909k]
  ------------------
  528|  5.03k|      { // bv1 smaller than bv2
  529|  5.03k|      unsigned i;
  530|  90.8k|      for (i = 0; i < bv1.GetSize(); ++ i)
  ------------------
  |  Branch (530:19): [True: 86.4k, False: 4.42k]
  ------------------
  531|  86.4k|        if (bv1._set[i] != bv2._set[i])
  ------------------
  |  Branch (531:13): [True: 613, False: 85.8k]
  ------------------
  532|    613|          return false;
  533|   111k|      for (; i < bv2.GetSize(); ++ i)
  ------------------
  |  Branch (533:14): [True: 107k, False: 4.42k]
  ------------------
  534|   107k|        if (bv2._set[i] != 0)
  ------------------
  |  Branch (534:13): [True: 0, False: 107k]
  ------------------
  535|      0|          return false;
  536|  4.42k|      }
  537|   909k|    else
  538|   909k|      { // bv2 smaller or equal than bv1
  539|   909k|      unsigned i;
  540|  7.10M|      for (i = 0; i < bv2.GetSize(); ++ i)
  ------------------
  |  Branch (540:19): [True: 6.57M, False: 525k]
  ------------------
  541|  6.57M|        if (bv1._set[i] != bv2._set[i])
  ------------------
  |  Branch (541:13): [True: 383k, False: 6.19M]
  ------------------
  542|   383k|          return false;
  543|   764k|      for (; i < bv1.GetSize(); ++ i)
  ------------------
  |  Branch (543:14): [True: 238k, False: 525k]
  ------------------
  544|   238k|        if (bv1._set[i] != 0)
  ------------------
  |  Branch (544:13): [True: 0, False: 238k]
  ------------------
  545|      0|          return false;
  546|   525k|      }
  547|   530k|    return true;
  548|   914k|  }

_ZN9OpenBabel6OBBondC2Ev:
   64|  13.5M|  {
   65|  13.5M|    _idx=0;
   66|  13.5M|    _order=0;
   67|  13.5M|    _flags=0;
   68|  13.5M|    _bgn=nullptr;
   69|  13.5M|    _end=nullptr;
   70|  13.5M|    _vdata.clear();
   71|  13.5M|    _parent=nullptr;
   72|  13.5M|  }
_ZN9OpenBabel6OBBondD2Ev:
   75|  13.5M|  {
   76|       |    // OBGenericData handled in OBBase parent class.
   77|  13.5M|  }
_ZN9OpenBabel6OBBond3SetEiPNS_6OBAtomES2_ii:
   87|  13.5M|  {
   88|  13.5M|    SetIdx(idx);
   89|  13.5M|    SetBegin(begin);
   90|  13.5M|    SetEnd(end);
   91|  13.5M|    SetBondOrder(order);
   92|  13.5M|    SetFlag(flags);
   93|  13.5M|  }
_ZN9OpenBabel6OBBond12SetBondOrderEi:
   96|  13.6M|  {
   97|  13.6M|    _order = (char)order;
   98|  13.6M|  }
_ZN9OpenBabel6OBBond7IsRotorEb:
  157|   716k|  {
  158|       |    // This could be one hellish conditional, but let's break it down
  159|       |    // .. the bond is a single bond
  160|   716k|    if (_order != 1)
  ------------------
  |  Branch (160:9): [True: 82.2k, False: 634k]
  ------------------
  161|  82.2k|      return false;
  162|       |
  163|       |    // not in a ring, or in a large ring
  164|       |    // and if it's a ring, not sp2
  165|   634k|    OBRing *ring = FindSmallestRing();
  166|   634k|    if (ring != nullptr) {
  ------------------
  |  Branch (166:9): [True: 185k, False: 448k]
  ------------------
  167|   185k|      if(!includeRingBonds)
  ------------------
  |  Branch (167:10): [True: 185k, False: 0]
  ------------------
  168|   185k|        return false;
  169|      0|      if (ring->Size() <= 3)
  ------------------
  |  Branch (169:11): [True: 0, False: 0]
  ------------------
  170|      0|        return false;
  171|      0|      if (_bgn->GetHyb() == 2 || _end->GetHyb() == 2)
  ------------------
  |  Branch (171:11): [True: 0, False: 0]
  |  Branch (171:34): [True: 0, False: 0]
  ------------------
  172|      0|        return false;
  173|      0|    }
  174|       |
  175|       |    // atoms are not sp hybrids
  176|   448k|    if (_bgn->GetHyb() == 1 || _end->GetHyb() == 1)
  ------------------
  |  Branch (176:9): [True: 124k, False: 324k]
  |  Branch (176:32): [True: 216k, False: 107k]
  ------------------
  177|   340k|      return false;
  178|       |
  179|       |    // not just an -OH or -NH2, etc.
  180|       |    // maybe we want to add this as an option
  181|       |    //    rotatable = rotatable && ((_bgn->IsHeteroatom() || _bgn->GetHvyDegree() > 1)
  182|       |    //                               && (_end->IsHeteroatom() || _end->GetHvyDegree() > 1) );
  183|   107k|    return (_bgn->GetHvyDegree() > 1 && _end->GetHvyDegree() > 1);
  ------------------
  |  Branch (183:13): [True: 104k, False: 3.86k]
  |  Branch (183:41): [True: 101k, False: 2.59k]
  ------------------
  184|   448k|  }
_ZNK9OpenBabel6OBBond10IsPeriodicEv:
  187|   118M|  {
  188|   118M|    OBMol *mol = (OBMol*)((OBBond*)this)->GetParent();
  189|   118M|    return mol->IsPeriodic();
  190|   118M|  }
_ZNK9OpenBabel6OBBond10IsAromaticEv:
  467|   162M|  {
  468|   162M|    OBMol *mol = ((OBBond*)this)->GetParent();
  469|   162M|    if (!mol->HasAromaticPerceived())
  ------------------
  |  Branch (469:9): [True: 2.34k, False: 162M]
  ------------------
  470|  2.34k|        aromtyper.AssignAromaticFlags(*mol);
  471|       |
  472|   162M|    if (this->HasFlag(OB_AROMATIC_BOND))
  ------------------
  |  |   41|   162M|#define OB_AROMATIC_BOND  (1<<1)
  ------------------
  |  Branch (472:9): [True: 1.53M, False: 161M]
  ------------------
  473|  1.53M|      return true;
  474|       |
  475|   161M|    return false;
  476|   162M|  }
_ZN9OpenBabel6OBBond20IsDoubleBondGeometryEv:
  482|  1.17k|  {
  483|  1.17k|    double torsion;
  484|  1.17k|    OBAtom *nbrStart,*nbrEnd;
  485|  1.17k|    vector<OBBond*>::iterator i,j;
  486|       |    // We concentrate on sp2 atoms with valence up to 3 and ignore the rest (like sp1 or S,P)
  487|       |    // As this is called from PerceiveBondOrders, GetHyb() may still be undefined.
  488|  1.17k|    if (_bgn->GetHyb()==1 || _bgn->GetExplicitDegree()>3||
  ------------------
  |  Branch (488:9): [True: 0, False: 1.17k]
  |  Branch (488:30): [True: 0, False: 1.17k]
  ------------------
  489|  1.17k|        _end->GetHyb()==1 || _end->GetExplicitDegree()>3)
  ------------------
  |  Branch (489:9): [True: 0, False: 1.17k]
  |  Branch (489:30): [True: 0, False: 1.17k]
  ------------------
  490|      0|      return(true);
  491|       |
  492|  2.75k|    for (nbrStart = static_cast<OBAtom*>(_bgn)->BeginNbrAtom(i); nbrStart;
  ------------------
  |  Branch (492:66): [True: 1.59k, False: 1.15k]
  ------------------
  493|  1.57k|         nbrStart = static_cast<OBAtom*>(_bgn)->NextNbrAtom(i))
  494|  1.59k|      {
  495|  1.59k|        if (nbrStart != _end)
  ------------------
  |  Branch (495:13): [True: 436, False: 1.15k]
  ------------------
  496|    436|          {
  497|    436|            for (nbrEnd = static_cast<OBAtom*>(_end)->BeginNbrAtom(j);
  498|  1.22k|                 nbrEnd; nbrEnd = static_cast<OBAtom*>(_end)->NextNbrAtom(j))
  ------------------
  |  Branch (498:18): [True: 801, False: 420]
  ------------------
  499|    801|              {
  500|    801|                if (nbrEnd != _bgn)
  ------------------
  |  Branch (500:21): [True: 378, False: 423]
  ------------------
  501|    378|                  {
  502|    378|                    torsion=fabs(_parent->GetTorsion(nbrStart, _bgn, _end, nbrEnd));
  503|       |
  504|       |                    // >12&&<168 not enough
  505|    378|                    if (torsion > 15.0  && torsion < 160.0)
  ------------------
  |  Branch (505:25): [True: 89, False: 289]
  |  Branch (505:44): [True: 16, False: 73]
  ------------------
  506|     16|                      {
  507|       |                        // Geometry does not match a double bond
  508|     16|                        return(false);
  509|     16|                      }
  510|       |
  511|    378|                  }
  512|    801|              }  // end loop for neighbors of end
  513|    436|          }
  514|  1.59k|      } // end loop for neighbors of start
  515|  1.15k|    return(true);
  516|  1.17k|  }
_ZNK9OpenBabel6OBBond8IsInRingEv:
  519|  3.28M|  {
  520|  3.28M|    OBMol *mol = ((OBBond*)this)->GetParent();
  521|  3.28M|    if (!mol->HasRingAtomsAndBondsPerceived())
  ------------------
  |  Branch (521:9): [True: 2.44k, False: 3.28M]
  ------------------
  522|  2.44k|      mol->FindRingAtomsAndBonds();
  523|       |
  524|  3.28M|    if (((OBBond*)this)->HasFlag(OB_RING_BOND))
  ------------------
  |  |   47|  3.28M|#define OB_RING_BOND      (1<<4)
  ------------------
  |  Branch (524:9): [True: 2.14M, False: 1.14M]
  ------------------
  525|  2.14M|      return true;
  526|       |
  527|  1.14M|    return false;
  528|  3.28M|  }
_ZNK9OpenBabel6OBBond16FindSmallestRingEv:
  532|   667k|  {
  533|   667k|    vector<OBRing*> rlist;
  534|   667k|    vector<OBRing*>::iterator i;
  535|       |
  536|   667k|    OBMol *mol = (OBMol*)((OBBond*)this)->GetParent();
  537|       |
  538|   667k|    rlist = mol->GetSSSR();
  539|   667k|    OBRing* result = nullptr;
  540|   667k|    size_t min_size = UINT_MAX;
  541|  20.5M|    for (i = rlist.begin();i != rlist.end();++i) {
  ------------------
  |  Branch (541:28): [True: 19.8M, False: 667k]
  ------------------
  542|  19.8M|      if ((*i)->IsMember((OBBond*)this) && (*i)->Size() < min_size) {
  ------------------
  |  Branch (542:11): [True: 280k, False: 19.5M]
  |  Branch (542:44): [True: 216k, False: 63.1k]
  ------------------
  543|   216k|        min_size = (*i)->Size();
  544|   216k|        result = *i;
  545|   216k|      }
  546|  19.8M|    }
  547|   667k|    return result;
  548|   667k|  }
_ZN9OpenBabel6OBBond9IsClosureEv:
  551|  5.01M|  {
  552|  5.01M|    OBMol *mol = (OBMol*)GetParent();
  553|  5.01M|    if (!mol)
  ------------------
  |  Branch (553:9): [True: 0, False: 5.01M]
  ------------------
  554|      0|      return false;
  555|  5.01M|    if (!mol->HasClosureBondsPerceived())
  ------------------
  |  Branch (555:9): [True: 0, False: 5.01M]
  ------------------
  556|      0|      mol->FindRingAtomsAndBonds();
  557|  5.01M|    return HasFlag(OB_CLOSURE_BOND);
  ------------------
  |  |   49|  5.01M|#define OB_CLOSURE_BOND   (1<<10)
  ------------------
  558|  5.01M|  }
_ZNK9OpenBabel6OBBond9GetLengthEv:
  597|   118M|  {
  598|   118M|    double	d2;
  599|   118M|    const OBAtom *begin, *end;
  600|   118M|    begin = GetBeginAtom();
  601|   118M|    end = GetEndAtom();
  602|       |
  603|   118M|    if (!IsPeriodic())
  ------------------
  |  Branch (603:9): [True: 118M, False: 0]
  ------------------
  604|   118M|      {
  605|   118M|        d2 = SQUARE(begin->GetX() - end->GetX());
  ------------------
  |  |  783|   118M|#define SQUARE(x) ((x)*(x))
  ------------------
  606|   118M|        d2 += SQUARE(begin->GetY() - end->GetY());
  ------------------
  |  |  783|   118M|#define SQUARE(x) ((x)*(x))
  ------------------
  607|   118M|        d2 += SQUARE(begin->GetZ() - end->GetZ());
  ------------------
  |  |  783|   118M|#define SQUARE(x) ((x)*(x))
  ------------------
  608|   118M|        return(sqrt(d2));
  609|   118M|      }
  610|      0|    else
  611|      0|      {
  612|      0|        OBMol *mol = (OBMol*)((OBBond*)this)->GetParent();
  613|      0|        OBUnitCell *box = (OBUnitCell*)mol->GetData(OBGenericDataType::UnitCell);
  614|      0|        return (box->MinimumImageCartesian(begin->GetVector() - end->GetVector())).length();
  615|      0|      }
  616|   118M|  }

_ZN9OpenBabel11OBBondTyperC2Ev:
   51|      1|  {
   52|      1|    _init = false;
   53|      1|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      1|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
   54|      1|    _envvar = "BABEL_DATADIR";
   55|      1|    _filename = "bondtyp.txt";
   56|      1|    _subdir = "data";
   57|      1|    _dataptr = BondTypeData;
   58|      1|  }
_ZN9OpenBabel11OBBondTyper9ParseLineEPKc:
   61|     33|  {
   62|     33|    vector<string> vs;
   63|     33|    vector<int>    bovector;
   64|     33|    OBSmartsPattern *sp;
   65|       |
   66|     33|    if (buffer[0] != '#')
  ------------------
  |  Branch (66:9): [True: 33, False: 0]
  ------------------
   67|     33|      {
   68|     33|        tokenize(vs,buffer);
   69|       |        // Make sure we actually have a SMARTS pattern plus at least one triple
   70|       |        // and make sure we have the correct number of integers
   71|     33|        if (vs.size() < 4)
  ------------------
  |  Branch (71:13): [True: 0, False: 33]
  ------------------
   72|      0|          return; // just ignore empty (or short lines)
   73|     33|        else if (vs.size() >= 4 && (vs.size() % 3 != 1))
  ------------------
  |  Branch (73:18): [True: 33, False: 0]
  |  Branch (73:36): [True: 0, False: 33]
  ------------------
   74|      0|          {
   75|      0|            stringstream errorMsg;
   76|      0|            errorMsg << " Error in OBBondTyper. Pattern is incorrect, found "
   77|      0|                     << vs.size() << " tokens." << endl;
   78|      0|            errorMsg << " Buffer is: " << buffer << endl;
   79|      0|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obInfo);
   80|      0|            return;
   81|      0|          }
   82|       |
   83|     33|        sp = new OBSmartsPattern;
   84|     33|        if (sp->Init(vs[0]))
  ------------------
  |  Branch (84:13): [True: 33, False: 0]
  ------------------
   85|     33|          {
   86|    537|            for (unsigned int i = 1; i < vs.size() ; ++i)
  ------------------
  |  Branch (86:38): [True: 504, False: 33]
  ------------------
   87|    504|              {
   88|    504|                bovector.push_back( atoi((char *)vs[i].c_str()) );
   89|    504|              }
   90|     33|            _fgbonds.push_back(pair<OBSmartsPattern*,vector<int> >
   91|     33|                               (sp, bovector));
   92|     33|          }
   93|      0|        else
   94|      0|          {
   95|      0|            delete sp;
   96|      0|            sp = nullptr;
   97|      0|          }
   98|     33|      }
   99|     33|  }
_ZN9OpenBabel11OBBondTyperD2Ev:
  102|      1|  {
  103|      1|    vector<pair<OBSmartsPattern*, vector<int> > >::iterator i;
  104|     34|    for (i = _fgbonds.begin();i != _fgbonds.end();++i)
  ------------------
  |  Branch (104:31): [True: 33, False: 1]
  ------------------
  105|     33|      {
  106|     33|        delete i->first;
  107|     33|        i->first = nullptr;
  108|     33|      }
  109|      1|  }
_ZN9OpenBabel11OBBondTyper26AssignFunctionalGroupBondsERNS_5OBMolE:
  112|  9.21k|  {
  113|  9.21k|    if (!_init)
  ------------------
  |  Branch (113:9): [True: 1, False: 9.20k]
  ------------------
  114|      1|      Init();
  115|       |
  116|  9.21k|    OBSmartsPattern *currentPattern;
  117|  9.21k|    OBBond *b1, *b2;
  118|  9.21k|    OBAtom *a1,*a2, *a3;
  119|  9.21k|    double angle, dist1, dist2;
  120|  9.21k|    vector<int> assignments;
  121|  9.21k|    vector<vector<int> > mlist;
  122|  9.21k|    vector<vector<int> >::iterator matches, l;
  123|  9.21k|    vector<pair<OBSmartsPattern*, vector<int> > >::iterator i;
  124|  9.21k|    unsigned int j;
  125|       |
  126|       |    // Loop through for all the functional groups and assign bond orders
  127|   313k|    for (i = _fgbonds.begin();i != _fgbonds.end();++i)
  ------------------
  |  Branch (127:31): [True: 303k, False: 9.21k]
  ------------------
  128|   303k|      {
  129|   303k|        currentPattern = i->first;
  130|   303k|        assignments = i->second;
  131|       |
  132|   303k|        if (currentPattern && currentPattern->Match(mol))
  ------------------
  |  Branch (132:13): [True: 303k, False: 0]
  |  Branch (132:31): [True: 137, False: 303k]
  ------------------
  133|    137|          {
  134|    137|            mlist = currentPattern->GetUMapList();
  135|    493|            for (matches = mlist.begin(); matches != mlist.end(); ++matches)
  ------------------
  |  Branch (135:43): [True: 356, False: 137]
  ------------------
  136|    356|              {
  137|       |                // Now loop through the bonds to assign from _fgbonds
  138|  1.57k|                for (j = 0; j < assignments.size(); j += 3)
  ------------------
  |  Branch (138:29): [True: 1.22k, False: 356]
  ------------------
  139|  1.22k|                  {
  140|       |                    // along the assignments vector: atomID1 atomID2 bondOrder
  141|  1.22k|                    a1 = mol.GetAtom((*matches)[ assignments[j] ]);
  142|  1.22k|                    a2 = mol.GetAtom((*matches)[ assignments[j+1 ] ]);
  143|  1.22k|                    if (!a1 || !a2) continue;
  ------------------
  |  Branch (143:25): [True: 0, False: 1.22k]
  |  Branch (143:32): [True: 0, False: 1.22k]
  ------------------
  144|       |
  145|  1.22k|                    b1 = a1->GetBond(a2);
  146|       |
  147|  1.22k|                    if (!b1) continue;
  ------------------
  |  Branch (147:25): [True: 0, False: 1.22k]
  ------------------
  148|  1.22k|                    b1->SetBondOrder(assignments[j+2]);
  149|  1.22k|                  } // bond order assignments
  150|    356|              } // each match
  151|    137|          } // current pattern matches
  152|       |
  153|   303k|      } // for(functional groups)
  154|       |
  155|       |    // FG with distance and/or bond criteria
  156|       |    // Carbonyl oxygen C=O (O must be neutral)
  157|  9.21k|    OBSmartsPattern carbo; carbo.Init("[#8D1;!-][#6](*)(*)");
  158|       |
  159|  9.21k|    if (carbo.Match(mol))
  ------------------
  |  Branch (159:9): [True: 111, False: 9.09k]
  ------------------
  160|    111|      {
  161|    111|        mlist = carbo.GetUMapList();
  162|    451|        for (l = mlist.begin(); l != mlist.end(); ++l)
  ------------------
  |  Branch (162:33): [True: 340, False: 111]
  ------------------
  163|    340|          {
  164|    340|            a1 = mol.GetAtom((*l)[0]);
  165|    340|            a2 = mol.GetAtom((*l)[1]);
  166|       |
  167|    340|            angle = a2->AverageBondAngle();
  168|    340|            dist1 = a1->GetDistance(a2);
  169|       |
  170|       |            // carbonyl geometries ?
  171|    340|            if (angle > 115 && angle < 150 && dist1 < 1.28) {
  ------------------
  |  Branch (171:17): [True: 8, False: 332]
  |  Branch (171:32): [True: 8, False: 0]
  |  Branch (171:47): [True: 1, False: 7]
  ------------------
  172|       |
  173|      1|              if ( !a1->HasDoubleBond() ) {// no double bond already assigned
  ------------------
  |  Branch (173:20): [True: 1, False: 0]
  ------------------
  174|      1|                b1 = a1->GetBond(a2);
  175|       |
  176|      1|                if (!b1 ) continue;
  ------------------
  |  Branch (176:21): [True: 0, False: 1]
  ------------------
  177|      1|                b1->SetBondOrder(2);
  178|      1|              }
  179|      1|            }
  180|    340|          }
  181|    111|      } // Carbonyl oxygen
  182|       |
  183|       |    // thione C=S
  184|  9.21k|    OBSmartsPattern thione; thione.Init("[#16D1][#6](*)(*)");
  185|       |
  186|  9.21k|    if (thione.Match(mol))
  ------------------
  |  Branch (186:9): [True: 46, False: 9.16k]
  ------------------
  187|     46|      {
  188|     46|        mlist = thione.GetUMapList();
  189|    172|        for (l = mlist.begin(); l != mlist.end(); ++l)
  ------------------
  |  Branch (189:33): [True: 126, False: 46]
  ------------------
  190|    126|          {
  191|    126|            a1 = mol.GetAtom((*l)[0]);
  192|    126|            a2 = mol.GetAtom((*l)[1]);
  193|       |
  194|    126|            angle = a2->AverageBondAngle();
  195|    126|            dist1 = a1->GetDistance(a2);
  196|       |
  197|       |            // thione geometries ?
  198|    126|            if (angle > 115 && angle < 150 && dist1 < 1.72) {
  ------------------
  |  Branch (198:17): [True: 6, False: 120]
  |  Branch (198:32): [True: 6, False: 0]
  |  Branch (198:47): [True: 3, False: 3]
  ------------------
  199|       |
  200|      3|              if ( !a1->HasDoubleBond() ) {// no double bond already assigned
  ------------------
  |  Branch (200:20): [True: 3, False: 0]
  ------------------
  201|      3|                b1 = a1->GetBond(a2);
  202|       |
  203|      3|                if (!b1 ) continue;
  ------------------
  |  Branch (203:21): [True: 0, False: 3]
  ------------------
  204|      3|                b1->SetBondOrder(2);
  205|      3|              }
  206|      3|            }
  207|    126|          }
  208|     46|      } // thione
  209|       |
  210|       |    // Isocyanate N=C=O or Isothiocyanate
  211|  9.21k|    bool dist1OK;
  212|  9.21k|    OBSmartsPattern isocyanate; isocyanate.Init("[#8,#16;D1][#6D2][#7D2]");
  213|  9.21k|    if (isocyanate.Match(mol))
  ------------------
  |  Branch (213:9): [True: 13, False: 9.19k]
  ------------------
  214|     13|      {
  215|     13|        mlist = isocyanate.GetUMapList();
  216|     28|        for (l = mlist.begin(); l != mlist.end(); ++l)
  ------------------
  |  Branch (216:33): [True: 15, False: 13]
  ------------------
  217|     15|          {
  218|     15|            a1 = mol.GetAtom((*l)[0]);
  219|     15|            a2 = mol.GetAtom((*l)[1]);
  220|     15|            a3 = mol.GetAtom((*l)[2]);
  221|       |
  222|     15|            angle = a2->AverageBondAngle();
  223|     15|            dist1 = a1->GetDistance(a2);
  224|     15|            dist2 = a2->GetDistance(a3);
  225|       |
  226|       |            // isocyanate geometry or Isothiocyanate geometry ?
  227|     15|            if (a1->GetAtomicNum() == OBElements::Oxygen)
  ------------------
  |  Branch (227:17): [True: 5, False: 10]
  ------------------
  228|      5|              dist1OK =  dist1 < 1.28;
  229|     10|            else
  230|     10|              dist1OK =  dist1 < 1.72;
  231|       |
  232|     15|            if (angle > 150 && dist1OK && dist2 < 1.34) {
  ------------------
  |  Branch (232:17): [True: 8, False: 7]
  |  Branch (232:32): [True: 5, False: 3]
  |  Branch (232:43): [True: 5, False: 0]
  ------------------
  233|       |
  234|      5|              b1 = a1->GetBond(a2);
  235|      5|              b2 = a2->GetBond(a3);
  236|      5|              if (!b1 || !b2) continue;
  ------------------
  |  Branch (236:19): [True: 0, False: 5]
  |  Branch (236:26): [True: 0, False: 5]
  ------------------
  237|      5|              b1->SetBondOrder(2);
  238|      5|              b2->SetBondOrder(2);
  239|       |
  240|      5|            }
  241|       |
  242|     15|          }
  243|     13|      } // Isocyanate
  244|       |
  245|       |    // oxime C=S
  246|  9.21k|    OBSmartsPattern oxime; oxime.Init("[#6D3][#7D2][#8D2]");
  247|       |
  248|  9.21k|    if (oxime.Match(mol))
  ------------------
  |  Branch (248:9): [True: 7, False: 9.20k]
  ------------------
  249|      7|      {
  250|      7|        mlist = oxime.GetUMapList();
  251|     16|        for (l = mlist.begin(); l != mlist.end(); ++l)
  ------------------
  |  Branch (251:33): [True: 9, False: 7]
  ------------------
  252|      9|          {
  253|      9|            a1 = mol.GetAtom((*l)[0]);
  254|      9|            a2 = mol.GetAtom((*l)[1]);
  255|       |
  256|      9|            angle = a2->AverageBondAngle();
  257|      9|            dist1 = a1->GetDistance(a2);
  258|       |
  259|       |            // thione geometries ?
  260|      9|            if (angle > 110 && angle < 150 && dist1 < 1.4) {
  ------------------
  |  Branch (260:17): [True: 0, False: 9]
  |  Branch (260:32): [True: 0, False: 0]
  |  Branch (260:47): [True: 0, False: 0]
  ------------------
  261|       |
  262|      0|              if ( !a1->HasDoubleBond() ) {// no double bond already assigned
  ------------------
  |  Branch (262:20): [True: 0, False: 0]
  ------------------
  263|      0|                b1 = a1->GetBond(a2);
  264|       |
  265|      0|                if (!b1 ) continue;
  ------------------
  |  Branch (265:21): [True: 0, False: 0]
  ------------------
  266|      0|                b1->SetBondOrder(2);
  267|      0|              }
  268|      0|            }
  269|      9|          }
  270|      7|      } // oxime
  271|       |
  272|       |    // oxido-n+ (e.g., pyridine-N-oxide)
  273|  9.21k|    OBSmartsPattern oxidopyr; oxidopyr.Init("[#8D1][#7D3r6]");
  274|  9.21k|    if (oxidopyr.Match(mol))
  ------------------
  |  Branch (274:9): [True: 0, False: 9.21k]
  ------------------
  275|      0|      {
  276|      0|        mlist = oxidopyr.GetUMapList();
  277|      0|        for (l = mlist.begin(); l != mlist.end(); ++l)
  ------------------
  |  Branch (277:33): [True: 0, False: 0]
  ------------------
  278|      0|          {
  279|      0|            a1 = mol.GetAtom((*l)[0]);
  280|      0|            a2 = mol.GetAtom((*l)[1]);
  281|       |
  282|      0|            angle = a2->AverageBondAngle();
  283|      0|            dist1 = a1->GetDistance(a2);
  284|       |
  285|      0|            if (angle > 110 && angle < 150 && dist1 < 1.35) {
  ------------------
  |  Branch (285:17): [True: 0, False: 0]
  |  Branch (285:32): [True: 0, False: 0]
  |  Branch (285:47): [True: 0, False: 0]
  ------------------
  286|      0|              a1->SetFormalCharge(-1); // oxygen
  287|      0|              a2->SetFormalCharge(+1); // nitrogen
  288|      0|            }
  289|      0|          }
  290|      0|      }
  291|       |
  292|  9.21k|  }

_ZN9OpenBabel9OBBuilder13LoadFragmentsEv:
  103|  8.40k|  void OBBuilder::LoadFragments()  {
  104|       |    // open data/fragments.txt
  105|  8.40k|    ifstream ifs;
  106|  8.40k|    if (OpenDatafile(ifs, "rigid-fragments-index.txt").length() == 0) {
  ------------------
  |  Branch (106:9): [True: 8.40k, False: 0]
  ------------------
  107|  8.40k|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open ring-fragments-index.txt", obError);
  108|  8.40k|      return;
  109|  8.40k|    }
  110|       |
  111|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  112|       |    // TODO: Use OpenDatafile()
  113|      0|    obLocale.SetLocale();
  114|       |
  115|      0|    std::string smiles;
  116|      0|    int index;
  117|      0|    while(ifs >> smiles >> index) {
  ------------------
  |  Branch (117:11): [True: 0, False: 0]
  ------------------
  118|      0|      _rigid_fragments.push_back(smiles);
  119|      0|      _rigid_fragments_index[smiles] = index;
  120|      0|    }
  121|       |
  122|      0|    if (OpenDatafile(ifs, "ring-fragments.txt").length() == 0) {
  ------------------
  |  Branch (122:9): [True: 0, False: 0]
  ------------------
  123|      0|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open ring-fragments.txt", obError);
  124|      0|      return;
  125|      0|    }
  126|       |
  127|      0|    char buffer[BUFF_SIZE];
  128|      0|    vector<string> vs;
  129|      0|    OBSmartsPattern *sp = nullptr;
  130|      0|    vector<vector3> coords;
  131|      0|    while (ifs.getline(buffer, BUFF_SIZE)) {
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  |  Branch (131:12): [True: 0, False: 0]
  ------------------
  132|      0|      if (buffer[0] == '#') // skip comment line (at the top)
  ------------------
  |  Branch (132:11): [True: 0, False: 0]
  ------------------
  133|      0|        continue;
  134|       |
  135|      0|      tokenize(vs, buffer);
  136|       |
  137|      0|      if (vs.size() == 1) { // SMARTS pattern
  ------------------
  |  Branch (137:11): [True: 0, False: 0]
  ------------------
  138|      0|        if (sp != nullptr)
  ------------------
  |  Branch (138:13): [True: 0, False: 0]
  ------------------
  139|      0|          AddRingFragment(sp, coords);
  140|       |
  141|      0|        coords.clear();
  142|      0|        sp = new OBSmartsPattern;
  143|      0|        if (!sp->Init(vs[0])) {
  ------------------
  |  Branch (143:13): [True: 0, False: 0]
  ------------------
  144|      0|          delete sp;
  145|      0|          sp = nullptr;
  146|      0|          obErrorLog.ThrowError(__FUNCTION__, " Could not parse SMARTS from contribution data file", obInfo);
  147|      0|        }
  148|      0|      } else if (vs.size() == 3) { // XYZ coordinates
  ------------------
  |  Branch (148:18): [True: 0, False: 0]
  ------------------
  149|      0|        vector3 coord(atof(vs[0].c_str()), atof(vs[1].c_str()), atof(vs[2].c_str()));
  150|      0|        coords.push_back(coord);
  151|      0|      }
  152|      0|    }
  153|      0|    AddRingFragment(sp, coords);
  154|       |
  155|       |    // return the locale to the original one
  156|      0|    obLocale.RestoreLocale();
  157|       |
  158|       |    /*if (OpenDatafile(ifs, "torsion.txt").length() == 0) {
  159|       |      obErrorLog.ThrowError(__FUNCTION__, "Cannot open torsion.txt", obError);
  160|       |      return;
  161|       |    }
  162|       |    double angle;
  163|       |    while(ifs >> smiles >> angle) {
  164|       |      _torsion[smiles] = angle;
  165|       |    }
  166|       |    */
  167|      0|  }
_ZN9OpenBabel22GetCorrectedBondVectorEPNS_6OBAtomES1_i:
  214|   663k|  {
  215|   663k|    double bondLength = 0.0;
  216|       |
  217|       |    // We create an estimate of the bond length based on the two atoms
  218|       |    // Scaling is performed by the bond order corrections below
  219|       |    //  .. so we will use the straight covalent radii
  220|   663k|    bondLength += OBElements::GetCovalentRad(atom1->GetAtomicNum());
  221|   663k|    bondLength += OBElements::GetCovalentRad(atom2->GetAtomicNum());
  222|       |
  223|   663k|    if (bondLength < 1.0)
  ------------------
  |  Branch (223:9): [True: 19.3k, False: 644k]
  ------------------
  224|  19.3k|      bondLength = 1.0;
  225|       |
  226|       |    // These are based on OBBond::GetEquibLength
  227|       |    // Numbers come from averaged values of Pyykko and Atsumi
  228|   663k|    if (bondOrder == -1) // aromatic
  ------------------
  |  Branch (228:9): [True: 610, False: 663k]
  ------------------
  229|    610|      bondLength *= 0.9475;   // 0.9475 = average of 1.0 and 0.8950
  230|   663k|    else if (bondOrder == 2)
  ------------------
  |  Branch (230:14): [True: 69.6k, False: 593k]
  ------------------
  231|  69.6k|      bondLength *= 0.8950;   // 0.8950
  232|   593k|    else if (bondOrder == 3)
  ------------------
  |  Branch (232:14): [True: 1.79k, False: 591k]
  ------------------
  233|  1.79k|      bondLength *= 0.8578;   // 0.8578
  234|       |
  235|   663k|    return OBBuilder::GetNewBondVector(atom1, bondLength);
  236|   663k|  }
_ZN9OpenBabel9OBBuilder16GetNewBondVectorEPNS_6OBAtomE:
  239|  6.51k|  {
  240|  6.51k|    return GetNewBondVector(atom, 1.5);
  241|  6.51k|  }
_ZN9OpenBabel9OBBuilder16GetNewBondVectorEPNS_6OBAtomEd:
  244|   804k|  {
  245|   804k|    vector3 bond1, bond2, bond3, bond4, bond5, v1, v2, v3, newbond;
  246|       |
  247|   804k|    bond1 = VZero;
  248|   804k|    bond2 = VZero;
  249|   804k|    bond3 = VZero;
  250|   804k|    bond4 = VZero;
  251|   804k|    bond5 = VZero;
  252|       |
  253|   804k|    if (atom == nullptr)
  ------------------
  |  Branch (253:9): [True: 0, False: 804k]
  ------------------
  254|      0|      return VZero;
  255|       |
  256|   804k|    int dimension = ((OBMol*)atom->GetParent())->GetDimension();
  257|       |
  258|   804k|    if (dimension != 2) {
  ------------------
  |  Branch (258:9): [True: 746k, False: 57.8k]
  ------------------
  259|       |      /////////////////
  260|       |      //   3D or 0D  //
  261|       |      /////////////////
  262|       |
  263|       |      //
  264|       |      //  a   --->   a--*
  265|       |      //
  266|   746k|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (266:11): [True: 59.6k, False: 686k]
  ------------------
  267|  59.6k|        newbond = atom->GetVector() + VX * length;
  268|  59.6k|        return newbond;
  269|  59.6k|      }
  270|       |
  271|       |      // hyb * = 1
  272|       |      // ^^^^^^^^^
  273|       |      //
  274|       |      //   (a-1)--a   --->   (a-1)--a--*        angle(a-1, a, *) = 180
  275|       |      //
  276|       |      // hyb * = 2
  277|       |      // ^^^^^^^^^
  278|       |      // make sure we place the new atom trans to a-2 (if there is an a-2 atom)
  279|       |      //
  280|       |      //   (a-2)             (a-2)
  281|       |      //     \                 \                                             //
  282|       |      //    (a-1)==a   --->   (a-1)==a          angle(a-1, a, *) = 120
  283|       |      //                              \                                      //
  284|       |      //                               *
  285|       |      // hyb * = 3
  286|       |      // ^^^^^^^^^
  287|       |      // make sure we place the new atom trans to a-2 (if there is an a-2 atom)
  288|       |      //
  289|       |      //   (a-2)             (a-2)
  290|       |      //     \                 \                                             //
  291|       |      //    (a-1)--a   --->   (a-1)--a          angle(a-1, a, *) = 109
  292|       |      //                              \                                      //
  293|       |      //                               *
  294|   686k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (294:11): [True: 447k, False: 238k]
  ------------------
  295|   447k|        bool isCarboxylateO = atom->IsCarboxylOxygen();
  296|       |
  297|   447k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   447k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 447k, False: 447k]
  |  |  ------------------
  ------------------
  298|   447k|          bond1 = atom->GetVector() - nbr->GetVector();
  299|       |
  300|   447k|          if (nbr->GetHyb() == 1) // Fix #2119034 & #2013814
  ------------------
  |  Branch (300:15): [True: 133k, False: 314k]
  ------------------
  301|   133k|            continue;
  302|       |
  303|   780k|          FOR_NBORS_OF_ATOM (nbr2, &*nbr) {
  ------------------
  |  |  419|   314k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 780k, False: 314k]
  |  |  ------------------
  ------------------
  304|   780k|            if (&*nbr2 != atom) {
  ------------------
  |  Branch (304:17): [True: 466k, False: 314k]
  ------------------
  305|   466k|              bond2 = nbr->GetVector() - nbr2->GetVector();
  306|       |
  307|   466k|              if (isCarboxylateO && nbr2->GetAtomicNum() == OBElements::Oxygen)
  ------------------
  |  Branch (307:19): [True: 104, False: 466k]
  |  Branch (307:37): [True: 57, False: 47]
  ------------------
  308|     57|                break; // make sure that the hydrogen is trans to the C=O
  309|   466k|            }
  310|   780k|          }
  311|   314k|        }
  312|       |
  313|   447k|        bond1 = bond1.normalize();
  314|   447k|        v1 = cross(bond1, bond2);
  315|   447k|        if (bond2.length_2() == 0.0 || v1.length_2() == 0.0) {
  ------------------
  |  Branch (315:13): [True: 157k, False: 290k]
  |  Branch (315:40): [True: 1.73k, False: 288k]
  ------------------
  316|   159k|          vector3 vrand;
  317|   159k|          vrand.randomUnitVector();
  318|   159k|          double angle = fabs(acos(dot(bond1, vrand)) * RAD_TO_DEG);
  ------------------
  |  |   31|   159k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  319|   215k|          while (angle < 45.0 || angle > 135.0) {
  ------------------
  |  Branch (319:18): [True: 28.1k, False: 187k]
  |  Branch (319:34): [True: 28.3k, False: 159k]
  ------------------
  320|  56.5k|            vrand.randomUnitVector();
  321|  56.5k|            angle = fabs(acos(dot(bond1, vrand)) * RAD_TO_DEG);
  ------------------
  |  |   31|  56.5k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  322|  56.5k|          }
  323|       |          // there is no a-2 atom
  324|   159k|          v1 = cross(bond1, vrand); // so find a perpendicular, given the random vector (this doesn't matter here)
  325|   159k|        }
  326|   447k|        v2 = cross(bond1, v1);
  327|   447k|        v2 = v2.normalize();
  328|       |
  329|       |        // check to see if atom is a square planar in disguise
  330|   447k|        if (atom->GetHyb() == 3) {
  ------------------
  |  Branch (330:13): [True: 179k, False: 268k]
  ------------------
  331|   179k|          OBStereoFacade stereoFacade((OBMol*)atom->GetParent(), false); // Don't reperceive
  332|   179k|          if (stereoFacade.HasSquarePlanarStereo(atom->GetId()))
  ------------------
  |  Branch (332:15): [True: 0, False: 179k]
  ------------------
  333|      0|            atom->SetHyb(4); // force sq. planar geometry for sq. planar stereo
  334|   179k|        }
  335|       |
  336|   447k|        if (atom->GetHyb() == 1)
  ------------------
  |  Branch (336:13): [True: 119k, False: 328k]
  ------------------
  337|   119k|          newbond = bond1; // i.e., in the exact opposite direction
  338|   328k|        else if (atom->GetHyb() == 2)
  ------------------
  |  Branch (338:18): [True: 139k, False: 189k]
  ------------------
  339|   139k|          newbond = bond1 - v2 * tan(DEG_TO_RAD*60.0);
  ------------------
  |  |   35|   139k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  340|   189k|        else if (atom->GetHyb() == 3)
  ------------------
  |  Branch (340:18): [True: 179k, False: 9.32k]
  ------------------
  341|   179k|          newbond = bond1 - v2 * tan(DEG_TO_RAD*(180.0 - 109.471));
  ------------------
  |  |   35|   179k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  342|  9.32k|        else if (atom->GetHyb() == 4)
  ------------------
  |  Branch (342:18): [True: 0, False: 9.32k]
  ------------------
  343|      0|          newbond = bond1; // like 5-coordinate below, we want a 180-degree bond (trans)
  344|  9.32k|        else if (atom->GetHyb() == 5) {
  ------------------
  |  Branch (344:18): [True: 6.67k, False: 2.64k]
  ------------------
  345|       |          /* the first two atoms are the axial ones;  the third, fourth, and fifth atom are equatorial */
  346|  6.67k|          newbond = bond1;
  347|  6.67k|        } else if (atom->GetHyb() == 6) {
  ------------------
  |  Branch (347:20): [True: 2.11k, False: 531]
  ------------------
  348|  2.11k|          newbond = bond1 - v2 * tan(DEG_TO_RAD*90.0);
  ------------------
  |  |   35|  2.11k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  349|  2.11k|        }
  350|       |
  351|   447k|        newbond = newbond.normalize();
  352|   447k|        newbond *= length;
  353|   447k|        newbond += atom->GetVector();
  354|   447k|        return newbond;
  355|   447k|      }
  356|       |
  357|       |      //
  358|       |      //    \	      \                                                     //
  359|       |      //     X  --->   X--*
  360|       |      //    /         /
  361|       |      //
  362|   238k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (362:11): [True: 170k, False: 67.9k]
  ------------------
  363|   341k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   170k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 341k, False: 170k]
  |  |  ------------------
  ------------------
  364|   341k|          if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (364:15): [True: 170k, False: 170k]
  ------------------
  365|   170k|            bond1 = atom->GetVector() - nbr->GetVector();
  366|   170k|          else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (366:20): [True: 170k, False: 0]
  ------------------
  367|   170k|            bond2 = atom->GetVector() - nbr->GetVector();
  368|   341k|        }
  369|       |
  370|   170k|        bond1 = bond1.normalize();
  371|   170k|        bond2 = bond2.normalize();
  372|   170k|        v1 = bond1 + bond2;
  373|   170k|        v1 = v1.normalize();
  374|       |
  375|   170k|        if (atom->GetHyb() == 2)
  ------------------
  |  Branch (375:13): [True: 71.6k, False: 99.1k]
  ------------------
  376|  71.6k|          newbond = v1;
  377|  99.1k|        else if (atom->GetHyb() == 3) {
  ------------------
  |  Branch (377:18): [True: 84.2k, False: 14.9k]
  ------------------
  378|  84.2k|          v2 = cross(bond1, bond2); // find the perpendicular
  379|  84.2k|          v2.normalize();
  380|  84.2k|          newbond = bond1 - v2 * tan(DEG_TO_RAD*(180.0 - 109.471));
  ------------------
  |  |   35|  84.2k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  381|  84.2k|          newbond = v2 + v1 * (sqrt(2.0) / 2.0); // used to be tan(70.53 degrees/2) which is sqrt(2.0) / 2.0
  382|  84.2k|        }
  383|  14.9k|        else if (atom->GetHyb() == 5 || atom->GetHyb() == 4) {
  ------------------
  |  Branch (383:18): [True: 3.93k, False: 10.9k]
  |  Branch (383:41): [True: 0, False: 10.9k]
  ------------------
  384|       |          /* add the first equatorial atom, orthogonally to bond1 (and bond2 = -bond1) */
  385|       |          /* is atom order correct?  I don't think it matters, but I might have to ask a chemist
  386|       |           * whether PClF4 would be more likely to have an equatorial or axial Cl-P bond */
  387|  3.93k|          vector3 vrand;
  388|  3.93k|          vrand.randomUnitVector();
  389|  3.93k|          double angle = fabs(acos(dot(bond1, vrand)) * RAD_TO_DEG);
  ------------------
  |  |   31|  3.93k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  390|  5.44k|          while (angle < 45.0 || angle > 135.0) {
  ------------------
  |  Branch (390:18): [True: 742, False: 4.70k]
  |  Branch (390:34): [True: 769, False: 3.93k]
  ------------------
  391|  1.51k|            vrand.randomUnitVector();
  392|  1.51k|            angle = fabs(acos(dot(bond1, vrand)) * RAD_TO_DEG);
  ------------------
  |  |   31|  1.51k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  393|  1.51k|          }
  394|  3.93k|          v1 = cross(bond1, vrand);
  395|  3.93k|          v1 = v1.normalize();
  396|  3.93k|          newbond = v1;
  397|  3.93k|        }
  398|  10.9k|        else if (atom->GetHyb() == 6) {
  ------------------
  |  Branch (398:18): [True: 1.76k, False: 9.21k]
  ------------------
  399|  1.76k|          v2 = cross(bond1, bond2);
  400|  1.76k|          newbond = v2;
  401|  1.76k|        }
  402|       |
  403|   170k|        newbond = newbond.normalize(); //if newbond was not set, it will become non-finite here
  404|   170k|        newbond *= length;
  405|   170k|        newbond += atom->GetVector();
  406|   170k|        return newbond;
  407|   170k|      }
  408|       |
  409|       |
  410|       |      /* UFF:
  411|       |       *    b lg dg  o  y
  412|       |       *  b - 45 30 45 30
  413|       |       * lg    - 45  0 45
  414|       |       * dg       - 45 30
  415|       |       *  o          - 45
  416|       |       *  y             -
  417|       |
  418|       |       * 94s:
  419|       |       *    b lg dg  o  y
  420|       |       *  b - 34 34 34 34
  421|       |       * lg    - 48 21 48
  422|       |       * dg       - 48 21
  423|       |       *  o          - 48
  424|       |       *  y             -
  425|       |
  426|       |       //
  427|       |       //    \	       \
  428|       |       //   --X  --->  --X--*
  429|       |       //    /          /
  430|       |       //
  431|       |       */
  432|  67.9k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (432:11): [True: 54.2k, False: 13.6k]
  ------------------
  433|  54.2k|        if (atom->GetHyb() == 3) {
  ------------------
  |  Branch (433:13): [True: 45.7k, False: 8.54k]
  ------------------
  434|   137k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  45.7k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 137k, False: 45.7k]
  |  |  ------------------
  ------------------
  435|   137k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (435:17): [True: 45.7k, False: 91.4k]
  ------------------
  436|  45.7k|              bond1 = atom->GetVector() - nbr->GetVector();
  437|  91.4k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (437:22): [True: 45.7k, False: 45.7k]
  ------------------
  438|  45.7k|              bond2 = atom->GetVector() - nbr->GetVector();
  439|  45.7k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (439:22): [True: 45.7k, False: 0]
  ------------------
  440|  45.7k|              bond3 = atom->GetVector() - nbr->GetVector();
  441|   137k|          }
  442|       |
  443|  45.7k|          bond1 = bond1.normalize();
  444|  45.7k|          bond2 = bond2.normalize();
  445|  45.7k|          bond3 = bond3.normalize();
  446|  45.7k|          newbond = bond1 + bond2 + bond3;
  447|  45.7k|          newbond = newbond.normalize();
  448|  45.7k|          newbond *= length;
  449|  45.7k|          newbond += atom->GetVector();
  450|  45.7k|          return newbond;
  451|  45.7k|        }
  452|       |
  453|  8.54k|        if (atom->GetHyb() == 4) { // OK, we want this at -bond3, since bond1 & bond2 are opposite
  ------------------
  |  Branch (453:13): [True: 0, False: 8.54k]
  ------------------
  454|      0|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  455|      0|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (455:17): [True: 0, False: 0]
  ------------------
  456|      0|              bond1 = atom->GetVector() - nbr->GetVector();
  457|      0|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (457:22): [True: 0, False: 0]
  ------------------
  458|      0|              bond2 = atom->GetVector() - nbr->GetVector();
  459|      0|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (459:22): [True: 0, False: 0]
  ------------------
  460|      0|              bond3 = atom->GetVector() - nbr->GetVector();
  461|      0|          }
  462|       |
  463|      0|          bond3 = bond3.normalize();
  464|       |
  465|      0|          newbond = bond3;
  466|      0|          newbond = newbond.normalize();
  467|      0|          newbond *= length;
  468|      0|          newbond += atom->GetVector();
  469|      0|          return newbond;
  470|      0|        }
  471|       |
  472|  8.54k|        if (atom->GetHyb() == 5) {
  ------------------
  |  Branch (472:13): [True: 2.13k, False: 6.41k]
  ------------------
  473|  6.39k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  2.13k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 6.39k, False: 2.13k]
  |  |  ------------------
  ------------------
  474|  6.39k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (474:17): [True: 2.13k, False: 4.26k]
  ------------------
  475|  2.13k|              bond1 = atom->GetVector() - nbr->GetVector();
  476|  4.26k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (476:22): [True: 2.13k, False: 2.13k]
  ------------------
  477|  2.13k|              bond2 = atom->GetVector() - nbr->GetVector();
  478|  2.13k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (478:22): [True: 2.13k, False: 0]
  ------------------
  479|  2.13k|              bond3 = atom->GetVector() - nbr->GetVector();
  480|  6.39k|          }
  481|       |
  482|  2.13k|          bond1 = bond1.normalize();
  483|  2.13k|          bond2 = bond2.normalize();
  484|  2.13k|          bond3 = bond3.normalize();
  485|       |
  486|  2.13k|          v1 = cross(bond1, bond3);
  487|  2.13k|          v1 = v1.normalize();
  488|       |
  489|  2.13k|          newbond = v1 + tan(DEG_TO_RAD*30.0) * bond3;
  ------------------
  |  |   35|  2.13k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  490|  2.13k|          newbond = newbond.normalize();
  491|  2.13k|          newbond *= length;
  492|  2.13k|          newbond += atom->GetVector();
  493|  2.13k|          return newbond;
  494|       |
  495|  2.13k|        }
  496|       |
  497|  6.41k|        if (atom->GetHyb() == 6) {
  ------------------
  |  Branch (497:13): [True: 1.51k, False: 4.90k]
  ------------------
  498|  4.53k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.51k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 4.53k, False: 1.51k]
  |  |  ------------------
  ------------------
  499|  4.53k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (499:17): [True: 1.51k, False: 3.02k]
  ------------------
  500|  1.51k|              bond1 = atom->GetVector() - nbr->GetVector();
  501|  3.02k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (501:22): [True: 1.51k, False: 1.51k]
  ------------------
  502|  1.51k|              bond2 = atom->GetVector() - nbr->GetVector();
  503|  1.51k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (503:22): [True: 1.51k, False: 0]
  ------------------
  504|  1.51k|              bond3 = atom->GetVector() - nbr->GetVector();
  505|  4.53k|          }
  506|       |
  507|       |          /* the way things work, newbond is equal to bond1, but will show up at -bond1 next time around */
  508|  1.51k|          newbond = bond1;
  509|  1.51k|          newbond = newbond.normalize();
  510|  1.51k|          newbond *= length;
  511|  1.51k|          newbond += atom->GetVector();
  512|  1.51k|          return newbond;
  513|  1.51k|        }
  514|  6.41k|      }
  515|       |
  516|  18.5k|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (516:11): [True: 3.44k, False: 15.1k]
  ------------------
  517|  3.44k|        if (atom->GetHyb() == 6) {
  ------------------
  |  Branch (517:13): [True: 1.34k, False: 2.09k]
  ------------------
  518|  5.39k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.34k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 5.39k, False: 1.34k]
  |  |  ------------------
  ------------------
  519|  5.39k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (519:17): [True: 1.34k, False: 4.04k]
  ------------------
  520|  1.34k|              bond1 = atom->GetVector() - nbr->GetVector();
  521|  4.04k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (521:22): [True: 1.34k, False: 2.69k]
  ------------------
  522|  1.34k|              bond2 = atom->GetVector() - nbr->GetVector();
  523|  2.69k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (523:22): [True: 1.34k, False: 1.34k]
  ------------------
  524|  1.34k|              bond3 = atom->GetVector() - nbr->GetVector();
  525|  1.34k|            else if (bond4.length_2() == 0.0)
  ------------------
  |  Branch (525:22): [True: 1.34k, False: 0]
  ------------------
  526|  1.34k|              bond4 = atom->GetVector() - nbr->GetVector();
  527|  5.39k|          }
  528|       |
  529|  1.34k|          newbond = bond2;
  530|  1.34k|          newbond = newbond.normalize();
  531|  1.34k|          newbond *= length;
  532|  1.34k|          newbond += atom->GetVector();
  533|  1.34k|          return newbond;
  534|  1.34k|        }
  535|       |
  536|  2.09k|        if (atom->GetHyb() == 5) {
  ------------------
  |  Branch (536:13): [True: 942, False: 1.15k]
  ------------------
  537|  3.76k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    942|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 3.76k, False: 942]
  |  |  ------------------
  ------------------
  538|  3.76k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (538:17): [True: 942, False: 2.82k]
  ------------------
  539|    942|              bond1 = atom->GetVector() - nbr->GetVector();
  540|  2.82k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (540:22): [True: 942, False: 1.88k]
  ------------------
  541|    942|              bond2 = atom->GetVector() - nbr->GetVector();
  542|  1.88k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (542:22): [True: 942, False: 942]
  ------------------
  543|    942|              bond3 = atom->GetVector() - nbr->GetVector();
  544|    942|            else if (bond4.length_2() == 0.0)
  ------------------
  |  Branch (544:22): [True: 942, False: 0]
  ------------------
  545|    942|              bond4 = atom->GetVector() - nbr->GetVector();
  546|  3.76k|          }
  547|       |
  548|    942|          bond1 = bond1.normalize();
  549|    942|          bond2 = bond2.normalize();
  550|    942|          bond3 = bond3.normalize();
  551|    942|          bond4 = bond4.normalize();
  552|       |
  553|    942|          v1 = cross(bond1, bond3);
  554|    942|          v1 = v1.normalize();
  555|       |
  556|    942|          newbond = -v1 + tan(DEG_TO_RAD*30.0) * bond3;
  ------------------
  |  |   35|    942|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  557|    942|          newbond = newbond.normalize();
  558|    942|          newbond *= length;
  559|    942|          newbond += atom->GetVector();
  560|    942|          return newbond;
  561|       |
  562|    942|        }
  563|       |
  564|  2.09k|      }
  565|       |
  566|  16.2k|      if (atom->GetExplicitDegree() == 5) {
  ------------------
  |  Branch (566:11): [True: 1.55k, False: 14.7k]
  ------------------
  567|  1.55k|        if (atom->GetHyb() == 6) {
  ------------------
  |  Branch (567:13): [True: 1.07k, False: 480]
  ------------------
  568|  5.37k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.07k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 5.37k, False: 1.07k]
  |  |  ------------------
  ------------------
  569|  5.37k|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (569:17): [True: 1.07k, False: 4.29k]
  ------------------
  570|  1.07k|              bond1 = atom->GetVector() - nbr->GetVector();
  571|  4.29k|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (571:22): [True: 1.07k, False: 3.22k]
  ------------------
  572|  1.07k|              bond2 = atom->GetVector() - nbr->GetVector();
  573|  3.22k|            else if (bond3.length_2() == 0.0)
  ------------------
  |  Branch (573:22): [True: 1.07k, False: 2.14k]
  ------------------
  574|  1.07k|              bond3 = atom->GetVector() - nbr->GetVector();
  575|  2.14k|            else if (bond4.length_2() == 0.0)
  ------------------
  |  Branch (575:22): [True: 1.07k, False: 1.07k]
  ------------------
  576|  1.07k|              bond4 = atom->GetVector() - nbr->GetVector();
  577|  1.07k|            else if (bond5.length_2() == 0.0)
  ------------------
  |  Branch (577:22): [True: 1.07k, False: 0]
  ------------------
  578|  1.07k|              bond5 = atom->GetVector() - nbr->GetVector();
  579|  5.37k|          }
  580|       |
  581|  1.07k|          newbond = bond3;
  582|  1.07k|          newbond = newbond.normalize();
  583|  1.07k|          newbond *= length;
  584|  1.07k|          newbond += atom->GetVector();
  585|  1.07k|          return newbond;
  586|  1.07k|        }
  587|  1.55k|      }
  588|       |
  589|       |      // Undefined case -- return a random vector of length specified
  590|  15.1k|      newbond.randomUnitVector();
  591|  15.1k|      newbond *= length;
  592|  15.1k|      newbond += atom->GetVector();
  593|  15.1k|      return newbond;
  594|  57.8k|    } else {
  595|       |      ////////////
  596|       |      //   2D   //
  597|       |      ////////////
  598|  57.8k|      OBBondIterator i;
  599|       |
  600|       |      //
  601|       |      //  a   --->   a---*
  602|       |      //
  603|  57.8k|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (603:11): [True: 453, False: 57.4k]
  ------------------
  604|    453|        newbond = atom->GetVector() + VX * length;
  605|       |        // Check that the vector is still finite before returning
  606|    453|        if (!isfinite(newbond.x()) || !isfinite(newbond.y()))
  ------------------
  |  Branch (606:13): [True: 22, False: 431]
  |  Branch (606:39): [True: 1, False: 430]
  ------------------
  607|     23|          newbond.Set(0.0, 0.0, 0.0);
  608|    453|        return newbond;
  609|    453|      }
  610|       |
  611|       |      // hyb * = 1                                                                //
  612|       |      // ^^^^^^^^^                                                                //
  613|       |      //                                                                          //
  614|       |      //   (a-1)--a   --->   (a-1)--a--*        angle(a-1, a, *) = 180            //
  615|       |      //                                                                          //
  616|       |      // hyb * = 2                                                                //
  617|       |      // ^^^^^^^^^                                                                //
  618|       |      // make sure we place the new atom trans to a-2 (if there is an a-2 atom)   //
  619|       |      //                                                                          //
  620|       |      //   (a-2)             (a-2)                                                //
  621|       |      //     \                 \                                                  //
  622|       |      //    (a-1)==a   --->   (a-1)==a          angle(a-1, a, *) = 120            //
  623|       |      //                              \                                           //
  624|       |      //                               *                                          //
  625|       |      // hyb * = 3                                                                //
  626|       |      // ^^^^^^^^^                                                                //
  627|       |      // make sure we place the new atom trans to a-2 (if there is an a-2 atom)   //
  628|       |      //                                                                          //
  629|       |      //   (a-2)             (a-2)                                                //
  630|       |      //     \                 \                                                  //
  631|       |      //    (a-1)--a   --->   (a-1)--a          angle(a-1, a, *) = 109            //
  632|       |      //                              \                                           //
  633|       |      //                               *                                          //
  634|  57.4k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (634:11): [True: 1.44k, False: 56.0k]
  ------------------
  635|  1.44k|        OBAtom *nbr = atom->BeginNbrAtom(i);
  636|  1.44k|        if (!nbr)
  ------------------
  |  Branch (636:13): [True: 0, False: 1.44k]
  ------------------
  637|      0|          return VZero;
  638|  1.44k|        bond1 = atom->GetVector() - nbr->GetVector(); // bond (a-1)--a
  639|       |
  640|  2.88k|        for (OBAtom *nbr2 = nbr->BeginNbrAtom(i); nbr2; nbr2 = nbr->NextNbrAtom(i))
  ------------------
  |  Branch (640:51): [True: 1.44k, False: 1.44k]
  ------------------
  641|  1.44k|          if (nbr2 != atom)
  ------------------
  |  Branch (641:15): [True: 0, False: 1.44k]
  ------------------
  642|      0|            bond2 = nbr->GetVector() - nbr2->GetVector(); // bond (a-2)--(a-1)
  643|       |
  644|  1.44k|        int hyb = atom->GetHyb();
  645|  1.44k|        if (hyb == 1)
  ------------------
  |  Branch (645:13): [True: 666, False: 775]
  ------------------
  646|    666|          newbond = bond1;
  647|    775|        else if (hyb == 2 || hyb == 3 || hyb == 0) {
  ------------------
  |  Branch (647:18): [True: 377, False: 398]
  |  Branch (647:30): [True: 394, False: 4]
  |  Branch (647:42): [True: 0, False: 4]
  ------------------
  648|    771|          matrix3x3 m;
  649|    771|          m.RotAboutAxisByAngle(VZ, 60.0);
  650|    771|          newbond = m*bond1;
  651|    771|        }
  652|  1.44k|        newbond.normalize();
  653|  1.44k|        newbond *= length;
  654|  1.44k|        newbond += atom->GetVector();
  655|  1.44k|        return newbond;
  656|  1.44k|      } // GetExplicitDegree() == 1
  657|       |
  658|       |      //                          //
  659|       |      //    \         \           //
  660|       |      //     X  --->   X--*       //
  661|       |      //    /         /           //
  662|       |      //                          //
  663|  56.0k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (663:11): [True: 55.3k, False: 674]
  ------------------
  664|   165k|        for (OBAtom *nbr = atom->BeginNbrAtom(i); nbr; nbr = atom->NextNbrAtom(i)) {
  ------------------
  |  Branch (664:51): [True: 110k, False: 55.3k]
  ------------------
  665|   110k|          if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (665:15): [True: 55.3k, False: 55.3k]
  ------------------
  666|  55.3k|            bond1 = atom->GetVector() - nbr->GetVector();
  667|  55.3k|          else
  668|  55.3k|            bond2 = atom->GetVector() - nbr->GetVector();
  669|   110k|        }
  670|  55.3k|        bond1.normalize();
  671|  55.3k|        bond2.normalize();
  672|  55.3k|        newbond = bond1 + bond2;
  673|  55.3k|        newbond.normalize();
  674|  55.3k|        newbond *= length;
  675|  55.3k|        newbond += atom->GetVector();
  676|  55.3k|        return newbond;
  677|  55.3k|      }
  678|       |
  679|       |      //                          //
  680|       |      //    \          \          //
  681|       |      //   --X  --->  --X--*      //
  682|       |      //    /          /          //
  683|       |      //                          //
  684|    674|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (684:11): [True: 24, False: 650]
  ------------------
  685|     24|        OBStereoFacade stereoFacade((OBMol*)atom->GetParent());
  686|     24|        if (stereoFacade.HasTetrahedralStereo(atom->GetId())) {
  ------------------
  |  Branch (686:13): [True: 0, False: 24]
  ------------------
  687|      0|          OBBond *hash = nullptr;
  688|      0|          OBBond *wedge = nullptr;
  689|      0|          vector<OBBond*> plane;
  690|      0|          for (OBAtom *nbr = atom->BeginNbrAtom(i); nbr; nbr = atom->NextNbrAtom(i)) {
  ------------------
  |  Branch (690:53): [True: 0, False: 0]
  ------------------
  691|      0|            OBBond *bond = atom->GetBond(nbr);
  692|       |
  693|      0|            if (bond->IsWedge()) {
  ------------------
  |  Branch (693:17): [True: 0, False: 0]
  ------------------
  694|      0|              if (atom == bond->GetBeginAtom())
  ------------------
  |  Branch (694:19): [True: 0, False: 0]
  ------------------
  695|      0|                wedge = bond;
  696|      0|              else
  697|      0|                hash = bond;
  698|      0|            } else
  699|      0|              if (bond->IsHash()) {
  ------------------
  |  Branch (699:19): [True: 0, False: 0]
  ------------------
  700|      0|                if (atom == bond->GetBeginAtom())
  ------------------
  |  Branch (700:21): [True: 0, False: 0]
  ------------------
  701|      0|                  hash = bond;
  702|      0|                else
  703|      0|                  wedge = bond;
  704|      0|              } else
  705|      0|                plane.push_back(bond);
  706|      0|          }
  707|       |
  708|      0|          if (wedge && !plane.empty()) {
  ------------------
  |  Branch (708:15): [True: 0, False: 0]
  |  Branch (708:24): [True: 0, False: 0]
  ------------------
  709|      0|            bond2 = atom->GetVector() - wedge->GetNbrAtom(atom)->GetVector();
  710|      0|            bond3 = atom->GetVector() - plane[0]->GetNbrAtom(atom)->GetVector();
  711|      0|          } else if (hash && !plane.empty()) {
  ------------------
  |  Branch (711:22): [True: 0, False: 0]
  |  Branch (711:30): [True: 0, False: 0]
  ------------------
  712|      0|            bond2 = atom->GetVector() - hash->GetNbrAtom(atom)->GetVector();
  713|      0|            bond3 = atom->GetVector() - plane[0]->GetNbrAtom(atom)->GetVector();
  714|      0|          } else if (plane.size() >= 2) {
  ------------------
  |  Branch (714:22): [True: 0, False: 0]
  ------------------
  715|      0|            bond2 = atom->GetVector() - plane[0]->GetNbrAtom(atom)->GetVector();
  716|      0|            bond3 = atom->GetVector() - plane[1]->GetNbrAtom(atom)->GetVector();
  717|      0|          } else if (hash && wedge) {
  ------------------
  |  Branch (717:22): [True: 0, False: 0]
  |  Branch (717:30): [True: 0, False: 0]
  ------------------
  718|      0|            bond2 = atom->GetVector() - wedge->GetNbrAtom(atom)->GetVector();
  719|      0|            bond3 = atom->GetVector() - hash->GetNbrAtom(atom)->GetVector();
  720|      0|          }
  721|     24|        } else {
  722|     96|          for (OBAtom *nbr = atom->BeginNbrAtom(i); nbr; nbr = atom->NextNbrAtom(i)) {
  ------------------
  |  Branch (722:53): [True: 72, False: 24]
  ------------------
  723|     72|            if (bond1.length_2() == 0.0)
  ------------------
  |  Branch (723:17): [True: 24, False: 48]
  ------------------
  724|     24|              bond1 = atom->GetVector() - nbr->GetVector();
  725|     48|            else if (bond2.length_2() == 0.0)
  ------------------
  |  Branch (725:22): [True: 24, False: 24]
  ------------------
  726|     24|              bond2 = atom->GetVector() - nbr->GetVector();
  727|     24|            else
  728|     24|              bond3 = atom->GetVector() - nbr->GetVector();
  729|     72|          }
  730|     24|        }
  731|       |
  732|     24|        bond2.normalize();
  733|     24|        bond3.normalize();
  734|     24|        newbond = -(bond2 + bond3);
  735|     24|        newbond.normalize();
  736|     24|        newbond *= length;
  737|     24|        newbond += atom->GetVector();
  738|     24|        return newbond;
  739|     24|      }
  740|       |
  741|       |      // Undefined case -- return a random vector of length specified
  742|    650|      newbond.randomUnitVector();
  743|    650|      newbond.z() = 0.0;
  744|    650|      newbond.normalize();
  745|    650|      newbond *= length;
  746|    650|      newbond += atom->GetVector();
  747|    650|      return newbond;
  748|    674|    }
  749|       |
  750|      0|    return VZero; //previously undefined
  751|   804k|  }
_ZN9OpenBabel9OBBuilder7ConnectERNS_5OBMolEiiRNS_7vector3Ei:
  761|  2.17k|  {
  762|  2.17k|    OBAtom *a = mol.GetAtom(idxA);
  763|  2.17k|    OBAtom *b = mol.GetAtom(idxB);
  764|       |
  765|  2.17k|    if (a == nullptr)
  ------------------
  |  Branch (765:9): [True: 0, False: 2.17k]
  ------------------
  766|      0|      return false;
  767|  2.17k|    if (b == nullptr)
  ------------------
  |  Branch (767:9): [True: 0, False: 2.17k]
  ------------------
  768|      0|      return false;
  769|       |
  770|  2.17k|    OBBitVec fragment = GetFragment(b);
  771|  2.17k|    if (fragment == GetFragment(a))
  ------------------
  |  Branch (771:9): [True: 0, False: 2.17k]
  ------------------
  772|      0|      return false; // a and b are in the same fragment
  773|       |
  774|  2.17k|    bool connectedFrag = true; // normal case
  775|       |    // If we don't have any neighbors, assume that the fragment
  776|       |    // is inserted at the end of the molecule and set anything after the atom.
  777|       |    // This lets us place fragments like Cp rings with dummy atoms
  778|  2.17k|    if (b->GetAtomicNum() == 0) {
  ------------------
  |  Branch (778:9): [True: 35, False: 2.13k]
  ------------------
  779|     35|      connectedFrag = false;
  780|     35|      fragment.SetRangeOn(b->GetIdx(), mol.NumAtoms());
  781|     35|    }
  782|       |
  783|  2.17k|    vector3 posa = a->GetVector();
  784|  2.17k|    vector3 posb = b->GetVector();
  785|       |    //
  786|       |    // translate fragment so that atom b is at the origin
  787|       |    //
  788|   495k|    for (unsigned int i = 1; i <= mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (788:30): [True: 493k, False: 2.17k]
  ------------------
  789|   493k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (789:11): [True: 66.0k, False: 427k]
  ------------------
  790|       |        // the atom is part of the fragment, translate it
  791|  66.0k|        vector3 tmpvec = mol.GetAtom(i)->GetVector();
  792|  66.0k|        tmpvec -= posb;
  793|  66.0k|        mol.GetAtom(i)->SetVector(tmpvec);
  794|  66.0k|      }
  795|   493k|    }
  796|       |    //
  797|       |    // rotate the fragment to align the bond directions Mol-a-b and a-b-fragment
  798|       |    //
  799|  2.17k|    matrix3x3 xymat, xzmat, yzmat;
  800|  2.17k|    vector3 moldir = newpos - posa;
  801|  2.17k|    double xyang, yzang, xzang;
  802|       |
  803|  2.17k|    vector3 fragdir = GetNewBondVector(b); // b is at origin
  804|  2.17k|    vector3 crossdir;
  805|  2.17k|    if (!connectedFrag) { // nothing bonded to b, like a Cp ring
  ------------------
  |  Branch (805:9): [True: 35, False: 2.13k]
  ------------------
  806|     35|      vector3 firstDir, secondDir;
  807|       |      // Try finding the next atom
  808|     35|      OBAtom *nextAtom = mol.GetAtom(b->GetIdx() + 1);
  809|     35|      if (nextAtom) {
  ------------------
  |  Branch (809:11): [True: 35, False: 0]
  ------------------
  810|     35|        firstDir = nextAtom->GetVector() - b->GetVector();
  811|       |        // we'll try finding another atom
  812|     35|        OBAtom *secondAtom = mol.GetAtom(b->GetIdx() + 2);
  813|     35|        if (secondAtom)
  ------------------
  |  Branch (813:13): [True: 35, False: 0]
  ------------------
  814|     35|          secondDir = secondAtom->GetVector() - b->GetVector();
  815|      0|        else
  816|      0|          secondDir.randomUnitVector(); // pick something at random
  817|       |        // but not too shallow, or the cross product won't work well
  818|     35|        double angle = fabs(acos(dot(firstDir, secondDir)) * RAD_TO_DEG);
  ------------------
  |  |   31|     35|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  819|     39|        while (angle < 45.0 || angle > 135.0) {
  ------------------
  |  Branch (819:16): [True: 3, False: 36]
  |  Branch (819:32): [True: 1, False: 35]
  ------------------
  820|      4|          secondDir.randomUnitVector();
  821|      4|          angle = fabs(acos(dot(firstDir, secondDir)) * RAD_TO_DEG);
  ------------------
  |  |   31|      4|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  822|      4|        }
  823|       |        // Now we find a perpendicular vector to the fragment
  824|     35|        crossdir = cross(firstDir, secondDir);
  825|     35|        fragdir = crossdir;
  826|     35|      }
  827|     35|    }
  828|  2.17k|    xyang = vectorAngle(vector3(moldir.x(), moldir.y(), 0.0), vector3(fragdir.x(), fragdir.y(), 0.0));
  829|  2.17k|    if (cross(vector3(moldir.x(), moldir.y(), 0.0), vector3(fragdir.x(), fragdir.y(), 0.0)).z() > 0) {
  ------------------
  |  Branch (829:9): [True: 1.01k, False: 1.15k]
  ------------------
  830|  1.01k|      xyang = 180 + xyang;
  831|  1.15k|    } else if (cross(vector3(moldir.x(), moldir.y(), 0.0), vector3(fragdir.x(), fragdir.y(), 0.0)).z() < 0) {
  ------------------
  |  Branch (831:16): [True: 1.02k, False: 133]
  ------------------
  832|  1.02k|      xyang = 180 - xyang;
  833|  1.02k|    } else {
  834|    133|      xyang = 0.0;
  835|    133|    }
  836|  2.17k|    xymat.SetupRotMat(0.0, 0.0, xyang);
  837|   495k|    for (unsigned int i = 1; i <= mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (837:30): [True: 493k, False: 2.17k]
  ------------------
  838|   493k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (838:11): [True: 66.0k, False: 427k]
  ------------------
  839|  66.0k|        vector3 tmpvec = mol.GetAtom(i)->GetVector();
  840|  66.0k|        tmpvec *= xymat; //apply the rotation
  841|  66.0k|        mol.GetAtom(i)->SetVector(tmpvec);
  842|  66.0k|      }
  843|   493k|    }
  844|       |
  845|  2.17k|    fragdir = GetNewBondVector(b);
  846|  2.17k|    if (!connectedFrag)
  ------------------
  |  Branch (846:9): [True: 35, False: 2.13k]
  ------------------
  847|     35|      fragdir = crossdir;
  848|  2.17k|    xzang = vectorAngle(vector3(moldir.x(), moldir.z(), 0.0), vector3(fragdir.x(), fragdir.z(), 0.0));
  849|  2.17k|    if (cross(vector3(moldir.x(), moldir.z(), 0.0), vector3(fragdir.x(), fragdir.z(), 0.0)).z() > 0) {
  ------------------
  |  Branch (849:9): [True: 1.03k, False: 1.14k]
  ------------------
  850|  1.03k|      xzang = 180 - xzang;
  851|  1.14k|    } else if (cross(vector3(moldir.x(), moldir.z(), 0.0), vector3(fragdir.x(), fragdir.z(), 0.0)).z() < 0) {
  ------------------
  |  Branch (851:16): [True: 1.01k, False: 132]
  ------------------
  852|  1.01k|      xzang = 180 + xzang;
  853|  1.01k|    } else {
  854|    132|      xzang = 0.0;
  855|    132|    }
  856|  2.17k|    xzmat.SetupRotMat(0.0, xzang, 0.0);
  857|   495k|    for (unsigned int i = 1; i <= mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (857:30): [True: 493k, False: 2.17k]
  ------------------
  858|   493k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (858:11): [True: 66.0k, False: 427k]
  ------------------
  859|  66.0k|        vector3 tmpvec = mol.GetAtom(i)->GetVector();
  860|  66.0k|        tmpvec *= xzmat; //apply the rotation
  861|  66.0k|        mol.GetAtom(i)->SetVector(tmpvec);
  862|  66.0k|      }
  863|   493k|    }
  864|       |
  865|  2.17k|    fragdir = GetNewBondVector(b);
  866|  2.17k|    if (!connectedFrag)
  ------------------
  |  Branch (866:9): [True: 35, False: 2.13k]
  ------------------
  867|     35|      fragdir = crossdir;
  868|  2.17k|    yzang = vectorAngle(vector3(moldir.y(), moldir.z(), 0.0), vector3(fragdir.y(), fragdir.z(), 0.0));
  869|  2.17k|    if (cross(vector3(moldir.y(), moldir.z(), 0.0), vector3(fragdir.y(), fragdir.z(), 0.0)).z() > 0) {
  ------------------
  |  Branch (869:9): [True: 332, False: 1.84k]
  ------------------
  870|    332|      yzang = 180 + yzang;
  871|  1.84k|    } else if (cross(vector3(moldir.y(), moldir.z(), 0.0), vector3(fragdir.y(), fragdir.z(), 0.0)).z() < 0) {
  ------------------
  |  Branch (871:16): [True: 358, False: 1.48k]
  ------------------
  872|    358|      yzang = 180 - yzang;
  873|  1.48k|    } else {
  874|  1.48k|      yzang = 0.0;
  875|  1.48k|    }
  876|  2.17k|    yzmat.SetupRotMat(yzang, 0.0, 0.0);
  877|   495k|    for (unsigned int i = 1; i <= mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (877:30): [True: 493k, False: 2.17k]
  ------------------
  878|   493k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (878:11): [True: 66.0k, False: 427k]
  ------------------
  879|  66.0k|        vector3 tmpvec = mol.GetAtom(i)->GetVector();
  880|  66.0k|        tmpvec *= yzmat; //apply the rotation
  881|  66.0k|        mol.GetAtom(i)->SetVector(tmpvec);
  882|  66.0k|      }
  883|   493k|    }
  884|       |    //
  885|       |    // translate fragment
  886|       |    //for(vector<OBMol>::iterator f=fragments.begin(); f!=fragments.end(); f++) {
  887|       |    //
  888|       |    //
  889|   495k|    for (unsigned int i = 1; i <= mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (889:30): [True: 493k, False: 2.17k]
  ------------------
  890|   493k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (890:11): [True: 66.0k, False: 427k]
  ------------------
  891|       |        // translate the fragment
  892|  66.0k|        vector3 tmpvec = mol.GetAtom(i)->GetVector();
  893|  66.0k|        tmpvec += newpos;
  894|  66.0k|        mol.GetAtom(i)->SetVector(tmpvec);
  895|  66.0k|      }
  896|   493k|    }
  897|       |    //
  898|       |    // Get a neighbor of a and of b for setting the dihedral later
  899|       |    //
  900|  2.17k|    OBAtom* nbr_a = nullptr;
  901|  2.17k|    FOR_NBORS_OF_ATOM(nbr, a) {
  ------------------
  |  |  419|  2.17k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.13k, False: 34]
  |  |  ------------------
  ------------------
  902|  2.13k|      nbr_a = &*nbr;
  903|  2.13k|      break;
  904|  2.13k|    }
  905|  2.17k|    OBAtom* nbr_b = nullptr;
  906|  2.17k|    FOR_NBORS_OF_ATOM(nbr, b) {
  ------------------
  |  |  419|  2.17k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 798, False: 1.37k]
  |  |  ------------------
  ------------------
  907|    798|      if (fragment.BitIsSet(nbr->GetIdx())) {
  ------------------
  |  Branch (907:11): [True: 798, False: 0]
  ------------------
  908|    798|        nbr_b = &*nbr;
  909|    798|        break;
  910|    798|      }
  911|    798|    }
  912|       |    //
  913|       |    // Create the bond between the two fragments
  914|       |    //
  915|  2.17k|    OBBond *bond = mol.NewBond();
  916|  2.17k|    bond->SetBegin(a);
  917|  2.17k|    bond->SetEnd(b);
  918|  2.17k|    bond->SetBondOrder(bondOrder);
  919|  2.17k|    a->AddBond(bond);
  920|  2.17k|    b->AddBond(bond);
  921|       |    //
  922|       |    // Set the dihedral between the two fragments
  923|       |    //
  924|       |    // For example, if a double bond is coming off a ring, then the dihedral
  925|       |    // should be 180, e.g. for I/C=C\1/NC1 (don't worry about whether cis or trans
  926|       |    // at this point - this will be corrected later)
  927|       |    //
  928|  2.17k|    if (bondOrder == 2 && a->GetHyb() == 2 && b->GetHyb() == 2 && nbr_a &&
  ------------------
  |  Branch (928:9): [True: 61, False: 2.11k]
  |  Branch (928:27): [True: 8, False: 53]
  |  Branch (928:47): [True: 2, False: 6]
  |  Branch (928:67): [True: 2, False: 0]
  ------------------
  929|      2|        nbr_b)
  ------------------
  |  Branch (929:9): [True: 2, False: 0]
  ------------------
  930|      2|      mol.SetTorsion(nbr_a, a, b, nbr_b, 180 * DEG_TO_RAD);
  ------------------
  |  |   35|      2|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  931|       |
  932|       |    // another special case is a single bond between two sp2 carbons - twist
  933|       |    // e.g. biphenyl
  934|  2.17k|    if (bondOrder == 1 && a->GetHyb() == 2 && b->GetHyb() == 2 && nbr_a &&
  ------------------
  |  Branch (934:9): [True: 2.10k, False: 64]
  |  Branch (934:27): [True: 655, False: 1.45k]
  |  Branch (934:47): [True: 260, False: 395]
  |  Branch (934:67): [True: 260, False: 0]
  ------------------
  935|    260|        nbr_b)
  ------------------
  |  Branch (935:9): [True: 260, False: 0]
  ------------------
  936|    260|      mol.SetTorsion(nbr_a, a, b, nbr_b, 45.0 * DEG_TO_RAD);
  ------------------
  |  |   35|    260|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  937|       |
  938|       |    // another special case is building dihedrals between two rings
  939|       |    //  twist it a little bit (e.g., Platinum 00J_2XIR_A)
  940|  2.17k|    if (bondOrder == 1 && ((nbr_a && nbr_a->IsInRing() && b->IsInRing()) ||
  ------------------
  |  Branch (940:9): [True: 2.10k, False: 64]
  |  Branch (940:29): [True: 2.08k, False: 28]
  |  Branch (940:38): [True: 1.95k, False: 127]
  |  Branch (940:59): [True: 471, False: 1.48k]
  ------------------
  941|  1.63k|                           (nbr_b && nbr_b->IsInRing() && a->IsInRing())))
  ------------------
  |  Branch (941:29): [True: 263, False: 1.37k]
  |  Branch (941:38): [True: 125, False: 138]
  |  Branch (941:59): [True: 21, False: 104]
  ------------------
  942|    492|      mol.SetTorsion(nbr_a, a, b, nbr_b, 60.0 * DEG_TO_RAD);
  ------------------
  |  |   35|    492|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  943|       |    // TODO - other inter-fragment dihedrals here
  944|       |
  945|  2.17k|    return true;
  946|  2.17k|  }
_ZN9OpenBabel9OBBuilder7ConnectERNS_5OBMolEiii:
  949|  1.74k|  {
  950|  1.74k|    vector3 newpos = GetCorrectedBondVector(mol.GetAtom(idxA), mol.GetAtom(idxB), bondOrder);
  951|  1.74k|    return Connect(mol, idxA, idxB, newpos, bondOrder);
  952|  1.74k|  }
_ZN9OpenBabel9OBBuilder14SwapWithVectorERNS_5OBMolEiiiRKNS_7vector3E:
  959|    288|  {
  960|    288|    OBAtom *a = mol.GetAtom(idxA);
  961|    288|    OBAtom *b = mol.GetAtom(idxB);
  962|    288|    OBAtom *c = mol.GetAtom(idxC);
  963|       |
  964|       |    // make sure the atoms exist
  965|    288|    if (a == nullptr || b == nullptr || c == nullptr)
  ------------------
  |  Branch (965:9): [True: 0, False: 288]
  |  Branch (965:25): [True: 0, False: 288]
  |  Branch (965:41): [True: 0, False: 288]
  ------------------
  966|      0|      return false;
  967|       |
  968|    288|    OBBond *bond1 = mol.GetBond(idxA, idxB);
  969|       |
  970|       |    // make sure a-b is connected
  971|    288|    if (bond1 == nullptr)
  ------------------
  |  Branch (971:9): [True: 0, False: 288]
  ------------------
  972|      0|      return false;
  973|       |
  974|       |    // make sure the bond are not in a ring
  975|    288|    if (bond1->IsInRing())
  ------------------
  |  Branch (975:9): [True: 0, False: 288]
  ------------------
  976|      0|      return false;
  977|       |
  978|       |    // save the original bond order
  979|    288|    int bondOrder1 = bond1->GetBondOrder();
  980|       |
  981|       |    // delete the bond
  982|    288|    mol.DeleteBond(bond1);
  983|       |
  984|       |    // Get the old bond vector
  985|    288|    vector3 bondB = b->GetVector() - a->GetVector();
  986|    288|    vector3 bondD =  newlocation   - c->GetVector();
  987|       |
  988|       |    // Get the new positions for B and D
  989|    288|    vector3 newB = c->GetVector() + bondB.length() * (bondD/bondD.length());
  990|    288|    vector3 newD = a->GetVector() + bondD.length() * (bondB/bondB.length());
  991|       |
  992|       |    // connect the fragments
  993|    288|    if (!Connect(mol, idxC, idxB, newB, bondOrder1))
  ------------------
  |  Branch (993:9): [True: 0, False: 288]
  ------------------
  994|      0|      return false;
  995|       |
  996|    288|    return true;
  997|    288|  }
_ZN9OpenBabel9OBBuilder4SwapERNS_5OBMolEiiii:
 1000|     69|  {
 1001|     69|    OBAtom *a = mol.GetAtom(idxA);
 1002|     69|    OBAtom *b = mol.GetAtom(idxB);
 1003|     69|    OBAtom *c = mol.GetAtom(idxC);
 1004|     69|    OBAtom *d = mol.GetAtom(idxD);
 1005|       |
 1006|       |    // make sure the atoms exist
 1007|     69|    if (a == nullptr || b == nullptr || c == nullptr || d == nullptr)
  ------------------
  |  Branch (1007:9): [True: 0, False: 69]
  |  Branch (1007:25): [True: 0, False: 69]
  |  Branch (1007:41): [True: 0, False: 69]
  |  Branch (1007:57): [True: 0, False: 69]
  ------------------
 1008|      0|      return false;
 1009|       |
 1010|     69|    OBBond *bond1 = mol.GetBond(idxA, idxB);
 1011|     69|    OBBond *bond2 = mol.GetBond(idxC, idxD);
 1012|       |
 1013|       |    // make sure a-b and c-d are connected
 1014|     69|    if (bond1 == nullptr || bond2 == nullptr)
  ------------------
  |  Branch (1014:9): [True: 0, False: 69]
  |  Branch (1014:29): [True: 0, False: 69]
  ------------------
 1015|      0|      return false;
 1016|       |
 1017|       |    // make sure the bonds are not in a ring
 1018|     69|    if (bond1->IsInRing() || bond2->IsInRing())
  ------------------
  |  Branch (1018:9): [True: 0, False: 69]
  |  Branch (1018:30): [True: 0, False: 69]
  ------------------
 1019|      0|      return false;
 1020|       |
 1021|       |    // save the original bond orders
 1022|     69|    int bondOrder1 = bond1->GetBondOrder();
 1023|     69|    int bondOrder2 = bond2->GetBondOrder();
 1024|       |
 1025|       |    // delete the bonds
 1026|     69|    mol.DeleteBond(bond1);
 1027|     69|    mol.DeleteBond(bond2);
 1028|       |
 1029|       |    // Get the bond vectors
 1030|     69|    vector3 bondB = b->GetVector() - a->GetVector();
 1031|     69|    vector3 bondD = d->GetVector() - c->GetVector();
 1032|       |
 1033|       |    // Get the new positions for B and D
 1034|     69|    vector3 newB = c->GetVector() + bondB.length() * (bondD/bondD.length());
 1035|     69|    vector3 newD = a->GetVector() + bondD.length() * (bondB/bondB.length());
 1036|       |
 1037|       |    // connect the fragments
 1038|     69|    if (!Connect(mol, idxA, idxD, newD, bondOrder2))
  ------------------
  |  Branch (1038:9): [True: 0, False: 69]
  ------------------
 1039|      0|      return false;
 1040|     69|    if (!Connect(mol, idxC, idxB, newB, bondOrder1))
  ------------------
  |  Branch (1040:9): [True: 0, False: 69]
  ------------------
 1041|      0|      return false;
 1042|       |
 1043|     69|    return true;
 1044|     69|  }
_ZN9OpenBabel9OBBuilder7AddNbrsERNS_8OBBitVecEPNS_6OBAtomE:
 1048|   489k|  {
 1049|  1.02M|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   489k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.02M, False: 489k]
  |  |  ------------------
  ------------------
 1050|  1.02M|      if (!fragment.BitIsSet(nbr->GetIdx())) {
  ------------------
  |  Branch (1050:11): [True: 485k, False: 537k]
  ------------------
 1051|   485k|        fragment.SetBitOn(nbr->GetIdx());
 1052|   485k|        AddNbrs(fragment, &*nbr);
 1053|   485k|      }
 1054|  1.02M|    }
 1055|   489k|  }
_ZN9OpenBabel9OBBuilder11GetFragmentEPNS_6OBAtomE:
 1058|  4.36k|  {
 1059|  4.36k|    OBBitVec fragment;
 1060|       |
 1061|  4.36k|    fragment.SetBitOn(atom->GetIdx());
 1062|  4.36k|    AddNbrs(fragment, atom);
 1063|       |
 1064|  4.36k|    return fragment;
 1065|  4.36k|  }
_ZN9OpenBabel9OBBuilder5BuildERNS_5OBMolEb:
 1079|  8.44k|  {
 1080|  8.44k|    OBBitVec vdone; // Atoms that are done, need no further manipulation.
 1081|  8.44k|    OBBitVec vfrag; // Atoms that are part of a fragment found in the database.
 1082|       |                    // These atoms have coordinates, but the fragment still has
 1083|       |                    // to be rotated and translated.
 1084|  8.44k|    vector3 molvec, moldir;
 1085|  8.44k|    vector<vector<int> >::iterator j;
 1086|  8.44k|    vector<int>::iterator k, k2;
 1087|  8.44k|    vector<vector3>::iterator l;
 1088|  8.44k|    vector<vector<int> > mlist; // match list for fragments
 1089|       |
 1090|  8.44k|    OBConversion conv;
 1091|  8.44k|    conv.SetOutFormat("can"); // Canonical SMILES
 1092|       |
 1093|       |    // Trigger hybridisation perception now so it will be copied to workMol
 1094|  8.44k|    if (mol.NumAtoms() == 0)
  ------------------
  |  Branch (1094:9): [True: 42, False: 8.40k]
  ------------------
 1095|     42|      return true;
 1096|  8.40k|    mol.GetAtom(1)->GetHyb();
 1097|       |
 1098|       |    // copy the molecule to private data
 1099|  8.40k|    OBMol workMol = mol;
 1100|       |
 1101|       |    // Treat a 2D structure like a 0D one
 1102|  8.40k|    if (workMol.GetDimension() == 2)
  ------------------
  |  Branch (1102:9): [True: 357, False: 8.04k]
  ------------------
 1103|    357|      workMol.SetDimension(0);
 1104|       |
 1105|       |
 1106|       |    // Delete all bonds in the working molecule
 1107|       |    // (we will add them back at the end)
 1108|   724k|    while (workMol.NumBonds())
  ------------------
  |  Branch (1108:12): [True: 716k, False: 8.40k]
  ------------------
 1109|   716k|      workMol.DeleteBond(workMol.GetBond(0));
 1110|       |
 1111|       |    // Deleting the bonds unsets HybridizationPerceived. To prevent our
 1112|       |    // perceived values being reperceived (incorrectly), we must set
 1113|       |    // this flag again.
 1114|  8.40k|    workMol.SetHybridizationPerceived();
 1115|       |
 1116|       |
 1117|       |    // I think just deleting rotable bond and separate is enough,
 1118|       |    // but it did not work.
 1119|       |
 1120|       |    // Get fragments using CopySubstructure
 1121|       |    // Copy all atoms
 1122|  8.40k|    OBBitVec atomsToCopy;
 1123|   804k|    FOR_ATOMS_OF_MOL(atom, mol) {
  ------------------
  |  |  417|  8.40k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 804k, False: 8.40k]
  |  |  ------------------
  ------------------
 1124|   804k|      atomsToCopy.SetBitOn(atom->GetIdx());
 1125|   804k|    }
 1126|       |
 1127|       |    // Exclude rotatable bonds
 1128|  8.40k|    OBBitVec bondsToExclude;
 1129|   716k|    FOR_BONDS_OF_MOL(bond, mol) {
  ------------------
  |  |  418|  8.40k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 716k, False: 8.40k]
  |  |  ------------------
  ------------------
 1130|   716k|      if (bond->IsRotor()) {
  ------------------
  |  Branch (1130:11): [True: 101k, False: 614k]
  ------------------
 1131|   101k|        bondsToExclude.SetBitOn(bond->GetIdx());
 1132|   101k|      }
 1133|   716k|    }
 1134|       |
 1135|       |    // Generate fragments by copy
 1136|  8.40k|    OBMol mol_copy;
 1137|  8.40k|    mol.CopySubstructure(mol_copy, &atomsToCopy, &bondsToExclude);
 1138|       |
 1139|       |    // Separate each disconnected fragments as different molecules
 1140|  8.40k|    vector<OBMol> fragments = mol_copy.Separate();
 1141|       |
 1142|       |    // datafile is read only on first use of Build()
 1143|  8.40k|    if(_rigid_fragments.empty())
  ------------------
  |  Branch (1143:8): [True: 8.40k, False: 0]
  ------------------
 1144|  8.40k|      LoadFragments();
 1145|       |
 1146|       |
 1147|   251k|    for(vector<OBMol>::iterator f = fragments.begin(); f != fragments.end(); ++f) {
  ------------------
  |  Branch (1147:56): [True: 242k, False: 8.40k]
  ------------------
 1148|   242k|      std::string fragment_smiles = conv.WriteString(&*f, true);
 1149|   242k|      bool isMatchRigid = false;
 1150|       |      // if rigid fragment is in database
 1151|   242k|      if (_rigid_fragments_index.count(fragment_smiles) > 0) {
  ------------------
  |  Branch (1151:11): [True: 0, False: 242k]
  ------------------
 1152|      0|        OBSmartsPattern sp;
 1153|      0|        if (!sp.Init(fragment_smiles)) {
  ------------------
  |  Branch (1153:13): [True: 0, False: 0]
  ------------------
 1154|      0|          obErrorLog.ThrowError(__FUNCTION__, " Could not parse SMARTS from fragment", obInfo);
 1155|      0|        } else if (sp.Match(mol)) { // for all matches
  ------------------
  |  Branch (1155:20): [True: 0, False: 0]
  ------------------
 1156|      0|          isMatchRigid = true;
 1157|      0|          mlist = sp.GetUMapList();
 1158|      0|          for (j = mlist.begin(); j != mlist.end(); ++j) {
  ------------------
  |  Branch (1158:35): [True: 0, False: 0]
  ------------------
 1159|       |            // Have any atoms of this match already been added?
 1160|      0|            bool alreadydone = false;
 1161|      0|            for (k = j->begin(); k != j->end(); ++k)
  ------------------
  |  Branch (1161:34): [True: 0, False: 0]
  ------------------
 1162|      0|              if (vfrag.BitIsSet(*k)) {
  ------------------
  |  Branch (1162:19): [True: 0, False: 0]
  ------------------
 1163|      0|                alreadydone = true;
 1164|      0|                break;
 1165|      0|              }
 1166|      0|            if (alreadydone) continue;
  ------------------
  |  Branch (1166:17): [True: 0, False: 0]
  ------------------
 1167|       |
 1168|      0|            for (k = j->begin(); k != j->end(); ++k)
  ------------------
  |  Branch (1168:34): [True: 0, False: 0]
  ------------------
 1169|      0|              vfrag.SetBitOn(*k); // Set vfrag for all atoms of fragment
 1170|       |
 1171|      0|            int counter;
 1172|      0|            std::vector<vector3> coords = GetFragmentCoord(fragment_smiles);
 1173|      0|            for (k = j->begin(), counter=0; k != j->end(); ++k, ++counter) { // for all atoms of the fragment
  ------------------
  |  Branch (1173:45): [True: 0, False: 0]
  ------------------
 1174|       |              // set coordinates for atoms
 1175|      0|              OBAtom *atom = workMol.GetAtom(*k);
 1176|      0|              atom->SetVector(coords[counter]);
 1177|      0|            }
 1178|       |
 1179|       |            // add the bonds for the fragment
 1180|      0|            for (k = j->begin(); k != j->end(); ++k) {
  ------------------
  |  Branch (1180:34): [True: 0, False: 0]
  ------------------
 1181|      0|              OBAtom *atom1 = mol.GetAtom(*k);
 1182|      0|              for (k2 = j->begin(); k2 != j->end(); ++k2) {
  ------------------
  |  Branch (1182:37): [True: 0, False: 0]
  ------------------
 1183|      0|                OBAtom *atom2 = mol.GetAtom(*k2);
 1184|      0|                OBBond *bond = atom1->GetBond(atom2);
 1185|      0|                if (bond != nullptr) {
  ------------------
  |  Branch (1185:21): [True: 0, False: 0]
  ------------------
 1186|      0|                  workMol.AddBond(*bond);
 1187|      0|                }
 1188|      0|              }
 1189|      0|            }
 1190|      0|          }
 1191|      0|        }
 1192|      0|      }
 1193|   242k|      if(!isMatchRigid) {    // if rigid fragment is not in database
  ------------------
  |  Branch (1193:10): [True: 242k, False: 0]
  ------------------
 1194|       |        // Count the number of ring atoms.
 1195|   242k|        unsigned int ratoms = 0;
 1196|   216M|        FOR_ATOMS_OF_MOL(a, mol) {
  ------------------
  |  |  417|   242k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 216M, False: 242k]
  |  |  ------------------
  ------------------
 1197|   216M|          if (a->IsInRing()) {
  ------------------
  |  Branch (1197:15): [True: 22.3M, False: 193M]
  ------------------
 1198|  22.3M|            ratoms++;
 1199|  22.3M|          }
 1200|   216M|        }
 1201|   242k|        if (ratoms < 3) continue; // Smallest ring fragment has 3 atoms
  ------------------
  |  Branch (1201:13): [True: 75.4k, False: 167k]
  ------------------
 1202|       |
 1203|   167k|        vector<pair<OBSmartsPattern*, vector<vector3 > > >::iterator i;
 1204|       |        // Skip all fragments that are too big to match
 1205|       |        // Note: It would be faster to compare to the size of the largest
 1206|       |        //       isolated ring system instead of comparing to ratoms
 1207|   167k|        for (i = _ring_fragments.begin(); i != _ring_fragments.end() && i->first->NumAtoms() > ratoms; ++i);
  ------------------
  |  Branch (1207:43): [True: 0, False: 167k]
  |  Branch (1207:43): [True: 0, False: 167k]
  |  Branch (1207:73): [True: 0, False: 0]
  ------------------
 1208|       |
 1209|       |        // Loop through the remaining fragments and assign the coordinates from
 1210|       |        // the first (most complex) fragment.
 1211|       |        // Stop if there are no unassigned ring atoms (ratoms).
 1212|   167k|        for (; i != _ring_fragments.end() && ratoms; ++i) {
  ------------------
  |  Branch (1212:16): [True: 0, False: 167k]
  |  Branch (1212:16): [True: 0, False: 167k]
  |  Branch (1212:46): [True: 0, False: 0]
  ------------------
 1213|      0|          if (i->first != nullptr && i->first->Match(*f)) { // if match to fragment
  ------------------
  |  Branch (1213:15): [True: 0, False: 0]
  |  Branch (1213:38): [True: 0, False: 0]
  ------------------
 1214|      0|            i->first->Match(mol);                        // match over mol
 1215|      0|            mlist = i->first->GetUMapList();
 1216|      0|            for (j = mlist.begin();j != mlist.end();++j) { // for all matches
  ------------------
  |  Branch (1216:36): [True: 0, False: 0]
  ------------------
 1217|       |              // Have any atoms of this match already been added?
 1218|      0|              bool alreadydone = false;
 1219|      0|              for (k = j->begin(); k != j->end(); ++k) { // for all atoms of the fragment
  ------------------
  |  Branch (1219:36): [True: 0, False: 0]
  ------------------
 1220|      0|                if (vfrag.BitIsSet(*k)) {
  ------------------
  |  Branch (1220:21): [True: 0, False: 0]
  ------------------
 1221|      0|                  alreadydone = true;
 1222|      0|                  break;
 1223|      0|                }
 1224|      0|              }
 1225|      0|              if (alreadydone) continue;
  ------------------
  |  Branch (1225:19): [True: 0, False: 0]
  ------------------
 1226|      0|              for (k = j->begin(); k != j->end(); ++k)
  ------------------
  |  Branch (1226:36): [True: 0, False: 0]
  ------------------
 1227|      0|                vfrag.SetBitOn(*k); // Set vfrag for all atoms of fragment
 1228|       |
 1229|      0|              int counter;
 1230|      0|              for (k = j->begin(), counter=0; k != j->end(); ++k, ++counter) { // for all atoms of the fragment
  ------------------
  |  Branch (1230:47): [True: 0, False: 0]
  ------------------
 1231|       |                // set coordinates for atoms
 1232|      0|                OBAtom *atom = workMol.GetAtom(*k);
 1233|      0|                atom->SetVector(i->second[counter]);
 1234|      0|              }
 1235|       |              // add the bonds for the fragment
 1236|      0|              for (k = j->begin(); k != j->end(); ++k) {
  ------------------
  |  Branch (1236:36): [True: 0, False: 0]
  ------------------
 1237|      0|                OBAtom *atom1 = mol.GetAtom(*k);
 1238|      0|                for (k2 = j->begin(); k2 != j->end(); ++k2) {
  ------------------
  |  Branch (1238:39): [True: 0, False: 0]
  ------------------
 1239|      0|                  OBAtom *atom2 = mol.GetAtom(*k2);
 1240|      0|                  OBBond *bond = atom1->GetBond(atom2);
 1241|      0|                  if (bond != nullptr)
  ------------------
  |  Branch (1241:23): [True: 0, False: 0]
  ------------------
 1242|      0|                    workMol.AddBond(*bond);
 1243|      0|                }
 1244|      0|              }
 1245|      0|            }
 1246|      0|          }
 1247|      0|        }
 1248|   167k|      }
 1249|   242k|    } // for all fragments
 1250|       |
 1251|       |    // iterate over all atoms to place them in 3D space
 1252|   804k|    FOR_DFS_OF_MOL (a, mol) {
  ------------------
  |  |  423|   812k|#define FOR_DFS_OF_MOL(a,m)       for( OpenBabel::OBMolAtomDFSIter  a(m); a; ++a )
  |  |  ------------------
  |  |  |  Branch (423:75): [True: 804k, False: 8.40k]
  |  |  ------------------
  ------------------
 1253|   804k|      if (vdone.BitIsSet(a->GetIdx())) // continue if the atom is already added
  ------------------
  |  Branch (1253:11): [True: 0, False: 804k]
  ------------------
 1254|      0|        continue;
 1255|       |
 1256|       |      // find an atom connected to the current atom that is already added
 1257|   804k|      OBAtom *prev = nullptr;
 1258|  1.43M|      FOR_NBORS_OF_ATOM (nbr, &*a) {
  ------------------
  |  |  419|   804k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.43M, False: 804k]
  |  |  ------------------
  ------------------
 1259|  1.43M|        if (vdone.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (1259:13): [True: 716k, False: 716k]
  ------------------
 1260|   716k|          prev = &*nbr;
 1261|  1.43M|      }
 1262|       |
 1263|   804k|      if (vfrag.BitIsSet(a->GetIdx())) { // Is this atom part of a fragment?
  ------------------
  |  Branch (1263:11): [True: 0, False: 804k]
  ------------------
 1264|      0|        if (prev != nullptr) { // if we have a previous atom, translate/rotate the fragment and connect it
  ------------------
  |  Branch (1264:13): [True: 0, False: 0]
  ------------------
 1265|      0|          Connect(workMol, prev->GetIdx(), a->GetIdx(), mol.GetBond(prev, &*a)->GetBondOrder());
 1266|       |          // set the correct bond order
 1267|      0|          int bondOrder = mol.GetBond(prev->GetIdx(), a->GetIdx())->GetBondOrder();
 1268|      0|          workMol.GetBond(prev->GetIdx(), a->GetIdx())->SetBondOrder(bondOrder);
 1269|      0|        }
 1270|       |
 1271|      0|        OBBitVec fragment = GetFragment(workMol.GetAtom(a->GetIdx()));
 1272|      0|        vdone |= fragment; // mark this fragment as done
 1273|       |
 1274|      0|        continue;
 1275|      0|      }
 1276|       |
 1277|       |      //
 1278|       |      // below is the code to add non-fragment atoms
 1279|       |      //
 1280|       |
 1281|       |      // get the position for the new atom, this is done with GetNewBondVector
 1282|   804k|      if (prev != nullptr) {
  ------------------
  |  Branch (1282:11): [True: 662k, False: 141k]
  ------------------
 1283|   662k|        int bondType = a->GetBond(prev)->GetBondOrder();
 1284|   662k|        if (a->GetBond(prev)->IsAromatic())
  ------------------
  |  Branch (1284:13): [True: 610, False: 661k]
  ------------------
 1285|    610|          bondType = -1;
 1286|       |
 1287|   662k|        molvec = GetCorrectedBondVector(workMol.GetAtom(prev->GetIdx()),
 1288|   662k|                                        workMol.GetAtom(a->GetIdx()),
 1289|   662k|                                        bondType);
 1290|   662k|        moldir = molvec - workMol.GetAtom(prev->GetIdx())->GetVector();
 1291|   662k|      } else {
 1292|       |        // We don't want to plant all base atoms at exactly the same spot.
 1293|       |        // (or in exactly the same direction)
 1294|       |        // So we'll add a slight tweak -- fixes problem reported by Kasper Thofte
 1295|   141k|        vector3 randomOffset;
 1296|   141k|        randomOffset.randomUnitVector();
 1297|   141k|        molvec = VX + 0.1 * randomOffset;
 1298|   141k|        moldir = VX + 0.01 * randomOffset;
 1299|   141k|      }
 1300|       |
 1301|   804k|      vdone.SetBitOn(a->GetIdx());
 1302|       |
 1303|       |      // place the atom
 1304|   804k|      OBAtom *atom = workMol.GetAtom(a->GetIdx());
 1305|   804k|      atom->SetVector(molvec);
 1306|       |
 1307|       |      // add bond between previous part and added atom
 1308|   804k|      if (prev != nullptr) {
  ------------------
  |  Branch (1308:11): [True: 662k, False: 141k]
  ------------------
 1309|   662k|        OBBond *bond = a->GetBond(prev); // from mol
 1310|   662k|        workMol.AddBond(*bond);
 1311|   662k|      }
 1312|       |
 1313|   804k|    }
 1314|       |
 1315|       |    // Crown post-pass: rings not covered by a fragment template were placed
 1316|       |    // as a linear chain by the DFS loop above, which leaves a stretched
 1317|       |    // closure bond when bonds are restored below. Fold each such ring into a
 1318|       |    // crown/chair by setting torsions along its path. The DFS adds only
 1319|       |    // spanning-tree bonds, so exactly one ring-path bond (the back-edge) is
 1320|       |    // missing in workMol; rotating the path so that bond is last keeps the
 1321|       |    // SetTorsion FindChildren walk from crossing back to the start atom.
 1322|  8.40k|    if (!mol.HasSSSRPerceived())
  ------------------
  |  Branch (1322:9): [True: 296, False: 8.10k]
  ------------------
 1323|    296|      mol.FindSSSR();
 1324|  8.40k|    vector<OBRing*> rlist = mol.GetSSSR();
 1325|       |    // SSSR uses OB_RTREE_CUTOFF=20, so rings with more than ~40 atoms
 1326|       |    // (macrocyclic peptides, large cycloalkanes, supramolecular cages)
 1327|       |    // are silently dropped. For any back-edge in workMol that isn't
 1328|       |    // already covered by an SSSR ring, trace the unique fundamental
 1329|       |    // cycle through workMol's spanning tree and add it. The traced
 1330|       |    // rings are owned by `extraRings` so SSSR memory is not touched.
 1331|  8.40k|    std::vector<std::unique_ptr<OpenBabel::OBRing>> extraRings;
 1332|  8.40k|    {
 1333|  8.40k|      std::vector<std::pair<int,int>> backEdges;
 1334|   716k|      FOR_BONDS_OF_MOL(b, mol) {
  ------------------
  |  |  418|  8.40k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 716k, False: 8.40k]
  |  |  ------------------
  ------------------
 1335|   716k|        int u = b->GetBeginAtomIdx();
 1336|   716k|        int v = b->GetEndAtomIdx();
 1337|   716k|        if (!workMol.GetBond(u, v))
  ------------------
  |  Branch (1337:13): [True: 54.0k, False: 662k]
  ------------------
 1338|  54.0k|          backEdges.emplace_back(u, v);
 1339|   716k|      }
 1340|  8.40k|      auto coveredBySSSR = [&](int u, int v) {
 1341|  8.40k|        for (OBRing *r : rlist) {
 1342|  8.40k|          if (r->IsInRing(u) && r->IsInRing(v))
 1343|  8.40k|            return true;
 1344|  8.40k|        }
 1345|  8.40k|        return false;
 1346|  8.40k|      };
 1347|  8.40k|      std::vector<int> parent(workMol.NumAtoms() + 1, 0);
 1348|  8.40k|      std::vector<bool> seen(workMol.NumAtoms() + 1, false);
 1349|  8.40k|      std::deque<int> q;
 1350|  54.0k|      for (auto &be : backEdges) {
  ------------------
  |  Branch (1350:21): [True: 54.0k, False: 8.40k]
  ------------------
 1351|  54.0k|        if (coveredBySSSR(be.first, be.second))
  ------------------
  |  Branch (1351:13): [True: 53.6k, False: 389]
  ------------------
 1352|  53.6k|          continue;
 1353|    389|        std::fill(parent.begin(), parent.end(), 0);
 1354|    389|        std::fill(seen.begin(), seen.end(), false);
 1355|    389|        q.clear();
 1356|    389|        q.push_back(be.first);
 1357|    389|        seen[be.first] = true;
 1358|   120k|        while (!q.empty()) {
  ------------------
  |  Branch (1358:16): [True: 120k, False: 0]
  ------------------
 1359|   120k|          int u = q.front(); q.pop_front();
 1360|   120k|          if (u == be.second) break;
  ------------------
  |  Branch (1360:15): [True: 389, False: 120k]
  ------------------
 1361|   120k|          OBAtom *atom = workMol.GetAtom(u);
 1362|   241k|          FOR_NBORS_OF_ATOM (n, atom) {
  ------------------
  |  |  419|   120k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 241k, False: 120k]
  |  |  ------------------
  ------------------
 1363|   241k|            int w = n->GetIdx();
 1364|   241k|            if (!seen[w]) {
  ------------------
  |  Branch (1364:17): [True: 121k, False: 119k]
  ------------------
 1365|   121k|              seen[w] = true;
 1366|   121k|              parent[w] = u;
 1367|   121k|              q.push_back(w);
 1368|   121k|            }
 1369|   241k|          }
 1370|   120k|        }
 1371|    389|        if (!seen[be.second])
  ------------------
  |  Branch (1371:13): [True: 0, False: 389]
  ------------------
 1372|      0|          continue;
 1373|    389|        std::vector<int> path;
 1374|  54.3k|        for (int cur = be.second; cur != be.first; cur = parent[cur])
  ------------------
  |  Branch (1374:35): [True: 54.0k, False: 389]
  ------------------
 1375|  54.0k|          path.push_back(cur);
 1376|    389|        path.push_back(be.first);
 1377|    389|        std::unique_ptr<OpenBabel::OBRing> ring(
 1378|    389|            new OpenBabel::OBRing(path, mol.NumAtoms() + 1));
 1379|    389|        ring->SetParent(&mol);
 1380|    389|        rlist.push_back(ring.get());
 1381|    389|        extraRings.push_back(std::move(ring));
 1382|    389|      }
 1383|  8.40k|    }
 1384|  8.40k|    if (!rlist.empty()) {
  ------------------
  |  Branch (1384:9): [True: 3.42k, False: 4.98k]
  ------------------
 1385|       |      // Group rings into fused systems (sharing at least one bond, i.e. two
 1386|       |      // or more atoms). Spiro rings share a single atom and must stay in
 1387|       |      // separate systems so each gets its own crown pass below.
 1388|  3.42k|      vector<int> ringSystem(rlist.size(), -1);
 1389|  3.42k|      int nsystems = 0;
 1390|  57.6k|      for (size_t i = 0; i < rlist.size(); ++i) {
  ------------------
  |  Branch (1390:26): [True: 54.2k, False: 3.42k]
  ------------------
 1391|  54.2k|        if (ringSystem[i] != -1) continue;
  ------------------
  |  Branch (1391:13): [True: 36.4k, False: 17.7k]
  ------------------
 1392|  17.7k|        ringSystem[i] = nsystems;
 1393|  17.7k|        vector<size_t> queue;
 1394|  17.7k|        queue.push_back(i);
 1395|  72.0k|        while (!queue.empty()) {
  ------------------
  |  Branch (1395:16): [True: 54.2k, False: 17.7k]
  ------------------
 1396|  54.2k|          size_t r = queue.back();
 1397|  54.2k|          queue.pop_back();
 1398|  2.95M|          for (size_t s = 0; s < rlist.size(); ++s) {
  ------------------
  |  Branch (1398:30): [True: 2.90M, False: 54.2k]
  ------------------
 1399|  2.90M|            if (ringSystem[s] != -1) continue;
  ------------------
  |  Branch (1399:17): [True: 1.73M, False: 1.16M]
  ------------------
 1400|  1.16M|            OBBitVec common = rlist[r]->_pathset & rlist[s]->_pathset;
 1401|  1.16M|            if (common.CountBits() >= 2) {
  ------------------
  |  Branch (1401:17): [True: 36.4k, False: 1.12M]
  ------------------
 1402|  36.4k|              ringSystem[s] = nsystems;
 1403|  36.4k|              queue.push_back(s);
 1404|  36.4k|            }
 1405|  1.16M|          }
 1406|  54.2k|        }
 1407|  17.7k|        ++nsystems;
 1408|  17.7k|      }
 1409|       |
 1410|  21.2k|      for (int sys = 0; sys < nsystems; ++sys) {
  ------------------
  |  Branch (1410:25): [True: 17.7k, False: 3.42k]
  ------------------
 1411|       |        // Skip if any atom in the system was already placed by a fragment.
 1412|  17.7k|        bool covered = false;
 1413|  17.7k|        vector<size_t> members;
 1414|   886k|        for (size_t i = 0; i < rlist.size() && !covered; ++i) {
  ------------------
  |  Branch (1414:28): [True: 868k, False: 17.7k]
  |  Branch (1414:48): [True: 868k, False: 0]
  ------------------
 1415|   868k|          if (ringSystem[i] != sys) continue;
  ------------------
  |  Branch (1415:15): [True: 814k, False: 54.2k]
  ------------------
 1416|  54.2k|          members.push_back(i);
 1417|   340k|          for (int idx : rlist[i]->_path) {
  ------------------
  |  Branch (1417:24): [True: 340k, False: 54.2k]
  ------------------
 1418|   340k|            if (vfrag.BitIsSet(idx)) {
  ------------------
  |  Branch (1418:17): [True: 0, False: 340k]
  ------------------
 1419|      0|              covered = true;
 1420|      0|              break;
 1421|      0|            }
 1422|   340k|          }
 1423|  54.2k|        }
 1424|  17.7k|        if (covered) continue;
  ------------------
  |  Branch (1424:13): [True: 0, False: 17.7k]
  ------------------
 1425|       |
 1426|       |        // Order candidates largest-first so we crown the dominant ring.
 1427|  17.7k|        std::sort(members.begin(), members.end(),
 1428|  17.7k|                  [&rlist](size_t a, size_t b) {
 1429|  17.7k|                    return rlist[a]->_path.size() > rlist[b]->_path.size();
 1430|  17.7k|                  });
 1431|       |
 1432|  42.9k|        for (size_t idx : members) {
  ------------------
  |  Branch (1432:25): [True: 42.9k, False: 8.10k]
  ------------------
 1433|  42.9k|          OBRing *ring = rlist[idx];
 1434|  42.9k|          const vector<int> &path = ring->_path;
 1435|  42.9k|          int n = static_cast<int>(path.size());
 1436|  42.9k|          if (n <= 3) continue;
  ------------------
  |  Branch (1436:15): [True: 25.4k, False: 17.5k]
  ------------------
 1437|       |
 1438|       |          // Locate the back-edge (the unique missing path bond in workMol).
 1439|  17.5k|          int backEdge = -1;
 1440|  17.5k|          int missing = 0;
 1441|   180k|          for (int i = 0; i < n; ++i) {
  ------------------
  |  Branch (1441:27): [True: 170k, False: 9.69k]
  ------------------
 1442|   170k|            int j = (i + 1) % n;
 1443|   170k|            if (workMol.GetBond(path[i], path[j]) == nullptr) {
  ------------------
  |  Branch (1443:17): [True: 25.3k, False: 144k]
  ------------------
 1444|  25.3k|              backEdge = i;
 1445|  25.3k|              if (++missing > 1) break;
  ------------------
  |  Branch (1445:19): [True: 7.82k, False: 17.5k]
  ------------------
 1446|  25.3k|            }
 1447|   170k|          }
 1448|       |          // If the ring isn't a clean spanning-tree path (e.g. two back-edges
 1449|       |          // landed in this ring of a fused system), try the next candidate.
 1450|  17.5k|          if (missing != 1) continue;
  ------------------
  |  Branch (1450:15): [True: 7.82k, False: 9.69k]
  ------------------
 1451|       |
 1452|       |          // Rotate path so the missing bond sits between [n-1] and [0].
 1453|  9.69k|          vector<int> walk(n);
 1454|   156k|          for (int i = 0; i < n; ++i)
  ------------------
  |  Branch (1454:27): [True: 147k, False: 9.69k]
  ------------------
 1455|   147k|            walk[i] = path[(backEdge + 1 + i) % n];
 1456|       |
 1457|       |          // Aromatic or all-sp2 rings prefer planar geometry; otherwise
 1458|       |          // 180 - 720/n gives the ideal chair (n=6 -> 60) or crown.
 1459|  9.69k|          bool planar = ring->IsAromatic();
 1460|  9.69k|          if (!planar) {
  ------------------
  |  Branch (1460:15): [True: 9.58k, False: 109]
  ------------------
 1461|  9.58k|            planar = true;
 1462|  28.9k|            for (int v : walk) {
  ------------------
  |  Branch (1462:24): [True: 28.9k, False: 820]
  ------------------
 1463|  28.9k|              if (workMol.GetAtom(v)->GetHyb() != 2) {
  ------------------
  |  Branch (1463:19): [True: 8.76k, False: 20.1k]
  ------------------
 1464|  8.76k|                planar = false;
 1465|  8.76k|                break;
 1466|  8.76k|              }
 1467|  28.9k|            }
 1468|  9.58k|          }
 1469|       |          // Crown's 180 - 720/n asymptotes to anti for n > 24, so
 1470|       |          // beyond that we hand off to Dale's diamond-lattice
 1471|       |          // torsion sequence instead.
 1472|  9.69k|          std::vector<double> daleTors;
 1473|  9.69k|          double crownTorsion = 0.0;
 1474|  9.69k|          if (!planar && n <= 24) {
  ------------------
  |  Branch (1474:15): [True: 8.76k, False: 929]
  |  Branch (1474:26): [True: 7.75k, False: 1.01k]
  ------------------
 1475|  7.75k|            crownTorsion = DEG_TO_RAD * (180.0 - 720.0 / double(n));
  ------------------
  |  |   35|  7.75k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
 1476|  7.75k|          } else if (!planar) {
  ------------------
  |  Branch (1476:22): [True: 1.01k, False: 929]
  ------------------
 1477|  1.01k|            daleTors = OBDaleTorsions(n);
 1478|  1.01k|            if (daleTors.empty())
  ------------------
  |  Branch (1478:17): [True: 0, False: 1.01k]
  ------------------
 1479|      0|              continue;
 1480|  1.01k|          }
 1481|       |
 1482|  9.69k|          double sign = 1.0;
 1483|   127k|          for (int i = 3; i < n; ++i) {
  ------------------
  |  Branch (1483:27): [True: 118k, False: 9.69k]
  ------------------
 1484|   118k|            double phi;
 1485|   118k|            if (!daleTors.empty()) {
  ------------------
  |  Branch (1485:17): [True: 62.3k, False: 55.6k]
  ------------------
 1486|  62.3k|              phi = daleTors[i - 2];
 1487|  62.3k|            } else {
 1488|  55.6k|              phi = sign * crownTorsion;
 1489|  55.6k|              sign = -sign;
 1490|  55.6k|            }
 1491|   118k|            workMol.SetTorsion(workMol.GetAtom(walk[i - 3]),
 1492|   118k|                               workMol.GetAtom(walk[i - 2]),
 1493|   118k|                               workMol.GetAtom(walk[i - 1]),
 1494|   118k|                               workMol.GetAtom(walk[i]),
 1495|   118k|                               phi);
 1496|   118k|          }
 1497|  9.69k|          break; // one ring per system
 1498|  9.69k|        }
 1499|  17.7k|      }
 1500|  3.42k|    }
 1501|       |
 1502|       |    // Make sure we keep the bond indexes the same
 1503|       |    // so we'll delete the bonds again and copy them
 1504|       |    // Fixes PR#3448379 (and likely other topology issues)
 1505|   670k|    while (workMol.NumBonds())
  ------------------
  |  Branch (1505:12): [True: 662k, False: 8.40k]
  ------------------
 1506|   662k|      workMol.DeleteBond(workMol.GetBond(0));
 1507|       |
 1508|  8.40k|    int beginIdx, endIdx;
 1509|   716k|    FOR_BONDS_OF_MOL(b, mol) {
  ------------------
  |  |  418|  8.40k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 716k, False: 8.40k]
  |  |  ------------------
  ------------------
 1510|   716k|      beginIdx = b->GetBeginAtomIdx();
 1511|   716k|      endIdx = b->GetEndAtomIdx();
 1512|   716k|      workMol.AddBond(beginIdx, endIdx, b->GetBondOrder(), b->GetFlags());
 1513|   716k|    }
 1514|       |
 1515|       |    /*
 1516|       |    FOR_BONDS_OF_MOL(bond, mol) {
 1517|       |      if(bond->IsRotor()) {
 1518|       |        OBBitVec atomsToCopy;
 1519|       |        OBAtom *atom = bond->GetBeginAtom();
 1520|       |        FOR_NBORS_OF_ATOM(a, &*atom) {
 1521|       |          atomsToCopy.SetBitOn(a->GetIdx());
 1522|       |        }
 1523|       |        atom = bond->GetEndAtom();
 1524|       |        FOR_NBORS_OF_ATOM(a, &*atom) {
 1525|       |          atomsToCopy.SetBitOn(a->GetIdx());
 1526|       |        }
 1527|       |        OBMol mol_copy;
 1528|       |        mol.CopySubstructure(mol_copy, &atomsToCopy);
 1529|       |        string smiles = conv.WriteString(&mol_copy, true);
 1530|       |
 1531|       |        if(_torsion.count(smiles) > 0) {
 1532|       |          OBAtom* b = bond->GetBeginAtom();
 1533|       |          OBAtom* c = bond->GetEndAtom();
 1534|       |          OBAtom* a = nullptr;
 1535|       |          FOR_NBORS_OF_ATOM(t, &*b) {
 1536|       |            a = &*t;
 1537|       |            if(a != c)
 1538|       |              break;
 1539|       |          }
 1540|       |          OBAtom* d = nullptr;
 1541|       |          FOR_NBORS_OF_ATOM(t, &*c) {
 1542|       |            d = &*t;
 1543|       |            if(d != b)
 1544|       |              break;
 1545|       |          }
 1546|       |          double angle = _torsion[smiles] * DEG_TO_RAD;
 1547|       |          mol.SetTorsion(a, b, c, d, angle);
 1548|       |        } else {
 1549|       |          ; // Do something
 1550|       |        }
 1551|       |      }
 1552|       |    }
 1553|       |    */
 1554|       |
 1555|       |    // We may have to change these success check
 1556|       |    // correct the chirality
 1557|  8.40k|    bool success = CorrectStereoBonds(workMol);
 1558|       |    // we only succeed if we corrected all stereochemistry
 1559|  8.40k|    success = success && CorrectStereoAtoms(workMol, stereoWarnings);
  ------------------
  |  Branch (1559:15): [True: 8.40k, False: 0]
  |  Branch (1559:26): [True: 8.33k, False: 68]
  ------------------
 1560|       |
 1561|       |    /*
 1562|       |    // if the stereo failed, we should use distance geometry instead
 1563|       |    OBDistanceGeometry dg;
 1564|       |    dg.Setup(workMol);
 1565|       |    dg.GetGeometry(workMol); // ensured to have correct stereo
 1566|       |    */
 1567|       |
 1568|  8.40k|    mol = workMol;
 1569|  8.40k|    mol.SetChiralityPerceived();
 1570|  8.40k|    mol.SetDimension(3);
 1571|       |
 1572|  8.40k|    bool isNanExist = false;
 1573|   749k|    FOR_ATOMS_OF_MOL(a, mol) {
  ------------------
  |  |  417|  8.40k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 749k, False: 7.94k]
  |  |  ------------------
  ------------------
 1574|   749k|      vector3 v = a->GetVector();
 1575|   749k|      if(IsNan(v.x()) || IsNan(v.y()) || IsNan(v.z())) {
  ------------------
  |  Branch (1575:10): [True: 462, False: 749k]
  |  Branch (1575:26): [True: 0, False: 749k]
  |  Branch (1575:42): [True: 0, False: 749k]
  ------------------
 1576|    462|          isNanExist = true;
 1577|    462|          break;
 1578|    462|       }
 1579|   749k|    }
 1580|  8.40k|    if(isNanExist)
  ------------------
  |  Branch (1580:8): [True: 462, False: 7.94k]
  ------------------
 1581|    462|      obErrorLog.ThrowError(__FUNCTION__, "There exists NaN in calculated coordinates.", obWarning);
 1582|       |
 1583|  8.40k|    return success;
 1584|  8.44k|  }
_ZN9OpenBabel9OBBuilder18CorrectStereoBondsERNS_5OBMolE:
 1691|  8.40k|  {
 1692|       |    // Get CisTransStereos and make a vector of corresponding OBStereoUnits
 1693|  8.40k|    std::vector<OBCisTransStereo*> cistrans, newcistrans;
 1694|  8.40k|    OBStereoUnitSet sgunits;
 1695|  8.40k|    std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 1696|  8.40k|    OBStereo::Ref bond_id;
 1697|  16.9k|    for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data)
  ------------------
  |  Branch (1697:70): [True: 8.54k, False: 8.40k]
  ------------------
 1698|  8.54k|      if (((OBStereoBase*)*data)->GetType() == OBStereo::CisTrans) {
  ------------------
  |  Branch (1698:11): [True: 6.83k, False: 1.71k]
  ------------------
 1699|  6.83k|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 1700|  6.83k|        if (ct->GetConfig().specified) {
  ------------------
  |  Branch (1700:13): [True: 6.83k, False: 0]
  ------------------
 1701|  6.83k|          OBAtom *bgn = mol.GetAtomById(ct->GetConfig().begin);
 1702|  6.83k|          OBAtom *end = mol.GetAtomById(ct->GetConfig().end);
 1703|  6.83k|          OBBond *bond = (bgn && end) ? mol.GetBond(bgn, end) : nullptr;
  ------------------
  |  Branch (1703:27): [True: 6.83k, False: 0]
  |  Branch (1703:34): [True: 6.83k, False: 0]
  ------------------
 1704|       |          // Skip stereo data whose atoms/bond no longer exist (e.g. after
 1705|       |          // rebuilding a malformed structure) rather than dereferencing null.
 1706|  6.83k|          if (!bond)
  ------------------
  |  Branch (1706:15): [True: 0, False: 6.83k]
  ------------------
 1707|      0|            continue;
 1708|  6.83k|          cistrans.push_back(ct);
 1709|  6.83k|          bond_id = bond->GetId();
 1710|  6.83k|          sgunits.push_back(OBStereoUnit(OBStereo::CisTrans, bond_id));
 1711|  6.83k|        }
 1712|  6.83k|      }
 1713|       |
 1714|       |    // Perceive CisTransStereos. With addToMol=false the caller owns the
 1715|       |    // returned objects and must delete them before the vector goes out of
 1716|       |    // scope.
 1717|  8.40k|    newcistrans = CisTransFrom3D(&mol, sgunits, false);
 1718|       |
 1719|       |    // Compare and correct if necessary. CisTransFrom3D() may return fewer
 1720|       |    // entries than cistrans (e.g. for bonds whose geometry it can't classify),
 1721|       |    // so match by the (begin,end) bond id instead of iterating in parallel.
 1722|  8.40k|    std::map<OBStereo::Ref, OBCisTransStereo*> newByBond;
 1723|  8.40k|    for (std::vector<OBCisTransStereo*>::iterator it = newcistrans.begin();
 1724|  15.1k|         it != newcistrans.end(); ++it) {
  ------------------
  |  Branch (1724:10): [True: 6.76k, False: 8.40k]
  ------------------
 1725|  6.76k|      OBCisTransStereo::Config c = (*it)->GetConfig();
 1726|  6.76k|      OBBond *bnd = mol.GetBond(mol.GetAtomById(c.begin), mol.GetAtomById(c.end));
 1727|  6.76k|      if (bnd != nullptr)
  ------------------
  |  Branch (1727:11): [True: 6.76k, False: 0]
  ------------------
 1728|  6.76k|        newByBond[bnd->GetId()] = *it;
 1729|  6.76k|    }
 1730|       |
 1731|  8.40k|    double newangle, angle;
 1732|  8.40k|    OBAtom *a, *b, *c, *d;
 1733|  8.40k|    for (std::vector<OBCisTransStereo*>::iterator origct = cistrans.begin();
 1734|  15.2k|         origct != cistrans.end(); ++origct) {
  ------------------
  |  Branch (1734:10): [True: 6.83k, False: 8.40k]
  ------------------
 1735|  6.83k|      OBCisTransStereo::Config origConfig = (*origct)->GetConfig();
 1736|  6.83k|      OBBond *origBond = mol.GetBond(mol.GetAtomById(origConfig.begin),
 1737|  6.83k|                                     mol.GetAtomById(origConfig.end));
 1738|  6.83k|      if (origBond == nullptr)
  ------------------
  |  Branch (1738:11): [True: 0, False: 6.83k]
  ------------------
 1739|      0|        continue;
 1740|  6.83k|      std::map<OBStereo::Ref, OBCisTransStereo*>::iterator found =
 1741|  6.83k|        newByBond.find(origBond->GetId());
 1742|  6.83k|      if (found == newByBond.end())
  ------------------
  |  Branch (1742:11): [True: 65, False: 6.76k]
  ------------------
 1743|     65|        continue; // CisTransFrom3D() did not produce an entry for this bond
 1744|  6.76k|      OBCisTransStereo::Config config = found->second->GetConfig(OBStereo::ShapeU);
 1745|       |
 1746|  6.76k|      if ((*origct)->GetConfig(OBStereo::ShapeU) != config) { // Wrong cis/trans stereochemistry
  ------------------
  |  Branch (1746:11): [True: 1.18k, False: 5.58k]
  ------------------
 1747|       |
 1748|       |        // refs[0]            refs[3]
 1749|       |        //        \          /
 1750|       |        //         begin==end
 1751|       |        //        /          \                                                /
 1752|       |        // refs[1]            refs[2]
 1753|       |
 1754|  1.18k|        a = mol.GetAtomById(config.refs[0]);
 1755|  1.18k|        b = mol.GetAtomById(config.begin);
 1756|  1.18k|        c = mol.GetAtomById(config.end);
 1757|  1.18k|        if (config.refs[3] != OBStereo::ImplicitRef)
  ------------------
  |  Branch (1757:13): [True: 536, False: 649]
  ------------------
 1758|    536|          d = mol.GetAtomById(config.refs[3]);
 1759|    649|        else
 1760|    649|          d = mol.GetAtomById(config.refs[2]);
 1761|  1.18k|        angle = mol.GetTorsion(a, b, c, d); // In degrees
 1762|  1.18k|        newangle = angle * DEG_TO_RAD + M_PI; // flip the bond by 180 deg (PI radians)
  ------------------
  |  |   35|  1.18k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
 1763|       |        // if it's a ring, break a ring bond before rotating
 1764|  1.18k|        mol.SetTorsion(a, b, c, d, newangle); // In radians
 1765|  1.18k|      }
 1766|  6.76k|    }
 1767|       |
 1768|       |    // Free the temporary stereos allocated by CisTransFrom3D(addToMol=false).
 1769|  8.40k|    for (std::vector<OBCisTransStereo*>::iterator it = newcistrans.begin();
 1770|  15.1k|         it != newcistrans.end(); ++it)
  ------------------
  |  Branch (1770:10): [True: 6.76k, False: 8.40k]
  ------------------
 1771|  6.76k|      delete *it;
 1772|       |
 1773|  8.40k|    return true; // was all the ring bond stereochemistry corrected?
 1774|  8.40k|  }
_ZN9OpenBabel9OBBuilder11IsSpiroAtomEmRNS_5OBMolE:
 1777|  11.6k|  {
 1778|  11.6k|    OBAtom* atom = mol.GetAtomById(atomId);
 1779|  11.6k|    if (!atom) // no such atom; cannot be a spiro center
  ------------------
  |  Branch (1779:9): [True: 0, False: 11.6k]
  ------------------
 1780|      0|      return false;
 1781|       |
 1782|  11.6k|    OBMol workmol = mol; // Make a copy (this invalidates Ids, but not Idxs)
 1783|  11.6k|    OBAtom* watom = workmol.GetAtom(atom->GetIdx());
 1784|  11.6k|    if (watom->GetHvyDegree() != 4) // QUESTION: Do I need to restrict it further?
  ------------------
  |  Branch (1784:9): [True: 9.92k, False: 1.74k]
  ------------------
 1785|  9.92k|      return false;
 1786|       |
 1787|  1.74k|    int atomsInSameRing = 0;
 1788|  1.74k|    int atomsInDiffRings = 0;
 1789|  6.98k|    FOR_NBORS_OF_ATOM(n, watom) {
  ------------------
  |  |  419|  1.74k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 6.98k, False: 1.72k]
  |  |  ------------------
  ------------------
 1790|  6.98k|      if (!n->IsInRing())
  ------------------
  |  Branch (1790:11): [True: 23, False: 6.96k]
  ------------------
 1791|     23|        return false;
 1792|  6.96k|      if (mol.AreInSameRing(&*n, watom))
  ------------------
  |  Branch (1792:11): [True: 6.73k, False: 225]
  ------------------
 1793|  6.73k|        atomsInSameRing++;
 1794|    225|      else
 1795|    225|        atomsInDiffRings++;
 1796|  6.96k|    }
 1797|       |
 1798|  1.72k|    if (atomsInSameRing == 2 && atomsInDiffRings == 2)
  ------------------
  |  Branch (1798:9): [True: 69, False: 1.65k]
  |  Branch (1798:33): [True: 69, False: 0]
  ------------------
 1799|     69|      return true;
 1800|       |
 1801|  1.65k|    return false;
 1802|  1.72k|  }
_ZN9OpenBabel9OBBuilder9FlipSpiroERNS_5OBMolEi:
 1805|     18|  {
 1806|     18|    OBAtom *p = mol.GetAtom(idx); // The pivot atom
 1807|       |
 1808|       |    // Find two of the four bonds that are in the same ring
 1809|     18|    vector<int> nbrs;
 1810|     18|    FOR_NBORS_OF_ATOM(nbr, p)
  ------------------
  |  |  419|     18|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 72, False: 18]
  |  |  ------------------
  ------------------
 1811|     72|      nbrs.push_back(nbr->GetIdx());
 1812|       |    //assert(nbrs.size() == 4);
 1813|       |
 1814|       |    // Which neighbour is in the same ring as nbrs[0]? The answer is 'ringnbr'.
 1815|     18|    vector<int> children;
 1816|     18|    mol.FindChildren(children, idx, nbrs[0]);
 1817|     18|    int ringnbr = -1;
 1818|     18|    for (vector<int>::iterator nbr=nbrs.begin() + 1; nbr!=nbrs.end(); ++nbr)
  ------------------
  |  Branch (1818:54): [True: 18, False: 0]
  ------------------
 1819|     18|      if (find(children.begin(), children.end(), *nbr) != children.end()) {
  ------------------
  |  Branch (1819:11): [True: 18, False: 0]
  ------------------
 1820|     18|        ringnbr = *nbr;
 1821|     18|        break;
 1822|     18|      }
 1823|       |    //assert (ringnbr != -1);
 1824|       |
 1825|       |    // Split into a fragment to be flipped
 1826|     18|    OBMol workMol = mol;
 1827|     18|    workMol.DeleteBond(workMol.GetBond(idx, nbrs[0]));
 1828|     18|    workMol.DeleteBond(workMol.GetBond(idx, ringnbr));
 1829|     18|    OBBitVec fragment = GetFragment(workMol.GetAtom(nbrs[0]));
 1830|       |
 1831|       |    // Translate fragment to origin
 1832|     18|    vector3 posP = p->GetVector();
 1833|  4.68k|    for (unsigned int i = 1; i <= workMol.NumAtoms(); ++i)
  ------------------
  |  Branch (1833:30): [True: 4.66k, False: 18]
  ------------------
 1834|  4.66k|      if (fragment.BitIsSet(i))
  ------------------
  |  Branch (1834:11): [True: 2.92k, False: 1.73k]
  ------------------
 1835|  2.92k|        workMol.GetAtom(i)->SetVector(workMol.GetAtom(i)->GetVector() - posP);
 1836|       |
 1837|       |    // Rotate 180 deg around the bisector of nbrs[0]--p--ringnbr
 1838|     18|    vector3 bond1 = posP - mol.GetAtom(nbrs[0])->GetVector();
 1839|     18|    vector3 bond2 = posP - mol.GetAtom(ringnbr)->GetVector();
 1840|     18|    bond1.normalize();
 1841|     18|    bond2.normalize();
 1842|     18|    vector3 axis = bond1 + bond2; // The bisector of bond1 and bond2
 1843|       |
 1844|     18|    matrix3x3 mat;
 1845|     18|    mat.RotAboutAxisByAngle(axis, 180);
 1846|     18|    vector3 tmpvec;
 1847|  4.68k|    for (unsigned int i = 1; i <= workMol.NumAtoms(); ++i)
  ------------------
  |  Branch (1847:30): [True: 4.66k, False: 18]
  ------------------
 1848|  4.66k|      if (fragment.BitIsSet(i)) {
  ------------------
  |  Branch (1848:11): [True: 2.92k, False: 1.73k]
  ------------------
 1849|  2.92k|        tmpvec = workMol.GetAtom(i)->GetVector();
 1850|  2.92k|        tmpvec *= mat;
 1851|  2.92k|        workMol.GetAtom(i)->SetVector( tmpvec );
 1852|  2.92k|      }
 1853|       |
 1854|       |    // Set the coordinates of the original molecule using those of workmol
 1855|  4.68k|    for (unsigned int i = 1; i <= workMol.NumAtoms(); ++i)
  ------------------
  |  Branch (1855:30): [True: 4.66k, False: 18]
  ------------------
 1856|  4.66k|      if (fragment.BitIsSet(i))
  ------------------
  |  Branch (1856:11): [True: 2.92k, False: 1.73k]
  ------------------
 1857|  2.92k|        mol.GetAtom(i)->SetVector(workMol.GetAtom(i)->GetVector() + posP);
 1858|     18|  }
_ZN9OpenBabel9OBBuilder18CorrectStereoAtomsERNS_5OBMolEb:
 1861|  8.40k|  {
 1862|  8.40k|    bool success = true; // for now
 1863|       |
 1864|       |    // Get TetrahedralStereos and make a vector of corresponding OBStereoUnits
 1865|  8.40k|    std::vector<OBTetrahedralStereo*> tetra, newtetra;
 1866|  8.40k|    OBStereoUnitSet sgunits;
 1867|  8.40k|    std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 1868|  8.40k|    OBStereo::Ref atom_id;
 1869|  16.9k|    for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data)
  ------------------
  |  Branch (1869:70): [True: 8.54k, False: 8.40k]
  ------------------
 1870|  8.54k|      if (((OBStereoBase*)*data)->GetType() == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1870:11): [True: 1.71k, False: 6.83k]
  ------------------
 1871|  1.71k|        OBTetrahedralStereo *th = dynamic_cast<OBTetrahedralStereo*>(*data);
 1872|  1.71k|        if (th->GetConfig().specified) {
  ------------------
  |  Branch (1872:13): [True: 1.71k, False: 0]
  ------------------
 1873|  1.71k|          tetra.push_back(th);
 1874|  1.71k|          atom_id = th->GetConfig().center;
 1875|  1.71k|          sgunits.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom_id));
 1876|  1.71k|        }
 1877|  1.71k|      }
 1878|       |
 1879|       |    // Perceive TetrahedralStereos. With addToMol=false the caller owns the
 1880|       |    // returned objects. Track every allocation we receive so we can delete
 1881|       |    // them before returning.
 1882|  8.40k|    newtetra = TetrahedralFrom3D(&mol, sgunits, false);
 1883|  8.40k|    std::vector<OBTetrahedralStereo*> owned(newtetra.begin(), newtetra.end());
 1884|       |
 1885|       |    // Identify any ring stereochemistry and whether it is right or wrong
 1886|       |    // - ring stereo involves 3 ring bonds, or 4 ring bonds but the
 1887|       |    //   atom must not be spiro
 1888|  8.40k|    OBAtom* center;
 1889|  8.40k|    bool existswrongstereo = false; // Is there at least one wrong ring stereo?
 1890|  8.40k|    typedef std::pair<OBStereo::Ref, bool> IsThisStereoRight;
 1891|  8.40k|    std::vector<IsThisStereoRight> ringstereo;
 1892|  8.40k|    std::vector<OBTetrahedralStereo*> nonringtetra, nonringnewtetra;
 1893|       |
 1894|       |    // TetrahedralFrom3D() can skip stereo units (e.g. centers with too few
 1895|       |    // heavy-atom neighbors), so newtetra is not necessarily parallel to
 1896|       |    // tetra. Index the perceived stereos by center id so each original
 1897|       |    // stereo is matched against the one with the same center.
 1898|  8.40k|    std::map<OBStereo::Ref, OBTetrahedralStereo*> newByCenter;
 1899|  8.40k|    for (std::vector<OBTetrahedralStereo*>::iterator it = newtetra.begin();
 1900|  9.92k|         it != newtetra.end(); ++it)
  ------------------
  |  Branch (1900:10): [True: 1.52k, False: 8.40k]
  ------------------
 1901|  1.52k|      newByCenter[(*it)->GetConfig().center] = *it;
 1902|       |
 1903|  8.40k|    for (std::vector<OBTetrahedralStereo*>::iterator origth = tetra.begin();
 1904|  10.1k|         origth != tetra.end(); ++origth) {
  ------------------
  |  Branch (1904:10): [True: 1.71k, False: 8.40k]
  ------------------
 1905|  1.71k|      OBStereo::Ref centerId = (*origth)->GetConfig().center;
 1906|  1.71k|      std::map<OBStereo::Ref, OBTetrahedralStereo*>::iterator found =
 1907|  1.71k|        newByCenter.find(centerId);
 1908|  1.71k|      if (found == newByCenter.end())
  ------------------
  |  Branch (1908:11): [True: 272, False: 1.44k]
  ------------------
 1909|    272|        continue; // TetrahedralFrom3D() skipped this center; nothing to compare against
 1910|  1.44k|      OBTetrahedralStereo *newth = found->second;
 1911|  1.44k|      OBTetrahedralStereo::Config config = newth->GetConfig(OBStereo::Clockwise, OBStereo::ViewFrom);
 1912|       |
 1913|  1.44k|      center = mol.GetAtomById(config.center);
 1914|  1.44k|      int ringbonds = 0;
 1915|  1.44k|      FOR_BONDS_OF_ATOM(b, center)
  ------------------
  |  |  420|  1.44k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 5.23k, False: 1.44k]
  |  |  ------------------
  ------------------
 1916|  5.23k|        if (b->IsInRing())
  ------------------
  |  Branch (1916:13): [True: 4.38k, False: 844]
  ------------------
 1917|  4.38k|          ringbonds++;
 1918|       |
 1919|  1.44k|      if (ringbonds == 3 || (ringbonds==4 && !OBBuilder::IsSpiroAtom(config.center, mol))) {
  ------------------
  |  Branch (1919:11): [True: 86, False: 1.35k]
  |  Branch (1919:30): [True: 746, False: 609]
  |  Branch (1919:46): [True: 721, False: 25]
  ------------------
 1920|    807|        bool rightstereo = (*origth)->GetConfig(OBStereo::Clockwise, OBStereo::ViewFrom) == config;
 1921|    807|        ringstereo.push_back(IsThisStereoRight(config.center, rightstereo));
 1922|    807|        if (!rightstereo)
  ------------------
  |  Branch (1922:13): [True: 435, False: 372]
  ------------------
 1923|    435|          existswrongstereo = true;
 1924|    807|      }
 1925|    634|      else { // A non-ring stereocenter
 1926|    634|        nonringtetra.push_back(*origth);
 1927|    634|        nonringnewtetra.push_back(newth);
 1928|    634|      }
 1929|  1.44k|    }
 1930|       |
 1931|  8.40k|    if (existswrongstereo) {
  ------------------
  |  Branch (1931:9): [True: 169, False: 8.23k]
  ------------------
 1932|       |      // Fix ring stereo
 1933|    169|      OBStereo::Refs unfixed;
 1934|    169|      bool inversion = FixRingStereo(ringstereo, mol, unfixed);
 1935|       |
 1936|       |      // Output warning message if necessary
 1937|    169|      if (unfixed.size() > 0 && warn) {
  ------------------
  |  Branch (1937:11): [True: 68, False: 101]
  |  Branch (1937:33): [True: 68, False: 0]
  ------------------
 1938|     68|        stringstream errorMsg;
 1939|     68|        errorMsg << "Could not correct " << unfixed.size() << " stereocenter(s) in this molecule (" << mol.GetTitle() << ")";
 1940|     68|        errorMsg << std::endl << "  with Atom Ids as follows:";
 1941|    313|        for (OBStereo::RefIter ref=unfixed.begin(); ref!=unfixed.end(); ++ref)
  ------------------
  |  Branch (1941:53): [True: 245, False: 68]
  ------------------
 1942|    245|          errorMsg << " " << *ref;
 1943|     68|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
 1944|       |
 1945|     68|        success = false; // uncorrected bond
 1946|     68|      }
 1947|       |
 1948|       |      // Reperceive non-ring TetrahedralStereos if an inversion occurred
 1949|    169|      if (inversion) {
  ------------------
  |  Branch (1949:11): [True: 151, False: 18]
  ------------------
 1950|    151|        sgunits.clear();
 1951|    151|        for (std::vector<OBTetrahedralStereo*>::iterator origth = nonringtetra.begin();
 1952|    489|             origth != nonringtetra.end(); ++origth)
  ------------------
  |  Branch (1952:14): [True: 338, False: 151]
  ------------------
 1953|    338|          sgunits.push_back(OBStereoUnit(OBStereo::Tetrahedral, (*origth)->GetConfig().center));
 1954|    151|        nonringnewtetra = TetrahedralFrom3D(&mol, sgunits, false);
 1955|       |        // These are freshly allocated; the previous nonringnewtetra contents
 1956|       |        // were aliases into newtetra and are still tracked by `owned`.
 1957|    151|        owned.insert(owned.end(), nonringnewtetra.begin(), nonringnewtetra.end());
 1958|    151|      }
 1959|    169|    }
 1960|       |
 1961|       |    // Correct the non-ring stereo. TetrahedralFrom3D() may again return
 1962|       |    // fewer entries than nonringtetra, so match by center id instead of
 1963|       |    // iterating both vectors in parallel.
 1964|  8.40k|    std::map<OBStereo::Ref, OBTetrahedralStereo*> nonringNewByCenter;
 1965|  8.40k|    for (std::vector<OBTetrahedralStereo*>::iterator it = nonringnewtetra.begin();
 1966|  9.03k|         it != nonringnewtetra.end(); ++it)
  ------------------
  |  Branch (1966:10): [True: 634, False: 8.40k]
  ------------------
 1967|    634|      nonringNewByCenter[(*it)->GetConfig().center] = *it;
 1968|       |
 1969|  8.40k|    for (std::vector<OBTetrahedralStereo*>::iterator origth = nonringtetra.begin();
 1970|  9.03k|         origth != nonringtetra.end(); ++origth) {
  ------------------
  |  Branch (1970:10): [True: 634, False: 8.40k]
  ------------------
 1971|    634|      OBStereo::Ref centerId = (*origth)->GetConfig().center;
 1972|    634|      std::map<OBStereo::Ref, OBTetrahedralStereo*>::iterator found =
 1973|    634|        nonringNewByCenter.find(centerId);
 1974|    634|      if (found == nonringNewByCenter.end())
  ------------------
  |  Branch (1974:11): [True: 0, False: 634]
  ------------------
 1975|      0|        continue;
 1976|    634|      OBTetrahedralStereo *newth = found->second;
 1977|    634|      OBTetrahedralStereo::Config config = newth->GetConfig(OBStereo::Clockwise, OBStereo::ViewFrom);
 1978|    634|      if ((*origth)->GetConfig(OBStereo::Clockwise, OBStereo::ViewFrom) != config) {
  ------------------
  |  Branch (1978:11): [True: 375, False: 259]
  ------------------
 1979|       |        // Wrong tetrahedral stereochemistry
 1980|       |
 1981|       |        // Try to find two non-ring bonds
 1982|    375|        center = mol.GetAtomById(config.center);
 1983|    375|        vector<unsigned int> idxs;
 1984|    375|        FOR_BONDS_OF_ATOM(b, center)
  ------------------
  |  |  420|    375|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 1.19k, False: 375]
  |  |  ------------------
  ------------------
 1985|  1.19k|          if (!b->IsInRing())
  ------------------
  |  Branch (1985:15): [True: 447, False: 752]
  ------------------
 1986|    447|            idxs.push_back(b->GetNbrAtom(center)->GetIdx());
 1987|       |
 1988|    375|        if (idxs.size() == 0 && OBBuilder::IsSpiroAtom(config.center, mol))
  ------------------
  |  Branch (1988:13): [True: 18, False: 357]
  |  Branch (1988:33): [True: 18, False: 0]
  ------------------
 1989|     18|          FlipSpiro(mol, center->GetIdx());
 1990|    357|        else if (idxs.size() >= 2)
  ------------------
  |  Branch (1990:18): [True: 69, False: 288]
  ------------------
 1991|     69|          Swap(mol, center->GetIdx(), idxs.at(0), center->GetIdx(), idxs.at(1));
 1992|    288|        else {
 1993|       |          // It will only reach here if it can only find one non-ring bond
 1994|       |          // -- this is the case if the other non-ring bond is an implicit H
 1995|       |          //    or a lone pair
 1996|       |          // Solution: Find where a new bond vector would be placed, and
 1997|       |          //           replace the atom's coordinates with these
 1998|    288|          OBAtom* non_ring_atom = mol.GetAtom(idxs.at(0));
 1999|    288|          OBBond* non_ring_bond = mol.GetBond(center, non_ring_atom);
 2000|    288|          vector3 newcoords = OBBuilder::GetNewBondVector(center, non_ring_bond->GetLength());
 2001|    288|          SwapWithVector(mol, center->GetIdx(), idxs.at(0), center->GetIdx(), newcoords);
 2002|    288|        }
 2003|    375|      }
 2004|    634|    }
 2005|       |
 2006|       |    // Free the temporary stereos allocated by TetrahedralFrom3D(addToMol=false).
 2007|  8.40k|    for (std::vector<OBTetrahedralStereo*>::iterator it = owned.begin();
 2008|  10.2k|         it != owned.end(); ++it)
  ------------------
  |  Branch (2008:10): [True: 1.86k, False: 8.40k]
  ------------------
 2009|  1.86k|      delete *it;
 2010|       |
 2011|  8.40k|    return success; // did we fix all atoms, including ring stereo?
 2012|  8.40k|  }
_ZN9OpenBabel9OBBuilder13FixRingStereoENSt3__16vectorINS1_4pairImbEENS1_9allocatorIS4_EEEERNS_5OBMolERNS2_ImNS5_ImEEEE:
 2016|    169|  {
 2017|    169|    bool inversion = false;
 2018|    169|    if (atomIds.size() == 0) return inversion;
  ------------------
  |  Branch (2018:9): [True: 0, False: 169]
  ------------------
 2019|       |
 2020|       |    // Have we dealt with a particular ring stereo? (Indexed by Id)
 2021|    169|    OBBitVec seen;
 2022|       |
 2023|    938|    for(unsigned int n=0; n<atomIds.size(); ++n) {
  ------------------
  |  Branch (2023:27): [True: 769, False: 169]
  ------------------
 2024|       |      // Keep looping until you come to an unseen wrong stereo
 2025|    769|      if (seen.BitIsSet(atomIds[n].first) || atomIds[n].second) continue;
  ------------------
  |  Branch (2025:11): [True: 375, False: 394]
  |  Branch (2025:46): [True: 157, False: 237]
  ------------------
 2026|       |
 2027|    237|      OBBitVec fragment; // Indexed by Id
 2028|    237|      AddRingNbrs(fragment, mol.GetAtomById(atomIds[n].first), mol);
 2029|       |
 2030|       |      // Which ring stereos does this fragment contain, and
 2031|       |      // are the majority of them right or wrong?
 2032|    237|      OBStereo::Refs wrong, right;
 2033|  1.43k|      for (unsigned int i=0; i<atomIds.size(); ++i)
  ------------------
  |  Branch (2033:30): [True: 1.19k, False: 237]
  ------------------
 2034|  1.19k|        if (fragment.BitIsSet(atomIds[i].first)) {
  ------------------
  |  Branch (2034:13): [True: 664, False: 533]
  ------------------
 2035|    664|          if (atomIds[i].second)
  ------------------
  |  Branch (2035:15): [True: 235, False: 429]
  ------------------
 2036|    235|            right.push_back(atomIds[i].first);
 2037|    429|          else
 2038|    429|            wrong.push_back(atomIds[i].first);
 2039|    664|          seen.SetBitOn(atomIds[i].first);
 2040|    664|        }
 2041|       |
 2042|    237|      if (right > wrong) { // Inverting would make things worse!
  ------------------
  |  Branch (2042:11): [True: 26, False: 211]
  ------------------
 2043|     26|        unfixedcenters.insert(unfixedcenters.end(), wrong.begin(), wrong.end());
 2044|     26|        continue;
 2045|     26|      }
 2046|    211|      unfixedcenters.insert(unfixedcenters.end(), right.begin(), right.end());
 2047|       |
 2048|       |      // Invert the coordinates (QUESTION: should I invert relative to the centroid?)
 2049|    211|      inversion = true;
 2050|    211|      FOR_ATOMS_OF_MOL(a, mol)
  ------------------
  |  |  417|    211|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 38.9k, False: 211]
  |  |  ------------------
  ------------------
 2051|  38.9k|        if (fragment.BitIsSet(a->GetId()))
  ------------------
  |  Branch (2051:13): [True: 8.30k, False: 30.6k]
  ------------------
 2052|  8.30k|          a->SetVector( - a->GetVector());
 2053|       |
 2054|       |      // Add neighbouring bonds back onto the fragment
 2055|       |      // TODO: Handle spiro
 2056|    211|      std::vector<OBBond*> reconnect;
 2057|    211|      FOR_ATOMS_OF_MOL(a, mol)
  ------------------
  |  |  417|    211|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 38.9k, False: 211]
  |  |  ------------------
  ------------------
 2058|  38.9k|        if (fragment.BitIsSet(a->GetId()))
  ------------------
  |  Branch (2058:13): [True: 8.30k, False: 30.6k]
  ------------------
 2059|  8.30k|          FOR_BONDS_OF_ATOM(b, &*a)
  ------------------
  |  |  420|  8.30k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 20.6k, False: 8.30k]
  |  |  ------------------
  ------------------
 2060|  20.6k|            if (!b->IsInRing())
  ------------------
  |  Branch (2060:17): [True: 1.74k, False: 18.8k]
  ------------------
 2061|  1.74k|              reconnect.push_back(&*b);
 2062|       |
 2063|  1.95k|      for (std::vector<OBBond*>::iterator bi=reconnect.begin(); bi!=reconnect.end(); ++bi) {
  ------------------
  |  Branch (2063:65): [True: 1.74k, False: 211]
  ------------------
 2064|  1.74k|        OBBond* b = *bi;
 2065|  1.74k|        int bo = b->GetBondOrder();
 2066|  1.74k|        int begin = b->GetBeginAtomIdx();
 2067|  1.74k|        int end = b->GetEndAtomIdx();
 2068|  1.74k|        mol.DeleteBond(b);
 2069|  1.74k|        OBBuilder::Connect(mol, begin, end, bo);
 2070|  1.74k|      }
 2071|    211|    }
 2072|       |
 2073|    169|    return inversion;
 2074|    169|  }
_ZN9OpenBabel9OBBuilder11AddRingNbrsERNS_8OBBitVecEPNS_6OBAtomERNS_5OBMolE:
 2077|  11.1k|  {
 2078|       |    // Add the nbrs to the fragment, but don't add the neighbours of a spiro atom.
 2079|  27.8k|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  11.1k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 27.8k, False: 11.1k]
  |  |  ------------------
  ------------------
 2080|  27.8k|      if (mol.GetBond(&*nbr, atom)->IsInRing() && !fragment.BitIsSet(nbr->GetId())
  ------------------
  |  Branch (2080:11): [True: 25.5k, False: 2.32k]
  |  Branch (2080:51): [True: 10.9k, False: 14.6k]
  ------------------
 2081|  10.9k|          && !OBBuilder::IsSpiroAtom(atom->GetId(), mol)) {
  ------------------
  |  Branch (2081:14): [True: 10.8k, False: 26]
  ------------------
 2082|  10.8k|        fragment.SetBitOn(nbr->GetId());
 2083|  10.8k|        AddRingNbrs(fragment, &*nbr, mol);
 2084|  10.8k|      }
 2085|  27.8k|    }
 2086|  11.1k|  }
builder.cpp:_ZZN9OpenBabel9OBBuilder5BuildERNS_5OBMolEbENK3$_0clEii:
 1340|  54.0k|      auto coveredBySSSR = [&](int u, int v) {
 1341|  1.43M|        for (OBRing *r : rlist) {
  ------------------
  |  Branch (1341:24): [True: 1.43M, False: 389]
  ------------------
 1342|  1.43M|          if (r->IsInRing(u) && r->IsInRing(v))
  ------------------
  |  Branch (1342:15): [True: 103k, False: 1.32M]
  |  Branch (1342:33): [True: 53.6k, False: 50.1k]
  ------------------
 1343|  53.6k|            return true;
 1344|  1.43M|        }
 1345|    389|        return false;
 1346|  54.0k|      };
builder.cpp:_ZZN9OpenBabel9OBBuilder5BuildERNS_5OBMolEbENK3$_1clEmm:
 1428|  77.0k|                  [&rlist](size_t a, size_t b) {
 1429|  77.0k|                    return rlist[a]->_path.size() > rlist[b]->_path.size();
 1430|  77.0k|                  });

_ZN9OpenBabel7addNbrsERNS_8OBBitVecEPNS_6OBAtomERKS0_RKNSt3__16vectorIPNS_6OBBondENS6_9allocatorIS9_EEEE:
  114|   455k|  {
  115|  1.02M|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   455k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.02M, False: 455k]
  |  |  ------------------
  ------------------
  116|  1.02M|      if (!mask.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (116:11): [True: 207k, False: 813k]
  ------------------
  117|   207k|        continue;
  118|       |      // skip visited atoms
  119|   813k|      if (fragment.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (119:11): [True: 458k, False: 354k]
  ------------------
  120|   458k|        continue;
  121|       |      // skip mettalocene bonds
  122|   354k|      if (std::find(metalloceneBonds.begin(), metalloceneBonds.end(),
  ------------------
  |  Branch (122:11): [True: 1.57k, False: 353k]
  ------------------
  123|   354k|            atom->GetParent()->GetBond(atom, &*nbr)) != metalloceneBonds.end())
  124|  1.57k|        continue;
  125|       |      // add the neighbor atom to the fragment
  126|   353k|      fragment.SetBitOn(nbr->GetIdx());
  127|       |      // recurse...
  128|   353k|      addNbrs(fragment, &*nbr, mask, metalloceneBonds);
  129|   353k|    }
  130|   455k|  }
_ZN9OpenBabel11getFragmentEPNS_6OBAtomERKNS_8OBBitVecERKNSt3__16vectorIPNS_6OBBondENS5_9allocatorIS8_EEEE:
  138|   102k|  {
  139|   102k|    OBBitVec fragment;
  140|   102k|    fragment.SetBitOn(atom->GetIdx());
  141|       |    // start the recursion
  142|   102k|    addNbrs(fragment, atom, mask, metalloceneBonds);
  143|   102k|    return fragment;
  144|   102k|  }
_ZN9OpenBabel11getFragmentEPNS_6OBAtomES1_RKNS_8OBBitVecE:
  147|   589k|  {
  148|   589k|    struct getFragmentImpl
  149|   589k|    {
  150|   589k|      static void addNbrs(OBBitVec &fragment, OBAtom *atom, OBAtom *skip, const OBBitVec &mask)
  151|   589k|      {
  152|   589k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  153|       |          // don't pass through skip
  154|   589k|          if (nbr->GetIdx() == skip->GetIdx())
  155|   589k|            continue;
  156|       |          // skip visited atoms
  157|   589k|          if (fragment.BitIsSet(nbr->GetIdx()))
  158|   589k|            continue;
  159|   589k|          if (!mask.BitIsSet(nbr->GetIdx()))
  160|   589k|            continue;
  161|       |          // add the neighbor atom to the fragment
  162|   589k|          fragment.SetBitOn(nbr->GetIdx());
  163|       |          // recurse...
  164|   589k|          addNbrs(fragment, &*nbr, skip, mask);
  165|   589k|        }
  166|   589k|      }
  167|   589k|    };
  168|       |
  169|   589k|    OBBitVec fragment;
  170|   589k|    fragment.SetBitOn(atom->GetIdx());
  171|       |    // start the recursion
  172|   589k|    getFragmentImpl::addNbrs(fragment, atom, skip, mask);
  173|   589k|    return fragment;
  174|   589k|  }
_ZN9OpenBabel15isFerroceneBondEPNS_6OBBondE:
  179|  6.62M|  {
  180|  6.62M|    if (bond->GetBondOrder() != 1)
  ------------------
  |  Branch (180:9): [True: 143k, False: 6.48M]
  ------------------
  181|   143k|      return false;
  182|       |
  183|  6.48M|    OBAtom *Fe = nullptr, *C = nullptr;
  184|       |
  185|  6.48M|    OBAtom *begin = bond->GetBeginAtom();
  186|  6.48M|    if (begin->GetAtomicNum() == 26)
  ------------------
  |  Branch (186:9): [True: 471, False: 6.48M]
  ------------------
  187|    471|      Fe = begin;
  188|  6.48M|    if (begin->GetAtomicNum() == 6)
  ------------------
  |  Branch (188:9): [True: 100k, False: 6.38M]
  ------------------
  189|   100k|      C = begin;
  190|       |
  191|  6.48M|    OBAtom *end = bond->GetEndAtom();
  192|  6.48M|    if (end->GetAtomicNum() == 26)
  ------------------
  |  Branch (192:9): [True: 565, False: 6.48M]
  ------------------
  193|    565|      Fe = end;
  194|  6.48M|    if (end->GetAtomicNum() == 6)
  ------------------
  |  Branch (194:9): [True: 112k, False: 6.36M]
  ------------------
  195|   112k|      C = end;
  196|       |
  197|  6.48M|    if (!Fe || !C)
  ------------------
  |  Branch (197:9): [True: 6.48M, False: 920]
  |  Branch (197:16): [True: 775, False: 145]
  ------------------
  198|  6.48M|      return false;
  199|       |
  200|    145|    if (Fe->GetExplicitDegree() < 10)
  ------------------
  |  Branch (200:9): [True: 145, False: 0]
  ------------------
  201|    145|      return false;
  202|       |
  203|      0|    return C->HasDoubleBond() && C->IsInRing();
  ------------------
  |  Branch (203:12): [True: 0, False: 0]
  |  Branch (203:34): [True: 0, False: 0]
  ------------------
  204|    145|  }
_ZN9OpenBabel20findMetalloceneBondsERNSt3__16vectorIPNS_6OBBondENS0_9allocatorIS3_EEEEPNS_5OBMolERKNS1_IjNS4_IjEEEE:
  207|   344k|  {
  208|  1.46M|    FOR_ATOMS_OF_MOL (atom, mol) {
  ------------------
  |  |  417|   344k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 1.46M, False: 344k]
  |  |  ------------------
  ------------------
  209|  1.46M|      if (!atom->IsInRingSize(3))
  ------------------
  |  Branch (209:11): [True: 1.39M, False: 72.8k]
  ------------------
  210|  1.39M|        continue;
  211|  72.8k|      std::vector<unsigned int> nbrSymClasses;
  212|   262k|      FOR_NBORS_OF_ATOM (nbr, &*atom) {
  ------------------
  |  |  419|  72.8k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 262k, False: 72.8k]
  |  |  ------------------
  ------------------
  213|   262k|        if (nbr->IsInRingSize(3))
  ------------------
  |  Branch (213:13): [True: 228k, False: 33.7k]
  ------------------
  214|   228k|          nbrSymClasses.push_back(symmetry_classes[nbr->GetIndex()]);
  215|   262k|      }
  216|       |
  217|  72.8k|      if (nbrSymClasses.size() < 8)
  ------------------
  |  Branch (217:11): [True: 71.1k, False: 1.69k]
  ------------------
  218|  71.1k|        continue;
  219|       |
  220|  1.69k|      std::sort(nbrSymClasses.begin(), nbrSymClasses.end());
  221|  1.69k|      unsigned int numUnique = std::unique(nbrSymClasses.begin(), nbrSymClasses.end()) - nbrSymClasses.begin();
  222|  1.69k|      if (numUnique > 1)
  ------------------
  |  Branch (222:11): [True: 1.52k, False: 176]
  ------------------
  223|  1.52k|        continue;
  224|       |
  225|    176|      FOR_NBORS_OF_ATOM (nbr, &*atom)
  ------------------
  |  |  419|    176|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.98k, False: 176]
  |  |  ------------------
  ------------------
  226|  1.98k|        bonds.push_back(mol->GetBond(&*atom, &*nbr));
  227|    176|    }
  228|   344k|  }
_ZN9OpenBabel15CanonicalLabelsEPNS_5OBMolERKNSt3__16vectorIjNS2_9allocatorIjEEEERS6_RKNS_8OBBitVecEib:
 1719|   242k|  {
 1720|       |    // make sure the mask is valid: no mask = all atoms
 1721|   242k|    OBBitVec maskCopy(mask);
 1722|   242k|    if (!maskCopy.CountBits())
  ------------------
  |  Branch (1722:9): [True: 0, False: 242k]
  ------------------
 1723|      0|      FOR_ATOMS_OF_MOL (atom, mol)
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1724|      0|        maskCopy.SetBitOn(atom->GetIdx());
 1725|       |
 1726|   242k|    if (onlyOne) {
  ------------------
  |  Branch (1726:9): [True: 0, False: 242k]
  ------------------
 1727|       |      // Only one labeling requested. This results in canonical labels that do not
 1728|       |      // consider stereochemistry. Used for finding stereo centers with automorphisms.
 1729|      0|      CanonicalLabelsImpl::CalcCanonicalLabels(mol, symmetry_classes, canonical_labels, OBStereoUnitSet(), maskCopy, nullptr, maxSeconds, true);
 1730|   242k|    } else {
 1731|   242k|      std::vector<OBBond*> metalloceneBonds;
 1732|   242k|      findMetalloceneBonds(metalloceneBonds, mol, symmetry_classes);
 1733|       |
 1734|       |      // Check if there are specified stereo centers.
 1735|   242k|      bool hasAtLeastOneDefined = false;
 1736|   242k|      OBStereoFacade sf(mol, false);
 1737|   784k|      FOR_ATOMS_OF_MOL (atom, mol) {
  ------------------
  |  |  417|   242k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 784k, False: 241k]
  |  |  ------------------
  ------------------
 1738|   784k|        FOR_BONDS_OF_ATOM (bond, &*atom)
  ------------------
  |  |  420|   784k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 1.16M, False: 784k]
  |  |  ------------------
  ------------------
 1739|  1.16M|        if (std::find(metalloceneBonds.begin(), metalloceneBonds.end(), &*bond) != metalloceneBonds.end())
  ------------------
  |  Branch (1739:13): [True: 1.32k, False: 1.16M]
  ------------------
 1740|  1.32k|          continue;
 1741|   784k|        if (sf.HasTetrahedralStereo(atom->GetId())) {
  ------------------
  |  Branch (1741:13): [True: 11.6k, False: 772k]
  ------------------
 1742|  11.6k|          if (sf.GetTetrahedralStereo(atom->GetId())->GetConfig().specified) {
  ------------------
  |  Branch (1742:15): [True: 1.83k, False: 9.79k]
  ------------------
 1743|  1.83k|            hasAtLeastOneDefined = true;
 1744|  1.83k|            break;
 1745|  1.83k|          }
 1746|  11.6k|        }
 1747|   784k|      }
 1748|   400k|      FOR_BONDS_OF_MOL (bond, mol) {
  ------------------
  |  |  418|   242k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 400k, False: 239k]
  |  |  ------------------
  ------------------
 1749|   400k|        if (sf.HasCisTransStereo(bond->GetId())) {
  ------------------
  |  Branch (1749:13): [True: 11.2k, False: 389k]
  ------------------
 1750|  11.2k|          if (sf.GetCisTransStereo(bond->GetId())->GetConfig().specified) {
  ------------------
  |  Branch (1750:15): [True: 3.50k, False: 7.78k]
  ------------------
 1751|  3.50k|            hasAtLeastOneDefined = true;
 1752|  3.50k|            break;
 1753|  3.50k|          }
 1754|  11.2k|        }
 1755|   400k|      }
 1756|   242k|      if (!hasAtLeastOneDefined) {
  ------------------
  |  Branch (1756:11): [True: 237k, False: 5.16k]
  ------------------
 1757|       |        // If there are no specified stereo centers, we don't need to find stereogenic units.
 1758|   237k|        CanonicalLabelsImpl::CalcCanonicalLabels(mol, symmetry_classes, canonical_labels, OBStereoUnitSet(), maskCopy, nullptr, maxSeconds);
 1759|   237k|        return;
 1760|   237k|      }
 1761|       |
 1762|       |      // Find the stereogenic units
 1763|  5.16k|      OBStereoUnitSet stereoUnits = FindStereogenicUnits(mol, symmetry_classes);
 1764|       |
 1765|       |      // Mark all invalid stereo data as unspecified
 1766|  5.16k|      std::vector<OBGenericData*> stereoData = mol->GetAllData(OBGenericDataType::StereoData);
 1767|  5.16k|      std::vector<OBGenericData*>::iterator data;
 1768|  49.9k|      for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (1768:39): [True: 44.7k, False: 5.16k]
  ------------------
 1769|  44.7k|        OBStereo::Type type = ((OBStereoBase*)*data)->GetType();
 1770|  44.7k|        if (type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1770:13): [True: 14.2k, False: 30.5k]
  ------------------
 1771|  14.2k|          OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(*data);
 1772|  14.2k|          OBTetrahedralStereo::Config config = ts->GetConfig();
 1773|  14.2k|          bool valid = true;
 1774|  14.2k|          if (!ts->IsValid())
  ------------------
  |  Branch (1774:15): [True: 0, False: 14.2k]
  ------------------
 1775|      0|            valid = false;
 1776|  14.2k|          OBAtom *center = mol->GetAtomById(config.center);
 1777|  14.2k|          if (!center)
  ------------------
  |  Branch (1777:15): [True: 0, False: 14.2k]
  ------------------
 1778|      0|            valid = false;
 1779|  14.2k|          else if (!isTetrahedral(center, stereoUnits))
  ------------------
  |  Branch (1779:20): [True: 63, False: 14.1k]
  ------------------
 1780|     63|            valid = false;
 1781|       |
 1782|  14.2k|          if (!valid) {
  ------------------
  |  Branch (1782:15): [True: 63, False: 14.1k]
  ------------------
 1783|     63|            config.specified = false;
 1784|     63|            ts->SetConfig(config);
 1785|     63|          }
 1786|  14.2k|        }
 1787|  44.7k|        if (type == OBStereo::CisTrans) {
  ------------------
  |  Branch (1787:13): [True: 30.5k, False: 14.2k]
  ------------------
 1788|  30.5k|          OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 1789|  30.5k|          OBCisTransStereo::Config config = ct->GetConfig();
 1790|  30.5k|          bool valid = true;
 1791|  30.5k|          if (!ct->IsValid())
  ------------------
  |  Branch (1791:15): [True: 0, False: 30.5k]
  ------------------
 1792|      0|            valid = false;
 1793|  30.5k|          OBAtom *beginAtom = mol->GetAtomById(config.begin);
 1794|  30.5k|          OBAtom *endAtom = mol->GetAtomById(config.end);
 1795|  30.5k|          if (!beginAtom || !endAtom)
  ------------------
  |  Branch (1795:15): [True: 0, False: 30.5k]
  |  Branch (1795:29): [True: 0, False: 30.5k]
  ------------------
 1796|      0|            valid = false;
 1797|  30.5k|          else {
 1798|  30.5k|            OBBond *bond = mol->GetBond(beginAtom, endAtom);
 1799|  30.5k|            if (!bond)
  ------------------
  |  Branch (1799:17): [True: 0, False: 30.5k]
  ------------------
 1800|      0|              valid = false;
 1801|  30.5k|            else if (!isCisTrans(bond, stereoUnits))
  ------------------
  |  Branch (1801:22): [True: 23, False: 30.5k]
  ------------------
 1802|     23|              valid = false;
 1803|  30.5k|          }
 1804|       |
 1805|  30.5k|          if (!valid) {
  ------------------
  |  Branch (1805:15): [True: 23, False: 30.5k]
  ------------------
 1806|     23|            config.specified = false;
 1807|     23|            ct->SetConfig(config);
 1808|     23|          }
 1809|  30.5k|        }
 1810|  44.7k|      }
 1811|       |
 1812|       |      // Determine stereochemistry from coordinates if needed
 1813|  5.16k|      if (!mol->HasChiralityPerceived()) {
  ------------------
  |  Branch (1813:11): [True: 0, False: 5.16k]
  ------------------
 1814|      0|        switch (mol->GetDimension()) {
 1815|      0|          case 2:
  ------------------
  |  Branch (1815:11): [True: 0, False: 0]
  ------------------
 1816|      0|            mol->DeleteData(OBGenericDataType::StereoData);
 1817|      0|            TetrahedralFrom2D(mol, stereoUnits);
 1818|      0|            CisTransFrom2D(mol, stereoUnits);
 1819|      0|            break;
 1820|      0|          case 3:
  ------------------
  |  Branch (1820:11): [True: 0, False: 0]
  ------------------
 1821|      0|            mol->DeleteData(OBGenericDataType::StereoData);
 1822|      0|            TetrahedralFrom3D(mol, stereoUnits);
 1823|      0|            CisTransFrom3D(mol, stereoUnits);
 1824|      0|            break;
 1825|      0|          default:
  ------------------
  |  Branch (1825:11): [True: 0, False: 0]
  ------------------
 1826|      0|            TetrahedralFrom0D(mol, stereoUnits);
 1827|      0|            CisTransFrom0D(mol, stereoUnits);
 1828|      0|            break;
 1829|      0|        }
 1830|      0|      }
 1831|       |
 1832|       |      // The mol->DeleteData() above deleted some of the data that the OBStereoFacade sf()
 1833|       |      // is using.  We have to create a new one.  (CJ - fixes a bug.)
 1834|  5.16k|      OBStereoFacade newsf(mol, false);
 1835|       |
 1836|       |      // Start the labeling process
 1837|  5.16k|      CanonicalLabelsImpl::CalcCanonicalLabels(mol, symmetry_classes, canonical_labels, stereoUnits, maskCopy, &newsf, maxSeconds);
 1838|  5.16k|    }
 1839|       |
 1840|       |    // if the labeling failed, just return the identity labels to avoid craches
 1841|  5.16k|    if (canonical_labels.empty())
  ------------------
  |  Branch (1841:9): [True: 0, False: 5.16k]
  ------------------
 1842|      0|      for (std::size_t i = 0; i < symmetry_classes.size(); ++i)
  ------------------
  |  Branch (1842:31): [True: 0, False: 0]
  ------------------
 1843|      0|        canonical_labels.push_back(i+1);
 1844|  5.16k|  }
canon.cpp:_ZZN9OpenBabel11getFragmentEPNS_6OBAtomES1_RKNS_8OBBitVecEEN15getFragmentImpl7addNbrsERS2_S1_S1_S4_:
  151|   600k|      {
  152|   618k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   600k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 618k, False: 600k]
  |  |  ------------------
  ------------------
  153|       |          // don't pass through skip
  154|   618k|          if (nbr->GetIdx() == skip->GetIdx())
  ------------------
  |  Branch (154:15): [True: 589k, False: 28.9k]
  ------------------
  155|   589k|            continue;
  156|       |          // skip visited atoms
  157|  28.9k|          if (fragment.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (157:15): [True: 15.4k, False: 13.5k]
  ------------------
  158|  15.4k|            continue;
  159|  13.5k|          if (!mask.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (159:15): [True: 2.39k, False: 11.1k]
  ------------------
  160|  2.39k|            continue;
  161|       |          // add the neighbor atom to the fragment
  162|  11.1k|          fragment.SetBitOn(nbr->GetIdx());
  163|       |          // recurse...
  164|  11.1k|          addNbrs(fragment, &*nbr, skip, mask);
  165|  11.1k|        }
  166|   600k|      }
_ZN9OpenBabel19CanonicalLabelsImpl19CalcCanonicalLabelsEPNS_5OBMolERKNSt3__16vectorIjNS3_9allocatorIjEEEERS7_RKNS4_INS_12OBStereoUnitENS5_ISB_EEEERKNS_8OBBitVecEPNS_14OBStereoFacadeEib:
 1558|   242k|    {
 1559|       |      // Handle some special cases.
 1560|   242k|      if (!mol->NumAtoms())
  ------------------
  |  Branch (1560:11): [True: 0, False: 242k]
  ------------------
 1561|      0|        return;
 1562|   242k|      if (mol->NumAtoms() == 1) {
  ------------------
  |  Branch (1562:11): [True: 141k, False: 101k]
  ------------------
 1563|   141k|        canonical_labels.resize(1, 1);
 1564|   141k|        return;
 1565|   141k|      }
 1566|       |
 1567|       |      // Set all labels to 0.
 1568|   101k|      canonical_labels.clear();
 1569|   101k|      canonical_labels.resize(mol->NumAtoms(), 0);
 1570|       |
 1571|   101k|      std::vector<OBBond*> metalloceneBonds;
 1572|   101k|      findMetalloceneBonds(metalloceneBonds, mol, symmetry_classes);
 1573|       |
 1574|       |      // Find the (dis)connected fragments.
 1575|   101k|      OBBitVec visited;
 1576|   101k|      std::vector<OBBitVec> fragments;
 1577|   764k|      for (std::size_t i = 0; i < mol->NumAtoms(); ++i) {
  ------------------
  |  Branch (1577:31): [True: 663k, False: 101k]
  ------------------
 1578|   663k|        if (!mask.BitIsSet(i+1) || visited.BitIsSet(i+1))
  ------------------
  |  Branch (1578:13): [True: 207k, False: 455k]
  |  Branch (1578:36): [True: 353k, False: 102k]
  ------------------
 1579|   561k|          continue;
 1580|   102k|        fragments.push_back(getFragment(mol->GetAtom(i+1), mask, metalloceneBonds));
 1581|   102k|        visited |= fragments.back();
 1582|   102k|      }
 1583|       |
 1584|       |      // Pre-compute the stereo center information. (See StereoCenter)
 1585|   101k|      std::vector<StereoCenter> stereoCenters;
 1586|   101k|      if (stereoFacade) {
  ------------------
  |  Branch (1586:11): [True: 5.16k, False: 96.7k]
  ------------------
 1587|  49.8k|        for (std::size_t i = 0; i < stereoUnits.size(); ++i) {
  ------------------
  |  Branch (1587:33): [True: 44.7k, False: 5.16k]
  ------------------
 1588|  44.7k|          const OBStereoUnit &unit = stereoUnits[i];
 1589|       |
 1590|  44.7k|          if (unit.type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1590:15): [True: 14.1k, False: 30.5k]
  ------------------
 1591|  14.1k|            OBAtom *atom = mol->GetAtomById(unit.id);
 1592|  14.1k|            if (!atom)
  ------------------
  |  Branch (1592:17): [True: 0, False: 14.1k]
  ------------------
 1593|      0|              continue;
 1594|       |            // Add the StereoCenter indexes.
 1595|  14.1k|            stereoCenters.resize(stereoCenters.size()+1);
 1596|  14.1k|            stereoCenters.back().indexes.push_back(atom->GetIndex());
 1597|       |
 1598|  14.1k|            if (!stereoFacade->HasTetrahedralStereo(unit.id))
  ------------------
  |  Branch (1598:17): [True: 1, False: 14.1k]
  ------------------
 1599|      1|              continue;
 1600|  14.1k|            OBTetrahedralStereo::Config config = stereoFacade->GetTetrahedralStereo(unit.id)->GetConfig();
 1601|  14.1k|            if (!config.specified)
  ------------------
  |  Branch (1601:17): [True: 8.58k, False: 5.55k]
  ------------------
 1602|  8.58k|              continue;
 1603|       |
 1604|       |            // Add the neighbor atom indexes.
 1605|  5.55k|            OBAtom *from = mol->GetAtomById(config.from);
 1606|  5.55k|            if (from && from->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (1606:17): [True: 5.55k, False: 0]
  |  Branch (1606:25): [True: 5.54k, False: 9]
  ------------------
 1607|  5.54k|              stereoCenters.back().nbrIndexes1.push_back(from->GetIndex());
 1608|      9|            else
 1609|      9|              stereoCenters.back().nbrIndexes1.push_back(std::numeric_limits<unsigned int>::max());
 1610|  22.2k|            for (std::size_t j = 0; j < config.refs.size(); ++j) {
  ------------------
  |  Branch (1610:37): [True: 16.6k, False: 5.55k]
  ------------------
 1611|  16.6k|              OBAtom *ref = mol->GetAtomById(config.refs[j]);
 1612|  16.6k|              if (ref && ref->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (1612:19): [True: 14.0k, False: 2.63k]
  |  Branch (1612:26): [True: 13.9k, False: 48]
  ------------------
 1613|  13.9k|                stereoCenters.back().nbrIndexes1.push_back(ref->GetIndex());
 1614|  2.67k|              else
 1615|  2.67k|                stereoCenters.back().nbrIndexes1.push_back(std::numeric_limits<unsigned int>::max());
 1616|  16.6k|            }
 1617|  30.5k|          } else if (unit.type == OBStereo::CisTrans) {
  ------------------
  |  Branch (1617:22): [True: 30.5k, False: 0]
  ------------------
 1618|  30.5k|            OBBond *bond = mol->GetBondById(unit.id);
 1619|  30.5k|            if (!bond || bond->IsAromatic())
  ------------------
  |  Branch (1619:17): [True: 0, False: 30.5k]
  |  Branch (1619:26): [True: 0, False: 30.5k]
  ------------------
 1620|      0|              continue;
 1621|  30.5k|            OBAtom *begin = bond->GetBeginAtom();
 1622|  30.5k|            OBAtom *end = bond->GetEndAtom();
 1623|  30.5k|            if (!begin || !end)
  ------------------
  |  Branch (1623:17): [True: 0, False: 30.5k]
  |  Branch (1623:27): [True: 0, False: 30.5k]
  ------------------
 1624|      0|              continue;
 1625|       |            // Add the StereoCenter indexes.
 1626|  30.5k|            stereoCenters.resize(stereoCenters.size()+1);
 1627|  30.5k|            stereoCenters.back().indexes.push_back(begin->GetIndex());
 1628|  30.5k|            stereoCenters.back().indexes.push_back(end->GetIndex());
 1629|       |
 1630|  30.5k|            if (!stereoFacade->HasCisTransStereo(unit.id))
  ------------------
  |  Branch (1630:17): [True: 39, False: 30.5k]
  ------------------
 1631|     39|              continue;
 1632|  30.5k|            OBCisTransStereo::Config config = stereoFacade->GetCisTransStereo(unit.id)->GetConfig();
 1633|  30.5k|            if (!config.specified)
  ------------------
  |  Branch (1633:17): [True: 21.7k, False: 8.85k]
  ------------------
 1634|  21.7k|              continue;
 1635|       |
 1636|       |            // Add the neighbor atom indexes.
 1637|  44.2k|            for (std::size_t j = 0; j < config.refs.size(); ++j) {
  ------------------
  |  Branch (1637:37): [True: 35.4k, False: 8.85k]
  ------------------
 1638|  35.4k|              OBAtom *ref = mol->GetAtomById(config.refs[j]);
 1639|  35.4k|              unsigned int r = (ref && ref->GetAtomicNum() != OBElements::Hydrogen) ? ref->GetIndex() : std::numeric_limits<unsigned int>::max();
  ------------------
  |  Branch (1639:33): [True: 24.4k, False: 10.9k]
  |  Branch (1639:40): [True: 20.9k, False: 3.53k]
  ------------------
 1640|  35.4k|              if (stereoCenters.back().nbrIndexes1.size() < 2)
  ------------------
  |  Branch (1640:19): [True: 17.7k, False: 17.7k]
  ------------------
 1641|  17.7k|                stereoCenters.back().nbrIndexes1.push_back(r);
 1642|  17.7k|              else
 1643|  17.7k|                stereoCenters.back().nbrIndexes2.push_back(r);
 1644|  35.4k|            }
 1645|  8.85k|          }
 1646|  44.7k|        }
 1647|  5.16k|      }
 1648|       |
 1649|       |      // Find the canonical code for each fragment.
 1650|   101k|      std::vector<CanonicalLabelsImpl::FullCode> fcodes;
 1651|   203k|      for (std::size_t f = 0; f < fragments.size(); ++f) {
  ------------------
  |  Branch (1651:31): [True: 102k, False: 101k]
  ------------------
 1652|   102k|        const OBBitVec &fragment = fragments[f];
 1653|       |
 1654|       |        // Select the first atom.
 1655|   102k|        std::vector<OBAtom*> startAtoms = findStartAtoms(mol, fragment, symmetry_classes);
 1656|       |
 1657|   102k|        CanonicalLabelsImpl::Timeout timeout(maxSeconds);
 1658|   102k|        CanonicalLabelsImpl::FullCode bestCode;
 1659|   102k|        std::vector<CanonicalLabelsImpl::FullCode> identityCodes;
 1660|   102k|        Orbits orbits;
 1661|   102k|        OBBitVec mcr;
 1662|       |
 1663|   247k|        for (std::size_t i = 0; i < startAtoms.size(); ++i) {
  ------------------
  |  Branch (1663:33): [True: 145k, False: 102k]
  ------------------
 1664|   145k|          OBAtom *atom = startAtoms[i];
 1665|       |
 1666|       |          // Start labeling of the fragment.
 1667|   145k|          State state(symmetry_classes, fragment, stereoCenters, identityCodes, orbits, mcr, onlyOne);
 1668|       |          //if (!state.mcr.BitIsSet(atom->GetIdx()) && atom->IsInRing())
 1669|       |          //  continue;
 1670|       |
 1671|   145k|          state.code.add(atom);
 1672|   145k|          state.code.labels[atom->GetIndex()] = 1;
 1673|   145k|          CanonicalLabelsRecursive(atom, 1, timeout, bestCode, state);
 1674|   145k|        }
 1675|       |
 1676|       |        // Throw an error if the timeout is exceeded.
 1677|   102k|        if (timeout.isExpired()) {
  ------------------
  |  Branch (1677:13): [True: 21, False: 102k]
  ------------------
 1678|     21|          obErrorLog.ThrowError(__FUNCTION__, "canonical labeling aborted (time or recursion-depth limit exceeded)...", obError);
 1679|     21|        }
 1680|       |
 1681|       |        // Store the canonical code for the fragment.
 1682|   102k|        fcodes.push_back(bestCode);
 1683|   102k|      }
 1684|       |
 1685|       |      // Sort the codes for the fragments.
 1686|   101k|      std::sort(fcodes.begin(), fcodes.end(), SortCode);
 1687|       |
 1688|       |      // Construct the full labeling from the sorted fragment labels.
 1689|   101k|      unsigned int offset = 0;
 1690|   203k|      for (std::size_t f = 0; f < fcodes.size(); ++f) {
  ------------------
  |  Branch (1690:31): [True: 102k, False: 101k]
  ------------------
 1691|       |        //print_vector("CODE", fcodes[f].code);
 1692|       |        //print_vector("code_labels", fcodes[f].labels);
 1693|   102k|        if (fcodes[f].labels.size() == 0)
  ------------------
  |  Branch (1693:13): [True: 18, False: 102k]
  ------------------
 1694|     18|          continue; // defensive programming
 1695|       |
 1696|   102k|        unsigned int max_label = 0;
 1697|   761k|        for (std::size_t i = 0; i < mol->NumAtoms(); ++i) {
  ------------------
  |  Branch (1697:33): [True: 659k, False: 102k]
  ------------------
 1698|   659k|          if (fcodes[f].labels[i]) {
  ------------------
  |  Branch (1698:15): [True: 449k, False: 210k]
  ------------------
 1699|   449k|            canonical_labels[i] = fcodes[f].labels[i] + offset;
 1700|   449k|            max_label = std::max(max_label, canonical_labels[i]);
 1701|   449k|          }
 1702|   659k|        }
 1703|   102k|        offset = max_label;
 1704|   102k|      }
 1705|       |
 1706|   101k|    }
_ZN9OpenBabel19CanonicalLabelsImpl14findStartAtomsEPNS_5OBMolERKNS_8OBBitVecERKNSt3__16vectorIjNS6_9allocatorIjEEEE:
 1512|   102k|    {
 1513|       |      // find the a symmetry class in the fragment using criteria
 1514|   102k|      std::vector<unsigned int> ranks;
 1515|   767k|      for (std::size_t i = 0; i < mol->NumAtoms(); ++i) {
  ------------------
  |  Branch (1515:31): [True: 665k, False: 102k]
  ------------------
 1516|   665k|        if (!fragment.BitIsSet(i+1))
  ------------------
  |  Branch (1516:13): [True: 210k, False: 455k]
  ------------------
 1517|   210k|          continue;
 1518|       |
 1519|   455k|        OBAtom *atom = mol->GetAtom(i+1);
 1520|   455k|        unsigned int rank = 10000 * symmetry_classes[i]  +
 1521|   455k|                             1000 * atom->GetSpinMultiplicity() +
 1522|   455k|                               10 * (atom->GetFormalCharge() + 7) +
 1523|   455k|                                    TotalHydrogenCount(atom);
 1524|       |
 1525|   455k|        ranks.push_back(rank);
 1526|   455k|      }
 1527|       |
 1528|   102k|      unsigned int lowestRank = *std::min_element(ranks.begin(), ranks.end());
 1529|       |
 1530|   102k|      std::vector<OBAtom*> result;
 1531|   767k|      for (std::size_t i = 0; i < mol->NumAtoms(); ++i) {
  ------------------
  |  Branch (1531:31): [True: 665k, False: 102k]
  ------------------
 1532|   665k|        if (!fragment.BitIsSet(i+1))
  ------------------
  |  Branch (1532:13): [True: 210k, False: 455k]
  ------------------
 1533|   210k|          continue;
 1534|       |
 1535|   455k|        OBAtom *atom = mol->GetAtom(i+1);
 1536|   455k|        unsigned int rank = 10000 * symmetry_classes[i]  +
 1537|   455k|                             1000 * atom->GetSpinMultiplicity() +
 1538|   455k|                               10 * (atom->GetFormalCharge() + 7) +
 1539|   455k|                                    TotalHydrogenCount(atom);
 1540|       |
 1541|   455k|        if (rank == lowestRank)
  ------------------
  |  Branch (1541:13): [True: 145k, False: 310k]
  ------------------
 1542|   145k|          result.push_back(atom);
 1543|   455k|      }
 1544|       |
 1545|   102k|      return result;
 1546|   102k|    }
canon.cpp:_ZN9OpenBabelL18TotalHydrogenCountEPNS_6OBAtomE:
  101|  49.0M|  {
  102|  49.0M|    return atom->ExplicitHydrogenCount() + atom->GetImplicitHCount();
  103|  49.0M|  }
_ZN9OpenBabel19CanonicalLabelsImpl7TimeoutC2El:
  775|   102k|      Timeout(time_t _maxTime) : maxTime(_maxTime), expired(false)
  776|   102k|      {
  777|   102k|        startTime = time(nullptr);
  778|   102k|      }
_ZN9OpenBabel19CanonicalLabelsImpl8FullCodeC2Ev:
  496|  4.63M|      {
  497|  4.63M|      }
_ZN9OpenBabel19CanonicalLabelsImpl5StateC2ERKNSt3__16vectorIjNS2_9allocatorIjEEEERKNS_8OBBitVecERNS3_INS0_12StereoCenterENS4_ISC_EEEERNS3_INS0_8FullCodeENS4_ISG_EEEERNS3_INS3_IPNS_6OBAtomENS4_ISL_EEEENS4_ISN_EEEERS9_b:
  733|   145k|            bool _onlyOne) : symmetry_classes(_symmetry_classes), fragment(_fragment),
  734|   145k|          onlyOne(_onlyOne), stereoCenters(_stereoCenters),
  735|   145k|          code(_symmetry_classes.size()), identityCodes(_identityCodes),
  736|   145k|          backtrackDepth(0), orbits(_orbits), mcr(_mcr)
  737|   145k|      {
  738|   145k|        mcr.Clear();
  739|   145k|        if (mcr.IsEmpty())
  ------------------
  |  Branch (739:13): [True: 145k, False: 0]
  ------------------
  740|  1.53M|          for (std::size_t i = 0; i < symmetry_classes.size(); ++i)
  ------------------
  |  Branch (740:35): [True: 1.39M, False: 145k]
  ------------------
  741|  1.39M|            mcr.SetBitOn(i+1);
  742|   145k|      }
_ZN9OpenBabel19CanonicalLabelsImpl11PartialCodeC2Em:
  560|   145k|      {
  561|   145k|        labels.resize(numAtoms, 0);
  562|   145k|      }
_ZN9OpenBabel19CanonicalLabelsImpl11PartialCode3addEPNS_6OBAtomE:
  567|   145k|      inline void add(OBAtom *atom) { atoms.push_back(atom); }
_ZN9OpenBabel19CanonicalLabelsImpl24CanonicalLabelsRecursiveEPNS_6OBAtomEjRNS0_7TimeoutERNS0_8FullCodeERNS0_5StateE:
 1228|  69.8M|    {
 1229|       |      // Bail out before the call stack overflows on pathological inputs.
 1230|       |      // Setting expired routes the unwind through the existing isExpired()
 1231|       |      // checks (see MAX_CANON_RECURSION_DEPTH).
 1232|  69.8M|      RecursionDepthGuard depthGuard(timeout);
 1233|  69.8M|      if (timeout.depth > MAX_CANON_RECURSION_DEPTH) {
  ------------------
  |  |   78|  69.8M|#define MAX_CANON_RECURSION_DEPTH 3000
  ------------------
  |  Branch (1233:11): [True: 2, False: 69.8M]
  ------------------
 1234|      2|        timeout.expired = true;
 1235|      2|        return;
 1236|      2|      }
 1237|       |
 1238|       |      // Bail out early on timeout. Checked here, at the top, so the unwind
 1239|       |      // is fast even when most recursive frames hit the "full mapping"
 1240|       |      // path below (which can be expensive on pathological molecules).
 1241|  69.8M|      if (timeout.isExpired())
  ------------------
  |  Branch (1241:11): [True: 70.7k, False: 69.7M]
  ------------------
 1242|  70.7k|        return;
 1243|       |
 1244|  69.7M|      OBMol *mol = current->GetParent();
 1245|  69.7M|      PartialCode &code = state.code;
 1246|       |
 1247|  69.7M|      if (state.backtrackDepth) {
  ------------------
  |  Branch (1247:11): [True: 53.3M, False: 16.4M]
  ------------------
 1248|       |        //std::cout << "backtrackDepth = " << state.backtrackDepth << std::endl;
 1249|       |
 1250|  53.3M|        if (code.atoms.size() > state.backtrackDepth) {
  ------------------
  |  Branch (1250:13): [True: 53.3M, False: 0]
  ------------------
 1251|       |          //std::cout << "BACKTRACKING" << std::endl;
 1252|  53.3M|          return;
 1253|  53.3M|        }
 1254|      0|        if (code.atoms.size() == state.backtrackDepth) {
  ------------------
  |  Branch (1254:13): [True: 0, False: 0]
  ------------------
 1255|       |          //std::cout << "BACKTRACK DONE 1" << std::endl;
 1256|      0|          state.backtrackDepth = 0;
 1257|      0|          return;
 1258|      0|        } else
 1259|      0|        if (code.atoms.size() < state.backtrackDepth) {
  ------------------
  |  Branch (1259:13): [True: 0, False: 0]
  ------------------
 1260|       |          //std::cout << "BACKTRACK DONE 2" << std::endl;
 1261|      0|          state.backtrackDepth = 0;
 1262|      0|        }
 1263|      0|      }
 1264|       |
 1265|       |
 1266|       |      // Check if there is a full mapping.
 1267|  16.4M|      if (label == state.fragment.CountBits()) {
  ------------------
  |  Branch (1267:11): [True: 3.79M, False: 12.6M]
  ------------------
 1268|       |        // Complete the canonical code.
 1269|  3.79M|        FullCode fullcode;
 1270|  3.79M|        CompleteCode(mol, fullcode, state);
 1271|       |
 1272|       |        //print_vector("TERMINAL", fullcode.code);
 1273|       |
 1274|       |        // Check previously found codes to find redundant subtrees.
 1275|  5.35M|        for (std::size_t i = state.identityCodes.size(); i > 0; --i)
  ------------------
  |  Branch (1275:58): [True: 5.18M, False: 172k]
  ------------------
 1276|  5.18M|          if (fullcode.code == state.identityCodes[i-1].code) {
  ------------------
  |  Branch (1276:15): [True: 3.62M, False: 1.56M]
  ------------------
 1277|       |            //
 1278|       |            // An explicit automorphism has been found.
 1279|       |            //
 1280|  3.62M|            std::vector<unsigned int> v1(fullcode.labels.size(), 0);
 1281|  61.0M|            for (std::size_t j = 0; j < fullcode.labels.size(); ++j)
  ------------------
  |  Branch (1281:37): [True: 57.4M, False: 3.62M]
  ------------------
 1282|  57.4M|              if (fullcode.labels[j])
  ------------------
  |  Branch (1282:19): [True: 46.4M, False: 11.0M]
  ------------------
 1283|  46.4M|                v1[fullcode.labels[j]-1] = j + 1;
 1284|       |
 1285|  3.62M|            std::vector<unsigned int> v2(state.identityCodes[i-1].labels.size(), 0);
 1286|  61.0M|            for (std::size_t j = 0; j < state.identityCodes[i-1].labels.size(); ++j)
  ------------------
  |  Branch (1286:37): [True: 57.4M, False: 3.62M]
  ------------------
 1287|  57.4M|              if (state.identityCodes[i-1].labels[j])
  ------------------
  |  Branch (1287:19): [True: 46.4M, False: 11.0M]
  ------------------
 1288|  46.4M|                v2[state.identityCodes[i-1].labels[j]-1] = j + 1;
 1289|       |
 1290|  3.62M|            state.backtrackDepth = 0;
 1291|  13.4M|            for (std::size_t j = 0; j < v1.size(); ++j) {
  ------------------
  |  Branch (1291:37): [True: 13.4M, False: 0]
  ------------------
 1292|  13.4M|              if (v1[j] != v2[j]) {
  ------------------
  |  Branch (1292:19): [True: 3.62M, False: 9.79M]
  ------------------
 1293|       |                // Yield backtrackDepth.
 1294|  3.62M|                return;
 1295|  3.62M|              }
 1296|       |
 1297|  9.79M|              if (v1[j])
  ------------------
  |  Branch (1297:19): [True: 9.79M, False: 0]
  ------------------
 1298|  9.79M|                state.backtrackDepth++;
 1299|  9.79M|            }
 1300|  3.62M|          }
 1301|       |
 1302|   172k|        if (fullcode.code == bestCode.code) {
  ------------------
  |  Branch (1302:13): [True: 42.4k, False: 129k]
  ------------------
 1303|  42.4k|          UpdateMcr(state.mcr, state.orbits, bestCode.labels);
 1304|  42.4k|          FindOrbits(state.orbits, mol, fullcode.labels, bestCode.labels);
 1305|   129k|        } else if (fullcode > bestCode) {
  ------------------
  |  Branch (1305:20): [True: 104k, False: 25.5k]
  ------------------
 1306|       |          // if fullcode is greater than bestCode, we have found a new greatest code
 1307|   104k|          bestCode = fullcode;
 1308|   104k|        }
 1309|       |
 1310|       |
 1311|   172k|        if (state.identityCodes.size() < MAX_IDENTITY_NODES) {
  ------------------
  |  |   44|   172k|#define MAX_IDENTITY_NODES 50
  ------------------
  |  Branch (1311:13): [True: 152k, False: 19.1k]
  ------------------
 1312|   152k|          state.identityCodes.push_back(FullCode());
 1313|   152k|          state.identityCodes.back().labels.swap(fullcode.labels);
 1314|   152k|          state.identityCodes.back().code.swap(fullcode.code);
 1315|   152k|        } else {
 1316|  19.1k|          state.identityCodes[MAX_IDENTITY_NODES-1].labels.swap(fullcode.labels);
  ------------------
  |  |   44|  19.1k|#define MAX_IDENTITY_NODES 50
  ------------------
 1317|  19.1k|          state.identityCodes[MAX_IDENTITY_NODES-1].code.swap(fullcode.code);
  ------------------
  |  |   44|  19.1k|#define MAX_IDENTITY_NODES 50
  ------------------
 1318|  19.1k|        }
 1319|       |
 1320|       |
 1321|   172k|        return;
 1322|  3.79M|      }
 1323|       |
 1324|       |      // Avoid endless loops.
 1325|  12.6M|      if (timeout.isExpired()) {
  ------------------
  |  Branch (1325:11): [True: 0, False: 12.6M]
  ------------------
 1326|      0|        return;
 1327|      0|      }
 1328|       |
 1329|       |      // If there is a bestCode and only one labeling is required, return.
 1330|  12.6M|      if (state.onlyOne && !bestCode.code.empty())
  ------------------
  |  Branch (1330:11): [True: 0, False: 12.6M]
  |  Branch (1330:28): [True: 0, False: 0]
  ------------------
 1331|      0|        return;
 1332|       |
 1333|       |      // Abort early if this will not lead to a greatest canonical code. The
 1334|       |      // code.from vector is compared with the elements in the bestCode.
 1335|  12.6M|      if (code < bestCode)
  ------------------
  |  Branch (1335:11): [True: 66, False: 12.6M]
  ------------------
 1336|     66|        return;
 1337|       |
 1338|       |      // Find the neighbors of the current atom to assign the next label(s).
 1339|  12.6M|      std::vector<OBAtom*> nbrs;
 1340|  12.6M|      std::vector<unsigned int> nbrSymClasses;
 1341|       |
 1342|  82.6M|      FOR_NBORS_OF_ATOM (nbr, current) {
  ------------------
  |  |  419|  12.6M|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 82.6M, False: 12.6M]
  |  |  ------------------
  ------------------
 1343|       |        // Skip atoms not in the fragment.
 1344|  82.6M|        if (!state.fragment.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (1344:13): [True: 406k, False: 82.2M]
  ------------------
 1345|   406k|          continue;
 1346|       |        // Skip already labeled atoms.
 1347|  82.2M|        if (code.labels[nbr->GetIndex()])
  ------------------
  |  Branch (1347:13): [True: 75.6M, False: 6.62M]
  ------------------
 1348|  75.6M|          continue;
 1349|       |
 1350|  6.62M|        OBBond *bond = mol->GetBond(current, &*nbr);
 1351|       |        // Ugly, but it helps...                                        // <--- not documented! need better approach to handle this (not only ferrocene)...
 1352|  6.62M|        if (!isFerroceneBond(bond)) {
  ------------------
  |  Branch (1352:13): [True: 6.62M, False: 0]
  ------------------
 1353|  6.62M|          nbrSymClasses.push_back(state.symmetry_classes[nbr->GetIndex()]);
 1354|  6.62M|          nbrs.push_back(&*nbr);
 1355|  6.62M|        }
 1356|  6.62M|      }
 1357|       |
 1358|  12.6M|      if (nbrs.empty()) {
  ------------------
  |  Branch (1358:11): [True: 10.0M, False: 2.61M]
  ------------------
 1359|       |        // If there are no neighbor atoms to label, recurse with the next
 1360|       |        // current atom.
 1361|  10.0M|        unsigned int nextLabel = code.labels[current->GetIndex()] + 1;
 1362|   143M|        for (std::size_t i = 0; i < code.labels.size(); ++i) {
  ------------------
  |  Branch (1362:33): [True: 143M, False: 0]
  ------------------
 1363|   143M|          if (code.labels[i] == nextLabel) {
  ------------------
  |  Branch (1363:15): [True: 10.0M, False: 133M]
  ------------------
 1364|  10.0M|            CanonicalLabelsRecursive(mol->GetAtom(i+1), label, timeout, bestCode, state);
 1365|  10.0M|            return;
 1366|  10.0M|          }
 1367|   143M|        }
 1368|      0|        return;
 1369|  10.0M|      }
 1370|       |
 1371|  2.61M|      if (!current->IsInRing()) {
  ------------------
  |  Branch (1371:11): [True: 229k, False: 2.38M]
  ------------------
 1372|       |        // Optimization to avoid generating the n! permutations. If the current
 1373|       |        // atom is not in a ring, the neighbor atoms with the same symmetry
 1374|       |        // are not connected and it is possible to label without considering
 1375|       |        // the rest of the molecule. The found ligand labels can be sorted and
 1376|       |        // the labels can be calculated using offsets.
 1377|       |        //
 1378|       |        // This modifies the final canonical code since it produces a different
 1379|       |        // canonical order but although different, the code is still canonical.
 1380|   229k|        LabelFragments(current, nbrs, label, timeout, bestCode, state);
 1381|  2.38M|      } else {
 1382|       |        // Create all possible labelings for the neighbors.
 1383|       |        //
 1384|       |        // Example: The current atom has 4 neighbors to label.
 1385|       |        //
 1386|       |        // neighbor atom   : 1 2 3 4
 1387|       |        // symmetry classes: 3 2 2 1
 1388|       |        //
 1389|       |        // The first neighbor with symmetry class 3 is added to allOrderedNbrs.
 1390|       |        //
 1391|       |        // allOrderedNbrs = [ [1] ]
 1392|       |        //
 1393|       |        // The two neighbor atoms with symmetry class 2 are added next. All
 1394|       |        // permutations are added (2 in this case).
 1395|       |        //
 1396|       |        // allOrderedNbrs = [ [1,2,3], [1,3,2] ]
 1397|       |        //
 1398|       |        // The last atom is similar to the first one.
 1399|       |        //
 1400|       |        // allOrderedNbrs = [ [1,2,3,4], [1,3,2,4] ]
 1401|       |        //
 1402|       |        // Note: If there are atoms with a large number of neighbor atoms
 1403|       |        // with the same symmetry class (n), this can result in a large number
 1404|       |        // of permutations (n!).
 1405|  2.38M|        std::vector<std::vector<OBAtom*> > allOrderedNbrs(1);
 1406|  5.02M|        while (!nbrs.empty()) {
  ------------------
  |  Branch (1406:16): [True: 2.63M, False: 2.38M]
  ------------------
 1407|       |
 1408|       |          // Select the next nbr atoms with highest symmetry classes.
 1409|  2.63M|          unsigned int maxSymClass = *std::min_element(nbrSymClasses.begin(), nbrSymClasses.end());
 1410|  2.63M|          std::vector<OBAtom*> finalNbrs;
 1411|  8.91M|          for (std::size_t i = 0; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (1411:35): [True: 6.27M, False: 2.63M]
  ------------------
 1412|  6.27M|            if (nbrSymClasses[i] == maxSymClass)
  ------------------
  |  Branch (1412:17): [True: 5.81M, False: 465k]
  ------------------
 1413|  5.81M|              finalNbrs.push_back(nbrs[i]);
 1414|  6.27M|          }
 1415|       |
 1416|       |          // Remove the selected atoms from nbrs and nbrSymClasses (this could be made more efficient)
 1417|  8.45M|          for (std::size_t i = 0; i < finalNbrs.size(); ++i) {
  ------------------
  |  Branch (1417:35): [True: 5.81M, False: 2.63M]
  ------------------
 1418|  5.81M|            nbrs.erase(std::find(nbrs.begin(), nbrs.end(), finalNbrs[i]));
 1419|  5.81M|            nbrSymClasses.erase(std::find(nbrSymClasses.begin(), nbrSymClasses.end(), maxSymClass));
 1420|  5.81M|          }
 1421|       |
 1422|       |
 1423|  2.63M|          if (finalNbrs.size() == 1) {
  ------------------
  |  Branch (1423:15): [True: 1.11M, False: 1.52M]
  ------------------
 1424|       |            // If there is only one atom with the same symmetry class, label it
 1425|       |            // and select the next group of neighbor atoms with the same symmetry
 1426|       |            // class.
 1427|  4.56M|            for (std::size_t i = 0; i < allOrderedNbrs.size(); ++i)
  ------------------
  |  Branch (1427:37): [True: 3.44M, False: 1.11M]
  ------------------
 1428|  3.44M|              allOrderedNbrs[i].push_back(finalNbrs[0]);
 1429|  1.52M|          } else {
 1430|       |            // Sort the atoms lexicographically.
 1431|  1.52M|            std::sort(finalNbrs.begin(), finalNbrs.end());
 1432|       |
 1433|       |            // Copy the current labelings for the neighbor atoms.
 1434|  1.52M|            std::vector<std::vector<OBAtom*> > allOrderedNbrsCopy(allOrderedNbrs);
 1435|       |
 1436|       |            // Add the first permutation for the neighbor atoms.
 1437|       |//            if (state.mcr.BitIsSet(finalNbrs[0]->GetIdx()))
 1438|  4.49M|              for (std::size_t j = 0; j < allOrderedNbrs.size(); ++j) {
  ------------------
  |  Branch (1438:39): [True: 2.97M, False: 1.52M]
  ------------------
 1439|  12.6M|                for (std::size_t i = 0; i < finalNbrs.size(); ++i) {
  ------------------
  |  Branch (1439:41): [True: 9.68M, False: 2.97M]
  ------------------
 1440|  9.68M|                  allOrderedNbrs[j].push_back(finalNbrs[i]);
 1441|  9.68M|                }
 1442|  2.97M|              }
 1443|       |
 1444|       |            // Cap n! permutations of equivalent neighbors; pathological
 1445|       |            // hypervalent inputs (e.g. 12 identical F on one ring atom)
 1446|       |            // otherwise blow up time and memory.  Reuse the timeout flag to
 1447|       |            // bail out through the normal path.
 1448|  1.52M|            if (finalNbrs.size() > 9) {
  ------------------
  |  Branch (1448:17): [True: 16, False: 1.52M]
  ------------------
 1449|     16|              timeout.expired = true;
 1450|  1.52M|            } else {
 1451|  33.4M|              while (std::next_permutation(finalNbrs.begin(), finalNbrs.end())) {
  ------------------
  |  Branch (1451:22): [True: 31.9M, False: 1.52M]
  ------------------
 1452|  31.9M|                if (state.mcr.BitIsSet(finalNbrs[0]->GetIdx()))
  ------------------
  |  Branch (1452:21): [True: 31.9M, False: 2.19k]
  ------------------
 1453|  88.9M|                  for (std::size_t j = 0; j < allOrderedNbrsCopy.size(); ++j) {
  ------------------
  |  Branch (1453:43): [True: 57.0M, False: 31.9M]
  ------------------
 1454|  57.0M|                    allOrderedNbrs.push_back(allOrderedNbrsCopy[j]);
 1455|   336M|                    for (std::size_t i = 0; i < finalNbrs.size(); ++i)
  ------------------
  |  Branch (1455:45): [True: 279M, False: 57.0M]
  ------------------
 1456|   279M|                      allOrderedNbrs.back().push_back(finalNbrs[i]);
 1457|  57.0M|                  }
 1458|  31.9M|              }
 1459|  1.52M|            }
 1460|       |
 1461|  1.52M|          } // finalNbrs.size() != 1
 1462|  2.63M|        } // while (!nbrs.empty())
 1463|       |
 1464|  2.38M|        if (DEBUG) {
  ------------------
  |  |   42|  2.38M|#define DEBUG 0
  |  |  ------------------
  |  |  |  Branch (42:15): [Folded, False: 2.38M]
  |  |  ------------------
  ------------------
 1465|      0|          cout << "allOrderedNbrs:" << endl;
 1466|      0|          for (std::size_t i = 0; i < allOrderedNbrs.size(); ++i) {
  ------------------
  |  Branch (1466:35): [True: 0, False: 0]
  ------------------
 1467|      0|            for (std::size_t j = 0; j < allOrderedNbrs[i].size(); ++j) {
  ------------------
  |  Branch (1467:37): [True: 0, False: 0]
  ------------------
 1468|      0|              cout << allOrderedNbrs[i][j]->GetIndex() << " ";
 1469|      0|            }
 1470|      0|            cout << endl;
 1471|      0|          }
 1472|      0|        }
 1473|       |
 1474|  61.8M|        for (std::size_t i = 0; i < allOrderedNbrs.size(); ++i) {
  ------------------
  |  Branch (1474:33): [True: 59.4M, False: 2.38M]
  ------------------
 1475|       |          // Convert the order stored in allOrderedNbrs to labels.
 1476|  59.4M|          unsigned int lbl = label;
 1477|   491M|          for (std::size_t j = 0; j < allOrderedNbrs[i].size(); ++j) {
  ------------------
  |  Branch (1477:35): [True: 431M, False: 59.4M]
  ------------------
 1478|   431M|            lbl++;
 1479|   431M|            code.add(current, allOrderedNbrs[i][j]);
 1480|   431M|            code.labels[allOrderedNbrs[i][j]->GetIndex()] = lbl;
 1481|   431M|          }
 1482|       |
 1483|       |          // Recurse...
 1484|  59.4M|          CanonicalLabelsRecursive(current, lbl, timeout, bestCode, state);
 1485|       |
 1486|       |          // Backtrack...
 1487|   491M|          for (std::size_t j = 0; j < allOrderedNbrs[i].size(); ++j) {
  ------------------
  |  Branch (1487:35): [True: 431M, False: 59.4M]
  ------------------
 1488|   431M|            code.atoms.pop_back();
 1489|   431M|            code.bonds.pop_back();
 1490|   431M|            code.from.pop_back();
 1491|   431M|            code.labels[allOrderedNbrs[i][j]->GetIndex()] = 0;
 1492|   431M|          }
 1493|       |
 1494|       |          // Optimization
 1495|  59.4M|          if (state.backtrackDepth) {
  ------------------
  |  Branch (1495:15): [True: 59.1M, False: 263k]
  ------------------
 1496|  59.1M|            if (code.atoms.size() <= state.backtrackDepth) {
  ------------------
  |  Branch (1496:17): [True: 3.62M, False: 55.5M]
  ------------------
 1497|       |              //std::cout << "BACKTRACK DONE 3" << std::endl;
 1498|  3.62M|              state.backtrackDepth = 0;
 1499|  3.62M|            }
 1500|  59.1M|          }
 1501|       |
 1502|  59.4M|        }
 1503|       |
 1504|  2.38M|      } // current->IsInRing()
 1505|       |
 1506|  2.61M|    }
_ZN9OpenBabel19CanonicalLabelsImpl19RecursionDepthGuardC2ERNS0_7TimeoutE:
  800|  69.8M|      RecursionDepthGuard(Timeout &timeout) : m_timeout(timeout) { ++m_timeout.depth; }
_ZN9OpenBabel19CanonicalLabelsImpl12CompleteCodeEPNS_5OBMolERNS0_8FullCodeERNS0_5StateE:
  811|  3.79M|    {
  812|  3.79M|      PartialCode &code = state.code;
  813|       |
  814|       |      // initialize the FullCode object with the found labels and the from code
  815|  3.79M|      fullcode = FullCode(code.labels, code.from);
  816|  3.79M|      unsigned int numClosures = 0;
  817|       |
  818|       |      //
  819|       |      // the RING-CLOSURE list
  820|       |      //
  821|  3.79M|      unsigned int current_label = 1; // the second atom is always labeled from 1
  822|       |      // iterate over all atoms in the order they are labeled
  823|       |      // (this ensures [1 3] < [3 1])
  824|  51.9M|      for (std::size_t j = 0; j < code.atoms.size(); ++j) {
  ------------------
  |  Branch (824:31): [True: 48.1M, False: 3.79M]
  ------------------
  825|  48.1M|        OBAtom *atom = code.atoms[j];
  826|       |        // still need to sort [1 3] and [1 4]
  827|  48.1M|        std::vector<std::pair<OBBond*, unsigned int> > closures;
  828|   363M|        FOR_BONDS_OF_ATOM (bond, atom) {
  ------------------
  |  |  420|  48.1M|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 363M, False: 48.1M]
  |  |  ------------------
  ------------------
  829|       |          // skip atoms not in the fragment
  830|   363M|          if (!state.fragment.BitIsSet(bond->GetNbrAtom(atom)->GetIdx()))
  ------------------
  |  Branch (830:15): [True: 54.5M, False: 308M]
  ------------------
  831|  54.5M|            continue;
  832|       |          // a closure bond is a bond not found while generating the FROM spanning tree.
  833|   308M|          if (std::find(code.bonds.begin(), code.bonds.end(), &*bond) == code.bonds.end()) {
  ------------------
  |  Branch (833:15): [True: 110M, False: 198M]
  ------------------
  834|   110M|            closures.push_back(std::make_pair(&*bond, code.labels[bond->GetNbrAtom(atom)->GetIndex()]));
  835|   110M|          }
  836|   308M|        }
  837|       |
  838|       |        // do the sorting: [1 3] < [1 4]
  839|  48.1M|        std::sort(closures.begin(), closures.end(), CompareBondPairSecond);
  840|       |
  841|   158M|        for (std::size_t k = 0; k < closures.size(); ++k) {
  ------------------
  |  Branch (841:33): [True: 110M, False: 48.1M]
  ------------------
  842|       |          // add the closure bond to the code
  843|   110M|          fullcode.code.push_back(current_label);
  844|   110M|          fullcode.code.push_back(closures[k].second);
  845|       |          // add the bond to the list (needed for BOND-TYPES below)
  846|   110M|          code.add(closures[k].first);
  847|   110M|          numClosures++;
  848|   110M|        }
  849|       |
  850|  48.1M|        current_label++;
  851|  48.1M|      }
  852|       |
  853|       |      // Isotopes are only considered if there are isotopes.
  854|  3.79M|      bool hasIsotope = false;
  855|       |      // Charges are only considered if there is a formal charge.
  856|  3.79M|      bool hasCharge = false;
  857|       |
  858|       |      //
  859|       |      // the ATOM-TYPES list
  860|       |      //
  861|  3.79M|      OBStereoFacade facade(mol);
  862|  51.9M|      for (std::size_t j = 0; j < code.atoms.size(); ++j) {
  ------------------
  |  Branch (862:31): [True: 48.1M, False: 3.79M]
  ------------------
  863|  48.1M|        OBAtom *atom = code.atoms[j];
  864|  48.1M|        if (atom->GetIsotope())
  ------------------
  |  Branch (864:13): [True: 24.7k, False: 48.1M]
  ------------------
  865|  24.7k|          hasIsotope = true;
  866|  48.1M|        if (atom->GetFormalCharge())
  ------------------
  |  Branch (866:13): [True: 1.14M, False: 47.0M]
  ------------------
  867|  1.14M|          hasCharge = true;
  868|       |
  869|       |	      // Include all hydrogens
  870|  48.1M|        int hydrogens_to_include = TotalHydrogenCount(atom);
  871|       |
  872|  48.1M|        unsigned int c = 10000 * atom->GetSpinMultiplicity() +
  873|  48.1M|                          1000 * hydrogens_to_include +
  874|  48.1M|                                 atom->GetAtomicNum();
  875|       |
  876|       |        // add the atomic number to the code
  877|  48.1M|        fullcode.code.push_back(c);
  878|  48.1M|      }
  879|       |
  880|       |      //
  881|       |      // the (optional) ISOTOPES list
  882|       |      //
  883|  3.79M|      if (hasIsotope)
  ------------------
  |  Branch (883:11): [True: 16.6k, False: 3.77M]
  ------------------
  884|   404k|        for (std::size_t j = 0; j < code.atoms.size(); ++j)
  ------------------
  |  Branch (884:33): [True: 388k, False: 16.6k]
  ------------------
  885|   388k|          fullcode.code.push_back(code.atoms[j]->GetIsotope());
  886|       |
  887|       |      //
  888|       |      // the (optional) CHARGES list
  889|       |      //
  890|  3.79M|      if (hasCharge)
  ------------------
  |  Branch (890:11): [True: 202k, False: 3.59M]
  ------------------
  891|  3.30M|        for (std::size_t j = 0; j < code.atoms.size(); ++j)
  ------------------
  |  Branch (891:33): [True: 3.10M, False: 202k]
  ------------------
  892|  3.10M|          fullcode.code.push_back(7 + code.atoms[j]->GetFormalCharge());
  893|       |
  894|       |      //
  895|       |      // the BOND-TYPES list
  896|       |      //
  897|   158M|      for (std::size_t j = 0; j < code.bonds.size(); ++j) {
  ------------------
  |  Branch (897:31): [True: 154M, False: 3.79M]
  ------------------
  898|   154M|        OBBond *bond = code.bonds[j];
  899|   154M|        if (bond->IsAromatic())
  ------------------
  |  Branch (899:13): [True: 1.56k, False: 154M]
  ------------------
  900|  1.56k|          fullcode.code.push_back(5);
  901|   154M|        else
  902|   154M|          fullcode.code.push_back(bond->GetBondOrder());
  903|   154M|      }
  904|       |
  905|       |      // the STEREO flag
  906|  3.79M|      if (state.stereoCenters.size()) {
  ------------------
  |  Branch (906:11): [True: 1.43M, False: 2.36M]
  ------------------
  907|       |        // sort the stereo centers
  908|  1.43M|        std::sort(state.stereoCenters.begin(), state.stereoCenters.end(), SortStereoCenters(code.labels));
  909|       |
  910|  5.52M|        for (std::size_t i = 0; i < state.stereoCenters.size(); ++i) {
  ------------------
  |  Branch (910:33): [True: 4.09M, False: 1.43M]
  ------------------
  911|  4.09M|          bool isInFragment = false;
  912|  8.25M|          for (std::size_t j = 0; j < state.stereoCenters[i].indexes.size(); ++j)
  ------------------
  |  Branch (912:35): [True: 4.16M, False: 4.09M]
  ------------------
  913|  4.16M|            if (state.fragment.BitIsSet(state.stereoCenters[i].indexes[j]+1))
  ------------------
  |  Branch (913:17): [True: 1.98M, False: 2.17M]
  ------------------
  914|  1.98M|              isInFragment = true;
  915|       |          // ignore stereo centers not in this fragment
  916|  4.09M|          if (isInFragment)
  ------------------
  |  Branch (916:15): [True: 1.91M, False: 2.17M]
  ------------------
  917|  1.91M|            fullcode.code.push_back(state.stereoCenters[i].getDescriptor(state.symmetry_classes, code.labels));
  918|  4.09M|        }
  919|  1.43M|      }
  920|       |
  921|       |      // backtrack
  922|   113M|      for (unsigned int i = 0; i < numClosures; ++i)
  ------------------
  |  Branch (922:32): [True: 110M, False: 3.79M]
  ------------------
  923|   110M|        code.bonds.pop_back();
  924|  3.79M|    }
_ZN9OpenBabel19CanonicalLabelsImpl8FullCodeC2ERKNSt3__16vectorIjNS2_9allocatorIjEEEERKNS3_ItNS4_ItEEEE:
  505|  3.79M|          : labels(_labels), code(from)
  506|  3.79M|      {
  507|  3.79M|      }
_ZN9OpenBabel21CompareBondPairSecondERKNSt3__14pairIPNS_6OBBondEjEES6_:
  106|   176M|  {
  107|   176M|    return(a.second < b.second);
  108|   176M|  }
_ZN9OpenBabel19CanonicalLabelsImpl11PartialCode3addEPNS_6OBBondE:
  571|   110M|      inline void add(OBBond *bond) { bonds.push_back(bond); }
_ZNK9OpenBabel19CanonicalLabelsImpl17SortStereoCentersclERKNS0_12StereoCenterES4_:
  674|  3.07M|      {
  675|  3.07M|        return (getLabel(c1) < getLabel(c2));
  676|  3.07M|      }
_ZNK9OpenBabel19CanonicalLabelsImpl17SortStereoCenters8getLabelERKNS0_12StereoCenterE:
  665|  6.14M|      {
  666|  6.14M|        switch (c.indexes.size()) {
  667|   436k|          case 2:
  ------------------
  |  Branch (667:11): [True: 436k, False: 5.70M]
  ------------------
  668|   436k|            return std::min(labels[c.indexes[0]], labels[c.indexes[1]]);
  669|  5.70M|          default:
  ------------------
  |  Branch (669:11): [True: 5.70M, False: 436k]
  ------------------
  670|  5.70M|            return labels[c.indexes[0]];
  671|  6.14M|        }
  672|  6.14M|      }
_ZN9OpenBabel19CanonicalLabelsImpl17SortStereoCentersC2ERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
  663|  1.43M|      SortStereoCenters(const std::vector<unsigned int> &_labels) : labels(_labels) {}
_ZNK9OpenBabel19CanonicalLabelsImpl12StereoCenter13getDescriptorERKNSt3__16vectorIjNS2_9allocatorIjEEEES8_:
  617|  1.91M|      {
  618|       |        // Unspecified stereo centers have their own descriptor.
  619|  1.91M|        if (nbrIndexes1.empty())
  ------------------
  |  Branch (619:13): [True: 39.2k, False: 1.87M]
  ------------------
  620|  39.2k|          return 2;
  621|  1.87M|        std::vector<unsigned long> refs1, refs2;
  622|  9.29M|        for (std::size_t i = 0; i < nbrIndexes1.size(); ++i) {
  ------------------
  |  Branch (622:33): [True: 7.41M, False: 1.87M]
  ------------------
  623|  7.41M|          if (nbrIndexes1[i] < labels.size())
  ------------------
  |  Branch (623:15): [True: 7.19M, False: 219k]
  ------------------
  624|  7.19M|            refs1.push_back(labels[nbrIndexes1[i]]);
  625|   219k|          else
  626|   219k|            refs1.push_back(nbrIndexes1[i]);
  627|  7.41M|        }
  628|  1.96M|        for (std::size_t i = 0; i < nbrIndexes2.size(); ++i)
  ------------------
  |  Branch (628:33): [True: 88.0k, False: 1.87M]
  ------------------
  629|  88.0k|          if (nbrIndexes2[i] < labels.size())
  ------------------
  |  Branch (629:15): [True: 46.8k, False: 41.1k]
  ------------------
  630|  46.8k|            refs2.push_back(labels[nbrIndexes2[i]]);
  631|  41.1k|          else
  632|  41.1k|            refs2.push_back(nbrIndexes2[i]);
  633|  1.87M|        if (indexes.size() == 2) {
  ------------------
  |  Branch (633:13): [True: 44.0k, False: 1.83M]
  ------------------
  634|  44.0k|          bool symOrder = symmetry_classes[indexes[0]] < symmetry_classes[indexes[1]];
  635|  44.0k|          bool canOrder = labels[indexes[0]] < labels[indexes[1]];
  636|  44.0k|          if (symOrder != canOrder && symmetry_classes[indexes[0]] != symmetry_classes[indexes[1]])
  ------------------
  |  Branch (636:15): [True: 38.5k, False: 5.44k]
  |  Branch (636:39): [True: 37.7k, False: 802]
  ------------------
  637|  37.7k|            std::swap(refs1[0], refs1[1]);
  638|  44.0k|        }
  639|  1.87M|        return ((OBStereo::NumInversions(refs1) % 2 + OBStereo::NumInversions(refs2) % 2) % 2);
  640|  1.91M|      }
_ZN9OpenBabel19CanonicalLabelsImpl9UpdateMcrERNS_8OBBitVecERNSt3__16vectorINS4_IPNS_6OBAtomENS3_9allocatorIS6_EEEENS7_IS9_EEEERKNS4_IjNS7_IjEEEE:
 1203|  42.4k|    {
 1204|       |      //print_orbits("UpdateMcr", orbits);
 1205|       |
 1206|   741k|      for (std::size_t i = 0; i < bestLabels.size(); ++i)
  ------------------
  |  Branch (1206:31): [True: 699k, False: 42.4k]
  ------------------
 1207|   699k|        mcr.SetBitOn(i+1);
 1208|       |
 1209|  42.4k|      for (std::size_t j = 0; j < orbits.size(); ++j) {
  ------------------
  |  Branch (1209:31): [True: 67, False: 42.4k]
  ------------------
 1210|     67|        std::sort(orbits[j].begin(), orbits[j].end(), SortAtomsAscending(bestLabels));
 1211|       |
 1212|    243|        for (std::size_t k = 0; k < orbits[j].size(); ++k)
  ------------------
  |  Branch (1212:33): [True: 176, False: 67]
  ------------------
 1213|    176|          if (k)
  ------------------
  |  Branch (1213:15): [True: 109, False: 67]
  ------------------
 1214|    109|            mcr.SetBitOff(orbits[j][k]->GetIdx());
 1215|     67|      }
 1216|  42.4k|    }
_ZNK9OpenBabel19CanonicalLabelsImpl18SortAtomsAscendingclEPKNS_6OBAtomES4_:
  705|  2.86k|      {
  706|  2.86k|        return ranks[a1->GetIndex()] < ranks[a2->GetIndex()];
  707|  2.86k|      }
_ZN9OpenBabel19CanonicalLabelsImpl18SortAtomsAscendingC2ERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
  702|  11.2k|      SortAtomsAscending(const std::vector<unsigned int> &_ranks) : ranks(_ranks) {}
_ZN9OpenBabel19CanonicalLabelsImpl10FindOrbitsERNSt3__16vectorINS2_IPNS_6OBAtomENS1_9allocatorIS4_EEEENS5_IS7_EEEEPNS_5OBMolERKNS2_IjNS5_IjEEEESG_:
 1098|  42.4k|    {
 1099|  42.4k|      Orbits newOrbits;
 1100|  42.4k|      std::vector<bool> visited(labels1.size(), false);
 1101|       |
 1102|       |      //print_vector("labels1", labels1);
 1103|       |      //print_vector("labels2", labels2);
 1104|       |
 1105|       |      // Construct the orbits for automorphic permutation labels1 -> labels2
 1106|   741k|      for (std::size_t i = 0; i < labels1.size(); ++i) {
  ------------------
  |  Branch (1106:31): [True: 699k, False: 42.4k]
  ------------------
 1107|   699k|        if (visited[i])
  ------------------
  |  Branch (1107:13): [True: 330k, False: 368k]
  ------------------
 1108|   330k|          continue;
 1109|   368k|        unsigned int vi = labels1[i];
 1110|   368k|        if (vi == labels2[i])
  ------------------
  |  Branch (1110:13): [True: 322k, False: 46.3k]
  ------------------
 1111|   322k|          continue;
 1112|       |        //cout << "( ";
 1113|  46.3k|        std::size_t j = i;
 1114|  46.3k|        unsigned int vj = labels2[j];
 1115|       |        //cout << j << " ";
 1116|  46.3k|        newOrbits.resize(newOrbits.size()+1);
 1117|  46.3k|        newOrbits.back().push_back(mol->GetAtom(j+1));
 1118|  46.3k|        visited[i] = true;
 1119|   377k|        while (vi != vj) {
  ------------------
  |  Branch (1119:16): [True: 330k, False: 46.3k]
  ------------------
 1120|  17.9M|          for (std::size_t k = i; k < labels1.size(); ++k) {
  ------------------
  |  Branch (1120:35): [True: 17.9M, False: 0]
  ------------------
 1121|  17.9M|            if (vj == labels1[k]) {
  ------------------
  |  Branch (1121:17): [True: 330k, False: 17.5M]
  ------------------
 1122|   330k|              j = k;
 1123|   330k|              vj =  labels2[j];
 1124|       |              //cout << j << " ";
 1125|   330k|              newOrbits.back().push_back(mol->GetAtom(j+1));
 1126|   330k|              visited[j] = true;
 1127|   330k|              break;
 1128|   330k|            }
 1129|  17.9M|          }
 1130|   330k|        }
 1131|       |        //cout << ") ";
 1132|  46.3k|      }
 1133|       |      //cout << endl;
 1134|       |
 1135|       |      //print_orbits("newOrbits", newOrbits);
 1136|       |
 1137|       |      // Merge the orbits with previously found orbits.
 1138|  88.7k|      for (std::size_t j = 0; j < newOrbits.size(); ++j) {
  ------------------
  |  Branch (1138:31): [True: 46.3k, False: 42.4k]
  ------------------
 1139|  46.3k|        bool merge = false;
 1140|   176k|        for (std::size_t k = 0; k < orbits.size(); ++k) {
  ------------------
  |  Branch (1140:33): [True: 130k, False: 46.2k]
  ------------------
 1141|       |
 1142|   391k|          for (std::size_t l = 0; l < newOrbits[j].size(); ++l) {
  ------------------
  |  Branch (1142:35): [True: 261k, False: 130k]
  ------------------
 1143|   261k|            if (std::find(orbits[k].begin(), orbits[k].end(), newOrbits[j][l]) != orbits[k].end())
  ------------------
  |  Branch (1143:17): [True: 113, False: 261k]
  ------------------
 1144|    113|              merge = true;
 1145|   261k|          }
 1146|       |
 1147|   130k|          if (merge) {
  ------------------
  |  Branch (1147:15): [True: 53, False: 130k]
  ------------------
 1148|    185|            for (std::size_t l = 0; l < newOrbits[j].size(); ++l)
  ------------------
  |  Branch (1148:37): [True: 132, False: 53]
  ------------------
 1149|    132|              if (std::find(orbits[k].begin(), orbits[k].end(), newOrbits[j][l]) == orbits[k].end())
  ------------------
  |  Branch (1149:19): [True: 19, False: 113]
  ------------------
 1150|     19|                orbits[k].push_back(newOrbits[j][l]);
 1151|     53|            break;
 1152|     53|          }
 1153|   130k|        }
 1154|       |
 1155|  46.3k|        if (!merge)
  ------------------
  |  Branch (1155:13): [True: 46.2k, False: 53]
  ------------------
 1156|  46.2k|          orbits.push_back(newOrbits[j]);
 1157|  46.3k|      }
 1158|       |
 1159|       |//      print_orbits("orbits", orbits);
 1160|       |
 1161|  42.4k|      newOrbits.clear();
 1162|  42.4k|      std::vector<bool> vivisted(orbits.size(), false);
 1163|  88.7k|      for (std::size_t i = 0; i < orbits.size(); ++i) {
  ------------------
  |  Branch (1163:31): [True: 46.3k, False: 42.4k]
  ------------------
 1164|  46.3k|        if (visited[i])
  ------------------
  |  Branch (1164:13): [True: 40.7k, False: 5.54k]
  ------------------
 1165|  40.7k|          continue;
 1166|  5.54k|        visited[i] = true;
 1167|       |
 1168|  5.54k|        Orbit newOrbit = orbits[i];
 1169|       |
 1170|  12.1k|        for (std::size_t j = i; j < orbits.size(); ++j) {
  ------------------
  |  Branch (1170:33): [True: 6.61k, False: 5.54k]
  ------------------
 1171|  6.61k|          if (visited[j])
  ------------------
  |  Branch (1171:15): [True: 6.03k, False: 579]
  ------------------
 1172|  6.03k|            continue;
 1173|       |
 1174|    579|          std::sort(newOrbit.begin(), newOrbit.end());
 1175|    579|          std::sort(orbits[j].begin(), orbits[j].end());
 1176|    579|          Orbit result;
 1177|       |
 1178|    579|          std::set_intersection(newOrbit.begin(), newOrbit.end(),
 1179|    579|                                orbits[j].begin(), orbits[j].end(),
 1180|    579|                                std::back_inserter(result));
 1181|    579|          if (result.empty())
  ------------------
  |  Branch (1181:15): [True: 579, False: 0]
  ------------------
 1182|    579|            continue;
 1183|       |
 1184|      0|          visited[j] = true;
 1185|      0|          result.clear();
 1186|      0|          std::set_union(newOrbit.begin(), newOrbit.end(),
 1187|      0|                         orbits[j].begin(), orbits[j].end(),
 1188|      0|                         std::back_inserter(result));
 1189|       |
 1190|      0|          newOrbit = result;
 1191|      0|        }
 1192|       |
 1193|  5.54k|        newOrbits.push_back(newOrbit);
 1194|  5.54k|      }
 1195|       |
 1196|  42.4k|      orbits = newOrbits;
 1197|  42.4k|    }
_ZNK9OpenBabel19CanonicalLabelsImpl8FullCodegtERKS1_:
  516|   129k|      {
  517|   129k|        return (code > other.code);
  518|   129k|      }
_ZNK9OpenBabel19CanonicalLabelsImpl11PartialCodeltERKNS0_8FullCodeE:
  590|  12.6M|      {
  591|  12.6M|        std::size_t numFrom = std::min(from.size(), other.code.size());
  592|   190M|        for (std::size_t i = 0; i < numFrom; ++i) {
  ------------------
  |  Branch (592:33): [True: 177M, False: 12.6M]
  ------------------
  593|   177M|          if (from[i] > other.code[i])
  ------------------
  |  Branch (593:15): [True: 0, False: 177M]
  ------------------
  594|      0|            return false;
  595|   177M|          if (from[i] < other.code[i])
  ------------------
  |  Branch (595:15): [True: 66, False: 177M]
  ------------------
  596|     66|            return true;
  597|   177M|        }
  598|       |
  599|  12.6M|        return false;
  600|  12.6M|      }
_ZN9OpenBabel19CanonicalLabelsImpl14LabelFragmentsEPNS_6OBAtomERNSt3__16vectorIS2_NS3_9allocatorIS2_EEEEjRNS0_7TimeoutERNS0_8FullCodeERNS0_5StateE:
  930|   229k|    {
  931|   229k|      OBMol *mol = current->GetParent();
  932|   229k|      PartialCode &code = state.code;
  933|       |
  934|       |      // Sort the neighbor atoms according to symmetry class.
  935|   229k|      std::sort(nbrs.begin(), nbrs.end(), SortAtomsDescending(state.symmetry_classes));
  936|       |
  937|       |      // Count the number of unique neighbor symmetry classes.
  938|   229k|      unsigned int numUnique = 1;
  939|   229k|      unsigned int lastSymClass = state.symmetry_classes[nbrs[0]->GetIndex()];
  940|  1.04M|      for (std::size_t i = 0; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (940:31): [True: 810k, False: 229k]
  ------------------
  941|   810k|        unsigned int symClass = state.symmetry_classes[nbrs[i]->GetIndex()];
  942|   810k|        if (symClass != lastSymClass)
  ------------------
  |  Branch (942:13): [True: 7.91k, False: 802k]
  ------------------
  943|  7.91k|          numUnique++;
  944|   810k|        lastSymClass = state.symmetry_classes[nbrs[i]->GetIndex()];
  945|   810k|      }
  946|       |
  947|   229k|      if (numUnique < nbrs.size()) {
  ------------------
  |  Branch (947:11): [True: 9.71k, False: 219k]
  ------------------
  948|       |        // The canonical codes for the equivalent ligands
  949|  9.71k|        std::vector< std::pair<int, CanonicalLabelsImpl::FullCode> > lcodes;
  950|       |
  951|  9.71k|        std::vector<unsigned int> ligandSizes;
  952|   599k|        for (std::size_t i = 0; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (952:33): [True: 589k, False: 9.71k]
  ------------------
  953|   589k|          OBBitVec ligand = getFragment(nbrs[i], current, state.fragment);
  954|   589k|          ligandSizes.push_back(ligand.CountBits());
  955|       |
  956|   589k|          CanonicalLabelsImpl::FullCode lbestCode;
  957|   589k|          if (ligandSizes.back() == 1) {
  ------------------
  |  Branch (957:15): [True: 587k, False: 1.87k]
  ------------------
  958|       |            // Avoid additional state creation if the neighbor is a single terminal atom.
  959|   587k|            lbestCode.code.push_back(nbrs[i]->GetAtomicNum());
  960|   587k|            lbestCode.labels.resize(state.symmetry_classes.size(), 0);
  961|   587k|            lbestCode.labels[nbrs[i]->GetIndex()] = 1;
  962|   587k|          } else if (ligandSizes.back() == 2) {
  ------------------
  |  Branch (962:22): [True: 1.43k, False: 444]
  ------------------
  963|       |            // Avoid additional state creation if the neighbor is a fragment of 2 atoms.
  964|  1.43k|            lbestCode.labels.resize(state.symmetry_classes.size(), 0);
  965|  1.43k|            lbestCode.code.push_back(1); // FROM
  966|  1.43k|            lbestCode.code.push_back(nbrs[i]->GetAtomicNum()); // ATOM-TYPES 1
  967|  1.43k|            lbestCode.labels[nbrs[i]->GetIndex()] = 1;
  968|  2.86k|            FOR_NBORS_OF_ATOM (nbr, nbrs[i]) {
  ------------------
  |  |  419|  1.43k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.86k, False: 1.43k]
  |  |  ------------------
  ------------------
  969|  2.86k|              if (!state.fragment.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (969:19): [True: 0, False: 2.86k]
  ------------------
  970|      0|                continue;
  971|  2.86k|              if (code.labels[nbr->GetIndex()])
  ------------------
  |  Branch (971:19): [True: 1.43k, False: 1.43k]
  ------------------
  972|  1.43k|                continue;
  973|  1.43k|              lbestCode.code.push_back(nbr->GetAtomicNum()); // ATOM-TYPES 2
  974|  1.43k|              OBBond *bond = mol->GetBond(nbrs[i], &*nbr);
  975|  1.43k|              if (bond->IsAromatic())
  ------------------
  |  Branch (975:19): [True: 0, False: 1.43k]
  ------------------
  976|      0|                lbestCode.code.push_back(5);
  977|  1.43k|              else
  978|  1.43k|                lbestCode.code.push_back(bond->GetBondOrder()); // BOND-TYPES 1
  979|  1.43k|              lbestCode.labels[nbr->GetIndex()] = 2;
  980|  1.43k|            }
  981|  1.43k|          } else {
  982|       |            // Start labeling from the ligand atom.
  983|    444|            std::vector<CanonicalLabelsImpl::FullCode> identityCodes;
  984|    444|            Orbits orbits;
  985|    444|            OBBitVec mcr;
  986|    444|            State lstate(state.symmetry_classes, ligand, state.stereoCenters, identityCodes, orbits, mcr, state.onlyOne);
  987|    444|            lstate.code.add(nbrs[i]);
  988|    444|            lstate.code.labels[nbrs[i]->GetIndex()] = 1;
  989|    444|            CanonicalLabelsRecursive(nbrs[i], 1, timeout, lbestCode, lstate);
  990|    444|          }
  991|       |
  992|       |          // Store the canonical code (and labels) for the ligand.
  993|   589k|          lcodes.push_back(std::make_pair(i, lbestCode));
  994|   589k|        }
  995|       |
  996|       |        // Sort the codes for the fragments. Each neighbor symmetry class is sorted separately.
  997|  9.71k|        unsigned int firstIndex = 0;
  998|  9.71k|        lastSymClass = state.symmetry_classes[nbrs[0]->GetIndex()];
  999|   589k|        for (std::size_t i = 1; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (999:33): [True: 579k, False: 9.71k]
  ------------------
 1000|   579k|          unsigned int symClass = state.symmetry_classes[nbrs[i]->GetIndex()];
 1001|   579k|          if (symClass != lastSymClass) {
  ------------------
  |  Branch (1001:15): [True: 5.89k, False: 573k]
  ------------------
 1002|  5.89k|            std::sort(lcodes.begin() + firstIndex, lcodes.begin() + i, SortCode2);
 1003|  5.89k|            firstIndex = i;
 1004|  5.89k|          }
 1005|   579k|          lastSymClass = state.symmetry_classes[nbrs[i]->GetIndex()];
 1006|   579k|        }
 1007|       |        // Make sure to sort the last set too.
 1008|  9.71k|        std::sort(lcodes.begin() + firstIndex, lcodes.end(), SortCode2);
 1009|       |
 1010|       |        // Label the neighbor atoms by updating code.
 1011|  9.71k|        std::vector<OBAtom*> atoms;
 1012|  9.71k|        unsigned int nextLbl = label + 1;
 1013|   599k|        for (std::size_t l = 0; l < lcodes.size(); ++l) {
  ------------------
  |  Branch (1013:33): [True: 589k, False: 9.71k]
  ------------------
 1014|       |          //print_vector("LIG CODE", lcodes[l].second.code);
 1015|   589k|          OBAtom *atom = nbrs[lcodes[l].first];
 1016|   589k|          code.add(current, atom);
 1017|   589k|          code.labels[atom->GetIndex()] = nextLbl;
 1018|   589k|          atoms.push_back(atom);
 1019|   589k|          nextLbl++;
 1020|   589k|        }
 1021|       |
 1022|       |        // Convert the labels from the ligands to labels in the whole fragment.
 1023|  9.71k|        unsigned int ligandSize = *std::max_element(ligandSizes.begin(), ligandSizes.end());
 1024|  17.2k|        for (unsigned int lbl = 1; lbl < ligandSize; ++lbl) {
  ------------------
  |  Branch (1024:36): [True: 7.51k, False: 9.71k]
  ------------------
 1025|  30.6k|          for (std::size_t l = 0; l < lcodes.size(); ++l) {
  ------------------
  |  Branch (1025:35): [True: 23.1k, False: 7.51k]
  ------------------
 1026|  23.1k|            if (lbl >= ligandSizes[lcodes[l].first])
  ------------------
  |  Branch (1026:17): [True: 11.9k, False: 11.1k]
  ------------------
 1027|  11.9k|              continue;
 1028|       |            // Ligand recursion may have returned early (e.g., timeout) without
 1029|       |            // populating labels; skip rather than dereferencing empty storage.
 1030|  11.1k|            if (lcodes[l].second.labels.empty())
  ------------------
  |  Branch (1030:17): [True: 0, False: 11.1k]
  ------------------
 1031|      0|              continue;
 1032|       |
 1033|  11.1k|            OBAtom *atom = nullptr;
 1034|  1.69M|            for (std::size_t i = 0; i < mol->NumAtoms(); ++i)
  ------------------
  |  Branch (1034:37): [True: 1.69M, False: 0]
  ------------------
 1035|  1.69M|              if (lcodes[l].second.labels[i] == lbl) {
  ------------------
  |  Branch (1035:19): [True: 11.1k, False: 1.68M]
  ------------------
 1036|  11.1k|                atom = mol->GetAtom(i+1);
 1037|  11.1k|                break;
 1038|  11.1k|              }
 1039|       |
 1040|  11.1k|            if (!atom)
  ------------------
  |  Branch (1040:17): [True: 0, False: 11.1k]
  ------------------
 1041|      0|              continue;
 1042|       |
 1043|  11.1k|            std::vector<OBAtom*> atomNbrs;
 1044|  26.2k|            FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  11.1k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 26.2k, False: 11.1k]
  |  |  ------------------
  ------------------
 1045|  26.2k|              if (lcodes[l].second.labels[nbr->GetIndex()] > lbl) {
  ------------------
  |  Branch (1045:19): [True: 13.2k, False: 12.9k]
  ------------------
 1046|  13.2k|                if (std::find(atoms.begin(), atoms.end(), &*nbr) != atoms.end())
  ------------------
  |  Branch (1046:21): [True: 2.16k, False: 11.1k]
  ------------------
 1047|  2.16k|                  continue;
 1048|  11.1k|                atomNbrs.push_back(&*nbr);
 1049|  11.1k|              }
 1050|  26.2k|            }
 1051|       |
 1052|  11.1k|            std::sort(atomNbrs.begin(), atomNbrs.end(), SortAtomsAscending(lcodes[l].second.labels));
 1053|       |
 1054|  22.2k|            for (std::size_t i = 0; i < atomNbrs.size(); ++i) {
  ------------------
  |  Branch (1054:37): [True: 11.1k, False: 11.1k]
  ------------------
 1055|  11.1k|              code.add(atom, atomNbrs[i]);
 1056|  11.1k|              code.labels[atomNbrs[i]->GetIndex()] = nextLbl;
 1057|  11.1k|              atoms.push_back(atomNbrs[i]);
 1058|  11.1k|              nextLbl++;
 1059|  11.1k|            }
 1060|  11.1k|          }
 1061|  7.51k|        }
 1062|       |
 1063|       |        // Recurse...
 1064|  9.71k|        CanonicalLabelsRecursive(current, nextLbl - 1, timeout, bestCode, state);
 1065|       |
 1066|       |        // Backtrack.
 1067|   610k|        for (std::size_t j = 0; j < atoms.size(); ++j) {
  ------------------
  |  Branch (1067:33): [True: 600k, False: 9.71k]
  ------------------
 1068|   600k|          code.atoms.pop_back();
 1069|   600k|          code.bonds.pop_back();
 1070|   600k|          code.from.pop_back();
 1071|   600k|          code.labels[atoms[j]->GetIndex()] = 0;
 1072|   600k|        }
 1073|   219k|      } else {
 1074|       |        // There are no duplicated symmetry classes for the neighbor atoms.
 1075|       |        // Label each neighbor atom in sorted sequence.
 1076|   219k|        unsigned int lbl = label;
 1077|   441k|        for (std::size_t i = 0; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (1077:33): [True: 221k, False: 219k]
  ------------------
 1078|   221k|          lbl++;
 1079|   221k|          code.add(current, nbrs[i]);
 1080|   221k|          code.labels[nbrs[i]->GetIndex()] = lbl;
 1081|   221k|        }
 1082|       |
 1083|       |        // Recurse...
 1084|   219k|        CanonicalLabelsRecursive(current, lbl, timeout, bestCode, state);
 1085|       |
 1086|       |        // Backtrack.
 1087|   441k|        for (std::size_t i = 0; i < nbrs.size(); ++i) {
  ------------------
  |  Branch (1087:33): [True: 221k, False: 219k]
  ------------------
 1088|   221k|          code.atoms.pop_back();
 1089|   221k|          code.bonds.pop_back();
 1090|   221k|          code.from.pop_back();
 1091|   221k|          code.labels[nbrs[i]->GetIndex()] = 0;
 1092|   221k|        }
 1093|   219k|      }
 1094|   229k|    }
_ZNK9OpenBabel19CanonicalLabelsImpl19SortAtomsDescendingclEPKNS_6OBAtomES4_:
  718|  1.17M|      {
  719|  1.17M|        return ranks[a1->GetIndex()] > ranks[a2->GetIndex()];
  720|  1.17M|      }
_ZN9OpenBabel19CanonicalLabelsImpl19SortAtomsDescendingC2ERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
  715|   229k|      SortAtomsDescending(const std::vector<unsigned int> &_ranks) : ranks(_ranks) {}
_ZN9OpenBabel19CanonicalLabelsImpl9SortCode2ERKNSt3__14pairIiNS0_8FullCodeEEES6_:
  693|  1.15M|    {
  694|  1.15M|      return (code1.second.code > code2.second.code);
  695|  1.15M|    }
_ZN9OpenBabel19CanonicalLabelsImpl11PartialCode3addEPNS_6OBAtomES3_:
  578|   432M|      {
  579|   432M|        from.push_back(labels[fromAtom->GetIndex()]);
  580|   432M|        atoms.push_back(atom);
  581|   432M|        bonds.push_back(atom->GetParent()->GetBond(fromAtom, atom));
  582|   432M|      }
_ZN9OpenBabel19CanonicalLabelsImpl19RecursionDepthGuardD2Ev:
  801|  69.8M|      ~RecursionDepthGuard() { --m_timeout.depth; }
_ZN9OpenBabel19CanonicalLabelsImpl7Timeout9isExpiredEv:
  782|  82.5M|      {
  783|  82.5M|        if (expired)
  ------------------
  |  Branch (783:13): [True: 70.7k, False: 82.5M]
  ------------------
  784|  70.7k|          return true;
  785|  82.5M|        if (time(nullptr) - startTime > maxTime) {
  ------------------
  |  Branch (785:13): [True: 3, False: 82.5M]
  ------------------
  786|      3|          expired = true;
  787|      3|          return true;
  788|      3|        }
  789|  82.5M|        return false;
  790|  82.5M|      }
_ZN9OpenBabel19CanonicalLabelsImpl8SortCodeERKNS0_8FullCodeES3_:
  684|    334|    {
  685|    334|      return (code1.code < code2.code);
  686|    334|    }

_ZN9OpenBabel17GenerateByteCodesEPPNS_9_ByteCodeEiiii:
  505|  1.94k|  {
  506|  1.94k|    StackType neighbour[4];
  507|  1.94k|    StackType original;
  508|  1.94k|    int count,i,j;
  509|  1.94k|    ByteCode *ptr;
  510|  1.94k|    bool done,found;
  511|       |
  512|  1.94k|    if( curr != prev )
  ------------------
  |  Branch (512:9): [True: 1.88k, False: 54]
  ------------------
  513|  1.88k|      {
  514|  1.88k|        if( MonoAtom[curr].atomid < ATOMMINAMINO )
  ------------------
  |  |   62|  1.88k|#define ATOMMINAMINO   4
  ------------------
  |  Branch (514:13): [True: 6, False: 1.88k]
  ------------------
  515|      6|          {
  516|      6|            found = false;
  517|      6|            while( *node && ((*node)->type==BC_IDENT) )
  ------------------
  |  |  136|      4|#define BC_IDENT       0x05
  ------------------
  |  Branch (517:20): [True: 4, False: 2]
  |  Branch (517:29): [True: 0, False: 4]
  ------------------
  518|      0|              {
  519|      0|                if( (*node)->ident.value == MonoAtom[curr].atomid )
  ------------------
  |  Branch (519:21): [True: 0, False: 0]
  ------------------
  520|      0|                  {
  521|      0|                    node  = (ByteCode**)&(*node)->ident.tcond;
  522|      0|                    found = true;
  523|      0|                    break;
  524|      0|                  }
  525|      0|                else
  526|      0|                  node = (ByteCode**)&(*node)->ident.fcond;
  527|      0|              }
  528|       |
  529|      6|            if (!found)
  ------------------
  |  Branch (529:17): [True: 6, False: 0]
  ------------------
  530|      6|              {
  531|      6|                ptr = AllocateByteCode(BC_IDENT);
  ------------------
  |  |  136|      6|#define BC_IDENT       0x05
  ------------------
  532|      6|                ptr->ident.tcond = nullptr;
  533|      6|                ptr->ident.fcond = *node;
  534|      6|                *node = ptr;
  535|      6|                node = (ByteCode**)&ptr->ident.tcond;
  536|      6|                ptr->ident.value = MonoAtom[curr].atomid;
  537|      6|              }
  538|      6|            MonoBond[bond].index = BondIndex++;
  539|      6|            done = true;
  540|      6|          }
  541|  1.88k|        else if( MonoAtom[curr].index != -1 )
  ------------------
  |  Branch (541:18): [True: 716, False: 1.16k]
  ------------------
  542|    716|          {
  543|    716|            while( *node && ((*node)->type==BC_IDENT) )
  ------------------
  |  |  136|    108|#define BC_IDENT       0x05
  ------------------
  |  Branch (543:20): [True: 108, False: 608]
  |  Branch (543:29): [True: 0, False: 108]
  ------------------
  544|      0|              node = (ByteCode**)&(*node)->ident.fcond;
  545|       |
  546|    716|            found = false;
  547|    734|            while( *node && ((*node)->type==BC_LOCAL) )
  ------------------
  |  |  137|    116|#define BC_LOCAL       0x06
  ------------------
  |  Branch (547:20): [True: 116, False: 618]
  |  Branch (547:29): [True: 76, False: 40]
  ------------------
  548|     76|              {
  549|     76|                if( (*node)->local.value == MonoAtom[curr].index )
  ------------------
  |  Branch (549:21): [True: 58, False: 18]
  ------------------
  550|     58|                  {
  551|     58|                    node = (ByteCode**)&(*node)->local.tcond;
  552|     58|                    found = true;
  553|     58|                    break;
  554|     58|                  }
  555|     18|                else
  556|     18|                  node = (ByteCode**)&(*node)->local.fcond;
  557|     76|              }
  558|       |
  559|    716|            if (!found)
  ------------------
  |  Branch (559:17): [True: 658, False: 58]
  ------------------
  560|    658|              {
  561|    658|                ptr = AllocateByteCode(BC_LOCAL);
  ------------------
  |  |  137|    658|#define BC_LOCAL       0x06
  ------------------
  562|    658|                ptr->local.tcond = nullptr;
  563|    658|                ptr->local.fcond = *node;
  564|    658|                *node = ptr;
  565|    658|                node = (ByteCode**)&ptr->local.tcond;
  566|    658|                ptr->local.value = MonoAtom[curr].index;
  567|    658|              }
  568|       |
  569|    716|            MonoBond[bond].index = BondIndex++;
  570|    716|            done = true;
  571|    716|          }
  572|  1.16k|        else
  573|  1.16k|          {
  574|  1.17k|            while( *node && ((*node)->type==BC_IDENT) )
  ------------------
  |  |  136|    562|#define BC_IDENT       0x05
  ------------------
  |  Branch (574:20): [True: 562, False: 614]
  |  Branch (574:29): [True: 10, False: 552]
  ------------------
  575|     10|              node = (ByteCode**)&(*node)->ident.fcond;
  576|  1.21k|            while( *node && ((*node)->type==BC_LOCAL) )
  ------------------
  |  |  137|    580|#define BC_LOCAL       0x06
  ------------------
  |  Branch (576:20): [True: 580, False: 632]
  |  Branch (576:29): [True: 46, False: 534]
  ------------------
  577|     46|              node = (ByteCode**)&(*node)->local.fcond;
  578|       |
  579|  1.16k|            found = false;
  580|  1.38k|            while( *node && ((*node)->type==BC_ELEM) )
  ------------------
  |  |  134|    652|#define BC_ELEM        0x03
  ------------------
  |  Branch (580:20): [True: 652, False: 728]
  |  Branch (580:29): [True: 652, False: 0]
  ------------------
  581|    652|              {
  582|    652|                if( (*node)->elem.value == MonoAtom[curr].elem )
  ------------------
  |  Branch (582:21): [True: 438, False: 214]
  ------------------
  583|    438|                  {
  584|    438|                    node = (ByteCode**)&(*node)->elem.tcond;
  585|    438|                    found = true;
  586|    438|                    break;
  587|    438|                  }
  588|    214|                else
  589|    214|                  node = (ByteCode**)&(*node)->elem.fcond;
  590|    652|              }
  591|       |
  592|  1.16k|            if( !found )
  ------------------
  |  Branch (592:17): [True: 728, False: 438]
  ------------------
  593|    728|              {
  594|    728|                ptr = AllocateByteCode(BC_ELEM);
  ------------------
  |  |  134|    728|#define BC_ELEM        0x03
  ------------------
  595|    728|                ptr->elem.tcond = nullptr;
  596|    728|                ptr->elem.fcond = *node;
  597|    728|                *node = ptr;
  598|    728|                node = (ByteCode**)&ptr->elem.tcond;
  599|    728|                ptr->elem.value = MonoAtom[curr].elem;
  600|    728|              }
  601|       |
  602|  1.16k|            MonoAtom[curr].index = AtomIndex++;
  603|  1.16k|            MonoBond[bond].index = BondIndex++;
  604|  1.16k|            done = false;
  605|  1.16k|          }
  606|  1.88k|      }
  607|     54|    else
  608|     54|      {
  609|     54|        MonoAtom[curr].index = AtomIndex++;
  610|     54|        done = false;
  611|     54|      }
  612|       |
  613|  1.94k|    count = 0;
  614|  1.94k|    if (!done)
  ------------------
  |  Branch (614:9): [True: 1.22k, False: 722]
  ------------------
  615|  1.22k|      {
  616|  13.5k|        for( i=0; i<MonoBondCount; i++ )
  ------------------
  |  Branch (616:19): [True: 12.3k, False: 1.22k]
  ------------------
  617|  12.3k|          {
  618|  12.3k|            if( MonoBond[i].src == curr )
  ------------------
  |  Branch (618:17): [True: 1.00k, False: 11.3k]
  ------------------
  619|  1.00k|              {
  620|  1.00k|                if( MonoBond[i].dst != prev )
  ------------------
  |  Branch (620:21): [True: 656, False: 350]
  ------------------
  621|    656|                  {
  622|    656|                    neighbour[count].atom = MonoBond[i].dst;
  623|    656|                    neighbour[count].bond = i;
  624|    656|                    count++;
  625|    656|                  }
  626|  1.00k|              }
  627|  11.3k|            else if( MonoBond[i].dst == curr )
  ------------------
  |  Branch (627:22): [True: 1.22k, False: 10.1k]
  ------------------
  628|  1.22k|              {
  629|  1.22k|                if( MonoBond[i].src != prev )
  ------------------
  |  Branch (629:21): [True: 404, False: 816]
  ------------------
  630|    404|                  {
  631|    404|                    neighbour[count].atom = MonoBond[i].src;
  632|    404|                    neighbour[count].bond = i;
  633|    404|                    count++;
  634|    404|                  }
  635|  1.22k|              }
  636|  12.3k|          }
  637|       |
  638|  1.22k|        if ( *node && ((*node)->type==BC_EVAL) )
  ------------------
  |  |  135|    488|#define BC_EVAL        0x04
  ------------------
  |  Branch (638:14): [True: 488, False: 732]
  |  Branch (638:23): [True: 480, False: 8]
  ------------------
  639|    480|          {
  640|    480|            found = false;
  641|    480|            node  = (ByteCode**)&(*node)->eval.next;
  642|    674|            while( *node && ((*node)->type==BC_COUNT) )
  ------------------
  |  |  133|    584|#define BC_COUNT       0x02
  ------------------
  |  Branch (642:20): [True: 584, False: 90]
  |  Branch (642:29): [True: 584, False: 0]
  ------------------
  643|    584|              {
  644|    584|                if( (*node)->count.value == count )
  ------------------
  |  Branch (644:21): [True: 390, False: 194]
  ------------------
  645|    390|                  {
  646|    390|                    node = (ByteCode**)&(*node)->count.tcond;
  647|    390|                    found = true;
  648|    390|                    break;
  649|    390|                  }
  650|    194|                else
  651|    194|                  node = (ByteCode**)&(*node)->count.fcond;
  652|    584|              }
  653|       |
  654|    480|            if( !found )
  ------------------
  |  Branch (654:17): [True: 90, False: 390]
  ------------------
  655|     90|              {
  656|     90|                ptr = AllocateByteCode(BC_COUNT);
  ------------------
  |  |  133|     90|#define BC_COUNT       0x02
  ------------------
  657|     90|                ptr->count.tcond = nullptr;
  658|     90|                ptr->count.fcond = *node;
  659|     90|                *node = ptr;
  660|     90|                node = (ByteCode**)&ptr->count.tcond;
  661|     90|                ptr->count.value = count;
  662|     90|              }
  663|    480|          }
  664|    740|        else if( count || StrictFlag || StackPtr )
  ------------------
  |  Branch (664:18): [True: 436, False: 304]
  |  Branch (664:27): [True: 0, False: 304]
  |  Branch (664:41): [True: 262, False: 42]
  ------------------
  665|    698|          {
  666|    698|            ptr = AllocateByteCode(BC_EVAL);
  ------------------
  |  |  135|    698|#define BC_EVAL        0x04
  ------------------
  667|    698|            ptr->eval.next = *node;
  668|    698|            *node = ptr;
  669|    698|            node = (ByteCode**)&ptr->eval.next;
  670|       |
  671|    698|            ptr = AllocateByteCode(BC_COUNT);
  ------------------
  |  |  133|    698|#define BC_COUNT       0x02
  ------------------
  672|    698|            ptr->count.tcond = nullptr;
  673|    698|            ptr->count.fcond = *node;
  674|    698|            *node = ptr;
  675|    698|            node = (ByteCode**)&ptr->count.tcond;
  676|    698|            ptr->count.value = count;
  677|    698|          }
  678|  1.22k|      }
  679|       |
  680|  1.94k|    if( count == 1 )
  ------------------
  |  Branch (680:9): [True: 612, False: 1.33k]
  ------------------
  681|    612|      {
  682|    612|        GenerateByteCodes(node,resid,neighbour[0].atom, curr,neighbour[0].bond);
  683|    612|      }
  684|  1.33k|    else if( count == 2 )
  ------------------
  |  Branch (684:14): [True: 224, False: 1.10k]
  ------------------
  685|    224|      {
  686|    224|        original = Stack[StackPtr++];
  687|    224|        Stack[StackPtr-1] = neighbour[0];
  688|    224|        Stack[StackPtr-1].prev = curr;
  689|    224|        GenerateByteCodes(node,resid,neighbour[1].atom,
  690|    224|                          curr,neighbour[1].bond);
  691|    224|        Stack[StackPtr-1] = neighbour[1];
  692|    224|        Stack[StackPtr-1].prev = curr;
  693|    224|        GenerateByteCodes(node,resid,neighbour[0].atom,
  694|    224|                          curr,neighbour[0].bond);
  695|    224|        Stack[--StackPtr] = original;
  696|    224|      }
  697|  1.10k|    else if( count )
  ------------------
  |  Branch (697:14): [True: 0, False: 1.10k]
  ------------------
  698|      0|      {
  699|      0|        stringstream errorMsg;
  700|      0|        errorMsg << "Maximum Monomer Fanout Exceeded!" << endl;
  701|      0|        errorMsg << "Residue " << ChainsResName[resid] << " atom "
  702|      0|                 << curr << endl;
  703|      0|        errorMsg << "Previous = " << prev << " Fanout = " << count << endl;
  704|      0|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  705|      0|      }
  706|  1.10k|    else if( StackPtr )
  ------------------
  |  Branch (706:14): [True: 828, False: 278]
  ------------------
  707|    828|      {
  708|    828|        StackPtr--;
  709|    828|        GenerateByteCodes(node,resid,Stack[StackPtr].atom,
  710|    828|                          Stack[StackPtr].prev,Stack[StackPtr].bond);
  711|    828|        StackPtr++;
  712|    828|      }
  713|    278|    else if( !(*node) )
  ------------------
  |  Branch (713:14): [True: 262, False: 16]
  ------------------
  714|    262|      {
  715|    262|        ptr = AllocateByteCode(BC_ASSIGN);
  ------------------
  |  |  132|    262|#define BC_ASSIGN      0x01
  ------------------
  716|    262|        ptr->assign.resid = resid;
  717|    262|        ptr->assign.atomid = new int[AtomIndex];
  718|    262|        if( !ptr->assign.atomid )
  ------------------
  |  Branch (718:13): [True: 0, False: 262]
  ------------------
  719|      0|          FatalMemoryError();
  720|  2.80k|        for( i=0; i<MonoAtomCount; i++ )
  ------------------
  |  Branch (720:19): [True: 2.54k, False: 262]
  ------------------
  721|  2.54k|          if( (j=MonoAtom[i].index) != -1 )
  ------------------
  |  Branch (721:15): [True: 2.54k, False: 6]
  ------------------
  722|  2.54k|            ptr->assign.atomid[j] = MonoAtom[i].atomid;
  723|    262|        if( BondIndex )
  ------------------
  |  Branch (723:13): [True: 260, False: 2]
  ------------------
  724|    260|          {
  725|    260|            ptr->assign.bflags = new int[BondIndex];
  726|  2.90k|            for( i=0; i<MonoBondCount; i++ )
  ------------------
  |  Branch (726:23): [True: 2.64k, False: 260]
  ------------------
  727|  2.64k|              if( (j=MonoBond[i].index) != -1 )
  ------------------
  |  Branch (727:19): [True: 2.64k, False: 0]
  ------------------
  728|  2.64k|                ptr->assign.bflags[j] = MonoBond[i].flag;
  729|    260|          }
  730|    262|        *node = ptr;
  731|    262|      }
  732|     16|    else if( (*node)->type == BC_ASSIGN )
  ------------------
  |  |  132|     16|#define BC_ASSIGN      0x01
  ------------------
  |  Branch (732:14): [True: 16, False: 0]
  ------------------
  733|     16|      {
  734|     16|        if( (*node)->assign.resid != resid )
  ------------------
  |  Branch (734:13): [True: 0, False: 16]
  ------------------
  735|      0|          {
  736|      0|            stringstream errorMsg;
  737|      0|            errorMsg << "Duplicated Monomer Specification!\n";
  738|      0|            errorMsg << "Residue " << ChainsResName[resid]
  739|      0|                     << " matches residue ";
  740|      0|            errorMsg << ChainsResName[(*node)->assign.resid] << endl;
  741|      0|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  742|      0|          }
  743|     16|      }
  744|       |
  745|       |    /* Restore State! */
  746|  1.94k|    if( curr != prev )
  ------------------
  |  Branch (746:9): [True: 1.88k, False: 54]
  ------------------
  747|  1.88k|      {
  748|  1.88k|        if( !done )
  ------------------
  |  Branch (748:13): [True: 1.16k, False: 722]
  ------------------
  749|  1.16k|          {
  750|  1.16k|            MonoAtom[curr].index = -1;
  751|  1.16k|            AtomIndex--;
  752|  1.16k|          }
  753|  1.88k|        MonoBond[bond].index = -1;
  754|  1.88k|        BondIndex--;
  755|  1.88k|      }
  756|  1.94k|  }
_ZN9OpenBabel14OBChainsParserC2Ev:
  764|      2|  {
  765|      2|    int i, res = RESIDMIN;
  ------------------
  |  |   49|      2|#define RESIDMIN       4
  ------------------
  766|       |
  767|      2|    PDecisionTree = (ByteCode*)nullptr;
  768|     44|    for( i=0 ; i < AMINOMAX ; i++ )
  ------------------
  |  |   69|     44|#define AMINOMAX       21
  ------------------
  |  Branch (768:16): [True: 42, False: 2]
  ------------------
  769|     42|      {
  770|     42|        strncpy(ChainsResName[res],AminoAcids[i].name, sizeof(ChainsResName[res]) - 1);
  771|     42|        ChainsResName[res][sizeof(ChainsResName[res]) - 1] = '\0';
  772|     42|        DefineMonomer(&PDecisionTree,res,AminoAcids[i].data);
  773|     42|        res++;
  774|     42|      }
  775|       |
  776|      2|    NDecisionTree = (ByteCode*)nullptr;
  777|     14|    for( i=0 ; i< NUCLEOMAX ; i++ )
  ------------------
  |  |   72|     14|#define NUCLEOMAX      6
  ------------------
  |  Branch (777:16): [True: 12, False: 2]
  ------------------
  778|     12|      {
  779|     12|        strncpy(ChainsResName[res],Nucleotides[i].name, sizeof(ChainsResName[res]) - 1);
  780|     12|        ChainsResName[res][sizeof(ChainsResName[res]) - 1] = '\0';
  781|     12|        DefineMonomer(&NDecisionTree,res,Nucleotides[i].data);
  782|     12|        res++;
  783|     12|      }
  784|      2|  }
_ZN9OpenBabel14OBChainsParser13DefineMonomerEPPviPKc:
 1870|     54|  {
 1871|     54|    int i;
 1872|       |
 1873|     54|    MonoAtomCount = 0;
 1874|     54|    MonoBondCount = 0;
 1875|       |
 1876|     54|    ParseSmiles(smiles,-1);
 1877|       |
 1878|    380|    for( i=0; i<MonoBondCount; i++ )
  ------------------
  |  Branch (1878:15): [True: 326, False: 54]
  ------------------
 1879|    326|      MonoBond[i].index = -1;
 1880|    406|    for( i=0; i<MonoAtomCount; i++ )
  ------------------
  |  Branch (1880:15): [True: 352, False: 54]
  ------------------
 1881|    352|      MonoAtom[i].index = -1;
 1882|     54|    AtomIndex = BondIndex = 0;
 1883|       |
 1884|     54|    StackPtr = 0;
 1885|     54|    GenerateByteCodes((ByteCode**)tree, resid, 0, 0, 0 );
 1886|     54|  }
_ZN9OpenBabel14OBChainsParser15IdentifyElementEPc:
 1889|    352|  {
 1890|    352|    int ch;
 1891|       |
 1892|    352|    ch = toupper(ptr[1]);
 1893|    352|    switch( toupper(ptr[0]) )
  ------------------
  |  Branch (1893:13): [True: 352, False: 0]
  ------------------
 1894|    352|      {
 1895|    352|      case(' '):  switch( ch )
  ------------------
  |  Branch (1895:7): [True: 352, False: 0]
  |  Branch (1895:27): [True: 352, False: 0]
  ------------------
 1896|    352|          {
 1897|      0|          case('B'):  return(  5 );
  ------------------
  |  Branch (1897:11): [True: 0, False: 352]
  ------------------
 1898|    250|          case('C'):  return(  6 );
  ------------------
  |  Branch (1898:11): [True: 250, False: 102]
  ------------------
 1899|      0|          case('D'):  return(  1 );
  ------------------
  |  Branch (1899:11): [True: 0, False: 352]
  ------------------
 1900|      0|          case('F'):  return(  9 );
  ------------------
  |  Branch (1900:11): [True: 0, False: 352]
  ------------------
 1901|      0|          case('H'):  return(  1 );
  ------------------
  |  Branch (1901:11): [True: 0, False: 352]
  ------------------
 1902|      0|          case('I'):  return( 53 );
  ------------------
  |  Branch (1902:11): [True: 0, False: 352]
  ------------------
 1903|      0|          case('K'):  return( 19 );
  ------------------
  |  Branch (1903:11): [True: 0, False: 352]
  ------------------
 1904|      0|          case('L'):  return(  1 );
  ------------------
  |  Branch (1904:11): [True: 0, False: 352]
  ------------------
 1905|     64|          case('N'):  return(  7 );
  ------------------
  |  Branch (1905:11): [True: 64, False: 288]
  ------------------
 1906|     34|          case('O'):  return(  8 );
  ------------------
  |  Branch (1906:11): [True: 34, False: 318]
  ------------------
 1907|      0|          case('P'):  return( 15 );
  ------------------
  |  Branch (1907:11): [True: 0, False: 352]
  ------------------
 1908|      4|          case('S'):  return( 16 );
  ------------------
  |  Branch (1908:11): [True: 4, False: 348]
  ------------------
 1909|      0|          case('U'):  return( 92 );
  ------------------
  |  Branch (1909:11): [True: 0, False: 352]
  ------------------
 1910|      0|          case('V'):  return( 23 );
  ------------------
  |  Branch (1910:11): [True: 0, False: 352]
  ------------------
 1911|      0|          case('W'):  return( 74 );
  ------------------
  |  Branch (1911:11): [True: 0, False: 352]
  ------------------
 1912|      0|          case('Y'):  return( 39 );
  ------------------
  |  Branch (1912:11): [True: 0, False: 352]
  ------------------
 1913|    352|          }
 1914|      0|        break;
 1915|       |
 1916|      0|      case('A'):  switch( ch )
  ------------------
  |  Branch (1916:7): [True: 0, False: 352]
  |  Branch (1916:27): [True: 0, False: 0]
  ------------------
 1917|      0|          {
 1918|      0|          case('C'):  return( 89 );
  ------------------
  |  Branch (1918:11): [True: 0, False: 0]
  ------------------
 1919|      0|          case('G'):  return( 47 );
  ------------------
  |  Branch (1919:11): [True: 0, False: 0]
  ------------------
 1920|      0|          case('L'):  return( 13 );
  ------------------
  |  Branch (1920:11): [True: 0, False: 0]
  ------------------
 1921|      0|          case('M'):  return( 95 );
  ------------------
  |  Branch (1921:11): [True: 0, False: 0]
  ------------------
 1922|      0|          case('R'):  return( 18 );
  ------------------
  |  Branch (1922:11): [True: 0, False: 0]
  ------------------
 1923|      0|          case('S'):  return( 33 );
  ------------------
  |  Branch (1923:11): [True: 0, False: 0]
  ------------------
 1924|      0|          case('T'):  return( 85 );
  ------------------
  |  Branch (1924:11): [True: 0, False: 0]
  ------------------
 1925|      0|          case('U'):  return( 79 );
  ------------------
  |  Branch (1925:11): [True: 0, False: 0]
  ------------------
 1926|      0|          }
 1927|      0|        break;
 1928|       |
 1929|      0|      case('B'):  switch( ch )
  ------------------
  |  Branch (1929:7): [True: 0, False: 352]
  |  Branch (1929:27): [True: 0, False: 0]
  ------------------
 1930|      0|          {
 1931|      0|          case('A'):  return( 56 );
  ------------------
  |  Branch (1931:11): [True: 0, False: 0]
  ------------------
 1932|      0|          case('E'):  return(  4 );
  ------------------
  |  Branch (1932:11): [True: 0, False: 0]
  ------------------
 1933|      0|          case('I'):  return( 83 );
  ------------------
  |  Branch (1933:11): [True: 0, False: 0]
  ------------------
 1934|      0|          case('K'):  return( 97 );
  ------------------
  |  Branch (1934:11): [True: 0, False: 0]
  ------------------
 1935|      0|          case('R'):  return( 35 );
  ------------------
  |  Branch (1935:11): [True: 0, False: 0]
  ------------------
 1936|      0|          case(' '):  return(  5 );
  ------------------
  |  Branch (1936:11): [True: 0, False: 0]
  ------------------
 1937|      0|          }
 1938|      0|        break;
 1939|       |
 1940|      0|      case('C'):  switch( ch )
  ------------------
  |  Branch (1940:7): [True: 0, False: 352]
  |  Branch (1940:27): [True: 0, False: 0]
  ------------------
 1941|      0|          {
 1942|      0|          case('A'):  return( 20 );
  ------------------
  |  Branch (1942:11): [True: 0, False: 0]
  ------------------
 1943|      0|          case('D'):  return( 48 );
  ------------------
  |  Branch (1943:11): [True: 0, False: 0]
  ------------------
 1944|      0|          case('E'):  return( 58 );
  ------------------
  |  Branch (1944:11): [True: 0, False: 0]
  ------------------
 1945|      0|          case('F'):  return( 98 );
  ------------------
  |  Branch (1945:11): [True: 0, False: 0]
  ------------------
 1946|      0|          case('L'):  return( 17 );
  ------------------
  |  Branch (1946:11): [True: 0, False: 0]
  ------------------
 1947|      0|          case('M'):  return( 96 );
  ------------------
  |  Branch (1947:11): [True: 0, False: 0]
  ------------------
 1948|      0|          case('O'):  return( 27 );
  ------------------
  |  Branch (1948:11): [True: 0, False: 0]
  ------------------
 1949|      0|          case('R'):  return( 24 );
  ------------------
  |  Branch (1949:11): [True: 0, False: 0]
  ------------------
 1950|      0|          case('S'):  return( 55 );
  ------------------
  |  Branch (1950:11): [True: 0, False: 0]
  ------------------
 1951|      0|          case('U'):  return( 29 );
  ------------------
  |  Branch (1951:11): [True: 0, False: 0]
  ------------------
 1952|      0|          case(' '):  return(  6 );
  ------------------
  |  Branch (1952:11): [True: 0, False: 0]
  ------------------
 1953|      0|          }
 1954|      0|        break;
 1955|       |
 1956|      0|      case('D'):  if( ch=='Y' )
  ------------------
  |  Branch (1956:7): [True: 0, False: 352]
  |  Branch (1956:23): [True: 0, False: 0]
  ------------------
 1957|      0|          {
 1958|      0|            return( 66 );
 1959|      0|          }
 1960|      0|        else if( ch==' ' )
  ------------------
  |  Branch (1960:18): [True: 0, False: 0]
  ------------------
 1961|      0|          return( 1 );
 1962|      0|        break;
 1963|       |
 1964|      0|      case('E'):  if( ch=='R' )
  ------------------
  |  Branch (1964:7): [True: 0, False: 352]
  |  Branch (1964:23): [True: 0, False: 0]
  ------------------
 1965|      0|          {
 1966|      0|            return( 68 );
 1967|      0|          }
 1968|      0|        else if( ch=='S' )
  ------------------
  |  Branch (1968:18): [True: 0, False: 0]
  ------------------
 1969|      0|          {
 1970|      0|            return( 99 );
 1971|      0|          }
 1972|      0|        else if( ch=='U' )
  ------------------
  |  Branch (1972:18): [True: 0, False: 0]
  ------------------
 1973|      0|          return( 63 );
 1974|      0|        break;
 1975|       |
 1976|      0|      case('F'):  if( ch=='E' )
  ------------------
  |  Branch (1976:7): [True: 0, False: 352]
  |  Branch (1976:23): [True: 0, False: 0]
  ------------------
 1977|      0|          {
 1978|      0|            return(  26 );
 1979|      0|          }
 1980|      0|        else if( ch=='M' )
  ------------------
  |  Branch (1980:18): [True: 0, False: 0]
  ------------------
 1981|      0|          {
 1982|      0|            return( 100 );
 1983|      0|          }
 1984|      0|        else if( ch=='R' )
  ------------------
  |  Branch (1984:18): [True: 0, False: 0]
  ------------------
 1985|      0|          {
 1986|      0|            return(  87 );
 1987|      0|          }
 1988|      0|        else if( ch=='F' )
  ------------------
  |  Branch (1988:18): [True: 0, False: 0]
  ------------------
 1989|      0|          return(   9 );
 1990|      0|        break;
 1991|       |
 1992|      0|      case('G'):  if( ch=='A' )
  ------------------
  |  Branch (1992:7): [True: 0, False: 352]
  |  Branch (1992:23): [True: 0, False: 0]
  ------------------
 1993|      0|          {
 1994|      0|            return( 31 );
 1995|      0|          }
 1996|      0|        else if( ch=='D' )
  ------------------
  |  Branch (1996:18): [True: 0, False: 0]
  ------------------
 1997|      0|          {
 1998|      0|            return( 64 );
 1999|      0|          }
 2000|      0|        else if( ch=='E' )
  ------------------
  |  Branch (2000:18): [True: 0, False: 0]
  ------------------
 2001|      0|          return( 32 );
 2002|      0|        break;
 2003|       |
 2004|      0|      case('H'):  if( ch=='E' )
  ------------------
  |  Branch (2004:7): [True: 0, False: 352]
  |  Branch (2004:23): [True: 0, False: 0]
  ------------------
 2005|      0|          {
 2006|      0|            return(  2 );
 2007|      0|          }
 2008|      0|        else if( ch=='F' )
  ------------------
  |  Branch (2008:18): [True: 0, False: 0]
  ------------------
 2009|      0|          {
 2010|      0|            return( 72 );
 2011|      0|          }
 2012|      0|        else if( ch=='G' )
  ------------------
  |  Branch (2012:18): [True: 0, False: 0]
  ------------------
 2013|      0|          {
 2014|      0|            return( 80 );
 2015|      0|          }
 2016|      0|        else if( ch=='O' )
  ------------------
  |  Branch (2016:18): [True: 0, False: 0]
  ------------------
 2017|      0|          {
 2018|      0|            return( 67 );
 2019|      0|          }
 2020|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2020:18): [True: 0, False: 0]
  ------------------
 2021|      0|          return(  1 );
 2022|      0|        break;
 2023|       |
 2024|      0|      case('I'):  if( ch=='N' )
  ------------------
  |  Branch (2024:7): [True: 0, False: 352]
  |  Branch (2024:23): [True: 0, False: 0]
  ------------------
 2025|      0|          {
 2026|      0|            return( 49 );
 2027|      0|          }
 2028|      0|        else if( ch=='R' )
  ------------------
  |  Branch (2028:18): [True: 0, False: 0]
  ------------------
 2029|      0|          {
 2030|      0|            return( 77 );
 2031|      0|          }
 2032|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2032:18): [True: 0, False: 0]
  ------------------
 2033|      0|          return( 53 );
 2034|      0|        break;
 2035|       |
 2036|      0|      case('K'):  if( ch=='R' )
  ------------------
  |  Branch (2036:7): [True: 0, False: 352]
  |  Branch (2036:23): [True: 0, False: 0]
  ------------------
 2037|      0|          {
 2038|      0|            return( 36 );
 2039|      0|          }
 2040|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2040:18): [True: 0, False: 0]
  ------------------
 2041|      0|          return( 19 );
 2042|      0|        break;
 2043|       |
 2044|      0|      case('L'):  if( ch=='A' )
  ------------------
  |  Branch (2044:7): [True: 0, False: 352]
  |  Branch (2044:23): [True: 0, False: 0]
  ------------------
 2045|      0|          {
 2046|      0|            return(  57 );
 2047|      0|          }
 2048|      0|        else if( ch=='I' )
  ------------------
  |  Branch (2048:18): [True: 0, False: 0]
  ------------------
 2049|      0|          {
 2050|      0|            return(   3 );
 2051|      0|          }
 2052|      0|        else if( (ch=='R') || (ch=='W') )
  ------------------
  |  Branch (2052:18): [True: 0, False: 0]
  |  Branch (2052:31): [True: 0, False: 0]
  ------------------
 2053|      0|          {
 2054|      0|            return( 103 );
 2055|      0|          }
 2056|      0|        else if( ch=='U' )
  ------------------
  |  Branch (2056:18): [True: 0, False: 0]
  ------------------
 2057|      0|          {
 2058|      0|            return(  71 );
 2059|      0|          }
 2060|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2060:18): [True: 0, False: 0]
  ------------------
 2061|      0|          return(   1 );
 2062|      0|        break;
 2063|       |
 2064|      0|      case('M'):  if( ch=='D' )
  ------------------
  |  Branch (2064:7): [True: 0, False: 352]
  |  Branch (2064:23): [True: 0, False: 0]
  ------------------
 2065|      0|          {
 2066|      0|            return( 101 );
 2067|      0|          }
 2068|      0|        else if( ch=='G' )
  ------------------
  |  Branch (2068:18): [True: 0, False: 0]
  ------------------
 2069|      0|          {
 2070|      0|            return(  12 );
 2071|      0|          }
 2072|      0|        else if( ch=='N' )
  ------------------
  |  Branch (2072:18): [True: 0, False: 0]
  ------------------
 2073|      0|          {
 2074|      0|            return(  25 );
 2075|      0|          }
 2076|      0|        else if( ch=='O' )
  ------------------
  |  Branch (2076:18): [True: 0, False: 0]
  ------------------
 2077|      0|          return(  42 );
 2078|      0|        break;
 2079|       |
 2080|      0|      case('N'):  switch( ch )
  ------------------
  |  Branch (2080:7): [True: 0, False: 352]
  |  Branch (2080:27): [True: 0, False: 0]
  ------------------
 2081|      0|          {
 2082|      0|          case('A'):  return(  11 );
  ------------------
  |  Branch (2082:11): [True: 0, False: 0]
  ------------------
 2083|      0|          case('B'):  return(  41 );
  ------------------
  |  Branch (2083:11): [True: 0, False: 0]
  ------------------
 2084|      0|          case('D'):  return(  60 );
  ------------------
  |  Branch (2084:11): [True: 0, False: 0]
  ------------------
 2085|      0|          case('E'):  return(  10 );
  ------------------
  |  Branch (2085:11): [True: 0, False: 0]
  ------------------
 2086|      0|          case('I'):  return(  28 );
  ------------------
  |  Branch (2086:11): [True: 0, False: 0]
  ------------------
 2087|      0|          case('O'):  return( 102 );
  ------------------
  |  Branch (2087:11): [True: 0, False: 0]
  ------------------
 2088|      0|          case('P'):  return(  93 );
  ------------------
  |  Branch (2088:11): [True: 0, False: 0]
  ------------------
 2089|      0|          case(' '):  return(   7 );
  ------------------
  |  Branch (2089:11): [True: 0, False: 0]
  ------------------
 2090|      0|          }
 2091|      0|        break;
 2092|       |
 2093|      0|      case('O'):  if( ch=='S' )
  ------------------
  |  Branch (2093:7): [True: 0, False: 352]
  |  Branch (2093:23): [True: 0, False: 0]
  ------------------
 2094|      0|          {
 2095|      0|            return( 76 );
 2096|      0|          }
 2097|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2097:18): [True: 0, False: 0]
  ------------------
 2098|      0|          return( 8 );
 2099|      0|        break;
 2100|       |
 2101|      0|      case('P'):  switch( ch )
  ------------------
  |  Branch (2101:7): [True: 0, False: 352]
  |  Branch (2101:27): [True: 0, False: 0]
  ------------------
 2102|      0|          {
 2103|      0|          case('A'):  return( 91 );
  ------------------
  |  Branch (2103:11): [True: 0, False: 0]
  ------------------
 2104|      0|          case('B'):  return( 82 );
  ------------------
  |  Branch (2104:11): [True: 0, False: 0]
  ------------------
 2105|      0|          case('D'):  return( 46 );
  ------------------
  |  Branch (2105:11): [True: 0, False: 0]
  ------------------
 2106|      0|          case('M'):  return( 61 );
  ------------------
  |  Branch (2106:11): [True: 0, False: 0]
  ------------------
 2107|      0|          case('O'):  return( 84 );
  ------------------
  |  Branch (2107:11): [True: 0, False: 0]
  ------------------
 2108|      0|          case('R'):  return( 59 );
  ------------------
  |  Branch (2108:11): [True: 0, False: 0]
  ------------------
 2109|      0|          case('T'):  return( 78 );
  ------------------
  |  Branch (2109:11): [True: 0, False: 0]
  ------------------
 2110|      0|          case('U'):  return( 94 );
  ------------------
  |  Branch (2110:11): [True: 0, False: 0]
  ------------------
 2111|      0|          case(' '):  return( 15 );
  ------------------
  |  Branch (2111:11): [True: 0, False: 0]
  ------------------
 2112|      0|          }
 2113|      0|        break;
 2114|       |
 2115|      0|      case('R'):  switch( ch )
  ------------------
  |  Branch (2115:7): [True: 0, False: 352]
  |  Branch (2115:27): [True: 0, False: 0]
  ------------------
 2116|      0|          {
 2117|      0|          case('A'):  return( 88 );
  ------------------
  |  Branch (2117:11): [True: 0, False: 0]
  ------------------
 2118|      0|          case('B'):  return( 37 );
  ------------------
  |  Branch (2118:11): [True: 0, False: 0]
  ------------------
 2119|      0|          case('E'):  return( 75 );
  ------------------
  |  Branch (2119:11): [True: 0, False: 0]
  ------------------
 2120|      0|          case('H'):  return( 45 );
  ------------------
  |  Branch (2120:11): [True: 0, False: 0]
  ------------------
 2121|      0|          case('N'):  return( 86 );
  ------------------
  |  Branch (2121:11): [True: 0, False: 0]
  ------------------
 2122|      0|          case('U'):  return( 44 );
  ------------------
  |  Branch (2122:11): [True: 0, False: 0]
  ------------------
 2123|      0|          }
 2124|      0|        break;
 2125|       |
 2126|      0|      case('S'):  switch( ch )
  ------------------
  |  Branch (2126:7): [True: 0, False: 352]
  |  Branch (2126:27): [True: 0, False: 0]
  ------------------
 2127|      0|          {
 2128|      0|          case('B'):  return( 51 );
  ------------------
  |  Branch (2128:11): [True: 0, False: 0]
  ------------------
 2129|      0|          case('C'):  return( 21 );
  ------------------
  |  Branch (2129:11): [True: 0, False: 0]
  ------------------
 2130|      0|          case('E'):  return( 34 );
  ------------------
  |  Branch (2130:11): [True: 0, False: 0]
  ------------------
 2131|      0|          case('I'):  return( 14 );
  ------------------
  |  Branch (2131:11): [True: 0, False: 0]
  ------------------
 2132|      0|          case('M'):  return( 62 );
  ------------------
  |  Branch (2132:11): [True: 0, False: 0]
  ------------------
 2133|      0|          case('N'):  return( 50 );
  ------------------
  |  Branch (2133:11): [True: 0, False: 0]
  ------------------
 2134|      0|          case('R'):  return( 38 );
  ------------------
  |  Branch (2134:11): [True: 0, False: 0]
  ------------------
 2135|      0|          case(' '):  return( 16 );
  ------------------
  |  Branch (2135:11): [True: 0, False: 0]
  ------------------
 2136|      0|          }
 2137|      0|        break;
 2138|       |
 2139|      0|      case('T'):  switch( ch )
  ------------------
  |  Branch (2139:7): [True: 0, False: 352]
  |  Branch (2139:27): [True: 0, False: 0]
  ------------------
 2140|      0|          {
 2141|      0|          case('A'):  return( 73 );
  ------------------
  |  Branch (2141:11): [True: 0, False: 0]
  ------------------
 2142|      0|          case('B'):  return( 65 );
  ------------------
  |  Branch (2142:11): [True: 0, False: 0]
  ------------------
 2143|      0|          case('C'):  return( 43 );
  ------------------
  |  Branch (2143:11): [True: 0, False: 0]
  ------------------
 2144|      0|          case('E'):  return( 52 );
  ------------------
  |  Branch (2144:11): [True: 0, False: 0]
  ------------------
 2145|      0|          case('H'):  return( 90 );
  ------------------
  |  Branch (2145:11): [True: 0, False: 0]
  ------------------
 2146|      0|          case('I'):  return( 22 );
  ------------------
  |  Branch (2146:11): [True: 0, False: 0]
  ------------------
 2147|      0|          case('L'):  return( 81 );
  ------------------
  |  Branch (2147:11): [True: 0, False: 0]
  ------------------
 2148|      0|          case('M'):  return( 69 );
  ------------------
  |  Branch (2148:11): [True: 0, False: 0]
  ------------------
 2149|      0|          }
 2150|      0|        break;
 2151|       |
 2152|      0|      case('U'):  if( ch==' ' )
  ------------------
  |  Branch (2152:7): [True: 0, False: 352]
  |  Branch (2152:23): [True: 0, False: 0]
  ------------------
 2153|      0|          return( 92 );
 2154|      0|        break;
 2155|       |
 2156|      0|      case('V'):  if( ch==' ' )
  ------------------
  |  Branch (2156:7): [True: 0, False: 352]
  |  Branch (2156:23): [True: 0, False: 0]
  ------------------
 2157|      0|          return( 23 );
 2158|      0|        break;
 2159|       |
 2160|      0|      case('W'):  if( ch==' ' )
  ------------------
  |  Branch (2160:7): [True: 0, False: 352]
  |  Branch (2160:23): [True: 0, False: 0]
  ------------------
 2161|      0|          return( 74 );
 2162|      0|        break;
 2163|       |
 2164|      0|      case('X'):  if( ch=='E' )
  ------------------
  |  Branch (2164:7): [True: 0, False: 352]
  |  Branch (2164:23): [True: 0, False: 0]
  ------------------
 2165|      0|          return( 54 );
 2166|      0|        break;
 2167|       |
 2168|      0|      case('Y'):  if( ch=='B' )
  ------------------
  |  Branch (2168:7): [True: 0, False: 352]
  |  Branch (2168:23): [True: 0, False: 0]
  ------------------
 2169|      0|          {
 2170|      0|            return( 70 );
 2171|      0|          }
 2172|      0|        else if( ch==' ' )
  ------------------
  |  Branch (2172:18): [True: 0, False: 0]
  ------------------
 2173|      0|          return( 39 );
 2174|      0|        break;
 2175|       |
 2176|      0|      case('Z'):  if( ch=='N' )
  ------------------
  |  Branch (2176:7): [True: 0, False: 352]
  |  Branch (2176:23): [True: 0, False: 0]
  ------------------
 2177|      0|          {
 2178|      0|            return( 30 );
 2179|      0|          }
 2180|      0|        else if( ch=='R' )
  ------------------
  |  Branch (2180:18): [True: 0, False: 0]
  ------------------
 2181|      0|          return( 40 );
 2182|      0|        break;
 2183|    352|      }
 2184|       |
 2185|      0|    if( (*ptr>='0') && (*ptr<='9') )
  ------------------
  |  Branch (2185:9): [True: 0, False: 0]
  |  Branch (2185:24): [True: 0, False: 0]
  ------------------
 2186|      0|      if( (ch=='H') || (ch=='D') )
  ------------------
  |  Branch (2186:11): [True: 0, False: 0]
  |  Branch (2186:24): [True: 0, False: 0]
  ------------------
 2187|      0|        return( 1 ); /* Hydrogen */
 2188|       |
 2189|      0|    return( 0 );
 2190|      0|  }
_ZN9OpenBabel14OBChainsParser11ParseSmilesEPKci:
 2193|    106|  {
 2194|    106|    char *name;
 2195|    106|    int atomid;
 2196|    106|    int next;
 2197|    106|    int type;
 2198|    106|    int ch;
 2199|       |
 2200|    106|    type = 0;
 2201|    864|    while( (ch = *ptr++) )
  ------------------
  |  Branch (2201:12): [True: 810, False: 54]
  ------------------
 2202|    810|      {
 2203|    810|        switch( ch )
 2204|    810|          {
 2205|    262|          case('-'): type = BF_SINGLE;
  ------------------
  |  |  139|    262|#define BF_SINGLE      0x01
  ------------------
  |  Branch (2205:11): [True: 262, False: 548]
  ------------------
 2206|    262|            break;
 2207|     10|          case('='): type = BF_DOUBLE;
  ------------------
  |  |  140|     10|#define BF_DOUBLE      0x02
  ------------------
  |  Branch (2207:11): [True: 10, False: 800]
  ------------------
 2208|     10|            break;
 2209|      0|          case('#'): type = BF_TRIPLE;
  ------------------
  |  |  141|      0|#define BF_TRIPLE      0x04
  ------------------
  |  Branch (2209:11): [True: 0, False: 810]
  ------------------
 2210|      0|            break;
 2211|     30|          case('^'): type = BF_SINGLE|BF_AROMATIC;
  ------------------
  |  |  139|     30|#define BF_SINGLE      0x01
  ------------------
                        case('^'): type = BF_SINGLE|BF_AROMATIC;
  ------------------
  |  |  142|     30|#define BF_AROMATIC    0x08
  ------------------
  |  Branch (2211:11): [True: 30, False: 780]
  ------------------
 2212|     30|            break;
 2213|     24|          case('~'): type = BF_DOUBLE|BF_AROMATIC;
  ------------------
  |  |  140|     24|#define BF_DOUBLE      0x02
  ------------------
                        case('~'): type = BF_DOUBLE|BF_AROMATIC;
  ------------------
  |  |  142|     24|#define BF_AROMATIC    0x08
  ------------------
  |  Branch (2213:11): [True: 24, False: 786]
  ------------------
 2214|     24|            break;
 2215|       |
 2216|     52|          case(')'): return( ptr );
  ------------------
  |  Branch (2216:11): [True: 52, False: 758]
  ------------------
 2217|      0|          case('.'): prev = -1;
  ------------------
  |  Branch (2217:11): [True: 0, False: 810]
  ------------------
 2218|      0|            break;
 2219|     52|          case('('): ptr = ParseSmiles(ptr,prev);
  ------------------
  |  Branch (2219:11): [True: 52, False: 758]
  ------------------
 2220|     52|            break;
 2221|       |
 2222|    380|          default:
  ------------------
  |  Branch (2222:11): [True: 380, False: 430]
  ------------------
 2223|    380|            atomid = ch-'0';
 2224|    628|            while( isdigit(*ptr) )
  ------------------
  |  Branch (2224:20): [True: 248, False: 380]
  ------------------
 2225|    248|              atomid = (atomid*10)+(*ptr++)-'0';
 2226|       |
 2227|  1.64k|            for( next=0; next<MonoAtomCount; next++ )
  ------------------
  |  Branch (2227:26): [True: 1.29k, False: 352]
  ------------------
 2228|  1.29k|              if( MonoAtom[next].atomid == atomid )
  ------------------
  |  Branch (2228:19): [True: 28, False: 1.26k]
  ------------------
 2229|     28|                break;
 2230|       |
 2231|    380|            if( next == MonoAtomCount )
  ------------------
  |  Branch (2231:17): [True: 352, False: 28]
  ------------------
 2232|    352|              {
 2233|    352|                name = ChainsAtomName[atomid];
 2234|    352|                MonoAtom[next].elem = IdentifyElement(name);
 2235|    352|                MonoAtom[next].atomid = atomid;
 2236|    352|                MonoAtom[next].bcount = 0;
 2237|    352|                MonoAtomCount++;
 2238|    352|              }
 2239|       |
 2240|    380|            if( prev != -1 )
  ------------------
  |  Branch (2240:17): [True: 326, False: 54]
  ------------------
 2241|    326|              {
 2242|    326|                MonoBond[MonoBondCount].flag = type;
 2243|    326|                MonoBond[MonoBondCount].src = prev;
 2244|    326|                MonoBond[MonoBondCount].dst = next;
 2245|    326|                MonoBondCount++;
 2246|       |
 2247|    326|                MonoAtom[prev].bcount++;
 2248|    326|                MonoAtom[next].bcount++;
 2249|    326|              }
 2250|    380|            prev = next;
 2251|    810|          }
 2252|    810|      }
 2253|     54|    return( ptr-1 );
 2254|    106|  }
chains.cpp:_ZN9OpenBabelL16AllocateByteCodeEi:
  418|  3.14k|  {
  419|  3.14k|    ByteCode *result;
  420|       |
  421|  3.14k|    result = new ByteCode;
  422|  3.14k|    if( !result )
  ------------------
  |  Branch (422:9): [True: 0, False: 3.14k]
  ------------------
  423|      0|      {
  424|      0|        obErrorLog.ThrowError(__FUNCTION__, "Unable to allocate byte codes for biomolecule residue perception.", obError);
  425|      0|        return (result);
  426|      0|      }
  427|  3.14k|    result->type = type;
  428|  3.14k|    result->eval.next     = nullptr;
  429|  3.14k|    result->count.tcond   = nullptr;
  430|  3.14k|    result->count.fcond   = nullptr;
  431|  3.14k|    result->elem.tcond    = nullptr;
  432|  3.14k|    result->elem.fcond    = nullptr;
  433|  3.14k|    result->ident.tcond   = nullptr;
  434|  3.14k|    result->ident.fcond   = nullptr;
  435|  3.14k|    result->local.tcond   = nullptr;
  436|  3.14k|    result->local.fcond   = nullptr;
  437|  3.14k|    result->assign.atomid = nullptr;
  438|  3.14k|    result->assign.bflags = nullptr;
  439|       |
  440|  3.14k|    return (result);
  441|  3.14k|  }

_ZN9OpenBabel15FromFileChargesC2EPKc:
   45|      2|			FromFileCharges(const char* ID) : OBChargeModel(ID, false){
   46|      2|			};

_ZN9OpenBabel16GasteigerChargesC2EPKc:
   30|      2|  GasteigerCharges(const char* ID) : OBChargeModel(ID, false){};

_ZN9OpenBabel13MMFF94ChargesC2EPKc:
   34|      2|  MMFF94Charges(const char* ID) : OBChargeModel(ID, false){};

_ZN9OpenBabel9NoChargesC2EPKc:
   32|      2|  NoCharges(const char* ID) : OBChargeModel(ID, false){};

_ZN9OpenBabel11OBTypeTableC2Ev:
  248|      2|  {
  249|      2|    _init = false;
  250|      2|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      2|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
  251|      2|    _envvar = "BABEL_DATADIR";
  252|      2|    _filename = "types.txt";
  253|      2|    _subdir = "data";
  254|      2|    _dataptr = TypesData;
  255|      2|    _linecount = 0;
  256|      2|    _from = _to = -1;
  257|      2|  }
_ZN9OpenBabel11OBTypeTable9ParseLineEPKc:
  260|    198|  {
  261|    198|    if (buffer[0] == '#')
  ------------------
  |  Branch (261:9): [True: 0, False: 198]
  ------------------
  262|      0|      return; // just a comment line
  263|       |
  264|    198|    if (_linecount == 0) {
  ------------------
  |  Branch (264:9): [True: 1, False: 197]
  ------------------
  265|      1|      tokenize(_colnames,buffer);
  266|      1|      _ncols = _colnames.size();
  267|      1|    }
  268|    197|    else
  269|    197|      {
  270|    197|        vector<string> vc;
  271|    197|        tokenize(vc,buffer);
  272|    197|        if (vc.size() == (unsigned)_ncols)
  ------------------
  |  Branch (272:13): [True: 197, False: 0]
  ------------------
  273|    197|          _table.push_back(vc);
  274|      0|        else
  275|      0|          {
  276|      0|            stringstream errorMsg;
  277|      0|            errorMsg << " Could not parse line in type translation table types.txt -- incorect number of columns";
  278|      0|            errorMsg << " found " << vc.size() << " expected " << _ncols << ".";
  279|      0|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obInfo);
  280|      0|          }
  281|    197|      }
  282|    198|    _linecount++;
  283|    198|  }
_ZN9OpenBabel11OBTypeTable11SetFromTypeEPKc:
  286|  6.96k|  {
  287|  6.96k|    if (!_init)
  ------------------
  |  Branch (287:9): [True: 0, False: 6.96k]
  ------------------
  288|      0|      Init();
  289|       |
  290|  6.96k|    string tmp = from;
  291|       |
  292|  6.96k|    unsigned int i;
  293|  10.4k|    for (i = 0;i < _colnames.size();++i)
  ------------------
  |  Branch (293:16): [True: 10.4k, False: 0]
  ------------------
  294|  10.4k|      if (tmp == _colnames[i])
  ------------------
  |  Branch (294:11): [True: 6.96k, False: 3.48k]
  ------------------
  295|  6.96k|        {
  296|  6.96k|          _from = i;
  297|  6.96k|          return(true);
  298|  6.96k|        }
  299|       |
  300|      0|    obErrorLog.ThrowError(__FUNCTION__, "Requested type column not found", obInfo);
  301|       |
  302|      0|    return(false);
  303|  6.96k|  }
_ZN9OpenBabel11OBTypeTable9SetToTypeEPKc:
  306|  6.96k|  {
  307|  6.96k|    if (!_init)
  ------------------
  |  Branch (307:9): [True: 0, False: 6.96k]
  ------------------
  308|      0|      Init();
  309|       |
  310|  6.96k|    string tmp = to;
  311|       |
  312|  6.96k|    unsigned int i;
  313|  6.96k|    for (i = 0;i < _colnames.size();++i)
  ------------------
  |  Branch (313:16): [True: 6.96k, False: 0]
  ------------------
  314|  6.96k|      if (tmp == _colnames[i])
  ------------------
  |  Branch (314:11): [True: 6.96k, False: 0]
  ------------------
  315|  6.96k|        {
  316|  6.96k|          _to = i;
  317|  6.96k|          return(true);
  318|  6.96k|        }
  319|       |
  320|      0|    obErrorLog.ThrowError(__FUNCTION__, "Requested type column not found", obInfo);
  321|       |
  322|      0|    return(false);
  323|  6.96k|  }
_ZN9OpenBabel11OBTypeTable9TranslateEPcPKc:
  331|  3.48k|  {
  332|  3.48k|    if (!_init)
  ------------------
  |  Branch (332:9): [True: 0, False: 3.48k]
  ------------------
  333|      0|      Init();
  334|       |
  335|  3.48k|    bool rval;
  336|  3.48k|    string sto,sfrom;
  337|  3.48k|    sfrom = from;
  338|  3.48k|    rval = Translate(sto,sfrom);
  339|  3.48k|    strncpy(to,(char*)sto.c_str(), OBATOM_TYPE_LEN - 1);
  ------------------
  |  |  126|  3.48k| #define OBATOM_TYPE_LEN 6
  ------------------
  340|  3.48k|    to[OBATOM_TYPE_LEN - 1] = '\0';
  ------------------
  |  |  126|  3.48k| #define OBATOM_TYPE_LEN 6
  ------------------
  341|       |
  342|  3.48k|    return(rval);
  343|  3.48k|  }
_ZN9OpenBabel11OBTypeTable9TranslateERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_:
  346|  3.48k|  {
  347|  3.48k|    if (!_init)
  ------------------
  |  Branch (347:9): [True: 0, False: 3.48k]
  ------------------
  348|      0|      Init();
  349|       |
  350|  3.48k|    if (from == "")
  ------------------
  |  Branch (350:9): [True: 0, False: 3.48k]
  ------------------
  351|      0|      return(false);
  352|       |
  353|  3.48k|    if (_from >= 0 && _to >= 0 &&
  ------------------
  |  Branch (353:9): [True: 3.48k, False: 0]
  |  Branch (353:23): [True: 3.48k, False: 0]
  ------------------
  354|  3.48k|        _from < (signed)_table.size() && _to < (signed)_table.size())
  ------------------
  |  Branch (354:9): [True: 3.48k, False: 0]
  |  Branch (354:42): [True: 3.48k, False: 0]
  ------------------
  355|  3.48k|      {
  356|  3.48k|        vector<vector<string> >::iterator i;
  357|   265k|        for (i = _table.begin();i != _table.end();++i)
  ------------------
  |  Branch (357:33): [True: 265k, False: 0]
  ------------------
  358|   265k|          if ((signed)(*i).size() > _from &&  (*i)[_from] == from)
  ------------------
  |  Branch (358:15): [True: 265k, False: 0]
  |  Branch (358:47): [True: 3.48k, False: 262k]
  ------------------
  359|  3.48k|            {
  360|  3.48k|              to = (*i)[_to];
  361|  3.48k|              return(true);
  362|  3.48k|            }
  363|  3.48k|      }
  364|       |
  365|       |    // Throw an error, copy the string and return false
  366|      0|    obErrorLog.ThrowError(__FUNCTION__, "Cannot perform atom type translation: table cannot find requested types.", obWarning);
  367|      0|    to = from;
  368|      0|    return(false);
  369|  3.48k|  }
_ZN9OpenBabel11OBTypeTable11GetFromTypeEv:
  396|  3.48k|  {
  397|  3.48k|    if (!_init)
  ------------------
  |  Branch (397:9): [True: 1, False: 3.48k]
  ------------------
  398|      1|      Init();
  399|       |
  400|  3.48k|    if (_from > 0 && _from < (signed)_table.size())
  ------------------
  |  Branch (400:9): [True: 0, False: 3.48k]
  |  Branch (400:22): [True: 0, False: 0]
  ------------------
  401|      0|      return( _colnames[_from] );
  402|  3.48k|    else
  403|  3.48k|      return( _colnames[0] );
  404|  3.48k|  }
_ZN9OpenBabel11OBTypeTable9GetToTypeEv:
  407|  3.48k|  {
  408|  3.48k|    if (!_init)
  ------------------
  |  Branch (408:9): [True: 0, False: 3.48k]
  ------------------
  409|      0|      Init();
  410|       |
  411|  3.48k|    if (_to > 0 && _to < (signed)_table.size())
  ------------------
  |  Branch (411:9): [True: 0, False: 3.48k]
  |  Branch (411:20): [True: 0, False: 0]
  ------------------
  412|      0|      return( _colnames[_to] );
  413|  3.48k|    else
  414|  3.48k|      return( _colnames[0] );
  415|  3.48k|  }
_ZN9OpenBabel13OBResidueDataC2Ev:
  433|      2|  {
  434|      2|    _init = false;
  435|      2|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      2|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
  436|      2|    _envvar = "BABEL_DATADIR";
  437|      2|    _filename = "resdata.txt";
  438|      2|    _subdir = "data";
  439|      2|    _dataptr = ResidueData;
  440|      2|  }
_ZN9OpenBabel13OBResidueData11AssignBondsERNS_5OBMolE:
  443|  6.05k|  {
  444|  6.05k|    if (!_init)
  ------------------
  |  Branch (444:9): [True: 1, False: 6.05k]
  ------------------
  445|      1|      Init();
  446|       |
  447|  6.05k|    OBAtom *a1,*a2;
  448|  6.05k|    OBResidue *r1,*r2;
  449|  6.05k|    vector<OBAtom*>::iterator i,j;
  450|  6.05k|    vector3 v;
  451|       |
  452|  6.05k|    int bo;
  453|  6.05k|    string skipres = ""; // Residue Number to skip
  454|  6.05k|    string rname = "";
  455|       |    //assign residue bonds
  456|   286k|    for (a1 = mol.BeginAtom(i);a1;a1 = mol.NextAtom(i))
  ------------------
  |  Branch (456:32): [True: 280k, False: 6.05k]
  ------------------
  457|   280k|      {
  458|   280k|        r1 = a1->GetResidue();
  459|   280k|        if (r1 == nullptr) // atoms may not have residues
  ------------------
  |  Branch (459:13): [True: 0, False: 280k]
  ------------------
  460|      0|          continue;
  461|       |
  462|   280k|        if (skipres.length() && r1->GetNumString() == skipres)
  ------------------
  |  Branch (462:13): [True: 259k, False: 21.9k]
  |  Branch (462:13): [True: 70.9k, False: 210k]
  |  Branch (462:33): [True: 70.9k, False: 188k]
  ------------------
  463|  70.9k|          continue;
  464|       |
  465|   210k|        if (r1->GetName() != rname)
  ------------------
  |  Branch (465:13): [True: 183k, False: 26.1k]
  ------------------
  466|   183k|          {
  467|   183k|            skipres = SetResName(r1->GetName()) ? "" : r1->GetNumString();
  ------------------
  |  Branch (467:23): [True: 6.66k, False: 177k]
  ------------------
  468|   183k|            rname = r1->GetName();
  469|   183k|          }
  470|       |        //assign bonds for each atom
  471|   328k|        for (j=i,a2 = mol.NextAtom(j);a2;a2 = mol.NextAtom(j))
  ------------------
  |  Branch (471:39): [True: 321k, False: 6.36k]
  ------------------
  472|   321k|          {
  473|   321k|            r2 = a2->GetResidue();
  474|   321k|            if (r2 == nullptr) // atoms may not have residues
  ------------------
  |  Branch (474:17): [True: 0, False: 321k]
  ------------------
  475|      0|              continue;
  476|       |
  477|   321k|            if (r1->GetNumString() != r2->GetNumString())
  ------------------
  |  Branch (477:17): [True: 196k, False: 125k]
  ------------------
  478|   196k|              break;
  479|   125k|            if (r1->GetName() != r2->GetName())
  ------------------
  |  Branch (479:17): [True: 6.22k, False: 119k]
  ------------------
  480|  6.22k|              break;
  481|   119k|            if (r1->GetChain() != r2->GetChain())
  ------------------
  |  Branch (481:17): [True: 739, False: 118k]
  ------------------
  482|    739|              break; // Fixes PR#2889763 - Fabian
  483|       |
  484|   118k|            if ((bo = LookupBO(r1->GetAtomID(a1),r2->GetAtomID(a2))))
  ------------------
  |  Branch (484:17): [True: 0, False: 118k]
  ------------------
  485|      0|              {
  486|       |                // Suggested by Liu Zhiguo 2007-08-13
  487|       |                // for predefined residues, don't perceive connection
  488|       |                // by distance
  489|       |                //                v = a1->GetVector() - a2->GetVector();
  490|       |                //                if (v.length_2() < 3.5) //check by distance
  491|      0|                  mol.AddBond(a1->GetIdx(),a2->GetIdx(),bo);
  492|      0|              }
  493|   118k|          }
  494|   210k|      }
  495|       |
  496|  6.05k|    int hyb;
  497|  6.05k|    string type;
  498|       |
  499|       |    //types and hybridization
  500|  6.05k|    rname = ""; // name of current residue
  501|  6.05k|    skipres = ""; // don't skip any residues right now
  502|   286k|    for (a1 = mol.BeginAtom(i);a1;a1 = mol.NextAtom(i))
  ------------------
  |  Branch (502:32): [True: 280k, False: 6.05k]
  ------------------
  503|   280k|      {
  504|   280k|        if (a1->GetAtomicNum() == OBElements::Oxygen && !a1->GetExplicitDegree())
  ------------------
  |  Branch (504:13): [True: 11.4k, False: 269k]
  |  Branch (504:57): [True: 11.4k, False: 33]
  ------------------
  505|  11.4k|          {
  506|  11.4k|            a1->SetType("O3");
  507|  11.4k|            continue;
  508|  11.4k|          }
  509|   269k|        if (a1->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (509:13): [True: 8.38k, False: 261k]
  ------------------
  510|  8.38k|          {
  511|  8.38k|            a1->SetType("H");
  512|  8.38k|            continue;
  513|  8.38k|          }
  514|       |
  515|       |        //***valence rule for O-
  516|   261k|        if (a1->GetAtomicNum() == OBElements::Oxygen && a1->GetExplicitDegree() == 1)
  ------------------
  |  Branch (516:13): [True: 33, False: 261k]
  |  Branch (516:57): [True: 31, False: 2]
  ------------------
  517|     31|          {
  518|     31|            OBBond *bond;
  519|     31|            bond = (OBBond*)*(a1->BeginBonds());
  520|     31|            if (bond->GetBondOrder() == 2)
  ------------------
  |  Branch (520:17): [True: 4, False: 27]
  ------------------
  521|      4|              {
  522|      4|                a1->SetType("O2");
  523|      4|                a1->SetHyb(2);
  524|      4|              }
  525|     27|            else if (bond->GetBondOrder() == 1)
  ------------------
  |  Branch (525:22): [True: 8, False: 19]
  ------------------
  526|      8|              {
  527|       |                // Leave the protonation/deprotonation to phmodel.txt
  528|      8|                a1->SetType("O3");
  529|      8|                a1->SetHyb(3);
  530|       |                // PR#3203039 -- Fix from Magnus Lundborg
  531|       |                //                a1->SetFormalCharge(0);
  532|      8|              }
  533|     31|            continue;
  534|     31|          }
  535|       |
  536|   261k|        r1 = a1->GetResidue();
  537|   261k|        if (r1 == nullptr) continue; // atoms may not have residues
  ------------------
  |  Branch (537:13): [True: 0, False: 261k]
  ------------------
  538|   261k|        if (skipres.length() && r1->GetNumString() == skipres)
  ------------------
  |  Branch (538:13): [True: 239k, False: 21.7k]
  |  Branch (538:13): [True: 69.1k, False: 191k]
  |  Branch (538:33): [True: 69.1k, False: 170k]
  ------------------
  539|  69.1k|          continue;
  540|       |
  541|   191k|        if (r1->GetName() != rname)
  ------------------
  |  Branch (541:13): [True: 165k, False: 26.2k]
  ------------------
  542|   165k|          {
  543|       |            // if SetResName fails, skip this residue
  544|   165k|            skipres = SetResName(r1->GetName()) ? "" : r1->GetNumString();
  ------------------
  |  Branch (544:23): [True: 6.48k, False: 159k]
  ------------------
  545|   165k|            rname = r1->GetName();
  546|   165k|          }
  547|       |
  548|   191k|        if (LookupType(r1->GetAtomID(a1),type,hyb))
  ------------------
  |  Branch (548:13): [True: 0, False: 191k]
  ------------------
  549|      0|          {
  550|      0|            a1->SetType(type);
  551|      0|            a1->SetHyb(hyb);
  552|      0|          }
  553|   191k|        else // try to figure it out by bond order ???
  554|   191k|          {}
  555|   191k|      }
  556|       |
  557|  6.05k|    return(true);
  558|  6.05k|  }
_ZN9OpenBabel13OBResidueData9ParseLineEPKc:
  561|  1.08k|  {
  562|  1.08k|    int bo;
  563|  1.08k|    string s;
  564|  1.08k|    vector<string> vs;
  565|       |
  566|  1.08k|    if (buffer[0] == '#')
  ------------------
  |  Branch (566:9): [True: 0, False: 1.08k]
  ------------------
  567|      0|      return;
  568|       |
  569|  1.08k|    tokenize(vs,buffer);
  570|  1.08k|    if (!vs.empty())
  ------------------
  |  Branch (570:9): [True: 1.08k, False: 0]
  ------------------
  571|  1.08k|      {
  572|  1.08k|        if (vs[0] == "BOND")
  ------------------
  |  Branch (572:13): [True: 621, False: 464]
  ------------------
  573|    621|          {
  574|    621|            s = (vs[1] < vs[2]) ? vs[1] + " " + vs[2] :
  ------------------
  |  Branch (574:17): [True: 361, False: 260]
  ------------------
  575|    621|              vs[2] + " " + vs[1];
  576|    621|            bo = atoi(vs[3].c_str());
  577|    621|            _vtmp.push_back(pair<string,int> (s,bo));
  578|    621|          }
  579|       |
  580|  1.08k|        if (vs[0] == "ATOM" && vs.size() == 4)
  ------------------
  |  Branch (580:13): [True: 386, False: 699]
  |  Branch (580:32): [True: 296, False: 90]
  ------------------
  581|    296|          {
  582|    296|            _vatmtmp.push_back(vs[1]);
  583|    296|            _vatmtmp.push_back(vs[2]);
  584|    296|            _vatmtmp.push_back(vs[3]);
  585|    296|          }
  586|       |
  587|  1.08k|        if (vs[0] == "RES")
  ------------------
  |  Branch (587:13): [True: 39, False: 1.04k]
  ------------------
  588|     39|          _resname.push_back(vs[1]);
  589|       |
  590|  1.08k|        if (vs[0]== "END")
  ------------------
  |  Branch (590:13): [True: 39, False: 1.04k]
  ------------------
  591|     39|          {
  592|     39|            _resatoms.push_back(_vatmtmp);
  593|     39|            _resbonds.push_back(_vtmp);
  594|     39|            _vtmp.clear();
  595|     39|            _vatmtmp.clear();
  596|     39|          }
  597|  1.08k|      }
  598|  1.08k|  }
_ZN9OpenBabel13OBResidueData10SetResNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  601|   349k|  {
  602|   349k|    if (!_init)
  ------------------
  |  Branch (602:9): [True: 0, False: 349k]
  ------------------
  603|      0|      Init();
  604|       |
  605|   349k|    unsigned int i;
  606|       |
  607|  13.6M|    for (i = 0;i < _resname.size();++i)
  ------------------
  |  Branch (607:16): [True: 13.3M, False: 336k]
  ------------------
  608|  13.3M|      if (_resname[i] == s)
  ------------------
  |  Branch (608:11): [True: 13.1k, False: 13.3M]
  ------------------
  609|  13.1k|        {
  610|  13.1k|          _resnum = i;
  611|  13.1k|          return(true);
  612|  13.1k|        }
  613|       |
  614|   336k|    _resnum = -1;
  615|   336k|    return(false);
  616|   349k|  }
_ZN9OpenBabel13OBResidueData8LookupBOERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  632|   118k|  {
  633|   118k|    if (_resnum == -1)
  ------------------
  |  Branch (633:9): [True: 97.3k, False: 20.9k]
  ------------------
  634|  97.3k|      return(0);
  635|  20.9k|    string s;
  636|       |
  637|  20.9k|    s = (s1 < s2) ? s1 + " " + s2 : s2 + " " + s1;
  ------------------
  |  Branch (637:9): [True: 3.38k, False: 17.5k]
  ------------------
  638|       |
  639|  20.9k|    unsigned int i;
  640|   463k|    for (i = 0;i < _resbonds[_resnum].size();++i)
  ------------------
  |  Branch (640:16): [True: 442k, False: 20.9k]
  ------------------
  641|   442k|      if (_resbonds[_resnum][i].first == s)
  ------------------
  |  Branch (641:11): [True: 0, False: 442k]
  ------------------
  642|      0|        return(_resbonds[_resnum][i].second);
  643|       |
  644|  20.9k|    return(0);
  645|  20.9k|  }
_ZN9OpenBabel13OBResidueData10LookupTypeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERS7_Ri:
  648|   191k|  {
  649|   191k|    if (_resnum == -1)
  ------------------
  |  Branch (649:9): [True: 175k, False: 15.9k]
  ------------------
  650|   175k|      return(false);
  651|       |
  652|  15.9k|    string s;
  653|  15.9k|    vector<string>::iterator i;
  654|       |
  655|   166k|    for (i = _resatoms[_resnum].begin();i != _resatoms[_resnum].end();i+=3)
  ------------------
  |  Branch (655:41): [True: 150k, False: 15.9k]
  ------------------
  656|   150k|      if (atmid == *i)
  ------------------
  |  Branch (656:11): [True: 0, False: 150k]
  ------------------
  657|      0|        {
  658|      0|          ++i;
  659|      0|          type = *i;
  660|      0|          ++i;
  661|      0|          hyb = atoi((*i).c_str());
  662|      0|          return(true);
  663|      0|        }
  664|       |
  665|  15.9k|    return(false);
  666|  15.9k|  }
_ZN9OpenBabel16OBGlobalDataBase4InitEv:
  669|      6|  {
  670|      6|    if (_init)
  ------------------
  |  Branch (670:9): [True: 0, False: 6]
  ------------------
  671|      0|      return;
  672|      6|    _init = true;
  673|       |
  674|      6|    ifstream ifs;
  675|      6|    char charBuffer[BUFF_SIZE];
  676|       |
  677|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  678|      6|    obLocale.SetLocale();
  679|       |
  680|       |    // Check return value from OpenDatafile
  681|       |    // Suggestion from Zhiguo Liu
  682|      6|    string fn_open = OpenDatafile(ifs, _filename, _envvar);
  683|       |    
  684|       |    // Check _subdir directory
  685|      6|    if (fn_open == "")
  ------------------
  |  Branch (685:9): [True: 6, False: 0]
  ------------------
  686|      6|      string fn_open = OpenDatafile(ifs, _filename, _subdir);
  687|       |
  688|      6|    if (fn_open != "" && (ifs))
  ------------------
  |  Branch (688:9): [True: 0, False: 6]
  |  Branch (688:26): [True: 0, False: 0]
  ------------------
  689|      0|      {
  690|      0|        while(ifs.getline(charBuffer,BUFF_SIZE))
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  |  Branch (690:15): [True: 0, False: 0]
  ------------------
  691|      0|          ParseLine(charBuffer);
  692|      0|      }
  693|       |
  694|      6|    else
  695|       |      // If all else fails, use the compiled in values
  696|      6|      if (_dataptr)
  ------------------
  |  Branch (696:11): [True: 6, False: 0]
  ------------------
  697|      6|        {
  698|      6|          obErrorLog.ThrowError(__FUNCTION__, "Cannot open " + _filename + " defaulting to compiled data.", obDebug);
  699|       |
  700|      6|          const char *p1,*p2;
  701|   139k|          for (p1 = p2 = _dataptr;*p2 != '\0';++p2)
  ------------------
  |  Branch (701:35): [True: 139k, False: 6]
  ------------------
  702|   139k|            if (*p2 == '\n')
  ------------------
  |  Branch (702:17): [True: 10.6k, False: 128k]
  ------------------
  703|  10.6k|              {
  704|  10.6k|                strncpy(charBuffer, p1, (p2 - p1));
  705|  10.6k|                charBuffer[(p2 - p1)] = '\0';
  706|  10.6k|                ParseLine(charBuffer);
  707|  10.6k|                p1 = p2 + 1;
  708|  10.6k|              }
  709|      6|        }
  710|      0|      else
  711|      0|        {
  712|      0|          string s = "Unable to open data file '";
  713|      0|          s += _filename;
  714|      0|          s += "'";
  715|      0|          obErrorLog.ThrowError(__FUNCTION__, s, obWarning);
  716|      0|        }
  717|       |
  718|       |    // return the locale to the original one
  719|      6|    obLocale.RestoreLocale();
  720|       |
  721|      6|    if (ifs)
  ------------------
  |  Branch (721:9): [True: 0, False: 6]
  ------------------
  722|      0|      ifs.close();
  723|       |
  724|      6|    if (GetSize() == 0)
  ------------------
  |  Branch (724:9): [True: 1, False: 5]
  ------------------
  725|      1|      {
  726|      1|        string s = "Cannot initialize database '";
  727|      1|        s += _filename;
  728|      1|        s += "' which may cause further errors.";
  729|      1|        obErrorLog.ThrowError(__FUNCTION__, s, obWarning);
  730|      1|      }
  731|       |
  732|      6|  }

_ZN9OpenBabel9CanSmilesC2EPKcb:
   31|      4|  CanSmiles(const char* ID, bool noStereo) : OBDescriptor(ID), _noStereo(noStereo){};

_ZN9OpenBabel14CompoundFilterC2EPKcS2_S2_:
   55|      2|    : OBDescriptor(ID), _descr(descr), _macroText(macrotext){}

_ZN9OpenBabel8MWFilterC2EPKc:
   33|      2|  MWFilter(const char *ID) : OBDescriptor(ID){};
_ZN9OpenBabel20RotatableBondsFilterC2EPKc:
   47|      2|  RotatableBondsFilter(const char *ID) : OBDescriptor(ID){};
_ZN9OpenBabel12SmartsFilterC2EPKc:
   64|      4|  SmartsFilter(const char *ID) : OBDescriptor(ID){};
_ZN9OpenBabel11TitleFilterC2EPKc:
  107|      2|  TitleFilter(const char *ID) : OBDescriptor(ID){};
_ZN9OpenBabel17FormulaDescriptorC2EPKc:
  151|      2|  FormulaDescriptor(const char *ID) : OBDescriptor(ID){};

_ZN9OpenBabel11InChIFilterC2EPKcb:
   33|      4|  InChIFilter(const char* ID, bool useKey=false) : OBDescriptor(ID), bKey(useKey) {};

_ZN9OpenBabel16SmartsDescriptorC2EPKcS2_S2_:
   35|      8|      : OBDescriptor(ID, false), _smarts(smarts), _descr(descr){}

_ZN9OpenBabel10OBElements9GetSymbolEj:
   90|   567k|    {
   91|   567k|      if (atomic_number > NUMELEMENTS)
  ------------------
  |  |   22|   567k|#define NUMELEMENTS 118
  ------------------
  |  Branch (91:11): [True: 4, False: 567k]
  ------------------
   92|      4|        return "";
   93|   567k|      return element_symbols[atomic_number];
   94|   567k|    }
_ZN9OpenBabel10OBElements7GetMassEj:
  104|   391k|    {
  105|   391k|      if (atomic_number > NUMELEMENTS)
  ------------------
  |  |   22|   391k|#define NUMELEMENTS 118
  ------------------
  |  Branch (105:11): [True: 4, False: 391k]
  ------------------
  106|      4|        return 0.0;
  107|   391k|      return atomic_mass[atomic_number];
  108|   391k|    }
_ZN9OpenBabel10OBElements14GetCovalentRadEj:
  118|  1.67M|    {
  119|  1.67M|      if (atomic_number > NUMELEMENTS)
  ------------------
  |  |   22|  1.67M|#define NUMELEMENTS 118
  ------------------
  |  Branch (119:11): [True: 0, False: 1.67M]
  ------------------
  120|      0|        return 0.0;
  121|  1.67M|      return cov_rad[atomic_number];
  122|  1.67M|    }
_ZN9OpenBabel10OBElements11GetMaxBondsEj:
  146|  2.95M|    {
  147|  2.95M|      if (atomic_number > NUMELEMENTS)
  ------------------
  |  |   22|  2.95M|#define NUMELEMENTS 118
  ------------------
  |  Branch (147:11): [True: 14, False: 2.95M]
  ------------------
  148|     14|        return 0;
  149|  2.95M|      return maxbonds[atomic_number];
  150|  2.95M|    }
_ZN9OpenBabel10OBElements13GetElectroNegEj:
  153|   488k|    {
  154|   488k|      if (atomic_number > NUMELEMENTS)
  ------------------
  |  |   22|   488k|#define NUMELEMENTS 118
  ------------------
  |  Branch (154:11): [True: 11, False: 488k]
  ------------------
  155|     11|        return 0.0;
  156|   488k|      return eneg_pauling[atomic_number];
  157|   488k|    }
_ZN9OpenBabel10OBElements12GetAtomicNumEPKc:
  175|   451k|    {
  176|   451k|      switch (ptr[0]) {
  ------------------
  |  Branch (176:15): [True: 360k, False: 90.3k]
  ------------------
  177|  5.86k|      case 'A':
  ------------------
  |  Branch (177:7): [True: 5.86k, False: 445k]
  ------------------
  178|  5.86k|        switch (ptr[1]) {
  ------------------
  |  Branch (178:17): [True: 5.20k, False: 657]
  ------------------
  179|     41|        case 'c':
  ------------------
  |  Branch (179:9): [True: 41, False: 5.82k]
  ------------------
  180|     41|          if (ptr[2] == '\0') { // Ac
  ------------------
  |  Branch (180:15): [True: 40, False: 1]
  ------------------
  181|     40|            return 89; // Actinium
  182|     40|          }
  183|      1|          break;
  184|     23|        case 'g':
  ------------------
  |  Branch (184:9): [True: 23, False: 5.84k]
  ------------------
  185|     23|          if (ptr[2] == '\0') { // Ag
  ------------------
  |  Branch (185:15): [True: 22, False: 1]
  ------------------
  186|     22|            return 47; // Silver
  187|     22|          }
  188|      1|          break;
  189|  1.98k|        case 'l':
  ------------------
  |  Branch (189:9): [True: 1.98k, False: 3.88k]
  ------------------
  190|  1.98k|          if (ptr[2] == '\0') { // Al
  ------------------
  |  Branch (190:15): [True: 1.97k, False: 3]
  ------------------
  191|  1.97k|            return 13; // Aluminium
  192|  1.97k|          }
  193|      3|          break;
  194|    187|        case 'm':
  ------------------
  |  Branch (194:9): [True: 187, False: 5.67k]
  ------------------
  195|    187|          if (ptr[2] == '\0') { // Am
  ------------------
  |  Branch (195:15): [True: 143, False: 44]
  ------------------
  196|    143|            return 95; // Americium
  197|    143|          }
  198|     44|          break;
  199|    566|        case 'r':
  ------------------
  |  Branch (199:9): [True: 566, False: 5.29k]
  ------------------
  200|    566|          if (ptr[2] == '\0') { // Ar
  ------------------
  |  Branch (200:15): [True: 539, False: 27]
  ------------------
  201|    539|            return 18; // Argon
  202|    539|          }
  203|     27|          break;
  204|  1.67k|        case 's':
  ------------------
  |  Branch (204:9): [True: 1.67k, False: 4.19k]
  ------------------
  205|  1.67k|          if (ptr[2] == '\0') { // As
  ------------------
  |  Branch (205:15): [True: 1.66k, False: 7]
  ------------------
  206|  1.66k|            return 33; // Arsenic
  207|  1.66k|          }
  208|      7|          break;
  209|    722|        case 't':
  ------------------
  |  Branch (209:9): [True: 722, False: 5.14k]
  ------------------
  210|    722|          if (ptr[2] == '\0') { // At
  ------------------
  |  Branch (210:15): [True: 721, False: 1]
  ------------------
  211|    721|            return 85; // Astatine
  212|    721|          }
  213|      1|          break;
  214|     13|        case 'u':
  ------------------
  |  Branch (214:9): [True: 13, False: 5.85k]
  ------------------
  215|     13|          if (ptr[2] == '\0') { // Au
  ------------------
  |  Branch (215:15): [True: 12, False: 1]
  ------------------
  216|     12|            return 79; // Gold
  217|     12|          }
  218|      1|          break;
  219|  5.86k|        }
  220|    742|        break;
  221|  6.25k|      case 'B':
  ------------------
  |  Branch (221:7): [True: 6.25k, False: 445k]
  ------------------
  222|  6.25k|        switch (ptr[1]) {
  ------------------
  |  Branch (222:17): [True: 5.58k, False: 664]
  ------------------
  223|    797|        case '\0': // B
  ------------------
  |  Branch (223:9): [True: 797, False: 5.45k]
  ------------------
  224|    797|          return 5; // Boron
  225|    755|        case 'a':
  ------------------
  |  Branch (225:9): [True: 755, False: 5.49k]
  ------------------
  226|    755|          if (ptr[2] == '\0') { // Ba
  ------------------
  |  Branch (226:15): [True: 744, False: 11]
  ------------------
  227|    744|            return 56; // Barium
  228|    744|          }
  229|     11|          break;
  230|    384|        case 'e':
  ------------------
  |  Branch (230:9): [True: 384, False: 5.86k]
  ------------------
  231|    384|          if (ptr[2] == '\0') { // Be
  ------------------
  |  Branch (231:15): [True: 383, False: 1]
  ------------------
  232|    383|            return 4; // Beryllium
  233|    383|          }
  234|      1|          break;
  235|    127|        case 'h':
  ------------------
  |  Branch (235:9): [True: 127, False: 6.12k]
  ------------------
  236|    127|          if (ptr[2] == '\0') { // Bh
  ------------------
  |  Branch (236:15): [True: 117, False: 10]
  ------------------
  237|    117|            return 107; // Bohrium
  238|    117|          }
  239|     10|          break;
  240|  2.57k|        case 'i':
  ------------------
  |  Branch (240:9): [True: 2.57k, False: 3.67k]
  ------------------
  241|  2.57k|          if (ptr[2] == '\0') { // Bi
  ------------------
  |  Branch (241:15): [True: 2.57k, False: 3]
  ------------------
  242|  2.57k|            return 83; // Bismuth
  243|  2.57k|          }
  244|      3|          break;
  245|     36|        case 'k':
  ------------------
  |  Branch (245:9): [True: 36, False: 6.21k]
  ------------------
  246|     36|          if (ptr[2] == '\0') { // Bk
  ------------------
  |  Branch (246:15): [True: 35, False: 1]
  ------------------
  247|     35|            return 97; // Berkelium
  248|     35|          }
  249|      1|          break;
  250|    909|        case 'r':
  ------------------
  |  Branch (250:9): [True: 909, False: 5.34k]
  ------------------
  251|    909|          if (ptr[2] == '\0') { // Br
  ------------------
  |  Branch (251:15): [True: 906, False: 3]
  ------------------
  252|    906|            return 35; // Bromine
  253|    906|          }
  254|      3|          break;
  255|  6.25k|        }
  256|    693|        break;
  257|  13.2k|      case 'C':
  ------------------
  |  Branch (257:7): [True: 13.2k, False: 438k]
  ------------------
  258|  13.2k|        switch (ptr[1]) {
  ------------------
  |  Branch (258:17): [True: 6.83k, False: 6.37k]
  ------------------
  259|  3.89k|        case '\0': // C
  ------------------
  |  Branch (259:9): [True: 3.89k, False: 9.32k]
  ------------------
  260|  3.89k|          return 6; // Carbon
  261|    843|        case 'a':
  ------------------
  |  Branch (261:9): [True: 843, False: 12.3k]
  ------------------
  262|    843|          if (ptr[2] == '\0') { // Ca
  ------------------
  |  Branch (262:15): [True: 833, False: 10]
  ------------------
  263|    833|            return 20; // Calcium
  264|    833|          }
  265|     10|          break;
  266|     64|        case 'd':
  ------------------
  |  Branch (266:9): [True: 64, False: 13.1k]
  ------------------
  267|     64|          if (ptr[2] == '\0') { // Cd
  ------------------
  |  Branch (267:15): [True: 54, False: 10]
  ------------------
  268|     54|            return 48; // Cadmium
  269|     54|          }
  270|     10|          break;
  271|    106|        case 'e':
  ------------------
  |  Branch (271:9): [True: 106, False: 13.1k]
  ------------------
  272|    106|          if (ptr[2] == '\0') { // Ce
  ------------------
  |  Branch (272:15): [True: 103, False: 3]
  ------------------
  273|    103|            return 58; // Cerium
  274|    103|          }
  275|      3|          break;
  276|     21|        case 'f':
  ------------------
  |  Branch (276:9): [True: 21, False: 13.1k]
  ------------------
  277|     21|          if (ptr[2] == '\0') { // Cf
  ------------------
  |  Branch (277:15): [True: 20, False: 1]
  ------------------
  278|     20|            return 98; // Californium
  279|     20|          }
  280|      1|          break;
  281|    210|        case 'l':
  ------------------
  |  Branch (281:9): [True: 210, False: 13.0k]
  ------------------
  282|    210|          if (ptr[2] == '\0') { // Cl
  ------------------
  |  Branch (282:15): [True: 207, False: 3]
  ------------------
  283|    207|            return 17; // Chlorine
  284|    207|          }
  285|      3|          break;
  286|    109|        case 'm':
  ------------------
  |  Branch (286:9): [True: 109, False: 13.1k]
  ------------------
  287|    109|          if (ptr[2] == '\0') { // Cm
  ------------------
  |  Branch (287:15): [True: 103, False: 6]
  ------------------
  288|    103|            return 96; // Curium
  289|    103|          }
  290|      6|          break;
  291|    958|        case 'n':
  ------------------
  |  Branch (291:9): [True: 958, False: 12.2k]
  ------------------
  292|    958|          if (ptr[2] == '\0') { // Cn
  ------------------
  |  Branch (292:15): [True: 957, False: 1]
  ------------------
  293|    957|            return 112; // Copernicium
  294|    957|          }
  295|      1|          break;
  296|     66|        case 'o':
  ------------------
  |  Branch (296:9): [True: 66, False: 13.1k]
  ------------------
  297|     66|          if (ptr[2] == '\0') { // Co
  ------------------
  |  Branch (297:15): [True: 55, False: 11]
  ------------------
  298|     55|            return 27; // Cobalt
  299|     55|          }
  300|     11|          break;
  301|    106|        case 'r':
  ------------------
  |  Branch (301:9): [True: 106, False: 13.1k]
  ------------------
  302|    106|          if (ptr[2] == '\0') { // Cr
  ------------------
  |  Branch (302:15): [True: 23, False: 83]
  ------------------
  303|     23|            return 24; // Chromium
  304|     23|          }
  305|     83|          break;
  306|    426|        case 's':
  ------------------
  |  Branch (306:9): [True: 426, False: 12.7k]
  ------------------
  307|    426|          if (ptr[2] == '\0') { // Cs
  ------------------
  |  Branch (307:15): [True: 414, False: 12]
  ------------------
  308|    414|            return 55; // Caesium
  309|    414|          }
  310|     12|          break;
  311|     40|        case 'u':
  ------------------
  |  Branch (311:9): [True: 40, False: 13.1k]
  ------------------
  312|     40|          if (ptr[2] == '\0') { // Cu
  ------------------
  |  Branch (312:15): [True: 30, False: 10]
  ------------------
  313|     30|            return 29; // Copper
  314|     30|          }
  315|     10|          break;
  316|  13.2k|        }
  317|  6.52k|        break;
  318|  6.52k|      case 'D':
  ------------------
  |  Branch (318:7): [True: 4.52k, False: 446k]
  ------------------
  319|  4.52k|        switch (ptr[1]) {
  ------------------
  |  Branch (319:17): [True: 2.44k, False: 2.08k]
  ------------------
  320|  2.34k|        case '\0': // D
  ------------------
  |  Branch (320:9): [True: 2.34k, False: 2.17k]
  ------------------
  321|  2.34k|          return 1; // Deuterium
  322|     52|        case 'b':
  ------------------
  |  Branch (322:9): [True: 52, False: 4.47k]
  ------------------
  323|     52|          if (ptr[2] == '\0') { // Db
  ------------------
  |  Branch (323:15): [True: 49, False: 3]
  ------------------
  324|     49|            return 105; // Dubnium
  325|     49|          }
  326|      3|          break;
  327|     24|        case 's':
  ------------------
  |  Branch (327:9): [True: 24, False: 4.50k]
  ------------------
  328|     24|          if (ptr[2] == '\0') { // Ds
  ------------------
  |  Branch (328:15): [True: 21, False: 3]
  ------------------
  329|     21|            return 110; // Darmstadtium
  330|     21|          }
  331|      3|          break;
  332|     22|        case 'y':
  ------------------
  |  Branch (332:9): [True: 22, False: 4.50k]
  ------------------
  333|     22|          if (ptr[2] == '\0') { // Dy
  ------------------
  |  Branch (333:15): [True: 21, False: 1]
  ------------------
  334|     21|            return 66; // Dysprosium
  335|     21|          }
  336|      1|          break;
  337|  4.52k|        }
  338|  2.08k|        break;
  339|  2.08k|      case 'E':
  ------------------
  |  Branch (339:7): [True: 294, False: 450k]
  ------------------
  340|    294|        switch (ptr[1]) {
  ------------------
  |  Branch (340:17): [True: 223, False: 71]
  ------------------
  341|     84|        case 'r':
  ------------------
  |  Branch (341:9): [True: 84, False: 210]
  ------------------
  342|     84|          if (ptr[2] == '\0') { // Er
  ------------------
  |  Branch (342:15): [True: 42, False: 42]
  ------------------
  343|     42|            return 68; // Erbium
  344|     42|          }
  345|     42|          break;
  346|     80|        case 's':
  ------------------
  |  Branch (346:9): [True: 80, False: 214]
  ------------------
  347|     80|          if (ptr[2] == '\0') { // Es
  ------------------
  |  Branch (347:15): [True: 53, False: 27]
  ------------------
  348|     53|            return 99; // Einsteinium
  349|     53|          }
  350|     27|          break;
  351|     59|        case 'u':
  ------------------
  |  Branch (351:9): [True: 59, False: 235]
  ------------------
  352|     59|          if (ptr[2] == '\0') { // Eu
  ------------------
  |  Branch (352:15): [True: 56, False: 3]
  ------------------
  353|     56|            return 63; // Europium
  354|     56|          }
  355|      3|          break;
  356|    294|        }
  357|    143|        break;
  358|  5.08k|      case 'F':
  ------------------
  |  Branch (358:7): [True: 5.08k, False: 446k]
  ------------------
  359|  5.08k|        switch (ptr[1]) {
  ------------------
  |  Branch (359:17): [True: 2.63k, False: 2.44k]
  ------------------
  360|  1.54k|        case '\0': // F
  ------------------
  |  Branch (360:9): [True: 1.54k, False: 3.54k]
  ------------------
  361|  1.54k|          return 9; // Fluorine
  362|    216|        case 'e':
  ------------------
  |  Branch (362:9): [True: 216, False: 4.87k]
  ------------------
  363|    216|          if (ptr[2] == '\0') { // Fe
  ------------------
  |  Branch (363:15): [True: 210, False: 6]
  ------------------
  364|    210|            return 26; // Iron
  365|    210|          }
  366|      6|          break;
  367|    373|        case 'l':
  ------------------
  |  Branch (367:9): [True: 373, False: 4.71k]
  ------------------
  368|    373|          if (ptr[2] == '\0') { // Fl
  ------------------
  |  Branch (368:15): [True: 370, False: 3]
  ------------------
  369|    370|            return 114; // Flerovium
  370|    370|          }
  371|      3|          break;
  372|     46|        case 'm':
  ------------------
  |  Branch (372:9): [True: 46, False: 5.04k]
  ------------------
  373|     46|          if (ptr[2] == '\0') { // Fm
  ------------------
  |  Branch (373:15): [True: 44, False: 2]
  ------------------
  374|     44|            return 100; // Fermium
  375|     44|          }
  376|      2|          break;
  377|    459|        case 'r':
  ------------------
  |  Branch (377:9): [True: 459, False: 4.62k]
  ------------------
  378|    459|          if (ptr[2] == '\0') { // Fr
  ------------------
  |  Branch (378:15): [True: 438, False: 21]
  ------------------
  379|    438|            return 87; // Francium
  380|    438|          }
  381|     21|          break;
  382|  5.08k|        }
  383|  2.48k|        break;
  384|  2.48k|      case 'G':
  ------------------
  |  Branch (384:7): [True: 1.26k, False: 450k]
  ------------------
  385|  1.26k|        switch (ptr[1]) {
  ------------------
  |  Branch (385:17): [True: 481, False: 780]
  ------------------
  386|    269|        case 'a':
  ------------------
  |  Branch (386:9): [True: 269, False: 992]
  ------------------
  387|    269|          if (ptr[2] == '\0') { // Ga
  ------------------
  |  Branch (387:15): [True: 266, False: 3]
  ------------------
  388|    266|            return 31; // Gallium
  389|    266|          }
  390|      3|          break;
  391|     21|        case 'd':
  ------------------
  |  Branch (391:9): [True: 21, False: 1.24k]
  ------------------
  392|     21|          if (ptr[2] == '\0') { // Gd
  ------------------
  |  Branch (392:15): [True: 20, False: 1]
  ------------------
  393|     20|            return 64; // Gadolinium
  394|     20|          }
  395|      1|          break;
  396|    191|        case 'e':
  ------------------
  |  Branch (396:9): [True: 191, False: 1.07k]
  ------------------
  397|    191|          if (ptr[2] == '\0') { // Ge
  ------------------
  |  Branch (397:15): [True: 190, False: 1]
  ------------------
  398|    190|            return 32; // Germanium
  399|    190|          }
  400|      1|          break;
  401|  1.26k|        }
  402|    785|        break;
  403|  4.55k|      case 'H':
  ------------------
  |  Branch (403:7): [True: 4.55k, False: 446k]
  ------------------
  404|  4.55k|        switch (ptr[1]) {
  ------------------
  |  Branch (404:17): [True: 2.72k, False: 1.82k]
  ------------------
  405|  2.34k|        case '\0': // H
  ------------------
  |  Branch (405:9): [True: 2.34k, False: 2.21k]
  ------------------
  406|  2.34k|          return 1; // Hydrogen
  407|     26|        case 'e':
  ------------------
  |  Branch (407:9): [True: 26, False: 4.53k]
  ------------------
  408|     26|          if (ptr[2] == '\0') { // He
  ------------------
  |  Branch (408:15): [True: 25, False: 1]
  ------------------
  409|     25|            return 2; // Helium
  410|     25|          }
  411|      1|          break;
  412|     38|        case 'f':
  ------------------
  |  Branch (412:9): [True: 38, False: 4.52k]
  ------------------
  413|     38|          if (ptr[2] == '\0') { // Hf
  ------------------
  |  Branch (413:15): [True: 28, False: 10]
  ------------------
  414|     28|            return 72; // Hafnium
  415|     28|          }
  416|     10|          break;
  417|     15|        case 'g':
  ------------------
  |  Branch (417:9): [True: 15, False: 4.54k]
  ------------------
  418|     15|          if (ptr[2] == '\0') { // Hg
  ------------------
  |  Branch (418:15): [True: 13, False: 2]
  ------------------
  419|     13|            return 80; // Mercury
  420|     13|          }
  421|      2|          break;
  422|    158|        case 'o':
  ------------------
  |  Branch (422:9): [True: 158, False: 4.40k]
  ------------------
  423|    158|          if (ptr[2] == '\0') { // Ho
  ------------------
  |  Branch (423:15): [True: 79, False: 79]
  ------------------
  424|     79|            return 67; // Holmium
  425|     79|          }
  426|     79|          break;
  427|    144|        case 's':
  ------------------
  |  Branch (427:9): [True: 144, False: 4.41k]
  ------------------
  428|    144|          if (ptr[2] == '\0') { // Hs
  ------------------
  |  Branch (428:15): [True: 143, False: 1]
  ------------------
  429|    143|            return 108; // Hassium
  430|    143|          }
  431|      1|          break;
  432|  4.55k|        }
  433|  1.92k|        break;
  434|  14.3k|      case 'I':
  ------------------
  |  Branch (434:7): [True: 14.3k, False: 436k]
  ------------------
  435|  14.3k|        switch (ptr[1]) {
  ------------------
  |  Branch (435:17): [True: 2.92k, False: 11.4k]
  ------------------
  436|  2.44k|        case '\0': // I
  ------------------
  |  Branch (436:9): [True: 2.44k, False: 11.8k]
  ------------------
  437|  2.44k|          return 53; // Iodine
  438|    416|        case 'n':
  ------------------
  |  Branch (438:9): [True: 416, False: 13.9k]
  ------------------
  439|    416|          if (ptr[2] == '\0') { // In
  ------------------
  |  Branch (439:15): [True: 410, False: 6]
  ------------------
  440|    410|            return 49; // Indium
  441|    410|          }
  442|      6|          break;
  443|     63|        case 'r':
  ------------------
  |  Branch (443:9): [True: 63, False: 14.2k]
  ------------------
  444|     63|          if (ptr[2] == '\0') { // Ir
  ------------------
  |  Branch (444:15): [True: 51, False: 12]
  ------------------
  445|     51|            return 77; // Iridium
  446|     51|          }
  447|     12|          break;
  448|  14.3k|        }
  449|  11.4k|        break;
  450|  11.4k|      case 'K':
  ------------------
  |  Branch (450:7): [True: 721, False: 450k]
  ------------------
  451|    721|        switch (ptr[1]) {
  ------------------
  |  Branch (451:17): [True: 375, False: 346]
  ------------------
  452|    340|        case '\0': // K
  ------------------
  |  Branch (452:9): [True: 340, False: 381]
  ------------------
  453|    340|          return 19; // Potassium
  454|     35|        case 'r':
  ------------------
  |  Branch (454:9): [True: 35, False: 686]
  ------------------
  455|     35|          if (ptr[2] == '\0') { // Kr
  ------------------
  |  Branch (455:15): [True: 34, False: 1]
  ------------------
  456|     34|            return 36; // Krypton
  457|     34|          }
  458|      1|          break;
  459|    721|        }
  460|    347|        break;
  461|    959|      case 'L':
  ------------------
  |  Branch (461:7): [True: 959, False: 450k]
  ------------------
  462|    959|        switch (ptr[1]) {
  ------------------
  |  Branch (462:17): [True: 815, False: 144]
  ------------------
  463|    306|        case 'a':
  ------------------
  |  Branch (463:9): [True: 306, False: 653]
  ------------------
  464|    306|          if (ptr[2] == '\0') { // La
  ------------------
  |  Branch (464:15): [True: 305, False: 1]
  ------------------
  465|    305|            return 57; // Lanthanum
  466|    305|          }
  467|      1|          break;
  468|    332|        case 'i':
  ------------------
  |  Branch (468:9): [True: 332, False: 627]
  ------------------
  469|    332|          if (ptr[2] == '\0') { // Li
  ------------------
  |  Branch (469:15): [True: 331, False: 1]
  ------------------
  470|    331|            return 3; // Lithium
  471|    331|          }
  472|      1|          break;
  473|     14|        case 'r':
  ------------------
  |  Branch (473:9): [True: 14, False: 945]
  ------------------
  474|     14|          if (ptr[2] == '\0') { // Lr
  ------------------
  |  Branch (474:15): [True: 12, False: 2]
  ------------------
  475|     12|            return 103; // Lawrencium
  476|     12|          }
  477|      2|          break;
  478|    121|        case 'u':
  ------------------
  |  Branch (478:9): [True: 121, False: 838]
  ------------------
  479|    121|          if (ptr[2] == '\0') { // Lu
  ------------------
  |  Branch (479:15): [True: 110, False: 11]
  ------------------
  480|    110|            return 71; // Lutetium
  481|    110|          }
  482|     11|          break;
  483|     42|        case 'v':
  ------------------
  |  Branch (483:9): [True: 42, False: 917]
  ------------------
  484|     42|          if (ptr[2] == '\0') { // Lv
  ------------------
  |  Branch (484:15): [True: 39, False: 3]
  ------------------
  485|     39|            return 116; // Livermorium
  486|     39|          }
  487|      3|          break;
  488|    959|        }
  489|    162|        break;
  490|    939|      case 'M':
  ------------------
  |  Branch (490:7): [True: 939, False: 450k]
  ------------------
  491|    939|        switch (ptr[1]) {
  ------------------
  |  Branch (491:17): [True: 573, False: 366]
  ------------------
  492|     50|        case 'c':
  ------------------
  |  Branch (492:9): [True: 50, False: 889]
  ------------------
  493|     50|          if (ptr[2] == '\0') { // Mc
  ------------------
  |  Branch (493:15): [True: 39, False: 11]
  ------------------
  494|     39|            return 115; // Moscovium
  495|     39|          }
  496|     11|          break;
  497|     65|        case 'd':
  ------------------
  |  Branch (497:9): [True: 65, False: 874]
  ------------------
  498|     65|          if (ptr[2] == '\0') { // Md
  ------------------
  |  Branch (498:15): [True: 55, False: 10]
  ------------------
  499|     55|            return 101; // Mendelevium
  500|     55|          }
  501|     10|          break;
  502|    142|        case 'g':
  ------------------
  |  Branch (502:9): [True: 142, False: 797]
  ------------------
  503|    142|          if (ptr[2] == '\0') { // Mg
  ------------------
  |  Branch (503:15): [True: 130, False: 12]
  ------------------
  504|    130|            return 12; // Magnesium
  505|    130|          }
  506|     12|          break;
  507|     87|        case 'n':
  ------------------
  |  Branch (507:9): [True: 87, False: 852]
  ------------------
  508|     87|          if (ptr[2] == '\0') { // Mn
  ------------------
  |  Branch (508:15): [True: 86, False: 1]
  ------------------
  509|     86|            return 25; // Manganese
  510|     86|          }
  511|      1|          break;
  512|    132|        case 'o':
  ------------------
  |  Branch (512:9): [True: 132, False: 807]
  ------------------
  513|    132|          if (ptr[2] == '\0') { // Mo
  ------------------
  |  Branch (513:15): [True: 89, False: 43]
  ------------------
  514|     89|            return 42; // Molybdenum
  515|     89|          }
  516|     43|          break;
  517|     97|        case 't':
  ------------------
  |  Branch (517:9): [True: 97, False: 842]
  ------------------
  518|     97|          if (ptr[2] == '\0') { // Mt
  ------------------
  |  Branch (518:15): [True: 77, False: 20]
  ------------------
  519|     77|            return 109; // Meitnerium
  520|     77|          }
  521|     20|          break;
  522|    939|        }
  523|    463|        break;
  524|  11.7k|      case 'N':
  ------------------
  |  Branch (524:7): [True: 11.7k, False: 439k]
  ------------------
  525|  11.7k|        switch (ptr[1]) {
  ------------------
  |  Branch (525:17): [True: 2.15k, False: 9.63k]
  ------------------
  526|    733|        case '\0': // N
  ------------------
  |  Branch (526:9): [True: 733, False: 11.0k]
  ------------------
  527|    733|          return 7; // Nitrogen
  528|    587|        case 'a':
  ------------------
  |  Branch (528:9): [True: 587, False: 11.2k]
  ------------------
  529|    587|          if (ptr[2] == '\0') { // Na
  ------------------
  |  Branch (529:15): [True: 560, False: 27]
  ------------------
  530|    560|            return 11; // Sodium
  531|    560|          }
  532|     27|          break;
  533|    158|        case 'b':
  ------------------
  |  Branch (533:9): [True: 158, False: 11.6k]
  ------------------
  534|    158|          if (ptr[2] == '\0') { // Nb
  ------------------
  |  Branch (534:15): [True: 84, False: 74]
  ------------------
  535|     84|            return 41; // Niobium
  536|     84|          }
  537|     74|          break;
  538|     74|        case 'd':
  ------------------
  |  Branch (538:9): [True: 70, False: 11.7k]
  ------------------
  539|     70|          if (ptr[2] == '\0') { // Nd
  ------------------
  |  Branch (539:15): [True: 69, False: 1]
  ------------------
  540|     69|            return 60; // Neodymium
  541|     69|          }
  542|      1|          break;
  543|    259|        case 'e':
  ------------------
  |  Branch (543:9): [True: 259, False: 11.5k]
  ------------------
  544|    259|          if (ptr[2] == '\0') { // Ne
  ------------------
  |  Branch (544:15): [True: 254, False: 5]
  ------------------
  545|    254|            return 10; // Neon
  546|    254|          }
  547|      5|          break;
  548|     38|        case 'h':
  ------------------
  |  Branch (548:9): [True: 38, False: 11.7k]
  ------------------
  549|     38|          if (ptr[2] == '\0') { // Nh
  ------------------
  |  Branch (549:15): [True: 22, False: 16]
  ------------------
  550|     22|            return 113; // Nihonium
  551|     22|          }
  552|     16|          break;
  553|     60|        case 'i':
  ------------------
  |  Branch (553:9): [True: 60, False: 11.7k]
  ------------------
  554|     60|          if (ptr[2] == '\0') { // Ni
  ------------------
  |  Branch (554:15): [True: 52, False: 8]
  ------------------
  555|     52|            return 28; // Nickel
  556|     52|          }
  557|      8|          break;
  558|    148|        case 'o':
  ------------------
  |  Branch (558:9): [True: 148, False: 11.6k]
  ------------------
  559|    148|          if (ptr[2] == '\0') { // No
  ------------------
  |  Branch (559:15): [True: 147, False: 1]
  ------------------
  560|    147|            return 102; // Nobelium
  561|    147|          }
  562|      1|          break;
  563|    106|        case 'p':
  ------------------
  |  Branch (563:9): [True: 106, False: 11.6k]
  ------------------
  564|    106|          if (ptr[2] == '\0') { // Np
  ------------------
  |  Branch (564:15): [True: 104, False: 2]
  ------------------
  565|    104|            return 93; // Neptunium
  566|    104|          }
  567|      2|          break;
  568|  11.7k|        }
  569|  9.77k|        break;
  570|  9.77k|      case 'O':
  ------------------
  |  Branch (570:7): [True: 3.91k, False: 447k]
  ------------------
  571|  3.91k|        switch (ptr[1]) {
  ------------------
  |  Branch (571:17): [True: 2.19k, False: 1.72k]
  ------------------
  572|  1.73k|        case '\0': // O
  ------------------
  |  Branch (572:9): [True: 1.73k, False: 2.18k]
  ------------------
  573|  1.73k|          return 8; // Oxygen
  574|     55|        case 'g':
  ------------------
  |  Branch (574:9): [True: 55, False: 3.86k]
  ------------------
  575|     55|          if (ptr[2] == '\0') { // Og
  ------------------
  |  Branch (575:15): [True: 53, False: 2]
  ------------------
  576|     53|            return 118; // Oganesson
  577|     53|          }
  578|      2|          break;
  579|    406|        case 's':
  ------------------
  |  Branch (579:9): [True: 406, False: 3.51k]
  ------------------
  580|    406|          if (ptr[2] == '\0') { // Os
  ------------------
  |  Branch (580:15): [True: 404, False: 2]
  ------------------
  581|    404|            return 76; // Osmium
  582|    404|          }
  583|      2|          break;
  584|  3.91k|        }
  585|  1.72k|        break;
  586|  35.9k|      case 'P':
  ------------------
  |  Branch (586:7): [True: 35.9k, False: 415k]
  ------------------
  587|  35.9k|        switch (ptr[1]) {
  ------------------
  |  Branch (587:17): [True: 20.3k, False: 15.5k]
  ------------------
  588|  18.6k|        case '\0': // P
  ------------------
  |  Branch (588:9): [True: 18.6k, False: 17.2k]
  ------------------
  589|  18.6k|          return 15; // Phosphorus
  590|     16|        case 'a':
  ------------------
  |  Branch (590:9): [True: 16, False: 35.8k]
  ------------------
  591|     16|          if (ptr[2] == '\0') { // Pa
  ------------------
  |  Branch (591:15): [True: 15, False: 1]
  ------------------
  592|     15|            return 91; // Protactinium
  593|     15|          }
  594|      1|          break;
  595|    501|        case 'b':
  ------------------
  |  Branch (595:9): [True: 501, False: 35.4k]
  ------------------
  596|    501|          if (ptr[2] == '\0') { // Pb
  ------------------
  |  Branch (596:15): [True: 497, False: 4]
  ------------------
  597|    497|            return 82; // Lead
  598|    497|          }
  599|      4|          break;
  600|     79|        case 'd':
  ------------------
  |  Branch (600:9): [True: 79, False: 35.8k]
  ------------------
  601|     79|          if (ptr[2] == '\0') { // Pd
  ------------------
  |  Branch (601:15): [True: 78, False: 1]
  ------------------
  602|     78|            return 46; // Palladium
  603|     78|          }
  604|      1|          break;
  605|     48|        case 'm':
  ------------------
  |  Branch (605:9): [True: 48, False: 35.8k]
  ------------------
  606|     48|          if (ptr[2] == '\0') { // Pm
  ------------------
  |  Branch (606:15): [True: 47, False: 1]
  ------------------
  607|     47|            return 61; // Promethium
  608|     47|          }
  609|      1|          break;
  610|    772|        case 'o':
  ------------------
  |  Branch (610:9): [True: 772, False: 35.1k]
  ------------------
  611|    772|          if (ptr[2] == '\0') { // Po
  ------------------
  |  Branch (611:15): [True: 767, False: 5]
  ------------------
  612|    767|            return 84; // Polonium
  613|    767|          }
  614|      5|          break;
  615|    103|        case 'r':
  ------------------
  |  Branch (615:9): [True: 103, False: 35.7k]
  ------------------
  616|    103|          if (ptr[2] == '\0') { // Pr
  ------------------
  |  Branch (616:15): [True: 102, False: 1]
  ------------------
  617|    102|            return 59; // Praseodymium
  618|    102|          }
  619|      1|          break;
  620|    109|        case 't':
  ------------------
  |  Branch (620:9): [True: 109, False: 35.7k]
  ------------------
  621|    109|          if (ptr[2] == '\0') { // Pt
  ------------------
  |  Branch (621:15): [True: 103, False: 6]
  ------------------
  622|    103|            return 78; // Platinum
  623|    103|          }
  624|      6|          break;
  625|     76|        case 'u':
  ------------------
  |  Branch (625:9): [True: 76, False: 35.8k]
  ------------------
  626|     76|          if (ptr[2] == '\0') { // Pu
  ------------------
  |  Branch (626:15): [True: 70, False: 6]
  ------------------
  627|     70|            return 94; // Plutonium
  628|     70|          }
  629|      6|          break;
  630|  35.9k|        }
  631|  15.6k|        break;
  632|  15.6k|      case 'R':
  ------------------
  |  Branch (632:7): [True: 2.86k, False: 448k]
  ------------------
  633|  2.86k|        switch (ptr[1]) {
  ------------------
  |  Branch (633:17): [True: 1.74k, False: 1.11k]
  ------------------
  634|    155|        case 'a':
  ------------------
  |  Branch (634:9): [True: 155, False: 2.71k]
  ------------------
  635|    155|          if (ptr[2] == '\0') { // Ra
  ------------------
  |  Branch (635:15): [True: 154, False: 1]
  ------------------
  636|    154|            return 88; // Radium
  637|    154|          }
  638|      1|          break;
  639|    339|        case 'b':
  ------------------
  |  Branch (639:9): [True: 339, False: 2.52k]
  ------------------
  640|    339|          if (ptr[2] == '\0') { // Rb
  ------------------
  |  Branch (640:15): [True: 253, False: 86]
  ------------------
  641|    253|            return 37; // Rubidium
  642|    253|          }
  643|     86|          break;
  644|     86|        case 'e':
  ------------------
  |  Branch (644:9): [True: 48, False: 2.81k]
  ------------------
  645|     48|          if (ptr[2] == '\0') { // Re
  ------------------
  |  Branch (645:15): [True: 23, False: 25]
  ------------------
  646|     23|            return 75; // Rhenium
  647|     23|          }
  648|     25|          break;
  649|     28|        case 'f':
  ------------------
  |  Branch (649:9): [True: 28, False: 2.83k]
  ------------------
  650|     28|          if (ptr[2] == '\0') { // Rf
  ------------------
  |  Branch (650:15): [True: 27, False: 1]
  ------------------
  651|     27|            return 104; // Rutherfordium
  652|     27|          }
  653|      1|          break;
  654|    357|        case 'g':
  ------------------
  |  Branch (654:9): [True: 357, False: 2.50k]
  ------------------
  655|    357|          if (ptr[2] == '\0') { // Rg
  ------------------
  |  Branch (655:15): [True: 356, False: 1]
  ------------------
  656|    356|            return 111; // Roentgenium
  657|    356|          }
  658|      1|          break;
  659|     42|        case 'h':
  ------------------
  |  Branch (659:9): [True: 42, False: 2.82k]
  ------------------
  660|     42|          if (ptr[2] == '\0') { // Rh
  ------------------
  |  Branch (660:15): [True: 22, False: 20]
  ------------------
  661|     22|            return 45; // Rhodium
  662|     22|          }
  663|     20|          break;
  664|    679|        case 'n':
  ------------------
  |  Branch (664:9): [True: 679, False: 2.18k]
  ------------------
  665|    679|          if (ptr[2] == '\0') { // Rn
  ------------------
  |  Branch (665:15): [True: 676, False: 3]
  ------------------
  666|    676|            return 86; // Radon
  667|    676|          }
  668|      3|          break;
  669|     99|        case 'u':
  ------------------
  |  Branch (669:9): [True: 99, False: 2.76k]
  ------------------
  670|     99|          if (ptr[2] == '\0') { // Ru
  ------------------
  |  Branch (670:15): [True: 89, False: 10]
  ------------------
  671|     89|            return 44; // Ruthenium
  672|     89|          }
  673|     10|          break;
  674|  2.86k|        }
  675|  1.26k|        break;
  676|  29.5k|      case 'S':
  ------------------
  |  Branch (676:7): [True: 29.5k, False: 421k]
  ------------------
  677|  29.5k|        switch (ptr[1]) {
  ------------------
  |  Branch (677:17): [True: 18.1k, False: 11.4k]
  ------------------
  678|  11.3k|        case '\0': // S
  ------------------
  |  Branch (678:9): [True: 11.3k, False: 18.1k]
  ------------------
  679|  11.3k|          return 16; // Sulfur
  680|  1.53k|        case 'b':
  ------------------
  |  Branch (680:9): [True: 1.53k, False: 28.0k]
  ------------------
  681|  1.53k|          if (ptr[2] == '\0') { // Sb
  ------------------
  |  Branch (681:15): [True: 1.52k, False: 1]
  ------------------
  682|  1.52k|            return 51; // Antimony
  683|  1.52k|          }
  684|      1|          break;
  685|     70|        case 'c':
  ------------------
  |  Branch (685:9): [True: 70, False: 29.5k]
  ------------------
  686|     70|          if (ptr[2] == '\0') { // Sc
  ------------------
  |  Branch (686:15): [True: 59, False: 11]
  ------------------
  687|     59|            return 21; // Scandium
  688|     59|          }
  689|     11|          break;
  690|  1.39k|        case 'e':
  ------------------
  |  Branch (690:9): [True: 1.39k, False: 28.1k]
  ------------------
  691|  1.39k|          if (ptr[2] == '\0') { // Se
  ------------------
  |  Branch (691:15): [True: 1.38k, False: 14]
  ------------------
  692|  1.38k|            return 34; // Selenium
  693|  1.38k|          }
  694|     14|          break;
  695|     72|        case 'g':
  ------------------
  |  Branch (695:9): [True: 72, False: 29.5k]
  ------------------
  696|     72|          if (ptr[2] == '\0') { // Sg
  ------------------
  |  Branch (696:15): [True: 71, False: 1]
  ------------------
  697|     71|            return 106; // Seaborgium
  698|     71|          }
  699|      1|          break;
  700|  1.52k|        case 'i':
  ------------------
  |  Branch (700:9): [True: 1.52k, False: 28.0k]
  ------------------
  701|  1.52k|          if (ptr[2] == '\0') { // Si
  ------------------
  |  Branch (701:15): [True: 1.43k, False: 99]
  ------------------
  702|  1.43k|            return 14; // Silicon
  703|  1.43k|          }
  704|     99|          break;
  705|    110|        case 'm':
  ------------------
  |  Branch (705:9): [True: 110, False: 29.4k]
  ------------------
  706|    110|          if (ptr[2] == '\0') { // Sm
  ------------------
  |  Branch (706:15): [True: 107, False: 3]
  ------------------
  707|    107|            return 62; // Samarium
  708|    107|          }
  709|      3|          break;
  710|  1.56k|        case 'n':
  ------------------
  |  Branch (710:9): [True: 1.56k, False: 28.0k]
  ------------------
  711|  1.56k|          if (ptr[2] == '\0') { // Sn
  ------------------
  |  Branch (711:15): [True: 1.56k, False: 1]
  ------------------
  712|  1.56k|            return 50; // Tin
  713|  1.56k|          }
  714|      1|          break;
  715|    475|        case 'r':
  ------------------
  |  Branch (715:9): [True: 475, False: 29.1k]
  ------------------
  716|    475|          if (ptr[2] == '\0') { // Sr
  ------------------
  |  Branch (716:15): [True: 467, False: 8]
  ------------------
  717|    467|            return 38; // Strontium
  718|    467|          }
  719|      8|          break;
  720|  29.5k|        }
  721|  11.5k|        break;
  722|  11.5k|      case 'T':
  ------------------
  |  Branch (722:7): [True: 5.43k, False: 445k]
  ------------------
  723|  5.43k|        switch (ptr[1]) {
  ------------------
  |  Branch (723:17): [True: 4.80k, False: 627]
  ------------------
  724|  2.14k|        case '\0': // T
  ------------------
  |  Branch (724:9): [True: 2.14k, False: 3.28k]
  ------------------
  725|  2.14k|          return 1; // Tritium
  726|     61|        case 'a':
  ------------------
  |  Branch (726:9): [True: 61, False: 5.37k]
  ------------------
  727|     61|          if (ptr[2] == '\0') { // Ta
  ------------------
  |  Branch (727:15): [True: 53, False: 8]
  ------------------
  728|     53|            return 73; // Tantalum
  729|     53|          }
  730|      8|          break;
  731|    145|        case 'b':
  ------------------
  |  Branch (731:9): [True: 145, False: 5.28k]
  ------------------
  732|    145|          if (ptr[2] == '\0') { // Tb
  ------------------
  |  Branch (732:15): [True: 143, False: 2]
  ------------------
  733|    143|            return 65; // Terbium
  734|    143|          }
  735|      2|          break;
  736|     39|        case 'c':
  ------------------
  |  Branch (736:9): [True: 39, False: 5.39k]
  ------------------
  737|     39|          if (ptr[2] == '\0') { // Tc
  ------------------
  |  Branch (737:15): [True: 36, False: 3]
  ------------------
  738|     36|            return 43; // Technetium
  739|     36|          }
  740|      3|          break;
  741|  1.82k|        case 'e':
  ------------------
  |  Branch (741:9): [True: 1.82k, False: 3.60k]
  ------------------
  742|  1.82k|          if (ptr[2] == '\0') { // Te
  ------------------
  |  Branch (742:15): [True: 1.81k, False: 6]
  ------------------
  743|  1.81k|            return 52; // Tellurium
  744|  1.81k|          }
  745|      6|          break;
  746|    116|        case 'h':
  ------------------
  |  Branch (746:9): [True: 116, False: 5.31k]
  ------------------
  747|    116|          if (ptr[2] == '\0') { // Th
  ------------------
  |  Branch (747:15): [True: 21, False: 95]
  ------------------
  748|     21|            return 90; // Thorium
  749|     21|          }
  750|     95|          break;
  751|     95|        case 'i':
  ------------------
  |  Branch (751:9): [True: 21, False: 5.41k]
  ------------------
  752|     21|          if (ptr[2] == '\0') { // Ti
  ------------------
  |  Branch (752:15): [True: 20, False: 1]
  ------------------
  753|     20|            return 22; // Titanium
  754|     20|          }
  755|      1|          break;
  756|    191|        case 'l':
  ------------------
  |  Branch (756:9): [True: 191, False: 5.24k]
  ------------------
  757|    191|          if (ptr[2] == '\0') { // Tl
  ------------------
  |  Branch (757:15): [True: 190, False: 1]
  ------------------
  758|    190|            return 81; // Thallium
  759|    190|          }
  760|      1|          break;
  761|     43|        case 'm':
  ------------------
  |  Branch (761:9): [True: 43, False: 5.39k]
  ------------------
  762|     43|          if (ptr[2] == '\0') { // Tm
  ------------------
  |  Branch (762:15): [True: 40, False: 3]
  ------------------
  763|     40|            return 69; // Thulium
  764|     40|          }
  765|      3|          break;
  766|    217|        case 's':
  ------------------
  |  Branch (766:9): [True: 217, False: 5.21k]
  ------------------
  767|    217|          if (ptr[2] == '\0') { // Ts
  ------------------
  |  Branch (767:15): [True: 122, False: 95]
  ------------------
  768|    122|            return 117; // Tennessine
  769|    122|          }
  770|     95|          break;
  771|  5.43k|        }
  772|    841|        break;
  773|  70.6k|      case 'U':
  ------------------
  |  Branch (773:7): [True: 70.6k, False: 380k]
  ------------------
  774|  70.6k|        if (ptr[1] == '\0') { // U
  ------------------
  |  Branch (774:13): [True: 35.1k, False: 35.4k]
  ------------------
  775|  35.1k|          return 92; // Uranium
  776|  35.1k|        }
  777|  35.4k|        break;
  778|  35.4k|      case 'V':
  ------------------
  |  Branch (778:7): [True: 2.13k, False: 449k]
  ------------------
  779|  2.13k|        if (ptr[1] == '\0') { // V
  ------------------
  |  Branch (779:13): [True: 1.05k, False: 1.08k]
  ------------------
  780|  1.05k|          return 23; // Vanadium
  781|  1.05k|        }
  782|  1.08k|        break;
  783|  8.11k|      case 'W':
  ------------------
  |  Branch (783:7): [True: 8.11k, False: 443k]
  ------------------
  784|  8.11k|        if (ptr[1] == '\0') { // W
  ------------------
  |  Branch (784:13): [True: 4.03k, False: 4.08k]
  ------------------
  785|  4.03k|          return 74; // Tungsten
  786|  4.03k|        }
  787|  4.08k|        break;
  788|  4.08k|      case 'X':
  ------------------
  |  Branch (788:7): [True: 201, False: 451k]
  ------------------
  789|    201|        if (ptr[1] == 'e' && ptr[2] == '\0') { // Xe
  ------------------
  |  Branch (789:13): [True: 105, False: 96]
  |  Branch (789:30): [True: 99, False: 6]
  ------------------
  790|     99|          return 54; // Xenon
  791|     99|        }
  792|    102|        break;
  793|    443|      case 'Y':
  ------------------
  |  Branch (793:7): [True: 443, False: 450k]
  ------------------
  794|    443|        switch (ptr[1]) {
  ------------------
  |  Branch (794:17): [True: 194, False: 249]
  ------------------
  795|    111|        case '\0': // Y
  ------------------
  |  Branch (795:9): [True: 111, False: 332]
  ------------------
  796|    111|          return 39; // Yttrium
  797|     83|        case 'b':
  ------------------
  |  Branch (797:9): [True: 83, False: 360]
  ------------------
  798|     83|          if (ptr[2] == '\0') { // Yb
  ------------------
  |  Branch (798:15): [True: 72, False: 11]
  ------------------
  799|     72|            return 70; // Ytterbium
  800|     72|          }
  801|     11|          break;
  802|    443|        }
  803|    260|        break;
  804|    505|      case 'Z':
  ------------------
  |  Branch (804:7): [True: 505, False: 450k]
  ------------------
  805|    505|        switch (ptr[1]) {
  ------------------
  |  Branch (805:17): [True: 234, False: 271]
  ------------------
  806|    149|        case 'n':
  ------------------
  |  Branch (806:9): [True: 149, False: 356]
  ------------------
  807|    149|          if (ptr[2] == '\0') { // Zn
  ------------------
  |  Branch (807:15): [True: 145, False: 4]
  ------------------
  808|    145|            return 30; // Zinc
  809|    145|          }
  810|      4|          break;
  811|     85|        case 'r':
  ------------------
  |  Branch (811:9): [True: 85, False: 420]
  ------------------
  812|     85|          if (ptr[2] == '\0') { // Zr
  ------------------
  |  Branch (812:15): [True: 22, False: 63]
  ------------------
  813|     22|            return 40; // Zirconium
  814|     22|          }
  815|     63|          break;
  816|    505|        }
  817|    338|        break;
  818|  2.16k|      case 'a':
  ------------------
  |  Branch (818:7): [True: 2.16k, False: 449k]
  ------------------
  819|  2.16k|        switch (ptr[1]) {
  ------------------
  |  Branch (819:17): [True: 1.74k, False: 421]
  ------------------
  820|    518|        case 'c':
  ------------------
  |  Branch (820:9): [True: 518, False: 1.64k]
  ------------------
  821|    518|          if (ptr[2] == '\0') { // ac
  ------------------
  |  Branch (821:15): [True: 287, False: 231]
  ------------------
  822|    287|            return 89; // Actinium
  823|    287|          }
  824|    231|          break;
  825|    231|        case 'g':
  ------------------
  |  Branch (825:9): [True: 100, False: 2.06k]
  ------------------
  826|    100|          if (ptr[2] == '\0') { // ag
  ------------------
  |  Branch (826:15): [True: 98, False: 2]
  ------------------
  827|     98|            return 47; // Silver
  828|     98|          }
  829|      2|          break;
  830|    160|        case 'l':
  ------------------
  |  Branch (830:9): [True: 160, False: 2.00k]
  ------------------
  831|    160|          if (ptr[2] == '\0') { // al
  ------------------
  |  Branch (831:15): [True: 157, False: 3]
  ------------------
  832|    157|            return 13; // Aluminium
  833|    157|          }
  834|      3|          break;
  835|     27|        case 'm':
  ------------------
  |  Branch (835:9): [True: 27, False: 2.13k]
  ------------------
  836|     27|          if (ptr[2] == '\0') { // am
  ------------------
  |  Branch (836:15): [True: 13, False: 14]
  ------------------
  837|     13|            return 95; // Americium
  838|     13|          }
  839|     14|          break;
  840|    201|        case 'r':
  ------------------
  |  Branch (840:9): [True: 201, False: 1.96k]
  ------------------
  841|    201|          if (ptr[2] == '\0') { // ar
  ------------------
  |  Branch (841:15): [True: 185, False: 16]
  ------------------
  842|    185|            return 18; // Argon
  843|    185|          }
  844|     16|          break;
  845|    295|        case 's':
  ------------------
  |  Branch (845:9): [True: 295, False: 1.86k]
  ------------------
  846|    295|          if (ptr[2] == '\0') { // as
  ------------------
  |  Branch (846:15): [True: 88, False: 207]
  ------------------
  847|     88|            return 33; // Arsenic
  848|     88|          }
  849|    207|          break;
  850|    207|        case 't':
  ------------------
  |  Branch (850:9): [True: 18, False: 2.14k]
  ------------------
  851|     18|          if (ptr[2] == '\0') { // at
  ------------------
  |  Branch (851:15): [True: 17, False: 1]
  ------------------
  852|     17|            return 85; // Astatine
  853|     17|          }
  854|      1|          break;
  855|    424|        case 'u':
  ------------------
  |  Branch (855:9): [True: 424, False: 1.74k]
  ------------------
  856|    424|          if (ptr[2] == '\0') { // au
  ------------------
  |  Branch (856:15): [True: 422, False: 2]
  ------------------
  857|    422|            return 79; // Gold
  858|    422|          }
  859|      2|          break;
  860|  2.16k|        }
  861|    897|        break;
  862|  3.69k|      case 'b':
  ------------------
  |  Branch (862:7): [True: 3.69k, False: 447k]
  ------------------
  863|  3.69k|        switch (ptr[1]) {
  ------------------
  |  Branch (863:17): [True: 1.88k, False: 1.80k]
  ------------------
  864|    791|        case '\0': // b
  ------------------
  |  Branch (864:9): [True: 791, False: 2.90k]
  ------------------
  865|    791|          return 5; // Boron
  866|    213|        case 'a':
  ------------------
  |  Branch (866:9): [True: 213, False: 3.48k]
  ------------------
  867|    213|          if (ptr[2] == '\0') { // ba
  ------------------
  |  Branch (867:15): [True: 203, False: 10]
  ------------------
  868|    203|            return 56; // Barium
  869|    203|          }
  870|     10|          break;
  871|    266|        case 'e':
  ------------------
  |  Branch (871:9): [True: 266, False: 3.43k]
  ------------------
  872|    266|          if (ptr[2] == '\0') { // be
  ------------------
  |  Branch (872:15): [True: 255, False: 11]
  ------------------
  873|    255|            return 4; // Beryllium
  874|    255|          }
  875|     11|          break;
  876|     32|        case 'h':
  ------------------
  |  Branch (876:9): [True: 32, False: 3.66k]
  ------------------
  877|     32|          if (ptr[2] == '\0') { // bh
  ------------------
  |  Branch (877:15): [True: 27, False: 5]
  ------------------
  878|     27|            return 107; // Bohrium
  879|     27|          }
  880|      5|          break;
  881|    424|        case 'i':
  ------------------
  |  Branch (881:9): [True: 424, False: 3.27k]
  ------------------
  882|    424|          if (ptr[2] == '\0') { // bi
  ------------------
  |  Branch (882:15): [True: 370, False: 54]
  ------------------
  883|    370|            return 83; // Bismuth
  884|    370|          }
  885|     54|          break;
  886|    110|        case 'k':
  ------------------
  |  Branch (886:9): [True: 110, False: 3.58k]
  ------------------
  887|    110|          if (ptr[2] == '\0') { // bk
  ------------------
  |  Branch (887:15): [True: 109, False: 1]
  ------------------
  888|    109|            return 97; // Berkelium
  889|    109|          }
  890|      1|          break;
  891|     51|        case 'r':
  ------------------
  |  Branch (891:9): [True: 51, False: 3.64k]
  ------------------
  892|     51|          if (ptr[2] == '\0') { // br
  ------------------
  |  Branch (892:15): [True: 40, False: 11]
  ------------------
  893|     40|            return 35; // Bromine
  894|     40|          }
  895|     11|          break;
  896|  3.69k|        }
  897|  1.90k|        break;
  898|  7.84k|      case 'c':
  ------------------
  |  Branch (898:7): [True: 7.84k, False: 443k]
  ------------------
  899|  7.84k|        switch (ptr[1]) {
  ------------------
  |  Branch (899:17): [True: 5.25k, False: 2.59k]
  ------------------
  900|  1.81k|        case '\0': // c
  ------------------
  |  Branch (900:9): [True: 1.81k, False: 6.03k]
  ------------------
  901|  1.81k|          return 6; // Carbon
  902|    139|        case 'a':
  ------------------
  |  Branch (902:9): [True: 139, False: 7.70k]
  ------------------
  903|    139|          if (ptr[2] == '\0') { // ca
  ------------------
  |  Branch (903:15): [True: 119, False: 20]
  ------------------
  904|    119|            return 20; // Calcium
  905|    119|          }
  906|     20|          break;
  907|    872|        case 'd':
  ------------------
  |  Branch (907:9): [True: 872, False: 6.97k]
  ------------------
  908|    872|          if (ptr[2] == '\0') { // cd
  ------------------
  |  Branch (908:15): [True: 858, False: 14]
  ------------------
  909|    858|            return 48; // Cadmium
  910|    858|          }
  911|     14|          break;
  912|     77|        case 'e':
  ------------------
  |  Branch (912:9): [True: 77, False: 7.77k]
  ------------------
  913|     77|          if (ptr[2] == '\0') { // ce
  ------------------
  |  Branch (913:15): [True: 39, False: 38]
  ------------------
  914|     39|            return 58; // Cerium
  915|     39|          }
  916|     38|          break;
  917|     53|        case 'f':
  ------------------
  |  Branch (917:9): [True: 53, False: 7.79k]
  ------------------
  918|     53|          if (ptr[2] == '\0') { // cf
  ------------------
  |  Branch (918:15): [True: 50, False: 3]
  ------------------
  919|     50|            return 98; // Californium
  920|     50|          }
  921|      3|          break;
  922|  1.35k|        case 'l':
  ------------------
  |  Branch (922:9): [True: 1.35k, False: 6.49k]
  ------------------
  923|  1.35k|          if (ptr[2] == '\0') { // cl
  ------------------
  |  Branch (923:15): [True: 1.30k, False: 42]
  ------------------
  924|  1.30k|            return 17; // Chlorine
  925|  1.30k|          }
  926|     42|          break;
  927|     65|        case 'm':
  ------------------
  |  Branch (927:9): [True: 65, False: 7.78k]
  ------------------
  928|     65|          if (ptr[2] == '\0') { // cm
  ------------------
  |  Branch (928:15): [True: 62, False: 3]
  ------------------
  929|     62|            return 96; // Curium
  930|     62|          }
  931|      3|          break;
  932|     76|        case 'n':
  ------------------
  |  Branch (932:9): [True: 76, False: 7.77k]
  ------------------
  933|     76|          if (ptr[2] == '\0') { // cn
  ------------------
  |  Branch (933:15): [True: 73, False: 3]
  ------------------
  934|     73|            return 112; // Copernicium
  935|     73|          }
  936|      3|          break;
  937|     56|        case 'o':
  ------------------
  |  Branch (937:9): [True: 56, False: 7.79k]
  ------------------
  938|     56|          if (ptr[2] == '\0') { // co
  ------------------
  |  Branch (938:15): [True: 38, False: 18]
  ------------------
  939|     38|            return 27; // Cobalt
  940|     38|          }
  941|     18|          break;
  942|     49|        case 'r':
  ------------------
  |  Branch (942:9): [True: 49, False: 7.79k]
  ------------------
  943|     49|          if (ptr[2] == '\0') { // cr
  ------------------
  |  Branch (943:15): [True: 39, False: 10]
  ------------------
  944|     39|            return 24; // Chromium
  945|     39|          }
  946|     10|          break;
  947|    411|        case 's':
  ------------------
  |  Branch (947:9): [True: 411, False: 7.43k]
  ------------------
  948|    411|          if (ptr[2] == '\0') { // cs
  ------------------
  |  Branch (948:15): [True: 363, False: 48]
  ------------------
  949|    363|            return 55; // Caesium
  950|    363|          }
  951|     48|          break;
  952|    293|        case 'u':
  ------------------
  |  Branch (952:9): [True: 293, False: 7.55k]
  ------------------
  953|    293|          if (ptr[2] == '\0') { // cu
  ------------------
  |  Branch (953:15): [True: 225, False: 68]
  ------------------
  954|    225|            return 29; // Copper
  955|    225|          }
  956|     68|          break;
  957|  7.84k|        }
  958|  2.85k|        break;
  959|  2.85k|      case 'd':
  ------------------
  |  Branch (959:7): [True: 1.76k, False: 449k]
  ------------------
  960|  1.76k|        switch (ptr[1]) {
  ------------------
  |  Branch (960:17): [True: 715, False: 1.04k]
  ------------------
  961|     27|        case 'b':
  ------------------
  |  Branch (961:9): [True: 27, False: 1.73k]
  ------------------
  962|     27|          if (ptr[2] == '\0') { // db
  ------------------
  |  Branch (962:15): [True: 26, False: 1]
  ------------------
  963|     26|            return 105; // Dubnium
  964|     26|          }
  965|      1|          break;
  966|    598|        case 's':
  ------------------
  |  Branch (966:9): [True: 598, False: 1.16k]
  ------------------
  967|    598|          if (ptr[2] == '\0') { // ds
  ------------------
  |  Branch (967:15): [True: 547, False: 51]
  ------------------
  968|    547|            return 110; // Darmstadtium
  969|    547|          }
  970|     51|          break;
  971|     90|        case 'y':
  ------------------
  |  Branch (971:9): [True: 90, False: 1.67k]
  ------------------
  972|     90|          if (ptr[2] == '\0') { // dy
  ------------------
  |  Branch (972:15): [True: 89, False: 1]
  ------------------
  973|     89|            return 66; // Dysprosium
  974|     89|          }
  975|      1|          break;
  976|  1.76k|        }
  977|  1.09k|        break;
  978|  1.09k|      case 'e':
  ------------------
  |  Branch (978:7): [True: 426, False: 450k]
  ------------------
  979|    426|        switch (ptr[1]) {
  ------------------
  |  Branch (979:17): [True: 303, False: 123]
  ------------------
  980|     85|        case 'r':
  ------------------
  |  Branch (980:9): [True: 85, False: 341]
  ------------------
  981|     85|          if (ptr[2] == '\0') { // er
  ------------------
  |  Branch (981:15): [True: 79, False: 6]
  ------------------
  982|     79|            return 68; // Erbium
  983|     79|          }
  984|      6|          break;
  985|    105|        case 's':
  ------------------
  |  Branch (985:9): [True: 105, False: 321]
  ------------------
  986|    105|          if (ptr[2] == '\0') { // es
  ------------------
  |  Branch (986:15): [True: 102, False: 3]
  ------------------
  987|    102|            return 99; // Einsteinium
  988|    102|          }
  989|      3|          break;
  990|    113|        case 'u':
  ------------------
  |  Branch (990:9): [True: 113, False: 313]
  ------------------
  991|    113|          if (ptr[2] == '\0') { // eu
  ------------------
  |  Branch (991:15): [True: 28, False: 85]
  ------------------
  992|     28|            return 63; // Europium
  993|     28|          }
  994|     85|          break;
  995|    426|        }
  996|    217|        break;
  997|    973|      case 'f':
  ------------------
  |  Branch (997:7): [True: 973, False: 450k]
  ------------------
  998|    973|        switch (ptr[1]) {
  ------------------
  |  Branch (998:17): [True: 547, False: 426]
  ------------------
  999|    333|        case '\0': // f
  ------------------
  |  Branch (999:9): [True: 333, False: 640]
  ------------------
 1000|    333|          return 9; // Fluorine
 1001|     38|        case 'e':
  ------------------
  |  Branch (1001:9): [True: 38, False: 935]
  ------------------
 1002|     38|          if (ptr[2] == '\0') { // fe
  ------------------
  |  Branch (1002:15): [True: 35, False: 3]
  ------------------
 1003|     35|            return 26; // Iron
 1004|     35|          }
 1005|      3|          break;
 1006|     49|        case 'l':
  ------------------
  |  Branch (1006:9): [True: 49, False: 924]
  ------------------
 1007|     49|          if (ptr[2] == '\0') { // fl
  ------------------
  |  Branch (1007:15): [True: 45, False: 4]
  ------------------
 1008|     45|            return 114; // Flerovium
 1009|     45|          }
 1010|      4|          break;
 1011|     71|        case 'm':
  ------------------
  |  Branch (1011:9): [True: 71, False: 902]
  ------------------
 1012|     71|          if (ptr[2] == '\0') { // fm
  ------------------
  |  Branch (1012:15): [True: 60, False: 11]
  ------------------
 1013|     60|            return 100; // Fermium
 1014|     60|          }
 1015|     11|          break;
 1016|     56|        case 'r':
  ------------------
  |  Branch (1016:9): [True: 56, False: 917]
  ------------------
 1017|     56|          if (ptr[2] == '\0') { // fr
  ------------------
  |  Branch (1017:15): [True: 55, False: 1]
  ------------------
 1018|     55|            return 87; // Francium
 1019|     55|          }
 1020|      1|          break;
 1021|    973|        }
 1022|    445|        break;
 1023|  2.52k|      case 'g':
  ------------------
  |  Branch (1023:7): [True: 2.52k, False: 448k]
  ------------------
 1024|  2.52k|        switch (ptr[1]) {
  ------------------
  |  Branch (1024:17): [True: 2.18k, False: 338]
  ------------------
 1025|  1.58k|        case 'a':
  ------------------
  |  Branch (1025:9): [True: 1.58k, False: 941]
  ------------------
 1026|  1.58k|          if (ptr[2] == '\0') { // ga
  ------------------
  |  Branch (1026:15): [True: 1.58k, False: 4]
  ------------------
 1027|  1.58k|            return 31; // Gallium
 1028|  1.58k|          }
 1029|      4|          break;
 1030|    113|        case 'd':
  ------------------
  |  Branch (1030:9): [True: 113, False: 2.41k]
  ------------------
 1031|    113|          if (ptr[2] == '\0') { // gd
  ------------------
  |  Branch (1031:15): [True: 112, False: 1]
  ------------------
 1032|    112|            return 64; // Gadolinium
 1033|    112|          }
 1034|      1|          break;
 1035|    490|        case 'e':
  ------------------
  |  Branch (1035:9): [True: 490, False: 2.03k]
  ------------------
 1036|    490|          if (ptr[2] == '\0') { // ge
  ------------------
  |  Branch (1036:15): [True: 486, False: 4]
  ------------------
 1037|    486|            return 32; // Germanium
 1038|    486|          }
 1039|      4|          break;
 1040|  2.52k|        }
 1041|    347|        break;
 1042|  4.03k|      case 'h':
  ------------------
  |  Branch (1042:7): [True: 4.03k, False: 447k]
  ------------------
 1043|  4.03k|        switch (ptr[1]) {
  ------------------
  |  Branch (1043:17): [True: 2.42k, False: 1.60k]
  ------------------
 1044|  1.63k|        case '\0': // h
  ------------------
  |  Branch (1044:9): [True: 1.63k, False: 2.40k]
  ------------------
 1045|  1.63k|          return 1; // Hydrogen
 1046|    393|        case 'e':
  ------------------
  |  Branch (1046:9): [True: 393, False: 3.63k]
  ------------------
 1047|    393|          if (ptr[2] == '\0') { // he
  ------------------
  |  Branch (1047:15): [True: 392, False: 1]
  ------------------
 1048|    392|            return 2; // Helium
 1049|    392|          }
 1050|      1|          break;
 1051|     26|        case 'f':
  ------------------
  |  Branch (1051:9): [True: 26, False: 4.00k]
  ------------------
 1052|     26|          if (ptr[2] == '\0') { // hf
  ------------------
  |  Branch (1052:15): [True: 25, False: 1]
  ------------------
 1053|     25|            return 72; // Hafnium
 1054|     25|          }
 1055|      1|          break;
 1056|    269|        case 'g':
  ------------------
  |  Branch (1056:9): [True: 269, False: 3.76k]
  ------------------
 1057|    269|          if (ptr[2] == '\0') { // hg
  ------------------
  |  Branch (1057:15): [True: 267, False: 2]
  ------------------
 1058|    267|            return 80; // Mercury
 1059|    267|          }
 1060|      2|          break;
 1061|     35|        case 'o':
  ------------------
  |  Branch (1061:9): [True: 35, False: 3.99k]
  ------------------
 1062|     35|          if (ptr[2] == '\0') { // ho
  ------------------
  |  Branch (1062:15): [True: 34, False: 1]
  ------------------
 1063|     34|            return 67; // Holmium
 1064|     34|          }
 1065|      1|          break;
 1066|     72|        case 's':
  ------------------
  |  Branch (1066:9): [True: 72, False: 3.96k]
  ------------------
 1067|     72|          if (ptr[2] == '\0') { // hs
  ------------------
  |  Branch (1067:15): [True: 69, False: 3]
  ------------------
 1068|     69|            return 108; // Hassium
 1069|     69|          }
 1070|      3|          break;
 1071|  4.03k|        }
 1072|  1.61k|        break;
 1073|  2.68k|      case 'i':
  ------------------
  |  Branch (1073:7): [True: 2.68k, False: 448k]
  ------------------
 1074|  2.68k|        switch (ptr[1]) {
  ------------------
  |  Branch (1074:17): [True: 2.01k, False: 666]
  ------------------
 1075|    719|        case '\0': // i
  ------------------
  |  Branch (1075:9): [True: 719, False: 1.96k]
  ------------------
 1076|    719|          return 53; // Iodine
 1077|  1.26k|        case 'n':
  ------------------
  |  Branch (1077:9): [True: 1.26k, False: 1.41k]
  ------------------
 1078|  1.26k|          if (ptr[2] == '\0') { // in
  ------------------
  |  Branch (1078:15): [True: 1.25k, False: 15]
  ------------------
 1079|  1.25k|            return 49; // Indium
 1080|  1.25k|          }
 1081|     15|          break;
 1082|     34|        case 'r':
  ------------------
  |  Branch (1082:9): [True: 34, False: 2.65k]
  ------------------
 1083|     34|          if (ptr[2] == '\0') { // ir
  ------------------
  |  Branch (1083:15): [True: 24, False: 10]
  ------------------
 1084|     24|            return 77; // Iridium
 1085|     24|          }
 1086|     10|          break;
 1087|  2.68k|        }
 1088|    691|        break;
 1089|  1.65k|      case 'k':
  ------------------
  |  Branch (1089:7): [True: 1.65k, False: 449k]
  ------------------
 1090|  1.65k|        switch (ptr[1]) {
  ------------------
  |  Branch (1090:17): [True: 919, False: 733]
  ------------------
 1091|    723|        case '\0': // k
  ------------------
  |  Branch (1091:9): [True: 723, False: 929]
  ------------------
 1092|    723|          return 19; // Potassium
 1093|    196|        case 'r':
  ------------------
  |  Branch (1093:9): [True: 196, False: 1.45k]
  ------------------
 1094|    196|          if (ptr[2] == '\0') { // kr
  ------------------
  |  Branch (1094:15): [True: 184, False: 12]
  ------------------
 1095|    184|            return 36; // Krypton
 1096|    184|          }
 1097|     12|          break;
 1098|  1.65k|        }
 1099|    745|        break;
 1100|  34.2k|      case 'l':
  ------------------
  |  Branch (1100:7): [True: 34.2k, False: 417k]
  ------------------
 1101|  34.2k|        switch (ptr[1]) {
  ------------------
  |  Branch (1101:17): [True: 30.8k, False: 3.38k]
  ------------------
 1102|  2.61k|        case 'a':
  ------------------
  |  Branch (1102:9): [True: 2.61k, False: 31.6k]
  ------------------
 1103|  2.61k|          if (ptr[2] == '\0') { // la
  ------------------
  |  Branch (1103:15): [True: 2.61k, False: 1]
  ------------------
 1104|  2.61k|            return 57; // Lanthanum
 1105|  2.61k|          }
 1106|      1|          break;
 1107|    222|        case 'i':
  ------------------
  |  Branch (1107:9): [True: 222, False: 34.0k]
  ------------------
 1108|    222|          if (ptr[2] == '\0') { // li
  ------------------
  |  Branch (1108:15): [True: 219, False: 3]
  ------------------
 1109|    219|            return 3; // Lithium
 1110|    219|          }
 1111|      3|          break;
 1112|    143|        case 'r':
  ------------------
  |  Branch (1112:9): [True: 143, False: 34.1k]
  ------------------
 1113|    143|          if (ptr[2] == '\0') { // lr
  ------------------
  |  Branch (1113:15): [True: 132, False: 11]
  ------------------
 1114|    132|            return 103; // Lawrencium
 1115|    132|          }
 1116|     11|          break;
 1117|  27.6k|        case 'u':
  ------------------
  |  Branch (1117:9): [True: 27.6k, False: 6.60k]
  ------------------
 1118|  27.6k|          if (ptr[2] == '\0') { // lu
  ------------------
  |  Branch (1118:15): [True: 27.6k, False: 13]
  ------------------
 1119|  27.6k|            return 71; // Lutetium
 1120|  27.6k|          }
 1121|     13|          break;
 1122|    237|        case 'v':
  ------------------
  |  Branch (1122:9): [True: 237, False: 34.0k]
  ------------------
 1123|    237|          if (ptr[2] == '\0') { // lv
  ------------------
  |  Branch (1123:15): [True: 227, False: 10]
  ------------------
 1124|    227|            return 116; // Livermorium
 1125|    227|          }
 1126|     10|          break;
 1127|  34.2k|        }
 1128|  3.42k|        break;
 1129|  3.42k|      case 'm':
  ------------------
  |  Branch (1129:7): [True: 1.75k, False: 449k]
  ------------------
 1130|  1.75k|        switch (ptr[1]) {
  ------------------
  |  Branch (1130:17): [True: 1.58k, False: 166]
  ------------------
 1131|    666|        case 'c':
  ------------------
  |  Branch (1131:9): [True: 666, False: 1.08k]
  ------------------
 1132|    666|          if (ptr[2] == '\0') { // mc
  ------------------
  |  Branch (1132:15): [True: 659, False: 7]
  ------------------
 1133|    659|            return 115; // Moscovium
 1134|    659|          }
 1135|      7|          break;
 1136|     57|        case 'd':
  ------------------
  |  Branch (1136:9): [True: 57, False: 1.69k]
  ------------------
 1137|     57|          if (ptr[2] == '\0') { // md
  ------------------
  |  Branch (1137:15): [True: 49, False: 8]
  ------------------
 1138|     49|            return 101; // Mendelevium
 1139|     49|          }
 1140|      8|          break;
 1141|    598|        case 'g':
  ------------------
  |  Branch (1141:9): [True: 598, False: 1.15k]
  ------------------
 1142|    598|          if (ptr[2] == '\0') { // mg
  ------------------
  |  Branch (1142:15): [True: 527, False: 71]
  ------------------
 1143|    527|            return 12; // Magnesium
 1144|    527|          }
 1145|     71|          break;
 1146|    162|        case 'n':
  ------------------
  |  Branch (1146:9): [True: 162, False: 1.59k]
  ------------------
 1147|    162|          if (ptr[2] == '\0') { // mn
  ------------------
  |  Branch (1147:15): [True: 128, False: 34]
  ------------------
 1148|    128|            return 25; // Manganese
 1149|    128|          }
 1150|     34|          break;
 1151|     84|        case 'o':
  ------------------
  |  Branch (1151:9): [True: 84, False: 1.67k]
  ------------------
 1152|     84|          if (ptr[2] == '\0') { // mo
  ------------------
  |  Branch (1152:15): [True: 73, False: 11]
  ------------------
 1153|     73|            return 42; // Molybdenum
 1154|     73|          }
 1155|     11|          break;
 1156|     21|        case 't':
  ------------------
  |  Branch (1156:9): [True: 21, False: 1.73k]
  ------------------
 1157|     21|          if (ptr[2] == '\0') { // mt
  ------------------
  |  Branch (1157:15): [True: 10, False: 11]
  ------------------
 1158|     10|            return 109; // Meitnerium
 1159|     10|          }
 1160|     11|          break;
 1161|  1.75k|        }
 1162|    308|        break;
 1163|  20.4k|      case 'n':
  ------------------
  |  Branch (1163:7): [True: 20.4k, False: 430k]
  ------------------
 1164|  20.4k|        switch (ptr[1]) {
  ------------------
  |  Branch (1164:17): [True: 12.1k, False: 8.32k]
  ------------------
 1165|  10.2k|        case '\0': // n
  ------------------
  |  Branch (1165:9): [True: 10.2k, False: 10.2k]
  ------------------
 1166|  10.2k|          return 7; // Nitrogen
 1167|    400|        case 'a':
  ------------------
  |  Branch (1167:9): [True: 400, False: 20.0k]
  ------------------
 1168|    400|          if (ptr[2] == '\0') { // na
  ------------------
  |  Branch (1168:15): [True: 341, False: 59]
  ------------------
 1169|    341|            return 11; // Sodium
 1170|    341|          }
 1171|     59|          break;
 1172|    201|        case 'b':
  ------------------
  |  Branch (1172:9): [True: 201, False: 20.2k]
  ------------------
 1173|    201|          if (ptr[2] == '\0') { // nb
  ------------------
  |  Branch (1173:15): [True: 200, False: 1]
  ------------------
 1174|    200|            return 41; // Niobium
 1175|    200|          }
 1176|      1|          break;
 1177|     28|        case 'd':
  ------------------
  |  Branch (1177:9): [True: 28, False: 20.4k]
  ------------------
 1178|     28|          if (ptr[2] == '\0') { // nd
  ------------------
  |  Branch (1178:15): [True: 25, False: 3]
  ------------------
 1179|     25|            return 60; // Neodymium
 1180|     25|          }
 1181|      3|          break;
 1182|    223|        case 'e':
  ------------------
  |  Branch (1182:9): [True: 223, False: 20.2k]
  ------------------
 1183|    223|          if (ptr[2] == '\0') { // ne
  ------------------
  |  Branch (1183:15): [True: 144, False: 79]
  ------------------
 1184|    144|            return 10; // Neon
 1185|    144|          }
 1186|     79|          break;
 1187|    177|        case 'h':
  ------------------
  |  Branch (1187:9): [True: 177, False: 20.3k]
  ------------------
 1188|    177|          if (ptr[2] == '\0') { // nh
  ------------------
  |  Branch (1188:15): [True: 174, False: 3]
  ------------------
 1189|    174|            return 113; // Nihonium
 1190|    174|          }
 1191|      3|          break;
 1192|    357|        case 'i':
  ------------------
  |  Branch (1192:9): [True: 357, False: 20.1k]
  ------------------
 1193|    357|          if (ptr[2] == '\0') { // ni
  ------------------
  |  Branch (1193:15): [True: 253, False: 104]
  ------------------
 1194|    253|            return 28; // Nickel
 1195|    253|          }
 1196|    104|          break;
 1197|    104|        case 'o':
  ------------------
  |  Branch (1197:9): [True: 88, False: 20.3k]
  ------------------
 1198|     88|          if (ptr[2] == '\0') { // no
  ------------------
  |  Branch (1198:15): [True: 78, False: 10]
  ------------------
 1199|     78|            return 102; // Nobelium
 1200|     78|          }
 1201|     10|          break;
 1202|    474|        case 'p':
  ------------------
  |  Branch (1202:9): [True: 474, False: 20.0k]
  ------------------
 1203|    474|          if (ptr[2] == '\0') { // np
  ------------------
  |  Branch (1203:15): [True: 423, False: 51]
  ------------------
 1204|    423|            return 93; // Neptunium
 1205|    423|          }
 1206|     51|          break;
 1207|  20.4k|        }
 1208|  8.63k|        break;
 1209|  18.9k|      case 'o':
  ------------------
  |  Branch (1209:7): [True: 18.9k, False: 432k]
  ------------------
 1210|  18.9k|        switch (ptr[1]) {
  ------------------
  |  Branch (1210:17): [True: 10.1k, False: 8.81k]
  ------------------
 1211|  9.95k|        case '\0': // o
  ------------------
  |  Branch (1211:9): [True: 9.95k, False: 8.96k]
  ------------------
 1212|  9.95k|          return 8; // Oxygen
 1213|     37|        case 'g':
  ------------------
  |  Branch (1213:9): [True: 37, False: 18.8k]
  ------------------
 1214|     37|          if (ptr[2] == '\0') { // og
  ------------------
  |  Branch (1214:15): [True: 36, False: 1]
  ------------------
 1215|     36|            return 118; // Oganesson
 1216|     36|          }
 1217|      1|          break;
 1218|    107|        case 's':
  ------------------
  |  Branch (1218:9): [True: 107, False: 18.8k]
  ------------------
 1219|    107|          if (ptr[2] == '\0') { // os
  ------------------
  |  Branch (1219:15): [True: 88, False: 19]
  ------------------
 1220|     88|            return 76; // Osmium
 1221|     88|          }
 1222|     19|          break;
 1223|  18.9k|        }
 1224|  8.83k|        break;
 1225|  10.5k|      case 'p':
  ------------------
  |  Branch (1225:7): [True: 10.5k, False: 440k]
  ------------------
 1226|  10.5k|        switch (ptr[1]) {
  ------------------
  |  Branch (1226:17): [True: 5.65k, False: 4.91k]
  ------------------
 1227|  4.27k|        case '\0': // p
  ------------------
  |  Branch (1227:9): [True: 4.27k, False: 6.29k]
  ------------------
 1228|  4.27k|          return 15; // Phosphorus
 1229|     82|        case 'a':
  ------------------
  |  Branch (1229:9): [True: 82, False: 10.4k]
  ------------------
 1230|     82|          if (ptr[2] == '\0') { // pa
  ------------------
  |  Branch (1230:15): [True: 76, False: 6]
  ------------------
 1231|     76|            return 91; // Protactinium
 1232|     76|          }
 1233|      6|          break;
 1234|    911|        case 'b':
  ------------------
  |  Branch (1234:9): [True: 911, False: 9.65k]
  ------------------
 1235|    911|          if (ptr[2] == '\0') { // pb
  ------------------
  |  Branch (1235:15): [True: 885, False: 26]
  ------------------
 1236|    885|            return 82; // Lead
 1237|    885|          }
 1238|     26|          break;
 1239|     73|        case 'd':
  ------------------
  |  Branch (1239:9): [True: 73, False: 10.4k]
  ------------------
 1240|     73|          if (ptr[2] == '\0') { // pd
  ------------------
  |  Branch (1240:15): [True: 70, False: 3]
  ------------------
 1241|     70|            return 46; // Palladium
 1242|     70|          }
 1243|      3|          break;
 1244|     95|        case 'm':
  ------------------
  |  Branch (1244:9): [True: 95, False: 10.4k]
  ------------------
 1245|     95|          if (ptr[2] == '\0') { // pm
  ------------------
  |  Branch (1245:15): [True: 94, False: 1]
  ------------------
 1246|     94|            return 61; // Promethium
 1247|     94|          }
 1248|      1|          break;
 1249|     69|        case 'o':
  ------------------
  |  Branch (1249:9): [True: 69, False: 10.4k]
  ------------------
 1250|     69|          if (ptr[2] == '\0') { // po
  ------------------
  |  Branch (1250:15): [True: 66, False: 3]
  ------------------
 1251|     66|            return 84; // Polonium
 1252|     66|          }
 1253|      3|          break;
 1254|     36|        case 'r':
  ------------------
  |  Branch (1254:9): [True: 36, False: 10.5k]
  ------------------
 1255|     36|          if (ptr[2] == '\0') { // pr
  ------------------
  |  Branch (1255:15): [True: 22, False: 14]
  ------------------
 1256|     22|            return 59; // Praseodymium
 1257|     22|          }
 1258|     14|          break;
 1259|     33|        case 't':
  ------------------
  |  Branch (1259:9): [True: 33, False: 10.5k]
  ------------------
 1260|     33|          if (ptr[2] == '\0') { // pt
  ------------------
  |  Branch (1260:15): [True: 31, False: 2]
  ------------------
 1261|     31|            return 78; // Platinum
 1262|     31|          }
 1263|      2|          break;
 1264|     87|        case 'u':
  ------------------
  |  Branch (1264:9): [True: 87, False: 10.4k]
  ------------------
 1265|     87|          if (ptr[2] == '\0') { // pu
  ------------------
  |  Branch (1265:15): [True: 50, False: 37]
  ------------------
 1266|     50|            return 94; // Plutonium
 1267|     50|          }
 1268|     37|          break;
 1269|  10.5k|        }
 1270|  5.00k|        break;
 1271|  5.00k|      case 'r':
  ------------------
  |  Branch (1271:7): [True: 2.39k, False: 448k]
  ------------------
 1272|  2.39k|        switch (ptr[1]) {
  ------------------
  |  Branch (1272:17): [True: 2.09k, False: 304]
  ------------------
 1273|    695|        case 'a':
  ------------------
  |  Branch (1273:9): [True: 695, False: 1.69k]
  ------------------
 1274|    695|          if (ptr[2] == '\0') { // ra
  ------------------
  |  Branch (1274:15): [True: 692, False: 3]
  ------------------
 1275|    692|            return 88; // Radium
 1276|    692|          }
 1277|      3|          break;
 1278|    846|        case 'b':
  ------------------
  |  Branch (1278:9): [True: 846, False: 1.54k]
  ------------------
 1279|    846|          if (ptr[2] == '\0') { // rb
  ------------------
  |  Branch (1279:15): [True: 843, False: 3]
  ------------------
 1280|    843|            return 37; // Rubidium
 1281|    843|          }
 1282|      3|          break;
 1283|    110|        case 'e':
  ------------------
  |  Branch (1283:9): [True: 110, False: 2.28k]
  ------------------
 1284|    110|          if (ptr[2] == '\0') { // re
  ------------------
  |  Branch (1284:15): [True: 109, False: 1]
  ------------------
 1285|    109|            return 75; // Rhenium
 1286|    109|          }
 1287|      1|          break;
 1288|     18|        case 'f':
  ------------------
  |  Branch (1288:9): [True: 18, False: 2.37k]
  ------------------
 1289|     18|          if (ptr[2] == '\0') { // rf
  ------------------
  |  Branch (1289:15): [True: 11, False: 7]
  ------------------
 1290|     11|            return 104; // Rutherfordium
 1291|     11|          }
 1292|      7|          break;
 1293|      7|        case 'g':
  ------------------
  |  Branch (1293:9): [True: 7, False: 2.38k]
  ------------------
 1294|      7|          if (ptr[2] == '\0') { // rg
  ------------------
  |  Branch (1294:15): [True: 6, False: 1]
  ------------------
 1295|      6|            return 111; // Roentgenium
 1296|      6|          }
 1297|      1|          break;
 1298|     24|        case 'h':
  ------------------
  |  Branch (1298:9): [True: 24, False: 2.37k]
  ------------------
 1299|     24|          if (ptr[2] == '\0') { // rh
  ------------------
  |  Branch (1299:15): [True: 21, False: 3]
  ------------------
 1300|     21|            return 45; // Rhodium
 1301|     21|          }
 1302|      3|          break;
 1303|    200|        case 'n':
  ------------------
  |  Branch (1303:9): [True: 200, False: 2.19k]
  ------------------
 1304|    200|          if (ptr[2] == '\0') { // rn
  ------------------
  |  Branch (1304:15): [True: 134, False: 66]
  ------------------
 1305|    134|            return 86; // Radon
 1306|    134|          }
 1307|     66|          break;
 1308|    190|        case 'u':
  ------------------
  |  Branch (1308:9): [True: 190, False: 2.20k]
  ------------------
 1309|    190|          if (ptr[2] == '\0') { // ru
  ------------------
  |  Branch (1309:15): [True: 179, False: 11]
  ------------------
 1310|    179|            return 44; // Ruthenium
 1311|    179|          }
 1312|     11|          break;
 1313|  2.39k|        }
 1314|    399|        break;
 1315|  8.94k|      case 's':
  ------------------
  |  Branch (1315:7): [True: 8.94k, False: 442k]
  ------------------
 1316|  8.94k|        switch (ptr[1]) {
  ------------------
  |  Branch (1316:17): [True: 5.99k, False: 2.95k]
  ------------------
 1317|  3.39k|        case '\0': // s
  ------------------
  |  Branch (1317:9): [True: 3.39k, False: 5.54k]
  ------------------
 1318|  3.39k|          return 16; // Sulfur
 1319|    809|        case 'b':
  ------------------
  |  Branch (1319:9): [True: 809, False: 8.13k]
  ------------------
 1320|    809|          if (ptr[2] == '\0') { // sb
  ------------------
  |  Branch (1320:15): [True: 798, False: 11]
  ------------------
 1321|    798|            return 51; // Antimony
 1322|    798|          }
 1323|     11|          break;
 1324|    702|        case 'c':
  ------------------
  |  Branch (1324:9): [True: 702, False: 8.24k]
  ------------------
 1325|    702|          if (ptr[2] == '\0') { // sc
  ------------------
  |  Branch (1325:15): [True: 699, False: 3]
  ------------------
 1326|    699|            return 21; // Scandium
 1327|    699|          }
 1328|      3|          break;
 1329|    409|        case 'e':
  ------------------
  |  Branch (1329:9): [True: 409, False: 8.53k]
  ------------------
 1330|    409|          if (ptr[2] == '\0') { // se
  ------------------
  |  Branch (1330:15): [True: 408, False: 1]
  ------------------
 1331|    408|            return 34; // Selenium
 1332|    408|          }
 1333|      1|          break;
 1334|     18|        case 'g':
  ------------------
  |  Branch (1334:9): [True: 18, False: 8.92k]
  ------------------
 1335|     18|          if (ptr[2] == '\0') { // sg
  ------------------
  |  Branch (1335:15): [True: 17, False: 1]
  ------------------
 1336|     17|            return 106; // Seaborgium
 1337|     17|          }
 1338|      1|          break;
 1339|    219|        case 'i':
  ------------------
  |  Branch (1339:9): [True: 219, False: 8.72k]
  ------------------
 1340|    219|          if (ptr[2] == '\0') { // si
  ------------------
  |  Branch (1340:15): [True: 134, False: 85]
  ------------------
 1341|    134|            return 14; // Silicon
 1342|    134|          }
 1343|     85|          break;
 1344|     99|        case 'm':
  ------------------
  |  Branch (1344:9): [True: 99, False: 8.84k]
  ------------------
 1345|     99|          if (ptr[2] == '\0') { // sm
  ------------------
  |  Branch (1345:15): [True: 98, False: 1]
  ------------------
 1346|     98|            return 62; // Samarium
 1347|     98|          }
 1348|      1|          break;
 1349|    322|        case 'n':
  ------------------
  |  Branch (1349:9): [True: 322, False: 8.62k]
  ------------------
 1350|    322|          if (ptr[2] == '\0') { // sn
  ------------------
  |  Branch (1350:15): [True: 320, False: 2]
  ------------------
 1351|    320|            return 50; // Tin
 1352|    320|          }
 1353|      2|          break;
 1354|     14|        case 'r':
  ------------------
  |  Branch (1354:9): [True: 14, False: 8.93k]
  ------------------
 1355|     14|          if (ptr[2] == '\0') { // sr
  ------------------
  |  Branch (1355:15): [True: 13, False: 1]
  ------------------
 1356|     13|            return 38; // Strontium
 1357|     13|          }
 1358|      1|          break;
 1359|  8.94k|        }
 1360|  3.06k|        break;
 1361|  3.06k|      case 't':
  ------------------
  |  Branch (1361:7): [True: 1.80k, False: 449k]
  ------------------
 1362|  1.80k|        switch (ptr[1]) {
  ------------------
  |  Branch (1362:17): [True: 1.02k, False: 781]
  ------------------
 1363|     25|        case 'a':
  ------------------
  |  Branch (1363:9): [True: 25, False: 1.77k]
  ------------------
 1364|     25|          if (ptr[2] == '\0') { // ta
  ------------------
  |  Branch (1364:15): [True: 15, False: 10]
  ------------------
 1365|     15|            return 73; // Tantalum
 1366|     15|          }
 1367|     10|          break;
 1368|     11|        case 'b':
  ------------------
  |  Branch (1368:9): [True: 11, False: 1.79k]
  ------------------
 1369|     11|          if (ptr[2] == '\0') { // tb
  ------------------
  |  Branch (1369:15): [True: 10, False: 1]
  ------------------
 1370|     10|            return 65; // Terbium
 1371|     10|          }
 1372|      1|          break;
 1373|    269|        case 'c':
  ------------------
  |  Branch (1373:9): [True: 269, False: 1.53k]
  ------------------
 1374|    269|          if (ptr[2] == '\0') { // tc
  ------------------
  |  Branch (1374:15): [True: 266, False: 3]
  ------------------
 1375|    266|            return 43; // Technetium
 1376|    266|          }
 1377|      3|          break;
 1378|     68|        case 'e':
  ------------------
  |  Branch (1378:9): [True: 68, False: 1.73k]
  ------------------
 1379|     68|          if (ptr[2] == '\0') { // te
  ------------------
  |  Branch (1379:15): [True: 67, False: 1]
  ------------------
 1380|     67|            return 52; // Tellurium
 1381|     67|          }
 1382|      1|          break;
 1383|     22|        case 'h':
  ------------------
  |  Branch (1383:9): [True: 22, False: 1.78k]
  ------------------
 1384|     22|          if (ptr[2] == '\0') { // th
  ------------------
  |  Branch (1384:15): [True: 21, False: 1]
  ------------------
 1385|     21|            return 90; // Thorium
 1386|     21|          }
 1387|      1|          break;
 1388|     32|        case 'i':
  ------------------
  |  Branch (1388:9): [True: 32, False: 1.77k]
  ------------------
 1389|     32|          if (ptr[2] == '\0') { // ti
  ------------------
  |  Branch (1389:15): [True: 30, False: 2]
  ------------------
 1390|     30|            return 22; // Titanium
 1391|     30|          }
 1392|      2|          break;
 1393|    260|        case 'l':
  ------------------
  |  Branch (1393:9): [True: 260, False: 1.54k]
  ------------------
 1394|    260|          if (ptr[2] == '\0') { // tl
  ------------------
  |  Branch (1394:15): [True: 257, False: 3]
  ------------------
 1395|    257|            return 81; // Thallium
 1396|    257|          }
 1397|      3|          break;
 1398|     94|        case 'm':
  ------------------
  |  Branch (1398:9): [True: 94, False: 1.70k]
  ------------------
 1399|     94|          if (ptr[2] == '\0') { // tm
  ------------------
  |  Branch (1399:15): [True: 93, False: 1]
  ------------------
 1400|     93|            return 69; // Thulium
 1401|     93|          }
 1402|      1|          break;
 1403|    241|        case 's':
  ------------------
  |  Branch (1403:9): [True: 241, False: 1.56k]
  ------------------
 1404|    241|          if (ptr[2] == '\0') { // ts
  ------------------
  |  Branch (1404:15): [True: 106, False: 135]
  ------------------
 1405|    106|            return 117; // Tennessine
 1406|    106|          }
 1407|    135|          break;
 1408|  1.80k|        }
 1409|    938|        break;
 1410|    938|      case 'u':
  ------------------
  |  Branch (1410:7): [True: 113, False: 451k]
  ------------------
 1411|    113|        if (ptr[1] == '\0') { // u
  ------------------
  |  Branch (1411:13): [True: 24, False: 89]
  ------------------
 1412|     24|          return 92; // Uranium
 1413|     24|        }
 1414|     89|        break;
 1415|    306|      case 'v':
  ------------------
  |  Branch (1415:7): [True: 306, False: 450k]
  ------------------
 1416|    306|        if (ptr[1] == '\0') { // v
  ------------------
  |  Branch (1416:13): [True: 149, False: 157]
  ------------------
 1417|    149|          return 23; // Vanadium
 1418|    149|        }
 1419|    157|        break;
 1420|  3.22k|      case 'w':
  ------------------
  |  Branch (1420:7): [True: 3.22k, False: 448k]
  ------------------
 1421|  3.22k|        if (ptr[1] == '\0') { // w
  ------------------
  |  Branch (1421:13): [True: 103, False: 3.12k]
  ------------------
 1422|    103|          return 74; // Tungsten
 1423|    103|        }
 1424|  3.12k|        break;
 1425|  3.12k|      case 'x':
  ------------------
  |  Branch (1425:7): [True: 116, False: 451k]
  ------------------
 1426|    116|        if (ptr[1] == 'e' && ptr[2] == '\0') { // xe
  ------------------
  |  Branch (1426:13): [True: 58, False: 58]
  |  Branch (1426:30): [True: 52, False: 6]
  ------------------
 1427|     52|          return 54; // Xenon
 1428|     52|        }
 1429|     64|        break;
 1430|    542|      case 'y':
  ------------------
  |  Branch (1430:7): [True: 542, False: 450k]
  ------------------
 1431|    542|        switch (ptr[1]) {
  ------------------
  |  Branch (1431:17): [True: 278, False: 264]
  ------------------
 1432|    231|        case '\0': // y
  ------------------
  |  Branch (1432:9): [True: 231, False: 311]
  ------------------
 1433|    231|          return 39; // Yttrium
 1434|     47|        case 'b':
  ------------------
  |  Branch (1434:9): [True: 47, False: 495]
  ------------------
 1435|     47|          if (ptr[2] == '\0') { // yb
  ------------------
  |  Branch (1435:15): [True: 46, False: 1]
  ------------------
 1436|     46|            return 70; // Ytterbium
 1437|     46|          }
 1438|      1|          break;
 1439|    542|        }
 1440|    265|        break;
 1441|    265|      case 'z':
  ------------------
  |  Branch (1441:7): [True: 232, False: 451k]
  ------------------
 1442|    232|        switch (ptr[1]) {
  ------------------
  |  Branch (1442:17): [True: 77, False: 155]
  ------------------
 1443|     32|        case 'n':
  ------------------
  |  Branch (1443:9): [True: 32, False: 200]
  ------------------
 1444|     32|          if (ptr[2] == '\0') { // zn
  ------------------
  |  Branch (1444:15): [True: 31, False: 1]
  ------------------
 1445|     31|            return 30; // Zinc
 1446|     31|          }
 1447|      1|          break;
 1448|     45|        case 'r':
  ------------------
  |  Branch (1448:9): [True: 45, False: 187]
  ------------------
 1449|     45|          if (ptr[2] == '\0') { // zr
  ------------------
  |  Branch (1449:15): [True: 42, False: 3]
  ------------------
 1450|     42|            return 40; // Zirconium
 1451|     42|          }
 1452|      3|          break;
 1453|    232|        }
 1454|    159|        break;
 1455|   451k|      }
 1456|   245k|      return 0;
 1457|   451k|    }
_ZN9OpenBabel10OBElements12GetExactMassEjj:
 1473|   415k|    {
 1474|       |      // Note that an isotope value of 0 (the default) should return the mass
 1475|       |      // of the most abundant isotope
 1476|   415k|      switch(atomic_num) {
  ------------------
  |  Branch (1476:14): [True: 415k, False: 4]
  ------------------
 1477|  54.0k|      case 0:
  ------------------
  |  Branch (1477:7): [True: 54.0k, False: 361k]
  ------------------
 1478|  54.0k|        switch (isotope) {
  ------------------
  |  Branch (1478:17): [True: 53.9k, False: 72]
  ------------------
 1479|  53.9k|        case 0: return 0.000000000;
  ------------------
  |  Branch (1479:9): [True: 53.9k, False: 84]
  ------------------
 1480|     12|        case 1: return 1.008664915;
  ------------------
  |  Branch (1480:9): [True: 12, False: 54.0k]
  ------------------
 1481|  54.0k|        }
 1482|     72|        break;
 1483|  15.5k|      case 1:
  ------------------
  |  Branch (1483:7): [True: 15.5k, False: 399k]
  ------------------
 1484|  15.5k|        switch (isotope) {
  ------------------
  |  Branch (1484:17): [True: 14.9k, False: 600]
  ------------------
 1485|  14.6k|        case 0: case 1: return 1.007825032;
  ------------------
  |  Branch (1485:9): [True: 5.75k, False: 9.76k]
  |  Branch (1485:17): [True: 8.90k, False: 6.61k]
  ------------------
 1486|    114|        case 2: return 2.014101778;
  ------------------
  |  Branch (1486:9): [True: 114, False: 15.4k]
  ------------------
 1487|     70|        case 3: return 3.016049278;
  ------------------
  |  Branch (1487:9): [True: 70, False: 15.4k]
  ------------------
 1488|     12|        case 4: return 4.027810000;
  ------------------
  |  Branch (1488:9): [True: 12, False: 15.5k]
  ------------------
 1489|      2|        case 5: return 5.035310000;
  ------------------
  |  Branch (1489:9): [True: 2, False: 15.5k]
  ------------------
 1490|      6|        case 6: return 6.044940000;
  ------------------
  |  Branch (1490:9): [True: 6, False: 15.5k]
  ------------------
 1491|     52|        case 7: return 7.052750000;
  ------------------
  |  Branch (1491:9): [True: 52, False: 15.4k]
  ------------------
 1492|  15.5k|        }
 1493|    600|        break;
 1494|    600|      case 2:
  ------------------
  |  Branch (1494:7): [True: 356, False: 414k]
  ------------------
 1495|    356|        switch (isotope) {
  ------------------
  |  Branch (1495:17): [True: 350, False: 6]
  ------------------
 1496|      0|        case 3: return 3.016029319;
  ------------------
  |  Branch (1496:9): [True: 0, False: 356]
  ------------------
 1497|    312|        case 0: case 4: return 4.002603254;
  ------------------
  |  Branch (1497:9): [True: 310, False: 46]
  |  Branch (1497:17): [True: 2, False: 354]
  ------------------
 1498|      2|        case 5: return 5.012220000;
  ------------------
  |  Branch (1498:9): [True: 2, False: 354]
  ------------------
 1499|     14|        case 6: return 6.018889100;
  ------------------
  |  Branch (1499:9): [True: 14, False: 342]
  ------------------
 1500|      2|        case 7: return 7.028021000;
  ------------------
  |  Branch (1500:9): [True: 2, False: 354]
  ------------------
 1501|     10|        case 8: return 8.033922000;
  ------------------
  |  Branch (1501:9): [True: 10, False: 346]
  ------------------
 1502|     10|        case 9: return 9.043950000;
  ------------------
  |  Branch (1502:9): [True: 10, False: 346]
  ------------------
 1503|      0|        case 10: return 10.052400000;
  ------------------
  |  Branch (1503:9): [True: 0, False: 356]
  ------------------
 1504|    356|        }
 1505|      6|        break;
 1506|    179|      case 3:
  ------------------
  |  Branch (1506:7): [True: 179, False: 414k]
  ------------------
 1507|    179|        switch (isotope) {
  ------------------
  |  Branch (1507:17): [True: 169, False: 10]
  ------------------
 1508|      4|        case 3: return 3.030780000;
  ------------------
  |  Branch (1508:9): [True: 4, False: 175]
  ------------------
 1509|      2|        case 4: return 4.027190000;
  ------------------
  |  Branch (1509:9): [True: 2, False: 177]
  ------------------
 1510|      0|        case 5: return 5.012540000;
  ------------------
  |  Branch (1510:9): [True: 0, False: 179]
  ------------------
 1511|      2|        case 6: return 6.015122795;
  ------------------
  |  Branch (1511:9): [True: 2, False: 177]
  ------------------
 1512|    145|        case 0: case 7: return 7.016004550;
  ------------------
  |  Branch (1512:9): [True: 131, False: 48]
  |  Branch (1512:17): [True: 14, False: 165]
  ------------------
 1513|      0|        case 8: return 8.022487360;
  ------------------
  |  Branch (1513:9): [True: 0, False: 179]
  ------------------
 1514|      2|        case 9: return 9.026789500;
  ------------------
  |  Branch (1514:9): [True: 2, False: 177]
  ------------------
 1515|      6|        case 10: return 10.035481000;
  ------------------
  |  Branch (1515:9): [True: 6, False: 173]
  ------------------
 1516|      2|        case 11: return 11.043798000;
  ------------------
  |  Branch (1516:9): [True: 2, False: 177]
  ------------------
 1517|      6|        case 12: return 12.053780000;
  ------------------
  |  Branch (1517:9): [True: 6, False: 173]
  ------------------
 1518|    179|        }
 1519|     10|        break;
 1520|    298|      case 4:
  ------------------
  |  Branch (1520:7): [True: 298, False: 414k]
  ------------------
 1521|    298|        switch (isotope) {
  ------------------
  |  Branch (1521:17): [True: 282, False: 16]
  ------------------
 1522|      0|        case 5: return 5.040790000;
  ------------------
  |  Branch (1522:9): [True: 0, False: 298]
  ------------------
 1523|      6|        case 6: return 6.019726000;
  ------------------
  |  Branch (1523:9): [True: 6, False: 292]
  ------------------
 1524|      2|        case 7: return 7.016929830;
  ------------------
  |  Branch (1524:9): [True: 2, False: 296]
  ------------------
 1525|      0|        case 8: return 8.005305100;
  ------------------
  |  Branch (1525:9): [True: 0, False: 298]
  ------------------
 1526|    254|        case 0: case 9: return 9.012182200;
  ------------------
  |  Branch (1526:9): [True: 254, False: 44]
  |  Branch (1526:17): [True: 0, False: 298]
  ------------------
 1527|      0|        case 10: return 10.013533800;
  ------------------
  |  Branch (1527:9): [True: 0, False: 298]
  ------------------
 1528|      6|        case 11: return 11.021658000;
  ------------------
  |  Branch (1528:9): [True: 6, False: 292]
  ------------------
 1529|      4|        case 12: return 12.026921000;
  ------------------
  |  Branch (1529:9): [True: 4, False: 294]
  ------------------
 1530|      2|        case 13: return 13.035690000;
  ------------------
  |  Branch (1530:9): [True: 2, False: 296]
  ------------------
 1531|      2|        case 14: return 14.042890000;
  ------------------
  |  Branch (1531:9): [True: 2, False: 296]
  ------------------
 1532|      0|        case 15: return 15.053460000;
  ------------------
  |  Branch (1532:9): [True: 0, False: 298]
  ------------------
 1533|      6|        case 16: return 16.061920000;
  ------------------
  |  Branch (1533:9): [True: 6, False: 292]
  ------------------
 1534|    298|        }
 1535|     16|        break;
 1536|  20.2k|      case 5:
  ------------------
  |  Branch (1536:7): [True: 20.2k, False: 394k]
  ------------------
 1537|  20.2k|        switch (isotope) {
  ------------------
  |  Branch (1537:17): [True: 20.2k, False: 64]
  ------------------
 1538|      8|        case 6: return 6.046810000;
  ------------------
  |  Branch (1538:9): [True: 8, False: 20.2k]
  ------------------
 1539|     18|        case 7: return 7.029920000;
  ------------------
  |  Branch (1539:9): [True: 18, False: 20.2k]
  ------------------
 1540|      0|        case 8: return 8.024607200;
  ------------------
  |  Branch (1540:9): [True: 0, False: 20.2k]
  ------------------
 1541|      0|        case 9: return 9.013328800;
  ------------------
  |  Branch (1541:9): [True: 0, False: 20.2k]
  ------------------
 1542|      6|        case 10: return 10.012937000;
  ------------------
  |  Branch (1542:9): [True: 6, False: 20.2k]
  ------------------
 1543|  20.1k|        case 0: case 11: return 11.009305400;
  ------------------
  |  Branch (1543:9): [True: 20.1k, False: 172]
  |  Branch (1543:17): [True: 44, False: 20.2k]
  ------------------
 1544|      0|        case 12: return 12.014352100;
  ------------------
  |  Branch (1544:9): [True: 0, False: 20.2k]
  ------------------
 1545|      2|        case 13: return 13.017780200;
  ------------------
  |  Branch (1545:9): [True: 2, False: 20.2k]
  ------------------
 1546|      4|        case 14: return 14.025404000;
  ------------------
  |  Branch (1546:9): [True: 4, False: 20.2k]
  ------------------
 1547|      6|        case 15: return 15.031103000;
  ------------------
  |  Branch (1547:9): [True: 6, False: 20.2k]
  ------------------
 1548|      2|        case 16: return 16.039810000;
  ------------------
  |  Branch (1548:9): [True: 2, False: 20.2k]
  ------------------
 1549|      2|        case 17: return 17.046990000;
  ------------------
  |  Branch (1549:9): [True: 2, False: 20.2k]
  ------------------
 1550|     16|        case 18: return 18.056170000;
  ------------------
  |  Branch (1550:9): [True: 16, False: 20.2k]
  ------------------
 1551|      0|        case 19: return 19.063730000;
  ------------------
  |  Branch (1551:9): [True: 0, False: 20.2k]
  ------------------
 1552|  20.2k|        }
 1553|     64|        break;
 1554|  84.4k|      case 6:
  ------------------
  |  Branch (1554:7): [True: 84.4k, False: 330k]
  ------------------
 1555|  84.4k|        switch (isotope) {
  ------------------
  |  Branch (1555:17): [True: 84.3k, False: 100]
  ------------------
 1556|      0|        case 8: return 8.037675000;
  ------------------
  |  Branch (1556:9): [True: 0, False: 84.4k]
  ------------------
 1557|      2|        case 9: return 9.031036700;
  ------------------
  |  Branch (1557:9): [True: 2, False: 84.4k]
  ------------------
 1558|      2|        case 10: return 10.016853200;
  ------------------
  |  Branch (1558:9): [True: 2, False: 84.4k]
  ------------------
 1559|      0|        case 11: return 11.011433600;
  ------------------
  |  Branch (1559:9): [True: 0, False: 84.4k]
  ------------------
 1560|  84.2k|        case 0: case 12: return 12.000000000;
  ------------------
  |  Branch (1560:9): [True: 84.2k, False: 150]
  |  Branch (1560:17): [True: 10, False: 84.4k]
  ------------------
 1561|      2|        case 13: return 13.003354838;
  ------------------
  |  Branch (1561:9): [True: 2, False: 84.4k]
  ------------------
 1562|      0|        case 14: return 14.003241989;
  ------------------
  |  Branch (1562:9): [True: 0, False: 84.4k]
  ------------------
 1563|      2|        case 15: return 15.010599300;
  ------------------
  |  Branch (1563:9): [True: 2, False: 84.4k]
  ------------------
 1564|      8|        case 16: return 16.014701000;
  ------------------
  |  Branch (1564:9): [True: 8, False: 84.4k]
  ------------------
 1565|      6|        case 17: return 17.022586000;
  ------------------
  |  Branch (1565:9): [True: 6, False: 84.4k]
  ------------------
 1566|      2|        case 18: return 18.026760000;
  ------------------
  |  Branch (1566:9): [True: 2, False: 84.4k]
  ------------------
 1567|      2|        case 19: return 19.034810000;
  ------------------
  |  Branch (1567:9): [True: 2, False: 84.4k]
  ------------------
 1568|      6|        case 20: return 20.040320000;
  ------------------
  |  Branch (1568:9): [True: 6, False: 84.4k]
  ------------------
 1569|      6|        case 21: return 21.049340000;
  ------------------
  |  Branch (1569:9): [True: 6, False: 84.4k]
  ------------------
 1570|      2|        case 22: return 22.057200000;
  ------------------
  |  Branch (1570:9): [True: 2, False: 84.4k]
  ------------------
 1571|  84.4k|        }
 1572|    100|        break;
 1573|  59.8k|      case 7:
  ------------------
  |  Branch (1573:7): [True: 59.8k, False: 355k]
  ------------------
 1574|  59.8k|        switch (isotope) {
  ------------------
  |  Branch (1574:17): [True: 59.6k, False: 150]
  ------------------
 1575|      0|        case 10: return 10.041650000;
  ------------------
  |  Branch (1575:9): [True: 0, False: 59.8k]
  ------------------
 1576|      6|        case 11: return 11.026090000;
  ------------------
  |  Branch (1576:9): [True: 6, False: 59.8k]
  ------------------
 1577|      0|        case 12: return 12.018613200;
  ------------------
  |  Branch (1577:9): [True: 0, False: 59.8k]
  ------------------
 1578|      2|        case 13: return 13.005738610;
  ------------------
  |  Branch (1578:9): [True: 2, False: 59.8k]
  ------------------
 1579|  59.6k|        case 0: case 14: return 14.003074005;
  ------------------
  |  Branch (1579:9): [True: 59.6k, False: 196]
  |  Branch (1579:17): [True: 4, False: 59.8k]
  ------------------
 1580|      4|        case 15: return 15.000108898;
  ------------------
  |  Branch (1580:9): [True: 4, False: 59.8k]
  ------------------
 1581|      4|        case 16: return 16.006101700;
  ------------------
  |  Branch (1581:9): [True: 4, False: 59.8k]
  ------------------
 1582|      2|        case 17: return 17.008450000;
  ------------------
  |  Branch (1582:9): [True: 2, False: 59.8k]
  ------------------
 1583|      0|        case 18: return 18.014079000;
  ------------------
  |  Branch (1583:9): [True: 0, False: 59.8k]
  ------------------
 1584|     16|        case 19: return 19.017029000;
  ------------------
  |  Branch (1584:9): [True: 16, False: 59.7k]
  ------------------
 1585|      0|        case 20: return 20.023370000;
  ------------------
  |  Branch (1585:9): [True: 0, False: 59.8k]
  ------------------
 1586|      0|        case 21: return 21.027110000;
  ------------------
  |  Branch (1586:9): [True: 0, False: 59.8k]
  ------------------
 1587|      6|        case 22: return 22.034390000;
  ------------------
  |  Branch (1587:9): [True: 6, False: 59.8k]
  ------------------
 1588|      0|        case 23: return 23.041220000;
  ------------------
  |  Branch (1588:9): [True: 0, False: 59.8k]
  ------------------
 1589|      0|        case 24: return 24.051040000;
  ------------------
  |  Branch (1589:9): [True: 0, False: 59.8k]
  ------------------
 1590|      2|        case 25: return 25.060660000;
  ------------------
  |  Branch (1590:9): [True: 2, False: 59.8k]
  ------------------
 1591|  59.8k|        }
 1592|    150|        break;
 1593|  9.48k|      case 8:
  ------------------
  |  Branch (1593:7): [True: 9.48k, False: 405k]
  ------------------
 1594|  9.48k|        switch (isotope) {
  ------------------
  |  Branch (1594:17): [True: 9.42k, False: 68]
  ------------------
 1595|      0|        case 12: return 12.034405000;
  ------------------
  |  Branch (1595:9): [True: 0, False: 9.48k]
  ------------------
 1596|      0|        case 13: return 13.024812000;
  ------------------
  |  Branch (1596:9): [True: 0, False: 9.48k]
  ------------------
 1597|     10|        case 14: return 14.008596250;
  ------------------
  |  Branch (1597:9): [True: 10, False: 9.47k]
  ------------------
 1598|      0|        case 15: return 15.003065600;
  ------------------
  |  Branch (1598:9): [True: 0, False: 9.48k]
  ------------------
 1599|  9.25k|        case 0: case 16: return 15.994914620;
  ------------------
  |  Branch (1599:9): [True: 9.24k, False: 242]
  |  Branch (1599:17): [True: 6, False: 9.48k]
  ------------------
 1600|      6|        case 17: return 16.999131700;
  ------------------
  |  Branch (1600:9): [True: 6, False: 9.48k]
  ------------------
 1601|      2|        case 18: return 17.999161000;
  ------------------
  |  Branch (1601:9): [True: 2, False: 9.48k]
  ------------------
 1602|    116|        case 19: return 19.003580000;
  ------------------
  |  Branch (1602:9): [True: 116, False: 9.37k]
  ------------------
 1603|      0|        case 20: return 20.004076700;
  ------------------
  |  Branch (1603:9): [True: 0, False: 9.48k]
  ------------------
 1604|      6|        case 21: return 21.008656000;
  ------------------
  |  Branch (1604:9): [True: 6, False: 9.48k]
  ------------------
 1605|     10|        case 22: return 22.009970000;
  ------------------
  |  Branch (1605:9): [True: 10, False: 9.47k]
  ------------------
 1606|      0|        case 23: return 23.015690000;
  ------------------
  |  Branch (1606:9): [True: 0, False: 9.48k]
  ------------------
 1607|      0|        case 24: return 24.020470000;
  ------------------
  |  Branch (1607:9): [True: 0, False: 9.48k]
  ------------------
 1608|      4|        case 25: return 25.029460000;
  ------------------
  |  Branch (1608:9): [True: 4, False: 9.48k]
  ------------------
 1609|      4|        case 26: return 26.038340000;
  ------------------
  |  Branch (1609:9): [True: 4, False: 9.48k]
  ------------------
 1610|     10|        case 27: return 27.048260000;
  ------------------
  |  Branch (1610:9): [True: 10, False: 9.47k]
  ------------------
 1611|      0|        case 28: return 28.057810000;
  ------------------
  |  Branch (1611:9): [True: 0, False: 9.48k]
  ------------------
 1612|  9.48k|        }
 1613|     68|        break;
 1614|  16.9k|      case 9:
  ------------------
  |  Branch (1614:7): [True: 16.9k, False: 398k]
  ------------------
 1615|  16.9k|        switch (isotope) {
  ------------------
  |  Branch (1615:17): [True: 16.8k, False: 6]
  ------------------
 1616|      8|        case 14: return 14.035060000;
  ------------------
  |  Branch (1616:9): [True: 8, False: 16.8k]
  ------------------
 1617|      6|        case 15: return 15.018010000;
  ------------------
  |  Branch (1617:9): [True: 6, False: 16.8k]
  ------------------
 1618|      0|        case 16: return 16.011466000;
  ------------------
  |  Branch (1618:9): [True: 0, False: 16.9k]
  ------------------
 1619|      2|        case 17: return 17.002095240;
  ------------------
  |  Branch (1619:9): [True: 2, False: 16.9k]
  ------------------
 1620|      4|        case 18: return 18.000938000;
  ------------------
  |  Branch (1620:9): [True: 4, False: 16.9k]
  ------------------
 1621|  16.8k|        case 0: case 19: return 18.998403220;
  ------------------
  |  Branch (1621:9): [True: 16.8k, False: 48]
  |  Branch (1621:17): [True: 0, False: 16.9k]
  ------------------
 1622|      4|        case 20: return 19.999981320;
  ------------------
  |  Branch (1622:9): [True: 4, False: 16.9k]
  ------------------
 1623|      0|        case 21: return 20.999949000;
  ------------------
  |  Branch (1623:9): [True: 0, False: 16.9k]
  ------------------
 1624|      2|        case 22: return 22.002999000;
  ------------------
  |  Branch (1624:9): [True: 2, False: 16.9k]
  ------------------
 1625|      0|        case 23: return 23.003570000;
  ------------------
  |  Branch (1625:9): [True: 0, False: 16.9k]
  ------------------
 1626|      0|        case 24: return 24.008120000;
  ------------------
  |  Branch (1626:9): [True: 0, False: 16.9k]
  ------------------
 1627|      0|        case 25: return 25.012100000;
  ------------------
  |  Branch (1627:9): [True: 0, False: 16.9k]
  ------------------
 1628|      6|        case 26: return 26.019620000;
  ------------------
  |  Branch (1628:9): [True: 6, False: 16.8k]
  ------------------
 1629|      0|        case 27: return 27.026760000;
  ------------------
  |  Branch (1629:9): [True: 0, False: 16.9k]
  ------------------
 1630|      0|        case 28: return 28.035670000;
  ------------------
  |  Branch (1630:9): [True: 0, False: 16.9k]
  ------------------
 1631|      2|        case 29: return 29.043260000;
  ------------------
  |  Branch (1631:9): [True: 2, False: 16.9k]
  ------------------
 1632|      6|        case 30: return 30.052500000;
  ------------------
  |  Branch (1632:9): [True: 6, False: 16.8k]
  ------------------
 1633|      2|        case 31: return 31.060430000;
  ------------------
  |  Branch (1633:9): [True: 2, False: 16.9k]
  ------------------
 1634|  16.9k|        }
 1635|      6|        break;
 1636|    169|      case 10:
  ------------------
  |  Branch (1636:7): [True: 169, False: 414k]
  ------------------
 1637|    169|        switch (isotope) {
  ------------------
  |  Branch (1637:17): [True: 95, False: 74]
  ------------------
 1638|      0|        case 16: return 16.025761000;
  ------------------
  |  Branch (1638:9): [True: 0, False: 169]
  ------------------
 1639|      0|        case 17: return 17.017672000;
  ------------------
  |  Branch (1639:9): [True: 0, False: 169]
  ------------------
 1640|      2|        case 18: return 18.005708200;
  ------------------
  |  Branch (1640:9): [True: 2, False: 167]
  ------------------
 1641|      0|        case 19: return 19.001880200;
  ------------------
  |  Branch (1641:9): [True: 0, False: 169]
  ------------------
 1642|     63|        case 0: case 20: return 19.992440175;
  ------------------
  |  Branch (1642:9): [True: 63, False: 106]
  |  Branch (1642:17): [True: 0, False: 169]
  ------------------
 1643|      6|        case 21: return 20.993846680;
  ------------------
  |  Branch (1643:9): [True: 6, False: 163]
  ------------------
 1644|      0|        case 22: return 21.991385114;
  ------------------
  |  Branch (1644:9): [True: 0, False: 169]
  ------------------
 1645|      2|        case 23: return 22.994466900;
  ------------------
  |  Branch (1645:9): [True: 2, False: 167]
  ------------------
 1646|      6|        case 24: return 23.993610800;
  ------------------
  |  Branch (1646:9): [True: 6, False: 163]
  ------------------
 1647|      0|        case 25: return 24.997737000;
  ------------------
  |  Branch (1647:9): [True: 0, False: 169]
  ------------------
 1648|      0|        case 26: return 26.000461000;
  ------------------
  |  Branch (1648:9): [True: 0, False: 169]
  ------------------
 1649|      0|        case 27: return 27.007590000;
  ------------------
  |  Branch (1649:9): [True: 0, False: 169]
  ------------------
 1650|      2|        case 28: return 28.012070000;
  ------------------
  |  Branch (1650:9): [True: 2, False: 167]
  ------------------
 1651|      2|        case 29: return 29.019390000;
  ------------------
  |  Branch (1651:9): [True: 2, False: 167]
  ------------------
 1652|      0|        case 30: return 30.024800000;
  ------------------
  |  Branch (1652:9): [True: 0, False: 169]
  ------------------
 1653|      0|        case 31: return 31.033110000;
  ------------------
  |  Branch (1653:9): [True: 0, False: 169]
  ------------------
 1654|      0|        case 32: return 32.040020000;
  ------------------
  |  Branch (1654:9): [True: 0, False: 169]
  ------------------
 1655|      0|        case 33: return 33.049380000;
  ------------------
  |  Branch (1655:9): [True: 0, False: 169]
  ------------------
 1656|     12|        case 34: return 34.057030000;
  ------------------
  |  Branch (1656:9): [True: 12, False: 157]
  ------------------
 1657|    169|        }
 1658|     74|        break;
 1659|    373|      case 11:
  ------------------
  |  Branch (1659:7): [True: 373, False: 414k]
  ------------------
 1660|    373|        switch (isotope) {
  ------------------
  |  Branch (1660:17): [True: 363, False: 10]
  ------------------
 1661|      0|        case 18: return 18.025970000;
  ------------------
  |  Branch (1661:9): [True: 0, False: 373]
  ------------------
 1662|      0|        case 19: return 19.013877000;
  ------------------
  |  Branch (1662:9): [True: 0, False: 373]
  ------------------
 1663|      4|        case 20: return 20.007351000;
  ------------------
  |  Branch (1663:9): [True: 4, False: 369]
  ------------------
 1664|      2|        case 21: return 20.997655200;
  ------------------
  |  Branch (1664:9): [True: 2, False: 371]
  ------------------
 1665|      0|        case 22: return 21.994436400;
  ------------------
  |  Branch (1665:9): [True: 0, False: 373]
  ------------------
 1666|    325|        case 0: case 23: return 22.989769281;
  ------------------
  |  Branch (1666:9): [True: 325, False: 48]
  |  Branch (1666:17): [True: 0, False: 373]
  ------------------
 1667|      4|        case 24: return 23.990962780;
  ------------------
  |  Branch (1667:9): [True: 4, False: 369]
  ------------------
 1668|      0|        case 25: return 24.989954000;
  ------------------
  |  Branch (1668:9): [True: 0, False: 373]
  ------------------
 1669|      0|        case 26: return 25.992633000;
  ------------------
  |  Branch (1669:9): [True: 0, False: 373]
  ------------------
 1670|      0|        case 27: return 26.994077000;
  ------------------
  |  Branch (1670:9): [True: 0, False: 373]
  ------------------
 1671|      6|        case 28: return 27.998938000;
  ------------------
  |  Branch (1671:9): [True: 6, False: 367]
  ------------------
 1672|     14|        case 29: return 29.002861000;
  ------------------
  |  Branch (1672:9): [True: 14, False: 359]
  ------------------
 1673|      2|        case 30: return 30.008976000;
  ------------------
  |  Branch (1673:9): [True: 2, False: 371]
  ------------------
 1674|      0|        case 31: return 31.013590000;
  ------------------
  |  Branch (1674:9): [True: 0, False: 373]
  ------------------
 1675|      2|        case 32: return 32.020470000;
  ------------------
  |  Branch (1675:9): [True: 2, False: 371]
  ------------------
 1676|      0|        case 33: return 33.026720000;
  ------------------
  |  Branch (1676:9): [True: 0, False: 373]
  ------------------
 1677|      0|        case 34: return 34.035170000;
  ------------------
  |  Branch (1677:9): [True: 0, False: 373]
  ------------------
 1678|      0|        case 35: return 35.042490000;
  ------------------
  |  Branch (1678:9): [True: 0, False: 373]
  ------------------
 1679|      2|        case 36: return 36.051480000;
  ------------------
  |  Branch (1679:9): [True: 2, False: 371]
  ------------------
 1680|      2|        case 37: return 37.059340000;
  ------------------
  |  Branch (1680:9): [True: 2, False: 371]
  ------------------
 1681|    373|        }
 1682|     10|        break;
 1683|    530|      case 12:
  ------------------
  |  Branch (1683:7): [True: 530, False: 414k]
  ------------------
 1684|    530|        switch (isotope) {
  ------------------
  |  Branch (1684:17): [True: 510, False: 20]
  ------------------
 1685|      8|        case 19: return 19.035470000;
  ------------------
  |  Branch (1685:9): [True: 8, False: 522]
  ------------------
 1686|      0|        case 20: return 20.018863000;
  ------------------
  |  Branch (1686:9): [True: 0, False: 530]
  ------------------
 1687|      2|        case 21: return 21.011713000;
  ------------------
  |  Branch (1687:9): [True: 2, False: 528]
  ------------------
 1688|      2|        case 22: return 21.999573800;
  ------------------
  |  Branch (1688:9): [True: 2, False: 528]
  ------------------
 1689|      2|        case 23: return 22.994123700;
  ------------------
  |  Branch (1689:9): [True: 2, False: 528]
  ------------------
 1690|    478|        case 0: case 24: return 23.985041700;
  ------------------
  |  Branch (1690:9): [True: 478, False: 52]
  |  Branch (1690:17): [True: 0, False: 530]
  ------------------
 1691|      0|        case 25: return 24.985836920;
  ------------------
  |  Branch (1691:9): [True: 0, False: 530]
  ------------------
 1692|      0|        case 26: return 25.982592929;
  ------------------
  |  Branch (1692:9): [True: 0, False: 530]
  ------------------
 1693|      2|        case 27: return 26.984340590;
  ------------------
  |  Branch (1693:9): [True: 2, False: 528]
  ------------------
 1694|      2|        case 28: return 27.983876800;
  ------------------
  |  Branch (1694:9): [True: 2, False: 528]
  ------------------
 1695|      0|        case 29: return 28.988600000;
  ------------------
  |  Branch (1695:9): [True: 0, False: 530]
  ------------------
 1696|      2|        case 30: return 29.990434000;
  ------------------
  |  Branch (1696:9): [True: 2, False: 528]
  ------------------
 1697|      0|        case 31: return 30.996546000;
  ------------------
  |  Branch (1697:9): [True: 0, False: 530]
  ------------------
 1698|      0|        case 32: return 31.998975000;
  ------------------
  |  Branch (1698:9): [True: 0, False: 530]
  ------------------
 1699|      6|        case 33: return 33.005254000;
  ------------------
  |  Branch (1699:9): [True: 6, False: 524]
  ------------------
 1700|      0|        case 34: return 34.009460000;
  ------------------
  |  Branch (1700:9): [True: 0, False: 530]
  ------------------
 1701|      0|        case 35: return 35.017340000;
  ------------------
  |  Branch (1701:9): [True: 0, False: 530]
  ------------------
 1702|      0|        case 36: return 36.023000000;
  ------------------
  |  Branch (1702:9): [True: 0, False: 530]
  ------------------
 1703|      0|        case 37: return 37.031400000;
  ------------------
  |  Branch (1703:9): [True: 0, False: 530]
  ------------------
 1704|      4|        case 38: return 38.037570000;
  ------------------
  |  Branch (1704:9): [True: 4, False: 526]
  ------------------
 1705|      2|        case 39: return 39.046770000;
  ------------------
  |  Branch (1705:9): [True: 2, False: 528]
  ------------------
 1706|      0|        case 40: return 40.053930000;
  ------------------
  |  Branch (1706:9): [True: 0, False: 530]
  ------------------
 1707|    530|        }
 1708|     20|        break;
 1709|  1.11k|      case 13:
  ------------------
  |  Branch (1709:7): [True: 1.11k, False: 414k]
  ------------------
 1710|  1.11k|        switch (isotope) {
  ------------------
  |  Branch (1710:17): [True: 1.09k, False: 24]
  ------------------
 1711|      2|        case 21: return 21.028040000;
  ------------------
  |  Branch (1711:9): [True: 2, False: 1.11k]
  ------------------
 1712|     10|        case 22: return 22.019520000;
  ------------------
  |  Branch (1712:9): [True: 10, False: 1.10k]
  ------------------
 1713|      0|        case 23: return 23.007267000;
  ------------------
  |  Branch (1713:9): [True: 0, False: 1.11k]
  ------------------
 1714|     14|        case 24: return 23.999938900;
  ------------------
  |  Branch (1714:9): [True: 14, False: 1.10k]
  ------------------
 1715|      6|        case 25: return 24.990428100;
  ------------------
  |  Branch (1715:9): [True: 6, False: 1.10k]
  ------------------
 1716|      0|        case 26: return 25.986891690;
  ------------------
  |  Branch (1716:9): [True: 0, False: 1.11k]
  ------------------
 1717|  1.02k|        case 0: case 27: return 26.981538630;
  ------------------
  |  Branch (1717:9): [True: 1.02k, False: 86]
  |  Branch (1717:17): [True: 0, False: 1.11k]
  ------------------
 1718|      0|        case 28: return 27.981910310;
  ------------------
  |  Branch (1718:9): [True: 0, False: 1.11k]
  ------------------
 1719|      0|        case 29: return 28.980445000;
  ------------------
  |  Branch (1719:9): [True: 0, False: 1.11k]
  ------------------
 1720|      4|        case 30: return 29.982960000;
  ------------------
  |  Branch (1720:9): [True: 4, False: 1.11k]
  ------------------
 1721|      4|        case 31: return 30.983947000;
  ------------------
  |  Branch (1721:9): [True: 4, False: 1.11k]
  ------------------
 1722|      0|        case 32: return 31.988120000;
  ------------------
  |  Branch (1722:9): [True: 0, False: 1.11k]
  ------------------
 1723|     10|        case 33: return 32.990840000;
  ------------------
  |  Branch (1723:9): [True: 10, False: 1.10k]
  ------------------
 1724|      0|        case 34: return 33.996850000;
  ------------------
  |  Branch (1724:9): [True: 0, False: 1.11k]
  ------------------
 1725|      2|        case 35: return 34.999860000;
  ------------------
  |  Branch (1725:9): [True: 2, False: 1.11k]
  ------------------
 1726|      0|        case 36: return 36.006210000;
  ------------------
  |  Branch (1726:9): [True: 0, False: 1.11k]
  ------------------
 1727|      0|        case 37: return 37.010680000;
  ------------------
  |  Branch (1727:9): [True: 0, False: 1.11k]
  ------------------
 1728|      2|        case 38: return 38.017230000;
  ------------------
  |  Branch (1728:9): [True: 2, False: 1.11k]
  ------------------
 1729|      0|        case 39: return 39.022970000;
  ------------------
  |  Branch (1729:9): [True: 0, False: 1.11k]
  ------------------
 1730|      2|        case 40: return 40.031450000;
  ------------------
  |  Branch (1730:9): [True: 2, False: 1.11k]
  ------------------
 1731|      0|        case 41: return 41.038330000;
  ------------------
  |  Branch (1731:9): [True: 0, False: 1.11k]
  ------------------
 1732|      6|        case 42: return 42.046890000;
  ------------------
  |  Branch (1732:9): [True: 6, False: 1.10k]
  ------------------
 1733|  1.11k|        }
 1734|     24|        break;
 1735|    352|      case 14:
  ------------------
  |  Branch (1735:7): [True: 352, False: 414k]
  ------------------
 1736|    352|        switch (isotope) {
  ------------------
  |  Branch (1736:17): [True: 280, False: 72]
  ------------------
 1737|      6|        case 22: return 22.034530000;
  ------------------
  |  Branch (1737:9): [True: 6, False: 346]
  ------------------
 1738|      0|        case 23: return 23.025520000;
  ------------------
  |  Branch (1738:9): [True: 0, False: 352]
  ------------------
 1739|      0|        case 24: return 24.011546000;
  ------------------
  |  Branch (1739:9): [True: 0, False: 352]
  ------------------
 1740|      2|        case 25: return 25.004106000;
  ------------------
  |  Branch (1740:9): [True: 2, False: 350]
  ------------------
 1741|      2|        case 26: return 25.992330000;
  ------------------
  |  Branch (1741:9): [True: 2, False: 350]
  ------------------
 1742|      2|        case 27: return 26.986704910;
  ------------------
  |  Branch (1742:9): [True: 2, False: 350]
  ------------------
 1743|    218|        case 0: case 28: return 27.976926532;
  ------------------
  |  Branch (1743:9): [True: 216, False: 136]
  |  Branch (1743:17): [True: 2, False: 350]
  ------------------
 1744|      0|        case 29: return 28.976494700;
  ------------------
  |  Branch (1744:9): [True: 0, False: 352]
  ------------------
 1745|      0|        case 30: return 29.973770170;
  ------------------
  |  Branch (1745:9): [True: 0, False: 352]
  ------------------
 1746|      0|        case 31: return 30.975363230;
  ------------------
  |  Branch (1746:9): [True: 0, False: 352]
  ------------------
 1747|      0|        case 32: return 31.974148080;
  ------------------
  |  Branch (1747:9): [True: 0, False: 352]
  ------------------
 1748|     14|        case 33: return 32.978000000;
  ------------------
  |  Branch (1748:9): [True: 14, False: 338]
  ------------------
 1749|      2|        case 34: return 33.978576000;
  ------------------
  |  Branch (1749:9): [True: 2, False: 350]
  ------------------
 1750|      2|        case 35: return 34.984580000;
  ------------------
  |  Branch (1750:9): [True: 2, False: 350]
  ------------------
 1751|      0|        case 36: return 35.986600000;
  ------------------
  |  Branch (1751:9): [True: 0, False: 352]
  ------------------
 1752|      4|        case 37: return 36.992940000;
  ------------------
  |  Branch (1752:9): [True: 4, False: 348]
  ------------------
 1753|      0|        case 38: return 37.995630000;
  ------------------
  |  Branch (1753:9): [True: 0, False: 352]
  ------------------
 1754|      4|        case 39: return 39.002070000;
  ------------------
  |  Branch (1754:9): [True: 4, False: 348]
  ------------------
 1755|     14|        case 40: return 40.005870000;
  ------------------
  |  Branch (1755:9): [True: 14, False: 338]
  ------------------
 1756|      4|        case 41: return 41.014560000;
  ------------------
  |  Branch (1756:9): [True: 4, False: 348]
  ------------------
 1757|      0|        case 42: return 42.019790000;
  ------------------
  |  Branch (1757:9): [True: 0, False: 352]
  ------------------
 1758|      6|        case 43: return 43.028660000;
  ------------------
  |  Branch (1758:9): [True: 6, False: 346]
  ------------------
 1759|      0|        case 44: return 44.035260000;
  ------------------
  |  Branch (1759:9): [True: 0, False: 352]
  ------------------
 1760|    352|        }
 1761|     72|        break;
 1762|  32.3k|      case 15:
  ------------------
  |  Branch (1762:7): [True: 32.3k, False: 382k]
  ------------------
 1763|  32.3k|        switch (isotope) {
  ------------------
  |  Branch (1763:17): [True: 32.3k, False: 6]
  ------------------
 1764|     12|        case 24: return 24.034350000;
  ------------------
  |  Branch (1764:9): [True: 12, False: 32.3k]
  ------------------
 1765|      0|        case 25: return 25.020260000;
  ------------------
  |  Branch (1765:9): [True: 0, False: 32.3k]
  ------------------
 1766|      0|        case 26: return 26.011780000;
  ------------------
  |  Branch (1766:9): [True: 0, False: 32.3k]
  ------------------
 1767|      4|        case 27: return 26.999230000;
  ------------------
  |  Branch (1767:9): [True: 4, False: 32.3k]
  ------------------
 1768|      0|        case 28: return 27.992315000;
  ------------------
  |  Branch (1768:9): [True: 0, False: 32.3k]
  ------------------
 1769|     24|        case 29: return 28.981800600;
  ------------------
  |  Branch (1769:9): [True: 24, False: 32.3k]
  ------------------
 1770|      0|        case 30: return 29.978313800;
  ------------------
  |  Branch (1770:9): [True: 0, False: 32.3k]
  ------------------
 1771|  32.2k|        case 0: case 31: return 30.973761630;
  ------------------
  |  Branch (1771:9): [True: 32.2k, False: 98]
  |  Branch (1771:17): [True: 0, False: 32.3k]
  ------------------
 1772|      2|        case 32: return 31.973907270;
  ------------------
  |  Branch (1772:9): [True: 2, False: 32.3k]
  ------------------
 1773|     24|        case 33: return 32.971725500;
  ------------------
  |  Branch (1773:9): [True: 24, False: 32.3k]
  ------------------
 1774|      0|        case 34: return 33.973636000;
  ------------------
  |  Branch (1774:9): [True: 0, False: 32.3k]
  ------------------
 1775|      6|        case 35: return 34.973314100;
  ------------------
  |  Branch (1775:9): [True: 6, False: 32.3k]
  ------------------
 1776|      2|        case 36: return 35.978260000;
  ------------------
  |  Branch (1776:9): [True: 2, False: 32.3k]
  ------------------
 1777|      0|        case 37: return 36.979610000;
  ------------------
  |  Branch (1777:9): [True: 0, False: 32.3k]
  ------------------
 1778|      4|        case 38: return 37.984160000;
  ------------------
  |  Branch (1778:9): [True: 4, False: 32.3k]
  ------------------
 1779|      0|        case 39: return 38.986180000;
  ------------------
  |  Branch (1779:9): [True: 0, False: 32.3k]
  ------------------
 1780|      0|        case 40: return 39.991300000;
  ------------------
  |  Branch (1780:9): [True: 0, False: 32.3k]
  ------------------
 1781|      0|        case 41: return 40.994340000;
  ------------------
  |  Branch (1781:9): [True: 0, False: 32.3k]
  ------------------
 1782|      0|        case 42: return 42.001010000;
  ------------------
  |  Branch (1782:9): [True: 0, False: 32.3k]
  ------------------
 1783|     10|        case 43: return 43.006190000;
  ------------------
  |  Branch (1783:9): [True: 10, False: 32.3k]
  ------------------
 1784|      4|        case 44: return 44.012990000;
  ------------------
  |  Branch (1784:9): [True: 4, False: 32.3k]
  ------------------
 1785|      0|        case 45: return 45.019220000;
  ------------------
  |  Branch (1785:9): [True: 0, False: 32.3k]
  ------------------
 1786|      0|        case 46: return 46.027380000;
  ------------------
  |  Branch (1786:9): [True: 0, False: 32.3k]
  ------------------
 1787|  32.3k|        }
 1788|      6|        break;
 1789|  12.8k|      case 16:
  ------------------
  |  Branch (1789:7): [True: 12.8k, False: 402k]
  ------------------
 1790|  12.8k|        switch (isotope) {
  ------------------
  |  Branch (1790:17): [True: 12.6k, False: 210]
  ------------------
 1791|      6|        case 26: return 26.027880000;
  ------------------
  |  Branch (1791:9): [True: 6, False: 12.8k]
  ------------------
 1792|      4|        case 27: return 27.018830000;
  ------------------
  |  Branch (1792:9): [True: 4, False: 12.8k]
  ------------------
 1793|      0|        case 28: return 28.004370000;
  ------------------
  |  Branch (1793:9): [True: 0, False: 12.8k]
  ------------------
 1794|      0|        case 29: return 28.996610000;
  ------------------
  |  Branch (1794:9): [True: 0, False: 12.8k]
  ------------------
 1795|      2|        case 30: return 29.984903000;
  ------------------
  |  Branch (1795:9): [True: 2, False: 12.8k]
  ------------------
 1796|      4|        case 31: return 30.979554700;
  ------------------
  |  Branch (1796:9): [True: 4, False: 12.8k]
  ------------------
 1797|  12.5k|        case 0: case 32: return 31.972071000;
  ------------------
  |  Branch (1797:9): [True: 12.5k, False: 320]
  |  Branch (1797:17): [True: 18, False: 12.8k]
  ------------------
 1798|     16|        case 33: return 32.971458760;
  ------------------
  |  Branch (1798:9): [True: 16, False: 12.8k]
  ------------------
 1799|      6|        case 34: return 33.967866900;
  ------------------
  |  Branch (1799:9): [True: 6, False: 12.8k]
  ------------------
 1800|      0|        case 35: return 34.969032160;
  ------------------
  |  Branch (1800:9): [True: 0, False: 12.8k]
  ------------------
 1801|      6|        case 36: return 35.967080760;
  ------------------
  |  Branch (1801:9): [True: 6, False: 12.8k]
  ------------------
 1802|      0|        case 37: return 36.971125570;
  ------------------
  |  Branch (1802:9): [True: 0, False: 12.8k]
  ------------------
 1803|      4|        case 38: return 37.971163000;
  ------------------
  |  Branch (1803:9): [True: 4, False: 12.8k]
  ------------------
 1804|      2|        case 39: return 38.975130000;
  ------------------
  |  Branch (1804:9): [True: 2, False: 12.8k]
  ------------------
 1805|     20|        case 40: return 39.975450000;
  ------------------
  |  Branch (1805:9): [True: 20, False: 12.8k]
  ------------------
 1806|      0|        case 41: return 40.979580000;
  ------------------
  |  Branch (1806:9): [True: 0, False: 12.8k]
  ------------------
 1807|      0|        case 42: return 41.981020000;
  ------------------
  |  Branch (1807:9): [True: 0, False: 12.8k]
  ------------------
 1808|      2|        case 43: return 42.987150000;
  ------------------
  |  Branch (1808:9): [True: 2, False: 12.8k]
  ------------------
 1809|      0|        case 44: return 43.990210000;
  ------------------
  |  Branch (1809:9): [True: 0, False: 12.8k]
  ------------------
 1810|      4|        case 45: return 44.996510000;
  ------------------
  |  Branch (1810:9): [True: 4, False: 12.8k]
  ------------------
 1811|      6|        case 46: return 46.000750000;
  ------------------
  |  Branch (1811:9): [True: 6, False: 12.8k]
  ------------------
 1812|      0|        case 47: return 47.008590000;
  ------------------
  |  Branch (1812:9): [True: 0, False: 12.8k]
  ------------------
 1813|      6|        case 48: return 48.014170000;
  ------------------
  |  Branch (1813:9): [True: 6, False: 12.8k]
  ------------------
 1814|      4|        case 49: return 49.023620000;
  ------------------
  |  Branch (1814:9): [True: 4, False: 12.8k]
  ------------------
 1815|  12.8k|        }
 1816|    210|        break;
 1817|    800|      case 17:
  ------------------
  |  Branch (1817:7): [True: 800, False: 414k]
  ------------------
 1818|    800|        switch (isotope) {
  ------------------
  |  Branch (1818:17): [True: 776, False: 24]
  ------------------
 1819|      0|        case 28: return 28.028510000;
  ------------------
  |  Branch (1819:9): [True: 0, False: 800]
  ------------------
 1820|      0|        case 29: return 29.014110000;
  ------------------
  |  Branch (1820:9): [True: 0, False: 800]
  ------------------
 1821|      4|        case 30: return 30.004770000;
  ------------------
  |  Branch (1821:9): [True: 4, False: 796]
  ------------------
 1822|      0|        case 31: return 30.992410000;
  ------------------
  |  Branch (1822:9): [True: 0, False: 800]
  ------------------
 1823|      0|        case 32: return 31.985690000;
  ------------------
  |  Branch (1823:9): [True: 0, False: 800]
  ------------------
 1824|      2|        case 33: return 32.977451900;
  ------------------
  |  Branch (1824:9): [True: 2, False: 798]
  ------------------
 1825|      0|        case 34: return 33.973762820;
  ------------------
  |  Branch (1825:9): [True: 0, False: 800]
  ------------------
 1826|    682|        case 0: case 35: return 34.968852680;
  ------------------
  |  Branch (1826:9): [True: 682, False: 118]
  |  Branch (1826:17): [True: 0, False: 800]
  ------------------
 1827|      0|        case 36: return 35.968306980;
  ------------------
  |  Branch (1827:9): [True: 0, False: 800]
  ------------------
 1828|      2|        case 37: return 36.965902590;
  ------------------
  |  Branch (1828:9): [True: 2, False: 798]
  ------------------
 1829|      2|        case 38: return 37.968010430;
  ------------------
  |  Branch (1829:9): [True: 2, False: 798]
  ------------------
 1830|      4|        case 39: return 38.968008200;
  ------------------
  |  Branch (1830:9): [True: 4, False: 796]
  ------------------
 1831|     14|        case 40: return 39.970420000;
  ------------------
  |  Branch (1831:9): [True: 14, False: 786]
  ------------------
 1832|      0|        case 41: return 40.970680000;
  ------------------
  |  Branch (1832:9): [True: 0, False: 800]
  ------------------
 1833|     28|        case 42: return 41.973250000;
  ------------------
  |  Branch (1833:9): [True: 28, False: 772]
  ------------------
 1834|      4|        case 43: return 42.974050000;
  ------------------
  |  Branch (1834:9): [True: 4, False: 796]
  ------------------
 1835|      0|        case 44: return 43.978280000;
  ------------------
  |  Branch (1835:9): [True: 0, False: 800]
  ------------------
 1836|      0|        case 45: return 44.980290000;
  ------------------
  |  Branch (1836:9): [True: 0, False: 800]
  ------------------
 1837|      0|        case 46: return 45.984210000;
  ------------------
  |  Branch (1837:9): [True: 0, False: 800]
  ------------------
 1838|      0|        case 47: return 46.988710000;
  ------------------
  |  Branch (1838:9): [True: 0, False: 800]
  ------------------
 1839|      4|        case 48: return 47.994950000;
  ------------------
  |  Branch (1839:9): [True: 4, False: 796]
  ------------------
 1840|      2|        case 49: return 49.000320000;
  ------------------
  |  Branch (1840:9): [True: 2, False: 798]
  ------------------
 1841|     22|        case 50: return 50.007840000;
  ------------------
  |  Branch (1841:9): [True: 22, False: 778]
  ------------------
 1842|      6|        case 51: return 51.014490000;
  ------------------
  |  Branch (1842:9): [True: 6, False: 794]
  ------------------
 1843|    800|        }
 1844|     24|        break;
 1845|    305|      case 18:
  ------------------
  |  Branch (1845:7): [True: 305, False: 414k]
  ------------------
 1846|    305|        switch (isotope) {
  ------------------
  |  Branch (1846:17): [True: 287, False: 18]
  ------------------
 1847|     16|        case 30: return 30.021560000;
  ------------------
  |  Branch (1847:9): [True: 16, False: 289]
  ------------------
 1848|      6|        case 31: return 31.012120000;
  ------------------
  |  Branch (1848:9): [True: 6, False: 299]
  ------------------
 1849|      0|        case 32: return 31.997638000;
  ------------------
  |  Branch (1849:9): [True: 0, False: 305]
  ------------------
 1850|      0|        case 33: return 32.989925700;
  ------------------
  |  Branch (1850:9): [True: 0, False: 305]
  ------------------
 1851|      0|        case 34: return 33.980271200;
  ------------------
  |  Branch (1851:9): [True: 0, False: 305]
  ------------------
 1852|     14|        case 35: return 34.975257600;
  ------------------
  |  Branch (1852:9): [True: 14, False: 291]
  ------------------
 1853|      0|        case 36: return 35.967545106;
  ------------------
  |  Branch (1853:9): [True: 0, False: 305]
  ------------------
 1854|      0|        case 37: return 36.966776320;
  ------------------
  |  Branch (1854:9): [True: 0, False: 305]
  ------------------
 1855|     10|        case 38: return 37.962732400;
  ------------------
  |  Branch (1855:9): [True: 10, False: 295]
  ------------------
 1856|      4|        case 39: return 38.964313000;
  ------------------
  |  Branch (1856:9): [True: 4, False: 301]
  ------------------
 1857|    231|        case 0: case 40: return 39.962383123;
  ------------------
  |  Branch (1857:9): [True: 231, False: 74]
  |  Branch (1857:17): [True: 0, False: 305]
  ------------------
 1858|      0|        case 41: return 40.964500600;
  ------------------
  |  Branch (1858:9): [True: 0, False: 305]
  ------------------
 1859|      2|        case 42: return 41.963046000;
  ------------------
  |  Branch (1859:9): [True: 2, False: 303]
  ------------------
 1860|      0|        case 43: return 42.965636000;
  ------------------
  |  Branch (1860:9): [True: 0, False: 305]
  ------------------
 1861|      4|        case 44: return 43.964924000;
  ------------------
  |  Branch (1861:9): [True: 4, False: 301]
  ------------------
 1862|      0|        case 45: return 44.968040000;
  ------------------
  |  Branch (1862:9): [True: 0, False: 305]
  ------------------
 1863|      0|        case 46: return 45.968090000;
  ------------------
  |  Branch (1863:9): [True: 0, False: 305]
  ------------------
 1864|      0|        case 47: return 46.972190000;
  ------------------
  |  Branch (1864:9): [True: 0, False: 305]
  ------------------
 1865|      0|        case 48: return 47.974540000;
  ------------------
  |  Branch (1865:9): [True: 0, False: 305]
  ------------------
 1866|      0|        case 49: return 48.980520000;
  ------------------
  |  Branch (1866:9): [True: 0, False: 305]
  ------------------
 1867|      0|        case 50: return 49.984430000;
  ------------------
  |  Branch (1867:9): [True: 0, False: 305]
  ------------------
 1868|      0|        case 51: return 50.991630000;
  ------------------
  |  Branch (1868:9): [True: 0, False: 305]
  ------------------
 1869|      0|        case 52: return 51.996780000;
  ------------------
  |  Branch (1869:9): [True: 0, False: 305]
  ------------------
 1870|      0|        case 53: return 53.004940000;
  ------------------
  |  Branch (1870:9): [True: 0, False: 305]
  ------------------
 1871|    305|        }
 1872|     18|        break;
 1873|    706|      case 19:
  ------------------
  |  Branch (1873:7): [True: 706, False: 414k]
  ------------------
 1874|    706|        switch (isotope) {
  ------------------
  |  Branch (1874:17): [True: 666, False: 40]
  ------------------
 1875|      0|        case 32: return 32.021920000;
  ------------------
  |  Branch (1875:9): [True: 0, False: 706]
  ------------------
 1876|     16|        case 33: return 33.007260000;
  ------------------
  |  Branch (1876:9): [True: 16, False: 690]
  ------------------
 1877|     12|        case 34: return 33.998410000;
  ------------------
  |  Branch (1877:9): [True: 12, False: 694]
  ------------------
 1878|      0|        case 35: return 34.988010000;
  ------------------
  |  Branch (1878:9): [True: 0, False: 706]
  ------------------
 1879|      4|        case 36: return 35.981292000;
  ------------------
  |  Branch (1879:9): [True: 4, False: 702]
  ------------------
 1880|      4|        case 37: return 36.973375890;
  ------------------
  |  Branch (1880:9): [True: 4, False: 702]
  ------------------
 1881|      0|        case 38: return 37.969081200;
  ------------------
  |  Branch (1881:9): [True: 0, False: 706]
  ------------------
 1882|    550|        case 0: case 39: return 38.963706680;
  ------------------
  |  Branch (1882:9): [True: 550, False: 156]
  |  Branch (1882:17): [True: 0, False: 706]
  ------------------
 1883|      4|        case 40: return 39.963998480;
  ------------------
  |  Branch (1883:9): [True: 4, False: 702]
  ------------------
 1884|      0|        case 41: return 40.961825760;
  ------------------
  |  Branch (1884:9): [True: 0, False: 706]
  ------------------
 1885|      4|        case 42: return 41.962402810;
  ------------------
  |  Branch (1885:9): [True: 4, False: 702]
  ------------------
 1886|      2|        case 43: return 42.960716000;
  ------------------
  |  Branch (1886:9): [True: 2, False: 704]
  ------------------
 1887|      0|        case 44: return 43.961560000;
  ------------------
  |  Branch (1887:9): [True: 0, False: 706]
  ------------------
 1888|      0|        case 45: return 44.960699000;
  ------------------
  |  Branch (1888:9): [True: 0, False: 706]
  ------------------
 1889|      6|        case 46: return 45.961977000;
  ------------------
  |  Branch (1889:9): [True: 6, False: 700]
  ------------------
 1890|     32|        case 47: return 46.961678000;
  ------------------
  |  Branch (1890:9): [True: 32, False: 674]
  ------------------
 1891|      0|        case 48: return 47.965514000;
  ------------------
  |  Branch (1891:9): [True: 0, False: 706]
  ------------------
 1892|      2|        case 49: return 48.967450000;
  ------------------
  |  Branch (1892:9): [True: 2, False: 704]
  ------------------
 1893|      2|        case 50: return 49.972780000;
  ------------------
  |  Branch (1893:9): [True: 2, False: 704]
  ------------------
 1894|      0|        case 51: return 50.976380000;
  ------------------
  |  Branch (1894:9): [True: 0, False: 706]
  ------------------
 1895|     26|        case 52: return 51.982610000;
  ------------------
  |  Branch (1895:9): [True: 26, False: 680]
  ------------------
 1896|      2|        case 53: return 52.987120000;
  ------------------
  |  Branch (1896:9): [True: 2, False: 704]
  ------------------
 1897|      0|        case 54: return 53.994200000;
  ------------------
  |  Branch (1897:9): [True: 0, False: 706]
  ------------------
 1898|      0|        case 55: return 54.999710000;
  ------------------
  |  Branch (1898:9): [True: 0, False: 706]
  ------------------
 1899|    706|        }
 1900|     40|        break;
 1901|    540|      case 20:
  ------------------
  |  Branch (1901:7): [True: 540, False: 414k]
  ------------------
 1902|    540|        switch (isotope) {
  ------------------
  |  Branch (1902:17): [True: 530, False: 10]
  ------------------
 1903|      0|        case 34: return 34.014120000;
  ------------------
  |  Branch (1903:9): [True: 0, False: 540]
  ------------------
 1904|      0|        case 35: return 35.004940000;
  ------------------
  |  Branch (1904:9): [True: 0, False: 540]
  ------------------
 1905|     12|        case 36: return 35.993090000;
  ------------------
  |  Branch (1905:9): [True: 12, False: 528]
  ------------------
 1906|      0|        case 37: return 36.985870000;
  ------------------
  |  Branch (1906:9): [True: 0, False: 540]
  ------------------
 1907|      0|        case 38: return 37.976318000;
  ------------------
  |  Branch (1907:9): [True: 0, False: 540]
  ------------------
 1908|      0|        case 39: return 38.970719700;
  ------------------
  |  Branch (1908:9): [True: 0, False: 540]
  ------------------
 1909|    480|        case 0: case 40: return 39.962590980;
  ------------------
  |  Branch (1909:9): [True: 476, False: 64]
  |  Branch (1909:17): [True: 4, False: 536]
  ------------------
 1910|      0|        case 41: return 40.962278060;
  ------------------
  |  Branch (1910:9): [True: 0, False: 540]
  ------------------
 1911|      0|        case 42: return 41.958618010;
  ------------------
  |  Branch (1911:9): [True: 0, False: 540]
  ------------------
 1912|      0|        case 43: return 42.958766600;
  ------------------
  |  Branch (1912:9): [True: 0, False: 540]
  ------------------
 1913|      2|        case 44: return 43.955481800;
  ------------------
  |  Branch (1913:9): [True: 2, False: 538]
  ------------------
 1914|      2|        case 45: return 44.956186600;
  ------------------
  |  Branch (1914:9): [True: 2, False: 538]
  ------------------
 1915|      0|        case 46: return 45.953692600;
  ------------------
  |  Branch (1915:9): [True: 0, False: 540]
  ------------------
 1916|      4|        case 47: return 46.954546000;
  ------------------
  |  Branch (1916:9): [True: 4, False: 536]
  ------------------
 1917|      2|        case 48: return 47.952534000;
  ------------------
  |  Branch (1917:9): [True: 2, False: 538]
  ------------------
 1918|      0|        case 49: return 48.955674000;
  ------------------
  |  Branch (1918:9): [True: 0, False: 540]
  ------------------
 1919|      6|        case 50: return 49.957519000;
  ------------------
  |  Branch (1919:9): [True: 6, False: 534]
  ------------------
 1920|      0|        case 51: return 50.961500000;
  ------------------
  |  Branch (1920:9): [True: 0, False: 540]
  ------------------
 1921|      2|        case 52: return 51.965100000;
  ------------------
  |  Branch (1921:9): [True: 2, False: 538]
  ------------------
 1922|      2|        case 53: return 52.970050000;
  ------------------
  |  Branch (1922:9): [True: 2, False: 538]
  ------------------
 1923|      8|        case 54: return 53.974350000;
  ------------------
  |  Branch (1923:9): [True: 8, False: 532]
  ------------------
 1924|      8|        case 55: return 54.980550000;
  ------------------
  |  Branch (1924:9): [True: 8, False: 532]
  ------------------
 1925|      2|        case 56: return 55.985570000;
  ------------------
  |  Branch (1925:9): [True: 2, False: 538]
  ------------------
 1926|      0|        case 57: return 56.992360000;
  ------------------
  |  Branch (1926:9): [True: 0, False: 540]
  ------------------
 1927|    540|        }
 1928|     10|        break;
 1929|    357|      case 21:
  ------------------
  |  Branch (1929:7): [True: 357, False: 414k]
  ------------------
 1930|    357|        switch (isotope) {
  ------------------
  |  Branch (1930:17): [True: 341, False: 16]
  ------------------
 1931|      0|        case 36: return 36.014920000;
  ------------------
  |  Branch (1931:9): [True: 0, False: 357]
  ------------------
 1932|      0|        case 37: return 37.003050000;
  ------------------
  |  Branch (1932:9): [True: 0, False: 357]
  ------------------
 1933|      0|        case 38: return 37.994700000;
  ------------------
  |  Branch (1933:9): [True: 0, False: 357]
  ------------------
 1934|      0|        case 39: return 38.984790000;
  ------------------
  |  Branch (1934:9): [True: 0, False: 357]
  ------------------
 1935|      4|        case 40: return 39.977967000;
  ------------------
  |  Branch (1935:9): [True: 4, False: 353]
  ------------------
 1936|      0|        case 41: return 40.969251130;
  ------------------
  |  Branch (1936:9): [True: 0, False: 357]
  ------------------
 1937|      4|        case 42: return 41.965516430;
  ------------------
  |  Branch (1937:9): [True: 4, False: 353]
  ------------------
 1938|      0|        case 43: return 42.961150700;
  ------------------
  |  Branch (1938:9): [True: 0, False: 357]
  ------------------
 1939|      2|        case 44: return 43.959402800;
  ------------------
  |  Branch (1939:9): [True: 2, False: 355]
  ------------------
 1940|    317|        case 0: case 45: return 44.955911900;
  ------------------
  |  Branch (1940:9): [True: 317, False: 40]
  |  Branch (1940:17): [True: 0, False: 357]
  ------------------
 1941|      4|        case 46: return 45.955171900;
  ------------------
  |  Branch (1941:9): [True: 4, False: 353]
  ------------------
 1942|      0|        case 47: return 46.952407500;
  ------------------
  |  Branch (1942:9): [True: 0, False: 357]
  ------------------
 1943|      0|        case 48: return 47.952231000;
  ------------------
  |  Branch (1943:9): [True: 0, False: 357]
  ------------------
 1944|      2|        case 49: return 48.950024000;
  ------------------
  |  Branch (1944:9): [True: 2, False: 355]
  ------------------
 1945|      0|        case 50: return 49.952188000;
  ------------------
  |  Branch (1945:9): [True: 0, False: 357]
  ------------------
 1946|      0|        case 51: return 50.953603000;
  ------------------
  |  Branch (1946:9): [True: 0, False: 357]
  ------------------
 1947|      0|        case 52: return 51.956680000;
  ------------------
  |  Branch (1947:9): [True: 0, False: 357]
  ------------------
 1948|      0|        case 53: return 52.959610000;
  ------------------
  |  Branch (1948:9): [True: 0, False: 357]
  ------------------
 1949|      4|        case 54: return 53.963260000;
  ------------------
  |  Branch (1949:9): [True: 4, False: 353]
  ------------------
 1950|      0|        case 55: return 54.968240000;
  ------------------
  |  Branch (1950:9): [True: 0, False: 357]
  ------------------
 1951|      0|        case 56: return 55.972870000;
  ------------------
  |  Branch (1951:9): [True: 0, False: 357]
  ------------------
 1952|      2|        case 57: return 56.977790000;
  ------------------
  |  Branch (1952:9): [True: 2, False: 355]
  ------------------
 1953|      0|        case 58: return 57.983710000;
  ------------------
  |  Branch (1953:9): [True: 0, False: 357]
  ------------------
 1954|      2|        case 59: return 58.989220000;
  ------------------
  |  Branch (1954:9): [True: 2, False: 355]
  ------------------
 1955|      0|        case 60: return 59.995710000;
  ------------------
  |  Branch (1955:9): [True: 0, False: 357]
  ------------------
 1956|    357|        }
 1957|     16|        break;
 1958|     85|      case 22:
  ------------------
  |  Branch (1958:7): [True: 85, False: 415k]
  ------------------
 1959|     85|        switch (isotope) {
  ------------------
  |  Branch (1959:17): [True: 75, False: 10]
  ------------------
 1960|      6|        case 38: return 38.009770000;
  ------------------
  |  Branch (1960:9): [True: 6, False: 79]
  ------------------
 1961|      4|        case 39: return 39.001610000;
  ------------------
  |  Branch (1961:9): [True: 4, False: 81]
  ------------------
 1962|     14|        case 40: return 39.990500000;
  ------------------
  |  Branch (1962:9): [True: 14, False: 71]
  ------------------
 1963|      0|        case 41: return 40.983150000;
  ------------------
  |  Branch (1963:9): [True: 0, False: 85]
  ------------------
 1964|      4|        case 42: return 41.973031000;
  ------------------
  |  Branch (1964:9): [True: 4, False: 81]
  ------------------
 1965|      4|        case 43: return 42.968522000;
  ------------------
  |  Branch (1965:9): [True: 4, False: 81]
  ------------------
 1966|      0|        case 44: return 43.959690100;
  ------------------
  |  Branch (1966:9): [True: 0, False: 85]
  ------------------
 1967|      0|        case 45: return 44.958125600;
  ------------------
  |  Branch (1967:9): [True: 0, False: 85]
  ------------------
 1968|      0|        case 46: return 45.952631600;
  ------------------
  |  Branch (1968:9): [True: 0, False: 85]
  ------------------
 1969|      0|        case 47: return 46.951763100;
  ------------------
  |  Branch (1969:9): [True: 0, False: 85]
  ------------------
 1970|     31|        case 0: case 48: return 47.947946300;
  ------------------
  |  Branch (1970:9): [True: 31, False: 54]
  |  Branch (1970:17): [True: 0, False: 85]
  ------------------
 1971|      0|        case 49: return 48.947870000;
  ------------------
  |  Branch (1971:9): [True: 0, False: 85]
  ------------------
 1972|      2|        case 50: return 49.944791200;
  ------------------
  |  Branch (1972:9): [True: 2, False: 83]
  ------------------
 1973|      0|        case 51: return 50.946615000;
  ------------------
  |  Branch (1973:9): [True: 0, False: 85]
  ------------------
 1974|      2|        case 52: return 51.946897000;
  ------------------
  |  Branch (1974:9): [True: 2, False: 83]
  ------------------
 1975|      0|        case 53: return 52.949730000;
  ------------------
  |  Branch (1975:9): [True: 0, False: 85]
  ------------------
 1976|      0|        case 54: return 53.951050000;
  ------------------
  |  Branch (1976:9): [True: 0, False: 85]
  ------------------
 1977|      0|        case 55: return 54.955270000;
  ------------------
  |  Branch (1977:9): [True: 0, False: 85]
  ------------------
 1978|      0|        case 56: return 55.958200000;
  ------------------
  |  Branch (1978:9): [True: 0, False: 85]
  ------------------
 1979|      0|        case 57: return 56.963990000;
  ------------------
  |  Branch (1979:9): [True: 0, False: 85]
  ------------------
 1980|      0|        case 58: return 57.966970000;
  ------------------
  |  Branch (1980:9): [True: 0, False: 85]
  ------------------
 1981|      0|        case 59: return 58.972930000;
  ------------------
  |  Branch (1981:9): [True: 0, False: 85]
  ------------------
 1982|      2|        case 60: return 59.976760000;
  ------------------
  |  Branch (1982:9): [True: 2, False: 83]
  ------------------
 1983|      2|        case 61: return 60.983200000;
  ------------------
  |  Branch (1983:9): [True: 2, False: 83]
  ------------------
 1984|      2|        case 62: return 61.987490000;
  ------------------
  |  Branch (1984:9): [True: 2, False: 83]
  ------------------
 1985|      2|        case 63: return 62.994420000;
  ------------------
  |  Branch (1985:9): [True: 2, False: 83]
  ------------------
 1986|     85|        }
 1987|     10|        break;
 1988|  1.17k|      case 23:
  ------------------
  |  Branch (1988:7): [True: 1.17k, False: 413k]
  ------------------
 1989|  1.17k|        switch (isotope) {
  ------------------
  |  Branch (1989:17): [True: 1.10k, False: 66]
  ------------------
 1990|     36|        case 40: return 40.011090000;
  ------------------
  |  Branch (1990:9): [True: 36, False: 1.13k]
  ------------------
 1991|      0|        case 41: return 40.999780000;
  ------------------
  |  Branch (1991:9): [True: 0, False: 1.17k]
  ------------------
 1992|      2|        case 42: return 41.991230000;
  ------------------
  |  Branch (1992:9): [True: 2, False: 1.16k]
  ------------------
 1993|      2|        case 43: return 42.980650000;
  ------------------
  |  Branch (1993:9): [True: 2, False: 1.16k]
  ------------------
 1994|      2|        case 44: return 43.974110000;
  ------------------
  |  Branch (1994:9): [True: 2, False: 1.16k]
  ------------------
 1995|      0|        case 45: return 44.965776000;
  ------------------
  |  Branch (1995:9): [True: 0, False: 1.17k]
  ------------------
 1996|      0|        case 46: return 45.960200500;
  ------------------
  |  Branch (1996:9): [True: 0, False: 1.17k]
  ------------------
 1997|      0|        case 47: return 46.954908900;
  ------------------
  |  Branch (1997:9): [True: 0, False: 1.17k]
  ------------------
 1998|      0|        case 48: return 47.952253700;
  ------------------
  |  Branch (1998:9): [True: 0, False: 1.17k]
  ------------------
 1999|      0|        case 49: return 48.948516100;
  ------------------
  |  Branch (1999:9): [True: 0, False: 1.17k]
  ------------------
 2000|     16|        case 50: return 49.947158500;
  ------------------
  |  Branch (2000:9): [True: 16, False: 1.15k]
  ------------------
 2001|    976|        case 0: case 51: return 50.943959500;
  ------------------
  |  Branch (2001:9): [True: 966, False: 204]
  |  Branch (2001:17): [True: 10, False: 1.16k]
  ------------------
 2002|      4|        case 52: return 51.944775500;
  ------------------
  |  Branch (2002:9): [True: 4, False: 1.16k]
  ------------------
 2003|      2|        case 53: return 52.944338000;
  ------------------
  |  Branch (2003:9): [True: 2, False: 1.16k]
  ------------------
 2004|     18|        case 54: return 53.946440000;
  ------------------
  |  Branch (2004:9): [True: 18, False: 1.15k]
  ------------------
 2005|     12|        case 55: return 54.947230000;
  ------------------
  |  Branch (2005:9): [True: 12, False: 1.15k]
  ------------------
 2006|      0|        case 56: return 55.950530000;
  ------------------
  |  Branch (2006:9): [True: 0, False: 1.17k]
  ------------------
 2007|      4|        case 57: return 56.952560000;
  ------------------
  |  Branch (2007:9): [True: 4, False: 1.16k]
  ------------------
 2008|      0|        case 58: return 57.956830000;
  ------------------
  |  Branch (2008:9): [True: 0, False: 1.17k]
  ------------------
 2009|      6|        case 59: return 58.960210000;
  ------------------
  |  Branch (2009:9): [True: 6, False: 1.16k]
  ------------------
 2010|      0|        case 60: return 59.965030000;
  ------------------
  |  Branch (2010:9): [True: 0, False: 1.17k]
  ------------------
 2011|      2|        case 61: return 60.968480000;
  ------------------
  |  Branch (2011:9): [True: 2, False: 1.16k]
  ------------------
 2012|      2|        case 62: return 61.973780000;
  ------------------
  |  Branch (2012:9): [True: 2, False: 1.16k]
  ------------------
 2013|     16|        case 63: return 62.977550000;
  ------------------
  |  Branch (2013:9): [True: 16, False: 1.15k]
  ------------------
 2014|      4|        case 64: return 63.983470000;
  ------------------
  |  Branch (2014:9): [True: 4, False: 1.16k]
  ------------------
 2015|      0|        case 65: return 64.987920000;
  ------------------
  |  Branch (2015:9): [True: 0, False: 1.17k]
  ------------------
 2016|  1.17k|        }
 2017|     66|        break;
 2018|    211|      case 24:
  ------------------
  |  Branch (2018:7): [True: 211, False: 414k]
  ------------------
 2019|    211|        switch (isotope) {
  ------------------
  |  Branch (2019:17): [True: 205, False: 6]
  ------------------
 2020|      6|        case 42: return 42.006430000;
  ------------------
  |  Branch (2020:9): [True: 6, False: 205]
  ------------------
 2021|      8|        case 43: return 42.997710000;
  ------------------
  |  Branch (2021:9): [True: 8, False: 203]
  ------------------
 2022|      2|        case 44: return 43.985550000;
  ------------------
  |  Branch (2022:9): [True: 2, False: 209]
  ------------------
 2023|      6|        case 45: return 44.979640000;
  ------------------
  |  Branch (2023:9): [True: 6, False: 205]
  ------------------
 2024|      2|        case 46: return 45.968359000;
  ------------------
  |  Branch (2024:9): [True: 2, False: 209]
  ------------------
 2025|      2|        case 47: return 46.962900000;
  ------------------
  |  Branch (2025:9): [True: 2, False: 209]
  ------------------
 2026|      2|        case 48: return 47.954032000;
  ------------------
  |  Branch (2026:9): [True: 2, False: 209]
  ------------------
 2027|      8|        case 49: return 48.951335700;
  ------------------
  |  Branch (2027:9): [True: 8, False: 203]
  ------------------
 2028|      8|        case 50: return 49.946044200;
  ------------------
  |  Branch (2028:9): [True: 8, False: 203]
  ------------------
 2029|      6|        case 51: return 50.944767400;
  ------------------
  |  Branch (2029:9): [True: 6, False: 205]
  ------------------
 2030|     53|        case 0: case 52: return 51.940507500;
  ------------------
  |  Branch (2030:9): [True: 47, False: 164]
  |  Branch (2030:17): [True: 6, False: 205]
  ------------------
 2031|      2|        case 53: return 52.940649400;
  ------------------
  |  Branch (2031:9): [True: 2, False: 209]
  ------------------
 2032|      2|        case 54: return 53.938880400;
  ------------------
  |  Branch (2032:9): [True: 2, False: 209]
  ------------------
 2033|      6|        case 55: return 54.940839700;
  ------------------
  |  Branch (2033:9): [True: 6, False: 205]
  ------------------
 2034|     24|        case 56: return 55.940653100;
  ------------------
  |  Branch (2034:9): [True: 24, False: 187]
  ------------------
 2035|     22|        case 57: return 56.943613000;
  ------------------
  |  Branch (2035:9): [True: 22, False: 189]
  ------------------
 2036|      2|        case 58: return 57.944350000;
  ------------------
  |  Branch (2036:9): [True: 2, False: 209]
  ------------------
 2037|      6|        case 59: return 58.948590000;
  ------------------
  |  Branch (2037:9): [True: 6, False: 205]
  ------------------
 2038|      2|        case 60: return 59.950080000;
  ------------------
  |  Branch (2038:9): [True: 2, False: 209]
  ------------------
 2039|      2|        case 61: return 60.954720000;
  ------------------
  |  Branch (2039:9): [True: 2, False: 209]
  ------------------
 2040|      6|        case 62: return 61.956610000;
  ------------------
  |  Branch (2040:9): [True: 6, False: 205]
  ------------------
 2041|      6|        case 63: return 62.961860000;
  ------------------
  |  Branch (2041:9): [True: 6, False: 205]
  ------------------
 2042|      8|        case 64: return 63.964410000;
  ------------------
  |  Branch (2042:9): [True: 8, False: 203]
  ------------------
 2043|      6|        case 65: return 64.970160000;
  ------------------
  |  Branch (2043:9): [True: 6, False: 205]
  ------------------
 2044|      2|        case 66: return 65.973380000;
  ------------------
  |  Branch (2044:9): [True: 2, False: 209]
  ------------------
 2045|      6|        case 67: return 66.979550000;
  ------------------
  |  Branch (2045:9): [True: 6, False: 205]
  ------------------
 2046|    211|        }
 2047|      6|        break;
 2048|    437|      case 25:
  ------------------
  |  Branch (2048:7): [True: 437, False: 414k]
  ------------------
 2049|    437|        switch (isotope) {
  ------------------
  |  Branch (2049:17): [True: 375, False: 62]
  ------------------
 2050|     10|        case 44: return 44.006870000;
  ------------------
  |  Branch (2050:9): [True: 10, False: 427]
  ------------------
 2051|      2|        case 45: return 44.994510000;
  ------------------
  |  Branch (2051:9): [True: 2, False: 435]
  ------------------
 2052|      2|        case 46: return 45.986720000;
  ------------------
  |  Branch (2052:9): [True: 2, False: 435]
  ------------------
 2053|      2|        case 47: return 46.976100000;
  ------------------
  |  Branch (2053:9): [True: 2, False: 435]
  ------------------
 2054|     10|        case 48: return 47.968520000;
  ------------------
  |  Branch (2054:9): [True: 10, False: 427]
  ------------------
 2055|      2|        case 49: return 48.959618000;
  ------------------
  |  Branch (2055:9): [True: 2, False: 435]
  ------------------
 2056|      6|        case 50: return 49.954238200;
  ------------------
  |  Branch (2056:9): [True: 6, False: 431]
  ------------------
 2057|     14|        case 51: return 50.948210800;
  ------------------
  |  Branch (2057:9): [True: 14, False: 423]
  ------------------
 2058|      8|        case 52: return 51.945565500;
  ------------------
  |  Branch (2058:9): [True: 8, False: 429]
  ------------------
 2059|      6|        case 53: return 52.941290100;
  ------------------
  |  Branch (2059:9): [True: 6, False: 431]
  ------------------
 2060|     10|        case 54: return 53.940358900;
  ------------------
  |  Branch (2060:9): [True: 10, False: 427]
  ------------------
 2061|    161|        case 0: case 55: return 54.938045100;
  ------------------
  |  Branch (2061:9): [True: 157, False: 280]
  |  Branch (2061:17): [True: 4, False: 433]
  ------------------
 2062|     60|        case 56: return 55.938904900;
  ------------------
  |  Branch (2062:9): [True: 60, False: 377]
  ------------------
 2063|     16|        case 57: return 56.938285400;
  ------------------
  |  Branch (2063:9): [True: 16, False: 421]
  ------------------
 2064|      6|        case 58: return 57.939980000;
  ------------------
  |  Branch (2064:9): [True: 6, False: 431]
  ------------------
 2065|      2|        case 59: return 58.940440000;
  ------------------
  |  Branch (2065:9): [True: 2, False: 435]
  ------------------
 2066|      2|        case 60: return 59.942910000;
  ------------------
  |  Branch (2066:9): [True: 2, False: 435]
  ------------------
 2067|     14|        case 61: return 60.944650000;
  ------------------
  |  Branch (2067:9): [True: 14, False: 423]
  ------------------
 2068|      6|        case 62: return 61.948430000;
  ------------------
  |  Branch (2068:9): [True: 6, False: 431]
  ------------------
 2069|      8|        case 63: return 62.950240000;
  ------------------
  |  Branch (2069:9): [True: 8, False: 429]
  ------------------
 2070|      2|        case 64: return 63.954250000;
  ------------------
  |  Branch (2070:9): [True: 2, False: 435]
  ------------------
 2071|      6|        case 65: return 64.956340000;
  ------------------
  |  Branch (2071:9): [True: 6, False: 431]
  ------------------
 2072|      2|        case 66: return 65.961080000;
  ------------------
  |  Branch (2072:9): [True: 2, False: 435]
  ------------------
 2073|      8|        case 67: return 66.964140000;
  ------------------
  |  Branch (2073:9): [True: 8, False: 429]
  ------------------
 2074|      8|        case 68: return 67.969300000;
  ------------------
  |  Branch (2074:9): [True: 8, False: 429]
  ------------------
 2075|      2|        case 69: return 68.972840000;
  ------------------
  |  Branch (2075:9): [True: 2, False: 435]
  ------------------
 2076|    437|        }
 2077|     62|        break;
 2078|    373|      case 26:
  ------------------
  |  Branch (2078:7): [True: 373, False: 414k]
  ------------------
 2079|    373|        switch (isotope) {
  ------------------
  |  Branch (2079:17): [True: 355, False: 18]
  ------------------
 2080|      6|        case 45: return 45.014580000;
  ------------------
  |  Branch (2080:9): [True: 6, False: 367]
  ------------------
 2081|     12|        case 46: return 46.000810000;
  ------------------
  |  Branch (2081:9): [True: 12, False: 361]
  ------------------
 2082|      2|        case 47: return 46.992890000;
  ------------------
  |  Branch (2082:9): [True: 2, False: 371]
  ------------------
 2083|      2|        case 48: return 47.980500000;
  ------------------
  |  Branch (2083:9): [True: 2, False: 371]
  ------------------
 2084|     10|        case 49: return 48.973610000;
  ------------------
  |  Branch (2084:9): [True: 10, False: 363]
  ------------------
 2085|      6|        case 50: return 49.962990000;
  ------------------
  |  Branch (2085:9): [True: 6, False: 367]
  ------------------
 2086|      6|        case 51: return 50.956820000;
  ------------------
  |  Branch (2086:9): [True: 6, False: 367]
  ------------------
 2087|      6|        case 52: return 51.948114000;
  ------------------
  |  Branch (2087:9): [True: 6, False: 367]
  ------------------
 2088|      2|        case 53: return 52.945307900;
  ------------------
  |  Branch (2088:9): [True: 2, False: 371]
  ------------------
 2089|      8|        case 54: return 53.939610500;
  ------------------
  |  Branch (2089:9): [True: 8, False: 365]
  ------------------
 2090|      2|        case 55: return 54.938293400;
  ------------------
  |  Branch (2090:9): [True: 2, False: 371]
  ------------------
 2091|    143|        case 0: case 56: return 55.934937500;
  ------------------
  |  Branch (2091:9): [True: 141, False: 232]
  |  Branch (2091:17): [True: 2, False: 371]
  ------------------
 2092|      6|        case 57: return 56.935394000;
  ------------------
  |  Branch (2092:9): [True: 6, False: 367]
  ------------------
 2093|      8|        case 58: return 57.933275600;
  ------------------
  |  Branch (2093:9): [True: 8, False: 365]
  ------------------
 2094|     22|        case 59: return 58.934875500;
  ------------------
  |  Branch (2094:9): [True: 22, False: 351]
  ------------------
 2095|      4|        case 60: return 59.934072000;
  ------------------
  |  Branch (2095:9): [True: 4, False: 369]
  ------------------
 2096|      6|        case 61: return 60.936745000;
  ------------------
  |  Branch (2096:9): [True: 6, False: 367]
  ------------------
 2097|      2|        case 62: return 61.936767000;
  ------------------
  |  Branch (2097:9): [True: 2, False: 371]
  ------------------
 2098|     10|        case 63: return 62.940370000;
  ------------------
  |  Branch (2098:9): [True: 10, False: 363]
  ------------------
 2099|      6|        case 64: return 63.941200000;
  ------------------
  |  Branch (2099:9): [True: 6, False: 367]
  ------------------
 2100|      2|        case 65: return 64.945380000;
  ------------------
  |  Branch (2100:9): [True: 2, False: 371]
  ------------------
 2101|      6|        case 66: return 65.946780000;
  ------------------
  |  Branch (2101:9): [True: 6, False: 367]
  ------------------
 2102|     10|        case 67: return 66.950950000;
  ------------------
  |  Branch (2102:9): [True: 10, False: 363]
  ------------------
 2103|     10|        case 68: return 67.953700000;
  ------------------
  |  Branch (2103:9): [True: 10, False: 363]
  ------------------
 2104|     14|        case 69: return 68.958780000;
  ------------------
  |  Branch (2104:9): [True: 14, False: 359]
  ------------------
 2105|     30|        case 70: return 69.961460000;
  ------------------
  |  Branch (2105:9): [True: 30, False: 343]
  ------------------
 2106|      8|        case 71: return 70.966720000;
  ------------------
  |  Branch (2106:9): [True: 8, False: 365]
  ------------------
 2107|      6|        case 72: return 71.969620000;
  ------------------
  |  Branch (2107:9): [True: 6, False: 367]
  ------------------
 2108|    373|        }
 2109|     18|        break;
 2110|    337|      case 27:
  ------------------
  |  Branch (2110:7): [True: 337, False: 414k]
  ------------------
 2111|    337|        switch (isotope) {
  ------------------
  |  Branch (2111:17): [True: 331, False: 6]
  ------------------
 2112|      6|        case 47: return 47.011490000;
  ------------------
  |  Branch (2112:9): [True: 6, False: 331]
  ------------------
 2113|      6|        case 48: return 48.001760000;
  ------------------
  |  Branch (2113:9): [True: 6, False: 331]
  ------------------
 2114|      6|        case 49: return 48.989720000;
  ------------------
  |  Branch (2114:9): [True: 6, False: 331]
  ------------------
 2115|      6|        case 50: return 49.981540000;
  ------------------
  |  Branch (2115:9): [True: 6, False: 331]
  ------------------
 2116|      2|        case 51: return 50.970720000;
  ------------------
  |  Branch (2116:9): [True: 2, False: 335]
  ------------------
 2117|      6|        case 52: return 51.963590000;
  ------------------
  |  Branch (2117:9): [True: 6, False: 331]
  ------------------
 2118|      6|        case 53: return 52.954219000;
  ------------------
  |  Branch (2118:9): [True: 6, False: 331]
  ------------------
 2119|      8|        case 54: return 53.948459600;
  ------------------
  |  Branch (2119:9): [True: 8, False: 329]
  ------------------
 2120|     10|        case 55: return 54.941999000;
  ------------------
  |  Branch (2120:9): [True: 10, False: 327]
  ------------------
 2121|      2|        case 56: return 55.939839300;
  ------------------
  |  Branch (2121:9): [True: 2, False: 335]
  ------------------
 2122|      6|        case 57: return 56.936291400;
  ------------------
  |  Branch (2122:9): [True: 6, False: 331]
  ------------------
 2123|      8|        case 58: return 57.935752800;
  ------------------
  |  Branch (2123:9): [True: 8, False: 329]
  ------------------
 2124|     85|        case 0: case 59: return 58.933195000;
  ------------------
  |  Branch (2124:9): [True: 79, False: 258]
  |  Branch (2124:17): [True: 6, False: 331]
  ------------------
 2125|      6|        case 60: return 59.933817100;
  ------------------
  |  Branch (2125:9): [True: 6, False: 331]
  ------------------
 2126|      6|        case 61: return 60.932475800;
  ------------------
  |  Branch (2126:9): [True: 6, False: 331]
  ------------------
 2127|      2|        case 62: return 61.934051000;
  ------------------
  |  Branch (2127:9): [True: 2, False: 335]
  ------------------
 2128|      6|        case 63: return 62.933612000;
  ------------------
  |  Branch (2128:9): [True: 6, False: 331]
  ------------------
 2129|      2|        case 64: return 63.935810000;
  ------------------
  |  Branch (2129:9): [True: 2, False: 335]
  ------------------
 2130|     84|        case 65: return 64.936478000;
  ------------------
  |  Branch (2130:9): [True: 84, False: 253]
  ------------------
 2131|      2|        case 66: return 65.939760000;
  ------------------
  |  Branch (2131:9): [True: 2, False: 335]
  ------------------
 2132|      2|        case 67: return 66.940890000;
  ------------------
  |  Branch (2132:9): [True: 2, False: 335]
  ------------------
 2133|      2|        case 68: return 67.944870000;
  ------------------
  |  Branch (2133:9): [True: 2, False: 335]
  ------------------
 2134|      6|        case 69: return 68.946320000;
  ------------------
  |  Branch (2134:9): [True: 6, False: 331]
  ------------------
 2135|     32|        case 70: return 69.951000000;
  ------------------
  |  Branch (2135:9): [True: 32, False: 305]
  ------------------
 2136|      2|        case 71: return 70.952900000;
  ------------------
  |  Branch (2136:9): [True: 2, False: 335]
  ------------------
 2137|      2|        case 72: return 71.957810000;
  ------------------
  |  Branch (2137:9): [True: 2, False: 335]
  ------------------
 2138|      2|        case 73: return 72.960240000;
  ------------------
  |  Branch (2138:9): [True: 2, False: 335]
  ------------------
 2139|      2|        case 74: return 73.965380000;
  ------------------
  |  Branch (2139:9): [True: 2, False: 335]
  ------------------
 2140|     16|        case 75: return 74.968330000;
  ------------------
  |  Branch (2140:9): [True: 16, False: 321]
  ------------------
 2141|    337|        }
 2142|      6|        break;
 2143|    606|      case 28:
  ------------------
  |  Branch (2143:7): [True: 606, False: 414k]
  ------------------
 2144|    606|        switch (isotope) {
  ------------------
  |  Branch (2144:17): [True: 252, False: 354]
  ------------------
 2145|      0|        case 48: return 48.019750000;
  ------------------
  |  Branch (2145:9): [True: 0, False: 606]
  ------------------
 2146|      0|        case 49: return 49.009660000;
  ------------------
  |  Branch (2146:9): [True: 0, False: 606]
  ------------------
 2147|      0|        case 50: return 49.995930000;
  ------------------
  |  Branch (2147:9): [True: 0, False: 606]
  ------------------
 2148|      0|        case 51: return 50.987720000;
  ------------------
  |  Branch (2148:9): [True: 0, False: 606]
  ------------------
 2149|      2|        case 52: return 51.975680000;
  ------------------
  |  Branch (2149:9): [True: 2, False: 604]
  ------------------
 2150|      0|        case 53: return 52.968470000;
  ------------------
  |  Branch (2150:9): [True: 0, False: 606]
  ------------------
 2151|      0|        case 54: return 53.957910000;
  ------------------
  |  Branch (2151:9): [True: 0, False: 606]
  ------------------
 2152|      0|        case 55: return 54.951330000;
  ------------------
  |  Branch (2152:9): [True: 0, False: 606]
  ------------------
 2153|      4|        case 56: return 55.942132000;
  ------------------
  |  Branch (2153:9): [True: 4, False: 602]
  ------------------
 2154|      2|        case 57: return 56.939793500;
  ------------------
  |  Branch (2154:9): [True: 2, False: 604]
  ------------------
 2155|    210|        case 0: case 58: return 57.935342900;
  ------------------
  |  Branch (2155:9): [True: 210, False: 396]
  |  Branch (2155:17): [True: 0, False: 606]
  ------------------
 2156|      2|        case 59: return 58.934346700;
  ------------------
  |  Branch (2156:9): [True: 2, False: 604]
  ------------------
 2157|      0|        case 60: return 59.930786400;
  ------------------
  |  Branch (2157:9): [True: 0, False: 606]
  ------------------
 2158|      0|        case 61: return 60.931056000;
  ------------------
  |  Branch (2158:9): [True: 0, False: 606]
  ------------------
 2159|      0|        case 62: return 61.928345100;
  ------------------
  |  Branch (2159:9): [True: 0, False: 606]
  ------------------
 2160|      6|        case 63: return 62.929669400;
  ------------------
  |  Branch (2160:9): [True: 6, False: 600]
  ------------------
 2161|      0|        case 64: return 63.927966000;
  ------------------
  |  Branch (2161:9): [True: 0, False: 606]
  ------------------
 2162|      0|        case 65: return 64.930084300;
  ------------------
  |  Branch (2162:9): [True: 0, False: 606]
  ------------------
 2163|      0|        case 66: return 65.929139300;
  ------------------
  |  Branch (2163:9): [True: 0, False: 606]
  ------------------
 2164|      0|        case 67: return 66.931569000;
  ------------------
  |  Branch (2164:9): [True: 0, False: 606]
  ------------------
 2165|      6|        case 68: return 67.931869000;
  ------------------
  |  Branch (2165:9): [True: 6, False: 600]
  ------------------
 2166|      0|        case 69: return 68.935610000;
  ------------------
  |  Branch (2166:9): [True: 0, False: 606]
  ------------------
 2167|      4|        case 70: return 69.936500000;
  ------------------
  |  Branch (2167:9): [True: 4, False: 602]
  ------------------
 2168|      0|        case 71: return 70.940740000;
  ------------------
  |  Branch (2168:9): [True: 0, False: 606]
  ------------------
 2169|      0|        case 72: return 71.942090000;
  ------------------
  |  Branch (2169:9): [True: 0, False: 606]
  ------------------
 2170|      0|        case 73: return 72.946470000;
  ------------------
  |  Branch (2170:9): [True: 0, False: 606]
  ------------------
 2171|      0|        case 74: return 73.948070000;
  ------------------
  |  Branch (2171:9): [True: 0, False: 606]
  ------------------
 2172|      4|        case 75: return 74.952870000;
  ------------------
  |  Branch (2172:9): [True: 4, False: 602]
  ------------------
 2173|      0|        case 76: return 75.955330000;
  ------------------
  |  Branch (2173:9): [True: 0, False: 606]
  ------------------
 2174|      6|        case 77: return 76.960550000;
  ------------------
  |  Branch (2174:9): [True: 6, False: 600]
  ------------------
 2175|      6|        case 78: return 77.963180000;
  ------------------
  |  Branch (2175:9): [True: 6, False: 600]
  ------------------
 2176|    606|        }
 2177|    354|        break;
 2178|    606|      case 29:
  ------------------
  |  Branch (2178:7): [True: 606, False: 414k]
  ------------------
 2179|    606|        switch (isotope) {
  ------------------
  |  Branch (2179:17): [True: 548, False: 58]
  ------------------
 2180|      6|        case 52: return 51.997180000;
  ------------------
  |  Branch (2180:9): [True: 6, False: 600]
  ------------------
 2181|      6|        case 53: return 52.985550000;
  ------------------
  |  Branch (2181:9): [True: 6, False: 600]
  ------------------
 2182|      4|        case 54: return 53.976710000;
  ------------------
  |  Branch (2182:9): [True: 4, False: 602]
  ------------------
 2183|      6|        case 55: return 54.966050000;
  ------------------
  |  Branch (2183:9): [True: 6, False: 600]
  ------------------
 2184|     30|        case 56: return 55.958560000;
  ------------------
  |  Branch (2184:9): [True: 30, False: 576]
  ------------------
 2185|      6|        case 57: return 56.949211000;
  ------------------
  |  Branch (2185:9): [True: 6, False: 600]
  ------------------
 2186|      6|        case 58: return 57.944538500;
  ------------------
  |  Branch (2186:9): [True: 6, False: 600]
  ------------------
 2187|      2|        case 59: return 58.939498000;
  ------------------
  |  Branch (2187:9): [True: 2, False: 604]
  ------------------
 2188|      6|        case 60: return 59.937365000;
  ------------------
  |  Branch (2188:9): [True: 6, False: 600]
  ------------------
 2189|     24|        case 61: return 60.933457800;
  ------------------
  |  Branch (2189:9): [True: 24, False: 582]
  ------------------
 2190|      6|        case 62: return 61.932584000;
  ------------------
  |  Branch (2190:9): [True: 6, False: 600]
  ------------------
 2191|    154|        case 0: case 63: return 62.929597500;
  ------------------
  |  Branch (2191:9): [True: 148, False: 458]
  |  Branch (2191:17): [True: 6, False: 600]
  ------------------
 2192|      2|        case 64: return 63.929764200;
  ------------------
  |  Branch (2192:9): [True: 2, False: 604]
  ------------------
 2193|      2|        case 65: return 64.927789500;
  ------------------
  |  Branch (2193:9): [True: 2, False: 604]
  ------------------
 2194|     10|        case 66: return 65.928868800;
  ------------------
  |  Branch (2194:9): [True: 10, False: 596]
  ------------------
 2195|      6|        case 67: return 66.927730300;
  ------------------
  |  Branch (2195:9): [True: 6, False: 600]
  ------------------
 2196|      2|        case 68: return 67.929610900;
  ------------------
  |  Branch (2196:9): [True: 2, False: 604]
  ------------------
 2197|      6|        case 69: return 68.929429300;
  ------------------
  |  Branch (2197:9): [True: 6, False: 600]
  ------------------
 2198|     14|        case 70: return 69.932392300;
  ------------------
  |  Branch (2198:9): [True: 14, False: 592]
  ------------------
 2199|     10|        case 71: return 70.932676800;
  ------------------
  |  Branch (2199:9): [True: 10, False: 596]
  ------------------
 2200|    180|        case 72: return 71.935820300;
  ------------------
  |  Branch (2200:9): [True: 180, False: 426]
  ------------------
 2201|     14|        case 73: return 72.936675000;
  ------------------
  |  Branch (2201:9): [True: 14, False: 592]
  ------------------
 2202|      6|        case 74: return 73.939875000;
  ------------------
  |  Branch (2202:9): [True: 6, False: 600]
  ------------------
 2203|      6|        case 75: return 74.941900000;
  ------------------
  |  Branch (2203:9): [True: 6, False: 600]
  ------------------
 2204|      6|        case 76: return 75.945275000;
  ------------------
  |  Branch (2204:9): [True: 6, False: 600]
  ------------------
 2205|     12|        case 77: return 76.947850000;
  ------------------
  |  Branch (2205:9): [True: 12, False: 594]
  ------------------
 2206|      2|        case 78: return 77.951960000;
  ------------------
  |  Branch (2206:9): [True: 2, False: 604]
  ------------------
 2207|      8|        case 79: return 78.954560000;
  ------------------
  |  Branch (2207:9): [True: 8, False: 598]
  ------------------
 2208|      6|        case 80: return 79.960870000;
  ------------------
  |  Branch (2208:9): [True: 6, False: 600]
  ------------------
 2209|    606|        }
 2210|     58|        break;
 2211|    270|      case 30:
  ------------------
  |  Branch (2211:7): [True: 270, False: 414k]
  ------------------
 2212|    270|        switch (isotope) {
  ------------------
  |  Branch (2212:17): [True: 260, False: 10]
  ------------------
 2213|      2|        case 54: return 53.992950000;
  ------------------
  |  Branch (2213:9): [True: 2, False: 268]
  ------------------
 2214|      8|        case 55: return 54.983980000;
  ------------------
  |  Branch (2214:9): [True: 8, False: 262]
  ------------------
 2215|      6|        case 56: return 55.972380000;
  ------------------
  |  Branch (2215:9): [True: 6, False: 264]
  ------------------
 2216|      2|        case 57: return 56.964790000;
  ------------------
  |  Branch (2216:9): [True: 2, False: 268]
  ------------------
 2217|      2|        case 58: return 57.954590000;
  ------------------
  |  Branch (2217:9): [True: 2, False: 268]
  ------------------
 2218|      6|        case 59: return 58.949260000;
  ------------------
  |  Branch (2218:9): [True: 6, False: 264]
  ------------------
 2219|     10|        case 60: return 59.941827000;
  ------------------
  |  Branch (2219:9): [True: 10, False: 260]
  ------------------
 2220|      6|        case 61: return 60.939511000;
  ------------------
  |  Branch (2220:9): [True: 6, False: 264]
  ------------------
 2221|     10|        case 62: return 61.934330000;
  ------------------
  |  Branch (2221:9): [True: 10, False: 260]
  ------------------
 2222|      2|        case 63: return 62.933211000;
  ------------------
  |  Branch (2222:9): [True: 2, False: 268]
  ------------------
 2223|    122|        case 0: case 64: return 63.929142000;
  ------------------
  |  Branch (2223:9): [True: 120, False: 150]
  |  Branch (2223:17): [True: 2, False: 268]
  ------------------
 2224|      6|        case 65: return 64.929241000;
  ------------------
  |  Branch (2224:9): [True: 6, False: 264]
  ------------------
 2225|      2|        case 66: return 65.926033000;
  ------------------
  |  Branch (2225:9): [True: 2, False: 268]
  ------------------
 2226|      2|        case 67: return 66.927127000;
  ------------------
  |  Branch (2226:9): [True: 2, False: 268]
  ------------------
 2227|      6|        case 68: return 67.924844000;
  ------------------
  |  Branch (2227:9): [True: 6, False: 264]
  ------------------
 2228|      2|        case 69: return 68.926550000;
  ------------------
  |  Branch (2228:9): [True: 2, False: 268]
  ------------------
 2229|      2|        case 70: return 69.925319000;
  ------------------
  |  Branch (2229:9): [True: 2, False: 268]
  ------------------
 2230|      6|        case 71: return 70.927722000;
  ------------------
  |  Branch (2230:9): [True: 6, False: 264]
  ------------------
 2231|      2|        case 72: return 71.926858000;
  ------------------
  |  Branch (2231:9): [True: 2, False: 268]
  ------------------
 2232|      8|        case 73: return 72.929780000;
  ------------------
  |  Branch (2232:9): [True: 8, False: 262]
  ------------------
 2233|      2|        case 74: return 73.929460000;
  ------------------
  |  Branch (2233:9): [True: 2, False: 268]
  ------------------
 2234|      2|        case 75: return 74.932940000;
  ------------------
  |  Branch (2234:9): [True: 2, False: 268]
  ------------------
 2235|      6|        case 76: return 75.933290000;
  ------------------
  |  Branch (2235:9): [True: 6, False: 264]
  ------------------
 2236|      4|        case 77: return 76.936960000;
  ------------------
  |  Branch (2236:9): [True: 4, False: 266]
  ------------------
 2237|      2|        case 78: return 77.938440000;
  ------------------
  |  Branch (2237:9): [True: 2, False: 268]
  ------------------
 2238|      6|        case 79: return 78.942650000;
  ------------------
  |  Branch (2238:9): [True: 6, False: 264]
  ------------------
 2239|      8|        case 80: return 79.944340000;
  ------------------
  |  Branch (2239:9): [True: 8, False: 262]
  ------------------
 2240|      6|        case 81: return 80.950480000;
  ------------------
  |  Branch (2240:9): [True: 6, False: 264]
  ------------------
 2241|      6|        case 82: return 81.954420000;
  ------------------
  |  Branch (2241:9): [True: 6, False: 264]
  ------------------
 2242|      6|        case 83: return 82.961030000;
  ------------------
  |  Branch (2242:9): [True: 6, False: 264]
  ------------------
 2243|    270|        }
 2244|     10|        break;
 2245|    613|      case 31:
  ------------------
  |  Branch (2245:7): [True: 613, False: 414k]
  ------------------
 2246|    613|        switch (isotope) {
  ------------------
  |  Branch (2246:17): [True: 591, False: 22]
  ------------------
 2247|      2|        case 56: return 55.994910000;
  ------------------
  |  Branch (2247:9): [True: 2, False: 611]
  ------------------
 2248|      2|        case 57: return 56.982930000;
  ------------------
  |  Branch (2248:9): [True: 2, False: 611]
  ------------------
 2249|      6|        case 58: return 57.974250000;
  ------------------
  |  Branch (2249:9): [True: 6, False: 607]
  ------------------
 2250|      2|        case 59: return 58.963370000;
  ------------------
  |  Branch (2250:9): [True: 2, False: 611]
  ------------------
 2251|      2|        case 60: return 59.957060000;
  ------------------
  |  Branch (2251:9): [True: 2, False: 611]
  ------------------
 2252|      6|        case 61: return 60.949450000;
  ------------------
  |  Branch (2252:9): [True: 6, False: 607]
  ------------------
 2253|      6|        case 62: return 61.944175000;
  ------------------
  |  Branch (2253:9): [True: 6, False: 607]
  ------------------
 2254|      2|        case 63: return 62.939294000;
  ------------------
  |  Branch (2254:9): [True: 2, False: 611]
  ------------------
 2255|      6|        case 64: return 63.936838000;
  ------------------
  |  Branch (2255:9): [True: 6, False: 607]
  ------------------
 2256|      2|        case 65: return 64.932734000;
  ------------------
  |  Branch (2256:9): [True: 2, False: 611]
  ------------------
 2257|     12|        case 66: return 65.931589000;
  ------------------
  |  Branch (2257:9): [True: 12, False: 601]
  ------------------
 2258|      8|        case 67: return 66.928201000;
  ------------------
  |  Branch (2258:9): [True: 8, False: 605]
  ------------------
 2259|      2|        case 68: return 67.927980000;
  ------------------
  |  Branch (2259:9): [True: 2, False: 611]
  ------------------
 2260|    477|        case 0: case 69: return 68.925573000;
  ------------------
  |  Branch (2260:9): [True: 475, False: 138]
  |  Branch (2260:17): [True: 2, False: 611]
  ------------------
 2261|      6|        case 70: return 69.926022000;
  ------------------
  |  Branch (2261:9): [True: 6, False: 607]
  ------------------
 2262|      2|        case 71: return 70.924701000;
  ------------------
  |  Branch (2262:9): [True: 2, False: 611]
  ------------------
 2263|      2|        case 72: return 71.926366000;
  ------------------
  |  Branch (2263:9): [True: 2, False: 611]
  ------------------
 2264|      4|        case 73: return 72.925174000;
  ------------------
  |  Branch (2264:9): [True: 4, False: 609]
  ------------------
 2265|      2|        case 74: return 73.926946000;
  ------------------
  |  Branch (2265:9): [True: 2, False: 611]
  ------------------
 2266|      2|        case 75: return 74.926500000;
  ------------------
  |  Branch (2266:9): [True: 2, False: 611]
  ------------------
 2267|      2|        case 76: return 75.928827000;
  ------------------
  |  Branch (2267:9): [True: 2, False: 611]
  ------------------
 2268|      6|        case 77: return 76.929154000;
  ------------------
  |  Branch (2268:9): [True: 6, False: 607]
  ------------------
 2269|      6|        case 78: return 77.931608000;
  ------------------
  |  Branch (2269:9): [True: 6, False: 607]
  ------------------
 2270|      6|        case 79: return 78.932890000;
  ------------------
  |  Branch (2270:9): [True: 6, False: 607]
  ------------------
 2271|      2|        case 80: return 79.936520000;
  ------------------
  |  Branch (2271:9): [True: 2, False: 611]
  ------------------
 2272|      2|        case 81: return 80.937750000;
  ------------------
  |  Branch (2272:9): [True: 2, False: 611]
  ------------------
 2273|      2|        case 82: return 81.942990000;
  ------------------
  |  Branch (2273:9): [True: 2, False: 611]
  ------------------
 2274|      2|        case 83: return 82.946980000;
  ------------------
  |  Branch (2274:9): [True: 2, False: 611]
  ------------------
 2275|      6|        case 84: return 83.952650000;
  ------------------
  |  Branch (2275:9): [True: 6, False: 607]
  ------------------
 2276|      2|        case 85: return 84.957000000;
  ------------------
  |  Branch (2276:9): [True: 2, False: 611]
  ------------------
 2277|      2|        case 86: return 85.963120000;
  ------------------
  |  Branch (2277:9): [True: 2, False: 611]
  ------------------
 2278|    613|        }
 2279|     22|        break;
 2280|    309|      case 32:
  ------------------
  |  Branch (2280:7): [True: 309, False: 414k]
  ------------------
 2281|    309|        switch (isotope) {
  ------------------
  |  Branch (2281:17): [True: 303, False: 6]
  ------------------
 2282|     28|        case 58: return 57.991010000;
  ------------------
  |  Branch (2282:9): [True: 28, False: 281]
  ------------------
 2283|     18|        case 59: return 58.981750000;
  ------------------
  |  Branch (2283:9): [True: 18, False: 291]
  ------------------
 2284|      6|        case 60: return 59.970190000;
  ------------------
  |  Branch (2284:9): [True: 6, False: 303]
  ------------------
 2285|      8|        case 61: return 60.963790000;
  ------------------
  |  Branch (2285:9): [True: 8, False: 301]
  ------------------
 2286|     14|        case 62: return 61.954650000;
  ------------------
  |  Branch (2286:9): [True: 14, False: 295]
  ------------------
 2287|     16|        case 63: return 62.949640000;
  ------------------
  |  Branch (2287:9): [True: 16, False: 293]
  ------------------
 2288|      2|        case 64: return 63.941650000;
  ------------------
  |  Branch (2288:9): [True: 2, False: 307]
  ------------------
 2289|      6|        case 65: return 64.939440000;
  ------------------
  |  Branch (2289:9): [True: 6, False: 303]
  ------------------
 2290|      2|        case 66: return 65.933840000;
  ------------------
  |  Branch (2290:9): [True: 2, False: 307]
  ------------------
 2291|      2|        case 67: return 66.932734000;
  ------------------
  |  Branch (2291:9): [True: 2, False: 307]
  ------------------
 2292|      6|        case 68: return 67.928094000;
  ------------------
  |  Branch (2292:9): [True: 6, False: 303]
  ------------------
 2293|      6|        case 69: return 68.927964000;
  ------------------
  |  Branch (2293:9): [True: 6, False: 303]
  ------------------
 2294|      8|        case 70: return 69.924247000;
  ------------------
  |  Branch (2294:9): [True: 8, False: 301]
  ------------------
 2295|      6|        case 71: return 70.924951000;
  ------------------
  |  Branch (2295:9): [True: 6, False: 303]
  ------------------
 2296|     12|        case 72: return 71.922075000;
  ------------------
  |  Branch (2296:9): [True: 12, False: 297]
  ------------------
 2297|      6|        case 73: return 72.923458000;
  ------------------
  |  Branch (2297:9): [True: 6, False: 303]
  ------------------
 2298|     75|        case 0: case 74: return 73.921177000;
  ------------------
  |  Branch (2298:9): [True: 69, False: 240]
  |  Branch (2298:17): [True: 6, False: 303]
  ------------------
 2299|      4|        case 75: return 74.922858000;
  ------------------
  |  Branch (2299:9): [True: 4, False: 305]
  ------------------
 2300|      2|        case 76: return 75.921402000;
  ------------------
  |  Branch (2300:9): [True: 2, False: 307]
  ------------------
 2301|      8|        case 77: return 76.923548000;
  ------------------
  |  Branch (2301:9): [True: 8, False: 301]
  ------------------
 2302|      8|        case 78: return 77.922853000;
  ------------------
  |  Branch (2302:9): [True: 8, False: 301]
  ------------------
 2303|      2|        case 79: return 78.925400000;
  ------------------
  |  Branch (2303:9): [True: 2, False: 307]
  ------------------
 2304|      6|        case 80: return 79.925370000;
  ------------------
  |  Branch (2304:9): [True: 6, False: 303]
  ------------------
 2305|      6|        case 81: return 80.928820000;
  ------------------
  |  Branch (2305:9): [True: 6, False: 303]
  ------------------
 2306|      2|        case 82: return 81.929550000;
  ------------------
  |  Branch (2306:9): [True: 2, False: 307]
  ------------------
 2307|      6|        case 83: return 82.934620000;
  ------------------
  |  Branch (2307:9): [True: 6, False: 303]
  ------------------
 2308|      6|        case 84: return 83.937470000;
  ------------------
  |  Branch (2308:9): [True: 6, False: 303]
  ------------------
 2309|      2|        case 85: return 84.943030000;
  ------------------
  |  Branch (2309:9): [True: 2, False: 307]
  ------------------
 2310|     14|        case 86: return 85.946490000;
  ------------------
  |  Branch (2310:9): [True: 14, False: 295]
  ------------------
 2311|      6|        case 87: return 86.952510000;
  ------------------
  |  Branch (2311:9): [True: 6, False: 303]
  ------------------
 2312|      6|        case 88: return 87.956910000;
  ------------------
  |  Branch (2312:9): [True: 6, False: 303]
  ------------------
 2313|      4|        case 89: return 88.963830000;
  ------------------
  |  Branch (2313:9): [True: 4, False: 305]
  ------------------
 2314|    309|        }
 2315|      6|        break;
 2316|    674|      case 33:
  ------------------
  |  Branch (2316:7): [True: 674, False: 414k]
  ------------------
 2317|    674|        switch (isotope) {
  ------------------
  |  Branch (2317:17): [True: 664, False: 10]
  ------------------
 2318|      6|        case 60: return 59.993130000;
  ------------------
  |  Branch (2318:9): [True: 6, False: 668]
  ------------------
 2319|      6|        case 61: return 60.980620000;
  ------------------
  |  Branch (2319:9): [True: 6, False: 668]
  ------------------
 2320|      2|        case 62: return 61.973200000;
  ------------------
  |  Branch (2320:9): [True: 2, False: 672]
  ------------------
 2321|      6|        case 63: return 62.963690000;
  ------------------
  |  Branch (2321:9): [True: 6, False: 668]
  ------------------
 2322|     16|        case 64: return 63.957570000;
  ------------------
  |  Branch (2322:9): [True: 16, False: 658]
  ------------------
 2323|      6|        case 65: return 64.949560000;
  ------------------
  |  Branch (2323:9): [True: 6, False: 668]
  ------------------
 2324|      2|        case 66: return 65.944710000;
  ------------------
  |  Branch (2324:9): [True: 2, False: 672]
  ------------------
 2325|     14|        case 67: return 66.939190000;
  ------------------
  |  Branch (2325:9): [True: 14, False: 660]
  ------------------
 2326|      8|        case 68: return 67.936770000;
  ------------------
  |  Branch (2326:9): [True: 8, False: 666]
  ------------------
 2327|     14|        case 69: return 68.932270000;
  ------------------
  |  Branch (2327:9): [True: 14, False: 660]
  ------------------
 2328|      2|        case 70: return 69.930920000;
  ------------------
  |  Branch (2328:9): [True: 2, False: 672]
  ------------------
 2329|      2|        case 71: return 70.927112000;
  ------------------
  |  Branch (2329:9): [True: 2, False: 672]
  ------------------
 2330|     14|        case 72: return 71.926752000;
  ------------------
  |  Branch (2330:9): [True: 14, False: 660]
  ------------------
 2331|      4|        case 73: return 72.923825000;
  ------------------
  |  Branch (2331:9): [True: 4, False: 670]
  ------------------
 2332|      4|        case 74: return 73.923928000;
  ------------------
  |  Branch (2332:9): [True: 4, False: 670]
  ------------------
 2333|    440|        case 0: case 75: return 74.921596000;
  ------------------
  |  Branch (2333:9): [True: 436, False: 238]
  |  Branch (2333:17): [True: 4, False: 670]
  ------------------
 2334|      2|        case 76: return 75.922394000;
  ------------------
  |  Branch (2334:9): [True: 2, False: 672]
  ------------------
 2335|      2|        case 77: return 76.920647000;
  ------------------
  |  Branch (2335:9): [True: 2, False: 672]
  ------------------
 2336|      2|        case 78: return 77.921827000;
  ------------------
  |  Branch (2336:9): [True: 2, False: 672]
  ------------------
 2337|      2|        case 79: return 78.920948000;
  ------------------
  |  Branch (2337:9): [True: 2, False: 672]
  ------------------
 2338|      6|        case 80: return 79.922534000;
  ------------------
  |  Branch (2338:9): [True: 6, False: 668]
  ------------------
 2339|     14|        case 81: return 80.922132000;
  ------------------
  |  Branch (2339:9): [True: 14, False: 660]
  ------------------
 2340|      2|        case 82: return 81.924500000;
  ------------------
  |  Branch (2340:9): [True: 2, False: 672]
  ------------------
 2341|      6|        case 83: return 82.924980000;
  ------------------
  |  Branch (2341:9): [True: 6, False: 668]
  ------------------
 2342|      6|        case 84: return 83.929060000;
  ------------------
  |  Branch (2342:9): [True: 6, False: 668]
  ------------------
 2343|      6|        case 85: return 84.932020000;
  ------------------
  |  Branch (2343:9): [True: 6, False: 668]
  ------------------
 2344|      2|        case 86: return 85.936500000;
  ------------------
  |  Branch (2344:9): [True: 2, False: 672]
  ------------------
 2345|      6|        case 87: return 86.939900000;
  ------------------
  |  Branch (2345:9): [True: 6, False: 668]
  ------------------
 2346|      6|        case 88: return 87.944940000;
  ------------------
  |  Branch (2346:9): [True: 6, False: 668]
  ------------------
 2347|      6|        case 89: return 88.949390000;
  ------------------
  |  Branch (2347:9): [True: 6, False: 668]
  ------------------
 2348|     46|        case 90: return 89.955500000;
  ------------------
  |  Branch (2348:9): [True: 46, False: 628]
  ------------------
 2349|      2|        case 91: return 90.960430000;
  ------------------
  |  Branch (2349:9): [True: 2, False: 672]
  ------------------
 2350|      2|        case 92: return 91.966800000;
  ------------------
  |  Branch (2350:9): [True: 2, False: 672]
  ------------------
 2351|    674|        }
 2352|     10|        break;
 2353|    655|      case 34:
  ------------------
  |  Branch (2353:7): [True: 655, False: 414k]
  ------------------
 2354|    655|        switch (isotope) {
  ------------------
  |  Branch (2354:17): [True: 649, False: 6]
  ------------------
 2355|      2|        case 65: return 64.964660000;
  ------------------
  |  Branch (2355:9): [True: 2, False: 653]
  ------------------
 2356|      2|        case 66: return 65.955210000;
  ------------------
  |  Branch (2356:9): [True: 2, False: 653]
  ------------------
 2357|      2|        case 67: return 66.950090000;
  ------------------
  |  Branch (2357:9): [True: 2, False: 653]
  ------------------
 2358|      2|        case 68: return 67.941800000;
  ------------------
  |  Branch (2358:9): [True: 2, False: 653]
  ------------------
 2359|     20|        case 69: return 68.939560000;
  ------------------
  |  Branch (2359:9): [True: 20, False: 635]
  ------------------
 2360|      2|        case 70: return 69.933390000;
  ------------------
  |  Branch (2360:9): [True: 2, False: 653]
  ------------------
 2361|     16|        case 71: return 70.932240000;
  ------------------
  |  Branch (2361:9): [True: 16, False: 639]
  ------------------
 2362|      6|        case 72: return 71.927112000;
  ------------------
  |  Branch (2362:9): [True: 6, False: 649]
  ------------------
 2363|      2|        case 73: return 72.926765000;
  ------------------
  |  Branch (2363:9): [True: 2, False: 653]
  ------------------
 2364|      6|        case 74: return 73.922476000;
  ------------------
  |  Branch (2364:9): [True: 6, False: 649]
  ------------------
 2365|      6|        case 75: return 74.922523000;
  ------------------
  |  Branch (2365:9): [True: 6, False: 649]
  ------------------
 2366|      6|        case 76: return 75.919213000;
  ------------------
  |  Branch (2366:9): [True: 6, False: 649]
  ------------------
 2367|      6|        case 77: return 76.919914000;
  ------------------
  |  Branch (2367:9): [True: 6, False: 649]
  ------------------
 2368|      2|        case 78: return 77.917309000;
  ------------------
  |  Branch (2368:9): [True: 2, False: 653]
  ------------------
 2369|      6|        case 79: return 78.918499000;
  ------------------
  |  Branch (2369:9): [True: 6, False: 649]
  ------------------
 2370|    491|        case 0: case 80: return 79.916521000;
  ------------------
  |  Branch (2370:9): [True: 485, False: 170]
  |  Branch (2370:17): [True: 6, False: 649]
  ------------------
 2371|      2|        case 81: return 80.917992000;
  ------------------
  |  Branch (2371:9): [True: 2, False: 653]
  ------------------
 2372|      6|        case 82: return 81.916699000;
  ------------------
  |  Branch (2372:9): [True: 6, False: 649]
  ------------------
 2373|      2|        case 83: return 82.919118000;
  ------------------
  |  Branch (2373:9): [True: 2, False: 653]
  ------------------
 2374|      6|        case 84: return 83.918462000;
  ------------------
  |  Branch (2374:9): [True: 6, False: 649]
  ------------------
 2375|      2|        case 85: return 84.922250000;
  ------------------
  |  Branch (2375:9): [True: 2, False: 653]
  ------------------
 2376|      6|        case 86: return 85.924272000;
  ------------------
  |  Branch (2376:9): [True: 6, False: 649]
  ------------------
 2377|      6|        case 87: return 86.928520000;
  ------------------
  |  Branch (2377:9): [True: 6, False: 649]
  ------------------
 2378|      6|        case 88: return 87.931420000;
  ------------------
  |  Branch (2378:9): [True: 6, False: 649]
  ------------------
 2379|      6|        case 89: return 88.936450000;
  ------------------
  |  Branch (2379:9): [True: 6, False: 649]
  ------------------
 2380|     22|        case 90: return 89.939960000;
  ------------------
  |  Branch (2380:9): [True: 22, False: 633]
  ------------------
 2381|      2|        case 91: return 90.945960000;
  ------------------
  |  Branch (2381:9): [True: 2, False: 653]
  ------------------
 2382|      2|        case 92: return 91.949920000;
  ------------------
  |  Branch (2382:9): [True: 2, False: 653]
  ------------------
 2383|      2|        case 93: return 92.956290000;
  ------------------
  |  Branch (2383:9): [True: 2, False: 653]
  ------------------
 2384|      2|        case 94: return 93.960490000;
  ------------------
  |  Branch (2384:9): [True: 2, False: 653]
  ------------------
 2385|    655|        }
 2386|      6|        break;
 2387|    675|      case 35:
  ------------------
  |  Branch (2387:7): [True: 675, False: 414k]
  ------------------
 2388|    675|        switch (isotope) {
  ------------------
  |  Branch (2388:17): [True: 645, False: 30]
  ------------------
 2389|      6|        case 67: return 66.964790000;
  ------------------
  |  Branch (2389:9): [True: 6, False: 669]
  ------------------
 2390|      2|        case 68: return 67.958520000;
  ------------------
  |  Branch (2390:9): [True: 2, False: 673]
  ------------------
 2391|      6|        case 69: return 68.950110000;
  ------------------
  |  Branch (2391:9): [True: 6, False: 669]
  ------------------
 2392|      2|        case 70: return 69.944790000;
  ------------------
  |  Branch (2392:9): [True: 2, False: 673]
  ------------------
 2393|      6|        case 71: return 70.938740000;
  ------------------
  |  Branch (2393:9): [True: 6, False: 669]
  ------------------
 2394|      4|        case 72: return 71.936640000;
  ------------------
  |  Branch (2394:9): [True: 4, False: 671]
  ------------------
 2395|     18|        case 73: return 72.931690000;
  ------------------
  |  Branch (2395:9): [True: 18, False: 657]
  ------------------
 2396|      2|        case 74: return 73.929891000;
  ------------------
  |  Branch (2396:9): [True: 2, False: 673]
  ------------------
 2397|      6|        case 75: return 74.925776000;
  ------------------
  |  Branch (2397:9): [True: 6, False: 669]
  ------------------
 2398|      2|        case 76: return 75.924541000;
  ------------------
  |  Branch (2398:9): [True: 2, False: 673]
  ------------------
 2399|      2|        case 77: return 76.921379000;
  ------------------
  |  Branch (2399:9): [True: 2, False: 673]
  ------------------
 2400|      2|        case 78: return 77.921146000;
  ------------------
  |  Branch (2400:9): [True: 2, False: 673]
  ------------------
 2401|    445|        case 0: case 79: return 78.918337000;
  ------------------
  |  Branch (2401:9): [True: 443, False: 232]
  |  Branch (2401:17): [True: 2, False: 673]
  ------------------
 2402|      2|        case 80: return 79.918529000;
  ------------------
  |  Branch (2402:9): [True: 2, False: 673]
  ------------------
 2403|      4|        case 81: return 80.916290000;
  ------------------
  |  Branch (2403:9): [True: 4, False: 671]
  ------------------
 2404|     12|        case 82: return 81.916804000;
  ------------------
  |  Branch (2404:9): [True: 12, False: 663]
  ------------------
 2405|      2|        case 83: return 82.915180000;
  ------------------
  |  Branch (2405:9): [True: 2, False: 673]
  ------------------
 2406|      2|        case 84: return 83.916479000;
  ------------------
  |  Branch (2406:9): [True: 2, False: 673]
  ------------------
 2407|      2|        case 85: return 84.915608000;
  ------------------
  |  Branch (2407:9): [True: 2, False: 673]
  ------------------
 2408|      6|        case 86: return 85.918798000;
  ------------------
  |  Branch (2408:9): [True: 6, False: 669]
  ------------------
 2409|      2|        case 87: return 86.920711000;
  ------------------
  |  Branch (2409:9): [True: 2, False: 673]
  ------------------
 2410|      6|        case 88: return 87.924070000;
  ------------------
  |  Branch (2410:9): [True: 6, False: 669]
  ------------------
 2411|      6|        case 89: return 88.926390000;
  ------------------
  |  Branch (2411:9): [True: 6, False: 669]
  ------------------
 2412|     12|        case 90: return 89.930630000;
  ------------------
  |  Branch (2412:9): [True: 12, False: 663]
  ------------------
 2413|      6|        case 91: return 90.933970000;
  ------------------
  |  Branch (2413:9): [True: 6, False: 669]
  ------------------
 2414|     56|        case 92: return 91.939260000;
  ------------------
  |  Branch (2414:9): [True: 56, False: 619]
  ------------------
 2415|      6|        case 93: return 92.943050000;
  ------------------
  |  Branch (2415:9): [True: 6, False: 669]
  ------------------
 2416|      6|        case 94: return 93.948680000;
  ------------------
  |  Branch (2416:9): [True: 6, False: 669]
  ------------------
 2417|      4|        case 95: return 94.952870000;
  ------------------
  |  Branch (2417:9): [True: 4, False: 671]
  ------------------
 2418|      6|        case 96: return 95.958530000;
  ------------------
  |  Branch (2418:9): [True: 6, False: 669]
  ------------------
 2419|      2|        case 97: return 96.962800000;
  ------------------
  |  Branch (2419:9): [True: 2, False: 673]
  ------------------
 2420|    675|        }
 2421|     30|        break;
 2422|    325|      case 36:
  ------------------
  |  Branch (2422:7): [True: 325, False: 414k]
  ------------------
 2423|    325|        switch (isotope) {
  ------------------
  |  Branch (2423:17): [True: 317, False: 8]
  ------------------
 2424|      6|        case 69: return 68.965180000;
  ------------------
  |  Branch (2424:9): [True: 6, False: 319]
  ------------------
 2425|      2|        case 70: return 69.955260000;
  ------------------
  |  Branch (2425:9): [True: 2, False: 323]
  ------------------
 2426|      6|        case 71: return 70.949630000;
  ------------------
  |  Branch (2426:9): [True: 6, False: 319]
  ------------------
 2427|     10|        case 72: return 71.942092000;
  ------------------
  |  Branch (2427:9): [True: 10, False: 315]
  ------------------
 2428|     12|        case 73: return 72.939289000;
  ------------------
  |  Branch (2428:9): [True: 12, False: 313]
  ------------------
 2429|     18|        case 74: return 73.933084000;
  ------------------
  |  Branch (2429:9): [True: 18, False: 307]
  ------------------
 2430|      2|        case 75: return 74.930946000;
  ------------------
  |  Branch (2430:9): [True: 2, False: 323]
  ------------------
 2431|      6|        case 76: return 75.925910000;
  ------------------
  |  Branch (2431:9): [True: 6, False: 319]
  ------------------
 2432|      6|        case 77: return 76.924670000;
  ------------------
  |  Branch (2432:9): [True: 6, False: 319]
  ------------------
 2433|      6|        case 78: return 77.920364000;
  ------------------
  |  Branch (2433:9): [True: 6, False: 319]
  ------------------
 2434|      2|        case 79: return 78.920082000;
  ------------------
  |  Branch (2434:9): [True: 2, False: 323]
  ------------------
 2435|      2|        case 80: return 79.916379000;
  ------------------
  |  Branch (2435:9): [True: 2, False: 323]
  ------------------
 2436|      6|        case 81: return 80.916592000;
  ------------------
  |  Branch (2436:9): [True: 6, False: 319]
  ------------------
 2437|      4|        case 82: return 81.913483000;
  ------------------
  |  Branch (2437:9): [True: 4, False: 321]
  ------------------
 2438|     14|        case 83: return 82.914136000;
  ------------------
  |  Branch (2438:9): [True: 14, False: 311]
  ------------------
 2439|    109|        case 0: case 84: return 83.911507000;
  ------------------
  |  Branch (2439:9): [True: 107, False: 218]
  |  Branch (2439:17): [True: 2, False: 323]
  ------------------
 2440|      6|        case 85: return 84.912527000;
  ------------------
  |  Branch (2440:9): [True: 6, False: 319]
  ------------------
 2441|     12|        case 86: return 85.910610000;
  ------------------
  |  Branch (2441:9): [True: 12, False: 313]
  ------------------
 2442|      6|        case 87: return 86.913354000;
  ------------------
  |  Branch (2442:9): [True: 6, False: 319]
  ------------------
 2443|      2|        case 88: return 87.914447000;
  ------------------
  |  Branch (2443:9): [True: 2, False: 323]
  ------------------
 2444|      8|        case 89: return 88.917630000;
  ------------------
  |  Branch (2444:9): [True: 8, False: 317]
  ------------------
 2445|      2|        case 90: return 89.919517000;
  ------------------
  |  Branch (2445:9): [True: 2, False: 323]
  ------------------
 2446|      6|        case 91: return 90.923450000;
  ------------------
  |  Branch (2446:9): [True: 6, False: 319]
  ------------------
 2447|     16|        case 92: return 91.926156000;
  ------------------
  |  Branch (2447:9): [True: 16, False: 309]
  ------------------
 2448|      2|        case 93: return 92.931270000;
  ------------------
  |  Branch (2448:9): [True: 2, False: 323]
  ------------------
 2449|     10|        case 94: return 93.934360000;
  ------------------
  |  Branch (2449:9): [True: 10, False: 315]
  ------------------
 2450|      6|        case 95: return 94.939840000;
  ------------------
  |  Branch (2450:9): [True: 6, False: 319]
  ------------------
 2451|      8|        case 96: return 95.943070000;
  ------------------
  |  Branch (2451:9): [True: 8, False: 317]
  ------------------
 2452|      8|        case 97: return 96.948560000;
  ------------------
  |  Branch (2452:9): [True: 8, False: 317]
  ------------------
 2453|      6|        case 98: return 97.951910000;
  ------------------
  |  Branch (2453:9): [True: 6, False: 319]
  ------------------
 2454|      6|        case 99: return 98.957600000;
  ------------------
  |  Branch (2454:9): [True: 6, False: 319]
  ------------------
 2455|      2|        case 100: return 99.961140000;
  ------------------
  |  Branch (2455:9): [True: 2, False: 323]
  ------------------
 2456|    325|        }
 2457|      8|        break;
 2458|    589|      case 37:
  ------------------
  |  Branch (2458:7): [True: 589, False: 414k]
  ------------------
 2459|    589|        switch (isotope) {
  ------------------
  |  Branch (2459:17): [True: 519, False: 70]
  ------------------
 2460|      2|        case 71: return 70.965320000;
  ------------------
  |  Branch (2460:9): [True: 2, False: 587]
  ------------------
 2461|      6|        case 72: return 71.959080000;
  ------------------
  |  Branch (2461:9): [True: 6, False: 583]
  ------------------
 2462|      6|        case 73: return 72.950560000;
  ------------------
  |  Branch (2462:9): [True: 6, False: 583]
  ------------------
 2463|      6|        case 74: return 73.944265000;
  ------------------
  |  Branch (2463:9): [True: 6, False: 583]
  ------------------
 2464|      2|        case 75: return 74.938570000;
  ------------------
  |  Branch (2464:9): [True: 2, False: 587]
  ------------------
 2465|      6|        case 76: return 75.935072000;
  ------------------
  |  Branch (2465:9): [True: 6, False: 583]
  ------------------
 2466|      2|        case 77: return 76.930408000;
  ------------------
  |  Branch (2466:9): [True: 2, False: 587]
  ------------------
 2467|      2|        case 78: return 77.928141000;
  ------------------
  |  Branch (2467:9): [True: 2, False: 587]
  ------------------
 2468|      2|        case 79: return 78.923989000;
  ------------------
  |  Branch (2468:9): [True: 2, False: 587]
  ------------------
 2469|      2|        case 80: return 79.922519000;
  ------------------
  |  Branch (2469:9): [True: 2, False: 587]
  ------------------
 2470|      6|        case 81: return 80.918996000;
  ------------------
  |  Branch (2470:9): [True: 6, False: 583]
  ------------------
 2471|      2|        case 82: return 81.918208000;
  ------------------
  |  Branch (2471:9): [True: 2, False: 587]
  ------------------
 2472|      2|        case 83: return 82.915110000;
  ------------------
  |  Branch (2472:9): [True: 2, False: 587]
  ------------------
 2473|      4|        case 84: return 83.914385000;
  ------------------
  |  Branch (2473:9): [True: 4, False: 585]
  ------------------
 2474|    405|        case 0: case 85: return 84.911789000;
  ------------------
  |  Branch (2474:9): [True: 403, False: 186]
  |  Branch (2474:17): [True: 2, False: 587]
  ------------------
 2475|      2|        case 86: return 85.911167000;
  ------------------
  |  Branch (2475:9): [True: 2, False: 587]
  ------------------
 2476|      2|        case 87: return 86.909180000;
  ------------------
  |  Branch (2476:9): [True: 2, False: 587]
  ------------------
 2477|      2|        case 88: return 87.911315000;
  ------------------
  |  Branch (2477:9): [True: 2, False: 587]
  ------------------
 2478|      2|        case 89: return 88.912278000;
  ------------------
  |  Branch (2478:9): [True: 2, False: 587]
  ------------------
 2479|      2|        case 90: return 89.914802000;
  ------------------
  |  Branch (2479:9): [True: 2, False: 587]
  ------------------
 2480|      6|        case 91: return 90.916537000;
  ------------------
  |  Branch (2480:9): [True: 6, False: 583]
  ------------------
 2481|      2|        case 92: return 91.919729000;
  ------------------
  |  Branch (2481:9): [True: 2, False: 587]
  ------------------
 2482|      2|        case 93: return 92.922042000;
  ------------------
  |  Branch (2482:9): [True: 2, False: 587]
  ------------------
 2483|      6|        case 94: return 93.926405000;
  ------------------
  |  Branch (2483:9): [True: 6, False: 583]
  ------------------
 2484|      2|        case 95: return 94.929303000;
  ------------------
  |  Branch (2484:9): [True: 2, False: 587]
  ------------------
 2485|      2|        case 96: return 95.934270000;
  ------------------
  |  Branch (2485:9): [True: 2, False: 587]
  ------------------
 2486|      2|        case 97: return 96.937350000;
  ------------------
  |  Branch (2486:9): [True: 2, False: 587]
  ------------------
 2487|     12|        case 98: return 97.941790000;
  ------------------
  |  Branch (2487:9): [True: 12, False: 577]
  ------------------
 2488|      2|        case 99: return 98.945380000;
  ------------------
  |  Branch (2488:9): [True: 2, False: 587]
  ------------------
 2489|      2|        case 100: return 99.949870000;
  ------------------
  |  Branch (2489:9): [True: 2, False: 587]
  ------------------
 2490|     10|        case 101: return 100.953200000;
  ------------------
  |  Branch (2490:9): [True: 10, False: 579]
  ------------------
 2491|      6|        case 102: return 101.958870000;
  ------------------
  |  Branch (2491:9): [True: 6, False: 583]
  ------------------
 2492|    589|        }
 2493|     70|        break;
 2494|    531|      case 38:
  ------------------
  |  Branch (2494:7): [True: 531, False: 414k]
  ------------------
 2495|    531|        switch (isotope) {
  ------------------
  |  Branch (2495:17): [True: 497, False: 34]
  ------------------
 2496|      6|        case 73: return 72.965970000;
  ------------------
  |  Branch (2496:9): [True: 6, False: 525]
  ------------------
 2497|      8|        case 74: return 73.956310000;
  ------------------
  |  Branch (2497:9): [True: 8, False: 523]
  ------------------
 2498|      6|        case 75: return 74.949950000;
  ------------------
  |  Branch (2498:9): [True: 6, False: 525]
  ------------------
 2499|      8|        case 76: return 75.941770000;
  ------------------
  |  Branch (2499:9): [True: 8, False: 523]
  ------------------
 2500|      6|        case 77: return 76.937945000;
  ------------------
  |  Branch (2500:9): [True: 6, False: 525]
  ------------------
 2501|      6|        case 78: return 77.932180000;
  ------------------
  |  Branch (2501:9): [True: 6, False: 525]
  ------------------
 2502|      2|        case 79: return 78.929708000;
  ------------------
  |  Branch (2502:9): [True: 2, False: 529]
  ------------------
 2503|      6|        case 80: return 79.924521000;
  ------------------
  |  Branch (2503:9): [True: 6, False: 525]
  ------------------
 2504|     20|        case 81: return 80.923212000;
  ------------------
  |  Branch (2504:9): [True: 20, False: 511]
  ------------------
 2505|      2|        case 82: return 81.918402000;
  ------------------
  |  Branch (2505:9): [True: 2, False: 529]
  ------------------
 2506|      6|        case 83: return 82.917557000;
  ------------------
  |  Branch (2506:9): [True: 6, False: 525]
  ------------------
 2507|      8|        case 84: return 83.913425000;
  ------------------
  |  Branch (2507:9): [True: 8, False: 523]
  ------------------
 2508|      8|        case 85: return 84.912933000;
  ------------------
  |  Branch (2508:9): [True: 8, False: 523]
  ------------------
 2509|      8|        case 86: return 85.909260000;
  ------------------
  |  Branch (2509:9): [True: 8, False: 523]
  ------------------
 2510|     10|        case 87: return 86.908877000;
  ------------------
  |  Branch (2510:9): [True: 10, False: 521]
  ------------------
 2511|    215|        case 0: case 88: return 87.905612000;
  ------------------
  |  Branch (2511:9): [True: 209, False: 322]
  |  Branch (2511:17): [True: 6, False: 525]
  ------------------
 2512|      8|        case 89: return 88.907450000;
  ------------------
  |  Branch (2512:9): [True: 8, False: 523]
  ------------------
 2513|      2|        case 90: return 89.907738000;
  ------------------
  |  Branch (2513:9): [True: 2, False: 529]
  ------------------
 2514|     22|        case 91: return 90.910203000;
  ------------------
  |  Branch (2514:9): [True: 22, False: 509]
  ------------------
 2515|     12|        case 92: return 91.911038000;
  ------------------
  |  Branch (2515:9): [True: 12, False: 519]
  ------------------
 2516|     10|        case 93: return 92.914026000;
  ------------------
  |  Branch (2516:9): [True: 10, False: 521]
  ------------------
 2517|     10|        case 94: return 93.915361000;
  ------------------
  |  Branch (2517:9): [True: 10, False: 521]
  ------------------
 2518|      4|        case 95: return 94.919359000;
  ------------------
  |  Branch (2518:9): [True: 4, False: 527]
  ------------------
 2519|     12|        case 96: return 95.921697000;
  ------------------
  |  Branch (2519:9): [True: 12, False: 519]
  ------------------
 2520|      6|        case 97: return 96.926153000;
  ------------------
  |  Branch (2520:9): [True: 6, False: 525]
  ------------------
 2521|      2|        case 98: return 97.928453000;
  ------------------
  |  Branch (2521:9): [True: 2, False: 529]
  ------------------
 2522|      4|        case 99: return 98.933240000;
  ------------------
  |  Branch (2522:9): [True: 4, False: 527]
  ------------------
 2523|      6|        case 100: return 99.935350000;
  ------------------
  |  Branch (2523:9): [True: 6, False: 525]
  ------------------
 2524|      2|        case 101: return 100.940520000;
  ------------------
  |  Branch (2524:9): [True: 2, False: 529]
  ------------------
 2525|      6|        case 102: return 101.943020000;
  ------------------
  |  Branch (2525:9): [True: 6, False: 525]
  ------------------
 2526|     14|        case 103: return 102.948950000;
  ------------------
  |  Branch (2526:9): [True: 14, False: 517]
  ------------------
 2527|     42|        case 104: return 103.952330000;
  ------------------
  |  Branch (2527:9): [True: 42, False: 489]
  ------------------
 2528|     10|        case 105: return 104.958580000;
  ------------------
  |  Branch (2528:9): [True: 10, False: 521]
  ------------------
 2529|    531|        }
 2530|     34|        break;
 2531|    367|      case 39:
  ------------------
  |  Branch (2531:7): [True: 367, False: 414k]
  ------------------
 2532|    367|        switch (isotope) {
  ------------------
  |  Branch (2532:17): [True: 357, False: 10]
  ------------------
 2533|     10|        case 76: return 75.958450000;
  ------------------
  |  Branch (2533:9): [True: 10, False: 357]
  ------------------
 2534|      6|        case 77: return 76.949650000;
  ------------------
  |  Branch (2534:9): [True: 6, False: 361]
  ------------------
 2535|      6|        case 78: return 77.943610000;
  ------------------
  |  Branch (2535:9): [True: 6, False: 361]
  ------------------
 2536|      2|        case 79: return 78.937350000;
  ------------------
  |  Branch (2536:9): [True: 2, False: 365]
  ------------------
 2537|      2|        case 80: return 79.934280000;
  ------------------
  |  Branch (2537:9): [True: 2, False: 365]
  ------------------
 2538|      2|        case 81: return 80.929130000;
  ------------------
  |  Branch (2538:9): [True: 2, False: 365]
  ------------------
 2539|      8|        case 82: return 81.926790000;
  ------------------
  |  Branch (2539:9): [True: 8, False: 359]
  ------------------
 2540|      2|        case 83: return 82.922350000;
  ------------------
  |  Branch (2540:9): [True: 2, False: 365]
  ------------------
 2541|      6|        case 84: return 83.920390000;
  ------------------
  |  Branch (2541:9): [True: 6, False: 361]
  ------------------
 2542|      2|        case 85: return 84.916433000;
  ------------------
  |  Branch (2542:9): [True: 2, False: 365]
  ------------------
 2543|      8|        case 86: return 85.914886000;
  ------------------
  |  Branch (2543:9): [True: 8, False: 359]
  ------------------
 2544|      2|        case 87: return 86.910875000;
  ------------------
  |  Branch (2544:9): [True: 2, False: 365]
  ------------------
 2545|      2|        case 88: return 87.909501000;
  ------------------
  |  Branch (2545:9): [True: 2, False: 365]
  ------------------
 2546|    197|        case 0: case 89: return 88.905848000;
  ------------------
  |  Branch (2546:9): [True: 193, False: 174]
  |  Branch (2546:17): [True: 4, False: 363]
  ------------------
 2547|      2|        case 90: return 89.907151000;
  ------------------
  |  Branch (2547:9): [True: 2, False: 365]
  ------------------
 2548|      8|        case 91: return 90.907305000;
  ------------------
  |  Branch (2548:9): [True: 8, False: 359]
  ------------------
 2549|      2|        case 92: return 91.908949000;
  ------------------
  |  Branch (2549:9): [True: 2, False: 365]
  ------------------
 2550|      2|        case 93: return 92.909583000;
  ------------------
  |  Branch (2550:9): [True: 2, False: 365]
  ------------------
 2551|      6|        case 94: return 93.911595000;
  ------------------
  |  Branch (2551:9): [True: 6, False: 361]
  ------------------
 2552|      6|        case 95: return 94.912821000;
  ------------------
  |  Branch (2552:9): [True: 6, False: 361]
  ------------------
 2553|     10|        case 96: return 95.915891000;
  ------------------
  |  Branch (2553:9): [True: 10, False: 357]
  ------------------
 2554|     18|        case 97: return 96.918134000;
  ------------------
  |  Branch (2554:9): [True: 18, False: 349]
  ------------------
 2555|      2|        case 98: return 97.922203000;
  ------------------
  |  Branch (2555:9): [True: 2, False: 365]
  ------------------
 2556|      6|        case 99: return 98.924636000;
  ------------------
  |  Branch (2556:9): [True: 6, False: 361]
  ------------------
 2557|      6|        case 100: return 99.927760000;
  ------------------
  |  Branch (2557:9): [True: 6, False: 361]
  ------------------
 2558|      2|        case 101: return 100.930310000;
  ------------------
  |  Branch (2558:9): [True: 2, False: 365]
  ------------------
 2559|     16|        case 102: return 101.933560000;
  ------------------
  |  Branch (2559:9): [True: 16, False: 351]
  ------------------
 2560|      2|        case 103: return 102.936730000;
  ------------------
  |  Branch (2560:9): [True: 2, False: 365]
  ------------------
 2561|      2|        case 104: return 103.941050000;
  ------------------
  |  Branch (2561:9): [True: 2, False: 365]
  ------------------
 2562|      2|        case 105: return 104.944870000;
  ------------------
  |  Branch (2562:9): [True: 2, False: 365]
  ------------------
 2563|      6|        case 106: return 105.949790000;
  ------------------
  |  Branch (2563:9): [True: 6, False: 361]
  ------------------
 2564|      2|        case 107: return 106.954140000;
  ------------------
  |  Branch (2564:9): [True: 2, False: 365]
  ------------------
 2565|      2|        case 108: return 107.959480000;
  ------------------
  |  Branch (2565:9): [True: 2, False: 365]
  ------------------
 2566|    367|        }
 2567|     10|        break;
 2568|    369|      case 40:
  ------------------
  |  Branch (2568:7): [True: 369, False: 414k]
  ------------------
 2569|    369|        switch (isotope) {
  ------------------
  |  Branch (2569:17): [True: 355, False: 14]
  ------------------
 2570|     10|        case 78: return 77.955230000;
  ------------------
  |  Branch (2570:9): [True: 10, False: 359]
  ------------------
 2571|     86|        case 79: return 78.949160000;
  ------------------
  |  Branch (2571:9): [True: 86, False: 283]
  ------------------
 2572|      6|        case 80: return 79.940400000;
  ------------------
  |  Branch (2572:9): [True: 6, False: 363]
  ------------------
 2573|      6|        case 81: return 80.937210000;
  ------------------
  |  Branch (2573:9): [True: 6, False: 363]
  ------------------
 2574|     14|        case 82: return 81.931090000;
  ------------------
  |  Branch (2574:9): [True: 14, False: 355]
  ------------------
 2575|      8|        case 83: return 82.928650000;
  ------------------
  |  Branch (2575:9): [True: 8, False: 361]
  ------------------
 2576|      6|        case 84: return 83.923250000;
  ------------------
  |  Branch (2576:9): [True: 6, False: 363]
  ------------------
 2577|      2|        case 85: return 84.921470000;
  ------------------
  |  Branch (2577:9): [True: 2, False: 367]
  ------------------
 2578|      2|        case 86: return 85.916470000;
  ------------------
  |  Branch (2578:9): [True: 2, False: 367]
  ------------------
 2579|      2|        case 87: return 86.914816000;
  ------------------
  |  Branch (2579:9): [True: 2, False: 367]
  ------------------
 2580|      6|        case 88: return 87.910227000;
  ------------------
  |  Branch (2580:9): [True: 6, False: 363]
  ------------------
 2581|      8|        case 89: return 88.908890000;
  ------------------
  |  Branch (2581:9): [True: 8, False: 361]
  ------------------
 2582|     43|        case 0: case 90: return 89.904704000;
  ------------------
  |  Branch (2582:9): [True: 35, False: 334]
  |  Branch (2582:17): [True: 8, False: 361]
  ------------------
 2583|     14|        case 91: return 90.905645000;
  ------------------
  |  Branch (2583:9): [True: 14, False: 355]
  ------------------
 2584|      8|        case 92: return 91.905040000;
  ------------------
  |  Branch (2584:9): [True: 8, False: 361]
  ------------------
 2585|      2|        case 93: return 92.906476000;
  ------------------
  |  Branch (2585:9): [True: 2, False: 367]
  ------------------
 2586|     22|        case 94: return 93.906315000;
  ------------------
  |  Branch (2586:9): [True: 22, False: 347]
  ------------------
 2587|      6|        case 95: return 94.908042000;
  ------------------
  |  Branch (2587:9): [True: 6, False: 363]
  ------------------
 2588|      6|        case 96: return 95.908273000;
  ------------------
  |  Branch (2588:9): [True: 6, False: 363]
  ------------------
 2589|     16|        case 97: return 96.910953000;
  ------------------
  |  Branch (2589:9): [True: 16, False: 353]
  ------------------
 2590|     22|        case 98: return 97.912735000;
  ------------------
  |  Branch (2590:9): [True: 22, False: 347]
  ------------------
 2591|      6|        case 99: return 98.916512000;
  ------------------
  |  Branch (2591:9): [True: 6, False: 363]
  ------------------
 2592|     10|        case 100: return 99.917760000;
  ------------------
  |  Branch (2592:9): [True: 10, False: 359]
  ------------------
 2593|      2|        case 101: return 100.921140000;
  ------------------
  |  Branch (2593:9): [True: 2, False: 367]
  ------------------
 2594|      2|        case 102: return 101.922980000;
  ------------------
  |  Branch (2594:9): [True: 2, False: 367]
  ------------------
 2595|      2|        case 103: return 102.926600000;
  ------------------
  |  Branch (2595:9): [True: 2, False: 367]
  ------------------
 2596|      2|        case 104: return 103.928780000;
  ------------------
  |  Branch (2596:9): [True: 2, False: 367]
  ------------------
 2597|      6|        case 105: return 104.933050000;
  ------------------
  |  Branch (2597:9): [True: 6, False: 363]
  ------------------
 2598|      6|        case 106: return 105.935910000;
  ------------------
  |  Branch (2598:9): [True: 6, False: 363]
  ------------------
 2599|      6|        case 107: return 106.940750000;
  ------------------
  |  Branch (2599:9): [True: 6, False: 363]
  ------------------
 2600|     10|        case 108: return 107.943960000;
  ------------------
  |  Branch (2600:9): [True: 10, False: 359]
  ------------------
 2601|      2|        case 109: return 108.949240000;
  ------------------
  |  Branch (2601:9): [True: 2, False: 367]
  ------------------
 2602|      6|        case 110: return 109.952870000;
  ------------------
  |  Branch (2602:9): [True: 6, False: 363]
  ------------------
 2603|    369|        }
 2604|     14|        break;
 2605|    551|      case 41:
  ------------------
  |  Branch (2605:7): [True: 551, False: 414k]
  ------------------
 2606|    551|        switch (isotope) {
  ------------------
  |  Branch (2606:17): [True: 451, False: 100]
  ------------------
 2607|     12|        case 81: return 80.949030000;
  ------------------
  |  Branch (2607:9): [True: 12, False: 539]
  ------------------
 2608|      6|        case 82: return 81.943130000;
  ------------------
  |  Branch (2608:9): [True: 6, False: 545]
  ------------------
 2609|      2|        case 83: return 82.936710000;
  ------------------
  |  Branch (2609:9): [True: 2, False: 549]
  ------------------
 2610|      2|        case 84: return 83.933570000;
  ------------------
  |  Branch (2610:9): [True: 2, False: 549]
  ------------------
 2611|     14|        case 85: return 84.927910000;
  ------------------
  |  Branch (2611:9): [True: 14, False: 537]
  ------------------
 2612|      2|        case 86: return 85.925040000;
  ------------------
  |  Branch (2612:9): [True: 2, False: 549]
  ------------------
 2613|      2|        case 87: return 86.920360000;
  ------------------
  |  Branch (2613:9): [True: 2, False: 549]
  ------------------
 2614|      2|        case 88: return 87.918330000;
  ------------------
  |  Branch (2614:9): [True: 2, False: 549]
  ------------------
 2615|      2|        case 89: return 88.913418000;
  ------------------
  |  Branch (2615:9): [True: 2, False: 549]
  ------------------
 2616|      2|        case 90: return 89.911265000;
  ------------------
  |  Branch (2616:9): [True: 2, False: 549]
  ------------------
 2617|      6|        case 91: return 90.906996000;
  ------------------
  |  Branch (2617:9): [True: 6, False: 545]
  ------------------
 2618|      2|        case 92: return 91.907194000;
  ------------------
  |  Branch (2618:9): [True: 2, False: 549]
  ------------------
 2619|    143|        case 0: case 93: return 92.906378000;
  ------------------
  |  Branch (2619:9): [True: 137, False: 414]
  |  Branch (2619:17): [True: 6, False: 545]
  ------------------
 2620|      2|        case 94: return 93.907283000;
  ------------------
  |  Branch (2620:9): [True: 2, False: 549]
  ------------------
 2621|      2|        case 95: return 94.906835000;
  ------------------
  |  Branch (2621:9): [True: 2, False: 549]
  ------------------
 2622|      2|        case 96: return 95.908101000;
  ------------------
  |  Branch (2622:9): [True: 2, False: 549]
  ------------------
 2623|      2|        case 97: return 96.908098000;
  ------------------
  |  Branch (2623:9): [True: 2, False: 549]
  ------------------
 2624|      6|        case 98: return 97.910328000;
  ------------------
  |  Branch (2624:9): [True: 6, False: 545]
  ------------------
 2625|      6|        case 99: return 98.911618000;
  ------------------
  |  Branch (2625:9): [True: 6, False: 545]
  ------------------
 2626|     12|        case 100: return 99.914182000;
  ------------------
  |  Branch (2626:9): [True: 12, False: 539]
  ------------------
 2627|     16|        case 101: return 100.915252000;
  ------------------
  |  Branch (2627:9): [True: 16, False: 535]
  ------------------
 2628|      8|        case 102: return 101.918040000;
  ------------------
  |  Branch (2628:9): [True: 8, False: 543]
  ------------------
 2629|      8|        case 103: return 102.919140000;
  ------------------
  |  Branch (2629:9): [True: 8, False: 543]
  ------------------
 2630|     18|        case 104: return 103.922460000;
  ------------------
  |  Branch (2630:9): [True: 18, False: 533]
  ------------------
 2631|    110|        case 105: return 104.923940000;
  ------------------
  |  Branch (2631:9): [True: 110, False: 441]
  ------------------
 2632|      8|        case 106: return 105.927970000;
  ------------------
  |  Branch (2632:9): [True: 8, False: 543]
  ------------------
 2633|     10|        case 107: return 106.930310000;
  ------------------
  |  Branch (2633:9): [True: 10, False: 541]
  ------------------
 2634|     10|        case 108: return 107.934840000;
  ------------------
  |  Branch (2634:9): [True: 10, False: 541]
  ------------------
 2635|     14|        case 109: return 108.937630000;
  ------------------
  |  Branch (2635:9): [True: 14, False: 537]
  ------------------
 2636|      6|        case 110: return 109.942440000;
  ------------------
  |  Branch (2636:9): [True: 6, False: 545]
  ------------------
 2637|      6|        case 111: return 110.945650000;
  ------------------
  |  Branch (2637:9): [True: 6, False: 545]
  ------------------
 2638|      2|        case 112: return 111.950830000;
  ------------------
  |  Branch (2638:9): [True: 2, False: 549]
  ------------------
 2639|      6|        case 113: return 112.954700000;
  ------------------
  |  Branch (2639:9): [True: 6, False: 545]
  ------------------
 2640|    551|        }
 2641|    100|        break;
 2642|    360|      case 42:
  ------------------
  |  Branch (2642:7): [True: 360, False: 414k]
  ------------------
 2643|    360|        switch (isotope) {
  ------------------
  |  Branch (2643:17): [True: 336, False: 24]
  ------------------
 2644|      8|        case 83: return 82.948740000;
  ------------------
  |  Branch (2644:9): [True: 8, False: 352]
  ------------------
 2645|      6|        case 84: return 83.940090000;
  ------------------
  |  Branch (2645:9): [True: 6, False: 354]
  ------------------
 2646|      2|        case 85: return 84.936550000;
  ------------------
  |  Branch (2646:9): [True: 2, False: 358]
  ------------------
 2647|     28|        case 86: return 85.930700000;
  ------------------
  |  Branch (2647:9): [True: 28, False: 332]
  ------------------
 2648|      6|        case 87: return 86.927330000;
  ------------------
  |  Branch (2648:9): [True: 6, False: 354]
  ------------------
 2649|      6|        case 88: return 87.921953000;
  ------------------
  |  Branch (2649:9): [True: 6, False: 354]
  ------------------
 2650|      6|        case 89: return 88.919480000;
  ------------------
  |  Branch (2650:9): [True: 6, False: 354]
  ------------------
 2651|      2|        case 90: return 89.913937000;
  ------------------
  |  Branch (2651:9): [True: 2, False: 358]
  ------------------
 2652|      2|        case 91: return 90.911750000;
  ------------------
  |  Branch (2652:9): [True: 2, False: 358]
  ------------------
 2653|      2|        case 92: return 91.906811000;
  ------------------
  |  Branch (2653:9): [True: 2, False: 358]
  ------------------
 2654|      6|        case 93: return 92.906813000;
  ------------------
  |  Branch (2654:9): [True: 6, False: 354]
  ------------------
 2655|      6|        case 94: return 93.905088000;
  ------------------
  |  Branch (2655:9): [True: 6, False: 354]
  ------------------
 2656|      8|        case 95: return 94.905842000;
  ------------------
  |  Branch (2656:9): [True: 8, False: 352]
  ------------------
 2657|      6|        case 96: return 95.904679000;
  ------------------
  |  Branch (2657:9): [True: 6, False: 354]
  ------------------
 2658|      4|        case 97: return 96.906021000;
  ------------------
  |  Branch (2658:9): [True: 4, False: 356]
  ------------------
 2659|    130|        case 0: case 98: return 97.905408000;
  ------------------
  |  Branch (2659:9): [True: 128, False: 232]
  |  Branch (2659:17): [True: 2, False: 358]
  ------------------
 2660|      2|        case 99: return 98.907711000;
  ------------------
  |  Branch (2660:9): [True: 2, False: 358]
  ------------------
 2661|      2|        case 100: return 99.907477000;
  ------------------
  |  Branch (2661:9): [True: 2, False: 358]
  ------------------
 2662|      6|        case 101: return 100.910347000;
  ------------------
  |  Branch (2662:9): [True: 6, False: 354]
  ------------------
 2663|      8|        case 102: return 101.910297000;
  ------------------
  |  Branch (2663:9): [True: 8, False: 352]
  ------------------
 2664|      8|        case 103: return 102.913210000;
  ------------------
  |  Branch (2664:9): [True: 8, False: 352]
  ------------------
 2665|      6|        case 104: return 103.913760000;
  ------------------
  |  Branch (2665:9): [True: 6, False: 354]
  ------------------
 2666|     14|        case 105: return 104.916970000;
  ------------------
  |  Branch (2666:9): [True: 14, False: 346]
  ------------------
 2667|      6|        case 106: return 105.918137000;
  ------------------
  |  Branch (2667:9): [True: 6, False: 354]
  ------------------
 2668|      6|        case 107: return 106.921690000;
  ------------------
  |  Branch (2668:9): [True: 6, False: 354]
  ------------------
 2669|      2|        case 108: return 107.923450000;
  ------------------
  |  Branch (2669:9): [True: 2, False: 358]
  ------------------
 2670|      6|        case 109: return 108.927810000;
  ------------------
  |  Branch (2670:9): [True: 6, False: 354]
  ------------------
 2671|      6|        case 110: return 109.929730000;
  ------------------
  |  Branch (2671:9): [True: 6, False: 354]
  ------------------
 2672|     14|        case 111: return 110.934410000;
  ------------------
  |  Branch (2672:9): [True: 14, False: 346]
  ------------------
 2673|      8|        case 112: return 111.936840000;
  ------------------
  |  Branch (2673:9): [True: 8, False: 352]
  ------------------
 2674|      2|        case 113: return 112.941880000;
  ------------------
  |  Branch (2674:9): [True: 2, False: 358]
  ------------------
 2675|      6|        case 114: return 113.944920000;
  ------------------
  |  Branch (2675:9): [True: 6, False: 354]
  ------------------
 2676|      6|        case 115: return 114.950290000;
  ------------------
  |  Branch (2676:9): [True: 6, False: 354]
  ------------------
 2677|    360|        }
 2678|     24|        break;
 2679|    445|      case 43:
  ------------------
  |  Branch (2679:7): [True: 445, False: 414k]
  ------------------
 2680|    445|        switch (isotope) {
  ------------------
  |  Branch (2680:17): [True: 425, False: 20]
  ------------------
 2681|      2|        case 85: return 84.948830000;
  ------------------
  |  Branch (2681:9): [True: 2, False: 443]
  ------------------
 2682|      2|        case 86: return 85.942880000;
  ------------------
  |  Branch (2682:9): [True: 2, False: 443]
  ------------------
 2683|      2|        case 87: return 86.936530000;
  ------------------
  |  Branch (2683:9): [True: 2, False: 443]
  ------------------
 2684|     12|        case 88: return 87.932680000;
  ------------------
  |  Branch (2684:9): [True: 12, False: 433]
  ------------------
 2685|      2|        case 89: return 88.927170000;
  ------------------
  |  Branch (2685:9): [True: 2, False: 443]
  ------------------
 2686|      2|        case 90: return 89.923560000;
  ------------------
  |  Branch (2686:9): [True: 2, False: 443]
  ------------------
 2687|     18|        case 91: return 90.918430000;
  ------------------
  |  Branch (2687:9): [True: 18, False: 427]
  ------------------
 2688|      2|        case 92: return 91.915260000;
  ------------------
  |  Branch (2688:9): [True: 2, False: 443]
  ------------------
 2689|      2|        case 93: return 92.910249000;
  ------------------
  |  Branch (2689:9): [True: 2, False: 443]
  ------------------
 2690|      2|        case 94: return 93.909657000;
  ------------------
  |  Branch (2690:9): [True: 2, False: 443]
  ------------------
 2691|      6|        case 95: return 94.907657000;
  ------------------
  |  Branch (2691:9): [True: 6, False: 439]
  ------------------
 2692|      6|        case 96: return 95.907871000;
  ------------------
  |  Branch (2692:9): [True: 6, False: 439]
  ------------------
 2693|     12|        case 97: return 96.906365000;
  ------------------
  |  Branch (2693:9): [True: 12, False: 433]
  ------------------
 2694|    231|        case 0: case 98: return 97.907216000;
  ------------------
  |  Branch (2694:9): [True: 225, False: 220]
  |  Branch (2694:17): [True: 6, False: 439]
  ------------------
 2695|      8|        case 99: return 98.906254000;
  ------------------
  |  Branch (2695:9): [True: 8, False: 437]
  ------------------
 2696|     16|        case 100: return 99.907657000;
  ------------------
  |  Branch (2696:9): [True: 16, False: 429]
  ------------------
 2697|      2|        case 101: return 100.907315000;
  ------------------
  |  Branch (2697:9): [True: 2, False: 443]
  ------------------
 2698|      2|        case 102: return 101.909215000;
  ------------------
  |  Branch (2698:9): [True: 2, False: 443]
  ------------------
 2699|      6|        case 103: return 102.909181000;
  ------------------
  |  Branch (2699:9): [True: 6, False: 439]
  ------------------
 2700|     12|        case 104: return 103.911450000;
  ------------------
  |  Branch (2700:9): [True: 12, False: 433]
  ------------------
 2701|      2|        case 105: return 104.911660000;
  ------------------
  |  Branch (2701:9): [True: 2, False: 443]
  ------------------
 2702|      6|        case 106: return 105.914358000;
  ------------------
  |  Branch (2702:9): [True: 6, False: 439]
  ------------------
 2703|      6|        case 107: return 106.915080000;
  ------------------
  |  Branch (2703:9): [True: 6, False: 439]
  ------------------
 2704|      8|        case 108: return 107.918460000;
  ------------------
  |  Branch (2704:9): [True: 8, False: 437]
  ------------------
 2705|      8|        case 109: return 108.919980000;
  ------------------
  |  Branch (2705:9): [True: 8, False: 437]
  ------------------
 2706|      6|        case 110: return 109.923820000;
  ------------------
  |  Branch (2706:9): [True: 6, False: 439]
  ------------------
 2707|      8|        case 111: return 110.925690000;
  ------------------
  |  Branch (2707:9): [True: 8, False: 437]
  ------------------
 2708|      2|        case 112: return 111.929150000;
  ------------------
  |  Branch (2708:9): [True: 2, False: 443]
  ------------------
 2709|      6|        case 113: return 112.931590000;
  ------------------
  |  Branch (2709:9): [True: 6, False: 439]
  ------------------
 2710|      6|        case 114: return 113.935880000;
  ------------------
  |  Branch (2710:9): [True: 6, False: 439]
  ------------------
 2711|      2|        case 115: return 114.938690000;
  ------------------
  |  Branch (2711:9): [True: 2, False: 443]
  ------------------
 2712|      6|        case 116: return 115.943370000;
  ------------------
  |  Branch (2712:9): [True: 6, False: 439]
  ------------------
 2713|      6|        case 117: return 116.946480000;
  ------------------
  |  Branch (2713:9): [True: 6, False: 439]
  ------------------
 2714|      6|        case 118: return 117.951480000;
  ------------------
  |  Branch (2714:9): [True: 6, False: 439]
  ------------------
 2715|    445|        }
 2716|     20|        break;
 2717|    271|      case 44:
  ------------------
  |  Branch (2717:7): [True: 271, False: 414k]
  ------------------
 2718|    271|        switch (isotope) {
  ------------------
  |  Branch (2718:17): [True: 263, False: 8]
  ------------------
 2719|      2|        case 87: return 86.949180000;
  ------------------
  |  Branch (2719:9): [True: 2, False: 269]
  ------------------
 2720|      2|        case 88: return 87.940260000;
  ------------------
  |  Branch (2720:9): [True: 2, False: 269]
  ------------------
 2721|      6|        case 89: return 88.936110000;
  ------------------
  |  Branch (2721:9): [True: 6, False: 265]
  ------------------
 2722|      2|        case 90: return 89.929890000;
  ------------------
  |  Branch (2722:9): [True: 2, False: 269]
  ------------------
 2723|      8|        case 91: return 90.926290000;
  ------------------
  |  Branch (2723:9): [True: 8, False: 263]
  ------------------
 2724|      2|        case 92: return 91.920120000;
  ------------------
  |  Branch (2724:9): [True: 2, False: 269]
  ------------------
 2725|      8|        case 93: return 92.917050000;
  ------------------
  |  Branch (2725:9): [True: 8, False: 263]
  ------------------
 2726|      2|        case 94: return 93.911360000;
  ------------------
  |  Branch (2726:9): [True: 2, False: 269]
  ------------------
 2727|      6|        case 95: return 94.910413000;
  ------------------
  |  Branch (2727:9): [True: 6, False: 265]
  ------------------
 2728|      2|        case 96: return 95.907598000;
  ------------------
  |  Branch (2728:9): [True: 2, False: 269]
  ------------------
 2729|      6|        case 97: return 96.907555000;
  ------------------
  |  Branch (2729:9): [True: 6, False: 265]
  ------------------
 2730|      2|        case 98: return 97.905287000;
  ------------------
  |  Branch (2730:9): [True: 2, False: 269]
  ------------------
 2731|      2|        case 99: return 98.905939000;
  ------------------
  |  Branch (2731:9): [True: 2, False: 269]
  ------------------
 2732|      2|        case 100: return 99.904219000;
  ------------------
  |  Branch (2732:9): [True: 2, False: 269]
  ------------------
 2733|      2|        case 101: return 100.905582000;
  ------------------
  |  Branch (2733:9): [True: 2, False: 269]
  ------------------
 2734|    109|        case 0: case 102: return 101.904349000;
  ------------------
  |  Branch (2734:9): [True: 103, False: 168]
  |  Branch (2734:17): [True: 6, False: 265]
  ------------------
 2735|      4|        case 103: return 102.906323000;
  ------------------
  |  Branch (2735:9): [True: 4, False: 267]
  ------------------
 2736|      2|        case 104: return 103.905433000;
  ------------------
  |  Branch (2736:9): [True: 2, False: 269]
  ------------------
 2737|      2|        case 105: return 104.907753000;
  ------------------
  |  Branch (2737:9): [True: 2, False: 269]
  ------------------
 2738|      2|        case 106: return 105.907329000;
  ------------------
  |  Branch (2738:9): [True: 2, False: 269]
  ------------------
 2739|      6|        case 107: return 106.909910000;
  ------------------
  |  Branch (2739:9): [True: 6, False: 265]
  ------------------
 2740|      6|        case 108: return 107.910170000;
  ------------------
  |  Branch (2740:9): [True: 6, False: 265]
  ------------------
 2741|      2|        case 109: return 108.913200000;
  ------------------
  |  Branch (2741:9): [True: 2, False: 269]
  ------------------
 2742|      8|        case 110: return 109.914140000;
  ------------------
  |  Branch (2742:9): [True: 8, False: 263]
  ------------------
 2743|     34|        case 111: return 110.917700000;
  ------------------
  |  Branch (2743:9): [True: 34, False: 237]
  ------------------
 2744|      2|        case 112: return 111.918970000;
  ------------------
  |  Branch (2744:9): [True: 2, False: 269]
  ------------------
 2745|      6|        case 113: return 112.922490000;
  ------------------
  |  Branch (2745:9): [True: 6, False: 265]
  ------------------
 2746|      2|        case 114: return 113.924280000;
  ------------------
  |  Branch (2746:9): [True: 2, False: 269]
  ------------------
 2747|      2|        case 115: return 114.928690000;
  ------------------
  |  Branch (2747:9): [True: 2, False: 269]
  ------------------
 2748|      6|        case 116: return 115.930810000;
  ------------------
  |  Branch (2748:9): [True: 6, False: 265]
  ------------------
 2749|      6|        case 117: return 116.935580000;
  ------------------
  |  Branch (2749:9): [True: 6, False: 265]
  ------------------
 2750|      2|        case 118: return 117.937820000;
  ------------------
  |  Branch (2750:9): [True: 2, False: 269]
  ------------------
 2751|      2|        case 119: return 118.942840000;
  ------------------
  |  Branch (2751:9): [True: 2, False: 269]
  ------------------
 2752|      6|        case 120: return 119.945310000;
  ------------------
  |  Branch (2752:9): [True: 6, False: 265]
  ------------------
 2753|    271|        }
 2754|      8|        break;
 2755|    184|      case 45:
  ------------------
  |  Branch (2755:7): [True: 184, False: 414k]
  ------------------
 2756|    184|        switch (isotope) {
  ------------------
  |  Branch (2756:17): [True: 160, False: 24]
  ------------------
 2757|      2|        case 89: return 88.948840000;
  ------------------
  |  Branch (2757:9): [True: 2, False: 182]
  ------------------
 2758|      2|        case 90: return 89.942870000;
  ------------------
  |  Branch (2758:9): [True: 2, False: 182]
  ------------------
 2759|      2|        case 91: return 90.936550000;
  ------------------
  |  Branch (2759:9): [True: 2, False: 182]
  ------------------
 2760|      2|        case 92: return 91.931980000;
  ------------------
  |  Branch (2760:9): [True: 2, False: 182]
  ------------------
 2761|      2|        case 93: return 92.925740000;
  ------------------
  |  Branch (2761:9): [True: 2, False: 182]
  ------------------
 2762|      2|        case 94: return 93.921700000;
  ------------------
  |  Branch (2762:9): [True: 2, False: 182]
  ------------------
 2763|      2|        case 95: return 94.915900000;
  ------------------
  |  Branch (2763:9): [True: 2, False: 182]
  ------------------
 2764|      2|        case 96: return 95.914461000;
  ------------------
  |  Branch (2764:9): [True: 2, False: 182]
  ------------------
 2765|      6|        case 97: return 96.911340000;
  ------------------
  |  Branch (2765:9): [True: 6, False: 178]
  ------------------
 2766|      2|        case 98: return 97.910708000;
  ------------------
  |  Branch (2766:9): [True: 2, False: 182]
  ------------------
 2767|      2|        case 99: return 98.908132000;
  ------------------
  |  Branch (2767:9): [True: 2, False: 182]
  ------------------
 2768|      6|        case 100: return 99.908122000;
  ------------------
  |  Branch (2768:9): [True: 6, False: 178]
  ------------------
 2769|      6|        case 101: return 100.906164000;
  ------------------
  |  Branch (2769:9): [True: 6, False: 178]
  ------------------
 2770|      2|        case 102: return 101.906843000;
  ------------------
  |  Branch (2770:9): [True: 2, False: 182]
  ------------------
 2771|     46|        case 0: case 103: return 102.905504000;
  ------------------
  |  Branch (2771:9): [True: 38, False: 146]
  |  Branch (2771:17): [True: 8, False: 176]
  ------------------
 2772|      6|        case 104: return 103.906656000;
  ------------------
  |  Branch (2772:9): [True: 6, False: 178]
  ------------------
 2773|      2|        case 105: return 104.905694000;
  ------------------
  |  Branch (2773:9): [True: 2, False: 182]
  ------------------
 2774|      2|        case 106: return 105.907287000;
  ------------------
  |  Branch (2774:9): [True: 2, False: 182]
  ------------------
 2775|      2|        case 107: return 106.906748000;
  ------------------
  |  Branch (2775:9): [True: 2, False: 182]
  ------------------
 2776|      2|        case 108: return 107.908730000;
  ------------------
  |  Branch (2776:9): [True: 2, False: 182]
  ------------------
 2777|      6|        case 109: return 108.908737000;
  ------------------
  |  Branch (2777:9): [True: 6, False: 178]
  ------------------
 2778|      6|        case 110: return 109.911140000;
  ------------------
  |  Branch (2778:9): [True: 6, False: 178]
  ------------------
 2779|      6|        case 111: return 110.911590000;
  ------------------
  |  Branch (2779:9): [True: 6, False: 178]
  ------------------
 2780|      2|        case 112: return 111.914390000;
  ------------------
  |  Branch (2780:9): [True: 2, False: 182]
  ------------------
 2781|      2|        case 113: return 112.915530000;
  ------------------
  |  Branch (2781:9): [True: 2, False: 182]
  ------------------
 2782|      2|        case 114: return 113.918810000;
  ------------------
  |  Branch (2782:9): [True: 2, False: 182]
  ------------------
 2783|      2|        case 115: return 114.920330000;
  ------------------
  |  Branch (2783:9): [True: 2, False: 182]
  ------------------
 2784|      6|        case 116: return 115.924060000;
  ------------------
  |  Branch (2784:9): [True: 6, False: 178]
  ------------------
 2785|      6|        case 117: return 116.925980000;
  ------------------
  |  Branch (2785:9): [True: 6, False: 178]
  ------------------
 2786|      6|        case 118: return 117.930070000;
  ------------------
  |  Branch (2786:9): [True: 6, False: 178]
  ------------------
 2787|      6|        case 119: return 118.932110000;
  ------------------
  |  Branch (2787:9): [True: 6, False: 178]
  ------------------
 2788|      2|        case 120: return 119.936410000;
  ------------------
  |  Branch (2788:9): [True: 2, False: 182]
  ------------------
 2789|      6|        case 121: return 120.938720000;
  ------------------
  |  Branch (2789:9): [True: 6, False: 178]
  ------------------
 2790|      2|        case 122: return 121.943210000;
  ------------------
  |  Branch (2790:9): [True: 2, False: 182]
  ------------------
 2791|    184|        }
 2792|     24|        break;
 2793|    341|      case 46:
  ------------------
  |  Branch (2793:7): [True: 341, False: 414k]
  ------------------
 2794|    341|        switch (isotope) {
  ------------------
  |  Branch (2794:17): [True: 317, False: 24]
  ------------------
 2795|     14|        case 91: return 90.949110000;
  ------------------
  |  Branch (2795:9): [True: 14, False: 327]
  ------------------
 2796|      2|        case 92: return 91.940420000;
  ------------------
  |  Branch (2796:9): [True: 2, False: 339]
  ------------------
 2797|      6|        case 93: return 92.935910000;
  ------------------
  |  Branch (2797:9): [True: 6, False: 335]
  ------------------
 2798|     10|        case 94: return 93.928770000;
  ------------------
  |  Branch (2798:9): [True: 10, False: 331]
  ------------------
 2799|      6|        case 95: return 94.924690000;
  ------------------
  |  Branch (2799:9): [True: 6, False: 335]
  ------------------
 2800|     18|        case 96: return 95.918160000;
  ------------------
  |  Branch (2800:9): [True: 18, False: 323]
  ------------------
 2801|     14|        case 97: return 96.916480000;
  ------------------
  |  Branch (2801:9): [True: 14, False: 327]
  ------------------
 2802|     18|        case 98: return 97.912721000;
  ------------------
  |  Branch (2802:9): [True: 18, False: 323]
  ------------------
 2803|      8|        case 99: return 98.911768000;
  ------------------
  |  Branch (2803:9): [True: 8, False: 333]
  ------------------
 2804|      6|        case 100: return 99.908506000;
  ------------------
  |  Branch (2804:9): [True: 6, False: 335]
  ------------------
 2805|      6|        case 101: return 100.908289000;
  ------------------
  |  Branch (2805:9): [True: 6, False: 335]
  ------------------
 2806|      2|        case 102: return 101.905609000;
  ------------------
  |  Branch (2806:9): [True: 2, False: 339]
  ------------------
 2807|      2|        case 103: return 102.906087000;
  ------------------
  |  Branch (2807:9): [True: 2, False: 339]
  ------------------
 2808|      6|        case 104: return 103.904036000;
  ------------------
  |  Branch (2808:9): [True: 6, False: 335]
  ------------------
 2809|      4|        case 105: return 104.905085000;
  ------------------
  |  Branch (2809:9): [True: 4, False: 337]
  ------------------
 2810|    121|        case 0: case 106: return 105.903486000;
  ------------------
  |  Branch (2810:9): [True: 115, False: 226]
  |  Branch (2810:17): [True: 6, False: 335]
  ------------------
 2811|      2|        case 107: return 106.905133000;
  ------------------
  |  Branch (2811:9): [True: 2, False: 339]
  ------------------
 2812|      4|        case 108: return 107.903892000;
  ------------------
  |  Branch (2812:9): [True: 4, False: 337]
  ------------------
 2813|      2|        case 109: return 108.905950000;
  ------------------
  |  Branch (2813:9): [True: 2, False: 339]
  ------------------
 2814|      2|        case 110: return 109.905153000;
  ------------------
  |  Branch (2814:9): [True: 2, False: 339]
  ------------------
 2815|      2|        case 111: return 110.907671000;
  ------------------
  |  Branch (2815:9): [True: 2, False: 339]
  ------------------
 2816|      4|        case 112: return 111.907314000;
  ------------------
  |  Branch (2816:9): [True: 4, False: 337]
  ------------------
 2817|      8|        case 113: return 112.910150000;
  ------------------
  |  Branch (2817:9): [True: 8, False: 333]
  ------------------
 2818|      2|        case 114: return 113.910363000;
  ------------------
  |  Branch (2818:9): [True: 2, False: 339]
  ------------------
 2819|      6|        case 115: return 114.913680000;
  ------------------
  |  Branch (2819:9): [True: 6, False: 335]
  ------------------
 2820|      6|        case 116: return 115.914160000;
  ------------------
  |  Branch (2820:9): [True: 6, False: 335]
  ------------------
 2821|      6|        case 117: return 116.917840000;
  ------------------
  |  Branch (2821:9): [True: 6, False: 335]
  ------------------
 2822|      2|        case 118: return 117.918980000;
  ------------------
  |  Branch (2822:9): [True: 2, False: 339]
  ------------------
 2823|      2|        case 119: return 118.923110000;
  ------------------
  |  Branch (2823:9): [True: 2, False: 339]
  ------------------
 2824|     10|        case 120: return 119.924690000;
  ------------------
  |  Branch (2824:9): [True: 10, False: 331]
  ------------------
 2825|      2|        case 121: return 120.928870000;
  ------------------
  |  Branch (2825:9): [True: 2, False: 339]
  ------------------
 2826|      6|        case 122: return 121.930550000;
  ------------------
  |  Branch (2826:9): [True: 6, False: 335]
  ------------------
 2827|      6|        case 123: return 122.934930000;
  ------------------
  |  Branch (2827:9): [True: 6, False: 335]
  ------------------
 2828|      2|        case 124: return 123.936880000;
  ------------------
  |  Branch (2828:9): [True: 2, False: 339]
  ------------------
 2829|    341|        }
 2830|     24|        break;
 2831|    398|      case 47:
  ------------------
  |  Branch (2831:7): [True: 398, False: 414k]
  ------------------
 2832|    398|        switch (isotope) {
  ------------------
  |  Branch (2832:17): [True: 300, False: 98]
  ------------------
 2833|      2|        case 93: return 92.949780000;
  ------------------
  |  Branch (2833:9): [True: 2, False: 396]
  ------------------
 2834|      8|        case 94: return 93.942780000;
  ------------------
  |  Branch (2834:9): [True: 8, False: 390]
  ------------------
 2835|      2|        case 95: return 94.935480000;
  ------------------
  |  Branch (2835:9): [True: 2, False: 396]
  ------------------
 2836|      2|        case 96: return 95.930680000;
  ------------------
  |  Branch (2836:9): [True: 2, False: 396]
  ------------------
 2837|      6|        case 97: return 96.923970000;
  ------------------
  |  Branch (2837:9): [True: 6, False: 392]
  ------------------
 2838|      2|        case 98: return 97.921570000;
  ------------------
  |  Branch (2838:9): [True: 2, False: 396]
  ------------------
 2839|      2|        case 99: return 98.917600000;
  ------------------
  |  Branch (2839:9): [True: 2, False: 396]
  ------------------
 2840|     10|        case 100: return 99.916100000;
  ------------------
  |  Branch (2840:9): [True: 10, False: 388]
  ------------------
 2841|      2|        case 101: return 100.912800000;
  ------------------
  |  Branch (2841:9): [True: 2, False: 396]
  ------------------
 2842|      2|        case 102: return 101.911690000;
  ------------------
  |  Branch (2842:9): [True: 2, False: 396]
  ------------------
 2843|      2|        case 103: return 102.908973000;
  ------------------
  |  Branch (2843:9): [True: 2, False: 396]
  ------------------
 2844|     10|        case 104: return 103.908629000;
  ------------------
  |  Branch (2844:9): [True: 10, False: 388]
  ------------------
 2845|      2|        case 105: return 104.906529000;
  ------------------
  |  Branch (2845:9): [True: 2, False: 396]
  ------------------
 2846|      2|        case 106: return 105.906669000;
  ------------------
  |  Branch (2846:9): [True: 2, False: 396]
  ------------------
 2847|    106|        case 0: case 107: return 106.905097000;
  ------------------
  |  Branch (2847:9): [True: 104, False: 294]
  |  Branch (2847:17): [True: 2, False: 396]
  ------------------
 2848|      6|        case 108: return 107.905956000;
  ------------------
  |  Branch (2848:9): [True: 6, False: 392]
  ------------------
 2849|      4|        case 109: return 108.904752000;
  ------------------
  |  Branch (2849:9): [True: 4, False: 394]
  ------------------
 2850|      2|        case 110: return 109.906107000;
  ------------------
  |  Branch (2850:9): [True: 2, False: 396]
  ------------------
 2851|      8|        case 111: return 110.905291000;
  ------------------
  |  Branch (2851:9): [True: 8, False: 390]
  ------------------
 2852|      2|        case 112: return 111.907005000;
  ------------------
  |  Branch (2852:9): [True: 2, False: 396]
  ------------------
 2853|      2|        case 113: return 112.906567000;
  ------------------
  |  Branch (2853:9): [True: 2, False: 396]
  ------------------
 2854|     22|        case 114: return 113.908804000;
  ------------------
  |  Branch (2854:9): [True: 22, False: 376]
  ------------------
 2855|      6|        case 115: return 114.908760000;
  ------------------
  |  Branch (2855:9): [True: 6, False: 392]
  ------------------
 2856|      6|        case 116: return 115.911360000;
  ------------------
  |  Branch (2856:9): [True: 6, False: 392]
  ------------------
 2857|      2|        case 117: return 116.911680000;
  ------------------
  |  Branch (2857:9): [True: 2, False: 396]
  ------------------
 2858|      6|        case 118: return 117.914580000;
  ------------------
  |  Branch (2858:9): [True: 6, False: 392]
  ------------------
 2859|      2|        case 119: return 118.915670000;
  ------------------
  |  Branch (2859:9): [True: 2, False: 396]
  ------------------
 2860|      2|        case 120: return 119.918790000;
  ------------------
  |  Branch (2860:9): [True: 2, False: 396]
  ------------------
 2861|      8|        case 121: return 120.919850000;
  ------------------
  |  Branch (2861:9): [True: 8, False: 390]
  ------------------
 2862|      6|        case 122: return 121.923530000;
  ------------------
  |  Branch (2862:9): [True: 6, False: 392]
  ------------------
 2863|      8|        case 123: return 122.924900000;
  ------------------
  |  Branch (2863:9): [True: 8, False: 390]
  ------------------
 2864|      8|        case 124: return 123.928640000;
  ------------------
  |  Branch (2864:9): [True: 8, False: 390]
  ------------------
 2865|     14|        case 125: return 124.930430000;
  ------------------
  |  Branch (2865:9): [True: 14, False: 384]
  ------------------
 2866|      4|        case 126: return 125.934500000;
  ------------------
  |  Branch (2866:9): [True: 4, False: 394]
  ------------------
 2867|     10|        case 127: return 126.936770000;
  ------------------
  |  Branch (2867:9): [True: 10, False: 388]
  ------------------
 2868|      2|        case 128: return 127.941170000;
  ------------------
  |  Branch (2868:9): [True: 2, False: 396]
  ------------------
 2869|      2|        case 129: return 128.943690000;
  ------------------
  |  Branch (2869:9): [True: 2, False: 396]
  ------------------
 2870|      8|        case 130: return 129.950450000;
  ------------------
  |  Branch (2870:9): [True: 8, False: 390]
  ------------------
 2871|    398|        }
 2872|     98|        break;
 2873|    843|      case 48:
  ------------------
  |  Branch (2873:7): [True: 843, False: 414k]
  ------------------
 2874|    843|        switch (isotope) {
  ------------------
  |  Branch (2874:17): [True: 819, False: 24]
  ------------------
 2875|     10|        case 95: return 94.949870000;
  ------------------
  |  Branch (2875:9): [True: 10, False: 833]
  ------------------
 2876|      6|        case 96: return 95.939770000;
  ------------------
  |  Branch (2876:9): [True: 6, False: 837]
  ------------------
 2877|      2|        case 97: return 96.934940000;
  ------------------
  |  Branch (2877:9): [True: 2, False: 841]
  ------------------
 2878|      6|        case 98: return 97.927400000;
  ------------------
  |  Branch (2878:9): [True: 6, False: 837]
  ------------------
 2879|      6|        case 99: return 98.925010000;
  ------------------
  |  Branch (2879:9): [True: 6, False: 837]
  ------------------
 2880|      2|        case 100: return 99.920290000;
  ------------------
  |  Branch (2880:9): [True: 2, False: 841]
  ------------------
 2881|      2|        case 101: return 100.918680000;
  ------------------
  |  Branch (2881:9): [True: 2, False: 841]
  ------------------
 2882|      2|        case 102: return 101.914460000;
  ------------------
  |  Branch (2882:9): [True: 2, False: 841]
  ------------------
 2883|      6|        case 103: return 102.913419000;
  ------------------
  |  Branch (2883:9): [True: 6, False: 837]
  ------------------
 2884|      2|        case 104: return 103.909849000;
  ------------------
  |  Branch (2884:9): [True: 2, False: 841]
  ------------------
 2885|      6|        case 105: return 104.909468000;
  ------------------
  |  Branch (2885:9): [True: 6, False: 837]
  ------------------
 2886|     10|        case 106: return 105.906459000;
  ------------------
  |  Branch (2886:9): [True: 10, False: 833]
  ------------------
 2887|      6|        case 107: return 106.906618000;
  ------------------
  |  Branch (2887:9): [True: 6, False: 837]
  ------------------
 2888|      6|        case 108: return 107.904184000;
  ------------------
  |  Branch (2888:9): [True: 6, False: 837]
  ------------------
 2889|      2|        case 109: return 108.904982000;
  ------------------
  |  Branch (2889:9): [True: 2, False: 841]
  ------------------
 2890|      2|        case 110: return 109.903002000;
  ------------------
  |  Branch (2890:9): [True: 2, False: 841]
  ------------------
 2891|      2|        case 111: return 110.904178000;
  ------------------
  |  Branch (2891:9): [True: 2, False: 841]
  ------------------
 2892|     20|        case 112: return 111.902757000;
  ------------------
  |  Branch (2892:9): [True: 20, False: 823]
  ------------------
 2893|      4|        case 113: return 112.904401000;
  ------------------
  |  Branch (2893:9): [True: 4, False: 839]
  ------------------
 2894|    663|        case 0: case 114: return 113.903358000;
  ------------------
  |  Branch (2894:9): [True: 661, False: 182]
  |  Branch (2894:17): [True: 2, False: 841]
  ------------------
 2895|      2|        case 115: return 114.905431000;
  ------------------
  |  Branch (2895:9): [True: 2, False: 841]
  ------------------
 2896|      2|        case 116: return 115.904756000;
  ------------------
  |  Branch (2896:9): [True: 2, False: 841]
  ------------------
 2897|      2|        case 117: return 116.907219000;
  ------------------
  |  Branch (2897:9): [True: 2, False: 841]
  ------------------
 2898|      6|        case 118: return 117.906915000;
  ------------------
  |  Branch (2898:9): [True: 6, False: 837]
  ------------------
 2899|      2|        case 119: return 118.909920000;
  ------------------
  |  Branch (2899:9): [True: 2, False: 841]
  ------------------
 2900|      2|        case 120: return 119.909850000;
  ------------------
  |  Branch (2900:9): [True: 2, False: 841]
  ------------------
 2901|      2|        case 121: return 120.912980000;
  ------------------
  |  Branch (2901:9): [True: 2, False: 841]
  ------------------
 2902|      2|        case 122: return 121.913330000;
  ------------------
  |  Branch (2902:9): [True: 2, False: 841]
  ------------------
 2903|      2|        case 123: return 122.917000000;
  ------------------
  |  Branch (2903:9): [True: 2, False: 841]
  ------------------
 2904|      2|        case 124: return 123.917650000;
  ------------------
  |  Branch (2904:9): [True: 2, False: 841]
  ------------------
 2905|      2|        case 125: return 124.921250000;
  ------------------
  |  Branch (2905:9): [True: 2, False: 841]
  ------------------
 2906|      4|        case 126: return 125.922350000;
  ------------------
  |  Branch (2906:9): [True: 4, False: 839]
  ------------------
 2907|      6|        case 127: return 126.926440000;
  ------------------
  |  Branch (2907:9): [True: 6, False: 837]
  ------------------
 2908|      6|        case 128: return 127.927760000;
  ------------------
  |  Branch (2908:9): [True: 6, False: 837]
  ------------------
 2909|      2|        case 129: return 128.932150000;
  ------------------
  |  Branch (2909:9): [True: 2, False: 841]
  ------------------
 2910|      6|        case 130: return 129.933900000;
  ------------------
  |  Branch (2910:9): [True: 6, False: 837]
  ------------------
 2911|      2|        case 131: return 130.940670000;
  ------------------
  |  Branch (2911:9): [True: 2, False: 841]
  ------------------
 2912|      2|        case 132: return 131.945550000;
  ------------------
  |  Branch (2912:9): [True: 2, False: 841]
  ------------------
 2913|    843|        }
 2914|     24|        break;
 2915|    939|      case 49:
  ------------------
  |  Branch (2915:7): [True: 939, False: 414k]
  ------------------
 2916|    939|        switch (isotope) {
  ------------------
  |  Branch (2916:17): [True: 917, False: 22]
  ------------------
 2917|      2|        case 97: return 96.949540000;
  ------------------
  |  Branch (2917:9): [True: 2, False: 937]
  ------------------
 2918|      6|        case 98: return 97.942140000;
  ------------------
  |  Branch (2918:9): [True: 6, False: 933]
  ------------------
 2919|      6|        case 99: return 98.934220000;
  ------------------
  |  Branch (2919:9): [True: 6, False: 933]
  ------------------
 2920|      6|        case 100: return 99.931110000;
  ------------------
  |  Branch (2920:9): [True: 6, False: 933]
  ------------------
 2921|      6|        case 101: return 100.926340000;
  ------------------
  |  Branch (2921:9): [True: 6, False: 933]
  ------------------
 2922|      6|        case 102: return 101.924090000;
  ------------------
  |  Branch (2922:9): [True: 6, False: 933]
  ------------------
 2923|      6|        case 103: return 102.919914000;
  ------------------
  |  Branch (2923:9): [True: 6, False: 933]
  ------------------
 2924|     20|        case 104: return 103.918300000;
  ------------------
  |  Branch (2924:9): [True: 20, False: 919]
  ------------------
 2925|      2|        case 105: return 104.914674000;
  ------------------
  |  Branch (2925:9): [True: 2, False: 937]
  ------------------
 2926|      6|        case 106: return 105.913465000;
  ------------------
  |  Branch (2926:9): [True: 6, False: 933]
  ------------------
 2927|      4|        case 107: return 106.910295000;
  ------------------
  |  Branch (2927:9): [True: 4, False: 935]
  ------------------
 2928|      4|        case 108: return 107.909698000;
  ------------------
  |  Branch (2928:9): [True: 4, False: 935]
  ------------------
 2929|      6|        case 109: return 108.907151000;
  ------------------
  |  Branch (2929:9): [True: 6, False: 933]
  ------------------
 2930|      6|        case 110: return 109.907165000;
  ------------------
  |  Branch (2930:9): [True: 6, False: 933]
  ------------------
 2931|      6|        case 111: return 110.905103000;
  ------------------
  |  Branch (2931:9): [True: 6, False: 933]
  ------------------
 2932|     12|        case 112: return 111.905532000;
  ------------------
  |  Branch (2932:9): [True: 12, False: 927]
  ------------------
 2933|      8|        case 113: return 112.904058000;
  ------------------
  |  Branch (2933:9): [True: 8, False: 931]
  ------------------
 2934|     12|        case 114: return 113.904914000;
  ------------------
  |  Branch (2934:9): [True: 12, False: 927]
  ------------------
 2935|    659|        case 0: case 115: return 114.903878000;
  ------------------
  |  Branch (2935:9): [True: 651, False: 288]
  |  Branch (2935:17): [True: 8, False: 931]
  ------------------
 2936|      6|        case 116: return 115.905260000;
  ------------------
  |  Branch (2936:9): [True: 6, False: 933]
  ------------------
 2937|     14|        case 117: return 116.904514000;
  ------------------
  |  Branch (2937:9): [True: 14, False: 925]
  ------------------
 2938|      6|        case 118: return 117.906354000;
  ------------------
  |  Branch (2938:9): [True: 6, False: 933]
  ------------------
 2939|      2|        case 119: return 118.905845000;
  ------------------
  |  Branch (2939:9): [True: 2, False: 937]
  ------------------
 2940|      2|        case 120: return 119.907960000;
  ------------------
  |  Branch (2940:9): [True: 2, False: 937]
  ------------------
 2941|     18|        case 121: return 120.907846000;
  ------------------
  |  Branch (2941:9): [True: 18, False: 921]
  ------------------
 2942|      2|        case 122: return 121.910280000;
  ------------------
  |  Branch (2942:9): [True: 2, False: 937]
  ------------------
 2943|     20|        case 123: return 122.910438000;
  ------------------
  |  Branch (2943:9): [True: 20, False: 919]
  ------------------
 2944|      6|        case 124: return 123.913180000;
  ------------------
  |  Branch (2944:9): [True: 6, False: 933]
  ------------------
 2945|      2|        case 125: return 124.913600000;
  ------------------
  |  Branch (2945:9): [True: 2, False: 937]
  ------------------
 2946|      2|        case 126: return 125.916460000;
  ------------------
  |  Branch (2946:9): [True: 2, False: 937]
  ------------------
 2947|      2|        case 127: return 126.917350000;
  ------------------
  |  Branch (2947:9): [True: 2, False: 937]
  ------------------
 2948|      2|        case 128: return 127.920170000;
  ------------------
  |  Branch (2948:9): [True: 2, False: 937]
  ------------------
 2949|     14|        case 129: return 128.921700000;
  ------------------
  |  Branch (2949:9): [True: 14, False: 925]
  ------------------
 2950|      6|        case 130: return 129.924970000;
  ------------------
  |  Branch (2950:9): [True: 6, False: 933]
  ------------------
 2951|      6|        case 131: return 130.926850000;
  ------------------
  |  Branch (2951:9): [True: 6, False: 933]
  ------------------
 2952|      6|        case 132: return 131.932990000;
  ------------------
  |  Branch (2952:9): [True: 6, False: 933]
  ------------------
 2953|      6|        case 133: return 132.937810000;
  ------------------
  |  Branch (2953:9): [True: 6, False: 933]
  ------------------
 2954|      6|        case 134: return 133.944150000;
  ------------------
  |  Branch (2954:9): [True: 6, False: 933]
  ------------------
 2955|      6|        case 135: return 134.949330000;
  ------------------
  |  Branch (2955:9): [True: 6, False: 933]
  ------------------
 2956|    939|        }
 2957|     22|        break;
 2958|  1.23k|      case 50:
  ------------------
  |  Branch (2958:7): [True: 1.23k, False: 413k]
  ------------------
 2959|  1.23k|        switch (isotope) {
  ------------------
  |  Branch (2959:17): [True: 1.16k, False: 68]
  ------------------
 2960|     10|        case 99: return 98.949330000;
  ------------------
  |  Branch (2960:9): [True: 10, False: 1.22k]
  ------------------
 2961|      6|        case 100: return 99.939040000;
  ------------------
  |  Branch (2961:9): [True: 6, False: 1.22k]
  ------------------
 2962|      4|        case 101: return 100.936060000;
  ------------------
  |  Branch (2962:9): [True: 4, False: 1.23k]
  ------------------
 2963|     14|        case 102: return 101.930300000;
  ------------------
  |  Branch (2963:9): [True: 14, False: 1.22k]
  ------------------
 2964|      6|        case 103: return 102.928100000;
  ------------------
  |  Branch (2964:9): [True: 6, False: 1.22k]
  ------------------
 2965|      6|        case 104: return 103.923140000;
  ------------------
  |  Branch (2965:9): [True: 6, False: 1.22k]
  ------------------
 2966|     10|        case 105: return 104.921350000;
  ------------------
  |  Branch (2966:9): [True: 10, False: 1.22k]
  ------------------
 2967|      2|        case 106: return 105.916880000;
  ------------------
  |  Branch (2967:9): [True: 2, False: 1.23k]
  ------------------
 2968|     10|        case 107: return 106.915640000;
  ------------------
  |  Branch (2968:9): [True: 10, False: 1.22k]
  ------------------
 2969|      6|        case 108: return 107.911925000;
  ------------------
  |  Branch (2969:9): [True: 6, False: 1.22k]
  ------------------
 2970|      6|        case 109: return 108.911283000;
  ------------------
  |  Branch (2970:9): [True: 6, False: 1.22k]
  ------------------
 2971|      6|        case 110: return 109.907843000;
  ------------------
  |  Branch (2971:9): [True: 6, False: 1.22k]
  ------------------
 2972|     10|        case 111: return 110.907734000;
  ------------------
  |  Branch (2972:9): [True: 10, False: 1.22k]
  ------------------
 2973|      6|        case 112: return 111.904818000;
  ------------------
  |  Branch (2973:9): [True: 6, False: 1.22k]
  ------------------
 2974|      6|        case 113: return 112.905171000;
  ------------------
  |  Branch (2974:9): [True: 6, False: 1.22k]
  ------------------
 2975|     14|        case 114: return 113.902779000;
  ------------------
  |  Branch (2975:9): [True: 14, False: 1.22k]
  ------------------
 2976|      6|        case 115: return 114.903342000;
  ------------------
  |  Branch (2976:9): [True: 6, False: 1.22k]
  ------------------
 2977|      6|        case 116: return 115.901741000;
  ------------------
  |  Branch (2977:9): [True: 6, False: 1.22k]
  ------------------
 2978|      2|        case 117: return 116.902952000;
  ------------------
  |  Branch (2978:9): [True: 2, False: 1.23k]
  ------------------
 2979|      6|        case 118: return 117.901603000;
  ------------------
  |  Branch (2979:9): [True: 6, False: 1.22k]
  ------------------
 2980|      6|        case 119: return 118.903308000;
  ------------------
  |  Branch (2980:9): [True: 6, False: 1.22k]
  ------------------
 2981|    860|        case 0: case 120: return 119.902194000;
  ------------------
  |  Branch (2981:9): [True: 858, False: 376]
  |  Branch (2981:17): [True: 2, False: 1.23k]
  ------------------
 2982|      6|        case 121: return 120.904235000;
  ------------------
  |  Branch (2982:9): [True: 6, False: 1.22k]
  ------------------
 2983|      6|        case 122: return 121.903439000;
  ------------------
  |  Branch (2983:9): [True: 6, False: 1.22k]
  ------------------
 2984|     26|        case 123: return 122.905720000;
  ------------------
  |  Branch (2984:9): [True: 26, False: 1.20k]
  ------------------
 2985|     24|        case 124: return 123.905273000;
  ------------------
  |  Branch (2985:9): [True: 24, False: 1.21k]
  ------------------
 2986|     12|        case 125: return 124.907784000;
  ------------------
  |  Branch (2986:9): [True: 12, False: 1.22k]
  ------------------
 2987|      2|        case 126: return 125.907653000;
  ------------------
  |  Branch (2987:9): [True: 2, False: 1.23k]
  ------------------
 2988|      2|        case 127: return 126.910360000;
  ------------------
  |  Branch (2988:9): [True: 2, False: 1.23k]
  ------------------
 2989|      8|        case 128: return 127.910537000;
  ------------------
  |  Branch (2989:9): [True: 8, False: 1.22k]
  ------------------
 2990|      2|        case 129: return 128.913480000;
  ------------------
  |  Branch (2990:9): [True: 2, False: 1.23k]
  ------------------
 2991|     10|        case 130: return 129.913967000;
  ------------------
  |  Branch (2991:9): [True: 10, False: 1.22k]
  ------------------
 2992|     12|        case 131: return 130.917000000;
  ------------------
  |  Branch (2992:9): [True: 12, False: 1.22k]
  ------------------
 2993|      8|        case 132: return 131.917816000;
  ------------------
  |  Branch (2993:9): [True: 8, False: 1.22k]
  ------------------
 2994|      6|        case 133: return 132.923830000;
  ------------------
  |  Branch (2994:9): [True: 6, False: 1.22k]
  ------------------
 2995|     26|        case 134: return 133.928290000;
  ------------------
  |  Branch (2995:9): [True: 26, False: 1.20k]
  ------------------
 2996|      4|        case 135: return 134.934730000;
  ------------------
  |  Branch (2996:9): [True: 4, False: 1.23k]
  ------------------
 2997|      2|        case 136: return 135.939340000;
  ------------------
  |  Branch (2997:9): [True: 2, False: 1.23k]
  ------------------
 2998|      2|        case 137: return 136.945990000;
  ------------------
  |  Branch (2998:9): [True: 2, False: 1.23k]
  ------------------
 2999|  1.23k|        }
 3000|     68|        break;
 3001|  2.43k|      case 51:
  ------------------
  |  Branch (3001:7): [True: 2.43k, False: 412k]
  ------------------
 3002|  2.43k|        switch (isotope) {
  ------------------
  |  Branch (3002:17): [True: 2.01k, False: 422]
  ------------------
 3003|      8|        case 103: return 102.939690000;
  ------------------
  |  Branch (3003:9): [True: 8, False: 2.43k]
  ------------------
 3004|      6|        case 104: return 103.936470000;
  ------------------
  |  Branch (3004:9): [True: 6, False: 2.43k]
  ------------------
 3005|      2|        case 105: return 104.931490000;
  ------------------
  |  Branch (3005:9): [True: 2, False: 2.43k]
  ------------------
 3006|      6|        case 106: return 105.928790000;
  ------------------
  |  Branch (3006:9): [True: 6, False: 2.43k]
  ------------------
 3007|      2|        case 107: return 106.924150000;
  ------------------
  |  Branch (3007:9): [True: 2, False: 2.43k]
  ------------------
 3008|      2|        case 108: return 107.922160000;
  ------------------
  |  Branch (3008:9): [True: 2, False: 2.43k]
  ------------------
 3009|      6|        case 109: return 108.918132000;
  ------------------
  |  Branch (3009:9): [True: 6, False: 2.43k]
  ------------------
 3010|      6|        case 110: return 109.916750000;
  ------------------
  |  Branch (3010:9): [True: 6, False: 2.43k]
  ------------------
 3011|    830|        case 111: return 110.913160000;
  ------------------
  |  Branch (3011:9): [True: 830, False: 1.60k]
  ------------------
 3012|     32|        case 112: return 111.912398000;
  ------------------
  |  Branch (3012:9): [True: 32, False: 2.40k]
  ------------------
 3013|      6|        case 113: return 112.909372000;
  ------------------
  |  Branch (3013:9): [True: 6, False: 2.43k]
  ------------------
 3014|      6|        case 114: return 113.909270000;
  ------------------
  |  Branch (3014:9): [True: 6, False: 2.43k]
  ------------------
 3015|     32|        case 115: return 114.906598000;
  ------------------
  |  Branch (3015:9): [True: 32, False: 2.40k]
  ------------------
 3016|      6|        case 116: return 115.906794000;
  ------------------
  |  Branch (3016:9): [True: 6, False: 2.43k]
  ------------------
 3017|      6|        case 117: return 116.904836000;
  ------------------
  |  Branch (3017:9): [True: 6, False: 2.43k]
  ------------------
 3018|      6|        case 118: return 117.905529000;
  ------------------
  |  Branch (3018:9): [True: 6, False: 2.43k]
  ------------------
 3019|     12|        case 119: return 118.903942000;
  ------------------
  |  Branch (3019:9): [True: 12, False: 2.42k]
  ------------------
 3020|      6|        case 120: return 119.905072000;
  ------------------
  |  Branch (3020:9): [True: 6, False: 2.43k]
  ------------------
 3021|    870|        case 0: case 121: return 120.903815000;
  ------------------
  |  Branch (3021:9): [True: 862, False: 1.57k]
  |  Branch (3021:17): [True: 8, False: 2.43k]
  ------------------
 3022|      8|        case 122: return 121.905173000;
  ------------------
  |  Branch (3022:9): [True: 8, False: 2.43k]
  ------------------
 3023|      2|        case 123: return 122.904214000;
  ------------------
  |  Branch (3023:9): [True: 2, False: 2.43k]
  ------------------
 3024|     18|        case 124: return 123.905935000;
  ------------------
  |  Branch (3024:9): [True: 18, False: 2.42k]
  ------------------
 3025|      2|        case 125: return 124.905253000;
  ------------------
  |  Branch (3025:9): [True: 2, False: 2.43k]
  ------------------
 3026|      6|        case 126: return 125.907250000;
  ------------------
  |  Branch (3026:9): [True: 6, False: 2.43k]
  ------------------
 3027|      6|        case 127: return 126.906924000;
  ------------------
  |  Branch (3027:9): [True: 6, False: 2.43k]
  ------------------
 3028|      2|        case 128: return 127.909169000;
  ------------------
  |  Branch (3028:9): [True: 2, False: 2.43k]
  ------------------
 3029|      2|        case 129: return 128.909148000;
  ------------------
  |  Branch (3029:9): [True: 2, False: 2.43k]
  ------------------
 3030|      6|        case 130: return 129.911656000;
  ------------------
  |  Branch (3030:9): [True: 6, False: 2.43k]
  ------------------
 3031|      6|        case 131: return 130.911982000;
  ------------------
  |  Branch (3031:9): [True: 6, False: 2.43k]
  ------------------
 3032|     18|        case 132: return 131.914467000;
  ------------------
  |  Branch (3032:9): [True: 18, False: 2.42k]
  ------------------
 3033|      6|        case 133: return 132.915252000;
  ------------------
  |  Branch (3033:9): [True: 6, False: 2.43k]
  ------------------
 3034|      6|        case 134: return 133.920380000;
  ------------------
  |  Branch (3034:9): [True: 6, False: 2.43k]
  ------------------
 3035|      6|        case 135: return 134.925170000;
  ------------------
  |  Branch (3035:9): [True: 6, False: 2.43k]
  ------------------
 3036|      6|        case 136: return 135.930350000;
  ------------------
  |  Branch (3036:9): [True: 6, False: 2.43k]
  ------------------
 3037|      6|        case 137: return 136.935310000;
  ------------------
  |  Branch (3037:9): [True: 6, False: 2.43k]
  ------------------
 3038|     52|        case 138: return 137.940790000;
  ------------------
  |  Branch (3038:9): [True: 52, False: 2.38k]
  ------------------
 3039|      8|        case 139: return 138.945980000;
  ------------------
  |  Branch (3039:9): [True: 8, False: 2.43k]
  ------------------
 3040|  2.43k|        }
 3041|    422|        break;
 3042|  1.14k|      case 52:
  ------------------
  |  Branch (3042:7): [True: 1.14k, False: 414k]
  ------------------
 3043|  1.14k|        switch (isotope) {
  ------------------
  |  Branch (3043:17): [True: 1.13k, False: 8]
  ------------------
 3044|      6|        case 105: return 104.943640000;
  ------------------
  |  Branch (3044:9): [True: 6, False: 1.13k]
  ------------------
 3045|      2|        case 106: return 105.937500000;
  ------------------
  |  Branch (3045:9): [True: 2, False: 1.14k]
  ------------------
 3046|      2|        case 107: return 106.935010000;
  ------------------
  |  Branch (3046:9): [True: 2, False: 1.14k]
  ------------------
 3047|      6|        case 108: return 107.929440000;
  ------------------
  |  Branch (3047:9): [True: 6, False: 1.13k]
  ------------------
 3048|      6|        case 109: return 108.927420000;
  ------------------
  |  Branch (3048:9): [True: 6, False: 1.13k]
  ------------------
 3049|      2|        case 110: return 109.922410000;
  ------------------
  |  Branch (3049:9): [True: 2, False: 1.14k]
  ------------------
 3050|      2|        case 111: return 110.921110000;
  ------------------
  |  Branch (3050:9): [True: 2, False: 1.14k]
  ------------------
 3051|      2|        case 112: return 111.917010000;
  ------------------
  |  Branch (3051:9): [True: 2, False: 1.14k]
  ------------------
 3052|      2|        case 113: return 112.915890000;
  ------------------
  |  Branch (3052:9): [True: 2, False: 1.14k]
  ------------------
 3053|      2|        case 114: return 113.912090000;
  ------------------
  |  Branch (3053:9): [True: 2, False: 1.14k]
  ------------------
 3054|     10|        case 115: return 114.911900000;
  ------------------
  |  Branch (3054:9): [True: 10, False: 1.13k]
  ------------------
 3055|     14|        case 116: return 115.908460000;
  ------------------
  |  Branch (3055:9): [True: 14, False: 1.13k]
  ------------------
 3056|     14|        case 117: return 116.908645000;
  ------------------
  |  Branch (3056:9): [True: 14, False: 1.13k]
  ------------------
 3057|      6|        case 118: return 117.905828000;
  ------------------
  |  Branch (3057:9): [True: 6, False: 1.13k]
  ------------------
 3058|      8|        case 119: return 118.906404000;
  ------------------
  |  Branch (3058:9): [True: 8, False: 1.13k]
  ------------------
 3059|      8|        case 120: return 119.904020000;
  ------------------
  |  Branch (3059:9): [True: 8, False: 1.13k]
  ------------------
 3060|      6|        case 121: return 120.904936000;
  ------------------
  |  Branch (3060:9): [True: 6, False: 1.13k]
  ------------------
 3061|      8|        case 122: return 121.903043000;
  ------------------
  |  Branch (3061:9): [True: 8, False: 1.13k]
  ------------------
 3062|      6|        case 123: return 122.904270000;
  ------------------
  |  Branch (3062:9): [True: 6, False: 1.13k]
  ------------------
 3063|      6|        case 124: return 123.902817000;
  ------------------
  |  Branch (3063:9): [True: 6, False: 1.13k]
  ------------------
 3064|      2|        case 125: return 124.904430000;
  ------------------
  |  Branch (3064:9): [True: 2, False: 1.14k]
  ------------------
 3065|      2|        case 126: return 125.903311000;
  ------------------
  |  Branch (3065:9): [True: 2, False: 1.14k]
  ------------------
 3066|      2|        case 127: return 126.905226000;
  ------------------
  |  Branch (3066:9): [True: 2, False: 1.14k]
  ------------------
 3067|      6|        case 128: return 127.904463000;
  ------------------
  |  Branch (3067:9): [True: 6, False: 1.13k]
  ------------------
 3068|      6|        case 129: return 128.906598000;
  ------------------
  |  Branch (3068:9): [True: 6, False: 1.13k]
  ------------------
 3069|    932|        case 0: case 130: return 129.906224000;
  ------------------
  |  Branch (3069:9): [True: 924, False: 220]
  |  Branch (3069:17): [True: 8, False: 1.13k]
  ------------------
 3070|      2|        case 131: return 130.908523000;
  ------------------
  |  Branch (3070:9): [True: 2, False: 1.14k]
  ------------------
 3071|      2|        case 132: return 131.908553000;
  ------------------
  |  Branch (3071:9): [True: 2, False: 1.14k]
  ------------------
 3072|      2|        case 133: return 132.910955000;
  ------------------
  |  Branch (3072:9): [True: 2, False: 1.14k]
  ------------------
 3073|      6|        case 134: return 133.911369000;
  ------------------
  |  Branch (3073:9): [True: 6, False: 1.13k]
  ------------------
 3074|      6|        case 135: return 134.916450000;
  ------------------
  |  Branch (3074:9): [True: 6, False: 1.13k]
  ------------------
 3075|      2|        case 136: return 135.920100000;
  ------------------
  |  Branch (3075:9): [True: 2, False: 1.14k]
  ------------------
 3076|      6|        case 137: return 136.925320000;
  ------------------
  |  Branch (3076:9): [True: 6, False: 1.13k]
  ------------------
 3077|     12|        case 138: return 137.929220000;
  ------------------
  |  Branch (3077:9): [True: 12, False: 1.13k]
  ------------------
 3078|      2|        case 139: return 138.934730000;
  ------------------
  |  Branch (3078:9): [True: 2, False: 1.14k]
  ------------------
 3079|      6|        case 140: return 139.938850000;
  ------------------
  |  Branch (3079:9): [True: 6, False: 1.13k]
  ------------------
 3080|      2|        case 141: return 140.944650000;
  ------------------
  |  Branch (3080:9): [True: 2, False: 1.14k]
  ------------------
 3081|     20|        case 142: return 141.949080000;
  ------------------
  |  Branch (3081:9): [True: 20, False: 1.12k]
  ------------------
 3082|  1.14k|        }
 3083|      8|        break;
 3084|  11.6k|      case 53:
  ------------------
  |  Branch (3084:7): [True: 11.6k, False: 403k]
  ------------------
 3085|  11.6k|        switch (isotope) {
  ------------------
  |  Branch (3085:17): [True: 11.6k, False: 24]
  ------------------
 3086|      6|        case 108: return 107.943480000;
  ------------------
  |  Branch (3086:9): [True: 6, False: 11.6k]
  ------------------
 3087|      6|        case 109: return 108.938150000;
  ------------------
  |  Branch (3087:9): [True: 6, False: 11.6k]
  ------------------
 3088|      6|        case 110: return 109.935240000;
  ------------------
  |  Branch (3088:9): [True: 6, False: 11.6k]
  ------------------
 3089|     14|        case 111: return 110.930280000;
  ------------------
  |  Branch (3089:9): [True: 14, False: 11.6k]
  ------------------
 3090|      2|        case 112: return 111.927970000;
  ------------------
  |  Branch (3090:9): [True: 2, False: 11.6k]
  ------------------
 3091|      6|        case 113: return 112.923640000;
  ------------------
  |  Branch (3091:9): [True: 6, False: 11.6k]
  ------------------
 3092|      4|        case 114: return 113.921850000;
  ------------------
  |  Branch (3092:9): [True: 4, False: 11.6k]
  ------------------
 3093|      6|        case 115: return 114.918050000;
  ------------------
  |  Branch (3093:9): [True: 6, False: 11.6k]
  ------------------
 3094|      6|        case 116: return 115.916810000;
  ------------------
  |  Branch (3094:9): [True: 6, False: 11.6k]
  ------------------
 3095|      2|        case 117: return 116.913650000;
  ------------------
  |  Branch (3095:9): [True: 2, False: 11.6k]
  ------------------
 3096|     12|        case 118: return 117.913074000;
  ------------------
  |  Branch (3096:9): [True: 12, False: 11.6k]
  ------------------
 3097|      6|        case 119: return 118.910070000;
  ------------------
  |  Branch (3097:9): [True: 6, False: 11.6k]
  ------------------
 3098|      2|        case 120: return 119.910048000;
  ------------------
  |  Branch (3098:9): [True: 2, False: 11.6k]
  ------------------
 3099|      8|        case 121: return 120.907367000;
  ------------------
  |  Branch (3099:9): [True: 8, False: 11.6k]
  ------------------
 3100|      6|        case 122: return 121.907589000;
  ------------------
  |  Branch (3100:9): [True: 6, False: 11.6k]
  ------------------
 3101|      6|        case 123: return 122.905589000;
  ------------------
  |  Branch (3101:9): [True: 6, False: 11.6k]
  ------------------
 3102|      2|        case 124: return 123.906209000;
  ------------------
  |  Branch (3102:9): [True: 2, False: 11.6k]
  ------------------
 3103|      2|        case 125: return 124.904630000;
  ------------------
  |  Branch (3103:9): [True: 2, False: 11.6k]
  ------------------
 3104|      2|        case 126: return 125.905624000;
  ------------------
  |  Branch (3104:9): [True: 2, False: 11.6k]
  ------------------
 3105|  11.4k|        case 0: case 127: return 126.904473000;
  ------------------
  |  Branch (3105:9): [True: 11.4k, False: 246]
  |  Branch (3105:17): [True: 2, False: 11.6k]
  ------------------
 3106|     10|        case 128: return 127.905809000;
  ------------------
  |  Branch (3106:9): [True: 10, False: 11.6k]
  ------------------
 3107|      2|        case 129: return 128.904988000;
  ------------------
  |  Branch (3107:9): [True: 2, False: 11.6k]
  ------------------
 3108|      2|        case 130: return 129.906674000;
  ------------------
  |  Branch (3108:9): [True: 2, False: 11.6k]
  ------------------
 3109|      2|        case 131: return 130.906124000;
  ------------------
  |  Branch (3109:9): [True: 2, False: 11.6k]
  ------------------
 3110|      6|        case 132: return 131.907997000;
  ------------------
  |  Branch (3110:9): [True: 6, False: 11.6k]
  ------------------
 3111|      2|        case 133: return 132.907797000;
  ------------------
  |  Branch (3111:9): [True: 2, False: 11.6k]
  ------------------
 3112|      6|        case 134: return 133.909744000;
  ------------------
  |  Branch (3112:9): [True: 6, False: 11.6k]
  ------------------
 3113|      6|        case 135: return 134.910048000;
  ------------------
  |  Branch (3113:9): [True: 6, False: 11.6k]
  ------------------
 3114|      2|        case 136: return 135.914650000;
  ------------------
  |  Branch (3114:9): [True: 2, False: 11.6k]
  ------------------
 3115|      6|        case 137: return 136.917871000;
  ------------------
  |  Branch (3115:9): [True: 6, False: 11.6k]
  ------------------
 3116|     18|        case 138: return 137.922350000;
  ------------------
  |  Branch (3116:9): [True: 18, False: 11.6k]
  ------------------
 3117|      6|        case 139: return 138.926100000;
  ------------------
  |  Branch (3117:9): [True: 6, False: 11.6k]
  ------------------
 3118|     14|        case 140: return 139.931000000;
  ------------------
  |  Branch (3118:9): [True: 14, False: 11.6k]
  ------------------
 3119|     16|        case 141: return 140.935030000;
  ------------------
  |  Branch (3119:9): [True: 16, False: 11.6k]
  ------------------
 3120|      6|        case 142: return 141.940180000;
  ------------------
  |  Branch (3120:9): [True: 6, False: 11.6k]
  ------------------
 3121|      6|        case 143: return 142.944560000;
  ------------------
  |  Branch (3121:9): [True: 6, False: 11.6k]
  ------------------
 3122|      6|        case 144: return 143.949990000;
  ------------------
  |  Branch (3122:9): [True: 6, False: 11.6k]
  ------------------
 3123|  11.6k|        }
 3124|     24|        break;
 3125|    249|      case 54:
  ------------------
  |  Branch (3125:7): [True: 249, False: 414k]
  ------------------
 3126|    249|        switch (isotope) {
  ------------------
  |  Branch (3126:17): [True: 221, False: 28]
  ------------------
 3127|      6|        case 110: return 109.944280000;
  ------------------
  |  Branch (3127:9): [True: 6, False: 243]
  ------------------
 3128|      2|        case 111: return 110.941600000;
  ------------------
  |  Branch (3128:9): [True: 2, False: 247]
  ------------------
 3129|      2|        case 112: return 111.935620000;
  ------------------
  |  Branch (3129:9): [True: 2, False: 247]
  ------------------
 3130|      6|        case 113: return 112.933340000;
  ------------------
  |  Branch (3130:9): [True: 6, False: 243]
  ------------------
 3131|      2|        case 114: return 113.927980000;
  ------------------
  |  Branch (3131:9): [True: 2, False: 247]
  ------------------
 3132|      8|        case 115: return 114.926294000;
  ------------------
  |  Branch (3132:9): [True: 8, False: 241]
  ------------------
 3133|      2|        case 116: return 115.921581000;
  ------------------
  |  Branch (3133:9): [True: 2, False: 247]
  ------------------
 3134|      2|        case 117: return 116.920359000;
  ------------------
  |  Branch (3134:9): [True: 2, False: 247]
  ------------------
 3135|      2|        case 118: return 117.916179000;
  ------------------
  |  Branch (3135:9): [True: 2, False: 247]
  ------------------
 3136|      2|        case 119: return 118.915411000;
  ------------------
  |  Branch (3136:9): [True: 2, False: 247]
  ------------------
 3137|      6|        case 120: return 119.911784000;
  ------------------
  |  Branch (3137:9): [True: 6, False: 243]
  ------------------
 3138|      2|        case 121: return 120.911462000;
  ------------------
  |  Branch (3138:9): [True: 2, False: 247]
  ------------------
 3139|      8|        case 122: return 121.908368000;
  ------------------
  |  Branch (3139:9): [True: 8, False: 241]
  ------------------
 3140|     20|        case 123: return 122.908482000;
  ------------------
  |  Branch (3140:9): [True: 20, False: 229]
  ------------------
 3141|      2|        case 124: return 123.905893000;
  ------------------
  |  Branch (3141:9): [True: 2, False: 247]
  ------------------
 3142|      2|        case 125: return 124.906395000;
  ------------------
  |  Branch (3142:9): [True: 2, False: 247]
  ------------------
 3143|      2|        case 126: return 125.904274000;
  ------------------
  |  Branch (3143:9): [True: 2, False: 247]
  ------------------
 3144|      6|        case 127: return 126.905184000;
  ------------------
  |  Branch (3144:9): [True: 6, False: 243]
  ------------------
 3145|      2|        case 128: return 127.903531000;
  ------------------
  |  Branch (3145:9): [True: 2, False: 247]
  ------------------
 3146|      2|        case 129: return 128.904779000;
  ------------------
  |  Branch (3146:9): [True: 2, False: 247]
  ------------------
 3147|      6|        case 130: return 129.903508000;
  ------------------
  |  Branch (3147:9): [True: 6, False: 243]
  ------------------
 3148|      6|        case 131: return 130.905082000;
  ------------------
  |  Branch (3148:9): [True: 6, False: 243]
  ------------------
 3149|     57|        case 0: case 132: return 131.904153000;
  ------------------
  |  Branch (3149:9): [True: 55, False: 194]
  |  Branch (3149:17): [True: 2, False: 247]
  ------------------
 3150|      8|        case 133: return 132.905910000;
  ------------------
  |  Branch (3150:9): [True: 8, False: 241]
  ------------------
 3151|      6|        case 134: return 133.905394000;
  ------------------
  |  Branch (3151:9): [True: 6, False: 243]
  ------------------
 3152|      6|        case 135: return 134.907227000;
  ------------------
  |  Branch (3152:9): [True: 6, False: 243]
  ------------------
 3153|      6|        case 136: return 135.907219000;
  ------------------
  |  Branch (3153:9): [True: 6, False: 243]
  ------------------
 3154|      2|        case 137: return 136.911562000;
  ------------------
  |  Branch (3154:9): [True: 2, False: 247]
  ------------------
 3155|      2|        case 138: return 137.913950000;
  ------------------
  |  Branch (3155:9): [True: 2, False: 247]
  ------------------
 3156|      2|        case 139: return 138.918793000;
  ------------------
  |  Branch (3156:9): [True: 2, False: 247]
  ------------------
 3157|      2|        case 140: return 139.921640000;
  ------------------
  |  Branch (3157:9): [True: 2, False: 247]
  ------------------
 3158|      8|        case 141: return 140.926650000;
  ------------------
  |  Branch (3158:9): [True: 8, False: 241]
  ------------------
 3159|      6|        case 142: return 141.929710000;
  ------------------
  |  Branch (3159:9): [True: 6, False: 243]
  ------------------
 3160|      6|        case 143: return 142.935110000;
  ------------------
  |  Branch (3160:9): [True: 6, False: 243]
  ------------------
 3161|      2|        case 144: return 143.938510000;
  ------------------
  |  Branch (3161:9): [True: 2, False: 247]
  ------------------
 3162|      6|        case 145: return 144.944070000;
  ------------------
  |  Branch (3162:9): [True: 6, False: 243]
  ------------------
 3163|      2|        case 146: return 145.947750000;
  ------------------
  |  Branch (3163:9): [True: 2, False: 247]
  ------------------
 3164|      2|        case 147: return 146.953560000;
  ------------------
  |  Branch (3164:9): [True: 2, False: 247]
  ------------------
 3165|    249|        }
 3166|     28|        break;
 3167|    646|      case 55:
  ------------------
  |  Branch (3167:7): [True: 646, False: 414k]
  ------------------
 3168|    646|        switch (isotope) {
  ------------------
  |  Branch (3168:17): [True: 616, False: 30]
  ------------------
 3169|     34|        case 112: return 111.950300000;
  ------------------
  |  Branch (3169:9): [True: 34, False: 612]
  ------------------
 3170|      6|        case 113: return 112.944490000;
  ------------------
  |  Branch (3170:9): [True: 6, False: 640]
  ------------------
 3171|      2|        case 114: return 113.941450000;
  ------------------
  |  Branch (3171:9): [True: 2, False: 644]
  ------------------
 3172|      6|        case 115: return 114.935910000;
  ------------------
  |  Branch (3172:9): [True: 6, False: 640]
  ------------------
 3173|     12|        case 116: return 115.933370000;
  ------------------
  |  Branch (3173:9): [True: 12, False: 634]
  ------------------
 3174|      2|        case 117: return 116.928670000;
  ------------------
  |  Branch (3174:9): [True: 2, False: 644]
  ------------------
 3175|     28|        case 118: return 117.926559000;
  ------------------
  |  Branch (3175:9): [True: 28, False: 618]
  ------------------
 3176|      6|        case 119: return 118.922377000;
  ------------------
  |  Branch (3176:9): [True: 6, False: 640]
  ------------------
 3177|      6|        case 120: return 119.920677000;
  ------------------
  |  Branch (3177:9): [True: 6, False: 640]
  ------------------
 3178|     16|        case 121: return 120.917229000;
  ------------------
  |  Branch (3178:9): [True: 16, False: 630]
  ------------------
 3179|     10|        case 122: return 121.916110000;
  ------------------
  |  Branch (3179:9): [True: 10, False: 636]
  ------------------
 3180|      8|        case 123: return 122.912996000;
  ------------------
  |  Branch (3180:9): [True: 8, False: 638]
  ------------------
 3181|      2|        case 124: return 123.912258000;
  ------------------
  |  Branch (3181:9): [True: 2, False: 644]
  ------------------
 3182|      2|        case 125: return 124.909728000;
  ------------------
  |  Branch (3182:9): [True: 2, False: 644]
  ------------------
 3183|      2|        case 126: return 125.909452000;
  ------------------
  |  Branch (3183:9): [True: 2, False: 644]
  ------------------
 3184|      6|        case 127: return 126.907418000;
  ------------------
  |  Branch (3184:9): [True: 6, False: 640]
  ------------------
 3185|      6|        case 128: return 127.907749000;
  ------------------
  |  Branch (3185:9): [True: 6, False: 640]
  ------------------
 3186|      2|        case 129: return 128.906064000;
  ------------------
  |  Branch (3186:9): [True: 2, False: 644]
  ------------------
 3187|      2|        case 130: return 129.906709000;
  ------------------
  |  Branch (3187:9): [True: 2, False: 644]
  ------------------
 3188|      2|        case 131: return 130.905464000;
  ------------------
  |  Branch (3188:9): [True: 2, False: 644]
  ------------------
 3189|      6|        case 132: return 131.906434000;
  ------------------
  |  Branch (3189:9): [True: 6, False: 640]
  ------------------
 3190|    318|        case 0: case 133: return 132.905451000;
  ------------------
  |  Branch (3190:9): [True: 306, False: 340]
  |  Branch (3190:17): [True: 12, False: 634]
  ------------------
 3191|      2|        case 134: return 133.906718000;
  ------------------
  |  Branch (3191:9): [True: 2, False: 644]
  ------------------
 3192|      2|        case 135: return 134.905977000;
  ------------------
  |  Branch (3192:9): [True: 2, False: 644]
  ------------------
 3193|      6|        case 136: return 135.907311000;
  ------------------
  |  Branch (3193:9): [True: 6, False: 640]
  ------------------
 3194|      4|        case 137: return 136.907089000;
  ------------------
  |  Branch (3194:9): [True: 4, False: 642]
  ------------------
 3195|      2|        case 138: return 137.911017000;
  ------------------
  |  Branch (3195:9): [True: 2, False: 644]
  ------------------
 3196|      6|        case 139: return 138.913364000;
  ------------------
  |  Branch (3196:9): [True: 6, False: 640]
  ------------------
 3197|     10|        case 140: return 139.917282000;
  ------------------
  |  Branch (3197:9): [True: 10, False: 636]
  ------------------
 3198|     26|        case 141: return 140.920046000;
  ------------------
  |  Branch (3198:9): [True: 26, False: 620]
  ------------------
 3199|     14|        case 142: return 141.924299000;
  ------------------
  |  Branch (3199:9): [True: 14, False: 632]
  ------------------
 3200|     12|        case 143: return 142.927352000;
  ------------------
  |  Branch (3200:9): [True: 12, False: 634]
  ------------------
 3201|      8|        case 144: return 143.932077000;
  ------------------
  |  Branch (3201:9): [True: 8, False: 638]
  ------------------
 3202|      6|        case 145: return 144.935526000;
  ------------------
  |  Branch (3202:9): [True: 6, False: 640]
  ------------------
 3203|      2|        case 146: return 145.940290000;
  ------------------
  |  Branch (3203:9): [True: 2, False: 644]
  ------------------
 3204|      6|        case 147: return 146.944160000;
  ------------------
  |  Branch (3204:9): [True: 6, False: 640]
  ------------------
 3205|      2|        case 148: return 147.949220000;
  ------------------
  |  Branch (3205:9): [True: 2, False: 644]
  ------------------
 3206|     16|        case 149: return 148.952930000;
  ------------------
  |  Branch (3206:9): [True: 16, False: 630]
  ------------------
 3207|      2|        case 150: return 149.958170000;
  ------------------
  |  Branch (3207:9): [True: 2, False: 644]
  ------------------
 3208|      6|        case 151: return 150.962190000;
  ------------------
  |  Branch (3208:9): [True: 6, False: 640]
  ------------------
 3209|    646|        }
 3210|     30|        break;
 3211|    306|      case 56:
  ------------------
  |  Branch (3211:7): [True: 306, False: 414k]
  ------------------
 3212|    306|        switch (isotope) {
  ------------------
  |  Branch (3212:17): [True: 298, False: 8]
  ------------------
 3213|      2|        case 114: return 113.950680000;
  ------------------
  |  Branch (3213:9): [True: 2, False: 304]
  ------------------
 3214|      2|        case 115: return 114.947370000;
  ------------------
  |  Branch (3214:9): [True: 2, False: 304]
  ------------------
 3215|      2|        case 116: return 115.941380000;
  ------------------
  |  Branch (3215:9): [True: 2, False: 304]
  ------------------
 3216|      2|        case 117: return 116.938500000;
  ------------------
  |  Branch (3216:9): [True: 2, False: 304]
  ------------------
 3217|      2|        case 118: return 117.933040000;
  ------------------
  |  Branch (3217:9): [True: 2, False: 304]
  ------------------
 3218|      2|        case 119: return 118.930660000;
  ------------------
  |  Branch (3218:9): [True: 2, False: 304]
  ------------------
 3219|      6|        case 120: return 119.926040000;
  ------------------
  |  Branch (3219:9): [True: 6, False: 300]
  ------------------
 3220|      2|        case 121: return 120.924050000;
  ------------------
  |  Branch (3220:9): [True: 2, False: 304]
  ------------------
 3221|      2|        case 122: return 121.919900000;
  ------------------
  |  Branch (3221:9): [True: 2, False: 304]
  ------------------
 3222|      2|        case 123: return 122.918781000;
  ------------------
  |  Branch (3222:9): [True: 2, False: 304]
  ------------------
 3223|      2|        case 124: return 123.915094000;
  ------------------
  |  Branch (3223:9): [True: 2, False: 304]
  ------------------
 3224|      2|        case 125: return 124.914473000;
  ------------------
  |  Branch (3224:9): [True: 2, False: 304]
  ------------------
 3225|      2|        case 126: return 125.911250000;
  ------------------
  |  Branch (3225:9): [True: 2, False: 304]
  ------------------
 3226|      2|        case 127: return 126.911094000;
  ------------------
  |  Branch (3226:9): [True: 2, False: 304]
  ------------------
 3227|      2|        case 128: return 127.908318000;
  ------------------
  |  Branch (3227:9): [True: 2, False: 304]
  ------------------
 3228|      2|        case 129: return 128.908679000;
  ------------------
  |  Branch (3228:9): [True: 2, False: 304]
  ------------------
 3229|      2|        case 130: return 129.906320000;
  ------------------
  |  Branch (3229:9): [True: 2, False: 304]
  ------------------
 3230|      2|        case 131: return 130.906941000;
  ------------------
  |  Branch (3230:9): [True: 2, False: 304]
  ------------------
 3231|      2|        case 132: return 131.905061000;
  ------------------
  |  Branch (3231:9): [True: 2, False: 304]
  ------------------
 3232|      2|        case 133: return 132.906007000;
  ------------------
  |  Branch (3232:9): [True: 2, False: 304]
  ------------------
 3233|      2|        case 134: return 133.904508000;
  ------------------
  |  Branch (3233:9): [True: 2, False: 304]
  ------------------
 3234|      2|        case 135: return 134.905688000;
  ------------------
  |  Branch (3234:9): [True: 2, False: 304]
  ------------------
 3235|      2|        case 136: return 135.904575000;
  ------------------
  |  Branch (3235:9): [True: 2, False: 304]
  ------------------
 3236|      6|        case 137: return 136.905827000;
  ------------------
  |  Branch (3236:9): [True: 6, False: 300]
  ------------------
 3237|    198|        case 0: case 138: return 137.905247000;
  ------------------
  |  Branch (3237:9): [True: 196, False: 110]
  |  Branch (3237:17): [True: 2, False: 304]
  ------------------
 3238|      2|        case 139: return 138.908841000;
  ------------------
  |  Branch (3238:9): [True: 2, False: 304]
  ------------------
 3239|      2|        case 140: return 139.910605000;
  ------------------
  |  Branch (3239:9): [True: 2, False: 304]
  ------------------
 3240|      2|        case 141: return 140.914411000;
  ------------------
  |  Branch (3240:9): [True: 2, False: 304]
  ------------------
 3241|      2|        case 142: return 141.916453000;
  ------------------
  |  Branch (3241:9): [True: 2, False: 304]
  ------------------
 3242|      2|        case 143: return 142.920627000;
  ------------------
  |  Branch (3242:9): [True: 2, False: 304]
  ------------------
 3243|      2|        case 144: return 143.922953000;
  ------------------
  |  Branch (3243:9): [True: 2, False: 304]
  ------------------
 3244|      2|        case 145: return 144.927630000;
  ------------------
  |  Branch (3244:9): [True: 2, False: 304]
  ------------------
 3245|      6|        case 146: return 145.930220000;
  ------------------
  |  Branch (3245:9): [True: 6, False: 300]
  ------------------
 3246|      2|        case 147: return 146.934950000;
  ------------------
  |  Branch (3246:9): [True: 2, False: 304]
  ------------------
 3247|      4|        case 148: return 147.937720000;
  ------------------
  |  Branch (3247:9): [True: 4, False: 302]
  ------------------
 3248|      2|        case 149: return 148.942580000;
  ------------------
  |  Branch (3248:9): [True: 2, False: 304]
  ------------------
 3249|      6|        case 150: return 149.945680000;
  ------------------
  |  Branch (3249:9): [True: 6, False: 300]
  ------------------
 3250|      2|        case 151: return 150.950810000;
  ------------------
  |  Branch (3250:9): [True: 2, False: 304]
  ------------------
 3251|      6|        case 152: return 151.954270000;
  ------------------
  |  Branch (3251:9): [True: 6, False: 300]
  ------------------
 3252|      2|        case 153: return 152.959610000;
  ------------------
  |  Branch (3252:9): [True: 2, False: 304]
  ------------------
 3253|    306|        }
 3254|      8|        break;
 3255|  2.18k|      case 57:
  ------------------
  |  Branch (3255:7): [True: 2.18k, False: 412k]
  ------------------
 3256|  2.18k|        switch (isotope) {
  ------------------
  |  Branch (3256:17): [True: 2.17k, False: 12]
  ------------------
 3257|      2|        case 117: return 116.950070000;
  ------------------
  |  Branch (3257:9): [True: 2, False: 2.18k]
  ------------------
 3258|      2|        case 118: return 117.946730000;
  ------------------
  |  Branch (3258:9): [True: 2, False: 2.18k]
  ------------------
 3259|      2|        case 119: return 118.940990000;
  ------------------
  |  Branch (3259:9): [True: 2, False: 2.18k]
  ------------------
 3260|      6|        case 120: return 119.938070000;
  ------------------
  |  Branch (3260:9): [True: 6, False: 2.17k]
  ------------------
 3261|      2|        case 121: return 120.933010000;
  ------------------
  |  Branch (3261:9): [True: 2, False: 2.18k]
  ------------------
 3262|      2|        case 122: return 121.930710000;
  ------------------
  |  Branch (3262:9): [True: 2, False: 2.18k]
  ------------------
 3263|      2|        case 123: return 122.926240000;
  ------------------
  |  Branch (3263:9): [True: 2, False: 2.18k]
  ------------------
 3264|      2|        case 124: return 123.924570000;
  ------------------
  |  Branch (3264:9): [True: 2, False: 2.18k]
  ------------------
 3265|      2|        case 125: return 124.920816000;
  ------------------
  |  Branch (3265:9): [True: 2, False: 2.18k]
  ------------------
 3266|      6|        case 126: return 125.919510000;
  ------------------
  |  Branch (3266:9): [True: 6, False: 2.17k]
  ------------------
 3267|      2|        case 127: return 126.916375000;
  ------------------
  |  Branch (3267:9): [True: 2, False: 2.18k]
  ------------------
 3268|      2|        case 128: return 127.915590000;
  ------------------
  |  Branch (3268:9): [True: 2, False: 2.18k]
  ------------------
 3269|      2|        case 129: return 128.912693000;
  ------------------
  |  Branch (3269:9): [True: 2, False: 2.18k]
  ------------------
 3270|      2|        case 130: return 129.912369000;
  ------------------
  |  Branch (3270:9): [True: 2, False: 2.18k]
  ------------------
 3271|      2|        case 131: return 130.910070000;
  ------------------
  |  Branch (3271:9): [True: 2, False: 2.18k]
  ------------------
 3272|      2|        case 132: return 131.910100000;
  ------------------
  |  Branch (3272:9): [True: 2, False: 2.18k]
  ------------------
 3273|      2|        case 133: return 132.908220000;
  ------------------
  |  Branch (3273:9): [True: 2, False: 2.18k]
  ------------------
 3274|      2|        case 134: return 133.908514000;
  ------------------
  |  Branch (3274:9): [True: 2, False: 2.18k]
  ------------------
 3275|      2|        case 135: return 134.906977000;
  ------------------
  |  Branch (3275:9): [True: 2, False: 2.18k]
  ------------------
 3276|      2|        case 136: return 135.907640000;
  ------------------
  |  Branch (3276:9): [True: 2, False: 2.18k]
  ------------------
 3277|      2|        case 137: return 136.906494000;
  ------------------
  |  Branch (3277:9): [True: 2, False: 2.18k]
  ------------------
 3278|      2|        case 138: return 137.907112000;
  ------------------
  |  Branch (3278:9): [True: 2, False: 2.18k]
  ------------------
 3279|  2.06k|        case 0: case 139: return 138.906353000;
  ------------------
  |  Branch (3279:9): [True: 2.06k, False: 120]
  |  Branch (3279:17): [True: 2, False: 2.18k]
  ------------------
 3280|      2|        case 140: return 139.909477000;
  ------------------
  |  Branch (3280:9): [True: 2, False: 2.18k]
  ------------------
 3281|      2|        case 141: return 140.910962000;
  ------------------
  |  Branch (3281:9): [True: 2, False: 2.18k]
  ------------------
 3282|      2|        case 142: return 141.914079000;
  ------------------
  |  Branch (3282:9): [True: 2, False: 2.18k]
  ------------------
 3283|      2|        case 143: return 142.916063000;
  ------------------
  |  Branch (3283:9): [True: 2, False: 2.18k]
  ------------------
 3284|      6|        case 144: return 143.919600000;
  ------------------
  |  Branch (3284:9): [True: 6, False: 2.17k]
  ------------------
 3285|      2|        case 145: return 144.921650000;
  ------------------
  |  Branch (3285:9): [True: 2, False: 2.18k]
  ------------------
 3286|      6|        case 146: return 145.925790000;
  ------------------
  |  Branch (3286:9): [True: 6, False: 2.17k]
  ------------------
 3287|      2|        case 147: return 146.928240000;
  ------------------
  |  Branch (3287:9): [True: 2, False: 2.18k]
  ------------------
 3288|      2|        case 148: return 147.932230000;
  ------------------
  |  Branch (3288:9): [True: 2, False: 2.18k]
  ------------------
 3289|      2|        case 149: return 148.934730000;
  ------------------
  |  Branch (3289:9): [True: 2, False: 2.18k]
  ------------------
 3290|      6|        case 150: return 149.938770000;
  ------------------
  |  Branch (3290:9): [True: 6, False: 2.17k]
  ------------------
 3291|      6|        case 151: return 150.941720000;
  ------------------
  |  Branch (3291:9): [True: 6, False: 2.17k]
  ------------------
 3292|      2|        case 152: return 151.946250000;
  ------------------
  |  Branch (3292:9): [True: 2, False: 2.18k]
  ------------------
 3293|      8|        case 153: return 152.949620000;
  ------------------
  |  Branch (3293:9): [True: 8, False: 2.17k]
  ------------------
 3294|      2|        case 154: return 153.954500000;
  ------------------
  |  Branch (3294:9): [True: 2, False: 2.18k]
  ------------------
 3295|      2|        case 155: return 154.958350000;
  ------------------
  |  Branch (3295:9): [True: 2, False: 2.18k]
  ------------------
 3296|  2.18k|        }
 3297|     12|        break;
 3298|    221|      case 58:
  ------------------
  |  Branch (3298:7): [True: 221, False: 414k]
  ------------------
 3299|    221|        switch (isotope) {
  ------------------
  |  Branch (3299:17): [True: 211, False: 10]
  ------------------
 3300|      2|        case 119: return 118.952760000;
  ------------------
  |  Branch (3300:9): [True: 2, False: 219]
  ------------------
 3301|     16|        case 120: return 119.946640000;
  ------------------
  |  Branch (3301:9): [True: 16, False: 205]
  ------------------
 3302|      2|        case 121: return 120.943420000;
  ------------------
  |  Branch (3302:9): [True: 2, False: 219]
  ------------------
 3303|      2|        case 122: return 121.937910000;
  ------------------
  |  Branch (3303:9): [True: 2, False: 219]
  ------------------
 3304|      2|        case 123: return 122.935400000;
  ------------------
  |  Branch (3304:9): [True: 2, False: 219]
  ------------------
 3305|      2|        case 124: return 123.930410000;
  ------------------
  |  Branch (3305:9): [True: 2, False: 219]
  ------------------
 3306|      6|        case 125: return 124.928440000;
  ------------------
  |  Branch (3306:9): [True: 6, False: 215]
  ------------------
 3307|      2|        case 126: return 125.923970000;
  ------------------
  |  Branch (3307:9): [True: 2, False: 219]
  ------------------
 3308|      2|        case 127: return 126.922730000;
  ------------------
  |  Branch (3308:9): [True: 2, False: 219]
  ------------------
 3309|      2|        case 128: return 127.918910000;
  ------------------
  |  Branch (3309:9): [True: 2, False: 219]
  ------------------
 3310|     10|        case 129: return 128.918100000;
  ------------------
  |  Branch (3310:9): [True: 10, False: 211]
  ------------------
 3311|      6|        case 130: return 129.914740000;
  ------------------
  |  Branch (3311:9): [True: 6, False: 215]
  ------------------
 3312|      6|        case 131: return 130.914420000;
  ------------------
  |  Branch (3312:9): [True: 6, False: 215]
  ------------------
 3313|      2|        case 132: return 131.911460000;
  ------------------
  |  Branch (3313:9): [True: 2, False: 219]
  ------------------
 3314|      6|        case 133: return 132.911515000;
  ------------------
  |  Branch (3314:9): [True: 6, False: 215]
  ------------------
 3315|      2|        case 134: return 133.908925000;
  ------------------
  |  Branch (3315:9): [True: 2, False: 219]
  ------------------
 3316|      2|        case 135: return 134.909151000;
  ------------------
  |  Branch (3316:9): [True: 2, False: 219]
  ------------------
 3317|      6|        case 136: return 135.907172000;
  ------------------
  |  Branch (3317:9): [True: 6, False: 215]
  ------------------
 3318|      6|        case 137: return 136.907806000;
  ------------------
  |  Branch (3318:9): [True: 6, False: 215]
  ------------------
 3319|      6|        case 138: return 137.905991000;
  ------------------
  |  Branch (3319:9): [True: 6, False: 215]
  ------------------
 3320|      6|        case 139: return 138.906653000;
  ------------------
  |  Branch (3320:9): [True: 6, False: 215]
  ------------------
 3321|     47|        case 0: case 140: return 139.905438000;
  ------------------
  |  Branch (3321:9): [True: 41, False: 180]
  |  Branch (3321:17): [True: 6, False: 215]
  ------------------
 3322|      2|        case 141: return 140.908276000;
  ------------------
  |  Branch (3322:9): [True: 2, False: 219]
  ------------------
 3323|      6|        case 142: return 141.909244000;
  ------------------
  |  Branch (3323:9): [True: 6, False: 215]
  ------------------
 3324|      6|        case 143: return 142.912386000;
  ------------------
  |  Branch (3324:9): [True: 6, False: 215]
  ------------------
 3325|     10|        case 144: return 143.913647000;
  ------------------
  |  Branch (3325:9): [True: 10, False: 211]
  ------------------
 3326|      6|        case 145: return 144.917230000;
  ------------------
  |  Branch (3326:9): [True: 6, False: 215]
  ------------------
 3327|      2|        case 146: return 145.918760000;
  ------------------
  |  Branch (3327:9): [True: 2, False: 219]
  ------------------
 3328|      2|        case 147: return 146.922670000;
  ------------------
  |  Branch (3328:9): [True: 2, False: 219]
  ------------------
 3329|      2|        case 148: return 147.924430000;
  ------------------
  |  Branch (3329:9): [True: 2, False: 219]
  ------------------
 3330|      6|        case 149: return 148.928400000;
  ------------------
  |  Branch (3330:9): [True: 6, False: 215]
  ------------------
 3331|      2|        case 150: return 149.930410000;
  ------------------
  |  Branch (3331:9): [True: 2, False: 219]
  ------------------
 3332|      8|        case 151: return 150.933980000;
  ------------------
  |  Branch (3332:9): [True: 8, False: 213]
  ------------------
 3333|      6|        case 152: return 151.936540000;
  ------------------
  |  Branch (3333:9): [True: 6, False: 215]
  ------------------
 3334|      2|        case 153: return 152.940580000;
  ------------------
  |  Branch (3334:9): [True: 2, False: 219]
  ------------------
 3335|      2|        case 154: return 153.943420000;
  ------------------
  |  Branch (3335:9): [True: 2, False: 219]
  ------------------
 3336|      2|        case 155: return 154.948040000;
  ------------------
  |  Branch (3336:9): [True: 2, False: 219]
  ------------------
 3337|      2|        case 156: return 155.951260000;
  ------------------
  |  Branch (3337:9): [True: 2, False: 219]
  ------------------
 3338|      2|        case 157: return 156.956340000;
  ------------------
  |  Branch (3338:9): [True: 2, False: 219]
  ------------------
 3339|    221|        }
 3340|     10|        break;
 3341|    280|      case 59:
  ------------------
  |  Branch (3341:7): [True: 280, False: 414k]
  ------------------
 3342|    280|        switch (isotope) {
  ------------------
  |  Branch (3342:17): [True: 274, False: 6]
  ------------------
 3343|      2|        case 121: return 120.955360000;
  ------------------
  |  Branch (3343:9): [True: 2, False: 278]
  ------------------
 3344|      8|        case 122: return 121.951810000;
  ------------------
  |  Branch (3344:9): [True: 8, False: 272]
  ------------------
 3345|      4|        case 123: return 122.945960000;
  ------------------
  |  Branch (3345:9): [True: 4, False: 276]
  ------------------
 3346|      6|        case 124: return 123.942960000;
  ------------------
  |  Branch (3346:9): [True: 6, False: 274]
  ------------------
 3347|      6|        case 125: return 124.937830000;
  ------------------
  |  Branch (3347:9): [True: 6, False: 274]
  ------------------
 3348|     12|        case 126: return 125.935310000;
  ------------------
  |  Branch (3348:9): [True: 12, False: 268]
  ------------------
 3349|     10|        case 127: return 126.930830000;
  ------------------
  |  Branch (3349:9): [True: 10, False: 270]
  ------------------
 3350|      8|        case 128: return 127.928790000;
  ------------------
  |  Branch (3350:9): [True: 8, False: 272]
  ------------------
 3351|      2|        case 129: return 128.925100000;
  ------------------
  |  Branch (3351:9): [True: 2, False: 278]
  ------------------
 3352|      2|        case 130: return 129.923590000;
  ------------------
  |  Branch (3352:9): [True: 2, False: 278]
  ------------------
 3353|      2|        case 131: return 130.920260000;
  ------------------
  |  Branch (3353:9): [True: 2, False: 278]
  ------------------
 3354|     16|        case 132: return 131.919260000;
  ------------------
  |  Branch (3354:9): [True: 16, False: 264]
  ------------------
 3355|      2|        case 133: return 132.916331000;
  ------------------
  |  Branch (3355:9): [True: 2, False: 278]
  ------------------
 3356|      6|        case 134: return 133.915710000;
  ------------------
  |  Branch (3356:9): [True: 6, False: 274]
  ------------------
 3357|      8|        case 135: return 134.913112000;
  ------------------
  |  Branch (3357:9): [True: 8, False: 272]
  ------------------
 3358|      2|        case 136: return 135.912692000;
  ------------------
  |  Branch (3358:9): [True: 2, False: 278]
  ------------------
 3359|      8|        case 137: return 136.910705000;
  ------------------
  |  Branch (3359:9): [True: 8, False: 272]
  ------------------
 3360|      2|        case 138: return 137.910755000;
  ------------------
  |  Branch (3360:9): [True: 2, False: 278]
  ------------------
 3361|      6|        case 139: return 138.908938000;
  ------------------
  |  Branch (3361:9): [True: 6, False: 274]
  ------------------
 3362|      6|        case 140: return 139.909076000;
  ------------------
  |  Branch (3362:9): [True: 6, False: 274]
  ------------------
 3363|     96|        case 0: case 141: return 140.907652000;
  ------------------
  |  Branch (3363:9): [True: 94, False: 186]
  |  Branch (3363:17): [True: 2, False: 278]
  ------------------
 3364|      2|        case 142: return 141.910044000;
  ------------------
  |  Branch (3364:9): [True: 2, False: 278]
  ------------------
 3365|      4|        case 143: return 142.910816000;
  ------------------
  |  Branch (3365:9): [True: 4, False: 276]
  ------------------
 3366|      2|        case 144: return 143.913305000;
  ------------------
  |  Branch (3366:9): [True: 2, False: 278]
  ------------------
 3367|      2|        case 145: return 144.914512000;
  ------------------
  |  Branch (3367:9): [True: 2, False: 278]
  ------------------
 3368|      2|        case 146: return 145.917640000;
  ------------------
  |  Branch (3368:9): [True: 2, False: 278]
  ------------------
 3369|      4|        case 147: return 146.918996000;
  ------------------
  |  Branch (3369:9): [True: 4, False: 276]
  ------------------
 3370|      2|        case 148: return 147.922135000;
  ------------------
  |  Branch (3370:9): [True: 2, False: 278]
  ------------------
 3371|     14|        case 149: return 148.923720000;
  ------------------
  |  Branch (3371:9): [True: 14, False: 266]
  ------------------
 3372|      2|        case 150: return 149.926673000;
  ------------------
  |  Branch (3372:9): [True: 2, False: 278]
  ------------------
 3373|      2|        case 151: return 150.928319000;
  ------------------
  |  Branch (3373:9): [True: 2, False: 278]
  ------------------
 3374|      6|        case 152: return 151.931500000;
  ------------------
  |  Branch (3374:9): [True: 6, False: 274]
  ------------------
 3375|      2|        case 153: return 152.933840000;
  ------------------
  |  Branch (3375:9): [True: 2, False: 278]
  ------------------
 3376|      2|        case 154: return 153.937520000;
  ------------------
  |  Branch (3376:9): [True: 2, False: 278]
  ------------------
 3377|      6|        case 155: return 154.940120000;
  ------------------
  |  Branch (3377:9): [True: 6, False: 274]
  ------------------
 3378|      2|        case 156: return 155.944270000;
  ------------------
  |  Branch (3378:9): [True: 2, False: 278]
  ------------------
 3379|      2|        case 157: return 156.947430000;
  ------------------
  |  Branch (3379:9): [True: 2, False: 278]
  ------------------
 3380|      2|        case 158: return 157.951980000;
  ------------------
  |  Branch (3380:9): [True: 2, False: 278]
  ------------------
 3381|      2|        case 159: return 158.955500000;
  ------------------
  |  Branch (3381:9): [True: 2, False: 278]
  ------------------
 3382|    280|        }
 3383|      6|        break;
 3384|    358|      case 60:
  ------------------
  |  Branch (3384:7): [True: 358, False: 414k]
  ------------------
 3385|    358|        switch (isotope) {
  ------------------
  |  Branch (3385:17): [True: 282, False: 76]
  ------------------
 3386|     12|        case 124: return 123.952230000;
  ------------------
  |  Branch (3386:9): [True: 12, False: 346]
  ------------------
 3387|      2|        case 125: return 124.948880000;
  ------------------
  |  Branch (3387:9): [True: 2, False: 356]
  ------------------
 3388|      6|        case 126: return 125.943220000;
  ------------------
  |  Branch (3388:9): [True: 6, False: 352]
  ------------------
 3389|      2|        case 127: return 126.940500000;
  ------------------
  |  Branch (3389:9): [True: 2, False: 356]
  ------------------
 3390|      2|        case 128: return 127.935390000;
  ------------------
  |  Branch (3390:9): [True: 2, False: 356]
  ------------------
 3391|      6|        case 129: return 128.933190000;
  ------------------
  |  Branch (3391:9): [True: 6, False: 352]
  ------------------
 3392|      6|        case 130: return 129.928510000;
  ------------------
  |  Branch (3392:9): [True: 6, False: 352]
  ------------------
 3393|      2|        case 131: return 130.927250000;
  ------------------
  |  Branch (3393:9): [True: 2, False: 356]
  ------------------
 3394|      6|        case 132: return 131.923321000;
  ------------------
  |  Branch (3394:9): [True: 6, False: 352]
  ------------------
 3395|      2|        case 133: return 132.922350000;
  ------------------
  |  Branch (3395:9): [True: 2, False: 356]
  ------------------
 3396|      8|        case 134: return 133.918790000;
  ------------------
  |  Branch (3396:9): [True: 8, False: 350]
  ------------------
 3397|      6|        case 135: return 134.918181000;
  ------------------
  |  Branch (3397:9): [True: 6, False: 352]
  ------------------
 3398|      2|        case 136: return 135.914976000;
  ------------------
  |  Branch (3398:9): [True: 2, False: 356]
  ------------------
 3399|     10|        case 137: return 136.914567000;
  ------------------
  |  Branch (3399:9): [True: 10, False: 348]
  ------------------
 3400|      2|        case 138: return 137.911950000;
  ------------------
  |  Branch (3400:9): [True: 2, False: 356]
  ------------------
 3401|     10|        case 139: return 138.911978000;
  ------------------
  |  Branch (3401:9): [True: 10, False: 348]
  ------------------
 3402|      2|        case 140: return 139.909550000;
  ------------------
  |  Branch (3402:9): [True: 2, False: 356]
  ------------------
 3403|      2|        case 141: return 140.909610000;
  ------------------
  |  Branch (3403:9): [True: 2, False: 356]
  ------------------
 3404|     36|        case 0: case 142: return 141.907723000;
  ------------------
  |  Branch (3404:9): [True: 34, False: 324]
  |  Branch (3404:17): [True: 2, False: 356]
  ------------------
 3405|      2|        case 143: return 142.909814000;
  ------------------
  |  Branch (3405:9): [True: 2, False: 356]
  ------------------
 3406|      6|        case 144: return 143.910087000;
  ------------------
  |  Branch (3406:9): [True: 6, False: 352]
  ------------------
 3407|      4|        case 145: return 144.912573000;
  ------------------
  |  Branch (3407:9): [True: 4, False: 354]
  ------------------
 3408|      2|        case 146: return 145.913116000;
  ------------------
  |  Branch (3408:9): [True: 2, False: 356]
  ------------------
 3409|      2|        case 147: return 146.916100000;
  ------------------
  |  Branch (3409:9): [True: 2, False: 356]
  ------------------
 3410|      2|        case 148: return 147.916893000;
  ------------------
  |  Branch (3410:9): [True: 2, False: 356]
  ------------------
 3411|      2|        case 149: return 148.920149000;
  ------------------
  |  Branch (3411:9): [True: 2, False: 356]
  ------------------
 3412|     14|        case 150: return 149.920891000;
  ------------------
  |  Branch (3412:9): [True: 14, False: 344]
  ------------------
 3413|      2|        case 151: return 150.923829000;
  ------------------
  |  Branch (3413:9): [True: 2, False: 356]
  ------------------
 3414|      6|        case 152: return 151.924682000;
  ------------------
  |  Branch (3414:9): [True: 6, False: 352]
  ------------------
 3415|     14|        case 153: return 152.927698000;
  ------------------
  |  Branch (3415:9): [True: 14, False: 344]
  ------------------
 3416|     16|        case 154: return 153.929480000;
  ------------------
  |  Branch (3416:9): [True: 16, False: 342]
  ------------------
 3417|     14|        case 155: return 154.932930000;
  ------------------
  |  Branch (3417:9): [True: 14, False: 344]
  ------------------
 3418|      6|        case 156: return 155.935020000;
  ------------------
  |  Branch (3418:9): [True: 6, False: 352]
  ------------------
 3419|     40|        case 157: return 156.939030000;
  ------------------
  |  Branch (3419:9): [True: 40, False: 318]
  ------------------
 3420|      6|        case 158: return 157.941600000;
  ------------------
  |  Branch (3420:9): [True: 6, False: 352]
  ------------------
 3421|      6|        case 159: return 158.946090000;
  ------------------
  |  Branch (3421:9): [True: 6, False: 352]
  ------------------
 3422|     12|        case 160: return 159.949090000;
  ------------------
  |  Branch (3422:9): [True: 12, False: 346]
  ------------------
 3423|      2|        case 161: return 160.953880000;
  ------------------
  |  Branch (3423:9): [True: 2, False: 356]
  ------------------
 3424|    358|        }
 3425|     76|        break;
 3426|    588|      case 61:
  ------------------
  |  Branch (3426:7): [True: 588, False: 414k]
  ------------------
 3427|    588|        switch (isotope) {
  ------------------
  |  Branch (3427:17): [True: 474, False: 114]
  ------------------
 3428|     16|        case 126: return 125.957520000;
  ------------------
  |  Branch (3428:9): [True: 16, False: 572]
  ------------------
 3429|      2|        case 127: return 126.951630000;
  ------------------
  |  Branch (3429:9): [True: 2, False: 586]
  ------------------
 3430|      8|        case 128: return 127.948420000;
  ------------------
  |  Branch (3430:9): [True: 8, False: 580]
  ------------------
 3431|      6|        case 129: return 128.943160000;
  ------------------
  |  Branch (3431:9): [True: 6, False: 582]
  ------------------
 3432|      6|        case 130: return 129.940450000;
  ------------------
  |  Branch (3432:9): [True: 6, False: 582]
  ------------------
 3433|      2|        case 131: return 130.935870000;
  ------------------
  |  Branch (3433:9): [True: 2, False: 586]
  ------------------
 3434|      6|        case 132: return 131.933750000;
  ------------------
  |  Branch (3434:9): [True: 6, False: 582]
  ------------------
 3435|      2|        case 133: return 132.929780000;
  ------------------
  |  Branch (3435:9): [True: 2, False: 586]
  ------------------
 3436|      6|        case 134: return 133.928350000;
  ------------------
  |  Branch (3436:9): [True: 6, False: 582]
  ------------------
 3437|      8|        case 135: return 134.924880000;
  ------------------
  |  Branch (3437:9): [True: 8, False: 580]
  ------------------
 3438|      6|        case 136: return 135.923570000;
  ------------------
  |  Branch (3438:9): [True: 6, False: 582]
  ------------------
 3439|      2|        case 137: return 136.920479000;
  ------------------
  |  Branch (3439:9): [True: 2, False: 586]
  ------------------
 3440|      6|        case 138: return 137.919548000;
  ------------------
  |  Branch (3440:9): [True: 6, False: 582]
  ------------------
 3441|      8|        case 139: return 138.916804000;
  ------------------
  |  Branch (3441:9): [True: 8, False: 580]
  ------------------
 3442|     24|        case 140: return 139.916040000;
  ------------------
  |  Branch (3442:9): [True: 24, False: 564]
  ------------------
 3443|      2|        case 141: return 140.913555000;
  ------------------
  |  Branch (3443:9): [True: 2, False: 586]
  ------------------
 3444|      2|        case 142: return 141.912874000;
  ------------------
  |  Branch (3444:9): [True: 2, False: 586]
  ------------------
 3445|      2|        case 143: return 142.910933000;
  ------------------
  |  Branch (3445:9): [True: 2, False: 586]
  ------------------
 3446|      6|        case 144: return 143.912591000;
  ------------------
  |  Branch (3446:9): [True: 6, False: 582]
  ------------------
 3447|     94|        case 0: case 145: return 144.912749000;
  ------------------
  |  Branch (3447:9): [True: 88, False: 500]
  |  Branch (3447:17): [True: 6, False: 582]
  ------------------
 3448|      2|        case 146: return 145.914696000;
  ------------------
  |  Branch (3448:9): [True: 2, False: 586]
  ------------------
 3449|      2|        case 147: return 146.915138000;
  ------------------
  |  Branch (3449:9): [True: 2, False: 586]
  ------------------
 3450|      6|        case 148: return 147.917475000;
  ------------------
  |  Branch (3450:9): [True: 6, False: 582]
  ------------------
 3451|      2|        case 149: return 148.918334000;
  ------------------
  |  Branch (3451:9): [True: 2, False: 586]
  ------------------
 3452|    176|        case 150: return 149.920984000;
  ------------------
  |  Branch (3452:9): [True: 176, False: 412]
  ------------------
 3453|      2|        case 151: return 150.921207000;
  ------------------
  |  Branch (3453:9): [True: 2, False: 586]
  ------------------
 3454|      6|        case 152: return 151.923497000;
  ------------------
  |  Branch (3454:9): [True: 6, False: 582]
  ------------------
 3455|      2|        case 153: return 152.924117000;
  ------------------
  |  Branch (3455:9): [True: 2, False: 586]
  ------------------
 3456|      2|        case 154: return 153.926460000;
  ------------------
  |  Branch (3456:9): [True: 2, False: 586]
  ------------------
 3457|     10|        case 155: return 154.928100000;
  ------------------
  |  Branch (3457:9): [True: 10, False: 578]
  ------------------
 3458|      4|        case 156: return 155.931060000;
  ------------------
  |  Branch (3458:9): [True: 4, False: 584]
  ------------------
 3459|     10|        case 157: return 156.933040000;
  ------------------
  |  Branch (3459:9): [True: 10, False: 578]
  ------------------
 3460|     16|        case 158: return 157.936560000;
  ------------------
  |  Branch (3460:9): [True: 16, False: 572]
  ------------------
 3461|      2|        case 159: return 158.938970000;
  ------------------
  |  Branch (3461:9): [True: 2, False: 586]
  ------------------
 3462|      4|        case 160: return 159.942990000;
  ------------------
  |  Branch (3462:9): [True: 4, False: 584]
  ------------------
 3463|      6|        case 161: return 160.945860000;
  ------------------
  |  Branch (3463:9): [True: 6, False: 582]
  ------------------
 3464|      2|        case 162: return 161.950290000;
  ------------------
  |  Branch (3464:9): [True: 2, False: 586]
  ------------------
 3465|      6|        case 163: return 162.953680000;
  ------------------
  |  Branch (3465:9): [True: 6, False: 582]
  ------------------
 3466|    588|        }
 3467|    114|        break;
 3468|  1.85k|      case 62:
  ------------------
  |  Branch (3468:7): [True: 1.85k, False: 413k]
  ------------------
 3469|  1.85k|        switch (isotope) {
  ------------------
  |  Branch (3469:17): [True: 1.54k, False: 316]
  ------------------
 3470|     34|        case 128: return 127.958080000;
  ------------------
  |  Branch (3470:9): [True: 34, False: 1.82k]
  ------------------
 3471|      6|        case 129: return 128.954640000;
  ------------------
  |  Branch (3471:9): [True: 6, False: 1.85k]
  ------------------
 3472|     16|        case 130: return 129.948920000;
  ------------------
  |  Branch (3472:9): [True: 16, False: 1.84k]
  ------------------
 3473|      6|        case 131: return 130.946110000;
  ------------------
  |  Branch (3473:9): [True: 6, False: 1.85k]
  ------------------
 3474|      2|        case 132: return 131.940690000;
  ------------------
  |  Branch (3474:9): [True: 2, False: 1.85k]
  ------------------
 3475|      2|        case 133: return 132.938670000;
  ------------------
  |  Branch (3475:9): [True: 2, False: 1.85k]
  ------------------
 3476|     10|        case 134: return 133.933970000;
  ------------------
  |  Branch (3476:9): [True: 10, False: 1.84k]
  ------------------
 3477|      8|        case 135: return 134.932520000;
  ------------------
  |  Branch (3477:9): [True: 8, False: 1.85k]
  ------------------
 3478|      6|        case 136: return 135.928276000;
  ------------------
  |  Branch (3478:9): [True: 6, False: 1.85k]
  ------------------
 3479|     10|        case 137: return 136.926970000;
  ------------------
  |  Branch (3479:9): [True: 10, False: 1.84k]
  ------------------
 3480|  1.16k|        case 138: return 137.923244000;
  ------------------
  |  Branch (3480:9): [True: 1.16k, False: 690]
  ------------------
 3481|     12|        case 139: return 138.922297000;
  ------------------
  |  Branch (3481:9): [True: 12, False: 1.84k]
  ------------------
 3482|     14|        case 140: return 139.918995000;
  ------------------
  |  Branch (3482:9): [True: 14, False: 1.84k]
  ------------------
 3483|      6|        case 141: return 140.918476000;
  ------------------
  |  Branch (3483:9): [True: 6, False: 1.85k]
  ------------------
 3484|      2|        case 142: return 141.915198000;
  ------------------
  |  Branch (3484:9): [True: 2, False: 1.85k]
  ------------------
 3485|      4|        case 143: return 142.914628000;
  ------------------
  |  Branch (3485:9): [True: 4, False: 1.85k]
  ------------------
 3486|      6|        case 144: return 143.911999000;
  ------------------
  |  Branch (3486:9): [True: 6, False: 1.85k]
  ------------------
 3487|      6|        case 145: return 144.913410000;
  ------------------
  |  Branch (3487:9): [True: 6, False: 1.85k]
  ------------------
 3488|      6|        case 146: return 145.913041000;
  ------------------
  |  Branch (3488:9): [True: 6, False: 1.85k]
  ------------------
 3489|      2|        case 147: return 146.914897000;
  ------------------
  |  Branch (3489:9): [True: 2, False: 1.85k]
  ------------------
 3490|      6|        case 148: return 147.914822000;
  ------------------
  |  Branch (3490:9): [True: 6, False: 1.85k]
  ------------------
 3491|      2|        case 149: return 148.917184000;
  ------------------
  |  Branch (3491:9): [True: 2, False: 1.85k]
  ------------------
 3492|      2|        case 150: return 149.917275000;
  ------------------
  |  Branch (3492:9): [True: 2, False: 1.85k]
  ------------------
 3493|     10|        case 151: return 150.919932000;
  ------------------
  |  Branch (3493:9): [True: 10, False: 1.84k]
  ------------------
 3494|    134|        case 0: case 152: return 151.919732000;
  ------------------
  |  Branch (3494:9): [True: 132, False: 1.72k]
  |  Branch (3494:17): [True: 2, False: 1.85k]
  ------------------
 3495|      2|        case 153: return 152.922097000;
  ------------------
  |  Branch (3495:9): [True: 2, False: 1.85k]
  ------------------
 3496|      2|        case 154: return 153.922209000;
  ------------------
  |  Branch (3496:9): [True: 2, False: 1.85k]
  ------------------
 3497|     22|        case 155: return 154.924640000;
  ------------------
  |  Branch (3497:9): [True: 22, False: 1.83k]
  ------------------
 3498|      6|        case 156: return 155.925528000;
  ------------------
  |  Branch (3498:9): [True: 6, False: 1.85k]
  ------------------
 3499|      2|        case 157: return 156.928360000;
  ------------------
  |  Branch (3499:9): [True: 2, False: 1.85k]
  ------------------
 3500|      2|        case 158: return 157.929990000;
  ------------------
  |  Branch (3500:9): [True: 2, False: 1.85k]
  ------------------
 3501|      2|        case 159: return 158.933210000;
  ------------------
  |  Branch (3501:9): [True: 2, False: 1.85k]
  ------------------
 3502|      2|        case 160: return 159.935140000;
  ------------------
  |  Branch (3502:9): [True: 2, False: 1.85k]
  ------------------
 3503|      6|        case 161: return 160.938830000;
  ------------------
  |  Branch (3503:9): [True: 6, False: 1.85k]
  ------------------
 3504|      2|        case 162: return 161.941220000;
  ------------------
  |  Branch (3504:9): [True: 2, False: 1.85k]
  ------------------
 3505|      2|        case 163: return 162.945360000;
  ------------------
  |  Branch (3505:9): [True: 2, False: 1.85k]
  ------------------
 3506|      6|        case 164: return 163.948280000;
  ------------------
  |  Branch (3506:9): [True: 6, False: 1.85k]
  ------------------
 3507|      6|        case 165: return 164.952980000;
  ------------------
  |  Branch (3507:9): [True: 6, False: 1.85k]
  ------------------
 3508|  1.85k|        }
 3509|    316|        break;
 3510|    316|      case 63:
  ------------------
  |  Branch (3510:7): [True: 250, False: 414k]
  ------------------
 3511|    250|        switch (isotope) {
  ------------------
  |  Branch (3511:17): [True: 192, False: 58]
  ------------------
 3512|      8|        case 130: return 129.963570000;
  ------------------
  |  Branch (3512:9): [True: 8, False: 242]
  ------------------
 3513|      2|        case 131: return 130.957750000;
  ------------------
  |  Branch (3513:9): [True: 2, False: 248]
  ------------------
 3514|      2|        case 132: return 131.954370000;
  ------------------
  |  Branch (3514:9): [True: 2, False: 248]
  ------------------
 3515|      2|        case 133: return 132.949240000;
  ------------------
  |  Branch (3515:9): [True: 2, False: 248]
  ------------------
 3516|      6|        case 134: return 133.946510000;
  ------------------
  |  Branch (3516:9): [True: 6, False: 244]
  ------------------
 3517|      2|        case 135: return 134.941820000;
  ------------------
  |  Branch (3517:9): [True: 2, False: 248]
  ------------------
 3518|      2|        case 136: return 135.939600000;
  ------------------
  |  Branch (3518:9): [True: 2, False: 248]
  ------------------
 3519|      2|        case 137: return 136.935570000;
  ------------------
  |  Branch (3519:9): [True: 2, False: 248]
  ------------------
 3520|      2|        case 138: return 137.933710000;
  ------------------
  |  Branch (3520:9): [True: 2, False: 248]
  ------------------
 3521|      6|        case 139: return 138.929792000;
  ------------------
  |  Branch (3521:9): [True: 6, False: 244]
  ------------------
 3522|      2|        case 140: return 139.928090000;
  ------------------
  |  Branch (3522:9): [True: 2, False: 248]
  ------------------
 3523|      6|        case 141: return 140.924931000;
  ------------------
  |  Branch (3523:9): [True: 6, False: 244]
  ------------------
 3524|      6|        case 142: return 141.923430000;
  ------------------
  |  Branch (3524:9): [True: 6, False: 244]
  ------------------
 3525|      2|        case 143: return 142.920298000;
  ------------------
  |  Branch (3525:9): [True: 2, False: 248]
  ------------------
 3526|      2|        case 144: return 143.918817000;
  ------------------
  |  Branch (3526:9): [True: 2, False: 248]
  ------------------
 3527|      2|        case 145: return 144.916265000;
  ------------------
  |  Branch (3527:9): [True: 2, False: 248]
  ------------------
 3528|      6|        case 146: return 145.917206000;
  ------------------
  |  Branch (3528:9): [True: 6, False: 244]
  ------------------
 3529|      2|        case 147: return 146.916746000;
  ------------------
  |  Branch (3529:9): [True: 2, False: 248]
  ------------------
 3530|      6|        case 148: return 147.918086000;
  ------------------
  |  Branch (3530:9): [True: 6, False: 244]
  ------------------
 3531|      2|        case 149: return 148.917931000;
  ------------------
  |  Branch (3531:9): [True: 2, False: 248]
  ------------------
 3532|      8|        case 150: return 149.919702000;
  ------------------
  |  Branch (3532:9): [True: 8, False: 242]
  ------------------
 3533|      2|        case 151: return 150.919850000;
  ------------------
  |  Branch (3533:9): [True: 2, False: 248]
  ------------------
 3534|      2|        case 152: return 151.921744000;
  ------------------
  |  Branch (3534:9): [True: 2, False: 248]
  ------------------
 3535|     62|        case 0: case 153: return 152.921230000;
  ------------------
  |  Branch (3535:9): [True: 60, False: 190]
  |  Branch (3535:17): [True: 2, False: 248]
  ------------------
 3536|      2|        case 154: return 153.922979000;
  ------------------
  |  Branch (3536:9): [True: 2, False: 248]
  ------------------
 3537|      2|        case 155: return 154.922893000;
  ------------------
  |  Branch (3537:9): [True: 2, False: 248]
  ------------------
 3538|      2|        case 156: return 155.924752000;
  ------------------
  |  Branch (3538:9): [True: 2, False: 248]
  ------------------
 3539|      4|        case 157: return 156.925424000;
  ------------------
  |  Branch (3539:9): [True: 4, False: 246]
  ------------------
 3540|      2|        case 158: return 157.927850000;
  ------------------
  |  Branch (3540:9): [True: 2, False: 248]
  ------------------
 3541|      4|        case 159: return 158.929089000;
  ------------------
  |  Branch (3541:9): [True: 4, False: 246]
  ------------------
 3542|      6|        case 160: return 159.931970000;
  ------------------
  |  Branch (3542:9): [True: 6, False: 244]
  ------------------
 3543|      6|        case 161: return 160.933680000;
  ------------------
  |  Branch (3543:9): [True: 6, False: 244]
  ------------------
 3544|      2|        case 162: return 161.937040000;
  ------------------
  |  Branch (3544:9): [True: 2, False: 248]
  ------------------
 3545|      2|        case 163: return 162.939210000;
  ------------------
  |  Branch (3545:9): [True: 2, False: 248]
  ------------------
 3546|      2|        case 164: return 163.942990000;
  ------------------
  |  Branch (3546:9): [True: 2, False: 248]
  ------------------
 3547|      6|        case 165: return 164.945720000;
  ------------------
  |  Branch (3547:9): [True: 6, False: 244]
  ------------------
 3548|      2|        case 166: return 165.949970000;
  ------------------
  |  Branch (3548:9): [True: 2, False: 248]
  ------------------
 3549|      6|        case 167: return 166.953210000;
  ------------------
  |  Branch (3549:9): [True: 6, False: 244]
  ------------------
 3550|    250|        }
 3551|     58|        break;
 3552|    353|      case 64:
  ------------------
  |  Branch (3552:7): [True: 353, False: 414k]
  ------------------
 3553|    353|        switch (isotope) {
  ------------------
  |  Branch (3553:17): [True: 325, False: 28]
  ------------------
 3554|     12|        case 134: return 133.955370000;
  ------------------
  |  Branch (3554:9): [True: 12, False: 341]
  ------------------
 3555|      2|        case 135: return 134.952570000;
  ------------------
  |  Branch (3555:9): [True: 2, False: 351]
  ------------------
 3556|      2|        case 136: return 135.947340000;
  ------------------
  |  Branch (3556:9): [True: 2, False: 351]
  ------------------
 3557|      6|        case 137: return 136.945020000;
  ------------------
  |  Branch (3557:9): [True: 6, False: 347]
  ------------------
 3558|      6|        case 138: return 137.940120000;
  ------------------
  |  Branch (3558:9): [True: 6, False: 347]
  ------------------
 3559|      6|        case 139: return 138.938240000;
  ------------------
  |  Branch (3559:9): [True: 6, False: 347]
  ------------------
 3560|      2|        case 140: return 139.933670000;
  ------------------
  |  Branch (3560:9): [True: 2, False: 351]
  ------------------
 3561|      2|        case 141: return 140.932126000;
  ------------------
  |  Branch (3561:9): [True: 2, False: 351]
  ------------------
 3562|      6|        case 142: return 141.928120000;
  ------------------
  |  Branch (3562:9): [True: 6, False: 347]
  ------------------
 3563|      6|        case 143: return 142.926750000;
  ------------------
  |  Branch (3563:9): [True: 6, False: 347]
  ------------------
 3564|      2|        case 144: return 143.922960000;
  ------------------
  |  Branch (3564:9): [True: 2, False: 351]
  ------------------
 3565|      2|        case 145: return 144.921709000;
  ------------------
  |  Branch (3565:9): [True: 2, False: 351]
  ------------------
 3566|      2|        case 146: return 145.918311000;
  ------------------
  |  Branch (3566:9): [True: 2, False: 351]
  ------------------
 3567|      2|        case 147: return 146.919094000;
  ------------------
  |  Branch (3567:9): [True: 2, False: 351]
  ------------------
 3568|      6|        case 148: return 147.918115000;
  ------------------
  |  Branch (3568:9): [True: 6, False: 347]
  ------------------
 3569|      2|        case 149: return 148.919341000;
  ------------------
  |  Branch (3569:9): [True: 2, False: 351]
  ------------------
 3570|     16|        case 150: return 149.918659000;
  ------------------
  |  Branch (3570:9): [True: 16, False: 337]
  ------------------
 3571|      8|        case 151: return 150.920348000;
  ------------------
  |  Branch (3571:9): [True: 8, False: 345]
  ------------------
 3572|      2|        case 152: return 151.919791000;
  ------------------
  |  Branch (3572:9): [True: 2, False: 351]
  ------------------
 3573|      6|        case 153: return 152.921749000;
  ------------------
  |  Branch (3573:9): [True: 6, False: 347]
  ------------------
 3574|     52|        case 154: return 153.920865000;
  ------------------
  |  Branch (3574:9): [True: 52, False: 301]
  ------------------
 3575|      2|        case 155: return 154.922622000;
  ------------------
  |  Branch (3575:9): [True: 2, False: 351]
  ------------------
 3576|      6|        case 156: return 155.922122000;
  ------------------
  |  Branch (3576:9): [True: 6, False: 347]
  ------------------
 3577|      4|        case 157: return 156.923960000;
  ------------------
  |  Branch (3577:9): [True: 4, False: 349]
  ------------------
 3578|    119|        case 0: case 158: return 157.924103000;
  ------------------
  |  Branch (3578:9): [True: 109, False: 244]
  |  Branch (3578:17): [True: 10, False: 343]
  ------------------
 3579|      2|        case 159: return 158.926388000;
  ------------------
  |  Branch (3579:9): [True: 2, False: 351]
  ------------------
 3580|      2|        case 160: return 159.927054000;
  ------------------
  |  Branch (3580:9): [True: 2, False: 351]
  ------------------
 3581|      6|        case 161: return 160.929669000;
  ------------------
  |  Branch (3581:9): [True: 6, False: 347]
  ------------------
 3582|      2|        case 162: return 161.930985000;
  ------------------
  |  Branch (3582:9): [True: 2, False: 351]
  ------------------
 3583|      6|        case 163: return 162.933990000;
  ------------------
  |  Branch (3583:9): [True: 6, False: 347]
  ------------------
 3584|      6|        case 164: return 163.935860000;
  ------------------
  |  Branch (3584:9): [True: 6, False: 347]
  ------------------
 3585|      4|        case 165: return 164.939380000;
  ------------------
  |  Branch (3585:9): [True: 4, False: 349]
  ------------------
 3586|      2|        case 166: return 165.941600000;
  ------------------
  |  Branch (3586:9): [True: 2, False: 351]
  ------------------
 3587|      6|        case 167: return 166.945570000;
  ------------------
  |  Branch (3587:9): [True: 6, False: 347]
  ------------------
 3588|      2|        case 168: return 167.948360000;
  ------------------
  |  Branch (3588:9): [True: 2, False: 351]
  ------------------
 3589|      6|        case 169: return 168.952870000;
  ------------------
  |  Branch (3589:9): [True: 6, False: 347]
  ------------------
 3590|    353|        }
 3591|     28|        break;
 3592|    497|      case 65:
  ------------------
  |  Branch (3592:7): [True: 497, False: 414k]
  ------------------
 3593|    497|        switch (isotope) {
  ------------------
  |  Branch (3593:17): [True: 467, False: 30]
  ------------------
 3594|      2|        case 136: return 135.961380000;
  ------------------
  |  Branch (3594:9): [True: 2, False: 495]
  ------------------
 3595|      6|        case 137: return 136.955980000;
  ------------------
  |  Branch (3595:9): [True: 6, False: 491]
  ------------------
 3596|      6|        case 138: return 137.953160000;
  ------------------
  |  Branch (3596:9): [True: 6, False: 491]
  ------------------
 3597|      6|        case 139: return 138.948290000;
  ------------------
  |  Branch (3597:9): [True: 6, False: 491]
  ------------------
 3598|      6|        case 140: return 139.945810000;
  ------------------
  |  Branch (3598:9): [True: 6, False: 491]
  ------------------
 3599|      2|        case 141: return 140.941450000;
  ------------------
  |  Branch (3599:9): [True: 2, False: 495]
  ------------------
 3600|      2|        case 142: return 141.938740000;
  ------------------
  |  Branch (3600:9): [True: 2, False: 495]
  ------------------
 3601|     12|        case 143: return 142.935120000;
  ------------------
  |  Branch (3601:9): [True: 12, False: 485]
  ------------------
 3602|      6|        case 144: return 143.933050000;
  ------------------
  |  Branch (3602:9): [True: 6, False: 491]
  ------------------
 3603|      2|        case 145: return 144.929270000;
  ------------------
  |  Branch (3603:9): [True: 2, False: 495]
  ------------------
 3604|      2|        case 146: return 145.927250000;
  ------------------
  |  Branch (3604:9): [True: 2, False: 495]
  ------------------
 3605|     18|        case 147: return 146.924045000;
  ------------------
  |  Branch (3605:9): [True: 18, False: 479]
  ------------------
 3606|     36|        case 148: return 147.924272000;
  ------------------
  |  Branch (3606:9): [True: 36, False: 461]
  ------------------
 3607|      2|        case 149: return 148.923246000;
  ------------------
  |  Branch (3607:9): [True: 2, False: 495]
  ------------------
 3608|      6|        case 150: return 149.923660000;
  ------------------
  |  Branch (3608:9): [True: 6, False: 491]
  ------------------
 3609|      2|        case 151: return 150.923103000;
  ------------------
  |  Branch (3609:9): [True: 2, False: 495]
  ------------------
 3610|      2|        case 152: return 151.924070000;
  ------------------
  |  Branch (3610:9): [True: 2, False: 495]
  ------------------
 3611|      8|        case 153: return 152.923435000;
  ------------------
  |  Branch (3611:9): [True: 8, False: 489]
  ------------------
 3612|      2|        case 154: return 153.924680000;
  ------------------
  |  Branch (3612:9): [True: 2, False: 495]
  ------------------
 3613|      2|        case 155: return 154.923505000;
  ------------------
  |  Branch (3613:9): [True: 2, False: 495]
  ------------------
 3614|     10|        case 156: return 155.924747000;
  ------------------
  |  Branch (3614:9): [True: 10, False: 487]
  ------------------
 3615|      2|        case 157: return 156.924024000;
  ------------------
  |  Branch (3615:9): [True: 2, False: 495]
  ------------------
 3616|      2|        case 158: return 157.925413000;
  ------------------
  |  Branch (3616:9): [True: 2, False: 495]
  ------------------
 3617|    113|        case 0: case 159: return 158.925346000;
  ------------------
  |  Branch (3617:9): [True: 111, False: 386]
  |  Branch (3617:17): [True: 2, False: 495]
  ------------------
 3618|      2|        case 160: return 159.927167000;
  ------------------
  |  Branch (3618:9): [True: 2, False: 495]
  ------------------
 3619|      4|        case 161: return 160.927569000;
  ------------------
  |  Branch (3619:9): [True: 4, False: 493]
  ------------------
 3620|      2|        case 162: return 161.929490000;
  ------------------
  |  Branch (3620:9): [True: 2, False: 495]
  ------------------
 3621|      6|        case 163: return 162.930648000;
  ------------------
  |  Branch (3621:9): [True: 6, False: 491]
  ------------------
 3622|      2|        case 164: return 163.933350000;
  ------------------
  |  Branch (3622:9): [True: 2, False: 495]
  ------------------
 3623|      2|        case 165: return 164.934880000;
  ------------------
  |  Branch (3623:9): [True: 2, False: 495]
  ------------------
 3624|      6|        case 166: return 165.937990000;
  ------------------
  |  Branch (3624:9): [True: 6, False: 491]
  ------------------
 3625|    156|        case 167: return 166.940050000;
  ------------------
  |  Branch (3625:9): [True: 156, False: 341]
  ------------------
 3626|     10|        case 168: return 167.943640000;
  ------------------
  |  Branch (3626:9): [True: 10, False: 487]
  ------------------
 3627|      2|        case 169: return 168.946220000;
  ------------------
  |  Branch (3627:9): [True: 2, False: 495]
  ------------------
 3628|     16|        case 170: return 169.950250000;
  ------------------
  |  Branch (3628:9): [True: 16, False: 481]
  ------------------
 3629|      2|        case 171: return 170.953300000;
  ------------------
  |  Branch (3629:9): [True: 2, False: 495]
  ------------------
 3630|    497|        }
 3631|     30|        break;
 3632|    217|      case 66:
  ------------------
  |  Branch (3632:7): [True: 217, False: 414k]
  ------------------
 3633|    217|        switch (isotope) {
  ------------------
  |  Branch (3633:17): [True: 211, False: 6]
  ------------------
 3634|      2|        case 138: return 137.962490000;
  ------------------
  |  Branch (3634:9): [True: 2, False: 215]
  ------------------
 3635|      6|        case 139: return 138.959540000;
  ------------------
  |  Branch (3635:9): [True: 6, False: 211]
  ------------------
 3636|      6|        case 140: return 139.954010000;
  ------------------
  |  Branch (3636:9): [True: 6, False: 211]
  ------------------
 3637|      2|        case 141: return 140.951350000;
  ------------------
  |  Branch (3637:9): [True: 2, False: 215]
  ------------------
 3638|      2|        case 142: return 141.946370000;
  ------------------
  |  Branch (3638:9): [True: 2, False: 215]
  ------------------
 3639|      6|        case 143: return 142.943830000;
  ------------------
  |  Branch (3639:9): [True: 6, False: 211]
  ------------------
 3640|      2|        case 144: return 143.939250000;
  ------------------
  |  Branch (3640:9): [True: 2, False: 215]
  ------------------
 3641|      2|        case 145: return 144.937430000;
  ------------------
  |  Branch (3641:9): [True: 2, False: 215]
  ------------------
 3642|      2|        case 146: return 145.932845000;
  ------------------
  |  Branch (3642:9): [True: 2, False: 215]
  ------------------
 3643|      2|        case 147: return 146.931092000;
  ------------------
  |  Branch (3643:9): [True: 2, False: 215]
  ------------------
 3644|      6|        case 148: return 147.927150000;
  ------------------
  |  Branch (3644:9): [True: 6, False: 211]
  ------------------
 3645|      6|        case 149: return 148.927305000;
  ------------------
  |  Branch (3645:9): [True: 6, False: 211]
  ------------------
 3646|      2|        case 150: return 149.925585000;
  ------------------
  |  Branch (3646:9): [True: 2, False: 215]
  ------------------
 3647|      2|        case 151: return 150.926185000;
  ------------------
  |  Branch (3647:9): [True: 2, False: 215]
  ------------------
 3648|      2|        case 152: return 151.924718000;
  ------------------
  |  Branch (3648:9): [True: 2, False: 215]
  ------------------
 3649|      2|        case 153: return 152.925765000;
  ------------------
  |  Branch (3649:9): [True: 2, False: 215]
  ------------------
 3650|      2|        case 154: return 153.924424000;
  ------------------
  |  Branch (3650:9): [True: 2, False: 215]
  ------------------
 3651|      2|        case 155: return 154.925754000;
  ------------------
  |  Branch (3651:9): [True: 2, False: 215]
  ------------------
 3652|      2|        case 156: return 155.924283000;
  ------------------
  |  Branch (3652:9): [True: 2, False: 215]
  ------------------
 3653|      2|        case 157: return 156.925466000;
  ------------------
  |  Branch (3653:9): [True: 2, False: 215]
  ------------------
 3654|      6|        case 158: return 157.924409000;
  ------------------
  |  Branch (3654:9): [True: 6, False: 211]
  ------------------
 3655|      2|        case 159: return 158.925739000;
  ------------------
  |  Branch (3655:9): [True: 2, False: 215]
  ------------------
 3656|      2|        case 160: return 159.925197000;
  ------------------
  |  Branch (3656:9): [True: 2, False: 215]
  ------------------
 3657|      6|        case 161: return 160.926933000;
  ------------------
  |  Branch (3657:9): [True: 6, False: 211]
  ------------------
 3658|      2|        case 162: return 161.926798000;
  ------------------
  |  Branch (3658:9): [True: 2, False: 215]
  ------------------
 3659|      6|        case 163: return 162.928731000;
  ------------------
  |  Branch (3659:9): [True: 6, False: 211]
  ------------------
 3660|    107|        case 0: case 164: return 163.929174000;
  ------------------
  |  Branch (3660:9): [True: 105, False: 112]
  |  Branch (3660:17): [True: 2, False: 215]
  ------------------
 3661|      2|        case 165: return 164.931703000;
  ------------------
  |  Branch (3661:9): [True: 2, False: 215]
  ------------------
 3662|      2|        case 166: return 165.932806000;
  ------------------
  |  Branch (3662:9): [True: 2, False: 215]
  ------------------
 3663|      2|        case 167: return 166.935660000;
  ------------------
  |  Branch (3663:9): [True: 2, False: 215]
  ------------------
 3664|      2|        case 168: return 167.937130000;
  ------------------
  |  Branch (3664:9): [True: 2, False: 215]
  ------------------
 3665|      2|        case 169: return 168.940310000;
  ------------------
  |  Branch (3665:9): [True: 2, False: 215]
  ------------------
 3666|      2|        case 170: return 169.942390000;
  ------------------
  |  Branch (3666:9): [True: 2, False: 215]
  ------------------
 3667|      2|        case 171: return 170.946200000;
  ------------------
  |  Branch (3667:9): [True: 2, False: 215]
  ------------------
 3668|      2|        case 172: return 171.948760000;
  ------------------
  |  Branch (3668:9): [True: 2, False: 215]
  ------------------
 3669|      4|        case 173: return 172.953000000;
  ------------------
  |  Branch (3669:9): [True: 4, False: 213]
  ------------------
 3670|    217|        }
 3671|      6|        break;
 3672|    433|      case 67:
  ------------------
  |  Branch (3672:7): [True: 433, False: 414k]
  ------------------
 3673|    433|        switch (isotope) {
  ------------------
  |  Branch (3673:17): [True: 401, False: 32]
  ------------------
 3674|     10|        case 140: return 139.968540000;
  ------------------
  |  Branch (3674:9): [True: 10, False: 423]
  ------------------
 3675|      8|        case 141: return 140.963100000;
  ------------------
  |  Branch (3675:9): [True: 8, False: 425]
  ------------------
 3676|     20|        case 142: return 141.959770000;
  ------------------
  |  Branch (3676:9): [True: 20, False: 413]
  ------------------
 3677|      8|        case 143: return 142.954610000;
  ------------------
  |  Branch (3677:9): [True: 8, False: 425]
  ------------------
 3678|     10|        case 144: return 143.951480000;
  ------------------
  |  Branch (3678:9): [True: 10, False: 423]
  ------------------
 3679|     36|        case 145: return 144.947200000;
  ------------------
  |  Branch (3679:9): [True: 36, False: 397]
  ------------------
 3680|     48|        case 146: return 145.944640000;
  ------------------
  |  Branch (3680:9): [True: 48, False: 385]
  ------------------
 3681|      6|        case 147: return 146.940060000;
  ------------------
  |  Branch (3681:9): [True: 6, False: 427]
  ------------------
 3682|     14|        case 148: return 147.937720000;
  ------------------
  |  Branch (3682:9): [True: 14, False: 419]
  ------------------
 3683|     10|        case 149: return 148.933775000;
  ------------------
  |  Branch (3683:9): [True: 10, False: 423]
  ------------------
 3684|      8|        case 150: return 149.933496000;
  ------------------
  |  Branch (3684:9): [True: 8, False: 425]
  ------------------
 3685|      6|        case 151: return 150.931688000;
  ------------------
  |  Branch (3685:9): [True: 6, False: 427]
  ------------------
 3686|      4|        case 152: return 151.931714000;
  ------------------
  |  Branch (3686:9): [True: 4, False: 429]
  ------------------
 3687|     20|        case 153: return 152.930199000;
  ------------------
  |  Branch (3687:9): [True: 20, False: 413]
  ------------------
 3688|      6|        case 154: return 153.930602000;
  ------------------
  |  Branch (3688:9): [True: 6, False: 427]
  ------------------
 3689|      6|        case 155: return 154.929103000;
  ------------------
  |  Branch (3689:9): [True: 6, False: 427]
  ------------------
 3690|      8|        case 156: return 155.929840000;
  ------------------
  |  Branch (3690:9): [True: 8, False: 425]
  ------------------
 3691|     10|        case 157: return 156.928256000;
  ------------------
  |  Branch (3691:9): [True: 10, False: 423]
  ------------------
 3692|     20|        case 158: return 157.928941000;
  ------------------
  |  Branch (3692:9): [True: 20, False: 413]
  ------------------
 3693|      6|        case 159: return 158.927712000;
  ------------------
  |  Branch (3693:9): [True: 6, False: 427]
  ------------------
 3694|      6|        case 160: return 159.928729000;
  ------------------
  |  Branch (3694:9): [True: 6, False: 427]
  ------------------
 3695|     12|        case 161: return 160.927855000;
  ------------------
  |  Branch (3695:9): [True: 12, False: 421]
  ------------------
 3696|      4|        case 162: return 161.929096000;
  ------------------
  |  Branch (3696:9): [True: 4, False: 429]
  ------------------
 3697|      6|        case 163: return 162.928733000;
  ------------------
  |  Branch (3697:9): [True: 6, False: 427]
  ------------------
 3698|      2|        case 164: return 163.930233000;
  ------------------
  |  Branch (3698:9): [True: 2, False: 431]
  ------------------
 3699|     55|        case 0: case 165: return 164.930322000;
  ------------------
  |  Branch (3699:9): [True: 49, False: 384]
  |  Branch (3699:17): [True: 6, False: 427]
  ------------------
 3700|      6|        case 166: return 165.932284000;
  ------------------
  |  Branch (3700:9): [True: 6, False: 427]
  ------------------
 3701|      2|        case 167: return 166.933133000;
  ------------------
  |  Branch (3701:9): [True: 2, False: 431]
  ------------------
 3702|      2|        case 168: return 167.935520000;
  ------------------
  |  Branch (3702:9): [True: 2, False: 431]
  ------------------
 3703|      6|        case 169: return 168.936872000;
  ------------------
  |  Branch (3703:9): [True: 6, False: 427]
  ------------------
 3704|     10|        case 170: return 169.939620000;
  ------------------
  |  Branch (3704:9): [True: 10, False: 423]
  ------------------
 3705|      6|        case 171: return 170.941470000;
  ------------------
  |  Branch (3705:9): [True: 6, False: 427]
  ------------------
 3706|      2|        case 172: return 171.944820000;
  ------------------
  |  Branch (3706:9): [True: 2, False: 431]
  ------------------
 3707|      6|        case 173: return 172.947290000;
  ------------------
  |  Branch (3707:9): [True: 6, False: 427]
  ------------------
 3708|      6|        case 174: return 173.951150000;
  ------------------
  |  Branch (3708:9): [True: 6, False: 427]
  ------------------
 3709|      6|        case 175: return 174.954050000;
  ------------------
  |  Branch (3709:9): [True: 6, False: 427]
  ------------------
 3710|    433|        }
 3711|     32|        break;
 3712|    274|      case 68:
  ------------------
  |  Branch (3712:7): [True: 274, False: 414k]
  ------------------
 3713|    274|        switch (isotope) {
  ------------------
  |  Branch (3713:17): [True: 256, False: 18]
  ------------------
 3714|      6|        case 143: return 142.966340000;
  ------------------
  |  Branch (3714:9): [True: 6, False: 268]
  ------------------
 3715|      6|        case 144: return 143.960380000;
  ------------------
  |  Branch (3715:9): [True: 6, False: 268]
  ------------------
 3716|      2|        case 145: return 144.957390000;
  ------------------
  |  Branch (3716:9): [True: 2, False: 272]
  ------------------
 3717|      6|        case 146: return 145.952000000;
  ------------------
  |  Branch (3717:9): [True: 6, False: 268]
  ------------------
 3718|      2|        case 147: return 146.949490000;
  ------------------
  |  Branch (3718:9): [True: 2, False: 272]
  ------------------
 3719|      2|        case 148: return 147.944550000;
  ------------------
  |  Branch (3719:9): [True: 2, False: 272]
  ------------------
 3720|      2|        case 149: return 148.942310000;
  ------------------
  |  Branch (3720:9): [True: 2, False: 272]
  ------------------
 3721|      2|        case 150: return 149.937914000;
  ------------------
  |  Branch (3721:9): [True: 2, False: 272]
  ------------------
 3722|      2|        case 151: return 150.937449000;
  ------------------
  |  Branch (3722:9): [True: 2, False: 272]
  ------------------
 3723|      2|        case 152: return 151.935050000;
  ------------------
  |  Branch (3723:9): [True: 2, False: 272]
  ------------------
 3724|      2|        case 153: return 152.935063000;
  ------------------
  |  Branch (3724:9): [True: 2, False: 272]
  ------------------
 3725|      2|        case 154: return 153.932783000;
  ------------------
  |  Branch (3725:9): [True: 2, False: 272]
  ------------------
 3726|      6|        case 155: return 154.933209000;
  ------------------
  |  Branch (3726:9): [True: 6, False: 268]
  ------------------
 3727|      2|        case 156: return 155.931065000;
  ------------------
  |  Branch (3727:9): [True: 2, False: 272]
  ------------------
 3728|     12|        case 157: return 156.931920000;
  ------------------
  |  Branch (3728:9): [True: 12, False: 262]
  ------------------
 3729|     34|        case 158: return 157.929893000;
  ------------------
  |  Branch (3729:9): [True: 34, False: 240]
  ------------------
 3730|     16|        case 159: return 158.930684000;
  ------------------
  |  Branch (3730:9): [True: 16, False: 258]
  ------------------
 3731|      2|        case 160: return 159.929083000;
  ------------------
  |  Branch (3731:9): [True: 2, False: 272]
  ------------------
 3732|      6|        case 161: return 160.929995000;
  ------------------
  |  Branch (3732:9): [True: 6, False: 268]
  ------------------
 3733|      2|        case 162: return 161.928778000;
  ------------------
  |  Branch (3733:9): [True: 2, False: 272]
  ------------------
 3734|      2|        case 163: return 162.930033000;
  ------------------
  |  Branch (3734:9): [True: 2, False: 272]
  ------------------
 3735|      2|        case 164: return 163.929200000;
  ------------------
  |  Branch (3735:9): [True: 2, False: 272]
  ------------------
 3736|      2|        case 165: return 164.930726000;
  ------------------
  |  Branch (3736:9): [True: 2, False: 272]
  ------------------
 3737|     90|        case 0: case 166: return 165.930293000;
  ------------------
  |  Branch (3737:9): [True: 84, False: 190]
  |  Branch (3737:17): [True: 6, False: 268]
  ------------------
 3738|     10|        case 167: return 166.932048000;
  ------------------
  |  Branch (3738:9): [True: 10, False: 264]
  ------------------
 3739|      2|        case 168: return 167.932370000;
  ------------------
  |  Branch (3739:9): [True: 2, False: 272]
  ------------------
 3740|      6|        case 169: return 168.934590000;
  ------------------
  |  Branch (3740:9): [True: 6, False: 268]
  ------------------
 3741|      6|        case 170: return 169.935464000;
  ------------------
  |  Branch (3741:9): [True: 6, False: 268]
  ------------------
 3742|      2|        case 171: return 170.938029000;
  ------------------
  |  Branch (3742:9): [True: 2, False: 272]
  ------------------
 3743|      2|        case 172: return 171.939356000;
  ------------------
  |  Branch (3743:9): [True: 2, False: 272]
  ------------------
 3744|      4|        case 173: return 172.942400000;
  ------------------
  |  Branch (3744:9): [True: 4, False: 270]
  ------------------
 3745|      2|        case 174: return 173.944230000;
  ------------------
  |  Branch (3745:9): [True: 2, False: 272]
  ------------------
 3746|      6|        case 175: return 174.947770000;
  ------------------
  |  Branch (3746:9): [True: 6, False: 268]
  ------------------
 3747|      2|        case 176: return 175.950080000;
  ------------------
  |  Branch (3747:9): [True: 2, False: 272]
  ------------------
 3748|      2|        case 177: return 176.954050000;
  ------------------
  |  Branch (3748:9): [True: 2, False: 272]
  ------------------
 3749|    274|        }
 3750|     18|        break;
 3751|    246|      case 69:
  ------------------
  |  Branch (3751:7): [True: 246, False: 414k]
  ------------------
 3752|    246|        switch (isotope) {
  ------------------
  |  Branch (3752:17): [True: 230, False: 16]
  ------------------
 3753|      6|        case 145: return 144.970070000;
  ------------------
  |  Branch (3753:9): [True: 6, False: 240]
  ------------------
 3754|      2|        case 146: return 145.966430000;
  ------------------
  |  Branch (3754:9): [True: 2, False: 244]
  ------------------
 3755|      4|        case 147: return 146.960960000;
  ------------------
  |  Branch (3755:9): [True: 4, False: 242]
  ------------------
 3756|      2|        case 148: return 147.957840000;
  ------------------
  |  Branch (3756:9): [True: 2, False: 244]
  ------------------
 3757|      2|        case 149: return 148.952720000;
  ------------------
  |  Branch (3757:9): [True: 2, False: 244]
  ------------------
 3758|      2|        case 150: return 149.949960000;
  ------------------
  |  Branch (3758:9): [True: 2, False: 244]
  ------------------
 3759|      6|        case 151: return 150.945483000;
  ------------------
  |  Branch (3759:9): [True: 6, False: 240]
  ------------------
 3760|      6|        case 152: return 151.944420000;
  ------------------
  |  Branch (3760:9): [True: 6, False: 240]
  ------------------
 3761|      2|        case 153: return 152.942012000;
  ------------------
  |  Branch (3761:9): [True: 2, False: 244]
  ------------------
 3762|      6|        case 154: return 153.941568000;
  ------------------
  |  Branch (3762:9): [True: 6, False: 240]
  ------------------
 3763|      2|        case 155: return 154.939199000;
  ------------------
  |  Branch (3763:9): [True: 2, False: 244]
  ------------------
 3764|     12|        case 156: return 155.938980000;
  ------------------
  |  Branch (3764:9): [True: 12, False: 234]
  ------------------
 3765|      2|        case 157: return 156.936970000;
  ------------------
  |  Branch (3765:9): [True: 2, False: 244]
  ------------------
 3766|      4|        case 158: return 157.936980000;
  ------------------
  |  Branch (3766:9): [True: 4, False: 242]
  ------------------
 3767|      6|        case 159: return 158.934980000;
  ------------------
  |  Branch (3767:9): [True: 6, False: 240]
  ------------------
 3768|      4|        case 160: return 159.935260000;
  ------------------
  |  Branch (3768:9): [True: 4, False: 242]
  ------------------
 3769|      2|        case 161: return 160.933550000;
  ------------------
  |  Branch (3769:9): [True: 2, False: 244]
  ------------------
 3770|      2|        case 162: return 161.933995000;
  ------------------
  |  Branch (3770:9): [True: 2, False: 244]
  ------------------
 3771|      2|        case 163: return 162.932651000;
  ------------------
  |  Branch (3771:9): [True: 2, False: 244]
  ------------------
 3772|      6|        case 164: return 163.933560000;
  ------------------
  |  Branch (3772:9): [True: 6, False: 240]
  ------------------
 3773|      2|        case 165: return 164.932435000;
  ------------------
  |  Branch (3773:9): [True: 2, False: 244]
  ------------------
 3774|      2|        case 166: return 165.933554000;
  ------------------
  |  Branch (3774:9): [True: 2, False: 244]
  ------------------
 3775|      4|        case 167: return 166.932851000;
  ------------------
  |  Branch (3775:9): [True: 4, False: 242]
  ------------------
 3776|      2|        case 168: return 167.934173000;
  ------------------
  |  Branch (3776:9): [True: 2, False: 244]
  ------------------
 3777|     94|        case 0: case 169: return 168.934213000;
  ------------------
  |  Branch (3777:9): [True: 92, False: 154]
  |  Branch (3777:17): [True: 2, False: 244]
  ------------------
 3778|      4|        case 170: return 169.935801000;
  ------------------
  |  Branch (3778:9): [True: 4, False: 242]
  ------------------
 3779|      2|        case 171: return 170.936429000;
  ------------------
  |  Branch (3779:9): [True: 2, False: 244]
  ------------------
 3780|      2|        case 172: return 171.938400000;
  ------------------
  |  Branch (3780:9): [True: 2, False: 244]
  ------------------
 3781|      2|        case 173: return 172.939604000;
  ------------------
  |  Branch (3781:9): [True: 2, False: 244]
  ------------------
 3782|      2|        case 174: return 173.942170000;
  ------------------
  |  Branch (3782:9): [True: 2, False: 244]
  ------------------
 3783|      2|        case 175: return 174.943840000;
  ------------------
  |  Branch (3783:9): [True: 2, False: 244]
  ------------------
 3784|      6|        case 176: return 175.946990000;
  ------------------
  |  Branch (3784:9): [True: 6, False: 240]
  ------------------
 3785|     10|        case 177: return 176.949040000;
  ------------------
  |  Branch (3785:9): [True: 10, False: 236]
  ------------------
 3786|      8|        case 178: return 177.952640000;
  ------------------
  |  Branch (3786:9): [True: 8, False: 238]
  ------------------
 3787|      8|        case 179: return 178.955340000;
  ------------------
  |  Branch (3787:9): [True: 8, False: 238]
  ------------------
 3788|    246|        }
 3789|     16|        break;
 3790|    232|      case 70:
  ------------------
  |  Branch (3790:7): [True: 232, False: 414k]
  ------------------
 3791|    232|        switch (isotope) {
  ------------------
  |  Branch (3791:17): [True: 222, False: 10]
  ------------------
 3792|      2|        case 148: return 147.967420000;
  ------------------
  |  Branch (3792:9): [True: 2, False: 230]
  ------------------
 3793|      2|        case 149: return 148.964040000;
  ------------------
  |  Branch (3793:9): [True: 2, False: 230]
  ------------------
 3794|      6|        case 150: return 149.958420000;
  ------------------
  |  Branch (3794:9): [True: 6, False: 226]
  ------------------
 3795|      6|        case 151: return 150.955400000;
  ------------------
  |  Branch (3795:9): [True: 6, False: 226]
  ------------------
 3796|      6|        case 152: return 151.950290000;
  ------------------
  |  Branch (3796:9): [True: 6, False: 226]
  ------------------
 3797|      2|        case 153: return 152.949480000;
  ------------------
  |  Branch (3797:9): [True: 2, False: 230]
  ------------------
 3798|     14|        case 154: return 153.946394000;
  ------------------
  |  Branch (3798:9): [True: 14, False: 218]
  ------------------
 3799|     14|        case 155: return 154.945782000;
  ------------------
  |  Branch (3799:9): [True: 14, False: 218]
  ------------------
 3800|      6|        case 156: return 155.942818000;
  ------------------
  |  Branch (3800:9): [True: 6, False: 226]
  ------------------
 3801|     26|        case 157: return 156.942628000;
  ------------------
  |  Branch (3801:9): [True: 26, False: 206]
  ------------------
 3802|      2|        case 158: return 157.939866000;
  ------------------
  |  Branch (3802:9): [True: 2, False: 230]
  ------------------
 3803|      2|        case 159: return 158.940050000;
  ------------------
  |  Branch (3803:9): [True: 2, False: 230]
  ------------------
 3804|      2|        case 160: return 159.937552000;
  ------------------
  |  Branch (3804:9): [True: 2, False: 230]
  ------------------
 3805|      6|        case 161: return 160.937902000;
  ------------------
  |  Branch (3805:9): [True: 6, False: 226]
  ------------------
 3806|      6|        case 162: return 161.935768000;
  ------------------
  |  Branch (3806:9): [True: 6, False: 226]
  ------------------
 3807|      2|        case 163: return 162.936334000;
  ------------------
  |  Branch (3807:9): [True: 2, False: 230]
  ------------------
 3808|      2|        case 164: return 163.934489000;
  ------------------
  |  Branch (3808:9): [True: 2, False: 230]
  ------------------
 3809|     18|        case 165: return 164.935280000;
  ------------------
  |  Branch (3809:9): [True: 18, False: 214]
  ------------------
 3810|      6|        case 166: return 165.933882000;
  ------------------
  |  Branch (3810:9): [True: 6, False: 226]
  ------------------
 3811|      2|        case 167: return 166.934950000;
  ------------------
  |  Branch (3811:9): [True: 2, False: 230]
  ------------------
 3812|      2|        case 168: return 167.933897000;
  ------------------
  |  Branch (3812:9): [True: 2, False: 230]
  ------------------
 3813|      2|        case 169: return 168.935190000;
  ------------------
  |  Branch (3813:9): [True: 2, False: 230]
  ------------------
 3814|      2|        case 170: return 169.934761000;
  ------------------
  |  Branch (3814:9): [True: 2, False: 230]
  ------------------
 3815|      2|        case 171: return 170.936325000;
  ------------------
  |  Branch (3815:9): [True: 2, False: 230]
  ------------------
 3816|      4|        case 172: return 171.936381000;
  ------------------
  |  Branch (3816:9): [True: 4, False: 228]
  ------------------
 3817|      2|        case 173: return 172.938210000;
  ------------------
  |  Branch (3817:9): [True: 2, False: 230]
  ------------------
 3818|     56|        case 0: case 174: return 173.938862000;
  ------------------
  |  Branch (3818:9): [True: 54, False: 178]
  |  Branch (3818:17): [True: 2, False: 230]
  ------------------
 3819|      2|        case 175: return 174.941276000;
  ------------------
  |  Branch (3819:9): [True: 2, False: 230]
  ------------------
 3820|      2|        case 176: return 175.942571000;
  ------------------
  |  Branch (3820:9): [True: 2, False: 230]
  ------------------
 3821|      2|        case 177: return 176.945260000;
  ------------------
  |  Branch (3821:9): [True: 2, False: 230]
  ------------------
 3822|      2|        case 178: return 177.946647000;
  ------------------
  |  Branch (3822:9): [True: 2, False: 230]
  ------------------
 3823|      8|        case 179: return 178.950170000;
  ------------------
  |  Branch (3823:9): [True: 8, False: 224]
  ------------------
 3824|      2|        case 180: return 179.952330000;
  ------------------
  |  Branch (3824:9): [True: 2, False: 230]
  ------------------
 3825|      2|        case 181: return 180.956150000;
  ------------------
  |  Branch (3825:9): [True: 2, False: 230]
  ------------------
 3826|    232|        }
 3827|     10|        break;
 3828|  18.5k|      case 71:
  ------------------
  |  Branch (3828:7): [True: 18.5k, False: 396k]
  ------------------
 3829|  18.5k|        switch (isotope) {
  ------------------
  |  Branch (3829:17): [True: 18.5k, False: 14]
  ------------------
 3830|      2|        case 150: return 149.973230000;
  ------------------
  |  Branch (3830:9): [True: 2, False: 18.5k]
  ------------------
 3831|      2|        case 151: return 150.967580000;
  ------------------
  |  Branch (3831:9): [True: 2, False: 18.5k]
  ------------------
 3832|      4|        case 152: return 151.964120000;
  ------------------
  |  Branch (3832:9): [True: 4, False: 18.5k]
  ------------------
 3833|    598|        case 153: return 152.958770000;
  ------------------
  |  Branch (3833:9): [True: 598, False: 17.9k]
  ------------------
 3834|      2|        case 154: return 153.957520000;
  ------------------
  |  Branch (3834:9): [True: 2, False: 18.5k]
  ------------------
 3835|      6|        case 155: return 154.954316000;
  ------------------
  |  Branch (3835:9): [True: 6, False: 18.5k]
  ------------------
 3836|      6|        case 156: return 155.953030000;
  ------------------
  |  Branch (3836:9): [True: 6, False: 18.5k]
  ------------------
 3837|      2|        case 157: return 156.950098000;
  ------------------
  |  Branch (3837:9): [True: 2, False: 18.5k]
  ------------------
 3838|      2|        case 158: return 157.949313000;
  ------------------
  |  Branch (3838:9): [True: 2, False: 18.5k]
  ------------------
 3839|      2|        case 159: return 158.946630000;
  ------------------
  |  Branch (3839:9): [True: 2, False: 18.5k]
  ------------------
 3840|      2|        case 160: return 159.946030000;
  ------------------
  |  Branch (3840:9): [True: 2, False: 18.5k]
  ------------------
 3841|      2|        case 161: return 160.943570000;
  ------------------
  |  Branch (3841:9): [True: 2, False: 18.5k]
  ------------------
 3842|      6|        case 162: return 161.943280000;
  ------------------
  |  Branch (3842:9): [True: 6, False: 18.5k]
  ------------------
 3843|      6|        case 163: return 162.941180000;
  ------------------
  |  Branch (3843:9): [True: 6, False: 18.5k]
  ------------------
 3844|      2|        case 164: return 163.941340000;
  ------------------
  |  Branch (3844:9): [True: 2, False: 18.5k]
  ------------------
 3845|      2|        case 165: return 164.939407000;
  ------------------
  |  Branch (3845:9): [True: 2, False: 18.5k]
  ------------------
 3846|      2|        case 166: return 165.939860000;
  ------------------
  |  Branch (3846:9): [True: 2, False: 18.5k]
  ------------------
 3847|      2|        case 167: return 166.938270000;
  ------------------
  |  Branch (3847:9): [True: 2, False: 18.5k]
  ------------------
 3848|      2|        case 168: return 167.938740000;
  ------------------
  |  Branch (3848:9): [True: 2, False: 18.5k]
  ------------------
 3849|      6|        case 169: return 168.937651000;
  ------------------
  |  Branch (3849:9): [True: 6, False: 18.5k]
  ------------------
 3850|      2|        case 170: return 169.938475000;
  ------------------
  |  Branch (3850:9): [True: 2, False: 18.5k]
  ------------------
 3851|      2|        case 171: return 170.937913000;
  ------------------
  |  Branch (3851:9): [True: 2, False: 18.5k]
  ------------------
 3852|      2|        case 172: return 171.939086000;
  ------------------
  |  Branch (3852:9): [True: 2, False: 18.5k]
  ------------------
 3853|      2|        case 173: return 172.938930000;
  ------------------
  |  Branch (3853:9): [True: 2, False: 18.5k]
  ------------------
 3854|      2|        case 174: return 173.940337000;
  ------------------
  |  Branch (3854:9): [True: 2, False: 18.5k]
  ------------------
 3855|  17.8k|        case 0: case 175: return 174.940771000;
  ------------------
  |  Branch (3855:9): [True: 17.8k, False: 702]
  |  Branch (3855:17): [True: 2, False: 18.5k]
  ------------------
 3856|      2|        case 176: return 175.942686000;
  ------------------
  |  Branch (3856:9): [True: 2, False: 18.5k]
  ------------------
 3857|      2|        case 177: return 176.943758000;
  ------------------
  |  Branch (3857:9): [True: 2, False: 18.5k]
  ------------------
 3858|      2|        case 178: return 177.945955000;
  ------------------
  |  Branch (3858:9): [True: 2, False: 18.5k]
  ------------------
 3859|      2|        case 179: return 178.947327000;
  ------------------
  |  Branch (3859:9): [True: 2, False: 18.5k]
  ------------------
 3860|      2|        case 180: return 179.949880000;
  ------------------
  |  Branch (3860:9): [True: 2, False: 18.5k]
  ------------------
 3861|      2|        case 181: return 180.951970000;
  ------------------
  |  Branch (3861:9): [True: 2, False: 18.5k]
  ------------------
 3862|      2|        case 182: return 181.955040000;
  ------------------
  |  Branch (3862:9): [True: 2, False: 18.5k]
  ------------------
 3863|      2|        case 183: return 182.957570000;
  ------------------
  |  Branch (3863:9): [True: 2, False: 18.5k]
  ------------------
 3864|      2|        case 184: return 183.960910000;
  ------------------
  |  Branch (3864:9): [True: 2, False: 18.5k]
  ------------------
 3865|  18.5k|        }
 3866|     14|        break;
 3867|    325|      case 72:
  ------------------
  |  Branch (3867:7): [True: 325, False: 414k]
  ------------------
 3868|    325|        switch (isotope) {
  ------------------
  |  Branch (3868:17): [True: 301, False: 24]
  ------------------
 3869|      6|        case 153: return 152.970690000;
  ------------------
  |  Branch (3869:9): [True: 6, False: 319]
  ------------------
 3870|      6|        case 154: return 153.964860000;
  ------------------
  |  Branch (3870:9): [True: 6, False: 319]
  ------------------
 3871|      6|        case 155: return 154.963390000;
  ------------------
  |  Branch (3871:9): [True: 6, False: 319]
  ------------------
 3872|      8|        case 156: return 155.959360000;
  ------------------
  |  Branch (3872:9): [True: 8, False: 317]
  ------------------
 3873|      6|        case 157: return 156.958400000;
  ------------------
  |  Branch (3873:9): [True: 6, False: 319]
  ------------------
 3874|      4|        case 158: return 157.954799000;
  ------------------
  |  Branch (3874:9): [True: 4, False: 321]
  ------------------
 3875|     10|        case 159: return 158.953995000;
  ------------------
  |  Branch (3875:9): [True: 10, False: 315]
  ------------------
 3876|      6|        case 160: return 159.950684000;
  ------------------
  |  Branch (3876:9): [True: 6, False: 319]
  ------------------
 3877|     12|        case 161: return 160.950275000;
  ------------------
  |  Branch (3877:9): [True: 12, False: 313]
  ------------------
 3878|      8|        case 162: return 161.947210000;
  ------------------
  |  Branch (3878:9): [True: 8, False: 317]
  ------------------
 3879|     10|        case 163: return 162.947090000;
  ------------------
  |  Branch (3879:9): [True: 10, False: 315]
  ------------------
 3880|      6|        case 164: return 163.944367000;
  ------------------
  |  Branch (3880:9): [True: 6, False: 319]
  ------------------
 3881|      6|        case 165: return 164.944570000;
  ------------------
  |  Branch (3881:9): [True: 6, False: 319]
  ------------------
 3882|      6|        case 166: return 165.942180000;
  ------------------
  |  Branch (3882:9): [True: 6, False: 319]
  ------------------
 3883|      6|        case 167: return 166.942600000;
  ------------------
  |  Branch (3883:9): [True: 6, False: 319]
  ------------------
 3884|      8|        case 168: return 167.940570000;
  ------------------
  |  Branch (3884:9): [True: 8, False: 317]
  ------------------
 3885|      8|        case 169: return 168.941260000;
  ------------------
  |  Branch (3885:9): [True: 8, False: 317]
  ------------------
 3886|      8|        case 170: return 169.939610000;
  ------------------
  |  Branch (3886:9): [True: 8, False: 317]
  ------------------
 3887|     12|        case 171: return 170.940490000;
  ------------------
  |  Branch (3887:9): [True: 12, False: 313]
  ------------------
 3888|      8|        case 172: return 171.939448000;
  ------------------
  |  Branch (3888:9): [True: 8, False: 317]
  ------------------
 3889|      6|        case 173: return 172.940510000;
  ------------------
  |  Branch (3889:9): [True: 6, False: 319]
  ------------------
 3890|     14|        case 174: return 173.940046000;
  ------------------
  |  Branch (3890:9): [True: 14, False: 311]
  ------------------
 3891|      4|        case 175: return 174.941509000;
  ------------------
  |  Branch (3891:9): [True: 4, False: 321]
  ------------------
 3892|     10|        case 176: return 175.941408000;
  ------------------
  |  Branch (3892:9): [True: 10, False: 315]
  ------------------
 3893|      2|        case 177: return 176.943220000;
  ------------------
  |  Branch (3893:9): [True: 2, False: 323]
  ------------------
 3894|      8|        case 178: return 177.943698000;
  ------------------
  |  Branch (3894:9): [True: 8, False: 317]
  ------------------
 3895|      4|        case 179: return 178.945816000;
  ------------------
  |  Branch (3895:9): [True: 4, False: 321]
  ------------------
 3896|     27|        case 0: case 180: return 179.946550000;
  ------------------
  |  Branch (3896:9): [True: 25, False: 300]
  |  Branch (3896:17): [True: 2, False: 323]
  ------------------
 3897|      6|        case 181: return 180.949101000;
  ------------------
  |  Branch (3897:9): [True: 6, False: 319]
  ------------------
 3898|      8|        case 182: return 181.950554000;
  ------------------
  |  Branch (3898:9): [True: 8, False: 317]
  ------------------
 3899|      6|        case 183: return 182.953530000;
  ------------------
  |  Branch (3899:9): [True: 6, False: 319]
  ------------------
 3900|      6|        case 184: return 183.955450000;
  ------------------
  |  Branch (3900:9): [True: 6, False: 319]
  ------------------
 3901|      8|        case 185: return 184.958820000;
  ------------------
  |  Branch (3901:9): [True: 8, False: 317]
  ------------------
 3902|      2|        case 186: return 185.960890000;
  ------------------
  |  Branch (3902:9): [True: 2, False: 323]
  ------------------
 3903|      8|        case 187: return 186.964590000;
  ------------------
  |  Branch (3903:9): [True: 8, False: 317]
  ------------------
 3904|     32|        case 188: return 187.966850000;
  ------------------
  |  Branch (3904:9): [True: 32, False: 293]
  ------------------
 3905|    325|        }
 3906|     24|        break;
 3907|    248|      case 73:
  ------------------
  |  Branch (3907:7): [True: 248, False: 414k]
  ------------------
 3908|    248|        switch (isotope) {
  ------------------
  |  Branch (3908:17): [True: 234, False: 14]
  ------------------
 3909|      2|        case 155: return 154.974590000;
  ------------------
  |  Branch (3909:9): [True: 2, False: 246]
  ------------------
 3910|     24|        case 156: return 155.972300000;
  ------------------
  |  Branch (3910:9): [True: 24, False: 224]
  ------------------
 3911|      6|        case 157: return 156.968190000;
  ------------------
  |  Branch (3911:9): [True: 6, False: 242]
  ------------------
 3912|      2|        case 158: return 157.966700000;
  ------------------
  |  Branch (3912:9): [True: 2, False: 246]
  ------------------
 3913|      6|        case 159: return 158.963018000;
  ------------------
  |  Branch (3913:9): [True: 6, False: 242]
  ------------------
 3914|      6|        case 160: return 159.961490000;
  ------------------
  |  Branch (3914:9): [True: 6, False: 242]
  ------------------
 3915|      6|        case 161: return 160.958420000;
  ------------------
  |  Branch (3915:9): [True: 6, False: 242]
  ------------------
 3916|      2|        case 162: return 161.957290000;
  ------------------
  |  Branch (3916:9): [True: 2, False: 246]
  ------------------
 3917|      8|        case 163: return 162.954330000;
  ------------------
  |  Branch (3917:9): [True: 8, False: 240]
  ------------------
 3918|     10|        case 164: return 163.953530000;
  ------------------
  |  Branch (3918:9): [True: 10, False: 238]
  ------------------
 3919|      6|        case 165: return 164.950773000;
  ------------------
  |  Branch (3919:9): [True: 6, False: 242]
  ------------------
 3920|      6|        case 166: return 165.950510000;
  ------------------
  |  Branch (3920:9): [True: 6, False: 242]
  ------------------
 3921|      6|        case 167: return 166.948090000;
  ------------------
  |  Branch (3921:9): [True: 6, False: 242]
  ------------------
 3922|      2|        case 168: return 167.948050000;
  ------------------
  |  Branch (3922:9): [True: 2, False: 246]
  ------------------
 3923|      6|        case 169: return 168.946010000;
  ------------------
  |  Branch (3923:9): [True: 6, False: 242]
  ------------------
 3924|      2|        case 170: return 169.946180000;
  ------------------
  |  Branch (3924:9): [True: 2, False: 246]
  ------------------
 3925|      2|        case 171: return 170.944480000;
  ------------------
  |  Branch (3925:9): [True: 2, False: 246]
  ------------------
 3926|      6|        case 172: return 171.944900000;
  ------------------
  |  Branch (3926:9): [True: 6, False: 242]
  ------------------
 3927|      2|        case 173: return 172.943750000;
  ------------------
  |  Branch (3927:9): [True: 2, False: 246]
  ------------------
 3928|      2|        case 174: return 173.944450000;
  ------------------
  |  Branch (3928:9): [True: 2, False: 246]
  ------------------
 3929|      2|        case 175: return 174.943740000;
  ------------------
  |  Branch (3929:9): [True: 2, False: 246]
  ------------------
 3930|     40|        case 176: return 175.944860000;
  ------------------
  |  Branch (3930:9): [True: 40, False: 208]
  ------------------
 3931|      2|        case 177: return 176.944472000;
  ------------------
  |  Branch (3931:9): [True: 2, False: 246]
  ------------------
 3932|      2|        case 178: return 177.945778000;
  ------------------
  |  Branch (3932:9): [True: 2, False: 246]
  ------------------
 3933|      8|        case 179: return 178.945929000;
  ------------------
  |  Branch (3933:9): [True: 8, False: 240]
  ------------------
 3934|      2|        case 180: return 179.947464000;
  ------------------
  |  Branch (3934:9): [True: 2, False: 246]
  ------------------
 3935|     32|        case 0: case 181: return 180.947995000;
  ------------------
  |  Branch (3935:9): [True: 26, False: 222]
  |  Branch (3935:17): [True: 6, False: 242]
  ------------------
 3936|      2|        case 182: return 181.950151000;
  ------------------
  |  Branch (3936:9): [True: 2, False: 246]
  ------------------
 3937|      4|        case 183: return 182.951372000;
  ------------------
  |  Branch (3937:9): [True: 4, False: 244]
  ------------------
 3938|      2|        case 184: return 183.954008000;
  ------------------
  |  Branch (3938:9): [True: 2, False: 246]
  ------------------
 3939|      2|        case 185: return 184.955559000;
  ------------------
  |  Branch (3939:9): [True: 2, False: 246]
  ------------------
 3940|      8|        case 186: return 185.958550000;
  ------------------
  |  Branch (3940:9): [True: 8, False: 240]
  ------------------
 3941|      6|        case 187: return 186.960530000;
  ------------------
  |  Branch (3941:9): [True: 6, False: 242]
  ------------------
 3942|      2|        case 188: return 187.963700000;
  ------------------
  |  Branch (3942:9): [True: 2, False: 246]
  ------------------
 3943|      6|        case 189: return 188.965830000;
  ------------------
  |  Branch (3943:9): [True: 6, False: 242]
  ------------------
 3944|      2|        case 190: return 189.969230000;
  ------------------
  |  Branch (3944:9): [True: 2, False: 246]
  ------------------
 3945|    248|        }
 3946|     14|        break;
 3947|  2.67k|      case 74:
  ------------------
  |  Branch (3947:7): [True: 2.67k, False: 412k]
  ------------------
 3948|  2.67k|        switch (isotope) {
  ------------------
  |  Branch (3948:17): [True: 2.65k, False: 22]
  ------------------
 3949|      6|        case 158: return 157.974560000;
  ------------------
  |  Branch (3949:9): [True: 6, False: 2.66k]
  ------------------
 3950|      6|        case 159: return 158.972920000;
  ------------------
  |  Branch (3950:9): [True: 6, False: 2.66k]
  ------------------
 3951|      2|        case 160: return 159.968480000;
  ------------------
  |  Branch (3951:9): [True: 2, False: 2.67k]
  ------------------
 3952|      6|        case 161: return 160.967360000;
  ------------------
  |  Branch (3952:9): [True: 6, False: 2.66k]
  ------------------
 3953|      6|        case 162: return 161.963497000;
  ------------------
  |  Branch (3953:9): [True: 6, False: 2.66k]
  ------------------
 3954|      6|        case 163: return 162.962520000;
  ------------------
  |  Branch (3954:9): [True: 6, False: 2.66k]
  ------------------
 3955|      2|        case 164: return 163.958954000;
  ------------------
  |  Branch (3955:9): [True: 2, False: 2.67k]
  ------------------
 3956|      6|        case 165: return 164.958280000;
  ------------------
  |  Branch (3956:9): [True: 6, False: 2.66k]
  ------------------
 3957|      6|        case 166: return 165.955027000;
  ------------------
  |  Branch (3957:9): [True: 6, False: 2.66k]
  ------------------
 3958|      6|        case 167: return 166.954816000;
  ------------------
  |  Branch (3958:9): [True: 6, False: 2.66k]
  ------------------
 3959|      6|        case 168: return 167.951808000;
  ------------------
  |  Branch (3959:9): [True: 6, False: 2.66k]
  ------------------
 3960|     10|        case 169: return 168.951779000;
  ------------------
  |  Branch (3960:9): [True: 10, False: 2.66k]
  ------------------
 3961|      6|        case 170: return 169.949228000;
  ------------------
  |  Branch (3961:9): [True: 6, False: 2.66k]
  ------------------
 3962|      2|        case 171: return 170.949450000;
  ------------------
  |  Branch (3962:9): [True: 2, False: 2.67k]
  ------------------
 3963|      8|        case 172: return 171.947290000;
  ------------------
  |  Branch (3963:9): [True: 8, False: 2.66k]
  ------------------
 3964|      2|        case 173: return 172.947690000;
  ------------------
  |  Branch (3964:9): [True: 2, False: 2.67k]
  ------------------
 3965|     10|        case 174: return 173.946080000;
  ------------------
  |  Branch (3965:9): [True: 10, False: 2.66k]
  ------------------
 3966|      6|        case 175: return 174.946720000;
  ------------------
  |  Branch (3966:9): [True: 6, False: 2.66k]
  ------------------
 3967|     16|        case 176: return 175.945630000;
  ------------------
  |  Branch (3967:9): [True: 16, False: 2.65k]
  ------------------
 3968|      6|        case 177: return 176.946640000;
  ------------------
  |  Branch (3968:9): [True: 6, False: 2.66k]
  ------------------
 3969|      2|        case 178: return 177.945876000;
  ------------------
  |  Branch (3969:9): [True: 2, False: 2.67k]
  ------------------
 3970|     14|        case 179: return 178.947070000;
  ------------------
  |  Branch (3970:9): [True: 14, False: 2.65k]
  ------------------
 3971|      8|        case 180: return 179.946704000;
  ------------------
  |  Branch (3971:9): [True: 8, False: 2.66k]
  ------------------
 3972|      2|        case 181: return 180.948197000;
  ------------------
  |  Branch (3972:9): [True: 2, False: 2.67k]
  ------------------
 3973|      4|        case 182: return 181.948204000;
  ------------------
  |  Branch (3973:9): [True: 4, False: 2.66k]
  ------------------
 3974|      2|        case 183: return 182.950223000;
  ------------------
  |  Branch (3974:9): [True: 2, False: 2.67k]
  ------------------
 3975|  2.45k|        case 0: case 184: return 183.950931000;
  ------------------
  |  Branch (3975:9): [True: 2.44k, False: 228]
  |  Branch (3975:17): [True: 6, False: 2.66k]
  ------------------
 3976|      2|        case 185: return 184.953419000;
  ------------------
  |  Branch (3976:9): [True: 2, False: 2.67k]
  ------------------
 3977|      6|        case 186: return 185.954364000;
  ------------------
  |  Branch (3977:9): [True: 6, False: 2.66k]
  ------------------
 3978|      2|        case 187: return 186.957160000;
  ------------------
  |  Branch (3978:9): [True: 2, False: 2.67k]
  ------------------
 3979|      6|        case 188: return 187.958489000;
  ------------------
  |  Branch (3979:9): [True: 6, False: 2.66k]
  ------------------
 3980|     14|        case 189: return 188.961910000;
  ------------------
  |  Branch (3980:9): [True: 14, False: 2.65k]
  ------------------
 3981|      6|        case 190: return 189.963180000;
  ------------------
  |  Branch (3981:9): [True: 6, False: 2.66k]
  ------------------
 3982|      2|        case 191: return 190.966600000;
  ------------------
  |  Branch (3982:9): [True: 2, False: 2.67k]
  ------------------
 3983|      6|        case 192: return 191.968170000;
  ------------------
  |  Branch (3983:9): [True: 6, False: 2.66k]
  ------------------
 3984|  2.67k|        }
 3985|     22|        break;
 3986|    231|      case 75:
  ------------------
  |  Branch (3986:7): [True: 231, False: 414k]
  ------------------
 3987|    231|        switch (isotope) {
  ------------------
  |  Branch (3987:17): [True: 197, False: 34]
  ------------------
 3988|      6|        case 160: return 159.982120000;
  ------------------
  |  Branch (3988:9): [True: 6, False: 225]
  ------------------
 3989|      2|        case 161: return 160.977590000;
  ------------------
  |  Branch (3989:9): [True: 2, False: 229]
  ------------------
 3990|      6|        case 162: return 161.976000000;
  ------------------
  |  Branch (3990:9): [True: 6, False: 225]
  ------------------
 3991|      2|        case 163: return 162.972081000;
  ------------------
  |  Branch (3991:9): [True: 2, False: 229]
  ------------------
 3992|      6|        case 164: return 163.970320000;
  ------------------
  |  Branch (3992:9): [True: 6, False: 225]
  ------------------
 3993|      6|        case 165: return 164.967089000;
  ------------------
  |  Branch (3993:9): [True: 6, False: 225]
  ------------------
 3994|     22|        case 166: return 165.965810000;
  ------------------
  |  Branch (3994:9): [True: 22, False: 209]
  ------------------
 3995|     10|        case 167: return 166.962600000;
  ------------------
  |  Branch (3995:9): [True: 10, False: 221]
  ------------------
 3996|      8|        case 168: return 167.961570000;
  ------------------
  |  Branch (3996:9): [True: 8, False: 223]
  ------------------
 3997|      6|        case 169: return 168.958790000;
  ------------------
  |  Branch (3997:9): [True: 6, False: 225]
  ------------------
 3998|      2|        case 170: return 169.958220000;
  ------------------
  |  Branch (3998:9): [True: 2, False: 229]
  ------------------
 3999|      2|        case 171: return 170.955720000;
  ------------------
  |  Branch (3999:9): [True: 2, False: 229]
  ------------------
 4000|      2|        case 172: return 171.955420000;
  ------------------
  |  Branch (4000:9): [True: 2, False: 229]
  ------------------
 4001|      6|        case 173: return 172.953240000;
  ------------------
  |  Branch (4001:9): [True: 6, False: 225]
  ------------------
 4002|      2|        case 174: return 173.953120000;
  ------------------
  |  Branch (4002:9): [True: 2, False: 229]
  ------------------
 4003|      2|        case 175: return 174.951380000;
  ------------------
  |  Branch (4003:9): [True: 2, False: 229]
  ------------------
 4004|      2|        case 176: return 175.951620000;
  ------------------
  |  Branch (4004:9): [True: 2, False: 229]
  ------------------
 4005|      2|        case 177: return 176.950330000;
  ------------------
  |  Branch (4005:9): [True: 2, False: 229]
  ------------------
 4006|      2|        case 178: return 177.950990000;
  ------------------
  |  Branch (4006:9): [True: 2, False: 229]
  ------------------
 4007|      6|        case 179: return 178.949988000;
  ------------------
  |  Branch (4007:9): [True: 6, False: 225]
  ------------------
 4008|      2|        case 180: return 179.950789000;
  ------------------
  |  Branch (4008:9): [True: 2, False: 229]
  ------------------
 4009|      6|        case 181: return 180.950068000;
  ------------------
  |  Branch (4009:9): [True: 6, False: 225]
  ------------------
 4010|      2|        case 182: return 181.951210000;
  ------------------
  |  Branch (4010:9): [True: 2, False: 229]
  ------------------
 4011|      4|        case 183: return 182.950820000;
  ------------------
  |  Branch (4011:9): [True: 4, False: 227]
  ------------------
 4012|      2|        case 184: return 183.952521000;
  ------------------
  |  Branch (4012:9): [True: 2, False: 229]
  ------------------
 4013|      2|        case 185: return 184.952955000;
  ------------------
  |  Branch (4013:9): [True: 2, False: 229]
  ------------------
 4014|      6|        case 186: return 185.954986000;
  ------------------
  |  Branch (4014:9): [True: 6, False: 225]
  ------------------
 4015|     53|        case 0: case 187: return 186.955753000;
  ------------------
  |  Branch (4015:9): [True: 51, False: 180]
  |  Branch (4015:17): [True: 2, False: 229]
  ------------------
 4016|      2|        case 188: return 187.958114000;
  ------------------
  |  Branch (4016:9): [True: 2, False: 229]
  ------------------
 4017|      2|        case 189: return 188.959229000;
  ------------------
  |  Branch (4017:9): [True: 2, False: 229]
  ------------------
 4018|      2|        case 190: return 189.961820000;
  ------------------
  |  Branch (4018:9): [True: 2, False: 229]
  ------------------
 4019|      2|        case 191: return 190.963125000;
  ------------------
  |  Branch (4019:9): [True: 2, False: 229]
  ------------------
 4020|      2|        case 192: return 191.965960000;
  ------------------
  |  Branch (4020:9): [True: 2, False: 229]
  ------------------
 4021|      2|        case 193: return 192.967470000;
  ------------------
  |  Branch (4021:9): [True: 2, False: 229]
  ------------------
 4022|      6|        case 194: return 193.970420000;
  ------------------
  |  Branch (4022:9): [True: 6, False: 225]
  ------------------
 4023|    231|        }
 4024|     34|        break;
 4025|    324|      case 76:
  ------------------
  |  Branch (4025:7): [True: 324, False: 414k]
  ------------------
 4026|    324|        switch (isotope) {
  ------------------
  |  Branch (4026:17): [True: 306, False: 18]
  ------------------
 4027|      2|        case 162: return 161.984430000;
  ------------------
  |  Branch (4027:9): [True: 2, False: 322]
  ------------------
 4028|      2|        case 163: return 162.982690000;
  ------------------
  |  Branch (4028:9): [True: 2, False: 322]
  ------------------
 4029|      8|        case 164: return 163.978040000;
  ------------------
  |  Branch (4029:9): [True: 8, False: 316]
  ------------------
 4030|      2|        case 165: return 164.976760000;
  ------------------
  |  Branch (4030:9): [True: 2, False: 322]
  ------------------
 4031|      2|        case 166: return 165.972691000;
  ------------------
  |  Branch (4031:9): [True: 2, False: 322]
  ------------------
 4032|      6|        case 167: return 166.971550000;
  ------------------
  |  Branch (4032:9): [True: 6, False: 318]
  ------------------
 4033|      2|        case 168: return 167.967804000;
  ------------------
  |  Branch (4033:9): [True: 2, False: 322]
  ------------------
 4034|      2|        case 169: return 168.967019000;
  ------------------
  |  Branch (4034:9): [True: 2, False: 322]
  ------------------
 4035|      2|        case 170: return 169.963577000;
  ------------------
  |  Branch (4035:9): [True: 2, False: 322]
  ------------------
 4036|      2|        case 171: return 170.963185000;
  ------------------
  |  Branch (4036:9): [True: 2, False: 322]
  ------------------
 4037|      8|        case 172: return 171.960023000;
  ------------------
  |  Branch (4037:9): [True: 8, False: 316]
  ------------------
 4038|      2|        case 173: return 172.959808000;
  ------------------
  |  Branch (4038:9): [True: 2, False: 322]
  ------------------
 4039|      2|        case 174: return 173.957062000;
  ------------------
  |  Branch (4039:9): [True: 2, False: 322]
  ------------------
 4040|      6|        case 175: return 174.956946000;
  ------------------
  |  Branch (4040:9): [True: 6, False: 318]
  ------------------
 4041|      8|        case 176: return 175.954810000;
  ------------------
  |  Branch (4041:9): [True: 8, False: 316]
  ------------------
 4042|      6|        case 177: return 176.954965000;
  ------------------
  |  Branch (4042:9): [True: 6, False: 318]
  ------------------
 4043|      6|        case 178: return 177.953251000;
  ------------------
  |  Branch (4043:9): [True: 6, False: 318]
  ------------------
 4044|      2|        case 179: return 178.953816000;
  ------------------
  |  Branch (4044:9): [True: 2, False: 322]
  ------------------
 4045|      2|        case 180: return 179.952379000;
  ------------------
  |  Branch (4045:9): [True: 2, False: 322]
  ------------------
 4046|      2|        case 181: return 180.953240000;
  ------------------
  |  Branch (4046:9): [True: 2, False: 322]
  ------------------
 4047|     10|        case 182: return 181.952110000;
  ------------------
  |  Branch (4047:9): [True: 10, False: 314]
  ------------------
 4048|      2|        case 183: return 182.953130000;
  ------------------
  |  Branch (4048:9): [True: 2, False: 322]
  ------------------
 4049|      2|        case 184: return 183.952489000;
  ------------------
  |  Branch (4049:9): [True: 2, False: 322]
  ------------------
 4050|      6|        case 185: return 184.954042000;
  ------------------
  |  Branch (4050:9): [True: 6, False: 318]
  ------------------
 4051|      2|        case 186: return 185.953838000;
  ------------------
  |  Branch (4051:9): [True: 2, False: 322]
  ------------------
 4052|      2|        case 187: return 186.955750000;
  ------------------
  |  Branch (4052:9): [True: 2, False: 322]
  ------------------
 4053|      2|        case 188: return 187.955838000;
  ------------------
  |  Branch (4053:9): [True: 2, False: 322]
  ------------------
 4054|      2|        case 189: return 188.958147000;
  ------------------
  |  Branch (4054:9): [True: 2, False: 322]
  ------------------
 4055|      2|        case 190: return 189.958447000;
  ------------------
  |  Branch (4055:9): [True: 2, False: 322]
  ------------------
 4056|      4|        case 191: return 190.960929000;
  ------------------
  |  Branch (4056:9): [True: 4, False: 320]
  ------------------
 4057|    186|        case 0: case 192: return 191.961480000;
  ------------------
  |  Branch (4057:9): [True: 182, False: 142]
  |  Branch (4057:17): [True: 4, False: 320]
  ------------------
 4058|      2|        case 193: return 192.964151000;
  ------------------
  |  Branch (4058:9): [True: 2, False: 322]
  ------------------
 4059|      2|        case 194: return 193.965182000;
  ------------------
  |  Branch (4059:9): [True: 2, False: 322]
  ------------------
 4060|      6|        case 195: return 194.968130000;
  ------------------
  |  Branch (4060:9): [True: 6, False: 318]
  ------------------
 4061|      2|        case 196: return 195.969640000;
  ------------------
  |  Branch (4061:9): [True: 2, False: 322]
  ------------------
 4062|    324|        }
 4063|     18|        break;
 4064|    317|      case 77:
  ------------------
  |  Branch (4064:7): [True: 317, False: 414k]
  ------------------
 4065|    317|        switch (isotope) {
  ------------------
  |  Branch (4065:17): [True: 197, False: 120]
  ------------------
 4066|     10|        case 164: return 163.992200000;
  ------------------
  |  Branch (4066:9): [True: 10, False: 307]
  ------------------
 4067|      2|        case 165: return 164.987520000;
  ------------------
  |  Branch (4067:9): [True: 2, False: 315]
  ------------------
 4068|     12|        case 166: return 165.985820000;
  ------------------
  |  Branch (4068:9): [True: 12, False: 305]
  ------------------
 4069|      6|        case 167: return 166.981665000;
  ------------------
  |  Branch (4069:9): [True: 6, False: 311]
  ------------------
 4070|      2|        case 168: return 167.979880000;
  ------------------
  |  Branch (4070:9): [True: 2, False: 315]
  ------------------
 4071|      2|        case 169: return 168.976295000;
  ------------------
  |  Branch (4071:9): [True: 2, False: 315]
  ------------------
 4072|      8|        case 170: return 169.974970000;
  ------------------
  |  Branch (4072:9): [True: 8, False: 309]
  ------------------
 4073|      2|        case 171: return 170.971630000;
  ------------------
  |  Branch (4073:9): [True: 2, False: 315]
  ------------------
 4074|      2|        case 172: return 171.970460000;
  ------------------
  |  Branch (4074:9): [True: 2, False: 315]
  ------------------
 4075|      2|        case 173: return 172.967502000;
  ------------------
  |  Branch (4075:9): [True: 2, False: 315]
  ------------------
 4076|      2|        case 174: return 173.966861000;
  ------------------
  |  Branch (4076:9): [True: 2, False: 315]
  ------------------
 4077|     16|        case 175: return 174.964113000;
  ------------------
  |  Branch (4077:9): [True: 16, False: 301]
  ------------------
 4078|      6|        case 176: return 175.963649000;
  ------------------
  |  Branch (4078:9): [True: 6, False: 311]
  ------------------
 4079|      2|        case 177: return 176.961302000;
  ------------------
  |  Branch (4079:9): [True: 2, False: 315]
  ------------------
 4080|      2|        case 178: return 177.961082000;
  ------------------
  |  Branch (4080:9): [True: 2, False: 315]
  ------------------
 4081|      2|        case 179: return 178.959122000;
  ------------------
  |  Branch (4081:9): [True: 2, False: 315]
  ------------------
 4082|      6|        case 180: return 179.959229000;
  ------------------
  |  Branch (4082:9): [True: 6, False: 311]
  ------------------
 4083|      2|        case 181: return 180.957625000;
  ------------------
  |  Branch (4083:9): [True: 2, False: 315]
  ------------------
 4084|      2|        case 182: return 181.958076000;
  ------------------
  |  Branch (4084:9): [True: 2, False: 315]
  ------------------
 4085|      2|        case 183: return 182.956846000;
  ------------------
  |  Branch (4085:9): [True: 2, False: 315]
  ------------------
 4086|      2|        case 184: return 183.957480000;
  ------------------
  |  Branch (4086:9): [True: 2, False: 315]
  ------------------
 4087|      6|        case 185: return 184.956700000;
  ------------------
  |  Branch (4087:9): [True: 6, False: 311]
  ------------------
 4088|     14|        case 186: return 185.957946000;
  ------------------
  |  Branch (4088:9): [True: 14, False: 303]
  ------------------
 4089|      6|        case 187: return 186.957363000;
  ------------------
  |  Branch (4089:9): [True: 6, False: 311]
  ------------------
 4090|      2|        case 188: return 187.958853000;
  ------------------
  |  Branch (4090:9): [True: 2, False: 315]
  ------------------
 4091|      6|        case 189: return 188.958719000;
  ------------------
  |  Branch (4091:9): [True: 6, False: 311]
  ------------------
 4092|      2|        case 190: return 189.960546000;
  ------------------
  |  Branch (4092:9): [True: 2, False: 315]
  ------------------
 4093|      6|        case 191: return 190.960594000;
  ------------------
  |  Branch (4093:9): [True: 6, False: 311]
  ------------------
 4094|      2|        case 192: return 191.962605000;
  ------------------
  |  Branch (4094:9): [True: 2, False: 315]
  ------------------
 4095|     35|        case 0: case 193: return 192.962926000;
  ------------------
  |  Branch (4095:9): [True: 27, False: 290]
  |  Branch (4095:17): [True: 8, False: 309]
  ------------------
 4096|      6|        case 194: return 193.965078000;
  ------------------
  |  Branch (4096:9): [True: 6, False: 311]
  ------------------
 4097|      6|        case 195: return 194.965979000;
  ------------------
  |  Branch (4097:9): [True: 6, False: 311]
  ------------------
 4098|      8|        case 196: return 195.968400000;
  ------------------
  |  Branch (4098:9): [True: 8, False: 309]
  ------------------
 4099|      2|        case 197: return 196.969653000;
  ------------------
  |  Branch (4099:9): [True: 2, False: 315]
  ------------------
 4100|      2|        case 198: return 197.972280000;
  ------------------
  |  Branch (4100:9): [True: 2, False: 315]
  ------------------
 4101|      2|        case 199: return 198.973800000;
  ------------------
  |  Branch (4101:9): [True: 2, False: 315]
  ------------------
 4102|    317|        }
 4103|    120|        break;
 4104|    585|      case 78:
  ------------------
  |  Branch (4104:7): [True: 585, False: 414k]
  ------------------
 4105|    585|        switch (isotope) {
  ------------------
  |  Branch (4105:17): [True: 557, False: 28]
  ------------------
 4106|     16|        case 166: return 165.994860000;
  ------------------
  |  Branch (4106:9): [True: 16, False: 569]
  ------------------
 4107|      8|        case 167: return 166.992980000;
  ------------------
  |  Branch (4107:9): [True: 8, False: 577]
  ------------------
 4108|      6|        case 168: return 167.988150000;
  ------------------
  |  Branch (4108:9): [True: 6, False: 579]
  ------------------
 4109|      6|        case 169: return 168.986720000;
  ------------------
  |  Branch (4109:9): [True: 6, False: 579]
  ------------------
 4110|     10|        case 170: return 169.982495000;
  ------------------
  |  Branch (4110:9): [True: 10, False: 575]
  ------------------
 4111|      8|        case 171: return 170.981240000;
  ------------------
  |  Branch (4111:9): [True: 8, False: 577]
  ------------------
 4112|      6|        case 172: return 171.977347000;
  ------------------
  |  Branch (4112:9): [True: 6, False: 579]
  ------------------
 4113|     18|        case 173: return 172.976440000;
  ------------------
  |  Branch (4113:9): [True: 18, False: 567]
  ------------------
 4114|     38|        case 174: return 173.972819000;
  ------------------
  |  Branch (4114:9): [True: 38, False: 547]
  ------------------
 4115|     10|        case 175: return 174.972421000;
  ------------------
  |  Branch (4115:9): [True: 10, False: 575]
  ------------------
 4116|      6|        case 176: return 175.968945000;
  ------------------
  |  Branch (4116:9): [True: 6, False: 579]
  ------------------
 4117|     10|        case 177: return 176.968469000;
  ------------------
  |  Branch (4117:9): [True: 10, False: 575]
  ------------------
 4118|     16|        case 178: return 177.965649000;
  ------------------
  |  Branch (4118:9): [True: 16, False: 569]
  ------------------
 4119|      2|        case 179: return 178.965363000;
  ------------------
  |  Branch (4119:9): [True: 2, False: 583]
  ------------------
 4120|     42|        case 180: return 179.963031000;
  ------------------
  |  Branch (4120:9): [True: 42, False: 543]
  ------------------
 4121|    100|        case 181: return 180.963097000;
  ------------------
  |  Branch (4121:9): [True: 100, False: 485]
  ------------------
 4122|     12|        case 182: return 181.961171000;
  ------------------
  |  Branch (4122:9): [True: 12, False: 573]
  ------------------
 4123|      2|        case 183: return 182.961597000;
  ------------------
  |  Branch (4123:9): [True: 2, False: 583]
  ------------------
 4124|      2|        case 184: return 183.959922000;
  ------------------
  |  Branch (4124:9): [True: 2, False: 583]
  ------------------
 4125|      6|        case 185: return 184.960620000;
  ------------------
  |  Branch (4125:9): [True: 6, False: 579]
  ------------------
 4126|     42|        case 186: return 185.959351000;
  ------------------
  |  Branch (4126:9): [True: 42, False: 543]
  ------------------
 4127|     10|        case 187: return 186.960590000;
  ------------------
  |  Branch (4127:9): [True: 10, False: 575]
  ------------------
 4128|      8|        case 188: return 187.959395000;
  ------------------
  |  Branch (4128:9): [True: 8, False: 577]
  ------------------
 4129|      2|        case 189: return 188.960834000;
  ------------------
  |  Branch (4129:9): [True: 2, False: 583]
  ------------------
 4130|     12|        case 190: return 189.959932000;
  ------------------
  |  Branch (4130:9): [True: 12, False: 573]
  ------------------
 4131|      6|        case 191: return 190.961677000;
  ------------------
  |  Branch (4131:9): [True: 6, False: 579]
  ------------------
 4132|      2|        case 192: return 191.961038000;
  ------------------
  |  Branch (4132:9): [True: 2, False: 583]
  ------------------
 4133|      4|        case 193: return 192.962987000;
  ------------------
  |  Branch (4133:9): [True: 4, False: 581]
  ------------------
 4134|      2|        case 194: return 193.962680000;
  ------------------
  |  Branch (4134:9): [True: 2, False: 583]
  ------------------
 4135|    117|        case 0: case 195: return 194.964791000;
  ------------------
  |  Branch (4135:9): [True: 105, False: 480]
  |  Branch (4135:17): [True: 12, False: 573]
  ------------------
 4136|      2|        case 196: return 195.964951000;
  ------------------
  |  Branch (4136:9): [True: 2, False: 583]
  ------------------
 4137|      2|        case 197: return 196.967340000;
  ------------------
  |  Branch (4137:9): [True: 2, False: 583]
  ------------------
 4138|      6|        case 198: return 197.967893000;
  ------------------
  |  Branch (4138:9): [True: 6, False: 579]
  ------------------
 4139|      8|        case 199: return 198.970593000;
  ------------------
  |  Branch (4139:9): [True: 8, False: 577]
  ------------------
 4140|      2|        case 200: return 199.971441000;
  ------------------
  |  Branch (4140:9): [True: 2, False: 583]
  ------------------
 4141|      6|        case 201: return 200.974510000;
  ------------------
  |  Branch (4141:9): [True: 6, False: 579]
  ------------------
 4142|      2|        case 202: return 201.975740000;
  ------------------
  |  Branch (4142:9): [True: 2, False: 583]
  ------------------
 4143|    585|        }
 4144|     28|        break;
 4145|    397|      case 79:
  ------------------
  |  Branch (4145:7): [True: 397, False: 414k]
  ------------------
 4146|    397|        switch (isotope) {
  ------------------
  |  Branch (4146:17): [True: 383, False: 14]
  ------------------
 4147|      2|        case 169: return 168.998080000;
  ------------------
  |  Branch (4147:9): [True: 2, False: 395]
  ------------------
 4148|      2|        case 170: return 169.996120000;
  ------------------
  |  Branch (4148:9): [True: 2, False: 395]
  ------------------
 4149|      2|        case 171: return 170.991879000;
  ------------------
  |  Branch (4149:9): [True: 2, False: 395]
  ------------------
 4150|      6|        case 172: return 171.990040000;
  ------------------
  |  Branch (4150:9): [True: 6, False: 391]
  ------------------
 4151|      6|        case 173: return 172.986237000;
  ------------------
  |  Branch (4151:9): [True: 6, False: 391]
  ------------------
 4152|      6|        case 174: return 173.984760000;
  ------------------
  |  Branch (4152:9): [True: 6, False: 391]
  ------------------
 4153|      2|        case 175: return 174.981270000;
  ------------------
  |  Branch (4153:9): [True: 2, False: 395]
  ------------------
 4154|      2|        case 176: return 175.980100000;
  ------------------
  |  Branch (4154:9): [True: 2, False: 395]
  ------------------
 4155|      2|        case 177: return 176.976865000;
  ------------------
  |  Branch (4155:9): [True: 2, False: 395]
  ------------------
 4156|      2|        case 178: return 177.976030000;
  ------------------
  |  Branch (4156:9): [True: 2, False: 395]
  ------------------
 4157|      6|        case 179: return 178.973213000;
  ------------------
  |  Branch (4157:9): [True: 6, False: 391]
  ------------------
 4158|      2|        case 180: return 179.972521000;
  ------------------
  |  Branch (4158:9): [True: 2, False: 395]
  ------------------
 4159|      2|        case 181: return 180.970079000;
  ------------------
  |  Branch (4159:9): [True: 2, False: 395]
  ------------------
 4160|      4|        case 182: return 181.969618000;
  ------------------
  |  Branch (4160:9): [True: 4, False: 393]
  ------------------
 4161|      2|        case 183: return 182.967593000;
  ------------------
  |  Branch (4161:9): [True: 2, False: 395]
  ------------------
 4162|      6|        case 184: return 183.967452000;
  ------------------
  |  Branch (4162:9): [True: 6, False: 391]
  ------------------
 4163|      2|        case 185: return 184.965789000;
  ------------------
  |  Branch (4163:9): [True: 2, False: 395]
  ------------------
 4164|      2|        case 186: return 185.965953000;
  ------------------
  |  Branch (4164:9): [True: 2, False: 395]
  ------------------
 4165|      2|        case 187: return 186.964568000;
  ------------------
  |  Branch (4165:9): [True: 2, False: 395]
  ------------------
 4166|      2|        case 188: return 187.965324000;
  ------------------
  |  Branch (4166:9): [True: 2, False: 395]
  ------------------
 4167|      2|        case 189: return 188.963948000;
  ------------------
  |  Branch (4167:9): [True: 2, False: 395]
  ------------------
 4168|      2|        case 190: return 189.964700000;
  ------------------
  |  Branch (4168:9): [True: 2, False: 395]
  ------------------
 4169|      2|        case 191: return 190.963700000;
  ------------------
  |  Branch (4169:9): [True: 2, False: 395]
  ------------------
 4170|      2|        case 192: return 191.964813000;
  ------------------
  |  Branch (4170:9): [True: 2, False: 395]
  ------------------
 4171|      6|        case 193: return 192.964150000;
  ------------------
  |  Branch (4171:9): [True: 6, False: 391]
  ------------------
 4172|      6|        case 194: return 193.965365000;
  ------------------
  |  Branch (4172:9): [True: 6, False: 391]
  ------------------
 4173|      2|        case 195: return 194.965034000;
  ------------------
  |  Branch (4173:9): [True: 2, False: 395]
  ------------------
 4174|      2|        case 196: return 195.966570000;
  ------------------
  |  Branch (4174:9): [True: 2, False: 395]
  ------------------
 4175|    265|        case 0: case 197: return 196.966568000;
  ------------------
  |  Branch (4175:9): [True: 263, False: 134]
  |  Branch (4175:17): [True: 2, False: 395]
  ------------------
 4176|      6|        case 198: return 197.968242000;
  ------------------
  |  Branch (4176:9): [True: 6, False: 391]
  ------------------
 4177|      2|        case 199: return 198.968765000;
  ------------------
  |  Branch (4177:9): [True: 2, False: 395]
  ------------------
 4178|      2|        case 200: return 199.970730000;
  ------------------
  |  Branch (4178:9): [True: 2, False: 395]
  ------------------
 4179|      2|        case 201: return 200.971657000;
  ------------------
  |  Branch (4179:9): [True: 2, False: 395]
  ------------------
 4180|      6|        case 202: return 201.973810000;
  ------------------
  |  Branch (4180:9): [True: 6, False: 391]
  ------------------
 4181|      6|        case 203: return 202.975155000;
  ------------------
  |  Branch (4181:9): [True: 6, False: 391]
  ------------------
 4182|      2|        case 204: return 203.977720000;
  ------------------
  |  Branch (4182:9): [True: 2, False: 395]
  ------------------
 4183|      6|        case 205: return 204.979870000;
  ------------------
  |  Branch (4183:9): [True: 6, False: 391]
  ------------------
 4184|    397|        }
 4185|     14|        break;
 4186|    381|      case 80:
  ------------------
  |  Branch (4186:7): [True: 381, False: 414k]
  ------------------
 4187|    381|        switch (isotope) {
  ------------------
  |  Branch (4187:17): [True: 373, False: 8]
  ------------------
 4188|     18|        case 171: return 171.003760000;
  ------------------
  |  Branch (4188:9): [True: 18, False: 363]
  ------------------
 4189|      6|        case 172: return 171.998830000;
  ------------------
  |  Branch (4189:9): [True: 6, False: 375]
  ------------------
 4190|     14|        case 173: return 172.997240000;
  ------------------
  |  Branch (4190:9): [True: 14, False: 367]
  ------------------
 4191|      6|        case 174: return 173.992864000;
  ------------------
  |  Branch (4191:9): [True: 6, False: 375]
  ------------------
 4192|      6|        case 175: return 174.991420000;
  ------------------
  |  Branch (4192:9): [True: 6, False: 375]
  ------------------
 4193|      8|        case 176: return 175.987355000;
  ------------------
  |  Branch (4193:9): [True: 8, False: 373]
  ------------------
 4194|     14|        case 177: return 176.986280000;
  ------------------
  |  Branch (4194:9): [True: 14, False: 367]
  ------------------
 4195|     14|        case 178: return 177.982483000;
  ------------------
  |  Branch (4195:9): [True: 14, False: 367]
  ------------------
 4196|     12|        case 179: return 178.981834000;
  ------------------
  |  Branch (4196:9): [True: 12, False: 369]
  ------------------
 4197|      6|        case 180: return 179.978266000;
  ------------------
  |  Branch (4197:9): [True: 6, False: 375]
  ------------------
 4198|      4|        case 181: return 180.977819000;
  ------------------
  |  Branch (4198:9): [True: 4, False: 377]
  ------------------
 4199|      2|        case 182: return 181.974690000;
  ------------------
  |  Branch (4199:9): [True: 2, False: 379]
  ------------------
 4200|      2|        case 183: return 182.974450000;
  ------------------
  |  Branch (4200:9): [True: 2, False: 379]
  ------------------
 4201|      2|        case 184: return 183.971713000;
  ------------------
  |  Branch (4201:9): [True: 2, False: 379]
  ------------------
 4202|      2|        case 185: return 184.971899000;
  ------------------
  |  Branch (4202:9): [True: 2, False: 379]
  ------------------
 4203|      4|        case 186: return 185.969362000;
  ------------------
  |  Branch (4203:9): [True: 4, False: 377]
  ------------------
 4204|      2|        case 187: return 186.969814000;
  ------------------
  |  Branch (4204:9): [True: 2, False: 379]
  ------------------
 4205|      4|        case 188: return 187.967577000;
  ------------------
  |  Branch (4205:9): [True: 4, False: 377]
  ------------------
 4206|      8|        case 189: return 188.968190000;
  ------------------
  |  Branch (4206:9): [True: 8, False: 373]
  ------------------
 4207|      6|        case 190: return 189.966322000;
  ------------------
  |  Branch (4207:9): [True: 6, False: 375]
  ------------------
 4208|      2|        case 191: return 190.967157000;
  ------------------
  |  Branch (4208:9): [True: 2, False: 379]
  ------------------
 4209|      6|        case 192: return 191.965634000;
  ------------------
  |  Branch (4209:9): [True: 6, False: 375]
  ------------------
 4210|      2|        case 193: return 192.966665000;
  ------------------
  |  Branch (4210:9): [True: 2, False: 379]
  ------------------
 4211|      2|        case 194: return 193.965439000;
  ------------------
  |  Branch (4211:9): [True: 2, False: 379]
  ------------------
 4212|      2|        case 195: return 194.966720000;
  ------------------
  |  Branch (4212:9): [True: 2, False: 379]
  ------------------
 4213|      2|        case 196: return 195.965833000;
  ------------------
  |  Branch (4213:9): [True: 2, False: 379]
  ------------------
 4214|      6|        case 197: return 196.967213000;
  ------------------
  |  Branch (4214:9): [True: 6, False: 375]
  ------------------
 4215|      2|        case 198: return 197.966769000;
  ------------------
  |  Branch (4215:9): [True: 2, False: 379]
  ------------------
 4216|      2|        case 199: return 198.968279000;
  ------------------
  |  Branch (4216:9): [True: 2, False: 379]
  ------------------
 4217|      2|        case 200: return 199.968326000;
  ------------------
  |  Branch (4217:9): [True: 2, False: 379]
  ------------------
 4218|      0|        case 201: return 200.970302000;
  ------------------
  |  Branch (4218:9): [True: 0, False: 381]
  ------------------
 4219|    195|        case 0: case 202: return 201.970643000;
  ------------------
  |  Branch (4219:9): [True: 193, False: 188]
  |  Branch (4219:17): [True: 2, False: 379]
  ------------------
 4220|      2|        case 203: return 202.972872000;
  ------------------
  |  Branch (4220:9): [True: 2, False: 379]
  ------------------
 4221|      2|        case 204: return 203.973493000;
  ------------------
  |  Branch (4221:9): [True: 2, False: 379]
  ------------------
 4222|      2|        case 205: return 204.976073000;
  ------------------
  |  Branch (4222:9): [True: 2, False: 379]
  ------------------
 4223|      0|        case 206: return 205.977514000;
  ------------------
  |  Branch (4223:9): [True: 0, False: 381]
  ------------------
 4224|      0|        case 207: return 206.982590000;
  ------------------
  |  Branch (4224:9): [True: 0, False: 381]
  ------------------
 4225|      0|        case 208: return 207.985940000;
  ------------------
  |  Branch (4225:9): [True: 0, False: 381]
  ------------------
 4226|      2|        case 209: return 208.991040000;
  ------------------
  |  Branch (4226:9): [True: 2, False: 379]
  ------------------
 4227|      2|        case 210: return 209.994510000;
  ------------------
  |  Branch (4227:9): [True: 2, False: 379]
  ------------------
 4228|    381|        }
 4229|      8|        break;
 4230|    436|      case 81:
  ------------------
  |  Branch (4230:7): [True: 436, False: 414k]
  ------------------
 4231|    436|        switch (isotope) {
  ------------------
  |  Branch (4231:17): [True: 400, False: 36]
  ------------------
 4232|      2|        case 176: return 176.000590000;
  ------------------
  |  Branch (4232:9): [True: 2, False: 434]
  ------------------
 4233|      2|        case 177: return 176.996427000;
  ------------------
  |  Branch (4233:9): [True: 2, False: 434]
  ------------------
 4234|     12|        case 178: return 177.994900000;
  ------------------
  |  Branch (4234:9): [True: 12, False: 424]
  ------------------
 4235|      2|        case 179: return 178.991090000;
  ------------------
  |  Branch (4235:9): [True: 2, False: 434]
  ------------------
 4236|      6|        case 180: return 179.989910000;
  ------------------
  |  Branch (4236:9): [True: 6, False: 430]
  ------------------
 4237|      6|        case 181: return 180.986257000;
  ------------------
  |  Branch (4237:9): [True: 6, False: 430]
  ------------------
 4238|      2|        case 182: return 181.985670000;
  ------------------
  |  Branch (4238:9): [True: 2, False: 434]
  ------------------
 4239|      6|        case 183: return 182.982193000;
  ------------------
  |  Branch (4239:9): [True: 6, False: 430]
  ------------------
 4240|      4|        case 184: return 183.981870000;
  ------------------
  |  Branch (4240:9): [True: 4, False: 432]
  ------------------
 4241|      6|        case 185: return 184.978790000;
  ------------------
  |  Branch (4241:9): [True: 6, False: 430]
  ------------------
 4242|      2|        case 186: return 185.978330000;
  ------------------
  |  Branch (4242:9): [True: 2, False: 434]
  ------------------
 4243|      2|        case 187: return 186.975906000;
  ------------------
  |  Branch (4243:9): [True: 2, False: 434]
  ------------------
 4244|      2|        case 188: return 187.976010000;
  ------------------
  |  Branch (4244:9): [True: 2, False: 434]
  ------------------
 4245|      6|        case 189: return 188.973588000;
  ------------------
  |  Branch (4245:9): [True: 6, False: 430]
  ------------------
 4246|      2|        case 190: return 189.973880000;
  ------------------
  |  Branch (4246:9): [True: 2, False: 434]
  ------------------
 4247|      6|        case 191: return 190.971786000;
  ------------------
  |  Branch (4247:9): [True: 6, False: 430]
  ------------------
 4248|      6|        case 192: return 191.972230000;
  ------------------
  |  Branch (4248:9): [True: 6, False: 430]
  ------------------
 4249|     12|        case 193: return 192.970670000;
  ------------------
  |  Branch (4249:9): [True: 12, False: 424]
  ------------------
 4250|     10|        case 194: return 193.971200000;
  ------------------
  |  Branch (4250:9): [True: 10, False: 426]
  ------------------
 4251|      6|        case 195: return 194.969774000;
  ------------------
  |  Branch (4251:9): [True: 6, False: 430]
  ------------------
 4252|      2|        case 196: return 195.970481000;
  ------------------
  |  Branch (4252:9): [True: 2, False: 434]
  ------------------
 4253|      2|        case 197: return 196.969575000;
  ------------------
  |  Branch (4253:9): [True: 2, False: 434]
  ------------------
 4254|      6|        case 198: return 197.970480000;
  ------------------
  |  Branch (4254:9): [True: 6, False: 430]
  ------------------
 4255|      4|        case 199: return 198.969880000;
  ------------------
  |  Branch (4255:9): [True: 4, False: 432]
  ------------------
 4256|      2|        case 200: return 199.970963000;
  ------------------
  |  Branch (4256:9): [True: 2, False: 434]
  ------------------
 4257|      4|        case 201: return 200.970819000;
  ------------------
  |  Branch (4257:9): [True: 4, False: 432]
  ------------------
 4258|      2|        case 202: return 201.972106000;
  ------------------
  |  Branch (4258:9): [True: 2, False: 434]
  ------------------
 4259|      2|        case 203: return 202.972344000;
  ------------------
  |  Branch (4259:9): [True: 2, False: 434]
  ------------------
 4260|      6|        case 204: return 203.973863000;
  ------------------
  |  Branch (4260:9): [True: 6, False: 430]
  ------------------
 4261|    248|        case 0: case 205: return 204.974427000;
  ------------------
  |  Branch (4261:9): [True: 246, False: 190]
  |  Branch (4261:17): [True: 2, False: 434]
  ------------------
 4262|      4|        case 206: return 205.976110000;
  ------------------
  |  Branch (4262:9): [True: 4, False: 432]
  ------------------
 4263|      2|        case 207: return 206.977419000;
  ------------------
  |  Branch (4263:9): [True: 2, False: 434]
  ------------------
 4264|      6|        case 208: return 207.982018000;
  ------------------
  |  Branch (4264:9): [True: 6, False: 430]
  ------------------
 4265|      2|        case 209: return 208.985359000;
  ------------------
  |  Branch (4265:9): [True: 2, False: 434]
  ------------------
 4266|      2|        case 210: return 209.990074000;
  ------------------
  |  Branch (4266:9): [True: 2, False: 434]
  ------------------
 4267|      2|        case 211: return 210.993480000;
  ------------------
  |  Branch (4267:9): [True: 2, False: 434]
  ------------------
 4268|      2|        case 212: return 211.998230000;
  ------------------
  |  Branch (4268:9): [True: 2, False: 434]
  ------------------
 4269|    436|        }
 4270|     36|        break;
 4271|    771|      case 82:
  ------------------
  |  Branch (4271:7): [True: 771, False: 414k]
  ------------------
 4272|    771|        switch (isotope) {
  ------------------
  |  Branch (4272:17): [True: 761, False: 10]
  ------------------
 4273|     10|        case 178: return 178.003830000;
  ------------------
  |  Branch (4273:9): [True: 10, False: 761]
  ------------------
 4274|      2|        case 179: return 179.002150000;
  ------------------
  |  Branch (4274:9): [True: 2, False: 769]
  ------------------
 4275|      6|        case 180: return 179.997918000;
  ------------------
  |  Branch (4275:9): [True: 6, False: 765]
  ------------------
 4276|     10|        case 181: return 180.996620000;
  ------------------
  |  Branch (4276:9): [True: 10, False: 761]
  ------------------
 4277|     10|        case 182: return 181.992672000;
  ------------------
  |  Branch (4277:9): [True: 10, False: 761]
  ------------------
 4278|      6|        case 183: return 182.991870000;
  ------------------
  |  Branch (4278:9): [True: 6, False: 765]
  ------------------
 4279|     38|        case 184: return 183.988142000;
  ------------------
  |  Branch (4279:9): [True: 38, False: 733]
  ------------------
 4280|     10|        case 185: return 184.987610000;
  ------------------
  |  Branch (4280:9): [True: 10, False: 761]
  ------------------
 4281|      6|        case 186: return 185.984239000;
  ------------------
  |  Branch (4281:9): [True: 6, False: 765]
  ------------------
 4282|      2|        case 187: return 186.983918000;
  ------------------
  |  Branch (4282:9): [True: 2, False: 769]
  ------------------
 4283|      6|        case 188: return 187.980874000;
  ------------------
  |  Branch (4283:9): [True: 6, False: 765]
  ------------------
 4284|      2|        case 189: return 188.980810000;
  ------------------
  |  Branch (4284:9): [True: 2, False: 769]
  ------------------
 4285|      8|        case 190: return 189.978082000;
  ------------------
  |  Branch (4285:9): [True: 8, False: 763]
  ------------------
 4286|      8|        case 191: return 190.978270000;
  ------------------
  |  Branch (4286:9): [True: 8, False: 763]
  ------------------
 4287|     12|        case 192: return 191.975785000;
  ------------------
  |  Branch (4287:9): [True: 12, False: 759]
  ------------------
 4288|      2|        case 193: return 192.976170000;
  ------------------
  |  Branch (4288:9): [True: 2, False: 769]
  ------------------
 4289|      8|        case 194: return 193.974012000;
  ------------------
  |  Branch (4289:9): [True: 8, False: 763]
  ------------------
 4290|      6|        case 195: return 194.974542000;
  ------------------
  |  Branch (4290:9): [True: 6, False: 765]
  ------------------
 4291|      6|        case 196: return 195.972774000;
  ------------------
  |  Branch (4291:9): [True: 6, False: 765]
  ------------------
 4292|     34|        case 197: return 196.973431000;
  ------------------
  |  Branch (4292:9): [True: 34, False: 737]
  ------------------
 4293|      6|        case 198: return 197.972034000;
  ------------------
  |  Branch (4293:9): [True: 6, False: 765]
  ------------------
 4294|      6|        case 199: return 198.972917000;
  ------------------
  |  Branch (4294:9): [True: 6, False: 765]
  ------------------
 4295|      2|        case 200: return 199.971827000;
  ------------------
  |  Branch (4295:9): [True: 2, False: 769]
  ------------------
 4296|      6|        case 201: return 200.972885000;
  ------------------
  |  Branch (4296:9): [True: 6, False: 765]
  ------------------
 4297|      2|        case 202: return 201.972159000;
  ------------------
  |  Branch (4297:9): [True: 2, False: 769]
  ------------------
 4298|      6|        case 203: return 202.973391000;
  ------------------
  |  Branch (4298:9): [True: 6, False: 765]
  ------------------
 4299|      2|        case 204: return 203.973043000;
  ------------------
  |  Branch (4299:9): [True: 2, False: 769]
  ------------------
 4300|      2|        case 205: return 204.974481000;
  ------------------
  |  Branch (4300:9): [True: 2, False: 769]
  ------------------
 4301|      2|        case 206: return 205.974465000;
  ------------------
  |  Branch (4301:9): [True: 2, False: 769]
  ------------------
 4302|      2|        case 207: return 206.975896000;
  ------------------
  |  Branch (4302:9): [True: 2, False: 769]
  ------------------
 4303|    509|        case 0: case 208: return 207.976652000;
  ------------------
  |  Branch (4303:9): [True: 507, False: 264]
  |  Branch (4303:17): [True: 2, False: 769]
  ------------------
 4304|      2|        case 209: return 208.981090000;
  ------------------
  |  Branch (4304:9): [True: 2, False: 769]
  ------------------
 4305|      6|        case 210: return 209.984188000;
  ------------------
  |  Branch (4305:9): [True: 6, False: 765]
  ------------------
 4306|      2|        case 211: return 210.988737000;
  ------------------
  |  Branch (4306:9): [True: 2, False: 769]
  ------------------
 4307|      8|        case 212: return 211.991897000;
  ------------------
  |  Branch (4307:9): [True: 8, False: 763]
  ------------------
 4308|      2|        case 213: return 212.996581000;
  ------------------
  |  Branch (4308:9): [True: 2, False: 769]
  ------------------
 4309|      2|        case 214: return 213.999805000;
  ------------------
  |  Branch (4309:9): [True: 2, False: 769]
  ------------------
 4310|      2|        case 215: return 215.004810000;
  ------------------
  |  Branch (4310:9): [True: 2, False: 769]
  ------------------
 4311|    771|        }
 4312|     10|        break;
 4313|  2.20k|      case 83:
  ------------------
  |  Branch (4313:7): [True: 2.20k, False: 412k]
  ------------------
 4314|  2.20k|        switch (isotope) {
  ------------------
  |  Branch (4314:17): [True: 2.17k, False: 36]
  ------------------
 4315|      6|        case 184: return 184.001120000;
  ------------------
  |  Branch (4315:9): [True: 6, False: 2.20k]
  ------------------
 4316|      2|        case 185: return 184.997630000;
  ------------------
  |  Branch (4316:9): [True: 2, False: 2.20k]
  ------------------
 4317|      6|        case 186: return 185.996600000;
  ------------------
  |  Branch (4317:9): [True: 6, False: 2.20k]
  ------------------
 4318|      2|        case 187: return 186.993158000;
  ------------------
  |  Branch (4318:9): [True: 2, False: 2.20k]
  ------------------
 4319|      4|        case 188: return 187.992270000;
  ------------------
  |  Branch (4319:9): [True: 4, False: 2.20k]
  ------------------
 4320|     10|        case 189: return 188.989200000;
  ------------------
  |  Branch (4320:9): [True: 10, False: 2.19k]
  ------------------
 4321|      6|        case 190: return 189.988300000;
  ------------------
  |  Branch (4321:9): [True: 6, False: 2.20k]
  ------------------
 4322|      6|        case 191: return 190.985786000;
  ------------------
  |  Branch (4322:9): [True: 6, False: 2.20k]
  ------------------
 4323|      6|        case 192: return 191.985460000;
  ------------------
  |  Branch (4323:9): [True: 6, False: 2.20k]
  ------------------
 4324|      2|        case 193: return 192.982960000;
  ------------------
  |  Branch (4324:9): [True: 2, False: 2.20k]
  ------------------
 4325|      6|        case 194: return 193.982830000;
  ------------------
  |  Branch (4325:9): [True: 6, False: 2.20k]
  ------------------
 4326|      6|        case 195: return 194.980651000;
  ------------------
  |  Branch (4326:9): [True: 6, False: 2.20k]
  ------------------
 4327|      2|        case 196: return 195.980667000;
  ------------------
  |  Branch (4327:9): [True: 2, False: 2.20k]
  ------------------
 4328|     14|        case 197: return 196.978864000;
  ------------------
  |  Branch (4328:9): [True: 14, False: 2.19k]
  ------------------
 4329|     26|        case 198: return 197.979210000;
  ------------------
  |  Branch (4329:9): [True: 26, False: 2.18k]
  ------------------
 4330|     18|        case 199: return 198.977672000;
  ------------------
  |  Branch (4330:9): [True: 18, False: 2.19k]
  ------------------
 4331|      6|        case 200: return 199.978132000;
  ------------------
  |  Branch (4331:9): [True: 6, False: 2.20k]
  ------------------
 4332|      2|        case 201: return 200.977009000;
  ------------------
  |  Branch (4332:9): [True: 2, False: 2.20k]
  ------------------
 4333|      6|        case 202: return 201.977742000;
  ------------------
  |  Branch (4333:9): [True: 6, False: 2.20k]
  ------------------
 4334|      2|        case 203: return 202.976876000;
  ------------------
  |  Branch (4334:9): [True: 2, False: 2.20k]
  ------------------
 4335|      2|        case 204: return 203.977813000;
  ------------------
  |  Branch (4335:9): [True: 2, False: 2.20k]
  ------------------
 4336|      2|        case 205: return 204.977389000;
  ------------------
  |  Branch (4336:9): [True: 2, False: 2.20k]
  ------------------
 4337|      2|        case 206: return 205.978499000;
  ------------------
  |  Branch (4337:9): [True: 2, False: 2.20k]
  ------------------
 4338|      2|        case 207: return 206.978470000;
  ------------------
  |  Branch (4338:9): [True: 2, False: 2.20k]
  ------------------
 4339|      2|        case 208: return 207.979742000;
  ------------------
  |  Branch (4339:9): [True: 2, False: 2.20k]
  ------------------
 4340|  1.98k|        case 0: case 209: return 208.980398000;
  ------------------
  |  Branch (4340:9): [True: 1.98k, False: 228]
  |  Branch (4340:17): [True: 6, False: 2.20k]
  ------------------
 4341|      2|        case 210: return 209.984120000;
  ------------------
  |  Branch (4341:9): [True: 2, False: 2.20k]
  ------------------
 4342|      2|        case 211: return 210.987269000;
  ------------------
  |  Branch (4342:9): [True: 2, False: 2.20k]
  ------------------
 4343|      2|        case 212: return 211.991285000;
  ------------------
  |  Branch (4343:9): [True: 2, False: 2.20k]
  ------------------
 4344|      2|        case 213: return 212.994385000;
  ------------------
  |  Branch (4344:9): [True: 2, False: 2.20k]
  ------------------
 4345|      2|        case 214: return 213.998712000;
  ------------------
  |  Branch (4345:9): [True: 2, False: 2.20k]
  ------------------
 4346|      6|        case 215: return 215.001770000;
  ------------------
  |  Branch (4346:9): [True: 6, False: 2.20k]
  ------------------
 4347|     10|        case 216: return 216.006306000;
  ------------------
  |  Branch (4347:9): [True: 10, False: 2.19k]
  ------------------
 4348|      6|        case 217: return 217.009470000;
  ------------------
  |  Branch (4348:9): [True: 6, False: 2.20k]
  ------------------
 4349|      6|        case 218: return 218.014320000;
  ------------------
  |  Branch (4349:9): [True: 6, False: 2.20k]
  ------------------
 4350|  2.20k|        }
 4351|     36|        break;
 4352|    733|      case 84:
  ------------------
  |  Branch (4352:7): [True: 733, False: 414k]
  ------------------
 4353|    733|        switch (isotope) {
  ------------------
  |  Branch (4353:17): [True: 721, False: 12]
  ------------------
 4354|      2|        case 188: return 187.999422000;
  ------------------
  |  Branch (4354:9): [True: 2, False: 731]
  ------------------
 4355|      6|        case 189: return 188.998481000;
  ------------------
  |  Branch (4355:9): [True: 6, False: 727]
  ------------------
 4356|      6|        case 190: return 189.995101000;
  ------------------
  |  Branch (4356:9): [True: 6, False: 727]
  ------------------
 4357|      6|        case 191: return 190.994574000;
  ------------------
  |  Branch (4357:9): [True: 6, False: 727]
  ------------------
 4358|      2|        case 192: return 191.991335000;
  ------------------
  |  Branch (4358:9): [True: 2, False: 731]
  ------------------
 4359|      0|        case 193: return 192.991030000;
  ------------------
  |  Branch (4359:9): [True: 0, False: 733]
  ------------------
 4360|      0|        case 194: return 193.988186000;
  ------------------
  |  Branch (4360:9): [True: 0, False: 733]
  ------------------
 4361|      0|        case 195: return 194.988110000;
  ------------------
  |  Branch (4361:9): [True: 0, False: 733]
  ------------------
 4362|      2|        case 196: return 195.985535000;
  ------------------
  |  Branch (4362:9): [True: 2, False: 731]
  ------------------
 4363|      6|        case 197: return 196.985660000;
  ------------------
  |  Branch (4363:9): [True: 6, False: 727]
  ------------------
 4364|      2|        case 198: return 197.983389000;
  ------------------
  |  Branch (4364:9): [True: 2, False: 731]
  ------------------
 4365|      6|        case 199: return 198.983666000;
  ------------------
  |  Branch (4365:9): [True: 6, False: 727]
  ------------------
 4366|      8|        case 200: return 199.981799000;
  ------------------
  |  Branch (4366:9): [True: 8, False: 725]
  ------------------
 4367|      6|        case 201: return 200.982260000;
  ------------------
  |  Branch (4367:9): [True: 6, False: 727]
  ------------------
 4368|      2|        case 202: return 201.980758000;
  ------------------
  |  Branch (4368:9): [True: 2, False: 731]
  ------------------
 4369|      2|        case 203: return 202.981420000;
  ------------------
  |  Branch (4369:9): [True: 2, False: 731]
  ------------------
 4370|      2|        case 204: return 203.980318000;
  ------------------
  |  Branch (4370:9): [True: 2, False: 731]
  ------------------
 4371|      6|        case 205: return 204.981203000;
  ------------------
  |  Branch (4371:9): [True: 6, False: 727]
  ------------------
 4372|      2|        case 206: return 205.980481000;
  ------------------
  |  Branch (4372:9): [True: 2, False: 731]
  ------------------
 4373|      6|        case 207: return 206.981593000;
  ------------------
  |  Branch (4373:9): [True: 6, False: 727]
  ------------------
 4374|      2|        case 208: return 207.981245000;
  ------------------
  |  Branch (4374:9): [True: 2, False: 731]
  ------------------
 4375|    597|        case 0: case 209: return 208.982430000;
  ------------------
  |  Branch (4375:9): [True: 591, False: 142]
  |  Branch (4375:17): [True: 6, False: 727]
  ------------------
 4376|     10|        case 210: return 209.982873000;
  ------------------
  |  Branch (4376:9): [True: 10, False: 723]
  ------------------
 4377|      2|        case 211: return 210.986653000;
  ------------------
  |  Branch (4377:9): [True: 2, False: 731]
  ------------------
 4378|      2|        case 212: return 211.988868000;
  ------------------
  |  Branch (4378:9): [True: 2, False: 731]
  ------------------
 4379|      2|        case 213: return 212.992857000;
  ------------------
  |  Branch (4379:9): [True: 2, False: 731]
  ------------------
 4380|      2|        case 214: return 213.995201000;
  ------------------
  |  Branch (4380:9): [True: 2, False: 731]
  ------------------
 4381|      6|        case 215: return 214.999420000;
  ------------------
  |  Branch (4381:9): [True: 6, False: 727]
  ------------------
 4382|      6|        case 216: return 216.001915000;
  ------------------
  |  Branch (4382:9): [True: 6, False: 727]
  ------------------
 4383|      2|        case 217: return 217.006335000;
  ------------------
  |  Branch (4383:9): [True: 2, False: 731]
  ------------------
 4384|      2|        case 218: return 218.008973000;
  ------------------
  |  Branch (4384:9): [True: 2, False: 731]
  ------------------
 4385|      2|        case 219: return 219.013740000;
  ------------------
  |  Branch (4385:9): [True: 2, False: 731]
  ------------------
 4386|     14|        case 220: return 220.016600000;
  ------------------
  |  Branch (4386:9): [True: 14, False: 719]
  ------------------
 4387|    733|        }
 4388|     12|        break;
 4389|    624|      case 85:
  ------------------
  |  Branch (4389:7): [True: 624, False: 414k]
  ------------------
 4390|    624|        switch (isotope) {
  ------------------
  |  Branch (4390:17): [True: 616, False: 8]
  ------------------
 4391|      2|        case 193: return 192.999840000;
  ------------------
  |  Branch (4391:9): [True: 2, False: 622]
  ------------------
 4392|      6|        case 194: return 193.998730000;
  ------------------
  |  Branch (4392:9): [True: 6, False: 618]
  ------------------
 4393|      6|        case 195: return 194.996268000;
  ------------------
  |  Branch (4393:9): [True: 6, False: 618]
  ------------------
 4394|      6|        case 196: return 195.995790000;
  ------------------
  |  Branch (4394:9): [True: 6, False: 618]
  ------------------
 4395|      6|        case 197: return 196.993190000;
  ------------------
  |  Branch (4395:9): [True: 6, False: 618]
  ------------------
 4396|      6|        case 198: return 197.992840000;
  ------------------
  |  Branch (4396:9): [True: 6, False: 618]
  ------------------
 4397|      6|        case 199: return 198.990530000;
  ------------------
  |  Branch (4397:9): [True: 6, False: 618]
  ------------------
 4398|      8|        case 200: return 199.990351000;
  ------------------
  |  Branch (4398:9): [True: 8, False: 616]
  ------------------
 4399|     44|        case 201: return 200.988417000;
  ------------------
  |  Branch (4399:9): [True: 44, False: 580]
  ------------------
 4400|      4|        case 202: return 201.988630000;
  ------------------
  |  Branch (4400:9): [True: 4, False: 620]
  ------------------
 4401|      2|        case 203: return 202.986942000;
  ------------------
  |  Branch (4401:9): [True: 2, False: 622]
  ------------------
 4402|      6|        case 204: return 203.987251000;
  ------------------
  |  Branch (4402:9): [True: 6, False: 618]
  ------------------
 4403|     24|        case 205: return 204.986074000;
  ------------------
  |  Branch (4403:9): [True: 24, False: 600]
  ------------------
 4404|      4|        case 206: return 205.986667000;
  ------------------
  |  Branch (4404:9): [True: 4, False: 620]
  ------------------
 4405|      2|        case 207: return 206.985784000;
  ------------------
  |  Branch (4405:9): [True: 2, False: 622]
  ------------------
 4406|      2|        case 208: return 207.986590000;
  ------------------
  |  Branch (4406:9): [True: 2, False: 622]
  ------------------
 4407|      2|        case 209: return 208.986173000;
  ------------------
  |  Branch (4407:9): [True: 2, False: 622]
  ------------------
 4408|    428|        case 0: case 210: return 209.987148000;
  ------------------
  |  Branch (4408:9): [True: 422, False: 202]
  |  Branch (4408:17): [True: 6, False: 618]
  ------------------
 4409|      2|        case 211: return 210.987496000;
  ------------------
  |  Branch (4409:9): [True: 2, False: 622]
  ------------------
 4410|      2|        case 212: return 211.990745000;
  ------------------
  |  Branch (4410:9): [True: 2, False: 622]
  ------------------
 4411|      2|        case 213: return 212.992937000;
  ------------------
  |  Branch (4411:9): [True: 2, False: 622]
  ------------------
 4412|      4|        case 214: return 213.996372000;
  ------------------
  |  Branch (4412:9): [True: 4, False: 620]
  ------------------
 4413|      6|        case 215: return 214.998653000;
  ------------------
  |  Branch (4413:9): [True: 6, False: 618]
  ------------------
 4414|      6|        case 216: return 216.002423000;
  ------------------
  |  Branch (4414:9): [True: 6, False: 618]
  ------------------
 4415|      2|        case 217: return 217.004719000;
  ------------------
  |  Branch (4415:9): [True: 2, False: 622]
  ------------------
 4416|      2|        case 218: return 218.008694000;
  ------------------
  |  Branch (4416:9): [True: 2, False: 622]
  ------------------
 4417|      6|        case 219: return 219.011162000;
  ------------------
  |  Branch (4417:9): [True: 6, False: 618]
  ------------------
 4418|      6|        case 220: return 220.015410000;
  ------------------
  |  Branch (4418:9): [True: 6, False: 618]
  ------------------
 4419|      6|        case 221: return 221.018050000;
  ------------------
  |  Branch (4419:9): [True: 6, False: 618]
  ------------------
 4420|      6|        case 222: return 222.022330000;
  ------------------
  |  Branch (4420:9): [True: 6, False: 618]
  ------------------
 4421|      2|        case 223: return 223.025190000;
  ------------------
  |  Branch (4421:9): [True: 2, False: 622]
  ------------------
 4422|    624|        }
 4423|      8|        break;
 4424|    419|      case 86:
  ------------------
  |  Branch (4424:7): [True: 419, False: 414k]
  ------------------
 4425|    419|        switch (isotope) {
  ------------------
  |  Branch (4425:17): [True: 393, False: 26]
  ------------------
 4426|      0|        case 195: return 195.005440000;
  ------------------
  |  Branch (4426:9): [True: 0, False: 419]
  ------------------
 4427|      0|        case 196: return 196.002115000;
  ------------------
  |  Branch (4427:9): [True: 0, False: 419]
  ------------------
 4428|      2|        case 197: return 197.001580000;
  ------------------
  |  Branch (4428:9): [True: 2, False: 417]
  ------------------
 4429|      0|        case 198: return 197.998679000;
  ------------------
  |  Branch (4429:9): [True: 0, False: 419]
  ------------------
 4430|      0|        case 199: return 198.998370000;
  ------------------
  |  Branch (4430:9): [True: 0, False: 419]
  ------------------
 4431|      8|        case 200: return 199.995699000;
  ------------------
  |  Branch (4431:9): [True: 8, False: 411]
  ------------------
 4432|      8|        case 201: return 200.995630000;
  ------------------
  |  Branch (4432:9): [True: 8, False: 411]
  ------------------
 4433|      6|        case 202: return 201.993263000;
  ------------------
  |  Branch (4433:9): [True: 6, False: 413]
  ------------------
 4434|      2|        case 203: return 202.993387000;
  ------------------
  |  Branch (4434:9): [True: 2, False: 417]
  ------------------
 4435|      2|        case 204: return 203.991429000;
  ------------------
  |  Branch (4435:9): [True: 2, False: 417]
  ------------------
 4436|      4|        case 205: return 204.991720000;
  ------------------
  |  Branch (4436:9): [True: 4, False: 415]
  ------------------
 4437|      6|        case 206: return 205.990214000;
  ------------------
  |  Branch (4437:9): [True: 6, False: 413]
  ------------------
 4438|      6|        case 207: return 206.990734000;
  ------------------
  |  Branch (4438:9): [True: 6, False: 413]
  ------------------
 4439|      2|        case 208: return 207.989642000;
  ------------------
  |  Branch (4439:9): [True: 2, False: 417]
  ------------------
 4440|     12|        case 209: return 208.990415000;
  ------------------
  |  Branch (4440:9): [True: 12, False: 407]
  ------------------
 4441|      6|        case 210: return 209.989696000;
  ------------------
  |  Branch (4441:9): [True: 6, False: 413]
  ------------------
 4442|      6|        case 211: return 210.990601000;
  ------------------
  |  Branch (4442:9): [True: 6, False: 413]
  ------------------
 4443|      6|        case 212: return 211.990704000;
  ------------------
  |  Branch (4443:9): [True: 6, False: 413]
  ------------------
 4444|      6|        case 213: return 212.993883000;
  ------------------
  |  Branch (4444:9): [True: 6, False: 413]
  ------------------
 4445|      6|        case 214: return 213.995363000;
  ------------------
  |  Branch (4445:9): [True: 6, False: 413]
  ------------------
 4446|      2|        case 215: return 214.998745000;
  ------------------
  |  Branch (4446:9): [True: 2, False: 417]
  ------------------
 4447|      2|        case 216: return 216.000274000;
  ------------------
  |  Branch (4447:9): [True: 2, False: 417]
  ------------------
 4448|     18|        case 217: return 217.003928000;
  ------------------
  |  Branch (4448:9): [True: 18, False: 401]
  ------------------
 4449|      6|        case 218: return 218.005601000;
  ------------------
  |  Branch (4449:9): [True: 6, False: 413]
  ------------------
 4450|      2|        case 219: return 219.009480000;
  ------------------
  |  Branch (4450:9): [True: 2, False: 417]
  ------------------
 4451|      6|        case 220: return 220.011394000;
  ------------------
  |  Branch (4451:9): [True: 6, False: 413]
  ------------------
 4452|      2|        case 221: return 221.015537000;
  ------------------
  |  Branch (4452:9): [True: 2, False: 417]
  ------------------
 4453|    233|        case 0: case 222: return 222.017577000;
  ------------------
  |  Branch (4453:9): [True: 227, False: 192]
  |  Branch (4453:17): [True: 6, False: 413]
  ------------------
 4454|      2|        case 223: return 223.021790000;
  ------------------
  |  Branch (4454:9): [True: 2, False: 417]
  ------------------
 4455|      6|        case 224: return 224.024090000;
  ------------------
  |  Branch (4455:9): [True: 6, False: 413]
  ------------------
 4456|      2|        case 225: return 225.028440000;
  ------------------
  |  Branch (4456:9): [True: 2, False: 417]
  ------------------
 4457|      2|        case 226: return 226.030890000;
  ------------------
  |  Branch (4457:9): [True: 2, False: 417]
  ------------------
 4458|     16|        case 227: return 227.035410000;
  ------------------
  |  Branch (4458:9): [True: 16, False: 403]
  ------------------
 4459|      6|        case 228: return 228.037990000;
  ------------------
  |  Branch (4459:9): [True: 6, False: 413]
  ------------------
 4460|    419|        }
 4461|     26|        break;
 4462|    350|      case 87:
  ------------------
  |  Branch (4462:7): [True: 350, False: 414k]
  ------------------
 4463|    350|        switch (isotope) {
  ------------------
  |  Branch (4463:17): [True: 340, False: 10]
  ------------------
 4464|      2|        case 199: return 199.007260000;
  ------------------
  |  Branch (4464:9): [True: 2, False: 348]
  ------------------
 4465|      6|        case 200: return 200.006570000;
  ------------------
  |  Branch (4465:9): [True: 6, False: 344]
  ------------------
 4466|      2|        case 201: return 201.003860000;
  ------------------
  |  Branch (4466:9): [True: 2, False: 348]
  ------------------
 4467|      2|        case 202: return 202.003370000;
  ------------------
  |  Branch (4467:9): [True: 2, False: 348]
  ------------------
 4468|      2|        case 203: return 203.000925000;
  ------------------
  |  Branch (4468:9): [True: 2, False: 348]
  ------------------
 4469|      6|        case 204: return 204.000653000;
  ------------------
  |  Branch (4469:9): [True: 6, False: 344]
  ------------------
 4470|      2|        case 205: return 204.998594000;
  ------------------
  |  Branch (4470:9): [True: 2, False: 348]
  ------------------
 4471|      4|        case 206: return 205.998670000;
  ------------------
  |  Branch (4471:9): [True: 4, False: 346]
  ------------------
 4472|      2|        case 207: return 206.996950000;
  ------------------
  |  Branch (4472:9): [True: 2, False: 348]
  ------------------
 4473|      2|        case 208: return 207.997140000;
  ------------------
  |  Branch (4473:9): [True: 2, False: 348]
  ------------------
 4474|      2|        case 209: return 208.995954000;
  ------------------
  |  Branch (4474:9): [True: 2, False: 348]
  ------------------
 4475|      2|        case 210: return 209.996408000;
  ------------------
  |  Branch (4475:9): [True: 2, False: 348]
  ------------------
 4476|      2|        case 211: return 210.995537000;
  ------------------
  |  Branch (4476:9): [True: 2, False: 348]
  ------------------
 4477|      2|        case 212: return 211.996202000;
  ------------------
  |  Branch (4477:9): [True: 2, False: 348]
  ------------------
 4478|      6|        case 213: return 212.996189000;
  ------------------
  |  Branch (4478:9): [True: 6, False: 344]
  ------------------
 4479|      2|        case 214: return 213.998971000;
  ------------------
  |  Branch (4479:9): [True: 2, False: 348]
  ------------------
 4480|      2|        case 215: return 215.000341000;
  ------------------
  |  Branch (4480:9): [True: 2, False: 348]
  ------------------
 4481|      2|        case 216: return 216.003198000;
  ------------------
  |  Branch (4481:9): [True: 2, False: 348]
  ------------------
 4482|      2|        case 217: return 217.004632000;
  ------------------
  |  Branch (4482:9): [True: 2, False: 348]
  ------------------
 4483|      2|        case 218: return 218.007578000;
  ------------------
  |  Branch (4483:9): [True: 2, False: 348]
  ------------------
 4484|      2|        case 219: return 219.009252000;
  ------------------
  |  Branch (4484:9): [True: 2, False: 348]
  ------------------
 4485|      2|        case 220: return 220.012327000;
  ------------------
  |  Branch (4485:9): [True: 2, False: 348]
  ------------------
 4486|      2|        case 221: return 221.014255000;
  ------------------
  |  Branch (4486:9): [True: 2, False: 348]
  ------------------
 4487|      2|        case 222: return 222.017552000;
  ------------------
  |  Branch (4487:9): [True: 2, False: 348]
  ------------------
 4488|    260|        case 0: case 223: return 223.019735000;
  ------------------
  |  Branch (4488:9): [True: 258, False: 92]
  |  Branch (4488:17): [True: 2, False: 348]
  ------------------
 4489|      2|        case 224: return 224.023250000;
  ------------------
  |  Branch (4489:9): [True: 2, False: 348]
  ------------------
 4490|      2|        case 225: return 225.025570000;
  ------------------
  |  Branch (4490:9): [True: 2, False: 348]
  ------------------
 4491|      2|        case 226: return 226.029390000;
  ------------------
  |  Branch (4491:9): [True: 2, False: 348]
  ------------------
 4492|      2|        case 227: return 227.031840000;
  ------------------
  |  Branch (4492:9): [True: 2, False: 348]
  ------------------
 4493|      2|        case 228: return 228.035730000;
  ------------------
  |  Branch (4493:9): [True: 2, False: 348]
  ------------------
 4494|      2|        case 229: return 229.038450000;
  ------------------
  |  Branch (4494:9): [True: 2, False: 348]
  ------------------
 4495|      2|        case 230: return 230.042510000;
  ------------------
  |  Branch (4495:9): [True: 2, False: 348]
  ------------------
 4496|      2|        case 231: return 231.045440000;
  ------------------
  |  Branch (4496:9): [True: 2, False: 348]
  ------------------
 4497|      2|        case 232: return 232.049770000;
  ------------------
  |  Branch (4497:9): [True: 2, False: 348]
  ------------------
 4498|    350|        }
 4499|     10|        break;
 4500|    608|      case 88:
  ------------------
  |  Branch (4500:7): [True: 608, False: 414k]
  ------------------
 4501|    608|        switch (isotope) {
  ------------------
  |  Branch (4501:17): [True: 514, False: 94]
  ------------------
 4502|      2|        case 202: return 202.009890000;
  ------------------
  |  Branch (4502:9): [True: 2, False: 606]
  ------------------
 4503|      2|        case 203: return 203.009270000;
  ------------------
  |  Branch (4503:9): [True: 2, False: 606]
  ------------------
 4504|      2|        case 204: return 204.006500000;
  ------------------
  |  Branch (4504:9): [True: 2, False: 606]
  ------------------
 4505|      6|        case 205: return 205.006270000;
  ------------------
  |  Branch (4505:9): [True: 6, False: 602]
  ------------------
 4506|      2|        case 206: return 206.003827000;
  ------------------
  |  Branch (4506:9): [True: 2, False: 606]
  ------------------
 4507|      2|        case 207: return 207.003800000;
  ------------------
  |  Branch (4507:9): [True: 2, False: 606]
  ------------------
 4508|      2|        case 208: return 208.001840000;
  ------------------
  |  Branch (4508:9): [True: 2, False: 606]
  ------------------
 4509|      6|        case 209: return 209.001990000;
  ------------------
  |  Branch (4509:9): [True: 6, False: 602]
  ------------------
 4510|      6|        case 210: return 210.000495000;
  ------------------
  |  Branch (4510:9): [True: 6, False: 602]
  ------------------
 4511|      2|        case 211: return 211.000898000;
  ------------------
  |  Branch (4511:9): [True: 2, False: 606]
  ------------------
 4512|      2|        case 212: return 211.999794000;
  ------------------
  |  Branch (4512:9): [True: 2, False: 606]
  ------------------
 4513|      6|        case 213: return 213.000384000;
  ------------------
  |  Branch (4513:9): [True: 6, False: 602]
  ------------------
 4514|     10|        case 214: return 214.000108000;
  ------------------
  |  Branch (4514:9): [True: 10, False: 598]
  ------------------
 4515|      6|        case 215: return 215.002720000;
  ------------------
  |  Branch (4515:9): [True: 6, False: 602]
  ------------------
 4516|      6|        case 216: return 216.003533000;
  ------------------
  |  Branch (4516:9): [True: 6, False: 602]
  ------------------
 4517|      6|        case 217: return 217.006320000;
  ------------------
  |  Branch (4517:9): [True: 6, False: 602]
  ------------------
 4518|      8|        case 218: return 218.007140000;
  ------------------
  |  Branch (4518:9): [True: 8, False: 600]
  ------------------
 4519|      2|        case 219: return 219.010085000;
  ------------------
  |  Branch (4519:9): [True: 2, False: 606]
  ------------------
 4520|      6|        case 220: return 220.011028000;
  ------------------
  |  Branch (4520:9): [True: 6, False: 602]
  ------------------
 4521|      6|        case 221: return 221.013917000;
  ------------------
  |  Branch (4521:9): [True: 6, False: 602]
  ------------------
 4522|      2|        case 222: return 222.015375000;
  ------------------
  |  Branch (4522:9): [True: 2, False: 606]
  ------------------
 4523|      4|        case 223: return 223.018502000;
  ------------------
  |  Branch (4523:9): [True: 4, False: 604]
  ------------------
 4524|      2|        case 224: return 224.020211000;
  ------------------
  |  Branch (4524:9): [True: 2, False: 606]
  ------------------
 4525|      4|        case 225: return 225.023612000;
  ------------------
  |  Branch (4525:9): [True: 4, False: 604]
  ------------------
 4526|    382|        case 0: case 226: return 226.025409000;
  ------------------
  |  Branch (4526:9): [True: 376, False: 232]
  |  Branch (4526:17): [True: 6, False: 602]
  ------------------
 4527|      2|        case 227: return 227.029177000;
  ------------------
  |  Branch (4527:9): [True: 2, False: 606]
  ------------------
 4528|      2|        case 228: return 228.031070000;
  ------------------
  |  Branch (4528:9): [True: 2, False: 606]
  ------------------
 4529|      2|        case 229: return 229.034958000;
  ------------------
  |  Branch (4529:9): [True: 2, False: 606]
  ------------------
 4530|      2|        case 230: return 230.037056000;
  ------------------
  |  Branch (4530:9): [True: 2, False: 606]
  ------------------
 4531|      6|        case 231: return 231.041220000;
  ------------------
  |  Branch (4531:9): [True: 6, False: 602]
  ------------------
 4532|      6|        case 232: return 232.043640000;
  ------------------
  |  Branch (4532:9): [True: 6, False: 602]
  ------------------
 4533|      8|        case 233: return 233.048060000;
  ------------------
  |  Branch (4533:9): [True: 8, False: 600]
  ------------------
 4534|      2|        case 234: return 234.050700000;
  ------------------
  |  Branch (4534:9): [True: 2, False: 606]
  ------------------
 4535|    608|        }
 4536|     94|        break;
 4537|    356|      case 89:
  ------------------
  |  Branch (4537:7): [True: 356, False: 414k]
  ------------------
 4538|    356|        switch (isotope) {
  ------------------
  |  Branch (4538:17): [True: 310, False: 46]
  ------------------
 4539|      2|        case 206: return 206.014500000;
  ------------------
  |  Branch (4539:9): [True: 2, False: 354]
  ------------------
 4540|     10|        case 207: return 207.011950000;
  ------------------
  |  Branch (4540:9): [True: 10, False: 346]
  ------------------
 4541|      6|        case 208: return 208.011550000;
  ------------------
  |  Branch (4541:9): [True: 6, False: 350]
  ------------------
 4542|      6|        case 209: return 209.009490000;
  ------------------
  |  Branch (4542:9): [True: 6, False: 350]
  ------------------
 4543|     14|        case 210: return 210.009440000;
  ------------------
  |  Branch (4543:9): [True: 14, False: 342]
  ------------------
 4544|      2|        case 211: return 211.007730000;
  ------------------
  |  Branch (4544:9): [True: 2, False: 354]
  ------------------
 4545|      6|        case 212: return 212.007810000;
  ------------------
  |  Branch (4545:9): [True: 6, False: 350]
  ------------------
 4546|      6|        case 213: return 213.006610000;
  ------------------
  |  Branch (4546:9): [True: 6, False: 350]
  ------------------
 4547|      2|        case 214: return 214.006902000;
  ------------------
  |  Branch (4547:9): [True: 2, False: 354]
  ------------------
 4548|      2|        case 215: return 215.006454000;
  ------------------
  |  Branch (4548:9): [True: 2, False: 354]
  ------------------
 4549|      2|        case 216: return 216.008720000;
  ------------------
  |  Branch (4549:9): [True: 2, False: 354]
  ------------------
 4550|      2|        case 217: return 217.009347000;
  ------------------
  |  Branch (4550:9): [True: 2, False: 354]
  ------------------
 4551|      2|        case 218: return 218.011640000;
  ------------------
  |  Branch (4551:9): [True: 2, False: 354]
  ------------------
 4552|      2|        case 219: return 219.012420000;
  ------------------
  |  Branch (4552:9): [True: 2, False: 354]
  ------------------
 4553|      6|        case 220: return 220.014763000;
  ------------------
  |  Branch (4553:9): [True: 6, False: 350]
  ------------------
 4554|      2|        case 221: return 221.015590000;
  ------------------
  |  Branch (4554:9): [True: 2, False: 354]
  ------------------
 4555|      2|        case 222: return 222.017844000;
  ------------------
  |  Branch (4555:9): [True: 2, False: 354]
  ------------------
 4556|      2|        case 223: return 223.019137000;
  ------------------
  |  Branch (4556:9): [True: 2, False: 354]
  ------------------
 4557|      2|        case 224: return 224.021723000;
  ------------------
  |  Branch (4557:9): [True: 2, False: 354]
  ------------------
 4558|      2|        case 225: return 225.023230000;
  ------------------
  |  Branch (4558:9): [True: 2, False: 354]
  ------------------
 4559|      2|        case 226: return 226.026098000;
  ------------------
  |  Branch (4559:9): [True: 2, False: 354]
  ------------------
 4560|    184|        case 0: case 227: return 227.027752000;
  ------------------
  |  Branch (4560:9): [True: 178, False: 178]
  |  Branch (4560:17): [True: 6, False: 350]
  ------------------
 4561|      6|        case 228: return 228.031021000;
  ------------------
  |  Branch (4561:9): [True: 6, False: 350]
  ------------------
 4562|      2|        case 229: return 229.033020000;
  ------------------
  |  Branch (4562:9): [True: 2, False: 354]
  ------------------
 4563|      2|        case 230: return 230.036290000;
  ------------------
  |  Branch (4563:9): [True: 2, False: 354]
  ------------------
 4564|      6|        case 231: return 231.038560000;
  ------------------
  |  Branch (4564:9): [True: 6, False: 350]
  ------------------
 4565|      2|        case 232: return 232.042030000;
  ------------------
  |  Branch (4565:9): [True: 2, False: 354]
  ------------------
 4566|      8|        case 233: return 233.044550000;
  ------------------
  |  Branch (4566:9): [True: 8, False: 348]
  ------------------
 4567|      6|        case 234: return 234.048420000;
  ------------------
  |  Branch (4567:9): [True: 6, False: 350]
  ------------------
 4568|      6|        case 235: return 235.051230000;
  ------------------
  |  Branch (4568:9): [True: 6, False: 350]
  ------------------
 4569|      6|        case 236: return 236.055300000;
  ------------------
  |  Branch (4569:9): [True: 6, False: 350]
  ------------------
 4570|    356|        }
 4571|     46|        break;
 4572|    263|      case 90:
  ------------------
  |  Branch (4572:7): [True: 263, False: 414k]
  ------------------
 4573|    263|        switch (isotope) {
  ------------------
  |  Branch (4573:17): [True: 227, False: 36]
  ------------------
 4574|      6|        case 209: return 209.017720000;
  ------------------
  |  Branch (4574:9): [True: 6, False: 257]
  ------------------
 4575|      6|        case 210: return 210.015075000;
  ------------------
  |  Branch (4575:9): [True: 6, False: 257]
  ------------------
 4576|      2|        case 211: return 211.014930000;
  ------------------
  |  Branch (4576:9): [True: 2, False: 261]
  ------------------
 4577|      8|        case 212: return 212.012980000;
  ------------------
  |  Branch (4577:9): [True: 8, False: 255]
  ------------------
 4578|      8|        case 213: return 213.013010000;
  ------------------
  |  Branch (4578:9): [True: 8, False: 255]
  ------------------
 4579|      6|        case 214: return 214.011500000;
  ------------------
  |  Branch (4579:9): [True: 6, False: 257]
  ------------------
 4580|      6|        case 215: return 215.011730000;
  ------------------
  |  Branch (4580:9): [True: 6, False: 257]
  ------------------
 4581|     16|        case 216: return 216.011062000;
  ------------------
  |  Branch (4581:9): [True: 16, False: 247]
  ------------------
 4582|      8|        case 217: return 217.013114000;
  ------------------
  |  Branch (4582:9): [True: 8, False: 255]
  ------------------
 4583|      6|        case 218: return 218.013284000;
  ------------------
  |  Branch (4583:9): [True: 6, False: 257]
  ------------------
 4584|      8|        case 219: return 219.015540000;
  ------------------
  |  Branch (4584:9): [True: 8, False: 255]
  ------------------
 4585|      6|        case 220: return 220.015748000;
  ------------------
  |  Branch (4585:9): [True: 6, False: 257]
  ------------------
 4586|     20|        case 221: return 221.018184000;
  ------------------
  |  Branch (4586:9): [True: 20, False: 243]
  ------------------
 4587|     22|        case 222: return 222.018468000;
  ------------------
  |  Branch (4587:9): [True: 22, False: 241]
  ------------------
 4588|      8|        case 223: return 223.020811000;
  ------------------
  |  Branch (4588:9): [True: 8, False: 255]
  ------------------
 4589|      6|        case 224: return 224.021467000;
  ------------------
  |  Branch (4589:9): [True: 6, False: 257]
  ------------------
 4590|      6|        case 225: return 225.023951000;
  ------------------
  |  Branch (4590:9): [True: 6, False: 257]
  ------------------
 4591|      2|        case 226: return 226.024903000;
  ------------------
  |  Branch (4591:9): [True: 2, False: 261]
  ------------------
 4592|     18|        case 227: return 227.027704000;
  ------------------
  |  Branch (4592:9): [True: 18, False: 245]
  ------------------
 4593|      2|        case 228: return 228.028741000;
  ------------------
  |  Branch (4593:9): [True: 2, False: 261]
  ------------------
 4594|      6|        case 229: return 229.031762000;
  ------------------
  |  Branch (4594:9): [True: 6, False: 257]
  ------------------
 4595|      2|        case 230: return 230.033133000;
  ------------------
  |  Branch (4595:9): [True: 2, False: 261]
  ------------------
 4596|      6|        case 231: return 231.036304000;
  ------------------
  |  Branch (4596:9): [True: 6, False: 257]
  ------------------
 4597|     27|        case 0: case 232: return 232.038055000;
  ------------------
  |  Branch (4597:9): [True: 19, False: 244]
  |  Branch (4597:17): [True: 8, False: 255]
  ------------------
 4598|      2|        case 233: return 233.041581000;
  ------------------
  |  Branch (4598:9): [True: 2, False: 261]
  ------------------
 4599|      2|        case 234: return 234.043601000;
  ------------------
  |  Branch (4599:9): [True: 2, False: 261]
  ------------------
 4600|      2|        case 235: return 235.047510000;
  ------------------
  |  Branch (4600:9): [True: 2, False: 261]
  ------------------
 4601|      2|        case 236: return 236.049870000;
  ------------------
  |  Branch (4601:9): [True: 2, False: 261]
  ------------------
 4602|      6|        case 237: return 237.053890000;
  ------------------
  |  Branch (4602:9): [True: 6, False: 257]
  ------------------
 4603|      2|        case 238: return 238.056500000;
  ------------------
  |  Branch (4603:9): [True: 2, False: 261]
  ------------------
 4604|    263|        }
 4605|     36|        break;
 4606|    218|      case 91:
  ------------------
  |  Branch (4606:7): [True: 218, False: 414k]
  ------------------
 4607|    218|        switch (isotope) {
  ------------------
  |  Branch (4607:17): [True: 208, False: 10]
  ------------------
 4608|     14|        case 212: return 212.023200000;
  ------------------
  |  Branch (4608:9): [True: 14, False: 204]
  ------------------
 4609|      6|        case 213: return 213.021110000;
  ------------------
  |  Branch (4609:9): [True: 6, False: 212]
  ------------------
 4610|      6|        case 214: return 214.020920000;
  ------------------
  |  Branch (4610:9): [True: 6, False: 212]
  ------------------
 4611|      6|        case 215: return 215.019190000;
  ------------------
  |  Branch (4611:9): [True: 6, False: 212]
  ------------------
 4612|      2|        case 216: return 216.019110000;
  ------------------
  |  Branch (4612:9): [True: 2, False: 216]
  ------------------
 4613|      2|        case 217: return 217.018320000;
  ------------------
  |  Branch (4613:9): [True: 2, False: 216]
  ------------------
 4614|      6|        case 218: return 218.020042000;
  ------------------
  |  Branch (4614:9): [True: 6, False: 212]
  ------------------
 4615|      6|        case 219: return 219.019880000;
  ------------------
  |  Branch (4615:9): [True: 6, False: 212]
  ------------------
 4616|      2|        case 220: return 220.021880000;
  ------------------
  |  Branch (4616:9): [True: 2, False: 216]
  ------------------
 4617|     12|        case 221: return 221.021880000;
  ------------------
  |  Branch (4617:9): [True: 12, False: 206]
  ------------------
 4618|      6|        case 222: return 222.023740000;
  ------------------
  |  Branch (4618:9): [True: 6, False: 212]
  ------------------
 4619|      6|        case 223: return 223.023960000;
  ------------------
  |  Branch (4619:9): [True: 6, False: 212]
  ------------------
 4620|      2|        case 224: return 224.025626000;
  ------------------
  |  Branch (4620:9): [True: 2, False: 216]
  ------------------
 4621|      2|        case 225: return 225.026130000;
  ------------------
  |  Branch (4621:9): [True: 2, False: 216]
  ------------------
 4622|      2|        case 226: return 226.027948000;
  ------------------
  |  Branch (4622:9): [True: 2, False: 216]
  ------------------
 4623|      2|        case 227: return 227.028805000;
  ------------------
  |  Branch (4623:9): [True: 2, False: 216]
  ------------------
 4624|      2|        case 228: return 228.031051000;
  ------------------
  |  Branch (4624:9): [True: 2, False: 216]
  ------------------
 4625|      4|        case 229: return 229.032096000;
  ------------------
  |  Branch (4625:9): [True: 4, False: 214]
  ------------------
 4626|      2|        case 230: return 230.034541000;
  ------------------
  |  Branch (4626:9): [True: 2, False: 216]
  ------------------
 4627|     68|        case 0: case 231: return 231.035884000;
  ------------------
  |  Branch (4627:9): [True: 62, False: 156]
  |  Branch (4627:17): [True: 6, False: 212]
  ------------------
 4628|      2|        case 232: return 232.038592000;
  ------------------
  |  Branch (4628:9): [True: 2, False: 216]
  ------------------
 4629|      2|        case 233: return 233.040247000;
  ------------------
  |  Branch (4629:9): [True: 2, False: 216]
  ------------------
 4630|      8|        case 234: return 234.043308000;
  ------------------
  |  Branch (4630:9): [True: 8, False: 210]
  ------------------
 4631|      2|        case 235: return 235.045440000;
  ------------------
  |  Branch (4631:9): [True: 2, False: 216]
  ------------------
 4632|      2|        case 236: return 236.048680000;
  ------------------
  |  Branch (4632:9): [True: 2, False: 216]
  ------------------
 4633|      2|        case 237: return 237.051150000;
  ------------------
  |  Branch (4633:9): [True: 2, False: 216]
  ------------------
 4634|     24|        case 238: return 238.054500000;
  ------------------
  |  Branch (4634:9): [True: 24, False: 194]
  ------------------
 4635|      6|        case 239: return 239.057260000;
  ------------------
  |  Branch (4635:9): [True: 6, False: 212]
  ------------------
 4636|      2|        case 240: return 240.060980000;
  ------------------
  |  Branch (4636:9): [True: 2, False: 216]
  ------------------
 4637|    218|        }
 4638|     10|        break;
 4639|  27.8k|      case 92:
  ------------------
  |  Branch (4639:7): [True: 27.8k, False: 387k]
  ------------------
 4640|  27.8k|        switch (isotope) {
  ------------------
  |  Branch (4640:17): [True: 27.7k, False: 30]
  ------------------
 4641|      0|        case 217: return 217.024370000;
  ------------------
  |  Branch (4641:9): [True: 0, False: 27.8k]
  ------------------
 4642|      2|        case 218: return 218.023540000;
  ------------------
  |  Branch (4642:9): [True: 2, False: 27.8k]
  ------------------
 4643|      2|        case 219: return 219.024920000;
  ------------------
  |  Branch (4643:9): [True: 2, False: 27.8k]
  ------------------
 4644|      0|        case 220: return 220.024720000;
  ------------------
  |  Branch (4644:9): [True: 0, False: 27.8k]
  ------------------
 4645|      0|        case 221: return 221.026400000;
  ------------------
  |  Branch (4645:9): [True: 0, False: 27.8k]
  ------------------
 4646|      4|        case 222: return 222.026090000;
  ------------------
  |  Branch (4646:9): [True: 4, False: 27.8k]
  ------------------
 4647|      0|        case 223: return 223.027740000;
  ------------------
  |  Branch (4647:9): [True: 0, False: 27.8k]
  ------------------
 4648|      0|        case 224: return 224.027605000;
  ------------------
  |  Branch (4648:9): [True: 0, False: 27.8k]
  ------------------
 4649|      0|        case 225: return 225.029391000;
  ------------------
  |  Branch (4649:9): [True: 0, False: 27.8k]
  ------------------
 4650|      0|        case 226: return 226.029339000;
  ------------------
  |  Branch (4650:9): [True: 0, False: 27.8k]
  ------------------
 4651|      0|        case 227: return 227.031156000;
  ------------------
  |  Branch (4651:9): [True: 0, False: 27.8k]
  ------------------
 4652|      2|        case 228: return 228.031374000;
  ------------------
  |  Branch (4652:9): [True: 2, False: 27.8k]
  ------------------
 4653|      0|        case 229: return 229.033506000;
  ------------------
  |  Branch (4653:9): [True: 0, False: 27.8k]
  ------------------
 4654|      2|        case 230: return 230.033940000;
  ------------------
  |  Branch (4654:9): [True: 2, False: 27.8k]
  ------------------
 4655|      0|        case 231: return 231.036294000;
  ------------------
  |  Branch (4655:9): [True: 0, False: 27.8k]
  ------------------
 4656|      2|        case 232: return 232.037156000;
  ------------------
  |  Branch (4656:9): [True: 2, False: 27.8k]
  ------------------
 4657|      2|        case 233: return 233.039635000;
  ------------------
  |  Branch (4657:9): [True: 2, False: 27.8k]
  ------------------
 4658|      2|        case 234: return 234.040952000;
  ------------------
  |  Branch (4658:9): [True: 2, False: 27.8k]
  ------------------
 4659|      2|        case 235: return 235.043929000;
  ------------------
  |  Branch (4659:9): [True: 2, False: 27.8k]
  ------------------
 4660|      2|        case 236: return 236.045568000;
  ------------------
  |  Branch (4660:9): [True: 2, False: 27.8k]
  ------------------
 4661|      2|        case 237: return 237.048730000;
  ------------------
  |  Branch (4661:9): [True: 2, False: 27.8k]
  ------------------
 4662|  27.7k|        case 0: case 238: return 238.050788000;
  ------------------
  |  Branch (4662:9): [True: 27.7k, False: 66]
  |  Branch (4662:17): [True: 2, False: 27.8k]
  ------------------
 4663|      2|        case 239: return 239.054293000;
  ------------------
  |  Branch (4663:9): [True: 2, False: 27.8k]
  ------------------
 4664|      4|        case 240: return 240.056592000;
  ------------------
  |  Branch (4664:9): [True: 4, False: 27.8k]
  ------------------
 4665|      2|        case 241: return 241.060330000;
  ------------------
  |  Branch (4665:9): [True: 2, False: 27.8k]
  ------------------
 4666|      2|        case 242: return 242.062930000;
  ------------------
  |  Branch (4666:9): [True: 2, False: 27.8k]
  ------------------
 4667|  27.8k|        }
 4668|     30|        break;
 4669|    256|      case 93:
  ------------------
  |  Branch (4669:7): [True: 256, False: 414k]
  ------------------
 4670|    256|        switch (isotope) {
  ------------------
  |  Branch (4670:17): [True: 240, False: 16]
  ------------------
 4671|      2|        case 225: return 225.033910000;
  ------------------
  |  Branch (4671:9): [True: 2, False: 254]
  ------------------
 4672|      6|        case 226: return 226.035150000;
  ------------------
  |  Branch (4672:9): [True: 6, False: 250]
  ------------------
 4673|      6|        case 227: return 227.034960000;
  ------------------
  |  Branch (4673:9): [True: 6, False: 250]
  ------------------
 4674|      6|        case 228: return 228.036180000;
  ------------------
  |  Branch (4674:9): [True: 6, False: 250]
  ------------------
 4675|      2|        case 229: return 229.036260000;
  ------------------
  |  Branch (4675:9): [True: 2, False: 254]
  ------------------
 4676|      2|        case 230: return 230.037830000;
  ------------------
  |  Branch (4676:9): [True: 2, False: 254]
  ------------------
 4677|     16|        case 231: return 231.038250000;
  ------------------
  |  Branch (4677:9): [True: 16, False: 240]
  ------------------
 4678|     22|        case 232: return 232.040110000;
  ------------------
  |  Branch (4678:9): [True: 22, False: 234]
  ------------------
 4679|      6|        case 233: return 233.040740000;
  ------------------
  |  Branch (4679:9): [True: 6, False: 250]
  ------------------
 4680|      2|        case 234: return 234.042895000;
  ------------------
  |  Branch (4680:9): [True: 2, False: 254]
  ------------------
 4681|      2|        case 235: return 235.044063000;
  ------------------
  |  Branch (4681:9): [True: 2, False: 254]
  ------------------
 4682|      2|        case 236: return 236.046570000;
  ------------------
  |  Branch (4682:9): [True: 2, False: 254]
  ------------------
 4683|    138|        case 0: case 237: return 237.048173000;
  ------------------
  |  Branch (4683:9): [True: 134, False: 122]
  |  Branch (4683:17): [True: 4, False: 252]
  ------------------
 4684|      2|        case 238: return 238.050946000;
  ------------------
  |  Branch (4684:9): [True: 2, False: 254]
  ------------------
 4685|      2|        case 239: return 239.052939000;
  ------------------
  |  Branch (4685:9): [True: 2, False: 254]
  ------------------
 4686|      4|        case 240: return 240.056162000;
  ------------------
  |  Branch (4686:9): [True: 4, False: 252]
  ------------------
 4687|      2|        case 241: return 241.058250000;
  ------------------
  |  Branch (4687:9): [True: 2, False: 254]
  ------------------
 4688|      6|        case 242: return 242.061640000;
  ------------------
  |  Branch (4688:9): [True: 6, False: 250]
  ------------------
 4689|      6|        case 243: return 243.064280000;
  ------------------
  |  Branch (4689:9): [True: 6, False: 250]
  ------------------
 4690|      6|        case 244: return 244.067850000;
  ------------------
  |  Branch (4690:9): [True: 6, False: 250]
  ------------------
 4691|    256|        }
 4692|     16|        break;
 4693|    184|      case 94:
  ------------------
  |  Branch (4693:7): [True: 184, False: 414k]
  ------------------
 4694|    184|        switch (isotope) {
  ------------------
  |  Branch (4694:17): [True: 178, False: 6]
  ------------------
 4695|      0|        case 228: return 228.038740000;
  ------------------
  |  Branch (4695:9): [True: 0, False: 184]
  ------------------
 4696|      0|        case 229: return 229.040150000;
  ------------------
  |  Branch (4696:9): [True: 0, False: 184]
  ------------------
 4697|      2|        case 230: return 230.039650000;
  ------------------
  |  Branch (4697:9): [True: 2, False: 182]
  ------------------
 4698|      2|        case 231: return 231.041101000;
  ------------------
  |  Branch (4698:9): [True: 2, False: 182]
  ------------------
 4699|      6|        case 232: return 232.041187000;
  ------------------
  |  Branch (4699:9): [True: 6, False: 178]
  ------------------
 4700|      6|        case 233: return 233.043000000;
  ------------------
  |  Branch (4700:9): [True: 6, False: 178]
  ------------------
 4701|      8|        case 234: return 234.043317000;
  ------------------
  |  Branch (4701:9): [True: 8, False: 176]
  ------------------
 4702|      2|        case 235: return 235.045286000;
  ------------------
  |  Branch (4702:9): [True: 2, False: 182]
  ------------------
 4703|     12|        case 236: return 236.046058000;
  ------------------
  |  Branch (4703:9): [True: 12, False: 172]
  ------------------
 4704|      2|        case 237: return 237.048409000;
  ------------------
  |  Branch (4704:9): [True: 2, False: 182]
  ------------------
 4705|      6|        case 238: return 238.049559000;
  ------------------
  |  Branch (4705:9): [True: 6, False: 178]
  ------------------
 4706|      2|        case 239: return 239.052163000;
  ------------------
  |  Branch (4706:9): [True: 2, False: 182]
  ------------------
 4707|      2|        case 240: return 240.053813000;
  ------------------
  |  Branch (4707:9): [True: 2, False: 182]
  ------------------
 4708|      2|        case 241: return 241.056851000;
  ------------------
  |  Branch (4708:9): [True: 2, False: 182]
  ------------------
 4709|      2|        case 242: return 242.058742000;
  ------------------
  |  Branch (4709:9): [True: 2, False: 182]
  ------------------
 4710|      2|        case 243: return 243.062003000;
  ------------------
  |  Branch (4710:9): [True: 2, False: 182]
  ------------------
 4711|    116|        case 0: case 244: return 244.064204000;
  ------------------
  |  Branch (4711:9): [True: 110, False: 74]
  |  Branch (4711:17): [True: 6, False: 178]
  ------------------
 4712|      2|        case 245: return 245.067747000;
  ------------------
  |  Branch (4712:9): [True: 2, False: 182]
  ------------------
 4713|      2|        case 246: return 246.070205000;
  ------------------
  |  Branch (4713:9): [True: 2, False: 182]
  ------------------
 4714|      2|        case 247: return 247.074070000;
  ------------------
  |  Branch (4714:9): [True: 2, False: 182]
  ------------------
 4715|    184|        }
 4716|      6|        break;
 4717|    247|      case 95:
  ------------------
  |  Branch (4717:7): [True: 247, False: 414k]
  ------------------
 4718|    247|        switch (isotope) {
  ------------------
  |  Branch (4718:17): [True: 235, False: 12]
  ------------------
 4719|      2|        case 231: return 231.045560000;
  ------------------
  |  Branch (4719:9): [True: 2, False: 245]
  ------------------
 4720|      6|        case 232: return 232.046590000;
  ------------------
  |  Branch (4720:9): [True: 6, False: 241]
  ------------------
 4721|      2|        case 233: return 233.046350000;
  ------------------
  |  Branch (4721:9): [True: 2, False: 245]
  ------------------
 4722|      2|        case 234: return 234.047810000;
  ------------------
  |  Branch (4722:9): [True: 2, False: 245]
  ------------------
 4723|     14|        case 235: return 235.047950000;
  ------------------
  |  Branch (4723:9): [True: 14, False: 233]
  ------------------
 4724|      2|        case 236: return 236.049580000;
  ------------------
  |  Branch (4724:9): [True: 2, False: 245]
  ------------------
 4725|      2|        case 237: return 237.050000000;
  ------------------
  |  Branch (4725:9): [True: 2, False: 245]
  ------------------
 4726|      6|        case 238: return 238.051980000;
  ------------------
  |  Branch (4726:9): [True: 6, False: 241]
  ------------------
 4727|      2|        case 239: return 239.053024000;
  ------------------
  |  Branch (4727:9): [True: 2, False: 245]
  ------------------
 4728|      2|        case 240: return 240.055300000;
  ------------------
  |  Branch (4728:9): [True: 2, False: 245]
  ------------------
 4729|      2|        case 241: return 241.056829000;
  ------------------
  |  Branch (4729:9): [True: 2, False: 245]
  ------------------
 4730|      6|        case 242: return 242.059549000;
  ------------------
  |  Branch (4730:9): [True: 6, False: 241]
  ------------------
 4731|    119|        case 0: case 243: return 243.061381000;
  ------------------
  |  Branch (4731:9): [True: 85, False: 162]
  |  Branch (4731:17): [True: 34, False: 213]
  ------------------
 4732|      2|        case 244: return 244.064284000;
  ------------------
  |  Branch (4732:9): [True: 2, False: 245]
  ------------------
 4733|      2|        case 245: return 245.066452000;
  ------------------
  |  Branch (4733:9): [True: 2, False: 245]
  ------------------
 4734|      2|        case 246: return 246.069775000;
  ------------------
  |  Branch (4734:9): [True: 2, False: 245]
  ------------------
 4735|     32|        case 247: return 247.072090000;
  ------------------
  |  Branch (4735:9): [True: 32, False: 215]
  ------------------
 4736|     22|        case 248: return 248.075750000;
  ------------------
  |  Branch (4736:9): [True: 22, False: 225]
  ------------------
 4737|      8|        case 249: return 249.078480000;
  ------------------
  |  Branch (4737:9): [True: 8, False: 239]
  ------------------
 4738|    247|        }
 4739|     12|        break;
 4740|    410|      case 96:
  ------------------
  |  Branch (4740:7): [True: 410, False: 414k]
  ------------------
 4741|    410|        switch (isotope) {
  ------------------
  |  Branch (4741:17): [True: 282, False: 128]
  ------------------
 4742|      8|        case 233: return 233.050770000;
  ------------------
  |  Branch (4742:9): [True: 8, False: 402]
  ------------------
 4743|      8|        case 234: return 234.050160000;
  ------------------
  |  Branch (4743:9): [True: 8, False: 402]
  ------------------
 4744|      2|        case 235: return 235.051430000;
  ------------------
  |  Branch (4744:9): [True: 2, False: 408]
  ------------------
 4745|      2|        case 236: return 236.051410000;
  ------------------
  |  Branch (4745:9): [True: 2, False: 408]
  ------------------
 4746|      2|        case 237: return 237.052900000;
  ------------------
  |  Branch (4746:9): [True: 2, False: 408]
  ------------------
 4747|      8|        case 238: return 238.053030000;
  ------------------
  |  Branch (4747:9): [True: 8, False: 402]
  ------------------
 4748|      6|        case 239: return 239.054960000;
  ------------------
  |  Branch (4748:9): [True: 6, False: 404]
  ------------------
 4749|      2|        case 240: return 240.055529000;
  ------------------
  |  Branch (4749:9): [True: 2, False: 408]
  ------------------
 4750|     26|        case 241: return 241.057653000;
  ------------------
  |  Branch (4750:9): [True: 26, False: 384]
  ------------------
 4751|     12|        case 242: return 242.058835000;
  ------------------
  |  Branch (4751:9): [True: 12, False: 398]
  ------------------
 4752|     32|        case 243: return 243.061389000;
  ------------------
  |  Branch (4752:9): [True: 32, False: 378]
  ------------------
 4753|      2|        case 244: return 244.062752000;
  ------------------
  |  Branch (4753:9): [True: 2, False: 408]
  ------------------
 4754|      6|        case 245: return 245.065491000;
  ------------------
  |  Branch (4754:9): [True: 6, False: 404]
  ------------------
 4755|     24|        case 246: return 246.067223000;
  ------------------
  |  Branch (4755:9): [True: 24, False: 386]
  ------------------
 4756|     72|        case 0: case 247: return 247.070354000;
  ------------------
  |  Branch (4756:9): [True: 66, False: 344]
  |  Branch (4756:17): [True: 6, False: 404]
  ------------------
 4757|     16|        case 248: return 248.072349000;
  ------------------
  |  Branch (4757:9): [True: 16, False: 394]
  ------------------
 4758|      2|        case 249: return 249.075953000;
  ------------------
  |  Branch (4758:9): [True: 2, False: 408]
  ------------------
 4759|     14|        case 250: return 250.078357000;
  ------------------
  |  Branch (4759:9): [True: 14, False: 396]
  ------------------
 4760|     30|        case 251: return 251.082285000;
  ------------------
  |  Branch (4760:9): [True: 30, False: 380]
  ------------------
 4761|      8|        case 252: return 252.084870000;
  ------------------
  |  Branch (4761:9): [True: 8, False: 402]
  ------------------
 4762|    410|        }
 4763|    128|        break;
 4764|    128|      case 97:
  ------------------
  |  Branch (4764:7): [True: 105, False: 415k]
  ------------------
 4765|    105|        switch (isotope) {
  ------------------
  |  Branch (4765:17): [True: 97, False: 8]
  ------------------
 4766|      0|        case 235: return 235.056580000;
  ------------------
  |  Branch (4766:9): [True: 0, False: 105]
  ------------------
 4767|      0|        case 236: return 236.057330000;
  ------------------
  |  Branch (4767:9): [True: 0, False: 105]
  ------------------
 4768|      0|        case 237: return 237.057000000;
  ------------------
  |  Branch (4768:9): [True: 0, False: 105]
  ------------------
 4769|      0|        case 238: return 238.058280000;
  ------------------
  |  Branch (4769:9): [True: 0, False: 105]
  ------------------
 4770|      0|        case 239: return 239.058280000;
  ------------------
  |  Branch (4770:9): [True: 0, False: 105]
  ------------------
 4771|      0|        case 240: return 240.059760000;
  ------------------
  |  Branch (4771:9): [True: 0, False: 105]
  ------------------
 4772|      0|        case 241: return 241.060230000;
  ------------------
  |  Branch (4772:9): [True: 0, False: 105]
  ------------------
 4773|      0|        case 242: return 242.061980000;
  ------------------
  |  Branch (4773:9): [True: 0, False: 105]
  ------------------
 4774|      0|        case 243: return 243.063008000;
  ------------------
  |  Branch (4774:9): [True: 0, False: 105]
  ------------------
 4775|      2|        case 244: return 244.065181000;
  ------------------
  |  Branch (4775:9): [True: 2, False: 103]
  ------------------
 4776|      2|        case 245: return 245.066361000;
  ------------------
  |  Branch (4776:9): [True: 2, False: 103]
  ------------------
 4777|      2|        case 246: return 246.068670000;
  ------------------
  |  Branch (4777:9): [True: 2, False: 103]
  ------------------
 4778|     81|        case 0: case 247: return 247.070307000;
  ------------------
  |  Branch (4778:9): [True: 81, False: 24]
  |  Branch (4778:17): [True: 0, False: 105]
  ------------------
 4779|      4|        case 248: return 248.073090000;
  ------------------
  |  Branch (4779:9): [True: 4, False: 101]
  ------------------
 4780|      2|        case 249: return 249.074986000;
  ------------------
  |  Branch (4780:9): [True: 2, False: 103]
  ------------------
 4781|      2|        case 250: return 250.078317000;
  ------------------
  |  Branch (4781:9): [True: 2, False: 103]
  ------------------
 4782|      2|        case 251: return 251.080760000;
  ------------------
  |  Branch (4782:9): [True: 2, False: 103]
  ------------------
 4783|      0|        case 252: return 252.084310000;
  ------------------
  |  Branch (4783:9): [True: 0, False: 105]
  ------------------
 4784|      0|        case 253: return 253.086880000;
  ------------------
  |  Branch (4784:9): [True: 0, False: 105]
  ------------------
 4785|      0|        case 254: return 254.090600000;
  ------------------
  |  Branch (4785:9): [True: 0, False: 105]
  ------------------
 4786|    105|        }
 4787|      8|        break;
 4788|    293|      case 98:
  ------------------
  |  Branch (4788:7): [True: 293, False: 414k]
  ------------------
 4789|    293|        switch (isotope) {
  ------------------
  |  Branch (4789:17): [True: 269, False: 24]
  ------------------
 4790|     10|        case 237: return 237.062070000;
  ------------------
  |  Branch (4790:9): [True: 10, False: 283]
  ------------------
 4791|      6|        case 238: return 238.061410000;
  ------------------
  |  Branch (4791:9): [True: 6, False: 287]
  ------------------
 4792|      2|        case 239: return 239.062420000;
  ------------------
  |  Branch (4792:9): [True: 2, False: 291]
  ------------------
 4793|     34|        case 240: return 240.062300000;
  ------------------
  |  Branch (4793:9): [True: 34, False: 259]
  ------------------
 4794|     16|        case 241: return 241.063730000;
  ------------------
  |  Branch (4794:9): [True: 16, False: 277]
  ------------------
 4795|     70|        case 242: return 242.063700000;
  ------------------
  |  Branch (4795:9): [True: 70, False: 223]
  ------------------
 4796|      6|        case 243: return 243.065430000;
  ------------------
  |  Branch (4796:9): [True: 6, False: 287]
  ------------------
 4797|      6|        case 244: return 244.066001000;
  ------------------
  |  Branch (4797:9): [True: 6, False: 287]
  ------------------
 4798|      2|        case 245: return 245.068049000;
  ------------------
  |  Branch (4798:9): [True: 2, False: 291]
  ------------------
 4799|      2|        case 246: return 246.068805000;
  ------------------
  |  Branch (4799:9): [True: 2, False: 291]
  ------------------
 4800|     10|        case 247: return 247.071001000;
  ------------------
  |  Branch (4800:9): [True: 10, False: 283]
  ------------------
 4801|     26|        case 248: return 248.072185000;
  ------------------
  |  Branch (4801:9): [True: 26, False: 267]
  ------------------
 4802|      6|        case 249: return 249.074853000;
  ------------------
  |  Branch (4802:9): [True: 6, False: 287]
  ------------------
 4803|      4|        case 250: return 250.076406000;
  ------------------
  |  Branch (4803:9): [True: 4, False: 289]
  ------------------
 4804|     53|        case 0: case 251: return 251.079587000;
  ------------------
  |  Branch (4804:9): [True: 47, False: 246]
  |  Branch (4804:17): [True: 6, False: 287]
  ------------------
 4805|      8|        case 252: return 252.081626000;
  ------------------
  |  Branch (4805:9): [True: 8, False: 285]
  ------------------
 4806|      2|        case 253: return 253.085133000;
  ------------------
  |  Branch (4806:9): [True: 2, False: 291]
  ------------------
 4807|      2|        case 254: return 254.087323000;
  ------------------
  |  Branch (4807:9): [True: 2, False: 291]
  ------------------
 4808|      2|        case 255: return 255.091050000;
  ------------------
  |  Branch (4808:9): [True: 2, False: 291]
  ------------------
 4809|      2|        case 256: return 256.093440000;
  ------------------
  |  Branch (4809:9): [True: 2, False: 291]
  ------------------
 4810|    293|        }
 4811|     24|        break;
 4812|    127|      case 99:
  ------------------
  |  Branch (4812:7): [True: 127, False: 415k]
  ------------------
 4813|    127|        switch (isotope) {
  ------------------
  |  Branch (4813:17): [True: 107, False: 20]
  ------------------
 4814|      2|        case 240: return 240.068920000;
  ------------------
  |  Branch (4814:9): [True: 2, False: 125]
  ------------------
 4815|      2|        case 241: return 241.068540000;
  ------------------
  |  Branch (4815:9): [True: 2, False: 125]
  ------------------
 4816|      2|        case 242: return 242.069750000;
  ------------------
  |  Branch (4816:9): [True: 2, False: 125]
  ------------------
 4817|      2|        case 243: return 243.069550000;
  ------------------
  |  Branch (4817:9): [True: 2, False: 125]
  ------------------
 4818|      6|        case 244: return 244.070880000;
  ------------------
  |  Branch (4818:9): [True: 6, False: 121]
  ------------------
 4819|      8|        case 245: return 245.071320000;
  ------------------
  |  Branch (4819:9): [True: 8, False: 119]
  ------------------
 4820|      2|        case 246: return 246.072900000;
  ------------------
  |  Branch (4820:9): [True: 2, False: 125]
  ------------------
 4821|      2|        case 247: return 247.073660000;
  ------------------
  |  Branch (4821:9): [True: 2, False: 125]
  ------------------
 4822|      2|        case 248: return 248.075470000;
  ------------------
  |  Branch (4822:9): [True: 2, False: 125]
  ------------------
 4823|      2|        case 249: return 249.076410000;
  ------------------
  |  Branch (4823:9): [True: 2, False: 125]
  ------------------
 4824|      2|        case 250: return 250.078610000;
  ------------------
  |  Branch (4824:9): [True: 2, False: 125]
  ------------------
 4825|      2|        case 251: return 251.079992000;
  ------------------
  |  Branch (4825:9): [True: 2, False: 125]
  ------------------
 4826|     41|        case 0: case 252: return 252.082980000;
  ------------------
  |  Branch (4826:9): [True: 39, False: 88]
  |  Branch (4826:17): [True: 2, False: 125]
  ------------------
 4827|      2|        case 253: return 253.084824000;
  ------------------
  |  Branch (4827:9): [True: 2, False: 125]
  ------------------
 4828|      6|        case 254: return 254.088022000;
  ------------------
  |  Branch (4828:9): [True: 6, False: 121]
  ------------------
 4829|      2|        case 255: return 255.090273000;
  ------------------
  |  Branch (4829:9): [True: 2, False: 125]
  ------------------
 4830|      6|        case 256: return 256.093600000;
  ------------------
  |  Branch (4830:9): [True: 6, False: 121]
  ------------------
 4831|     10|        case 257: return 257.095980000;
  ------------------
  |  Branch (4831:9): [True: 10, False: 117]
  ------------------
 4832|      6|        case 258: return 258.099520000;
  ------------------
  |  Branch (4832:9): [True: 6, False: 121]
  ------------------
 4833|    127|        }
 4834|     20|        break;
 4835|    223|      case 100:
  ------------------
  |  Branch (4835:7): [True: 223, False: 414k]
  ------------------
 4836|    223|        switch (isotope) {
  ------------------
  |  Branch (4836:17): [True: 187, False: 36]
  ------------------
 4837|      2|        case 242: return 242.073430000;
  ------------------
  |  Branch (4837:9): [True: 2, False: 221]
  ------------------
 4838|     24|        case 243: return 243.074350000;
  ------------------
  |  Branch (4838:9): [True: 24, False: 199]
  ------------------
 4839|      6|        case 244: return 244.074080000;
  ------------------
  |  Branch (4839:9): [True: 6, False: 217]
  ------------------
 4840|      2|        case 245: return 245.075390000;
  ------------------
  |  Branch (4840:9): [True: 2, False: 221]
  ------------------
 4841|      4|        case 246: return 246.075300000;
  ------------------
  |  Branch (4841:9): [True: 4, False: 219]
  ------------------
 4842|      6|        case 247: return 247.076850000;
  ------------------
  |  Branch (4842:9): [True: 6, False: 217]
  ------------------
 4843|      6|        case 248: return 248.077195000;
  ------------------
  |  Branch (4843:9): [True: 6, False: 217]
  ------------------
 4844|      6|        case 249: return 249.079030000;
  ------------------
  |  Branch (4844:9): [True: 6, False: 217]
  ------------------
 4845|      2|        case 250: return 250.079521000;
  ------------------
  |  Branch (4845:9): [True: 2, False: 221]
  ------------------
 4846|      2|        case 251: return 251.081575000;
  ------------------
  |  Branch (4846:9): [True: 2, False: 221]
  ------------------
 4847|      8|        case 252: return 252.082467000;
  ------------------
  |  Branch (4847:9): [True: 8, False: 215]
  ------------------
 4848|      8|        case 253: return 253.085185000;
  ------------------
  |  Branch (4848:9): [True: 8, False: 215]
  ------------------
 4849|      6|        case 254: return 254.086854000;
  ------------------
  |  Branch (4849:9): [True: 6, False: 217]
  ------------------
 4850|      6|        case 255: return 255.089962000;
  ------------------
  |  Branch (4850:9): [True: 6, False: 217]
  ------------------
 4851|      2|        case 256: return 256.091773000;
  ------------------
  |  Branch (4851:9): [True: 2, False: 221]
  ------------------
 4852|     91|        case 0: case 257: return 257.095105000;
  ------------------
  |  Branch (4852:9): [True: 89, False: 134]
  |  Branch (4852:17): [True: 2, False: 221]
  ------------------
 4853|      2|        case 258: return 258.097080000;
  ------------------
  |  Branch (4853:9): [True: 2, False: 221]
  ------------------
 4854|      2|        case 259: return 259.100600000;
  ------------------
  |  Branch (4854:9): [True: 2, False: 221]
  ------------------
 4855|      2|        case 260: return 260.102680000;
  ------------------
  |  Branch (4855:9): [True: 2, False: 221]
  ------------------
 4856|    223|        }
 4857|     36|        break;
 4858|     90|      case 101:
  ------------------
  |  Branch (4858:7): [True: 90, False: 415k]
  ------------------
 4859|     90|        switch (isotope) {
  ------------------
  |  Branch (4859:17): [True: 76, False: 14]
  ------------------
 4860|      0|        case 245: return 245.080830000;
  ------------------
  |  Branch (4860:9): [True: 0, False: 90]
  ------------------
 4861|      0|        case 246: return 246.081890000;
  ------------------
  |  Branch (4861:9): [True: 0, False: 90]
  ------------------
 4862|      0|        case 247: return 247.081640000;
  ------------------
  |  Branch (4862:9): [True: 0, False: 90]
  ------------------
 4863|      0|        case 248: return 248.082820000;
  ------------------
  |  Branch (4863:9): [True: 0, False: 90]
  ------------------
 4864|      0|        case 249: return 249.083010000;
  ------------------
  |  Branch (4864:9): [True: 0, False: 90]
  ------------------
 4865|      0|        case 250: return 250.084420000;
  ------------------
  |  Branch (4865:9): [True: 0, False: 90]
  ------------------
 4866|      0|        case 251: return 251.084840000;
  ------------------
  |  Branch (4866:9): [True: 0, False: 90]
  ------------------
 4867|      0|        case 252: return 252.086560000;
  ------------------
  |  Branch (4867:9): [True: 0, False: 90]
  ------------------
 4868|      0|        case 253: return 253.087280000;
  ------------------
  |  Branch (4868:9): [True: 0, False: 90]
  ------------------
 4869|      0|        case 254: return 254.089660000;
  ------------------
  |  Branch (4869:9): [True: 0, False: 90]
  ------------------
 4870|      2|        case 255: return 255.091083000;
  ------------------
  |  Branch (4870:9): [True: 2, False: 88]
  ------------------
 4871|      2|        case 256: return 256.094060000;
  ------------------
  |  Branch (4871:9): [True: 2, False: 88]
  ------------------
 4872|      2|        case 257: return 257.095541000;
  ------------------
  |  Branch (4872:9): [True: 2, False: 88]
  ------------------
 4873|     62|        case 0: case 258: return 258.098431000;
  ------------------
  |  Branch (4873:9): [True: 62, False: 28]
  |  Branch (4873:17): [True: 0, False: 90]
  ------------------
 4874|      2|        case 259: return 259.100510000;
  ------------------
  |  Branch (4874:9): [True: 2, False: 88]
  ------------------
 4875|      2|        case 260: return 260.103650000;
  ------------------
  |  Branch (4875:9): [True: 2, False: 88]
  ------------------
 4876|      2|        case 261: return 261.105720000;
  ------------------
  |  Branch (4876:9): [True: 2, False: 88]
  ------------------
 4877|      2|        case 262: return 262.108870000;
  ------------------
  |  Branch (4877:9): [True: 2, False: 88]
  ------------------
 4878|     90|        }
 4879|     14|        break;
 4880|    247|      case 102:
  ------------------
  |  Branch (4880:7): [True: 247, False: 414k]
  ------------------
 4881|    247|        switch (isotope) {
  ------------------
  |  Branch (4881:17): [True: 241, False: 6]
  ------------------
 4882|      2|        case 248: return 248.086600000;
  ------------------
  |  Branch (4882:9): [True: 2, False: 245]
  ------------------
 4883|      2|        case 249: return 249.087830000;
  ------------------
  |  Branch (4883:9): [True: 2, False: 245]
  ------------------
 4884|     14|        case 250: return 250.087510000;
  ------------------
  |  Branch (4884:9): [True: 14, False: 233]
  ------------------
 4885|      2|        case 251: return 251.089010000;
  ------------------
  |  Branch (4885:9): [True: 2, False: 245]
  ------------------
 4886|      8|        case 252: return 252.088977000;
  ------------------
  |  Branch (4886:9): [True: 8, False: 239]
  ------------------
 4887|      2|        case 253: return 253.090680000;
  ------------------
  |  Branch (4887:9): [True: 2, False: 245]
  ------------------
 4888|      2|        case 254: return 254.090955000;
  ------------------
  |  Branch (4888:9): [True: 2, False: 245]
  ------------------
 4889|      6|        case 255: return 255.093241000;
  ------------------
  |  Branch (4889:9): [True: 6, False: 241]
  ------------------
 4890|      2|        case 256: return 256.094283000;
  ------------------
  |  Branch (4890:9): [True: 2, False: 245]
  ------------------
 4891|      2|        case 257: return 257.096877000;
  ------------------
  |  Branch (4891:9): [True: 2, False: 245]
  ------------------
 4892|      2|        case 258: return 258.098210000;
  ------------------
  |  Branch (4892:9): [True: 2, False: 245]
  ------------------
 4893|    183|        case 0: case 259: return 259.101030000;
  ------------------
  |  Branch (4893:9): [True: 181, False: 66]
  |  Branch (4893:17): [True: 2, False: 245]
  ------------------
 4894|      2|        case 260: return 260.102640000;
  ------------------
  |  Branch (4894:9): [True: 2, False: 245]
  ------------------
 4895|      2|        case 261: return 261.105750000;
  ------------------
  |  Branch (4895:9): [True: 2, False: 245]
  ------------------
 4896|      2|        case 262: return 262.107300000;
  ------------------
  |  Branch (4896:9): [True: 2, False: 245]
  ------------------
 4897|      2|        case 263: return 263.110550000;
  ------------------
  |  Branch (4897:9): [True: 2, False: 245]
  ------------------
 4898|      6|        case 264: return 264.112350000;
  ------------------
  |  Branch (4898:9): [True: 6, False: 241]
  ------------------
 4899|    247|        }
 4900|      6|        break;
 4901|    127|      case 103:
  ------------------
  |  Branch (4901:7): [True: 127, False: 415k]
  ------------------
 4902|    127|        switch (isotope) {
  ------------------
  |  Branch (4902:17): [True: 99, False: 28]
  ------------------
 4903|      0|        case 251: return 251.094360000;
  ------------------
  |  Branch (4903:9): [True: 0, False: 127]
  ------------------
 4904|      0|        case 252: return 252.095370000;
  ------------------
  |  Branch (4904:9): [True: 0, False: 127]
  ------------------
 4905|      0|        case 253: return 253.095210000;
  ------------------
  |  Branch (4905:9): [True: 0, False: 127]
  ------------------
 4906|      0|        case 254: return 254.096450000;
  ------------------
  |  Branch (4906:9): [True: 0, False: 127]
  ------------------
 4907|      0|        case 255: return 255.096680000;
  ------------------
  |  Branch (4907:9): [True: 0, False: 127]
  ------------------
 4908|      0|        case 256: return 256.098630000;
  ------------------
  |  Branch (4908:9): [True: 0, False: 127]
  ------------------
 4909|      0|        case 257: return 257.099560000;
  ------------------
  |  Branch (4909:9): [True: 0, False: 127]
  ------------------
 4910|      0|        case 258: return 258.101810000;
  ------------------
  |  Branch (4910:9): [True: 0, False: 127]
  ------------------
 4911|      2|        case 259: return 259.102900000;
  ------------------
  |  Branch (4911:9): [True: 2, False: 125]
  ------------------
 4912|      2|        case 260: return 260.105500000;
  ------------------
  |  Branch (4912:9): [True: 2, False: 125]
  ------------------
 4913|      2|        case 261: return 261.106880000;
  ------------------
  |  Branch (4913:9): [True: 2, False: 125]
  ------------------
 4914|     85|        case 0: case 262: return 262.109630000;
  ------------------
  |  Branch (4914:9): [True: 85, False: 42]
  |  Branch (4914:17): [True: 0, False: 127]
  ------------------
 4915|      2|        case 263: return 263.111290000;
  ------------------
  |  Branch (4915:9): [True: 2, False: 125]
  ------------------
 4916|      2|        case 264: return 264.114040000;
  ------------------
  |  Branch (4916:9): [True: 2, False: 125]
  ------------------
 4917|      2|        case 265: return 265.115840000;
  ------------------
  |  Branch (4917:9): [True: 2, False: 125]
  ------------------
 4918|      2|        case 266: return 266.119310000;
  ------------------
  |  Branch (4918:9): [True: 2, False: 125]
  ------------------
 4919|    127|        }
 4920|     28|        break;
 4921|     46|      case 104:
  ------------------
  |  Branch (4921:7): [True: 46, False: 415k]
  ------------------
 4922|     46|        switch (isotope) {
  ------------------
  |  Branch (4922:17): [True: 38, False: 8]
  ------------------
 4923|      0|        case 253: return 253.100690000;
  ------------------
  |  Branch (4923:9): [True: 0, False: 46]
  ------------------
 4924|      0|        case 254: return 254.100180000;
  ------------------
  |  Branch (4924:9): [True: 0, False: 46]
  ------------------
 4925|      0|        case 255: return 255.101340000;
  ------------------
  |  Branch (4925:9): [True: 0, False: 46]
  ------------------
 4926|      0|        case 256: return 256.101166000;
  ------------------
  |  Branch (4926:9): [True: 0, False: 46]
  ------------------
 4927|      0|        case 257: return 257.102990000;
  ------------------
  |  Branch (4927:9): [True: 0, False: 46]
  ------------------
 4928|      0|        case 258: return 258.103490000;
  ------------------
  |  Branch (4928:9): [True: 0, False: 46]
  ------------------
 4929|      0|        case 259: return 259.105640000;
  ------------------
  |  Branch (4929:9): [True: 0, False: 46]
  ------------------
 4930|      0|        case 260: return 260.106440000;
  ------------------
  |  Branch (4930:9): [True: 0, False: 46]
  ------------------
 4931|     24|        case 0: case 261: return 261.108770000;
  ------------------
  |  Branch (4931:9): [True: 24, False: 22]
  |  Branch (4931:17): [True: 0, False: 46]
  ------------------
 4932|      2|        case 262: return 262.109930000;
  ------------------
  |  Branch (4932:9): [True: 2, False: 44]
  ------------------
 4933|      2|        case 263: return 263.112550000;
  ------------------
  |  Branch (4933:9): [True: 2, False: 44]
  ------------------
 4934|      2|        case 264: return 264.113990000;
  ------------------
  |  Branch (4934:9): [True: 2, False: 44]
  ------------------
 4935|      2|        case 265: return 265.116700000;
  ------------------
  |  Branch (4935:9): [True: 2, False: 44]
  ------------------
 4936|      2|        case 266: return 266.117960000;
  ------------------
  |  Branch (4936:9): [True: 2, False: 44]
  ------------------
 4937|      2|        case 267: return 267.121530000;
  ------------------
  |  Branch (4937:9): [True: 2, False: 44]
  ------------------
 4938|      2|        case 268: return 268.123640000;
  ------------------
  |  Branch (4938:9): [True: 2, False: 44]
  ------------------
 4939|     46|        }
 4940|      8|        break;
 4941|    228|      case 105:
  ------------------
  |  Branch (4941:7): [True: 228, False: 414k]
  ------------------
 4942|    228|        switch (isotope) {
  ------------------
  |  Branch (4942:17): [True: 184, False: 44]
  ------------------
 4943|      2|        case 255: return 255.107400000;
  ------------------
  |  Branch (4943:9): [True: 2, False: 226]
  ------------------
 4944|      8|        case 256: return 256.108130000;
  ------------------
  |  Branch (4944:9): [True: 8, False: 220]
  ------------------
 4945|      6|        case 257: return 257.107720000;
  ------------------
  |  Branch (4945:9): [True: 6, False: 222]
  ------------------
 4946|      6|        case 258: return 258.109230000;
  ------------------
  |  Branch (4946:9): [True: 6, False: 222]
  ------------------
 4947|      2|        case 259: return 259.109610000;
  ------------------
  |  Branch (4947:9): [True: 2, False: 226]
  ------------------
 4948|      6|        case 260: return 260.111300000;
  ------------------
  |  Branch (4948:9): [True: 6, False: 222]
  ------------------
 4949|     12|        case 261: return 261.112060000;
  ------------------
  |  Branch (4949:9): [True: 12, False: 216]
  ------------------
 4950|     64|        case 0: case 262: return 262.114080000;
  ------------------
  |  Branch (4950:9): [True: 58, False: 170]
  |  Branch (4950:17): [True: 6, False: 222]
  ------------------
 4951|      8|        case 263: return 263.114990000;
  ------------------
  |  Branch (4951:9): [True: 8, False: 220]
  ------------------
 4952|      8|        case 264: return 264.117400000;
  ------------------
  |  Branch (4952:9): [True: 8, False: 220]
  ------------------
 4953|      2|        case 265: return 265.118600000;
  ------------------
  |  Branch (4953:9): [True: 2, False: 226]
  ------------------
 4954|      2|        case 266: return 266.121030000;
  ------------------
  |  Branch (4954:9): [True: 2, False: 226]
  ------------------
 4955|     48|        case 267: return 267.122380000;
  ------------------
  |  Branch (4955:9): [True: 48, False: 180]
  ------------------
 4956|      6|        case 268: return 268.125450000;
  ------------------
  |  Branch (4956:9): [True: 6, False: 222]
  ------------------
 4957|      2|        case 269: return 269.127460000;
  ------------------
  |  Branch (4957:9): [True: 2, False: 226]
  ------------------
 4958|      2|        case 270: return 270.130710000;
  ------------------
  |  Branch (4958:9): [True: 2, False: 226]
  ------------------
 4959|    228|        }
 4960|     44|        break;
 4961|     99|      case 106:
  ------------------
  |  Branch (4961:7): [True: 99, False: 415k]
  ------------------
 4962|     99|        switch (isotope) {
  ------------------
  |  Branch (4962:17): [True: 89, False: 10]
  ------------------
 4963|      0|        case 258: return 258.113170000;
  ------------------
  |  Branch (4963:9): [True: 0, False: 99]
  ------------------
 4964|      0|        case 259: return 259.114500000;
  ------------------
  |  Branch (4964:9): [True: 0, False: 99]
  ------------------
 4965|      2|        case 260: return 260.114420000;
  ------------------
  |  Branch (4965:9): [True: 2, False: 97]
  ------------------
 4966|      2|        case 261: return 261.116120000;
  ------------------
  |  Branch (4966:9): [True: 2, False: 97]
  ------------------
 4967|      2|        case 262: return 262.116400000;
  ------------------
  |  Branch (4967:9): [True: 2, False: 97]
  ------------------
 4968|     57|        case 0: case 263: return 263.118320000;
  ------------------
  |  Branch (4968:9): [True: 55, False: 44]
  |  Branch (4968:17): [True: 2, False: 97]
  ------------------
 4969|      2|        case 264: return 264.118930000;
  ------------------
  |  Branch (4969:9): [True: 2, False: 97]
  ------------------
 4970|      2|        case 265: return 265.121110000;
  ------------------
  |  Branch (4970:9): [True: 2, False: 97]
  ------------------
 4971|      2|        case 266: return 266.122070000;
  ------------------
  |  Branch (4971:9): [True: 2, False: 97]
  ------------------
 4972|      2|        case 267: return 267.124430000;
  ------------------
  |  Branch (4972:9): [True: 2, False: 97]
  ------------------
 4973|      2|        case 268: return 268.125610000;
  ------------------
  |  Branch (4973:9): [True: 2, False: 97]
  ------------------
 4974|      4|        case 269: return 269.128760000;
  ------------------
  |  Branch (4974:9): [True: 4, False: 95]
  ------------------
 4975|      2|        case 270: return 270.130330000;
  ------------------
  |  Branch (4975:9): [True: 2, False: 97]
  ------------------
 4976|      6|        case 271: return 271.133470000;
  ------------------
  |  Branch (4976:9): [True: 6, False: 93]
  ------------------
 4977|      2|        case 272: return 272.135160000;
  ------------------
  |  Branch (4977:9): [True: 2, False: 97]
  ------------------
 4978|      2|        case 273: return 273.138220000;
  ------------------
  |  Branch (4978:9): [True: 2, False: 97]
  ------------------
 4979|     99|        }
 4980|     10|        break;
 4981|    206|      case 107:
  ------------------
  |  Branch (4981:7): [True: 206, False: 414k]
  ------------------
 4982|    206|        switch (isotope) {
  ------------------
  |  Branch (4982:17): [True: 196, False: 10]
  ------------------
 4983|      6|        case 260: return 260.121970000;
  ------------------
  |  Branch (4983:9): [True: 6, False: 200]
  ------------------
 4984|      8|        case 261: return 261.121660000;
  ------------------
  |  Branch (4984:9): [True: 8, False: 198]
  ------------------
 4985|      2|        case 262: return 262.122890000;
  ------------------
  |  Branch (4985:9): [True: 2, False: 204]
  ------------------
 4986|      2|        case 263: return 263.123040000;
  ------------------
  |  Branch (4986:9): [True: 2, False: 204]
  ------------------
 4987|    128|        case 0: case 264: return 264.124600000;
  ------------------
  |  Branch (4987:9): [True: 124, False: 82]
  |  Branch (4987:17): [True: 4, False: 202]
  ------------------
 4988|      8|        case 265: return 265.125150000;
  ------------------
  |  Branch (4988:9): [True: 8, False: 198]
  ------------------
 4989|      6|        case 266: return 266.126940000;
  ------------------
  |  Branch (4989:9): [True: 6, False: 200]
  ------------------
 4990|      2|        case 267: return 267.127650000;
  ------------------
  |  Branch (4990:9): [True: 2, False: 204]
  ------------------
 4991|      2|        case 268: return 268.129760000;
  ------------------
  |  Branch (4991:9): [True: 2, False: 204]
  ------------------
 4992|      2|        case 269: return 269.130690000;
  ------------------
  |  Branch (4992:9): [True: 2, False: 204]
  ------------------
 4993|      6|        case 270: return 270.133620000;
  ------------------
  |  Branch (4993:9): [True: 6, False: 200]
  ------------------
 4994|      2|        case 271: return 271.135180000;
  ------------------
  |  Branch (4994:9): [True: 2, False: 204]
  ------------------
 4995|      6|        case 272: return 272.138030000;
  ------------------
  |  Branch (4995:9): [True: 6, False: 200]
  ------------------
 4996|      8|        case 273: return 273.139620000;
  ------------------
  |  Branch (4996:9): [True: 8, False: 198]
  ------------------
 4997|      2|        case 274: return 274.142440000;
  ------------------
  |  Branch (4997:9): [True: 2, False: 204]
  ------------------
 4998|      6|        case 275: return 275.144250000;
  ------------------
  |  Branch (4998:9): [True: 6, False: 200]
  ------------------
 4999|    206|        }
 5000|     10|        break;
 5001|    176|      case 108:
  ------------------
  |  Branch (5001:7): [True: 176, False: 414k]
  ------------------
 5002|    176|        switch (isotope) {
  ------------------
  |  Branch (5002:17): [True: 154, False: 22]
  ------------------
 5003|      0|        case 263: return 263.128560000;
  ------------------
  |  Branch (5003:9): [True: 0, False: 176]
  ------------------
 5004|      0|        case 264: return 264.128390000;
  ------------------
  |  Branch (5004:9): [True: 0, False: 176]
  ------------------
 5005|    148|        case 0: case 265: return 265.130090000;
  ------------------
  |  Branch (5005:9): [True: 148, False: 28]
  |  Branch (5005:17): [True: 0, False: 176]
  ------------------
 5006|      0|        case 266: return 266.130100000;
  ------------------
  |  Branch (5006:9): [True: 0, False: 176]
  ------------------
 5007|      0|        case 267: return 267.131790000;
  ------------------
  |  Branch (5007:9): [True: 0, False: 176]
  ------------------
 5008|      0|        case 268: return 268.132160000;
  ------------------
  |  Branch (5008:9): [True: 0, False: 176]
  ------------------
 5009|      0|        case 269: return 269.134060000;
  ------------------
  |  Branch (5009:9): [True: 0, False: 176]
  ------------------
 5010|      0|        case 270: return 270.134650000;
  ------------------
  |  Branch (5010:9): [True: 0, False: 176]
  ------------------
 5011|      0|        case 271: return 271.137660000;
  ------------------
  |  Branch (5011:9): [True: 0, False: 176]
  ------------------
 5012|      0|        case 272: return 272.139050000;
  ------------------
  |  Branch (5012:9): [True: 0, False: 176]
  ------------------
 5013|      0|        case 273: return 273.141990000;
  ------------------
  |  Branch (5013:9): [True: 0, False: 176]
  ------------------
 5014|      2|        case 274: return 274.143130000;
  ------------------
  |  Branch (5014:9): [True: 2, False: 174]
  ------------------
 5015|      2|        case 275: return 275.145950000;
  ------------------
  |  Branch (5015:9): [True: 2, False: 174]
  ------------------
 5016|      2|        case 276: return 276.147210000;
  ------------------
  |  Branch (5016:9): [True: 2, False: 174]
  ------------------
 5017|      0|        case 277: return 277.149840000;
  ------------------
  |  Branch (5017:9): [True: 0, False: 176]
  ------------------
 5018|    176|        }
 5019|     22|        break;
 5020|     78|      case 109:
  ------------------
  |  Branch (5020:7): [True: 78, False: 415k]
  ------------------
 5021|     78|        switch (isotope) {
  ------------------
  |  Branch (5021:17): [True: 46, False: 32]
  ------------------
 5022|      0|        case 265: return 265.136150000;
  ------------------
  |  Branch (5022:9): [True: 0, False: 78]
  ------------------
 5023|      0|        case 266: return 266.137300000;
  ------------------
  |  Branch (5023:9): [True: 0, False: 78]
  ------------------
 5024|      0|        case 267: return 267.137310000;
  ------------------
  |  Branch (5024:9): [True: 0, False: 78]
  ------------------
 5025|     32|        case 0: case 268: return 268.138730000;
  ------------------
  |  Branch (5025:9): [True: 32, False: 46]
  |  Branch (5025:17): [True: 0, False: 78]
  ------------------
 5026|      0|        case 269: return 269.139060000;
  ------------------
  |  Branch (5026:9): [True: 0, False: 78]
  ------------------
 5027|      0|        case 270: return 270.140660000;
  ------------------
  |  Branch (5027:9): [True: 0, False: 78]
  ------------------
 5028|      0|        case 271: return 271.141140000;
  ------------------
  |  Branch (5028:9): [True: 0, False: 78]
  ------------------
 5029|      0|        case 272: return 272.143740000;
  ------------------
  |  Branch (5029:9): [True: 0, False: 78]
  ------------------
 5030|      2|        case 273: return 273.144910000;
  ------------------
  |  Branch (5030:9): [True: 2, False: 76]
  ------------------
 5031|      2|        case 274: return 274.147490000;
  ------------------
  |  Branch (5031:9): [True: 2, False: 76]
  ------------------
 5032|      2|        case 275: return 275.148650000;
  ------------------
  |  Branch (5032:9): [True: 2, False: 76]
  ------------------
 5033|      0|        case 276: return 276.151160000;
  ------------------
  |  Branch (5033:9): [True: 0, False: 78]
  ------------------
 5034|      2|        case 277: return 277.152420000;
  ------------------
  |  Branch (5034:9): [True: 2, False: 76]
  ------------------
 5035|      2|        case 278: return 278.154810000;
  ------------------
  |  Branch (5035:9): [True: 2, False: 76]
  ------------------
 5036|      4|        case 279: return 279.156190000;
  ------------------
  |  Branch (5036:9): [True: 4, False: 74]
  ------------------
 5037|     78|        }
 5038|     32|        break;
 5039|    506|      case 110:
  ------------------
  |  Branch (5039:7): [True: 506, False: 414k]
  ------------------
 5040|    506|        switch (isotope) {
  ------------------
  |  Branch (5040:17): [True: 486, False: 20]
  ------------------
 5041|    486|        case 0: case 281: return 281.162061;
  ------------------
  |  Branch (5041:9): [True: 486, False: 20]
  |  Branch (5041:17): [True: 0, False: 506]
  ------------------
 5042|    506|        }
 5043|     20|        break;
 5044|    177|      case 111:
  ------------------
  |  Branch (5044:7): [True: 177, False: 414k]
  ------------------
 5045|    177|        switch (isotope) {
  ------------------
  |  Branch (5045:17): [True: 155, False: 22]
  ------------------
 5046|    155|        case 0: case 280: return 280.164473;
  ------------------
  |  Branch (5046:9): [True: 155, False: 22]
  |  Branch (5046:17): [True: 0, False: 177]
  ------------------
 5047|    177|        }
 5048|     22|        break;
 5049|    464|      case 112:
  ------------------
  |  Branch (5049:7): [True: 464, False: 414k]
  ------------------
 5050|    464|        switch (isotope) {
  ------------------
  |  Branch (5050:17): [True: 396, False: 68]
  ------------------
 5051|    396|        case 0: case 285: return 285.174105;
  ------------------
  |  Branch (5051:9): [True: 396, False: 68]
  |  Branch (5051:17): [True: 0, False: 464]
  ------------------
 5052|    464|        }
 5053|     68|        break;
 5054|    124|      case 113:
  ------------------
  |  Branch (5054:7): [True: 124, False: 415k]
  ------------------
 5055|    124|        switch (isotope) {
  ------------------
  |  Branch (5055:17): [True: 110, False: 14]
  ------------------
 5056|    110|        case 0: case 284: return 284.178080;
  ------------------
  |  Branch (5056:9): [True: 110, False: 14]
  |  Branch (5056:17): [True: 0, False: 124]
  ------------------
 5057|    124|        }
 5058|     14|        break;
 5059|    346|      case 114:
  ------------------
  |  Branch (5059:7): [True: 346, False: 414k]
  ------------------
 5060|    346|        switch (isotope) {
  ------------------
  |  Branch (5060:17): [True: 338, False: 8]
  ------------------
 5061|    338|        case 0: case 289: return 289.187279;
  ------------------
  |  Branch (5061:9): [True: 338, False: 8]
  |  Branch (5061:17): [True: 0, False: 346]
  ------------------
 5062|    346|        }
 5063|      8|        break;
 5064|    253|      case 115:
  ------------------
  |  Branch (5064:7): [True: 253, False: 414k]
  ------------------
 5065|    253|        switch (isotope) {
  ------------------
  |  Branch (5065:17): [True: 247, False: 6]
  ------------------
 5066|    247|        case 0: case 288: return 288.192492;
  ------------------
  |  Branch (5066:9): [True: 247, False: 6]
  |  Branch (5066:17): [True: 0, False: 253]
  ------------------
 5067|    253|        }
 5068|      6|        break;
 5069|    143|      case 116:
  ------------------
  |  Branch (5069:7): [True: 143, False: 415k]
  ------------------
 5070|    143|        switch (isotope) {
  ------------------
  |  Branch (5070:17): [True: 137, False: 6]
  ------------------
 5071|    137|        case 0: case 292: return 292.199786;
  ------------------
  |  Branch (5071:9): [True: 133, False: 10]
  |  Branch (5071:17): [True: 4, False: 139]
  ------------------
 5072|    143|        }
 5073|      6|        break;
 5074|     63|      case 117:
  ------------------
  |  Branch (5074:7): [True: 63, False: 415k]
  ------------------
 5075|     63|        switch (isotope) {
  ------------------
  |  Branch (5075:17): [True: 61, False: 2]
  ------------------
 5076|      2|        case 291: return 291.206560;
  ------------------
  |  Branch (5076:9): [True: 2, False: 61]
  ------------------
 5077|     59|        case 0: case 292: return 292.207550;
  ------------------
  |  Branch (5077:9): [True: 57, False: 6]
  |  Branch (5077:17): [True: 2, False: 61]
  ------------------
 5078|     63|        }
 5079|      2|        break;
 5080|     88|      case 118:
  ------------------
  |  Branch (5080:7): [True: 88, False: 415k]
  ------------------
 5081|     88|        switch (isotope) {
  ------------------
  |  Branch (5081:17): [True: 78, False: 10]
  ------------------
 5082|     78|        case 0: case 293: return 293.214670;
  ------------------
  |  Branch (5082:9): [True: 78, False: 10]
  |  Branch (5082:17): [True: 0, False: 88]
  ------------------
 5083|     88|        }
 5084|     10|        break;
 5085|       |
 5086|   415k|      }
 5087|  5.31k|      return 0.0;
 5088|   415k|    }

_ZN9OpenBabel12fingerprint2C2EPKcb:
   38|      2|		: OBFingerprint(ID, IsDefault), _flags(0){};

_ZN9OpenBabel9PatternFPC2EPKcS2_b:
   54|      4|      bool IsDefault=false) : OBFingerprint(ID, IsDefault)
   55|      4|  {
   56|      4|    if (filename == nullptr)
  ------------------
  |  Branch (56:9): [True: 2, False: 2]
  ------------------
   57|      2|      _patternsfile="patterns.txt";
   58|      2|    else
   59|      2|      _patternsfile = filename;
   60|      4|  }

_ZN9OpenBabel15fingerprintECFPC2EPKcbjb:
   37|     12|		: OBFingerprint(ID, IsDefault),
   38|     12|      _radius(radius), _keepdups(keepdups), _flags(0){};

_ZN9OpenBabel15OBFFConstraintsC2Ev:
  464|      2|  {
  465|      2|    _factor = 50000.0;
  466|      2|  }
_ZN9OpenBabel15OBFFConstraints11GetGradientEi:
  481|    733|  {
  482|    733|    vector<OBFFConstraint>::iterator i;
  483|       |
  484|    733|    vector3 grad(0.0, 0.0, 0.0);
  485|       |
  486|    733|    for (i = _constraints.begin(); i != _constraints.end(); ++i)
  ------------------
  |  Branch (486:36): [True: 0, False: 733]
  ------------------
  487|      0|      grad += i->GetGradient(a);
  488|       |
  489|    733|    return grad;
  490|    733|  }
_ZNK9OpenBabel15OBFFConstraints4SizeEv:
  503|  7.48k|  {
  504|  7.48k|    return _constraints.size();
  505|  7.48k|  }
_ZN9OpenBabel15OBFFConstraints19GetConstraintEnergyEv:
  508|  4.91k|  {
  509|  4.91k|    vector<OBFFConstraint>::iterator i;
  510|  4.91k|    double constraint_energy = 0.0;
  511|       |
  512|  4.91k|    for (i = _constraints.begin(); i != _constraints.end(); ++i)
  ------------------
  |  Branch (512:36): [True: 0, False: 4.91k]
  ------------------
  513|      0|      if ( (i->type == OBFF_CONST_DISTANCE) || (i->type == OBFF_CONST_ANGLE) ||
  ------------------
  |  |   58|      0|#define OBFF_CONST_DISTANCE	(1 << 5)   //!< constrain distance length
  ------------------
                    if ( (i->type == OBFF_CONST_DISTANCE) || (i->type == OBFF_CONST_ANGLE) ||
  ------------------
  |  |   59|      0|#define OBFF_CONST_ANGLE	(1 << 6)   //!< constrain angle
  ------------------
  |  Branch (513:12): [True: 0, False: 0]
  |  Branch (513:48): [True: 0, False: 0]
  ------------------
  514|      0|           (i->type == OBFF_CONST_TORSION) ) {
  ------------------
  |  |   60|      0|#define OBFF_CONST_TORSION	(1 << 7)   //!< constrain torsion
  ------------------
  |  Branch (514:12): [True: 0, False: 0]
  ------------------
  515|      0|        vector3 da, db, dc, dd;
  516|      0|        double delta, delta2, rab, theta, dE;
  517|       |
  518|      0|        switch (i->type) {
  519|      0|        case OBFF_CONST_DISTANCE:
  ------------------
  |  |   58|      0|#define OBFF_CONST_DISTANCE	(1 << 5)   //!< constrain distance length
  ------------------
  |  Branch (519:9): [True: 0, False: 0]
  ------------------
  520|      0|          if (i->a == nullptr || (i->b) == nullptr)
  ------------------
  |  Branch (520:15): [True: 0, False: 0]
  |  Branch (520:34): [True: 0, False: 0]
  ------------------
  521|      0|            break;
  522|       |
  523|      0|          da = (i->a)->GetVector();
  524|      0|          db = (i->b)->GetVector();
  525|       |
  526|      0|          rab = OBForceField::VectorLengthDerivative(da, db);
  527|      0|          delta = rab - i->constraint_value;
  528|      0|          delta2 = delta * delta;
  529|      0|          constraint_energy += i->factor * delta2;
  530|      0|          dE = 2.0 * i->factor * delta;
  531|       |
  532|      0|          i->grada = dE * da;
  533|      0|          i->gradb = dE * db;
  534|      0|          break;
  535|      0|        case OBFF_CONST_ANGLE:
  ------------------
  |  |   59|      0|#define OBFF_CONST_ANGLE	(1 << 6)   //!< constrain angle
  ------------------
  |  Branch (535:9): [True: 0, False: 0]
  ------------------
  536|      0|          if (i->a == nullptr || i->b == nullptr || i->c == nullptr)
  ------------------
  |  Branch (536:15): [True: 0, False: 0]
  |  Branch (536:34): [True: 0, False: 0]
  |  Branch (536:53): [True: 0, False: 0]
  ------------------
  537|      0|            break;
  538|       |
  539|      0|          da = (i->a)->GetVector();
  540|      0|          db = (i->b)->GetVector();
  541|      0|          dc = (i->c)->GetVector();
  542|       |
  543|      0|          theta = OBForceField::VectorAngleDerivative(da, db, dc);
  544|      0|          delta = theta - i->constraint_value;
  545|      0|          delta2 = delta * delta;
  546|      0|          constraint_energy += 0.0002 * i->factor * delta2;
  547|      0|          dE = 0.0004 * i->factor * delta;
  548|       |
  549|      0|          i->grada = dE * da;
  550|      0|          i->gradb = dE * db;
  551|      0|          i->gradc = dE * dc;
  552|      0|          break;
  553|      0|        case OBFF_CONST_TORSION:
  ------------------
  |  |   60|      0|#define OBFF_CONST_TORSION	(1 << 7)   //!< constrain torsion
  ------------------
  |  Branch (553:9): [True: 0, False: 0]
  ------------------
  554|      0|          if (i->a == nullptr || i->b == nullptr || i->c == nullptr || i->d == nullptr)
  ------------------
  |  Branch (554:15): [True: 0, False: 0]
  |  Branch (554:34): [True: 0, False: 0]
  |  Branch (554:53): [True: 0, False: 0]
  |  Branch (554:72): [True: 0, False: 0]
  ------------------
  555|      0|            break;
  556|       |
  557|      0|          da = (i->a)->GetVector();
  558|      0|          db = (i->b)->GetVector();
  559|      0|          dc = (i->c)->GetVector();
  560|      0|          dd = (i->d)->GetVector();
  561|       |
  562|      0|          theta = OBForceField::VectorTorsionDerivative(da, db, dc, dd);
  563|      0|          if (!isfinite(theta))
  ------------------
  |  Branch (563:15): [True: 0, False: 0]
  ------------------
  564|      0|            theta = 1.0e-7;
  565|       |
  566|      0|          theta = DEG_TO_RAD * (theta + 180.0 - i->constraint_value);
  ------------------
  |  |   35|      0|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  567|      0|          constraint_energy +=  0.001 * i->factor * (1.0 + cos(theta));
  568|      0|          dE = 0.001 * i->factor * sin(theta);
  569|       |
  570|      0|          i->grada = dE * da;
  571|      0|          i->gradb = dE * db;
  572|      0|          i->gradc = dE * dc;
  573|      0|          i->gradd = dE * dd;
  574|      0|          break;
  575|      0|        default:
  ------------------
  |  Branch (575:9): [True: 0, False: 0]
  ------------------
  576|      0|          break;
  577|      0|        }
  578|      0|      }
  579|  4.91k|    return constraint_energy;
  580|  4.91k|  }
_ZN9OpenBabel15OBFFConstraints9IsIgnoredEi:
  756|  3.33k|  {
  757|  3.33k|    return _ignored.BitIsSet(index);
  758|  3.33k|  }
_ZN9OpenBabel15OBFFConstraints7IsFixedEi:
  761|    733|  {
  762|    733|    return _fixed.BitIsSet(index);
  763|    733|  }
_ZN9OpenBabel15OBFFConstraints8IsXFixedEi:
  766|    733|  {
  767|    733|    return _Xfixed.BitIsSet(index);
  768|    733|  }
_ZN9OpenBabel15OBFFConstraints8IsYFixedEi:
  771|    733|  {
  772|    733|    return _Yfixed.BitIsSet(index);
  773|    733|  }
_ZN9OpenBabel15OBFFConstraints8IsZFixedEi:
  776|    733|  {
  777|    733|    return _Zfixed.BitIsSet(index);
  778|    733|  }
_ZN9OpenBabel12OBForceField10PrintTypesEv:
  787|  2.03k|  {
  788|  2.03k|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|  2.03k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  2.03k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 2.03k]
  |  |  ------------------
  ------------------
  789|      0|      OBFFLog("\nA T O M   T Y P E S\n\n");
  790|      0|      OBFFLog("IDX\tTYPE\tRING\n");
  791|       |
  792|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  793|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%s\t%s\n", a->GetIdx(), a->GetType(),
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  794|      0|          (a->IsInRing() ? (a->IsAromatic() ? "AR" : "AL") : "NO"));
  ------------------
  |  Branch (794:12): [True: 0, False: 0]
  |  Branch (794:29): [True: 0, False: 0]
  ------------------
  795|      0|        OBFFLog(_logbuf);
  796|      0|      }
  797|      0|    }
  798|  2.03k|  }
_ZN9OpenBabel12OBForceField18PrintFormalChargesEv:
  801|  2.03k|  {
  802|  2.03k|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|  2.03k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  2.03k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 2.03k]
  |  |  ------------------
  ------------------
  803|      0|      OBFFLog("\nF O R M A L   C H A R G E S\n\n");
  804|      0|      OBFFLog("IDX\tCHARGE\n");
  805|       |
  806|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  807|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%f\n", a->GetIdx(), a->GetPartialCharge());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  808|      0|        OBFFLog(_logbuf);
  809|      0|      }
  810|      0|    }
  811|  2.03k|  }
_ZN9OpenBabel12OBForceField19PrintPartialChargesEv:
  814|  2.03k|  {
  815|  2.03k|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|  2.03k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  2.03k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 2.03k]
  |  |  ------------------
  ------------------
  816|      0|      OBFFLog("\nP A R T I A L   C H A R G E S\n\n");
  817|      0|      OBFFLog("IDX\tCHARGE\n");
  818|       |
  819|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  820|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%f\n", a->GetIdx(), a->GetPartialCharge());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  821|      0|        OBFFLog(_logbuf);
  822|      0|      }
  823|      0|    }
  824|  2.03k|  }
_ZN9OpenBabel12OBForceField5SetupERNS_5OBMolE:
  857|  7.77k|  {
  858|  7.77k|    if (!_init) {
  ------------------
  |  Branch (858:9): [True: 4, False: 7.77k]
  ------------------
  859|      4|      ParseParamFile();
  860|      4|      _init = true;
  861|      4|      _velocityPtr = nullptr;
  862|      4|      _gradientPtr = nullptr;
  863|      4|      _grad1 = nullptr;
  864|      4|    }
  865|       |
  866|  7.77k|    if (IsSetupNeeded(mol)) {
  ------------------
  |  Branch (866:9): [True: 7.52k, False: 253]
  ------------------
  867|  7.52k|      _mol = mol;
  868|  7.52k|      _ncoords = _mol.NumAtoms() * 3;
  869|       |
  870|  7.52k|      delete [] _velocityPtr;
  871|  7.52k|      _velocityPtr = nullptr;
  872|       |
  873|  7.52k|      delete [] _gradientPtr;
  874|  7.52k|      _gradientPtr = new double[_ncoords];
  875|       |
  876|  7.52k|      if (_mol.NumAtoms() && _constraints.Size())
  ------------------
  |  Branch (876:11): [True: 7.48k, False: 41]
  |  Branch (876:30): [True: 0, False: 7.48k]
  ------------------
  877|      0|        _constraints.Setup(_mol);
  878|       |
  879|  7.52k|      _mol.SetSSSRPerceived(false);
  880|  7.52k|      _mol.DeleteData(OBGenericDataType::TorsionData); // bug #1954233
  881|       |
  882|  7.52k|      if (!SetTypes()) {
  ------------------
  |  Branch (882:11): [True: 5.52k, False: 2.00k]
  ------------------
  883|  5.52k|        _validSetup = false;
  884|  5.52k|        return false;
  885|  5.52k|      }
  886|       |
  887|  2.00k|      SetFormalCharges();
  888|  2.00k|      SetPartialCharges();
  889|       |
  890|  2.00k|      if (!SetupCalculations()) {
  ------------------
  |  Branch (890:11): [True: 1.66k, False: 338]
  ------------------
  891|  1.66k|        _validSetup = false;
  892|  1.66k|        return false;
  893|  1.66k|      }
  894|       |
  895|  2.00k|    } else {
  896|    253|      if (_validSetup) {
  ------------------
  |  Branch (896:11): [True: 35, False: 218]
  ------------------
  897|     35|        PrintTypes();
  898|     35|        PrintFormalCharges();
  899|     35|        PrintPartialCharges();
  900|     35|        SetCoordinates(mol);
  901|     35|        return true;
  902|    218|      } else {
  903|    218|        return false;
  904|    218|      }
  905|    253|    }
  906|       |
  907|    338|    _validSetup = true;
  908|    338|    return true;
  909|  7.77k|  }
_ZN9OpenBabel12OBForceField13IsSetupNeededERNS_5OBMolE:
  984|  7.77k|  {
  985|  7.77k|    if (_mol.NumAtoms() != mol.NumAtoms())
  ------------------
  |  Branch (985:9): [True: 6.58k, False: 1.18k]
  ------------------
  986|  6.58k|      return true;
  987|       |
  988|  1.18k|    if (_mol.NumBonds() != mol.NumBonds())
  ------------------
  |  Branch (988:9): [True: 189, False: 1.00k]
  ------------------
  989|    189|      return true;
  990|       |
  991|  4.96k|    FOR_ATOMS_OF_MOL (atom, _mol) {
  ------------------
  |  |  417|  1.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 4.96k, False: 259]
  |  |  ------------------
  ------------------
  992|       |      // if we have Fe or Cu the atom type depends on the formal
  993|       |      // charge, so a new setup must be forced anyway
  994|  4.96k|      if (atom->GetAtomicNum() == 26 || atom->GetAtomicNum() == 29)
  ------------------
  |  Branch (994:11): [True: 9, False: 4.95k]
  |  Branch (994:41): [True: 18, False: 4.93k]
  ------------------
  995|     27|        return true;
  996|  4.93k|      if (atom->GetAtomicNum() != (mol.GetAtom(atom->GetIdx()))->GetAtomicNum())
  ------------------
  |  Branch (996:11): [True: 697, False: 4.23k]
  ------------------
  997|    697|        return true;
  998|  4.23k|      if (atom->GetExplicitDegree() != (mol.GetAtom(atom->GetIdx()))->GetExplicitDegree())
  ------------------
  |  Branch (998:11): [True: 17, False: 4.22k]
  ------------------
  999|     17|        return true;
 1000|  4.23k|    }
 1001|  1.68k|    FOR_BONDS_OF_MOL (bond, _mol) {
  ------------------
  |  |  418|    259|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 1.68k, False: 253]
  |  |  ------------------
  ------------------
 1002|  1.68k|      if (bond->GetBondOrder() != (mol.GetBond(bond->GetIdx()))->GetBondOrder())
  ------------------
  |  Branch (1002:11): [True: 3, False: 1.68k]
  ------------------
 1003|      3|        return true;
 1004|  1.68k|      if (bond->GetBeginAtom()->GetAtomicNum()
  ------------------
  |  Branch (1004:11): [True: 2, False: 1.68k]
  ------------------
 1005|  1.68k|          != (mol.GetBond(bond->GetIdx()))->GetBeginAtom()->GetAtomicNum()
 1006|  1.68k|          || bond->GetEndAtom()->GetAtomicNum()
  ------------------
  |  Branch (1006:14): [True: 1, False: 1.68k]
  ------------------
 1007|  1.68k|          != (mol.GetBond(bond->GetIdx()))->GetEndAtom()->GetAtomicNum())
 1008|      3|        return true;
 1009|  1.68k|    }
 1010|       |
 1011|    253|    return false;
 1012|    259|  }
_ZN9OpenBabel12OBForceField14SetCoordinatesERNS_5OBMolE:
 1133|     35|  {
 1134|     35|    OBAtom *atom;
 1135|       |
 1136|     35|    if (_mol.NumAtoms() != mol.NumAtoms())
  ------------------
  |  Branch (1136:9): [True: 0, False: 35]
  ------------------
 1137|      0|      return false;
 1138|       |
 1139|       |    // Copy coordinates for current conformer only
 1140|     35|    FOR_ATOMS_OF_MOL (a, mol) {
  ------------------
  |  |  417|     35|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 34, False: 35]
  |  |  ------------------
  ------------------
 1141|     34|      atom = _mol.GetAtom(a->GetIdx());
 1142|     34|      atom->SetVector(a->GetVector());
 1143|     34|    }
 1144|       |
 1145|     35|    return true;
 1146|     35|  }
_ZN9OpenBabel12OBForceField9HasGroupsEv:
 2349|  1.66k|  {
 2350|  1.66k|    if (!_intraGroup.empty())
  ------------------
  |  Branch (2350:9): [True: 0, False: 1.66k]
  ------------------
 2351|      0|      return true;
 2352|       |
 2353|  1.66k|    if (!_interGroup.empty())
  ------------------
  |  Branch (2353:9): [True: 0, False: 1.66k]
  ------------------
 2354|      0|      return true;
 2355|       |
 2356|  1.66k|    if (!_interGroups.empty())
  ------------------
  |  Branch (2356:9): [True: 0, False: 1.66k]
  ------------------
 2357|      0|      return true;
 2358|       |
 2359|  1.66k|    return false;
 2360|  1.66k|  }
_ZN9OpenBabel12OBForceField20Newton2NumLineSearchEPd:
 2457|    877|  {
 2458|    877|    double e_n1, e_n2, e_n3;
 2459|    877|    double *origCoords = new double [_ncoords];
 2460|       |
 2461|    877|    double opt_step = 0.0;
 2462|    877|    double opt_e = _e_n1; // get energy calculated by sd or cg
 2463|    877|    const double def_step = 0.025; // default step
 2464|    877|    const double max_step = 4.5; // don't go too far
 2465|       |
 2466|       |    // Sanitize once so downstream loops can run without per-element branches
 2467|  3.07k|    for (unsigned int c = 0; c < _ncoords; ++c) {
  ------------------
  |  Branch (2467:30): [True: 2.19k, False: 877]
  ------------------
 2468|  2.19k|      if (!isfinite(direction[c]))
  ------------------
  |  Branch (2468:11): [True: 0, False: 2.19k]
  ------------------
 2469|      0|        direction[c] = 0.0;
 2470|  2.19k|    }
 2471|    877|    double sum = 0.0;
 2472|  3.07k|    for (unsigned int c = 0; c < _ncoords; ++c)
  ------------------
  |  Branch (2472:30): [True: 2.19k, False: 877]
  ------------------
 2473|  2.19k|      sum += direction[c] * direction[c];
 2474|       |
 2475|    877|    double scale = sqrt(sum);
 2476|    877|    if (fabs(scale) < 2e-6) {
  ------------------
  |  Branch (2476:9): [True: 877, False: 0]
  ------------------
 2477|       |      //      cout << "WARNING: too small \"scale\" at Newton2NumLineSearch" << endl;
 2478|    877|      scale = 1.0e-70; // try to avoid "division by zero" conditions
 2479|    877|    }
 2480|       |
 2481|    877|    double step = def_step / scale;
 2482|    877|    double max_scl = max_step / scale;
 2483|       |
 2484|       |    // Save the current position, before we take a step
 2485|    877|    memcpy((char*)origCoords,(char*)_mol.GetCoordinates(),sizeof(double)*_ncoords);
 2486|       |
 2487|    877|    int newton = 0;
 2488|    877|    while (true) {
  ------------------
  |  Branch (2488:12): [True: 877, Folded]
  ------------------
 2489|       |      // Take step X(n) + step
 2490|    877|      LineSearchTakeStep(origCoords, direction, step);
 2491|    877|      e_n1 = Energy(false) + _constraints.GetConstraintEnergy();
 2492|       |
 2493|    877|      if (e_n1 < opt_e) {
  ------------------
  |  Branch (2493:11): [True: 0, False: 877]
  ------------------
 2494|      0|        opt_step = step;
 2495|      0|        opt_e = e_n1;
 2496|      0|      }
 2497|       |
 2498|    877|      if (newton++ > 3)
  ------------------
  |  Branch (2498:11): [True: 0, False: 877]
  ------------------
 2499|      0|        break;
 2500|    877|      double delta = step * 0.001;
 2501|       |
 2502|       |      // Take step X(n) + step + delta
 2503|    877|      LineSearchTakeStep(origCoords, direction, step+delta);
 2504|    877|      e_n2 = Energy(false) + _constraints.GetConstraintEnergy();
 2505|       |
 2506|       |      // Take step X(n) + step + delta * 2.0
 2507|    877|      LineSearchTakeStep(origCoords, direction, step+delta*2.0);
 2508|    877|      e_n3 = Energy(false) + _constraints.GetConstraintEnergy();
 2509|       |
 2510|    877|      double denom = e_n3 - 2.0 * e_n2 + e_n1; // f'(x)
 2511|    877|      if (denom != 0.0) {
  ------------------
  |  Branch (2511:11): [True: 0, False: 877]
  ------------------
 2512|      0|        step = fabs(step - delta * (e_n2 - e_n1) / denom);
 2513|      0|        if (step > max_scl) {
  ------------------
  |  Branch (2513:13): [True: 0, False: 0]
  ------------------
 2514|       |          //          cout << "WARNING: damped steplength " << step << " to " << max_scl << endl;
 2515|      0|          step = max_scl;
 2516|      0|        }
 2517|    877|      } else {
 2518|    877|        break;
 2519|    877|      }
 2520|    877|    }
 2521|       |
 2522|    877|    if (opt_step == 0.0) { // if we still don't have any valid steplength, try a very small step
  ------------------
  |  Branch (2522:9): [True: 877, False: 0]
  ------------------
 2523|    877|      step = 0.001 * def_step / scale;
 2524|       |
 2525|       |      // Take step X(n) + step
 2526|    877|      LineSearchTakeStep(origCoords, direction, step);
 2527|    877|      e_n1 = Energy(false) + _constraints.GetConstraintEnergy();
 2528|       |
 2529|    877|      if (e_n1 < opt_e) {
  ------------------
  |  Branch (2529:11): [True: 0, False: 877]
  ------------------
 2530|      0|        opt_step = step;
 2531|      0|        opt_e = e_n1;
 2532|      0|      }
 2533|       |
 2534|    877|    }
 2535|       |
 2536|       |    // Take optimal step
 2537|    877|    LineSearchTakeStep(origCoords, direction, opt_step);
 2538|       |
 2539|       |    //    cout << " scale: " << scale << " step: " << opt_step*scale << " maxstep " << max_scl*scale << endl;
 2540|       |
 2541|    877|    delete [] origCoords;
 2542|       |
 2543|    877|    return opt_step * scale;
 2544|    877|  }
_ZN9OpenBabel12OBForceField18LineSearchTakeStepEPdS1_d:
 2547|  4.38k|  {
 2548|  4.38k|    double *currentCoords = _mol.GetCoordinates();
 2549|       |
 2550|  15.3k|    for (unsigned int c = 0; c < _ncoords; ++c)
  ------------------
  |  Branch (2550:30): [True: 10.9k, False: 4.38k]
  ------------------
 2551|  10.9k|      currentCoords[c] = origCoords[c] + direction[c] * step;
 2552|  4.38k|  }
_ZN9OpenBabel12OBForceField25SteepestDescentInitializeEidi:
 2792|    267|  {
 2793|    267|    if (!_validSetup)
  ------------------
  |  Branch (2793:9): [True: 0, False: 267]
  ------------------
 2794|      0|      return;
 2795|       |
 2796|    267|    _nsteps = steps;
 2797|    267|    _cstep = 0;
 2798|    267|    _econv = econv;
 2799|    267|    _gconv = 1.0e-2; // gradient convergence (0.1) squared
 2800|       |
 2801|    267|    if (_cutoff)
  ------------------
  |  Branch (2801:9): [True: 0, False: 267]
  ------------------
 2802|      0|      UpdatePairsSimple(); // Update the non-bonded pairs (Cut-off)
 2803|       |
 2804|    267|    _e_n1 = Energy() + _constraints.GetConstraintEnergy();
 2805|       |
 2806|    267|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|    267|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    267|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 267]
  |  |  ------------------
  ------------------
 2807|      0|      OBFFLog("\nS T E E P E S T   D E S C E N T\n\n");
 2808|      0|      snprintf(_logbuf, BUFF_SIZE, "STEPS = %d\n\n",  steps);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2809|      0|      OBFFLog(_logbuf);
 2810|      0|      OBFFLog("STEP n       E(n)         E(n-1)    \n");
 2811|      0|      OBFFLog("------------------------------------\n");
 2812|      0|      snprintf(_logbuf, BUFF_SIZE, " %4d    %8.3f      ----\n", _cstep, _e_n1);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2813|      0|      OBFFLog(_logbuf);
 2814|      0|    }
 2815|       |
 2816|    267|  }
_ZN9OpenBabel12OBForceField25SteepestDescentTakeNStepsEi:
 2819|    267|  {
 2820|    267|    if (!_validSetup)
  ------------------
  |  Branch (2820:9): [True: 0, False: 267]
  ------------------
 2821|      0|      return 0;
 2822|       |
 2823|    267|    _ncoords = _mol.NumAtoms() * 3;
 2824|    267|    double e_n2;
 2825|    267|    vector3 dir;
 2826|    267|    double maxgrad; // for convergence
 2827|       |
 2828|    323|    for (int i = 1; i <= n; i++) {
  ------------------
  |  Branch (2828:21): [True: 323, False: 0]
  ------------------
 2829|    323|      _cstep++;
 2830|    323|      maxgrad = 1.0e20;
 2831|       |
 2832|    323|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|    323|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 256, False: 323]
  |  |  ------------------
  ------------------
 2833|    256|        unsigned int idx = a->GetIdx();
 2834|    256|        unsigned int coordIdx = (idx - 1) * 3;
 2835|       |
 2836|    256|        if (_constraints.IsFixed(idx) || (_fixAtom == idx) || (_ignoreAtom == idx)) {
  ------------------
  |  Branch (2836:13): [True: 0, False: 256]
  |  Branch (2836:42): [True: 0, False: 256]
  |  Branch (2836:63): [True: 0, False: 256]
  ------------------
 2837|      0|          _gradientPtr[coordIdx] = 0.0;
 2838|      0|          _gradientPtr[coordIdx+1] = 0.0;
 2839|      0|          _gradientPtr[coordIdx+2] = 0.0;
 2840|    256|        } else {
 2841|    256|          if (!HasAnalyticalGradients()) {
  ------------------
  |  Branch (2841:15): [True: 0, False: 256]
  ------------------
 2842|       |            // use numerical gradients
 2843|      0|            dir = NumericalDerivative(&*a) + _constraints.GetGradient(a->GetIdx());
 2844|    256|          } else {
 2845|       |            // use analytical gradients
 2846|    256|            dir = GetGradient(&*a) + _constraints.GetGradient(a->GetIdx());
 2847|    256|          }
 2848|       |
 2849|       |          // check to see how large the gradients are
 2850|    256|          if (dir.length_2() < maxgrad)
  ------------------
  |  Branch (2850:15): [True: 256, False: 0]
  ------------------
 2851|    256|            maxgrad = dir.length_2();
 2852|       |
 2853|    256|          if (!_constraints.IsXFixed(idx))
  ------------------
  |  Branch (2853:15): [True: 256, False: 0]
  ------------------
 2854|    256|            _gradientPtr[coordIdx] = dir.x();
 2855|      0|          else
 2856|      0|            _gradientPtr[coordIdx] = 0.0;
 2857|       |
 2858|    256|          if (!_constraints.IsYFixed(idx))
  ------------------
  |  Branch (2858:15): [True: 256, False: 0]
  ------------------
 2859|    256|            _gradientPtr[coordIdx+1] = dir.y();
 2860|      0|          else
 2861|      0|            _gradientPtr[coordIdx+1] = 0.0;
 2862|       |
 2863|    256|          if (!_constraints.IsZFixed(idx))
  ------------------
  |  Branch (2863:15): [True: 256, False: 0]
  ------------------
 2864|    256|            _gradientPtr[coordIdx+2] = dir.z();
 2865|      0|          else
 2866|      0|            _gradientPtr[coordIdx+2] = 0.0;
 2867|    256|        }
 2868|    256|      }
 2869|       |      // perform a linesearch
 2870|    323|      switch (_linesearch) {
 2871|    323|      case LineSearchType::Newton2Num:
  ------------------
  |  Branch (2871:7): [True: 323, False: 0]
  ------------------
 2872|    323|        Newton2NumLineSearch(_gradientPtr);
 2873|    323|        break;
 2874|      0|      default:
  ------------------
  |  Branch (2874:7): [True: 0, False: 323]
  ------------------
 2875|      0|      case LineSearchType::Simple:
  ------------------
  |  Branch (2875:7): [True: 0, False: 323]
  ------------------
 2876|      0|        LineSearch(_mol.GetCoordinates(), _gradientPtr);
 2877|      0|        break;
 2878|    323|      }
 2879|    323|      e_n2 = Energy() + _constraints.GetConstraintEnergy();
 2880|       |
 2881|    323|      if ((_cstep % _pairfreq == 0) && _cutoff)
  ------------------
  |  Branch (2881:11): [True: 0, False: 323]
  |  Branch (2881:40): [True: 0, False: 0]
  ------------------
 2882|      0|        UpdatePairsSimple(); // Update the non-bonded pairs (Cut-off)
 2883|       |
 2884|    323|      IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|    323|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    323|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 323]
  |  |  ------------------
  ------------------
 2885|      0|        if (_cstep % 10 == 0) {
  ------------------
  |  Branch (2885:13): [True: 0, False: 0]
  ------------------
 2886|      0|          snprintf(_logbuf, BUFF_SIZE, " %4d    %8.5f    %8.5f\n", _cstep, e_n2, _e_n1);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2887|      0|          OBFFLog(_logbuf);
 2888|      0|        }
 2889|      0|      }
 2890|       |
 2891|    323|      if (fabs(e_n2 - _e_n1) < _econv
  ------------------
  |  Branch (2891:11): [True: 323, False: 0]
  ------------------
 2892|    323|          && (maxgrad < _gconv)) { // gradient criteria (0.1) squared
  ------------------
  |  Branch (2892:14): [True: 256, False: 67]
  ------------------
 2893|    256|        IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    256|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    256|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 256]
  |  |  ------------------
  ------------------
 2894|      0|          OBFFLog("    STEEPEST DESCENT HAS CONVERGED\n");
 2895|    256|        return false;
 2896|    256|      }
 2897|       |
 2898|     67|      if (_nsteps == _cstep) {
  ------------------
  |  Branch (2898:11): [True: 11, False: 56]
  ------------------
 2899|     11|        return false;
 2900|     11|      }
 2901|       |
 2902|     56|      _e_n1 = e_n2;
 2903|     56|    }
 2904|       |
 2905|      0|    return true;  // no convergence reached
 2906|    267|  }
_ZN9OpenBabel12OBForceField15SteepestDescentEidi:
 2909|    267|  {
 2910|    267|    if (steps > 0) {
  ------------------
  |  Branch (2910:9): [True: 267, False: 0]
  ------------------
 2911|    267|      SteepestDescentInitialize(steps, econv, method);
 2912|    267|      SteepestDescentTakeNSteps(steps);
 2913|    267|    }
 2914|    267|  }
_ZN9OpenBabel12OBForceField28ConjugateGradientsInitializeEidi:
 2918|    267|  {
 2919|    267|    if (!_validSetup || steps==0)
  ------------------
  |  Branch (2919:9): [True: 0, False: 267]
  |  Branch (2919:25): [True: 0, False: 267]
  ------------------
 2920|      0|      return;
 2921|       |
 2922|    267|    double e_n2;
 2923|    267|    vector3 dir;
 2924|       |
 2925|    267|    _cstep = 0;
 2926|    267|    _nsteps = steps;
 2927|    267|    _econv = econv;
 2928|    267|    _gconv = 1.0e-2; // gradient convergence (0.1) squared
 2929|    267|    _ncoords = _mol.NumAtoms() * 3;
 2930|       |
 2931|    267|    if (_cutoff)
  ------------------
  |  Branch (2931:9): [True: 0, False: 267]
  ------------------
 2932|      0|      UpdatePairsSimple(); // Update the non-bonded pairs (Cut-off)
 2933|       |
 2934|    267|    _e_n1 = Energy() + _constraints.GetConstraintEnergy();
 2935|       |
 2936|    267|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|    267|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    267|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 267]
  |  |  ------------------
  ------------------
 2937|      0|      OBFFLog("\nC O N J U G A T E   G R A D I E N T S\n\n");
 2938|      0|      snprintf(_logbuf, BUFF_SIZE, "STEPS = %d\n\n",  steps);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2939|      0|      OBFFLog(_logbuf);
 2940|      0|      OBFFLog("STEP n     E(n)       E(n-1)    \n");
 2941|      0|      OBFFLog("--------------------------------\n");
 2942|      0|    }
 2943|       |
 2944|    267|    delete [] _grad1;
 2945|    267|    _grad1 = new double[_ncoords];
 2946|    267|    memset(_grad1, '\0', sizeof(double)*_ncoords);
 2947|       |
 2948|       |    // Take the first step (same as steepest descent because there is no
 2949|       |    // gradient from the previous step.
 2950|    267|    FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|    267|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 256, False: 267]
  |  |  ------------------
  ------------------
 2951|    256|      unsigned int idx = a->GetIdx();
 2952|    256|      unsigned int coordIdx = (idx - 1) * 3;
 2953|       |
 2954|    256|      if (_constraints.IsFixed(idx) || (_fixAtom == idx) || (_ignoreAtom == idx)) {
  ------------------
  |  Branch (2954:11): [True: 0, False: 256]
  |  Branch (2954:40): [True: 0, False: 256]
  |  Branch (2954:61): [True: 0, False: 256]
  ------------------
 2955|      0|        _gradientPtr[coordIdx] = 0.0;
 2956|      0|        _gradientPtr[coordIdx+1] = 0.0;
 2957|      0|        _gradientPtr[coordIdx+2] = 0.0;
 2958|    256|      } else {
 2959|    256|        if (!HasAnalyticalGradients()) {
  ------------------
  |  Branch (2959:13): [True: 0, False: 256]
  ------------------
 2960|       |          // use numerical gradients
 2961|      0|          dir = NumericalDerivative(&*a) + _constraints.GetGradient(a->GetIdx());
 2962|    256|        } else {
 2963|       |          // use analytical gradients
 2964|    256|          dir = GetGradient(&*a) + _constraints.GetGradient(a->GetIdx());
 2965|    256|        }
 2966|       |
 2967|    256|        if (!_constraints.IsXFixed(idx))
  ------------------
  |  Branch (2967:13): [True: 256, False: 0]
  ------------------
 2968|    256|          _gradientPtr[coordIdx] = dir.x();
 2969|      0|        else
 2970|      0|          _gradientPtr[coordIdx] = 0.0;
 2971|       |
 2972|    256|        if (!_constraints.IsYFixed(idx))
  ------------------
  |  Branch (2972:13): [True: 256, False: 0]
  ------------------
 2973|    256|          _gradientPtr[coordIdx+1] = dir.y();
 2974|      0|        else
 2975|      0|          _gradientPtr[coordIdx+1] = 0.0;
 2976|       |
 2977|    256|        if (!_constraints.IsZFixed(idx))
  ------------------
  |  Branch (2977:13): [True: 256, False: 0]
  ------------------
 2978|    256|          _gradientPtr[coordIdx+2] = dir.z();
 2979|      0|        else
 2980|      0|          _gradientPtr[coordIdx+2] = 0.0;
 2981|    256|      }
 2982|    256|    }
 2983|       |    // perform a linesearch
 2984|    267|    switch (_linesearch) {
 2985|    267|    case LineSearchType::Newton2Num:
  ------------------
  |  Branch (2985:5): [True: 267, False: 0]
  ------------------
 2986|    267|      Newton2NumLineSearch(_gradientPtr);
 2987|    267|      break;
 2988|      0|    default:
  ------------------
  |  Branch (2988:5): [True: 0, False: 267]
  ------------------
 2989|      0|    case LineSearchType::Simple:
  ------------------
  |  Branch (2989:5): [True: 0, False: 267]
  ------------------
 2990|      0|      LineSearch(_mol.GetCoordinates(), _gradientPtr);
 2991|      0|      break;
 2992|    267|    }
 2993|    267|    e_n2 = Energy() + _constraints.GetConstraintEnergy();
 2994|       |
 2995|    267|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|    267|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    267|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 267]
  |  |  ------------------
  ------------------
 2996|      0|      snprintf(_logbuf, BUFF_SIZE, " %4d    %8.3f    %8.3f\n", 1, e_n2, _e_n1);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2997|      0|      OBFFLog(_logbuf);
 2998|      0|    }
 2999|       |
 3000|       |    // save the direction and energy
 3001|    267|    memcpy(_grad1, _gradientPtr, sizeof(double)*_ncoords);
 3002|    267|    _e_n1 = e_n2;
 3003|    267|  }
_ZN9OpenBabel12OBForceField28ConjugateGradientsTakeNStepsEi:
 3006|    231|  {
 3007|    231|    if (!_validSetup)
  ------------------
  |  Branch (3007:9): [True: 0, False: 231]
  ------------------
 3008|      0|      return 0;
 3009|       |
 3010|    231|    double e_n2;
 3011|    231|    double g2g2, g1g1, beta;
 3012|    231|    vector3 grad2, dir2;
 3013|    231|    vector3 grad1, dir1; // temporaries to perform dot product, etc.
 3014|    231|    double maxgrad; // for convergence
 3015|       |
 3016|    231|    if (_ncoords != _mol.NumAtoms() * 3)
  ------------------
  |  Branch (3016:9): [True: 0, False: 231]
  ------------------
 3017|      0|      return false;
 3018|       |
 3019|    231|    e_n2 = 0.0;
 3020|       |
 3021|    287|    for (int i = 1; i <= n; i++) {
  ------------------
  |  Branch (3021:21): [True: 287, False: 0]
  ------------------
 3022|    287|      _cstep++;
 3023|    287|      maxgrad = 1.0e20;
 3024|       |
 3025|    287|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|    287|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 221, False: 287]
  |  |  ------------------
  ------------------
 3026|    221|        unsigned int idx = a->GetIdx();
 3027|    221|        unsigned int coordIdx = (a->GetIdx() - 1) * 3;
 3028|       |
 3029|    221|        if (_constraints.IsFixed(idx) || (_fixAtom == idx) || (_ignoreAtom == idx)) {
  ------------------
  |  Branch (3029:13): [True: 0, False: 221]
  |  Branch (3029:42): [True: 0, False: 221]
  |  Branch (3029:63): [True: 0, False: 221]
  ------------------
 3030|      0|          _grad1[coordIdx] = 0.0;
 3031|      0|          _grad1[coordIdx+1] = 0.0;
 3032|      0|          _grad1[coordIdx+2] = 0.0;
 3033|    221|        } else {
 3034|    221|          if (!HasAnalyticalGradients()) {
  ------------------
  |  Branch (3034:15): [True: 0, False: 221]
  ------------------
 3035|       |            // use numerical gradients
 3036|      0|            grad2 = NumericalDerivative(&*a) + _constraints.GetGradient(a->GetIdx());
 3037|    221|          } else {
 3038|       |            // use analytical gradients
 3039|    221|            grad2 = GetGradient(&*a) + _constraints.GetGradient(a->GetIdx());
 3040|    221|          }
 3041|       |
 3042|       |          // Fletcher-Reeves formula for Beta
 3043|       |          // http://en.wikipedia.org/wiki/Nonlinear_conjugate_gradient_method
 3044|       |          // NOTE: We make sure to reset and use the steepest descent direction
 3045|       |          //   after NumAtoms steps
 3046|    221|          if (_cstep % _mol.NumAtoms() != 0) {
  ------------------
  |  Branch (3046:15): [True: 0, False: 221]
  ------------------
 3047|      0|            g2g2 = dot(grad2, grad2);
 3048|      0|            grad1 = vector3(_grad1[coordIdx], _grad1[coordIdx+1], _grad1[coordIdx+2]);
 3049|      0|            g1g1 = dot(grad1, grad1);
 3050|      0|            beta = g2g2 / g1g1;
 3051|      0|            grad2 += beta * grad1;
 3052|      0|          }
 3053|       |
 3054|       |          // check to see how large the gradients are
 3055|    221|          if (grad2.length_2() < maxgrad)
  ------------------
  |  Branch (3055:15): [True: 221, False: 0]
  ------------------
 3056|    221|            maxgrad = grad2.length_2();
 3057|       |
 3058|    221|          if (!_constraints.IsXFixed(idx))
  ------------------
  |  Branch (3058:15): [True: 221, False: 0]
  ------------------
 3059|    221|            _grad1[coordIdx] = grad2.x();
 3060|      0|          else
 3061|      0|            _grad1[coordIdx] = 0.0;
 3062|       |
 3063|    221|          if (!_constraints.IsYFixed(idx))
  ------------------
  |  Branch (3063:15): [True: 221, False: 0]
  ------------------
 3064|    221|            _grad1[coordIdx+1] = grad2.y();
 3065|      0|          else
 3066|      0|            _grad1[coordIdx+1] = 0.0;
 3067|       |
 3068|    221|          if (!_constraints.IsZFixed(idx))
  ------------------
  |  Branch (3068:15): [True: 221, False: 0]
  ------------------
 3069|    221|            _grad1[coordIdx+2] = grad2.z();
 3070|      0|          else
 3071|      0|            _grad1[coordIdx+2] = 0.0;
 3072|    221|        }
 3073|    221|      }
 3074|       |      // perform a linesearch
 3075|    287|      switch (_linesearch) {
 3076|    287|      case LineSearchType::Newton2Num:
  ------------------
  |  Branch (3076:7): [True: 287, False: 0]
  ------------------
 3077|    287|        Newton2NumLineSearch(_grad1);
 3078|    287|        break;
 3079|      0|      default:
  ------------------
  |  Branch (3079:7): [True: 0, False: 287]
  ------------------
 3080|      0|      case LineSearchType::Simple:
  ------------------
  |  Branch (3080:7): [True: 0, False: 287]
  ------------------
 3081|      0|        LineSearch(_mol.GetCoordinates(), _grad1);
 3082|      0|        break;
 3083|    287|      }
 3084|       |      // save the direction
 3085|    287|      memcpy(_gradientPtr, _grad1, sizeof(double)*_ncoords);
 3086|       |
 3087|    287|      e_n2 = Energy() + _constraints.GetConstraintEnergy();
 3088|       |
 3089|    287|      if ((_cstep % _pairfreq == 0) && _cutoff)
  ------------------
  |  Branch (3089:11): [True: 0, False: 287]
  |  Branch (3089:40): [True: 0, False: 0]
  ------------------
 3090|      0|        UpdatePairsSimple(); // Update the non-bonded pairs (Cut-off)
 3091|       |
 3092|    287|      if (fabs(e_n2 - _e_n1) < _econv
  ------------------
  |  Branch (3092:11): [True: 287, False: 0]
  ------------------
 3093|    287|          && (maxgrad < _gconv)) { // gradient criteria (0.1) squared
  ------------------
  |  Branch (3093:14): [True: 221, False: 66]
  ------------------
 3094|    221|        IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|    221|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    221|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 221]
  |  |  ------------------
  ------------------
 3095|      0|          snprintf(_logbuf, BUFF_SIZE, " %4d    %8.3f    %8.3f\n", _cstep, e_n2, _e_n1);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 3096|      0|          OBFFLog(_logbuf);
 3097|      0|          OBFFLog("    CONJUGATE GRADIENTS HAS CONVERGED\n");
 3098|      0|        }
 3099|    221|        return false;
 3100|    221|      }
 3101|       |
 3102|     66|      IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|     66|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|     66|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 66]
  |  |  ------------------
  ------------------
 3103|      0|        if (_cstep % 10 == 0) {
  ------------------
  |  Branch (3103:13): [True: 0, False: 0]
  ------------------
 3104|      0|          snprintf(_logbuf, BUFF_SIZE, " %4d    %8.3f    %8.3f\n", _cstep, e_n2, _e_n1);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 3105|      0|          OBFFLog(_logbuf);
 3106|      0|        }
 3107|      0|      }
 3108|       |
 3109|     66|      if (_nsteps == _cstep)
  ------------------
  |  Branch (3109:11): [True: 10, False: 56]
  ------------------
 3110|     10|        return false;
 3111|       |
 3112|     56|      _e_n1 = e_n2;
 3113|     56|    }
 3114|       |
 3115|      0|    return true; // no convergence reached
 3116|    231|  }
_ZN9OpenBabel12OBForceField18ConjugateGradientsEidi:
 3119|    267|  {
 3120|    267|    ConjugateGradientsInitialize(steps, econv, method);
 3121|    267|    if (steps > 1) // ConjugateGradientsInitialize takes the first step
  ------------------
  |  Branch (3121:9): [True: 231, False: 36]
  ------------------
 3122|    231|      ConjugateGradientsTakeNSteps(steps);
 3123|    267|  }
_ZN9OpenBabel12OBForceField12IsInSameRingEPNS_6OBAtomES2_:
 4634|  1.95k|  {
 4635|  1.95k|    bool a_in, b_in;
 4636|  1.95k|    vector<OBRing*> vr;
 4637|  1.95k|    vr = _mol.GetSSSR();
 4638|       |
 4639|  1.95k|    vector<OBRing*>::iterator i;
 4640|  1.95k|    vector<int>::iterator j;
 4641|       |
 4642|  11.3k|    for (i = vr.begin();i != vr.end();++i) {
  ------------------
  |  Branch (4642:25): [True: 11.3k, False: 52]
  ------------------
 4643|  11.3k|      a_in = false;
 4644|  11.3k|      b_in = false;
 4645|  57.1k|      for(j = (*i)->_path.begin();j != (*i)->_path.end();++j) {
  ------------------
  |  Branch (4645:35): [True: 45.8k, False: 11.3k]
  ------------------
 4646|  45.8k|        if ((unsigned)(*j) == a->GetIdx())
  ------------------
  |  Branch (4646:13): [True: 2.27k, False: 43.5k]
  ------------------
 4647|  2.27k|          a_in = true;
 4648|  45.8k|        if ((unsigned)(*j) == b->GetIdx())
  ------------------
  |  Branch (4648:13): [True: 2.26k, False: 43.5k]
  ------------------
 4649|  2.26k|          b_in = true;
 4650|  45.8k|      }
 4651|       |
 4652|  11.3k|      if (a_in && b_in)
  ------------------
  |  Branch (4652:11): [True: 2.27k, False: 9.06k]
  |  Branch (4652:19): [True: 1.89k, False: 377]
  ------------------
 4653|  1.89k|        return true;
 4654|  11.3k|    }
 4655|       |
 4656|     52|    return false;
 4657|  1.95k|  }

_ZN9OpenBabel16OBForceFieldGaff14ParseParamFileEv:
 1078|      1|  {
 1079|      1|    vector<string> vs;
 1080|      1|    char buffer[BUFF_SIZE];
 1081|       |
 1082|      1|    OBFFParameter parameter;
 1083|       |
 1084|       |    // open data/gaff.dat
 1085|      1|    ifstream ifs;
 1086|      1|    if (OpenDatafile(ifs, "gaff.dat").length() == 0) {
  ------------------
  |  Branch (1086:9): [True: 1, False: 0]
  ------------------
 1087|      1|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open gaff.dat", obError);
 1088|      1|      return false;
 1089|      1|    }
 1090|       |
 1091|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
 1092|      0|    obLocale.SetLocale();
 1093|      0|    ifs.getline(buffer, BUFF_SIZE); //first line title block
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1094|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1095|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 2 (atom mass and polarizability)
  ------------------
  |  Branch (1095:11): [True: 0, False: 0]
  |  Branch (1095:26): [True: 0, False: 0]
  ------------------
 1096|      0|      {
 1097|      0|        tokenize(vs, buffer," -\n\t");
 1098|      0|        parameter.clear();
 1099|      0|        parameter._a = vs[0]; //KNDSYM
 1100|      0|        parameter._dpar.push_back(atof(vs[1].c_str())); // AMASS
 1101|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // ATPOL [A^3]
 1102|      0|        _ffpropparams.push_back(parameter);
 1103|      0|        ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1104|      0|      }
 1105|      0|    ifs.getline(buffer, BUFF_SIZE); //next line (block 3: line contains JSOLTY)
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1106|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1107|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 4 (bonds)
  ------------------
  |  Branch (1107:11): [True: 0, False: 0]
  |  Branch (1107:26): [True: 0, False: 0]
  ------------------
 1108|      0|      {
 1109|      0|        tokenize(vs, buffer," -\n\t");
 1110|      0|        parameter.clear();
 1111|      0|        parameter._a = vs[0]; // IBT
 1112|      0|        parameter._b = vs[1]; // JBT
 1113|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // RK [kcal/mol/(A^2)]
 1114|      0|        parameter._dpar.push_back(atof(vs[3].c_str())); // REQ [A]
 1115|      0|        _ffbondparams.push_back(parameter);
 1116|      0|        ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1117|      0|      }
 1118|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1119|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 5 (angles)
  ------------------
  |  Branch (1119:11): [True: 0, False: 0]
  |  Branch (1119:26): [True: 0, False: 0]
  ------------------
 1120|      0|      {
 1121|      0|        tokenize(vs, buffer," -\n\t");
 1122|      0|        parameter.clear();
 1123|      0|        parameter._a = vs[0]; //ITT
 1124|      0|        parameter._b = vs[1]; //JTT
 1125|      0|        parameter._c = vs[2]; //KTT
 1126|      0|        parameter._dpar.push_back(atof(vs[3].c_str())); // TK [kcal/mol/(rad**2)]
 1127|      0|        parameter._dpar.push_back(atof(vs[4].c_str())); // TEQ [degrees]
 1128|      0|        _ffangleparams.push_back(parameter);
 1129|      0|        ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1130|      0|      }
 1131|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1132|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 6 (dihedrals)
  ------------------
  |  Branch (1132:11): [True: 0, False: 0]
  |  Branch (1132:26): [True: 0, False: 0]
  ------------------
 1133|      0|      {
 1134|       |	// torsional potental (PK/IDIVF) * (1 + cos(PN*phi - GAMMA))
 1135|       |
 1136|      0|        tokenize(vs, buffer," -\n\t");
 1137|      0|        parameter.clear();
 1138|      0|        parameter._a = vs[0]; //IPT
 1139|      0|        parameter._b = vs[1]; //JPT
 1140|      0|        parameter._c = vs[2]; //KPT
 1141|      0|        parameter._d = vs[3]; //LPT
 1142|      0|        parameter._ipar.push_back(atoi(vs[4].c_str())); // IDIVF
 1143|      0|        parameter._dpar.push_back(atof(vs[5].c_str())); // PK
 1144|      0|        parameter._dpar.push_back(atof(vs[6].c_str())); // GAMMA [degrees]
 1145|      0|        parameter._dpar.push_back(atof(vs[7].c_str())); // PN
 1146|      0|        _fftorsionparams.push_back(parameter);
 1147|      0|        ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1148|      0|      }
 1149|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1150|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 7(impropers)
  ------------------
  |  Branch (1150:11): [True: 0, False: 0]
  |  Branch (1150:26): [True: 0, False: 0]
  ------------------
 1151|      0|      {
 1152|       |//         The input is the same as in for the dihedrals except that
 1153|       |// 	   the torsional barrier height is NOT divided by the factor
 1154|       |//         idivf.  The improper torsions are defined between any four
 1155|       |//         atoms not bonded (in a successive fashion) with each other
 1156|       |//         as in the case of "regular" or "proper" dihedrals.  Improper
 1157|       |//         dihedrals are used to keep certain groups planar and to
 1158|       |//         prevent the racemization of certain centers in the united
 1159|       |//         atom model.  Consult the above reference for details.
 1160|       |//         From Townhee help:
 1161|       |// Improper torsions are not automatically generated by the Towhee code as the rules for determining where they are applied are not always straight-forward. Amber param96 exclusively uses the Stereocenter version of the improper torsions, and they are typically centered on an sp2 atom in order to enforce planarity with its three neighbors. Only one improper torsion allowed to be centered on any atom. These torsions are listed in the Amber literature as i-j-k-l where the angle is the dihedral between i-k-l and j-k-l, and the bonding pattern is i, j, and l are all bonded to atom k, and are also not bonded to each other. In the towhee_input file this stereo improper torsion is listed only for atom k, and the atom order there is l, i, j. Remember that you can set the improper type to 0 to have the code automatically determine the improper type (so long as inpstyle is 2).
 1162|       |
 1163|       |
 1164|      0|        tokenize(vs, buffer," -\n\t");
 1165|      0|        parameter.clear();
 1166|      0|        parameter._a = vs[0]; //IPT
 1167|      0|        parameter._b = vs[1]; //JPT
 1168|      0|        parameter._c = vs[2]; //KPT
 1169|      0|        parameter._d = vs[3]; //LPT
 1170|      0|        parameter._dpar.push_back(atof(vs[4].c_str())); // PK
 1171|      0|        parameter._dpar.push_back(atof(vs[5].c_str())); // GAMMA
 1172|      0|        parameter._dpar.push_back(atof(vs[6].c_str())); // PN
 1173|      0|        _ffoopparams.push_back(parameter);
 1174|      0|        ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1175|      0|      }
 1176|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1177|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 8 (10-12 H-BOND)
  ------------------
  |  Branch (1177:11): [True: 0, False: 0]
  |  Branch (1177:26): [True: 0, False: 0]
  ------------------
 1178|      0|      {
 1179|      0|        tokenize(vs, buffer," -\n\t");
 1180|      0|        parameter.clear();
 1181|      0|        parameter._a = vs[0]; // KT1
 1182|      0|        parameter._b = vs[1]; // KT2
 1183|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // A
 1184|      0|        parameter._dpar.push_back(atof(vs[3].c_str())); // B
 1185|      0|        _ffhbondparams.push_back(parameter);
 1186|      0|	    ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1187|      0|      }
 1188|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1189|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 9 (equivalent atoms for vdW potential)
  ------------------
  |  Branch (1189:11): [True: 0, False: 0]
  |  Branch (1189:26): [True: 0, False: 0]
  ------------------
 1190|      0|      {
 1191|       |	    // not used. We assume the types are all listed individually in block 10
 1192|      0|	    ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1193|      0|      }
 1194|      0|    ifs.getline(buffer, BUFF_SIZE); //next line
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1195|      0|    ifs.getline(buffer, BUFF_SIZE); //'RE' means vdW radius and well-depth are read
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1196|      0|    while(!ifs.fail() && strlen(buffer)!=0) //read block 10 (vdWaals)
  ------------------
  |  Branch (1196:11): [True: 0, False: 0]
  |  Branch (1196:26): [True: 0, False: 0]
  ------------------
 1197|      0|      {
 1198|       |        // van der Waals potental EDEP * ( (R/r)^12 - 2*(R/r)^6 )
 1199|      0|        tokenize(vs, buffer," -\n\t");
 1200|      0|        parameter.clear();
 1201|      0|        parameter._a = vs[0]; // IBT
 1202|      0|        parameter._dpar.push_back(atof(vs[1].c_str())); // R
 1203|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // EDEP (kcal/mol)
 1204|      0|        _ffvdwparams.push_back(parameter);
 1205|      0|	    ifs.getline(buffer, BUFF_SIZE);
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1206|      0|      }
 1207|       |
 1208|      0|    if (ifs)
  ------------------
  |  Branch (1208:9): [True: 0, False: 0]
  ------------------
 1209|      0|      ifs.close();
 1210|       |
 1211|       |    // return the locale to the original one
 1212|      0|    obLocale.RestoreLocale();
 1213|       |
 1214|      0|    return 0;
 1215|      1|  }
_ZN9OpenBabel16OBForceFieldGaff8SetTypesEv:
 1218|    939|  {
 1219|    939|    vector<vector<int> > _mlist; //!< match list for atom typing
 1220|    939|    vector<pair<std::unique_ptr<OBSmartsPattern>, string>> _vexttyp; //!< external atom type rules
 1221|    939|    vector<vector<int> >::iterator j;
 1222|    939|    vector<string> vs;
 1223|    939|    char buffer[150];
 1224|    939|    OBAtom *atm, *a, *b;
 1225|    939|    OBBitVec visited;
 1226|    939|    int BO;
 1227|       |
 1228|    939|    SetPartialChargesBeforeAtomTyping();
 1229|    939|    _mol.SetAtomTypesPerceived();
 1230|       |
 1231|       |    // open data/gaff.prm
 1232|    939|    ifstream ifs;
 1233|    939|    if (OpenDatafile(ifs, "gaff.prm").length() == 0) {
  ------------------
  |  Branch (1233:9): [True: 939, False: 0]
  ------------------
 1234|    939|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open gaff.prm", obError);
 1235|    939|      return false;
 1236|    939|    }
 1237|       |
 1238|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
 1239|      0|    obLocale.SetLocale();
 1240|       |
 1241|      0|    while (ifs.getline(buffer, sizeof(buffer))) {
  ------------------
  |  Branch (1241:12): [True: 0, False: 0]
  ------------------
 1242|      0|      if (EQn(buffer, "atom", 4)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1243|      0|      	tokenize(vs, buffer);
 1244|       |
 1245|      0|        auto sp = std::unique_ptr<OBSmartsPattern>(new OBSmartsPattern);
 1246|      0|        if (sp->Init(vs[1]))
  ------------------
  |  Branch (1246:13): [True: 0, False: 0]
  ------------------
 1247|      0|	    _vexttyp.emplace_back(std::move(sp), vs[2]);
 1248|      0|        else {
 1249|      0|          obErrorLog.ThrowError(__FUNCTION__, " Could not parse atom type table from gaff.prm", obInfo);
 1250|      0|          return false;
 1251|      0|        }
 1252|      0|      }
 1253|      0|    }
 1254|       |
 1255|      0|    for (auto i = _vexttyp.begin(); i != _vexttyp.end(); ++i) {
  ------------------
  |  Branch (1255:37): [True: 0, False: 0]
  ------------------
 1256|      0|      if (i->first->Match(_mol)) {
  ------------------
  |  Branch (1256:11): [True: 0, False: 0]
  ------------------
 1257|      0|        _mlist = i->first->GetMapList();
 1258|      0|        for (j = _mlist.begin();j != _mlist.end();++j) {
  ------------------
  |  Branch (1258:33): [True: 0, False: 0]
  ------------------
 1259|      0|          _mol.GetAtom((*j)[0])->SetType(i->second);
 1260|      0|        }
 1261|      0|      }
 1262|      0|    }
 1263|       |
 1264|       |    // Implementation of a special feature of GAFF concerning conjugated bonds
 1265|       |    // In a conjugated ring system cc-cc, and cd-cd are single conjugated bonds, cc-cd are double ones
 1266|       |    // All these types are initially types cc-cc, some cc's are changed to cd.
 1267|       |    // similar for ce and cf, cp and cq, nc and nd, ne and nf, pc and pd, pe and pf
 1268|       |    // Initially types cc, ce, cp, nc, ne , pc and pe are assigned.
 1269|       |    // Some of these are changed into cd, cf, cq, nd, nf, pd and pf
 1270|      0|    visited.Resize(_mol.NumAtoms());
 1271|      0|    visited.Clear();
 1272|      0|    FOR_ATOMS_OF_MOL(ai,_mol){
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1273|      0|      atm = &(*ai);
 1274|      0|      if (!visited[atm->GetIdx()-1]){
  ------------------
  |  Branch (1274:11): [True: 0, False: 0]
  ------------------
 1275|      0|	if( strcmp(atm->GetType(),"cc")==0 ||
  ------------------
  |  Branch (1275:6): [True: 0, False: 0]
  ------------------
 1276|      0|	    strcmp(atm->GetType(),"ce")==0 ||
  ------------------
  |  Branch (1276:6): [True: 0, False: 0]
  ------------------
 1277|      0|	    strcmp(atm->GetType(),"cp")==0 ||
  ------------------
  |  Branch (1277:6): [True: 0, False: 0]
  ------------------
 1278|      0|	    strcmp(atm->GetType(),"nc")==0 ||
  ------------------
  |  Branch (1278:6): [True: 0, False: 0]
  ------------------
 1279|      0|	    strcmp(atm->GetType(),"ne")==0 ||
  ------------------
  |  Branch (1279:6): [True: 0, False: 0]
  ------------------
 1280|      0|	    strcmp(atm->GetType(),"pc")==0 ||
  ------------------
  |  Branch (1280:6): [True: 0, False: 0]
  ------------------
 1281|      0|	    strcmp(atm->GetType(),"pe")==0){
  ------------------
  |  Branch (1281:6): [True: 0, False: 0]
  ------------------
 1282|      0|	  FOR_BONDS_OF_ATOM(bond,atm) {
  ------------------
  |  |  420|      0|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1283|      0|	    a = bond->GetBeginAtom();
 1284|      0|	    b = bond->GetEndAtom();
 1285|      0|	    if ((strcmp(a->GetType(),"cc")==0||strcmp(a->GetType(),"cd")==0)&&(strcmp(b->GetType(),"cc")==0||strcmp(b->GetType(),"cd")==0)){
  ------------------
  |  Branch (1285:11): [True: 0, False: 0]
  |  Branch (1285:41): [True: 0, False: 0]
  |  Branch (1285:73): [True: 0, False: 0]
  |  Branch (1285:103): [True: 0, False: 0]
  ------------------
 1286|      0|	      BO = bond->GetBondOrder();
 1287|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1287:14): [True: 0, False: 0]
  |  Branch (1287:25): [True: 0, False: 0]
  |  Branch (1287:67): [True: 0, False: 0]
  |  Branch (1287:76): [True: 0, False: 0]
  ------------------
 1288|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1288:7): [True: 0, False: 0]
  ------------------
 1289|      0|		  a->SetType("cd");
 1290|      0|		}
 1291|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1291:12): [True: 0, False: 0]
  ------------------
 1292|      0|		  b->SetType("cd");
 1293|      0|		}
 1294|      0|	      }
 1295|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1296|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1297|      0|	    }
 1298|      0|	    if ((strcmp(a->GetType(),"ce")==0||strcmp(a->GetType(),"cf")==0)&&(strcmp(b->GetType(),"ce")==0||strcmp(b->GetType(),"cf")==0)){
  ------------------
  |  Branch (1298:11): [True: 0, False: 0]
  |  Branch (1298:41): [True: 0, False: 0]
  |  Branch (1298:73): [True: 0, False: 0]
  |  Branch (1298:103): [True: 0, False: 0]
  ------------------
 1299|      0|	      BO = bond->GetBondOrder();
 1300|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1300:14): [True: 0, False: 0]
  |  Branch (1300:25): [True: 0, False: 0]
  |  Branch (1300:67): [True: 0, False: 0]
  |  Branch (1300:76): [True: 0, False: 0]
  ------------------
 1301|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1301:7): [True: 0, False: 0]
  ------------------
 1302|      0|		  a->SetType("cf");
 1303|      0|		}
 1304|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1304:12): [True: 0, False: 0]
  ------------------
 1305|      0|		  b->SetType("cf");
 1306|      0|		}
 1307|      0|	      }
 1308|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1309|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1310|      0|	    }
 1311|      0|	    if ((strcmp(a->GetType(),"cp")==0||strcmp(a->GetType(),"cq")==0)&&(strcmp(b->GetType(),"cp")==0||strcmp(b->GetType(),"cq")==0)){
  ------------------
  |  Branch (1311:11): [True: 0, False: 0]
  |  Branch (1311:41): [True: 0, False: 0]
  |  Branch (1311:73): [True: 0, False: 0]
  |  Branch (1311:103): [True: 0, False: 0]
  ------------------
 1312|      0|	      BO = bond->GetBondOrder();
 1313|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1313:14): [True: 0, False: 0]
  |  Branch (1313:25): [True: 0, False: 0]
  |  Branch (1313:67): [True: 0, False: 0]
  |  Branch (1313:76): [True: 0, False: 0]
  ------------------
 1314|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1314:7): [True: 0, False: 0]
  ------------------
 1315|      0|		  a->SetType("cq");
 1316|      0|		}
 1317|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1317:12): [True: 0, False: 0]
  ------------------
 1318|      0|		  b->SetType("cq");
 1319|      0|		}
 1320|      0|	      }
 1321|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1322|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1323|      0|	    }
 1324|      0|	    if ((strcmp(a->GetType(),"nc")==0||strcmp(a->GetType(),"nd")==0)&&(strcmp(b->GetType(),"nc")==0||strcmp(b->GetType(),"nd")==0)){
  ------------------
  |  Branch (1324:11): [True: 0, False: 0]
  |  Branch (1324:41): [True: 0, False: 0]
  |  Branch (1324:73): [True: 0, False: 0]
  |  Branch (1324:103): [True: 0, False: 0]
  ------------------
 1325|      0|	      BO = bond->GetBondOrder();
 1326|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1326:14): [True: 0, False: 0]
  |  Branch (1326:25): [True: 0, False: 0]
  |  Branch (1326:67): [True: 0, False: 0]
  |  Branch (1326:76): [True: 0, False: 0]
  ------------------
 1327|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1327:7): [True: 0, False: 0]
  ------------------
 1328|      0|		  a->SetType("nd");
 1329|      0|		}
 1330|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1330:12): [True: 0, False: 0]
  ------------------
 1331|      0|		  b->SetType("nd");
 1332|      0|		}
 1333|      0|	      }
 1334|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1335|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1336|      0|	    }
 1337|      0|	    if ((strcmp(a->GetType(),"ne")==0||strcmp(a->GetType(),"nf")==0)&&(strcmp(b->GetType(),"ne")==0||strcmp(b->GetType(),"nf")==0)){
  ------------------
  |  Branch (1337:11): [True: 0, False: 0]
  |  Branch (1337:41): [True: 0, False: 0]
  |  Branch (1337:73): [True: 0, False: 0]
  |  Branch (1337:103): [True: 0, False: 0]
  ------------------
 1338|      0|	      BO = bond->GetBondOrder();
 1339|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1339:14): [True: 0, False: 0]
  |  Branch (1339:25): [True: 0, False: 0]
  |  Branch (1339:67): [True: 0, False: 0]
  |  Branch (1339:76): [True: 0, False: 0]
  ------------------
 1340|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1340:7): [True: 0, False: 0]
  ------------------
 1341|      0|		  a->SetType("nf");
 1342|      0|		}
 1343|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1343:12): [True: 0, False: 0]
  ------------------
 1344|      0|		  b->SetType("nf");
 1345|      0|		}
 1346|      0|	      }
 1347|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1348|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1349|      0|	    }
 1350|      0|	    if ((strcmp(a->GetType(),"pc")==0||strcmp(a->GetType(),"pd")==0)&&(strcmp(b->GetType(),"pc")==0||strcmp(b->GetType(),"pd")==0)){
  ------------------
  |  Branch (1350:11): [True: 0, False: 0]
  |  Branch (1350:41): [True: 0, False: 0]
  |  Branch (1350:73): [True: 0, False: 0]
  |  Branch (1350:103): [True: 0, False: 0]
  ------------------
 1351|      0|	      BO = bond->GetBondOrder();
 1352|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1352:14): [True: 0, False: 0]
  |  Branch (1352:25): [True: 0, False: 0]
  |  Branch (1352:67): [True: 0, False: 0]
  |  Branch (1352:76): [True: 0, False: 0]
  ------------------
 1353|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1353:7): [True: 0, False: 0]
  ------------------
 1354|      0|		  a->SetType("pd");
 1355|      0|		}
 1356|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1356:12): [True: 0, False: 0]
  ------------------
 1357|      0|		  b->SetType("pd");
 1358|      0|		}
 1359|      0|	      }
 1360|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1361|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1362|      0|	    }
 1363|      0|	    if ((strcmp(a->GetType(),"pe")==0||strcmp(a->GetType(),"pf")==0)&&(strcmp(b->GetType(),"pe")==0||strcmp(b->GetType(),"pf")==0)){
  ------------------
  |  Branch (1363:11): [True: 0, False: 0]
  |  Branch (1363:41): [True: 0, False: 0]
  |  Branch (1363:73): [True: 0, False: 0]
  |  Branch (1363:103): [True: 0, False: 0]
  ------------------
 1364|      0|	      BO = bond->GetBondOrder();
 1365|      0|	      if ( (BO > 1  && strcmp(a->GetType(),b->GetType())==0) || (BO==1 && strcmp(a->GetType(),b->GetType())!=0)){
  ------------------
  |  Branch (1365:14): [True: 0, False: 0]
  |  Branch (1365:25): [True: 0, False: 0]
  |  Branch (1365:67): [True: 0, False: 0]
  |  Branch (1365:76): [True: 0, False: 0]
  ------------------
 1366|      0|		if (!visited[a->GetIdx()-1]){
  ------------------
  |  Branch (1366:7): [True: 0, False: 0]
  ------------------
 1367|      0|		  a->SetType("pf");
 1368|      0|		}
 1369|      0|		else if (!visited[b->GetIdx()-1]){
  ------------------
  |  Branch (1369:12): [True: 0, False: 0]
  ------------------
 1370|      0|		  b->SetType("pf");
 1371|      0|		}
 1372|      0|	      }
 1373|      0|	      visited.SetBitOn(a->GetIdx()-1);
 1374|      0|	      visited.SetBitOn(b->GetIdx()-1);
 1375|      0|	    }
 1376|      0|	  }
 1377|      0|	}
 1378|      0|      }
 1379|      0|      visited.SetBitOn(atm->GetIdx()-1);
 1380|      0|    }
 1381|       |
 1382|       |    //     FOR_BONDS_OF_MOL(bond, _mol) {
 1383|       |    //       a = bond->GetBeginAtom();
 1384|       |    //       b = bond->GetEndAtom();
 1385|       |    //       BO = bond->GetBondOrder();
 1386|       |    //       cout << "Bond between: " << a->GetType() << " and " << b->GetType() << " with bondorder " << BO << endl;
 1387|       |    //     }
 1388|       |    // DEBUG (validation)
 1389|       |    //    FOR_ATOMS_OF_MOL (a, _mol)
 1390|       |    //      cout << "ATOMTYPE " << a->GetType() << endl;
 1391|       |
 1392|      0|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1393|      0|      OBFFLog("\nA T O M   T Y P E S\n\n");
 1394|      0|      OBFFLog("IDX\tTYPE\tRING\n");
 1395|       |
 1396|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1397|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%s\t%s\n", a->GetIdx(), a->GetType(),
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1398|      0|	  (a->IsInRing() ? (a->IsAromatic() ? "AR" : "AL") : "NO"));
  ------------------
  |  Branch (1398:5): [True: 0, False: 0]
  |  Branch (1398:22): [True: 0, False: 0]
  ------------------
 1399|      0|        OBFFLog(_logbuf);
 1400|      0|      }
 1401|       |
 1402|      0|      OBFFLog("\nC H A R G E S\n\n");
 1403|      0|      OBFFLog("IDX\tCHARGE\n");
 1404|       |
 1405|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1406|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%f\n", a->GetIdx(), a->GetPartialCharge());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1407|      0|        OBFFLog(_logbuf);
 1408|      0|      }
 1409|      0|    }
 1410|       |
 1411|       |
 1412|      0|    if (ifs)
  ------------------
  |  Branch (1412:9): [True: 0, False: 0]
  ------------------
 1413|      0|      ifs.close();
 1414|       |
 1415|       |    // return the locale to the original one
 1416|      0|    obLocale.RestoreLocale();
 1417|       |
 1418|      0|    return true;
 1419|      0|  }
_ZN9OpenBabel16OBForceFieldGaff33SetPartialChargesBeforeAtomTypingEv:
 1431|    939|  {
 1432|       |    // Trigger calculation of Gasteiger charges
 1433|       |    // Note that the Gastegier charge calculation checks for the values of particular atom types
 1434|    939|    _mol.SetAutomaticPartialCharge(true);
 1435|    939|    _mol.SetPartialChargesPerceived(false);
 1436|       |    // Trigger partial charge calculation
 1437|    939|    FOR_ATOMS_OF_MOL(atom, _mol) {
  ------------------
  |  |  417|    939|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 926, False: 13]
  |  |  ------------------
  ------------------
 1438|    926|      atom->GetPartialCharge();
 1439|    926|      break;
 1440|    926|    }
 1441|    939|    _mol.SetPartialChargesPerceived();
 1442|       |
 1443|    939|    return true;
 1444|    939|  }

_ZN9OpenBabel16OBForceFieldGaffC2EPKcb:
  123|      2|      explicit OBForceFieldGaff(const char* ID, bool IsDefault=true) : OBForceField(ID, IsDefault)
  124|      2|      {
  125|      2|        _validSetup = false;
  126|      2|        _init = false;
  127|      2|        _rvdw = 7.0;
  128|      2|        _rele = 15.0;
  129|      2|        _epsilon = 1.0;
  130|      2|        _pairfreq = 10;
  131|      2|        _cutoff = false;
  132|      2|        _linesearch = LineSearchType::Newton2Num;
  133|      2|      }

_ZN9OpenBabel20OBForceFieldGhemical14ParseParamFileEv:
  863|      1|  {
  864|      1|    vector<string> vs;
  865|      1|    char buffer[80];
  866|       |
  867|      1|    OBFFParameter parameter;
  868|       |
  869|       |    // open data/ghemical.prm
  870|      1|    ifstream ifs;
  871|      1|    if (OpenDatafile(ifs, "ghemical.prm").length() == 0) {
  ------------------
  |  Branch (871:9): [True: 1, False: 0]
  ------------------
  872|      1|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open ghemical.prm", obError);
  873|      1|      return false;
  874|      1|    }
  875|       |
  876|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  877|      0|    obLocale.SetLocale();
  878|       |
  879|      0|    while (ifs.getline(buffer, 80)) {
  ------------------
  |  Branch (879:12): [True: 0, False: 0]
  ------------------
  880|      0|      tokenize(vs, buffer);
  881|       |
  882|      0|      if (EQn(buffer, "bond", 4)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  883|      0|        parameter.clear();
  884|      0|        parameter._a = vs[1];
  885|      0|        parameter._b = vs[2];
  886|      0|        parameter._dpar.push_back(atof(vs[4].c_str())); // length
  887|      0|        parameter._dpar.push_back(atof(vs[5].c_str())); // force cte
  888|      0|        parameter._ipar.resize(1);
  889|      0|        if (EQn(vs[3].c_str(), "S", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  890|      0|          parameter._ipar[0] = 1;
  891|      0|        if (EQn(vs[3].c_str(), "D", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  892|      0|          parameter._ipar[0] = 2;
  893|      0|        if (EQn(vs[3].c_str(), "T", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  894|      0|          parameter._ipar[0] = 3;
  895|      0|        if (EQn(vs[3].c_str(), "C", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  896|      0|          parameter._ipar[0] = 5;
  897|      0|        _ffbondparams.push_back(parameter);
  898|      0|      }
  899|      0|      if (EQn(buffer, "angle", 5)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  900|      0|        parameter.clear();
  901|      0|        parameter._a = vs[1];
  902|      0|        parameter._b = vs[2];
  903|      0|        parameter._c = vs[3];
  904|      0|        parameter._dpar.push_back(atof(vs[5].c_str())); // angle
  905|      0|        parameter._dpar.push_back(atof(vs[6].c_str())); // force cte
  906|      0|        _ffangleparams.push_back(parameter);
  907|      0|      }
  908|      0|      if (EQn(buffer, "torsion", 7)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  909|      0|        parameter.clear();
  910|      0|        parameter._a = vs[1];
  911|      0|        parameter._b = vs[2];
  912|      0|        parameter._c = vs[3];
  913|      0|        parameter._d = vs[4];
  914|      0|        parameter._dpar.resize(3);
  915|      0|        parameter._dpar[0] = atof(vs[6].c_str()); // force cte
  916|      0|        parameter._dpar[2] = atof(vs[8].c_str()); // n
  917|      0|        if (EQn(vs[7].c_str(), "+", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  918|      0|          parameter._dpar[1] = +1; // s
  919|      0|        else if (EQn(vs[7].c_str(), "-", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  920|      0|          parameter._dpar[1] = -1; // s
  921|       |
  922|      0|        parameter._ipar.resize(1);
  923|      0|        if (EQn(vs[5].c_str(), "?S?", 3))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  924|      0|          parameter._ipar[0] = 1;
  925|      0|        else if (EQn(vs[5].c_str(), "?D?", 3))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  926|      0|          parameter._ipar[0] = 2;
  927|      0|        else if (EQn(vs[5].c_str(), "?T?", 3))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  928|      0|          parameter._ipar[0] = 3;
  929|      0|        else if (EQn(vs[5].c_str(), "?C?", 3))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  930|      0|          parameter._ipar[0] = 5;
  931|      0|        _fftorsionparams.push_back(parameter);
  932|      0|      }
  933|      0|      if (EQn(buffer, "vdw", 3)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  934|      0|        parameter.clear();
  935|      0|        parameter._a = vs[1];
  936|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // r
  937|      0|        parameter._dpar.push_back(atof(vs[3].c_str())); // force cte
  938|      0|        _ffvdwparams.push_back(parameter);
  939|      0|      }
  940|      0|      if (EQn(buffer, "charge", 6)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  941|      0|        parameter.clear();
  942|      0|        parameter._a = vs[1];
  943|      0|        parameter._b = vs[2];
  944|      0|        parameter._ipar.resize(1);
  945|      0|        if (EQn(vs[3].c_str(), "S", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  946|      0|          parameter._ipar[0] = 1;
  947|      0|        else if (EQn(vs[3].c_str(), "D", 1))
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  948|      0|          parameter._ipar[0] = 2;
  949|      0|        parameter._dpar.push_back(atof(vs[4].c_str())); // charge
  950|      0|        _ffchargeparams.push_back(parameter);
  951|      0|      }
  952|      0|    }
  953|       |
  954|      0|    if (ifs)
  ------------------
  |  Branch (954:9): [True: 0, False: 0]
  ------------------
  955|      0|      ifs.close();
  956|       |
  957|       |    // return the locale to the original one
  958|      0|    obLocale.RestoreLocale();
  959|       |
  960|      0|    return 0;
  961|      1|  }
_ZN9OpenBabel20OBForceFieldGhemical8SetTypesEv:
  964|  1.74k|  {
  965|  1.74k|    vector<vector<int> > _mlist; //!< match list for atom typing
  966|  1.74k|    vector<pair<std::unique_ptr<OBSmartsPattern>, string>> _vexttyp; //!< external atom type rules
  967|  1.74k|    vector<vector<int> >::iterator j;
  968|  1.74k|    vector<string> vs;
  969|  1.74k|    char buffer[80];
  970|       |
  971|  1.74k|    _mol.SetAtomTypesPerceived();
  972|       |
  973|       |    // open data/ghemical.prm
  974|  1.74k|    ifstream ifs;
  975|  1.74k|    if (OpenDatafile(ifs, "ghemical.prm").length() == 0) {
  ------------------
  |  Branch (975:9): [True: 1.74k, False: 0]
  ------------------
  976|  1.74k|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open ghemical.prm", obError);
  977|  1.74k|      return false;
  978|  1.74k|    }
  979|       |
  980|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  981|      0|    obLocale.SetLocale();
  982|       |
  983|      0|    while (ifs.getline(buffer, 80)) {
  ------------------
  |  Branch (983:12): [True: 0, False: 0]
  ------------------
  984|      0|      if (EQn(buffer, "atom", 4)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  985|      0|      	tokenize(vs, buffer);
  986|       |
  987|      0|        auto sp = std::unique_ptr<OBSmartsPattern>(new OBSmartsPattern);
  988|      0|        if (sp->Init(vs[1]))
  ------------------
  |  Branch (988:13): [True: 0, False: 0]
  ------------------
  989|      0|          _vexttyp.emplace_back(std::move(sp), vs[2]);
  990|      0|        else {
  991|      0|          obErrorLog.ThrowError(__FUNCTION__, " Could not parse atom type table from ghemical.prm", obInfo);
  992|      0|          return false;
  993|      0|        }
  994|      0|      }
  995|      0|    }
  996|       |
  997|      0|    for (auto i = _vexttyp.begin(); i != _vexttyp.end(); ++i) {
  ------------------
  |  Branch (997:37): [True: 0, False: 0]
  ------------------
  998|      0|      if (i->first->Match(_mol)) {
  ------------------
  |  Branch (998:11): [True: 0, False: 0]
  ------------------
  999|      0|        _mlist = i->first->GetMapList();
 1000|      0|        for (j = _mlist.begin();j != _mlist.end();++j) {
  ------------------
  |  Branch (1000:33): [True: 0, False: 0]
  ------------------
 1001|      0|          _mol.GetAtom((*j)[0])->SetType(i->second);
 1002|      0|        }
 1003|      0|      }
 1004|      0|    }
 1005|       |
 1006|      0|    SetPartialCharges();
 1007|       |
 1008|      0|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1009|      0|      OBFFLog("\nA T O M   T Y P E S\n\n");
 1010|      0|      OBFFLog("IDX\tTYPE\tRING\n");
 1011|       |
 1012|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1013|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%s\t%s\n", a->GetIdx(), a->GetType(),
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1014|      0|	  (a->IsInRing() ? (a->IsAromatic() ? "AR" : "AL") : "NO"));
  ------------------
  |  Branch (1014:5): [True: 0, False: 0]
  |  Branch (1014:22): [True: 0, False: 0]
  ------------------
 1015|      0|        OBFFLog(_logbuf);
 1016|      0|      }
 1017|       |
 1018|      0|      OBFFLog("\nC H A R G E S\n\n");
 1019|      0|      OBFFLog("IDX\tCHARGE\n");
 1020|       |
 1021|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1022|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%f\n", a->GetIdx(), a->GetPartialCharge());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1023|      0|        OBFFLog(_logbuf);
 1024|      0|      }
 1025|      0|    }
 1026|       |
 1027|       |    // DEBUG (validation)
 1028|       |    //FOR_ATOMS_OF_MOL (a, _mol)
 1029|       |    //  if (atoi(a->GetType()) != 0)
 1030|       |    //    cout << "ATOMTYPE " << atoi(a->GetType()) << endl;
 1031|       |    //  else
 1032|       |    //    cout << "ATOMTYPE " << a->GetType() << endl;
 1033|       |
 1034|      0|    if (ifs)
  ------------------
  |  Branch (1034:9): [True: 0, False: 0]
  ------------------
 1035|      0|      ifs.close();
 1036|       |
 1037|       |    // return the locale to the original one
 1038|      0|    obLocale.RestoreLocale();
 1039|       |
 1040|      0|    return true;
 1041|      0|  }

_ZN9OpenBabel20OBForceFieldGhemicalC2EPKcb:
  114|      2|      explicit OBForceFieldGhemical(const char* ID, bool IsDefault=true) : OBForceField(ID, IsDefault)
  115|      2|      {
  116|      2|        _validSetup = false;
  117|      2|        _init = false;
  118|      2|        _rvdw = 7.0;
  119|      2|        _rele = 15.0;
  120|      2|        _epsilon = 1.0;
  121|      2|        _pairfreq = 10;
  122|      2|        _cutoff = false;
  123|      2|        _linesearch = LineSearchType::Newton2Num;
  124|      2|      }

_ZN9OpenBabel18OBForceFieldMMFF946EnergyEb:
   59|  5.29k|  {
   60|  5.29k|    double energy;
   61|       |
   62|  5.29k|    IF_OBFF_LOGLVL_MEDIUM
  ------------------
  |  |   72|  5.29k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  5.29k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 5.29k]
  |  |  ------------------
  ------------------
   63|      0|      OBFFLog("\nE N E R G Y\n\n");
   64|       |
   65|  5.29k|    if (gradients) {
  ------------------
  |  Branch (65:9): [True: 1.78k, False: 3.50k]
  ------------------
   66|  1.78k|      ClearGradients();
   67|  1.78k|      energy  = E_Bond<true>();
   68|  1.78k|      energy += E_Angle<true>();
   69|  1.78k|      energy += E_StrBnd<true>();
   70|  1.78k|      energy += E_Torsion<true>();
   71|  1.78k|      energy += E_OOP<true>();
   72|  1.78k|      energy += E_VDW<true>();
   73|  1.78k|      energy += E_Electrostatic<true>();
   74|  3.50k|    } else {
   75|  3.50k|      energy  = E_Bond<false>();
   76|  3.50k|      energy += E_Angle<false>();
   77|  3.50k|      energy += E_StrBnd<false>();
   78|  3.50k|      energy += E_Torsion<false>();
   79|  3.50k|      energy += E_OOP<false>();
   80|  3.50k|      energy += E_VDW<false>();
   81|  3.50k|      energy += E_Electrostatic<false>();
   82|  3.50k|    }
   83|       |
   84|  5.29k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  5.29k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  5.29k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 5.29k]
  |  |  ------------------
  ------------------
   85|      0|      snprintf(_logbuf, BUFF_SIZE, "\nTOTAL ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
   86|      0|      OBFFLog(_logbuf);
   87|      0|    }
   88|       |
   89|  5.29k|    return energy;
   90|  5.29k|  }
_ZN9OpenBabel18OBForceFieldMMFF9414ParseParamFileEv:
  869|      1|  {
  870|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  871|      1|    obLocale.SetLocale();
  872|       |
  873|      1|    vector<string> vs;
  874|      1|    char buffer[80];
  875|       |
  876|       |    // open data/_parFile
  877|      1|    ifstream ifs;
  878|      1|    if (OpenDatafile(ifs, _parFile).length() == 0) {
  ------------------
  |  Branch (878:9): [True: 1, False: 0]
  ------------------
  879|      1|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open parameter file", obError);
  880|      1|      return false;
  881|      1|    }
  882|       |
  883|      0|    while (ifs.getline(buffer, 80)) {
  ------------------
  |  Branch (883:12): [True: 0, False: 0]
  ------------------
  884|      0|      if (EQn(buffer, "#", 1)) continue;
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  885|       |
  886|      0|      tokenize(vs, buffer);
  887|      0|      if (vs.size() < 2)
  ------------------
  |  Branch (887:11): [True: 0, False: 0]
  ------------------
  888|      0|        continue;
  889|       |
  890|      0|      if (vs[0] == "prop")
  ------------------
  |  Branch (890:11): [True: 0, False: 0]
  ------------------
  891|      0|        ParseParamProp(vs[1]);
  892|      0|      if (vs[0] == "def")
  ------------------
  |  Branch (892:11): [True: 0, False: 0]
  ------------------
  893|      0|        ParseParamDef(vs[1]);
  894|      0|      if (vs[0] == "bond")
  ------------------
  |  Branch (894:11): [True: 0, False: 0]
  ------------------
  895|      0|        ParseParamBond(vs[1]);
  896|      0|      if (vs[0] == "ang")
  ------------------
  |  Branch (896:11): [True: 0, False: 0]
  ------------------
  897|      0|        ParseParamAngle(vs[1]);
  898|      0|      if (vs[0] == "bndk")
  ------------------
  |  Branch (898:11): [True: 0, False: 0]
  ------------------
  899|      0|        ParseParamBndk(vs[1]);
  900|      0|      if (vs[0] == "chg")
  ------------------
  |  Branch (900:11): [True: 0, False: 0]
  ------------------
  901|      0|        ParseParamCharge(vs[1]);
  902|      0|      if (vs[0] == "dfsb")
  ------------------
  |  Branch (902:11): [True: 0, False: 0]
  ------------------
  903|      0|        ParseParamDfsb(vs[1]);
  904|      0|      if (vs[0] == "oop")
  ------------------
  |  Branch (904:11): [True: 0, False: 0]
  ------------------
  905|      0|        ParseParamOOP(vs[1]);
  906|      0|      if (vs[0] == "pbci")
  ------------------
  |  Branch (906:11): [True: 0, False: 0]
  ------------------
  907|      0|        ParseParamPbci(vs[1]);
  908|      0|      if (vs[0] == "stbn")
  ------------------
  |  Branch (908:11): [True: 0, False: 0]
  ------------------
  909|      0|        ParseParamStrBnd(vs[1]);
  910|      0|      if (vs[0] == "tor")
  ------------------
  |  Branch (910:11): [True: 0, False: 0]
  ------------------
  911|      0|        ParseParamTorsion(vs[1]);
  912|      0|      if (vs[0] == "vdw")
  ------------------
  |  Branch (912:11): [True: 0, False: 0]
  ------------------
  913|      0|        ParseParamVDW(vs[1]);
  914|      0|    }
  915|       |
  916|      0|    if (ifs)
  ------------------
  |  Branch (916:9): [True: 0, False: 0]
  ------------------
  917|      0|      ifs.close();
  918|       |
  919|       |    // return the locale to the original one
  920|      0|    obLocale.RestoreLocale();
  921|      0|    return true;
  922|      1|  }
_ZN9OpenBabel18OBForceFieldMMFF9416PerceiveAromaticEv:
 1379|  2.09k|  {
 1380|  2.09k|    bool done = false; // not done actually....
 1381|  2.09k|    OBAtom *ringatom;
 1382|  2.09k|    OBBond *ringbond;
 1383|  2.09k|    vector<OBRing*> vr;
 1384|  2.09k|    vr = _mol.GetSSSR();
 1385|       |
 1386|  2.09k|    vector<OBRing*>::iterator ri;
 1387|  2.09k|    vector<int>::iterator rj;
 1388|  2.09k|    int n, index, ringsize, first_rj, prev_rj, pi_electrons, c60;
 1389|  17.8k|    for (ri = vr.begin();ri != vr.end();++ri) { // for each ring
  ------------------
  |  Branch (1389:26): [True: 15.7k, False: 2.09k]
  ------------------
 1390|  15.7k|      ringsize = (*ri)->Size();
 1391|       |
 1392|  15.7k|      n = 1;
 1393|  15.7k|      pi_electrons = 0;
 1394|  15.7k|      c60 = 0; // we have a special case to get c60 right (all atom type 37)
 1395|  76.2k|      for(rj = (*ri)->_path.begin();rj != (*ri)->_path.end();++rj) { // for each ring atom
  ------------------
  |  Branch (1395:37): [True: 60.5k, False: 15.7k]
  ------------------
 1396|  60.5k|        index = *rj;
 1397|  60.5k|        ringatom = _mol.GetAtom(index);
 1398|       |
 1399|       |        // is the bond to the previous ring atom double?
 1400|  60.5k|        if (n > 1) {
  ------------------
  |  Branch (1400:13): [True: 44.8k, False: 15.7k]
  ------------------
 1401|  44.8k|          ringbond = _mol.GetBond(prev_rj, index);
 1402|  44.8k|          if (!ringbond) {
  ------------------
  |  Branch (1402:15): [True: 0, False: 44.8k]
  ------------------
 1403|      0|            prev_rj = index;
 1404|      0|            continue;
 1405|      0|          }
 1406|  44.8k|          if (ringbond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1406:15): [True: 3.60k, False: 41.2k]
  ------------------
 1407|  3.60k|            pi_electrons += 2;
 1408|  3.60k|            prev_rj = index;
 1409|  3.60k|            n++;
 1410|  3.60k|            continue;
 1411|  3.60k|          }
 1412|  41.2k|          prev_rj = index;
 1413|  41.2k|        } else {
 1414|  15.7k|          prev_rj = index;
 1415|  15.7k|          first_rj = index;
 1416|  15.7k|        }
 1417|       |
 1418|       |        // does the current ring atom have a exocyclic double bond?
 1419|   246k|        FOR_NBORS_OF_ATOM (nbr, ringatom) {
  ------------------
  |  |  419|  56.9k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 246k, False: 56.9k]
  |  |  ------------------
  ------------------
 1420|   246k|          if ((*ri)->IsInRing(nbr->GetIdx()))
  ------------------
  |  Branch (1420:15): [True: 113k, False: 132k]
  ------------------
 1421|   113k|            continue;
 1422|       |
 1423|   132k|          if (!nbr->IsAromatic()) {
  ------------------
  |  Branch (1423:15): [True: 132k, False: 336]
  ------------------
 1424|   132k|            if (ringatom->GetAtomicNum() == OBElements::Carbon && ringatom->IsInRingSize(5)
  ------------------
  |  Branch (1424:17): [True: 4.50k, False: 127k]
  |  Branch (1424:67): [True: 192, False: 4.31k]
  ------------------
 1425|    192|                && ringatom->IsInRingSize(6) && nbr->GetAtomicNum() == OBElements::Carbon && nbr->IsInRingSize(5)
  ------------------
  |  Branch (1425:20): [True: 36, False: 156]
  |  Branch (1425:49): [True: 5, False: 31]
  |  Branch (1425:94): [True: 1, False: 4]
  ------------------
 1426|      1|                && nbr->IsInRingSize(6)) {
  ------------------
  |  Branch (1426:20): [True: 0, False: 1]
  ------------------
 1427|      0|              c60++;
 1428|   132k|            } else {
 1429|   132k|              continue;
 1430|   132k|            }
 1431|   132k|          }
 1432|       |
 1433|    336|          ringbond = _mol.GetBond(nbr->GetIdx(), index);
 1434|    336|          if (!ringbond) {
  ------------------
  |  Branch (1434:15): [True: 0, False: 336]
  ------------------
 1435|      0|            continue;
 1436|      0|          }
 1437|    336|          if (ringbond->GetBondOrder() == 2)
  ------------------
  |  Branch (1437:15): [True: 110, False: 226]
  ------------------
 1438|    110|            pi_electrons++;
 1439|    336|        }
 1440|       |
 1441|       |        // is the atom N, O or S in 5 rings
 1442|  56.9k|        if (ringsize == 5 &&
  ------------------
  |  Branch (1442:13): [True: 1.79k, False: 55.1k]
  ------------------
 1443|  1.79k|            ringatom->GetIdx() == (*ri)->GetRootAtom())
  ------------------
  |  Branch (1443:13): [True: 332, False: 1.45k]
  ------------------
 1444|    332|          pi_electrons += 2;
 1445|       |
 1446|  56.9k|        n++;
 1447|       |
 1448|  56.9k|      } // for each ring atom
 1449|       |
 1450|       |      // is the bond from the first to the last atom double?
 1451|  15.7k|      ringbond = _mol.GetBond(first_rj, index);
 1452|  15.7k|      if (ringbond) {
  ------------------
  |  Branch (1452:11): [True: 15.7k, False: 0]
  ------------------
 1453|  15.7k|        if (ringbond->GetBondOrder() == 2)
  ------------------
  |  Branch (1453:13): [True: 889, False: 14.8k]
  ------------------
 1454|    889|          pi_electrons += 2;
 1455|  15.7k|      }
 1456|       |
 1457|  15.7k|      if (((pi_electrons == 6) && ((ringsize == 5) || (ringsize == 6)))
  ------------------
  |  Branch (1457:12): [True: 334, False: 15.3k]
  |  Branch (1457:36): [True: 192, False: 142]
  |  Branch (1457:55): [True: 44, False: 98]
  ------------------
 1458|  15.4k|        || ((pi_electrons == 5) && (c60 == 5))) {
  ------------------
  |  Branch (1458:13): [True: 14, False: 15.4k]
  |  Branch (1458:36): [True: 0, False: 14]
  ------------------
 1459|       |        // mark ring atoms as aromatic
 1460|  1.46k|        for(rj = (*ri)->_path.begin();rj != (*ri)->_path.end();++rj) {
  ------------------
  |  Branch (1460:39): [True: 1.22k, False: 236]
  ------------------
 1461|  1.22k|          if (!_mol.GetAtom(*rj)->IsAromatic())
  ------------------
  |  Branch (1461:15): [True: 624, False: 600]
  ------------------
 1462|    624|            done = true;
 1463|  1.22k|          _mol.GetAtom(*rj)->SetAromatic();
 1464|  1.22k|        }
 1465|       |        // mark all ring bonds as aromatic
 1466|    236|        FOR_BONDS_OF_MOL (bond, _mol)
  ------------------
  |  |  418|    236|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 15.6k, False: 236]
  |  |  ------------------
  ------------------
 1467|  15.6k|          if((*ri)->IsMember(&*bond))
  ------------------
  |  Branch (1467:14): [True: 1.22k, False: 14.4k]
  ------------------
 1468|  1.22k|            bond->SetAromatic();
 1469|    236|      }
 1470|  15.7k|    }
 1471|       |
 1472|  2.09k|    return done;
 1473|  2.09k|  }
_ZN9OpenBabel18OBForceFieldMMFF947GetTypeEPNS_6OBAtomE:
 1482|   193k|  {
 1483|   193k|    OBBond *bond;
 1484|   193k|    int oxygenCount, nitrogenCount, sulphurCount, doubleBondTo;
 1485|       |    ////////////////////////////////
 1486|       |    // Aromatic Atoms
 1487|       |    ////////////////////////////////
 1488|   193k|    if (atom->IsAromatic()) {
  ------------------
  |  Branch (1488:9): [True: 634, False: 193k]
  ------------------
 1489|    634|      if (atom->IsInRingSize(5)) {
  ------------------
  |  Branch (1489:11): [True: 501, False: 133]
  ------------------
 1490|    501|        bool IsAromatic = false;
 1491|    501|        vector<OBAtom*> alphaPos, betaPos;
 1492|    501|        vector<OBAtom*> alphaAtoms, betaAtoms;
 1493|       |
 1494|    501|        if (atom->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1494:13): [True: 31, False: 470]
  ------------------
 1495|     31|          return 44; // Aromatic 5-ring sulfur with pi lone pair (STHI)
 1496|     31|        }
 1497|    470|        if (atom->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1497:13): [True: 48, False: 422]
  ------------------
 1498|     48|          return 59; // Aromatic 5-ring oxygen with pi lone pair (OFUR)
 1499|     48|        }
 1500|    422|        if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1500:13): [True: 243, False: 179]
  ------------------
 1501|    639|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    243|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 639, False: 241]
  |  |  ------------------
  ------------------
 1502|    639|            if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1502:17): [True: 46, False: 593]
  |  Branch (1502:62): [True: 2, False: 44]
  ------------------
 1503|      2|              return 82; // N-oxide nitrogen in 5-ring alpha position,
 1504|       |              // N-oxide nitrogen in 5-ring beta position,
 1505|       |              // N-oxide nitrogen in other 5-ring  position,
 1506|       |              // (N5AX, N5BX, N5OX)
 1507|      2|            }
 1508|    639|          }
 1509|    243|        }
 1510|  1.09k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    420|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.09k, False: 420]
  |  |  ------------------
  ------------------
 1511|  1.09k|          if (!((_mol.GetBond(atom, &*nbr))->IsAromatic()) || !nbr->IsInRingSize(5))
  ------------------
  |  Branch (1511:15): [True: 238, False: 856]
  |  Branch (1511:63): [True: 4, False: 852]
  ------------------
 1512|    242|            continue;
 1513|       |
 1514|    852|          if (IsInSameRing(atom, &*nbr)) {
  ------------------
  |  Branch (1514:15): [True: 852, False: 0]
  ------------------
 1515|    852|            alphaPos.push_back(&*nbr);
 1516|    852|          }
 1517|       |
 1518|  2.23k|          FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    852|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.23k, False: 852]
  |  |  ------------------
  ------------------
 1519|  2.23k|            if (nbrNbr->GetIdx() == atom->GetIdx())
  ------------------
  |  Branch (1519:17): [True: 852, False: 1.38k]
  ------------------
 1520|    852|              continue;
 1521|  1.38k|            if (!((_mol.GetBond(&*nbr, &*nbrNbr))->IsAromatic()) || !nbrNbr->IsInRingSize(5))
  ------------------
  |  Branch (1521:17): [True: 478, False: 902]
  |  Branch (1521:69): [True: 4, False: 898]
  ------------------
 1522|    482|              continue;
 1523|       |
 1524|    898|            IsAromatic = true;
 1525|       |
 1526|    898|            if (IsInSameRing(atom, &*nbrNbr)) {
  ------------------
  |  Branch (1526:17): [True: 852, False: 46]
  ------------------
 1527|    852|              betaPos.push_back(&*nbrNbr);
 1528|    852|            }
 1529|    898|          }
 1530|    852|        }
 1531|       |
 1532|    420|        if (IsAromatic) {
  ------------------
  |  Branch (1532:13): [True: 419, False: 1]
  ------------------
 1533|       |
 1534|       |
 1535|  1.27k|          for (unsigned int i = 0; i < alphaPos.size(); i++) {
  ------------------
  |  Branch (1535:36): [True: 852, False: 419]
  ------------------
 1536|    852|            if (alphaPos[i]->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1536:17): [True: 44, False: 808]
  ------------------
 1537|     44|              alphaAtoms.push_back(alphaPos[i]);
 1538|    808|            } else if (alphaPos[i]->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1538:24): [True: 65, False: 743]
  ------------------
 1539|     65|              alphaAtoms.push_back(alphaPos[i]);
 1540|    743|            } else if (alphaPos[i]->GetAtomicNum() == OBElements::Nitrogen && (alphaPos[i]->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (1540:24): [True: 417, False: 326]
  |  Branch (1540:79): [True: 135, False: 282]
  ------------------
 1541|    135|              bool IsNOxide = false;
 1542|    405|              FOR_NBORS_OF_ATOM (nbr, alphaPos[i]) {
  ------------------
  |  |  419|    135|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 405, False: 135]
  |  |  ------------------
  ------------------
 1543|    405|                if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1543:21): [True: 23, False: 382]
  |  Branch (1543:66): [True: 4, False: 19]
  ------------------
 1544|      4|                  IsNOxide = true;
 1545|      4|                }
 1546|    405|              }
 1547|       |
 1548|    135|              if (!IsNOxide) {
  ------------------
  |  Branch (1548:19): [True: 131, False: 4]
  ------------------
 1549|    131|                alphaAtoms.push_back(alphaPos[i]);
 1550|    131|              }
 1551|    135|            }
 1552|    852|          }
 1553|  1.27k|          for (unsigned int i = 0; i < betaPos.size(); i++) {
  ------------------
  |  Branch (1553:36): [True: 852, False: 419]
  ------------------
 1554|    852|            if (betaPos[i]->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1554:17): [True: 45, False: 807]
  ------------------
 1555|     45|              betaAtoms.push_back(betaPos[i]);
 1556|    807|            } else if (betaPos[i]->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1556:24): [True: 97, False: 710]
  ------------------
 1557|     97|              betaAtoms.push_back(betaPos[i]);
 1558|    710|            } else if (betaPos[i]->GetAtomicNum() == OBElements::Nitrogen && (betaPos[i]->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (1558:24): [True: 418, False: 292]
  |  Branch (1558:78): [True: 138, False: 280]
  ------------------
 1559|    138|              bool IsNOxide = false;
 1560|    414|              FOR_NBORS_OF_ATOM (nbr, betaPos[i]) {
  ------------------
  |  |  419|    138|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 414, False: 138]
  |  |  ------------------
  ------------------
 1561|    414|                if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1561:21): [True: 36, False: 378]
  |  Branch (1561:66): [True: 4, False: 32]
  ------------------
 1562|      4|                  IsNOxide = true;
 1563|      4|                }
 1564|    414|              }
 1565|       |
 1566|    138|              if (!IsNOxide) {
  ------------------
  |  Branch (1566:19): [True: 134, False: 4]
  ------------------
 1567|    134|                betaAtoms.push_back(betaPos[i]);
 1568|    134|              }
 1569|    138|            }
 1570|    852|          }
 1571|    419|          if (!betaAtoms.size()) {
  ------------------
  |  Branch (1571:15): [True: 205, False: 214]
  ------------------
 1572|    205|            nitrogenCount = 0;
 1573|    555|            FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    205|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 555, False: 205]
  |  |  ------------------
  ------------------
 1574|    555|              if (nbr->GetAtomicNum() == OBElements::Nitrogen && (nbr->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (1574:19): [True: 258, False: 297]
  |  Branch (1574:66): [True: 64, False: 194]
  ------------------
 1575|     64|                if ((nbr->GetExplicitValence() == 4) && nbr->IsAromatic()) {
  ------------------
  |  Branch (1575:21): [True: 10, False: 54]
  |  Branch (1575:57): [True: 8, False: 2]
  ------------------
 1576|      8|                  nitrogenCount++;
 1577|     56|                } else if ((nbr->GetExplicitValence() == 3) && !nbr->IsAromatic()) {
  ------------------
  |  Branch (1577:28): [True: 44, False: 12]
  |  Branch (1577:64): [True: 8, False: 36]
  ------------------
 1578|      8|                  nitrogenCount++;
 1579|      8|                }
 1580|     64|              }
 1581|    555|            }
 1582|    205|            if (nitrogenCount >= 2) {
  ------------------
  |  Branch (1582:17): [True: 2, False: 203]
  ------------------
 1583|      2|              return 80; // Aromatic carbon between N's in imidazolium (CIM+)
 1584|      2|            }
 1585|    205|          }
 1586|    417|          if (!alphaAtoms.size() && !betaAtoms.size()) {
  ------------------
  |  Branch (1586:15): [True: 216, False: 201]
  |  Branch (1586:37): [True: 125, False: 91]
  ------------------
 1587|    125|            if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1587:17): [True: 32, False: 93]
  ------------------
 1588|     32|              bool c60 = true; // special case to ensure c60 is typed correctly -- Paolo Tosco
 1589|     89|              FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|     32|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 89, False: 32]
  |  |  ------------------
  ------------------
 1590|     89|                if (!(nbr->GetAtomicNum() == OBElements::Carbon && nbr->IsAromatic() && nbr->IsInRingSize(6)))
  ------------------
  |  Branch (1590:23): [True: 23, False: 66]
  |  Branch (1590:68): [True: 18, False: 5]
  |  Branch (1590:89): [True: 4, False: 14]
  ------------------
 1591|     85|                  c60 = false;
 1592|     89|              }
 1593|     32|              if (c60)
  ------------------
  |  Branch (1593:19): [True: 0, False: 32]
  ------------------
 1594|      0|                return 37; // correct atom type for c in c60 (all atoms symmetric)
 1595|       |              // there is no S:, O:, or N:
 1596|       |              // this is the case for anions with only carbon and nitrogen in the ring
 1597|     32|              return 78; // General carbon in 5-membered aromatic ring (C5)
 1598|     93|            } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1598:24): [True: 68, False: 25]
  ------------------
 1599|     68|              if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1599:19): [True: 21, False: 47]
  ------------------
 1600|       |                // this is the N: atom
 1601|     21|                return 39; // Aromatic 5 ring nitrogen with pi lone pair (NPYL)
 1602|     47|              } else {
 1603|       |                // again, no S:, O:, or N:
 1604|     47|                return 76; // Nitrogen in 5-ring aromatic anion (N5M)
 1605|     47|              }
 1606|     68|            }
 1607|    125|          }
 1608|    317|          if (alphaAtoms.size() == 2) {
  ------------------
  |  Branch (1608:15): [True: 37, False: 280]
  ------------------
 1609|     37|            if (atom->GetAtomicNum() == OBElements::Carbon && IsInSameRing(alphaAtoms[0], alphaAtoms[1])) {
  ------------------
  |  Branch (1609:17): [True: 14, False: 23]
  |  Branch (1609:63): [True: 13, False: 1]
  ------------------
 1610|     13|              if (alphaAtoms[0]->GetAtomicNum() == OBElements::Nitrogen && alphaAtoms[1]->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1610:19): [True: 9, False: 4]
  |  Branch (1610:76): [True: 3, False: 6]
  ------------------
 1611|      3|                if ((alphaAtoms[0]->GetExplicitDegree() == 3) && (alphaAtoms[1]->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (1611:21): [True: 3, False: 0]
  |  Branch (1611:66): [True: 3, False: 0]
  ------------------
 1612|      3|                  return 80; // Aromatic carbon between N's in imidazolium (CIM+)
 1613|      3|                }
 1614|      3|              }
 1615|     13|            }
 1616|     37|          }
 1617|    314|          if (alphaAtoms.size() && !betaAtoms.size()) {
  ------------------
  |  Branch (1617:15): [True: 198, False: 116]
  |  Branch (1617:36): [True: 78, False: 120]
  ------------------
 1618|     78|            if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1618:17): [True: 10, False: 68]
  ------------------
 1619|     10|              return 63; // Aromatic 5-ring C, alpha to N:, O:, or S: (C5A)
 1620|     68|            } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1620:24): [True: 48, False: 20]
  ------------------
 1621|     48|              if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1621:19): [True: 23, False: 25]
  ------------------
 1622|     23|                return 81; // Posivite nitrogen in 5-ring alpha position (N5A+)
 1623|     25|              } else {
 1624|     25|                return 65; // Aromatic 5-ring N, alpha to N:, O:, or S: (N5A)
 1625|     25|              }
 1626|     48|            }
 1627|     78|          }
 1628|    256|          if (!alphaAtoms.size() && betaAtoms.size()) {
  ------------------
  |  Branch (1628:15): [True: 116, False: 140]
  |  Branch (1628:37): [True: 91, False: 25]
  ------------------
 1629|     91|            if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1629:17): [True: 19, False: 72]
  ------------------
 1630|     19|              return 64; // Aromatic 5-ring C, beta to N:, O:, or S: (C5B)
 1631|     72|            } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1631:24): [True: 49, False: 23]
  ------------------
 1632|     49|              if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1632:19): [True: 13, False: 36]
  ------------------
 1633|     13|                return 81; // Posivite nitrogen in 5-ring beta position (N5B+)
 1634|     36|              } else {
 1635|     36|                return 66; // Aromatic 5-ring N, beta to N:, O:, or S: (N5B)
 1636|     36|              }
 1637|     49|            }
 1638|     91|          }
 1639|    188|          if (alphaAtoms.size() && betaAtoms.size()) {
  ------------------
  |  Branch (1639:15): [True: 140, False: 48]
  |  Branch (1639:36): [True: 120, False: 20]
  ------------------
 1640|    265|            for (unsigned int i = 0; i < alphaAtoms.size(); i++) {
  ------------------
  |  Branch (1640:38): [True: 147, False: 118]
  ------------------
 1641|    332|              for (unsigned int j = 0; j < betaAtoms.size(); j++) {
  ------------------
  |  Branch (1641:40): [True: 187, False: 145]
  ------------------
 1642|    187|                if (!IsInSameRing(alphaAtoms[i], betaAtoms[j])) {
  ------------------
  |  Branch (1642:21): [True: 5, False: 182]
  ------------------
 1643|      5|                  if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1643:23): [True: 1, False: 4]
  ------------------
 1644|      1|                    return 78; // General carbon in 5-membered aromatic ring (C5)
 1645|      4|                  } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1645:30): [True: 1, False: 3]
  ------------------
 1646|      1|                    return 79; // General nitrogen in 5-membered aromatic ring (N5)
 1647|      1|                  }
 1648|      5|                }
 1649|    187|              }
 1650|    147|            }
 1651|    199|            for (unsigned int i = 0; i < alphaAtoms.size(); i++) {
  ------------------
  |  Branch (1651:38): [True: 138, False: 61]
  ------------------
 1652|    138|              if (alphaAtoms[i]->GetAtomicNum() == OBElements::Sulfur || alphaAtoms[i]->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1652:19): [True: 31, False: 107]
  |  Branch (1652:74): [True: 38, False: 69]
  ------------------
 1653|     69|                if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1653:21): [True: 19, False: 50]
  ------------------
 1654|     19|                  return 63; // Aromatic 5-ring C, alpha to N:, O:, or S: (C5A)
 1655|     50|                } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1655:28): [True: 38, False: 12]
  ------------------
 1656|     38|                  return 65; // Aromatic 5-ring N, alpha to N:, O:, or S: (N5A)
 1657|     38|                }
 1658|     69|              }
 1659|    138|            }
 1660|    108|            for (unsigned int i = 0; i < betaAtoms.size(); i++) {
  ------------------
  |  Branch (1660:38): [True: 68, False: 40]
  ------------------
 1661|     68|              if (betaAtoms[i]->GetAtomicNum() == OBElements::Sulfur || betaAtoms[i]->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1661:19): [True: 13, False: 55]
  |  Branch (1661:73): [True: 25, False: 30]
  ------------------
 1662|     38|                if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1662:21): [True: 3, False: 35]
  ------------------
 1663|      3|                  return 64; // Aromatic 5-ring C, beta to N:, O:, or S: (C5B)
 1664|     35|                } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1664:28): [True: 18, False: 17]
  ------------------
 1665|     18|                  return 66; // Aromatic 5-ring N, beta to N:, O:, or S: (N5B)
 1666|     18|                }
 1667|     38|              }
 1668|     68|            }
 1669|       |
 1670|     40|            if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1670:17): [True: 1, False: 39]
  ------------------
 1671|      1|              return 78; // General carbon in 5-membered aromatic ring (C5)
 1672|     39|            } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1672:24): [True: 17, False: 22]
  ------------------
 1673|     17|              return 79; // General nitrogen in 5-membered aromatic ring (N5)
 1674|     17|            }
 1675|     40|          }
 1676|    188|        }
 1677|    420|      }
 1678|       |
 1679|    224|      if (atom->IsInRingSize(6)) {
  ------------------
  |  Branch (1679:11): [True: 136, False: 88]
  ------------------
 1680|       |
 1681|    136|        if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1681:13): [True: 31, False: 105]
  ------------------
 1682|     31|          return 37; // Aromatic carbon, e.g., in benzene (CB)
 1683|    105|        } else if (atom->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1683:20): [True: 44, False: 61]
  ------------------
 1684|    113|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|     44|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 113, False: 43]
  |  |  ------------------
  ------------------
 1685|    113|            if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1685:17): [True: 17, False: 96]
  |  Branch (1685:62): [True: 1, False: 16]
  ------------------
 1686|      1|              return 69; // Pyridinium N-oxide nitrogen (NPOX)
 1687|      1|            }
 1688|    113|          }
 1689|       |
 1690|     43|          if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1690:15): [True: 18, False: 25]
  ------------------
 1691|     18|            return 58; // Aromatic nitrogen in pyridinium (NPD+)
 1692|     25|          } else {
 1693|     25|            return 38; // Aromatic nitrogen with sigma lone pair (NPYD)
 1694|     25|          }
 1695|     43|        }
 1696|    136|      }
 1697|    224|    }
 1698|       |
 1699|       |    ////////////////////////////////
 1700|       |    // Hydrogen
 1701|       |    ////////////////////////////////
 1702|   193k|    if (atom->GetAtomicNum() == 1) {
  ------------------
  |  Branch (1702:9): [True: 28.7k, False: 164k]
  ------------------
 1703|  28.7k|      FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  28.7k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 27.7k, False: 6.87k]
  |  |  ------------------
  ------------------
 1704|  27.7k|        if (nbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1704:13): [True: 13.5k, False: 14.2k]
  ------------------
 1705|  13.5k|          return 5; // Hydrogen attatched to carbon (HC)
 1706|  13.5k|        }
 1707|  14.2k|        if (nbr->GetAtomicNum() == 14) {
  ------------------
  |  Branch (1707:13): [True: 256, False: 13.9k]
  ------------------
 1708|    256|          return 5; // Hydrogen attatched to silicon (HSI)
 1709|    256|        }
 1710|  13.9k|        if (nbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1710:13): [True: 1.80k, False: 12.1k]
  ------------------
 1711|  1.80k|          if (nbr->GetExplicitValence() == 3) {
  ------------------
  |  Branch (1711:15): [True: 193, False: 1.61k]
  ------------------
 1712|    193|            if (nbr->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1712:17): [True: 190, False: 3]
  ------------------
 1713|    190|              return 50; // Hydrogen on oxonium oxygen (HO+)
 1714|    190|            } else {
 1715|      3|              return 52; // Hydrogen on oxenium oxygen (HO=+)
 1716|      3|            }
 1717|    193|          }
 1718|       |
 1719|  1.61k|          int hydrogenCount = 0;
 1720|  3.21k|          FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|  1.61k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 3.21k, False: 1.60k]
  |  |  ------------------
  ------------------
 1721|  3.21k|            if (nbrNbr->GetAtomicNum() == OBElements::Hydrogen) {
  ------------------
  |  Branch (1721:17): [True: 3.15k, False: 64]
  ------------------
 1722|  3.15k|              hydrogenCount++;
 1723|  3.15k|              continue;
 1724|  3.15k|            }
 1725|     64|            if (nbrNbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1725:17): [True: 20, False: 44]
  ------------------
 1726|     20|              if (nbrNbr->IsAromatic()) {
  ------------------
  |  Branch (1726:19): [True: 3, False: 17]
  ------------------
 1727|      3|                return 29; // phenol
 1728|      3|              }
 1729|       |
 1730|     49|              FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|     17|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 49, False: 14]
  |  |  ------------------
  ------------------
 1731|     49|                if (nbrNbrNbr->GetIdx() == nbr->GetIdx())
  ------------------
  |  Branch (1731:21): [True: 14, False: 35]
  ------------------
 1732|     14|                  continue;
 1733|       |
 1734|     35|                bond = _mol.GetBond(&*nbrNbr, &*nbrNbrNbr);
 1735|     35|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1735:21): [True: 35, False: 0]
  |  Branch (1735:44): [True: 6, False: 29]
  ------------------
 1736|      6|                  if (nbrNbrNbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1736:23): [True: 1, False: 5]
  ------------------
 1737|      1|                    return 24; // Hydroxyl hydrogen in carboxylic acids (HOCO)
 1738|      1|                  }
 1739|      5|                  if (nbrNbrNbr->GetAtomicNum() == OBElements::Carbon || nbrNbrNbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1739:23): [True: 1, False: 4]
  |  Branch (1739:74): [True: 1, False: 3]
  ------------------
 1740|      2|                    return 29; // Enolic or phenolic hydroxyl hydrogen,
 1741|       |                    // Hydroxyl hydrogen in HO-C=N moiety (HOCC, HOCN)
 1742|      2|                  }
 1743|      5|                }
 1744|     35|              }
 1745|     17|            }
 1746|     58|            if (nbrNbr->GetAtomicNum() == OBElements::Phosphorus) {
  ------------------
  |  Branch (1746:17): [True: 1, False: 57]
  ------------------
 1747|      1|              return 24; // Hydroxyl hydrogen in H-O-P moiety (HOP)
 1748|      1|            }
 1749|     57|            if (nbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1749:17): [True: 9, False: 48]
  ------------------
 1750|      9|              return 33; // Hydrogen on oxygen attached to sulfur (HOS)
 1751|      9|            }
 1752|       |
 1753|     57|          }
 1754|  1.60k|          if (hydrogenCount == 2) {
  ------------------
  |  Branch (1754:15): [True: 1.52k, False: 77]
  ------------------
 1755|  1.52k|            return 31; // Hydroxyl hydrogen in water (HOH)
 1756|  1.52k|          }
 1757|       |
 1758|     77|          return 21; // Hydroxyl hydrogen in alcohols, Generic hydroxyl hydrogen (HOR, HO)
 1759|  1.60k|        }
 1760|  12.1k|        if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1760:13): [True: 3.83k, False: 8.32k]
  ------------------
 1761|  3.83k|          switch (GetType(&*nbr)) {
  ------------------
  |  Branch (1761:19): [True: 3.39k, False: 437]
  ------------------
 1762|      3|          case 81:
  ------------------
  |  Branch (1762:11): [True: 3, False: 3.83k]
  ------------------
 1763|      3|            return 36; // Hydrogen on imidazolium nitrogen (HIM+)
 1764|      3|          case 68:
  ------------------
  |  Branch (1764:11): [True: 3, False: 3.83k]
  ------------------
 1765|      3|            return 23; // Hydrogen on N in N-oxide (HNOX)
 1766|      0|          case 67:
  ------------------
  |  Branch (1766:11): [True: 0, False: 3.83k]
  ------------------
 1767|      0|            return 23; // Hydrogen on N in N-oxide (HNOX)
 1768|     86|          case 62:
  ------------------
  |  Branch (1768:11): [True: 86, False: 3.75k]
  ------------------
 1769|     86|            return 23; // Generic hydrogen on sp3 nitrogen, e.g., in amines (HNR)
 1770|      1|          case 56:
  ------------------
  |  Branch (1770:11): [True: 1, False: 3.83k]
  ------------------
 1771|      1|            return 36; // Hydrogen on guanimdinium nitrogen (HGD+)
 1772|      1|          case 55:
  ------------------
  |  Branch (1772:11): [True: 1, False: 3.83k]
  ------------------
 1773|      1|            return 36; // Hydrogen on amidinium nitrogen (HNN+)
 1774|      5|          case 43:
  ------------------
  |  Branch (1774:11): [True: 5, False: 3.83k]
  ------------------
 1775|      5|            return 28; // Hydrogen on NSO, NSO2, or NSO3 nitrogen, Hydrogen on N triply bonded to C (HNSO, HNC%)
 1776|      2|          case 39:
  ------------------
  |  Branch (1776:11): [True: 2, False: 3.83k]
  ------------------
 1777|      2|            return 23; // Hydrogen on nitrogen in pyrrole (HPYL)
 1778|  3.29k|          case 8:
  ------------------
  |  Branch (1778:11): [True: 3.29k, False: 538]
  ------------------
 1779|  3.29k|            return 23; // Generic hydrogen on sp3 nitrogen, e.g., in amines, Hydrogen on nitrogen in ammonia (HNR, H3N)
 1780|  3.83k|          }
 1781|       |
 1782|    437|          if (nbr->GetExplicitValence() == 4) {
  ------------------
  |  Branch (1782:15): [True: 215, False: 222]
  ------------------
 1783|    215|            if (nbr->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (1783:17): [True: 1, False: 214]
  ------------------
 1784|      1|              return 28; // Hydrogen on N triply bonded to C (HNC%)
 1785|    214|            } else {
 1786|    214|              return 36; // Hydrogen on pyridinium nitrogen, Hydrogen on protonated imine nitrogen (HPD+, HNC+)
 1787|    214|            }
 1788|    215|          }
 1789|       |
 1790|    222|          if (nbr->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (1790:15): [True: 67, False: 155]
  ------------------
 1791|     70|            FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|     67|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 70, False: 2]
  |  |  ------------------
  ------------------
 1792|     70|              if (nbrNbr->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (1792:19): [True: 3, False: 67]
  ------------------
 1793|      3|                continue;
 1794|       |
 1795|     67|              bond = _mol.GetBond(&*nbr, &*nbrNbr);
 1796|     67|              if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1796:19): [True: 67, False: 0]
  |  Branch (1796:42): [True: 65, False: 2]
  ------------------
 1797|     65|                if (nbrNbr->GetAtomicNum() == OBElements::Carbon || nbrNbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1797:21): [True: 37, False: 28]
  |  Branch (1797:69): [True: 26, False: 2]
  ------------------
 1798|     63|                  return 27; // Hydrogen on imine nitrogen, Hydrogen on azo nitrogen (HN=C, HN=N)
 1799|     63|                }
 1800|       |
 1801|      2|                return 28; // Generic hydrogen on sp2 nitrogen (HSP2)
 1802|     65|              }
 1803|     67|            }
 1804|     67|          }
 1805|       |
 1806|    248|          FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    157|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 248, False: 18]
  |  |  ------------------
  ------------------
 1807|    248|            if (nbrNbr->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (1807:17): [True: 28, False: 220]
  ------------------
 1808|     28|              continue;
 1809|       |
 1810|    220|            if (nbrNbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1810:17): [True: 68, False: 152]
  ------------------
 1811|     68|              if (nbrNbr->IsAromatic()) {
  ------------------
  |  Branch (1811:19): [True: 4, False: 64]
  ------------------
 1812|      4|                return 28; // deloc. lp pair
 1813|      4|              }
 1814|       |
 1815|    160|              FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|     64|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 160, False: 18]
  |  |  ------------------
  ------------------
 1816|    160|                if (nbrNbrNbr->GetIdx() == nbr->GetIdx())
  ------------------
  |  Branch (1816:21): [True: 56, False: 104]
  ------------------
 1817|     56|                  continue;
 1818|       |
 1819|    104|                bond = _mol.GetBond(&*nbrNbr, &*nbrNbrNbr);
 1820|    104|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1820:21): [True: 104, False: 0]
  |  Branch (1820:44): [True: 52, False: 52]
  ------------------
 1821|     52|                  if (nbrNbrNbr->GetAtomicNum() == OBElements::Carbon || nbrNbrNbr->GetAtomicNum() == OBElements::Nitrogen || nbrNbrNbr->GetAtomicNum() == OBElements::Oxygen || nbrNbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1821:23): [True: 16, False: 36]
  |  Branch (1821:74): [True: 11, False: 25]
  |  Branch (1821:127): [True: 4, False: 21]
  |  Branch (1821:178): [True: 15, False: 6]
  ------------------
 1822|     46|                    return 28; // Hydrogen on amide nitrogen, Hydrogen on thioamide nitrogen,
 1823|       |                    // Hydrogen on enamine nitrogen, Hydrogen in H-N-C=N moiety (HNCO, HNCS, HNCC, HNCN)
 1824|     46|                  }
 1825|     52|                }
 1826|    104|              }
 1827|     64|            }
 1828|    170|            if (nbrNbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1828:17): [True: 130, False: 40]
  ------------------
 1829|    253|              FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|    130|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 253, False: 49]
  |  |  ------------------
  ------------------
 1830|    253|                if (nbrNbrNbr->GetIdx() == nbr->GetIdx())
  ------------------
  |  Branch (1830:21): [True: 67, False: 186]
  ------------------
 1831|     67|                  continue;
 1832|       |
 1833|    186|                bond = _mol.GetBond(&*nbrNbr, &*nbrNbrNbr);
 1834|    186|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1834:21): [True: 185, False: 1]
  |  Branch (1834:44): [True: 81, False: 104]
  ------------------
 1835|     81|                  if (nbrNbrNbr->GetAtomicNum() == OBElements::Carbon || nbrNbrNbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1835:23): [True: 0, False: 81]
  |  Branch (1835:74): [True: 81, False: 0]
  ------------------
 1836|     81|                    return 28; // Hydrogen in H-N-N=C moiety, Hydrogen in H-N-N=N moiety (HNNC, HNNN)
 1837|     81|                  }
 1838|     81|                }
 1839|    186|              }
 1840|    130|            }
 1841|     89|            if (nbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1841:17): [True: 12, False: 77]
  ------------------
 1842|     26|              FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|     12|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 26, False: 4]
  |  |  ------------------
  ------------------
 1843|     26|                if (nbrNbrNbr->GetIdx() == nbr->GetIdx())
  ------------------
  |  Branch (1843:21): [True: 11, False: 15]
  ------------------
 1844|     11|                  continue;
 1845|       |
 1846|     15|                if (nbrNbrNbr->GetAtomicNum() == OBElements::Oxygen || (nbrNbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1846:21): [True: 7, False: 8]
  |  Branch (1846:72): [True: 1, False: 7]
  ------------------
 1847|      8|                  return 28; // Hydrogen on NSO, NSO2 or NSO3 nitrogen (HNSO)
 1848|      8|                }
 1849|     15|              }
 1850|     12|            }
 1851|     89|          }
 1852|       |
 1853|     18|          return 23; // Generic hydrogen on sp3 nitrogen e.g., in amines,
 1854|       |          // Hydrogen on nitrogen in pyrrole, Hydrogen in ammonia,
 1855|       |          // Hydrogen on N in N-oxide (HNR, HPYL, H3N, HNOX)
 1856|    157|        }
 1857|  8.32k|        if (nbr->GetAtomicNum() == OBElements::Sulfur || nbr->GetAtomicNum() == OBElements::Phosphorus) {
  ------------------
  |  Branch (1857:13): [True: 1.09k, False: 7.22k]
  |  Branch (1857:58): [True: 1.31k, False: 5.91k]
  ------------------
 1858|  2.41k|          return 71; // Hydrogen attached to sulfur, Hydrogen attached to >S= sulfur doubly bonded to N,
 1859|       |          // Hydrogen attached to phosphorus (HS, HS=N, HP)
 1860|  2.41k|        }
 1861|  8.32k|      }
 1862|  28.7k|    }
 1863|       |
 1864|       |    ////////////////////////////////
 1865|       |    // Lithium
 1866|       |    ////////////////////////////////
 1867|   171k|    if (atom->GetAtomicNum() == 3) {
  ------------------
  |  Branch (1867:9): [True: 49, False: 171k]
  ------------------
 1868|       |      // 0 neighbours
 1869|     49|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (1869:11): [True: 27, False: 22]
  ------------------
 1870|     27|        return 92; // Lithium cation (LI+)
 1871|     27|      }
 1872|     49|    }
 1873|       |
 1874|       |    ////////////////////////////////
 1875|       |    // Carbon
 1876|       |    ////////////////////////////////
 1877|   171k|    if (atom->GetAtomicNum() == 6) {
  ------------------
  |  Branch (1877:9): [True: 20.5k, False: 150k]
  ------------------
 1878|       |      // 4 neighbours
 1879|  20.5k|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (1879:11): [True: 5.09k, False: 15.4k]
  ------------------
 1880|  5.09k|        if (atom->IsInRingSize(3)) {
  ------------------
  |  Branch (1880:13): [True: 89, False: 5.00k]
  ------------------
 1881|     89|          return 22; // Aliphatic carbon in 3-membered ring (CR3R)
 1882|     89|        }
 1883|       |
 1884|  5.00k|        if (atom->IsInRingSize(4)) {
  ------------------
  |  Branch (1884:13): [True: 88, False: 4.91k]
  ------------------
 1885|     88|          return 20; // Aliphatic carbon in 4-membered ring (CR4R)
 1886|     88|        }
 1887|       |
 1888|  4.91k|        return 1; // Alkyl carbon (CR)
 1889|  5.00k|      }
 1890|       |      // 3 neighbours
 1891|  15.4k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1891:11): [True: 3.74k, False: 11.6k]
  ------------------
 1892|  3.74k|        int N2count = 0;
 1893|  3.74k|        int N3count = 0;
 1894|  3.74k|        int N3fcharge = 0;
 1895|  3.74k|        oxygenCount = sulphurCount = doubleBondTo = 0;
 1896|       |
 1897|  11.2k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  3.74k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 11.2k, False: 3.74k]
  |  |  ------------------
  ------------------
 1898|  11.2k|          bond = _mol.GetBond(&*nbr, atom);
 1899|  11.2k|          if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1899:15): [True: 11.2k, False: 0]
  |  Branch (1899:38): [True: 3.08k, False: 8.14k]
  ------------------
 1900|  3.08k|            doubleBondTo = nbr->GetAtomicNum();
 1901|  3.08k|          }
 1902|       |
 1903|  11.2k|          if (nbr->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (1903:15): [True: 3.37k, False: 7.85k]
  ------------------
 1904|  3.37k|            if (nbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (1904:17): [True: 15, False: 3.35k]
  ------------------
 1905|     15|              oxygenCount++;
 1906|  3.35k|            } else if (nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (1906:24): [True: 14, False: 3.34k]
  ------------------
 1907|     14|              sulphurCount++;
 1908|     14|            }
 1909|  7.85k|          } else if (nbr->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1909:22): [True: 5.27k, False: 2.58k]
  ------------------
 1910|  5.27k|            if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1910:17): [True: 482, False: 4.78k]
  ------------------
 1911|    482|              N3fcharge += nbr->GetFormalCharge();
 1912|    482|              N3count++;
 1913|    482|            }
 1914|  5.27k|          } else if ((nbr->GetExplicitDegree() == 2) && !bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1914:22): [True: 2.29k, False: 294]
  |  Branch (1914:57): [True: 2.29k, False: 0]
  |  Branch (1914:80): [True: 602, False: 1.68k]
  ------------------
 1915|    602|            if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1915:17): [True: 211, False: 391]
  ------------------
 1916|    211|              N2count++;
 1917|    211|            }
 1918|    602|          }
 1919|  11.2k|        }
 1920|  3.74k|        if ((N3count >= 2) && (doubleBondTo == 7 || (!(doubleBondTo == 6) && atom->GetExplicitDegree() == 3
  ------------------
  |  Branch (1920:13): [True: 106, False: 3.63k]
  |  Branch (1920:32): [True: 20, False: 86]
  |  Branch (1920:54): [True: 82, False: 4]
  |  Branch (1920:78): [True: 82, False: 0]
  ------------------
 1921|     82|          && N3fcharge == 1)) && !N2count && !oxygenCount && !sulphurCount) {
  ------------------
  |  Branch (1921:14): [True: 0, False: 82]
  |  Branch (1921:34): [True: 18, False: 2]
  |  Branch (1921:46): [True: 18, False: 0]
  |  Branch (1921:62): [True: 18, False: 0]
  ------------------
 1922|       |          // N3==C--N3
 1923|     18|          return 57; // Guanidinium carbon, Carbon in +N=C-N: resonance structures (CGD+, CNN+)
 1924|     18|        }
 1925|  3.72k|        if ((oxygenCount == 2) || (sulphurCount == 2)) {
  ------------------
  |  Branch (1925:13): [True: 1, False: 3.72k]
  |  Branch (1925:35): [True: 1, False: 3.72k]
  ------------------
 1926|       |          // O1-?-C-?-O1 or S1-?-C-?-S1
 1927|      2|          return 41; // Carbon in carboxylate anion, Carbon in thiocarboxylate anion (CO2M, CS2M)
 1928|      2|        }
 1929|  3.72k|        if (atom->IsInRingSize(4) && (doubleBondTo == 6)) {
  ------------------
  |  Branch (1929:13): [True: 129, False: 3.59k]
  |  Branch (1929:38): [True: 33, False: 96]
  ------------------
 1930|     33|	        return 30; // Olefinic carbon in 4-membered ring (CR4E)
 1931|     33|        }
 1932|  3.68k|        if ((doubleBondTo ==  7) || (doubleBondTo ==  8) ||
  ------------------
  |  Branch (1932:13): [True: 287, False: 3.40k]
  |  Branch (1932:37): [True: 9, False: 3.39k]
  ------------------
 1933|  3.39k|            (doubleBondTo == 15) || (doubleBondTo == 16)) {
  ------------------
  |  Branch (1933:13): [True: 158, False: 3.23k]
  |  Branch (1933:37): [True: 237, False: 2.99k]
  ------------------
 1934|       |          // C==N, C==O, C==P, C==S
 1935|    691|          return 3; // Generic carbonyl carbon, Imine-type carbon, Guanidine carbon,
 1936|       |          // Ketone or aldehyde carbonyl carbon, Amide carbonyl carbon,
 1937|       |          // Carboxylic acid or ester carbonyl carbon, Carbamate carbonyl carbon,
 1938|       |          // Carbonic acid or ester carbonyl carbon, Thioester carbonyl (double
 1939|       |          // bonded to O or S), Thioamide carbon (double bonded to S), Carbon
 1940|       |          // in >C=SO2, Sulfinyl carbon in >C=S=O, Thiocarboxylic acid or ester
 1941|       |          // carbon, Carbon doubly bonded to P (C=O, C=N, CGD, C=OR, C=ON, COO,
 1942|       |          // COON, COOO, C=OS, C=S, C=SN, CSO2, CS=O, CSS, C=P)
 1943|    691|        }
 1944|       |
 1945|  2.99k|        return 2; // Vinylic Carbon, Generic sp2 carbon (C=C, CSP2)
 1946|       |
 1947|  3.68k|      }
 1948|       |      // 2 neighbours
 1949|  11.6k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (1949:11): [True: 11.1k, False: 541]
  ------------------
 1950|  11.1k|        return 4; // Acetylenic carbon, Allenic caron (CSP, =C=)
 1951|  11.1k|      }
 1952|       |      // 1 neighbours
 1953|    541|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (1953:11): [True: 259, False: 282]
  ------------------
 1954|    259|        return 60; // Isonitrile carbon (C%-)
 1955|    259|      }
 1956|    541|    }
 1957|       |
 1958|       |    ////////////////////////////////
 1959|       |    // Nitrogen
 1960|       |    ////////////////////////////////
 1961|   151k|    if (atom->GetAtomicNum() == 7) {
  ------------------
  |  Branch (1961:9): [True: 28.2k, False: 123k]
  ------------------
 1962|       |      // 4 neighbours
 1963|  28.2k|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (1963:11): [True: 718, False: 27.5k]
  ------------------
 1964|  2.84k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    718|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.84k, False: 703]
  |  |  ------------------
  ------------------
 1965|  2.84k|          if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1965:15): [True: 59, False: 2.78k]
  |  Branch (1965:60): [True: 15, False: 44]
  ------------------
 1966|     15|            return 68; // sp3-hybridized N-oxide nitrogen (N3OX)
 1967|     15|          }
 1968|  2.84k|        }
 1969|       |
 1970|    703|        return 34; // Quaternary nitrogen (NR+)
 1971|    718|      }
 1972|       |      // 3 neighbours
 1973|  27.5k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (1973:11): [True: 7.51k, False: 20.0k]
  ------------------
 1974|  7.51k|        if (atom->GetExplicitValence() >= 4) { // > because we accept -N(=O)=O as a valid nitro group
  ------------------
  |  Branch (1974:13): [True: 464, False: 7.05k]
  ------------------
 1975|    464|          oxygenCount = nitrogenCount = doubleBondTo = 0;
 1976|       |
 1977|  1.39k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    464|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.39k, False: 464]
  |  |  ------------------
  ------------------
 1978|  1.39k|            if (nbr->GetAtomicNum() == OBElements::Oxygen && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (1978:17): [True: 95, False: 1.29k]
  |  Branch (1978:62): [True: 10, False: 85]
  ------------------
 1979|     10|              oxygenCount++;
 1980|     10|            }
 1981|  1.39k|            if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (1981:17): [True: 546, False: 846]
  ------------------
 1982|    546|              bond = _mol.GetBond(&*nbr, atom);
 1983|    546|              if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1983:19): [True: 546, False: 0]
  |  Branch (1983:42): [True: 97, False: 449]
  ------------------
 1984|     97|                doubleBondTo = 7;
 1985|     97|              }
 1986|    546|            }
 1987|  1.39k|            if (nbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (1987:17): [True: 148, False: 1.24k]
  ------------------
 1988|    148|              bond = _mol.GetBond(&*nbr, atom);
 1989|    148|              if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (1989:19): [True: 148, False: 0]
  |  Branch (1989:42): [True: 121, False: 27]
  ------------------
 1990|    336|                FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    121|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 336, False: 121]
  |  |  ------------------
  ------------------
 1991|    336|                  if (nbrNbr->GetAtomicNum() == OBElements::Nitrogen && (nbrNbr->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (1991:23): [True: 157, False: 179]
  |  Branch (1991:73): [True: 150, False: 7]
  ------------------
 1992|    150|                    nitrogenCount++;
 1993|    150|                  }
 1994|    336|                }
 1995|    121|              }
 1996|    148|            }
 1997|  1.39k|          }
 1998|       |
 1999|    464|          if (oxygenCount == 1) {
  ------------------
  |  Branch (1999:15): [True: 8, False: 456]
  ------------------
 2000|      8|            return 67; // sp2-hybridized N-oxide nitrogen (N2OX)
 2001|      8|          }
 2002|    456|          if (oxygenCount >= 2) {
  ------------------
  |  Branch (2002:15): [True: 1, False: 455]
  ------------------
 2003|      1|            return 45; // Nitrogen in nitro group, Nitrogen in nitrate group (NO2, NO3)
 2004|      1|          }
 2005|       |
 2006|    455|          if (nitrogenCount == 1) {
  ------------------
  |  Branch (2006:15): [True: 97, False: 358]
  ------------------
 2007|     97|            return 54; // Iminium nitrogen (N+=C)
 2008|     97|          }
 2009|    358|          if (nitrogenCount == 2) {
  ------------------
  |  Branch (2009:15): [True: 2, False: 356]
  ------------------
 2010|      2|            return 55; // Either nitrogen in N+=C-N: (NCN+)
 2011|      2|          }
 2012|    356|          if (nitrogenCount == 3) {
  ------------------
  |  Branch (2012:15): [True: 13, False: 343]
  ------------------
 2013|     13|            return 56; // Guanidinium nitrogen (NGD+)
 2014|     13|          }
 2015|       |
 2016|    343|          if (doubleBondTo == 7) {
  ------------------
  |  Branch (2016:15): [True: 80, False: 263]
  ------------------
 2017|     80|            return 54; // Positivly charged nitrogen doubly bonded to nitrogen (N+=N)
 2018|     80|          }
 2019|    343|        }
 2020|       |
 2021|  7.31k|        if (atom->GetExplicitValence() == 3) {
  ------------------
  |  Branch (2021:13): [True: 7.05k, False: 266]
  ------------------
 2022|  7.05k|          bool IsAmide = false;
 2023|  7.05k|          bool IsSulfonAmide = false;
 2024|  7.05k|          bool IsNNNorNNC = false;
 2025|  7.05k|          int tripleBondTo = 0;
 2026|  7.05k|          doubleBondTo = 0;
 2027|       |
 2028|  21.1k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  7.05k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 21.1k, False: 7.05k]
  |  |  ------------------
  ------------------
 2029|  21.1k|            if (nbr->GetAtomicNum() == OBElements::Sulfur || nbr->GetAtomicNum() == OBElements::Phosphorus) {
  ------------------
  |  Branch (2029:17): [True: 424, False: 20.7k]
  |  Branch (2029:62): [True: 206, False: 20.5k]
  ------------------
 2030|    630|              oxygenCount = 0;
 2031|       |
 2032|  2.03k|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    630|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.03k, False: 630]
  |  |  ------------------
  ------------------
 2033|  2.03k|                if (nbrNbr->GetAtomicNum() == OBElements::Oxygen && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2033:21): [True: 89, False: 1.94k]
  |  Branch (2033:69): [True: 25, False: 64]
  ------------------
 2034|     25|                  oxygenCount++;
 2035|     25|                }
 2036|  2.03k|              }
 2037|    630|              if (oxygenCount >= 2) {
  ------------------
  |  Branch (2037:19): [True: 7, False: 623]
  ------------------
 2038|      7|                IsSulfonAmide = true;
 2039|       |                //return 43; // Sulfonamide nitrogen (NSO2, NSO3)
 2040|      7|              }
 2041|    630|            }
 2042|  21.1k|          }
 2043|       |
 2044|  21.1k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  7.05k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 21.1k, False: 7.05k]
  |  |  ------------------
  ------------------
 2045|  21.1k|            if (nbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (2045:17): [True: 705, False: 20.4k]
  ------------------
 2046|  2.20k|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    705|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.20k, False: 705]
  |  |  ------------------
  ------------------
 2047|  2.20k|                bond = _mol.GetBond(&*nbr, &*nbrNbr);
 2048|  2.20k|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2 && (nbrNbr->GetAtomicNum() == OBElements::Oxygen || nbrNbr->GetAtomicNum() == OBElements::Sulfur)) {
  ------------------
  |  Branch (2048:21): [True: 2.18k, False: 22]
  |  Branch (2048:44): [True: 303, False: 1.87k]
  |  Branch (2048:74): [True: 7, False: 296]
  |  Branch (2048:122): [True: 25, False: 271]
  ------------------
 2049|     32|                  IsAmide = true;
 2050|       |                  //return 10; // Amide nitrogen, Thioamide nitrogen (NC=O, NC=S)
 2051|     32|                }
 2052|  2.20k|              }
 2053|    705|            }
 2054|  21.1k|          }
 2055|       |
 2056|  21.0k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  7.05k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 21.0k, False: 7.00k]
  |  |  ------------------
  ------------------
 2057|  21.0k|            if (nbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (2057:17): [True: 705, False: 20.3k]
  ------------------
 2058|    705|              int N2count = 0;
 2059|    705|              int N3count = 0;
 2060|    705|              oxygenCount = sulphurCount = 0;
 2061|       |
 2062|  2.20k|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    705|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.20k, False: 705]
  |  |  ------------------
  ------------------
 2063|  2.20k|                bond = _mol.GetBond(&*nbr, &*nbrNbr);
 2064|  2.20k|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2064:21): [True: 2.18k, False: 22]
  |  Branch (2064:44): [True: 303, False: 1.87k]
  ------------------
 2065|    303|                  doubleBondTo = nbrNbr->GetAtomicNum();
 2066|    303|                }
 2067|  2.20k|                if (bond->IsAromatic()) {
  ------------------
  |  Branch (2067:21): [True: 22, False: 2.18k]
  ------------------
 2068|     22|                  if ((nbrNbr->GetAtomicNum() == 7) || (nbrNbr->GetAtomicNum() == 6)) {
  ------------------
  |  Branch (2068:23): [True: 4, False: 18]
  |  Branch (2068:56): [True: 12, False: 6]
  ------------------
 2069|     16|                    doubleBondTo = nbrNbr->GetAtomicNum();
 2070|     16|                  }
 2071|     22|                }
 2072|  2.20k|                if (!bond->IsAromatic() && bond->GetBondOrder() == 3) {
  ------------------
  |  Branch (2072:21): [True: 2.18k, False: 22]
  |  Branch (2072:44): [True: 13, False: 2.16k]
  ------------------
 2073|     13|                  tripleBondTo = nbrNbr->GetAtomicNum();
 2074|     13|                }
 2075|  2.20k|                if (nbrNbr->GetAtomicNum() == OBElements::Nitrogen && (nbrNbr->GetExplicitDegree() == 3)) {
  ------------------
  |  Branch (2075:21): [True: 1.27k, False: 925]
  |  Branch (2075:71): [True: 1.05k, False: 224]
  ------------------
 2076|  1.05k|                  int nbrOxygen = 0;
 2077|  3.15k|                  FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|  1.05k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 3.15k, False: 1.05k]
  |  |  ------------------
  ------------------
 2078|  3.15k|                    if (nbrNbrNbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2078:25): [True: 51, False: 3.10k]
  ------------------
 2079|     51|                      nbrOxygen++;
 2080|     51|                    }
 2081|  3.15k|                  }
 2082|  1.05k|                  if (nbrOxygen < 2) {
  ------------------
  |  Branch (2082:23): [True: 1.04k, False: 8]
  ------------------
 2083|  1.04k|                    N3count++;
 2084|  1.04k|                  }
 2085|  1.05k|                }
 2086|  2.20k|                if (nbrNbr->GetAtomicNum() == OBElements::Nitrogen && (nbrNbr->GetExplicitDegree() == 2) && (bond->GetBondOrder() == 2 || bond->IsAromatic())) {
  ------------------
  |  Branch (2086:21): [True: 1.27k, False: 925]
  |  Branch (2086:71): [True: 161, False: 1.11k]
  |  Branch (2086:110): [True: 94, False: 67]
  |  Branch (2086:139): [True: 0, False: 67]
  ------------------
 2087|     94|                  N2count++;
 2088|     94|                }
 2089|  2.20k|                if (nbrNbr->IsAromatic()) {
  ------------------
  |  Branch (2089:21): [True: 31, False: 2.17k]
  ------------------
 2090|     31|                  if (nbrNbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2090:23): [True: 1, False: 30]
  ------------------
 2091|      1|                    oxygenCount++;
 2092|      1|                  }
 2093|     31|                  if (nbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2093:23): [True: 4, False: 27]
  ------------------
 2094|      4|                    sulphurCount++;
 2095|      4|                  }
 2096|     31|                }
 2097|  2.20k|              }
 2098|    705|              if (N3count == 3) {
  ------------------
  |  Branch (2098:19): [True: 34, False: 671]
  ------------------
 2099|     34|                return 56; // Guanidinium nitrogen (NGD+)
 2100|     34|              }
 2101|       |
 2102|    671|              if (!IsAmide && !IsSulfonAmide && !oxygenCount && !sulphurCount && nbr->IsAromatic()) {
  ------------------
  |  Branch (2102:19): [True: 637, False: 34]
  |  Branch (2102:31): [True: 636, False: 1]
  |  Branch (2102:49): [True: 635, False: 1]
  |  Branch (2102:65): [True: 632, False: 3]
  |  Branch (2102:82): [True: 9, False: 623]
  ------------------
 2103|      9|                return 40;
 2104|      9|              }
 2105|       |
 2106|    662|              if ((N3count == 2) && (doubleBondTo == 7) && !N2count) {
  ------------------
  |  Branch (2106:19): [True: 274, False: 388]
  |  Branch (2106:37): [True: 11, False: 263]
  |  Branch (2106:60): [True: 8, False: 3]
  ------------------
 2107|      8|                return 55; // Either nitrogen in N+=C-N: (NCN+)
 2108|      8|              }
 2109|    662|            }
 2110|       |
 2111|  21.0k|            if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (2111:17): [True: 8.16k, False: 12.8k]
  ------------------
 2112|  8.16k|              nitrogenCount = 0;
 2113|  22.8k|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|  8.16k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 22.8k, False: 8.16k]
  |  |  ------------------
  ------------------
 2114|  22.8k|                bond = _mol.GetBond(&*nbr, &*nbrNbr);
 2115|  22.8k|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2115:21): [True: 22.8k, False: 30]
  |  Branch (2115:44): [True: 1.25k, False: 21.5k]
  ------------------
 2116|  1.25k|                  if (nbrNbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (2116:23): [True: 132, False: 1.11k]
  ------------------
 2117|    132|                    oxygenCount = sulphurCount = 0;
 2118|    399|                    FOR_NBORS_OF_ATOM (nbrNbrNbr, &*nbrNbr) {
  ------------------
  |  |  419|    132|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 399, False: 132]
  |  |  ------------------
  ------------------
 2119|    399|                      if (nbrNbrNbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2119:27): [True: 54, False: 345]
  ------------------
 2120|     54|                        oxygenCount++;
 2121|     54|                      }
 2122|    399|                      if (nbrNbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2122:27): [True: 6, False: 393]
  ------------------
 2123|      6|                        sulphurCount++;
 2124|      6|                      }
 2125|    399|                      if (nbrNbrNbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2125:27): [True: 6, False: 393]
  ------------------
 2126|      6|                        nitrogenCount++;
 2127|      6|                      }
 2128|    399|                    }
 2129|    132|                    if (!oxygenCount && !sulphurCount && (nitrogenCount == 1)) {
  ------------------
  |  Branch (2129:25): [True: 78, False: 54]
  |  Branch (2129:41): [True: 72, False: 6]
  |  Branch (2129:58): [True: 1, False: 71]
  ------------------
 2130|      1|                      bool bondToAromC = false;
 2131|      3|                      FOR_NBORS_OF_ATOM (nbr2, atom) {
  ------------------
  |  |  419|      1|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 3, False: 1]
  |  |  ------------------
  ------------------
 2132|      3|                        if (nbr2->IsAromatic() && nbr2->GetAtomicNum() == OBElements::Carbon && nbr2->IsInRingSize(6)) {
  ------------------
  |  Branch (2132:29): [True: 0, False: 3]
  |  Branch (2132:51): [True: 0, False: 0]
  |  Branch (2132:97): [True: 0, False: 0]
  ------------------
 2133|      0|                          bondToAromC = true;
 2134|      0|                        }
 2135|      3|                      }
 2136|      1|                      if (!bondToAromC) {
  ------------------
  |  Branch (2136:27): [True: 1, False: 0]
  ------------------
 2137|      1|                        IsNNNorNNC = true;
 2138|      1|                      }
 2139|      1|                    }
 2140|    132|                  }
 2141|  1.25k|                  if (nbrNbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (2141:23): [True: 793, False: 457]
  ------------------
 2142|    793|                    bool bondToAromC = false;
 2143|  2.37k|                    FOR_NBORS_OF_ATOM (nbr2, atom) {
  ------------------
  |  |  419|    793|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.37k, False: 793]
  |  |  ------------------
  ------------------
 2144|  2.37k|                      if (nbr2->IsAromatic() && nbr2->GetAtomicNum() == OBElements::Carbon && nbr2->IsInRingSize(6)) {
  ------------------
  |  Branch (2144:27): [True: 10, False: 2.36k]
  |  Branch (2144:49): [True: 2, False: 8]
  |  Branch (2144:95): [True: 2, False: 0]
  ------------------
 2145|      2|                        bondToAromC = true;
 2146|      2|                      }
 2147|  2.37k|                    }
 2148|    793|                    if (!bondToAromC) {
  ------------------
  |  Branch (2148:25): [True: 791, False: 2]
  ------------------
 2149|    791|                      IsNNNorNNC = true;
 2150|    791|                    }
 2151|    793|                  }
 2152|  1.25k|                }
 2153|  22.8k|              }
 2154|  8.16k|            }
 2155|  21.0k|          }
 2156|       |
 2157|  7.00k|          if (IsSulfonAmide) {
  ------------------
  |  Branch (2157:15): [True: 7, False: 6.99k]
  ------------------
 2158|      7|            return 43; // Sulfonamide nitrogen (NSO2, NSO3)
 2159|      7|          }
 2160|  6.99k|          if (IsAmide) {
  ------------------
  |  Branch (2160:15): [True: 32, False: 6.96k]
  ------------------
 2161|     32|            return 10; // Amide nitrogen, Thioamide nitrogen (NC=O, NC=S)
 2162|     32|          }
 2163|       |
 2164|  6.96k|          if ((doubleBondTo ==  6) || (doubleBondTo == 7) ||(doubleBondTo == 15) || (tripleBondTo == 6)) {
  ------------------
  |  Branch (2164:15): [True: 54, False: 6.90k]
  |  Branch (2164:39): [True: 122, False: 6.78k]
  |  Branch (2164:61): [True: 16, False: 6.77k]
  |  Branch (2164:85): [True: 2, False: 6.76k]
  ------------------
 2165|    194|            return 40; // Enamine or aniline nitrogen (deloc. lp), Nitrogen in N-C=N with deloc. lp,
 2166|       |            // Nitrogen in N-C=N with deloc. lp, Nitrogen attached to C-C triple bond
 2167|       |            // (NC=C, NC=N, NC=P, NC%C)
 2168|    194|          }
 2169|  6.76k|          if (tripleBondTo == 7) {
  ------------------
  |  Branch (2169:15): [True: 8, False: 6.76k]
  ------------------
 2170|      8|            return 43; // Nitrogen attached to cyano group (NC%N)
 2171|      8|          }
 2172|  6.76k|          if (IsNNNorNNC) {
  ------------------
  |  Branch (2172:15): [True: 634, False: 6.12k]
  ------------------
 2173|    634|            return 10; // Nitrogen in N-N=C moiety with deloc. lp
 2174|       |            // Nitrogen in N-N=N moiety with deloc. lp (NN=C, NN=N)
 2175|    634|          }
 2176|       |
 2177|  6.12k|          return 8; // Amine nitrogen (NR)
 2178|  6.76k|        }
 2179|  7.31k|      }
 2180|       |      // 2 neighbours
 2181|  20.2k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (2181:11): [True: 17.9k, False: 2.37k]
  ------------------
 2182|  17.9k|        if (atom->GetExplicitValence() >= 4) {
  ------------------
  |  Branch (2182:13): [True: 384, False: 17.5k]
  ------------------
 2183|    384|          bool isNbrCarbon = false;
 2184|    384|          bool isBondTriple = false;
 2185|    768|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    384|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 768, False: 384]
  |  |  ------------------
  ------------------
 2186|    768|            if (!isNbrCarbon)
  ------------------
  |  Branch (2186:17): [True: 761, False: 7]
  ------------------
 2187|    761|              isNbrCarbon = nbr->GetAtomicNum() == OBElements::Carbon;
 2188|    768|            bond = _mol.GetBond(&*nbr, atom);
 2189|    768|            if (!isBondTriple)
  ------------------
  |  Branch (2189:17): [True: 747, False: 21]
  ------------------
 2190|    747|              isBondTriple = !bond->IsAromatic() && bond->GetBondOrder() == 3;
  ------------------
  |  Branch (2190:30): [True: 747, False: 0]
  |  Branch (2190:53): [True: 39, False: 708]
  ------------------
 2191|    768|          }
 2192|    384|          if (isBondTriple && isNbrCarbon)
  ------------------
  |  Branch (2192:15): [True: 39, False: 345]
  |  Branch (2192:31): [True: 10, False: 29]
  ------------------
 2193|     10|            return 61; // Isonitrile nitrogen (NR%)
 2194|       |
 2195|    374|          return 53; // Central nitrogen in C=N=N or N=N=N (=N=)
 2196|    384|        }
 2197|       |
 2198|  17.5k|        if (atom->GetExplicitValence() == 3) {
  ------------------
  |  Branch (2198:13): [True: 15.1k, False: 2.38k]
  ------------------
 2199|  15.1k|          doubleBondTo = 0;
 2200|       |
 2201|  23.1k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  15.1k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 23.1k, False: 822]
  |  |  ------------------
  ------------------
 2202|  23.1k|            bond = _mol.GetBond(&*nbr, atom);
 2203|  23.1k|            if (nbr->GetAtomicNum() == OBElements::Oxygen && !bond->IsAromatic() && bond->GetBondOrder() == 2 && (nbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2203:17): [True: 486, False: 22.6k]
  |  Branch (2203:62): [True: 486, False: 0]
  |  Branch (2203:85): [True: 303, False: 183]
  |  Branch (2203:114): [True: 6, False: 297]
  ------------------
 2204|      6|              return 46; // Nitrogen in nitroso group (N=O)
 2205|      6|            }
 2206|  23.0k|            if ((nbr->GetAtomicNum() == OBElements::Carbon || nbr->GetAtomicNum() == OBElements::Nitrogen) && !bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2206:18): [True: 646, False: 22.4k]
  |  Branch (2206:63): [True: 20.3k, False: 2.13k]
  |  Branch (2206:111): [True: 20.9k, False: 0]
  |  Branch (2206:134): [True: 14.3k, False: 6.66k]
  ------------------
 2207|  14.3k|              return 9; // Iminie nitrogen, Azo-group nitrogen (N=C, N=N)
 2208|  14.3k|            }
 2209|  23.0k|          }
 2210|  1.64k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    822|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.64k, False: 822]
  |  |  ------------------
  ------------------
 2211|  1.64k|            if (nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2211:17): [True: 82, False: 1.56k]
  ------------------
 2212|     82|              oxygenCount = 0;
 2213|       |
 2214|    173|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|     82|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 173, False: 82]
  |  |  ------------------
  ------------------
 2215|    173|                if (nbrNbr->GetAtomicNum() == OBElements::Oxygen && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2215:21): [True: 9, False: 164]
  |  Branch (2215:69): [True: 3, False: 6]
  ------------------
 2216|      3|                  oxygenCount++;
 2217|      3|                }
 2218|    173|              }
 2219|     82|              if (oxygenCount >= 2) {
  ------------------
  |  Branch (2219:19): [True: 0, False: 82]
  ------------------
 2220|      0|                return 43; // Sulfonamide nitrogen (NSO2, NSO3)
 2221|      0|              }
 2222|     82|            }
 2223|  1.64k|          }
 2224|    822|        }
 2225|       |
 2226|  3.21k|        if (atom->GetExplicitValence() >= 2) { // Bug reported by Paolo Tosco
  ------------------
  |  Branch (2226:13): [True: 3.20k, False: 1]
  ------------------
 2227|  3.20k|          oxygenCount = sulphurCount = 0;
 2228|       |
 2229|  6.41k|          FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  3.20k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 6.41k, False: 3.19k]
  |  |  ------------------
  ------------------
 2230|  6.41k|            if (nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2230:17): [True: 261, False: 6.15k]
  ------------------
 2231|    732|              FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    261|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 732, False: 261]
  |  |  ------------------
  ------------------
 2232|    732|                if (nbrNbr->GetAtomicNum() == OBElements::Oxygen && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2232:21): [True: 80, False: 652]
  |  Branch (2232:69): [True: 19, False: 61]
  ------------------
 2233|     19|                  oxygenCount++;
 2234|     19|                }
 2235|    732|              }
 2236|    261|              if (oxygenCount == 1) {
  ------------------
  |  Branch (2236:19): [True: 17, False: 244]
  ------------------
 2237|     17|                return 48; // Divalent nitrogen replacing monovalent O in SO2 group (NSO)
 2238|     17|              }
 2239|    261|            }
 2240|  6.41k|          }
 2241|       |
 2242|  3.19k|          return 62; // Anionic divalent nitrogen (NM)
 2243|  3.20k|        }
 2244|  3.21k|      }
 2245|       |      // 1 neighbours
 2246|  2.37k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2246:11): [True: 1.13k, False: 1.23k]
  ------------------
 2247|  1.13k|       	FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.13k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.13k, False: 1.07k]
  |  |  ------------------
  ------------------
 2248|  1.13k|          bond = _mol.GetBond(&*nbr, atom);
 2249|  1.13k|          if (!bond->IsAromatic() && bond->GetBondOrder() == 3) {
  ------------------
  |  Branch (2249:15): [True: 1.13k, False: 0]
  |  Branch (2249:38): [True: 82, False: 1.05k]
  ------------------
 2250|     92|            FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|     82|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 92, False: 72]
  |  |  ------------------
  ------------------
 2251|     92|              if (atom != &*nbrNbr && !(nbr->GetAtomicNum() == OBElements::Nitrogen
  ------------------
  |  Branch (2251:19): [True: 11, False: 81]
  |  Branch (2251:41): [True: 3, False: 8]
  ------------------
 2252|     10|                && nbrNbr->GetAtomicNum() == OBElements::Nitrogen && nbrNbr->GetExplicitDegree() == 2)) {
  ------------------
  |  Branch (2252:20): [True: 2, False: 1]
  |  Branch (2252:70): [True: 1, False: 1]
  ------------------
 2253|     10|                return 42; // Triply bonded nitrogen (NSP)
 2254|     10|              }
 2255|     92|            }
 2256|     82|          }
 2257|  1.12k|          if (nbr->GetAtomicNum() == OBElements::Nitrogen && (nbr->GetExplicitDegree() == 2)) {
  ------------------
  |  Branch (2257:15): [True: 113, False: 1.01k]
  |  Branch (2257:62): [True: 50, False: 63]
  ------------------
 2258|     50|            return 47; // Terminal nitrogen in azido group (NAZT)
 2259|     50|          }
 2260|  1.12k|        }
 2261|  1.13k|      }
 2262|  2.31k|      return 8; // generic amine nitrogen
 2263|  2.37k|    }
 2264|       |
 2265|       |    ////////////////////////////////
 2266|       |    // Oxygen
 2267|       |    ////////////////////////////////
 2268|   123k|    if (atom->GetAtomicNum() == 8) {
  ------------------
  |  Branch (2268:9): [True: 5.71k, False: 117k]
  ------------------
 2269|       |      // 3 neighbours
 2270|  5.71k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (2270:11): [True: 378, False: 5.33k]
  ------------------
 2271|    378|        return 49; // Oxonium oxygen (O+)
 2272|    378|      }
 2273|       |      // 2 neighbours
 2274|  5.33k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (2274:11): [True: 2.30k, False: 3.03k]
  ------------------
 2275|  2.30k|        int hydrogenCount = 0;
 2276|  4.60k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  2.30k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 4.60k, False: 2.30k]
  |  |  ------------------
  ------------------
 2277|  4.60k|          if (nbr->GetAtomicNum() == OBElements::Hydrogen) {
  ------------------
  |  Branch (2277:15): [True: 1.58k, False: 3.01k]
  ------------------
 2278|  1.58k|            hydrogenCount++;
 2279|  1.58k|          }
 2280|  4.60k|        }
 2281|       |
 2282|  2.30k|        if (hydrogenCount == 2) {
  ------------------
  |  Branch (2282:13): [True: 761, False: 1.54k]
  ------------------
 2283|       |          // H--O--H
 2284|    761|          return 70; // Oxygen in water (OH2)
 2285|    761|        }
 2286|  1.54k|        if (atom->GetExplicitValence() == 3) {
  ------------------
  |  Branch (2286:13): [True: 140, False: 1.40k]
  ------------------
 2287|    140|          return 51; // Oxenium oxygen (O=+)
 2288|    140|        }
 2289|       |
 2290|  1.40k|        return 6; // Generic divalent oxygen, Ether oxygen, Carboxylic acid or ester oxygen,
 2291|       |        // Enolic or phenolic oxygen, Oxygen in -O-C=N- moiety, Divalent oxygen in
 2292|       |        // thioacid or ester, Divalent nitrate "ether" oxygen, Divalent oxygen in
 2293|       |        // sulfate group, Divalent oxygen in sulfite group, One of two divalent
 2294|       |        // oxygens attached to sulfur, Divalent oxygen in R(RO)S=O, Other divalent
 2295|       |        // oxygen attached to sulfur, Divalent oxygen in phosphate group, Divalent
 2296|       |        // oxygen in phosphite group, Divalent oxygen (one of two oxygens attached
 2297|       |        // to P), Other divalent oxygen (-O-, OR, OC=O, OC=C, OC=N, OC=S, ONO2,
 2298|       |        // ON=O, OSO3, OSO2, OSO, OS=O, -OS, OPO3, OPO2, OPO, -OP)
 2299|       |
 2300|       |        // 59 ar
 2301|  1.54k|      }
 2302|       |      // 1 neighbour
 2303|  3.03k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2303:11): [True: 1.27k, False: 1.75k]
  ------------------
 2304|  1.27k|        oxygenCount = sulphurCount = 0;
 2305|       |
 2306|  1.27k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.27k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.27k, False: 0]
  |  |  ------------------
  ------------------
 2307|  1.27k|          bond = _mol.GetBond(&*nbr, atom);
 2308|       |
 2309|  1.27k|          if (nbr->GetAtomicNum() == OBElements::Carbon || nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (2309:15): [True: 52, False: 1.22k]
  |  Branch (2309:60): [True: 58, False: 1.16k]
  ------------------
 2310|    334|            FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    110|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 334, False: 110]
  |  |  ------------------
  ------------------
 2311|    334|              if (nbrNbr->GetAtomicNum() == OBElements::Oxygen && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2311:19): [True: 236, False: 98]
  |  Branch (2311:67): [True: 204, False: 32]
  ------------------
 2312|    204|                oxygenCount++;
 2313|    204|              }
 2314|    334|              if (nbrNbr->GetAtomicNum() == OBElements::Sulfur && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2314:19): [True: 24, False: 310]
  |  Branch (2314:67): [True: 9, False: 15]
  ------------------
 2315|      9|                sulphurCount++;
 2316|      9|              }
 2317|    334|            }
 2318|    110|          }
 2319|       |          // O---H
 2320|  1.27k|          if (nbr->GetAtomicNum() == OBElements::Hydrogen) {
  ------------------
  |  Branch (2320:15): [True: 25, False: 1.24k]
  ------------------
 2321|     25|            return 35;
 2322|     25|          }
 2323|       |          // O-?-C
 2324|  1.24k|          if (nbr->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (2324:15): [True: 52, False: 1.19k]
  ------------------
 2325|     52|            if (oxygenCount == 2) {
  ------------------
  |  Branch (2325:17): [True: 12, False: 40]
  ------------------
 2326|       |              // O-?-C-?-O
 2327|     12|              return 32; // Oxygen in carboxylate group (O2CM)
 2328|     12|            }
 2329|     40|            if (!bond->IsAromatic() && bond->GetBondOrder() == 1) {
  ------------------
  |  Branch (2329:17): [True: 40, False: 0]
  |  Branch (2329:40): [True: 27, False: 13]
  ------------------
 2330|       |              // O--C
 2331|     27|              return 35; // Oxide oxygen on sp3 carbon, Oxide oxygen on sp2 carbon (OM, OM2)
 2332|     27|            } else {
 2333|       |              // O==C
 2334|     13|              return 7; // Generic carbonyl oxygen, Carbonyl oxygen in amides,
 2335|       |              // Carbonyl oxygen in aldehydes and ketones, Carbonyl
 2336|       |              // oxygen in acids or esters (O=C, O=CN, O=CR, O=CO)
 2337|     13|            }
 2338|     40|          }
 2339|       |          // O-?-N
 2340|  1.19k|          if (nbr->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (2340:15): [True: 58, False: 1.13k]
  ------------------
 2341|     58|            if (oxygenCount >= 2) {
  ------------------
  |  Branch (2341:17): [True: 27, False: 31]
  ------------------
 2342|       |              // O-?-N-?-O
 2343|     27|              return 32; // Oxygen in nitro group, Nitro-group oxygen in nitrate,
 2344|       |              // Nitrate anion oxygen (O2N, O2NO, O3N)
 2345|     27|            }
 2346|     31|            if (!bond->IsAromatic() && bond->GetBondOrder() == 1) {
  ------------------
  |  Branch (2346:17): [True: 31, False: 0]
  |  Branch (2346:40): [True: 15, False: 16]
  ------------------
 2347|     15|	      if ((nbr->GetExplicitDegree() == 2) || (nbr->GetExplicitValence() == 3))
  ------------------
  |  Branch (2347:12): [True: 4, False: 11]
  |  Branch (2347:47): [True: 2, False: 9]
  ------------------
 2348|       |	      // O(-)--N
 2349|      6|	        return 35;
 2350|      9|	      else
 2351|       |              // O--N
 2352|      9|                return 32; // Oxygen in N-oxides (ONX)
 2353|     16|            } else {
 2354|       |              // sometimes ONX bonds are labelled as double bonds
 2355|       |              // (e.g. by MOE, noticed by Paolo Tosco)
 2356|     16|              int ndab = 0;
 2357|     34|              FOR_BONDS_OF_ATOM(bond2, &*nbr) {
  ------------------
  |  |  420|     16|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 34, False: 16]
  |  |  ------------------
  ------------------
 2358|     34|                if (bond2->GetBondOrder() == 2 || bond2->GetBondOrder() == 5)
  ------------------
  |  Branch (2358:21): [True: 24, False: 10]
  |  Branch (2358:51): [True: 0, False: 10]
  ------------------
 2359|     24|                  ndab++;
 2360|     34|              }
 2361|     16|              if (ndab + nbr->GetExplicitDegree() == 5)
  ------------------
  |  Branch (2361:19): [True: 6, False: 10]
  ------------------
 2362|       |                // O--N
 2363|      6|                return 32; // Oxygen in N-oxides (ONX)
 2364|     10|              else
 2365|       |                // O==N
 2366|     10|                return 7; // Nitroso oxygen (O=N)
 2367|     16|            }
 2368|     31|          }
 2369|       |          // O-?-S
 2370|  1.13k|          if (nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2370:15): [True: 181, False: 958]
  ------------------
 2371|    181|            if (sulphurCount == 1) {
  ------------------
  |  Branch (2371:17): [True: 0, False: 181]
  ------------------
 2372|       |              // O1-?-S-?-S1
 2373|      0|              return 32; // Terminal oxygen in thiosulfinate anion (OSMS)
 2374|      0|            }
 2375|    181|            if (!bond->IsAromatic() && bond->GetBondOrder() == 1) {
  ------------------
  |  Branch (2375:17): [True: 181, False: 0]
  |  Branch (2375:40): [True: 58, False: 123]
  ------------------
 2376|       |              // O--S
 2377|     58|              return 32; // Single terminal oxygen on sulfur, One of 2 terminal O's on sulfur,
 2378|       |              // One of 3 terminal O's on sulfur, Terminal O in sulfate anion,
 2379|       |              // (O-S, O2S, O3S, O4S)
 2380|    123|            } else {
 2381|       |              // O==S
 2382|       |
 2383|       |              // are all sulfur nbr atoms carbon?
 2384|    123|              bool isSulfoxide = true;
 2385|    123|              int oxygenBoundToSulfur = 0;
 2386|    258|              FOR_NBORS_OF_ATOM (nbr2, &*nbr) {
  ------------------
  |  |  419|    123|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 258, False: 123]
  |  |  ------------------
  ------------------
 2387|    258|                if (atom == &*nbr2)
  ------------------
  |  Branch (2387:21): [True: 123, False: 135]
  ------------------
 2388|    123|                  continue;
 2389|       |
 2390|    135|                if (nbr2->GetAtomicNum() == OBElements::Oxygen)
  ------------------
  |  Branch (2390:21): [True: 56, False: 79]
  ------------------
 2391|     56|                  ++oxygenBoundToSulfur;
 2392|    135|              }
 2393|    258|              FOR_NBORS_OF_ATOM (nbr2, &*nbr) {
  ------------------
  |  |  419|    123|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 258, False: 123]
  |  |  ------------------
  ------------------
 2394|    258|                if (atom == &*nbr2)
  ------------------
  |  Branch (2394:21): [True: 123, False: 135]
  ------------------
 2395|    123|                  continue;
 2396|    135|                OBBond* bond = nbr->GetBond(&*nbr2);
 2397|    135|                if (!bond->IsAromatic() && bond->GetBondOrder() == 2
  ------------------
  |  Branch (2397:21): [True: 133, False: 2]
  |  Branch (2397:44): [True: 53, False: 80]
  ------------------
 2398|     53|                  && nbr2->GetAtomicNum() == OBElements::Carbon && oxygenBoundToSulfur == 1)
  ------------------
  |  Branch (2398:22): [True: 1, False: 52]
  |  Branch (2398:68): [True: 0, False: 1]
  ------------------
 2399|      0|                  isSulfoxide = false; // O=S on sulfur doubly bonded to, e.g., C (O=S=)
 2400|       |
 2401|    135|                if ((nbr2->GetAtomicNum() == OBElements::Oxygen && nbr2->GetExplicitDegree() == 1)
  ------------------
  |  Branch (2401:22): [True: 56, False: 79]
  |  Branch (2401:68): [True: 52, False: 4]
  ------------------
 2402|     83|		  || (nbr2->GetAtomicNum() == OBElements::Nitrogen && nbr2->GetExplicitDegree() == 2))
  ------------------
  |  Branch (2402:9): [True: 13, False: 70]
  |  Branch (2402:57): [True: 6, False: 7]
  ------------------
 2403|     58|                  isSulfoxide = false;
 2404|    135|              }
 2405|       |
 2406|    123|              if (isSulfoxide)
  ------------------
  |  Branch (2406:19): [True: 73, False: 50]
  ------------------
 2407|     73|                return 7; // Doubly bonded sulfoxide oxygen (O=S)
 2408|     50|              else
 2409|     50|                return 32; // (O2S, O2S=C, O3S, O4S)
 2410|    123|            }
 2411|    181|          }
 2412|       |
 2413|    958|          return 32; // Oxygen in phosphine oxide, One of 2 terminal O's on sulfur,
 2414|       |          // One of 3 terminal O's on sulfur, One of 4 terminal O's on sulfur,
 2415|       |          // Oxygen in perchlorate anion (OP, O2P, O3P, O4P, O4Cl)
 2416|  1.13k|        }
 2417|  1.27k|      }
 2418|  3.03k|    }
 2419|       |
 2420|       |    ////////////////////////////////
 2421|       |    // Flourine
 2422|       |    ////////////////////////////////
 2423|   119k|    if (atom->GetAtomicNum() == 9) {
  ------------------
  |  Branch (2423:9): [True: 29.0k, False: 89.9k]
  ------------------
 2424|       |      // 1 neighbour
 2425|  29.0k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2425:11): [True: 421, False: 28.6k]
  ------------------
 2426|    421|        return 11; // Fluorine (F)
 2427|    421|      }
 2428|       |      // 0 neighbours
 2429|  28.6k|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (2429:11): [True: 112, False: 28.5k]
  ------------------
 2430|    112|        return 89; // Fluoride anion (F-)
 2431|    112|      }
 2432|  28.6k|    }
 2433|       |
 2434|       |    ////////////////////////////////
 2435|       |    // Sodium
 2436|       |    ////////////////////////////////
 2437|   118k|    if (atom->GetAtomicNum() == 11) {
  ------------------
  |  Branch (2437:9): [True: 67, False: 118k]
  ------------------
 2438|     67|      return 93; // Sodium cation (NA+)
 2439|     67|    }
 2440|       |
 2441|       |    ////////////////////////////////
 2442|       |    // Magnesium
 2443|       |    ////////////////////////////////
 2444|   118k|    if (atom->GetAtomicNum() == 12) {
  ------------------
  |  Branch (2444:9): [True: 248, False: 118k]
  ------------------
 2445|    248|      return 99; // Dipositive magnesium cation (MG+2)
 2446|    248|    }
 2447|       |
 2448|       |    ////////////////////////////////
 2449|       |    // Silicon
 2450|       |    ////////////////////////////////
 2451|   118k|    if (atom->GetAtomicNum() == 14) {
  ------------------
  |  Branch (2451:9): [True: 80, False: 118k]
  ------------------
 2452|     80|      return 19; // Silicon (SI)
 2453|     80|    }
 2454|       |
 2455|       |    ////////////////////////////////
 2456|       |    // Phosphorus
 2457|       |    ////////////////////////////////
 2458|   118k|    if (atom->GetAtomicNum() == 15) {
  ------------------
  |  Branch (2458:9): [True: 29.1k, False: 88.9k]
  ------------------
 2459|  29.1k|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (2459:11): [True: 3.18k, False: 26.0k]
  ------------------
 2460|  3.18k|        return 25; // Phosphate group phosphorus, Phosphorus with 3 attached oxygens,
 2461|       |        // Phosphorus with 2 attached oxygens, Phosphine oxide phosphorus,
 2462|       |        // General tetracoordinate phosphorus (PO4, PO3, PO2, PO, PTET)
 2463|  3.18k|      }
 2464|  26.0k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (2464:11): [True: 3.21k, False: 22.7k]
  ------------------
 2465|  3.21k|        return 26; // Phosphorus in phosphines (P)
 2466|  3.21k|      }
 2467|  22.7k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (2467:11): [True: 15.2k, False: 7.53k]
  ------------------
 2468|  15.2k|        return 75; // Phosphorus doubly bonded to C (-P=C)
 2469|  15.2k|      }
 2470|  22.7k|    }
 2471|       |
 2472|       |    ////////////////////////////////
 2473|       |    // Sulfur
 2474|       |    ////////////////////////////////
 2475|  96.4k|    if (atom->GetAtomicNum() == 16) {
  ------------------
  |  Branch (2475:9): [True: 6.45k, False: 90.0k]
  ------------------
 2476|       |      // 4 neighbours
 2477|  6.45k|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (2477:11): [True: 84, False: 6.36k]
  ------------------
 2478|     84|        return 18; // Sulfone sulfur, Sulfonamide sulfur, Sulfonate group sulfur,
 2479|       |        // Sulfate group sulfur, Sulfur in nitrogen analog of sulfone
 2480|       |        // (SO2, SO2N, SO3, SO4, SNO)
 2481|     84|      }
 2482|       |      // 3 neighbours
 2483|  6.36k|      if (atom->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (2483:11): [True: 735, False: 5.63k]
  ------------------
 2484|    735|        oxygenCount = sulphurCount = doubleBondTo = 0;
 2485|       |
 2486|  2.20k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    735|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.20k, False: 735]
  |  |  ------------------
  ------------------
 2487|  2.20k|          bond = _mol.GetBond(&*nbr, atom);
 2488|  2.20k|          if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2488:15): [True: 2.19k, False: 6]
  |  Branch (2488:38): [True: 622, False: 1.57k]
  ------------------
 2489|    622|            if (nbr->GetAtomicNum() == 6)
  ------------------
  |  Branch (2489:17): [True: 262, False: 360]
  ------------------
 2490|    262|	            doubleBondTo = 6;
 2491|    622|          }
 2492|       |
 2493|  2.20k|          if (nbr->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2493:15): [True: 129, False: 2.07k]
  ------------------
 2494|    129|            if (nbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2494:17): [True: 26, False: 103]
  ------------------
 2495|     26|              oxygenCount++;
 2496|    103|            } else if (nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (2496:24): [True: 14, False: 89]
  ------------------
 2497|     14|              sulphurCount++;
 2498|     14|            }
 2499|    129|          }
 2500|  2.20k|        }
 2501|       |
 2502|    735|        if (oxygenCount == 2) {
  ------------------
  |  Branch (2502:13): [True: 2, False: 733]
  ------------------
 2503|      2|          if (doubleBondTo == 6) {
  ------------------
  |  Branch (2503:15): [True: 0, False: 2]
  ------------------
 2504|      0|            return 18; // Sulfone sulfur, doubly bonded to carbon (=SO2)
 2505|      0|          }
 2506|      2|          return 73; // Sulfur in anionic sulfinate group (SO2M)
 2507|      2|        }
 2508|    733|        if (oxygenCount && sulphurCount)
  ------------------
  |  Branch (2508:13): [True: 18, False: 715]
  |  Branch (2508:28): [True: 2, False: 16]
  ------------------
 2509|      2|          return 73; // Tricoordinate sulfur in anionic thiosulfinate group (SSOM)
 2510|       |
 2511|       |        //if ((doubleBondTo == 6) || (doubleBondTo == 8))
 2512|    731|        return 17; // Sulfur doubly bonded to carbon, Sulfoxide sulfur (S=C, S=O)
 2513|    733|      }
 2514|       |      // 2 neighbours
 2515|  5.63k|      if (atom->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (2515:11): [True: 4.02k, False: 1.60k]
  ------------------
 2516|  4.02k|        doubleBondTo = 0;
 2517|       |
 2518|  8.05k|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  4.02k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 8.05k, False: 4.02k]
  |  |  ------------------
  ------------------
 2519|  8.05k|          if (nbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2519:15): [True: 183, False: 7.87k]
  ------------------
 2520|    183|            bond = _mol.GetBond(&*nbr, atom);
 2521|    183|            if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2521:17): [True: 177, False: 6]
  |  Branch (2521:40): [True: 60, False: 117]
  ------------------
 2522|     60|              doubleBondTo = 8;
 2523|     60|            }
 2524|    183|          }
 2525|  8.05k|        }
 2526|       |
 2527|  4.02k|        if (doubleBondTo == 8)
  ------------------
  |  Branch (2527:13): [True: 45, False: 3.98k]
  ------------------
 2528|     45|          return 74; // Sulfinyl sulfur, e.g., in C=S=O (=S=O)
 2529|       |
 2530|  3.98k|        return 15; // Thiol, sulfide, or disulfide sulfor (S)
 2531|  4.02k|      }
 2532|       |      // 1 neighbour
 2533|  1.60k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2533:11): [True: 740, False: 865]
  ------------------
 2534|    740|        sulphurCount = doubleBondTo = 0;
 2535|       |
 2536|    740|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|    740|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 740, False: 740]
  |  |  ------------------
  ------------------
 2537|  2.71k|          FOR_NBORS_OF_ATOM (nbrNbr, &*nbr) {
  ------------------
  |  |  419|    740|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 2.71k, False: 740]
  |  |  ------------------
  ------------------
 2538|  2.71k|            if (nbrNbr->GetAtomicNum() == OBElements::Sulfur && (nbrNbr->GetExplicitDegree() == 1)) {
  ------------------
  |  Branch (2538:17): [True: 1.09k, False: 1.62k]
  |  Branch (2538:65): [True: 1.01k, False: 72]
  ------------------
 2539|  1.01k|              sulphurCount++;
 2540|  1.01k|            }
 2541|  2.71k|          }
 2542|    740|          bond = _mol.GetBond(&*nbr, atom);
 2543|    740|          if (!bond->IsAromatic() && bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (2543:15): [True: 740, False: 0]
  |  Branch (2543:38): [True: 73, False: 667]
  ------------------
 2544|     73|            doubleBondTo = nbr->GetAtomicNum();
 2545|     73|          }
 2546|    740|        }
 2547|       |
 2548|    740|        if ((doubleBondTo == 6) && (sulphurCount != 2)) {
  ------------------
  |  Branch (2548:13): [True: 12, False: 728]
  |  Branch (2548:36): [True: 12, False: 0]
  ------------------
 2549|     12|          return 16; // Sulfur doubly bonded to carbon (S=C)
 2550|     12|        }
 2551|       |
 2552|    728|        return 72; // Terminal sulfur bonded to P, Anionic terminal sulfur,
 2553|       |        // Terminal sulfur in thiosulfinate group (S-P, SM, SSMO)
 2554|    740|      }
 2555|       |
 2556|       |      // 44 ar
 2557|  1.60k|    }
 2558|       |
 2559|       |    ////////////////////////////////
 2560|       |    // Clorine
 2561|       |    ////////////////////////////////
 2562|  90.8k|    if (atom->GetAtomicNum() == 17) {
  ------------------
  |  Branch (2562:9): [True: 354, False: 90.5k]
  ------------------
 2563|       |      // 4 neighbour
 2564|    354|      if (atom->GetExplicitDegree() == 4) {
  ------------------
  |  Branch (2564:11): [True: 9, False: 345]
  ------------------
 2565|      9|        oxygenCount = 0;
 2566|       |
 2567|     36|        FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|      9|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 36, False: 9]
  |  |  ------------------
  ------------------
 2568|     36|          if (nbr->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (2568:15): [True: 1, False: 35]
  ------------------
 2569|      1|            oxygenCount++;
 2570|      1|          }
 2571|     36|        }
 2572|      9|        if (oxygenCount == 4)
  ------------------
  |  Branch (2572:13): [True: 0, False: 9]
  ------------------
 2573|      0|          return 77; // Perchlorate anion chlorine (CLO4)
 2574|      9|      }
 2575|       |      // 1 neighbour
 2576|    354|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2576:11): [True: 179, False: 175]
  ------------------
 2577|    179|        return 12; // Chlorine (CL)
 2578|    179|      }
 2579|       |      // 0 neighbours
 2580|    175|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (2580:11): [True: 59, False: 116]
  ------------------
 2581|     59|        return 90; // Chloride anion (CL-)
 2582|     59|      }
 2583|    175|    }
 2584|       |
 2585|       |    ////////////////////////////////
 2586|       |    // Potasium
 2587|       |    ////////////////////////////////
 2588|  90.6k|    if (atom->GetAtomicNum() == 19) {
  ------------------
  |  Branch (2588:9): [True: 210, False: 90.4k]
  ------------------
 2589|    210|      return 94; // Potasium cation (K+)
 2590|    210|    }
 2591|       |
 2592|       |    ////////////////////////////////
 2593|       |    // Calcium
 2594|       |    ////////////////////////////////
 2595|  90.4k|    if (atom->GetAtomicNum() == 20) {
  ------------------
  |  Branch (2595:9): [True: 132, False: 90.3k]
  ------------------
 2596|       |      // 0 neighbours
 2597|    132|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (2597:11): [True: 45, False: 87]
  ------------------
 2598|     45|        return 96; // Dipositive calcium cation (CA+2)
 2599|     45|      }
 2600|    132|    }
 2601|       |
 2602|       |    ////////////////////////////////
 2603|       |    // Iron
 2604|       |    ////////////////////////////////
 2605|  90.3k|    if (atom->GetAtomicNum() == 26) {
  ------------------
  |  Branch (2605:9): [True: 89, False: 90.3k]
  ------------------
 2606|     89|      if (atom->GetFormalCharge() == 2)
  ------------------
  |  Branch (2606:11): [True: 1, False: 88]
  ------------------
 2607|      1|        return 87; // Dipositive iron (FE+2)
 2608|     88|      else
 2609|     88|        return 88; // Tripositive iron (FE+3)
 2610|     89|    }
 2611|       |
 2612|       |    ////////////////////////////////
 2613|       |    // Copper
 2614|       |    ////////////////////////////////
 2615|  90.3k|    if (atom->GetAtomicNum() == 29) {
  ------------------
  |  Branch (2615:9): [True: 142, False: 90.1k]
  ------------------
 2616|    142|      if (atom->GetFormalCharge() == 1)
  ------------------
  |  Branch (2616:11): [True: 3, False: 139]
  ------------------
 2617|      3|        return 97; // Monopositive copper cation (CU+1)
 2618|    139|      else
 2619|    139|        return 98; // Dipositive copper cation (CU+2)
 2620|    142|    }
 2621|       |
 2622|       |    ////////////////////////////////
 2623|       |    // Zinc
 2624|       |    ////////////////////////////////
 2625|  90.1k|    if (atom->GetAtomicNum() == 30) {
  ------------------
  |  Branch (2625:9): [True: 93, False: 90.0k]
  ------------------
 2626|     93|      return 95; // Dipositive zinc cation (ZN+2)
 2627|     93|    }
 2628|       |
 2629|       |    ////////////////////////////////
 2630|       |    // Bromine
 2631|       |    ////////////////////////////////
 2632|  90.0k|    if (atom->GetAtomicNum() == 35) {
  ------------------
  |  Branch (2632:9): [True: 81, False: 89.9k]
  ------------------
 2633|       |      // 1 neighbour
 2634|     81|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2634:11): [True: 49, False: 32]
  ------------------
 2635|     49|        return 13; // Bromine (BR)
 2636|     49|      }
 2637|       |      // 0 neighbours
 2638|     32|      if (atom->GetExplicitDegree() == 0) {
  ------------------
  |  Branch (2638:11): [True: 24, False: 8]
  ------------------
 2639|     24|        return 91; // Bromide anion (BR-)
 2640|     24|      }
 2641|     32|    }
 2642|       |
 2643|       |    ////////////////////////////////
 2644|       |    // Iodine
 2645|       |    ////////////////////////////////
 2646|  89.9k|    if (atom->GetAtomicNum() == 53) {
  ------------------
  |  Branch (2646:9): [True: 2.47k, False: 87.5k]
  ------------------
 2647|       |      // 1 neighbour
 2648|  2.47k|      if (atom->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (2648:11): [True: 350, False: 2.12k]
  ------------------
 2649|    350|        return 14; // Iodine (I)
 2650|    350|      }
 2651|  2.47k|    }
 2652|       |
 2653|       |
 2654|       |
 2655|  89.6k|    return 0;
 2656|  89.9k|  }
_ZN9OpenBabel18OBForceFieldMMFF948SetTypesEv:
 2659|  2.00k|  {
 2660|  2.00k|    char type[4];
 2661|       |
 2662|  2.00k|    _mol.SetAtomTypesPerceived();
 2663|       |
 2664|       |    // mark all atoms and bonds as non-aromatic
 2665|  2.00k|    _mol.SetAromaticPerceived();
 2666|  2.00k|    FOR_BONDS_OF_MOL (bond, _mol)
  ------------------
  |  |  418|  2.00k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 157k, False: 2.00k]
  |  |  ------------------
  ------------------
 2667|   157k|      bond->SetAromatic(false);
 2668|  2.00k|    FOR_ATOMS_OF_MOL (atom, _mol)
  ------------------
  |  |  417|  2.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 190k, False: 2.00k]
  |  |  ------------------
  ------------------
 2669|   190k|      atom->SetAromatic(false);
 2670|       |
 2671|       |    // It might be needed to run this function more than once...
 2672|  2.00k|    bool done = true;
 2673|  4.10k|    while (done) {
  ------------------
  |  Branch (2673:12): [True: 2.09k, False: 2.00k]
  ------------------
 2674|  2.09k|      done = PerceiveAromatic();
 2675|  2.09k|    }
 2676|       |
 2677|   190k|    FOR_ATOMS_OF_MOL (atom, _mol) {
  ------------------
  |  |  417|  2.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 190k, False: 2.00k]
  |  |  ------------------
  ------------------
 2678|   190k|      snprintf(type, 3, "%d", GetType(&*atom));
 2679|   190k|      atom->SetType(type);
 2680|   190k|    }
 2681|       |
 2682|  2.00k|    PrintTypes();
 2683|       |
 2684|  2.00k|    return true;
 2685|  2.00k|  }
_ZN9OpenBabel18OBForceFieldMMFF9417SetupCalculationsEv:
 2688|  2.00k|  {
 2689|  2.00k|    OBFFParameter *parameter;
 2690|  2.00k|    OBAtom *a, *b, *c, *d;
 2691|  2.00k|    int type_a, type_b, type_c, type_d;
 2692|  2.00k|    bool found;
 2693|  2.00k|    int order;
 2694|       |
 2695|  2.00k|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|  2.00k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  2.00k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 2.00k]
  |  |  ------------------
  ------------------
 2696|      0|      OBFFLog("\nS E T T I N G   U P   C A L C U L A T I O N S\n\n");
 2697|       |
 2698|       |    //
 2699|       |    // Bond Calculations
 2700|       |    //
 2701|       |    // no "step-down" procedure
 2702|       |    // MMFF part V - page 625 (empirical rule)
 2703|       |    //
 2704|  2.00k|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|  2.00k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  2.00k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 2.00k]
  |  |  ------------------
  ------------------
 2705|      0|      OBFFLog("SETTING UP BOND CALCULATIONS...\n");
 2706|       |
 2707|  2.00k|    OBFFBondCalculationMMFF94 bondcalc;
 2708|  2.00k|    int bondtype;
 2709|       |
 2710|  2.00k|    _bondcalculations.clear();
 2711|       |
 2712|  2.00k|    FOR_BONDS_OF_MOL(bond, _mol) {
  ------------------
  |  |  418|  2.00k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 1.57k, False: 424]
  |  |  ------------------
  ------------------
 2713|  1.57k|      a = bond->GetBeginAtom();
 2714|  1.57k|      b = bond->GetEndAtom();
 2715|       |
 2716|       |      // skip this bond if the atoms are ignored
 2717|  1.57k|      if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) )
  ------------------
  |  Branch (2717:12): [True: 0, False: 1.57k]
  |  Branch (2717:51): [True: 0, False: 1.57k]
  ------------------
 2718|      0|        continue;
 2719|       |
 2720|       |      // if there are any groups specified, check if the two bond atoms are in a single intraGroup
 2721|  1.57k|      if (HasGroups()) {
  ------------------
  |  Branch (2721:11): [True: 0, False: 1.57k]
  ------------------
 2722|      0|        bool validBond = false;
 2723|      0|        for (unsigned int i=0; i < _intraGroup.size(); ++i) {
  ------------------
  |  Branch (2723:32): [True: 0, False: 0]
  ------------------
 2724|      0|          if (_intraGroup[i].BitIsSet(a->GetIdx()) && _intraGroup[i].BitIsSet(b->GetIdx())) {
  ------------------
  |  Branch (2724:15): [True: 0, False: 0]
  |  Branch (2724:55): [True: 0, False: 0]
  ------------------
 2725|      0|            validBond = true;
 2726|      0|            break;
 2727|      0|          }
 2728|      0|        }
 2729|      0|        if (!validBond)
  ------------------
  |  Branch (2729:13): [True: 0, False: 0]
  ------------------
 2730|      0|          continue;
 2731|      0|      }
 2732|       |
 2733|  1.57k|      bondtype = GetBondType(a, b);
 2734|       |
 2735|  1.57k|      parameter = GetTypedParameter2Atom(bondtype, atoi(a->GetType()), atoi(b->GetType()), _ffbondparams); // from mmffbond.par
 2736|  1.57k|      if (parameter == nullptr) {
  ------------------
  |  Branch (2736:11): [True: 1.57k, False: 0]
  ------------------
 2737|  1.57k|        parameter = GetParameter2Atom(a->GetAtomicNum(), b->GetAtomicNum(), _ffbndkparams); // from mmffbndk.par - emperical rules
 2738|  1.57k|        if (parameter == nullptr) {
  ------------------
  |  Branch (2738:13): [True: 1.57k, False: 0]
  ------------------
 2739|  1.57k|          IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|  1.57k|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|  1.57k|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 1.57k]
  |  |  ------------------
  ------------------
 2740|       |            // This should never happen
 2741|      0|            snprintf(_logbuf, BUFF_SIZE, "    COULD NOT FIND PARAMETERS FOR BOND %d-%d (IDX)...\n", a->GetIdx(), b->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2742|      0|            OBFFLog(_logbuf);
 2743|      0|          }
 2744|  1.57k|          return false;
 2745|  1.57k|        } else {
 2746|      0|          IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2747|      0|            snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR BOND STRETCHING %d-%d (IDX)...\n", a->GetIdx(), b->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2748|      0|            OBFFLog(_logbuf);
 2749|      0|          }
 2750|       |
 2751|      0|          double rr, rr2, rr4, rr6;
 2752|      0|          bondcalc.a = a;
 2753|      0|          bondcalc.b = b;
 2754|      0|          bondcalc.r0 = GetRuleBondLength(a, b);
 2755|       |
 2756|      0|          rr = parameter->_dpar[0] / bondcalc.r0; // parameter->_dpar[0]  = r0-ref
 2757|      0|          rr2 = rr * rr;
 2758|      0|          rr4 = rr2 * rr2;
 2759|      0|          rr6 = rr4 * rr2;
 2760|       |
 2761|      0|          bondcalc.kb = parameter->_dpar[1] * rr6; // parameter->_dpar[1]  = kb-ref
 2762|      0|          bondcalc.bt = bondtype;
 2763|      0|          bondcalc.SetupPointers();
 2764|       |
 2765|      0|          _bondcalculations.push_back(bondcalc);
 2766|      0|        }
 2767|  1.57k|      } else {
 2768|      0|        bondcalc.a = a;
 2769|      0|        bondcalc.b = b;
 2770|      0|        bondcalc.kb = parameter->_dpar[0];
 2771|      0|        bondcalc.r0 = parameter->_dpar[1];
 2772|      0|        bondcalc.bt = bondtype;
 2773|      0|        bondcalc.SetupPointers();
 2774|       |
 2775|      0|        _bondcalculations.push_back(bondcalc);
 2776|      0|      }
 2777|  1.57k|    }
 2778|       |
 2779|       |    //
 2780|       |    // Angle Calculations
 2781|       |    //
 2782|       |    // MMFF part I - page 513 ("step-down" prodedure)
 2783|       |    // MMFF part I - page 519 (reference 68 is actually a footnote)
 2784|       |    // MMFF part V - page 627 (empirical rule)
 2785|       |    //
 2786|       |    // First try and find an exact match, if this fails, step down using the equivalences from mmffdef.par
 2787|       |    // five-stage protocol: 1-1-1, 2-2-2, 3-2-3, 4-2-4, 5-2-5
 2788|       |    // If this fails, use empirical rules
 2789|       |    // Since 1-1-1 = 2-2-2, we will only try 1-1-1 before going to 3-2-3
 2790|       |    //
 2791|       |    // Stretch-Bend Calculations
 2792|       |    //
 2793|    424|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    424|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    424|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 2794|      0|      OBFFLog("SETTING UP ANGLE & STRETCH-BEND CALCULATIONS...\n");
 2795|       |
 2796|    424|    OBFFAngleCalculationMMFF94 anglecalc;
 2797|    424|    OBFFStrBndCalculationMMFF94 strbndcalc;
 2798|    424|    int angletype, strbndtype, bondtype1, bondtype2;
 2799|       |
 2800|    424|    _anglecalculations.clear();
 2801|    424|    _strbndcalculations.clear();
 2802|       |
 2803|    424|    FOR_ANGLES_OF_MOL(angle, _mol) {
  ------------------
  |  |  427|    424|#define FOR_ANGLES_OF_MOL(a,m)    for( OpenBabel::OBMolAngleIter    a(m); a; ++a )
  |  |  ------------------
  |  |  |  Branch (427:75): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 2804|      0|      b = _mol.GetAtom((*angle)[0] + 1);
 2805|      0|      a = _mol.GetAtom((*angle)[1] + 1);
 2806|      0|      c = _mol.GetAtom((*angle)[2] + 1);
 2807|       |      // Cached AngleData can reference indices that no longer exist.
 2808|      0|      if (a == nullptr || b == nullptr || c == nullptr)
  ------------------
  |  Branch (2808:11): [True: 0, False: 0]
  |  Branch (2808:27): [True: 0, False: 0]
  |  Branch (2808:43): [True: 0, False: 0]
  ------------------
 2809|      0|        continue;
 2810|       |
 2811|      0|      type_a = atoi(a->GetType());
 2812|      0|      type_b = atoi(b->GetType());
 2813|      0|      type_c = atoi(c->GetType());
 2814|       |
 2815|       |      // skip this angle if the atoms are ignored
 2816|      0|      if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) || _constraints.IsIgnored(c->GetIdx()) )
  ------------------
  |  Branch (2816:12): [True: 0, False: 0]
  |  Branch (2816:51): [True: 0, False: 0]
  |  Branch (2816:90): [True: 0, False: 0]
  ------------------
 2817|      0|        continue;
 2818|       |
 2819|       |      // if there are any groups specified, check if the three angle atoms are in a single intraGroup
 2820|      0|      if (HasGroups()) {
  ------------------
  |  Branch (2820:11): [True: 0, False: 0]
  ------------------
 2821|      0|        bool validAngle = false;
 2822|      0|        for (unsigned int i=0; i < _intraGroup.size(); ++i) {
  ------------------
  |  Branch (2822:32): [True: 0, False: 0]
  ------------------
 2823|      0|          if (_intraGroup[i].BitIsSet(a->GetIdx()) && _intraGroup[i].BitIsSet(b->GetIdx()) &&
  ------------------
  |  Branch (2823:15): [True: 0, False: 0]
  |  Branch (2823:55): [True: 0, False: 0]
  ------------------
 2824|      0|              _intraGroup[i].BitIsSet(c->GetIdx())) {
  ------------------
  |  Branch (2824:15): [True: 0, False: 0]
  ------------------
 2825|      0|            validAngle = true;
 2826|      0|            break;
 2827|      0|          }
 2828|      0|        }
 2829|      0|        if (!validAngle)
  ------------------
  |  Branch (2829:13): [True: 0, False: 0]
  ------------------
 2830|      0|          continue;
 2831|      0|      }
 2832|       |
 2833|      0|      angletype = GetAngleType(a, b, c);
 2834|      0|      strbndtype = GetStrBndType(a, b, c);
 2835|      0|      bondtype1 = GetBondType(a, b);
 2836|      0|      bondtype2 = GetBondType(b, c);
 2837|       |
 2838|      0|      if (HasLinSet(type_b)) {
  ------------------
  |  Branch (2838:11): [True: 0, False: 0]
  ------------------
 2839|      0|        anglecalc.linear = true;
 2840|      0|      } else {
 2841|      0|        anglecalc.linear = false;
 2842|      0|      }
 2843|       |
 2844|       |      // try exact match
 2845|      0|      parameter = GetTypedParameter3Atom(angletype, type_a, type_b, type_c, _ffangleparams);
 2846|      0|      if (parameter == nullptr) // try 3-2-3
  ------------------
  |  Branch (2846:11): [True: 0, False: 0]
  ------------------
 2847|      0|        parameter = GetTypedParameter3Atom(angletype, EqLvl3(type_a), type_b, EqLvl3(type_c), _ffangleparams);
 2848|      0|      if (parameter == nullptr) // try 4-2-4
  ------------------
  |  Branch (2848:11): [True: 0, False: 0]
  ------------------
 2849|      0|        parameter = GetTypedParameter3Atom(angletype, EqLvl4(type_a), type_b, EqLvl4(type_c), _ffangleparams);
 2850|      0|      if (parameter == nullptr) // try 5-2-5
  ------------------
  |  Branch (2850:11): [True: 0, False: 0]
  ------------------
 2851|      0|        parameter = GetTypedParameter3Atom(angletype, EqLvl5(type_a), type_b, EqLvl5(type_c), _ffangleparams);
 2852|       |
 2853|      0|      if (parameter) {
  ------------------
  |  Branch (2853:11): [True: 0, False: 0]
  ------------------
 2854|      0|        anglecalc.ka = parameter->_dpar[0];
 2855|      0|        anglecalc.theta0 = parameter->_dpar[1];
 2856|      0|        strbndcalc.theta0 = parameter->_dpar[1]; // **
 2857|      0|      } else {
 2858|      0|        IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2859|      0|          snprintf(_logbuf, BUFF_SIZE, "   USING DEFAULT ANGLE FOR %d-%d-%d (IDX)...\n", a->GetIdx(), b->GetIdx(), c->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2860|      0|          snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR ANGLE BENDING %d-%d-%d (IDX)...\n", a->GetIdx(), b->GetIdx(), c->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2861|      0|          OBFFLog(_logbuf);
 2862|      0|        }
 2863|       |
 2864|      0|        anglecalc.ka = 0.0;
 2865|      0|        anglecalc.theta0 = 120.0;
 2866|       |
 2867|      0|        if (GetCrd(type_b) == 4)
  ------------------
  |  Branch (2867:13): [True: 0, False: 0]
  ------------------
 2868|      0|          anglecalc.theta0 = 109.45;
 2869|       |
 2870|      0|        if ((GetCrd(type_b) == 2) && b->GetAtomicNum() == OBElements::Oxygen)
  ------------------
  |  Branch (2870:13): [True: 0, False: 0]
  |  Branch (2870:38): [True: 0, False: 0]
  ------------------
 2871|      0|          anglecalc.theta0 = 105.0;
 2872|       |
 2873|      0|        if (b->GetAtomicNum() > 10)
  ------------------
  |  Branch (2873:13): [True: 0, False: 0]
  ------------------
 2874|      0|          anglecalc.theta0 = 95.0;
 2875|       |
 2876|      0|        if (HasLinSet(type_b))
  ------------------
  |  Branch (2876:13): [True: 0, False: 0]
  ------------------
 2877|      0|          anglecalc.theta0 = 180.0;
 2878|       |
 2879|      0|        if ((GetCrd(type_b) == 3) && (GetVal(type_b) == 3) && !GetMltb(type_b)) {
  ------------------
  |  Branch (2879:13): [True: 0, False: 0]
  |  Branch (2879:38): [True: 0, False: 0]
  |  Branch (2879:63): [True: 0, False: 0]
  ------------------
 2880|      0|          if (b->GetAtomicNum() == OBElements::Nitrogen) {
  ------------------
  |  Branch (2880:15): [True: 0, False: 0]
  ------------------
 2881|      0|            anglecalc.theta0 = 107.0;
 2882|      0|          } else {
 2883|      0|            anglecalc.theta0 = 92.0;
 2884|      0|          }
 2885|      0|        }
 2886|       |
 2887|      0|        if (a->IsInRingSize(3) && b->IsInRingSize(3) && c->IsInRingSize(3) && IsInSameRing(a, c))
  ------------------
  |  Branch (2887:13): [True: 0, False: 0]
  |  Branch (2887:35): [True: 0, False: 0]
  |  Branch (2887:57): [True: 0, False: 0]
  |  Branch (2887:79): [True: 0, False: 0]
  ------------------
 2888|      0|          anglecalc.theta0 = 60.0;
 2889|       |
 2890|      0|        if (a->IsInRingSize(4) && b->IsInRingSize(4) && c->IsInRingSize(4) && IsInSameRing(a, c))
  ------------------
  |  Branch (2890:13): [True: 0, False: 0]
  |  Branch (2890:35): [True: 0, False: 0]
  |  Branch (2890:57): [True: 0, False: 0]
  |  Branch (2890:79): [True: 0, False: 0]
  ------------------
 2891|      0|          anglecalc.theta0 = 90.0;
 2892|       |
 2893|      0|        strbndcalc.theta0 = anglecalc.theta0; // **
 2894|      0|      }
 2895|       |
 2896|       |      // empirical rule for 0-b-0 and standard angles
 2897|      0|      if (anglecalc.ka == 0.0) {
  ------------------
  |  Branch (2897:11): [True: 0, False: 0]
  ------------------
 2898|      0|        IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2899|      0|          snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR ANGLE BENDING FORCE CONSTANT %d-%d-%d (IDX)...\n", a->GetIdx(), b->GetIdx(), c->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2900|      0|          OBFFLog(_logbuf);
 2901|      0|        }
 2902|       |
 2903|      0|        double beta, Za, Zc, Cb, r0ab, r0bc, theta, theta2, D, rr, rr2;
 2904|      0|        Za = GetZParam(a);
 2905|      0|        Cb = GetCParam(b); // Fixed typo -- PR#2741658
 2906|      0|        Zc = GetZParam(c);
 2907|       |
 2908|      0|        r0ab = GetBondLength(a, b);
 2909|      0|        r0bc = GetBondLength(b, c);
 2910|      0|        rr = r0ab + r0bc;
 2911|      0|        rr2 = rr * rr;
 2912|      0|        D = (r0ab - r0bc) / rr2;
 2913|       |
 2914|      0|        theta = anglecalc.theta0;
 2915|      0|        theta2 = theta * theta;
 2916|       |
 2917|      0|        beta = 1.75;
 2918|      0|        if (a->IsInRingSize(4) && b->IsInRingSize(4) && c->IsInRingSize(4) && IsInSameRing(a, c))
  ------------------
  |  Branch (2918:13): [True: 0, False: 0]
  |  Branch (2918:35): [True: 0, False: 0]
  |  Branch (2918:57): [True: 0, False: 0]
  |  Branch (2918:79): [True: 0, False: 0]
  ------------------
 2919|      0|          beta = 0.85 * beta;
 2920|      0|        if (a->IsInRingSize(3) && b->IsInRingSize(3) && c->IsInRingSize(3) && IsInSameRing(a, c))
  ------------------
  |  Branch (2920:13): [True: 0, False: 0]
  |  Branch (2920:35): [True: 0, False: 0]
  |  Branch (2920:57): [True: 0, False: 0]
  |  Branch (2920:79): [True: 0, False: 0]
  ------------------
 2921|      0|          beta = 0.05 * beta;
 2922|       |
 2923|       |        // Theta2 is in Degrees^2, but parameters are expecting radians
 2924|       |        // PR#2741669
 2925|      0|        anglecalc.ka = (beta * Za * Cb * Zc * exp(-2 * D)) / (rr * theta2 * DEG_TO_RAD * DEG_TO_RAD);
  ------------------
  |  |   35|      0|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
                      anglecalc.ka = (beta * Za * Cb * Zc * exp(-2 * D)) / (rr * theta2 * DEG_TO_RAD * DEG_TO_RAD);
  ------------------
  |  |   35|      0|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
 2926|      0|      }
 2927|       |
 2928|      0|      anglecalc.a = a;
 2929|      0|      anglecalc.b = b;
 2930|      0|      anglecalc.c = c;
 2931|      0|      anglecalc.at = angletype;
 2932|       |
 2933|      0|      anglecalc.SetupPointers();
 2934|      0|      _anglecalculations.push_back(anglecalc);
 2935|       |
 2936|      0|      if (anglecalc.linear)
  ------------------
  |  Branch (2936:11): [True: 0, False: 0]
  ------------------
 2937|      0|        continue;
 2938|       |
 2939|      0|      parameter = GetTypedParameter3Atom(strbndtype, type_a, type_b, type_c, _ffstrbndparams);
 2940|      0|      if (parameter == nullptr) {
  ------------------
  |  Branch (2940:11): [True: 0, False: 0]
  ------------------
 2941|      0|        int rowa, rowb, rowc;
 2942|       |
 2943|       |        // This is not a real empirical rule...
 2944|       |        //IF_OBFF_LOGLVL_LOW {
 2945|       |        //  snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR STRETCH-BENDING FORCE CONSTANT %d-%d-%d (IDX)...\n", a->GetIdx(), b->GetIdx(), c->GetIdx());
 2946|       |        //  OBFFLog(_logbuf);
 2947|       |        //}
 2948|       |
 2949|      0|        rowa = GetElementRow(a);
 2950|      0|        rowb = GetElementRow(b);
 2951|      0|        rowc = GetElementRow(c);
 2952|       |
 2953|      0|        parameter = GetParameter3Atom(rowa, rowb, rowc, _ffdfsbparams);
 2954|       |
 2955|      0|        if (parameter == nullptr) {
  ------------------
  |  Branch (2955:13): [True: 0, False: 0]
  ------------------
 2956|       |          // This should never happen
 2957|      0|          IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2958|      0|            snprintf(_logbuf, BUFF_SIZE, "    COULD NOT FIND PARAMETERS FOR STRETCH-BEND %d-%d-%d (IDX)...\n", a->GetIdx(), b->GetIdx(), c->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 2959|      0|            OBFFLog(_logbuf);
 2960|      0|          }
 2961|      0|          return false;
 2962|      0|        }
 2963|       |
 2964|      0|        if (rowa == parameter->a) {
  ------------------
  |  Branch (2964:13): [True: 0, False: 0]
  ------------------
 2965|      0|          strbndcalc.kbaABC = parameter->_dpar[0];
 2966|      0|          strbndcalc.kbaCBA = parameter->_dpar[1];
 2967|      0|        } else {
 2968|      0|          strbndcalc.kbaABC = parameter->_dpar[1];
 2969|      0|          strbndcalc.kbaCBA = parameter->_dpar[0];
 2970|      0|        }
 2971|      0|      } else {
 2972|      0|        if (type_a == parameter->a) {
  ------------------
  |  Branch (2972:13): [True: 0, False: 0]
  ------------------
 2973|      0|          strbndcalc.kbaABC = parameter->_dpar[0];
 2974|      0|          strbndcalc.kbaCBA = parameter->_dpar[1];
 2975|      0|        } else {
 2976|      0|          strbndcalc.kbaABC = parameter->_dpar[1];
 2977|      0|          strbndcalc.kbaCBA = parameter->_dpar[0];
 2978|      0|        }
 2979|      0|      }
 2980|       |
 2981|      0|      strbndcalc.rab0 = GetBondLength(a, b);
 2982|      0|      strbndcalc.rbc0 = GetBondLength(b ,c);
 2983|      0|      strbndcalc.a = a;
 2984|      0|      strbndcalc.b = b;
 2985|      0|      strbndcalc.c = c;
 2986|      0|      strbndcalc.sbt = strbndtype;
 2987|      0|      strbndcalc.SetupPointers();
 2988|       |      // Set the pointers to addresses in the anglecalc, find the matching bondcalcs and do the same.
 2989|       |      // This should improve performance by not calculating all this twice. We could do the same
 2990|       |      // for torsion and angles since the bond lengths are calculated for bond stretching first.
 2991|       |      //bool found_angle = false;
 2992|       |      /*
 2993|       |        for (unsigned int ai = 0; ai < _anglecalculations.size(); ++ai) {
 2994|       |        if ( (_anglecalculations[ai].a->GetIdx() == a->GetIdx()) &&
 2995|       |        (_anglecalculations[ai].b->GetIdx() == b->GetIdx()) &&
 2996|       |        (_anglecalculations[ai].c->GetIdx() == c->GetIdx()) ) {
 2997|       |        strbndcalc.theta = &(_anglecalculations[ai].theta);
 2998|       |        strbndcalc.force_abc_a = _anglecalculations[ai].force_a;
 2999|       |        strbndcalc.force_abc_b = _anglecalculations[ai].force_b;
 3000|       |        strbndcalc.force_abc_c = _anglecalculations[ai].force_c;
 3001|       |        found_angle = true;
 3002|       |        break;
 3003|       |        } else if ( (_anglecalculations[ai].a->GetIdx() == c->GetIdx()) &&
 3004|       |        (_anglecalculations[ai].b->GetIdx() == b->GetIdx()) &&
 3005|       |        (_anglecalculations[ai].c->GetIdx() == a->GetIdx()) ) {
 3006|       |        strbndcalc.theta = &(_anglecalculations[ai].theta);
 3007|       |        strbndcalc.force_abc_a = _anglecalculations[ai].force_c;
 3008|       |        strbndcalc.force_abc_b = _anglecalculations[ai].force_b;
 3009|       |        strbndcalc.force_abc_c = _anglecalculations[ai].force_a;
 3010|       |        found_angle = true;
 3011|       |        break;
 3012|       |        }
 3013|       |        }
 3014|       |      */
 3015|       |
 3016|       |      /*
 3017|       |        vector<OBFFAngleCalculationMMFF94>::iterator ai;
 3018|       |        for (ai = _anglecalculations.begin(); ai != _anglecalculations.end(); ++ai) {
 3019|       |        if ( (((*ai).a)->GetIdx() == a->GetIdx()) && (((*ai).b)->GetIdx() == b->GetIdx()) && (((*ai).c)->GetIdx() == c->GetIdx()) ) {
 3020|       |        strbndcalc.theta = (*ai).theta;
 3021|       |        cout << "theta prt       = " << (*ai).theta << endl;
 3022|       |        cout << "delta prt       = " << &((*ai).delta) << endl;
 3023|       |        cout << "GetThetaPointer = " << ai->GetThetaPointer() << endl;
 3024|       |        strbndcalc.force_abc_a = (*ai).force_a;
 3025|       |        strbndcalc.force_abc_b = (*ai).force_b;
 3026|       |        strbndcalc.force_abc_c = (*ai).force_c;
 3027|       |        found_angle = true;
 3028|       |        break;
 3029|       |        } else if ( (((*ai).a)->GetIdx() == c->GetIdx()) && (((*ai).b)->GetIdx() == b->GetIdx()) && (((*ai).c)->GetIdx() == a->GetIdx()) ) {
 3030|       |        strbndcalc.theta = (*ai).theta;
 3031|       |        strbndcalc.force_abc_a = (*ai).force_c;
 3032|       |        strbndcalc.force_abc_b = (*ai).force_b;
 3033|       |        strbndcalc.force_abc_c = (*ai).force_a;
 3034|       |        found_angle = true;
 3035|       |        break;
 3036|       |        }
 3037|       |        }
 3038|       |        if (!found_angle) // didn't find matching angle, shouldn't happen, but continue to be safe
 3039|       |        continue;
 3040|       |
 3041|       |
 3042|       |        bool found_rab = false;
 3043|       |        bool found_rbc = false;
 3044|       |        vector<OBFFBondCalculationMMFF94>::iterator bi;
 3045|       |        for (bi = _bondcalculations.begin(); bi != _bondcalculations.end(); ++bi) {
 3046|       |        // find rab
 3047|       |        if ( (((*bi).a)->GetIdx() == a->GetIdx()) && (((*bi).b)->GetIdx() == b->GetIdx()) ) {
 3048|       |        strbndcalc.rab = &((*bi).rab);
 3049|       |        strbndcalc.force_ab_a = (*bi).force_a;
 3050|       |        strbndcalc.force_ab_b = (*bi).force_b;
 3051|       |        found_rab = true;
 3052|       |        } else if ( (((*bi).a)->GetIdx() == b->GetIdx()) && (((*bi).b)->GetIdx() == a->GetIdx()) ) {
 3053|       |        strbndcalc.rab = &((*bi).rab);
 3054|       |        strbndcalc.force_ab_a = (*bi).force_b;
 3055|       |        strbndcalc.force_ab_b = (*bi).force_a;
 3056|       |        found_rab = true;
 3057|       |        }
 3058|       |        // find rbc
 3059|       |        if ( (((*bi).a)->GetIdx() == b->GetIdx()) && (((*bi).b)->GetIdx() == c->GetIdx()) ) {
 3060|       |        strbndcalc.rbc = &(bondcalc.rab);
 3061|       |        strbndcalc.force_ab_a = (*bi).force_a;
 3062|       |        strbndcalc.force_ab_b = (*bi).force_b;
 3063|       |        found_rbc = true;
 3064|       |        } else if ( (((*bi).a)->GetIdx() == c->GetIdx()) && (((*bi).b)->GetIdx() == b->GetIdx()) ) {
 3065|       |        strbndcalc.rbc = &(bondcalc.rab);
 3066|       |        strbndcalc.force_ab_a = (*bi).force_b;
 3067|       |        strbndcalc.force_ab_b = (*bi).force_a;
 3068|       |        found_rbc = true;
 3069|       |        }
 3070|       |
 3071|       |        if (found_rab && found_rbc)
 3072|       |        break;
 3073|       |        }
 3074|       |        if (!found_rab || !found_rbc) // didn't find matching bond, or atoms overlap
 3075|       |        continue;
 3076|       |      */
 3077|      0|      _strbndcalculations.push_back(strbndcalc);
 3078|       |
 3079|      0|    }
 3080|       |
 3081|       |    //
 3082|       |    // Torsion Calculations
 3083|       |    //
 3084|       |    // MMFF part I - page 513 ("step-down" prodedure)
 3085|       |    // MMFF part I - page 519 (reference 68 is actually a footnote)
 3086|       |    // MMFF part IV - page 631 (empirical rule)
 3087|       |    //
 3088|       |    // First try and find an exact match, if this fails, step down using the equivalences from mmffdef.par
 3089|       |    // five-stage protocol: 1-1-1-1, 2-2-2-2, 3-2-2-5, 5-2-2-3, 5-2-2-5
 3090|       |    // If this fails, use empirical rules
 3091|       |    // Since 1-1-1-1 = 2-2-2-2, we will only try 1-1-1-1 before going to 3-2-2-5
 3092|       |    //
 3093|    424|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    424|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    424|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 3094|      0|      OBFFLog("SETTING UP TORSION CALCULATIONS...\n");
 3095|       |
 3096|    424|    OBFFTorsionCalculationMMFF94 torsioncalc;
 3097|    424|    int torsiontype;
 3098|       |
 3099|    424|    _torsioncalculations.clear();
 3100|       |
 3101|    424|    FOR_TORSIONS_OF_MOL(t, _mol) {
  ------------------
  |  |  428|    424|#define FOR_TORSIONS_OF_MOL(t,m)  for( OpenBabel::OBMolTorsionIter  t(m); t; ++t )
  |  |  ------------------
  |  |  |  Branch (428:75): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 3102|      0|      a = _mol.GetAtom((*t)[0] + 1);
 3103|      0|      b = _mol.GetAtom((*t)[1] + 1);
 3104|      0|      c = _mol.GetAtom((*t)[2] + 1);
 3105|      0|      d = _mol.GetAtom((*t)[3] + 1);
 3106|       |      // Cached TorsionData can reference indices that no longer exist.
 3107|      0|      if (a == nullptr || b == nullptr || c == nullptr || d == nullptr)
  ------------------
  |  Branch (3107:11): [True: 0, False: 0]
  |  Branch (3107:27): [True: 0, False: 0]
  |  Branch (3107:43): [True: 0, False: 0]
  |  Branch (3107:59): [True: 0, False: 0]
  ------------------
 3108|      0|        continue;
 3109|       |
 3110|      0|      type_a = atoi(a->GetType());
 3111|      0|      type_b = atoi(b->GetType());
 3112|      0|      type_c = atoi(c->GetType());
 3113|      0|      type_d = atoi(d->GetType());
 3114|       |
 3115|       |      // skip this torsion if the atoms are ignored
 3116|      0|      if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) ||
  ------------------
  |  Branch (3116:12): [True: 0, False: 0]
  |  Branch (3116:51): [True: 0, False: 0]
  ------------------
 3117|      0|           _constraints.IsIgnored(c->GetIdx()) || _constraints.IsIgnored(d->GetIdx()) )
  ------------------
  |  Branch (3117:12): [True: 0, False: 0]
  |  Branch (3117:51): [True: 0, False: 0]
  ------------------
 3118|      0|        continue;
 3119|       |
 3120|       |      // if there are any groups specified, check if the four torsion atoms are in a single intraGroup
 3121|      0|      if (HasGroups()) {
  ------------------
  |  Branch (3121:11): [True: 0, False: 0]
  ------------------
 3122|      0|        bool validTorsion = false;
 3123|      0|        for (unsigned int i=0; i < _intraGroup.size(); ++i) {
  ------------------
  |  Branch (3123:32): [True: 0, False: 0]
  ------------------
 3124|      0|          if (_intraGroup[i].BitIsSet(a->GetIdx()) && _intraGroup[i].BitIsSet(b->GetIdx()) &&
  ------------------
  |  Branch (3124:15): [True: 0, False: 0]
  |  Branch (3124:55): [True: 0, False: 0]
  ------------------
 3125|      0|              _intraGroup[i].BitIsSet(c->GetIdx()) && _intraGroup[i].BitIsSet(d->GetIdx())) {
  ------------------
  |  Branch (3125:15): [True: 0, False: 0]
  |  Branch (3125:55): [True: 0, False: 0]
  ------------------
 3126|      0|            validTorsion = true;
 3127|      0|            break;
 3128|      0|          }
 3129|      0|        }
 3130|      0|        if (!validTorsion)
  ------------------
  |  Branch (3130:13): [True: 0, False: 0]
  ------------------
 3131|      0|          continue;
 3132|      0|      }
 3133|       |
 3134|      0|      torsiontype = GetTorsionType(a, b, c, d);
 3135|       |      // CXT = MC*(J*MA**3 + K*MA**2 + I*MA + L) + TTijkl  MC = 6, MA = 136
 3136|      0|      order = (type_c*2515456 + type_b*18496 + type_d*136 + type_a)
 3137|      0|        - (type_b*2515456 + type_c*18496 + type_a*136 + type_d);
 3138|       |
 3139|      0|      if (order >= 0) {
  ------------------
  |  Branch (3139:11): [True: 0, False: 0]
  ------------------
 3140|       |        // try exact match
 3141|      0|        parameter = GetTypedParameter4Atom(torsiontype, type_a, type_b, type_c, type_d, _fftorsionparams);
 3142|      0|        if (parameter == nullptr) // try 3-2-2-5
  ------------------
  |  Branch (3142:13): [True: 0, False: 0]
  ------------------
 3143|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl3(type_a), type_b, type_c, EqLvl5(type_d), _fftorsionparams);
 3144|      0|        if (parameter == nullptr) // try 5-2-2-3
  ------------------
  |  Branch (3144:13): [True: 0, False: 0]
  ------------------
 3145|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl5(type_a), type_b, type_c, EqLvl3(type_d), _fftorsionparams);
 3146|      0|        if (parameter == nullptr) // try 5-2-2-5
  ------------------
  |  Branch (3146:13): [True: 0, False: 0]
  ------------------
 3147|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl5(type_a), type_b, type_c, EqLvl5(type_d), _fftorsionparams);
 3148|      0|      } else {
 3149|       |        // try exact match
 3150|      0|        parameter = GetTypedParameter4Atom(torsiontype, type_d, type_c, type_b, type_a, _fftorsionparams);
 3151|      0|        if (parameter == nullptr) // try 3-2-2-5
  ------------------
  |  Branch (3151:13): [True: 0, False: 0]
  ------------------
 3152|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl3(type_d), type_c, type_b, EqLvl5(type_a), _fftorsionparams);
 3153|      0|        if (parameter == nullptr) // try 5-2-2-3
  ------------------
  |  Branch (3153:13): [True: 0, False: 0]
  ------------------
 3154|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl5(type_d), type_c, type_b, EqLvl3(type_a), _fftorsionparams);
 3155|      0|        if (parameter == nullptr) // try 5-2-2-5
  ------------------
  |  Branch (3155:13): [True: 0, False: 0]
  ------------------
 3156|      0|          parameter = GetTypedParameter4Atom(torsiontype, EqLvl5(type_d), type_c, type_b, EqLvl5(type_a), _fftorsionparams);
 3157|      0|      }
 3158|       |
 3159|      0|      if (parameter) {
  ------------------
  |  Branch (3159:11): [True: 0, False: 0]
  ------------------
 3160|      0|        torsioncalc.v1 = parameter->_dpar[0];
 3161|      0|        torsioncalc.v2 = parameter->_dpar[1];
 3162|      0|        torsioncalc.v3 = parameter->_dpar[2];
 3163|      0|      } else {
 3164|      0|        bool found_rule = false;
 3165|       |
 3166|       |        //IF_OBFF_LOGLVL_LOW {
 3167|       |        //  snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR TORSION FORCE CONSTANT %d-%d-%d-%d (IDX)...\n",
 3168|       |        //    a->GetIdx(), b->GetIdx(), c->GetIdx(), d->GetIdx());
 3169|       |        //  OBFFLog(_logbuf);
 3170|       |        //}
 3171|       |
 3172|       |        // rule (a) page 631
 3173|      0|        if (HasLinSet(type_b) || HasLinSet(type_c))
  ------------------
  |  Branch (3173:13): [True: 0, False: 0]
  |  Branch (3173:34): [True: 0, False: 0]
  ------------------
 3174|      0|          continue;
 3175|       |
 3176|       |        // rule (b) page 631
 3177|      0|        OBBond *bc_bond = b->GetBond(c);
 3178|      0|        if (bc_bond != nullptr && bc_bond->IsAromatic()) {
  ------------------
  |  Branch (3178:13): [True: 0, False: 0]
  |  Branch (3178:35): [True: 0, False: 0]
  ------------------
 3179|      0|          double Ub, Uc, pi_bc, beta;
 3180|      0|          Ub = GetUParam(b);
 3181|      0|          Uc = GetUParam(c);
 3182|       |
 3183|      0|          if (!HasPilpSet(type_b) && !HasPilpSet(type_c))
  ------------------
  |  Branch (3183:15): [True: 0, False: 0]
  |  Branch (3183:38): [True: 0, False: 0]
  ------------------
 3184|      0|            pi_bc = 0.5;
 3185|      0|          else
 3186|      0|            pi_bc = 0.3;
 3187|       |
 3188|      0|          if (((GetVal(type_b) == 3) && (GetVal(type_c) == 4)) ||
  ------------------
  |  Branch (3188:16): [True: 0, False: 0]
  |  Branch (3188:41): [True: 0, False: 0]
  ------------------
 3189|      0|              ((GetVal(type_b) == 4) && (GetVal(type_c) == 3)))
  ------------------
  |  Branch (3189:16): [True: 0, False: 0]
  |  Branch (3189:41): [True: 0, False: 0]
  ------------------
 3190|      0|            beta = 3.0;
 3191|      0|          else
 3192|      0|            beta = 6.0;
 3193|       |
 3194|      0|          torsioncalc.v1 = 0.0;
 3195|      0|          torsioncalc.v2 = beta * pi_bc * sqrt(Ub * Uc);
 3196|      0|          torsioncalc.v3 = 0.0;
 3197|      0|          found_rule = true;
 3198|      0|        } else {
 3199|       |          // rule (c) page 631
 3200|      0|       	  double Ub, Uc, pi_bc, beta;
 3201|      0|          Ub = GetUParam(b);
 3202|      0|          Uc = GetUParam(c);
 3203|      0|          OBBond *bond = a->GetBond(b);
 3204|      0|          if (bond != nullptr && ((GetMltb(type_b) == 2) && (GetMltb(type_c) == 2)) && !bond->IsAromatic() && bond->GetBondOrder() == 2)
  ------------------
  |  Branch (3204:15): [True: 0, False: 0]
  |  Branch (3204:35): [True: 0, False: 0]
  |  Branch (3204:61): [True: 0, False: 0]
  |  Branch (3204:88): [True: 0, False: 0]
  |  Branch (3204:111): [True: 0, False: 0]
  ------------------
 3205|      0|            pi_bc = 1.0;
 3206|      0|          else
 3207|      0|            pi_bc = 0.4;
 3208|       |
 3209|      0|          beta = 6.0;
 3210|      0|          torsioncalc.v1 = 0.0;
 3211|      0|          torsioncalc.v2 = beta * pi_bc * sqrt(Ub * Uc);
 3212|      0|          torsioncalc.v3 = 0.0;
 3213|      0|          found_rule = true;
 3214|      0|        }
 3215|       |
 3216|       |        // rule (d) page 632
 3217|      0|        if (!found_rule)
  ------------------
  |  Branch (3217:13): [True: 0, False: 0]
  ------------------
 3218|      0|          if (((GetCrd(type_b) == 4) && (GetCrd(type_c) == 4))) {
  ------------------
  |  Branch (3218:16): [True: 0, False: 0]
  |  Branch (3218:41): [True: 0, False: 0]
  ------------------
 3219|      0|            double Vb, Vc;
 3220|      0|            Vb = GetVParam(b);
 3221|      0|            Vc = GetVParam(c);
 3222|       |
 3223|      0|            torsioncalc.v1 = 0.0;
 3224|      0|            torsioncalc.v2 = 0.0;
 3225|      0|            torsioncalc.v3 = sqrt(Vb * Vc) / 9.0;
 3226|      0|            found_rule = true;
 3227|      0|          }
 3228|       |
 3229|       |        // rule (e) page 632
 3230|      0|        if (!found_rule)
  ------------------
  |  Branch (3230:13): [True: 0, False: 0]
  ------------------
 3231|      0|          if (((GetCrd(type_b) == 4) && (GetCrd(type_c) != 4))) {
  ------------------
  |  Branch (3231:16): [True: 0, False: 0]
  |  Branch (3231:41): [True: 0, False: 0]
  ------------------
 3232|      0|            if (GetCrd(type_c) == 3) // case (1)
  ------------------
  |  Branch (3232:17): [True: 0, False: 0]
  ------------------
 3233|      0|              if ((GetVal(type_c) == 4) || (GetVal(type_c) == 34) || (GetMltb(type_c) != 0))
  ------------------
  |  Branch (3233:19): [True: 0, False: 0]
  |  Branch (3233:44): [True: 0, False: 0]
  |  Branch (3233:70): [True: 0, False: 0]
  ------------------
 3234|      0|                continue;
 3235|       |
 3236|      0|            if (GetCrd(type_c) == 2) // case (2)
  ------------------
  |  Branch (3236:17): [True: 0, False: 0]
  ------------------
 3237|      0|              if ((GetVal(type_c) == 3) || (GetMltb(type_c) != 0))
  ------------------
  |  Branch (3237:19): [True: 0, False: 0]
  |  Branch (3237:44): [True: 0, False: 0]
  ------------------
 3238|      0|                continue;
 3239|       |
 3240|       |            // case (3) saturated bonds -- see rule (h)
 3241|      0|          }
 3242|       |
 3243|       |        // rule (f) page 632
 3244|      0|        if (!found_rule)
  ------------------
  |  Branch (3244:13): [True: 0, False: 0]
  ------------------
 3245|      0|          if (((GetCrd(type_b) != 4) && (GetCrd(type_c) == 4))) {
  ------------------
  |  Branch (3245:16): [True: 0, False: 0]
  |  Branch (3245:41): [True: 0, False: 0]
  ------------------
 3246|      0|            if (GetCrd(type_b) == 3) // case (1)
  ------------------
  |  Branch (3246:17): [True: 0, False: 0]
  ------------------
 3247|      0|              if ((GetVal(type_b) == 4) || (GetVal(type_b) == 34) || (GetMltb(type_b) != 0))
  ------------------
  |  Branch (3247:19): [True: 0, False: 0]
  |  Branch (3247:44): [True: 0, False: 0]
  |  Branch (3247:70): [True: 0, False: 0]
  ------------------
 3248|      0|                continue;
 3249|       |
 3250|      0|            if (GetCrd(type_b) == 2) // case (2)
  ------------------
  |  Branch (3250:17): [True: 0, False: 0]
  ------------------
 3251|      0|              if ((GetVal(type_b) == 3) || (GetMltb(type_b) != 0))
  ------------------
  |  Branch (3251:19): [True: 0, False: 0]
  |  Branch (3251:44): [True: 0, False: 0]
  ------------------
 3252|      0|                continue;
 3253|       |
 3254|       |            // case (3) saturated bonds
 3255|      0|          }
 3256|       |
 3257|       |        // rule (g) page 632
 3258|      0|        if (!found_rule) {
  ------------------
  |  Branch (3258:13): [True: 0, False: 0]
  ------------------
 3259|      0|          OBBond *bond = b->GetBond(c);
 3260|      0|          if (bond != nullptr && !bond->IsAromatic() && bond->GetBondOrder() == 1 && (
  ------------------
  |  Branch (3260:15): [True: 0, False: 0]
  |  Branch (3260:34): [True: 0, False: 0]
  |  Branch (3260:57): [True: 0, False: 0]
  ------------------
 3261|      0|            (GetMltb(type_b) && GetMltb(type_c)) ||
  ------------------
  |  Branch (3261:14): [True: 0, False: 0]
  |  Branch (3261:33): [True: 0, False: 0]
  ------------------
 3262|      0|            (GetMltb(type_b) && HasPilpSet(type_c)) ||
  ------------------
  |  Branch (3262:14): [True: 0, False: 0]
  |  Branch (3262:33): [True: 0, False: 0]
  ------------------
 3263|      0|            (GetMltb(type_c) && HasPilpSet(type_b)))) {
  ------------------
  |  Branch (3263:14): [True: 0, False: 0]
  |  Branch (3263:33): [True: 0, False: 0]
  ------------------
 3264|      0|            if (HasPilpSet(type_b) && HasPilpSet(type_c)) // case (1)
  ------------------
  |  Branch (3264:17): [True: 0, False: 0]
  |  Branch (3264:39): [True: 0, False: 0]
  ------------------
 3265|      0|              continue;
 3266|       |
 3267|      0|            double Ub, Uc, pi_bc, beta;
 3268|      0|            Ub = GetUParam(b);
 3269|      0|            Uc = GetUParam(c);
 3270|      0|            beta = 6.0;
 3271|       |
 3272|      0|            if (HasPilpSet(type_b) && GetMltb(type_c)) { // case (2)
  ------------------
  |  Branch (3272:17): [True: 0, False: 0]
  |  Branch (3272:39): [True: 0, False: 0]
  ------------------
 3273|      0|              if (GetMltb(type_c) == 1)
  ------------------
  |  Branch (3273:19): [True: 0, False: 0]
  ------------------
 3274|      0|                pi_bc = 0.5;
 3275|      0|              else if ((GetElementRow(b) == 1) && (GetElementRow(c) == 1))
  ------------------
  |  Branch (3275:24): [True: 0, False: 0]
  |  Branch (3275:51): [True: 0, False: 0]
  ------------------
 3276|      0|                pi_bc = 0.3;
 3277|      0|              else
 3278|      0|                pi_bc = 0.15;
 3279|      0|              found_rule = true;
 3280|      0|            }
 3281|       |
 3282|      0|            if (HasPilpSet(type_c) && GetMltb(type_b)) { // case (3)
  ------------------
  |  Branch (3282:17): [True: 0, False: 0]
  |  Branch (3282:39): [True: 0, False: 0]
  ------------------
 3283|      0|              if (GetMltb(type_b) == 1)
  ------------------
  |  Branch (3283:19): [True: 0, False: 0]
  ------------------
 3284|      0|                pi_bc = 0.5;
 3285|      0|              else if ((GetElementRow(b) == 1) && (GetElementRow(c) == 1))
  ------------------
  |  Branch (3285:24): [True: 0, False: 0]
  |  Branch (3285:51): [True: 0, False: 0]
  ------------------
 3286|      0|                pi_bc = 0.3;
 3287|      0|              else
 3288|      0|                pi_bc = 0.15;
 3289|      0|              found_rule = true;
 3290|      0|            }
 3291|       |
 3292|      0|            if (!found_rule)
  ------------------
  |  Branch (3292:17): [True: 0, False: 0]
  ------------------
 3293|      0|              if (((GetMltb(type_b) == 1) || (GetMltb(type_c) == 1)) && (b->GetAtomicNum() != OBElements::Carbon || c->GetAtomicNum() != OBElements::Carbon)) {
  ------------------
  |  Branch (3293:20): [True: 0, False: 0]
  |  Branch (3293:46): [True: 0, False: 0]
  |  Branch (3293:74): [True: 0, False: 0]
  |  Branch (3293:117): [True: 0, False: 0]
  ------------------
 3294|      0|                pi_bc = 0.4;
 3295|      0|                found_rule = true;
 3296|      0|              }
 3297|       |
 3298|      0|            if (!found_rule)
  ------------------
  |  Branch (3298:17): [True: 0, False: 0]
  ------------------
 3299|      0|              pi_bc = 0.15;
 3300|       |
 3301|      0|            torsioncalc.v1 = 0.0;
 3302|      0|            torsioncalc.v2 = beta * pi_bc * sqrt(Ub * Uc);
 3303|      0|            torsioncalc.v3 = 0.0;
 3304|      0|            found_rule = true;
 3305|      0|          }
 3306|      0|        }
 3307|       |
 3308|       |        // rule (h) page 632
 3309|      0|        if (!found_rule) {
  ------------------
  |  Branch (3309:13): [True: 0, False: 0]
  ------------------
 3310|      0|          if ((b->GetAtomicNum() == OBElements::Oxygen || b->GetAtomicNum() == OBElements::Sulfur) && (c->GetAtomicNum() == OBElements::Oxygen || c->GetAtomicNum() == OBElements::Sulfur)) {
  ------------------
  |  Branch (3310:16): [True: 0, False: 0]
  |  Branch (3310:59): [True: 0, False: 0]
  |  Branch (3310:104): [True: 0, False: 0]
  |  Branch (3310:147): [True: 0, False: 0]
  ------------------
 3311|      0|            double Wb, Wc;
 3312|       |
 3313|      0|            if (b->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (3313:17): [True: 0, False: 0]
  ------------------
 3314|      0|              Wb = 2.0;
 3315|      0|            }
 3316|      0|            else {
 3317|      0|              Wb = 8.0;
 3318|      0|            }
 3319|       |
 3320|      0|            if (c->GetAtomicNum() == OBElements::Oxygen) {
  ------------------
  |  Branch (3320:17): [True: 0, False: 0]
  ------------------
 3321|      0|              Wc = 2.0;
 3322|      0|            }
 3323|      0|            else {
 3324|      0|              Wc = 8.0;
 3325|      0|            }
 3326|       |
 3327|      0|            torsioncalc.v1 = 0.0;
 3328|      0|            torsioncalc.v2 = -sqrt(Wb * Wc);
 3329|      0|            torsioncalc.v3 = 0.0;
 3330|      0|          } else {
 3331|      0|            double Vb, Vc, Nbc;
 3332|      0|            Vb = GetVParam(b);
 3333|      0|            Vc = GetVParam(c);
 3334|       |
 3335|      0|            IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3336|      0|              snprintf(_logbuf, BUFF_SIZE, "   USING EMPIRICAL RULE FOR TORSION FORCE CONSTANT %d-%d-%d-%d (IDX)...\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 3337|      0|                      a->GetIdx(), b->GetIdx(), c->GetIdx(), d->GetIdx());
 3338|      0|              OBFFLog(_logbuf);
 3339|      0|            }
 3340|       |
 3341|      0|            Nbc = GetCrd(type_b) * GetCrd(type_c);
 3342|       |
 3343|      0|            torsioncalc.v1 = 0.0;
 3344|      0|            torsioncalc.v2 = 0.0;
 3345|      0|            torsioncalc.v3 = sqrt(Vb * Vc) / Nbc;
 3346|      0|          }
 3347|      0|        }
 3348|      0|      }
 3349|       |
 3350|      0|      torsioncalc.a = a;
 3351|      0|      torsioncalc.b = b;
 3352|      0|      torsioncalc.c = c;
 3353|      0|      torsioncalc.d = d;
 3354|      0|      torsioncalc.SetupPointers();
 3355|      0|      torsioncalc.tt = torsiontype;
 3356|       |
 3357|      0|      _torsioncalculations.push_back(torsioncalc);
 3358|      0|    }
 3359|       |
 3360|       |    //
 3361|       |    // Out-Of-Plane Calculations
 3362|       |    //
 3363|    424|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    424|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    424|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 3364|      0|      OBFFLog("SETTING UP OOP CALCULATIONS...\n");
 3365|       |
 3366|    424|    OBFFOOPCalculationMMFF94 oopcalc;
 3367|       |
 3368|    424|    _oopcalculations.clear();
 3369|       |
 3370|  2.08k|    FOR_ATOMS_OF_MOL(atom, _mol) {
  ------------------
  |  |  417|    424|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 2.08k, False: 424]
  |  |  ------------------
  ------------------
 3371|  2.08k|      b = (OBAtom*) &*atom;
 3372|       |
 3373|  2.08k|      found = false;
 3374|       |
 3375|  2.08k|      type_b = atoi(b->GetType());
 3376|       |
 3377|  2.08k|      for (unsigned int idx=0; idx < _ffoopparams.size(); idx++) {
  ------------------
  |  Branch (3377:32): [True: 0, False: 2.08k]
  ------------------
 3378|      0|        if (type_b == _ffoopparams[idx].b) {
  ------------------
  |  Branch (3378:13): [True: 0, False: 0]
  ------------------
 3379|      0|          a = nullptr;
 3380|      0|          c = nullptr;
 3381|      0|          d = nullptr;
 3382|       |
 3383|      0|          FOR_NBORS_OF_ATOM(nbr, b) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3384|      0|            if (a ==nullptr)
  ------------------
  |  Branch (3384:17): [True: 0, False: 0]
  ------------------
 3385|      0|              a = (OBAtom*) &*nbr;
 3386|      0|            else if (c == nullptr)
  ------------------
  |  Branch (3386:22): [True: 0, False: 0]
  ------------------
 3387|      0|              c = (OBAtom*) &*nbr;
 3388|      0|            else
 3389|      0|              d = (OBAtom*) &*nbr;
 3390|      0|          }
 3391|       |
 3392|      0|          if (a == nullptr || c == nullptr || d == nullptr)
  ------------------
  |  Branch (3392:15): [True: 0, False: 0]
  |  Branch (3392:31): [True: 0, False: 0]
  |  Branch (3392:47): [True: 0, False: 0]
  ------------------
 3393|      0|            break;
 3394|       |
 3395|      0|          type_a = atoi(a->GetType());
 3396|      0|          type_c = atoi(c->GetType());
 3397|      0|          type_d = atoi(d->GetType());
 3398|       |
 3399|       |          // skip this oop if the atoms are ignored
 3400|      0|          if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) ||
  ------------------
  |  Branch (3400:16): [True: 0, False: 0]
  |  Branch (3400:55): [True: 0, False: 0]
  ------------------
 3401|      0|               _constraints.IsIgnored(c->GetIdx()) || _constraints.IsIgnored(d->GetIdx()) )
  ------------------
  |  Branch (3401:16): [True: 0, False: 0]
  |  Branch (3401:55): [True: 0, False: 0]
  ------------------
 3402|      0|            continue;
 3403|       |
 3404|       |          // if there are any groups specified, check if the four oop atoms are in a single intraGroup
 3405|      0|          if (HasGroups()) {
  ------------------
  |  Branch (3405:15): [True: 0, False: 0]
  ------------------
 3406|      0|            bool validOOP = false;
 3407|      0|            for (unsigned int i=0; i < _intraGroup.size(); ++i) {
  ------------------
  |  Branch (3407:36): [True: 0, False: 0]
  ------------------
 3408|      0|              if (_intraGroup[i].BitIsSet(a->GetIdx()) && _intraGroup[i].BitIsSet(b->GetIdx()) &&
  ------------------
  |  Branch (3408:19): [True: 0, False: 0]
  |  Branch (3408:59): [True: 0, False: 0]
  ------------------
 3409|      0|                  _intraGroup[i].BitIsSet(c->GetIdx()) && _intraGroup[i].BitIsSet(d->GetIdx())) {
  ------------------
  |  Branch (3409:19): [True: 0, False: 0]
  |  Branch (3409:59): [True: 0, False: 0]
  ------------------
 3410|      0|                validOOP = true;
 3411|      0|                break;
 3412|      0|              }
 3413|      0|            }
 3414|      0|            if (!validOOP)
  ------------------
  |  Branch (3414:17): [True: 0, False: 0]
  ------------------
 3415|      0|              continue;
 3416|      0|          }
 3417|       |
 3418|      0|          if (((type_a == _ffoopparams[idx].a) && (type_c == _ffoopparams[idx].c) && (type_d == _ffoopparams[idx].d)) ||
  ------------------
  |  Branch (3418:16): [True: 0, False: 0]
  |  Branch (3418:51): [True: 0, False: 0]
  |  Branch (3418:86): [True: 0, False: 0]
  ------------------
 3419|      0|              ((type_c == _ffoopparams[idx].a) && (type_a == _ffoopparams[idx].c) && (type_d == _ffoopparams[idx].d)) ||
  ------------------
  |  Branch (3419:16): [True: 0, False: 0]
  |  Branch (3419:51): [True: 0, False: 0]
  |  Branch (3419:86): [True: 0, False: 0]
  ------------------
 3420|      0|              ((type_c == _ffoopparams[idx].a) && (type_d == _ffoopparams[idx].c) && (type_a == _ffoopparams[idx].d)) ||
  ------------------
  |  Branch (3420:16): [True: 0, False: 0]
  |  Branch (3420:51): [True: 0, False: 0]
  |  Branch (3420:86): [True: 0, False: 0]
  ------------------
 3421|      0|              ((type_d == _ffoopparams[idx].a) && (type_c == _ffoopparams[idx].c) && (type_a == _ffoopparams[idx].d)) ||
  ------------------
  |  Branch (3421:16): [True: 0, False: 0]
  |  Branch (3421:51): [True: 0, False: 0]
  |  Branch (3421:86): [True: 0, False: 0]
  ------------------
 3422|      0|              ((type_a == _ffoopparams[idx].a) && (type_d == _ffoopparams[idx].c) && (type_c == _ffoopparams[idx].d)) ||
  ------------------
  |  Branch (3422:16): [True: 0, False: 0]
  |  Branch (3422:51): [True: 0, False: 0]
  |  Branch (3422:86): [True: 0, False: 0]
  ------------------
 3423|      0|              ((type_d == _ffoopparams[idx].a) && (type_a == _ffoopparams[idx].c) && (type_c == _ffoopparams[idx].d)))
  ------------------
  |  Branch (3423:16): [True: 0, False: 0]
  |  Branch (3423:51): [True: 0, False: 0]
  |  Branch (3423:86): [True: 0, False: 0]
  ------------------
 3424|      0|            {
 3425|      0|              found = true;
 3426|       |
 3427|      0|              oopcalc.koop = _ffoopparams[idx]._dpar[0];
 3428|       |
 3429|       |              // A-B-CD || C-B-AD  PLANE = ABC
 3430|      0|              oopcalc.a = a;
 3431|      0|              oopcalc.b = b;
 3432|      0|              oopcalc.c = c;
 3433|      0|              oopcalc.d = d;
 3434|       |
 3435|      0|              oopcalc.SetupPointers();
 3436|      0|              _oopcalculations.push_back(oopcalc);
 3437|       |
 3438|       |              // C-B-DA || D-B-CA  PLANE BCD
 3439|      0|              oopcalc.a = d;
 3440|      0|              oopcalc.d = a;
 3441|       |
 3442|      0|              oopcalc.SetupPointers();
 3443|      0|              _oopcalculations.push_back(oopcalc);
 3444|       |
 3445|       |              // A-B-DC || D-B-AC  PLANE ABD
 3446|      0|              oopcalc.a = a;
 3447|      0|              oopcalc.c = d;
 3448|      0|              oopcalc.d = c;
 3449|       |
 3450|      0|              oopcalc.SetupPointers();
 3451|      0|              _oopcalculations.push_back(oopcalc);
 3452|      0|            }
 3453|       |
 3454|      0|          if ((_ffoopparams[idx].a == 0) && (_ffoopparams[idx].c == 0) && (_ffoopparams[idx].d == 0) && !found) // *-XX-*-*
  ------------------
  |  Branch (3454:15): [True: 0, False: 0]
  |  Branch (3454:45): [True: 0, False: 0]
  |  Branch (3454:75): [True: 0, False: 0]
  |  Branch (3454:105): [True: 0, False: 0]
  ------------------
 3455|      0|            {
 3456|      0|              oopcalc.koop = _ffoopparams[idx]._dpar[0];
 3457|       |
 3458|       |              // A-B-CD || C-B-AD  PLANE = ABC
 3459|      0|              oopcalc.a = a;
 3460|      0|              oopcalc.b = b;
 3461|      0|              oopcalc.c = c;
 3462|      0|              oopcalc.d = d;
 3463|       |
 3464|      0|              oopcalc.SetupPointers();
 3465|      0|              _oopcalculations.push_back(oopcalc);
 3466|       |
 3467|       |              // C-B-DA || D-B-CA  PLANE BCD
 3468|      0|              oopcalc.a = d;
 3469|      0|              oopcalc.d = a;
 3470|       |
 3471|      0|              oopcalc.SetupPointers();
 3472|      0|              _oopcalculations.push_back(oopcalc);
 3473|       |
 3474|       |              // A-B-DC || D-B-AC  PLANE ABD
 3475|      0|              oopcalc.a = a;
 3476|      0|              oopcalc.c = d;
 3477|      0|              oopcalc.d = c;
 3478|       |
 3479|      0|              oopcalc.SetupPointers();
 3480|      0|              _oopcalculations.push_back(oopcalc);
 3481|      0|            }
 3482|      0|        }
 3483|      0|      }
 3484|  2.08k|    }
 3485|       |
 3486|       |    //
 3487|       |    // VDW Calculations
 3488|       |    //
 3489|    424|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    424|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    424|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 424]
  |  |  ------------------
  ------------------
 3490|      0|      OBFFLog("SETTING UP VAN DER WAALS CALCULATIONS...\n");
 3491|       |
 3492|    424|    OBFFVDWCalculationMMFF94 vdwcalc;
 3493|       |
 3494|    424|    _vdwcalculations.clear();
 3495|       |
 3496|    424|    int pairIndex = -1;
 3497|    424|    FOR_PAIRS_OF_MOL(p, _mol) {
  ------------------
  |  |  429|    424|#define FOR_PAIRS_OF_MOL(p,m)     for( OpenBabel::OBMolPairIter     p(m); p; ++p )
  |  |  ------------------
  |  |  |  Branch (429:75): [True: 86, False: 338]
  |  |  ------------------
  ------------------
 3498|     86|      ++pairIndex;
 3499|     86|      a = _mol.GetAtom((*p)[0]);
 3500|     86|      b = _mol.GetAtom((*p)[1]);
 3501|       |
 3502|       |      // skip this vdw if the atoms are ignored
 3503|     86|      if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) )
  ------------------
  |  Branch (3503:12): [True: 0, False: 86]
  |  Branch (3503:51): [True: 0, False: 86]
  ------------------
 3504|      0|        continue;
 3505|       |
 3506|       |      // if there are any groups specified, check if the two atoms are in a single _interGroup or if
 3507|       |      // two two atoms are in one of the _interGroups pairs.
 3508|     86|      if (HasGroups()) {
  ------------------
  |  Branch (3508:11): [True: 0, False: 86]
  ------------------
 3509|      0|        bool validVDW = false;
 3510|      0|        for (unsigned int i=0; i < _interGroup.size(); ++i) {
  ------------------
  |  Branch (3510:32): [True: 0, False: 0]
  ------------------
 3511|      0|          if (_interGroup[i].BitIsSet(a->GetIdx()) && _interGroup[i].BitIsSet(b->GetIdx())) {
  ------------------
  |  Branch (3511:15): [True: 0, False: 0]
  |  Branch (3511:55): [True: 0, False: 0]
  ------------------
 3512|      0|            validVDW = true;
 3513|      0|            break;
 3514|      0|          }
 3515|      0|        }
 3516|      0|        if (!validVDW) {
  ------------------
  |  Branch (3516:13): [True: 0, False: 0]
  ------------------
 3517|      0|          for (unsigned int i=0; i < _interGroups.size(); ++i) {
  ------------------
  |  Branch (3517:34): [True: 0, False: 0]
  ------------------
 3518|      0|            if (_interGroups[i].first.BitIsSet(a->GetIdx()) && _interGroups[i].second.BitIsSet(b->GetIdx())) {
  ------------------
  |  Branch (3518:17): [True: 0, False: 0]
  |  Branch (3518:64): [True: 0, False: 0]
  ------------------
 3519|      0|              validVDW = true;
 3520|      0|              break;
 3521|      0|            }
 3522|      0|            if (_interGroups[i].first.BitIsSet(b->GetIdx()) && _interGroups[i].second.BitIsSet(a->GetIdx())) {
  ------------------
  |  Branch (3522:17): [True: 0, False: 0]
  |  Branch (3522:64): [True: 0, False: 0]
  ------------------
 3523|      0|              validVDW = true;
 3524|      0|              break;
 3525|      0|            }
 3526|      0|          }
 3527|      0|        }
 3528|       |
 3529|      0|        if (!validVDW)
  ------------------
  |  Branch (3529:13): [True: 0, False: 0]
  ------------------
 3530|      0|          continue;
 3531|      0|      }
 3532|       |
 3533|     86|      OBFFParameter *parameter_a, *parameter_b;
 3534|     86|      parameter_a = GetParameter1Atom(atoi(a->GetType()), _ffvdwparams);
 3535|     86|      parameter_b = GetParameter1Atom(atoi(b->GetType()), _ffvdwparams);
 3536|     86|      if (parameter_a == nullptr || parameter_b == nullptr) {
  ------------------
  |  Branch (3536:11): [True: 86, False: 0]
  |  Branch (3536:37): [True: 0, False: 0]
  ------------------
 3537|     86|        IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|     86|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|     86|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 86]
  |  |  ------------------
  ------------------
 3538|      0|          snprintf(_logbuf, BUFF_SIZE, "   COULD NOT FIND VAN DER WAALS PARAMETERS FOR %d-%d (IDX)...\n", a->GetIdx(), b->GetIdx());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 3539|      0|          OBFFLog(_logbuf);
 3540|      0|        }
 3541|       |
 3542|     86|        return false;
 3543|     86|      }
 3544|       |
 3545|      0|      vdwcalc.a = a;
 3546|      0|      vdwcalc.alpha_a = parameter_a->_dpar[0];
 3547|      0|      vdwcalc.Na = parameter_a->_dpar[1];
 3548|      0|      vdwcalc.Aa = parameter_a->_dpar[2];
 3549|      0|      vdwcalc.Ga = parameter_a->_dpar[3];
 3550|      0|      vdwcalc.aDA = parameter_a->_ipar[0];
 3551|       |
 3552|      0|      vdwcalc.b = b;
 3553|      0|      vdwcalc.alpha_b = parameter_b->_dpar[0];
 3554|      0|      vdwcalc.Nb = parameter_b->_dpar[1];
 3555|      0|      vdwcalc.Ab = parameter_b->_dpar[2];
 3556|      0|      vdwcalc.Gb = parameter_b->_dpar[3];
 3557|      0|      vdwcalc.bDA = parameter_b->_ipar[0];
 3558|       |
 3559|       |      //these calculations only need to be done once for each pair,
 3560|       |      //we do them now and save them for later use
 3561|      0|      double R_AA, R_BB, R_AB6, g_AB, g_AB2;
 3562|      0|      double R_AB2, R_AB4, /*R_AB7,*/ sqrt_a, sqrt_b;
 3563|       |
 3564|      0|      R_AA = vdwcalc.Aa * pow(vdwcalc.alpha_a, 0.25);
 3565|      0|      R_BB = vdwcalc.Ab * pow(vdwcalc.alpha_b, 0.25);
 3566|      0|      sqrt_a = sqrt(vdwcalc.alpha_a / vdwcalc.Na);
 3567|      0|      sqrt_b = sqrt(vdwcalc.alpha_b / vdwcalc.Nb);
 3568|       |
 3569|      0|      if (vdwcalc.aDA == 1) { // hydrogen bond donor
  ------------------
  |  Branch (3569:11): [True: 0, False: 0]
  ------------------
 3570|      0|        vdwcalc.R_AB = 0.5 * (R_AA + R_BB);
 3571|      0|        R_AB2 = vdwcalc.R_AB * vdwcalc.R_AB;
 3572|      0|        R_AB4 = R_AB2 * R_AB2;
 3573|      0|        R_AB6 = R_AB4 * R_AB2;
 3574|       |
 3575|      0|        if (vdwcalc.bDA == 2) { // hydrogen bond acceptor
  ------------------
  |  Branch (3575:13): [True: 0, False: 0]
  ------------------
 3576|      0|          vdwcalc.epsilon = 0.5 * (181.16 * vdwcalc.Ga * vdwcalc.Gb * vdwcalc.alpha_a * vdwcalc.alpha_b) / (sqrt_a + sqrt_b) * (1.0 / R_AB6);
 3577|       |          // R_AB is scaled to 0.8 for D-A interactions. The value used in the calculation of epsilon is not scaled.
 3578|      0|          vdwcalc.R_AB = 0.8 * vdwcalc.R_AB;
 3579|      0|        } else
 3580|      0|          vdwcalc.epsilon = (181.16 * vdwcalc.Ga * vdwcalc.Gb * vdwcalc.alpha_a * vdwcalc.alpha_b) / (sqrt_a + sqrt_b) * (1.0 / R_AB6);
 3581|       |
 3582|      0|        R_AB2 = vdwcalc.R_AB * vdwcalc.R_AB;
 3583|      0|        R_AB4 = R_AB2 * R_AB2;
 3584|      0|        R_AB6 = R_AB4 * R_AB2;
 3585|      0|        vdwcalc.R_AB7 = R_AB6 * vdwcalc.R_AB;
 3586|      0|      } else if (vdwcalc.bDA == 1) { // hydrogen bond donor
  ------------------
  |  Branch (3586:18): [True: 0, False: 0]
  ------------------
 3587|      0|        vdwcalc.R_AB = 0.5 * (R_AA + R_BB);
 3588|      0|       	R_AB2 = vdwcalc.R_AB * vdwcalc.R_AB;
 3589|      0|        R_AB4 = R_AB2 * R_AB2;
 3590|      0|        R_AB6 = R_AB4 * R_AB2;
 3591|       |
 3592|      0|        if (vdwcalc.aDA == 2) { // hydrogen bond acceptor
  ------------------
  |  Branch (3592:13): [True: 0, False: 0]
  ------------------
 3593|      0|          vdwcalc.epsilon = 0.5 * (181.16 * vdwcalc.Ga * vdwcalc.Gb * vdwcalc.alpha_a * vdwcalc.alpha_b) / (sqrt_a + sqrt_b) * (1.0 / R_AB6);
 3594|       |          // R_AB is scaled to 0.8 for D-A interactions. The value used in the calculation of epsilon is not scaled.
 3595|      0|          vdwcalc.R_AB = 0.8 * vdwcalc.R_AB;
 3596|      0|        } else
 3597|      0|          vdwcalc.epsilon = (181.16 * vdwcalc.Ga * vdwcalc.Gb * vdwcalc.alpha_a * vdwcalc.alpha_b) / (sqrt_a + sqrt_b) * (1.0 / R_AB6);
 3598|       |
 3599|      0|        R_AB2 = vdwcalc.R_AB * vdwcalc.R_AB;
 3600|      0|        R_AB4 = R_AB2 * R_AB2;
 3601|      0|        R_AB6 = R_AB4 * R_AB2;
 3602|      0|        vdwcalc.R_AB7 = R_AB6 * vdwcalc.R_AB;
 3603|      0|      } else {
 3604|      0|        g_AB = (R_AA - R_BB) / ( R_AA + R_BB);
 3605|      0|        g_AB2 = g_AB * g_AB;
 3606|      0|        vdwcalc.R_AB =  0.5 * (R_AA + R_BB) * (1.0 + 0.2 * (1.0 - exp(-12.0 * g_AB2)));
 3607|      0|        R_AB2 = vdwcalc.R_AB * vdwcalc.R_AB;
 3608|      0|        R_AB4 = R_AB2 * R_AB2;
 3609|      0|        R_AB6 = R_AB4 * R_AB2;
 3610|      0|        vdwcalc.R_AB7 = R_AB6 * vdwcalc.R_AB;
 3611|      0|        vdwcalc.epsilon = (181.16 * vdwcalc.Ga * vdwcalc.Gb * vdwcalc.alpha_a * vdwcalc.alpha_b) / (sqrt_a + sqrt_b) * (1.0 / R_AB6);
 3612|      0|      }
 3613|       |
 3614|      0|      vdwcalc.pairIndex = pairIndex;
 3615|      0|      vdwcalc.SetupPointers();
 3616|      0|      _vdwcalculations.push_back(vdwcalc);
 3617|      0|    }
 3618|       |
 3619|       |    //
 3620|       |    // Electrostatic Calculations
 3621|       |    //
 3622|    338|    IF_OBFF_LOGLVL_LOW
  ------------------
  |  |   71|    338|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|    338|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 338]
  |  |  ------------------
  ------------------
 3623|      0|      OBFFLog("SETTING UP ELECTROSTATIC CALCULATIONS...\n");
 3624|       |
 3625|    338|    OBFFElectrostaticCalculationMMFF94 elecalc;
 3626|       |
 3627|    338|    _electrostaticcalculations.clear();
 3628|       |
 3629|    338|    pairIndex = -1;
 3630|    338|    FOR_PAIRS_OF_MOL(p, _mol) {
  ------------------
  |  |  429|    338|#define FOR_PAIRS_OF_MOL(p,m)     for( OpenBabel::OBMolPairIter     p(m); p; ++p )
  |  |  ------------------
  |  |  |  Branch (429:75): [True: 0, False: 338]
  |  |  ------------------
  ------------------
 3631|      0|      ++pairIndex;
 3632|      0|      a = _mol.GetAtom((*p)[0]);
 3633|      0|      b = _mol.GetAtom((*p)[1]);
 3634|       |
 3635|       |      // skip this ele if the atoms are ignored
 3636|      0|      if ( _constraints.IsIgnored(a->GetIdx()) || _constraints.IsIgnored(b->GetIdx()) )
  ------------------
  |  Branch (3636:12): [True: 0, False: 0]
  |  Branch (3636:51): [True: 0, False: 0]
  ------------------
 3637|      0|        continue;
 3638|       |
 3639|       |      // if there are any groups specified, check if the two atoms are in a single _interGroup or if
 3640|       |      // two two atoms are in one of the _interGroups pairs.
 3641|      0|      if (HasGroups()) {
  ------------------
  |  Branch (3641:11): [True: 0, False: 0]
  ------------------
 3642|      0|        bool validEle = false;
 3643|      0|        for (unsigned int i=0; i < _interGroup.size(); ++i) {
  ------------------
  |  Branch (3643:32): [True: 0, False: 0]
  ------------------
 3644|      0|          if (_interGroup[i].BitIsSet(a->GetIdx()) && _interGroup[i].BitIsSet(b->GetIdx())) {
  ------------------
  |  Branch (3644:15): [True: 0, False: 0]
  |  Branch (3644:55): [True: 0, False: 0]
  ------------------
 3645|      0|            validEle = true;
 3646|      0|            break;
 3647|      0|          }
 3648|      0|        }
 3649|      0|        if (!validEle) {
  ------------------
  |  Branch (3649:13): [True: 0, False: 0]
  ------------------
 3650|      0|          for (unsigned int i=0; i < _interGroups.size(); ++i) {
  ------------------
  |  Branch (3650:34): [True: 0, False: 0]
  ------------------
 3651|      0|            if (_interGroups[i].first.BitIsSet(a->GetIdx()) && _interGroups[i].second.BitIsSet(b->GetIdx())) {
  ------------------
  |  Branch (3651:17): [True: 0, False: 0]
  |  Branch (3651:64): [True: 0, False: 0]
  ------------------
 3652|      0|              validEle = true;
 3653|      0|              break;
 3654|      0|            }
 3655|      0|            if (_interGroups[i].first.BitIsSet(b->GetIdx()) && _interGroups[i].second.BitIsSet(a->GetIdx())) {
  ------------------
  |  Branch (3655:17): [True: 0, False: 0]
  |  Branch (3655:64): [True: 0, False: 0]
  ------------------
 3656|      0|              validEle = true;
 3657|      0|              break;
 3658|      0|            }
 3659|      0|          }
 3660|      0|        }
 3661|       |
 3662|      0|        if (!validEle)
  ------------------
  |  Branch (3662:13): [True: 0, False: 0]
  ------------------
 3663|      0|          continue;
 3664|      0|      }
 3665|       |
 3666|      0|      elecalc.qq = 332.0716 * a->GetPartialCharge() * b->GetPartialCharge() / _epsilon;
 3667|       |
 3668|      0|      if (elecalc.qq) {
  ------------------
  |  Branch (3668:11): [True: 0, False: 0]
  ------------------
 3669|      0|        elecalc.a = &*a;
 3670|      0|        elecalc.b = &*b;
 3671|       |
 3672|       |        // 1-4 scaling
 3673|      0|        if (a->IsOneFour(b))
  ------------------
  |  Branch (3673:13): [True: 0, False: 0]
  ------------------
 3674|      0|          elecalc.qq *= 0.75;
 3675|       |
 3676|      0|        elecalc.pairIndex = pairIndex;
 3677|      0|        elecalc.SetupPointers();
 3678|      0|        _electrostaticcalculations.push_back(elecalc);
 3679|      0|      }
 3680|      0|    }
 3681|       |
 3682|    338|    return true;
 3683|    424|  }
_ZN9OpenBabel18OBForceFieldMMFF9416SetFormalChargesEv:
 3709|  2.00k|  {
 3710|  2.00k|    _mol.SetAutomaticPartialCharge(false);
 3711|       |
 3712|   190k|    FOR_ATOMS_OF_MOL (atom, _mol) {
  ------------------
  |  |  417|  2.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 190k, False: 2.00k]
  |  |  ------------------
  ------------------
 3713|   190k|      int type = atoi(atom->GetType());
 3714|   190k|      atom->SetPartialCharge(0.0);
 3715|       |
 3716|   190k|      bool done = false;
 3717|   190k|      switch (type) {
 3718|    481|      case 34:
  ------------------
  |  Branch (3718:7): [True: 481, False: 189k]
  ------------------
 3719|    859|      case 49:
  ------------------
  |  Branch (3719:7): [True: 378, False: 189k]
  ------------------
 3720|    999|      case 51:
  ------------------
  |  Branch (3720:7): [True: 140, False: 189k]
  ------------------
 3721|  1.16k|      case 54:
  ------------------
  |  Branch (3721:7): [True: 170, False: 189k]
  ------------------
 3722|  1.18k|      case 58:
  ------------------
  |  Branch (3722:7): [True: 16, False: 190k]
  ------------------
 3723|  1.21k|      case 92:
  ------------------
  |  Branch (3723:7): [True: 27, False: 190k]
  ------------------
 3724|  1.27k|      case 93:
  ------------------
  |  Branch (3724:7): [True: 67, False: 189k]
  ------------------
 3725|  1.48k|      case 94:
  ------------------
  |  Branch (3725:7): [True: 210, False: 189k]
  ------------------
 3726|  1.49k|      case 97:
  ------------------
  |  Branch (3726:7): [True: 3, False: 190k]
  ------------------
 3727|  1.49k|        atom->SetPartialCharge(1.0);
 3728|  1.49k|        done = true;
 3729|  1.49k|        break;
 3730|     58|      case 35:
  ------------------
  |  Branch (3730:7): [True: 58, False: 189k]
  ------------------
 3731|  3.16k|      case 62:
  ------------------
  |  Branch (3731:7): [True: 3.10k, False: 186k]
  ------------------
 3732|  3.27k|      case 89:
  ------------------
  |  Branch (3732:7): [True: 112, False: 189k]
  ------------------
 3733|  3.33k|      case 90:
  ------------------
  |  Branch (3733:7): [True: 59, False: 189k]
  ------------------
 3734|  3.35k|      case 91:
  ------------------
  |  Branch (3734:7): [True: 24, False: 190k]
  ------------------
 3735|  3.35k|        atom->SetPartialCharge(-1.0);
 3736|  3.35k|        done = true;
 3737|  3.35k|        break;
 3738|      9|      case 55:
  ------------------
  |  Branch (3738:7): [True: 9, False: 190k]
  ------------------
 3739|      9|        atom->SetPartialCharge(0.5);
 3740|      9|        done = true;
 3741|      9|        break;
 3742|      1|      case 87:
  ------------------
  |  Branch (3742:7): [True: 1, False: 190k]
  ------------------
 3743|     94|      case 95:
  ------------------
  |  Branch (3743:7): [True: 93, False: 189k]
  ------------------
 3744|    139|      case 96:
  ------------------
  |  Branch (3744:7): [True: 45, False: 190k]
  ------------------
 3745|    278|      case 98:
  ------------------
  |  Branch (3745:7): [True: 139, False: 189k]
  ------------------
 3746|    526|      case 99:
  ------------------
  |  Branch (3746:7): [True: 248, False: 189k]
  ------------------
 3747|    526|        atom->SetPartialCharge(2.0);
 3748|    526|        done = true;
 3749|    526|        break;
 3750|     88|      case 88:
  ------------------
  |  Branch (3750:7): [True: 88, False: 189k]
  ------------------
 3751|     88|        atom->SetPartialCharge(3.0);
 3752|     88|        done = true;
 3753|     88|        break;
 3754|       |        //case 98:
 3755|       |        //  atom->SetPartialCharge(3.0);
 3756|   184k|      default:
  ------------------
  |  Branch (3756:7): [True: 184k, False: 5.47k]
  ------------------
 3757|   184k|        break;
 3758|   190k|      }
 3759|       |
 3760|   190k|      if (done)
  ------------------
  |  Branch (3760:11): [True: 5.47k, False: 184k]
  ------------------
 3761|  5.47k|        continue;
 3762|       |
 3763|   184k|      if (type == 56) {
  ------------------
  |  Branch (3763:11): [True: 46, False: 184k]
  ------------------
 3764|     46|        int n_count = 0;
 3765|     46|        int temp_type;
 3766|  1.39k|        FOR_ATOMS_OF_MOL (atom2, _mol) {
  ------------------
  |  |  417|     46|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 1.39k, False: 46]
  |  |  ------------------
  ------------------
 3767|  1.39k|          temp_type = atoi(atom2->GetType());
 3768|  1.39k|          if (temp_type == 56 || temp_type == 81)
  ------------------
  |  Branch (3768:15): [True: 174, False: 1.22k]
  |  Branch (3768:34): [True: 7, False: 1.21k]
  ------------------
 3769|    181|            ++n_count;
 3770|  1.39k|        }
 3771|     46|        atom->SetPartialCharge((double)((n_count + 1) / 3) / (double)n_count);
 3772|   184k|      } else if (type == 32) {
  ------------------
  |  Branch (3772:18): [True: 1.12k, False: 183k]
  ------------------
 3773|  1.12k|        int o_count = 0;
 3774|  1.12k|        bool sulfonamide = false;
 3775|  1.12k|        bool sulfone_s_c = false;
 3776|  1.12k|        int s_count = 0;
 3777|       |
 3778|  1.12k|        FOR_NBORS_OF_ATOM(nbr, &*atom) {
  ------------------
  |  |  419|  1.12k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.12k, False: 1.12k]
  |  |  ------------------
  ------------------
 3779|  3.73k|          FOR_NBORS_OF_ATOM(nbr2, &*nbr) {
  ------------------
  |  |  419|  1.12k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 3.73k, False: 1.12k]
  |  |  ------------------
  ------------------
 3780|  3.73k|            if (nbr2->GetAtomicNum() == OBElements::Oxygen && (nbr2->GetExplicitDegree() == 1))
  ------------------
  |  Branch (3780:17): [True: 2.08k, False: 1.64k]
  |  Branch (3780:63): [True: 1.95k, False: 129]
  ------------------
 3781|  1.95k|              o_count++;
 3782|  3.73k|            if (nbr2->GetAtomicNum() == OBElements::Sulfur && (nbr2->GetExplicitDegree() == 1))
  ------------------
  |  Branch (3782:17): [True: 500, False: 3.23k]
  |  Branch (3782:63): [True: 415, False: 85]
  ------------------
 3783|    415|              s_count++;
 3784|  3.73k|            if (nbr2->GetAtomicNum() == OBElements::Nitrogen && !nbr2->IsAromatic())
  ------------------
  |  Branch (3784:17): [True: 676, False: 3.05k]
  |  Branch (3784:65): [True: 673, False: 3]
  ------------------
 3785|    673|              sulfonamide = true;
 3786|  3.73k|            OBBond *bond = nbr->GetBond(&*nbr2);
 3787|  3.73k|            if (nbr2->GetAtomicNum() == OBElements::Carbon && !bond->IsAromatic() && bond->GetBondOrder() == 2)
  ------------------
  |  Branch (3787:17): [True: 55, False: 3.67k]
  |  Branch (3787:63): [True: 53, False: 2]
  |  Branch (3787:86): [True: 4, False: 49]
  ------------------
 3788|      4|              sulfone_s_c = true;
 3789|  3.73k|          }
 3790|       |
 3791|  1.12k|          if (nbr->GetAtomicNum() == OBElements::Carbon)
  ------------------
  |  Branch (3791:15): [True: 12, False: 1.10k]
  ------------------
 3792|     12|            atom->SetPartialCharge(-0.5); // O2CM
 3793|       |
 3794|  1.12k|          if (nbr->GetAtomicNum() == OBElements::Nitrogen && (o_count == 3))
  ------------------
  |  Branch (3794:15): [True: 42, False: 1.07k]
  |  Branch (3794:62): [True: 9, False: 33]
  ------------------
 3795|      9|            atom->SetPartialCharge(-1.0 / o_count);  // O3N
 3796|       |
 3797|  1.12k|          if (nbr->GetAtomicNum() == OBElements::Sulfur && !sulfonamide) {
  ------------------
  |  Branch (3797:15): [True: 108, False: 1.01k]
  |  Branch (3797:60): [True: 81, False: 27]
  ------------------
 3798|     81|            if (((o_count + s_count) == 2) && (nbr->GetExplicitDegree() == 3)
  ------------------
  |  Branch (3798:17): [True: 39, False: 42]
  |  Branch (3798:47): [True: 2, False: 37]
  ------------------
 3799|      2|                && (nbr->GetExplicitValence() >= 3) && !sulfone_s_c) {
  ------------------
  |  Branch (3799:20): [True: 2, False: 0]
  |  Branch (3799:56): [True: 2, False: 0]
  ------------------
 3800|      2|              atom->SetPartialCharge(-0.5); // O2S (sulfinate)
 3801|      2|            }
 3802|     79|            else if ((o_count + s_count) == 3) {
  ------------------
  |  Branch (3802:22): [True: 12, False: 67]
  ------------------
 3803|     12|              atom->SetPartialCharge(-1.0 / 3.0); // O3S
 3804|     12|            }
 3805|     67|            else if ((o_count + s_count) == 4) {
  ------------------
  |  Branch (3805:22): [True: 11, False: 56]
  ------------------
 3806|     11|              atom->SetPartialCharge(-0.5); // O4S
 3807|     11|            }
 3808|     81|          }
 3809|       |
 3810|  1.12k|          if (nbr->GetAtomicNum() == OBElements::Phosphorus) {
  ------------------
  |  Branch (3810:15): [True: 579, False: 541]
  ------------------
 3811|    579|            if ((o_count + s_count) == 2) {
  ------------------
  |  Branch (3811:17): [True: 142, False: 437]
  ------------------
 3812|    142|              atom->SetPartialCharge(-0.5); // O2P
 3813|    142|            }
 3814|    437|            else if ((o_count + s_count) == 3) {
  ------------------
  |  Branch (3814:22): [True: 239, False: 198]
  ------------------
 3815|    239|              atom->SetPartialCharge(-2.0 / 3.0); // O3P
 3816|    239|            }
 3817|    198|            else if ((o_count + s_count) == 4) {
  ------------------
  |  Branch (3817:22): [True: 36, False: 162]
  ------------------
 3818|     36|              atom->SetPartialCharge(-0.25); // O4P
 3819|     36|            }
 3820|    579|          }
 3821|       |
 3822|  1.12k|          if (atoi(nbr->GetType()) == 77)
  ------------------
  |  Branch (3822:15): [True: 0, False: 1.12k]
  ------------------
 3823|      0|            atom->SetPartialCharge(-0.25); // O4CL
 3824|  1.12k|        }
 3825|   183k|      } else if (type == 61) {
  ------------------
  |  Branch (3825:18): [True: 10, False: 183k]
  ------------------
 3826|     20|        FOR_BONDS_OF_ATOM(bond, &*atom) {
  ------------------
  |  |  420|     10|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 20, False: 10]
  |  |  ------------------
  ------------------
 3827|     20|          OBAtom *nbr = bond->GetNbrAtom(&*atom);
 3828|     20|          if (!bond->IsAromatic() && bond->GetBondOrder() == 3 && nbr->GetAtomicNum() == OBElements::Nitrogen)
  ------------------
  |  Branch (3828:15): [True: 20, False: 0]
  |  Branch (3828:38): [True: 10, False: 10]
  |  Branch (3828:67): [True: 1, False: 9]
  ------------------
 3829|      1|            atom->SetPartialCharge(1.0);
 3830|     20|        }
 3831|   183k|      } else if (type == 72) {
  ------------------
  |  Branch (3831:18): [True: 728, False: 182k]
  ------------------
 3832|    728|        int s_count = 0;
 3833|       |
 3834|    728|        FOR_NBORS_OF_ATOM(nbr, &*atom) {
  ------------------
  |  |  419|    728|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 728, False: 728]
  |  |  ------------------
  ------------------
 3835|    728|          if (nbr->GetAtomicNum() == OBElements::Sulfur)
  ------------------
  |  Branch (3835:15): [True: 83, False: 645]
  ------------------
 3836|     83|            s_count++;
 3837|       |
 3838|    728|          if (nbr->GetAtomicNum() == OBElements::Phosphorus || nbr->GetAtomicNum() == OBElements::Sulfur) {
  ------------------
  |  Branch (3838:15): [True: 332, False: 396]
  |  Branch (3838:64): [True: 83, False: 313]
  ------------------
 3839|    415|            FOR_NBORS_OF_ATOM(nbr2, &*nbr)
  ------------------
  |  |  419|    415|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.82k, False: 415]
  |  |  ------------------
  ------------------
 3840|  1.82k|              if ((nbr2->GetAtomicNum() == OBElements::Sulfur || nbr2->GetAtomicNum() == OBElements::Oxygen) && (nbr2->GetExplicitDegree() == 1) && (atom->GetIdx() != nbr2->GetIdx()))
  ------------------
  |  Branch (3840:20): [True: 675, False: 1.15k]
  |  Branch (3840:66): [True: 422, False: 731]
  |  Branch (3840:113): [True: 1.07k, False: 23]
  |  Branch (3840:149): [True: 659, False: 415]
  ------------------
 3841|    659|                atom->SetPartialCharge(-0.5);
 3842|    415|          } else
 3843|    313|            atom->SetPartialCharge(-1.0);
 3844|       |
 3845|    728|          if (nbr->GetAtomicNum() == OBElements::Carbon)
  ------------------
  |  Branch (3845:15): [True: 99, False: 629]
  ------------------
 3846|     99|            FOR_NBORS_OF_ATOM(nbr2, &*nbr)
  ------------------
  |  |  419|     99|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 384, False: 99]
  |  |  ------------------
  ------------------
 3847|    384|              if (nbr2->GetAtomicNum() == OBElements::Sulfur && (nbr2->GetExplicitDegree() == 1) && (atom->GetIdx() != nbr2->GetIdx()))
  ------------------
  |  Branch (3847:19): [True: 109, False: 275]
  |  Branch (3847:65): [True: 103, False: 6]
  |  Branch (3847:101): [True: 4, False: 99]
  ------------------
 3848|      4|                atom->SetPartialCharge(-0.5); // SSMO
 3849|       |
 3850|    728|          if (s_count >= 2)
  ------------------
  |  Branch (3850:15): [True: 0, False: 728]
  ------------------
 3851|      0|            atom->SetPartialCharge(-0.5); // SSMO
 3852|    728|        }
 3853|   182k|      } else if (type == 76) {
  ------------------
  |  Branch (3853:18): [True: 46, False: 182k]
  ------------------
 3854|     46|       	vector<OBRing*> vr;
 3855|     46|        vr = _mol.GetSSSR();
 3856|     46|        vector<OBRing*>::iterator ri;
 3857|     46|        vector<int>::iterator rj;
 3858|     46|        int n_count;
 3859|       |
 3860|    263|        for (ri = vr.begin();ri != vr.end();++ri) { // for each ring
  ------------------
  |  Branch (3860:30): [True: 217, False: 46]
  ------------------
 3861|    217|          n_count = 0;
 3862|       |
 3863|    217|          if ((*ri)->IsAromatic() && (*ri)->IsMember(&*atom) && ((*ri)->Size() == 5)) {
  ------------------
  |  Branch (3863:15): [True: 60, False: 157]
  |  Branch (3863:38): [True: 46, False: 14]
  |  Branch (3863:65): [True: 46, False: 0]
  ------------------
 3864|    276|            for(rj = (*ri)->_path.begin();rj != (*ri)->_path.end();++rj) // for each ring atom
  ------------------
  |  Branch (3864:43): [True: 230, False: 46]
  ------------------
 3865|    230|              if (_mol.GetAtom(*rj)->GetAtomicNum() == OBElements::Nitrogen)
  ------------------
  |  Branch (3865:19): [True: 155, False: 75]
  ------------------
 3866|    155|                n_count++;
 3867|       |
 3868|     46|            if (n_count > 1)
  ------------------
  |  Branch (3868:17): [True: 40, False: 6]
  ------------------
 3869|     40|              atom->SetPartialCharge(-1.0 / n_count);
 3870|     46|          }
 3871|    217|        }
 3872|   182k|      } else if (type == 81) {
  ------------------
  |  Branch (3872:18): [True: 33, False: 182k]
  ------------------
 3873|     33|        atom->SetPartialCharge(1.0);
 3874|       |
 3875|     33|        vector<OBRing*> vr;
 3876|     33|        vr = _mol.GetSSSR();
 3877|     33|        vector<OBRing*>::iterator ri;
 3878|     33|        vector<int>::iterator rj;
 3879|    135|        for (ri = vr.begin();ri != vr.end();++ri) // for each ring
  ------------------
  |  Branch (3879:30): [True: 102, False: 33]
  ------------------
 3880|    102|          if ((*ri)->IsAromatic() && (*ri)->IsMember(&*atom) && ((*ri)->Size() == 5)) {
  ------------------
  |  Branch (3880:15): [True: 43, False: 59]
  |  Branch (3880:38): [True: 33, False: 10]
  |  Branch (3880:65): [True: 33, False: 0]
  ------------------
 3881|     33|            int n_count = 0;
 3882|    198|            for(rj = (*ri)->_path.begin();rj != (*ri)->_path.end();++rj) // for each ring atom
  ------------------
  |  Branch (3882:43): [True: 165, False: 33]
  ------------------
 3883|    165|              if (_mol.GetAtom(*rj)->GetAtomicNum() == OBElements::Nitrogen && (_mol.GetAtom(*rj)->GetExplicitDegree() == 3))
  ------------------
  |  Branch (3883:19): [True: 104, False: 61]
  |  Branch (3883:80): [True: 46, False: 58]
  ------------------
 3884|     46|                n_count++;
 3885|       |
 3886|     33|            if (n_count) // coverity defensive testing
  ------------------
  |  Branch (3886:17): [True: 33, False: 0]
  ------------------
 3887|     33|              atom->SetPartialCharge(1.0 / n_count); // NIM+
 3888|       |
 3889|     33|            FOR_NBORS_OF_ATOM(nbr, &*atom)
  ------------------
  |  |  419|     33|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 99, False: 33]
  |  |  ------------------
  ------------------
 3890|     99|              FOR_NBORS_OF_ATOM(nbr2, &*nbr)
  ------------------
  |  |  419|     99|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 239, False: 99]
  |  |  ------------------
  ------------------
 3891|    239|              if (atoi(nbr2->GetType()) == 56)
  ------------------
  |  Branch (3891:19): [True: 1, False: 238]
  ------------------
 3892|      1|                atom->SetPartialCharge(1.0 / 3.0);
 3893|       |
 3894|     33|            FOR_NBORS_OF_ATOM(nbr, &*atom)
  ------------------
  |  |  419|     33|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 99, False: 33]
  |  |  ------------------
  ------------------
 3895|     99|              FOR_NBORS_OF_ATOM(nbr2, &*nbr)
  ------------------
  |  |  419|     99|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 239, False: 99]
  |  |  ------------------
  ------------------
 3896|    239|              if (atoi(nbr2->GetType()) == 55)
  ------------------
  |  Branch (3896:19): [True: 0, False: 239]
  ------------------
 3897|      0|                atom->SetPartialCharge(1.0 / (1.0 + n_count));
 3898|     33|          }
 3899|     33|      }
 3900|       |
 3901|   184k|    }
 3902|       |
 3903|  2.00k|    PrintFormalCharges();
 3904|       |
 3905|  2.00k|    return true;
 3906|  2.00k|  }
_ZN9OpenBabel18OBForceFieldMMFF9417SetPartialChargesEv:
 3909|  2.00k|  {
 3910|  2.00k|    vector<double> charges(_mol.NumAtoms()+1, 0);
 3911|  2.00k|    double M, Wab, factor, q0a, q0b, Pa, Pb;
 3912|       |
 3913|   190k|    FOR_ATOMS_OF_MOL (atom, _mol) {
  ------------------
  |  |  417|  2.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 190k, False: 2.00k]
  |  |  ------------------
  ------------------
 3914|   190k|      int type = atoi(atom->GetType());
 3915|       |
 3916|   190k|      switch (type) {
 3917|  1.12k|      case 32:
  ------------------
  |  Branch (3917:7): [True: 1.12k, False: 188k]
  ------------------
 3918|  1.17k|      case 35:
  ------------------
  |  Branch (3918:7): [True: 58, False: 189k]
  ------------------
 3919|  1.90k|      case 72:
  ------------------
  |  Branch (3919:7): [True: 728, False: 189k]
  ------------------
 3920|  1.90k|        factor = 0.5;
 3921|  1.90k|        break;
 3922|  3.10k|      case 62:
  ------------------
  |  Branch (3922:7): [True: 3.10k, False: 186k]
  ------------------
 3923|  3.15k|      case 76:
  ------------------
  |  Branch (3923:7): [True: 46, False: 190k]
  ------------------
 3924|  3.15k|        factor = 0.25;
 3925|  3.15k|        break;
 3926|   184k|      default:
  ------------------
  |  Branch (3926:7): [True: 184k, False: 5.05k]
  ------------------
 3927|   184k|        factor = 0.0;
 3928|   184k|        break;
 3929|   190k|      }
 3930|       |
 3931|   190k|      M = GetCrd(type);
 3932|   190k|      q0a = atom->GetPartialCharge();
 3933|       |
 3934|       |      // charge sharing
 3935|   190k|      if (!factor)
  ------------------
  |  Branch (3935:11): [True: 184k, False: 5.05k]
  ------------------
 3936|   184k|        FOR_NBORS_OF_ATOM (nbr, &*atom)
  ------------------
  |  |  419|   184k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 306k, False: 184k]
  |  |  ------------------
  ------------------
 3937|   306k|          if (nbr->GetPartialCharge() < 0.0)
  ------------------
  |  Branch (3937:15): [True: 6.72k, False: 299k]
  ------------------
 3938|  6.72k|            q0a += nbr->GetPartialCharge() / (2.0 * (double)(nbr->GetExplicitDegree()));
 3939|       |
 3940|       |      // needed for SEYWUO, positive charge sharing?
 3941|   190k|      if (type == 62)
  ------------------
  |  Branch (3941:11): [True: 3.10k, False: 186k]
  ------------------
 3942|  3.10k|        FOR_NBORS_OF_ATOM (nbr, &*atom)
  ------------------
  |  |  419|  3.10k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 6.21k, False: 3.10k]
  |  |  ------------------
  ------------------
 3943|  6.21k|          if (nbr->GetPartialCharge() > 0.0)
  ------------------
  |  Branch (3943:15): [True: 664, False: 5.54k]
  ------------------
 3944|    664|            q0a -= nbr->GetPartialCharge() / 2.0;
 3945|       |
 3946|   190k|      q0b = 0.0;
 3947|   190k|      Wab = 0.0;
 3948|   190k|      Pa = Pb = 0.0;
 3949|   314k|      FOR_NBORS_OF_ATOM (nbr, &*atom) {
  ------------------
  |  |  419|   190k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 314k, False: 190k]
  |  |  ------------------
  ------------------
 3950|   314k|        int nbr_type = atoi(nbr->GetType());
 3951|       |
 3952|   314k|        q0b += nbr->GetPartialCharge();
 3953|       |
 3954|   314k|        bool bci_found = false;
 3955|   314k|        for (unsigned int idx=0; idx < _ffchgparams.size(); idx++)
  ------------------
  |  Branch (3955:34): [True: 0, False: 314k]
  ------------------
 3956|      0|          if (GetBondType(&*atom, &*nbr) == _ffchgparams[idx]._ipar[0]) {
  ------------------
  |  Branch (3956:15): [True: 0, False: 0]
  ------------------
 3957|      0|            if ((type == _ffchgparams[idx].a) && (nbr_type == _ffchgparams[idx].b)) {
  ------------------
  |  Branch (3957:17): [True: 0, False: 0]
  |  Branch (3957:50): [True: 0, False: 0]
  ------------------
 3958|      0|              Wab += -_ffchgparams[idx]._dpar[0];
 3959|      0|              bci_found = true;
 3960|      0|            } else if  ((type == _ffchgparams[idx].b) && (nbr_type == _ffchgparams[idx].a)) {
  ------------------
  |  Branch (3960:25): [True: 0, False: 0]
  |  Branch (3960:58): [True: 0, False: 0]
  ------------------
 3961|      0|              Wab += _ffchgparams[idx]._dpar[0];
 3962|      0|              bci_found = true;
 3963|      0|            }
 3964|      0|	  }
 3965|       |
 3966|   314k|        if (!bci_found) {
  ------------------
  |  Branch (3966:13): [True: 314k, False: 0]
  ------------------
 3967|   314k|          for (unsigned int idx=0; idx < _ffpbciparams.size(); idx++) {
  ------------------
  |  Branch (3967:36): [True: 0, False: 314k]
  ------------------
 3968|      0|            if (type == _ffpbciparams[idx].a)
  ------------------
  |  Branch (3968:17): [True: 0, False: 0]
  ------------------
 3969|      0|              Pa = _ffpbciparams[idx]._dpar[0];
 3970|      0|            if (nbr_type == _ffpbciparams[idx].a)
  ------------------
  |  Branch (3970:17): [True: 0, False: 0]
  ------------------
 3971|      0|              Pb = _ffpbciparams[idx]._dpar[0];
 3972|      0|          }
 3973|   314k|          Wab += Pa - Pb;
 3974|   314k|        }
 3975|   314k|      }
 3976|   190k|      if (factor)
  ------------------
  |  Branch (3976:11): [True: 5.05k, False: 184k]
  ------------------
 3977|  5.05k|        charges[atom->GetIdx()] = (1.0 - M * factor) * q0a + factor * q0b + Wab;
 3978|   184k|      else
 3979|   184k|        charges[atom->GetIdx()] = q0a + Wab;
 3980|   190k|    }
 3981|       |
 3982|  2.00k|    FOR_ATOMS_OF_MOL (atom, _mol)
  ------------------
  |  |  417|  2.00k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 190k, False: 2.00k]
  |  |  ------------------
  ------------------
 3983|   190k|      atom->SetPartialCharge(charges[atom->GetIdx()]);
 3984|       |
 3985|  2.00k|    PrintPartialCharges();
 3986|       |
 3987|  2.00k|    return true;
 3988|  2.00k|  }
_ZN9OpenBabel18OBForceFieldMMFF9411GetBondTypeEPNS_6OBAtomES2_:
 4491|  1.57k|  {
 4492|  1.57k|    OBBond *bond = _mol.GetBond(a, b);
 4493|  1.57k|    if (bond == nullptr)
  ------------------
  |  Branch (4493:9): [True: 0, False: 1.57k]
  ------------------
 4494|      0|      return 0;
 4495|  1.57k|    if (bond->GetBondOrder() != 1 || bond->IsAromatic())
  ------------------
  |  Branch (4495:9): [True: 230, False: 1.34k]
  |  Branch (4495:38): [True: 3, False: 1.34k]
  ------------------
 4496|    233|      return 0;
 4497|       |
 4498|  1.34k|    if (HasAromSet(atoi(a->GetType())) && HasAromSet(atoi(b->GetType())))
  ------------------
  |  Branch (4498:9): [True: 0, False: 1.34k]
  |  Branch (4498:43): [True: 0, False: 0]
  ------------------
 4499|      0|      return 1;
 4500|       |
 4501|  1.34k|    if (HasSbmbSet(atoi(a->GetType())) && HasSbmbSet(atoi(b->GetType())))
  ------------------
  |  Branch (4501:9): [True: 0, False: 1.34k]
  |  Branch (4501:43): [True: 0, False: 0]
  ------------------
 4502|      0|      return 1;
 4503|       |
 4504|  1.34k|    return 0;
 4505|  1.34k|  }
_ZN9OpenBabel18OBForceFieldMMFF9410HasAromSetEi:
 4758|  1.34k|  {
 4759|  1.34k|    return _ffpropArom.BitIsSet(atomtype);
 4760|  1.34k|  }
_ZN9OpenBabel18OBForceFieldMMFF9410HasSbmbSetEi:
 4764|  1.34k|  {
 4765|  1.34k|    return _ffpropSbmb.BitIsSet(atomtype);
 4766|  1.34k|  }
_ZN9OpenBabel18OBForceFieldMMFF946GetCrdEi:
 4770|   190k|  {
 4771|   190k|    OBFFParameter *par;
 4772|       |
 4773|   190k|    par = GetParameter1Atom(atomtype, _ffpropparams); // from mmffprop.par
 4774|   190k|    if (par)
  ------------------
  |  Branch (4774:9): [True: 0, False: 190k]
  ------------------
 4775|      0|      return par->_ipar[1];
 4776|       |
 4777|   190k|    return 0;
 4778|   190k|  }
_ZN9OpenBabel18OBForceFieldMMFF9417GetParameter1AtomEiRNSt3__16vectorINS_13OBFFParameterENS1_9allocatorIS3_EEEE:
 5107|   190k|  {
 5108|   190k|    OBFFParameter *par;
 5109|       |
 5110|   190k|    for (unsigned int idx=0; idx < parameter.size(); idx++)
  ------------------
  |  Branch (5110:30): [True: 0, False: 190k]
  ------------------
 5111|      0|      if (a == parameter[idx].a) {
  ------------------
  |  Branch (5111:11): [True: 0, False: 0]
  ------------------
 5112|      0|        par = &parameter[idx];
 5113|      0|        return par;
 5114|      0|      }
 5115|       |
 5116|   190k|    return nullptr;
 5117|   190k|  }
_ZN9OpenBabel18OBForceFieldMMFF9417GetParameter2AtomEiiRNSt3__16vectorINS_13OBFFParameterENS1_9allocatorIS3_EEEE:
 5120|  1.57k|  {
 5121|  1.57k|    OBFFParameter *par;
 5122|       |
 5123|  1.57k|    for (unsigned int idx=0; idx < parameter.size(); idx++)
  ------------------
  |  Branch (5123:30): [True: 0, False: 1.57k]
  ------------------
 5124|      0|      if (((a == parameter[idx].a) && (b == parameter[idx].b)) ||
  ------------------
  |  Branch (5124:12): [True: 0, False: 0]
  |  Branch (5124:39): [True: 0, False: 0]
  ------------------
 5125|      0|          ((a == parameter[idx].b) && (b == parameter[idx].a)))
  ------------------
  |  Branch (5125:12): [True: 0, False: 0]
  |  Branch (5125:39): [True: 0, False: 0]
  ------------------
 5126|      0|        {
 5127|      0|          par = &parameter[idx];
 5128|      0|          return par;
 5129|      0|        }
 5130|       |
 5131|  1.57k|    return nullptr;
 5132|  1.57k|  }
_ZN9OpenBabel18OBForceFieldMMFF9422GetTypedParameter2AtomEiiiRNSt3__16vectorINS_13OBFFParameterENS1_9allocatorIS3_EEEE:
 5150|  1.57k|  {
 5151|  1.57k|    OBFFParameter *par;
 5152|       |
 5153|  1.57k|    for (unsigned int idx=0; idx < parameter.size(); idx++)
  ------------------
  |  Branch (5153:30): [True: 0, False: 1.57k]
  ------------------
 5154|      0|      if (((a == parameter[idx].a) && (b == parameter[idx].b) && (ffclass == parameter[idx]._ipar[0])) ||
  ------------------
  |  Branch (5154:12): [True: 0, False: 0]
  |  Branch (5154:39): [True: 0, False: 0]
  |  Branch (5154:66): [True: 0, False: 0]
  ------------------
 5155|      0|          ((a == parameter[idx].b) && (b == parameter[idx].a) && (ffclass == parameter[idx]._ipar[0])))
  ------------------
  |  Branch (5155:12): [True: 0, False: 0]
  |  Branch (5155:39): [True: 0, False: 0]
  |  Branch (5155:66): [True: 0, False: 0]
  ------------------
 5156|      0|        {
 5157|      0|          par = &parameter[idx];
 5158|      0|          return par;
 5159|      0|        }
 5160|       |
 5161|  1.57k|    return nullptr;
 5162|  1.57k|  }
_ZN9OpenBabel18OBForceFieldMMFF946E_BondILb1EEEdv:
  135|  1.78k|  {
  136|  1.78k|    double energy = 0.0;
  137|       |
  138|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  139|      0|      OBFFLog("\nB O N D   S T R E T C H I N G\n\n");
  140|      0|      OBFFLog("ATOM TYPES   FF    BOND       IDEAL       FORCE\n");
  141|      0|      OBFFLog(" I    J     CLASS  LENGTH     LENGTH     CONSTANT      DELTA      ENERGY\n");
  142|      0|      OBFFLog("------------------------------------------------------------------------\n");
  143|      0|    }
  144|       |
  145|       |    #ifdef _OPENMP
  146|       |    #pragma omp parallel for reduction(+:energy)
  147|       |    #endif
  148|  1.78k|    for (int i = 0; i < _bondcalculations.size(); ++i) {
  ------------------
  |  Branch (148:21): [True: 0, False: 1.78k]
  ------------------
  149|      0|      _bondcalculations[i].template Compute<gradients>();
  150|      0|      energy += _bondcalculations[i].energy;
  151|       |
  152|      0|      #ifndef _OPENMP
  153|      0|      if (gradients) {
  ------------------
  |  Branch (153:11): [True: 0, Folded]
  ------------------
  154|      0|        AddGradient(_bondcalculations[i].force_a, _bondcalculations[i].idx_a);
  155|      0|        AddGradient(_bondcalculations[i].force_b, _bondcalculations[i].idx_b);
  156|      0|      }
  157|      0|      #endif
  158|       |
  159|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  160|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d      %d   %8.3f   %8.3f     %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  161|      0|                atoi(_bondcalculations[i].a->GetType()), atoi(_bondcalculations[i].b->GetType()),
  162|      0|                _bondcalculations[i].bt, _bondcalculations[i].rab, _bondcalculations[i].r0,
  163|      0|                _bondcalculations[i].kb, _bondcalculations[i].delta,
  164|      0|                143.9325 * 0.5 * _bondcalculations[i].energy);
  165|      0|        OBFFLog(_logbuf);
  166|      0|      }
  167|      0|    }
  168|       |
  169|       |    #ifdef _OPENMP
  170|       |    for (int i = 0; i < _bondcalculations.size(); ++i) {
  171|       |      if (gradients) {
  172|       |        AddGradient(_bondcalculations[i].force_a, _bondcalculations[i].idx_a);
  173|       |        AddGradient(_bondcalculations[i].force_b, _bondcalculations[i].idx_b);
  174|       |      }
  175|       |    }
  176|       |    #endif
  177|       |
  178|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  179|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL BOND STRETCHING ENERGY = %8.5f %s\n",  143.9325 * 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  180|      0|      OBFFLog(_logbuf);
  181|      0|    }
  182|       |
  183|  1.78k|    return (143.9325 * 0.5 * energy);
  184|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF946E_BondILb0EEEdv:
  135|  3.50k|  {
  136|  3.50k|    double energy = 0.0;
  137|       |
  138|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  139|      0|      OBFFLog("\nB O N D   S T R E T C H I N G\n\n");
  140|      0|      OBFFLog("ATOM TYPES   FF    BOND       IDEAL       FORCE\n");
  141|      0|      OBFFLog(" I    J     CLASS  LENGTH     LENGTH     CONSTANT      DELTA      ENERGY\n");
  142|      0|      OBFFLog("------------------------------------------------------------------------\n");
  143|      0|    }
  144|       |
  145|       |    #ifdef _OPENMP
  146|       |    #pragma omp parallel for reduction(+:energy)
  147|       |    #endif
  148|  3.50k|    for (int i = 0; i < _bondcalculations.size(); ++i) {
  ------------------
  |  Branch (148:21): [True: 0, False: 3.50k]
  ------------------
  149|      0|      _bondcalculations[i].template Compute<gradients>();
  150|      0|      energy += _bondcalculations[i].energy;
  151|       |
  152|      0|      #ifndef _OPENMP
  153|      0|      if (gradients) {
  ------------------
  |  Branch (153:11): [Folded, False: 0]
  ------------------
  154|      0|        AddGradient(_bondcalculations[i].force_a, _bondcalculations[i].idx_a);
  155|      0|        AddGradient(_bondcalculations[i].force_b, _bondcalculations[i].idx_b);
  156|      0|      }
  157|      0|      #endif
  158|       |
  159|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  160|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d      %d   %8.3f   %8.3f     %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  161|      0|                atoi(_bondcalculations[i].a->GetType()), atoi(_bondcalculations[i].b->GetType()),
  162|      0|                _bondcalculations[i].bt, _bondcalculations[i].rab, _bondcalculations[i].r0,
  163|      0|                _bondcalculations[i].kb, _bondcalculations[i].delta,
  164|      0|                143.9325 * 0.5 * _bondcalculations[i].energy);
  165|      0|        OBFFLog(_logbuf);
  166|      0|      }
  167|      0|    }
  168|       |
  169|       |    #ifdef _OPENMP
  170|       |    for (int i = 0; i < _bondcalculations.size(); ++i) {
  171|       |      if (gradients) {
  172|       |        AddGradient(_bondcalculations[i].force_a, _bondcalculations[i].idx_a);
  173|       |        AddGradient(_bondcalculations[i].force_b, _bondcalculations[i].idx_b);
  174|       |      }
  175|       |    }
  176|       |    #endif
  177|       |
  178|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  179|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL BOND STRETCHING ENERGY = %8.5f %s\n",  143.9325 * 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  180|      0|      OBFFLog(_logbuf);
  181|      0|    }
  182|       |
  183|  3.50k|    return (143.9325 * 0.5 * energy);
  184|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF947E_AngleILb1EEEdv:
  250|  1.78k|  {
  251|  1.78k|    double energy = 0.0;
  252|       |
  253|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  254|      0|      OBFFLog("\nA N G L E   B E N D I N G\n\n");
  255|      0|      OBFFLog("ATOM TYPES        FF    VALENCE     IDEAL      FORCE\n");
  256|      0|      OBFFLog(" I    J    K     CLASS   ANGLE      ANGLE     CONSTANT      DELTA      ENERGY\n");
  257|      0|      OBFFLog("-----------------------------------------------------------------------------\n");
  258|      0|    }
  259|       |
  260|       |    #ifdef _OPENMP
  261|       |    #pragma omp parallel for reduction(+:energy)
  262|       |    #endif
  263|  1.78k|    for (int i = 0; i < _anglecalculations.size(); ++i) {
  ------------------
  |  Branch (263:21): [True: 0, False: 1.78k]
  ------------------
  264|       |
  265|      0|      _anglecalculations[i].template Compute<gradients>();
  266|      0|      energy += _anglecalculations[i].energy;
  267|       |
  268|      0|      #ifndef _OPENMP
  269|      0|      if (gradients) {
  ------------------
  |  Branch (269:11): [True: 0, Folded]
  ------------------
  270|      0|        AddGradient(_anglecalculations[i].force_a, _anglecalculations[i].idx_a);
  271|      0|        AddGradient(_anglecalculations[i].force_b, _anglecalculations[i].idx_b);
  272|      0|        AddGradient(_anglecalculations[i].force_c, _anglecalculations[i].idx_c);
  273|      0|      }
  274|      0|      #endif
  275|       |
  276|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  277|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d      %d   %8.3f   %8.3f     %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  278|      0|                atoi(_anglecalculations[i].a->GetType()), atoi(_anglecalculations[i].b->GetType()),
  279|      0|                atoi(_anglecalculations[i].c->GetType()), _anglecalculations[i].at,
  280|      0|                _anglecalculations[i].theta, _anglecalculations[i].theta0,
  281|      0|                _anglecalculations[i].ka, _anglecalculations[i].delta,
  282|      0|                _anglecalculations[i].energy);
  283|      0|        OBFFLog(_logbuf);
  284|      0|      }
  285|      0|    }
  286|       |
  287|       |    #ifdef _OPENMP
  288|       |    for (int i = 0; i < _anglecalculations.size(); ++i) {
  289|       |      if (gradients) {
  290|       |        AddGradient(_anglecalculations[i].force_a, _anglecalculations[i].idx_a);
  291|       |        AddGradient(_anglecalculations[i].force_b, _anglecalculations[i].idx_b);
  292|       |        AddGradient(_anglecalculations[i].force_c, _anglecalculations[i].idx_c);
  293|       |      }
  294|       |    }
  295|       |    #endif
  296|       |
  297|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  298|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL ANGLE BENDING ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  299|      0|      OBFFLog(_logbuf);
  300|      0|    }
  301|       |
  302|  1.78k|    return energy;
  303|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF947E_AngleILb0EEEdv:
  250|  3.50k|  {
  251|  3.50k|    double energy = 0.0;
  252|       |
  253|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  254|      0|      OBFFLog("\nA N G L E   B E N D I N G\n\n");
  255|      0|      OBFFLog("ATOM TYPES        FF    VALENCE     IDEAL      FORCE\n");
  256|      0|      OBFFLog(" I    J    K     CLASS   ANGLE      ANGLE     CONSTANT      DELTA      ENERGY\n");
  257|      0|      OBFFLog("-----------------------------------------------------------------------------\n");
  258|      0|    }
  259|       |
  260|       |    #ifdef _OPENMP
  261|       |    #pragma omp parallel for reduction(+:energy)
  262|       |    #endif
  263|  3.50k|    for (int i = 0; i < _anglecalculations.size(); ++i) {
  ------------------
  |  Branch (263:21): [True: 0, False: 3.50k]
  ------------------
  264|       |
  265|      0|      _anglecalculations[i].template Compute<gradients>();
  266|      0|      energy += _anglecalculations[i].energy;
  267|       |
  268|      0|      #ifndef _OPENMP
  269|      0|      if (gradients) {
  ------------------
  |  Branch (269:11): [Folded, False: 0]
  ------------------
  270|      0|        AddGradient(_anglecalculations[i].force_a, _anglecalculations[i].idx_a);
  271|      0|        AddGradient(_anglecalculations[i].force_b, _anglecalculations[i].idx_b);
  272|      0|        AddGradient(_anglecalculations[i].force_c, _anglecalculations[i].idx_c);
  273|      0|      }
  274|      0|      #endif
  275|       |
  276|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  277|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d      %d   %8.3f   %8.3f     %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  278|      0|                atoi(_anglecalculations[i].a->GetType()), atoi(_anglecalculations[i].b->GetType()),
  279|      0|                atoi(_anglecalculations[i].c->GetType()), _anglecalculations[i].at,
  280|      0|                _anglecalculations[i].theta, _anglecalculations[i].theta0,
  281|      0|                _anglecalculations[i].ka, _anglecalculations[i].delta,
  282|      0|                _anglecalculations[i].energy);
  283|      0|        OBFFLog(_logbuf);
  284|      0|      }
  285|      0|    }
  286|       |
  287|       |    #ifdef _OPENMP
  288|       |    for (int i = 0; i < _anglecalculations.size(); ++i) {
  289|       |      if (gradients) {
  290|       |        AddGradient(_anglecalculations[i].force_a, _anglecalculations[i].idx_a);
  291|       |        AddGradient(_anglecalculations[i].force_b, _anglecalculations[i].idx_b);
  292|       |        AddGradient(_anglecalculations[i].force_c, _anglecalculations[i].idx_c);
  293|       |      }
  294|       |    }
  295|       |    #endif
  296|       |
  297|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  298|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL ANGLE BENDING ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  299|      0|      OBFFLog(_logbuf);
  300|      0|    }
  301|       |
  302|  3.50k|    return energy;
  303|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF948E_StrBndILb1EEEdv:
  363|  1.78k|  {
  364|  1.78k|    double energy = 0.0;
  365|       |
  366|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  367|      0|      OBFFLog("\nS T R E T C H   B E N D I N G\n\n");
  368|      0|      OBFFLog("ATOM TYPES        FF    VALENCE     DELTA        FORCE CONSTANT\n");
  369|      0|      OBFFLog(" I    J    K     CLASS   ANGLE      ANGLE        I J        J K      ENERGY\n");
  370|      0|      OBFFLog("---------------------------------------------------------------------------\n");
  371|      0|    }
  372|       |
  373|       |    #ifdef _OPENMP
  374|       |    #pragma omp parallel for reduction(+:energy)
  375|       |    #endif
  376|  1.78k|    for (int i = 0; i < _strbndcalculations.size(); ++i) {
  ------------------
  |  Branch (376:21): [True: 0, False: 1.78k]
  ------------------
  377|       |
  378|      0|      _strbndcalculations[i].template Compute<gradients>();
  379|      0|      energy += _strbndcalculations[i].energy;
  380|       |
  381|      0|      #ifndef _OPENMP
  382|      0|      if (gradients) {
  ------------------
  |  Branch (382:11): [True: 0, Folded]
  ------------------
  383|      0|        AddGradient(_strbndcalculations[i].force_a, _strbndcalculations[i].idx_a);
  384|      0|        AddGradient(_strbndcalculations[i].force_b, _strbndcalculations[i].idx_b);
  385|      0|        AddGradient(_strbndcalculations[i].force_c, _strbndcalculations[i].idx_c);
  386|      0|      }
  387|      0|      #endif
  388|       |
  389|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  390|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d     %2d   %8.3f   %8.3f   %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  391|      0|                atoi(_strbndcalculations[i].a->GetType()), atoi(_strbndcalculations[i].b->GetType()),
  392|      0|                atoi(_strbndcalculations[i].c->GetType()), _strbndcalculations[i].sbt,
  393|      0|                _strbndcalculations[i].theta, _strbndcalculations[i].delta_theta,
  394|      0|                _strbndcalculations[i].kbaABC, _strbndcalculations[i].kbaCBA,
  395|      0|                2.51210 * _strbndcalculations[i].energy);
  396|      0|        OBFFLog(_logbuf);
  397|      0|      }
  398|      0|    }
  399|       |
  400|       |    #ifdef _OPENMP
  401|       |    for (int i = 0; i < _strbndcalculations.size(); ++i) {
  402|       |      if (gradients) {
  403|       |        AddGradient(_strbndcalculations[i].force_a, _strbndcalculations[i].idx_a);
  404|       |        AddGradient(_strbndcalculations[i].force_b, _strbndcalculations[i].idx_b);
  405|       |        AddGradient(_strbndcalculations[i].force_c, _strbndcalculations[i].idx_c);
  406|       |      }
  407|       |    }
  408|       |    #endif
  409|       |
  410|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  411|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL STRETCH BENDING ENERGY = %8.5f %s\n", 2.51210 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  412|      0|      OBFFLog(_logbuf);
  413|      0|    }
  414|       |
  415|  1.78k|    return (2.51210 * energy);
  416|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF948E_StrBndILb0EEEdv:
  363|  3.50k|  {
  364|  3.50k|    double energy = 0.0;
  365|       |
  366|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  367|      0|      OBFFLog("\nS T R E T C H   B E N D I N G\n\n");
  368|      0|      OBFFLog("ATOM TYPES        FF    VALENCE     DELTA        FORCE CONSTANT\n");
  369|      0|      OBFFLog(" I    J    K     CLASS   ANGLE      ANGLE        I J        J K      ENERGY\n");
  370|      0|      OBFFLog("---------------------------------------------------------------------------\n");
  371|      0|    }
  372|       |
  373|       |    #ifdef _OPENMP
  374|       |    #pragma omp parallel for reduction(+:energy)
  375|       |    #endif
  376|  3.50k|    for (int i = 0; i < _strbndcalculations.size(); ++i) {
  ------------------
  |  Branch (376:21): [True: 0, False: 3.50k]
  ------------------
  377|       |
  378|      0|      _strbndcalculations[i].template Compute<gradients>();
  379|      0|      energy += _strbndcalculations[i].energy;
  380|       |
  381|      0|      #ifndef _OPENMP
  382|      0|      if (gradients) {
  ------------------
  |  Branch (382:11): [Folded, False: 0]
  ------------------
  383|      0|        AddGradient(_strbndcalculations[i].force_a, _strbndcalculations[i].idx_a);
  384|      0|        AddGradient(_strbndcalculations[i].force_b, _strbndcalculations[i].idx_b);
  385|      0|        AddGradient(_strbndcalculations[i].force_c, _strbndcalculations[i].idx_c);
  386|      0|      }
  387|      0|      #endif
  388|       |
  389|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  390|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d     %2d   %8.3f   %8.3f   %8.3f   %8.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  391|      0|                atoi(_strbndcalculations[i].a->GetType()), atoi(_strbndcalculations[i].b->GetType()),
  392|      0|                atoi(_strbndcalculations[i].c->GetType()), _strbndcalculations[i].sbt,
  393|      0|                _strbndcalculations[i].theta, _strbndcalculations[i].delta_theta,
  394|      0|                _strbndcalculations[i].kbaABC, _strbndcalculations[i].kbaCBA,
  395|      0|                2.51210 * _strbndcalculations[i].energy);
  396|      0|        OBFFLog(_logbuf);
  397|      0|      }
  398|      0|    }
  399|       |
  400|       |    #ifdef _OPENMP
  401|       |    for (int i = 0; i < _strbndcalculations.size(); ++i) {
  402|       |      if (gradients) {
  403|       |        AddGradient(_strbndcalculations[i].force_a, _strbndcalculations[i].idx_a);
  404|       |        AddGradient(_strbndcalculations[i].force_b, _strbndcalculations[i].idx_b);
  405|       |        AddGradient(_strbndcalculations[i].force_c, _strbndcalculations[i].idx_c);
  406|       |      }
  407|       |    }
  408|       |    #endif
  409|       |
  410|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  411|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL STRETCH BENDING ENERGY = %8.5f %s\n", 2.51210 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  412|      0|      OBFFLog(_logbuf);
  413|      0|    }
  414|       |
  415|  3.50k|    return (2.51210 * energy);
  416|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF949E_TorsionILb1EEEdv:
  499|  1.78k|  {
  500|  1.78k|    double energy = 0.0;
  501|       |
  502|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  503|      0|      OBFFLog("\nT O R S I O N A L\n\n");
  504|      0|      OBFFLog("ATOM TYPES             FF     TORSION       FORCE CONSTANT\n");
  505|      0|      OBFFLog(" I    J    K    L     CLASS    ANGLE         V1   V2   V3     ENERGY\n");
  506|      0|      OBFFLog("--------------------------------------------------------------------\n");
  507|      0|    }
  508|       |
  509|       |    #ifdef _OPENMP
  510|       |    #pragma omp parallel for reduction(+:energy)
  511|       |    #endif
  512|  1.78k|    for (int i = 0; i < _torsioncalculations.size(); ++i) {
  ------------------
  |  Branch (512:21): [True: 0, False: 1.78k]
  ------------------
  513|       |
  514|      0|      _torsioncalculations[i].template Compute<gradients>();
  515|      0|      energy += _torsioncalculations[i].energy;
  516|       |
  517|      0|      #ifndef _OPENMP
  518|      0|      if (gradients) {
  ------------------
  |  Branch (518:11): [True: 0, Folded]
  ------------------
  519|      0|        AddGradient(_torsioncalculations[i].force_a, _torsioncalculations[i].idx_a);
  520|      0|        AddGradient(_torsioncalculations[i].force_b, _torsioncalculations[i].idx_b);
  521|      0|        AddGradient(_torsioncalculations[i].force_c, _torsioncalculations[i].idx_c);
  522|      0|        AddGradient(_torsioncalculations[i].force_d, _torsioncalculations[i].idx_d);
  523|      0|      }
  524|      0|      #endif
  525|       |
  526|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  527|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d   %2d      %d   %8.3f   %6.3f   %6.3f   %6.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  528|      0|                atoi(_torsioncalculations[i].a->GetType()), atoi(_torsioncalculations[i].b->GetType()),
  529|      0|                atoi(_torsioncalculations[i].c->GetType()), atoi(_torsioncalculations[i].d->GetType()),
  530|      0|                _torsioncalculations[i].tt, _torsioncalculations[i].tor, _torsioncalculations[i].v1,
  531|      0|                _torsioncalculations[i].v2, _torsioncalculations[i].v3, 0.5 * _torsioncalculations[i].energy);
  532|      0|        OBFFLog(_logbuf);
  533|      0|      }
  534|       |
  535|      0|    }
  536|       |
  537|       |    #ifdef _OPENMP
  538|       |    for (int i = 0; i < _torsioncalculations.size(); ++i) {
  539|       |      if (gradients) {
  540|       |        AddGradient(_torsioncalculations[i].force_a, _torsioncalculations[i].idx_a);
  541|       |        AddGradient(_torsioncalculations[i].force_b, _torsioncalculations[i].idx_b);
  542|       |        AddGradient(_torsioncalculations[i].force_c, _torsioncalculations[i].idx_c);
  543|       |        AddGradient(_torsioncalculations[i].force_d, _torsioncalculations[i].idx_d);
  544|       |      }
  545|       |    }
  546|       |    #endif
  547|       |
  548|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  549|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL TORSIONAL ENERGY = %8.5f %s\n", 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  550|      0|      OBFFLog(_logbuf);
  551|      0|    }
  552|       |
  553|  1.78k|    return (0.5 * energy);
  554|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF949E_TorsionILb0EEEdv:
  499|  3.50k|  {
  500|  3.50k|    double energy = 0.0;
  501|       |
  502|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  503|      0|      OBFFLog("\nT O R S I O N A L\n\n");
  504|      0|      OBFFLog("ATOM TYPES             FF     TORSION       FORCE CONSTANT\n");
  505|      0|      OBFFLog(" I    J    K    L     CLASS    ANGLE         V1   V2   V3     ENERGY\n");
  506|      0|      OBFFLog("--------------------------------------------------------------------\n");
  507|      0|    }
  508|       |
  509|       |    #ifdef _OPENMP
  510|       |    #pragma omp parallel for reduction(+:energy)
  511|       |    #endif
  512|  3.50k|    for (int i = 0; i < _torsioncalculations.size(); ++i) {
  ------------------
  |  Branch (512:21): [True: 0, False: 3.50k]
  ------------------
  513|       |
  514|      0|      _torsioncalculations[i].template Compute<gradients>();
  515|      0|      energy += _torsioncalculations[i].energy;
  516|       |
  517|      0|      #ifndef _OPENMP
  518|      0|      if (gradients) {
  ------------------
  |  Branch (518:11): [Folded, False: 0]
  ------------------
  519|      0|        AddGradient(_torsioncalculations[i].force_a, _torsioncalculations[i].idx_a);
  520|      0|        AddGradient(_torsioncalculations[i].force_b, _torsioncalculations[i].idx_b);
  521|      0|        AddGradient(_torsioncalculations[i].force_c, _torsioncalculations[i].idx_c);
  522|      0|        AddGradient(_torsioncalculations[i].force_d, _torsioncalculations[i].idx_d);
  523|      0|      }
  524|      0|      #endif
  525|       |
  526|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  527|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d   %2d      %d   %8.3f   %6.3f   %6.3f   %6.3f   %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  528|      0|                atoi(_torsioncalculations[i].a->GetType()), atoi(_torsioncalculations[i].b->GetType()),
  529|      0|                atoi(_torsioncalculations[i].c->GetType()), atoi(_torsioncalculations[i].d->GetType()),
  530|      0|                _torsioncalculations[i].tt, _torsioncalculations[i].tor, _torsioncalculations[i].v1,
  531|      0|                _torsioncalculations[i].v2, _torsioncalculations[i].v3, 0.5 * _torsioncalculations[i].energy);
  532|      0|        OBFFLog(_logbuf);
  533|      0|      }
  534|       |
  535|      0|    }
  536|       |
  537|       |    #ifdef _OPENMP
  538|       |    for (int i = 0; i < _torsioncalculations.size(); ++i) {
  539|       |      if (gradients) {
  540|       |        AddGradient(_torsioncalculations[i].force_a, _torsioncalculations[i].idx_a);
  541|       |        AddGradient(_torsioncalculations[i].force_b, _torsioncalculations[i].idx_b);
  542|       |        AddGradient(_torsioncalculations[i].force_c, _torsioncalculations[i].idx_c);
  543|       |        AddGradient(_torsioncalculations[i].force_d, _torsioncalculations[i].idx_d);
  544|       |      }
  545|       |    }
  546|       |    #endif
  547|       |
  548|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  549|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL TORSIONAL ENERGY = %8.5f %s\n", 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  550|      0|      OBFFLog(_logbuf);
  551|      0|    }
  552|       |
  553|  3.50k|    return (0.5 * energy);
  554|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF945E_OOPILb1EEEdv:
  597|  1.78k|  {
  598|  1.78k|    double energy = 0.0;
  599|       |
  600|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  601|      0|      OBFFLog("\nO U T - O F - P L A N E   B E N D I N G\n\n");
  602|      0|      OBFFLog("ATOM TYPES             FF       OOP     FORCE\n");
  603|      0|      OBFFLog(" I    J    K    L     CLASS    ANGLE   CONSTANT     ENERGY\n");
  604|      0|      OBFFLog("----------------------------------------------------------\n");
  605|      0|    }
  606|       |
  607|       |    #ifdef _OPENMP
  608|       |    #pragma omp parallel for reduction(+:energy)
  609|       |    #endif
  610|  1.78k|    for (int i = 0; i < _oopcalculations.size(); ++i) {
  ------------------
  |  Branch (610:21): [True: 0, False: 1.78k]
  ------------------
  611|       |
  612|      0|      _oopcalculations[i].template Compute<gradients>();
  613|      0|      energy += _oopcalculations[i].energy;
  614|       |
  615|      0|      #ifndef _OPENMP
  616|      0|      if (gradients) {
  ------------------
  |  Branch (616:11): [True: 0, Folded]
  ------------------
  617|      0|        AddGradient(_oopcalculations[i].force_a, _oopcalculations[i].idx_a);
  618|      0|        AddGradient(_oopcalculations[i].force_b, _oopcalculations[i].idx_b);
  619|      0|        AddGradient(_oopcalculations[i].force_c, _oopcalculations[i].idx_c);
  620|      0|        AddGradient(_oopcalculations[i].force_d, _oopcalculations[i].idx_d);
  621|      0|      }
  622|      0|      #endif
  623|       |
  624|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  625|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d   %2d      0   %8.3f   %8.3f     %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  626|      0|                atoi(_oopcalculations[i].a->GetType()), atoi(_oopcalculations[i].b->GetType()),
  627|      0|                atoi(_oopcalculations[i].c->GetType()), atoi(_oopcalculations[i].d->GetType()),
  628|      0|                _oopcalculations[i].angle, _oopcalculations[i].koop,
  629|      0|                0.043844 * 0.5 * _oopcalculations[i].energy);
  630|      0|        OBFFLog(_logbuf);
  631|      0|      }
  632|      0|    }
  633|       |
  634|       |    #ifdef _OPENMP
  635|       |    for (int i = 0; i < _oopcalculations.size(); ++i) {
  636|       |      if (gradients) {
  637|       |        AddGradient(_oopcalculations[i].force_a, _oopcalculations[i].idx_a);
  638|       |        AddGradient(_oopcalculations[i].force_b, _oopcalculations[i].idx_b);
  639|       |        AddGradient(_oopcalculations[i].force_c, _oopcalculations[i].idx_c);
  640|       |        AddGradient(_oopcalculations[i].force_d, _oopcalculations[i].idx_d);
  641|       |      }
  642|       |    }
  643|       |    #endif
  644|       |
  645|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  646|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL OUT-OF-PLANE BENDING ENERGY = %8.5f %s\n", 0.043844 * 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  647|      0|      OBFFLog(_logbuf);
  648|      0|    }
  649|       |
  650|  1.78k|    return (0.043844 * 0.5 * energy);
  651|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF945E_OOPILb0EEEdv:
  597|  3.50k|  {
  598|  3.50k|    double energy = 0.0;
  599|       |
  600|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  601|      0|      OBFFLog("\nO U T - O F - P L A N E   B E N D I N G\n\n");
  602|      0|      OBFFLog("ATOM TYPES             FF       OOP     FORCE\n");
  603|      0|      OBFFLog(" I    J    K    L     CLASS    ANGLE   CONSTANT     ENERGY\n");
  604|      0|      OBFFLog("----------------------------------------------------------\n");
  605|      0|    }
  606|       |
  607|       |    #ifdef _OPENMP
  608|       |    #pragma omp parallel for reduction(+:energy)
  609|       |    #endif
  610|  3.50k|    for (int i = 0; i < _oopcalculations.size(); ++i) {
  ------------------
  |  Branch (610:21): [True: 0, False: 3.50k]
  ------------------
  611|       |
  612|      0|      _oopcalculations[i].template Compute<gradients>();
  613|      0|      energy += _oopcalculations[i].energy;
  614|       |
  615|      0|      #ifndef _OPENMP
  616|      0|      if (gradients) {
  ------------------
  |  Branch (616:11): [Folded, False: 0]
  ------------------
  617|      0|        AddGradient(_oopcalculations[i].force_a, _oopcalculations[i].idx_a);
  618|      0|        AddGradient(_oopcalculations[i].force_b, _oopcalculations[i].idx_b);
  619|      0|        AddGradient(_oopcalculations[i].force_c, _oopcalculations[i].idx_c);
  620|      0|        AddGradient(_oopcalculations[i].force_d, _oopcalculations[i].idx_d);
  621|      0|      }
  622|      0|      #endif
  623|       |
  624|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  625|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %2d   %2d      0   %8.3f   %8.3f     %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  626|      0|                atoi(_oopcalculations[i].a->GetType()), atoi(_oopcalculations[i].b->GetType()),
  627|      0|                atoi(_oopcalculations[i].c->GetType()), atoi(_oopcalculations[i].d->GetType()),
  628|      0|                _oopcalculations[i].angle, _oopcalculations[i].koop,
  629|      0|                0.043844 * 0.5 * _oopcalculations[i].energy);
  630|      0|        OBFFLog(_logbuf);
  631|      0|      }
  632|      0|    }
  633|       |
  634|       |    #ifdef _OPENMP
  635|       |    for (int i = 0; i < _oopcalculations.size(); ++i) {
  636|       |      if (gradients) {
  637|       |        AddGradient(_oopcalculations[i].force_a, _oopcalculations[i].idx_a);
  638|       |        AddGradient(_oopcalculations[i].force_b, _oopcalculations[i].idx_b);
  639|       |        AddGradient(_oopcalculations[i].force_c, _oopcalculations[i].idx_c);
  640|       |        AddGradient(_oopcalculations[i].force_d, _oopcalculations[i].idx_d);
  641|       |      }
  642|       |    }
  643|       |    #endif
  644|       |
  645|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  646|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL OUT-OF-PLANE BENDING ENERGY = %8.5f %s\n", 0.043844 * 0.5 * energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  647|      0|      OBFFLog(_logbuf);
  648|      0|    }
  649|       |
  650|  3.50k|    return (0.043844 * 0.5 * energy);
  651|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF945E_VDWILb1EEEdv:
  693|  1.78k|  {
  694|  1.78k|    double energy = 0.0;
  695|       |
  696|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  697|      0|      OBFFLog("\nV A N   D E R   W A A L S\n\n");
  698|      0|      OBFFLog("ATOM TYPES\n");
  699|      0|      OBFFLog(" I    J        Rij       R*IJ    EPSILON    ENERGY\n");
  700|      0|      OBFFLog("--------------------------------------------------\n");
  701|       |      //       XX   XX     -000.000  -000.000  -000.000  -000.000
  702|      0|    }
  703|       |
  704|       |    #ifdef _OPENMP
  705|       |    #pragma omp parallel for reduction(+:energy)
  706|       |    #endif
  707|  1.78k|    for (int i = 0; i < _vdwcalculations.size(); ++i) {
  ------------------
  |  Branch (707:21): [True: 0, False: 1.78k]
  ------------------
  708|       |      // Cut-off check
  709|      0|      if (_cutoff)
  ------------------
  |  Branch (709:11): [True: 0, False: 0]
  ------------------
  710|      0|        if (!_vdwpairs.BitIsSet(_vdwcalculations[i].pairIndex))
  ------------------
  |  Branch (710:13): [True: 0, False: 0]
  ------------------
  711|      0|          continue;
  712|       |
  713|      0|      _vdwcalculations[i].template Compute<gradients>();
  714|      0|      energy += _vdwcalculations[i].energy;
  715|       |
  716|      0|      #ifndef _OPENMP
  717|      0|      if (gradients) {
  ------------------
  |  Branch (717:11): [True: 0, Folded]
  ------------------
  718|      0|        AddGradient(_vdwcalculations[i].force_a, _vdwcalculations[i].idx_a);
  719|      0|        AddGradient(_vdwcalculations[i].force_b, _vdwcalculations[i].idx_b);
  720|      0|      }
  721|      0|      #endif
  722|       |
  723|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  724|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d     %8.3f  %8.3f  %8.3f  %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  725|      0|                atoi(_vdwcalculations[i].a->GetType()), atoi(_vdwcalculations[i].b->GetType()),
  726|      0|                _vdwcalculations[i].rab, _vdwcalculations[i].R_AB, _vdwcalculations[i].epsilon, _vdwcalculations[i].energy);
  727|      0|        OBFFLog(_logbuf);
  728|      0|      }
  729|       |
  730|      0|    }
  731|       |
  732|       |    #ifdef _OPENMP
  733|       |    for (int i = 0; i < _vdwcalculations.size(); ++i) {
  734|       |      // Cut-off check
  735|       |      if (_cutoff)
  736|       |        if (!_vdwpairs.BitIsSet(i))
  737|       |          continue;
  738|       |
  739|       |      if (gradients) {
  740|       |        AddGradient(_vdwcalculations[i].force_a, _vdwcalculations[i].idx_a);
  741|       |        AddGradient(_vdwcalculations[i].force_b, _vdwcalculations[i].idx_b);
  742|       |      }
  743|       |    }
  744|       |    #endif
  745|       |
  746|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  747|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL VAN DER WAALS ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  748|      0|      OBFFLog(_logbuf);
  749|      0|    }
  750|       |
  751|  1.78k|    return energy;
  752|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF945E_VDWILb0EEEdv:
  693|  3.50k|  {
  694|  3.50k|    double energy = 0.0;
  695|       |
  696|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  697|      0|      OBFFLog("\nV A N   D E R   W A A L S\n\n");
  698|      0|      OBFFLog("ATOM TYPES\n");
  699|      0|      OBFFLog(" I    J        Rij       R*IJ    EPSILON    ENERGY\n");
  700|      0|      OBFFLog("--------------------------------------------------\n");
  701|       |      //       XX   XX     -000.000  -000.000  -000.000  -000.000
  702|      0|    }
  703|       |
  704|       |    #ifdef _OPENMP
  705|       |    #pragma omp parallel for reduction(+:energy)
  706|       |    #endif
  707|  3.50k|    for (int i = 0; i < _vdwcalculations.size(); ++i) {
  ------------------
  |  Branch (707:21): [True: 0, False: 3.50k]
  ------------------
  708|       |      // Cut-off check
  709|      0|      if (_cutoff)
  ------------------
  |  Branch (709:11): [True: 0, False: 0]
  ------------------
  710|      0|        if (!_vdwpairs.BitIsSet(_vdwcalculations[i].pairIndex))
  ------------------
  |  Branch (710:13): [True: 0, False: 0]
  ------------------
  711|      0|          continue;
  712|       |
  713|      0|      _vdwcalculations[i].template Compute<gradients>();
  714|      0|      energy += _vdwcalculations[i].energy;
  715|       |
  716|      0|      #ifndef _OPENMP
  717|      0|      if (gradients) {
  ------------------
  |  Branch (717:11): [Folded, False: 0]
  ------------------
  718|      0|        AddGradient(_vdwcalculations[i].force_a, _vdwcalculations[i].idx_a);
  719|      0|        AddGradient(_vdwcalculations[i].force_b, _vdwcalculations[i].idx_b);
  720|      0|      }
  721|      0|      #endif
  722|       |
  723|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  724|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d     %8.3f  %8.3f  %8.3f  %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  725|      0|                atoi(_vdwcalculations[i].a->GetType()), atoi(_vdwcalculations[i].b->GetType()),
  726|      0|                _vdwcalculations[i].rab, _vdwcalculations[i].R_AB, _vdwcalculations[i].epsilon, _vdwcalculations[i].energy);
  727|      0|        OBFFLog(_logbuf);
  728|      0|      }
  729|       |
  730|      0|    }
  731|       |
  732|       |    #ifdef _OPENMP
  733|       |    for (int i = 0; i < _vdwcalculations.size(); ++i) {
  734|       |      // Cut-off check
  735|       |      if (_cutoff)
  736|       |        if (!_vdwpairs.BitIsSet(i))
  737|       |          continue;
  738|       |
  739|       |      if (gradients) {
  740|       |        AddGradient(_vdwcalculations[i].force_a, _vdwcalculations[i].idx_a);
  741|       |        AddGradient(_vdwcalculations[i].force_b, _vdwcalculations[i].idx_b);
  742|       |      }
  743|       |    }
  744|       |    #endif
  745|       |
  746|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  747|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL VAN DER WAALS ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  748|      0|      OBFFLog(_logbuf);
  749|      0|    }
  750|       |
  751|  3.50k|    return energy;
  752|  3.50k|  }
_ZN9OpenBabel18OBForceFieldMMFF9415E_ElectrostaticILb1EEEdv:
  779|  1.78k|  {
  780|  1.78k|    double energy = 0.0;
  781|       |
  782|  1.78k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  1.78k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  1.78k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  783|      0|      OBFFLog("\nE L E C T R O S T A T I C   I N T E R A C T I O N S\n\n");
  784|      0|      OBFFLog("ATOM TYPES\n");
  785|      0|      OBFFLog(" I    J        Rij        Qi         Qj        ENERGY\n");
  786|      0|      OBFFLog("-----------------------------------------------------\n");
  787|       |      //       XX   XX     XXXXXXXX   XXXXXXXX   XXXXXXXX   XXXXXXXX
  788|      0|    }
  789|       |
  790|       |    #ifdef _OPENMP
  791|       |    #pragma omp parallel for reduction(+:energy)
  792|       |    #endif
  793|  1.78k|    for (int i = 0; i < _electrostaticcalculations.size(); ++i) {
  ------------------
  |  Branch (793:21): [True: 0, False: 1.78k]
  ------------------
  794|       |      // Cut-off check
  795|      0|      if (_cutoff)
  ------------------
  |  Branch (795:11): [True: 0, False: 0]
  ------------------
  796|      0|        if (!_elepairs.BitIsSet(_electrostaticcalculations[i].pairIndex))
  ------------------
  |  Branch (796:13): [True: 0, False: 0]
  ------------------
  797|      0|          continue;
  798|       |
  799|      0|      _electrostaticcalculations[i].template Compute<gradients>();
  800|      0|      energy += _electrostaticcalculations[i].energy;
  801|       |
  802|      0|      #ifndef _OPENMP
  803|      0|      if (gradients) {
  ------------------
  |  Branch (803:11): [True: 0, Folded]
  ------------------
  804|      0|        AddGradient(_electrostaticcalculations[i].force_a, _electrostaticcalculations[i].idx_a);
  805|      0|        AddGradient(_electrostaticcalculations[i].force_b, _electrostaticcalculations[i].idx_b);
  806|      0|      }
  807|      0|      #endif
  808|       |
  809|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  810|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %8.3f  %8.3f  %8.3f  %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  811|      0|                atoi(_electrostaticcalculations[i].a->GetType()), atoi(_electrostaticcalculations[i].b->GetType()),
  812|      0|                _electrostaticcalculations[i].rab, _electrostaticcalculations[i].a->GetPartialCharge(),
  813|      0|                _electrostaticcalculations[i].b->GetPartialCharge(), _electrostaticcalculations[i].energy);
  814|      0|        OBFFLog(_logbuf);
  815|      0|      }
  816|      0|    }
  817|       |
  818|       |    #ifdef _OPENMP
  819|       |    for (int i = 0; i < _electrostaticcalculations.size(); ++i) {
  820|       |      // Cut-off check
  821|       |      if (_cutoff)
  822|       |        if (!_elepairs.BitIsSet(i))
  823|       |          continue;
  824|       |
  825|       |      if (gradients) {
  826|       |        AddGradient(_electrostaticcalculations[i].force_a, _electrostaticcalculations[i].idx_a);
  827|       |        AddGradient(_electrostaticcalculations[i].force_b, _electrostaticcalculations[i].idx_b);
  828|       |      }
  829|       |    }
  830|       |    #endif
  831|       |
  832|  1.78k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  1.78k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  1.78k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 1.78k]
  |  |  ------------------
  ------------------
  833|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL ELECTROSTATIC ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  834|      0|      OBFFLog(_logbuf);
  835|      0|    }
  836|       |
  837|  1.78k|    return energy;
  838|  1.78k|  }
_ZN9OpenBabel18OBForceFieldMMFF9415E_ElectrostaticILb0EEEdv:
  779|  3.50k|  {
  780|  3.50k|    double energy = 0.0;
  781|       |
  782|  3.50k|    IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|  3.50k|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|  3.50k|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  783|      0|      OBFFLog("\nE L E C T R O S T A T I C   I N T E R A C T I O N S\n\n");
  784|      0|      OBFFLog("ATOM TYPES\n");
  785|      0|      OBFFLog(" I    J        Rij        Qi         Qj        ENERGY\n");
  786|      0|      OBFFLog("-----------------------------------------------------\n");
  787|       |      //       XX   XX     XXXXXXXX   XXXXXXXX   XXXXXXXX   XXXXXXXX
  788|      0|    }
  789|       |
  790|       |    #ifdef _OPENMP
  791|       |    #pragma omp parallel for reduction(+:energy)
  792|       |    #endif
  793|  3.50k|    for (int i = 0; i < _electrostaticcalculations.size(); ++i) {
  ------------------
  |  Branch (793:21): [True: 0, False: 3.50k]
  ------------------
  794|       |      // Cut-off check
  795|      0|      if (_cutoff)
  ------------------
  |  Branch (795:11): [True: 0, False: 0]
  ------------------
  796|      0|        if (!_elepairs.BitIsSet(_electrostaticcalculations[i].pairIndex))
  ------------------
  |  Branch (796:13): [True: 0, False: 0]
  ------------------
  797|      0|          continue;
  798|       |
  799|      0|      _electrostaticcalculations[i].template Compute<gradients>();
  800|      0|      energy += _electrostaticcalculations[i].energy;
  801|       |
  802|      0|      #ifndef _OPENMP
  803|      0|      if (gradients) {
  ------------------
  |  Branch (803:11): [Folded, False: 0]
  ------------------
  804|      0|        AddGradient(_electrostaticcalculations[i].force_a, _electrostaticcalculations[i].idx_a);
  805|      0|        AddGradient(_electrostaticcalculations[i].force_b, _electrostaticcalculations[i].idx_b);
  806|      0|      }
  807|      0|      #endif
  808|       |
  809|      0|      IF_OBFF_LOGLVL_HIGH {
  ------------------
  |  |   73|      0|#define IF_OBFF_LOGLVL_HIGH   if(_loglvl >= OBFF_LOGLVL_HIGH)
  |  |  ------------------
  |  |  |  |   40|      0|#define OBFF_LOGLVL_HIGH	3   //!< individual calculations and parameters
  |  |  ------------------
  |  |  |  Branch (73:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  810|      0|        snprintf(_logbuf, BUFF_SIZE, "%2d   %2d   %8.3f  %8.3f  %8.3f  %8.3f\n",
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  811|      0|                atoi(_electrostaticcalculations[i].a->GetType()), atoi(_electrostaticcalculations[i].b->GetType()),
  812|      0|                _electrostaticcalculations[i].rab, _electrostaticcalculations[i].a->GetPartialCharge(),
  813|      0|                _electrostaticcalculations[i].b->GetPartialCharge(), _electrostaticcalculations[i].energy);
  814|      0|        OBFFLog(_logbuf);
  815|      0|      }
  816|      0|    }
  817|       |
  818|       |    #ifdef _OPENMP
  819|       |    for (int i = 0; i < _electrostaticcalculations.size(); ++i) {
  820|       |      // Cut-off check
  821|       |      if (_cutoff)
  822|       |        if (!_elepairs.BitIsSet(i))
  823|       |          continue;
  824|       |
  825|       |      if (gradients) {
  826|       |        AddGradient(_electrostaticcalculations[i].force_a, _electrostaticcalculations[i].idx_a);
  827|       |        AddGradient(_electrostaticcalculations[i].force_b, _electrostaticcalculations[i].idx_b);
  828|       |      }
  829|       |    }
  830|       |    #endif
  831|       |
  832|  3.50k|    IF_OBFF_LOGLVL_MEDIUM {
  ------------------
  |  |   72|  3.50k|#define IF_OBFF_LOGLVL_MEDIUM if(_loglvl >= OBFF_LOGLVL_MEDIUM)
  |  |  ------------------
  |  |  |  |   39|  3.50k|#define OBFF_LOGLVL_MEDIUM	2   //!< individual energy terms
  |  |  ------------------
  |  |  |  Branch (72:34): [True: 0, False: 3.50k]
  |  |  ------------------
  ------------------
  833|      0|      snprintf(_logbuf, BUFF_SIZE, "     TOTAL ELECTROSTATIC ENERGY = %8.5f %s\n", energy, GetUnit().c_str());
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  834|      0|      OBFFLog(_logbuf);
  835|      0|    }
  836|       |
  837|  3.50k|    return energy;
  838|  3.50k|  }

_ZN9OpenBabel18OBForceFieldMMFF94C2EPKcb:
  232|      4|      explicit OBForceFieldMMFF94(const char* ID, bool IsDefault=true) : OBForceField(ID, IsDefault)
  233|      4|      {
  234|      4|        _validSetup = false;
  235|      4|        _init = false;
  236|      4|        _rvdw = 7.0;
  237|      4|        _rele = 15.0;
  238|      4|        _epsilon = 1.0; // default electrostatics
  239|      4|        _pairfreq = 15;
  240|      4|        _cutoff = false;
  241|      4|        _linesearch = LineSearchType::Newton2Num;
  242|      4|        _gradientPtr = nullptr;
  243|      4|        _grad1 = nullptr;
  244|      4|	if (!strncmp(ID, "MMFF94s", 7)) {
  ------------------
  |  Branch (244:6): [True: 2, False: 2]
  ------------------
  245|      2|          mmff94s = true;
  246|      2|          _parFile = std::string("mmff94s.ff");
  247|      2|	} else {
  248|      2|          mmff94s = false;
  249|      2|          _parFile = std::string("mmff94.ff");
  250|      2|	}
  251|      4|      }
_ZN9OpenBabel18OBForceFieldMMFF9422HasAnalyticalGradientsEv:
  281|    733|      bool HasAnalyticalGradients() override { return true; }

_ZN9OpenBabel15OBForceFieldUFF14ParseParamFileEv:
 1619|      1|  {
 1620|      1|    vector<string> vs;
 1621|      1|    char buffer[BUFF_SIZE];
 1622|       |
 1623|      1|    OBFFParameter parameter;
 1624|       |
 1625|       |    // open data/UFF.prm
 1626|      1|    ifstream ifs;
 1627|      1|    if (OpenDatafile(ifs, "UFF.prm").length() == 0) {
  ------------------
  |  Branch (1627:9): [True: 1, False: 0]
  ------------------
 1628|      1|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open UFF.prm", obError);
 1629|      1|      return false;
 1630|      1|    }
 1631|       |
 1632|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
 1633|      0|    obLocale.SetLocale();
 1634|       |
 1635|      0|    while (ifs.getline(buffer, BUFF_SIZE)) {
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  |  Branch (1635:12): [True: 0, False: 0]
  ------------------
 1636|      0|      tokenize(vs, buffer);
 1637|      0|      if (vs.size() < 13)
  ------------------
  |  Branch (1637:11): [True: 0, False: 0]
  ------------------
 1638|      0|        continue;
 1639|       |
 1640|      0|      if (EQn(buffer, "param", 5)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1641|       |        // set up all parameters from this
 1642|      0|        parameter.clear();
 1643|      0|        parameter._a = vs[1]; // atom type
 1644|      0|        parameter._dpar.push_back(atof(vs[2].c_str())); // r1
 1645|      0|        parameter._dpar.push_back(atof(vs[3].c_str())); // theta0
 1646|      0|        parameter._dpar.push_back(atof(vs[4].c_str())); // x1
 1647|      0|        parameter._dpar.push_back(atof(vs[5].c_str())); // D1
 1648|      0|        parameter._dpar.push_back(atof(vs[6].c_str())); // zeta
 1649|      0|        parameter._dpar.push_back(atof(vs[7].c_str())); // Z1
 1650|      0|        parameter._dpar.push_back(atof(vs[8].c_str())); // Vi
 1651|      0|        parameter._dpar.push_back(atof(vs[9].c_str())); // Uj
 1652|      0|        parameter._dpar.push_back(atof(vs[10].c_str())); // Xi
 1653|      0|        parameter._dpar.push_back(atof(vs[11].c_str())); // Hard
 1654|      0|        parameter._dpar.push_back(atof(vs[12].c_str())); // Radius
 1655|       |
 1656|      0|        parameter.b = 0; // used for tracking number of angles in 5-coordinate
 1657|      0|        parameter.c = 0;
 1658|       |
 1659|      0|        char coord = vs[1][1] ? vs[1][2] : '\0'; // 3rd character of atom type, if any
  ------------------
  |  Branch (1659:22): [True: 0, False: 0]
  ------------------
 1660|      0|        switch (coord) {
 1661|      0|        case '1': // linear
  ------------------
  |  Branch (1661:9): [True: 0, False: 0]
  ------------------
 1662|      0|          parameter._ipar.push_back(1);
 1663|      0|          break;
 1664|      0|        case '2': // trigonal planar (sp2)
  ------------------
  |  Branch (1664:9): [True: 0, False: 0]
  ------------------
 1665|      0|        case 'R': // aromatic (N_R)
  ------------------
  |  Branch (1665:9): [True: 0, False: 0]
  ------------------
 1666|      0|          parameter._ipar.push_back(2);
 1667|      0|          break;
 1668|      0|        case '3': // tetrahedral (sp3)
  ------------------
  |  Branch (1668:9): [True: 0, False: 0]
  ------------------
 1669|      0|          parameter._ipar.push_back(3);
 1670|      0|          break;
 1671|      0|        case '4': // square planar
  ------------------
  |  Branch (1671:9): [True: 0, False: 0]
  ------------------
 1672|      0|          parameter._ipar.push_back(4);
 1673|      0|          break;
 1674|      0|        case '5': // trigonal bipyramidal -- not actually in parameterization
  ------------------
  |  Branch (1674:9): [True: 0, False: 0]
  ------------------
 1675|      0|          parameter._ipar.push_back(5);
 1676|      0|          break;
 1677|      0|        case '6': // octahedral
  ------------------
  |  Branch (1677:9): [True: 0, False: 0]
  ------------------
 1678|      0|          parameter._ipar.push_back(6);
 1679|      0|          break;
 1680|      0|        case '7': // pentagonal bipyramidal -- not actually in parameterization
  ------------------
  |  Branch (1680:9): [True: 0, False: 0]
  ------------------
 1681|      0|          parameter._ipar.push_back(7);
 1682|      0|          break;
 1683|      0|        default: // general case (unknown coordination)
  ------------------
  |  Branch (1683:9): [True: 0, False: 0]
  ------------------
 1684|       |          // These atoms appear to generally be linear coordination like Cl
 1685|      0|          parameter._ipar.push_back(1);
 1686|      0|        }
 1687|       |
 1688|      0|        _ffparams.push_back(parameter);
 1689|      0|      }
 1690|      0|    }
 1691|       |
 1692|      0|    if (ifs)
  ------------------
  |  Branch (1692:9): [True: 0, False: 0]
  ------------------
 1693|      0|      ifs.close();
 1694|       |
 1695|       |    // return the locale to the original one
 1696|      0|    obLocale.RestoreLocale();
 1697|       |
 1698|      0|    return 0;
 1699|      0|  }
_ZN9OpenBabel15OBForceFieldUFF8SetTypesEv:
 1702|  2.84k|  {
 1703|  2.84k|    vector<vector<int> > _mlist; //!< match list for atom typing
 1704|  2.84k|    vector<pair<std::unique_ptr<OBSmartsPattern>, string>> _vexttyp; //!< external atom type rules
 1705|  2.84k|    vector<vector<int> >::iterator j;
 1706|  2.84k|    vector<string> vs;
 1707|  2.84k|    char buffer[BUFF_SIZE];
 1708|       |
 1709|  2.84k|    _mol.SetAtomTypesPerceived();
 1710|       |
 1711|       |    // open data/UFF.prm
 1712|  2.84k|    ifstream ifs;
 1713|  2.84k|    if (OpenDatafile(ifs, "UFF.prm").length() == 0) {
  ------------------
  |  Branch (1713:9): [True: 2.84k, False: 0]
  ------------------
 1714|  2.84k|      obErrorLog.ThrowError(__FUNCTION__, "Cannot open UFF.prm", obError);
 1715|  2.84k|      return false;
 1716|  2.84k|    }
 1717|       |
 1718|      0|    while (ifs.getline(buffer, BUFF_SIZE)) {
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
  |  Branch (1718:12): [True: 0, False: 0]
  ------------------
 1719|      0|      if (EQn(buffer, "atom", 4)) {
  ------------------
  |  |  779|      0|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1720|      0|      	tokenize(vs, buffer);
 1721|       |
 1722|      0|        auto sp = std::unique_ptr<OBSmartsPattern>(new OBSmartsPattern);
 1723|      0|        if (sp->Init(vs[1])) {
  ------------------
  |  Branch (1723:13): [True: 0, False: 0]
  ------------------
 1724|      0|          _vexttyp.emplace_back(std::move(sp), vs[2]);
 1725|      0|        }
 1726|      0|        else {
 1727|      0|          obErrorLog.ThrowError(__FUNCTION__, " Could not parse atom type table from UFF.prm", obInfo);
 1728|      0|          return false;
 1729|      0|        }
 1730|      0|      }
 1731|      0|    }
 1732|       |
 1733|      0|    for (auto i = _vexttyp.begin(); i != _vexttyp.end(); ++i) {
  ------------------
  |  Branch (1733:37): [True: 0, False: 0]
  ------------------
 1734|      0|      if (i->first->Match(_mol)) {
  ------------------
  |  Branch (1734:11): [True: 0, False: 0]
  ------------------
 1735|      0|        _mlist = i->first->GetMapList();
 1736|      0|        for (j = _mlist.begin();j != _mlist.end();++j) {
  ------------------
  |  Branch (1736:33): [True: 0, False: 0]
  ------------------
 1737|      0|          _mol.GetAtom((*j)[0])->SetType(i->second);
 1738|      0|        }
 1739|      0|      }
 1740|      0|    }
 1741|       |
 1742|       |    // Special atom types (i.e., P_3+q)
 1743|       |    // (We can't easily do this with a SMARTS)
 1744|      0|    FOR_ATOMS_OF_MOL(a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1745|      0|      if (a->GetAtomicNum() == 15) {
  ------------------
  |  Branch (1745:11): [True: 0, False: 0]
  ------------------
 1746|       |        // loop through all the neighbors and see if we have a metal coordination
 1747|      0|        bool organomet = false;
 1748|      0|        int nbrElement;
 1749|      0|        FOR_NBORS_OF_ATOM (nbr, &*a) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1750|      0|          nbrElement = nbr->GetAtomicNum();
 1751|      0|          if ( (nbrElement >= 21 && nbrElement <= 31) // Sc to Ga
  ------------------
  |  Branch (1751:17): [True: 0, False: 0]
  |  Branch (1751:37): [True: 0, False: 0]
  ------------------
 1752|      0|               || (nbrElement >= 39 && nbrElement <= 50) // Y to Sn
  ------------------
  |  Branch (1752:20): [True: 0, False: 0]
  |  Branch (1752:40): [True: 0, False: 0]
  ------------------
 1753|      0|               || (nbrElement >= 57 && nbrElement <= 83) // La to Bi
  ------------------
  |  Branch (1753:20): [True: 0, False: 0]
  |  Branch (1753:40): [True: 0, False: 0]
  ------------------
 1754|      0|               || (nbrElement >= 89) ) {
  ------------------
  |  Branch (1754:19): [True: 0, False: 0]
  ------------------
 1755|      0|            organomet = true;
 1756|      0|            break; // done!
 1757|      0|          }
 1758|      0|        }
 1759|      0|        if (organomet)
  ------------------
  |  Branch (1759:13): [True: 0, False: 0]
  ------------------
 1760|      0|          a->SetType("P_3+q");
 1761|      0|      }
 1762|      0|      else if (a->GetAtomicNum() > 102) { // superheavy
  ------------------
  |  Branch (1762:16): [True: 0, False: 0]
  ------------------
 1763|      0|        a->SetType("Lw6+3"); // prevent a crash with atoms beyond the parameterization Avogadro PR#741
 1764|      0|      }
 1765|      0|    }
 1766|       |
 1767|      0|    IF_OBFF_LOGLVL_LOW {
  ------------------
  |  |   71|      0|#define IF_OBFF_LOGLVL_LOW    if(_loglvl >= OBFF_LOGLVL_LOW)
  |  |  ------------------
  |  |  |  |   38|      0|#define OBFF_LOGLVL_LOW		1   //!< SteepestDescent progress... (no output from Energy())
  |  |  ------------------
  |  |  |  Branch (71:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1768|      0|      OBFFLog("\nA T O M   T Y P E S\n\n");
 1769|      0|      OBFFLog("IDX\tTYPE\tRING\n");
 1770|       |
 1771|      0|      FOR_ATOMS_OF_MOL (a, _mol) {
  ------------------
  |  |  417|      0|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1772|      0|        snprintf(_logbuf, BUFF_SIZE, "%d\t%s\t%s\n", a->GetIdx(), a->GetType(),
  ------------------
  |  |  771|      0|#define BUFF_SIZE 32768
  ------------------
 1773|      0|	  (a->IsInRing() ? (a->IsAromatic() ? "AR" : "AL") : "NO"));
  ------------------
  |  Branch (1773:5): [True: 0, False: 0]
  |  Branch (1773:22): [True: 0, False: 0]
  ------------------
 1774|      0|        OBFFLog(_logbuf);
 1775|      0|      }
 1776|       |
 1777|      0|    }
 1778|       |
 1779|      0|    if (ifs)
  ------------------
  |  Branch (1779:9): [True: 0, False: 0]
  ------------------
 1780|      0|      ifs.close();
 1781|       |
 1782|      0|    return true;
 1783|      0|  }

_ZN9OpenBabel15OBForceFieldUFFC2EPKcb:
  124|      2|    explicit OBForceFieldUFF(const char* ID, bool IsDefault=true) : OBForceField(ID, IsDefault)
  125|      2|    {
  126|      2|      _validSetup = false;
  127|      2|      _init = false;
  128|      2|      _rvdw = 7.0;
  129|      2|      _rele = 15.0;
  130|      2|      _epsilon = 1.0; // electrostatics not used
  131|      2|      _pairfreq = 10;
  132|      2|      _cutoff = false;
  133|      2|      _linesearch = LineSearchType::Newton2Num;
  134|      2|    }

_ZN9OpenBabel8OBFormat14RegisterFormatEPKcS2_:
   47|    322|{
   48|    322|  GetMap()[ID] = this;
   49|    322|  if (MIME)
  ------------------
  |  Branch (49:7): [True: 94, False: 228]
  ------------------
   50|     94|    FormatsMIMEMap()[MIME] = this;
   51|    322|  if(Flags() & DEFAULTFORMAT)
  ------------------
  |  |   40|    322|#define DEFAULTFORMAT   0x4000
  ------------------
  |  Branch (51:6): [True: 8, False: 314]
  ------------------
   52|      8|    Default() = this;
   53|       |
   54|       |  //ensure "formats" is registered as a plugin
   55|    322|  PluginMap()[TypeID()] =this;
   56|    322|  _id=ID;
   57|    322|  return GetMap().size();
   58|    322|}

_ZN9OpenBabel14OBAPIInterfaceC2Ev:
   29|      2|	{
   30|      2|		OBConversion::RegisterFormat("obapi",this);
   31|      2|		OBConversion::RegisterOptionParam("-errorlevel", this, 1, OBConversion::GENOPTIONS);
   32|      2|	}
_ZN9OpenBabel14OBAPIInterface5FlagsEv:
   41|      2|	unsigned int Flags() override { return (NOTWRITABLE | NOTREADABLE); }
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
              	unsigned int Flags() override { return (NOTWRITABLE | NOTREADABLE); }
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------

_ZN9OpenBabel9CSRFormatC2Ev:
   32|      2|    {
   33|      2|      OBConversion::RegisterFormat("csr",this);
   34|      2|    }
_ZN9OpenBabel9CSRFormat5FlagsEv:
   49|      2|    {
   50|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   51|      2|    }

_ZN9OpenBabel10MCDLFormat4initEv:
  142|      2|  void MCDLFormat::init(){
  143|      2|    fsastart="{SA:";
  144|      2|    fsbstart="{SB:";
  145|      2|    fchstart="{CZ:";
  146|      2|    fradstart="{RA:";
  147|       |    //coordinates string
  148|      2|    fnastart="{NA:";
  149|      2|    fnbstart="{NB:";
  150|      2|    fzcoorstart="{ZV:";
  151|      2|    fablockstart="{CC:";
  152|      2|    fbblockstart="{BB:";
  153|      2|    fchargeblockstart="{MM:CHG,";
  154|      2|    fstereobondstart="{BS:";
  155|      2|    ftitlestart="{CN:}";
  156|       |
  157|      2|   };
_ZN9OpenBabel10MCDLFormatC2Ev:
   38|      2|  {
   39|      2|    OBConversion::RegisterFormat("mcdl",this);
   40|      2|    init();
   41|      2|  }
_ZN9OpenBabel10MCDLFormat5FlagsEv:
   72|      2|  {
   73|      2|      return 0;
   74|      2|  }

_ZN9OpenBabel9MNAFormatC2Ev:
   55|      2|			{
   56|      2|				OBConversion::RegisterFormat("mna", this);
   57|      2|				OBConversion::RegisterOptionParam(levels_option, this, 1);
   58|      2|			}
_ZN9OpenBabel9MNAFormat5FlagsEv:
  155|      3|			{
  156|      3|				return NOTREADABLE;	// possibly WRITEONEONLY??
  ------------------
  |  |   31|      3|#define NOTREADABLE     0x01
  ------------------
  157|      3|			}

_ZN9OpenBabel9PQSFormatC2Ev:
   37|      2|    {
   38|      2|      OBConversion::RegisterFormat("pqs",this);
   39|      2|    }
_ZN9OpenBabel9PQSFormat5FlagsEv:
   54|      2|    {
   55|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   56|      2|    }

_ZN9OpenBabel12ABINITFormatC2Ev:
   39|      2|    {
   40|      2|      OBConversion::RegisterFormat("abinit",this);
   41|      2|    }
_ZN9OpenBabel12ABINITFormat5FlagsEv:
   58|      2|    {
   59|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   60|      2|    }

_ZN9OpenBabel16AcesOutputFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("acesout",this);
   40|      2|    }
_ZN9OpenBabel15AcesInputFormatC2Ev:
   76|      2|    {
   77|      2|      OBConversion::RegisterFormat("acesin",this);
   78|      2|    }
_ZN9OpenBabel16AcesOutputFormat5FlagsEv:
   59|      2|    {
   60|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   61|      2|    }
_ZN9OpenBabel15AcesInputFormat5FlagsEv:
   95|      2|    {
   96|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   97|      2|    }

_ZN9OpenBabel9ACRFormatC2Ev:
   39|      2|    {
   40|      2|      OBConversion::RegisterFormat("acr", this, "chemical/x-acr");
   41|       |      //		OBConversion::RegisterOptionParam("f", this, 1);
   42|       |      //		OBConversion::RegisterOptionParam("n", this);
   43|      2|      OBConversion::RegisterOptionParam("s", this, 0, OBConversion::INOPTIONS);
   44|       |
   45|      2|    }
_ZN9OpenBabel9ACRFormat5FlagsEv:
   66|      2|    {
   67|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   68|      2|    }

_ZN9OpenBabel15ADFOutputFormatC2Ev:
   63|      2|    {
   64|      2|      OBConversion::RegisterFormat("adfout",this);
   65|      2|    }
_ZN9OpenBabel14ADFInputFormatC2Ev:
  264|      2|    {
  265|      2|      OBConversion::RegisterFormat("adf", this);
  266|      2|    }
_ZN9OpenBabel13ADFBandFormatC2Ev:
  371|      2|    {
  372|      2|      OBConversion::RegisterFormat("adfband",this);
  373|      2|    }
_ZN9OpenBabel13ADFDftbFormatC2Ev:
  507|      2|    {
  508|      2|      OBConversion::RegisterFormat("adfdftb",this);
  509|      2|    }
_ZN9OpenBabel11OBT41FormatC2Ev:
  651|      2|    {
  652|      2|        OBConversion::RegisterFormat( "t41", this );
  653|      2|        OBConversion::RegisterFormat( "T41", this );
  654|      2|    }
_ZN9OpenBabel15ADFOutputFormat5FlagsEv:
   82|      2|    {
   83|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   84|      2|    }
_ZN9OpenBabel14ADFInputFormat5FlagsEv:
  288|      2|    {
  289|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
  290|      2|    }
_ZN9OpenBabel13ADFBandFormat5FlagsEv:
  386|      2|    {
  387|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
  388|      2|    }
_ZN9OpenBabel13ADFDftbFormat5FlagsEv:
  522|      2|    {
  523|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
  524|      2|    }
_ZN9OpenBabel11OBT41Format5FlagsEv:
  683|      4|    {
  684|      4|        return READONEONLY | READBINARY | NOTWRITABLE;
  ------------------
  |  |   32|      4|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | READBINARY | NOTWRITABLE;
  ------------------
  |  |   33|      4|#define READBINARY      0x04
  ------------------
                      return READONEONLY | READBINARY | NOTWRITABLE;
  ------------------
  |  |   35|      4|#define NOTWRITABLE     0x10
  ------------------
  685|      4|    }

_ZN9OpenBabel13AlchemyFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("alc",this, "chemical/x-alchemy");
   37|      2|    }
_ZN9OpenBabel13AlchemyFormat5FlagsEv:
   55|      2|    {
   56|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   57|      2|    }

_ZN9OpenBabel15AmberPrepFormatC2Ev:
   34|      2|    {
   35|      2|        OBConversion::RegisterFormat("prep",this);
   36|      2|    }
_ZN9OpenBabel15AmberPrepFormat5FlagsEv:
   53|      2|    {
   54|      2|        return NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   55|      2|    }

_ZN9OpenBabel13AoforceFormatC2Ev:
   31|      2|    AoforceFormat() { OBConversion::RegisterFormat("aoforce", this); }
_ZN9OpenBabel13AoforceFormat5FlagsEv:
   43|      2|    unsigned int Flags() override { return READONEONLY | NOTWRITABLE; }
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                  unsigned int Flags() override { return READONEONLY | NOTWRITABLE; }
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------

_ZN9OpenBabel15BallStickFormatC2Ev:
   33|      2|    {
   34|      2|      OBConversion::RegisterFormat("bs",this);
   35|      2|    }
_ZN9OpenBabel15BallStickFormat5FlagsEv:
   51|      2|    {
   52|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   53|      2|    }

_ZN9OpenBabel9BGFFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("bgf",this);
   38|      2|    }
_ZN9OpenBabel9BGFFormat5FlagsEv:
   53|      2|    {
   54|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   55|      2|    }

_ZN9OpenBabel9BoxFormatC2Ev:
   32|      2|    {
   33|      2|        OBConversion::RegisterFormat("box",this);
   34|      2|    }
_ZN9OpenBabel9BoxFormat5FlagsEv:
   49|      2|    {
   50|      2|        return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   51|      2|    }

_ZN9OpenBabel11CacaoFormatC2Ev:
   37|      2|    {
   38|      2|      OBConversion::RegisterFormat("caccrt",this);
   39|      2|    }
_ZN9OpenBabel19CacaoInternalFormatC2Ev:
  300|      2|    {
  301|      2|      OBConversion::RegisterFormat("cacint",this);
  302|      2|    }
_ZN9OpenBabel11CacaoFormat5FlagsEv:
   57|      2|    {
   58|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   59|      2|    }
_ZN9OpenBabel19CacaoInternalFormat5FlagsEv:
  318|      2|    {
  319|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
  320|      2|    }

_ZN9OpenBabel11CacheFormatC2Ev:
   32|      2|    {
   33|      2|      OBConversion::RegisterFormat("cac",this);
   34|      2|      OBConversion::RegisterFormat("cache",this);
   35|      2|    }
_ZN9OpenBabel11CacheFormat5FlagsEv:
   53|      4|    {
   54|      4|      return NOTREADABLE;
  ------------------
  |  |   31|      4|#define NOTREADABLE     0x01
  ------------------
   55|      4|    }

_ZN9OpenBabel9CARFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("car",this, "chemical/x-msi-car");
   37|      2|      OBConversion::RegisterFormat("arc",this, "chemical/x-msi-car");
   38|      2|    }
_ZN9OpenBabel9CARFormat5FlagsEv:
   57|      4|    {
   58|      4|      return NOTWRITABLE;
  ------------------
  |  |   35|      4|#define NOTWRITABLE     0x10
  ------------------
   59|      4|    }

_ZN9OpenBabel12CASTEPFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("castep",this);
   38|      2|    }
_ZN9OpenBabel12CASTEPFormat5FlagsEv:
   54|      2|    {
   55|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   56|      2|    }

_ZN9OpenBabel9CCCFormatC2Ev:
   33|      2|    {
   34|      2|        OBConversion::RegisterFormat("ccc",this);
   35|      2|    }
_ZN9OpenBabel9CCCFormat5FlagsEv:
   50|      2|    {
   51|      2|        return NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   52|      2|    }

_ZN9OpenBabel13CHEM3D1FormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("c3d1",this);
   37|      2|    }
_ZN9OpenBabel13CHEM3D2FormatC2Ev:
  108|      2|    {
  109|      2|      OBConversion::RegisterFormat("c3d2",this);
  110|      2|    }
_ZN9OpenBabel13CHEM3D1Format5FlagsEv:
   52|      2|    {
   53|      2|      return READONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
   54|      2|    }
_ZN9OpenBabel13CHEM3D2Format5FlagsEv:
  125|      2|    {
  126|      2|      return READONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
  127|      2|    }

_ZN9OpenBabel21ChemDrawBinaryXFormatC2Ev:
  128|      2|  {
  129|      2|    OBConversion::RegisterFormat("cdx",this);
  130|      2|  }
_ZN9OpenBabel21ChemDrawBinaryXFormat5FlagsEv:
  163|      2|  {
  164|      2|    return READBINARY|NOTWRITABLE;
  ------------------
  |  |   33|      2|#define READBINARY      0x04
  ------------------
                  return READBINARY|NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
  165|      2|  }

_ZN9OpenBabel14ChemDrawFormatC2Ev:
   33|      2|    {
   34|      2|      OBConversion::RegisterFormat("ct",this);
   35|      2|    }
_ZN9OpenBabel14ChemDrawFormat5FlagsEv:
   50|      2|    {
   51|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   52|      2|    }

_ZN9OpenBabel13ChemKinFormat4InitEv:
  217|      2|{    //initialize the member variables used during input
  218|      2|    ln.clear();
  219|      2|    AUnitsFactor = 1.0;
  220|      2|    EUnitsFactor = 1.0;
  221|      2|    SpeciesListed=false;
  222|      2|    IMols.clear();
  223|       |    //Special species name
  224|      2|    std::shared_ptr<OBMol> sp(new OBMol);
  225|      2|    sp.get()->SetTitle("M");
  226|      2|    IMols["M"] = sp;
  227|      2|}
_ZN9OpenBabel13ChemKinFormatC2Ev:
   48|      2|  {
   49|      2|    OBConversion::RegisterFormat("ck",this);
   50|      2|    OBConversion::RegisterOptionParam("s", this); //no params
   51|      2|    OBConversion::RegisterOptionParam("t", this);
   52|      2|    Init();
   53|      2|  }

_ZN9OpenBabel9CHTFormatC2Ev:
   62|      2|    {
   63|      2|      OBConversion::RegisterFormat("cht",this);
   64|      2|    }
_ZN9OpenBabel9CHTFormat5FlagsEv:
   79|      2|    {
   80|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   81|      2|    }

_ZN9OpenBabel9CIFFormatC2Ev:
   62|      2|    {
   63|      2|      RegisterFormat("cif", "chemical/x-cif");
   64|      2|    }

_ZN9OpenBabel10CopyFormatC2Ev:
   25|      2|  {
   26|      2|    OBConversion::RegisterFormat("copy",this);
   27|      2|  }
_ZN9OpenBabel10CopyFormat5FlagsEv:
   55|      2|  {
   56|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   57|      2|  }

_ZN9OpenBabel11CRK2DFormatC2Ev:
   34|      2|    {
   35|      2|      OBConversion::RegisterFormat("crk2d", this, "chemical/x-crk2d");
   36|      2|    }
_ZN9OpenBabel11CRK3DFormatC2Ev:
  137|      2|    {
  138|      2|      OBConversion::RegisterFormat("crk3d", this, "chemical/x-crk3d");
  139|      2|    }
_ZN9OpenBabel11CRK2DFormat5FlagsEv:
   54|      2|    {
   55|      2|      return READONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
   56|      2|    }
_ZN9OpenBabel11CRK3DFormat5FlagsEv:
  157|      2|    {
  158|      2|      return READONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
  159|      2|    }

_ZN9OpenBabel10CSSRFormatC2Ev:
   32|      2|    {
   33|      2|      OBConversion::RegisterFormat("cssr",this);
   34|      2|    }
_ZN9OpenBabel10CSSRFormat5FlagsEv:
   49|      2|    {
   50|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   51|      2|    }

_ZN9OpenBabel18DlpolyConfigFormatC2Ev:
  267|      2|    {
  268|      2|      OBConversion::RegisterFormat("CONFIG",this);
  269|      2|    }
_ZN9OpenBabel19DlpolyHISTORYFormatC2Ev:
  399|      2|  {
  400|      2|    OBConversion::RegisterFormat("HISTORY",this);
  401|      2|  }
_ZN9OpenBabel18DlpolyConfigFormat5FlagsEv:
  284|      2|    {
  285|      2|      return WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
  286|      2|    }
_ZN9OpenBabel19DlpolyHISTORYFormat5FlagsEv:
  416|      2|  {
  417|      2|    return NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
  418|      2|  }

_ZN9OpenBabel10DMolFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("dmol",this);
   40|      2|      OBConversion::RegisterFormat("outmol",this, "chemical/x-dmol");
   41|      2|    }
_ZN9OpenBabel10DMolFormat5FlagsEv:
   58|      4|    {
   59|      4|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      4|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      4|#define WRITEONEONLY    0x20
  ------------------
   60|      4|    }

_ZN9OpenBabel10EXYZFormatC2Ev:
   40|      2|    {
   41|      2|      OBConversion::RegisterFormat("exyz", this, "chemical/x-xyz");
   42|      2|    }

_ZN9OpenBabel11FASTAFormatC2Ev:
   40|      2|    FASTAFormat() {
   41|      2|      OBConversion::RegisterFormat("fasta", this, "chemical/x-fasta");
   42|      2|      OBConversion::RegisterFormat("fa", this);
   43|      2|      OBConversion::RegisterFormat("fsa", this);
   44|       |
   45|      2|      OBConversion::RegisterOptionParam("s", this);
   46|      2|      OBConversion::RegisterOptionParam("b", this);
   47|      2|      OBConversion::RegisterOptionParam("n", this);
   48|      2|      OBConversion::RegisterOptionParam("1", this);
   49|      2|      OBConversion::RegisterOptionParam("t", nullptr, 1, OBConversion::INOPTIONS);
   50|      2|    }
_ZN9OpenBabel11FASTAFormat5FlagsEv:
   74|      6|    unsigned int Flags() override {
   75|      6|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      6|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      6|#define WRITEONEONLY    0x20
  ------------------
   76|      6|    }

_ZN9OpenBabel16FastSearchFormatC2Ev:
   39|      2|FastSearchFormat() : fsi(nullptr)
   40|      2|{
   41|      2|  OBConversion::RegisterFormat("fs",this);
   42|       |  //Specify the number of option taken by options
   43|      2|  OBConversion::RegisterOptionParam("S", this, 1, OBConversion::GENOPTIONS);
   44|      2|  OBConversion::RegisterOptionParam("S", this, 1, OBConversion::INOPTIONS);
   45|      2|  OBConversion::RegisterOptionParam("f", this, 1);
   46|      2|  OBConversion::RegisterOptionParam("N", this, 1);
   47|      2|  OBConversion::RegisterOptionParam("u", this, 0);
   48|      2|  OBConversion::RegisterOptionParam("t", this, 1, OBConversion::INOPTIONS);
   49|      2|  OBConversion::RegisterOptionParam("l", this, 1, OBConversion::INOPTIONS);
   50|      2|  OBConversion::RegisterOptionParam("a", this, 0, OBConversion::INOPTIONS);
   51|      2|  OBConversion::RegisterOptionParam("e", this, 0, OBConversion::INOPTIONS);
   52|      2|}
_ZN9OpenBabel16FastSearchFormat5FlagsEv:
  107|      2|  unsigned int Flags() override { return READBINARY | READONEONLY | WRITEBINARY; }
  ------------------
  |  |   33|      2|#define READBINARY      0x04
  ------------------
                unsigned int Flags() override { return READBINARY | READONEONLY | WRITEBINARY; }
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                unsigned int Flags() override { return READBINARY | READONEONLY | WRITEBINARY; }
  ------------------
  |  |   37|      2|#define WRITEBINARY     0x40
  ------------------

_ZN9OpenBabel10FCHKFormatC2Ev:
   50|      2|    {
   51|      2|      OBConversion::RegisterFormat("fchk", this,
   52|      2|                                   "chemical/x-gaussian-checkpoint");
   53|      2|      OBConversion::RegisterFormat("fch", this,
   54|      2|                                   "chemical/x-gaussian-checkpoint");
   55|      2|      OBConversion::RegisterFormat("fck", this,
   56|      2|                                   "chemical/x-gaussian-checkpoint");
   57|      2|    }
_ZN9OpenBabel10FCHKFormat5FlagsEv:
   78|      6|    {
   79|      6|      return NOTWRITABLE;
  ------------------
  |  |   35|      6|#define NOTWRITABLE     0x10
  ------------------
   80|      6|    }

_ZN9OpenBabel10FEATFormatC2Ev:
   32|      2|    {
   33|      2|      OBConversion::RegisterFormat("feat",this);
   34|      2|    }
_ZN9OpenBabel10FEATFormat5FlagsEv:
   51|      2|    {
   52|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   53|      2|    }

_ZN9OpenBabel16FenskeZmatFormatC2Ev:
   33|      2|    {
   34|      2|        OBConversion::RegisterFormat("fh",this);
   35|      2|    }
_ZN9OpenBabel16FenskeZmatFormat5FlagsEv:
   50|      2|    {
   51|      2|        return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   52|      2|    }

_ZN9OpenBabel13FHIaimsFormatC2Ev:
   35|      2|    {
   36|      2|        OBConversion::RegisterFormat("fhiaims",this);
   37|      2|    }
_ZN9OpenBabel13FHIaimsFormat5FlagsEv:
   55|      2|    {
   56|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   57|      2|    }

_ZN9OpenBabel17FingerprintFormatC2Ev:
   36|      2|    FingerprintFormat() {OBConversion::RegisterFormat("fpt",this);}
_ZN9OpenBabel17FingerprintFormat5FlagsEv:
  111|      2|    unsigned int Flags() override { return NOTREADABLE; }
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------

_ZN9OpenBabel24FreeFormFractionalFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("fract",this);
   37|      2|    }

_ZN9OpenBabel18GAMESSOutputFormatC2Ev:
   41|      2|      GAMESSOutputFormat() {
   42|      2|        OBConversion::RegisterFormat("gam",    this, "chemical/x-gamess-output");
   43|      2|        OBConversion::RegisterFormat("gamout", this);
   44|      2|        OBConversion::RegisterFormat("gamess", this);
   45|      2|      }
_ZN9OpenBabel17GAMESSInputFormatC2Ev:
   86|      2|      GAMESSInputFormat() {
   87|      2|        OBConversion::RegisterFormat("inp",   this, "chemical/x-gamess-input");
   88|      2|        OBConversion::RegisterFormat("gamin", this);
   89|       |        // Command-line keywords
   90|      2|        OBConversion::RegisterOptionParam("k", nullptr, 1, OBConversion::OUTOPTIONS);
   91|       |        // Command-line keyword file
   92|      2|        OBConversion::RegisterOptionParam("f", nullptr, 1, OBConversion::OUTOPTIONS);
   93|      2|      }
_ZN9OpenBabel18GAMESSOutputFormat5FlagsEv:
   69|      6|      unsigned int Flags() override {
   70|      6|        return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      6|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      6|#define NOTWRITABLE     0x10
  ------------------
   71|      6|      }
_ZN9OpenBabel17GAMESSInputFormat5FlagsEv:
  116|      4|      unsigned int Flags() override {
  117|      4|        return WRITEONEONLY; // | NOTREADABLE;
  ------------------
  |  |   36|      4|#define WRITEONEONLY    0x20
  ------------------
  118|      4|      }

_ZN9OpenBabel20OBGaussianCubeFormatC2Ev:
   57|      2|    {
   58|      2|        OpenBabel::OBConversion::RegisterFormat( "cube", this );
   59|      2|        OpenBabel::OBConversion::RegisterFormat( "cub", this );
   60|      2|    }
_ZN9OpenBabel20OBGaussianCubeFormat5FlagsEv:
   90|      4|    {
   91|      4|        return 0;
   92|      4|    }

_ZN9OpenBabel20GaussianOutputFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("gal",this, "chemical/x-gaussian-log");
   40|      2|      OBConversion::RegisterFormat("g92",this);
   41|      2|      OBConversion::RegisterFormat("g94",this);
   42|      2|      OBConversion::RegisterFormat("g98",this);
   43|      2|      OBConversion::RegisterFormat("g03",this);
   44|      2|      OBConversion::RegisterFormat("g09",this);
   45|      2|      OBConversion::RegisterFormat("g16",this);
   46|      2|    }
_ZN9OpenBabel19GaussianInputFormatC2Ev:
   82|      2|    {
   83|      2|      OBConversion::RegisterFormat("com",this, "chemical/x-gaussian-input");
   84|      2|      OBConversion::RegisterFormat("gau",this);
   85|      2|      OBConversion::RegisterFormat("gjc",this);
   86|      2|      OBConversion::RegisterFormat("gjf",this);
   87|      2|      OBConversion::RegisterOptionParam("b", nullptr, 0, OBConversion::OUTOPTIONS);
   88|       |      // Command-line keywords
   89|      2|      OBConversion::RegisterOptionParam("k", nullptr, 1, OBConversion::OUTOPTIONS);
   90|       |      // Command-line keyword file
   91|      2|      OBConversion::RegisterOptionParam("f", nullptr, 1, OBConversion::OUTOPTIONS);
   92|      2|    }
_ZN9OpenBabel20GaussianOutputFormat5FlagsEv:
   66|     14|    {
   67|     14|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|     14|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|     14|#define NOTWRITABLE     0x10
  ------------------
   68|     14|    }
_ZN9OpenBabel19GaussianInputFormat5FlagsEv:
  114|      8|    {
  115|      8|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      8|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      8|#define WRITEONEONLY    0x20
  ------------------
  116|      8|    }

_ZN9OpenBabel26GaussianZMatrixInputFormatC2Ev:
   43|      2|    {
   44|      2|      OBConversion::RegisterFormat("gzmat",this, "chemical/x-gaussian-input");
   45|      2|    }

_ZN9OpenBabel13GenBankFormatC2Ev:
   32|      2|    { // Copied from the Chemical MIME Page at http://www.ch.ic.ac.uk/chemime/
   33|      2|      OBConversion::RegisterFormat("gen", this, "chemical/x-genbank");
   34|      2|      OBConversion::RegisterFormat("embl", this);
   35|      2|      OBConversion::RegisterFormat("ddbj", this);
   36|       |
   37|      2|      OBConversion::RegisterOptionParam("s", this);
   38|      2|      OBConversion::RegisterOptionParam("b", this);
   39|      2|    }
_ZN9OpenBabel13GenBankFormat5FlagsEv:
   61|      6|    { return NOTWRITABLE | READONEONLY; }
  ------------------
  |  |   35|      6|#define NOTWRITABLE     0x10
  ------------------
                  { return NOTWRITABLE | READONEONLY; }
  ------------------
  |  |   32|      6|#define READONEONLY     0x02
  ------------------

_ZN9OpenBabel14GhemicalFormatC2Ev:
   36|      2|      {
   37|       |        //        OBConversion::RegisterFormat("mm1gp",this);
   38|       |        //        OBConversion::RegisterFormat("qm1gp",this);
   39|      2|        OBConversion::RegisterFormat("gpr",this);
   40|      2|      }
_ZN9OpenBabel14GhemicalFormat5FlagsEv:
   56|      2|      {
   57|      2|        return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   58|      2|      }

_ZN9OpenBabel9GROFormatC2Ev:
   36|      2|  {
   37|       |    /* GRO is the file extension and is case insensitive. A MIME type can be
   38|       |       added as an optional third parameter.
   39|       |       Multiple file extensions can be registered by adding extra statements.*/
   40|      2|    OBConversion::RegisterFormat("gro",this);
   41|       |
   42|       |    /* If there are any format specific options they should be registered here
   43|       |       so that the commandline interface works properly.
   44|       |       The first parameter is the option name. If it is a single letter it can
   45|       |       be concatinated with other single letter options. For output options it
   46|       |       can be multicharcter and is then written as --optionname on the command
   47|       |       line. The third parameter is the number of parameters the option takes.
   48|       |       Currently this is either 1 or 0 and if it is 0 can be omitted for output
   49|       |       options. The parameter is always text and needs to be parsed to extract
   50|       |       a number.
   51|       |
   52|       |       Options can apply when writing - 4th parameter is
   53|       |       OBConversion::OUTOPTIONS or can be omitted as shown. A single letter
   54|       |       output option is preceded by -x on the command line.
   55|       |       Or options can apply to the input format - the 4th parameter is
   56|       |       OBConversion::INOPTIONS. They are then preceded by -a on the command
   57|       |       line.
   58|       |
   59|       |       Each option letter may be reused in other formats, but within the same
   60|       |       group, INOPTIONS or OUTOPTIONS, must take the same number of parameters
   61|       |       (0 or 1). There will be an error message when OpenBabel  runs if there
   62|       |       are conflicts between formats. A list of formats currently used (which
   63|       |       may not be comprehensive) is in docs/options.html.
   64|       |    */
   65|      2|    OBConversion::RegisterOptionParam("f", this, 1);
   66|      2|    OBConversion::RegisterOptionParam("n", this);
   67|      2|    OBConversion::RegisterOptionParam("s", this, 0, OBConversion::INOPTIONS);
   68|       |
   69|      2|  }

_ZN9OpenBabel14GROMOS96FormatC2Ev:
   69|      2|    {
   70|      2|      OBConversion::RegisterFormat("gr96",this);
   71|      2|    }
_ZN9OpenBabel14GROMOS96Format5FlagsEv:
   89|      2|    {
   90|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   91|      2|    }

_ZN9OpenBabel10GULPFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("got",this);
   37|      2|    }
_ZN9OpenBabel10GULPFormat5FlagsEv:
   53|      2|    {
   54|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   55|      2|    }

_ZN9OpenBabel9HINFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("hin",this, "chemical/x-hin");
   37|      2|    }

_ZN9OpenBabel18JaguarOutputFormatC2Ev:
   37|      2|    {
   38|      2|      OBConversion::RegisterFormat("jout",this);
   39|      2|    }
_ZN9OpenBabel17JaguarInputFormatC2Ev:
   72|      2|    {
   73|      2|      OBConversion::RegisterFormat("jin",this);
   74|      2|    }
_ZN9OpenBabel18JaguarOutputFormat5FlagsEv:
   55|      2|    unsigned int Flags() override { return READONEONLY | NOTWRITABLE; }
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                  unsigned int Flags() override { return READONEONLY | NOTWRITABLE; }
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
_ZN9OpenBabel17JaguarInputFormat5FlagsEv:
   90|      2|    unsigned int Flags() override { return WRITEONEONLY; }
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------

_ZN9OpenBabel12LMPDATFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("lmpdat", this, "chemical/x-lmpdat");
   38|      2|      OBConversion::RegisterOptionParam("q", nullptr, 1, OBConversion::OUTOPTIONS);
   39|      2|      OBConversion::RegisterOptionParam("d", nullptr, 1, OBConversion::OUTOPTIONS);
   40|      2|    }
_ZN9OpenBabel12LMPDATFormat5FlagsEv:
   65|      2|    {
   66|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   67|      2|    }

_ZN9OpenBabel9MDLFormat12ReadMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
  243|  1.92k|  {
  244|  1.92k|    OBMol* pmol = pOb->CastAndClear<OBMol>();
  245|       |
  246|       |    //Define some references so we can use the old parameter names
  247|  1.92k|    istream &ifs = *pConv->GetInStream();
  248|  1.92k|    OBMol &mol = *pmol;
  249|  1.92k|    bool setDimension = false; // did we extract the 'dimensional code' from line 2?
  250|  1.92k|    stringstream errorMsg;
  251|  1.92k|    string clearError; // empty string to clear the warning buffer
  252|       |
  253|  1.92k|    int i, natoms, nbonds;
  254|       |    //char buffer[BUFF_SIZE];
  255|  1.92k|    string comment;
  256|  1.92k|    string r1, r2;
  257|  1.92k|    map<OBBond*, OBStereo::BondDirection> updown;
  258|  1.92k|    vector<Parity> parities;
  259|  1.92k|    vector<pair<AliasData*,OBAtom*> > aliases;
  260|  1.92k|    HYDMap hydMap;
  261|  1.92k|    bool foundHYD = false, foundZCH = false, foundZBO = false;
  262|       |
  263|       |    // Attempting to read past the end of the file -- don't bother
  264|  1.92k|    if ( !ifs.good() || ifs.peek() == EOF )
  ------------------
  |  Branch (264:10): [True: 0, False: 1.92k]
  |  Branch (264:25): [True: 0, False: 1.92k]
  ------------------
  265|      0|      return false;
  266|       |
  267|  1.92k|    std::string line;
  268|       |    //
  269|       |    // The Header Block
  270|       |    //
  271|       |
  272|       |    // line1: molecule name
  273|  1.92k|    if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (273:9): [True: 0, False: 1.92k]
  ------------------
  274|      0|      errorMsg << "WARNING: Problems reading a MDL file\n";
  275|      0|      errorMsg << "Cannot read title line\n";
  276|      0|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  277|      0|      return(false);
  278|      0|    }
  279|       |
  280|       |    //Do not interpret a single (usually blank) line at end of file as
  281|       |    //another molecule giving an unnecessary error message.
  282|  1.92k|    if ( !ifs.good() || ifs.peek() == EOF )
  ------------------
  |  Branch (282:10): [True: 8, False: 1.91k]
  |  Branch (282:25): [True: 1, False: 1.91k]
  ------------------
  283|      9|      return false;
  284|       |
  285|  1.91k|    mol.SetTitle(line);
  286|       |
  287|  1.91k|    if(pConv->IsOption("T",OBConversion::INOPTIONS))
  ------------------
  |  Branch (287:8): [True: 0, False: 1.91k]
  ------------------
  288|      0|    {
  289|       |      //Read title only
  290|      0|      SkipObjects(0, pConv);
  291|      0|      return true;
  292|      0|    }
  293|       |
  294|  1.91k|    if(pConv->IsOption("P",OBConversion::INOPTIONS))
  ------------------
  |  Branch (294:8): [True: 0, False: 1.91k]
  ------------------
  295|      0|    {
  296|       |      //Read Title and Property lines only
  297|      0|      ignore(ifs, "M  END");
  298|      0|      ifs.ignore(100,'\n');
  299|      0|      ReadPropertyLines(ifs, mol);//also reads $$$$
  300|      0|      return true;
  301|      0|    }
  302|       |
  303|       |    // line 2: IIPPPPPPPPMMDDYYHHmmddSSssssssssssEEEEEEEEEEEERRRRRR
  304|       |    //
  305|       |    //          0...1    I = user's initials
  306|       |    //          2...9    P = program name
  307|       |    //         10..19    M/D/Y,H:m = date/time
  308|       |    //         20..21    d = dimensional code
  309|       |    //         22..23    S = scaling factor
  310|       |    //         24..33    s = scaling facter (double format 10.5)
  311|       |    //         34..45    E = energy
  312|       |    //         46..51    R = internal registry number
  313|  1.91k|    if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (313:9): [True: 0, False: 1.91k]
  ------------------
  314|      0|      errorMsg << "WARNING: Problems reading a MDL file\n";
  315|      0|      errorMsg << "Cannot read creator/dimension line line\n";
  316|      0|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  317|      0|      return false;
  318|      0|    }
  319|       |
  320|  1.91k|    if (line.size() > 21) {
  ------------------
  |  Branch (320:9): [True: 135, False: 1.78k]
  ------------------
  321|    135|      string dim = line.substr(20, 2);
  322|    135|      if (dim == "3D") {
  ------------------
  |  Branch (322:11): [True: 4, False: 131]
  ------------------
  323|      4|        mol.SetDimension(3);
  324|      4|        setDimension = true;
  325|      4|      } else
  326|    131|      if (dim == "2D") {
  ------------------
  |  Branch (326:11): [True: 2, False: 129]
  ------------------
  327|      2|        mol.SetDimension(2);
  328|      2|        setDimension = true;
  329|      2|      } else
  330|    129|      if (dim == "0D") {
  ------------------
  |  Branch (330:11): [True: 1, False: 128]
  ------------------
  331|      1|        mol.SetDimension(0);
  332|      1|        setDimension = true;
  333|      1|      }
  334|    135|    }
  335|       |
  336|       |    // line 3: comment line
  337|  1.91k|    if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (337:9): [True: 6, False: 1.91k]
  ------------------
  338|      6|      errorMsg << "WARNING: Problems reading a MDL file\n";
  339|      6|      errorMsg << "Cannot read comment line\n";
  340|      6|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  341|      6|      return false;
  342|      6|    }
  343|       |
  344|  1.91k|    if (!line.empty())
  ------------------
  |  Branch (344:9): [True: 562, False: 1.35k]
  ------------------
  345|    562|      comment = line;
  346|       |
  347|       |    //
  348|       |    // Connection Table (Ctab)
  349|       |    //
  350|       |
  351|       |    // line 1: counts line
  352|  1.91k|    if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (352:9): [True: 5, False: 1.90k]
  ------------------
  353|      5|      errorMsg << "WARNING: Problems reading a MDL file\n";
  354|      5|      errorMsg << "Cannot read atom and bond count\n";
  355|      5|      errorMsg << "File ended prematurely\n";
  356|      5|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  357|      5|      return false;
  358|      5|    }
  359|  1.90k|    if (line.size() < 6) { // error from Joe Bedell, Sigma-Aldrich
  ------------------
  |  Branch (359:9): [True: 5, False: 1.90k]
  ------------------
  360|      5|      errorMsg << "WARNING: Problems reading a MDL file\n";
  361|      5|      errorMsg << "Cannot read atom and bond count\n";
  362|      5|      errorMsg << "Expected standard 6 character atom and bond count\n";
  363|      5|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  364|      5|      return(false);
  365|      5|    }
  366|       |
  367|  1.90k|    natoms = ReadUIntField((line.substr(0, 3)).c_str());
  368|  1.90k|    nbonds = ReadUIntField((line.substr(3, 3)).c_str());
  369|       |
  370|       |    // Store the Chiral Flag
  371|  1.90k|    if (line.size() >= 15) {
  ------------------
  |  Branch (371:9): [True: 1.60k, False: 297]
  ------------------
  372|  1.60k|      unsigned int chiralFlagVal = ReadUIntField((line.substr(12, 3)).c_str());
  373|  1.60k|      if (chiralFlagVal > 1)
  ------------------
  |  Branch (373:11): [True: 81, False: 1.52k]
  ------------------
  374|     81|        {
  375|     81|          errorMsg << "WARNING: The Chiral Flag should be either 0 or 1. The value of "
  376|     81|                   << chiralFlagVal << " will be ignored.\n";
  377|     81|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  378|     81|        }
  379|  1.52k|      else
  380|  1.52k|        {
  381|  1.52k|          OBPairData *chiralFlag = new OBPairData();
  382|  1.52k|          chiralFlag->SetAttribute("MOL Chiral Flag");
  383|  1.52k|          chiralFlag->SetOrigin(local);
  384|  1.52k|          std::stringstream convert;
  385|  1.52k|          convert << chiralFlagVal;
  386|  1.52k|          chiralFlag->SetValue(convert.str()); // 1 ("Absolute Chirality"), 0 ("Relative Chirality")
  387|  1.52k|          mol.SetData(chiralFlag);
  388|  1.52k|        }
  389|  1.60k|    }
  390|       |
  391|  1.90k|    if(ReadUIntField((line.substr(6, 3)).c_str())>0)
  ------------------
  |  Branch (391:8): [True: 110, False: 1.79k]
  ------------------
  392|    110|      obErrorLog.ThrowError(__FUNCTION__,
  393|    110|        "WARNING: Problems reading the Count line of an MDL file\n"
  394|    110|        "There may be erroneous addition spaces or\n"
  395|    110|        "the file may contains Atom Lists, which are ignored\n",
  396|    110|        obWarning);
  397|       |
  398|  1.90k|    std::map<OBAtom*, int> specified_valence;
  399|  1.90k|    mol.BeginModify();
  400|  1.90k|    if(line.find("V3000") != string::npos) {
  ------------------
  |  Branch (400:8): [True: 23, False: 1.87k]
  ------------------
  401|       |      // V3000
  402|     23|      indexmap.clear();
  403|     23|      if(!ReadV3000Block(ifs, mol, pConv, false))
  ------------------
  |  Branch (403:10): [True: 22, False: 1]
  ------------------
  404|     22|        return false;
  405|       |      //ifs.getline(buffer,BUFF_SIZE); //M END line
  406|  1.87k|    } else {
  407|       |      // V2000
  408|  1.87k|      mol.ReserveAtoms(natoms);
  409|  1.87k|      double x,y,z;
  410|  1.87k|      string symbol;
  411|       |      //
  412|       |      // Atom Block
  413|       |      //
  414|  1.87k|      int massdiff, charge, stereo;
  415|  1.87k|      vector<int> massDiffs, charges;
  416|  1.87k|      Parity parity;
  417|  18.4k|      for (i = 0; i < natoms; ++i) {
  ------------------
  |  Branch (417:19): [True: 17.0k, False: 1.46k]
  ------------------
  418|  17.0k|        if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (418:13): [True: 209, False: 16.8k]
  ------------------
  419|    209|          errorMsg << "WARNING: Problems reading a MDL file\n";
  420|    209|          errorMsg << "Not enough atoms to match atom count (" << natoms << ") in counts line\n";
  421|    209|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  422|    209|          return false;
  423|    209|        }
  424|       |
  425|       |        // xxxxx.xxxxyyyyy.yyyyzzzzz.zzzz aaaddcccssshhhbbbvvvHHHrrriiimmmnnneee
  426|       |        //
  427|       |        // 0...30   x y z = atom coordinates
  428|       |        // 31..33   aaa = atom symbol
  429|       |        // 34..35   dd = mass difference: -3, -2, -1, 0, 1, 2, 3, 4 ('M  ISO' lines take precedence)
  430|       |        // 36..38   ccc = charge  ('M  CHG' and 'M  RAD' lines take precedence)
  431|       |        // 39..41   sss = atom stereo parity (ignored)
  432|       |        //          ... = query/reaction related
  433|       |        // 48..50   vvv = valence (0 means use implicit valence, while 15 means valence of 0)
  434|  16.8k|        massdiff = charge = 0;
  435|  16.8k|        parity = NotStereo;
  436|  16.8k|        if (line.size() < 34) {
  ------------------
  |  Branch (436:13): [True: 203, False: 16.5k]
  ------------------
  437|    203|          errorMsg << "WARNING: Problems reading a MDL file\n";
  438|    203|          errorMsg << "Missing data following atom specification in atom block\n";
  439|    203|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  440|    203|          return false;
  441|    203|        }
  442|       |
  443|       |        //Need to have atom in molecule while adding data
  444|  16.5k|        OBAtom* patom = mol.NewAtom();
  445|       |
  446|       |        // coordinates
  447|  16.5k|        x = atof(line.substr(0, 10).c_str());
  448|  16.5k|        y = atof(line.substr(10, 10).c_str());
  449|  16.5k|        z = atof(line.substr(20, 10).c_str());
  450|  16.5k|        patom->SetVector(x, y, z);
  451|       |        // symbol & isotope
  452|  16.5k|        symbol = line.substr(31, 3);
  453|       |        // cout << " atom: " << symbol << endl;
  454|  16.5k|        Trim(symbol);
  455|  16.5k|        if(symbol[0]!='R' || TestForAlias(symbol, patom, aliases))
  ------------------
  |  Branch (455:12): [True: 14.5k, False: 2.05k]
  |  Branch (455:30): [True: 400, False: 1.65k]
  ------------------
  456|  14.9k|        {
  457|  14.9k|          SetAtomicNumAndIsotope(patom, symbol.c_str());
  458|  14.9k|        }
  459|       |        // mass difference
  460|  16.5k|        if (line.size() >= 35) {
  ------------------
  |  Branch (460:13): [True: 16.3k, False: 289]
  ------------------
  461|  16.3k|          massdiff = ReadIntField(line.substr(34, 2).c_str());
  462|  16.3k|          if (massdiff < -3 || massdiff > 4) {
  ------------------
  |  Branch (462:15): [True: 3, False: 16.3k]
  |  Branch (462:32): [True: 1.03k, False: 15.2k]
  ------------------
  463|  1.03k|            obErrorLog.ThrowError(__FUNCTION__, "Invalid value for mass difference. It should be between -3 and 4.\n" + line, obWarning);
  464|  1.03k|            massdiff = 0;
  465|  15.2k|          } else if (massdiff != 0 && patom->GetIsotope() != 0) {
  ------------------
  |  Branch (465:22): [True: 692, False: 14.5k]
  |  Branch (465:39): [True: 1, False: 691]
  ------------------
  466|      1|            obErrorLog.ThrowError(__FUNCTION__, "Ignoring mass difference field for explicit hydrogen isotope.\n" + line, obWarning);
  467|      1|            massdiff = 0;
  468|      1|          }
  469|  16.3k|        }
  470|  16.5k|        massDiffs.push_back(massdiff);
  471|       |        // charge
  472|  16.5k|        if (line.size() >= 38)
  ------------------
  |  Branch (472:13): [True: 15.5k, False: 1.01k]
  ------------------
  473|  15.5k|          charge = ReadIntField(line.substr(36, 3).c_str());
  474|  16.5k|        charges.push_back(charge);
  475|       |        // stereo parity
  476|  16.5k|        if (line.size() >= 41) {
  ------------------
  |  Branch (476:13): [True: 14.6k, False: 1.97k]
  ------------------
  477|  14.6k|          stereo = ReadUIntField(line.substr(39, 3).c_str());
  478|  14.6k|          switch (stereo) {
  479|    159|            case 1:
  ------------------
  |  Branch (479:13): [True: 159, False: 14.4k]
  ------------------
  480|    159|              parity = Clockwise;
  481|    159|              break;
  482|    117|            case 2:
  ------------------
  |  Branch (482:13): [True: 117, False: 14.5k]
  ------------------
  483|    117|              parity = AntiClockwise;
  484|    117|              break;
  485|     14|            case 3:
  ------------------
  |  Branch (485:13): [True: 14, False: 14.6k]
  ------------------
  486|     14|              parity = Unknown;
  487|     14|              break;
  488|  14.3k|            default:
  ------------------
  |  Branch (488:13): [True: 14.3k, False: 290]
  ------------------
  489|  14.3k|              parity = NotStereo;
  490|  14.3k|              break;
  491|  14.6k|          }
  492|  14.6k|        }
  493|  16.5k|        parities.push_back(parity);
  494|       |
  495|       |        // valence
  496|  16.5k|        if (line.size() >= 50) {
  ------------------
  |  Branch (496:13): [True: 12.9k, False: 3.64k]
  ------------------
  497|  12.9k|          int valence = ReadIntField(line.substr(48, 3).c_str());
  498|  12.9k|          if (valence != 0)
  ------------------
  |  Branch (498:15): [True: 3.25k, False: 9.70k]
  ------------------
  499|  3.25k|            specified_valence[patom] = valence == 15 ? 0 : valence;
  ------------------
  |  Branch (499:40): [True: 1, False: 3.25k]
  ------------------
  500|  12.9k|        }
  501|       |
  502|  16.5k|        if (line.size() >= 62) {
  ------------------
  |  Branch (502:13): [True: 8.29k, False: 8.30k]
  ------------------
  503|  8.29k|          int aclass = ReadIntField(line.substr(60, 3).c_str());
  504|  8.29k|          if (aclass != 0) {
  ------------------
  |  Branch (504:15): [True: 918, False: 7.37k]
  ------------------
  505|    918|            OBPairInteger *pac = new OBPairInteger();
  506|    918|            pac->SetAttribute("Atom Class");
  507|    918|            pac->SetValue(aclass);
  508|    918|            pac->SetOrigin(fileformatInput);
  509|    918|            patom->SetData(pac);
  510|    918|          }
  511|  8.29k|        }
  512|       |
  513|       |//        if (!mol.AddAtom(atom))
  514|       |//          return false;
  515|       |//        atom.Clear();
  516|  16.5k|      }
  517|       |
  518|       |      //
  519|       |      // Bond Block
  520|       |      //
  521|  1.46k|      stereo = 0;
  522|  1.46k|      bool needs_kekulization = false; // Have we have found an aromatic bond?
  523|  1.46k|      unsigned int begin, end, order, flag;
  524|  1.46k|      for (i = 0;i < nbonds; ++i) {
  ------------------
  |  Branch (524:18): [True: 14, False: 1.45k]
  ------------------
  525|     14|        flag = 0;
  526|     14|        if (!std::getline(ifs, line)) {
  ------------------
  |  Branch (526:13): [True: 3, False: 11]
  ------------------
  527|      3|          errorMsg << "WARNING: Problems reading a MDL file\n";
  528|      3|          errorMsg << "Not enough bonds to match bond count (" << nbonds << ") in counts line\n";
  529|      3|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  530|      3|          return false;
  531|      3|        }
  532|     11|        begin = end = order = 0;
  533|       |        // 111222tttsssxxxrrrccc
  534|       |        //
  535|       |        // 111 = first atom number
  536|       |        // 222 = second atom number
  537|       |        // ttt = bond type (1-3, 4 = aromatic, 4-8 = query)
  538|       |        // sss = bond stereo (for a double bond 3 indicates unspecified stereochem,
  539|       |        //                    for a single bond 1 is Hash, 6 Wedge, 4 is unspecified)
  540|       |        // ... = query/topology
  541|     11|        if (line.size() >= 9) {
  ------------------
  |  Branch (541:13): [True: 10, False: 1]
  ------------------
  542|     10|          begin = ReadUIntField(line.substr(0, 3).c_str());
  543|     10|          end   = ReadUIntField(line.substr(3, 3).c_str());
  544|     10|          order = ReadUIntField((line.substr(6, 3)).c_str());
  545|     10|          if (order == 4) {
  ------------------
  |  Branch (545:15): [True: 1, False: 9]
  ------------------
  546|      1|            flag |= OBBond::Aromatic;
  547|      1|            order = 1;
  548|      1|            needs_kekulization = true;
  549|      1|          }
  550|     10|        }
  551|     11|        if (begin == 0 || end == 0 || order == 0 || begin > mol.NumAtoms() || end > mol.NumAtoms()) {
  ------------------
  |  Branch (551:13): [True: 6, False: 5]
  |  Branch (551:27): [True: 1, False: 4]
  |  Branch (551:39): [True: 1, False: 3]
  |  Branch (551:53): [True: 2, False: 1]
  |  Branch (551:79): [True: 1, False: 0]
  ------------------
  552|     11|          errorMsg << "WARNING: Problems reading a MDL file\n";
  553|     11|          errorMsg << line << "\n";
  554|     11|          errorMsg << "Invalid bond specification, atom numbers or bond order are wrong;\n";
  555|     11|          errorMsg << "each should be in a field of three characters.\n";
  556|     11|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  557|     11|          return false;
  558|     11|        }
  559|      0|        if (line.size() >= 12) {  //handle wedge/hash data
  ------------------
  |  Branch (559:13): [True: 0, False: 0]
  ------------------
  560|      0|          stereo = ReadUIntField((line.substr(9, 3)).c_str());
  561|      0|          if (stereo) {
  ------------------
  |  Branch (561:15): [True: 0, False: 0]
  ------------------
  562|      0|            switch (stereo) {
  563|      0|              case 1:
  ------------------
  |  Branch (563:15): [True: 0, False: 0]
  ------------------
  564|       |                // single bond: wedge
  565|      0|                flag |= OBBond::Wedge;
  566|      0|                break;
  567|      0|              case 3:
  ------------------
  |  Branch (567:15): [True: 0, False: 0]
  ------------------
  568|       |                // double bond: either cis or trans
  569|      0|                flag |= OBBond::CisOrTrans;
  570|      0|              case 4:
  ------------------
  |  Branch (570:15): [True: 0, False: 0]
  ------------------
  571|       |                // single bond: either wedge or hash (unspecified)
  572|      0|                flag |= OBBond::WedgeOrHash;
  573|      0|                break;
  574|      0|              case 6:
  ------------------
  |  Branch (574:15): [True: 0, False: 0]
  ------------------
  575|       |                // single bond: hash
  576|      0|                flag |= OBBond::Hash;
  577|      0|                break;
  578|      0|              default:
  ------------------
  |  Branch (578:15): [True: 0, False: 0]
  ------------------
  579|       |                // single bonds: not stereo
  580|       |                // double bonds: use x,y,z coordinates
  581|      0|                break;
  582|      0|            }
  583|      0|          }
  584|      0|        }
  585|       |
  586|      0|        if (!mol.AddBond(begin,end,order,flag)) {
  ------------------
  |  Branch (586:13): [True: 0, False: 0]
  ------------------
  587|      0|          errorMsg << "WARNING: Problems reading a MDL file\n";
  588|      0|          errorMsg << "Invalid bond specification\n";
  589|      0|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  590|      0|          return false;
  591|      0|        }
  592|      0|      }
  593|       |
  594|       |      // Kekulization is necessary if an aromatic bond is present
  595|  1.45k|      if (needs_kekulization) {
  ------------------
  |  Branch (595:11): [True: 0, False: 1.45k]
  ------------------
  596|      0|        mol.SetAromaticPerceived();
  597|       |        // First of all, set the atoms at the ends of the aromatic bonds to also
  598|       |        // be aromatic. This information is required for OBKekulize.
  599|      0|        FOR_BONDS_OF_MOL(bond, mol) {
  ------------------
  |  |  418|      0|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  600|      0|          if (bond->IsAromatic()) {
  ------------------
  |  Branch (600:15): [True: 0, False: 0]
  ------------------
  601|      0|            bond->GetBeginAtom()->SetAromatic();
  602|      0|            bond->GetEndAtom()->SetAromatic();
  603|      0|          }
  604|      0|        }
  605|      0|        bool ok = OBKekulize(&mol);
  606|      0|        if (!ok) {
  ------------------
  |  Branch (606:13): [True: 0, False: 0]
  ------------------
  607|      0|          stringstream errorMsg;
  608|      0|          errorMsg << "Failed to kekulize aromatic bonds in MOL file";
  609|      0|          std::string title = mol.GetTitle();
  610|      0|          if (!title.empty())
  ------------------
  |  Branch (610:15): [True: 0, False: 0]
  ------------------
  611|      0|            errorMsg << " (title is " << title << ")";
  612|      0|          errorMsg << endl;
  613|      0|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  614|       |          // return false; Should we return false for a kekulization failure?
  615|      0|        }
  616|      0|        mol.SetAromaticPerceived(false);
  617|      0|      }
  618|       |
  619|       |      //
  620|       |      // Properties Block
  621|       |      //
  622|  1.45k|      bool foundISO = false, foundCHG = false;
  623|  34.1k|      while (std::getline(ifs, line)) {
  ------------------
  |  Branch (623:14): [True: 32.8k, False: 1.21k]
  ------------------
  624|  32.8k|        if (line.substr(0, 4) == "$$$$")
  ------------------
  |  Branch (624:13): [True: 1, False: 32.8k]
  ------------------
  625|      1|          return true;
  626|  32.8k|        if (line.substr(0, 6) == "M  END")
  ------------------
  |  Branch (626:13): [True: 215, False: 32.6k]
  ------------------
  627|    215|          break;
  628|  32.6k|        if (line.substr(0, 6) == "S  SKP") {
  ------------------
  |  Branch (628:13): [True: 555, False: 32.1k]
  ------------------
  629|    555|          int i = ReadUIntField((line.substr(6, line.size() - 6)).c_str());
  630|  1.01k|          for(; i > 0; --i) {
  ------------------
  |  Branch (630:17): [True: 466, False: 548]
  ------------------
  631|    466|            if (!ifs.good()) // stop once the stream is exhausted; otherwise
  ------------------
  |  Branch (631:17): [True: 7, False: 459]
  ------------------
  632|      7|              break;         // a huge skip count busy-loops to timeout
  633|    459|            std::getline(ifs, line);
  634|    459|          }
  635|    555|        }
  636|       |
  637|  32.6k|        if (line.substr(0, 3) == "A  " && line.size() > 3) { //alias
  ------------------
  |  Branch (637:13): [True: 6.25k, False: 26.4k]
  |  Branch (637:13): [True: 6.12k, False: 26.5k]
  |  Branch (637:43): [True: 6.12k, False: 126]
  ------------------
  638|  6.12k|          int atomnum = ReadUIntField((line.substr(2, line.size() - 2)).c_str());
  639|       |          //MDL documentation just has alias text here( x... ). A single line is assumed,
  640|       |          //and the alias is ignored if the line starts with ? or * or is blank .
  641|  6.12k|          std::getline(ifs, line);
  642|  6.12k|          if(!line.empty() && line.at(0) != '?' && line.at(0) != '*') {
  ------------------
  |  Branch (642:14): [True: 5.53k, False: 593]
  |  Branch (642:31): [True: 4.85k, False: 681]
  |  Branch (642:52): [True: 4.73k, False: 120]
  ------------------
  643|  4.73k|            OBAtom* at = mol.GetAtom(atomnum);
  644|  4.73k|            if (at) { // dkoes - only expand wild cards
  ------------------
  |  Branch (644:17): [True: 3.79k, False: 935]
  ------------------
  645|  3.79k|              AliasData* ad = new AliasData();
  646|  3.79k|              ad->SetAlias(line);
  647|  3.79k|              ad->SetOrigin(fileformatInput);
  648|  3.79k|              at->SetData(ad);
  649|       |              //at->SetAtomicNum(0); Now leave element as found
  650|       |              //The alias has now been added as a dummy atom with a AliasData object.
  651|       |              //Delay the chemical interpretation until the rest of the molecule has been built
  652|       |              //dkoes - only expand alias if referenced atom is wild card
  653|       |              //this is necessary since this field is used to store atom names (at least in the PDB)
  654|  3.79k|              if(at->GetAtomicNum() == 0)
  ------------------
  |  Branch (654:18): [True: 3.38k, False: 412]
  ------------------
  655|  3.38k|                aliases.push_back(make_pair(ad, at));
  656|  3.79k|            }
  657|  4.73k|          }
  658|  6.12k|          continue;
  659|  6.12k|        }
  660|       |
  661|  26.5k|        if ((line.substr(0, 6) != "M  CHG") && (line.substr(0, 6) != "M  RAD") &&
  ------------------
  |  Branch (661:13): [True: 26.5k, False: 2]
  |  Branch (661:13): [True: 26.5k, False: 19]
  |  Branch (661:48): [True: 26.5k, False: 1]
  ------------------
  662|  26.5k|            (line.substr(0, 6) != "M  ISO") && (line.substr(0, 6) != "M  ZCH") &&
  ------------------
  |  Branch (662:13): [True: 26.5k, False: 0]
  |  Branch (662:48): [True: 26.5k, False: 3]
  ------------------
  663|  26.5k|            (line.substr(0, 6) != "M  HYD") && (line.substr(0, 6) != "M  ZBO") &&
  ------------------
  |  Branch (663:13): [True: 26.5k, False: 1]
  |  Branch (663:48): [True: 26.5k, False: 7]
  ------------------
  664|  26.5k|            (line.substr(0, 6) != "M  RGP"))
  ------------------
  |  Branch (664:13): [True: 26.5k, False: 5]
  ------------------
  665|  26.5k|          continue;
  666|     19|        unsigned int n = 0;
  667|     19|        if (line.size() >= 9)
  ------------------
  |  Branch (667:13): [True: 17, False: 2]
  ------------------
  668|     17|          n = ReadUIntField((line.substr(6, 3)).c_str()); //entries on this line
  669|     19|        if (n <= 0 || n > 99 || 6+n*8 > line.size()) { //catch ill-formed line
  ------------------
  |  Branch (669:13): [True: 8, False: 11]
  |  Branch (669:23): [True: 4, False: 7]
  |  Branch (669:33): [True: 2, False: 5]
  ------------------
  670|     14|          obErrorLog.ThrowError(__FUNCTION__, "Error in line: Invalid number following 'M  CHG', 'M  ISO' or 'M  RAD' specification (must be an integer in range 1 to 8)\n" + line, obError);
  671|     14|          return false;
  672|     14|        }
  673|      5|        if (n > 8) {
  ------------------
  |  Branch (673:13): [True: 2, False: 3]
  ------------------
  674|      2|          obErrorLog.ThrowError(__FUNCTION__, "Invalid line: too many items, only 8 items are allowed:\n" + line, obWarning);
  675|      2|        }
  676|      5|        int pos = 10;
  677|      5|        for (; n > 0; n--, pos += 8) {
  ------------------
  |  Branch (677:16): [True: 5, False: 0]
  ------------------
  678|      5|          int number = ReadUIntField((line.substr(pos,3)).c_str());
  679|      5|          int value = ReadUIntField((line.substr(pos+4,3)).c_str());
  680|      5|          if (line.substr(3, 3) == "ZBO") {
  ------------------
  |  Branch (680:15): [True: 2, False: 3]
  ------------------
  681|      2|            OBBond *bo;
  682|      2|            if (number == 0 || (bo = mol.GetBond(number-1)) == nullptr) {
  ------------------
  |  Branch (682:17): [True: 1, False: 1]
  |  Branch (682:32): [True: 1, False: 0]
  ------------------
  683|      2|              obErrorLog.ThrowError(__FUNCTION__, "Error in line:\n" + line, obError);
  684|      2|              return false;
  685|      2|            }
  686|      0|            bo->SetBondOrder(value);
  687|      0|            foundZBO = true;
  688|      3|          } else {
  689|      3|            OBAtom *at;
  690|      3|            if (number == 0 || (at = mol.GetAtom(number)) == nullptr) {
  ------------------
  |  Branch (690:17): [True: 2, False: 1]
  |  Branch (690:32): [True: 1, False: 0]
  ------------------
  691|      3|              obErrorLog.ThrowError(__FUNCTION__, "Error in line:\n" + line, obError);
  692|      3|              return false;
  693|      3|            }
  694|      0|            if (line.substr(3, 3) == "RAD") {
  ------------------
  |  Branch (694:17): [True: 0, False: 0]
  ------------------
  695|      0|              at->SetSpinMultiplicity(value);
  696|      0|              foundCHG = true;
  697|      0|            } else if (line.substr(3, 3) == "CHG") {
  ------------------
  |  Branch (697:24): [True: 0, False: 0]
  ------------------
  698|       |              // TODO: CHG should appear before ZCH, but should we check just in case?
  699|      0|              at->SetFormalCharge(value);
  700|      0|              foundCHG = true;
  701|      0|            } else if (line.substr(3, 3) == "ISO") {
  ------------------
  |  Branch (701:24): [True: 0, False: 0]
  ------------------
  702|      0|              if (value)
  ------------------
  |  Branch (702:19): [True: 0, False: 0]
  ------------------
  703|      0|                at->SetIsotope(value);
  704|      0|              foundISO = true;
  705|      0|            } else if (line.substr(3, 3) == "ZCH") {
  ------------------
  |  Branch (705:24): [True: 0, False: 0]
  ------------------
  706|       |              // ZCH contains corrections to CHG, including zero values for atoms that
  707|       |              // were set as charged in CHG and should now have zero charge
  708|      0|              at->SetFormalCharge(value);
  709|      0|              foundZCH = true;
  710|      0|            } else if (line.substr(3, 3) == "HYD") {
  ------------------
  |  Branch (710:24): [True: 0, False: 0]
  ------------------
  711|       |              // Save HYD counts to hydMap, and use to set implicit valence later on
  712|      0|              hydMap[number] = value;
  713|      0|              foundHYD = true;
  714|      0|            } else if (line.substr(3, 3) == "RGP") {
  ------------------
  |  Branch (714:24): [True: 0, False: 0]
  ------------------
  715|       |              // Numbered R groups were already added to AliasData as R#. Now we
  716|       |              // need to correct these to R1, etc.
  717|      0|              if (!at->HasData(AliasDataType))
  ------------------
  |  Branch (717:19): [True: 0, False: 0]
  ------------------
  718|      0|                obErrorLog.ThrowError(__FUNCTION__, "Invalid line: M RGP must only refer to pseudoatoms\n" + line, obWarning);
  719|      0|              else {
  720|      0|                AliasData* ad = static_cast<AliasData*>(at->GetData(AliasDataType));
  721|      0|                char buffer[6];
  722|      0|                snprintf(buffer, 6, "R%d", value);
  723|      0|                ad->SetAlias(buffer);
  724|      0|              }
  725|      0|            }
  726|      0|          }
  727|      5|        }
  728|       |        // Lines setting several other properties are not implemented
  729|      5|      }
  730|       |
  731|       |      // if no 'M  ISO' properties are found, use the mass differences from the atom block
  732|  1.43k|      if (!foundISO)
  ------------------
  |  Branch (732:11): [True: 1.43k, False: 0]
  ------------------
  733|  5.62k|        FOR_ATOMS_OF_MOL (a, mol) {
  ------------------
  |  |  417|  1.43k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 5.62k, False: 1.43k]
  |  |  ------------------
  ------------------
  734|  5.62k|          int massDifference = massDiffs.at(a->GetIndex());
  735|  5.62k|          if (massDifference)
  ------------------
  |  Branch (735:15): [True: 584, False: 5.04k]
  ------------------
  736|    584|            a->SetIsotope((int)(OBElements::GetMass(a->GetAtomicNum()) + massDifference + 0.5));
  737|  5.62k|        }
  738|       |
  739|       |      // If no CHG, RAD, ZBO, ZCH or HYD properties are found, use the charges from the atom block
  740|  1.43k|      if (!foundCHG && !foundZCH && !foundZBO && !foundHYD)
  ------------------
  |  Branch (740:11): [True: 1.43k, False: 0]
  |  Branch (740:24): [True: 1.43k, False: 0]
  |  Branch (740:37): [True: 1.43k, False: 0]
  |  Branch (740:50): [True: 1.43k, False: 0]
  ------------------
  741|  5.62k|        FOR_ATOMS_OF_MOL (a, mol) {
  ------------------
  |  |  417|  1.43k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 5.62k, False: 1.43k]
  |  |  ------------------
  ------------------
  742|  5.62k|          charge = charges.at(a->GetIndex());
  743|  5.62k|          switch (charge) {
  ------------------
  |  Branch (743:19): [True: 5.37k, False: 256]
  ------------------
  744|  5.02k|            case 0: break;
  ------------------
  |  Branch (744:13): [True: 5.02k, False: 603]
  ------------------
  745|     35|            case 3: a->SetFormalCharge(1); break;
  ------------------
  |  Branch (745:13): [True: 35, False: 5.59k]
  ------------------
  746|    129|            case 2: a->SetFormalCharge(2); break;
  ------------------
  |  Branch (746:13): [True: 129, False: 5.49k]
  ------------------
  747|     99|            case 1: a->SetFormalCharge(3); break;
  ------------------
  |  Branch (747:13): [True: 99, False: 5.52k]
  ------------------
  748|     33|            case 5: a->SetFormalCharge(-1); break;
  ------------------
  |  Branch (748:13): [True: 33, False: 5.59k]
  ------------------
  749|     28|            case 6: a->SetFormalCharge(-2); break;
  ------------------
  |  Branch (749:13): [True: 28, False: 5.60k]
  ------------------
  750|     23|            case 7: a->SetFormalCharge(-3); break;
  ------------------
  |  Branch (750:13): [True: 23, False: 5.60k]
  ------------------
  751|  5.62k|          }
  752|  5.62k|        }
  753|  1.43k|    }
  754|       |
  755|       |    // Set up the updown map we are going to use to derive stereo info
  756|  1.43k|    FOR_BONDS_OF_MOL(bond, mol) {
  ------------------
  |  |  418|  1.43k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 0, False: 1.43k]
  |  |  ------------------
  ------------------
  757|      0|      OBStereo::BondDirection bd = OBStereo::NotStereo;;
  758|      0|      unsigned int flag = bond->GetFlags();
  759|      0|      if (flag & OBBond::Wedge)
  ------------------
  |  Branch (759:11): [True: 0, False: 0]
  ------------------
  760|      0|        bd = OBStereo::UpBond;
  761|      0|      if (flag & OBBond::Hash)
  ------------------
  |  Branch (761:11): [True: 0, False: 0]
  ------------------
  762|      0|        bd = OBStereo::DownBond;
  763|      0|      if (flag & OBBond::WedgeOrHash)
  ------------------
  |  Branch (763:11): [True: 0, False: 0]
  ------------------
  764|      0|        bd = OBStereo::UnknownDir;
  765|      0|      if (flag & OBBond::CisOrTrans && bond->GetBondOrder()==2)
  ------------------
  |  Branch (765:11): [True: 0, False: 0]
  |  Branch (765:40): [True: 0, False: 0]
  ------------------
  766|      0|        bd = OBStereo::UnknownDir;
  767|      0|      if (bd != OBStereo::NotStereo)
  ------------------
  |  Branch (767:11): [True: 0, False: 0]
  ------------------
  768|      0|        updown[&*bond] = bd;
  769|      0|    }
  770|       |
  771|       |    // Apply the MDL valence model (or ZBO valence model if ZBO/ZCH/HYD are present)
  772|  5.62k|    FOR_ATOMS_OF_MOL(atom, mol) {
  ------------------
  |  |  417|  1.43k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 5.62k, False: 1.43k]
  |  |  ------------------
  ------------------
  773|  5.62k|      unsigned int elem = atom->GetAtomicNum();
  774|  5.62k|      int charge = atom->GetFormalCharge();
  775|  5.62k|      OBBondIterator i;
  776|  5.62k|      unsigned int count = 0;
  777|  5.62k|      unsigned int expval = 0;
  778|  5.62k|      for (OBBond* bond = atom->BeginBond(i); bond; bond = atom->NextBond(i)) {
  ------------------
  |  Branch (778:47): [True: 0, False: 5.62k]
  ------------------
  779|      0|        expval += bond->GetBondOrder();
  780|      0|        count++;
  781|      0|      }
  782|  5.62k|      if (foundZBO || foundZCH || foundHYD) { // TODO: Fix this
  ------------------
  |  Branch (782:11): [True: 0, False: 5.62k]
  |  Branch (782:23): [True: 0, False: 5.62k]
  |  Branch (782:35): [True: 0, False: 5.62k]
  ------------------
  783|       |        // Use HYD count to SetImplicitValence if present, otherwise HYDValence model
  784|      0|        HYDMap::const_iterator hyd = hydMap.find(atom->GetIdx());
  785|      0|        if (hyd == hydMap.end()) {
  ------------------
  |  Branch (785:13): [True: 0, False: 0]
  ------------------
  786|      0|          unsigned int impval = HYDValence(elem, charge, expval);
  787|      0|          int nimpval = impval - expval;
  788|      0|          atom->SetImplicitHCount(nimpval > 0 ? nimpval : 0);
  ------------------
  |  Branch (788:35): [True: 0, False: 0]
  ------------------
  789|      0|        } else {
  790|      0|          atom->SetImplicitHCount(hyd->second); // TODO: I have no idea
  791|      0|        }
  792|  5.62k|      } else {
  793|       |        // By testing with Symyx Draw (Accelrys Draw 4.0), if the
  794|       |        // valence field is specified then the M RAD is ignored for
  795|       |        // the purposes of setting hydrogen count.
  796|       |        // So, if the valence field was specified use that, otherwise
  797|       |        // use the implicit valence adjusted by any M RAD.
  798|  5.62k|        std::map<OBAtom*, int>::const_iterator mit = specified_valence.find(&*atom);
  799|       |        // Signed: impval can legitimately drop below the explicit valence (a
  800|       |        // radical M RAD adjustment, or a specified valence lower than observed),
  801|       |        // and numH is then clamped to >= 0 below. Unsigned here would underflow.
  802|  5.62k|        int impval;
  803|  5.62k|        if (mit != specified_valence.end()) {
  ------------------
  |  Branch (803:13): [True: 1.08k, False: 4.54k]
  ------------------
  804|  1.08k|          impval = mit->second;
  805|  1.08k|          if (impval < expval) {
  ------------------
  |  Branch (805:15): [True: 0, False: 1.08k]
  ------------------
  806|      0|            errorMsg << "WARNING: Problem interpreting the valence field of an atom\n"
  807|      0|              "The valence field specifies a valence " << impval << " that is\n"
  808|      0|              "less than the observed explicit valence " << expval << ".\n";
  809|      0|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  810|      0|          }
  811|  1.08k|        }
  812|  4.54k|        else {
  813|  4.54k|          impval = MDLValence(elem, charge, expval);
  814|       |          // adjust for M RAD
  815|  4.54k|          int mult = atom->GetSpinMultiplicity();
  816|  4.54k|          int delta;
  817|  4.54k|          switch (mult) {
  818|  4.54k|          case 0:
  ------------------
  |  Branch (818:11): [True: 4.54k, False: 0]
  ------------------
  819|  4.54k|            delta = 0; break;
  820|      0|          case 1: case 3: //carbene
  ------------------
  |  Branch (820:11): [True: 0, False: 4.54k]
  |  Branch (820:19): [True: 0, False: 4.54k]
  ------------------
  821|      0|            delta = 2; break;
  822|      0|          case 2: //radical
  ------------------
  |  Branch (822:11): [True: 0, False: 4.54k]
  ------------------
  823|      0|            delta = 1; break;
  824|      0|          default: // >= 4, CH, Catom
  ------------------
  |  Branch (824:11): [True: 0, False: 4.54k]
  ------------------
  825|      0|            delta = mult - 1;
  826|  4.54k|          }
  827|  4.54k|          impval -= delta;
  828|  4.54k|        }
  829|  5.62k|        int numH = impval - static_cast<int>(expval);
  830|  5.62k|        atom->SetImplicitHCount(numH > 0 ? numH : 0);
  ------------------
  |  Branch (830:33): [True: 1.51k, False: 4.11k]
  ------------------
  831|  5.62k|      }
  832|  5.62k|    }
  833|       |
  834|       |    //alias expansion may need to look at coordinate array, so call
  835|       |    //endmodify to set mol->_c
  836|  1.43k|    mol.EndModify();
  837|       |
  838|       |    //Expand aliases (implicit hydrogens already set on these as read from SMILES)
  839|  5.19k|    for (vector<pair<AliasData*, OBAtom*> >::iterator iter = aliases.begin(); iter != aliases.end(); ++iter)
  ------------------
  |  Branch (839:79): [True: 3.75k, False: 1.43k]
  ------------------
  840|  3.75k|    {
  841|  3.75k|      AliasData* ad = (*iter).first;
  842|  3.75k|      unsigned atomnum = (*iter).second->GetIdx();
  843|  3.75k|      ad->Expand(mol, atomnum); //Make chemically meaningful, if possible.
  844|  3.75k|    }
  845|       |
  846|  1.43k|    if (comment.length()) {
  ------------------
  |  Branch (846:9): [True: 327, False: 1.10k]
  ------------------
  847|    327|      OBCommentData *cd = new OBCommentData;
  848|    327|      cd->SetData(comment);
  849|    327|      cd->SetOrigin(fileformatInput);
  850|    327|      mol.SetData(cd);
  851|    327|    }
  852|       |
  853|       |    //Get property lines
  854|  1.43k|    if(!ReadPropertyLines(ifs, mol)) {
  ------------------
  |  Branch (854:8): [True: 6, False: 1.42k]
  ------------------
  855|       |      //Has read the first line of the next reaction in RXN format
  856|      6|      pConv->AddOption("$RXNread");
  857|      6|      return true;
  858|      6|    }
  859|       |
  860|  1.42k|    if (mol.Has3D()) {
  ------------------
  |  Branch (860:9): [True: 40, False: 1.38k]
  ------------------
  861|     40|      if (!setDimension)
  ------------------
  |  Branch (861:11): [True: 39, False: 1]
  ------------------
  862|     39|        mol.SetDimension(3);
  863|       |      // use 3D coordinates to determine stereochemistry
  864|     40|      StereoFrom3D(&mol);
  865|     40|      OpenBabel::OBStereoFacade facade(&mol);
  866|       |
  867|     40|      if (pConv->IsOption("s", OBConversion::INOPTIONS)) { // Use the parities for tet stereo instead
  ------------------
  |  Branch (867:11): [True: 0, False: 40]
  ------------------
  868|      0|        TetStereoFromParity(mol, parities, true); // True means "delete existing TetStereo first"
  869|     40|      } else {
  870|       |        // Set stereo to unspecified for atom stereo parity 3 (1 & 2 determined from 3D coords)
  871|  1.24k|        for (std::size_t i = 0; i < parities.size(); ++i) {
  ------------------
  |  Branch (871:33): [True: 1.20k, False: 40]
  ------------------
  872|  1.20k|          if (parities[i] != Unknown)
  ------------------
  |  Branch (872:15): [True: 1.19k, False: 6]
  ------------------
  873|  1.19k|            continue;
  874|      6|          unsigned long atomId = mol.GetAtom(i+1)->GetId();
  875|      6|          OBTetrahedralStereo *ts = facade.GetTetrahedralStereo(atomId);
  876|      6|          if (!ts)
  ------------------
  |  Branch (876:15): [True: 6, False: 0]
  ------------------
  877|      6|            continue;
  878|      0|          OBTetrahedralStereo::Config config = ts->GetConfig();
  879|      0|          config.specified = false;
  880|      0|          ts->SetConfig(config);
  881|      0|        }
  882|     40|      }
  883|       |
  884|       |      // For unspecified cis/trans stereos, set their Configs to unspecified
  885|       |      // This should really be done in CisTransFrom3D like in CisTransFrom2D but can't change the API now :-/
  886|     40|      map<OBBond*, OBStereo::BondDirection>::const_iterator bd_it;
  887|     40|      for(bd_it=updown.begin(); bd_it!=updown.end(); ++bd_it) {
  ------------------
  |  Branch (887:33): [True: 0, False: 40]
  ------------------
  888|      0|        OBBond* bond = bd_it->first;
  889|      0|        if (bond->GetBondOrder()!=2 || bd_it->second != OBStereo::UnknownDir)
  ------------------
  |  Branch (889:13): [True: 0, False: 0]
  |  Branch (889:40): [True: 0, False: 0]
  ------------------
  890|      0|          continue; // Only continue for those double bonds with UnknownDir
  891|      0|        OBCisTransStereo* ct = facade.GetCisTransStereo(bond->GetId());
  892|      0|        if (ct) {
  ------------------
  |  Branch (892:13): [True: 0, False: 0]
  ------------------
  893|      0|          OBCisTransStereo::Config config = ct->GetConfig();
  894|      0|          config.specified = false;
  895|      0|          ct->SetConfig(config);
  896|      0|        }
  897|      0|      }
  898|     40|    } else
  899|  1.38k|    if (mol.Has2D()) {
  ------------------
  |  Branch (899:9): [True: 644, False: 744]
  ------------------
  900|    644|      if (!setDimension)
  ------------------
  |  Branch (900:11): [True: 643, False: 1]
  ------------------
  901|    643|        mol.SetDimension(2);
  902|       |      // use 2D coordinates + hash/wedge to determine stereochemistry
  903|    644|      StereoFrom2D(&mol, &updown);
  904|    644|      if (pConv->IsOption("s", OBConversion::INOPTIONS)) { // Use the parities for tet stereo instead
  ------------------
  |  Branch (904:11): [True: 0, False: 644]
  ------------------
  905|      0|        TetStereoFromParity(mol, parities, true); // True means "delete existing TetStereo first"
  906|      0|      }
  907|    744|    } else { // 0D
  908|    744|      if (!setDimension)
  ------------------
  |  Branch (908:11): [True: 742, False: 2]
  ------------------
  909|    742|        mol.SetDimension(0);
  910|       |      // Atom parities from the MOL file will be used to create tetrahedral stereochemistry
  911|       |      // unless you specified the S option (but not s).
  912|    744|      if (pConv->IsOption("s", OBConversion::INOPTIONS) || pConv->IsOption("S", OBConversion::INOPTIONS) == nullptr)
  ------------------
  |  Branch (912:11): [True: 0, False: 744]
  |  Branch (912:60): [True: 744, False: 0]
  ------------------
  913|    744|        TetStereoFromParity(mol, parities);
  914|    744|      StereoFrom0D(&mol);
  915|    744|      if (pConv->IsOption("S", OBConversion::INOPTIONS) == nullptr)
  ------------------
  |  Branch (915:11): [True: 744, False: 0]
  ------------------
  916|    744|        CisTransFromUpDown(&mol, &updown);
  917|    744|    }
  918|       |
  919|  1.42k|    return true;
  920|  1.43k|  }
_ZN9OpenBabel9MDLFormat14ReadV3000BlockERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEERNS_5OBMolEPNS_12OBConversionEb:
 1426|     23|  {
 1427|     23|    bool ret = true;
 1428|     23|    do
 1429|     23|      {
 1430|     23|        if(!ReadV3000Line(ifs,vs)) return false;
  ------------------
  |  Branch (1430:12): [True: 22, False: 1]
  ------------------
 1431|      1|        if(vs[1]=="END") return true;
  ------------------
  |  Branch (1431:12): [True: 1, False: 0]
  ------------------
 1432|       |        // ReadV3000Line only guarantees vs.size() >= 2. Block-level
 1433|       |        // directives use vs[2] and vs[3]; bail out on truncated lines.
 1434|      0|        if(vs.size() < 3) return false;
  ------------------
  |  Branch (1434:12): [True: 0, False: 0]
  ------------------
 1435|      0|        if(vs[2]=="LINKNODE"){continue;} //not implemented
  ------------------
  |  Branch (1435:12): [True: 0, False: 0]
  ------------------
 1436|      0|        if(vs[2]!="BEGIN") return false;
  ------------------
  |  Branch (1436:12): [True: 0, False: 0]
  ------------------
 1437|       |
 1438|      0|        if(vs.size() < 4) return false;
  ------------------
  |  Branch (1438:12): [True: 0, False: 0]
  ------------------
 1439|      0|        if(vs[3]=="CTAB")
  ------------------
  |  Branch (1439:12): [True: 0, False: 0]
  ------------------
 1440|      0|          {
 1441|      0|            if(!ReadV3000Line(ifs,vs) || vs[2]!="COUNTS") return false;
  ------------------
  |  Branch (1441:16): [True: 0, False: 0]
  |  Branch (1441:42): [True: 0, False: 0]
  ------------------
 1442|      0|            int natoms = ReadUIntField(vs[3].c_str());
 1443|       |            //int nbonds = ReadUIntField(vs[4].c_str());
 1444|       |            //int chiral = ReadUIntField(vs[7].c_str());
 1445|       |            //number of s groups, number of 3D constraints, chiral flag and regno not yet implemented
 1446|      0|            mol.ReserveAtoms(natoms);
 1447|       |
 1448|      0|            ReadV3000Block(ifs,mol,pConv,true);//go for contained blocks
 1449|       |            // The recursive call shares the member `vs` and may leave it
 1450|       |            // with fewer than 4 tokens; bounds-check before comparing.
 1451|      0|            if(vs.size() < 4) return false;
  ------------------
  |  Branch (1451:16): [True: 0, False: 0]
  ------------------
 1452|      0|            if(vs[2]!="END" && vs[3]!="CTAB") return false;
  ------------------
  |  Branch (1452:16): [True: 0, False: 0]
  |  Branch (1452:32): [True: 0, False: 0]
  ------------------
 1453|      0|            ret= true;
 1454|      0|          }
 1455|      0|        else if(vs[3]=="ATOM")
  ------------------
  |  Branch (1455:17): [True: 0, False: 0]
  ------------------
 1456|      0|          ret = ReadAtomBlock(ifs,mol,pConv);
 1457|      0|        else if(vs[3]=="BOND")
  ------------------
  |  Branch (1457:17): [True: 0, False: 0]
  ------------------
 1458|      0|          ret = ReadBondBlock(ifs,mol,pConv);
 1459|       |        //else if(vs[3]=="COLLECTION")
 1460|       |        //  ret = ReadCollectionBlock(ifs,mol,pConv);
 1461|      0|        else if(vs[3]=="RGROUP")
  ------------------
  |  Branch (1461:17): [True: 0, False: 0]
  ------------------
 1462|      0|          ret = ReadRGroupBlock(ifs,mol,pConv);
 1463|      0|        else
 1464|      0|          ret =ReadUnimplementedBlock(ifs,mol,pConv,vs[3]);
 1465|       |        /*
 1466|       |          else if(vs[3]=="3D")
 1467|       |          //not currently implemented
 1468|       |          else if(vs[3]=="SGROUP")
 1469|       |          //not currently implemented
 1470|       |        */
 1471|      0|      }while(ret && ifs.good());
  ------------------
  |  Branch (1471:14): [True: 0, False: 0]
  |  Branch (1471:21): [True: 0, False: 0]
  ------------------
 1472|       |    //  if(is3D){mol.SetDimension(3);cout<<"SetDim to 3"<<endl;}
 1473|       |    //  else if(is2D){mol.SetDimension(2);cout<<"SetDim to 2"<<endl;}
 1474|      0|    return true;
 1475|     23|  }
_ZN9OpenBabel9MDLFormat13ReadV3000LineERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEERNS1_6vectorINS1_12basic_stringIcS4_NS1_9allocatorIcEEEENS9_ISB_EEEE:
 1479|     23|  {
 1480|     23|    char buffer[BUFF_SIZE];
 1481|     23|    if(!ifs.getline(buffer,BUFF_SIZE)) return false;
  ------------------
  |  |  771|     23|#define BUFF_SIZE 32768
  ------------------
  |  Branch (1481:8): [True: 1, False: 22]
  ------------------
 1482|     22|    tokenize(vs,buffer," \t\n\r");
 1483|     22|    if (vs.size() < 2) return false; // timvdm 18/06/2008
  ------------------
  |  Branch (1483:9): [True: 4, False: 18]
  ------------------
 1484|     18|    if(vs[0]!="M" || (vs[1]!="V30" && vs[1]!="END")) return false;
  ------------------
  |  Branch (1484:8): [True: 8, False: 10]
  |  Branch (1484:23): [True: 10, False: 0]
  |  Branch (1484:39): [True: 8, False: 2]
  ------------------
 1485|       |
 1486|       |    // Iterative continuation-line handling (avoids stack overflow on crafted input)
 1487|      2|    size_t len = strlen(buffer);
 1488|     24|    while(len > 0 && buffer[len-1] == '-') {
  ------------------
  |  Branch (1488:11): [True: 24, False: 0]
  |  Branch (1488:22): [True: 23, False: 1]
  ------------------
 1489|     23|      if(!ifs.getline(buffer,BUFF_SIZE)) return false;
  ------------------
  |  |  771|     23|#define BUFF_SIZE 32768
  ------------------
  |  Branch (1489:10): [True: 0, False: 23]
  ------------------
 1490|     23|      vector<string> vsx;
 1491|     23|      tokenize(vsx,buffer," \t\n\r");
 1492|     23|      if(vsx.size() < 2) return false;
  ------------------
  |  Branch (1492:10): [True: 1, False: 22]
  ------------------
 1493|     22|      if(vsx[0]!="M" || (vsx[1]!="V30" && vsx[1]!="END")) return false;
  ------------------
  |  Branch (1493:10): [True: 0, False: 22]
  |  Branch (1493:26): [True: 22, False: 0]
  |  Branch (1493:43): [True: 0, False: 22]
  ------------------
 1494|     22|      if(vsx.size() > 3)
  ------------------
  |  Branch (1494:10): [True: 4, False: 18]
  ------------------
 1495|      4|        vs.insert(vs.end(),vsx.begin()+3,vsx.end());
 1496|     22|      len = strlen(buffer);
 1497|     22|    }
 1498|      1|    return true;
 1499|      2|  }
_ZN9OpenBabel9MDLFormat19TetStereoFromParityERNS_5OBMolERNSt3__16vectorINS0_6ParityENS3_9allocatorIS5_EEEEb:
 1871|    744|  {
 1872|    744|    if (deleteExisting) { // Remove any existing tet stereo
  ------------------
  |  Branch (1872:9): [True: 0, False: 744]
  ------------------
 1873|      0|      std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 1874|      0|      for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data)
  ------------------
  |  Branch (1874:72): [True: 0, False: 0]
  ------------------
 1875|      0|        if (((OBStereoBase*)*data)->GetType() == OBStereo::Tetrahedral)
  ------------------
  |  Branch (1875:13): [True: 0, False: 0]
  ------------------
 1876|      0|          mol.DeleteData(*data);
 1877|      0|    }
 1878|       |
 1879|  1.89k|    for (unsigned long i=0;i<parity.size();i++) {
  ------------------
  |  Branch (1879:28): [True: 1.14k, False: 744]
  ------------------
 1880|  1.14k|      if (parity[i] == NotStereo)
  ------------------
  |  Branch (1880:11): [True: 1.07k, False: 76]
  ------------------
 1881|  1.07k|        continue;
 1882|       |
 1883|     76|      OBStereo::Refs refs;
 1884|     76|      unsigned long towards = OBStereo::ImplicitRef;
 1885|     76|      FOR_NBORS_OF_ATOM(nbr, mol.GetAtomById(i)) {
  ------------------
  |  |  419|     76|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 76]
  |  |  ------------------
  ------------------
 1886|      0|        if (nbr->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (1886:13): [True: 0, False: 0]
  ------------------
 1887|      0|          refs.push_back(nbr->GetId());
 1888|      0|        else
 1889|      0|          towards = nbr->GetId(); // Look towards the H
 1890|      0|      }
 1891|       |
 1892|     76|      sort(refs.begin(), refs.end());
 1893|     76|      if (refs.size() == 4) { // No implicit ref or H present
  ------------------
  |  Branch (1893:11): [True: 0, False: 76]
  ------------------
 1894|      0|        towards = refs.back();
 1895|      0|        refs.pop_back();
 1896|      0|      }
 1897|       |
 1898|     76|      OBStereo::Winding winding = OBStereo::Clockwise;
 1899|     76|      if (parity[i] == AntiClockwise)
  ------------------
  |  Branch (1899:11): [True: 57, False: 19]
  ------------------
 1900|     57|        winding = OBStereo::AntiClockwise;
 1901|     76|      OBTetrahedralStereo::Config cfg = OBTetrahedralStereo::Config(i, towards, refs,
 1902|     76|                                                                    winding, OBStereo::ViewTowards);
 1903|     76|      if (parity[i] == Unknown)
  ------------------
  |  Branch (1903:11): [True: 5, False: 71]
  ------------------
 1904|      5|        cfg.specified = false;
 1905|       |
 1906|     76|      OBTetrahedralStereo *th = new OBTetrahedralStereo(&mol);
 1907|     76|      th->SetConfig(cfg);
 1908|     76|      mol.SetData(th);
 1909|     76|    }
 1910|    744|  }
_ZN9OpenBabel9MDLFormat12ReadIntFieldEPKc:
 1913|  53.1k|  {
 1914|  53.1k|    char *end;
 1915|  53.1k|    if (s == nullptr) return 0;
  ------------------
  |  Branch (1915:9): [True: 0, False: 53.1k]
  ------------------
 1916|  53.1k|    int n = strtol(s, &end, 10);
 1917|  53.1k|    if (*end != '\0' && *end != ' ') return 0;
  ------------------
  |  Branch (1917:9): [True: 42.6k, False: 10.5k]
  |  Branch (1917:25): [True: 41.2k, False: 1.35k]
  ------------------
 1918|  11.8k|    return n;
 1919|  53.1k|  }
_ZN9OpenBabel9MDLFormat13ReadUIntFieldEPKc:
 1922|  28.6k|  {
 1923|  28.6k|    char *end;
 1924|  28.6k|    if (s == nullptr) return 0;
  ------------------
  |  Branch (1924:9): [True: 0, False: 28.6k]
  ------------------
 1925|  28.6k|    int n = strtoul(s, &end, 10);
 1926|  28.6k|    if (*end != '\0' && *end != ' ') return 0;
  ------------------
  |  Branch (1926:9): [True: 19.3k, False: 9.34k]
  |  Branch (1926:25): [True: 17.3k, False: 2.00k]
  ------------------
 1927|  11.3k|    return n;
 1928|  28.6k|  }
_ZN9OpenBabel9MDLFormat17ReadPropertyLinesERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEERNS_5OBMolE:
 1931|  1.43k|  {
 1932|  1.43k|    string line;
 1933|  23.6k|    while (std::getline(ifs, line)) {
  ------------------
  |  Branch (1933:12): [True: 22.2k, False: 1.42k]
  ------------------
 1934|  22.2k|      if (line.substr(0, 4) == "$RXN")
  ------------------
  |  Branch (1934:11): [True: 6, False: 22.2k]
  ------------------
 1935|      6|        return false; //Has read the first line of the next reaction in RXN format
 1936|       |
 1937|  22.2k|      if (line.find("<") != string::npos) {
  ------------------
  |  Branch (1937:11): [True: 5.84k, False: 16.4k]
  ------------------
 1938|  5.84k|        size_t lt = line.find("<")+1;
 1939|  5.84k|        size_t rt = line.find_last_of(">");
 1940|  5.84k|        string attr = line.substr(lt, rt - lt);
 1941|       |
 1942|       |        // sometimes we can hit more data than BUFF_SIZE, so we'll use a std::string
 1943|  5.84k|        string buff;
 1944|  21.5k|        while (std::getline(ifs, line)) {
  ------------------
  |  Branch (1944:16): [True: 21.3k, False: 158]
  ------------------
 1945|  21.3k|          Trim(line);
 1946|  21.3k|          if (line.size()) {
  ------------------
  |  Branch (1946:15): [True: 15.6k, False: 5.68k]
  ------------------
 1947|  15.6k|            buff.append(line);
 1948|  15.6k|            buff += "\n";
 1949|  15.6k|          } else
 1950|  5.68k|            break;
 1951|  21.3k|        }
 1952|  5.84k|        Trim(buff);
 1953|       |
 1954|  5.84k|        OBPairData *dp = new OBPairData;
 1955|  5.84k|        dp->SetAttribute(attr);
 1956|  5.84k|        dp->SetValue(buff);
 1957|  5.84k|        dp->SetOrigin(fileformatInput);
 1958|  5.84k|        mol.SetData(dp);
 1959|       |
 1960|       |        // Pass false to skip the newline-replacement pass; we only need
 1961|       |        // to know whether the title is empty. Avoids quadratic work in
 1962|       |        // GetTitle when the title already contains newlines.
 1963|  5.84k|        if(!strcasecmp(attr.c_str(),"NAME") && *mol.GetTitle(false)=='\0')
  ------------------
  |  Branch (1963:12): [True: 1.56k, False: 4.28k]
  |  Branch (1963:48): [True: 329, False: 1.23k]
  ------------------
 1964|    329|          mol.SetTitle(buff);
 1965|  5.84k|      }
 1966|  22.2k|      if (line.substr(0, 4) ==  "$$$$")
  ------------------
  |  Branch (1966:11): [True: 1, False: 22.2k]
  ------------------
 1967|      1|        break;
 1968|  22.2k|      if (line.substr(0, 4) == "$MOL")
  ------------------
  |  Branch (1968:11): [True: 1, False: 22.2k]
  ------------------
 1969|      1|        break;
 1970|  22.2k|    }
 1971|  1.42k|    return true;
 1972|  1.43k|  }
_ZN9OpenBabel9MDLFormat12TestForAliasERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_6OBAtomERNS1_6vectorINS1_4pairIPNS_9AliasDataESB_EENS5_ISG_EEEE:
 1975|  2.05k|  {
 1976|       |  /*If symbol is R R' R'' R# R� R�� or Rn Rnn where n is an digit
 1977|       |    the atom is added to the alias list and the atomic number set to zero. Returns false.
 1978|       |    Otherwise, e.g Rh or Ru, returns true.
 1979|       |  */
 1980|  2.05k|    if(symbol.size()==1 || isdigit(symbol[1]) || symbol[1]=='\'' || symbol[1]=='\xa2' || symbol[1]=='#')
  ------------------
  |  Branch (1980:8): [True: 1.58k, False: 468]
  |  Branch (1980:28): [True: 58, False: 410]
  |  Branch (1980:50): [True: 6, False: 404]
  |  Branch (1980:69): [True: 1, False: 403]
  |  Branch (1980:90): [True: 3, False: 400]
  ------------------
 1981|  1.65k|    {
 1982|  1.65k|      AliasData* ad = new AliasData();
 1983|  1.65k|      ad->SetAlias(symbol);
 1984|  1.65k|      ad->SetOrigin(fileformatInput);
 1985|  1.65k|      at->SetData(ad);
 1986|  1.65k|      at->SetAtomicNum(0);
 1987|       |      //The alias has now been added as a dummy atom with a AliasData object.
 1988|       |      //Delay the chemical interpretation until the rest of the molecule has been built
 1989|  1.65k|      aliases.push_back(make_pair(ad, at));
 1990|  1.65k|      return false;
 1991|  1.65k|    }
 1992|    400|    return true;
 1993|  2.05k|  }
_ZN9OpenBabel9MDLFormat18CisTransFromUpDownEPNS_5OBMolEPNSt3__13mapIPNS_6OBBondENS_8OBStereo13BondDirectionENS3_4lessIS6_EENS3_9allocatorINS3_4pairIKS6_S8_EEEEEE:
 1996|    744|  {
 1997|       |    // Create a vector of CisTransStereo objects for the molecule
 1998|       |
 1999|       |    // Loop across the known cistrans bonds, updating them if necessary
 2000|    744|    std::vector<OBGenericData*>::iterator data;
 2001|    744|    std::vector<OBGenericData*> stereoData = mol->GetAllData(OBGenericDataType::StereoData);
 2002|    744|    for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (2002:37): [True: 0, False: 744]
  ------------------
 2003|      0|      if (static_cast<OBStereoBase*>(*data)->GetType() != OBStereo::CisTrans)
  ------------------
  |  Branch (2003:11): [True: 0, False: 0]
  ------------------
 2004|      0|        continue;
 2005|       |
 2006|      0|      OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 2007|      0|      OBCisTransStereo::Config cfg = ct->GetConfig();
 2008|      0|      OBAtom *a1 = mol->GetAtomById(cfg.begin);
 2009|      0|      OBAtom *a2 = mol->GetAtomById(cfg.end);
 2010|       |
 2011|      0|      OBBond* dbl_bond = mol->GetBond(a1, a2);
 2012|       |
 2013|       |      // Get the bonds of neighbors of atom1 and atom2
 2014|      0|      OBBond *a1_b1 = nullptr, *a1_b2 = nullptr, *a2_b1 = nullptr, *a2_b2 = nullptr;
 2015|      0|      OBStereo::BondDirection a1_stereo, a2_stereo;
 2016|       |
 2017|      0|      FOR_BONDS_OF_ATOM(bi, a1) {
  ------------------
  |  |  420|      0|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2018|      0|        OBBond *b = &(*bi);
 2019|      0|        if (b == dbl_bond) continue;  // skip the double bond we're working on
  ------------------
  |  Branch (2019:13): [True: 0, False: 0]
  ------------------
 2020|      0|        if (a1_b1 == nullptr && updown->find(b) != updown->end())
  ------------------
  |  Branch (2020:13): [True: 0, False: 0]
  |  Branch (2020:13): [True: 0, False: 0]
  |  Branch (2020:33): [True: 0, False: 0]
  ------------------
 2021|      0|        {
 2022|      0|          a1_b1 = b;    // remember a stereo bond of Atom1
 2023|      0|          a1_stereo = (*updown)[b];
 2024|      0|        }
 2025|      0|        else
 2026|      0|          a1_b2 = b;    // remember a 2nd bond of Atom1
 2027|      0|      }
 2028|       |
 2029|      0|      FOR_BONDS_OF_ATOM(bi, a2) {
  ------------------
  |  |  420|      0|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2030|      0|        OBBond *b = &(*bi);
 2031|      0|        if (b == dbl_bond) continue;
  ------------------
  |  Branch (2031:13): [True: 0, False: 0]
  ------------------
 2032|      0|        if (a2_b1 == nullptr && updown->find(b) != updown->end())
  ------------------
  |  Branch (2032:13): [True: 0, False: 0]
  |  Branch (2032:13): [True: 0, False: 0]
  |  Branch (2032:33): [True: 0, False: 0]
  ------------------
 2033|      0|        {
 2034|      0|          a2_b1 = b;    // remember a stereo bond of Atom2
 2035|      0|          a2_stereo = (*updown)[b];
 2036|      0|        }
 2037|      0|        else
 2038|      0|          a2_b2 = b;    // remember a 2nd bond of Atom2
 2039|      0|      }
 2040|       |
 2041|      0|      if (a1_b1 == nullptr || a2_b1 == nullptr) continue; // No cis/trans
  ------------------
  |  Branch (2041:11): [True: 0, False: 0]
  |  Branch (2041:31): [True: 0, False: 0]
  ------------------
 2042|       |
 2043|      0|      cfg.specified = true;
 2044|       |
 2045|       |      // a1_b2 and/or a2_b2 will be NULL if there are bonds to implicit hydrogens
 2046|      0|      unsigned int second = (a1_b2 == nullptr) ? OBStereo::ImplicitRef : a1_b2->GetNbrAtom(a1)->GetId();
  ------------------
  |  Branch (2046:29): [True: 0, False: 0]
  ------------------
 2047|      0|      unsigned int fourth = (a2_b2 == nullptr) ? OBStereo::ImplicitRef : a2_b2->GetNbrAtom(a2)->GetId();
  ------------------
  |  Branch (2047:29): [True: 0, False: 0]
  ------------------
 2048|       |
 2049|       |      // If a1_stereo==a2_stereo, this means cis for a1_b1 and a2_b1.
 2050|      0|      if (a1_stereo == a2_stereo)
  ------------------
  |  Branch (2050:11): [True: 0, False: 0]
  ------------------
 2051|      0|        cfg.refs = OBStereo::MakeRefs(a1_b1->GetNbrAtom(a1)->GetId(), second,
 2052|      0|                                      fourth, a2_b1->GetNbrAtom(a2)->GetId());
 2053|      0|      else
 2054|      0|        cfg.refs = OBStereo::MakeRefs(a1_b1->GetNbrAtom(a1)->GetId(), second,
 2055|      0|                                      a2_b1->GetNbrAtom(a2)->GetId(), fourth);
 2056|      0|      if (a1_stereo == OBStereo::UnknownDir || a2_stereo == OBStereo::UnknownDir)
  ------------------
  |  Branch (2056:11): [True: 0, False: 0]
  |  Branch (2056:48): [True: 0, False: 0]
  ------------------
 2057|      0|        cfg.specified = false;
 2058|       |      // FIXME:: Handle specified unknown stereo on the dbl bond itself
 2059|       |
 2060|      0|      ct->SetConfig(cfg);
 2061|      0|    }
 2062|    744|  }
_ZN9OpenBabel9MOLFormatC2Ev:
  175|      2|      {
  176|      2|        OBConversion::RegisterFormat("mol",this, "chemical/x-mdl-molfile");
  177|      2|        OBConversion::RegisterFormat("mdl",this, "chemical/x-mdl-molfile");
  178|      2|        OBConversion::RegisterOptionParam("2", this);
  179|      2|        OBConversion::RegisterOptionParam("3", this);
  180|      2|      }
_ZN9OpenBabel8SDFormatC2Ev:
  191|      2|      {
  192|      2|        OBConversion::RegisterFormat("sd",this, "chemical/x-mdl-sdfile");
  193|      2|        OBConversion::RegisterFormat("sdf",this, "chemical/x-mdl-sdfile");
  194|      2|      }
mdlformat.cpp:_ZN9OpenBabelL22SetAtomicNumAndIsotopeEPNS_6OBAtomEPKc:
  220|  14.9k|  {
  221|  14.9k|    const char* p = symbol;
  222|  14.9k|    switch (p[0]) {
  ------------------
  |  Branch (222:13): [True: 365, False: 14.5k]
  ------------------
  223|     31|    case 'D':
  ------------------
  |  Branch (223:5): [True: 31, False: 14.9k]
  ------------------
  224|     31|      if (p[1] == '\0') {
  ------------------
  |  Branch (224:11): [True: 18, False: 13]
  ------------------
  225|     18|        patom->SetIsotope(2);
  226|     18|        patom->SetAtomicNum(1);
  227|     18|        return;
  228|     18|      }
  229|     13|      break;
  230|    334|    case 'T':
  ------------------
  |  Branch (230:5): [True: 334, False: 14.6k]
  ------------------
  231|    334|      if (p[1] == '\0') {
  ------------------
  |  Branch (231:11): [True: 53, False: 281]
  ------------------
  232|     53|        patom->SetIsotope(3);
  233|     53|        patom->SetAtomicNum(1);
  234|     53|        return;
  235|     53|      }
  236|    281|      break;
  237|  14.9k|    }
  238|  14.8k|    patom->SetAtomicNum(OBElements::GetAtomicNum(symbol));
  239|  14.8k|  }
_ZN9OpenBabel9MDLFormat5FlagsEv:
  118|  3.86k|      unsigned int Flags() override { return DEFAULTFORMAT | ZEROATOMSOK; }
  ------------------
  |  |   40|  3.86k|#define DEFAULTFORMAT   0x4000
  ------------------
                    unsigned int Flags() override { return DEFAULTFORMAT | ZEROATOMSOK; }
  ------------------
  |  |   34|  3.86k|#define ZEROATOMSOK     0x08
  ------------------

mdlformat.cpp:_ZL10MDLValencejij:
   21|  4.54k|{
   22|  4.54k|  switch (elem) {
  ------------------
  |  Branch (22:11): [True: 484, False: 4.06k]
  ------------------
   23|     57|  case  1:  // H
  ------------------
  |  Branch (23:3): [True: 57, False: 4.48k]
  ------------------
   24|     59|  case  3:  // Li
  ------------------
  |  Branch (24:3): [True: 2, False: 4.54k]
  ------------------
   25|     64|  case 11:  // Na
  ------------------
  |  Branch (25:3): [True: 5, False: 4.54k]
  ------------------
   26|     66|  case 19:  // K
  ------------------
  |  Branch (26:3): [True: 2, False: 4.54k]
  ------------------
   27|     68|  case 37:  // Rb
  ------------------
  |  Branch (27:3): [True: 2, False: 4.54k]
  ------------------
   28|     78|  case 55:  // Cs
  ------------------
  |  Branch (28:3): [True: 10, False: 4.53k]
  ------------------
   29|     85|  case 87:  // Fr
  ------------------
  |  Branch (29:3): [True: 7, False: 4.53k]
  ------------------
   30|     85|    if (q == 0 && val <= 1)
  ------------------
  |  Branch (30:9): [True: 81, False: 4]
  |  Branch (30:19): [True: 81, False: 0]
  ------------------
   31|     81|      return 1;
   32|      4|    break;
   33|       |
   34|      4|  case  4:  // Be
  ------------------
  |  Branch (34:3): [True: 1, False: 4.54k]
  ------------------
   35|      8|  case 12:  // Mg
  ------------------
  |  Branch (35:3): [True: 7, False: 4.53k]
  ------------------
   36|      9|  case 20:  // Ca
  ------------------
  |  Branch (36:3): [True: 1, False: 4.54k]
  ------------------
   37|     10|  case 38:  // Sr
  ------------------
  |  Branch (37:3): [True: 1, False: 4.54k]
  ------------------
   38|     17|  case 56:  // Ba
  ------------------
  |  Branch (38:3): [True: 7, False: 4.53k]
  ------------------
   39|     39|  case 88:  // Ra
  ------------------
  |  Branch (39:3): [True: 22, False: 4.52k]
  ------------------
   40|     39|    switch (q) {
  ------------------
  |  Branch (40:13): [True: 33, False: 6]
  ------------------
   41|     31|    case 0:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (41:5): [True: 31, False: 8]
  |  Branch (41:18): [True: 31, False: 0]
  ------------------
   42|      2|    case 1:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (42:5): [True: 2, False: 37]
  |  Branch (42:18): [True: 2, False: 0]
  ------------------
   43|     39|    }
   44|      6|    break;
   45|       |
   46|     90|  case  5:  // B
  ------------------
  |  Branch (46:3): [True: 90, False: 4.45k]
  ------------------
   47|     90|    switch (q) {
  ------------------
  |  Branch (47:13): [True: 74, False: 16]
  ------------------
   48|      0|    case -4:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (48:5): [True: 0, False: 90]
  |  Branch (48:19): [True: 0, False: 0]
  ------------------
   49|      1|    case -3:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (49:5): [True: 1, False: 89]
  |  Branch (49:19): [True: 1, False: 0]
  ------------------
   50|      2|    case -2:  if (val <= 3) return 3;
  ------------------
  |  Branch (50:5): [True: 2, False: 88]
  |  Branch (50:19): [True: 2, False: 0]
  ------------------
   51|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (51:19): [True: 0, False: 0]
  ------------------
   52|      3|    case -1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (52:5): [True: 3, False: 87]
  |  Branch (52:19): [True: 3, False: 0]
  ------------------
   53|     12|    case  0:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (53:5): [True: 12, False: 78]
  |  Branch (53:19): [True: 12, False: 0]
  ------------------
   54|      1|    case  1:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (54:5): [True: 1, False: 89]
  |  Branch (54:19): [True: 1, False: 0]
  ------------------
   55|     55|    case  2:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (55:5): [True: 55, False: 35]
  |  Branch (55:19): [True: 55, False: 0]
  ------------------
   56|     90|    }
   57|     16|    break;
   58|       |
   59|     16|  case  6:  // C
  ------------------
  |  Branch (59:3): [True: 10, False: 4.53k]
  ------------------
   60|     10|    switch (q) {
  ------------------
  |  Branch (60:13): [True: 10, False: 0]
  ------------------
   61|      1|    case -3:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (61:5): [True: 1, False: 9]
  |  Branch (61:19): [True: 1, False: 0]
  ------------------
   62|      1|    case -2:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (62:5): [True: 1, False: 9]
  |  Branch (62:19): [True: 1, False: 0]
  ------------------
   63|      1|    case -1:  if (val <= 3) return 3;
  ------------------
  |  Branch (63:5): [True: 1, False: 9]
  |  Branch (63:19): [True: 1, False: 0]
  ------------------
   64|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (64:19): [True: 0, False: 0]
  ------------------
   65|      4|    case  0:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (65:5): [True: 4, False: 6]
  |  Branch (65:19): [True: 4, False: 0]
  ------------------
   66|      1|    case  1:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (66:5): [True: 1, False: 9]
  |  Branch (66:19): [True: 1, False: 0]
  ------------------
   67|      1|    case  2:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (67:5): [True: 1, False: 9]
  |  Branch (67:19): [True: 1, False: 0]
  ------------------
   68|      1|    case  3:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (68:5): [True: 1, False: 9]
  |  Branch (68:19): [True: 1, False: 0]
  ------------------
   69|     10|    }
   70|      0|    break;
   71|       |
   72|     24|  case  7:  // N
  ------------------
  |  Branch (72:3): [True: 24, False: 4.52k]
  ------------------
   73|     24|    switch (q) {
  ------------------
  |  Branch (73:13): [True: 23, False: 1]
  ------------------
   74|      1|    case -2:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (74:5): [True: 1, False: 23]
  |  Branch (74:19): [True: 1, False: 0]
  ------------------
   75|      1|    case -1:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (75:5): [True: 1, False: 23]
  |  Branch (75:19): [True: 1, False: 0]
  ------------------
   76|     16|    case  0:  if (val <= 3) return 3;
  ------------------
  |  Branch (76:5): [True: 16, False: 8]
  |  Branch (76:19): [True: 16, False: 0]
  ------------------
   77|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (77:19): [True: 0, False: 0]
  ------------------
   78|      2|    case  1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (78:5): [True: 2, False: 22]
  |  Branch (78:19): [True: 2, False: 0]
  ------------------
   79|      1|    case  2:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (79:5): [True: 1, False: 23]
  |  Branch (79:19): [True: 1, False: 0]
  ------------------
   80|      2|    case  3:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (80:5): [True: 2, False: 22]
  |  Branch (80:19): [True: 2, False: 0]
  ------------------
   81|      0|    case  4:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (81:5): [True: 0, False: 24]
  |  Branch (81:19): [True: 0, False: 0]
  ------------------
   82|     24|    }
   83|      1|    break;
   84|       |
   85|     67|  case  8:  // O
  ------------------
  |  Branch (85:3): [True: 67, False: 4.47k]
  ------------------
   86|     67|    switch (q) {
  ------------------
  |  Branch (86:13): [True: 64, False: 3]
  ------------------
   87|      1|    case -1:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (87:5): [True: 1, False: 66]
  |  Branch (87:19): [True: 1, False: 0]
  ------------------
   88|      3|    case  0:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (88:5): [True: 3, False: 64]
  |  Branch (88:19): [True: 3, False: 0]
  ------------------
   89|      1|    case  1:  if (val <= 3) return 3;
  ------------------
  |  Branch (89:5): [True: 1, False: 66]
  |  Branch (89:19): [True: 1, False: 0]
  ------------------
   90|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (90:19): [True: 0, False: 0]
  ------------------
   91|      3|    case  2:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (91:5): [True: 3, False: 64]
  |  Branch (91:19): [True: 3, False: 0]
  ------------------
   92|     56|    case  3:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (92:5): [True: 56, False: 11]
  |  Branch (92:19): [True: 56, False: 0]
  ------------------
   93|      0|    case  4:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (93:5): [True: 0, False: 67]
  |  Branch (93:19): [True: 0, False: 0]
  ------------------
   94|      0|    case  5:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (94:5): [True: 0, False: 67]
  |  Branch (94:19): [True: 0, False: 0]
  ------------------
   95|     67|    }
   96|      3|    break;
   97|       |
   98|     14|  case  9:  // F
  ------------------
  |  Branch (98:3): [True: 14, False: 4.53k]
  ------------------
   99|     14|    switch (q) {
  ------------------
  |  Branch (99:13): [True: 12, False: 2]
  ------------------
  100|      3|    case  0:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (100:5): [True: 3, False: 11]
  |  Branch (100:19): [True: 3, False: 0]
  ------------------
  101|      4|    case  1:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (101:5): [True: 4, False: 10]
  |  Branch (101:19): [True: 4, False: 0]
  ------------------
  102|      2|    case  2:  if (val <= 3) return 3;
  ------------------
  |  Branch (102:5): [True: 2, False: 12]
  |  Branch (102:19): [True: 2, False: 0]
  ------------------
  103|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (103:19): [True: 0, False: 0]
  ------------------
  104|      3|    case  3:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (104:5): [True: 3, False: 11]
  |  Branch (104:19): [True: 3, False: 0]
  ------------------
  105|      0|    case  4:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (105:5): [True: 0, False: 14]
  |  Branch (105:19): [True: 0, False: 0]
  ------------------
  106|      0|    case  5:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (106:5): [True: 0, False: 14]
  |  Branch (106:19): [True: 0, False: 0]
  ------------------
  107|      0|    case  6:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (107:5): [True: 0, False: 14]
  |  Branch (107:19): [True: 0, False: 0]
  ------------------
  108|     14|    }
  109|      2|    break;
  110|       |
  111|      8|  case 13:  // Al
  ------------------
  |  Branch (111:3): [True: 8, False: 4.53k]
  ------------------
  112|      8|    switch (q) {
  ------------------
  |  Branch (112:13): [True: 7, False: 1]
  ------------------
  113|      0|    case -4:  if (val <= 1) return 1;
  ------------------
  |  Branch (113:5): [True: 0, False: 8]
  |  Branch (113:19): [True: 0, False: 0]
  ------------------
  114|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (114:19): [True: 0, False: 0]
  ------------------
  115|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (115:19): [True: 0, False: 0]
  ------------------
  116|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (116:19): [True: 0, False: 0]
  ------------------
  117|      1|    case -3:  if (val <= 2) return 2;
  ------------------
  |  Branch (117:5): [True: 1, False: 7]
  |  Branch (117:19): [True: 1, False: 0]
  ------------------
  118|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (118:19): [True: 0, False: 0]
  ------------------
  119|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (119:19): [True: 0, False: 0]
  ------------------
  120|      1|    case -2:  if (val <= 3) return 3;
  ------------------
  |  Branch (120:5): [True: 1, False: 7]
  |  Branch (120:19): [True: 1, False: 0]
  ------------------
  121|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (121:19): [True: 0, False: 0]
  ------------------
  122|      1|    case -1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (122:5): [True: 1, False: 7]
  |  Branch (122:19): [True: 1, False: 0]
  ------------------
  123|      2|    case  0:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (123:5): [True: 2, False: 6]
  |  Branch (123:19): [True: 2, False: 0]
  ------------------
  124|      1|    case  1:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (124:5): [True: 1, False: 7]
  |  Branch (124:19): [True: 1, False: 0]
  ------------------
  125|      1|    case  2:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (125:5): [True: 1, False: 7]
  |  Branch (125:19): [True: 1, False: 0]
  ------------------
  126|      8|    }
  127|      1|    break;
  128|       |
  129|      9|  case 14:  // Si
  ------------------
  |  Branch (129:3): [True: 9, False: 4.53k]
  ------------------
  130|      9|    switch (q) {
  ------------------
  |  Branch (130:13): [True: 9, False: 0]
  ------------------
  131|      1|    case -3:  if (val <= 1) return 1;
  ------------------
  |  Branch (131:5): [True: 1, False: 8]
  |  Branch (131:19): [True: 1, False: 0]
  ------------------
  132|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (132:19): [True: 0, False: 0]
  ------------------
  133|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (133:19): [True: 0, False: 0]
  ------------------
  134|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (134:19): [True: 0, False: 0]
  ------------------
  135|      1|    case -2:  if (val <= 2) return 2;
  ------------------
  |  Branch (135:5): [True: 1, False: 8]
  |  Branch (135:19): [True: 1, False: 0]
  ------------------
  136|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (136:19): [True: 0, False: 0]
  ------------------
  137|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (137:19): [True: 0, False: 0]
  ------------------
  138|      1|    case -1:  if (val <= 3) return 3;
  ------------------
  |  Branch (138:5): [True: 1, False: 8]
  |  Branch (138:19): [True: 1, False: 0]
  ------------------
  139|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (139:19): [True: 0, False: 0]
  ------------------
  140|      3|    case  0:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (140:5): [True: 3, False: 6]
  |  Branch (140:19): [True: 3, False: 0]
  ------------------
  141|      1|    case  1:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (141:5): [True: 1, False: 8]
  |  Branch (141:19): [True: 1, False: 0]
  ------------------
  142|      1|    case  2:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (142:5): [True: 1, False: 8]
  |  Branch (142:19): [True: 1, False: 0]
  ------------------
  143|      1|    case  3:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (143:5): [True: 1, False: 8]
  |  Branch (143:19): [True: 1, False: 0]
  ------------------
  144|      9|    }
  145|      0|    break;
  146|       |
  147|     10|  case 15:  // P
  ------------------
  |  Branch (147:3): [True: 10, False: 4.53k]
  ------------------
  148|     10|    switch (q) {
  ------------------
  |  Branch (148:13): [True: 9, False: 1]
  ------------------
  149|      1|    case -2:  if (val <= 1) return 1;
  ------------------
  |  Branch (149:5): [True: 1, False: 9]
  |  Branch (149:19): [True: 1, False: 0]
  ------------------
  150|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (150:19): [True: 0, False: 0]
  ------------------
  151|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (151:19): [True: 0, False: 0]
  ------------------
  152|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (152:19): [True: 0, False: 0]
  ------------------
  153|      1|    case -1:  if (val <= 2) return 2;
  ------------------
  |  Branch (153:5): [True: 1, False: 9]
  |  Branch (153:19): [True: 1, False: 0]
  ------------------
  154|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (154:19): [True: 0, False: 0]
  ------------------
  155|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (155:19): [True: 0, False: 0]
  ------------------
  156|      3|    case  0:  if (val <= 3) return 3;
  ------------------
  |  Branch (156:5): [True: 3, False: 7]
  |  Branch (156:19): [True: 3, False: 0]
  ------------------
  157|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (157:19): [True: 0, False: 0]
  ------------------
  158|      2|    case  1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (158:5): [True: 2, False: 8]
  |  Branch (158:19): [True: 2, False: 0]
  ------------------
  159|      1|    case  2:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (159:5): [True: 1, False: 9]
  |  Branch (159:19): [True: 1, False: 0]
  ------------------
  160|      1|    case  3:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (160:5): [True: 1, False: 9]
  |  Branch (160:19): [True: 1, False: 0]
  ------------------
  161|      0|    case  4:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (161:5): [True: 0, False: 10]
  |  Branch (161:19): [True: 0, False: 0]
  ------------------
  162|     10|    }
  163|      1|    break;
  164|       |
  165|     10|  case 16:  // S
  ------------------
  |  Branch (165:3): [True: 10, False: 4.53k]
  ------------------
  166|     10|    switch (q) {
  ------------------
  |  Branch (166:13): [True: 8, False: 2]
  ------------------
  167|      1|    case -1:  if (val <= 1) return 1;
  ------------------
  |  Branch (167:5): [True: 1, False: 9]
  |  Branch (167:19): [True: 1, False: 0]
  ------------------
  168|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (168:19): [True: 0, False: 0]
  ------------------
  169|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (169:19): [True: 0, False: 0]
  ------------------
  170|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (170:19): [True: 0, False: 0]
  ------------------
  171|      4|    case  0:  if (val <= 2) return 2;
  ------------------
  |  Branch (171:5): [True: 4, False: 6]
  |  Branch (171:19): [True: 4, False: 0]
  ------------------
  172|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (172:19): [True: 0, False: 0]
  ------------------
  173|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (173:19): [True: 0, False: 0]
  ------------------
  174|      1|    case  1:  if (val <= 3) return 3;
  ------------------
  |  Branch (174:5): [True: 1, False: 9]
  |  Branch (174:19): [True: 1, False: 0]
  ------------------
  175|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (175:19): [True: 0, False: 0]
  ------------------
  176|      1|    case  2:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (176:5): [True: 1, False: 9]
  |  Branch (176:19): [True: 1, False: 0]
  ------------------
  177|      1|    case  3:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (177:5): [True: 1, False: 9]
  |  Branch (177:19): [True: 1, False: 0]
  ------------------
  178|      0|    case  4:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (178:5): [True: 0, False: 10]
  |  Branch (178:19): [True: 0, False: 0]
  ------------------
  179|      0|    case  5:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (179:5): [True: 0, False: 10]
  |  Branch (179:19): [True: 0, False: 0]
  ------------------
  180|     10|    }
  181|      2|    break;
  182|       |
  183|      5|  case 17:  // Cl
  ------------------
  |  Branch (183:3): [True: 5, False: 4.54k]
  ------------------
  184|      5|    switch (q) {
  ------------------
  |  Branch (184:13): [True: 4, False: 1]
  ------------------
  185|      1|    case  0:  if (val <= 1) return 1;
  ------------------
  |  Branch (185:5): [True: 1, False: 4]
  |  Branch (185:19): [True: 1, False: 0]
  ------------------
  186|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (186:19): [True: 0, False: 0]
  ------------------
  187|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (187:19): [True: 0, False: 0]
  ------------------
  188|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (188:19): [True: 0, False: 0]
  ------------------
  189|      1|    case  1:  if (val <= 2) return 2;
  ------------------
  |  Branch (189:5): [True: 1, False: 4]
  |  Branch (189:19): [True: 1, False: 0]
  ------------------
  190|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (190:19): [True: 0, False: 0]
  ------------------
  191|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (191:19): [True: 0, False: 0]
  ------------------
  192|      1|    case  2:  if (val <= 3) return 3;
  ------------------
  |  Branch (192:5): [True: 1, False: 4]
  |  Branch (192:19): [True: 1, False: 0]
  ------------------
  193|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (193:19): [True: 0, False: 0]
  ------------------
  194|      1|    case  3:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (194:5): [True: 1, False: 4]
  |  Branch (194:19): [True: 1, False: 0]
  ------------------
  195|      0|    case  4:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (195:5): [True: 0, False: 5]
  |  Branch (195:19): [True: 0, False: 0]
  ------------------
  196|      0|    case  5:  if (val <= 2) return 2;  break;
  ------------------
  |  Branch (196:5): [True: 0, False: 5]
  |  Branch (196:19): [True: 0, False: 0]
  ------------------
  197|      0|    case  6:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (197:5): [True: 0, False: 5]
  |  Branch (197:19): [True: 0, False: 0]
  ------------------
  198|      5|    }
  199|      1|    break;
  200|       |
  201|      8|  case 31:  // Ga
  ------------------
  |  Branch (201:3): [True: 8, False: 4.53k]
  ------------------
  202|      8|    switch (q) {
  ------------------
  |  Branch (202:13): [True: 7, False: 1]
  ------------------
  203|      0|    case -4:  if (val <= 1) return 1;
  ------------------
  |  Branch (203:5): [True: 0, False: 8]
  |  Branch (203:19): [True: 0, False: 0]
  ------------------
  204|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (204:19): [True: 0, False: 0]
  ------------------
  205|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (205:19): [True: 0, False: 0]
  ------------------
  206|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (206:19): [True: 0, False: 0]
  ------------------
  207|      1|    case -3:  if (val <= 2) return 2;
  ------------------
  |  Branch (207:5): [True: 1, False: 7]
  |  Branch (207:19): [True: 1, False: 0]
  ------------------
  208|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (208:19): [True: 0, False: 0]
  ------------------
  209|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (209:19): [True: 0, False: 0]
  ------------------
  210|      2|    case -2:  if (val <= 3) return 3;
  ------------------
  |  Branch (210:5): [True: 2, False: 6]
  |  Branch (210:19): [True: 2, False: 0]
  ------------------
  211|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (211:19): [True: 0, False: 0]
  ------------------
  212|      1|    case -1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (212:5): [True: 1, False: 7]
  |  Branch (212:19): [True: 1, False: 0]
  ------------------
  213|      2|    case  0:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (213:5): [True: 2, False: 6]
  |  Branch (213:19): [True: 2, False: 0]
  ------------------
  214|      1|    case  2:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (214:5): [True: 1, False: 7]
  |  Branch (214:19): [True: 1, False: 0]
  ------------------
  215|      8|    }
  216|      1|    break;
  217|       |
  218|     11|  case 32:  // Ge
  ------------------
  |  Branch (218:3): [True: 11, False: 4.53k]
  ------------------
  219|     11|    switch (q) {
  ------------------
  |  Branch (219:13): [True: 10, False: 1]
  ------------------
  220|      1|    case -3:  if (val <= 1) return 1;
  ------------------
  |  Branch (220:5): [True: 1, False: 10]
  |  Branch (220:19): [True: 1, False: 0]
  ------------------
  221|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (221:19): [True: 0, False: 0]
  ------------------
  222|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (222:19): [True: 0, False: 0]
  ------------------
  223|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (223:19): [True: 0, False: 0]
  ------------------
  224|      1|    case -2:  if (val <= 2) return 2;
  ------------------
  |  Branch (224:5): [True: 1, False: 10]
  |  Branch (224:19): [True: 1, False: 0]
  ------------------
  225|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (225:19): [True: 0, False: 0]
  ------------------
  226|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (226:19): [True: 0, False: 0]
  ------------------
  227|      2|    case -1:  if (val <= 3) return 3;
  ------------------
  |  Branch (227:5): [True: 2, False: 9]
  |  Branch (227:19): [True: 2, False: 0]
  ------------------
  228|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (228:19): [True: 0, False: 0]
  ------------------
  229|      4|    case  0:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (229:5): [True: 4, False: 7]
  |  Branch (229:19): [True: 4, False: 0]
  ------------------
  230|      1|    case  1:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (230:5): [True: 1, False: 10]
  |  Branch (230:19): [True: 1, False: 0]
  ------------------
  231|      1|    case  3:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (231:5): [True: 1, False: 10]
  |  Branch (231:19): [True: 1, False: 0]
  ------------------
  232|     11|    }
  233|      1|    break;
  234|       |
  235|     10|  case 33:  // As
  ------------------
  |  Branch (235:3): [True: 10, False: 4.53k]
  ------------------
  236|     10|    switch (q) {
  ------------------
  |  Branch (236:13): [True: 8, False: 2]
  ------------------
  237|      1|    case -2:  if (val <= 1) return 1;
  ------------------
  |  Branch (237:5): [True: 1, False: 9]
  |  Branch (237:19): [True: 1, False: 0]
  ------------------
  238|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (238:19): [True: 0, False: 0]
  ------------------
  239|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (239:19): [True: 0, False: 0]
  ------------------
  240|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (240:19): [True: 0, False: 0]
  ------------------
  241|      1|    case -1:  if (val <= 2) return 2;
  ------------------
  |  Branch (241:5): [True: 1, False: 9]
  |  Branch (241:19): [True: 1, False: 0]
  ------------------
  242|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (242:19): [True: 0, False: 0]
  ------------------
  243|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (243:19): [True: 0, False: 0]
  ------------------
  244|      2|    case  0:  if (val <= 3) return 3;
  ------------------
  |  Branch (244:5): [True: 2, False: 8]
  |  Branch (244:19): [True: 2, False: 0]
  ------------------
  245|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (245:19): [True: 0, False: 0]
  ------------------
  246|      3|    case  1:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (246:5): [True: 3, False: 7]
  |  Branch (246:19): [True: 3, False: 0]
  ------------------
  247|      1|    case  2:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (247:5): [True: 1, False: 9]
  |  Branch (247:19): [True: 1, False: 0]
  ------------------
  248|      0|    case  4:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (248:5): [True: 0, False: 10]
  |  Branch (248:19): [True: 0, False: 0]
  ------------------
  249|     10|    }
  250|      2|    break;
  251|       |
  252|      6|  case 34:  // Se
  ------------------
  |  Branch (252:3): [True: 6, False: 4.54k]
  ------------------
  253|      6|    switch (q) {
  ------------------
  |  Branch (253:13): [True: 5, False: 1]
  ------------------
  254|      1|    case -1:  if (val <= 1) return 1;
  ------------------
  |  Branch (254:5): [True: 1, False: 5]
  |  Branch (254:19): [True: 1, False: 0]
  ------------------
  255|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (255:19): [True: 0, False: 0]
  ------------------
  256|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (256:19): [True: 0, False: 0]
  ------------------
  257|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (257:19): [True: 0, False: 0]
  ------------------
  258|      1|    case  0:  if (val <= 2) return 2;
  ------------------
  |  Branch (258:5): [True: 1, False: 5]
  |  Branch (258:19): [True: 1, False: 0]
  ------------------
  259|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (259:19): [True: 0, False: 0]
  ------------------
  260|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (260:19): [True: 0, False: 0]
  ------------------
  261|      1|    case  1:  if (val <= 3) return 3;
  ------------------
  |  Branch (261:5): [True: 1, False: 5]
  |  Branch (261:19): [True: 1, False: 0]
  ------------------
  262|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (262:19): [True: 0, False: 0]
  ------------------
  263|      1|    case  2:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (263:5): [True: 1, False: 5]
  |  Branch (263:19): [True: 1, False: 0]
  ------------------
  264|      1|    case  3:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (264:5): [True: 1, False: 5]
  |  Branch (264:19): [True: 1, False: 0]
  ------------------
  265|      0|    case  5:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (265:5): [True: 0, False: 6]
  |  Branch (265:19): [True: 0, False: 0]
  ------------------
  266|      6|    }
  267|      1|    break;
  268|       |
  269|      6|  case 35:  // Br
  ------------------
  |  Branch (269:3): [True: 6, False: 4.54k]
  ------------------
  270|      6|    switch (q) {
  ------------------
  |  Branch (270:13): [True: 5, False: 1]
  ------------------
  271|      1|    case  0:  if (val <= 1) return 1;
  ------------------
  |  Branch (271:5): [True: 1, False: 5]
  |  Branch (271:19): [True: 1, False: 0]
  ------------------
  272|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (272:19): [True: 0, False: 0]
  ------------------
  273|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (273:19): [True: 0, False: 0]
  ------------------
  274|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (274:19): [True: 0, False: 0]
  ------------------
  275|      1|    case  1:  if (val <= 2) return 2;
  ------------------
  |  Branch (275:5): [True: 1, False: 5]
  |  Branch (275:19): [True: 1, False: 0]
  ------------------
  276|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (276:19): [True: 0, False: 0]
  ------------------
  277|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (277:19): [True: 0, False: 0]
  ------------------
  278|      2|    case  2:  if (val <= 3) return 3;
  ------------------
  |  Branch (278:5): [True: 2, False: 4]
  |  Branch (278:19): [True: 2, False: 0]
  ------------------
  279|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (279:19): [True: 0, False: 0]
  ------------------
  280|      1|    case  3:  if (val <= 4) return 4;  break;
  ------------------
  |  Branch (280:5): [True: 1, False: 5]
  |  Branch (280:19): [True: 1, False: 0]
  ------------------
  281|      0|    case  4:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (281:5): [True: 0, False: 6]
  |  Branch (281:19): [True: 0, False: 0]
  ------------------
  282|      0|    case  6:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (282:5): [True: 0, False: 6]
  |  Branch (282:19): [True: 0, False: 0]
  ------------------
  283|      6|    }
  284|      1|    break;
  285|       |
  286|      6|  case 49:  // In
  ------------------
  |  Branch (286:3): [True: 6, False: 4.54k]
  ------------------
  287|      6|    switch (q) {
  ------------------
  |  Branch (287:13): [True: 5, False: 1]
  ------------------
  288|      0|    case -4:  if (val <= 1) return 1;
  ------------------
  |  Branch (288:5): [True: 0, False: 6]
  |  Branch (288:19): [True: 0, False: 0]
  ------------------
  289|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (289:19): [True: 0, False: 0]
  ------------------
  290|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (290:19): [True: 0, False: 0]
  ------------------
  291|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (291:19): [True: 0, False: 0]
  ------------------
  292|      1|    case -3:  if (val <= 2) return 2;
  ------------------
  |  Branch (292:5): [True: 1, False: 5]
  |  Branch (292:19): [True: 1, False: 0]
  ------------------
  293|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (293:19): [True: 0, False: 0]
  ------------------
  294|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (294:19): [True: 0, False: 0]
  ------------------
  295|      1|    case -2:  if (val <= 3) return 3;
  ------------------
  |  Branch (295:5): [True: 1, False: 5]
  |  Branch (295:19): [True: 1, False: 0]
  ------------------
  296|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (296:19): [True: 0, False: 0]
  ------------------
  297|      1|    case -1:  if (val <= 2) return 2;
  ------------------
  |  Branch (297:5): [True: 1, False: 5]
  |  Branch (297:19): [True: 1, False: 0]
  ------------------
  298|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (298:19): [True: 0, False: 0]
  ------------------
  299|      1|    case  0:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (299:5): [True: 1, False: 5]
  |  Branch (299:19): [True: 1, False: 0]
  ------------------
  300|      1|    case  2:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (300:5): [True: 1, False: 5]
  |  Branch (300:19): [True: 1, False: 0]
  ------------------
  301|      6|    }
  302|      1|    break;
  303|       |
  304|      7|  case 50:  // Sn
  ------------------
  |  Branch (304:3): [True: 7, False: 4.53k]
  ------------------
  305|     14|  case 82:  // Pb
  ------------------
  |  Branch (305:3): [True: 7, False: 4.53k]
  ------------------
  306|     14|    switch (q) {
  ------------------
  |  Branch (306:13): [True: 13, False: 1]
  ------------------
  307|      1|    case -3:  if (val <= 1) return 1;
  ------------------
  |  Branch (307:5): [True: 1, False: 13]
  |  Branch (307:19): [True: 1, False: 0]
  ------------------
  308|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (308:19): [True: 0, False: 0]
  ------------------
  309|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (309:19): [True: 0, False: 0]
  ------------------
  310|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (310:19): [True: 0, False: 0]
  ------------------
  311|      1|    case -2:  if (val <= 2) return 2;
  ------------------
  |  Branch (311:5): [True: 1, False: 13]
  |  Branch (311:19): [True: 1, False: 0]
  ------------------
  312|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (312:19): [True: 0, False: 0]
  ------------------
  313|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (313:19): [True: 0, False: 0]
  ------------------
  314|      1|    case -1:  if (val <= 3) return 3;
  ------------------
  |  Branch (314:5): [True: 1, False: 13]
  |  Branch (314:19): [True: 1, False: 0]
  ------------------
  315|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (315:19): [True: 0, False: 0]
  ------------------
  316|      8|    case  0:  if (val <= 2) return 2;
  ------------------
  |  Branch (316:5): [True: 8, False: 6]
  |  Branch (316:19): [True: 8, False: 0]
  ------------------
  317|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (317:19): [True: 0, False: 0]
  ------------------
  318|      1|    case  1:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (318:5): [True: 1, False: 13]
  |  Branch (318:19): [True: 1, False: 0]
  ------------------
  319|      1|    case  3:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (319:5): [True: 1, False: 13]
  |  Branch (319:19): [True: 1, False: 0]
  ------------------
  320|     14|    }
  321|      1|    break;
  322|       |
  323|      5|  case 51:  // Sb
  ------------------
  |  Branch (323:3): [True: 5, False: 4.54k]
  ------------------
  324|     11|  case 83:  // Bi
  ------------------
  |  Branch (324:3): [True: 6, False: 4.54k]
  ------------------
  325|     11|    switch (q) {
  ------------------
  |  Branch (325:13): [True: 10, False: 1]
  ------------------
  326|      1|    case -2:  if (val <= 1) return 1;
  ------------------
  |  Branch (326:5): [True: 1, False: 10]
  |  Branch (326:19): [True: 1, False: 0]
  ------------------
  327|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (327:19): [True: 0, False: 0]
  ------------------
  328|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (328:19): [True: 0, False: 0]
  ------------------
  329|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (329:19): [True: 0, False: 0]
  ------------------
  330|      2|    case -1:  if (val <= 2) return 2;
  ------------------
  |  Branch (330:5): [True: 2, False: 9]
  |  Branch (330:19): [True: 2, False: 0]
  ------------------
  331|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (331:19): [True: 0, False: 0]
  ------------------
  332|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (332:19): [True: 0, False: 0]
  ------------------
  333|      5|    case  0:  if (val <= 3) return 3;
  ------------------
  |  Branch (333:5): [True: 5, False: 6]
  |  Branch (333:19): [True: 5, False: 0]
  ------------------
  334|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (334:19): [True: 0, False: 0]
  ------------------
  335|      1|    case  1:  if (val <= 2) return 2;
  ------------------
  |  Branch (335:5): [True: 1, False: 10]
  |  Branch (335:19): [True: 1, False: 0]
  ------------------
  336|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (336:19): [True: 0, False: 0]
  ------------------
  337|      1|    case  2:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (337:5): [True: 1, False: 10]
  |  Branch (337:19): [True: 1, False: 0]
  ------------------
  338|      0|    case  4:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (338:5): [True: 0, False: 11]
  |  Branch (338:19): [True: 0, False: 0]
  ------------------
  339|     11|    }
  340|      1|    break;
  341|       |
  342|      5|  case 52:  // Te
  ------------------
  |  Branch (342:3): [True: 5, False: 4.54k]
  ------------------
  343|     10|  case 84:  // Po
  ------------------
  |  Branch (343:3): [True: 5, False: 4.54k]
  ------------------
  344|     10|    switch (q) {
  ------------------
  |  Branch (344:13): [True: 9, False: 1]
  ------------------
  345|      1|    case -1:  if (val <= 1) return 1;
  ------------------
  |  Branch (345:5): [True: 1, False: 9]
  |  Branch (345:19): [True: 1, False: 0]
  ------------------
  346|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (346:19): [True: 0, False: 0]
  ------------------
  347|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (347:19): [True: 0, False: 0]
  ------------------
  348|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (348:19): [True: 0, False: 0]
  ------------------
  349|      5|    case  0:  if (val <= 2) return 2;
  ------------------
  |  Branch (349:5): [True: 5, False: 5]
  |  Branch (349:19): [True: 5, False: 0]
  ------------------
  350|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (350:19): [True: 0, False: 0]
  ------------------
  351|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (351:19): [True: 0, False: 0]
  ------------------
  352|      1|    case  1:  if (val <= 3) return 3;
  ------------------
  |  Branch (352:5): [True: 1, False: 9]
  |  Branch (352:19): [True: 1, False: 0]
  ------------------
  353|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (353:19): [True: 0, False: 0]
  ------------------
  354|      1|    case  2:  if (val <= 2) return 2;
  ------------------
  |  Branch (354:5): [True: 1, False: 9]
  |  Branch (354:19): [True: 1, False: 0]
  ------------------
  355|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (355:19): [True: 0, False: 0]
  ------------------
  356|      1|    case  3:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (356:5): [True: 1, False: 9]
  |  Branch (356:19): [True: 1, False: 0]
  ------------------
  357|      0|    case  5:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (357:5): [True: 0, False: 10]
  |  Branch (357:19): [True: 0, False: 0]
  ------------------
  358|     10|    }
  359|      1|    break;
  360|       |
  361|     15|  case 53:  // I
  ------------------
  |  Branch (361:3): [True: 15, False: 4.53k]
  ------------------
  362|     21|  case 85:  // At
  ------------------
  |  Branch (362:3): [True: 6, False: 4.54k]
  ------------------
  363|     21|    switch (q) {
  ------------------
  |  Branch (363:13): [True: 20, False: 1]
  ------------------
  364|     14|    case  0:  if (val <= 1) return 1;
  ------------------
  |  Branch (364:5): [True: 14, False: 7]
  |  Branch (364:19): [True: 14, False: 0]
  ------------------
  365|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (365:19): [True: 0, False: 0]
  ------------------
  366|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (366:19): [True: 0, False: 0]
  ------------------
  367|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (367:19): [True: 0, False: 0]
  ------------------
  368|      1|    case  1:  if (val <= 2) return 2;
  ------------------
  |  Branch (368:5): [True: 1, False: 20]
  |  Branch (368:19): [True: 1, False: 0]
  ------------------
  369|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (369:19): [True: 0, False: 0]
  ------------------
  370|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (370:19): [True: 0, False: 0]
  ------------------
  371|      4|    case  2:  if (val <= 3) return 3;
  ------------------
  |  Branch (371:5): [True: 4, False: 17]
  |  Branch (371:19): [True: 4, False: 0]
  ------------------
  372|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (372:19): [True: 0, False: 0]
  ------------------
  373|      1|    case  3:  if (val <= 2) return 2;
  ------------------
  |  Branch (373:5): [True: 1, False: 20]
  |  Branch (373:19): [True: 1, False: 0]
  ------------------
  374|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (374:19): [True: 0, False: 0]
  ------------------
  375|      0|    case  4:  if (val <= 3) return 3;  break;
  ------------------
  |  Branch (375:5): [True: 0, False: 21]
  |  Branch (375:19): [True: 0, False: 0]
  ------------------
  376|      0|    case  6:  if (val <= 1) return 1;  break;
  ------------------
  |  Branch (376:5): [True: 0, False: 21]
  |  Branch (376:19): [True: 0, False: 0]
  ------------------
  377|     21|    }
  378|      1|    break;
  379|       |
  380|     10|  case 81:  // Tl
  ------------------
  |  Branch (380:3): [True: 10, False: 4.53k]
  ------------------
  381|     10|    switch (q) {
  ------------------
  |  Branch (381:13): [True: 9, False: 1]
  ------------------
  382|      0|    case -4:  if (val <= 1) return 1;
  ------------------
  |  Branch (382:5): [True: 0, False: 10]
  |  Branch (382:19): [True: 0, False: 0]
  ------------------
  383|      0|              if (val <= 3) return 3;
  ------------------
  |  Branch (383:19): [True: 0, False: 0]
  ------------------
  384|      0|              if (val <= 5) return 5;
  ------------------
  |  Branch (384:19): [True: 0, False: 0]
  ------------------
  385|      0|              if (val <= 7) return 7;  break;
  ------------------
  |  Branch (385:19): [True: 0, False: 0]
  ------------------
  386|      1|    case -3:  if (val <= 2) return 2;
  ------------------
  |  Branch (386:5): [True: 1, False: 9]
  |  Branch (386:19): [True: 1, False: 0]
  ------------------
  387|      0|              if (val <= 4) return 4;
  ------------------
  |  Branch (387:19): [True: 0, False: 0]
  ------------------
  388|      0|              if (val <= 6) return 6;  break;
  ------------------
  |  Branch (388:19): [True: 0, False: 0]
  ------------------
  389|      1|    case -2:  if (val <= 3) return 3;
  ------------------
  |  Branch (389:5): [True: 1, False: 9]
  |  Branch (389:19): [True: 1, False: 0]
  ------------------
  390|      0|              if (val <= 5) return 5;  break;
  ------------------
  |  Branch (390:19): [True: 0, False: 0]
  ------------------
  391|      3|    case -1:  if (val <= 2) return 2;
  ------------------
  |  Branch (391:5): [True: 3, False: 7]
  |  Branch (391:19): [True: 3, False: 0]
  ------------------
  392|      0|              if (val <= 4) return 4;  break;
  ------------------
  |  Branch (392:19): [True: 0, False: 0]
  ------------------
  393|      4|    case  0:  if (val <= 1) return 1;
  ------------------
  |  Branch (393:5): [True: 4, False: 6]
  |  Branch (393:19): [True: 4, False: 0]
  ------------------
  394|      0|              if (val <= 3) return 3;  break;
  ------------------
  |  Branch (394:19): [True: 0, False: 0]
  ------------------
  395|     10|    }
  396|      1|    break;
  397|       |
  398|  4.54k|  }
  399|  4.11k|  return val;
  400|  4.54k|}

_ZN9OpenBabel11mmCIFFormatC2Ev:
   41|      2|   { // Copied from the Chemical MIME Page at http://www.ch.ic.ac.uk/chemime/
   42|      2|     OBConversion::RegisterFormat("mcif", this, "chemical/x-mmcif");
   43|      2|     OBConversion::RegisterFormat("mmcif", this, "chemical/x-mmcif");
   44|       |     // Uncomment the following line, and this file will handle all CIF formats
   45|       |     // OBConversion::RegisterFormat("cif", this, "chemical/x-cif");
   46|       |
   47|      2|     OBConversion::RegisterOptionParam("s", this);
   48|      2|     OBConversion::RegisterOptionParam("p", this);
   49|      2|     OBConversion::RegisterOptionParam("b", this);
   50|      2|     OBConversion::RegisterOptionParam("w", this);
   51|      2|   }

_ZN9OpenBabel14MacroModFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("mmd",this, "chemical/x-macromodel-input");
   38|      2|      OBConversion::RegisterFormat("mmod",this, "chemical/x-macromodel-input");
   39|      2|    }
_ZN9OpenBabel14MacroModFormat5FlagsEv:
   57|      4|    {
   58|      4|      return READONEONLY;
  ------------------
  |  |   32|      4|#define READONEONLY     0x02
  ------------------
   59|      4|    }

_ZN9OpenBabel10MOL2FormatC2Ev:
   41|      2|    {
   42|      2|      OBConversion::RegisterFormat("mol2",this, "chemical/x-mol2");
   43|      2|      OBConversion::RegisterFormat("ml2",this);
   44|      2|      OBConversion::RegisterFormat("sy2",this);
   45|      2|      OBConversion::RegisterOptionParam("c", this, 0, OBConversion::INOPTIONS);
   46|      2|      OBConversion::RegisterOptionParam("c", this, 0, OBConversion::OUTOPTIONS);
   47|      2|      OBConversion::RegisterOptionParam("l", this, 0, OBConversion::OUTOPTIONS);
   48|      2|      OBConversion::RegisterOptionParam("u", this, 0, OBConversion::OUTOPTIONS);
   49|      2|    }

_ZN9OpenBabel14OBMoldenFormatC2Ev:
   58|      2|    {
   59|      2|        OBConversion::RegisterFormat( "molden", this );
   60|      2|        OBConversion::RegisterFormat( "mold", this );
   61|      2|        OBConversion::RegisterFormat( "molf", this );
   62|      2|    }
_ZN9OpenBabel14OBMoldenFormat5FlagsEv:
   86|      6|    {
   87|      6|        return READONEONLY | WRITEONEONLY ;
  ------------------
  |  |   32|      6|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | WRITEONEONLY ;
  ------------------
  |  |   36|      6|#define WRITEONEONLY    0x20
  ------------------
   88|      6|    }

_ZN9OpenBabel18MolproOutputFormatC2Ev:
   40|      2|    {
   41|      2|      OBConversion::RegisterFormat("mpo",this);
   42|      2|    }
_ZN9OpenBabel17MolproInputFormatC2Ev:
   76|      2|    {
   77|      2|      OBConversion::RegisterFormat("mp",this);
   78|      2|    }
_ZN9OpenBabel18MolproOutputFormat5FlagsEv:
   59|      2|    {
   60|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   61|      2|    }
_ZN9OpenBabel17MolproInputFormat5FlagsEv:
   93|      2|    {
   94|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   95|      2|    }

_ZN9OpenBabel15MolReportFormatC2Ev:
   37|      2|    {
   38|      2|      OBConversion::RegisterFormat("molreport",this);
   39|      2|    }
_ZN9OpenBabel15MolReportFormat5FlagsEv:
   82|      2|    {
   83|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   84|      2|    }

_ZN9OpenBabel11MOPACFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("mopout",this, "chemical/x-mopac-out");
   38|      2|      OBConversion::RegisterFormat("moo",this, "chemical/x-mopac-out");
   39|      2|    }
_ZN9OpenBabel15MOPACCARTFormatC2Ev:
  514|      2|    {
  515|      2|      OBConversion::RegisterFormat("mopcrt",this, "chemical/x-mopac-input");
  516|      2|      OBConversion::RegisterFormat("mop",this, "chemical/x-mopac-input");
  517|      2|      OBConversion::RegisterFormat("mpc",this, "chemical/x-mopac-input");
  518|       |      // Command-line keywords
  519|      2|      OBConversion::RegisterOptionParam("k", nullptr, 1, OBConversion::OUTOPTIONS);
  520|       |      // Command-line keyword file
  521|      2|      OBConversion::RegisterOptionParam("f", nullptr, 1, OBConversion::OUTOPTIONS);
  522|      2|    }
_ZN9OpenBabel14MOPACINTFormatC2Ev:
  849|      2|    {
  850|      2|      OBConversion::RegisterFormat("mopin", this, "chemical/x-mopac-input");
  851|       |      // Command-line keywords
  852|      2|      OBConversion::RegisterOptionParam("k", nullptr, 1, OBConversion::OUTOPTIONS);
  853|       |      // Command-line keyword file
  854|      2|      OBConversion::RegisterOptionParam("f", nullptr, 1, OBConversion::OUTOPTIONS);
  855|      2|    }
_ZN9OpenBabel11MOPACFormat5FlagsEv:
   51|      4|    {
   52|      4|      return NOTWRITABLE;
  ------------------
  |  |   35|      4|#define NOTWRITABLE     0x10
  ------------------
   53|      4|    }

_ZN9OpenBabel9MPDFormatC2Ev:
   44|      2|    {
   45|      2|      OBConversion::RegisterFormat("mpd",this);
   46|      2|      OBConversion::RegisterOptionParam("n", this);
   47|      2|      OBConversion::RegisterOptionParam("c", this);
   48|      2|      OBConversion::RegisterOptionParam("i", this);
   49|      2|    }
_ZN9OpenBabel9MPDFormat5FlagsEv:
   84|      2|    {                            // NOTREADABLE  READONEONLY  NOTWRITABLE  WRITEONEONLY
   85|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   86|      2|    }

_ZN9OpenBabel10MPQCFormatC2Ev:
   34|      2|    {
   35|      2|      OBConversion::RegisterFormat("mpqc",this);
   36|      2|    }
_ZN9OpenBabel15MPQCInputFormatC2Ev:
   73|      2|    {
   74|      2|      OBConversion::RegisterFormat("mpqcin",this);
   75|      2|    }
_ZN9OpenBabel10MPQCFormat5FlagsEv:
   54|      2|    {
   55|      2|      return NOTWRITABLE | READONEONLY;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
                    return NOTWRITABLE | READONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
   56|      2|    }
_ZN9OpenBabel15MPQCInputFormat5FlagsEv:
   91|      2|    {
   92|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   93|      2|    }

_ZN9OpenBabel9MSIFormatC2Ev:
   34|      2|    {
   35|      2|      OBConversion::RegisterFormat("msi", this, "chemical/x-msi-msi");
   36|      2|    }
_ZN9OpenBabel9MSIFormat5FlagsEv:
   54|      2|    {
   55|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   56|      2|    }

_ZN9OpenBabel12OBMSMSFormatC2Ev:
   55|      2|    {
   56|      2|        OpenBabel::OBConversion::RegisterFormat( "msms", this );
   57|      2|    }
_ZN9OpenBabel12OBMSMSFormat5FlagsEv:
   81|      2|    {
   82|      2|        return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
                      return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   83|      2|    }

_ZN9OpenBabel9NulFormatC2Ev:
   23|      2|  NulFormat() { OBConversion::RegisterFormat("nul",this); }
_ZN9OpenBabel9NulFormat5FlagsEv:
   27|      2|  unsigned int Flags() override { return NOTREADABLE; }
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------

_ZN9OpenBabel18NWChemOutputFormatC2Ev:
   43|      2|    {
   44|      2|      OBConversion::RegisterFormat("nwo",this);
   45|      2|    }
_ZN9OpenBabel17NWChemInputFormatC2Ev:
  136|      2|    {
  137|      2|      OBConversion::RegisterFormat("nw",this);
  138|      2|    }
_ZN9OpenBabel18NWChemOutputFormat5FlagsEv:
   66|      2|    {
   67|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   68|      2|    }
_ZN9OpenBabel17NWChemInputFormat5FlagsEv:
  153|      2|    {
  154|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
  155|      2|    }

_ZN9OpenBabel18OBOpenDXCubeFormatC2Ev:
   45|      2|    {
   46|      2|        OpenBabel::OBConversion::RegisterFormat( "dx", this );
   47|      2|    }
_ZN9OpenBabel18OBOpenDXCubeFormat5FlagsEv:
   73|      2|    {
   74|      2|      return READONEONLY | WRITEONEONLY | ZEROATOMSOK;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY | ZEROATOMSOK;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
                    return READONEONLY | WRITEONEONLY | ZEROATOMSOK;
  ------------------
  |  |   34|      2|#define ZEROATOMSOK     0x08
  ------------------
   75|      2|    }

_ZN9OpenBabel12OutputFormatC2Ev:
   37|      2|    {
   38|      2|      OBConversion::RegisterFormat("out", this);
   39|      2|      OBConversion::RegisterFormat("output", this);
   40|      2|      OBConversion::RegisterFormat("log", this);
   41|      2|      OBConversion::RegisterFormat("dat", this);
   42|      2|    }
_ZN9OpenBabel12OutputFormat5FlagsEv:
   63|      8|    {
   64|      8|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      8|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      8|#define NOTWRITABLE     0x10
  ------------------
   65|      8|    }

_ZN9OpenBabel13PCModelFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("pcm", this);
   37|      2|    }

_ZN9OpenBabel9PDBFormat12ReadMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
  122|  6.28k|  {
  123|       |
  124|  6.28k|    OBMol* pmol = pOb->CastAndClear<OBMol>();
  125|  6.28k|    if (pmol == nullptr)
  ------------------
  |  Branch (125:9): [True: 0, False: 6.28k]
  ------------------
  126|      0|      return false;
  127|       |
  128|       |    //Define some references so we can use the old parameter names
  129|  6.28k|    istream &ifs = *pConv->GetInStream();
  130|  6.28k|    OBMol &mol = *pmol;
  131|  6.28k|    const char* title = pConv->GetTitle();
  132|       |
  133|  6.28k|    int chainNum = 1;
  134|  6.28k|    char buffer[BUFF_SIZE] = {0,};
  135|  6.28k|    string line, key, value;
  136|  6.28k|    OBPairData *dp;
  137|       |
  138|  6.28k|    mol.SetTitle(title);
  139|       |    // We need to prevent chains perception routines from running while
  140|       |    // we are adding residues from the PDB file
  141|  6.28k|    mol.SetChainsPerceived();
  142|       |
  143|  6.28k|    mol.BeginModify();
  144|  6.28k|    bool ateend = false;
  145|   472k|    while (ifs.good() && ifs.getline(buffer,BUFF_SIZE))
  ------------------
  |  |  771|   466k|#define BUFF_SIZE 32768
  ------------------
  |  Branch (145:12): [True: 466k, False: 6.05k]
  |  Branch (145:26): [True: 466k, False: 33]
  ------------------
  146|   466k|      {
  147|   466k|        if (EQn(buffer,"ENDMDL",6)) {
  ------------------
  |  |  779|   466k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 36, False: 466k]
  |  |  ------------------
  ------------------
  148|     36|          ateend = true;
  149|     36|          break;
  150|     36|        }
  151|   466k|        if (EQn(buffer,"END",3)) {
  ------------------
  |  |  779|   466k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 32, False: 465k]
  |  |  ------------------
  ------------------
  152|       |          // eat anything until the next ENDMDL
  153|    420|          while (ifs.getline(buffer,BUFF_SIZE) && !EQn(buffer,"ENDMDL",6));
  ------------------
  |  |  771|    420|#define BUFF_SIZE 32768
  ------------------
                        while (ifs.getline(buffer,BUFF_SIZE) && !EQn(buffer,"ENDMDL",6));
  ------------------
  |  |  779|    391|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  ------------------
  |  Branch (153:18): [True: 391, False: 29]
  |  Branch (153:51): [True: 388, False: 3]
  ------------------
  154|     32|          ateend = true;
  155|     32|          break;
  156|     32|        }
  157|   465k|        if (EQn(buffer,"TER",3)) {
  ------------------
  |  |  779|   465k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 350, False: 465k]
  |  |  ------------------
  ------------------
  158|    350|          chainNum++;
  159|    350|          continue;
  160|    350|        }
  161|   465k|        if (EQn(buffer,"ATOM",4) || EQn(buffer,"HETATM",6))
  ------------------
  |  |  779|   931k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 358k, False: 107k]
  |  |  ------------------
  ------------------
                      if (EQn(buffer,"ATOM",4) || EQn(buffer,"HETATM",6))
  ------------------
  |  |  779|   107k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 3.75k, False: 103k]
  |  |  ------------------
  ------------------
  162|   361k|          {
  163|   361k|            if( ! parseAtomRecord(buffer,mol,chainNum))
  ------------------
  |  Branch (163:17): [True: 79.3k, False: 282k]
  ------------------
  164|  79.3k|              {
  165|  79.3k|                stringstream errorMsg;
  166|  79.3k|                errorMsg << "WARNING: Problems reading a PDB file\n"
  167|  79.3k|                         << "  Problems reading a ATOM/HETATM record.\n";
  168|  79.3k|                obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obError);
  169|  79.3k|              }
  170|   361k|            continue;
  171|   361k|          }
  172|       |
  173|   103k|        if (EQn(buffer,"CONECT",6)) {
  ------------------
  |  |  779|   103k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 5.44k, False: 98.3k]
  |  |  ------------------
  ------------------
  174|       |          // Don't parse a CONECT record if the user tells us to ignore them
  175|  5.44k|          if (!pConv->IsOption("c",OBConversion::INOPTIONS)) {
  ------------------
  |  Branch (175:15): [True: 5.44k, False: 0]
  ------------------
  176|  5.44k|            parseConectRecord(buffer,mol);
  177|  5.44k|            continue;
  178|  5.44k|          }
  179|  5.44k|        }
  180|       |
  181|       |        // crystal cells
  182|  98.3k|        if (EQn(buffer,"CRYST1",6)) {
  ------------------
  |  |  779|  98.3k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 904, False: 97.4k]
  |  |  ------------------
  ------------------
  183|    904|          float a = 0, b = 0, c = 0, alpha = 0, beta = 0, gamma = 0;
  184|    904|          string group = "";
  185|       |
  186|       |          // The six cell parameters are required; skip a malformed/truncated
  187|       |          // CRYST1 record rather than build a unit cell from stale values.
  188|    904|          if (sscanf (&(buffer[6]), "%9f%9f%9f%7f%7f%7f", &a, &b, &c,
  ------------------
  |  Branch (188:15): [True: 860, False: 44]
  ------------------
  189|    904|                      &alpha, &beta, &gamma) != 6)
  190|    860|            continue;
  191|       |          // The space group occupies columns 56-66 and is optional; only read
  192|       |          // it when the line is long enough, otherwise we would index past the
  193|       |          // end of the record into stale buffer memory.
  194|     44|          if (strlen(buffer) > 66) {
  ------------------
  |  Branch (194:15): [True: 43, False: 1]
  ------------------
  195|     43|            buffer[66] = '\0';
  196|     43|            group += &(buffer[55]);
  197|     43|            Trim (group);
  198|     43|            fixRhombohedralSpaceGroupReader(group);
  199|     43|          }
  200|       |
  201|     44|          OBUnitCell *pCell=new OBUnitCell;
  202|     44|          pCell->SetOrigin(fileformatInput);
  203|     44|          pCell->SetData(a,b,c,alpha,beta,gamma);
  204|     44|          pCell->SetSpaceGroup(group);
  205|     44|          pmol->SetData(pCell);
  206|     44|          continue;
  207|    904|        }
  208|       |
  209|       |        // another record type, add it as an OBPairData entry
  210|  97.4k|        line = buffer;
  211|       |        // if the file is valid, all lines should have more than 6 characters
  212|  97.4k|        if (line.length() < 6)
  ------------------
  |  Branch (212:13): [True: 132, False: 97.3k]
  ------------------
  213|    132|          {
  214|    132|            stringstream errorMsg;
  215|    132|            errorMsg << "ERROR: not a valid PDB file" << endl;
  216|    132|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obError);
  217|    132|            return false;
  218|    132|          }
  219|  97.3k|        key = line.substr(0,6); // the first 6 characters are the record name
  220|  97.3k|        Trim(key);
  221|  97.3k|        value = line.substr(6);
  222|       |
  223|       |        // We haven't found this record yet
  224|  97.3k|        if (!mol.HasData(key)) {
  ------------------
  |  Branch (224:13): [True: 27.2k, False: 70.0k]
  ------------------
  225|  27.2k|          dp = new OBPairData;
  226|  27.2k|          dp->SetAttribute(key);
  227|  27.2k|          dp->SetValue(value);
  228|  27.2k|          dp->SetOrigin(fileformatInput);
  229|  27.2k|          mol.SetData(dp);
  230|  27.2k|        }
  231|       |        // Add on additional lines
  232|  70.0k|        else {
  233|  70.0k|          dp = static_cast<OBPairData*>(mol.GetData(key));
  234|  70.0k|          line = dp->GetValue();
  235|  70.0k|          line += '\n';
  236|  70.0k|          line += value;
  237|  70.0k|          dp->SetValue(line);
  238|  70.0k|        }
  239|  97.3k|      }
  240|       |
  241|  6.15k|    if (!mol.NumAtoms()) { // skip the rest of this processing
  ------------------
  |  Branch (241:9): [True: 95, False: 6.05k]
  ------------------
  242|     95|      mol.EndModify();
  243|     95|      return ateend; //explicitly empty molecules are not invalid
  244|     95|    }
  245|       |
  246|  6.05k|    resdat.AssignBonds(mol);
  247|       |    /*assign hetatm bonds based on distance*/
  248|       |
  249|  6.05k|    mol.EndModify();
  250|       |    // Clear all virtual bond data
  251|  6.05k|    vector<OBGenericData*> vbonds = mol.GetAllData(OBGenericDataType::VirtualBondData);
  252|  6.05k|    mol.DeleteData(vbonds);
  253|       |
  254|  6.05k|    if (!pConv->IsOption("b",OBConversion::INOPTIONS))
  ------------------
  |  Branch (254:9): [True: 6.05k, False: 0]
  ------------------
  255|  6.05k|      mol.ConnectTheDots();
  256|       |
  257|  6.05k|    if (!pConv->IsOption("s",OBConversion::INOPTIONS) && !pConv->IsOption("b",OBConversion::INOPTIONS))
  ------------------
  |  Branch (257:9): [True: 6.05k, False: 0]
  |  Branch (257:58): [True: 6.05k, False: 0]
  ------------------
  258|  6.05k|      mol.PerceiveBondOrders();
  259|       |
  260|       |    // EndModify() blows away the chains perception flag so we set it again here
  261|  6.05k|    mol.SetChainsPerceived();
  262|       |
  263|       |    // Guess how many hydrogens are present on each atom based on typical valencies
  264|  6.05k|    FOR_ATOMS_OF_MOL(matom, mol)
  ------------------
  |  |  417|  6.05k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 280k, False: 6.05k]
  |  |  ------------------
  ------------------
  265|   280k|      OBAtomAssignTypicalImplicitHydrogens(&*matom);
  266|       |
  267|       |    // clean out remaining blank lines
  268|  6.47k|    while(ifs.peek() == '\n' && !ifs.eof())
  ------------------
  |  Branch (268:11): [True: 421, False: 6.05k]
  |  Branch (268:33): [True: 421, False: 0]
  ------------------
  269|    421|    {
  270|    421|      ifs.getline(buffer,BUFF_SIZE);
  ------------------
  |  |  771|    421|#define BUFF_SIZE 32768
  ------------------
  271|    421|    }
  272|       |
  273|  6.05k|    return(true);
  274|  6.15k|  }
_ZN9OpenBabel9PDBFormatC2Ev:
   42|      2|    { 
   43|      2|      OBConversion::RegisterFormat("pdb",this, "chemical/x-pdb");
   44|      2|      OBConversion::RegisterFormat("ent",this, "chemical/x-pdb");
   45|       |
   46|      2|      OBConversion::RegisterOptionParam("s", this, 0, OBConversion::INOPTIONS);
   47|      2|      OBConversion::RegisterOptionParam("b", this, 0, OBConversion::INOPTIONS);
   48|      2|      OBConversion::RegisterOptionParam("c", this, 0, OBConversion::INOPTIONS);
   49|       |
   50|      2|      OBConversion::RegisterOptionParam("o", this, 0, OBConversion::OUTOPTIONS);
   51|      2|      OBConversion::RegisterOptionParam("n", this, 0, OBConversion::OUTOPTIONS);
   52|      2|    }
pdbformat.cpp:_ZN9OpenBabelL17parseConectRecordEPcRNS_5OBMolE:
  340|  5.44k|  {
  341|  5.44k|    stringstream errorMsg;
  342|  5.44k|    string clearError;
  343|       |
  344|       |    // Setup strings and string buffers
  345|  5.44k|    vector<string> vs;
  346|  5.44k|    buffer[70] = '\0';
  347|  5.44k|    if (strlen(buffer) < 70)
  ------------------
  |  Branch (347:9): [True: 4.28k, False: 1.15k]
  ------------------
  348|  4.28k|      {
  349|  4.28k|        errorMsg << "WARNING: Problems reading a PDB file\n"
  350|  4.28k|                 << "  Problems reading a CONECT record.\n"
  351|  4.28k|                 << "  According to the PDB specification,\n"
  352|  4.28k|                 << "  the record should have 70 columns, but OpenBabel found "
  353|  4.28k|                 << strlen(buffer) << " columns." << endl;
  354|  4.28k|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obInfo);
  355|  4.28k|        errorMsg.str(clearError);
  356|  4.28k|      }
  357|       |
  358|       |    // Serial number of the first atom, read from column 7-11 of the
  359|       |    // connect record, to which the other atoms connect to.
  360|  5.44k|    long int startAtomSerialNumber;
  361|       |    // A pointer to the first atom.
  362|  5.44k|    OBAtom *firstAtom = nullptr;
  363|       |    // Serial numbers of the atoms which bind to firstAtom, read from
  364|       |    // columns 12-16, 17-21, 22-27 and 27-31 of the connect record. Note
  365|       |    // that we reserve space for 5 integers, but read only four of
  366|       |    // them. This is to simplify the determination of the bond order;
  367|       |    // see below.
  368|  5.44k|    long int boundedAtomsSerialNumbers[5]  = {0,0,0,0,0};
  369|       |    // Bools which tell us which of the serial numbers in
  370|       |    // boundedAtomsSerialNumbers are read from the file, and which are
  371|       |    // invalid
  372|  5.44k|    bool boundedAtomsSerialNumbersValid[5] = {false, false, false, false, false};
  373|       |
  374|       |    // Pragmatic approach -- too many non-standard PDB files out there
  375|       |    // (including some old ones from us)
  376|       |    // So if we have a small number of atoms, then try to break by spaces
  377|       |    // Otherwise (i.e., NumAtoms() > 9,999 we need to go by position)
  378|       |    // We'll switch back and forth a few times to save duplicating common code
  379|       |
  380|  5.44k|    if (mol.NumAtoms() <= 9999)
  ------------------
  |  Branch (380:9): [True: 5.44k, False: 0]
  ------------------
  381|  5.44k|      {
  382|       |        // make sure we don't look at salt bridges or whatever, so cut the buffer short
  383|  5.44k|        buffer[32] = '\0';
  384|  5.44k|        tokenize(vs,buffer);
  385|  5.44k|        if( vs.empty() || vs.size() < 2)
  ------------------
  |  Branch (385:13): [True: 0, False: 5.44k]
  |  Branch (385:27): [True: 1.24k, False: 4.19k]
  ------------------
  386|  1.24k|          return false;
  387|  4.19k|        vs.erase(vs.begin()); // remove "CONECT"
  388|       |
  389|  4.19k|        startAtomSerialNumber = atoi(vs[0].c_str());
  390|  4.19k|      }
  391|      0|    else
  392|      0|      {
  393|      0|        if (readIntegerFromRecord(buffer, 7, &startAtomSerialNumber) == false)
  ------------------
  |  Branch (393:13): [True: 0, False: 0]
  ------------------
  394|      0|          {
  395|      0|            errorMsg << "WARNING: Problems reading a PDB file\n"
  396|      0|                     << "  Problems reading a CONECT record.\n"
  397|      0|                     << "  According to the PDB specification,\n"
  398|      0|                     << "  columns 7-11 should contain the serial number of an atom.\n"
  399|      0|                     << "  THIS CONECT RECORD WILL BE IGNORED." << endl;
  400|      0|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  401|      0|            return(false);
  402|      0|          }
  403|      0|      }
  404|       |
  405|  4.19k|    vector<OBAtom*>::iterator i;
  406|  4.56k|    for (OBAtom *a1 = mol.BeginAtom(i);a1;a1 = mol.NextAtom(i)) {
  ------------------
  |  Branch (406:40): [True: 4.40k, False: 158]
  ------------------
  407|       |      // atoms may not have residue information, but if they do,
  408|       |      // check serial numbers
  409|  4.40k|      if (a1->GetResidue() != nullptr &&
  ------------------
  |  Branch (409:11): [True: 4.40k, False: 0]
  ------------------
  410|  4.40k|          static_cast<long int>(a1->GetResidue()->
  ------------------
  |  Branch (410:11): [True: 4.03k, False: 369]
  ------------------
  411|  4.40k|                                GetSerialNum(a1)) == startAtomSerialNumber)
  412|  4.03k|        {
  413|  4.03k|          firstAtom = a1;
  414|  4.03k|          break;
  415|  4.03k|        }
  416|  4.40k|    }
  417|       |
  418|  4.19k|    if (firstAtom == nullptr)
  ------------------
  |  Branch (418:9): [True: 158, False: 4.03k]
  ------------------
  419|    158|      {
  420|    158|        errorMsg << "WARNING: Problems reading a PDB file:\n"
  421|    158|                 << "  Problems reading a CONECT record.\n"
  422|    158|                 << "  According to the PDB specification,\n"
  423|    158|                 << "  columns 7-11 should contain the serial number of an atom.\n"
  424|    158|                 << "  No atom was found with this serial number.\n"
  425|    158|                 << "  THIS CONECT RECORD WILL BE IGNORED." << endl;
  426|    158|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  427|    158|        return(false);
  428|    158|      }
  429|       |
  430|  4.03k|    if (mol.NumAtoms() < 9999)
  ------------------
  |  Branch (430:9): [True: 4.03k, False: 0]
  ------------------
  431|  4.03k|      {
  432|  4.03k|        if (vs.size() > 1) boundedAtomsSerialNumbers[0] = atoi(vs[1].c_str());
  ------------------
  |  Branch (432:13): [True: 2.41k, False: 1.62k]
  ------------------
  433|  4.03k|        if (vs.size() > 2) boundedAtomsSerialNumbers[1] = atoi(vs[2].c_str());
  ------------------
  |  Branch (433:13): [True: 1.79k, False: 2.24k]
  ------------------
  434|  4.03k|        if (vs.size() > 3) boundedAtomsSerialNumbers[2] = atoi(vs[3].c_str());
  ------------------
  |  Branch (434:13): [True: 1.04k, False: 2.99k]
  ------------------
  435|  4.03k|        if (vs.size() > 4) boundedAtomsSerialNumbers[3] = atoi(vs[4].c_str());
  ------------------
  |  Branch (435:13): [True: 365, False: 3.67k]
  ------------------
  436|       |
  437|  4.03k|        unsigned int limit = 4;
  438|  4.03k|        if (vs.size() <= 4)
  ------------------
  |  Branch (438:13): [True: 3.67k, False: 365]
  ------------------
  439|  3.67k|          limit = vs.size() - 1;
  440|       |
  441|  9.65k|        for (unsigned int s = 0; s < limit; ++s)
  ------------------
  |  Branch (441:34): [True: 5.61k, False: 4.03k]
  ------------------
  442|  5.61k|          boundedAtomsSerialNumbersValid[s] = true;
  443|  4.03k|      }
  444|      0|    else
  445|      0|      {
  446|       |        // Now read the serial numbers. If the first serial number is not
  447|       |        // present, this connect record probably contains only hydrogen
  448|       |        // bonds and salt bridges, which we ignore. In that case, we just
  449|       |        // exit gracefully.
  450|      0|        boundedAtomsSerialNumbersValid[0] = readIntegerFromRecord(buffer, 12, boundedAtomsSerialNumbers+0);
  451|      0|        if (boundedAtomsSerialNumbersValid[0] == false)
  ------------------
  |  Branch (451:13): [True: 0, False: 0]
  ------------------
  452|      0|          return(true);
  453|      0|        boundedAtomsSerialNumbersValid[1] = readIntegerFromRecord(buffer, 17, boundedAtomsSerialNumbers+1);
  454|      0|        boundedAtomsSerialNumbersValid[2] = readIntegerFromRecord(buffer, 22, boundedAtomsSerialNumbers+2);
  455|      0|        boundedAtomsSerialNumbersValid[3] = readIntegerFromRecord(buffer, 27, boundedAtomsSerialNumbers+3);
  456|      0|      }
  457|       |
  458|       |    // Now iterate over the VALID boundedAtomsSerialNumbers and connect
  459|       |    // the atoms.
  460|  6.71k|    for(unsigned int k=0; boundedAtomsSerialNumbersValid[k]; k++)
  ------------------
  |  Branch (460:27): [True: 3.50k, False: 3.20k]
  ------------------
  461|  3.50k|      {
  462|       |        // Find atom that is connected to, write an error message
  463|  3.50k|        OBAtom *connectedAtom = nullptr;
  464|  41.8k|        for (OBAtom *a1 = mol.BeginAtom(i);a1;a1 = mol.NextAtom(i)) {
  ------------------
  |  Branch (464:44): [True: 41.0k, False: 834]
  ------------------
  465|       |          // again, atoms may not have residues, but if they do, check serials
  466|  41.0k|          if (a1->GetResidue() != nullptr &&
  ------------------
  |  Branch (466:15): [True: 41.0k, False: 0]
  ------------------
  467|  41.0k|              static_cast<long int>(a1->GetResidue()->
  ------------------
  |  Branch (467:15): [True: 2.67k, False: 38.3k]
  ------------------
  468|  41.0k|                                    GetSerialNum(a1)) == boundedAtomsSerialNumbers[k])
  469|  2.67k|            {
  470|  2.67k|              connectedAtom = a1;
  471|  2.67k|              break;
  472|  2.67k|            }
  473|  41.0k|        }
  474|  3.50k|        if (connectedAtom == nullptr)
  ------------------
  |  Branch (474:13): [True: 834, False: 2.67k]
  ------------------
  475|    834|          {
  476|    834|            errorMsg << "WARNING: Problems reading a PDB file:\n"
  477|    834|                     << "  Problems reading a CONECT record.\n"
  478|    834|                     << "  According to the PDB specification,\n"
  479|    834|                     << "  Atoms with serial #" << startAtomSerialNumber
  480|    834|                     << " and #" << boundedAtomsSerialNumbers[k]
  481|    834|                     << " should be connected\n"
  482|    834|                     << "  However, an atom with serial #" << boundedAtomsSerialNumbers[k] << " was not found.\n"
  483|    834|                     << "  THIS CONECT RECORD WILL BE IGNORED." << endl;
  484|    834|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  485|    834|            return(false);
  486|    834|          }
  487|       |
  488|       |        // Figure the bond order
  489|  2.67k|        unsigned char order = 0;
  490|  3.89k|        while(boundedAtomsSerialNumbersValid[k+order+1] && (boundedAtomsSerialNumbers[k+order]
  ------------------
  |  Branch (490:15): [True: 2.31k, False: 1.58k]
  |  Branch (490:60): [True: 1.22k, False: 1.09k]
  ------------------
  491|  2.31k|                                                            == boundedAtomsSerialNumbers[k+order+1]))
  492|  1.22k|          order++;
  493|  2.67k|        k += order;
  494|       |
  495|       |        // Generate the bond
  496|  2.67k|        if (firstAtom->GetIdx() < connectedAtom->GetIdx()) { // record the bond 'in one direction' only
  ------------------
  |  Branch (496:13): [True: 1.19k, False: 1.47k]
  ------------------
  497|  1.19k|          OBBond *bond = mol.GetBond(firstAtom, connectedAtom);
  498|  1.19k|          if (!bond)
  ------------------
  |  Branch (498:15): [True: 249, False: 945]
  ------------------
  499|    249|            mol.AddBond(firstAtom->GetIdx(), connectedAtom->GetIdx(), order+1);
  500|    945|          else // An additional CONECT record with the same firstAtom that references
  501|       |               // a bond created in the previous CONECT record.
  502|       |               // For example, the 1136->1138 double bond in the following:
  503|       |               //   CONECT 1136 1128 1137 1137 1138
  504|       |               //   CONECT 1136 1138 1139
  505|    945|            bond->SetBondOrder(bond->GetBondOrder() + order+1);
  506|  1.19k|        }
  507|       |
  508|  2.67k|      }
  509|  3.20k|    return(true);
  510|  4.03k|  }
pdbformat.cpp:_ZN9OpenBabelL31fixRhombohedralSpaceGroupReaderERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  861|     43|  {
  862|       |    /* This is due to the requirment of PDB to name rhombohedral groups
  863|       |       with H (http://deposit.rcsb.org/adit/docs/pdb_atom_format.html) */
  864|     43|    const int SIZE = 7;
  865|     43|    const char* groups[SIZE]  =   {"H 3",
  866|     43|                                   "H -3",
  867|     43|                                   "H 3 2",
  868|     43|                                   "H 3 m",
  869|     43|                                   "H 3 c",
  870|     43|                                   "H -3 m",
  871|     43|                                   "H -3 c"};
  872|       |
  873|     43|    std::vector<string> vec(groups, groups + SIZE);
  874|       |
  875|     43|    if(std::find(vec.begin(), vec.end(), strHM) != vec.end())
  ------------------
  |  Branch (875:8): [True: 0, False: 43]
  ------------------
  876|      0|    {
  877|      0|      strHM[0] = 'R';
  878|      0|      strHM += ":H";
  879|      0|    }
  880|     43|  }
pdbformat.cpp:_ZN9OpenBabelL15parseAtomRecordEPcRNS_5OBMolEi:
  907|   361k|  {
  908|   361k|    string sbuf = &buffer[6];
  909|   361k|    if (sbuf.size() < 48)
  ------------------
  |  Branch (909:9): [True: 79.3k, False: 282k]
  ------------------
  910|  79.3k|      return(false);
  911|       |
  912|   282k|    bool hetatm = (EQn(buffer,"HETATM",6)) ? true : false;
  ------------------
  |  |  779|   282k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  ------------------
  |  Branch (912:19): [True: 3.27k, False: 279k]
  ------------------
  913|   282k|    bool elementFound = false; // true if correct element found in col 77-78
  914|       |
  915|       |    /* serial number */
  916|   282k|    string serno = sbuf.substr(0,5);
  917|       |
  918|       |    /* atom name */
  919|   282k|    string atmid = sbuf.substr(6,4);
  920|       |
  921|       |    /* chain */
  922|   282k|    char chain = sbuf.substr(15,1)[0];
  923|       |
  924|       |    /* insertion code */
  925|   282k|    char insertioncode = sbuf.substr(27-6-1,1)[0];
  926|   282k|    if (' '==insertioncode) insertioncode=0;
  ------------------
  |  Branch (926:9): [True: 5.09k, False: 277k]
  ------------------
  927|       |
  928|       |    /* segname */
  929|   282k|    string segname;
  930|   282k|    if (sbuf.size() > 67) {
  ------------------
  |  Branch (930:9): [True: 193k, False: 88.9k]
  ------------------
  931|   193k|      segname = sbuf.substr(66,4);
  932|   193k|      if(segname == "    ") { //unset should be empty string
  ------------------
  |  Branch (932:10): [True: 527, False: 192k]
  ------------------
  933|    527|        segname = string();
  934|    527|      }     
  935|   193k|    }
  936|       |    /* element */
  937|   282k|    string element = "  ";
  938|   282k|    if (sbuf.size() > 71)
  ------------------
  |  Branch (938:9): [True: 184k, False: 98.3k]
  ------------------
  939|   184k|      {
  940|   184k|        element = sbuf.substr(70,2);
  941|   184k|        if (isalpha(element[1]))
  ------------------
  |  Branch (941:13): [True: 64.7k, False: 119k]
  ------------------
  942|  64.7k|          {
  943|  64.7k|            if (element[0] == ' ')
  ------------------
  |  Branch (943:17): [True: 299, False: 64.4k]
  ------------------
  944|    299|              {
  945|    299|                element.erase(0, 1);
  946|    299|                elementFound = true;
  947|    299|              }
  948|  64.4k|            else if (isalpha(element[0]))
  ------------------
  |  Branch (948:22): [True: 49.5k, False: 14.8k]
  ------------------
  949|  49.5k|              {
  950|  49.5k|                elementFound = true;
  951|  49.5k|                element[1] = tolower(element[1]);
  952|  49.5k|              }
  953|  64.7k|          }
  954|   184k|      }
  955|       |
  956|   282k|    if (!elementFound)
  ------------------
  |  Branch (956:9): [True: 232k, False: 49.8k]
  ------------------
  957|   232k|      {
  958|   232k|        stringstream errorMsg;
  959|   232k|        errorMsg << "WARNING: Problems reading a PDB file\n"
  960|   232k|                 << "  Problems reading a HETATM or ATOM record.\n"
  961|   232k|                 << "  According to the PDB specification,\n"
  962|   232k|                 << "  columns 77-78 should contain the element symbol of an atom.\n"
  963|   232k|                 << "  but OpenBabel found '" << element << "' (atom " << mol.NumAtoms()+1 << ")";
  964|   232k|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  965|   232k|      }
  966|       |
  967|       |    // charge - optional
  968|   282k|    string scharge;
  969|   282k|    if (sbuf.size() > 73)
  ------------------
  |  Branch (969:9): [True: 179k, False: 102k]
  ------------------
  970|   179k|      {
  971|   179k|        scharge = sbuf.substr(72,2);
  972|   179k|      }
  973|       |
  974|       |    //trim spaces on the right and left sides
  975|   302k|    while (!atmid.empty() && atmid[0] == ' ')
  ------------------
  |  Branch (975:12): [True: 302k, False: 263]
  |  Branch (975:30): [True: 20.3k, False: 282k]
  ------------------
  976|  20.3k|      atmid = atmid.erase(0, 1);
  977|       |
  978|   286k|    while (!atmid.empty() && atmid[atmid.size()-1] == ' ')
  ------------------
  |  Branch (978:12): [True: 286k, False: 263]
  |  Branch (978:30): [True: 3.78k, False: 282k]
  ------------------
  979|  3.78k|      atmid = atmid.substr(0,atmid.size()-1);
  980|       |
  981|       |    /* residue name */
  982|   282k|    string resname = sbuf.substr(11,3);
  983|   282k|    if (resname == "   ")
  ------------------
  |  Branch (983:9): [True: 900, False: 281k]
  ------------------
  984|    900|      resname = "UNK";
  985|   281k|    else
  986|   281k|      {
  987|   285k|        while (!resname.empty() && resname[0] == ' ')
  ------------------
  |  Branch (987:16): [True: 285k, False: 0]
  |  Branch (987:36): [True: 3.91k, False: 281k]
  ------------------
  988|  3.91k|          resname = resname.substr(1,resname.size()-1);
  989|       |
  990|   284k|        while (!resname.empty() && resname[resname.size()-1] == ' ')
  ------------------
  |  Branch (990:16): [True: 284k, False: 0]
  |  Branch (990:36): [True: 2.42k, False: 281k]
  ------------------
  991|  2.42k|          resname = resname.substr(0,resname.size()-1);
  992|   281k|      }
  993|       |
  994|   282k|    string type;
  995|   282k|    if (!elementFound) {
  ------------------
  |  Branch (995:9): [True: 232k, False: 49.8k]
  ------------------
  996|       |      // OK, we have to fall back to determining the element from the atom type
  997|       |      // This is unreliable, but there's no other choice
  998|   232k|      if (EQn(buffer,"ATOM",4)) {
  ------------------
  |  |  779|   232k|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 229k, False: 2.78k]
  |  |  ------------------
  ------------------
  999|   229k|        type = atmid.substr(0,2);
 1000|   229k|        if (isdigit(type[0])) {
  ------------------
  |  Branch (1000:13): [True: 6.74k, False: 223k]
  ------------------
 1001|       |          // sometimes non-standard files have, e.g 11HH
 1002|  6.74k|          if (!isdigit(type[1])) type = atmid.substr(1,1);
  ------------------
  |  Branch (1002:15): [True: 3.84k, False: 2.89k]
  ------------------
 1003|  2.89k|          else type = atmid.substr(2,1);
 1004|   223k|        } else if ((sbuf[6] == ' ' &&
  ------------------
  |  Branch (1004:21): [True: 16.0k, False: 207k]
  ------------------
 1005|  16.0k|                   strncasecmp(type.c_str(), "Zn", 2) != 0 &&
  ------------------
  |  Branch (1005:20): [True: 16.0k, False: 3]
  ------------------
 1006|  16.0k|                   strncasecmp(type.c_str(), "Fe", 2) != 0) ||
  ------------------
  |  Branch (1006:20): [True: 15.8k, False: 140]
  ------------------
 1007|   207k|                   isdigit(type[1]))	//type[1] is digit in Platon
  ------------------
  |  Branch (1007:20): [True: 7.47k, False: 199k]
  ------------------
 1008|  23.3k|          type = atmid.substr(0,1);     // one-character element
 1009|       |
 1010|       |
 1011|   229k|        if (resname.substr(0,2) == "AS" || resname[0] == 'N') {
  ------------------
  |  Branch (1011:13): [True: 284, False: 229k]
  |  Branch (1011:13): [True: 4.00k, False: 225k]
  |  Branch (1011:44): [True: 3.72k, False: 225k]
  ------------------
 1012|  4.00k|          if (atmid == "AD1")
  ------------------
  |  Branch (1012:15): [True: 48, False: 3.96k]
  ------------------
 1013|     48|            type = "O";
 1014|  4.00k|          if (atmid == "AD2")
  ------------------
  |  Branch (1014:15): [True: 64, False: 3.94k]
  ------------------
 1015|     64|            type = "N";
 1016|  4.00k|        }
 1017|   229k|        if (resname.substr(0,3) == "HIS" || resname[0] == 'H') {
  ------------------
  |  Branch (1017:13): [True: 12.3k, False: 217k]
  |  Branch (1017:13): [True: 15.1k, False: 214k]
  |  Branch (1017:45): [True: 2.79k, False: 214k]
  ------------------
 1018|  15.1k|          if (atmid == "AD1" || atmid == "AE2")
  ------------------
  |  Branch (1018:15): [True: 55, False: 15.0k]
  |  Branch (1018:33): [True: 66, False: 15.0k]
  ------------------
 1019|    121|            type = "N";
 1020|  15.1k|          if (atmid == "AE1" || atmid == "AD2")
  ------------------
  |  Branch (1020:15): [True: 66, False: 15.0k]
  |  Branch (1020:33): [True: 23, False: 15.0k]
  ------------------
 1021|     89|            type = "C";
 1022|  15.1k|        }
 1023|   229k|        if (resname.substr(0,2) == "GL" || resname[0] == 'Q') {
  ------------------
  |  Branch (1023:13): [True: 213, False: 229k]
  |  Branch (1023:13): [True: 564, False: 229k]
  |  Branch (1023:44): [True: 351, False: 229k]
  ------------------
 1024|    564|          if (atmid == "AE1")
  ------------------
  |  Branch (1024:15): [True: 37, False: 527]
  ------------------
 1025|     37|            type = "O";
 1026|    564|          if (atmid == "AE2")
  ------------------
  |  Branch (1026:15): [True: 41, False: 523]
  ------------------
 1027|     41|            type = "N";
 1028|    564|        }
 1029|       |        // fix: #2002557
 1030|   229k|        if (atmid[0] == 'H' &&
  ------------------
  |  Branch (1030:13): [True: 2.55k, False: 227k]
  ------------------
 1031|  2.55k|            (atmid[1] == 'D' || atmid[1] == 'E' ||
  ------------------
  |  Branch (1031:14): [True: 169, False: 2.38k]
  |  Branch (1031:33): [True: 204, False: 2.17k]
  ------------------
 1032|  2.17k|             atmid[1] == 'G' || atmid[1] == 'H' ||
  ------------------
  |  Branch (1032:14): [True: 13, False: 2.16k]
  |  Branch (1032:33): [True: 79, False: 2.08k]
  ------------------
 1033|  2.08k|             atmid[1] == 'N')) // HD, HE, HG, HH, HN...
  ------------------
  |  Branch (1033:14): [True: 38, False: 2.04k]
  ------------------
 1034|    503|          type = "H";
 1035|       |
 1036|   229k|        if (type.size() == 2)
  ------------------
  |  Branch (1036:13): [True: 199k, False: 30.7k]
  ------------------
 1037|   199k|          type[1] = tolower(type[1]);
 1038|       |
 1039|   229k|      } else { //must be hetatm record
 1040|  2.78k|        if (isalpha(element[1]) && (isalpha(element[0]) || (element[0] == ' '))) {
  ------------------
  |  Branch (1040:13): [True: 116, False: 2.66k]
  |  Branch (1040:37): [True: 0, False: 116]
  |  Branch (1040:60): [True: 0, False: 116]
  ------------------
 1041|      0|          if (isalpha(element[0]))
  ------------------
  |  Branch (1041:15): [True: 0, False: 0]
  ------------------
 1042|      0|            type = element.substr(0,2);
 1043|      0|          else
 1044|      0|            type = element.substr(1,1);
 1045|       |
 1046|      0|          if (type.size() == 2)
  ------------------
  |  Branch (1046:15): [True: 0, False: 0]
  ------------------
 1047|      0|            type[1] = tolower(type[1]);
 1048|  2.78k|        } else { // no element column to use
 1049|  2.78k|          if (isalpha(atmid[0])) {
  ------------------
  |  Branch (1049:15): [True: 2.20k, False: 582]
  ------------------
 1050|  2.20k|            if (atmid.size() > 2)
  ------------------
  |  Branch (1050:17): [True: 1.70k, False: 500]
  ------------------
 1051|  1.70k|              type = atmid.substr(0,2);
 1052|    500|            else if (atmid[0] == 'A') // alpha prefix
  ------------------
  |  Branch (1052:22): [True: 0, False: 500]
  ------------------
 1053|      0|              type = atmid.substr(1, atmid.size() - 1);
 1054|    500|            else
 1055|    500|              type = atmid.substr(0,1);
 1056|  2.20k|          } else if (atmid[0] == ' ')
  ------------------
  |  Branch (1056:22): [True: 0, False: 582]
  ------------------
 1057|      0|            type = atmid.substr(1,1); // one char element
 1058|    582|          else if (atmid.size() > 1)
  ------------------
  |  Branch (1058:20): [True: 489, False: 93]
  ------------------
 1059|    489|            type = atmid.substr(1,2);
 1060|       |
 1061|       |          // Some cleanup steps
 1062|  2.78k|          if (atmid == resname) {
  ------------------
  |  Branch (1062:15): [True: 8, False: 2.77k]
  ------------------
 1063|      8|            type = atmid;
 1064|      8|            if (type.size() == 2)
  ------------------
  |  Branch (1064:17): [True: 0, False: 8]
  ------------------
 1065|      0|              type[1] = tolower(type[1]);
 1066|      8|          } else
 1067|  2.77k|            if (resname == "ADR" || resname == "COA" || resname == "FAD" ||
  ------------------
  |  Branch (1067:17): [True: 0, False: 2.77k]
  |  Branch (1067:37): [True: 23, False: 2.75k]
  |  Branch (1067:57): [True: 44, False: 2.70k]
  ------------------
 1068|  2.70k|                resname == "GPG" || resname == "NAD" || resname == "NAL" ||
  ------------------
  |  Branch (1068:17): [True: 22, False: 2.68k]
  |  Branch (1068:37): [True: 104, False: 2.58k]
  |  Branch (1068:57): [True: 17, False: 2.56k]
  ------------------
 1069|  2.56k|                resname == "NDP" || resname == "ABA") {
  ------------------
  |  Branch (1069:17): [True: 25, False: 2.53k]
  |  Branch (1069:37): [True: 29, False: 2.51k]
  ------------------
 1070|    264|              if (type.size() > 1)
  ------------------
  |  Branch (1070:19): [True: 264, False: 0]
  ------------------
 1071|    264|                type = type.substr(0,1);
 1072|       |              //type.erase(1,type.size()-1);
 1073|    264|            } else // other residues
 1074|  2.51k|              if (isdigit(type[0])){
  ------------------
  |  Branch (1074:19): [True: 49, False: 2.46k]
  ------------------
 1075|     49|                type = type.substr(1,1);
 1076|     49|              }
 1077|  2.46k|              else
 1078|  2.46k|                if (type.size() > 1 && isdigit(type[1]))
  ------------------
  |  Branch (1078:21): [True: 1.85k, False: 611]
  |  Branch (1078:40): [True: 149, False: 1.70k]
  ------------------
 1079|    149|                  type = type.substr(0,1);
 1080|  2.31k|                else
 1081|  2.31k|                  if (type.size() > 1 && isalpha(type[1])) {
  ------------------
  |  Branch (1081:23): [True: 1.70k, False: 611]
  |  Branch (1081:42): [True: 1.04k, False: 661]
  ------------------
 1082|  1.04k|                    if (type[0] == 'O' && type[1] == 'H')
  ------------------
  |  Branch (1082:25): [True: 422, False: 618]
  |  Branch (1082:43): [True: 22, False: 400]
  ------------------
 1083|     22|                      type = type.substr(0,1); // no "Oh" element (e.g. 1MBN)
 1084|  1.01k|                    else if(isupper(type[1])) {
  ------------------
  |  Branch (1084:29): [True: 689, False: 329]
  ------------------
 1085|    689|                      type[1] = tolower(type[1]);
 1086|    689|                    }
 1087|  1.04k|                  }
 1088|  2.78k|        }
 1089|       |
 1090|  2.78k|      } // HETATM records
 1091|   232k|    } // no element column to use
 1092|       |
 1093|   282k|    OBAtom atom;
 1094|       |    /* X, Y, Z */
 1095|   282k|    string xstr = sbuf.substr(24,8);
 1096|   282k|    string ystr = sbuf.substr(32,8);
 1097|   282k|    string zstr = sbuf.substr(40,8);
 1098|   282k|    vector3 v(atof(xstr.c_str()),atof(ystr.c_str()),atof(zstr.c_str()));
 1099|   282k|    atom.SetVector(v);
 1100|       |
 1101|   282k|    double occupancy = atof(sbuf.substr(48, 6).c_str());
 1102|   282k|    OBPairFloatingPoint* occup = new OBPairFloatingPoint;
 1103|   282k|    occup->SetAttribute("_atom_site_occupancy");
 1104|   282k|    if (occupancy <= 0.0 || occupancy > 1.0){
  ------------------
  |  Branch (1104:9): [True: 262k, False: 19.9k]
  |  Branch (1104:29): [True: 17.3k, False: 2.51k]
  ------------------
 1105|   279k|      occupancy = 1.0;
 1106|   279k|    }
 1107|   282k|    occup->SetValue(occupancy);
 1108|   282k|    occup->SetOrigin(fileformatInput);
 1109|   282k|    atom.SetData(occup);
 1110|       |
 1111|       |    // useful for debugging unknown atom types (e.g., PR#1577238)
 1112|       |    //    cout << mol.NumAtoms() + 1  << " : '" << element << "'" << " " << OBElements::GetAtomicNum(element.c_str()) << endl;
 1113|   282k|    if (elementFound)
  ------------------
  |  Branch (1113:9): [True: 49.8k, False: 232k]
  ------------------
 1114|  49.8k|      atom.SetAtomicNum(OBElements::GetAtomicNum(element.c_str()));
 1115|   232k|    else { // use our old-style guess from athe atom type
 1116|   232k|      unsigned int atomic_num = OBElements::GetAtomicNum(type.c_str());
 1117|   232k|      if (atomic_num ==  0) { //try one character if two character element not found
  ------------------
  |  Branch (1117:11): [True: 151k, False: 81.1k]
  ------------------
 1118|   151k|        type = type.substr(0,1);
 1119|   151k|        atomic_num = OBElements::GetAtomicNum(type.c_str());
 1120|   151k|      }
 1121|   232k|      atom.SetAtomicNum(atomic_num);
 1122|   232k|    }
 1123|       |
 1124|   282k|    if ( (! scharge.empty()) && "  " != scharge )
  ------------------
  |  Branch (1124:10): [True: 179k, False: 102k]
  |  Branch (1124:33): [True: 177k, False: 2.69k]
  ------------------
 1125|   177k|      {
 1126|   177k|        if ( isdigit(scharge[0]) && ('+' == scharge[1] || '-' == scharge[1]) )
  ------------------
  |  Branch (1126:14): [True: 50.4k, False: 126k]
  |  Branch (1126:38): [True: 20.0k, False: 30.4k]
  |  Branch (1126:59): [True: 14.7k, False: 15.6k]
  ------------------
 1127|  34.7k|          {
 1128|  34.7k|            const char reorderCharge[3] = { scharge[1], scharge[0], '\0' };
 1129|  34.7k|            const int charge = atoi(reorderCharge);
 1130|  34.7k|            atom.SetFormalCharge(charge);
 1131|  34.7k|          }
 1132|   142k|        else
 1133|   142k|          {
 1134|   142k|            stringstream errorMsg;
 1135|   142k|            errorMsg << "WARNING: Problems reading a PDB file\n"
 1136|   142k|                     << "  Problems reading a HETATM or ATOM record.\n"
 1137|   142k|                     << "  According to the PDB specification,\n"
 1138|   142k|                     << "  columns 79-80 should contain charge of the atom\n"
 1139|   142k|                     << "  but OpenBabel found '" << scharge << "' (atom " << mol.NumAtoms()+1 << ").";
 1140|   142k|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
 1141|   142k|          }
 1142|   177k|      }
 1143|   105k|    else {
 1144|   105k|      atom.SetFormalCharge(0);
 1145|   105k|    }
 1146|       |
 1147|       |    /* residue sequence number */
 1148|   282k|    string resnum = sbuf.substr(16,4);
 1149|   282k|    OBResidue *res  = (mol.NumResidues() > 0) ? mol.GetResidue(mol.NumResidues()-1) : nullptr;
  ------------------
  |  Branch (1149:23): [True: 276k, False: 6.16k]
  ------------------
 1150|   282k|    if (res == nullptr
  ------------------
  |  Branch (1150:9): [True: 6.16k, False: 276k]
  |  Branch (1150:9): [True: 257k, False: 24.9k]
  ------------------
 1151|   276k|        || res->GetName() != resname
  ------------------
  |  Branch (1151:12): [True: 198k, False: 77.8k]
  ------------------
 1152|  77.8k|        || res->GetNumString() != resnum
  ------------------
  |  Branch (1152:12): [True: 17.1k, False: 60.6k]
  ------------------
 1153|  60.6k|        || res->GetChain() != chain
  ------------------
  |  Branch (1153:12): [True: 1.37k, False: 59.3k]
  ------------------
 1154|  59.3k|        || res->GetInsertionCode() != insertioncode
  ------------------
  |  Branch (1154:12): [True: 2.06k, False: 57.2k]
  ------------------
 1155|  57.2k|        || res->GetSegName() != segname)
  ------------------
  |  Branch (1155:12): [True: 32.3k, False: 24.9k]
  ------------------
 1156|   257k|      {
 1157|   257k|        vector<OBResidue*>::iterator ri;
 1158|  2.15M|        for (res = mol.BeginResidue(ri) ; res ; res = mol.NextResidue(ri))
  ------------------
  |  Branch (1158:43): [True: 2.09M, False: 62.3k]
  ------------------
 1159|  2.09M|          if (res->GetName() == resname
  ------------------
  |  Branch (1159:15): [True: 417k, False: 1.67M]
  |  Branch (1159:15): [True: 195k, False: 1.89M]
  ------------------
 1160|   417k|              && res->GetNumString() == resnum
  ------------------
  |  Branch (1160:18): [True: 326k, False: 90.9k]
  ------------------
 1161|   326k|              && static_cast<int>(res->GetChain()) == chain
  ------------------
  |  Branch (1161:18): [True: 322k, False: 3.99k]
  ------------------
 1162|   322k|              && static_cast<int>(res->GetInsertionCode()) == insertioncode
  ------------------
  |  Branch (1162:18): [True: 315k, False: 7.21k]
  ------------------
 1163|   315k|              && res->GetSegName() == segname) {
  ------------------
  |  Branch (1163:18): [True: 195k, False: 119k]
  ------------------
 1164|   195k|            if (insertioncode) fprintf(stderr,"I: identified residue wrt insertion code: '%c'\n",insertioncode);
  ------------------
  |  Branch (1164:17): [True: 191k, False: 3.58k]
  ------------------
 1165|   195k|            break;
 1166|   195k|          }
 1167|       |
 1168|   257k|        if (res == nullptr) {
  ------------------
  |  Branch (1168:13): [True: 62.3k, False: 195k]
  ------------------
 1169|  62.3k|          res = mol.NewResidue();
 1170|  62.3k|          res->SetChain(chain);
 1171|  62.3k|          res->SetName(resname);
 1172|  62.3k|          res->SetNum(resnum);
 1173|  62.3k|          res->SetInsertionCode(insertioncode);
 1174|  62.3k|          res->SetSegName(segname);
 1175|  62.3k|        }
 1176|   257k|      }
 1177|       |
 1178|   282k|    if (!mol.AddAtom(atom))
  ------------------
  |  Branch (1178:9): [True: 0, False: 282k]
  ------------------
 1179|      0|      return(false);
 1180|   282k|    else {
 1181|   282k|      OBAtom *atom = mol.GetAtom(mol.NumAtoms());
 1182|       |
 1183|   282k|      res->AddAtom(atom);
 1184|   282k|      res->SetSerialNum(atom, atoi(serno.c_str()));
 1185|   282k|      res->SetAtomID(atom, sbuf.substr(6,4));
 1186|   282k|      res->SetHetAtom(atom, hetatm);
 1187|       |
 1188|   282k|      return(true);
 1189|   282k|    }
 1190|   282k|  } // end reading atom records

_ZN9OpenBabel11PDBQTFormatC2Ev:
   73|      2|    {
   74|      2|      OBConversion::RegisterFormat("pdbqt",this, "chemical/x-pdbqt");
   75|      2|    }

_ZN9OpenBabel16PointCloudFormatC2Ev:
   62|      2|      {
   63|      2|        OpenBabel::OBConversion::RegisterFormat( "pointcloud", this );
   64|       |        /*
   65|       |        OBConversion::RegisterOptionParam("r", this, 1, OBConversion::OUTOPTIONS);
   66|       |        OBConversion::RegisterOptionParam("d", this, 1, OBConversion::OUTOPTIONS);
   67|       |        OBConversion::RegisterOptionParam("p", this, 1, OBConversion::OUTOPTIONS);
   68|       |        OBConversion::RegisterOptionParam("x", this, 1, OBConversion::OUTOPTIONS);
   69|       |        */
   70|      2|      }
_ZN9OpenBabel16PointCloudFormat5FlagsEv:
  108|      2|      {
  109|      2|        return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
                      return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
  110|      2|      }

_ZN9OpenBabel12PovrayFormatC2Ev:
  105|      2|    {
  106|      2|      OBConversion::RegisterFormat("pov",this);
  107|      2|    }
_ZN9OpenBabel12PovrayFormat5FlagsEv:
  151|      2|    {
  152|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
  153|      2|    }

_ZN9OpenBabel9PQRFormatC2Ev:
   41|      2|    {
   42|      2|      OBConversion::RegisterFormat("pqr",this, "chemical/x-pqr");
   43|      2|    }

_ZN9OpenBabel11PWscfFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("pwscf",this);
   40|      2|    }
_ZN9OpenBabel11PWscfFormat5FlagsEv:
   57|      2|    {
   58|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   59|      2|    }

_ZN9OpenBabel17QChemOutputFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("qcout",this);
   38|      2|    }
_ZN9OpenBabel16QChemInputFormatC2Ev:
   73|      2|    {
   74|      2|      OBConversion::RegisterFormat("qcin",this);
   75|      2|    }
_ZN9OpenBabel17QChemOutputFormat5FlagsEv:
   55|      2|    {
   56|      2|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      2|#define NOTWRITABLE     0x10
  ------------------
   57|      2|    }
_ZN9OpenBabel16QChemInputFormat5FlagsEv:
   92|      2|    {
   93|      2|      return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
                    return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
   94|      2|    }

_ZN9OpenBabel12ReportFormatC2Ev:
   40|      2|    {
   41|      2|      OBConversion::RegisterFormat("report",this);
   42|      2|    }
_ZN9OpenBabel12ReportFormat5FlagsEv:
  174|      2|    {
  175|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
  176|      2|    }

_ZN9OpenBabel14SmiReactFormatC2Ev:
   36|      2|    {
   37|      2|      OBConversion::RegisterFormat("rsmi",this);
   38|      2|    }

_ZN9OpenBabel9RXNFormatC2Ev:
   39|      2|  {
   40|      2|      OBConversion::RegisterFormat("rxn",this);
   41|      2|  }

_ZN9OpenBabel11ShelXFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("res",this, "chemical/x-shelx");
   37|      2|      OBConversion::RegisterFormat("ins",this, "chemical/x-shelx");
   38|      2|    }
_ZN9OpenBabel11ShelXFormat5FlagsEv:
   59|      4|    {
   60|      4|      return NOTWRITABLE;
  ------------------
  |  |   35|      4|#define NOTWRITABLE     0x10
  ------------------
   61|      4|    }

_ZN9OpenBabel13SMIBaseFormat12ReadMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
  361|  7.00k|  {
  362|  7.00k|    OBMol* pmol = pOb->CastAndClear<OBMol>();
  363|       |
  364|  7.00k|    istream &ifs = *pConv->GetInStream();
  365|  7.00k|    string ln, smiles, title;
  366|  7.00k|    string::size_type pos;
  367|       |
  368|       |    //Ignore lines that start with #
  369|  7.27k|    while(ifs && ifs.peek()=='#')
  ------------------
  |  Branch (369:11): [True: 7.27k, False: 0]
  |  Branch (369:18): [True: 272, False: 7.00k]
  ------------------
  370|    272|      if(!getline(ifs, ln))
  ------------------
  |  Branch (370:10): [True: 0, False: 272]
  ------------------
  371|      0|        return false;
  372|       |
  373|       |    //Get title
  374|  7.00k|    if(getline(ifs, ln))
  ------------------
  |  Branch (374:8): [True: 6.99k, False: 7]
  ------------------
  375|  6.99k|    {
  376|  6.99k|      pos = ln.find_first_of(" \t");
  377|  6.99k|      if(pos!=string::npos)
  ------------------
  |  Branch (377:10): [True: 743, False: 6.25k]
  ------------------
  378|    743|      {
  379|    743|        smiles = ln.substr(0,pos);
  380|    743|        title = ln.substr(pos+1);
  381|    743|        Trim(title);
  382|    743|        pmol->SetTitle(title.c_str());
  383|    743|      }
  384|  6.25k|      else
  385|  6.25k|        smiles = ln;
  386|  6.99k|    }
  387|       |
  388|  7.00k|    pmol->SetDimension(0);
  389|  7.00k|    OBSmilesParser sp(pConv->IsOption("a", OBConversion::INOPTIONS));
  390|  7.00k|    if (!pConv->IsOption("S", OBConversion::INOPTIONS))
  ------------------
  |  Branch (390:9): [True: 7.00k, False: 0]
  ------------------
  391|  7.00k|      pmol->SetChiralityPerceived();
  392|       |
  393|  7.00k|    return sp.SmiToMol(*pmol, smiles); //normal return
  394|  7.00k|  }
_ZN9OpenBabel14OBSmilesParser8SmiToMolERNS_5OBMolERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
  399|  7.00k|  {
  400|  7.00k|    _vprev.clear();
  401|  7.00k|    _rclose.clear();
  402|  7.00k|    _prev=0;
  403|  7.00k|    chiralWatch=false;
  404|  7.00k|    squarePlanarWatch = false;
  405|       |
  406|       |    // We allow the empty reaction (">>") but not the empty molecule ("")
  407|  7.00k|    if (!ParseSmiles(mol, s) || (!mol.IsReaction() && mol.NumAtoms() == 0))
  ------------------
  |  Branch (407:9): [True: 698, False: 6.30k]
  |  Branch (407:34): [True: 6.26k, False: 38]
  |  Branch (407:55): [True: 13, False: 6.25k]
  ------------------
  408|    711|      {
  409|    711|        mol.Clear();
  410|    711|        ClearStereoMaps();
  411|    711|        return(false);
  412|    711|      }
  413|       |
  414|  6.28k|    ClearStereoMaps();
  415|       |
  416|  6.28k|    mol.SetAutomaticFormalCharge(false);
  417|       |
  418|  6.28k|    return(true);
  419|  7.00k|  }
_ZN9OpenBabel14OBSmilesParser11ParseSmilesERNS_5OBMolERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
  422|  7.00k|  {
  423|  7.00k|    mol.SetAromaticPerceived(); // Turn off perception until the end of this function
  424|  7.00k|    mol.BeginModify();
  425|       |
  426|  1.06M|    for (_ptr=smiles.c_str();*_ptr;_ptr++)
  ------------------
  |  Branch (426:30): [True: 1.05M, False: 6.42k]
  ------------------
  427|  1.05M|    {
  428|  1.05M|      switch(*_ptr)
  429|  1.05M|      {
  430|      0|      case '\r':
  ------------------
  |  Branch (430:7): [True: 0, False: 1.05M]
  ------------------
  431|      0|        if (*(_ptr+1) == '\0') // may have a terminating '\r' due to Windows line-endings
  ------------------
  |  Branch (431:13): [True: 0, False: 0]
  ------------------
  432|      0|          break;
  433|      0|        return false;
  434|  68.1k|      case '0': case '1': case '2': case '3': case '4':
  ------------------
  |  Branch (434:7): [True: 17.4k, False: 1.03M]
  |  Branch (434:17): [True: 37.0k, False: 1.01M]
  |  Branch (434:27): [True: 4.40k, False: 1.05M]
  |  Branch (434:37): [True: 826, False: 1.05M]
  |  Branch (434:47): [True: 8.44k, False: 1.04M]
  ------------------
  435|   112k|      case '5': case '6': case '7': case '8': case '9':
  ------------------
  |  Branch (435:7): [True: 1.08k, False: 1.05M]
  |  Branch (435:17): [True: 1.34k, False: 1.05M]
  |  Branch (435:27): [True: 34.8k, False: 1.01M]
  |  Branch (435:37): [True: 6.85k, False: 1.04M]
  |  Branch (435:47): [True: 319, False: 1.05M]
  ------------------
  436|   112k|      case '%':  //ring open/close
  ------------------
  |  Branch (436:7): [True: 175, False: 1.05M]
  ------------------
  437|   112k|        if (_prev == 0)
  ------------------
  |  Branch (437:13): [True: 13, False: 112k]
  ------------------
  438|     13|          return false;
  439|   112k|        if (!ParseRingBond(mol))
  ------------------
  |  Branch (439:13): [True: 42, False: 112k]
  ------------------
  440|     42|          return false;
  441|   112k|        break;
  442|   112k|      case '&': //external bond
  ------------------
  |  Branch (442:7): [True: 3.47k, False: 1.05M]
  ------------------
  443|  3.47k|        if (_prev == 0)
  ------------------
  |  Branch (443:13): [True: 4, False: 3.46k]
  ------------------
  444|      4|          return false;
  445|  3.46k|        if (!ParseExternalBond(mol))
  ------------------
  |  Branch (445:13): [True: 30, False: 3.43k]
  ------------------
  446|     30|          return false;
  447|  3.43k|        break;
  448|  6.41k|      case '.':
  ------------------
  |  Branch (448:7): [True: 6.41k, False: 1.04M]
  ------------------
  449|  6.41k|        _prev=0;
  450|  6.41k|        break;
  451|    148|      case '>':
  ------------------
  |  Branch (451:7): [True: 148, False: 1.05M]
  ------------------
  452|    148|        _prev = 0;
  453|    148|        _rxnrole++;
  454|    148|        if (_rxnrole == 2) {
  ------------------
  |  Branch (454:13): [True: 87, False: 61]
  ------------------
  455|     87|          mol.SetIsReaction();
  456|       |          // Handle all the reactant atoms
  457|       |          // - the remaining atoms will be handled on-the-fly
  458|  1.30k|          FOR_ATOMS_OF_MOL(atom, mol) {
  ------------------
  |  |  417|     87|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 1.30k, False: 87]
  |  |  ------------------
  ------------------
  459|  1.30k|            OBPairInteger *pi = new OBPairInteger();
  460|  1.30k|            pi->SetAttribute("rxnrole");
  461|  1.30k|            pi->SetValue(1);
  462|  1.30k|            atom->SetData(pi);
  463|  1.30k|          }
  464|     87|        }
  465|     61|        else if (_rxnrole == 4) {
  ------------------
  |  Branch (465:18): [True: 10, False: 51]
  ------------------
  466|     10|          stringstream errorMsg;
  467|     10|          errorMsg << "Too many greater-than signs in SMILES string";
  468|     10|          std::string title = mol.GetTitle();
  469|     10|          if (!title.empty())
  ------------------
  |  Branch (469:15): [True: 2, False: 8]
  ------------------
  470|      2|            errorMsg << " (title is " << title << ")";
  471|     10|          errorMsg << endl;
  472|     10|          obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  473|     10|          return false;
  474|     10|        }
  475|    138|        break;
  476|  42.8k|      case '(':
  ------------------
  |  Branch (476:7): [True: 42.8k, False: 1.01M]
  ------------------
  477|  42.8k|        _vprev.push_back(_prev);
  478|  42.8k|        break;
  479|    481|      case ')':
  ------------------
  |  Branch (479:7): [True: 481, False: 1.05M]
  ------------------
  480|    481|        if(_vprev.empty()) //CM
  ------------------
  |  Branch (480:12): [True: 7, False: 474]
  ------------------
  481|      7|          return false;
  482|    474|        _prev = _vprev.back();
  483|    474|        _vprev.pop_back();
  484|    474|        break;
  485|  19.7k|      case '[':
  ------------------
  |  Branch (485:7): [True: 19.7k, False: 1.03M]
  ------------------
  486|  19.7k|        if (!ParseComplex(mol))
  ------------------
  |  Branch (486:13): [True: 291, False: 19.4k]
  ------------------
  487|    291|        {
  488|    291|          mol.EndModify();
  489|    291|          mol.Clear();
  490|    291|          return false;
  491|    291|        }
  492|  19.4k|        break;
  493|  22.0k|      case '-':
  ------------------
  |  Branch (493:7): [True: 22.0k, False: 1.03M]
  ------------------
  494|  22.0k|        if (_prev == 0)
  ------------------
  |  Branch (494:13): [True: 6, False: 22.0k]
  ------------------
  495|      6|          return false;
  496|  22.0k|        _order = 1;
  497|  22.0k|        break;
  498|  9.80k|      case '=':
  ------------------
  |  Branch (498:7): [True: 9.80k, False: 1.04M]
  ------------------
  499|  9.80k|        if (_prev == 0)
  ------------------
  |  Branch (499:13): [True: 5, False: 9.79k]
  ------------------
  500|      5|          return false;
  501|  9.79k|        _order = 2;
  502|  9.79k|        break;
  503|  2.77k|      case '#':
  ------------------
  |  Branch (503:7): [True: 2.77k, False: 1.05M]
  ------------------
  504|  2.77k|        if (_prev == 0)
  ------------------
  |  Branch (504:13): [True: 3, False: 2.77k]
  ------------------
  505|      3|          return false;
  506|  2.77k|        _order = 3;
  507|  2.77k|        break;
  508|  10.0k|      case '$':
  ------------------
  |  Branch (508:7): [True: 10.0k, False: 1.04M]
  ------------------
  509|  10.0k|        if (_prev == 0)
  ------------------
  |  Branch (509:13): [True: 4, False: 10.0k]
  ------------------
  510|      4|          return false;
  511|  10.0k|        _order = 4;
  512|  10.0k|        break;
  513|  16.0k|      case ':':
  ------------------
  |  Branch (513:7): [True: 16.0k, False: 1.03M]
  ------------------
  514|  16.0k|        if (_prev == 0)
  ------------------
  |  Branch (514:13): [True: 3, False: 16.0k]
  ------------------
  515|      3|          return false;
  516|  16.0k|        _order = 0; // no-op
  517|  16.0k|        break;
  518|  37.9k|      case '/':
  ------------------
  |  Branch (518:7): [True: 37.9k, False: 1.01M]
  ------------------
  519|  37.9k|        if (_prev == 0)
  ------------------
  |  Branch (519:13): [True: 3, False: 37.9k]
  ------------------
  520|      3|          return false;
  521|  37.9k|        _order = 1;
  522|  37.9k|        _updown = BondDownChar;
  523|  37.9k|        break;
  524|  2.88k|      case '\\':
  ------------------
  |  Branch (524:7): [True: 2.88k, False: 1.05M]
  ------------------
  525|  2.88k|        if (_prev == 0)
  ------------------
  |  Branch (525:13): [True: 2, False: 2.88k]
  ------------------
  526|      2|          return false;
  527|  2.88k|        _order = 1;
  528|  2.88k|        _updown = BondUpChar;
  529|  2.88k|        break;
  530|   767k|      default:
  ------------------
  |  Branch (530:7): [True: 767k, False: 287k]
  ------------------
  531|   767k|        if (!ParseSimple(mol))
  ------------------
  |  Branch (531:13): [True: 149, False: 766k]
  ------------------
  532|    149|        {
  533|    149|          mol.EndModify();
  534|    149|          mol.Clear();
  535|    149|          return false;
  536|    149|        }
  537|  1.05M|      } // end switch
  538|  1.05M|    } // end for _ptr
  539|       |
  540|       |    // place dummy atoms for each unfilled external bond
  541|  6.42k|    if(!_extbond.empty())
  ------------------
  |  Branch (541:8): [True: 35, False: 6.39k]
  ------------------
  542|     35|      CapExternalBonds(mol);
  543|       |
  544|       |    // Check to see if we've balanced out all ring closures
  545|       |    // They are removed from _rclose when matched
  546|  6.42k|    if (!_rclose.empty()) {
  ------------------
  |  Branch (546:9): [True: 99, False: 6.32k]
  ------------------
  547|     99|      mol.EndModify();
  548|     99|      mol.Clear();
  549|       |
  550|     99|      stringstream errorMsg;
  551|     99|      errorMsg << "Invalid SMILES string: " << _rclose.size() << " unmatched "
  552|     99|               << "ring bonds." << endl;
  553|     99|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  554|     99|      return false; // invalid SMILES since rings aren't properly closed
  555|     99|    }
  556|       |
  557|       |    // Check to see if we've the right number of '>' for reactions
  558|  6.32k|    if (_rxnrole > 1 && _rxnrole !=3) {
  ------------------
  |  Branch (558:9): [True: 51, False: 6.27k]
  |  Branch (558:25): [True: 13, False: 38]
  ------------------
  559|     13|      mol.EndModify();
  560|     13|      stringstream errorMsg;
  561|     13|      errorMsg << "Invalid reaction SMILES string: only a single '>' sign found (two required to be valid).";
  562|     13|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  563|     13|      return false; // invalid SMILES since rings aren't properly closed
  564|     13|    }
  565|  6.31k|    if (_hcount.size() < mol.NumAtoms()) {
  ------------------
  |  Branch (565:9): [True: 14, False: 6.30k]
  ------------------
  566|     14|      mol.EndModify();
  567|     14|      return false;
  568|     14|    }
  569|  6.30k|    if (mol.IsReaction()) {
  ------------------
  |  Branch (569:9): [True: 38, False: 6.26k]
  ------------------
  570|     38|      OBReactionFacade facade(&mol);
  571|     38|      facade.AssignComponentIds();
  572|     38|    }
  573|       |
  574|       |    // Apply the SMILES valence model
  575|   561k|    FOR_ATOMS_OF_MOL(atom, mol) {
  ------------------
  |  |  417|  6.30k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 561k, False: 6.30k]
  |  |  ------------------
  ------------------
  576|   561k|      unsigned int idx = atom->GetIdx();
  577|       |      // Atoms created outside ParseSimple/ParseComplex (e.g. via
  578|       |      // malformed bracket paths) won't have a corresponding _hcount
  579|       |      // entry. Skip the implicit-valence step rather than read OOB.
  580|   561k|      if (idx == 0 || idx - 1 >= _hcount.size())
  ------------------
  |  Branch (580:11): [True: 0, False: 561k]
  |  Branch (580:23): [True: 0, False: 561k]
  ------------------
  581|      0|        continue;
  582|   561k|      int hcount = _hcount[idx - 1];
  583|   561k|      if (hcount == -1) { // Apply SMILES implicit valence model
  ------------------
  |  Branch (583:11): [True: 546k, False: 15.3k]
  ------------------
  584|   546k|        unsigned int bosum = 0;
  585|  1.13M|        FOR_BONDS_OF_ATOM(bond, &(*atom)) {
  ------------------
  |  |  420|   546k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 1.13M, False: 546k]
  |  |  ------------------
  ------------------
  586|  1.13M|          bosum += bond->GetBondOrder();
  587|  1.13M|        }
  588|   546k|        unsigned int impval = SmilesValence(atom->GetAtomicNum(), bosum);
  589|   546k|        unsigned int imph = impval - bosum;
  590|   546k|        if (imph > 0 && atom->IsAromatic())
  ------------------
  |  Branch (590:13): [True: 368k, False: 177k]
  |  Branch (590:25): [True: 235k, False: 132k]
  ------------------
  591|   235k|          imph--;
  592|   546k|        atom->SetImplicitHCount(imph);
  593|   546k|      }
  594|  15.3k|      else // valence is explicit e.g. [CH3]
  595|  15.3k|        atom->SetImplicitHCount(hcount);
  596|   561k|    }
  597|       |
  598|  6.30k|    mol.EndModify(false);
  599|       |
  600|       |    // Unset any aromatic bonds that *are not* in rings where the two aromatic atoms *are* in a ring
  601|       |    // This is rather subtle, but it's correct and reduces the burden of kekulization
  602|   582k|    FOR_BONDS_OF_MOL(bond, mol) {
  ------------------
  |  |  418|  6.30k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 582k, False: 6.30k]
  |  |  ------------------
  ------------------
  603|   582k|      if (bond->IsAromatic() && !bond->IsInRing()) {
  ------------------
  |  Branch (603:11): [True: 230k, False: 352k]
  |  Branch (603:33): [True: 106k, False: 124k]
  ------------------
  604|   106k|        if (bond->GetBeginAtom()->IsInRing() && bond->GetEndAtom()->IsInRing())
  ------------------
  |  Branch (604:13): [True: 7.68k, False: 98.4k]
  |  Branch (604:49): [True: 1.10k, False: 6.57k]
  ------------------
  605|  1.10k|          bond->SetAromatic(false);
  606|   106k|      }
  607|   582k|    }
  608|       |
  609|       |    // TODO: Only Kekulize if the molecule has a lower case atom
  610|  6.30k|    bool ok = OBKekulize(&mol);
  611|  6.30k|    if (!ok) {
  ------------------
  |  Branch (611:9): [True: 2.55k, False: 3.74k]
  ------------------
  612|  2.55k|      stringstream errorMsg;
  613|  2.55k|      errorMsg << "Failed to kekulize aromatic SMILES";
  614|  2.55k|      std::string title = mol.GetTitle();
  615|  2.55k|      if (!title.empty())
  ------------------
  |  Branch (615:11): [True: 117, False: 2.43k]
  ------------------
  616|    117|        errorMsg << " (title is " << title << ")";
  617|  2.55k|      errorMsg << endl;
  618|  2.55k|      obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
  619|       |      // return false; // Should we return false for a kekulization failure?
  620|  2.55k|    }
  621|       |
  622|       |    // Add the data stored inside the _tetrahedralMap to the atoms now after end
  623|       |    // modify so they don't get lost.
  624|  6.30k|    if(!_tetrahedralMap.empty()) {
  ------------------
  |  Branch (624:8): [True: 516, False: 5.78k]
  ------------------
  625|    516|      OBAtom* atom;
  626|    516|      map<OBAtom*, OBTetrahedralStereo::Config*>::iterator ChiralSearch;
  627|  3.26k|      for(ChiralSearch = _tetrahedralMap.begin(); ChiralSearch != _tetrahedralMap.end(); ++ChiralSearch) {
  ------------------
  |  Branch (627:51): [True: 2.74k, False: 516]
  ------------------
  628|  2.74k|        atom = ChiralSearch->first;
  629|  2.74k|        OBTetrahedralStereo::Config *ts = ChiralSearch->second;
  630|  2.74k|        if (!ts)
  ------------------
  |  Branch (630:13): [True: 0, False: 2.74k]
  ------------------
  631|      0|          continue;
  632|  2.74k|        if (ts->refs.size() != 3)
  ------------------
  |  Branch (632:13): [True: 0, False: 2.74k]
  ------------------
  633|      0|          continue;
  634|  2.74k|        if (ts->refs[2] == OBStereo::NoRef) {
  ------------------
  |  Branch (634:13): [True: 1.13k, False: 1.60k]
  ------------------
  635|       |          // This happens where there is chiral lone pair or where there simply aren't enough connections
  636|       |          // around a chiral atom. We handle the case where there is a S with a chiral lone pair.
  637|       |          // All other cases are ignored, and raise a warning. (Note that S can be chiral even without
  638|       |          // a lone pair, think of C[S@](=X)(=Y)Cl.
  639|       |
  640|       |          // We have remembered where to insert the lone pair in the _chiralLonePair map
  641|  1.13k|          map<unsigned int, char>::iterator m_it = _chiralLonePair.find(atom->GetIdx());
  642|  1.13k|          if (CanHaveLonePair(atom->GetAtomicNum()) && m_it != _chiralLonePair.end()) {
  ------------------
  |  Branch (642:15): [True: 225, False: 912]
  |  Branch (642:15): [True: 225, False: 912]
  |  Branch (642:56): [True: 225, False: 0]
  ------------------
  643|    225|            ts->refs[2] = ts->refs[1]; ts->refs[1] = ts->refs[0];
  644|    225|            if (m_it->second == 0) { // Insert in the 'from' position
  ------------------
  |  Branch (644:17): [True: 40, False: 185]
  ------------------
  645|     40|              ts->refs[0] = ts->from;
  646|     40|              ts->from = OBStereo::ImplicitRef;
  647|     40|            }
  648|    185|            else // Insert in the refs[0] position
  649|    185|              ts->refs[0] = OBStereo::ImplicitRef;
  650|    225|          }
  651|    912|          else { // Ignored by Open Babel
  652|    912|            stringstream ss;
  653|    912|            ss << "Ignoring stereochemistry. Not enough connections to this atom. " << mol.GetTitle();
  654|    912|            obErrorLog.ThrowError(__FUNCTION__, ss.str(), obWarning);
  655|    912|            continue;
  656|    912|          }
  657|  1.13k|        }
  658|       |
  659|       |        // cout << "*ts = " << *ts << endl;
  660|  1.83k|        OBTetrahedralStereo *obts = new OBTetrahedralStereo(&mol);
  661|  1.83k|        obts->SetConfig(*ts);
  662|  1.83k|        mol.SetData(obts);
  663|  1.83k|      }
  664|    516|    }
  665|       |
  666|       |    // Add the data stored inside the _squarePlanarMap to the atoms now after end
  667|       |    // modify so they don't get lost.
  668|  6.30k|    if(!_squarePlanarMap.empty()) {
  ------------------
  |  Branch (668:8): [True: 0, False: 6.30k]
  ------------------
  669|      0|      OBAtom* atom;
  670|      0|      map<OBAtom*, OBSquarePlanarStereo::Config*>::iterator ChiralSearch;
  671|      0|      for(ChiralSearch = _squarePlanarMap.begin(); ChiralSearch != _squarePlanarMap.end(); ++ChiralSearch) {
  ------------------
  |  Branch (671:52): [True: 0, False: 0]
  ------------------
  672|      0|        atom = ChiralSearch->first;
  673|      0|        OBSquarePlanarStereo::Config *sp = ChiralSearch->second;
  674|      0|        if (!sp)
  ------------------
  |  Branch (674:13): [True: 0, False: 0]
  ------------------
  675|      0|          continue;
  676|      0|        if (sp->refs.size() != 4)
  ------------------
  |  Branch (676:13): [True: 0, False: 0]
  ------------------
  677|      0|          continue;
  678|       |
  679|       |        // cout << "*ts = " << *ts << endl;
  680|      0|        OBSquarePlanarStereo *obsp = new OBSquarePlanarStereo(&mol);
  681|      0|        obsp->SetConfig(*sp);
  682|      0|        mol.SetData(obsp);
  683|      0|      }
  684|      0|    }
  685|       |
  686|  6.30k|    if (!_preserve_aromaticity)
  ------------------
  |  Branch (686:9): [True: 6.30k, False: 0]
  ------------------
  687|  6.30k|      mol.SetAromaticPerceived(false);
  688|       |
  689|  6.30k|    CreateCisTrans(mol);
  690|       |
  691|  6.30k|    return(true);
  692|  6.31k|  }
_ZN9OpenBabel14OBSmilesParser4IsUpEPNS_6OBBondE:
  695|   228k|  {
  696|   228k|    map<OBBond*, char>::iterator UpDownSearch;
  697|   228k|    UpDownSearch = _upDownMap.find(bond);
  698|   228k|    if (UpDownSearch != _upDownMap.end())
  ------------------
  |  Branch (698:9): [True: 41.4k, False: 186k]
  ------------------
  699|  41.4k|      if (UpDownSearch->second == BondUpChar)
  ------------------
  |  Branch (699:11): [True: 2.42k, False: 39.0k]
  ------------------
  700|  2.42k|        return true;
  701|   225k|    return false;
  702|   228k|  }
_ZN9OpenBabel14OBSmilesParser6IsDownEPNS_6OBBondE:
  705|   209k|  {
  706|   209k|    map<OBBond*, char>::iterator UpDownSearch;
  707|   209k|    UpDownSearch = _upDownMap.find(bond);
  708|   209k|    if (UpDownSearch != _upDownMap.end())
  ------------------
  |  Branch (708:9): [True: 22.3k, False: 186k]
  ------------------
  709|  22.3k|      if (UpDownSearch->second == BondDownChar)
  ------------------
  |  Branch (709:11): [True: 22.3k, False: 0]
  ------------------
  710|  22.3k|        return true;
  711|   186k|    return false;
  712|   209k|  }
_ZN9OpenBabel14OBSmilesParser20SetRingClosureStereoENS0_14StereoRingBondEPNS_6OBBondE:
  715|  5.65k|  {
  716|       |    // Ring Closure bonds appear twice (at opening and closure).
  717|       |    // If involved in cis/trans stereo, then the stereo may be
  718|       |    // specified at either end or indeed both. Although Open Babel
  719|       |    // will only write out SMILES with the stereo at one end (the end
  720|       |    // on the double bond), it must handle all cases when reading.
  721|       |
  722|       |    // For example:
  723|       |    //
  724|       |    //         C
  725|       |    //        /|
  726|       |    //   C = C |
  727|       |    //  /     \|
  728|       |    // C       N
  729|       |    //
  730|       |    // Can be written as:
  731|       |    // (a) C/C=C/1\NC1 -- preferred
  732|       |    // (b) C/C=C1\NC\1
  733|       |    // (c) C/C=C/1\NC\1
  734|       |    //  or indeed by replacing the "\N" with "N".
  735|       |
  736|       |    // If the stereo chemistry for a ring closure is inconsistently specified,
  737|       |    // it is ignored. In that case, if a stereo symbol does not exist for its
  738|       |    // partner bond on the double bond (e.g. (b) below), then the stereo is unspecified.
  739|       |
  740|       |    // (a) C/C=C/1NC\1 -- specified stereo
  741|       |    // (b) C/C=C/1NC/1  -- ignore ring closure stereo => treated as C/C=C1NC1  => CC=C1NC1
  742|       |    // (c) C/C=C/1\NC/1 -- ignore ring closure stereo => treated as C/C=C1\NC1 => C/C=C/1\NC1
  743|       |
  744|       |    // The ring closure bond is either up or down with respect
  745|       |    // to the double bond. Our task here is to figure out which it is,
  746|       |    // based on the contents of _stereorbond.
  747|       |
  748|  5.65k|    bool found = false; // We have found the answer
  749|  5.65k|    bool updown = true; // The answer
  750|       |
  751|  5.65k|    if (rcstereo.updown[0] == BondUpChar || rcstereo.updown[0] == BondDownChar) { // Is there a stereo symbol at the opening?
  ------------------
  |  Branch (751:9): [True: 109, False: 5.55k]
  |  Branch (751:45): [True: 4.78k, False: 767]
  ------------------
  752|  4.89k|      bool on_dbl_bond = (rcstereo.atoms[0] == dbl_bond->GetBeginAtom() || rcstereo.atoms[0] == dbl_bond->GetEndAtom());
  ------------------
  |  Branch (752:27): [True: 2.16k, False: 2.72k]
  |  Branch (752:76): [True: 264, False: 2.46k]
  ------------------
  753|  4.89k|      updown = (rcstereo.updown[0]==BondUpChar) ^ on_dbl_bond;
  754|  4.89k|      found = true;
  755|  4.89k|    }
  756|  5.65k|    if (rcstereo.updown[1] == BondUpChar || rcstereo.updown[1] == BondDownChar) { // Is there a stereo symbol at the closing?
  ------------------
  |  Branch (756:9): [True: 20, False: 5.63k]
  |  Branch (756:45): [True: 4.57k, False: 1.06k]
  ------------------
  757|  4.59k|      bool on_dbl_bond = (rcstereo.atoms[1] == dbl_bond->GetBeginAtom() || rcstereo.atoms[1] == dbl_bond->GetEndAtom());
  ------------------
  |  Branch (757:27): [True: 1.73k, False: 2.85k]
  |  Branch (757:76): [True: 310, False: 2.54k]
  ------------------
  758|  4.59k|      bool new_updown = (rcstereo.updown[1]==BondUpChar) ^ on_dbl_bond;
  759|  4.59k|      if (!found) {
  ------------------
  |  Branch (759:11): [True: 762, False: 3.83k]
  ------------------
  760|    762|        updown = new_updown;
  761|    762|        found = true;
  762|    762|      }
  763|  3.83k|      else if (new_updown != updown) {
  ------------------
  |  Branch (763:16): [True: 3.81k, False: 16]
  ------------------
  764|  3.81k|        obErrorLog.ThrowError(__FUNCTION__, "Ignoring the cis/trans stereochemistry specified for the ring closure\n  as it is inconsistent.", obWarning);
  765|  3.81k|        found = false;
  766|  3.81k|      }
  767|  4.59k|    }
  768|       |
  769|  5.65k|    if (!found)
  ------------------
  |  Branch (769:9): [True: 3.82k, False: 1.83k]
  ------------------
  770|  3.82k|      return 0;
  771|  1.83k|    else
  772|  1.83k|      return updown ? 1 : 2;
  ------------------
  |  Branch (772:14): [True: 638, False: 1.20k]
  ------------------
  773|  5.65k|  }
_ZN9OpenBabel14OBSmilesParser14CreateCisTransERNS_5OBMolE:
  776|  6.30k|  {
  777|       |    // Create a vector of CisTransStereo objects for the molecule
  778|   582k|    FOR_BONDS_OF_MOL(dbi, mol) {
  ------------------
  |  |  418|  6.30k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 582k, False: 6.30k]
  |  |  ------------------
  ------------------
  779|       |
  780|   582k|      OBBond *dbl_bond = &(*dbi);
  781|       |
  782|       |      // Not a double bond?
  783|   582k|      if (dbl_bond->GetBondOrder()!=2 || dbl_bond->IsAromatic())
  ------------------
  |  Branch (783:11): [True: 477k, False: 104k]
  |  Branch (783:42): [True: 256, False: 104k]
  ------------------
  784|   477k|        continue;
  785|       |
  786|       |      // Find the single bonds around the atoms connected by the double bond.
  787|       |
  788|   104k|      OBAtom *a1 = dbl_bond->GetBeginAtom();
  789|   104k|      OBAtom *a2 = dbl_bond->GetEndAtom();
  790|       |
  791|       |      // Check that both atoms on the double bond have at least one
  792|       |      // other neighbor, but not more than two other neighbors;
  793|       |      // Note: In theory, we could relax the second requirement but we would
  794|       |      //       need to change the data structure we use to store cis/trans
  795|       |      //       stereo to only store 2 refs instead of 4
  796|   104k|      int v1 = a1->GetExplicitDegree();
  797|   104k|      int v2 = a2->GetExplicitDegree();
  798|   104k|      if (v1 < 2 || v1 > 3 || v2 < 2 || v2 > 3) {
  ------------------
  |  Branch (798:11): [True: 1.32k, False: 102k]
  |  Branch (798:21): [True: 4.03k, False: 98.9k]
  |  Branch (798:31): [True: 1.55k, False: 97.3k]
  |  Branch (798:41): [True: 270, False: 97.0k]
  ------------------
  799|  7.19k|        continue;
  800|  7.19k|      }
  801|       |
  802|  97.0k|      vector<OBAtom*> dbl_bond_atoms;
  803|  97.0k|      dbl_bond_atoms.push_back(a1);
  804|  97.0k|      dbl_bond_atoms.push_back(a2);
  805|       |
  806|  97.0k|      vector<bool> bond_stereo(2, true); // Store the stereo of the chosen bonds at each end of the dbl bond
  807|  97.0k|      vector<OBBond*> stereo_bond(2, nullptr); // These are the chosen stereo bonds
  808|  97.0k|      vector<OBBond*> other_bond(2, nullptr);  // These are the 'other' bonds at each end
  809|       |
  810|   291k|      for (int i = 0; i < 2; ++i) { // Loop over each end of the double bond in turn
  ------------------
  |  Branch (810:23): [True: 194k, False: 97.0k]
  ------------------
  811|       |
  812|   404k|        FOR_BONDS_OF_ATOM(bi, dbl_bond_atoms[i]) {
  ------------------
  |  |  420|   194k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 404k, False: 194k]
  |  |  ------------------
  ------------------
  813|   404k|          OBBond *b = &(*bi);
  814|   404k|          if (b == dbl_bond) continue;
  ------------------
  |  Branch (814:15): [True: 194k, False: 210k]
  ------------------
  815|   210k|          if (!(IsUp(b) || IsDown(b))) {
  ------------------
  |  Branch (815:17): [True: 1.27k, False: 209k]
  |  Branch (815:28): [True: 22.3k, False: 186k]
  ------------------
  816|   186k|            other_bond[i] = b; // Use this for the 'other' bond
  817|   186k|            continue;
  818|   186k|          }
  819|       |
  820|  23.5k|          bool found = true;
  821|  23.5k|          bool stereo;
  822|  23.5k|          map<OBBond*, StereoRingBond>::iterator sb_it = _stereorbond.find(b);
  823|  23.5k|          if (sb_it == _stereorbond.end()) // Not a ring closure
  ------------------
  |  Branch (823:15): [True: 17.9k, False: 5.65k]
  ------------------
  824|       |            // True/False for "up/down if moved to before the double bond C"
  825|  17.9k|            stereo = !(IsUp(b) ^ (b->GetNbrAtomIdx(dbl_bond_atoms[i]) < dbl_bond_atoms[i]->GetIdx())) ;
  826|  5.65k|          else  {                                                               // Is a ring closure
  827|  5.65k|            char bc_result = SetRingClosureStereo(sb_it->second, dbl_bond);
  828|  5.65k|            if (bc_result)
  ------------------
  |  Branch (828:17): [True: 1.83k, False: 3.82k]
  ------------------
  829|  1.83k|              stereo = bc_result == 1 ? true : false;
  ------------------
  |  Branch (829:24): [True: 638, False: 1.20k]
  ------------------
  830|  3.82k|            else
  831|  3.82k|              found = false;
  832|  5.65k|          }
  833|       |
  834|  23.5k|          if (!found) { // This cannot be used as the stereo bond
  ------------------
  |  Branch (834:15): [True: 3.82k, False: 19.7k]
  ------------------
  835|  3.82k|            other_bond[i] = b; // Use this for the 'other' bond
  836|  3.82k|            continue;
  837|  3.82k|          }
  838|       |
  839|  19.7k|          if (stereo_bond[i] == nullptr) { // This is a first stereo bond
  ------------------
  |  Branch (839:15): [True: 19.6k, False: 89]
  ------------------
  840|  19.6k|            stereo_bond[i] = b; // Use this for the 'stereo' bond
  841|  19.6k|            bond_stereo[i] = stereo;
  842|  19.6k|          }
  843|     89|          else {               // This is a second stereo bond
  844|     89|            if (stereo != bond_stereo[i]) { // Verify that the other stereo bond (on the same atom) has opposite stereo
  ------------------
  |  Branch (844:17): [True: 65, False: 24]
  ------------------
  845|     65|              other_bond[i] = b; // Use this for the 'other' bond
  846|     65|            }
  847|     24|            else  {
  848|     24|              obErrorLog.ThrowError(__FUNCTION__, "Error in cis/trans stereochemistry specified for the double bond\n", obWarning);
  849|     24|              stereo_bond[i] = nullptr;
  850|     24|            }
  851|     89|          }
  852|  19.7k|        }
  853|   194k|      }
  854|       |
  855|  97.0k|      if (stereo_bond[0] == nullptr || stereo_bond[1] == nullptr) continue; // No cis/trans
  ------------------
  |  Branch (855:11): [True: 87.1k, False: 9.89k]
  |  Branch (855:40): [True: 1.68k, False: 8.20k]
  ------------------
  856|       |
  857|       |      // other_bond will contain NULLs if there are bonds to implicit hydrogens
  858|  8.20k|      unsigned int second = (other_bond[0] == nullptr) ? OBStereo::ImplicitRef : other_bond[0]->GetNbrAtom(a1)->GetId();
  ------------------
  |  Branch (858:29): [True: 7.83k, False: 366]
  ------------------
  859|  8.20k|      unsigned int fourth = (other_bond[1] == nullptr) ? OBStereo::ImplicitRef : other_bond[1]->GetNbrAtom(a2)->GetId();
  ------------------
  |  Branch (859:29): [True: 7.56k, False: 643]
  ------------------
  860|       |
  861|       |
  862|  8.20k|      OBCisTransStereo *ct = new OBCisTransStereo(&mol);
  863|  8.20k|      OBCisTransStereo::Config cfg;
  864|  8.20k|      cfg.begin = a1->GetId();
  865|  8.20k|      cfg.end = a2->GetId();
  866|       |
  867|       |       // If bond_stereo[0]==bond_stereo[1], this means cis for stereo_bond[0] and stereo_bond[1].
  868|  8.20k|      if (bond_stereo[0] == bond_stereo[1])
  ------------------
  |  Branch (868:11): [True: 1.69k, False: 6.50k]
  ------------------
  869|  1.69k|        cfg.refs = OBStereo::MakeRefs(stereo_bond[0]->GetNbrAtom(a1)->GetId(), second,
  870|  1.69k|                                      fourth, stereo_bond[1]->GetNbrAtom(a2)->GetId());
  871|  6.50k|      else
  872|  6.50k|        cfg.refs = OBStereo::MakeRefs(stereo_bond[0]->GetNbrAtom(a1)->GetId(), second,
  873|  6.50k|                                      stereo_bond[1]->GetNbrAtom(a2)->GetId(), fourth);
  874|  8.20k|      ct->SetConfig(cfg);
  875|       |      // add the data to the atom
  876|  8.20k|      mol.SetData(ct);
  877|  8.20k|    }
  878|  6.30k|  }
_ZN9OpenBabel14OBSmilesParser20InsertTetrahedralRefERNS_5OBMolEm:
  881|   832k|  {
  882|   832k|    map<OBAtom*, OBTetrahedralStereo::Config*>::iterator ChiralSearch;
  883|   832k|    ChiralSearch = _tetrahedralMap.find(mol.GetAtom(_prev));
  884|   832k|    if (ChiralSearch != _tetrahedralMap.end() && ChiralSearch->second != nullptr)
  ------------------
  |  Branch (884:9): [True: 5.24k, False: 827k]
  |  Branch (884:9): [True: 5.24k, False: 827k]
  |  Branch (884:50): [True: 5.24k, False: 0]
  ------------------
  885|  5.24k|    {
  886|  5.24k|      int insertpos = NumConnections(ChiralSearch->first, id == OBStereo::ImplicitRef) - 2; // -1 indicates "from"
  887|  5.24k|      if (insertpos > 2)
  ------------------
  |  Branch (887:11): [True: 302, False: 4.94k]
  ------------------
  888|    302|        return;
  889|  4.94k|      if (insertpos < 0) {
  ------------------
  |  Branch (889:11): [True: 771, False: 4.17k]
  ------------------
  890|    771|        if (ChiralSearch->second->from != OBStereo::NoRef)
  ------------------
  |  Branch (890:13): [True: 543, False: 228]
  ------------------
  891|    543|          obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previous from reference id.", obWarning);
  892|       |
  893|    771|        (ChiralSearch->second)->from = id;
  894|       |        // cerr << "Adding " << id << " at Config.from to " << ChiralSearch->second << endl;
  895|  4.17k|      } else {
  896|  4.17k|        if (ChiralSearch->second->refs[insertpos] != OBStereo::NoRef)
  ------------------
  |  Branch (896:13): [True: 288, False: 3.88k]
  ------------------
  897|    288|          obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previously set reference id.", obWarning);
  898|       |
  899|  4.17k|        (ChiralSearch->second)->refs[insertpos] = id;
  900|       |        // cerr << "Adding " << id << " at " << insertpos << " to " << ChiralSearch->second << endl;
  901|  4.17k|      }
  902|  4.94k|    }
  903|   832k|  }
_ZN9OpenBabel14OBSmilesParser21InsertSquarePlanarRefERNS_5OBMolEm:
  906|   831k|  {
  907|   831k|    map<OBAtom*, OBSquarePlanarStereo::Config*>::iterator ChiralSearch;
  908|   831k|    ChiralSearch = _squarePlanarMap.find(mol.GetAtom(_prev));
  909|   831k|    if (ChiralSearch != _squarePlanarMap.end() && ChiralSearch->second != nullptr)
  ------------------
  |  Branch (909:9): [True: 0, False: 831k]
  |  Branch (909:9): [True: 0, False: 831k]
  |  Branch (909:51): [True: 0, False: 0]
  ------------------
  910|      0|    {
  911|      0|      int insertpos = NumConnections(ChiralSearch->first) - 1;
  912|      0|      switch(insertpos) {
  913|      0|      case -1:
  ------------------
  |  Branch (913:7): [True: 0, False: 0]
  ------------------
  914|      0|        if (ChiralSearch->second->refs[0] != OBStereo::NoRef)
  ------------------
  |  Branch (914:13): [True: 0, False: 0]
  ------------------
  915|      0|          obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previous from reference id.", obWarning);
  916|      0|        (ChiralSearch->second)->refs[0] = id;
  917|      0|        break;
  918|      0|      case 0: case 1: case 2: case 3:
  ------------------
  |  Branch (918:7): [True: 0, False: 0]
  |  Branch (918:15): [True: 0, False: 0]
  |  Branch (918:23): [True: 0, False: 0]
  |  Branch (918:31): [True: 0, False: 0]
  ------------------
  919|      0|        if (ChiralSearch->second->refs[insertpos] != OBStereo::NoRef)
  ------------------
  |  Branch (919:13): [True: 0, False: 0]
  ------------------
  920|      0|          obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previously set reference id.", obWarning);
  921|      0|        (ChiralSearch->second)->refs[insertpos] = id;
  922|      0|        break;
  923|      0|      default:
  ------------------
  |  Branch (923:7): [True: 0, False: 0]
  ------------------
  924|      0|        obErrorLog.ThrowError(__FUNCTION__, "Warning: Square planar stereo specified for atom with more than 4 connections.", obWarning);
  925|      0|        break;
  926|      0|      }
  927|      0|    }
  928|   831k|  }
_ZN9OpenBabel14OBSmilesParser11ParseSimpleERNS_5OBMolE:
  931|   767k|  {
  932|   767k|    int element;
  933|   767k|    bool arom=false;
  934|       |
  935|   767k|    switch(*_ptr)
  936|   767k|      {
  937|  2.54k|      case '*':
  ------------------
  |  Branch (937:7): [True: 2.54k, False: 764k]
  ------------------
  938|  2.54k|        element = 0;
  939|  2.54k|        arom = false;
  940|  2.54k|        break;
  941|       |
  942|   257k|      case 'C':
  ------------------
  |  Branch (942:7): [True: 257k, False: 509k]
  ------------------
  943|   257k|        _ptr++;
  944|   257k|        if (*_ptr == 'l')
  ------------------
  |  Branch (944:13): [True: 172, False: 257k]
  ------------------
  945|    172|          {
  946|    172|            element = 17;
  947|    172|          }
  948|   257k|        else
  949|   257k|          {
  950|   257k|            element = 6;
  951|   257k|            _ptr--;
  952|   257k|          }
  953|   257k|        break;
  954|       |
  955|  31.1k|      case 'N':
  ------------------
  |  Branch (955:7): [True: 31.1k, False: 735k]
  ------------------
  956|  31.1k|        element = 7;
  957|  31.1k|        break;
  958|  2.07k|      case 'O':
  ------------------
  |  Branch (958:7): [True: 2.07k, False: 765k]
  ------------------
  959|  2.07k|        element = 8;
  960|  2.07k|        break;
  961|  5.15k|      case 'S':
  ------------------
  |  Branch (961:7): [True: 5.15k, False: 761k]
  ------------------
  962|  5.15k|        element = 16;
  963|  5.15k|        break;
  964|  2.61k|      case 'P':
  ------------------
  |  Branch (964:7): [True: 2.61k, False: 764k]
  ------------------
  965|  2.61k|        element = 15;
  966|  2.61k|        break;
  967|  77.2k|      case 'F':
  ------------------
  |  Branch (967:7): [True: 77.2k, False: 689k]
  ------------------
  968|  77.2k|        element = 9;
  969|  77.2k|        break;
  970|  49.1k|      case 'I':
  ------------------
  |  Branch (970:7): [True: 49.1k, False: 717k]
  ------------------
  971|  49.1k|        element = 53;
  972|  49.1k|        break;
  973|       |
  974|  15.2k|      case 'B':
  ------------------
  |  Branch (974:7): [True: 15.2k, False: 751k]
  ------------------
  975|  15.2k|        _ptr++;
  976|  15.2k|        if (*_ptr == 'r')
  ------------------
  |  Branch (976:13): [True: 77, False: 15.2k]
  ------------------
  977|     77|          {
  978|     77|            element = 35;
  979|     77|          }
  980|  15.2k|        else
  981|  15.2k|          {
  982|  15.2k|            element = 5;
  983|  15.2k|            _ptr--;
  984|  15.2k|          }
  985|  15.2k|        break;
  986|       |
  987|       |      // aromatics
  988|  22.4k|      case 'b':
  ------------------
  |  Branch (988:7): [True: 22.4k, False: 744k]
  ------------------
  989|  22.4k|        arom = true;
  990|  22.4k|        element = 5;
  991|  22.4k|        break;
  992|  73.0k|      case 'c':
  ------------------
  |  Branch (992:7): [True: 73.0k, False: 693k]
  ------------------
  993|  73.0k|        arom = true;
  994|  73.0k|        element = 6;
  995|  73.0k|        break;
  996|   175k|      case 'n':
  ------------------
  |  Branch (996:7): [True: 175k, False: 591k]
  ------------------
  997|   175k|        arom = true;
  998|   175k|        element = 7;
  999|   175k|        break;
 1000|  10.7k|      case 'o':
  ------------------
  |  Branch (1000:7): [True: 10.7k, False: 756k]
  ------------------
 1001|  10.7k|        arom = true;
 1002|  10.7k|        element = 8;
 1003|  10.7k|        break;
 1004|  27.1k|      case 'p':
  ------------------
  |  Branch (1004:7): [True: 27.1k, False: 739k]
  ------------------
 1005|  27.1k|        arom = true;
 1006|  27.1k|        element = 15;
 1007|  27.1k|        break;
 1008|  14.9k|      case 's':
  ------------------
  |  Branch (1008:7): [True: 14.9k, False: 752k]
  ------------------
 1009|  14.9k|        arom = true;
 1010|  14.9k|        element = 16;
 1011|  14.9k|        break;
 1012|    149|      default:
  ------------------
  |  Branch (1012:7): [True: 149, False: 766k]
  ------------------
 1013|    149|        {
 1014|    149|        std::string err;
 1015|    149|        err += "SMILES string contains a character '";
 1016|    149|        err += *_ptr;
 1017|    149|        err += "' which is invalid";
 1018|    149|        obErrorLog.ThrowError(__FUNCTION__,
 1019|    149|          err, obError);
 1020|    149|        return false;
 1021|      0|        }
 1022|   767k|      }
 1023|       |
 1024|   766k|    OBAtom *atom = mol.NewAtom();
 1025|   766k|    atom->SetAtomicNum(element);
 1026|   766k|    if (_rxnrole > 1) { // Quick test for reaction
  ------------------
  |  Branch (1026:9): [True: 3.32k, False: 763k]
  ------------------
 1027|       |      // Set reaction role
 1028|  3.32k|      OBPairInteger *pi = new OBPairInteger();
 1029|  3.32k|      pi->SetAttribute("rxnrole");
 1030|  3.32k|      pi->SetValue(_rxnrole);
 1031|  3.32k|      atom->SetData(pi);
 1032|  3.32k|    }
 1033|       |
 1034|   766k|    if (arom)
  ------------------
  |  Branch (1034:9): [True: 324k, False: 442k]
  ------------------
 1035|   324k|      atom->SetAromatic();
 1036|       |
 1037|   766k|    if (_prev) //need to add bond
  ------------------
  |  Branch (1037:9): [True: 759k, False: 7.71k]
  ------------------
 1038|   759k|      {
 1039|   759k|        OBAtom* prevatom = mol.GetAtom(_prev);
 1040|   759k|        assert(prevatom);
 1041|   759k|        if (arom && prevatom->IsAromatic() && _order == 0)
  ------------------
  |  Branch (1041:13): [True: 318k, False: 441k]
  |  Branch (1041:21): [True: 261k, False: 56.8k]
  |  Branch (1041:47): [True: 248k, False: 12.6k]
  ------------------
 1042|   248k|          mol.AddBond(_prev, mol.NumAtoms(), 1, OB_AROMATIC_BOND); // this will be kekulized later
  ------------------
  |  |   41|   248k|#define OB_AROMATIC_BOND  (1<<1)
  ------------------
 1043|   510k|        else
 1044|   510k|          mol.AddBond(_prev, mol.NumAtoms(), _order == 0 ? 1 : _order);
  ------------------
  |  Branch (1044:46): [True: 484k, False: 25.6k]
  ------------------
 1045|       |        // store up/down
 1046|   759k|        if (_updown == BondUpChar || _updown == BondDownChar)
  ------------------
  |  Branch (1046:13): [True: 943, False: 758k]
  |  Branch (1046:38): [True: 12.5k, False: 745k]
  ------------------
 1047|  13.5k|          _upDownMap[mol.GetBond(_prev, mol.NumAtoms())] = _updown;
 1048|       |
 1049|   759k|        InsertTetrahedralRef(mol, mol.NumAtoms() - 1);
 1050|   759k|        InsertSquarePlanarRef(mol, mol.NumAtoms() - 1);
 1051|   759k|      }
 1052|       |
 1053|       |    //set values
 1054|   766k|    _prev = mol.NumAtoms();
 1055|   766k|    _order = 0; // the default is that no bond symbol has been seen
 1056|   766k|    _updown = ' ';
 1057|       |
 1058|   766k|    _hcount.push_back(-1); // implicit hydrogen count
 1059|       |
 1060|   766k|    return(true);
 1061|   767k|  }
_ZN9OpenBabel14OBSmilesParser12ParseComplexERNS_5OBMolE:
 1064|  19.7k|  {
 1065|  19.7k|    int element=0;
 1066|  19.7k|    bool arom=false;
 1067|       |
 1068|  19.7k|    _ptr++;
 1069|       |
 1070|       |    // Parse isotope information
 1071|       |    // - we parse anything with 1 to 4 digits
 1072|       |    // - any bigger and we risk overflowing the short int used to
 1073|       |    //   store the isotope information (max 65536)
 1074|  19.7k|    int isotope = 0;
 1075|  19.7k|    unsigned int size = 0;
 1076|  57.1k|    for (;*_ptr && isdigit(*_ptr) && size < 5;_ptr++) {
  ------------------
  |  Branch (1076:11): [True: 57.1k, False: 23]
  |  Branch (1076:20): [True: 37.4k, False: 19.7k]
  |  Branch (1076:38): [True: 37.4k, False: 3]
  ------------------
 1077|  37.4k|      isotope *= 10;
 1078|  37.4k|      isotope += *_ptr - '0';
 1079|  37.4k|      size++;
 1080|  37.4k|    }
 1081|  19.7k|    if (size == 5)
  ------------------
  |  Branch (1081:9): [True: 5, False: 19.7k]
  ------------------
 1082|      5|      return false;
 1083|       |
 1084|       |    //parse element data
 1085|  19.7k|    switch(*_ptr)
 1086|  19.7k|    {
 1087|     11|      case '*':
  ------------------
  |  Branch (1087:7): [True: 11, False: 19.7k]
  ------------------
 1088|     11|        element = 0;
 1089|     11|        break;
 1090|       |
 1091|  1.49k|      case 'C':
  ------------------
  |  Branch (1091:7): [True: 1.49k, False: 18.2k]
  ------------------
 1092|  1.49k|        _ptr++;
 1093|  1.49k|        switch(*_ptr)
 1094|  1.49k|          {
 1095|     31|          case 'a':
  ------------------
  |  Branch (1095:11): [True: 31, False: 1.46k]
  ------------------
 1096|     31|            element = 20;
 1097|     31|            break;
 1098|     92|          case 'd':
  ------------------
  |  Branch (1098:11): [True: 92, False: 1.40k]
  ------------------
 1099|     92|            element = 48;
 1100|     92|            break;
 1101|    102|          case 'e':
  ------------------
  |  Branch (1101:11): [True: 102, False: 1.39k]
  ------------------
 1102|    102|            element = 58;
 1103|    102|            break;
 1104|    121|          case 'f':
  ------------------
  |  Branch (1104:11): [True: 121, False: 1.37k]
  ------------------
 1105|    121|            element = 98;
 1106|    121|            break;
 1107|     67|          case 'l':
  ------------------
  |  Branch (1107:11): [True: 67, False: 1.42k]
  ------------------
 1108|     67|            element = 17;
 1109|     67|            break;
 1110|    171|          case 'm':
  ------------------
  |  Branch (1110:11): [True: 171, False: 1.32k]
  ------------------
 1111|    171|            element = 96;
 1112|    171|            break;
 1113|     38|          case 'n':
  ------------------
  |  Branch (1113:11): [True: 38, False: 1.45k]
  ------------------
 1114|     38|            element = 112;
 1115|     38|            break;
 1116|    302|          case 'o':
  ------------------
  |  Branch (1116:11): [True: 302, False: 1.19k]
  ------------------
 1117|    302|            element = 27;
 1118|    302|            break;
 1119|     84|          case 'r':
  ------------------
  |  Branch (1119:11): [True: 84, False: 1.41k]
  ------------------
 1120|     84|            element = 24;
 1121|     84|            break;
 1122|    166|          case 's':
  ------------------
  |  Branch (1122:11): [True: 166, False: 1.32k]
  ------------------
 1123|    166|            element = 55;
 1124|    166|            break;
 1125|    237|          case 'u':
  ------------------
  |  Branch (1125:11): [True: 237, False: 1.25k]
  ------------------
 1126|    237|            element = 29;
 1127|    237|            break;
 1128|     84|          default:
  ------------------
  |  Branch (1128:11): [True: 84, False: 1.41k]
  ------------------
 1129|     84|            element =  6;
 1130|     84|            _ptr--;
 1131|  1.49k|          }
 1132|  1.49k|        break;
 1133|       |
 1134|  1.49k|      case 'N':
  ------------------
  |  Branch (1134:7): [True: 1.00k, False: 18.7k]
  ------------------
 1135|  1.00k|        _ptr++;
 1136|  1.00k|        switch(*_ptr)
 1137|  1.00k|          {
 1138|     26|          case 'a':
  ------------------
  |  Branch (1138:11): [True: 26, False: 983]
  ------------------
 1139|     26|            element =  11;
 1140|     26|            break;
 1141|    210|          case 'b':
  ------------------
  |  Branch (1141:11): [True: 210, False: 799]
  ------------------
 1142|    210|            element =  41;
 1143|    210|            break;
 1144|    159|          case 'd':
  ------------------
  |  Branch (1144:11): [True: 159, False: 850]
  ------------------
 1145|    159|            element =  60;
 1146|    159|            break;
 1147|    129|          case 'e':
  ------------------
  |  Branch (1147:11): [True: 129, False: 880]
  ------------------
 1148|    129|            element =  10;
 1149|    129|            break;
 1150|    108|          case 'h':
  ------------------
  |  Branch (1150:11): [True: 108, False: 901]
  ------------------
 1151|    108|            element = 113;
 1152|    108|            break;
 1153|    210|          case 'i':
  ------------------
  |  Branch (1153:11): [True: 210, False: 799]
  ------------------
 1154|    210|            element =  28;
 1155|    210|            break;
 1156|     33|          case 'o':
  ------------------
  |  Branch (1156:11): [True: 33, False: 976]
  ------------------
 1157|     33|            element = 102;
 1158|     33|            break;
 1159|     60|          case 'p':
  ------------------
  |  Branch (1159:11): [True: 60, False: 949]
  ------------------
 1160|     60|            element =  93;
 1161|     60|            break;
 1162|     74|          default:
  ------------------
  |  Branch (1162:11): [True: 74, False: 935]
  ------------------
 1163|     74|            element =   7;
 1164|     74|            _ptr--;
 1165|  1.00k|          }
 1166|  1.00k|        break;
 1167|       |
 1168|  1.00k|      case 'O':
  ------------------
  |  Branch (1168:7): [True: 159, False: 19.5k]
  ------------------
 1169|    159|        _ptr++;
 1170|    159|        switch(*_ptr) {
 1171|      6|        case 'g':
  ------------------
  |  Branch (1171:9): [True: 6, False: 153]
  ------------------
 1172|      6|          element = 118;
 1173|      6|          break;
 1174|     67|        case 's':
  ------------------
  |  Branch (1174:9): [True: 67, False: 92]
  ------------------
 1175|     67|          element = 76;
 1176|     67|          break;
 1177|     86|        default:
  ------------------
  |  Branch (1177:9): [True: 86, False: 73]
  ------------------
 1178|     86|          element = 8;
 1179|     86|          _ptr--;
 1180|    159|        }
 1181|    159|        break;
 1182|       |
 1183|  1.19k|      case 'P':
  ------------------
  |  Branch (1183:7): [True: 1.19k, False: 18.5k]
  ------------------
 1184|  1.19k|        _ptr++;
 1185|  1.19k|        switch(*_ptr)
 1186|  1.19k|          {
 1187|     90|          case 'a':
  ------------------
  |  Branch (1187:11): [True: 90, False: 1.10k]
  ------------------
 1188|     90|            element = 91;
 1189|     90|            break;
 1190|    144|          case 'b':
  ------------------
  |  Branch (1190:11): [True: 144, False: 1.04k]
  ------------------
 1191|    144|            element = 82;
 1192|    144|            break;
 1193|    116|          case 'd':
  ------------------
  |  Branch (1193:11): [True: 116, False: 1.07k]
  ------------------
 1194|    116|            element = 46;
 1195|    116|            break;
 1196|    296|          case 'm':
  ------------------
  |  Branch (1196:11): [True: 296, False: 895]
  ------------------
 1197|    296|            element = 61;
 1198|    296|            break;
 1199|     73|          case 'o':
  ------------------
  |  Branch (1199:11): [True: 73, False: 1.11k]
  ------------------
 1200|     73|            element = 84;
 1201|     73|            break;
 1202|    126|          case 'r':
  ------------------
  |  Branch (1202:11): [True: 126, False: 1.06k]
  ------------------
 1203|    126|            element = 59;
 1204|    126|            break;
 1205|    256|          case 't':
  ------------------
  |  Branch (1205:11): [True: 256, False: 935]
  ------------------
 1206|    256|            element = 78;
 1207|    256|            break;
 1208|     39|          case 'u':
  ------------------
  |  Branch (1208:11): [True: 39, False: 1.15k]
  ------------------
 1209|     39|            element = 94;
 1210|     39|            break;
 1211|     51|          default:
  ------------------
  |  Branch (1211:11): [True: 51, False: 1.14k]
  ------------------
 1212|     51|            element = 15;
 1213|     51|            _ptr--;
 1214|  1.19k|          }
 1215|  1.19k|        break;
 1216|       |
 1217|  4.32k|      case('S'):
  ------------------
  |  Branch (1217:7): [True: 4.32k, False: 15.4k]
  ------------------
 1218|  4.32k|        _ptr++;
 1219|  4.32k|        switch(*_ptr)
 1220|  4.32k|          {
 1221|  2.51k|          case 'b':
  ------------------
  |  Branch (1221:11): [True: 2.51k, False: 1.80k]
  ------------------
 1222|  2.51k|            element = 51;
 1223|  2.51k|            break;
 1224|     27|          case 'c':
  ------------------
  |  Branch (1224:11): [True: 27, False: 4.29k]
  ------------------
 1225|     27|            element = 21;
 1226|     27|            break;
 1227|     80|          case 'e':
  ------------------
  |  Branch (1227:11): [True: 80, False: 4.24k]
  ------------------
 1228|     80|            element = 34;
 1229|     80|            break;
 1230|     21|          case 'g':
  ------------------
  |  Branch (1230:11): [True: 21, False: 4.30k]
  ------------------
 1231|     21|            element = 106;
 1232|     21|            break;
 1233|     45|          case 'i':
  ------------------
  |  Branch (1233:11): [True: 45, False: 4.27k]
  ------------------
 1234|     45|            element = 14;
 1235|     45|            break;
 1236|  1.00k|          case 'm':
  ------------------
  |  Branch (1236:11): [True: 1.00k, False: 3.31k]
  ------------------
 1237|  1.00k|            element = 62;
 1238|  1.00k|            break;
 1239|    187|          case 'n':
  ------------------
  |  Branch (1239:11): [True: 187, False: 4.13k]
  ------------------
 1240|    187|            element = 50;
 1241|    187|            break;
 1242|    170|          case 'r':
  ------------------
  |  Branch (1242:11): [True: 170, False: 4.15k]
  ------------------
 1243|    170|            element = 38;
 1244|    170|            break;
 1245|    271|          default:
  ------------------
  |  Branch (1245:11): [True: 271, False: 4.05k]
  ------------------
 1246|    271|            element = 16;
 1247|    271|            _ptr--;
 1248|  4.32k|          }
 1249|  4.32k|        break;
 1250|       |
 1251|  4.32k|      case 'B':
  ------------------
  |  Branch (1251:7): [True: 381, False: 19.3k]
  ------------------
 1252|    381|        _ptr++;
 1253|    381|        switch(*_ptr)
 1254|    381|          {
 1255|     83|          case 'a':
  ------------------
  |  Branch (1255:11): [True: 83, False: 298]
  ------------------
 1256|     83|            element = 56;
 1257|     83|            break;
 1258|     25|          case 'e':
  ------------------
  |  Branch (1258:11): [True: 25, False: 356]
  ------------------
 1259|     25|            element =  4;
 1260|     25|            break;
 1261|     41|          case 'h':
  ------------------
  |  Branch (1261:11): [True: 41, False: 340]
  ------------------
 1262|     41|            element =  107;
 1263|     41|            break;
 1264|     10|          case 'i':
  ------------------
  |  Branch (1264:11): [True: 10, False: 371]
  ------------------
 1265|     10|            element = 83;
 1266|     10|            break;
 1267|      6|          case 'k':
  ------------------
  |  Branch (1267:11): [True: 6, False: 375]
  ------------------
 1268|      6|            element = 97;
 1269|      6|            break;
 1270|    191|          case 'r':
  ------------------
  |  Branch (1270:11): [True: 191, False: 190]
  ------------------
 1271|    191|            element = 35;
 1272|    191|            break;
 1273|     25|          default:
  ------------------
  |  Branch (1273:11): [True: 25, False: 356]
  ------------------
 1274|     25|            element = 5;
 1275|     25|            _ptr--;
 1276|    381|          }
 1277|    381|        break;
 1278|       |
 1279|    381|      case 'F':
  ------------------
  |  Branch (1279:7): [True: 261, False: 19.4k]
  ------------------
 1280|    261|        _ptr++;
 1281|    261|        switch(*_ptr)
 1282|    261|          {
 1283|    121|          case 'e':
  ------------------
  |  Branch (1283:11): [True: 121, False: 140]
  ------------------
 1284|    121|            element = 26;
 1285|    121|            break;
 1286|      5|          case 'l':
  ------------------
  |  Branch (1286:11): [True: 5, False: 256]
  ------------------
 1287|      5|            element = 114;
 1288|      5|            break;
 1289|     66|          case 'm':
  ------------------
  |  Branch (1289:11): [True: 66, False: 195]
  ------------------
 1290|     66|            element = 100;
 1291|     66|            break;
 1292|     44|          case 'r':
  ------------------
  |  Branch (1292:11): [True: 44, False: 217]
  ------------------
 1293|     44|            element = 87;
 1294|     44|            break;
 1295|     25|          default:
  ------------------
  |  Branch (1295:11): [True: 25, False: 236]
  ------------------
 1296|     25|            element = 9;
 1297|     25|            _ptr--;
 1298|    261|          }
 1299|    261|        break;
 1300|       |
 1301|    413|      case 'I':
  ------------------
  |  Branch (1301:7): [True: 413, False: 19.3k]
  ------------------
 1302|    413|        _ptr++;
 1303|    413|        switch(*_ptr)
 1304|    413|          {
 1305|    146|          case 'n':
  ------------------
  |  Branch (1305:11): [True: 146, False: 267]
  ------------------
 1306|    146|            element = 49;
 1307|    146|            break;
 1308|    142|          case 'r':
  ------------------
  |  Branch (1308:11): [True: 142, False: 271]
  ------------------
 1309|    142|            element = 77;
 1310|    142|            break;
 1311|    125|          default:
  ------------------
  |  Branch (1311:11): [True: 125, False: 288]
  ------------------
 1312|    125|            element = 53;
 1313|    125|            _ptr--;
 1314|    413|          }
 1315|    413|        break;
 1316|       |
 1317|    693|      case 'A':
  ------------------
  |  Branch (1317:7): [True: 693, False: 19.0k]
  ------------------
 1318|    693|        _ptr++;
 1319|    693|        switch(*_ptr)
 1320|    693|          {
 1321|    169|          case 'c':
  ------------------
  |  Branch (1321:11): [True: 169, False: 524]
  ------------------
 1322|    169|            element = 89;
 1323|    169|            break;
 1324|    149|          case 'g':
  ------------------
  |  Branch (1324:11): [True: 149, False: 544]
  ------------------
 1325|    149|            element = 47;
 1326|    149|            break;
 1327|     40|          case 'l':
  ------------------
  |  Branch (1327:11): [True: 40, False: 653]
  ------------------
 1328|     40|            element = 13;
 1329|     40|            break;
 1330|     78|          case 'm':
  ------------------
  |  Branch (1330:11): [True: 78, False: 615]
  ------------------
 1331|     78|            element = 95;
 1332|     78|            break;
 1333|     39|          case 'r':
  ------------------
  |  Branch (1333:11): [True: 39, False: 654]
  ------------------
 1334|     39|            element = 18;
 1335|     39|            break;
 1336|     50|          case 's':
  ------------------
  |  Branch (1336:11): [True: 50, False: 643]
  ------------------
 1337|     50|            element = 33;
 1338|     50|            break;
 1339|     97|          case 't':
  ------------------
  |  Branch (1339:11): [True: 97, False: 596]
  ------------------
 1340|     97|            element = 85;
 1341|     97|            break;
 1342|     67|          case 'u':
  ------------------
  |  Branch (1342:11): [True: 67, False: 626]
  ------------------
 1343|     67|            element = 79;
 1344|     67|            break;
 1345|      4|          default:
  ------------------
  |  Branch (1345:11): [True: 4, False: 689]
  ------------------
 1346|      4|            return(false);
 1347|    693|          }
 1348|    689|        break;
 1349|       |
 1350|    689|      case 'D':
  ------------------
  |  Branch (1350:7): [True: 158, False: 19.5k]
  ------------------
 1351|    158|        _ptr++;
 1352|    158|        switch(*_ptr)
 1353|    158|          {
 1354|     90|          case 'b':
  ------------------
  |  Branch (1354:11): [True: 90, False: 68]
  ------------------
 1355|     90|            element = 105;
 1356|     90|            break;
 1357|     10|          case 's':
  ------------------
  |  Branch (1357:11): [True: 10, False: 148]
  ------------------
 1358|     10|            element = 110;
 1359|     10|            break;
 1360|     57|          case 'y':
  ------------------
  |  Branch (1360:11): [True: 57, False: 101]
  ------------------
 1361|     57|            element = 66;
 1362|     57|            break;
 1363|      1|          default:
  ------------------
  |  Branch (1363:11): [True: 1, False: 157]
  ------------------
 1364|      1|            return(false);
 1365|    158|          }
 1366|    157|        break;
 1367|       |
 1368|    246|      case 'E':
  ------------------
  |  Branch (1368:7): [True: 246, False: 19.4k]
  ------------------
 1369|    246|        _ptr++;
 1370|    246|        switch(*_ptr)
 1371|    246|          {
 1372|    109|          case 'r':
  ------------------
  |  Branch (1372:11): [True: 109, False: 137]
  ------------------
 1373|    109|            element = 68;
 1374|    109|            break;
 1375|     44|          case 's':
  ------------------
  |  Branch (1375:11): [True: 44, False: 202]
  ------------------
 1376|     44|            element = 99;
 1377|     44|            break;
 1378|     92|          case 'u':
  ------------------
  |  Branch (1378:11): [True: 92, False: 154]
  ------------------
 1379|     92|            element = 63;
 1380|     92|            break;
 1381|      1|          default:
  ------------------
  |  Branch (1381:11): [True: 1, False: 245]
  ------------------
 1382|      1|            return(false);
 1383|    246|          }
 1384|    245|        break;
 1385|       |
 1386|    316|      case 'G':
  ------------------
  |  Branch (1386:7): [True: 316, False: 19.4k]
  ------------------
 1387|    316|        _ptr++;
 1388|    316|        switch (*_ptr)
 1389|    316|          {
 1390|     77|          case 'a':
  ------------------
  |  Branch (1390:11): [True: 77, False: 239]
  ------------------
 1391|     77|            element = 31;
 1392|     77|            break;
 1393|    121|          case 'd':
  ------------------
  |  Branch (1393:11): [True: 121, False: 195]
  ------------------
 1394|    121|            element = 64;
 1395|    121|            break;
 1396|    117|          case 'e':
  ------------------
  |  Branch (1396:11): [True: 117, False: 199]
  ------------------
 1397|    117|            element = 32;
 1398|    117|            break;
 1399|      1|          default:
  ------------------
  |  Branch (1399:11): [True: 1, False: 315]
  ------------------
 1400|      1|            return(false);
 1401|    316|          }
 1402|    315|        break;
 1403|       |
 1404|  1.25k|      case 'H':
  ------------------
  |  Branch (1404:7): [True: 1.25k, False: 18.4k]
  ------------------
 1405|  1.25k|        _ptr++;
 1406|  1.25k|        switch (*_ptr)
 1407|  1.25k|          {
 1408|     24|          case 'e':
  ------------------
  |  Branch (1408:11): [True: 24, False: 1.22k]
  ------------------
 1409|     24|            element =  2;
 1410|     24|            break;
 1411|    157|          case 'f':
  ------------------
  |  Branch (1411:11): [True: 157, False: 1.09k]
  ------------------
 1412|    157|            element = 72;
 1413|    157|            break;
 1414|    107|          case 'g':
  ------------------
  |  Branch (1414:11): [True: 107, False: 1.14k]
  ------------------
 1415|    107|            element = 80;
 1416|    107|            break;
 1417|    200|          case 'o':
  ------------------
  |  Branch (1417:11): [True: 200, False: 1.05k]
  ------------------
 1418|    200|            element = 67;
 1419|    200|            break;
 1420|     22|          case 's':
  ------------------
  |  Branch (1420:11): [True: 22, False: 1.23k]
  ------------------
 1421|     22|            element = 108;
 1422|     22|            break;
 1423|    742|          default:
  ------------------
  |  Branch (1423:11): [True: 742, False: 510]
  ------------------
 1424|    742|            element = 1;
 1425|    742|            _ptr--;
 1426|  1.25k|          }
 1427|  1.25k|        break;
 1428|       |
 1429|  1.25k|      case 'K':
  ------------------
  |  Branch (1429:7): [True: 222, False: 19.5k]
  ------------------
 1430|    222|        _ptr++;
 1431|    222|        if(*_ptr == 'r')
  ------------------
  |  Branch (1431:12): [True: 116, False: 106]
  ------------------
 1432|    116|          {
 1433|    116|            element = 36;
 1434|    116|          }
 1435|    106|        else
 1436|    106|          {
 1437|    106|            element = 19;
 1438|    106|            _ptr--;
 1439|    106|          }
 1440|    222|        break;
 1441|       |
 1442|    452|      case 'L':
  ------------------
  |  Branch (1442:7): [True: 452, False: 19.2k]
  ------------------
 1443|    452|        _ptr++;
 1444|    452|        switch(*_ptr)
 1445|    452|          {
 1446|     59|          case 'a':
  ------------------
  |  Branch (1446:11): [True: 59, False: 393]
  ------------------
 1447|     59|            element =  57;
 1448|     59|            break;
 1449|     23|          case 'i':
  ------------------
  |  Branch (1449:11): [True: 23, False: 429]
  ------------------
 1450|     23|            element =   3;
 1451|     23|            break;
 1452|     17|          case 'r':
  ------------------
  |  Branch (1452:11): [True: 17, False: 435]
  ------------------
 1453|     17|            element = 103;
 1454|     17|            break;
 1455|    349|          case 'u':
  ------------------
  |  Branch (1455:11): [True: 349, False: 103]
  ------------------
 1456|    349|            element =  71;
 1457|    349|            break;
 1458|      3|          case 'v':
  ------------------
  |  Branch (1458:11): [True: 3, False: 449]
  ------------------
 1459|      3|            element = 116;
 1460|      3|            break;
 1461|      1|          default:
  ------------------
  |  Branch (1461:11): [True: 1, False: 451]
  ------------------
 1462|      1|            return(false);
 1463|    452|          }
 1464|    451|        break;
 1465|       |
 1466|    451|      case 'M':
  ------------------
  |  Branch (1466:7): [True: 348, False: 19.3k]
  ------------------
 1467|    348|        _ptr++;
 1468|    348|        switch(*_ptr)
 1469|    348|          {
 1470|      4|          case 'c':
  ------------------
  |  Branch (1470:11): [True: 4, False: 344]
  ------------------
 1471|      4|            element = 115;
 1472|      4|            break;
 1473|     11|          case 'd':
  ------------------
  |  Branch (1473:11): [True: 11, False: 337]
  ------------------
 1474|     11|            element = 101;
 1475|     11|            break;
 1476|     25|          case 'g':
  ------------------
  |  Branch (1476:11): [True: 25, False: 323]
  ------------------
 1477|     25|            element =  12;
 1478|     25|            break;
 1479|    140|          case 'n':
  ------------------
  |  Branch (1479:11): [True: 140, False: 208]
  ------------------
 1480|    140|            element =  25;
 1481|    140|            break;
 1482|    141|          case 'o':
  ------------------
  |  Branch (1482:11): [True: 141, False: 207]
  ------------------
 1483|    141|            element =  42;
 1484|    141|            break;
 1485|     25|          case 't':
  ------------------
  |  Branch (1485:11): [True: 25, False: 323]
  ------------------
 1486|     25|            element =  109;
 1487|     25|            break;
 1488|      2|          default:
  ------------------
  |  Branch (1488:11): [True: 2, False: 346]
  ------------------
 1489|      2|            return(false);
 1490|    348|          }
 1491|    346|        break;
 1492|       |
 1493|    740|      case 'R':
  ------------------
  |  Branch (1493:7): [True: 740, False: 19.0k]
  ------------------
 1494|    740|        _ptr++;
 1495|    740|        switch(*_ptr)
 1496|    740|          {
 1497|    203|          case 'a':
  ------------------
  |  Branch (1497:11): [True: 203, False: 537]
  ------------------
 1498|    203|            element = 88;
 1499|    203|            break;
 1500|    123|          case 'b':
  ------------------
  |  Branch (1500:11): [True: 123, False: 617]
  ------------------
 1501|    123|            element = 37;
 1502|    123|            break;
 1503|    120|          case 'e':
  ------------------
  |  Branch (1503:11): [True: 120, False: 620]
  ------------------
 1504|    120|            element = 75;
 1505|    120|            break;
 1506|      6|          case 'f':
  ------------------
  |  Branch (1506:11): [True: 6, False: 734]
  ------------------
 1507|      6|            element = 104;
 1508|      6|            break;
 1509|     16|          case 'g':
  ------------------
  |  Branch (1509:11): [True: 16, False: 724]
  ------------------
 1510|     16|            element = 111;
 1511|     16|            break;
 1512|     84|          case 'h':
  ------------------
  |  Branch (1512:11): [True: 84, False: 656]
  ------------------
 1513|     84|            element = 45;
 1514|     84|            break;
 1515|    101|          case 'n':
  ------------------
  |  Branch (1515:11): [True: 101, False: 639]
  ------------------
 1516|    101|            element = 86;
 1517|    101|            break;
 1518|     85|          case 'u':
  ------------------
  |  Branch (1518:11): [True: 85, False: 655]
  ------------------
 1519|     85|            element = 44;
 1520|     85|            break;
 1521|      2|          default:
  ------------------
  |  Branch (1521:11): [True: 2, False: 738]
  ------------------
 1522|      2|            return(false);
 1523|    740|          }
 1524|    738|        break;
 1525|       |
 1526|    854|      case 'T':
  ------------------
  |  Branch (1526:7): [True: 854, False: 18.8k]
  ------------------
 1527|    854|        _ptr++;
 1528|    854|        switch(*_ptr)
 1529|    854|          {
 1530|    111|          case 'a':
  ------------------
  |  Branch (1530:11): [True: 111, False: 743]
  ------------------
 1531|    111|            element = 73;
 1532|    111|            break;
 1533|    222|          case 'b':
  ------------------
  |  Branch (1533:11): [True: 222, False: 632]
  ------------------
 1534|    222|            element = 65;
 1535|    222|            break;
 1536|    153|          case 'c':
  ------------------
  |  Branch (1536:11): [True: 153, False: 701]
  ------------------
 1537|    153|            element = 43;
 1538|    153|            break;
 1539|     11|          case 'e':
  ------------------
  |  Branch (1539:11): [True: 11, False: 843]
  ------------------
 1540|     11|            element = 52;
 1541|     11|            break;
 1542|    120|          case 'h':
  ------------------
  |  Branch (1542:11): [True: 120, False: 734]
  ------------------
 1543|    120|            element = 90;
 1544|    120|            break;
 1545|     30|          case 'i':
  ------------------
  |  Branch (1545:11): [True: 30, False: 824]
  ------------------
 1546|     30|            element = 22;
 1547|     30|            break;
 1548|    102|          case 'l':
  ------------------
  |  Branch (1548:11): [True: 102, False: 752]
  ------------------
 1549|    102|            element = 81;
 1550|    102|            break;
 1551|     73|          case 'm':
  ------------------
  |  Branch (1551:11): [True: 73, False: 781]
  ------------------
 1552|     73|            element = 69;
 1553|     73|            break;
 1554|     29|          case 's':
  ------------------
  |  Branch (1554:11): [True: 29, False: 825]
  ------------------
 1555|     29|            element = 117;
 1556|     29|            break;
 1557|      3|          default:
  ------------------
  |  Branch (1557:11): [True: 3, False: 851]
  ------------------
 1558|      3|            return(false);
 1559|    854|          }
 1560|    851|        break;
 1561|       |
 1562|    851|      case('U'):  element = 92;
  ------------------
  |  Branch (1562:7): [True: 31, False: 19.7k]
  ------------------
 1563|     31|        break;
 1564|    120|      case('V'):  element = 23;
  ------------------
  |  Branch (1564:7): [True: 120, False: 19.6k]
  ------------------
 1565|    120|        break;
 1566|    135|      case('W'):  element = 74;
  ------------------
  |  Branch (1566:7): [True: 135, False: 19.6k]
  ------------------
 1567|    135|        break;
 1568|       |
 1569|    103|      case('X'):
  ------------------
  |  Branch (1569:7): [True: 103, False: 19.6k]
  ------------------
 1570|    103|        _ptr++;
 1571|    103|        if (*_ptr == 'e')
  ------------------
  |  Branch (1571:13): [True: 101, False: 2]
  ------------------
 1572|    101|          {
 1573|    101|            element = 54;
 1574|    101|          }
 1575|      2|        else
 1576|      2|          {
 1577|      2|            return(false);
 1578|      2|          }
 1579|    101|        break;
 1580|       |
 1581|    180|      case('Y'):
  ------------------
  |  Branch (1581:7): [True: 180, False: 19.5k]
  ------------------
 1582|    180|        _ptr++;
 1583|    180|        if (*_ptr == 'b')
  ------------------
  |  Branch (1583:13): [True: 95, False: 85]
  ------------------
 1584|     95|          {
 1585|     95|            element = 70;
 1586|     95|          }
 1587|     85|        else
 1588|     85|          {
 1589|     85|            element = 39;
 1590|     85|            _ptr--;
 1591|     85|          }
 1592|    180|        break;
 1593|       |
 1594|    279|      case('Z'):
  ------------------
  |  Branch (1594:7): [True: 279, False: 19.4k]
  ------------------
 1595|    279|        _ptr++;
 1596|    279|        switch(*_ptr)
 1597|    279|          {
 1598|     85|          case 'n':
  ------------------
  |  Branch (1598:11): [True: 85, False: 194]
  ------------------
 1599|     85|            element = 30;
 1600|     85|            break;
 1601|    193|          case 'r':
  ------------------
  |  Branch (1601:11): [True: 193, False: 86]
  ------------------
 1602|    193|            element = 40;
 1603|    193|            break;
 1604|      1|          default:
  ------------------
  |  Branch (1604:11): [True: 1, False: 278]
  ------------------
 1605|      1|            return false;
 1606|    279|          }
 1607|    278|        break;
 1608|       |
 1609|    278|      case 'a':
  ------------------
  |  Branch (1609:7): [True: 82, False: 19.6k]
  ------------------
 1610|     82|        _ptr++;
 1611|     82|        if (*_ptr == 's') {
  ------------------
  |  Branch (1611:13): [True: 78, False: 4]
  ------------------
 1612|     78|          arom = true;
 1613|     78|          element = 33;
 1614|     78|        }
 1615|      4|        else
 1616|      4|          return false;
 1617|     78|        break;
 1618|       |
 1619|  2.79k|      case 'b':
  ------------------
  |  Branch (1619:7): [True: 2.79k, False: 16.9k]
  ------------------
 1620|  2.79k|        _ptr++;
 1621|  2.79k|        if (*_ptr == 'i') {
  ------------------
  |  Branch (1621:13): [True: 115, False: 2.67k]
  ------------------
 1622|    115|          arom = true;
 1623|    115|          element = 83;
 1624|    115|        }
 1625|  2.67k|        else {
 1626|  2.67k|          arom = true;
 1627|  2.67k|          element = 5;
 1628|  2.67k|          _ptr--;
 1629|  2.67k|        }
 1630|  2.79k|        break;
 1631|       |
 1632|    194|      case 'c':
  ------------------
  |  Branch (1632:7): [True: 194, False: 19.5k]
  ------------------
 1633|    194|        arom = true;
 1634|    194|        element = 6;
 1635|    194|        break;
 1636|       |
 1637|    111|      case 'g':
  ------------------
  |  Branch (1637:7): [True: 111, False: 19.6k]
  ------------------
 1638|    111|        _ptr++;
 1639|    111|        if (*_ptr == 'e') {
  ------------------
  |  Branch (1639:13): [True: 110, False: 1]
  ------------------
 1640|    110|          arom = true;
 1641|    110|          element = 32;
 1642|    110|        }
 1643|      1|        else
 1644|      1|          return false;
 1645|    110|        break;
 1646|       |
 1647|    189|      case 'n':
  ------------------
  |  Branch (1647:7): [True: 189, False: 19.5k]
  ------------------
 1648|    189|        arom = true;
 1649|    189|        element = 7;
 1650|    189|        break;
 1651|       |
 1652|     78|      case 'o':
  ------------------
  |  Branch (1652:7): [True: 78, False: 19.6k]
  ------------------
 1653|     78|        arom = true;
 1654|     78|        element = 8;
 1655|     78|        break;
 1656|       |
 1657|     42|      case 'p':
  ------------------
  |  Branch (1657:7): [True: 42, False: 19.7k]
  ------------------
 1658|     42|        arom = true;
 1659|     42|        element = 15;
 1660|     42|        break;
 1661|       |
 1662|    675|      case 's':
  ------------------
  |  Branch (1662:7): [True: 675, False: 19.0k]
  ------------------
 1663|    675|        arom = true;
 1664|    675|        _ptr++;
 1665|    675|        switch (*_ptr) {
 1666|     18|        case 'e':
  ------------------
  |  Branch (1666:9): [True: 18, False: 657]
  ------------------
 1667|     18|          element = 34;
 1668|     18|          break;
 1669|     32|        case 'i':
  ------------------
  |  Branch (1669:9): [True: 32, False: 643]
  ------------------
 1670|     32|          element = 14;
 1671|     32|          break;
 1672|      3|        case 'n':
  ------------------
  |  Branch (1672:9): [True: 3, False: 672]
  ------------------
 1673|      3|          element = 50;
 1674|      3|          break;
 1675|     17|        case 'b':
  ------------------
  |  Branch (1675:9): [True: 17, False: 658]
  ------------------
 1676|     17|          element = 51;
 1677|     17|          break;
 1678|    605|        default:
  ------------------
  |  Branch (1678:9): [True: 605, False: 70]
  ------------------
 1679|    605|          element = 16;
 1680|    605|          _ptr--;
 1681|    675|        }
 1682|    675|        break;
 1683|       |
 1684|    675|      case 't':
  ------------------
  |  Branch (1684:7): [True: 111, False: 19.6k]
  ------------------
 1685|    111|        _ptr++;
 1686|    111|        if (*_ptr == 'e') {
  ------------------
  |  Branch (1686:13): [True: 110, False: 1]
  ------------------
 1687|    110|          arom = true;
 1688|    110|          element = 52;
 1689|    110|        }
 1690|      1|        else
 1691|      1|          return false;
 1692|    110|        break;
 1693|       |
 1694|    110|      case '#':
  ------------------
  |  Branch (1694:7): [True: 11, False: 19.7k]
  ------------------
 1695|       |        // Only support three digits for this extension
 1696|     11|        if ((_ptr[1] == '1' || _ptr[1] == '2') &&
  ------------------
  |  Branch (1696:14): [True: 5, False: 6]
  |  Branch (1696:32): [True: 4, False: 2]
  ------------------
 1697|      9|            (_ptr[2] >= '0' && _ptr[2] <= '9') &&
  ------------------
  |  Branch (1697:14): [True: 8, False: 1]
  |  Branch (1697:32): [True: 7, False: 1]
  ------------------
 1698|      7|            (_ptr[3] >= '0' && _ptr[3] <= '9')) {
  ------------------
  |  Branch (1698:14): [True: 6, False: 1]
  |  Branch (1698:32): [True: 4, False: 2]
  ------------------
 1699|      4|          element = (_ptr[1]-'0')*100 + (_ptr[2]-'0')*10 + (_ptr[3]-'0');
 1700|      4|          if (element > 255) {
  ------------------
  |  Branch (1700:15): [True: 1, False: 3]
  ------------------
 1701|      1|            std::string err = "Element number must be <= 255)";
 1702|      1|            obErrorLog.ThrowError(__FUNCTION__,
 1703|      1|              err, obError);
 1704|      1|            return false;
 1705|      1|          }
 1706|      3|          _ptr += 3;
 1707|      3|          break;
 1708|      4|        }
 1709|       |        /* fall through to default */
 1710|       |
 1711|     96|      default:
  ------------------
  |  Branch (1711:7): [True: 89, False: 19.6k]
  ------------------
 1712|     96|        {
 1713|     96|          std::string err;
 1714|     96|          err += "SMILES string contains a character '";
 1715|     96|          err += *_ptr;
 1716|     96|          err += "' which is invalid";
 1717|     96|          obErrorLog.ThrowError(__FUNCTION__,
 1718|     96|            err, obError);
 1719|     96|          return false;
 1720|     11|        }
 1721|  19.7k|      }
 1722|       |
 1723|       |    //handle hydrogen count, stereochemistry, and charge
 1724|       |
 1725|  19.6k|    OBAtom *atom = mol.NewAtom();
 1726|  19.6k|    int hcount = 0;
 1727|  19.6k|    int charge=0;
 1728|  19.6k|    int rad=0;
 1729|  19.6k|    int clval=0;
 1730|  19.6k|    char tmpc[2];
 1731|  19.6k|    tmpc[1] = '\0';
 1732|       |
 1733|  19.6k|    stringstream errorMsg;
 1734|       |
 1735|  28.9k|    for (_ptr++;*_ptr && *_ptr != ']';_ptr++)
  ------------------
  |  Branch (1735:17): [True: 28.9k, False: 31]
  |  Branch (1735:26): [True: 9.49k, False: 19.4k]
  ------------------
 1736|  9.49k|      {
 1737|  9.49k|        switch(*_ptr)
 1738|  9.49k|          {
 1739|  5.13k|          case '@':
  ------------------
  |  Branch (1739:11): [True: 5.13k, False: 4.35k]
  ------------------
 1740|  5.13k|            _ptr++;
 1741|  5.13k|            if (*_ptr == 'S' && _ptr[1] == 'P') { // @SP1/2/3
  ------------------
  |  Branch (1741:17): [True: 2, False: 5.13k]
  |  Branch (1741:33): [True: 0, False: 2]
  ------------------
 1742|       |              // square planar atom found
 1743|      0|              squarePlanarWatch = true;
 1744|      0|              if (_squarePlanarMap.find(atom)==_squarePlanarMap.end()) // Prevent memory leak for malformed smiles (PR#3428432)
  ------------------
  |  Branch (1744:19): [True: 0, False: 0]
  ------------------
 1745|      0|                _squarePlanarMap[atom] = new OBSquarePlanarStereo::Config;
 1746|      0|              _squarePlanarMap[atom]->refs = OBStereo::Refs(4, OBStereo::NoRef);
 1747|      0|              _squarePlanarMap[atom]->center = atom->GetId();
 1748|      0|              _ptr += 2;
 1749|      0|              switch(*_ptr) {
 1750|      0|              case '1':
  ------------------
  |  Branch (1750:15): [True: 0, False: 0]
  ------------------
 1751|      0|                _squarePlanarMap[atom]->shape = OBStereo::ShapeU; break;
 1752|      0|              case '2':
  ------------------
  |  Branch (1752:15): [True: 0, False: 0]
  ------------------
 1753|      0|                _squarePlanarMap[atom]->shape = OBStereo::Shape4; break;
 1754|      0|              case '3':
  ------------------
  |  Branch (1754:15): [True: 0, False: 0]
  ------------------
 1755|      0|                _squarePlanarMap[atom]->shape = OBStereo::ShapeZ; break;
 1756|      0|              default:
  ------------------
  |  Branch (1756:15): [True: 0, False: 0]
  ------------------
 1757|      0|                obErrorLog.ThrowError(__FUNCTION__, "Square planar stereochemistry must be one of SP1, SP2 or SP3", obWarning);
 1758|      0|                return false;
 1759|      0|              }
 1760|  5.13k|            } else {
 1761|       |              // tetrahedral atom found
 1762|  5.13k|              chiralWatch=true;
 1763|  5.13k|              if (_tetrahedralMap.find(atom)==_tetrahedralMap.end()) // Prevent memory leak for malformed smiles (PR#3428432)
  ------------------
  |  Branch (1763:19): [True: 4.64k, False: 496]
  ------------------
 1764|  4.64k|                _tetrahedralMap[atom] = new OBTetrahedralStereo::Config;
 1765|  5.13k|              _tetrahedralMap[atom]->refs = OBStereo::Refs(3, OBStereo::NoRef);
 1766|  5.13k|              _tetrahedralMap[atom]->center = atom->GetId();
 1767|  5.13k|              if (*_ptr == '@') {
  ------------------
  |  Branch (1767:19): [True: 487, False: 4.65k]
  ------------------
 1768|    487|                _tetrahedralMap[atom]->winding = OBStereo::Clockwise;
 1769|  4.65k|              } else if (*_ptr == '?') {
  ------------------
  |  Branch (1769:26): [True: 21, False: 4.63k]
  ------------------
 1770|     21|                _tetrahedralMap[atom]->specified = false;
 1771|  4.63k|              } else {
 1772|  4.63k|                _tetrahedralMap[atom]->winding = OBStereo::AntiClockwise;
 1773|  4.63k|                _ptr--;
 1774|  4.63k|              }
 1775|  5.13k|            }
 1776|  5.13k|            break;
 1777|  5.13k|          case '-':
  ------------------
  |  Branch (1777:11): [True: 402, False: 9.09k]
  ------------------
 1778|    402|            if (charge) {
  ------------------
  |  Branch (1778:17): [True: 3, False: 399]
  ------------------
 1779|      3|              obErrorLog.ThrowError(__FUNCTION__, "Charge can only be specified once", obWarning);
 1780|      3|              return false;
 1781|      3|            }
 1782|    850|            while (*++_ptr == '-')
  ------------------
  |  Branch (1782:20): [True: 451, False: 399]
  ------------------
 1783|    451|              charge--; // handle [O--]
 1784|    399|            if (charge == 0) {
  ------------------
  |  Branch (1784:17): [True: 367, False: 32]
  ------------------
 1785|    640|              while (isdigit(*_ptr)) { // handle [O-2]
  ------------------
  |  Branch (1785:22): [True: 274, False: 366]
  ------------------
 1786|    274|                charge = charge * 10 - ((*_ptr++) - '0');
 1787|       |                // Reject magnitudes beyond ±999 — also bounds the value
 1788|       |                // well within int range so the next multiply can't overflow.
 1789|    274|                if (charge < -999) {
  ------------------
  |  Branch (1789:21): [True: 1, False: 273]
  ------------------
 1790|      1|                  obErrorLog.ThrowError(__FUNCTION__, "Charge value out of range", obWarning);
 1791|      1|                  return false;
 1792|      1|                }
 1793|    274|              }
 1794|    366|              if (charge == 0) // handle [Cl-]
  ------------------
  |  Branch (1794:19): [True: 141, False: 225]
  ------------------
 1795|    141|                charge = -1;
 1796|    366|            }
 1797|     32|            else
 1798|     32|              charge--; // finish handling [Ca++]
 1799|    398|            _ptr--;
 1800|    398|            break;
 1801|    223|          case '+':
  ------------------
  |  Branch (1801:11): [True: 223, False: 9.27k]
  ------------------
 1802|    223|            if (charge) {
  ------------------
  |  Branch (1802:17): [True: 5, False: 218]
  ------------------
 1803|      5|              obErrorLog.ThrowError(__FUNCTION__, "Charge can only be specified once", obWarning);
 1804|      5|              return false;
 1805|      5|            }
 1806|  1.10k|            while (*++_ptr == '+')
  ------------------
  |  Branch (1806:20): [True: 887, False: 218]
  ------------------
 1807|    887|              charge++; // handle [Ca++]
 1808|    218|            if (charge == 0) {
  ------------------
  |  Branch (1808:17): [True: 204, False: 14]
  ------------------
 1809|    253|              while (isdigit(*_ptr)) { // handle [Ca+2]
  ------------------
  |  Branch (1809:22): [True: 51, False: 202]
  ------------------
 1810|     51|                charge = charge * 10 + ((*_ptr++) - '0');
 1811|     51|                if (charge > 999) {
  ------------------
  |  Branch (1811:21): [True: 2, False: 49]
  ------------------
 1812|      2|                  obErrorLog.ThrowError(__FUNCTION__, "Charge value out of range", obWarning);
 1813|      2|                  return false;
 1814|      2|                }
 1815|     51|              }
 1816|    202|              if (charge == 0) // handle [Na+]
  ------------------
  |  Branch (1816:19): [True: 190, False: 12]
  ------------------
 1817|    190|                charge = 1;
 1818|    202|            }
 1819|     14|            else
 1820|     14|              charge++; // finish handling [Ca++]
 1821|    216|            _ptr--;
 1822|    216|            break;
 1823|  1.52k|          case 'H':
  ------------------
  |  Branch (1823:11): [True: 1.52k, False: 7.97k]
  ------------------
 1824|  1.52k|            _ptr++;
 1825|  1.52k|            if (isdigit(*_ptr))
  ------------------
  |  Branch (1825:17): [True: 50, False: 1.47k]
  ------------------
 1826|     50|              {
 1827|     50|                tmpc[0] = *_ptr;
 1828|     50|                hcount = atoi(tmpc);
 1829|     50|              }
 1830|  1.47k|            else
 1831|  1.47k|              {
 1832|  1.47k|                hcount = 1;
 1833|  1.47k|                _ptr--;
 1834|  1.47k|              }
 1835|  1.52k|            break;
 1836|  2.05k|          case '.': //CM Feb05
  ------------------
  |  Branch (1836:11): [True: 2.05k, False: 7.44k]
  ------------------
 1837|  2.05k|            rad=2;
 1838|  2.05k|            if(*(++_ptr)=='.')
  ------------------
  |  Branch (1838:16): [True: 1.78k, False: 266]
  ------------------
 1839|  1.78k|              rad=3;
 1840|    266|            else
 1841|    266|              _ptr--;
 1842|  2.05k|            break;
 1843|       |
 1844|     42|          case ':':
  ------------------
  |  Branch (1844:11): [True: 42, False: 9.45k]
  ------------------
 1845|     42|            if(!isdigit(*(++_ptr)))
  ------------------
  |  Branch (1845:16): [True: 7, False: 35]
  ------------------
 1846|      7|              {
 1847|      7|                obErrorLog.ThrowError(__FUNCTION__,"The atom class following : must be a number", obWarning);
 1848|      7|                return false;
 1849|      7|              }
 1850|    117|            while( isdigit(*_ptr) && clval < 100000000)
  ------------------
  |  Branch (1850:20): [True: 87, False: 30]
  |  Branch (1850:38): [True: 82, False: 5]
  ------------------
 1851|     82|              clval = clval*10 + ((*_ptr++)-'0');
 1852|     35|            --_ptr;
 1853|     35|            { // a block is needed here to scope the OBPairInteger assignment
 1854|     35|              OBPairInteger *atomclass = new OBPairInteger();
 1855|     35|              atomclass->SetAttribute("Atom Class");
 1856|     35|              atomclass->SetValue(clval);
 1857|     35|              atomclass->SetOrigin(fileformatInput);
 1858|     35|              atom->SetData(atomclass);
 1859|     35|            }
 1860|     35|            break;
 1861|       |
 1862|    116|          default:
  ------------------
  |  Branch (1862:11): [True: 116, False: 9.38k]
  ------------------
 1863|    116|            return(false);
 1864|  9.49k|          }
 1865|  9.49k|      }
 1866|       |
 1867|  19.4k|    if (!*_ptr || *_ptr != ']')
  ------------------
  |  Branch (1867:9): [True: 31, False: 19.4k]
  |  Branch (1867:19): [True: 0, False: 19.4k]
  ------------------
 1868|     31|      return(false); // we should have a trailing ']' now
 1869|       |
 1870|  19.4k|    if (charge) {
  ------------------
  |  Branch (1870:9): [True: 566, False: 18.8k]
  ------------------
 1871|    566|      atom->SetFormalCharge(charge);
 1872|    566|      if (abs(charge) > 10 || (element && charge > element)) { // if the charge is +/- 10 or more than the number of electrons
  ------------------
  |  Branch (1872:11): [True: 6, False: 560]
  |  Branch (1872:32): [True: 557, False: 3]
  |  Branch (1872:43): [True: 7, False: 550]
  ------------------
 1873|     13|        errorMsg << "Atom " << atom->GetIdx() << " had an unrealistic charge of " << charge
 1874|     13|                 << "." << endl;
 1875|     13|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
 1876|     13|      }
 1877|    566|    }
 1878|  19.4k|    if (rad)
  ------------------
  |  Branch (1878:9): [True: 255, False: 19.2k]
  ------------------
 1879|    255|      atom->SetSpinMultiplicity(rad);
 1880|  19.4k|    atom->SetAtomicNum(element);
 1881|  19.4k|    atom->SetIsotope(isotope);
 1882|  19.4k|    if (arom)
  ------------------
  |  Branch (1882:9): [True: 4.20k, False: 15.2k]
  ------------------
 1883|  4.20k|      atom->SetAromatic();
 1884|  19.4k|    if (_rxnrole > 1) { // Quick test for reaction
  ------------------
  |  Branch (1884:9): [True: 109, False: 19.3k]
  ------------------
 1885|       |      // Set reaction role
 1886|    109|      OBPairInteger *pi = new OBPairInteger();
 1887|    109|      pi->SetAttribute("rxnrole");
 1888|    109|      pi->SetValue(_rxnrole);
 1889|    109|      atom->SetData(pi);
 1890|    109|    }
 1891|       |
 1892|  19.4k|    if (_prev) //need to add bond
  ------------------
  |  Branch (1892:9): [True: 14.9k, False: 4.52k]
  ------------------
 1893|  14.9k|      {
 1894|  14.9k|        OBAtom* prevatom = mol.GetAtom(_prev);
 1895|  14.9k|        if (arom && prevatom->IsAromatic() && _order == 0)
  ------------------
  |  Branch (1895:13): [True: 3.89k, False: 11.0k]
  |  Branch (1895:21): [True: 3.14k, False: 755]
  |  Branch (1895:47): [True: 2.86k, False: 278]
  ------------------
 1896|  2.86k|          mol.AddBond(_prev, mol.NumAtoms(), 1, OB_AROMATIC_BOND); // this will be kekulized later
  ------------------
  |  |   41|  2.86k|#define OB_AROMATIC_BOND  (1<<1)
  ------------------
 1897|  12.0k|        else
 1898|  12.0k|          mol.AddBond(_prev, mol.NumAtoms(), _order == 0 ? 1 : _order);
  ------------------
  |  Branch (1898:46): [True: 11.3k, False: 767]
  ------------------
 1899|       |        // store up/down
 1900|  14.9k|        if (_updown == BondUpChar || _updown == BondDownChar)
  ------------------
  |  Branch (1900:13): [True: 21, False: 14.9k]
  |  Branch (1900:38): [True: 483, False: 14.4k]
  ------------------
 1901|    504|          _upDownMap[mol.GetBond(_prev, mol.NumAtoms())] = _updown;
 1902|       |
 1903|  14.9k|        if(chiralWatch) { // if tetrahedral atom, set previous as from atom
  ------------------
  |  Branch (1903:12): [True: 4.32k, False: 10.6k]
  ------------------
 1904|  4.32k|          _tetrahedralMap[atom]->from = mol.GetAtom(_prev)->GetId();
 1905|  4.32k|          if (CanHaveLonePair(element)) // Handle chiral lone pair as in X[S@@](Y)Z
  ------------------
  |  Branch (1905:15): [True: 378, False: 3.94k]
  ------------------
 1906|    378|            _chiralLonePair[mol.NumAtoms()] = 1; // First of the refs
 1907|       |
 1908|       |          //cerr <<"NB7: line 1622: Added atom ref "<<_prev<<" at " << 0 << " to "<<_mapcd[atom]<<endl;
 1909|  4.32k|        }
 1910|  14.9k|        if (squarePlanarWatch) { // if squareplanar atom, set previous atom as first ref
  ------------------
  |  Branch (1910:13): [True: 0, False: 14.9k]
  ------------------
 1911|      0|          _squarePlanarMap[atom]->refs[0] = mol.GetAtom(_prev)->GetId();
 1912|       |          //cerr <<"TV7: line 1748: Added atom ref " << mol.GetAtom(_prev)->GetId()
 1913|       |          //     << " at " << 0 << " to " << _squarePlanarMap[atom] << endl;
 1914|      0|        }
 1915|  14.9k|        InsertTetrahedralRef(mol, atom->GetId());
 1916|  14.9k|        InsertSquarePlanarRef(mol, atom->GetId());
 1917|  14.9k|      }
 1918|  4.52k|    else
 1919|  4.52k|      {
 1920|       |        // Handle chiral lone pair as in [S@@](X)(Y)Z
 1921|  4.52k|        if (chiralWatch && CanHaveLonePair(element)) // Handle chiral lone pair (only S at the moment)
  ------------------
  |  Branch (1921:13): [True: 293, False: 4.22k]
  |  Branch (1921:28): [True: 70, False: 223]
  ------------------
 1922|     70|          _chiralLonePair[mol.NumAtoms()] = 0; // 'from' atom
 1923|  4.52k|      }
 1924|       |
 1925|       |    //set values
 1926|  19.4k|    _prev = mol.NumAtoms();
 1927|  19.4k|    _order = 0;
 1928|  19.4k|    _updown = ' ';
 1929|       |
 1930|  19.4k|    if (hcount > 0) {
  ------------------
  |  Branch (1930:9): [True: 385, False: 19.0k]
  ------------------
 1931|    385|      if (chiralWatch)
  ------------------
  |  Branch (1931:11): [True: 311, False: 74]
  ------------------
 1932|    311|        InsertTetrahedralRef(mol, OBStereo::ImplicitRef);
 1933|    385|      if (squarePlanarWatch)
  ------------------
  |  Branch (1933:11): [True: 0, False: 385]
  ------------------
 1934|      0|        InsertSquarePlanarRef(mol, OBStereo::ImplicitRef);
 1935|    385|    }
 1936|  19.4k|    _hcount.push_back(hcount);
 1937|       |
 1938|  19.4k|    chiralWatch=false;
 1939|  19.4k|    squarePlanarWatch = false;
 1940|  19.4k|    return(true);
 1941|  19.4k|  }
_ZN9OpenBabel14OBSmilesParser16CapExternalBondsERNS_5OBMolE:
 1944|     35|  {
 1945|     35|    if (_extbond.empty())
  ------------------
  |  Branch (1945:9): [True: 0, False: 35]
  ------------------
 1946|      0|      return true;
 1947|       |
 1948|     35|    OBAtom *atom;
 1949|     35|    vector<ExternalBond>::iterator bond;
 1950|    112|    for (bond = _extbond.begin(); bond != _extbond.end(); ++bond) {
  ------------------
  |  Branch (1950:35): [True: 77, False: 35]
  ------------------
 1951|       |      // create new dummy atom
 1952|     77|      atom = mol.NewAtom();
 1953|     77|      atom->SetAtomicNum(0);
 1954|       |
 1955|       |      // bond dummy atom to mol via external bond
 1956|     77|      mol.AddBond(bond->prev, atom->GetIdx(), bond->order);
 1957|       |      // store up/down
 1958|     77|      if (bond->updown == BondUpChar || bond->updown == BondDownChar)
  ------------------
  |  Branch (1958:11): [True: 3, False: 74]
  |  Branch (1958:41): [True: 40, False: 34]
  ------------------
 1959|     43|        _upDownMap[mol.GetBond(bond->prev, atom->GetIdx())] = bond->updown;
 1960|       |
 1961|     77|      OBBond *refbond = atom->GetBond(mol.GetAtom(bond->prev));
 1962|       |
 1963|       |      //record external bond information
 1964|     77|      OBExternalBondData *xbd;
 1965|     77|      if (mol.HasData(OBGenericDataType::ExternalBondData)) {
  ------------------
  |  Branch (1965:11): [True: 42, False: 35]
  ------------------
 1966|     42|        xbd = (OBExternalBondData*) mol.GetData(OBGenericDataType::ExternalBondData);
 1967|     42|      } else {
 1968|     35|        xbd = new OBExternalBondData;
 1969|     35|        xbd->SetOrigin(fileformatInput);
 1970|     35|        mol.SetData(xbd);
 1971|     35|      }
 1972|     77|      xbd->SetData(atom,refbond, bond->digit);
 1973|       |      //this data gets cleaned up in mol.Clear.
 1974|     77|    }
 1975|       |
 1976|     35|    return true;
 1977|     35|  }
_ZN9OpenBabel14OBSmilesParser17ParseExternalBondERNS_5OBMolE:
 1980|  3.46k|  {
 1981|  3.46k|    int digit;
 1982|  3.46k|    char str[10];
 1983|       |
 1984|       |    //*_ptr should == '&'
 1985|  3.46k|    _ptr++;
 1986|       |
 1987|  3.46k|    switch (*_ptr) // check for bond order indicators CC&=1.C&1
 1988|  3.46k|      {
 1989|     18|      case '-':
  ------------------
  |  Branch (1989:7): [True: 18, False: 3.45k]
  ------------------
 1990|     18|        _order = 1;
 1991|     18|        _ptr++;
 1992|     18|        break;
 1993|     27|      case '=':
  ------------------
  |  Branch (1993:7): [True: 27, False: 3.44k]
  ------------------
 1994|     27|        _order = 2;
 1995|     27|        _ptr++;
 1996|     27|        break;
 1997|     16|      case '#':
  ------------------
  |  Branch (1997:7): [True: 16, False: 3.45k]
  ------------------
 1998|     16|        _order = 3;
 1999|     16|        _ptr++;
 2000|     16|        break;
 2001|      2|      case '$':
  ------------------
  |  Branch (2001:7): [True: 2, False: 3.46k]
  ------------------
 2002|      2|        _order = 4;
 2003|      2|        _ptr++;
 2004|      2|        break;
 2005|    117|      case ';':
  ------------------
  |  Branch (2005:7): [True: 117, False: 3.35k]
  ------------------
 2006|    117|        _order = 5;
 2007|    117|        _ptr++;
 2008|    117|        break;
 2009|    373|      case '/': //chiral, but _order still == 1
  ------------------
  |  Branch (2009:7): [True: 373, False: 3.09k]
  ------------------
 2010|    373|        _order = 1;
 2011|    373|        _updown = BondDownChar;
 2012|    373|        _ptr++;
 2013|    373|        break;
 2014|     35|      case '\\': // chiral, but _order still == 1
  ------------------
  |  Branch (2014:7): [True: 35, False: 3.43k]
  ------------------
 2015|     35|        _order = 1;
 2016|     35|        _updown = BondUpChar;
 2017|     35|        _ptr++;
 2018|     35|        break;
 2019|      3|      case '\0':
  ------------------
  |  Branch (2019:7): [True: 3, False: 3.46k]
  ------------------
 2020|      3|        return false;
 2021|  2.87k|      default: // no bond indicator just leave order = 0
  ------------------
  |  Branch (2021:7): [True: 2.87k, False: 591]
  ------------------
 2022|  2.87k|        break;
 2023|  3.46k|      }
 2024|       |
 2025|  3.46k|    if (*_ptr == '%') // external bond indicator > 10
  ------------------
  |  Branch (2025:9): [True: 9, False: 3.45k]
  ------------------
 2026|      9|      {
 2027|      9|        if (!isdigit(*(_ptr + 1)) || !isdigit(*(_ptr + 2)))
  ------------------
  |  Branch (2027:13): [True: 3, False: 6]
  |  Branch (2027:38): [True: 1, False: 5]
  ------------------
 2028|      4|            return false;
 2029|      5|        _ptr++;
 2030|      5|        str[0] = *_ptr;
 2031|      5|        _ptr++;
 2032|      5|        str[1] = *_ptr;
 2033|      5|        str[2] = '\0';
 2034|      5|      }
 2035|  3.45k|    else // simple single digit external bond indicator
 2036|  3.45k|      {
 2037|  3.45k|        if (!isdigit(*_ptr))
  ------------------
  |  Branch (2037:13): [True: 23, False: 3.43k]
  ------------------
 2038|     23|            return false;
 2039|  3.43k|        str[0] = *_ptr;
 2040|  3.43k|        str[1] = '\0';
 2041|  3.43k|      }
 2042|  3.43k|    digit = atoi(str);  // convert indicator to digit
 2043|       |
 2044|       |    //check for dot disconnect closures
 2045|  3.43k|    vector<ExternalBond>::iterator bond;
 2046|  3.43k|    int upDown, bondOrder;
 2047|  5.34k|    for (bond = _extbond.begin(); bond != _extbond.end(); ++bond) {
  ------------------
  |  Branch (2047:35): [True: 3.55k, False: 1.79k]
  ------------------
 2048|       |
 2049|  3.55k|      if (bond->digit == digit) {
  ------------------
  |  Branch (2049:11): [True: 1.64k, False: 1.90k]
  ------------------
 2050|  1.64k|        upDown = (_updown > bond->updown) ? _updown : bond->updown;
  ------------------
  |  Branch (2050:18): [True: 286, False: 1.36k]
  ------------------
 2051|  1.64k|        bondOrder = (_order > bond->order) ? _order : bond->order;
  ------------------
  |  Branch (2051:21): [True: 328, False: 1.32k]
  ------------------
 2052|  1.64k|        mol.AddBond(bond->prev, _prev, bondOrder);
 2053|       |        // store up/down
 2054|  1.64k|        if (upDown == BondUpChar || upDown == BondDownChar)
  ------------------
  |  Branch (2054:13): [True: 16, False: 1.63k]
  |  Branch (2054:37): [True: 437, False: 1.19k]
  ------------------
 2055|    453|          _upDownMap[mol.GetBond(bond->prev, _prev)] = upDown;
 2056|       |
 2057|       |
 2058|       |        // after adding a bond to atom "_prev"
 2059|       |        // search to see if atom is bonded to a chiral atom
 2060|  1.64k|        InsertTetrahedralRef(mol, bond->prev - 1);
 2061|  1.64k|        InsertSquarePlanarRef(mol, bond->prev - 1);
 2062|       |
 2063|  1.64k|        _extbond.erase(bond);
 2064|  1.64k|        _updown = ' ';
 2065|  1.64k|        _order = 0;
 2066|  1.64k|        return true;
 2067|  1.64k|      }
 2068|  3.55k|    }
 2069|       |
 2070|       |    //since no closures save another ext bond
 2071|  1.79k|    ExternalBond extBond;
 2072|  1.79k|    extBond.digit  = digit;
 2073|  1.79k|    extBond.prev   = _prev;
 2074|  1.79k|    extBond.order  = _order;
 2075|  1.79k|    extBond.updown = _updown;
 2076|       |
 2077|  1.79k|    _extbond.push_back(extBond);
 2078|  1.79k|    _order = 0;
 2079|  1.79k|    _updown = ' ';
 2080|       |
 2081|  1.79k|    return(true);
 2082|       |
 2083|  3.43k|  }
_ZN9OpenBabel14OBSmilesParser13ParseRingBondERNS_5OBMolE:
 2086|   112k|  {
 2087|       |    // The ring closure must be associated with a 'prev' atom
 2088|   112k|    OBAtom* prevatom = mol.GetAtom(_prev);
 2089|   112k|    if (!prevatom) {
  ------------------
  |  Branch (2089:9): [True: 0, False: 112k]
  ------------------
 2090|      0|      obErrorLog.ThrowError(__FUNCTION__,"Number not parsed correctly as a ring bond", obWarning);
 2091|      0|      return false;
 2092|      0|    }
 2093|       |
 2094|       |    // Parse the ring closure digit or digits
 2095|   112k|    int digit = 0;
 2096|   112k|    if (*_ptr == '%') {
  ------------------
  |  Branch (2096:9): [True: 175, False: 112k]
  ------------------
 2097|    175|      _ptr++;
 2098|    175|      if (*_ptr == '(') { // %(NNN) extension to OpenSMILES
  ------------------
  |  Branch (2098:11): [True: 47, False: 128]
  ------------------
 2099|     47|        _ptr++;
 2100|     47|        const char* start = _ptr;
 2101|    160|        while (isdigit(*_ptr)) {
  ------------------
  |  Branch (2101:16): [True: 114, False: 46]
  ------------------
 2102|    114|          digit *= 10;
 2103|    114|          digit += *_ptr - '0';
 2104|    114|          _ptr++;
 2105|    114|          if (_ptr - start > 5) {
  ------------------
  |  Branch (2105:15): [True: 1, False: 113]
  ------------------
 2106|      1|            obErrorLog.ThrowError(__FUNCTION__, "Ring closure numbers with more than 5 digits are not supported", obWarning);
 2107|      1|            return false;
 2108|      1|          }
 2109|    114|        }
 2110|     46|        if (*_ptr != ')') {
  ------------------
  |  Branch (2110:13): [True: 15, False: 31]
  ------------------
 2111|     15|          obErrorLog.ThrowError(__FUNCTION__, "Matching close parenthesis not found for ring closure number", obWarning);
 2112|     15|          return false;
 2113|     15|        }
 2114|     46|      }
 2115|    128|      else { // % followed by two-digit ring closure
 2116|    128|        if (!isdigit(*_ptr) || !isdigit(*(_ptr + 1))) {
  ------------------
  |  Branch (2116:13): [True: 9, False: 119]
  |  Branch (2116:32): [True: 2, False: 117]
  ------------------
 2117|     11|          obErrorLog.ThrowError(__FUNCTION__, "Two digits expected after %", obWarning);
 2118|     11|          return false;
 2119|     11|        }
 2120|    117|        digit = (*_ptr - '0') * 10 + *(_ptr+1) - '0';
 2121|    117|        _ptr++;
 2122|    117|      }
 2123|    175|    }
 2124|   112k|    else {
 2125|   112k|      digit = *_ptr - '0';
 2126|   112k|    }
 2127|       |
 2128|   112k|    vector<RingClosureBond>::iterator bond;
 2129|   112k|    int upDown, bondOrder;
 2130|   213k|    for (bond = _rclose.begin(); bond != _rclose.end(); ++bond) {
  ------------------
  |  Branch (2130:34): [True: 156k, False: 56.6k]
  ------------------
 2131|   156k|      if (bond->digit == digit) {
  ------------------
  |  Branch (2131:11): [True: 56.1k, False: 100k]
  ------------------
 2132|       |        // Check for self-bonding, e.g. C11
 2133|  56.1k|        if (bond->prev == _prev) {
  ------------------
  |  Branch (2133:13): [True: 15, False: 56.1k]
  ------------------
 2134|     15|          obErrorLog.ThrowError(__FUNCTION__, "Invalid SMILES: Ring closures imply atom bonded to itself.", obWarning);
 2135|     15|          return false;
 2136|     15|        }
 2137|  56.1k|        upDown = (_updown > bond->updown) ? _updown : bond->updown;
  ------------------
  |  Branch (2137:18): [True: 2.02k, False: 54.1k]
  ------------------
 2138|  56.1k|        bondOrder = (_order > bond->order) ? _order : bond->order;
  ------------------
  |  Branch (2138:21): [True: 2.27k, False: 53.8k]
  ------------------
 2139|       |        // Check if this ring closure bond may be aromatic and set order accordingly
 2140|  56.1k|        bool aromatic_bond = false;
 2141|  56.1k|        if (bondOrder == 0) {
  ------------------
  |  Branch (2141:13): [True: 47.1k, False: 9.01k]
  ------------------
 2142|  47.1k|          OBAtom *a1 = mol.GetAtom(bond->prev);
 2143|  47.1k|          OBAtom *a2 = mol.GetAtom(_prev);
 2144|  47.1k|          if (a1->IsAromatic() && a2->IsAromatic())
  ------------------
  |  Branch (2144:15): [True: 38.0k, False: 9.06k]
  |  Branch (2144:35): [True: 33.9k, False: 4.11k]
  ------------------
 2145|  33.9k|            aromatic_bond = true;
 2146|  47.1k|        }
 2147|  56.1k|        mol.AddBond(bond->prev, _prev, bondOrder == 0 ? 1 : bondOrder, aromatic_bond ? OB_AROMATIC_BOND : 0, bond->numConnections);
  ------------------
  |  |   41|  33.9k|#define OB_AROMATIC_BOND  (1<<1)
  ------------------
  |  Branch (2147:40): [True: 47.1k, False: 9.01k]
  |  Branch (2147:72): [True: 33.9k, False: 22.1k]
  ------------------
 2148|       |        // store up/down
 2149|  56.1k|        if (upDown == BondUpChar || upDown == BondDownChar)
  ------------------
  |  Branch (2149:13): [True: 115, False: 56.0k]
  |  Branch (2149:37): [True: 8.29k, False: 47.7k]
  ------------------
 2150|  8.40k|          _upDownMap[mol.GetBond(bond->prev, _prev)] = upDown;
 2151|       |
 2152|       |        // For assigning cis/trans in the presence of bond closures, we need to
 2153|       |        // remember info on all bond closure bonds.
 2154|  56.1k|        StereoRingBond sb;
 2155|  56.1k|        sb.updown.push_back(_updown);
 2156|  56.1k|        sb.atoms.push_back(mol.GetAtom(_prev));
 2157|  56.1k|        sb.updown.push_back(bond->updown);
 2158|  56.1k|        sb.atoms.push_back(mol.GetAtom(bond->prev));
 2159|  56.1k|        _stereorbond[mol.GetBond(bond->prev, _prev)] = sb; // Store for later
 2160|       |
 2161|       |        // after adding a bond to atom "_prev"
 2162|       |        // search to see if atom is bonded to a chiral atom
 2163|       |        // need to check both _prev and bond->prev as closure is direction independent
 2164|  56.1k|        InsertTetrahedralRef(mol, bond->prev - 1);
 2165|  56.1k|        InsertSquarePlanarRef(mol, bond->prev - 1);
 2166|       |
 2167|       |        // FIXME: needed for squreplanar too??
 2168|  56.1k|        map<OBAtom*, OBTetrahedralStereo::Config*>::iterator ChiralSearch;
 2169|  56.1k|        ChiralSearch = _tetrahedralMap.find(mol.GetAtom(bond->prev));
 2170|  56.1k|        if (ChiralSearch != _tetrahedralMap.end() && ChiralSearch->second != nullptr) {
  ------------------
  |  Branch (2170:13): [True: 3.69k, False: 52.4k]
  |  Branch (2170:13): [True: 3.69k, False: 52.4k]
  |  Branch (2170:54): [True: 3.69k, False: 0]
  ------------------
 2171|  3.69k|          int insertpos = bond->numConnections - 1;
 2172|  3.69k|          switch(insertpos) {
 2173|     23|          case -1:
  ------------------
  |  Branch (2173:11): [True: 23, False: 3.67k]
  ------------------
 2174|     23|            if (ChiralSearch->second->from != OBStereo::NoRef)
  ------------------
  |  Branch (2174:17): [True: 0, False: 23]
  ------------------
 2175|      0|              obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previous from reference id.", obWarning);
 2176|     23|            (ChiralSearch->second)->from = mol.GetAtom(_prev)->GetId();
 2177|     23|            break;
 2178|  3.64k|          case 0: case 1: case 2:
  ------------------
  |  Branch (2178:11): [True: 1.94k, False: 1.75k]
  |  Branch (2178:19): [True: 1.52k, False: 2.17k]
  |  Branch (2178:27): [True: 177, False: 3.52k]
  ------------------
 2179|  3.64k|            if (ChiralSearch->second->refs[insertpos] != OBStereo::NoRef)
  ------------------
  |  Branch (2179:17): [True: 99, False: 3.54k]
  ------------------
 2180|     99|              obErrorLog.ThrowError(__FUNCTION__, "Warning: Overwriting previously set reference id.", obWarning);
 2181|  3.64k|            (ChiralSearch->second)->refs[insertpos] = mol.GetAtom(_prev)->GetId();
 2182|  3.64k|            break;
 2183|     29|          default:
  ------------------
  |  Branch (2183:11): [True: 29, False: 3.66k]
  ------------------
 2184|     29|            obErrorLog.ThrowError(__FUNCTION__, "Warning: Tetrahedral stereo specified for atom with more than 4 connections.", obWarning);
 2185|     29|            break;
 2186|  3.69k|          }
 2187|  3.69k|        }
 2188|       |
 2189|       |        //CM ensure neither atoms in ring closure is a radical centre
 2190|  56.1k|        OBAtom* patom = mol.GetAtom(_prev);
 2191|  56.1k|        patom->SetSpinMultiplicity(0);
 2192|  56.1k|        patom = mol.GetAtom(bond->prev);
 2193|  56.1k|        patom->SetSpinMultiplicity(0);
 2194|       |        //CM end
 2195|  56.1k|        _rclose.erase(bond);
 2196|  56.1k|        _updown = ' ';
 2197|  56.1k|        _order = 0;
 2198|  56.1k|        return true;
 2199|  56.1k|      }
 2200|   156k|    }
 2201|       |
 2202|       |    //since no closures save another rclose bond
 2203|  56.6k|    RingClosureBond ringClosure;
 2204|  56.6k|    ringClosure.digit  = digit;
 2205|  56.6k|    ringClosure.prev   = _prev;
 2206|  56.6k|    ringClosure.order  = _order;
 2207|  56.6k|    ringClosure.updown = _updown;
 2208|       |
 2209|  56.6k|    OBAtom* atom = mol.GetAtom(_prev);
 2210|  56.6k|    ringClosure.numConnections = NumConnections(atom); //store position to insert closure bond
 2211|  56.6k|    _rclose.push_back(ringClosure);
 2212|  56.6k|    _order = 0;
 2213|  56.6k|    _updown = ' ';
 2214|       |
 2215|  56.6k|    return(true);
 2216|   112k|  }
_ZN9OpenBabel14OBSmilesParser14NumConnectionsEPNS_6OBAtomEb:
 2222|  61.8k|  {
 2223|  61.8k|    int val = atom->GetExplicitDegree();
 2224|       |    // The implicit H is not included in "val" so we need to adjust by 1
 2225|  61.8k|    if (isImplicitRef)
  ------------------
  |  Branch (2225:9): [True: 311, False: 61.5k]
  ------------------
 2226|    311|      return val+1;
 2227|       |
 2228|  61.5k|    int idx = atom->GetIdx();
 2229|       |    // Need to adjust for any implicit H (e.g. [C@@H]) but only for atoms after the H.
 2230|       |    // The following line controls for this. It uses the fact the _hcount is only set
 2231|       |    // after this function is called to handle inserting the stereo ref for the implicit H.
 2232|  61.5k|    if (idx-1 < _hcount.size() && _hcount[idx-1] > 0)
  ------------------
  |  Branch (2232:9): [True: 61.5k, False: 0]
  |  Branch (2232:35): [True: 1.05k, False: 60.4k]
  ------------------
 2233|  1.05k|      val += _hcount[idx-1];
 2234|  61.5k|    vector<RingClosureBond>::iterator bond;
 2235|       |    //correct for multiple closure bonds to a single atom
 2236|   130k|    for (bond = _rclose.begin(); bond != _rclose.end(); ++bond)
  ------------------
  |  Branch (2236:34): [True: 69.4k, False: 61.5k]
  ------------------
 2237|  69.4k|      if (bond->prev == idx)
  ------------------
  |  Branch (2237:11): [True: 14.1k, False: 55.3k]
  ------------------
 2238|  14.1k|        val++;
 2239|       |
 2240|  61.5k|    return val;
 2241|  61.8k|  }
_ZN9OpenBabel17OBBondClosureInfoC2EPNS_6OBAtomES2_PNS_6OBBondEib:
 2263|   107k|  {
 2264|   107k|    toatom    = a1;
 2265|   107k|    fromatom  = a2;
 2266|   107k|    bond      = b;
 2267|   107k|    ringdigit = rd;
 2268|   107k|    is_open   = open;
 2269|   107k|  }
_ZN9OpenBabel17OBBondClosureInfoD2Ev:
 2272|   410k|  {
 2273|   410k|  }
_ZN9OpenBabel12OBCanSmiNodeC2EPNS_6OBAtomE:
 2331|   596k|  {
 2332|   596k|    _atom = atom;
 2333|   596k|    _parent = nullptr;
 2334|   596k|    _child_nodes.clear();
 2335|   596k|    _child_bonds.clear();
 2336|   596k|  }
_ZN9OpenBabel12OBCanSmiNode12AddChildNodeEPS0_PNS_6OBBondE:
 2339|   353k|  {
 2340|   353k|    _child_nodes.push_back(node);
 2341|   353k|    _child_bonds.push_back(bond);
 2342|   353k|  }
_ZN9OpenBabel12OBCanSmiNodeD2Ev:
 2345|   596k|  {
 2346|   596k|    vector<OBCanSmiNode*>::iterator i;
 2347|   949k|    for (i = _child_nodes.begin();i != _child_nodes.end();++i)
  ------------------
  |  Branch (2347:35): [True: 353k, False: 596k]
  ------------------
 2348|   353k|      delete (*i);
 2349|   596k|  }
_ZN9OpenBabel12OBMol2Cansmi4InitEPNS_5OBMolEbPNS_12OBConversionE:
 2450|   242k|  {
 2451|   242k|    _atmorder.clear();
 2452|   242k|    _atmorder.reserve(pmol->NumAtoms());
 2453|   242k|    _uatoms.Clear();
 2454|   242k|    _ubonds.Clear();
 2455|   242k|    _vopen.clear();
 2456|       |
 2457|   242k|    _pmol = pmol;
 2458|   242k|    _stereoFacade = new OBStereoFacade(_pmol); // needs to be destroyed in dtor
 2459|   242k|    _pconv = pconv;
 2460|   242k|    _canonicalOutput = canonical;
 2461|       |
 2462|   242k|    _endatom = nullptr;
 2463|   242k|    _startatom = nullptr;
 2464|   242k|  }
_ZN9OpenBabel12OBMol2Cansmi14GetUnusedIndexEv:
 2491|  53.5k|  {
 2492|  53.5k|    if (_pconv->IsOption("R")) {
  ------------------
  |  Branch (2492:9): [True: 0, False: 53.5k]
  ------------------
 2493|       |      // Keep incrementing the bond closure digits (for each connected component)
 2494|      0|      _bcdigit++;
 2495|      0|      return _bcdigit;
 2496|      0|    }
 2497|       |
 2498|  53.5k|    int idx=1;
 2499|  53.5k|    vector<OBBondClosureInfo>::iterator j;
 2500|  2.09M|    for (j = _vopen.begin();j != _vopen.end();)
  ------------------
  |  Branch (2500:29): [True: 2.04M, False: 53.5k]
  ------------------
 2501|  2.04M|      if (j->ringdigit == idx)
  ------------------
  |  Branch (2501:11): [True: 209k, False: 1.83M]
  ------------------
 2502|   209k|        {
 2503|   209k|          idx++; //increment idx and start over if digit is already used
 2504|   209k|          j = _vopen.begin();
 2505|   209k|        }
 2506|  1.83M|      else ++j;
 2507|       |
 2508|  53.5k|    return(idx);
 2509|  53.5k|  }
_ZN9OpenBabel12OBMol2Cansmi14CreateCisTransERNS_5OBMolE:
 2512|   242k|  {
 2513|   242k|    std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 2514|   292k|    for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data) {
  ------------------
  |  Branch (2514:70): [True: 49.3k, False: 242k]
  ------------------
 2515|  49.3k|      if (((OBStereoBase*)*data)->GetType() != OBStereo::CisTrans)
  ------------------
  |  Branch (2515:11): [True: 15.8k, False: 33.5k]
  ------------------
 2516|  15.8k|        continue;
 2517|  33.5k|      OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 2518|  33.5k|      if (ct && ct->GetConfig().specified) {
  ------------------
  |  Branch (2518:11): [True: 33.5k, False: 0]
  |  Branch (2518:11): [True: 8.87k, False: 24.6k]
  |  Branch (2518:17): [True: 8.87k, False: 24.6k]
  ------------------
 2519|  8.87k|        OBCisTransStereo::Config config = ct->GetConfig();
 2520|  8.87k|        OBBond* dbl_bond = mol.GetBond(mol.GetAtomById(config.begin), mol.GetAtomById(config.end));
 2521|  8.87k|        if (!dbl_bond)
  ------------------
  |  Branch (2521:13): [True: 0, False: 8.87k]
  ------------------
 2522|      0|          continue;
 2523|       |        // Do not output cis/trans bond symbols for double bonds in rings of size IMPLICIT_CIS_RING_SIZE or less
 2524|  8.87k|        unsigned int boundedringsize = OBBondGetSmallestRingSize(dbl_bond, IMPLICIT_CIS_RING_SIZE);
  ------------------
  |  |   51|  8.87k|#define IMPLICIT_CIS_RING_SIZE 8
  ------------------
 2525|  8.87k|        if (boundedringsize == 0) // either not in ring at all, or not in small ring
  ------------------
  |  Branch (2525:13): [True: 1.63k, False: 7.23k]
  ------------------
 2526|  1.63k|          _cistrans.push_back(*ct);
 2527|  8.87k|      }
 2528|  33.5k|    }
 2529|       |
 2530|   242k|    _unvisited_cistrans = _cistrans; // Make a copy of _cistrans
 2531|   242k|  }
_ZN9OpenBabel12OBMol2Cansmi16HasStereoDblBondEPNS_6OBBondEPNS_6OBAtomE:
 2534|   107k|  {
 2535|       |    // This is a helper function for determining whether to
 2536|       |    // consider writing a cis/trans bond symbol for bond closures.
 2537|       |    // Returns TRUE only if the atom is connected to the cis/trans
 2538|       |    // double bond. To handle the case of conjugated bonds, one must
 2539|       |    // remember that the ring opening preceded the closure, so if the
 2540|       |    // ring opening bond was on a stereocenter, it got the symbol already.
 2541|       |
 2542|   107k|    if (!bond || !atom)
  ------------------
  |  Branch (2542:9): [True: 0, False: 107k]
  |  Branch (2542:18): [True: 0, False: 107k]
  ------------------
 2543|      0|      return false;
 2544|       |
 2545|   107k|    std::vector<OBCisTransStereo>::iterator ChiralSearch;
 2546|   107k|    OBAtom *nbr_atom = bond->GetNbrAtom(atom);
 2547|       |
 2548|   107k|    bool stereo_dbl = false;
 2549|   107k|    if (atom->HasDoubleBond()) {
  ------------------
  |  Branch (2549:9): [True: 21.5k, False: 85.5k]
  ------------------
 2550|  21.5k|      stereo_dbl = true;
 2551|  21.5k|      if (nbr_atom->HasDoubleBond())
  ------------------
  |  Branch (2551:11): [True: 16.5k, False: 5.01k]
  ------------------
 2552|       |        // Check whether the nbr_atom is a begin or end in any CisTransStereo. If so,
 2553|       |        // then the ring opening already had the symbol.
 2554|  19.5k|        for (ChiralSearch = _cistrans.begin(); ChiralSearch != _cistrans.end(); ++ChiralSearch) {
  ------------------
  |  Branch (2554:48): [True: 3.17k, False: 16.3k]
  ------------------
 2555|  3.17k|          OBCisTransStereo::Config cfg = ChiralSearch->GetConfig();
 2556|  3.17k|          if (nbr_atom->GetId() == cfg.begin || nbr_atom->GetId() == cfg.end) {
  ------------------
  |  Branch (2556:15): [True: 76, False: 3.10k]
  |  Branch (2556:49): [True: 94, False: 3.00k]
  ------------------
 2557|       |            // I don't think I need to check whether it has a bond with atom
 2558|    170|            stereo_dbl = false;
 2559|    170|            break;
 2560|    170|          }
 2561|  3.17k|        }
 2562|  21.5k|    }
 2563|   107k|    return stereo_dbl;
 2564|   107k|  }
_ZN9OpenBabel12OBMol2Cansmi21GetCisTransBondSymbolEPNS_6OBBondEPNS_12OBCanSmiNodeE:
 2567|   324k|  {
 2568|       |    // Given a cis/trans bond and the node in the SMILES tree, figures out
 2569|       |    // whether to write a '/' or '\' symbol.
 2570|       |    // See the comments smilesformat.cpp: FixCisTransBonds().
 2571|       |    //
 2572|       |    // The OBCanSmiNode is the most-recently-written atom in the SMILES string
 2573|       |    // we're creating.  If it is the double-bonded atom, then the substituent
 2574|       |    // follows, so that "up" means '/' and "down" means '\'.  If the OBCanSmiNode
 2575|       |    // atom is the single-bonded atom then the double-bonded atom comes next,
 2576|       |    // in which case "up" means '\' and "down" means '/'.
 2577|       |    //
 2578|       |    // Note that the story is not so simple for conjugated systems where
 2579|       |    // we need to take into account what symbol was already used.
 2580|       |
 2581|   324k|    if (!bond /*|| (!bond->IsUp() && !bond->IsDown())*/)
  ------------------
  |  Branch (2581:9): [True: 0, False: 324k]
  ------------------
 2582|      0|      return '\0';
 2583|   324k|    OBAtom *atom = node->GetAtom();
 2584|   324k|    OBAtom *nbr_atom = bond->GetNbrAtom(atom);
 2585|   324k|    OBMol *mol = atom->GetParent();
 2586|       |
 2587|       |    // If this bond is in two different obcistransstereos (e.g. a conjugated system)
 2588|       |    // choose the one where the dbl bond atom is *atom (i.e. the one which comes first)
 2589|   324k|    std::vector<OBCisTransStereo>::iterator ChiralSearch;
 2590|   324k|    std::vector<unsigned long>::iterator lookup;
 2591|       |
 2592|   324k|    bool dbl_bond_first = false;
 2593|   324k|    if (atom->HasDoubleBond())
  ------------------
  |  Branch (2593:9): [True: 54.4k, False: 270k]
  ------------------
 2594|  54.4k|    {
 2595|  54.4k|      if (nbr_atom->HasDoubleBond())
  ------------------
  |  Branch (2595:11): [True: 30.0k, False: 24.4k]
  ------------------
 2596|       |        // Check whether the atom is a center in any CisTransStereo. If so,#
 2597|       |        // then this CisTransStereo takes precedence over any other
 2598|  42.8k|        for (ChiralSearch = _cistrans.begin(); ChiralSearch != _cistrans.end(); ++ChiralSearch)
  ------------------
  |  Branch (2598:48): [True: 13.7k, False: 29.1k]
  ------------------
 2599|  13.7k|        {
 2600|  13.7k|          OBCisTransStereo::Config cfg = ChiralSearch->GetConfig();
 2601|  13.7k|          if (atom->GetId() == cfg.begin || atom->GetId() == cfg.end) {
  ------------------
  |  Branch (2601:15): [True: 538, False: 13.1k]
  |  Branch (2601:45): [True: 363, False: 12.8k]
  ------------------
 2602|       |            // I don't think I need to check whether it has a bond with nbr_atom
 2603|    901|            dbl_bond_first = true;
 2604|    901|            break;
 2605|    901|          }
 2606|  13.7k|        }
 2607|  24.4k|      else
 2608|  24.4k|        dbl_bond_first = true;
 2609|  54.4k|    }
 2610|       |
 2611|       |    // Has the symbol for this bond already been set?
 2612|   324k|    if (_isup.find(bond) == _isup.end()) // No it hasn't
  ------------------
  |  Branch (2612:9): [True: 323k, False: 1.27k]
  ------------------
 2613|   323k|    {
 2614|   323k|      unsigned int endatom, centeratom;
 2615|   323k|      if (dbl_bond_first) {
  ------------------
  |  Branch (2615:11): [True: 24.0k, False: 299k]
  ------------------
 2616|  24.0k|        if (atom->IsAromatic())
  ------------------
  |  Branch (2616:13): [True: 209, False: 23.8k]
  ------------------
 2617|    209|          FOR_BONDS_OF_ATOM (bond, atom)
  ------------------
  |  |  420|    209|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 350, False: 24]
  |  |  ------------------
  ------------------
 2618|    350|            if (bond->IsAromatic() && bond->GetBondOrder()==2)
  ------------------
  |  Branch (2618:17): [True: 323, False: 27]
  |  Branch (2618:39): [True: 185, False: 138]
  ------------------
 2619|    185|              return 0;
 2620|  23.9k|        endatom = nbr_atom->GetId();
 2621|  23.9k|        centeratom = atom->GetId();
 2622|  23.9k|      }
 2623|   299k|      else {
 2624|   299k|        if (nbr_atom->IsAromatic())
  ------------------
  |  Branch (2624:13): [True: 488, False: 298k]
  ------------------
 2625|    488|          FOR_BONDS_OF_ATOM (bond, nbr_atom)
  ------------------
  |  |  420|    488|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 1.17k, False: 376]
  |  |  ------------------
  ------------------
 2626|  1.17k|            if (bond->IsAromatic() && bond->GetBondOrder() == 2)
  ------------------
  |  Branch (2626:17): [True: 990, False: 187]
  |  Branch (2626:39): [True: 112, False: 878]
  ------------------
 2627|    112|              return 0;
 2628|   299k|        endatom = atom->GetId();
 2629|   299k|        centeratom = nbr_atom->GetId();
 2630|   299k|      }
 2631|       |
 2632|   351k|      for (ChiralSearch = _unvisited_cistrans.begin(); ChiralSearch != _unvisited_cistrans.end(); ++ChiralSearch)
  ------------------
  |  Branch (2632:56): [True: 29.7k, False: 321k]
  ------------------
 2633|  29.7k|      {
 2634|  29.7k|        OBCisTransStereo::Config cfg = ChiralSearch->GetConfig(OBStereo::ShapeU);
 2635|  29.7k|        lookup = std::find(cfg.refs.begin(), cfg.refs.end(), endatom);
 2636|  29.7k|        if (lookup != cfg.refs.end() && (cfg.begin == centeratom || cfg.end == centeratom))
  ------------------
  |  Branch (2636:13): [True: 1.85k, False: 27.9k]
  |  Branch (2636:13): [True: 1.63k, False: 28.1k]
  |  Branch (2636:42): [True: 827, False: 1.02k]
  |  Branch (2636:69): [True: 811, False: 213]
  ------------------
 2637|  1.63k|        { // Atoms endatom and centeratom are in this OBCisTransStereo
 2638|       |
 2639|  1.63k|          std::vector<OBBond *> refbonds(4, nullptr);
 2640|  1.63k|          refbonds[0] = mol->GetBond(mol->GetAtomById(cfg.refs[0]), mol->GetAtomById(cfg.begin));
 2641|       |
 2642|  1.63k|          if (cfg.refs[1] != OBStereo::ImplicitRef) // Could be a hydrogen
  ------------------
  |  Branch (2642:15): [True: 309, False: 1.32k]
  ------------------
 2643|    309|            refbonds[1] = mol->GetBond(mol->GetAtomById(cfg.refs[1]), mol->GetAtomById(cfg.begin));
 2644|       |
 2645|  1.63k|          if (cfg.refs[2] != OBStereo::ImplicitRef) // Could be a hydrogen
  ------------------
  |  Branch (2645:15): [True: 971, False: 667]
  ------------------
 2646|    971|            refbonds[2] = mol->GetBond(mol->GetAtomById(cfg.refs[2]), mol->GetAtomById(cfg.end));
 2647|       |
 2648|  1.63k|          if (cfg.refs[3] != OBStereo::ImplicitRef) // Could be a hydrogen
  ------------------
  |  Branch (2648:15): [True: 1.11k, False: 527]
  ------------------
 2649|  1.11k|            refbonds[3] = mol->GetBond(mol->GetAtomById(cfg.refs[3]), mol->GetAtomById(cfg.end));
 2650|       |
 2651|       |          // What symbol would the four refs use if before the dbl bond?
 2652|  1.63k|          bool config[4] = {true, false, false, true};
 2653|  1.63k|          bool use_same_config = true;
 2654|       |          // (The actual config used will be config ^ use_same_config)
 2655|       |
 2656|       |          // Make sure that the symbol for this bond is true. This ensures
 2657|       |          // a canonical string, so that it's always C/C=C/C and not C\C=C\C.
 2658|  7.37k|          for(int i=0;i<4;i++)
  ------------------
  |  Branch (2658:23): [True: 6.12k, False: 1.25k]
  ------------------
 2659|  6.12k|            if (refbonds[i] == bond)
  ------------------
  |  Branch (2659:17): [True: 1.63k, False: 4.49k]
  ------------------
 2660|  1.63k|              if (!config[i])
  ------------------
  |  Branch (2660:19): [True: 388, False: 1.25k]
  ------------------
 2661|    388|              {
 2662|    388|                  use_same_config = false;
 2663|    388|                  break;
 2664|    388|              }
 2665|       |          // If any of the bonds have been previously set, now set them all
 2666|       |          // in the opposite sense
 2667|  7.09k|          for(int i=0;i<4;i++)
  ------------------
  |  Branch (2667:23): [True: 5.85k, False: 1.23k]
  ------------------
 2668|  5.85k|            if (_isup.find(refbonds[i]) != _isup.end()) // We have already set this one (conjugated bond)
  ------------------
  |  Branch (2668:17): [True: 632, False: 5.22k]
  ------------------
 2669|    632|              if (_isup[refbonds[i]] == (config[i] ^ use_same_config))
  ------------------
  |  Branch (2669:19): [True: 404, False: 228]
  ------------------
 2670|    404|              {
 2671|    404|                use_same_config = !use_same_config;
 2672|    404|                break;
 2673|    404|              }
 2674|       |          // Set the configuration
 2675|  8.19k|          for(int i=0;i<4;i++)
  ------------------
  |  Branch (2675:23): [True: 6.55k, False: 1.63k]
  ------------------
 2676|  6.55k|            if (refbonds[i] != nullptr)
  ------------------
  |  Branch (2676:17): [True: 4.02k, False: 2.52k]
  ------------------
 2677|  4.02k|              _isup[refbonds[i]] = config[i] ^ use_same_config;
 2678|  1.63k|          _unvisited_cistrans.erase(ChiralSearch);
 2679|  1.63k|          break; // break out of the ChiralSearch
 2680|  1.63k|        }
 2681|  29.7k|      }
 2682|   323k|    }
 2683|       |
 2684|       |     // If ChiralSearch didn't find the bond, we can't set this symbol
 2685|   324k|    if (_isup.find(bond) == _isup.end()) return '\0';
  ------------------
  |  Branch (2685:9): [True: 321k, False: 2.91k]
  ------------------
 2686|       |
 2687|  2.91k|    if (dbl_bond_first) { // double-bonded atom is first in the SMILES
  ------------------
  |  Branch (2687:9): [True: 1.85k, False: 1.05k]
  ------------------
 2688|  1.85k|      if (_isup[bond])
  ------------------
  |  Branch (2688:11): [True: 977, False: 879]
  ------------------
 2689|    977|        return '/';
 2690|    879|      else
 2691|    879|        return '\\';
 2692|  1.85k|    }
 2693|  1.05k|    else { // double-bonded atom is second in the SMILES
 2694|  1.05k|      if (_isup[bond])
  ------------------
  |  Branch (2694:11): [True: 8, False: 1.04k]
  ------------------
 2695|      8|        return '\\';
 2696|  1.04k|      else
 2697|  1.04k|        return '/';
 2698|  1.05k|    }
 2699|  2.91k|  }
_ZN9OpenBabel12OBMol2Cansmi16GetSmilesElementEPNS_12OBCanSmiNodeERNSt3__16vectorIPNS_6OBAtomENS3_9allocatorIS6_EEEERNS4_IjNS7_IjEEEERNS3_12basic_stringIcNS3_11char_traitsIcEENS7_IcEEEE:
 2716|   596k|  {
 2717|   596k|    char symbol[10];
 2718|   596k|    symbol[0] = '\0'; // make sure to initialize for all paths below
 2719|       |
 2720|   596k|    bool bracketElement = false;
 2721|   596k|    bool normalValence = true;
 2722|   596k|    bool writeExplicitHydrogen = false;
 2723|       |
 2724|   596k|    OBAtom *atom = node->GetAtom();
 2725|   596k|    int element = atom->GetAtomicNum();
 2726|       |
 2727|       |    // Handle SMILES Valence model, and explicit and implicit hydrogens
 2728|   596k|    if (IsOutsideOrganicSubset(element))
  ------------------
  |  Branch (2728:9): [True: 90.2k, False: 506k]
  ------------------
 2729|  90.2k|      bracketElement = true;
 2730|       |
 2731|   596k|    unsigned int numExplicitHsToSuppress = 0;
 2732|       |    // Don't suppress any explicit Hs attached if the atom is an H itself (e.g. [H][H]) or -xh was specified
 2733|   596k|    if (atom->GetAtomicNum() != OBElements::Hydrogen && !options.showexplicitH) {
  ------------------
  |  Branch (2733:9): [True: 584k, False: 11.6k]
  |  Branch (2733:57): [True: 584k, False: 0]
  ------------------
 2734|  1.00M|      FOR_NBORS_OF_ATOM(nbr, atom) {
  ------------------
  |  |  419|   584k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.00M, False: 584k]
  |  |  ------------------
  ------------------
 2735|  1.00M|        if (nbr->GetAtomicNum() == OBElements::Hydrogen && (!options.isomeric || nbr->GetIsotope() == 0) && nbr->GetExplicitDegree() == 1 &&
  ------------------
  |  Branch (2735:13): [True: 208k, False: 798k]
  |  Branch (2735:61): [True: 0, False: 208k]
  |  Branch (2735:82): [True: 208k, False: 702]
  |  Branch (2735:109): [True: 207k, False: 112]
  ------------------
 2736|   207k|          nbr->GetFormalCharge() == 0 && (!options.showatomclass || !nbr->GetData("Atom Class")))
  ------------------
  |  Branch (2736:11): [True: 207k, False: 22]
  |  Branch (2736:43): [True: 207k, False: 0]
  |  Branch (2736:69): [True: 0, False: 0]
  ------------------
 2737|   207k|          numExplicitHsToSuppress++;
 2738|  1.00M|      }
 2739|   584k|    }
 2740|       |
 2741|   596k|    unsigned int numImplicitHs = 0;
 2742|   596k|    if (options.smarts) {
  ------------------
  |  Branch (2742:9): [True: 0, False: 596k]
  ------------------
 2743|      0|      if (numExplicitHsToSuppress > 0) {
  ------------------
  |  Branch (2743:11): [True: 0, False: 0]
  ------------------
 2744|      0|        bracketElement = true;
 2745|      0|        numImplicitHs = numExplicitHsToSuppress;
 2746|      0|      }
 2747|      0|    }
 2748|   596k|    else {
 2749|   596k|      numImplicitHs = atom->GetImplicitHCount() + numExplicitHsToSuppress;
 2750|   596k|      if (!bracketElement) {
  ------------------
  |  Branch (2750:11): [True: 506k, False: 90.2k]
  ------------------
 2751|   506k|        if (element == 0) { // asterisk is always hypervalent but we don't bracket it unless has Hs
  ------------------
  |  Branch (2751:13): [True: 53.0k, False: 453k]
  ------------------
 2752|  53.0k|          if (numImplicitHs > 0)
  ------------------
  |  Branch (2752:15): [True: 450, False: 52.5k]
  ------------------
 2753|    450|            bracketElement = true;
 2754|  53.0k|        }
 2755|   453k|        else {
 2756|   453k|          int bosum = atom->GetExplicitValence() - numExplicitHsToSuppress;
 2757|   453k|          unsigned int implicitValence = SmilesValence(element, bosum, false);
 2758|       |          // Compute in signed then convert: for a hypervalent atom
 2759|       |          // implicitValence is 0 and this underflows, but the result is unused
 2760|       |          // (the implicitValence == 0 test below short-circuits). Same bits as
 2761|       |          // the old unsigned wrap, without tripping the sanitizer.
 2762|   453k|          unsigned int defaultNumImplicitHs =
 2763|   453k|            static_cast<unsigned int>(static_cast<int>(implicitValence) - bosum);
 2764|   453k|          if (implicitValence == 0 // hypervalent
  ------------------
  |  Branch (2764:15): [True: 121k, False: 331k]
  ------------------
 2765|   331k|             ||  numImplicitHs != defaultNumImplicitHs // undervalent
  ------------------
  |  Branch (2765:18): [True: 35.8k, False: 295k]
  ------------------
 2766|   295k|             || (!options.kekulesmi && element != 6 && atom->IsAromatic() && numImplicitHs != 0) ) // aromatic nitrogen/phosphorus
  ------------------
  |  Branch (2766:18): [True: 295k, False: 0]
  |  Branch (2766:40): [True: 167k, False: 128k]
  |  Branch (2766:56): [True: 672, False: 166k]
  |  Branch (2766:78): [True: 234, False: 438]
  ------------------
 2767|   157k|            bracketElement = true;
 2768|   453k|        }
 2769|   506k|      }
 2770|   596k|    }
 2771|       |
 2772|   596k|    if (atom->GetFormalCharge() != 0 // charged elements
  ------------------
  |  Branch (2772:9): [True: 10.5k, False: 585k]
  ------------------
 2773|   585k|      || (options.isomeric && atom->GetIsotope()) // isotopes
  ------------------
  |  Branch (2773:11): [True: 585k, False: 0]
  |  Branch (2773:31): [True: 7.87k, False: 577k]
  ------------------
 2774|   577k|      || (options.showatomclass && atom->HasData("Atom Class")) ) // If the molecule has Atom Class data and -xa option set and atom has data
  ------------------
  |  Branch (2774:11): [True: 0, False: 577k]
  |  Branch (2774:36): [True: 0, False: 0]
  ------------------
 2775|  18.4k|      bracketElement = true;
 2776|       |
 2777|   596k|    const char* stereo = nullptr;
 2778|   596k|    if (GetSmilesValence(atom) > 2 && options.isomeric) {
  ------------------
  |  Branch (2778:9): [True: 49.5k, False: 546k]
  |  Branch (2778:39): [True: 49.5k, False: 0]
  ------------------
 2779|  49.5k|      stereo = GetTetrahedralStereo(node, chiral_neighbors, symmetry_classes);
 2780|  49.5k|      if (stereo == nullptr)
  ------------------
  |  Branch (2780:11): [True: 46.2k, False: 3.28k]
  ------------------
 2781|  46.2k|        stereo = GetSquarePlanarStereo(node, chiral_neighbors, symmetry_classes);
 2782|  49.5k|    }
 2783|   596k|    if (stereo != nullptr)
  ------------------
  |  Branch (2783:9): [True: 3.28k, False: 592k]
  ------------------
 2784|  3.28k|      bracketElement = true;
 2785|       |
 2786|   596k|    if (!bracketElement) {
  ------------------
  |  Branch (2786:9): [True: 345k, False: 250k]
  ------------------
 2787|       |
 2788|       |      // Ordinary non-bracket element
 2789|   345k|      if (element) {
  ------------------
  |  Branch (2789:11): [True: 293k, False: 52.4k]
  ------------------
 2790|   293k|        const char* symbol = OBElements::GetSymbol(atom->GetAtomicNum());
 2791|   293k|        if ((!options.kekulesmi && atom->IsAromatic()) || // aromatic atom
  ------------------
  |  Branch (2791:14): [True: 293k, False: 0]
  |  Branch (2791:36): [True: 502, False: 293k]
  ------------------
 2792|   293k|            (atom->GetSpinMultiplicity() && _pconv->IsOption("r"))) //Radical centres lowercase if r option set
  ------------------
  |  Branch (2792:14): [True: 13, False: 292k]
  |  Branch (2792:45): [True: 0, False: 13]
  ------------------
 2793|    502|        {
 2794|    502|          buffer += symbol[0] + ('a' - 'A');
 2795|    502|          if (symbol[1])
  ------------------
  |  Branch (2795:15): [True: 0, False: 502]
  ------------------
 2796|      0|            buffer += symbol[1];
 2797|    502|        }
 2798|   293k|        else
 2799|   293k|          buffer += symbol;
 2800|   293k|      }
 2801|       |
 2802|       |      // Atomic number zero - either '*' or an external atom
 2803|  52.4k|      else {
 2804|  52.4k|        bool external = false;
 2805|  52.4k|        vector<pair<int,pair<OBAtom *,OBBond *> > > *externalBonds =
 2806|  52.4k|          (vector<pair<int,pair<OBAtom *,OBBond *> > > *)((OBMol*)atom->GetParent())->GetData("extBonds");
 2807|  52.4k|        vector<pair<int,pair<OBAtom *,OBBond *> > >::iterator externalBond;
 2808|       |
 2809|  52.4k|        if (externalBonds) // TODO: This code has bit-rotted and needs some love
  ------------------
  |  Branch (2809:13): [True: 0, False: 52.4k]
  ------------------
 2810|      0|          for(externalBond = externalBonds->begin();externalBond != externalBonds->end();++externalBond) {
  ------------------
  |  Branch (2810:53): [True: 0, False: 0]
  ------------------
 2811|      0|            if (externalBond->second.first == atom) {
  ------------------
  |  Branch (2811:17): [True: 0, False: 0]
  ------------------
 2812|      0|              external = true;
 2813|      0|              buffer += '&';
 2814|      0|              OBBond *bond = externalBond->second.second;
 2815|       |              //if (bond->IsUp()) {
 2816|       |              //  if ( (bond->GetBeginAtom())->HasDoubleBond() ||
 2817|       |              //       (bond->GetEndAtom())->HasDoubleBond() )
 2818|       |              //    buffer += '\\';
 2819|       |              //}
 2820|       |              //if (bond->IsDown()) {
 2821|       |              //  if ( (bond->GetBeginAtom())->HasDoubleBond() ||
 2822|       |              //       (bond->GetEndAtom())->HasDoubleBond() )
 2823|       |              //    buffer += '/';
 2824|       |              //}
 2825|      0|              if (bond->GetBondOrder() == 2 && !bond->IsAromatic()) // TODO: need to check for kekulesmi
  ------------------
  |  Branch (2825:19): [True: 0, False: 0]
  |  Branch (2825:48): [True: 0, False: 0]
  ------------------
 2826|      0|                buffer += '=';
 2827|      0|              if (bond->GetBondOrder() == 2 && bond->IsAromatic())
  ------------------
  |  Branch (2827:19): [True: 0, False: 0]
  |  Branch (2827:48): [True: 0, False: 0]
  ------------------
 2828|      0|                buffer += ':';
 2829|      0|              if (bond->GetBondOrder() == 3)
  ------------------
  |  Branch (2829:19): [True: 0, False: 0]
  ------------------
 2830|      0|                buffer += '#';
 2831|      0|              if (bond->GetBondOrder() == 4)
  ------------------
  |  Branch (2831:19): [True: 0, False: 0]
  ------------------
 2832|      0|                buffer += '$';
 2833|      0|              char tmp[10];
 2834|      0|              snprintf(tmp, 10, "%d", externalBond->first);
 2835|      0|              buffer += tmp;
 2836|      0|              break;
 2837|      0|            }
 2838|      0|          }
 2839|       |
 2840|  52.4k|        if(!external)
  ------------------
  |  Branch (2840:12): [True: 52.4k, False: 0]
  ------------------
 2841|  52.4k|          buffer += '*';
 2842|  52.4k|      }
 2843|       |
 2844|   345k|      return true;
 2845|   345k|    }
 2846|       |
 2847|       |    // Bracketed atoms, e.g. [Pb], [OH-], [C@]
 2848|   250k|    buffer += '[';
 2849|   250k|    unsigned short iso = atom->GetIsotope();
 2850|   250k|    if (options.isomeric && iso) {
  ------------------
  |  Branch (2850:9): [True: 250k, False: 0]
  |  Branch (2850:29): [True: 8.07k, False: 242k]
  ------------------
 2851|  8.07k|      if (iso >= 10000) // max 4 characters
  ------------------
  |  Branch (2851:11): [True: 15, False: 8.05k]
  ------------------
 2852|     15|        obErrorLog.ThrowError(__FUNCTION__, "Isotope value larger than 9999. Ignoring value.", obWarning);
 2853|  8.05k|      else {
 2854|  8.05k|        char iso[8]; // 7 characters plus null
 2855|  8.05k|        snprintf(iso, 8, "%u", atom->GetIsotope());
 2856|  8.05k|        buffer += iso;
 2857|  8.05k|      }
 2858|  8.07k|    }
 2859|   250k|    if (!atom->GetAtomicNum())
  ------------------
  |  Branch (2859:9): [True: 530, False: 249k]
  ------------------
 2860|    530|      buffer += '*';
 2861|   249k|    else {
 2862|   249k|      if (atom->GetAtomicNum() == OBElements::Hydrogen && options.smarts)
  ------------------
  |  Branch (2862:11): [True: 11.6k, False: 238k]
  |  Branch (2862:59): [True: 0, False: 11.6k]
  ------------------
 2863|      0|        buffer += "#1";
 2864|   249k|      else {
 2865|   249k|        unsigned int elem = atom->GetAtomicNum();
 2866|   249k|        const char* symbol = OBElements::GetSymbol(elem);
 2867|   249k|        if (*symbol == '\0') {
  ------------------
  |  Branch (2867:13): [True: 4, False: 249k]
  ------------------
 2868|      4|          char atomnum[8];  // '#' plus 3 digits plus null
 2869|      4|          snprintf(atomnum, 8, "#%u", elem);
 2870|      4|          buffer += atomnum;
 2871|   249k|        } else if (!options.kekulesmi && atom->IsAromatic()) { // aromatic atom
  ------------------
  |  Branch (2871:20): [True: 249k, False: 0]
  |  Branch (2871:42): [True: 281, False: 249k]
  ------------------
 2872|    281|          buffer += symbol[0] + ('a' - 'A');
 2873|    281|          if (symbol[1])
  ------------------
  |  Branch (2873:15): [True: 0, False: 281]
  ------------------
 2874|      0|            buffer += symbol[1];
 2875|    281|        }
 2876|   249k|        else
 2877|   249k|          buffer += symbol;
 2878|   249k|      }
 2879|   249k|    }
 2880|       |
 2881|       |    // If chiral, append '@' or '@@'...unless we're creating a SMARTS ("s") and it's @H or @@H
 2882|   250k|    if (stereo != nullptr && !(options.smarts && atom->GetImplicitHCount() > 0))
  ------------------
  |  Branch (2882:9): [True: 3.28k, False: 246k]
  |  Branch (2882:32): [True: 0, False: 3.28k]
  |  Branch (2882:50): [True: 0, False: 0]
  ------------------
 2883|  3.28k|      buffer += stereo;
 2884|       |
 2885|       |    // Add extra hydrogens.
 2886|   250k|    int hcount = numImplicitHs;
 2887|   250k|    if (hcount > 0 && (atom == _endatom || (atom == _startatom && !options.ordering))) // Leave a free valence for attachment
  ------------------
  |  Branch (2887:9): [True: 41.5k, False: 208k]
  |  Branch (2887:24): [True: 0, False: 41.5k]
  |  Branch (2887:45): [True: 0, False: 41.5k]
  |  Branch (2887:67): [True: 0, False: 0]
  ------------------
 2888|      0|      hcount--;
 2889|   250k|    if (hcount > 0) {
  ------------------
  |  Branch (2889:9): [True: 41.5k, False: 208k]
  ------------------
 2890|  41.5k|      if (options.smarts && stereo == nullptr) {
  ------------------
  |  Branch (2890:11): [True: 0, False: 41.5k]
  |  Branch (2890:29): [True: 0, False: 0]
  ------------------
 2891|      0|        char tcount[10];
 2892|      0|        for (int i = 0; i < hcount; ++i) {
  ------------------
  |  Branch (2892:25): [True: 0, False: 0]
  ------------------
 2893|      0|          buffer += "!H";
 2894|      0|          snprintf(tcount, 10, "%d", i);
 2895|      0|          buffer += tcount;
 2896|      0|        }
 2897|      0|      }
 2898|  41.5k|      else {
 2899|  41.5k|        buffer += 'H';
 2900|  41.5k|        if (hcount > 1) {
  ------------------
  |  Branch (2900:13): [True: 16.0k, False: 25.5k]
  ------------------
 2901|  16.0k|          char tcount[10];
 2902|  16.0k|          snprintf(tcount, 10, "%d", hcount);
 2903|  16.0k|          buffer += tcount;
 2904|  16.0k|        }
 2905|  41.5k|      }
 2906|  41.5k|    }
 2907|       |
 2908|       |    // Append charge to the end
 2909|   250k|    int charge = atom->GetFormalCharge();
 2910|   250k|    if (charge != 0) {
  ------------------
  |  Branch (2910:9): [True: 10.5k, False: 239k]
  ------------------
 2911|  10.5k|      if (charge > 0)
  ------------------
  |  Branch (2911:11): [True: 5.59k, False: 4.95k]
  ------------------
 2912|  5.59k|        buffer += '+';
 2913|  4.95k|      else
 2914|  4.95k|        buffer += '-';
 2915|       |
 2916|  10.5k|      if (abs(charge) > 1) {
  ------------------
  |  Branch (2916:11): [True: 5.93k, False: 4.61k]
  ------------------
 2917|  5.93k|        char tchar[10];
 2918|  5.93k|        snprintf(tchar, 10, "%d", abs(charge));
 2919|  5.93k|        buffer += tchar;
 2920|  5.93k|      }
 2921|  10.5k|    }
 2922|       |
 2923|       |    //atom class e.g. [C:2]
 2924|   250k|    if (options.showatomclass) {
  ------------------
  |  Branch (2924:9): [True: 0, False: 250k]
  ------------------
 2925|      0|      OBGenericData *data = atom->GetData("Atom Class");
 2926|      0|      if (data) {
  ------------------
  |  Branch (2926:11): [True: 0, False: 0]
  ------------------
 2927|      0|        OBPairInteger* acdata = dynamic_cast<OBPairInteger*>(data); // Could replace with C-style cast if willing to live dangerously
 2928|      0|        if (acdata) {
  ------------------
  |  Branch (2928:13): [True: 0, False: 0]
  ------------------
 2929|      0|          int ac = acdata->GetGenericValue();
 2930|      0|          if (ac >= 0) { // Allow 0, why not?
  ------------------
  |  Branch (2930:15): [True: 0, False: 0]
  ------------------
 2931|      0|            buffer += ':';
 2932|      0|            char tchar[12]; // maxint has 10 digits
 2933|      0|            snprintf(tchar, 12, "%d", ac);
 2934|      0|            buffer += tchar;
 2935|      0|          }
 2936|      0|        }
 2937|      0|      }
 2938|      0|    }
 2939|       |
 2940|   250k|    buffer += ']';
 2941|       |
 2942|   250k|    return true;
 2943|   596k|  }
_ZN9OpenBabel12OBMol2Cansmi12AtomIsChiralEPNS_6OBAtomE:
 2962|   596k|  {
 2963|   596k|    unsigned long atomid = atom->GetId();
 2964|   596k|    return _stereoFacade->HasTetrahedralStereo(atomid) || _stereoFacade->HasSquarePlanarStereo(atomid);
  ------------------
  |  Branch (2964:12): [True: 15.8k, False: 580k]
  |  Branch (2964:59): [True: 0, False: 580k]
  ------------------
 2965|   596k|  }
_ZN9OpenBabel12OBMol2Cansmi20GetTetrahedralStereoEPNS_12OBCanSmiNodeERNSt3__16vectorIPNS_6OBAtomENS3_9allocatorIS6_EEEERNS4_IjNS7_IjEEEE:
 2977|  49.5k|  {
 2978|       |    // If not enough chiral neighbors were passed in, we're done
 2979|  49.5k|    if (chiral_neighbors.size() < 4)
  ------------------
  |  Branch (2979:9): [True: 36.4k, False: 13.0k]
  ------------------
 2980|  36.4k|      return nullptr;
 2981|       |
 2982|  13.0k|    OBAtom *atom = node->GetAtom();
 2983|  13.0k|    OBTetrahedralStereo *ts = _stereoFacade->GetTetrahedralStereo(atom->GetId());
 2984|       |    // If atom is not a tetrahedral center, we're done
 2985|  13.0k|    if (!ts)
  ------------------
  |  Branch (2985:9): [True: 0, False: 13.0k]
  ------------------
 2986|      0|      return nullptr;
 2987|       |
 2988|       |    // get the Config struct defining the stereochemistry
 2989|  13.0k|    OBTetrahedralStereo::Config atomConfig = ts->GetConfig();
 2990|       |
 2991|       |    // Unspecified or unknown stereochemistry
 2992|  13.0k|    if (!atomConfig.specified || (atomConfig.specified && atomConfig.winding==OBStereo::UnknownWinding))
  ------------------
  |  Branch (2992:9): [True: 9.77k, False: 3.28k]
  |  Branch (2992:35): [True: 3.28k, False: 0]
  |  Branch (2992:59): [True: 0, False: 3.28k]
  ------------------
 2993|  9.77k|      return nullptr;
 2994|       |
 2995|       |    // create a Config struct with the chiral_neighbors in canonical output order
 2996|  3.28k|    OBStereo::Refs canonRefs;
 2997|  13.1k|    for (vector<OBAtom*>::const_iterator atom_it = chiral_neighbors.begin() + 1; atom_it != chiral_neighbors.end(); ++atom_it) {
  ------------------
  |  Branch (2997:82): [True: 9.84k, False: 3.28k]
  ------------------
 2998|  9.84k|      if (*atom_it)
  ------------------
  |  Branch (2998:11): [True: 9.52k, False: 324]
  ------------------
 2999|  9.52k|        canonRefs.push_back((*atom_it)->GetId());
 3000|    324|      else // Handle a chiral lone pair, represented by a NULL OBAtom* in chiral_neighbors
 3001|    324|        canonRefs.push_back(OBStereo::ImplicitRef);
 3002|  9.84k|    }
 3003|  3.28k|    OBTetrahedralStereo::Config canConfig;
 3004|  3.28k|    canConfig.center = atom->GetId();
 3005|  3.28k|    if (chiral_neighbors[0])
  ------------------
  |  Branch (3005:9): [True: 3.24k, False: 35]
  ------------------
 3006|  3.24k|      canConfig.from = chiral_neighbors[0]->GetId();
 3007|     35|    else // Handle a chiral lone pair, represented by a NULL OBAtom* in chiral_neighbors
 3008|     35|      canConfig.from = OBStereo::ImplicitRef;
 3009|  3.28k|    canConfig.refs = canonRefs;
 3010|       |
 3011|       |    // canConfig is clockwise
 3012|  3.28k|    if (atomConfig == canConfig)
  ------------------
  |  Branch (3012:9): [True: 1.64k, False: 1.63k]
  ------------------
 3013|  1.64k|      return "@@";
 3014|  1.63k|    else
 3015|  1.63k|      return "@";
 3016|  3.28k|  }
_ZN9OpenBabel12OBMol2Cansmi21GetSquarePlanarStereoEPNS_12OBCanSmiNodeERNSt3__16vectorIPNS_6OBAtomENS3_9allocatorIS6_EEEERNS4_IjNS7_IjEEEE:
 3029|  46.2k|  {
 3030|       |    // If no chiral neighbors were passed in, we're done
 3031|  46.2k|    if (chiral_neighbors.size() < 4)
  ------------------
  |  Branch (3031:9): [True: 36.4k, False: 9.77k]
  ------------------
 3032|  36.4k|      return nullptr;
 3033|       |
 3034|  9.77k|    OBAtom *atom = node->GetAtom();
 3035|       |
 3036|  9.77k|    OBSquarePlanarStereo *sp = _stereoFacade->GetSquarePlanarStereo(atom->GetId());
 3037|       |    // If atom is not a square-planar center, we're done
 3038|  9.77k|    if (!sp)
  ------------------
  |  Branch (3038:9): [True: 9.77k, False: 0]
  ------------------
 3039|  9.77k|      return nullptr;
 3040|       |
 3041|       |    // get the Config struct defining the stereochemistry
 3042|      0|    OBSquarePlanarStereo::Config atomConfig = sp->GetConfig();
 3043|       |
 3044|      0|    if (!atomConfig.specified)
  ------------------
  |  Branch (3044:9): [True: 0, False: 0]
  ------------------
 3045|      0|      return nullptr;
 3046|       |
 3047|       |    // create a Config struct with the chiral_neighbors in canonical output order
 3048|      0|    OBStereo::Refs canonRefs = OBStereo::MakeRefs(chiral_neighbors[0]->GetId(),
 3049|      0|        chiral_neighbors[1]->GetId(), chiral_neighbors[2]->GetId(), chiral_neighbors[3]->GetId());
 3050|      0|    OBSquarePlanarStereo::Config canConfig;
 3051|      0|    canConfig.center = atom->GetId();
 3052|      0|    canConfig.refs = canonRefs;
 3053|       |
 3054|       |    // canConfig is U shape
 3055|      0|    if (atomConfig == canConfig)
  ------------------
  |  Branch (3055:9): [True: 0, False: 0]
  ------------------
 3056|      0|      return "@SP1";
 3057|       |
 3058|      0|    canConfig.shape = OBStereo::Shape4;
 3059|      0|    if (atomConfig == canConfig)
  ------------------
  |  Branch (3059:9): [True: 0, False: 0]
  ------------------
 3060|      0|      return "@SP2";
 3061|       |
 3062|      0|    canConfig.shape = OBStereo::ShapeZ;
 3063|      0|    if (atomConfig == canConfig)
  ------------------
  |  Branch (3063:9): [True: 0, False: 0]
  ------------------
 3064|      0|      return "@SP3";
 3065|       |
 3066|      0|    return nullptr;
 3067|      0|  }
_ZN9OpenBabel12OBMol2Cansmi14BuildCanonTreeERNS_5OBMolERNS_8OBBitVecERNSt3__16vectorIjNS5_9allocatorIjEEEEPNS_12OBCanSmiNodeE:
 3134|   596k|  {
 3135|   596k|    vector<OBBond*>::iterator i;
 3136|   596k|    OBAtom *nbr, *atom;
 3137|   596k|    vector<OBAtom *> sort_nbrs;
 3138|   596k|    vector<OBAtom *>::iterator ai;
 3139|   596k|    OBBond *bond;
 3140|   596k|    OBCanSmiNode *next;
 3141|   596k|    int idx;
 3142|       |
 3143|   596k|    atom = node->GetAtom();
 3144|       |
 3145|       |#if DEBUG
 3146|       |    cout << "BuildCanonTree: " << OBElements::GetSymbol(atom->GetAtomicNum()) << ", " << atom->GetIdx() << ", canorder " << canonical_order[atom->GetIdx()-1] << "\n";
 3147|       |#endif
 3148|       |
 3149|       |    // Create a vector of neighbors sorted by canonical order, but favor
 3150|       |    // double and triple bonds over single and aromatic.  This causes
 3151|       |    // ring-closure digits to avoid double and triple bonds.
 3152|       |    //
 3153|       |    // Since there are typically just one to three neighbors, we just do a
 3154|       |    // ordered insertion rather than sorting.
 3155|       |
 3156|   596k|    bool favor_multiple = true; // Visit 'multiple' bonds first
 3157|   596k|    if (options.ordering)
  ------------------
  |  Branch (3157:9): [True: 0, False: 596k]
  ------------------
 3158|      0|      favor_multiple = false; // Visit in strict canonical order (if using user-specified order)
 3159|       |
 3160|  1.61M|    for (nbr = atom->BeginNbrAtom(i); nbr; nbr = atom->NextNbrAtom(i)) {
  ------------------
  |  Branch (3160:39): [True: 1.02M, False: 596k]
  ------------------
 3161|       |
 3162|  1.02M|      idx = nbr->GetIdx();
 3163|       |      //if (nbr->GetAtomicNum() == OBElements::Hydrogen && IsSuppressedHydrogen(nbr)) {
 3164|       |      //  _uatoms.SetBitOn(nbr->GetIdx());        // mark suppressed hydrogen, so it won't be considered
 3165|       |      //  continue;                               // later when looking for more fragments.
 3166|       |      //}
 3167|  1.02M|      if (_uatoms[idx] || !frag_atoms.BitIsSet(idx))
  ------------------
  |  Branch (3167:11): [True: 406k, False: 614k]
  |  Branch (3167:27): [True: 207k, False: 406k]
  ------------------
 3168|   614k|        continue;
 3169|       |
 3170|   406k|      OBBond *nbr_bond = atom->GetBond(nbr);
 3171|   406k|      unsigned int nbr_bond_order = nbr_bond->GetBondOrder();
 3172|   406k|      int new_needs_bsymbol = NeedsBondSymbol(nbr_bond);
 3173|       |
 3174|   754k|      for (ai = sort_nbrs.begin(); ai != sort_nbrs.end(); ++ai) {
  ------------------
  |  Branch (3174:36): [True: 381k, False: 373k]
  ------------------
 3175|   381k|        bond = atom->GetBond(*ai);
 3176|   381k|        unsigned int bond_order = bond->GetBondOrder();
 3177|   381k|        int sorted_needs_bsymbol = NeedsBondSymbol(bond);
 3178|   381k|        if (favor_multiple && new_needs_bsymbol && !sorted_needs_bsymbol) {
  ------------------
  |  Branch (3178:13): [True: 381k, False: 0]
  |  Branch (3178:31): [True: 5.29k, False: 376k]
  |  Branch (3178:52): [True: 5.08k, False: 217]
  ------------------
 3179|  5.08k|          sort_nbrs.insert(ai, nbr);
 3180|  5.08k|          ai = sort_nbrs.begin();//insert invalidated ai; set it to fail next test
 3181|  5.08k|          break;
 3182|  5.08k|        }
 3183|   376k|        if (   (!favor_multiple || new_needs_bsymbol == sorted_needs_bsymbol)
  ------------------
  |  Branch (3183:17): [True: 0, False: 376k]
  |  Branch (3183:36): [True: 373k, False: 2.83k]
  ------------------
 3184|   373k|               && canonical_order[idx-1] < canonical_order[(*ai)->GetIdx()-1]) {
  ------------------
  |  Branch (3184:19): [True: 28.2k, False: 345k]
  ------------------
 3185|  28.2k|          sort_nbrs.insert(ai, nbr);
 3186|  28.2k|          ai = sort_nbrs.begin();//insert invalidated ai; set it to fail next test
 3187|  28.2k|          break;
 3188|  28.2k|        }
 3189|   376k|      }
 3190|   406k|      if (ai == sort_nbrs.end())
  ------------------
  |  Branch (3190:11): [True: 373k, False: 33.2k]
  ------------------
 3191|   373k|        sort_nbrs.push_back(nbr);
 3192|   406k|    }
 3193|       |
 3194|   596k|    _uatoms.SetBitOn(atom->GetIdx());     //mark the atom as visited
 3195|       |
 3196|   596k|    if (_endatom && !_uatoms.BitIsSet(_endatom->GetIdx()) && sort_nbrs.size() > 1) {
  ------------------
  |  Branch (3196:9): [True: 0, False: 596k]
  |  Branch (3196:21): [True: 0, False: 0]
  |  Branch (3196:62): [True: 0, False: 0]
  ------------------
 3197|       |      // If you have specified an _endatom, the following section rearranges
 3198|       |      // sort_nbrs as follows:
 3199|       |      //   - if a branch does not lead to the end atom, move it to the front
 3200|       |      //     (i.e. visit it first)
 3201|       |      //   - otherwise move it to the end
 3202|       |      // This section is skipped if sort_nbrs has only a single member, or if
 3203|       |      // we have already visited _endatom.
 3204|       |
 3205|      0|      vector<OBAtom*> children;
 3206|      0|      MyFindChildren(mol, children, _uatoms, _endatom);
 3207|       |
 3208|      0|      vector<OBAtom*> front, end;
 3209|      0|      for (vector<OBAtom *>::iterator it=sort_nbrs.begin(); it!=sort_nbrs.end(); ++it)
  ------------------
  |  Branch (3209:61): [True: 0, False: 0]
  ------------------
 3210|      0|        if (std::find(children.begin(), children.end(), *it) == children.end() && *it != _endatom)
  ------------------
  |  Branch (3210:13): [True: 0, False: 0]
  |  Branch (3210:13): [True: 0, False: 0]
  |  Branch (3210:83): [True: 0, False: 0]
  ------------------
 3211|      0|          front.push_back(*it);
 3212|      0|        else
 3213|      0|          end.push_back(*it);
 3214|      0|      sort_nbrs = front;
 3215|      0|      sort_nbrs.insert(sort_nbrs.end(), end.begin(), end.end());
 3216|      0|    }
 3217|       |
 3218|       |    // Build the next layer of nodes, in canonical order
 3219|  1.00M|    for (ai = sort_nbrs.begin(); ai != sort_nbrs.end(); ++ai) {
  ------------------
  |  Branch (3219:34): [True: 406k, False: 596k]
  ------------------
 3220|   406k|      nbr = *ai;
 3221|   406k|      idx = nbr->GetIdx();
 3222|   406k|      if (_uatoms[idx])   // depth-first search may have used this atom since
  ------------------
  |  Branch (3222:11): [True: 53.5k, False: 353k]
  ------------------
 3223|  53.5k|        continue;         // we sorted the bonds above
 3224|   353k|      bond = atom->GetBond(nbr);
 3225|   353k|      _ubonds.SetBitOn(bond->GetIdx());
 3226|   353k|      next = new OBCanSmiNode(nbr);
 3227|   353k|      next->SetParent(atom);
 3228|   353k|      node->AddChildNode(next, bond);
 3229|   353k|      BuildCanonTree(mol, frag_atoms, canonical_order, next);
 3230|   353k|    }
 3231|       |
 3232|   596k|    return(true);
 3233|   596k|  }
_ZN9OpenBabel12OBMol2Cansmi21GetCanonClosureDigitsEPNS_6OBAtomERNS_8OBBitVecERNSt3__16vectorIjNS5_9allocatorIjEEEE:
 3275|   596k|  {
 3276|   596k|    vector<OBBondClosureInfo> vp_closures;
 3277|   596k|    vector<OBBond*> vbonds;
 3278|   596k|    vector<OBBond*>::iterator bi;
 3279|   596k|    vector<OBBond*>::iterator i;
 3280|   596k|    OBBond *bond1, *bond2;
 3281|   596k|    OBAtom *nbr1, *nbr2;
 3282|   596k|    int nbr1_canorder, nbr2_canorder;
 3283|       |
 3284|   596k|    vp_closures.clear();
 3285|   596k|    vbonds.clear();
 3286|       |
 3287|       |    // Find new ring-closure bonds for this atom
 3288|  1.61M|    for (bond1 = atom->BeginBond(i); bond1; bond1 = atom->NextBond(i)) {
  ------------------
  |  Branch (3288:38): [True: 1.02M, False: 596k]
  ------------------
 3289|       |
 3290|       |      // Is this a ring-closure neighbor?
 3291|  1.02M|      if (_ubonds.BitIsSet(bond1->GetIdx()))
  ------------------
  |  Branch (3291:11): [True: 760k, False: 261k]
  ------------------
 3292|   760k|        continue;
 3293|   261k|      nbr1 = bond1->GetNbrAtom(atom);
 3294|       |      // Skip hydrogens before checking canonical_order
 3295|       |      // PR#1999348
 3296|   261k|      if (   (nbr1->GetAtomicNum() == OBElements::Hydrogen && IsSuppressedHydrogen(nbr1))
  ------------------
  |  Branch (3296:15): [True: 208k, False: 53.3k]
  |  Branch (3296:63): [True: 207k, False: 201]
  ------------------
 3297|  53.5k|             || !frag_atoms.BitIsSet(nbr1->GetIdx()))
  ------------------
  |  Branch (3297:17): [True: 0, False: 53.5k]
  ------------------
 3298|   207k|        continue;
 3299|       |
 3300|  53.5k|      nbr1_canorder = canonical_order[nbr1->GetIdx()-1];
 3301|       |
 3302|       |      // Insert into the bond-vector in canonical order (by neighbor atom order)
 3303|  75.7k|      for (bi = vbonds.begin(); bi != vbonds.end(); ++bi) {
  ------------------
  |  Branch (3303:33): [True: 31.9k, False: 43.8k]
  ------------------
 3304|  31.9k|        bond2 = *bi;
 3305|  31.9k|        nbr2 = bond2->GetNbrAtom(atom);
 3306|  31.9k|        nbr2_canorder = canonical_order[nbr2->GetIdx()-1];
 3307|  31.9k|        if (nbr1_canorder < nbr2_canorder) {
  ------------------
  |  Branch (3307:13): [True: 9.73k, False: 22.2k]
  ------------------
 3308|  9.73k|          vbonds.insert(bi, bond1);
 3309|  9.73k|          bi = vbonds.begin();//insert invalidated bi; set it to fail next test
 3310|  9.73k|          break;
 3311|  9.73k|        }
 3312|  31.9k|      }
 3313|  53.5k|      if (bi == vbonds.end())     // highest one (or first one) - append to end
  ------------------
  |  Branch (3313:11): [True: 43.8k, False: 9.73k]
  ------------------
 3314|  43.8k|        vbonds.push_back(bond1);
 3315|  53.5k|    }
 3316|       |
 3317|       |    // If we found new open bonds, assign a bond-closure digits to each one,
 3318|       |    // add it to _vopen, and add it to the return vector.
 3319|   649k|    for (bi = vbonds.begin(); bi != vbonds.end(); ++bi) {
  ------------------
  |  Branch (3319:31): [True: 53.5k, False: 596k]
  ------------------
 3320|  53.5k|      bond1 = *bi;
 3321|  53.5k|      _ubonds.SetBitOn(bond1->GetIdx());
 3322|  53.5k|      int digit = GetUnusedIndex();
 3323|  53.5k|      int bo = (bond1->IsAromatic())? 1 : bond1->GetBondOrder();  // CJ: why was this line added?  bo is never used?
  ------------------
  |  Branch (3323:16): [True: 201, False: 53.3k]
  ------------------
 3324|  53.5k|      _vopen.push_back(OBBondClosureInfo(bond1->GetNbrAtom(atom), atom, bond1, digit, true));
 3325|  53.5k|      vp_closures.push_back(OBBondClosureInfo(bond1->GetNbrAtom(atom), atom, bond1, digit, true));
 3326|  53.5k|    }
 3327|       |
 3328|       |
 3329|       |    // Now look through the list of open closure-bonds and find any to this
 3330|       |    // atom (but watch out for the ones we just added).  For each one found,
 3331|       |    // add it to the return vector, and erase it from _vopen.
 3332|       |
 3333|   596k|    if (!_vopen.empty()) {
  ------------------
  |  Branch (3333:9): [True: 187k, False: 408k]
  ------------------
 3334|   187k|      vector<OBBondClosureInfo>::iterator j;
 3335|   849k|      for (j = _vopen.begin(); j != _vopen.end(); ) {
  ------------------
  |  Branch (3335:32): [True: 662k, False: 187k]
  ------------------
 3336|   662k|        if (j->toatom == atom) {
  ------------------
  |  Branch (3336:13): [True: 53.5k, False: 608k]
  ------------------
 3337|  53.5k|          OBBondClosureInfo bci = *j;
 3338|  53.5k|          _vopen.erase(j);                // take bond off "open" list
 3339|  53.5k|          bci.is_open = false;            // mark it "closed"
 3340|  53.5k|          vp_closures.push_back(bci);     // and add it to this atom's list
 3341|  53.5k|          j = _vopen.begin();             // reset iterator
 3342|  53.5k|        }
 3343|   608k|        else
 3344|   608k|          ++j;
 3345|   662k|      }
 3346|   187k|    }
 3347|       |
 3348|   596k|    return(vp_closures);
 3349|   596k|  }
_ZN9OpenBabel12OBMol2Cansmi20IsSuppressedHydrogenEPNS_6OBAtomE:
 3365|   427k|  {
 3366|   427k|    if (atom->GetIsotope() != 0)          // Deuterium or Tritium
  ------------------
  |  Branch (3366:9): [True: 709, False: 427k]
  ------------------
 3367|    709|      return false;
 3368|   427k|    if (atom->GetExplicitDegree() != 1)          // not exactly one bond
  ------------------
  |  Branch (3368:9): [True: 1.73k, False: 425k]
  ------------------
 3369|  1.73k|      return false;
 3370|       |
 3371|   425k|    FOR_NBORS_OF_ATOM(nbr, atom) {
  ------------------
  |  |  419|   425k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 425k, False: 415k]
  |  |  ------------------
  ------------------
 3372|   425k|      if (nbr->GetAtomicNum() == 1)       // neighbor is hydrogen
  ------------------
  |  Branch (3372:11): [True: 9.40k, False: 415k]
  ------------------
 3373|  9.40k|        return false;
 3374|   425k|    }
 3375|       |
 3376|   415k|    return true;
 3377|   425k|  }
_ZN9OpenBabel12OBMol2Cansmi16GetSmilesValenceEPNS_6OBAtomE:
 3390|   596k|  {
 3391|   596k|    int count = 0;
 3392|       |
 3393|   596k|    if (atom->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (3393:9): [True: 11.6k, False: 584k]
  ------------------
 3394|  11.6k|      return atom->GetExplicitDegree();
 3395|       |
 3396|   584k|    if (options.showexplicitH)
  ------------------
  |  Branch (3396:9): [True: 0, False: 584k]
  ------------------
 3397|      0|      return atom->GetExplicitDegree();
 3398|       |
 3399|  1.00M|    FOR_NBORS_OF_ATOM(nbr, atom) {
  ------------------
  |  |  419|   584k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.00M, False: 584k]
  |  |  ------------------
  ------------------
 3400|  1.00M|      if (nbr->GetAtomicNum() != OBElements::Hydrogen
  ------------------
  |  Branch (3400:11): [True: 798k, False: 208k]
  ------------------
 3401|   208k|            || nbr->GetIsotope() != 0
  ------------------
  |  Branch (3401:16): [True: 702, False: 208k]
  ------------------
 3402|   208k|            || nbr->GetExplicitDegree() != 1)
  ------------------
  |  Branch (3402:16): [True: 112, False: 207k]
  ------------------
 3403|   798k|        count++;
 3404|  1.00M|    }
 3405|   584k|    return(count);
 3406|   584k|  }
_ZN9OpenBabel12OBMol2Cansmi17ToCansmilesStringEPNS_12OBCanSmiNodeERNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERNS_8OBBitVecERNS3_6vectorIjNS7_IjEEEESG_:
 3434|   596k|  {
 3435|   596k|    OBAtom *atom = node->GetAtom();
 3436|   596k|    vector<OBAtom *> chiral_neighbors;
 3437|       |
 3438|       |    // Get the ring-closure digits in canonical order.  We'll use these in
 3439|       |    // two places: First, for figuring out chirality, then later for writing
 3440|       |    // the actual ring-closure digits to the string.
 3441|   596k|    vector<OBBondClosureInfo> vclose_bonds = GetCanonClosureDigits(atom, frag_atoms, canonical_order);
 3442|       |
 3443|       |    // First thing: Figure out chirality.  We start by creating a vector of the neighbors
 3444|       |    // in the order in which they'll appear in the canonical SMILES string.  This is more
 3445|       |    // complex than you'd guess because of implicit/explicit H and ring-closure digits.
 3446|       |
 3447|       |    // Don't include chiral symbol on _endatom or _startatom.
 3448|       |    // Otherwise, we end up with C[C@@H](Br)(Cl), where the C has 4 neighbours already
 3449|       |    // and we cannot concatenate another SMILES string without creating a 5-valent C.
 3450|       |
 3451|   596k|    bool is_chiral = AtomIsChiral(atom);
 3452|   596k|    if (is_chiral && atom!=_endatom && atom!=_startatom) {
  ------------------
  |  Branch (3452:9): [True: 15.8k, False: 580k]
  |  Branch (3452:22): [True: 15.8k, False: 0]
  |  Branch (3452:40): [True: 15.8k, False: 0]
  ------------------
 3453|       |
 3454|       |      // If there's a parent node, it's the first atom in the ordered neighbor-vector
 3455|       |      // used for chirality.
 3456|  15.8k|      if (node->GetParent()) {
  ------------------
  |  Branch (3456:11): [True: 15.6k, False: 181]
  ------------------
 3457|  15.6k|        chiral_neighbors.push_back(node->GetParent());
 3458|  15.6k|      }
 3459|       |
 3460|       |      // Next for chirality order will be hydrogen -- since it occurs
 3461|       |      // inside the atom's [] brackets, it's always before other neighbors.
 3462|       |      //
 3463|       |      // Note that we check the regular neighbor list, NOT the canonical
 3464|       |      // SMILES tree, because hydrogens normally aren't part of the canonical
 3465|       |      // SMILES, but we still need them to figure out chirality.
 3466|       |      //
 3467|       |      // There are two cases: it's explicit in the OBMol object but should be
 3468|       |      // written inside the brackets, i.e. "[C@H]", or it is explicit and
 3469|       |      // must be outside the brackets, such as for deuterium.  (A hydrogen
 3470|       |      // that will appear explicitly in the SMILES as a separate atom is
 3471|       |      // treated like any other atom when calculating the chirality.)
 3472|       |
 3473|  15.8k|      if (!options.showexplicitH) {
  ------------------
  |  Branch (3473:11): [True: 15.8k, False: 0]
  ------------------
 3474|  51.2k|        FOR_NBORS_OF_ATOM(i_nbr, atom) {
  ------------------
  |  |  419|  15.8k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 51.2k, False: 15.6k]
  |  |  ------------------
  ------------------
 3475|  51.2k|          OBAtom *nbr = &(*i_nbr);
 3476|  51.2k|          if (nbr->GetAtomicNum() == OBElements::Hydrogen && IsSuppressedHydrogen(nbr)) {
  ------------------
  |  Branch (3476:15): [True: 170, False: 51.0k]
  |  Branch (3476:62): [True: 121, False: 49]
  ------------------
 3477|    121|            chiral_neighbors.push_back(nbr);
 3478|    121|            break;        // quit loop: only be one H if atom is chiral
 3479|    121|          }
 3480|  51.2k|        }
 3481|  15.8k|      }
 3482|       |
 3483|       |      // Handle implict H by adding a NULL OBAtom*
 3484|  15.8k|      if(atom->GetImplicitHCount() == 1)
  ------------------
  |  Branch (3484:10): [True: 320, False: 15.5k]
  ------------------
 3485|    320|        chiral_neighbors.push_back(nullptr);
 3486|       |
 3487|       |      // Ok, done with H. Now we need to consider the case where there is a chiral
 3488|       |      // lone pair. If it exists (and we won't know for sure until we've counted up
 3489|       |      // all the neighbours) it will go in here
 3490|  15.8k|      int lonepair_location = chiral_neighbors.size();
 3491|       |
 3492|       |      // Ok, done with all that. Next in the SMILES will be the ring-closure characters.
 3493|       |      // So we need to find the corresponding atoms and add them to the list.
 3494|       |      // (We got the canonical ring-closure list earlier.)
 3495|  15.8k|      if (!vclose_bonds.empty()) {
  ------------------
  |  Branch (3495:11): [True: 14.0k, False: 1.77k]
  ------------------
 3496|  14.0k|        vector<OBBondClosureInfo>::iterator i;
 3497|  31.8k|        for (i = vclose_bonds.begin();i != vclose_bonds.end();++i) {
  ------------------
  |  Branch (3497:39): [True: 17.8k, False: 14.0k]
  ------------------
 3498|  17.8k|          OBBond *bond = i->bond;
 3499|  17.8k|          OBAtom *nbr = bond->GetNbrAtom(atom);
 3500|  17.8k|          chiral_neighbors.push_back(nbr);
 3501|  17.8k|        }
 3502|  14.0k|      }
 3503|       |
 3504|       |      // Finally, add the "regular" neighbors, the "child" nodes in the
 3505|       |      // canonical-SMILES tree, to the chiral-neighbors list.
 3506|  33.5k|      for (int i = 0; i < node->Size(); i++) {
  ------------------
  |  Branch (3506:23): [True: 17.7k, False: 15.8k]
  ------------------
 3507|  17.7k|        OBAtom *nbr = node->GetChildAtom(i);
 3508|  17.7k|        chiral_neighbors.push_back(nbr);
 3509|  17.7k|      }
 3510|       |
 3511|       |      // Handle a chiral lone-pair on a sulfur, by inserting a NULL OBAtom* at the
 3512|       |      // appropriate location
 3513|  15.8k|      if (chiral_neighbors.size() == 3 && CanHaveLonePair(atom->GetAtomicNum())) // Handle sulfur
  ------------------
  |  Branch (3513:11): [True: 11.6k, False: 4.17k]
  |  Branch (3513:43): [True: 8.88k, False: 2.76k]
  ------------------
 3514|  8.88k|        chiral_neighbors.insert(chiral_neighbors.begin() + lonepair_location, nullptr);
 3515|       |
 3516|  15.8k|    }
 3517|       |
 3518|       |    // Write the current atom to the string
 3519|   596k|    GetSmilesElement(node, chiral_neighbors, symmetry_classes, buffer);
 3520|       |
 3521|   596k|    _atmorder.push_back(atom->GetIdx());  //store the atom ordering
 3522|       |
 3523|       |    // Write ring-closure digits
 3524|   596k|    if (!vclose_bonds.empty()) {
  ------------------
  |  Branch (3524:9): [True: 63.8k, False: 532k]
  ------------------
 3525|  63.8k|      vector<OBBondClosureInfo>::iterator bci;
 3526|   170k|      for (bci = vclose_bonds.begin(); bci != vclose_bonds.end(); ++bci) {
  ------------------
  |  Branch (3526:40): [True: 107k, False: 63.8k]
  ------------------
 3527|   107k|        if (!bci->is_open)
  ------------------
  |  Branch (3527:13): [True: 53.5k, False: 53.5k]
  ------------------
 3528|  53.5k|        { // Ring closure
 3529|  53.5k|          char bs[2] = { '\0', '\0' };
 3530|       |          // Only get symbol for ring closures on the dbl bond
 3531|  53.5k|          if (HasStereoDblBond(bci->bond, node->GetAtom()))
  ------------------
  |  Branch (3531:15): [True: 10.6k, False: 42.8k]
  ------------------
 3532|  10.6k|            bs[0] = GetCisTransBondSymbol(bci->bond, node);
 3533|  53.5k|          if (bs[0])
  ------------------
  |  Branch (3533:15): [True: 74, False: 53.4k]
  ------------------
 3534|     74|            buffer += bs;	// append "/" or "\"
 3535|  53.4k|          else
 3536|  53.4k|          {
 3537|  53.4k|            switch (bci->bond->GetBondOrder())
  ------------------
  |  Branch (3537:21): [True: 53.4k, False: 8]
  ------------------
 3538|  53.4k|            {
 3539|  53.3k|            case 1:
  ------------------
  |  Branch (3539:13): [True: 53.3k, False: 142]
  ------------------
 3540|  53.3k|              if (!bci->bond->IsAromatic() && bci->bond->IsInRing() && bci->bond->GetBeginAtom()->IsAromatic() && bci->bond->GetEndAtom()->IsAromatic())
  ------------------
  |  Branch (3540:19): [True: 53.1k, False: 194]
  |  Branch (3540:47): [True: 53.1k, False: 0]
  |  Branch (3540:72): [True: 14, False: 53.1k]
  |  Branch (3540:115): [True: 0, False: 14]
  ------------------
 3541|      0|                buffer += '-';
 3542|  53.3k|              break;
 3543|    121|            case 2:
  ------------------
  |  Branch (3543:13): [True: 121, False: 53.3k]
  ------------------
 3544|    121|              if (options.kekulesmi || !bci->bond->IsAromatic())
  ------------------
  |  Branch (3544:19): [True: 0, False: 121]
  |  Branch (3544:40): [True: 114, False: 7]
  ------------------
 3545|    114|                buffer += '=';
 3546|    121|              break;
 3547|     10|            case 3:
  ------------------
  |  Branch (3547:13): [True: 10, False: 53.4k]
  ------------------
 3548|     10|              buffer += '#'; break;
 3549|      3|            case 4:
  ------------------
  |  Branch (3549:13): [True: 3, False: 53.4k]
  ------------------
 3550|      3|              buffer += '$'; break;
 3551|  53.4k|            }
 3552|  53.4k|          }
 3553|  53.5k|        }
 3554|  53.5k|        else
 3555|  53.5k|        { // Ring opening
 3556|  53.5k|          char bs[2] = { '\0', '\0' };
 3557|       |          // Only get symbol for ring openings on the dbl bond
 3558|  53.5k|          if (!HasStereoDblBond(bci->bond, bci->bond->GetNbrAtom(node->GetAtom())))
  ------------------
  |  Branch (3558:15): [True: 42.8k, False: 10.6k]
  ------------------
 3559|  42.8k|            bs[0] = GetCisTransBondSymbol(bci->bond, node);
 3560|  53.5k|          if (bs[0])
  ------------------
  |  Branch (3560:15): [True: 166, False: 53.3k]
  ------------------
 3561|    166|            buffer += bs;	// append "/" or "\"
 3562|  53.5k|        }
 3563|   107k|        if (bci->ringdigit > 9) {
  ------------------
  |  Branch (3563:13): [True: 14.3k, False: 92.6k]
  ------------------
 3564|  14.3k|          buffer += '%';
 3565|  14.3k|          if (bci->ringdigit > 99)
  ------------------
  |  Branch (3565:15): [True: 0, False: 14.3k]
  ------------------
 3566|      0|            buffer += '(';
 3567|  14.3k|          char digits[8];
 3568|  14.3k|          snprintf(digits, 8, "%d", bci->ringdigit);
 3569|  14.3k|          buffer += digits;
 3570|  14.3k|          if (bci->ringdigit > 99)
  ------------------
  |  Branch (3570:15): [True: 0, False: 14.3k]
  ------------------
 3571|      0|            buffer += ')';
 3572|  14.3k|        }
 3573|  92.6k|        else
 3574|  92.6k|          buffer += (char)(bci->ringdigit + '0');
 3575|   107k|      }
 3576|  63.8k|    }
 3577|       |
 3578|       |    // Write child bonds, then recursively follow paths to child nodes
 3579|       |    // to print the SMILES for each child branch.
 3580|       |
 3581|   596k|    OBBond *bond;
 3582|   949k|    for (int i = 0;i < node->Size();i++) {
  ------------------
  |  Branch (3582:20): [True: 353k, False: 596k]
  ------------------
 3583|   353k|      bond = node->GetChildBond(i);
 3584|   353k|      if (i+1 < node->Size() || node->GetAtom() == _endatom)
  ------------------
  |  Branch (3584:11): [True: 17.1k, False: 336k]
  |  Branch (3584:33): [True: 0, False: 336k]
  ------------------
 3585|  17.1k|        buffer += '(';
 3586|       |
 3587|   353k|      switch (bond->GetBondOrder()) {
  ------------------
  |  Branch (3587:15): [True: 353k, False: 143]
  ------------------
 3588|   271k|      case 1:
  ------------------
  |  Branch (3588:7): [True: 271k, False: 82.1k]
  ------------------
 3589|   271k|        char cc[2];
 3590|   271k|        cc[0] = GetCisTransBondSymbol(bond, node);
 3591|   271k|        if (cc[0] != '\0') {
  ------------------
  |  Branch (3591:13): [True: 2.67k, False: 268k]
  ------------------
 3592|  2.67k|          cc[1] = '\0';
 3593|  2.67k|          buffer += cc;
 3594|  2.67k|        }
 3595|   268k|        else {
 3596|       |          // Write a single bond symbol if not aromatic but end atoms are both aromatic
 3597|       |          // This will speed up reading as it will avoid ring perception around line 563 (bond->IsInRing())
 3598|       |          // TODO: Consider making the test for IsInRing() an option
 3599|   268k|          if (!bond->IsAromatic() && bond->IsInRing() && bond->GetBeginAtom()->IsAromatic() && bond->GetEndAtom()->IsAromatic())
  ------------------
  |  Branch (3599:15): [True: 268k, False: 434]
  |  Branch (3599:38): [True: 130k, False: 137k]
  |  Branch (3599:58): [True: 48, False: 130k]
  |  Branch (3599:96): [True: 19, False: 29]
  ------------------
 3600|     19|            buffer += '-';
 3601|   268k|        }
 3602|   271k|        break;
 3603|  73.3k|      case 2:
  ------------------
  |  Branch (3603:7): [True: 73.3k, False: 279k]
  ------------------
 3604|  73.3k|        if (options.kekulesmi || !bond->IsAromatic())
  ------------------
  |  Branch (3604:13): [True: 0, False: 73.3k]
  |  Branch (3604:34): [True: 73.2k, False: 162]
  ------------------
 3605|  73.2k|          buffer += '=';
 3606|  73.3k|        break;
 3607|  1.84k|      case 3:
  ------------------
  |  Branch (3607:7): [True: 1.84k, False: 351k]
  ------------------
 3608|  1.84k|        buffer += '#';
 3609|  1.84k|        break;
 3610|  6.73k|      case 4:
  ------------------
  |  Branch (3610:7): [True: 6.73k, False: 346k]
  ------------------
 3611|  6.73k|        buffer += '$';
 3612|   353k|      }
 3613|       |
 3614|   353k|      ToCansmilesString(node->GetChildNode(i),buffer, frag_atoms, symmetry_classes, canonical_order);
 3615|   353k|      if (i+1 < node->Size() || node->GetAtom() == _endatom)
  ------------------
  |  Branch (3615:11): [True: 17.1k, False: 336k]
  |  Branch (3615:33): [True: 0, False: 336k]
  ------------------
 3616|  17.1k|        buffer += ')';
 3617|   353k|    }
 3618|   596k|  }
_ZN9OpenBabel7addNbrsERNS_8OBBitVecEPNS_6OBAtomERKS0_:
 3800|   596k|  {
 3801|  1.02M|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|   596k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.02M, False: 596k]
  |  |  ------------------
  ------------------
 3802|  1.02M|      if (!mask.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (3802:11): [True: 207k, False: 813k]
  ------------------
 3803|   207k|        continue;
 3804|       |      // skip visited atoms
 3805|   813k|      if (fragment.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (3805:11): [True: 460k, False: 353k]
  ------------------
 3806|   460k|        continue;
 3807|       |      // add the neighbor atom to the fragment
 3808|   353k|      fragment.SetBitOn(nbr->GetIdx());
 3809|       |      // recurse...
 3810|   353k|      addNbrs(fragment, &*nbr, mask);
 3811|   353k|    }
 3812|   596k|  }
_ZN9OpenBabel11getFragmentEPNS_6OBAtomERKNS_8OBBitVecE:
 3820|   242k|  {
 3821|   242k|    OBBitVec fragment;
 3822|   242k|    fragment.SetBitOn(atom->GetIdx());
 3823|       |    // start the recursion
 3824|   242k|    addNbrs(fragment, atom, mask);
 3825|   242k|    return fragment;
 3826|   242k|  }
_ZN9OpenBabel12OBMol2Cansmi22CreateFragCansmiStringERNS_5OBMolERNS_8OBBitVecERNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
 3840|   242k|  {
 3841|       |    //cout << "CreateFragCansmiString()" << endl;
 3842|   242k|    OBAtom *atom;
 3843|   242k|    OBCanSmiNode *root;
 3844|   242k|    buffer[0] = '\0';
 3845|   242k|    vector<OBNodeBase*>::iterator ai;
 3846|   242k|    vector<unsigned int> symmetry_classes, canonical_order;
 3847|   242k|    symmetry_classes.reserve(mol.NumAtoms());
 3848|   242k|    canonical_order.reserve(mol.NumAtoms());
 3849|       |
 3850|       |    // Remember the desired endatom, if specified
 3851|   242k|    const char* pp = _pconv->IsOption("l");
 3852|   242k|    unsigned int atom_idx  = pp ? atoi(pp) : 0;
  ------------------
  |  Branch (3852:30): [True: 0, False: 242k]
  ------------------
 3853|   242k|    if (atom_idx >= 1 && atom_idx <= mol.NumAtoms())
  ------------------
  |  Branch (3853:9): [True: 0, False: 242k]
  |  Branch (3853:26): [True: 0, False: 0]
  ------------------
 3854|      0|      _endatom = mol.GetAtom(atom_idx);
 3855|       |    // Was a start atom specified?
 3856|   242k|    pp = _pconv->IsOption("f");
 3857|   242k|    atom_idx  = pp ? atoi(pp) : 0;
  ------------------
  |  Branch (3857:17): [True: 0, False: 242k]
  ------------------
 3858|   242k|    if (atom_idx >= 1 && atom_idx <= mol.NumAtoms())
  ------------------
  |  Branch (3858:9): [True: 0, False: 242k]
  |  Branch (3858:26): [True: 0, False: 0]
  ------------------
 3859|      0|      _startatom = mol.GetAtom(atom_idx);
 3860|       |
 3861|       |    // Was an atom ordering specified?
 3862|   242k|    const char* ppo = options.ordering;
 3863|   242k|    vector<string> s_atom_order;
 3864|   242k|    vector<int> atom_order;
 3865|   242k|    if (ppo) {
  ------------------
  |  Branch (3865:9): [True: 0, False: 242k]
  ------------------
 3866|      0|      tokenize(s_atom_order,ppo,"-()");
 3867|      0|      if (s_atom_order.size() != mol.NumHvyAtoms())
  ------------------
  |  Branch (3867:11): [True: 0, False: 0]
  ------------------
 3868|      0|        ppo = nullptr;
 3869|      0|      else {
 3870|      0|        for (vector<string>::const_iterator cit=s_atom_order.begin(); cit!=s_atom_order.end(); ++cit)
  ------------------
  |  Branch (3870:71): [True: 0, False: 0]
  ------------------
 3871|      0|          atom_order.push_back(atoi(cit->c_str()));
 3872|      0|        atom_idx = atom_order.at(0);
 3873|      0|        if (atom_idx >= 1 && atom_idx <= mol.NumAtoms())
  ------------------
  |  Branch (3873:13): [True: 0, False: 0]
  |  Branch (3873:30): [True: 0, False: 0]
  ------------------
 3874|      0|          _startatom = mol.GetAtom(atom_idx);
 3875|      0|      }
 3876|      0|    }
 3877|       |    // Was Universal SMILES requested?
 3878|   242k|    bool universal_smiles = _pconv->IsOption("U");
 3879|   242k|    if (universal_smiles) {
  ------------------
  |  Branch (3879:9): [True: 0, False: 242k]
  ------------------
 3880|      0|      bool parsedOkay = ParseInChI(mol, atom_order);
 3881|      0|      if (!parsedOkay)
  ------------------
  |  Branch (3881:11): [True: 0, False: 0]
  ------------------
 3882|      0|        universal_smiles = false;
 3883|      0|    }
 3884|       |
 3885|       |    // First, create a canonical ordering vector for the atoms.  Canonical
 3886|       |    // labels are zero indexed, corresponding to "atom->GetIdx()-1".
 3887|   242k|    if (_canonicalOutput) {
  ------------------
  |  Branch (3887:9): [True: 242k, False: 0]
  ------------------
 3888|       |
 3889|       |      // Find the (dis)connected fragments.
 3890|   242k|      OBBitVec visited;
 3891|   242k|      std::vector<OBBitVec> fragments;
 3892|  1.04M|      for (std::size_t i = 0; i < mol.NumAtoms(); ++i) {
  ------------------
  |  Branch (3892:31): [True: 804k, False: 242k]
  ------------------
 3893|   804k|        if (!frag_atoms.BitIsSet(i+1) || visited.BitIsSet(i+1))
  ------------------
  |  Branch (3893:13): [True: 207k, False: 596k]
  |  Branch (3893:42): [True: 353k, False: 242k]
  ------------------
 3894|   561k|          continue;
 3895|   242k|        fragments.push_back(getFragment(mol.GetAtom(i+1), frag_atoms));
 3896|   242k|        visited |= fragments.back();
 3897|   242k|      }
 3898|       |
 3899|       |      // Determine symmetry classes for each disconnected fragment separately
 3900|   242k|      symmetry_classes.resize(mol.NumAtoms());
 3901|   485k|      for (std::size_t i = 0; i < fragments.size(); ++i) {
  ------------------
  |  Branch (3901:31): [True: 242k, False: 242k]
  ------------------
 3902|   242k|        OBGraphSym gs(&mol, &(fragments[i]));
 3903|   242k|        vector<unsigned int> tmp;
 3904|   242k|        gs.GetSymmetry(tmp);
 3905|       |
 3906|  1.04M|        for (std::size_t j = 0; j < mol.NumAtoms(); ++j)
  ------------------
  |  Branch (3906:33): [True: 804k, False: 242k]
  ------------------
 3907|   804k|          if (fragments[i].BitIsSet(j+1))
  ------------------
  |  Branch (3907:15): [True: 596k, False: 207k]
  ------------------
 3908|   596k|            symmetry_classes[j] = tmp[j];
 3909|   242k|      }
 3910|       |
 3911|       |      /*
 3912|       |      OBGraphSym gs(&mol, &frag_atoms);
 3913|       |      gs.GetSymmetry(symmetry_classes);
 3914|       |      */
 3915|       |
 3916|       |      // Was a canonicalization timeout given?
 3917|   242k|      unsigned int maxSeconds = 5;
 3918|   242k|      const char *timeoutString = _pconv->IsOption("T");
 3919|   242k|      if (timeoutString) {
  ------------------
  |  Branch (3919:11): [True: 0, False: 242k]
  ------------------
 3920|      0|        std::stringstream ss(timeoutString);
 3921|      0|        if (!(ss >> maxSeconds)) {
  ------------------
  |  Branch (3921:13): [True: 0, False: 0]
  ------------------
 3922|      0|          obErrorLog.ThrowError(__FUNCTION__, "Canonicalization timeout should be a number", obWarning);
 3923|      0|          maxSeconds = 5;
 3924|      0|        }
 3925|      0|      }
 3926|       |
 3927|   242k|      CanonicalLabels(&mol, symmetry_classes, canonical_order, frag_atoms, maxSeconds);
 3928|   242k|    }
 3929|      0|    else {
 3930|      0|      if (_pconv->IsOption("C")) {      // "C" == "anti-canonical form"
  ------------------
  |  Branch (3930:11): [True: 0, False: 0]
  ------------------
 3931|      0|        RandomLabels(&mol, frag_atoms, symmetry_classes, canonical_order);
 3932|      0|      } else if (ppo || universal_smiles) { // user-specified or InChI canonical labels
  ------------------
  |  Branch (3932:18): [True: 0, False: 0]
  |  Branch (3932:25): [True: 0, False: 0]
  ------------------
 3933|      0|        canonical_order.resize(mol.NumAtoms());
 3934|      0|        symmetry_classes.resize(mol.NumAtoms());
 3935|      0|        int idx = 3; // Start the labels at 3 (to leave space for special values 0, 1 and 2)
 3936|      0|        for (int i=0; i<atom_order.size(); ++i)
  ------------------
  |  Branch (3936:23): [True: 0, False: 0]
  ------------------
 3937|      0|          if (canonical_order[atom_order[i] - 1] == 0) { // Ignore ring closures (for "U")
  ------------------
  |  Branch (3937:15): [True: 0, False: 0]
  ------------------
 3938|      0|            canonical_order[atom_order[i] - 1] = idx;
 3939|      0|            symmetry_classes[atom_order[i] - 1] = idx;
 3940|      0|            ++idx;
 3941|      0|          }
 3942|      0|        for (int i=0; i<canonical_order.size(); ++i)
  ------------------
  |  Branch (3942:23): [True: 0, False: 0]
  ------------------
 3943|      0|          if (canonical_order[i] == 0) { // Explicit hydrogens
  ------------------
  |  Branch (3943:15): [True: 0, False: 0]
  ------------------
 3944|      0|            if (mol.GetAtom(i+1)->GetAtomicNum() == OBElements::Hydrogen && mol.GetAtom(i+1)->GetIsotope()!=0) { // [2H] or [3H]
  ------------------
  |  Branch (3944:17): [True: 0, False: 0]
  |  Branch (3944:77): [True: 0, False: 0]
  ------------------
 3945|      0|              canonical_order[i] = mol.GetAtom(i+1)->GetIsotope() - 1; // i.e. 1 or 2
 3946|      0|              symmetry_classes[i] = canonical_order[i];
 3947|      0|            }
 3948|      0|          }
 3949|      0|      } else {
 3950|      0|        StandardLabels(&mol, &frag_atoms, symmetry_classes, canonical_order);
 3951|      0|      }
 3952|      0|    }
 3953|       |
 3954|       |    // OUTER LOOP: Handles dot-disconnected structures and reactions.  Finds the
 3955|       |    // lowest unmarked canorder atom in the current reaction role, and starts there
 3956|       |    // to generate a SMILES.
 3957|       |    // Repeats until no atoms remain unmarked.
 3958|       |
 3959|   242k|    bool new_rxn_role = false; // flag to indicate whether we have started a new reaction role
 3960|   242k|    bool isrxn = mol.IsReaction();
 3961|   242k|    OBReactionFacade rxn(&mol);
 3962|   242k|    unsigned int rxnrole = 1; // reactants
 3963|   485k|    while (1) {
  ------------------
  |  Branch (3963:12): [True: 485k, Folded]
  ------------------
 3964|   485k|      if (_pconv->IsOption("R"))
  ------------------
  |  Branch (3964:11): [True: 0, False: 485k]
  ------------------
 3965|      0|        _bcdigit = 0; // Reset the bond closure index for each disconnected component
 3966|       |
 3967|       |      // It happens that the lowest canonically-numbered atom is usually
 3968|       |      // a good place to start the canonical SMILES.
 3969|   485k|      OBAtom *root_atom;
 3970|   485k|      unsigned int lowest_canorder = 999999;
 3971|   485k|      root_atom = nullptr;
 3972|       |
 3973|       |      // If we specified a startatom_idx & it's in this fragment, use it to start the fragment
 3974|   485k|      if (_startatom)
  ------------------
  |  Branch (3974:11): [True: 0, False: 485k]
  ------------------
 3975|      0|        if (!_uatoms[_startatom->GetIdx()] &&
  ------------------
  |  Branch (3975:13): [True: 0, False: 0]
  ------------------
 3976|      0|           frag_atoms.BitIsSet(_startatom->GetIdx()) &&
  ------------------
  |  Branch (3976:12): [True: 0, False: 0]
  ------------------
 3977|      0|           (!isrxn || rxn.GetRole(_startatom)==rxnrole))
  ------------------
  |  Branch (3977:13): [True: 0, False: 0]
  |  Branch (3977:23): [True: 0, False: 0]
  ------------------
 3978|      0|          root_atom = _startatom;
 3979|       |
 3980|   485k|      if (root_atom == nullptr) {
  ------------------
  |  Branch (3980:11): [True: 485k, False: 0]
  ------------------
 3981|  2.09M|        for (atom = mol.BeginAtom(ai); atom; atom = mol.NextAtom(ai)) {
  ------------------
  |  Branch (3981:40): [True: 1.60M, False: 485k]
  ------------------
 3982|  1.60M|          int idx = atom->GetIdx();
 3983|  1.60M|          if (//atom->GetAtomicNum() != OBElements::Hydrogen       // don't start with a hydrogen
 3984|  1.60M|              !_uatoms[idx]          // skip atoms already used (for fragments)
  ------------------
  |  Branch (3984:15): [True: 1.01M, False: 596k]
  ------------------
 3985|  1.01M|              && frag_atoms.BitIsSet(idx)// skip atoms not in this fragment
  ------------------
  |  Branch (3985:18): [True: 596k, False: 415k]
  ------------------
 3986|   596k|              && (!isrxn || rxn.GetRole(atom)==rxnrole) // skip atoms not in this rxn role
  ------------------
  |  Branch (3986:19): [True: 596k, False: 0]
  |  Branch (3986:29): [True: 0, False: 0]
  ------------------
 3987|       |              //&& !atom->IsChiral()    // don't use chiral atoms as root node
 3988|   596k|              && canonical_order[idx-1] < lowest_canorder) {
  ------------------
  |  Branch (3988:18): [True: 337k, False: 258k]
  ------------------
 3989|   337k|            root_atom = atom;
 3990|   337k|            lowest_canorder = canonical_order[idx-1];
 3991|   337k|          }
 3992|  1.60M|        }
 3993|       |        // For Inchified or Universal SMILES, if the start atom is an [O-] attached to atom X, choose any =O attached to X instead.
 3994|       |        //          Ditto for [S-] and =S.
 3995|   485k|        if ((_pconv->IsOption("I") || universal_smiles)
  ------------------
  |  Branch (3995:14): [True: 0, False: 485k]
  |  Branch (3995:39): [True: 0, False: 485k]
  ------------------
 3996|      0|             && root_atom && root_atom->GetFormalCharge()==-1  && root_atom->GetExplicitDegree() == 1
  ------------------
  |  Branch (3996:17): [True: 0, False: 0]
  |  Branch (3996:30): [True: 0, False: 0]
  |  Branch (3996:67): [True: 0, False: 0]
  ------------------
 3997|      0|             && root_atom->HasSingleBond() && (root_atom->GetAtomicNum() == OBElements::Oxygen || root_atom->GetAtomicNum() == OBElements::Sulfur)) {
  ------------------
  |  Branch (3997:17): [True: 0, False: 0]
  |  Branch (3997:48): [True: 0, False: 0]
  |  Branch (3997:99): [True: 0, False: 0]
  ------------------
 3998|      0|          OBBondIterator bi = root_atom->BeginBonds();
 3999|      0|          OBAtom* central = root_atom->BeginNbrAtom(bi);
 4000|      0|          FOR_NBORS_OF_ATOM(nbr, central) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4001|      0|            if (root_atom == &*nbr) continue;
  ------------------
  |  Branch (4001:17): [True: 0, False: 0]
  ------------------
 4002|      0|            if (nbr->GetAtomicNum() == root_atom->GetAtomicNum() && nbr->GetExplicitDegree() == 1 && nbr->HasDoubleBond()) {
  ------------------
  |  Branch (4002:17): [True: 0, False: 0]
  |  Branch (4002:69): [True: 0, False: 0]
  |  Branch (4002:102): [True: 0, False: 0]
  ------------------
 4003|      0|              root_atom = &*nbr;
 4004|      0|              break;
 4005|      0|            }
 4006|      0|          }
 4007|      0|        }
 4008|   485k|      }
 4009|       |
 4010|       |      // No atom found?  If it's not a reaction, then we've done all fragments.
 4011|       |      // If it is, then increment the rxn role and try again.
 4012|   485k|      if (root_atom == nullptr) {
  ------------------
  |  Branch (4012:11): [True: 242k, False: 242k]
  ------------------
 4013|   242k|        if (mol.IsReaction()) {
  ------------------
  |  Branch (4013:13): [True: 0, False: 242k]
  ------------------
 4014|      0|          rxnrole++;
 4015|      0|          if (rxnrole==4)
  ------------------
  |  Branch (4015:15): [True: 0, False: 0]
  ------------------
 4016|      0|            break;
 4017|      0|          buffer += '>';
 4018|      0|          new_rxn_role = true;
 4019|      0|          continue;
 4020|      0|        }
 4021|   242k|        else
 4022|   242k|          break;
 4023|   242k|      }
 4024|       |
 4025|       |      // Clear out closures in case structure is dot disconnected
 4026|       |      //      _atmorder.clear();
 4027|   242k|      _vopen.clear();
 4028|       |
 4029|       |      // Dot disconnected structure or new rxn role?
 4030|   242k|      if (new_rxn_role)
  ------------------
  |  Branch (4030:11): [True: 0, False: 242k]
  ------------------
 4031|      0|        new_rxn_role = false;
 4032|   242k|      else if (!buffer.empty())
  ------------------
  |  Branch (4032:16): [True: 0, False: 242k]
  ------------------
 4033|      0|        buffer += '.';
 4034|       |
 4035|   242k|      root = new OBCanSmiNode (root_atom);
 4036|       |
 4037|   242k|      BuildCanonTree(mol, frag_atoms, canonical_order, root);
 4038|   242k|      ToCansmilesString(root, buffer, frag_atoms, symmetry_classes, canonical_order);
 4039|   242k|      delete root;
 4040|   242k|    }
 4041|   242k|  }
_ZN9OpenBabel18CreateCansmiStringERNS_5OBMolERNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERNS_8OBBitVecEPNS_12OBConversionE:
 4081|   242k|  {
 4082|   242k|    bool canonical = pConv->IsOption("c") != nullptr;
 4083|       |
 4084|   242k|    OutOptions options(!pConv->IsOption("i"), pConv->IsOption("k"),
 4085|   242k|      pConv->IsOption("a"),
 4086|   242k|      pConv->IsOption("h"), pConv->IsOption("s"),
 4087|   242k|      pConv->IsOption("o"));
 4088|       |
 4089|   242k|    OBMol2Cansmi m2s(options);
 4090|   242k|    m2s.Init(&mol, canonical, pConv);
 4091|       |
 4092|   242k|    if (options.isomeric) {
  ------------------
  |  Branch (4092:9): [True: 242k, False: 0]
  ------------------
 4093|   242k|      PerceiveStereo(&mol);
 4094|   242k|      m2s.CreateCisTrans(mol); // No need for this if not iso
 4095|   242k|    }
 4096|      0|    else {
 4097|       |      // Not isomeric - be sure there are no Z coordinates, clear
 4098|       |      // all stereo-center and cis/trans information.
 4099|      0|      OBBond *bond;
 4100|      0|      vector<OBBond*>::iterator bi;
 4101|      0|      for (bond = mol.BeginBond(bi); bond; bond = mol.NextBond(bi)) {
  ------------------
  |  Branch (4101:38): [True: 0, False: 0]
  ------------------
 4102|      0|        bond->SetHash(false);
 4103|      0|        bond->SetWedge(false);
 4104|      0|      }
 4105|      0|    }
 4106|       |
 4107|   242k|    if (!options.showexplicitH) {
  ------------------
  |  Branch (4107:9): [True: 242k, False: 0]
  ------------------
 4108|       |      // If the fragment includes explicit hydrogens, exclude them.
 4109|       |      // They won't appear in the SMILES anyway (unless they're attached to
 4110|       |      // a chiral center, or it's something like [H][H]).
 4111|   804k|      FOR_ATOMS_OF_MOL(iatom, mol) {
  ------------------
  |  |  417|   242k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 804k, False: 242k]
  |  |  ------------------
  ------------------
 4112|   804k|        OBAtom *atom = &(*iatom);
 4113|   804k|        if (frag_atoms.BitIsSet(atom->GetIdx()) && atom->GetAtomicNum() == OBElements::Hydrogen
  ------------------
  |  Branch (4113:13): [True: 804k, False: 0]
  |  Branch (4113:52): [True: 219k, False: 584k]
  ------------------
 4114|   219k|          && (!options.isomeric || m2s.IsSuppressedHydrogen(atom))) {
  ------------------
  |  Branch (4114:15): [True: 0, False: 219k]
  |  Branch (4114:36): [True: 207k, False: 11.6k]
  ------------------
 4115|   207k|          frag_atoms.SetBitOff(atom->GetIdx());
 4116|   207k|        }
 4117|   804k|      }
 4118|   242k|    }
 4119|       |
 4120|   242k|    m2s.CreateFragCansmiString(mol, frag_atoms, buffer);
 4121|       |
 4122|   242k|    if (pConv->IsOption("O")) { // record smiles atom order info
  ------------------
  |  Branch (4122:9): [True: 0, False: 242k]
  ------------------
 4123|       |      // This atom order data is useful not just for canonical SMILES
 4124|       |      // Could also save canonical bond order if anyone desires
 4125|      0|      OBPairData *canData;
 4126|      0|      if (!mol.HasData("SMILES Atom Order")) {
  ------------------
  |  Branch (4126:11): [True: 0, False: 0]
  ------------------
 4127|       |        // Create new OBPairData
 4128|      0|        canData = new OBPairData;
 4129|      0|        canData->SetAttribute("SMILES Atom Order");
 4130|      0|        canData->SetOrigin(OpenBabel::local);
 4131|      0|        mol.SetData(canData);
 4132|      0|      }
 4133|      0|      else {
 4134|       |        // Recanonicalizing - update existing new OBPairData
 4135|      0|        canData = (OBPairData *)mol.GetData("SMILES Atom Order");
 4136|      0|      }
 4137|      0|      std::string atmorder;
 4138|      0|      m2s.GetOutputOrder(atmorder);
 4139|      0|      canData->SetValue(atmorder);
 4140|      0|    }
 4141|   242k|  }
_ZN9OpenBabel13SMIBaseFormat13WriteMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
 4183|   242k|  {
 4184|       |    //cout << "SMIBaseFromat::WriteMolecule()" << endl;
 4185|   242k|    OBMol* pmol = dynamic_cast<OBMol*>(pOb);
 4186|       |
 4187|       |    // Define some references so we can use the old parameter names
 4188|   242k|    ostream &ofs = *pConv->GetOutStream();
 4189|       |
 4190|       |    // Inchified SMILES? If so, then replace mol with the new 'normalised' one
 4191|   242k|    if (pConv->IsOption("I")) {
  ------------------
  |  Branch (4191:9): [True: 0, False: 242k]
  ------------------
 4192|      0|      bool success = GetInchifiedSMILESMolecule(pmol, false);
 4193|      0|      if (!success) {
  ------------------
  |  Branch (4193:11): [True: 0, False: 0]
  ------------------
 4194|      0|        ofs << NewLine();
 4195|      0|        obErrorLog.ThrowError(__FUNCTION__, "Cannot generate Universal NSMILES for this molecule", obError);
 4196|      0|        return false;
 4197|      0|      }
 4198|      0|    }
 4199|       |
 4200|       |    // Title only option?
 4201|   242k|    if(pConv->IsOption("t")) {
  ------------------
  |  Branch (4201:8): [True: 0, False: 242k]
  ------------------
 4202|      0|      ofs << pmol->GetTitle() << NewLine();
 4203|      0|      return true;
 4204|      0|    }
 4205|       |
 4206|       |    // Option 'x' needs "SMILES Atom Order" to be set
 4207|       |    // FIXME: When we support features of CXN extended SMILES
 4208|       |    //        we can rewrite this
 4209|   242k|    if (pConv->IsOption("x"))
  ------------------
  |  Branch (4209:9): [True: 0, False: 242k]
  ------------------
 4210|      0|      pConv->AddOption("O");
 4211|       |
 4212|   242k|    std::string buffer;
 4213|   242k|    buffer.reserve(1000);
 4214|       |
 4215|       |    // If there is data attached called "SMILES_Fragment", then it's
 4216|       |    // an ascii OBBitVec, representing the atoms of a fragment.  The
 4217|       |    // SMILES generated will only include these fragment atoms.
 4218|       |
 4219|   242k|    OBBitVec fragatoms(pmol->NumAtoms());
 4220|       |
 4221|   242k|    OBPairData *dp = (OBPairData *) pmol->GetData("SMILES_Fragment");
 4222|   242k|    const char* ppF = pConv->IsOption("F");
 4223|   242k|    if (dp) {
  ------------------
  |  Branch (4223:9): [True: 0, False: 242k]
  ------------------
 4224|      0|      fragatoms.FromString(dp->GetValue(), pmol->NumAtoms());
 4225|      0|    }
 4226|   242k|    else if (ppF) { // Use info from option "F"
  ------------------
  |  Branch (4226:14): [True: 0, False: 242k]
  ------------------
 4227|      0|      fragatoms.FromString(ppF, pmol->NumAtoms());
 4228|      0|    }
 4229|       |    // If no "SMILES_Fragment" data, fill the entire OBBitVec
 4230|       |    // with 1's so that the SMILES will be for the whole molecule.
 4231|   242k|    else {
 4232|   242k|      FOR_ATOMS_OF_MOL(a, *pmol)
  ------------------
  |  |  417|   242k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 804k, False: 242k]
  |  |  ------------------
  ------------------
 4233|   804k|        {
 4234|   804k|          fragatoms.SetBitOn(a->GetIdx());
 4235|   804k|        }
 4236|   242k|    }
 4237|       |
 4238|   242k|    if (pmol->NumAtoms() > 0 || pmol->IsReaction()) {
  ------------------
  |  Branch (4238:9): [True: 242k, False: 0]
  |  Branch (4238:33): [True: 0, False: 0]
  ------------------
 4239|   242k|      CreateCansmiString(*pmol, buffer, fragatoms, pConv);
 4240|   242k|    }
 4241|       |
 4242|   242k|    bool writenewline = false;
 4243|   242k|    if(!pConv->IsOption("smilesonly")) {
  ------------------
  |  Branch (4243:8): [True: 242k, False: 0]
  ------------------
 4244|       |
 4245|   242k|      if(!pConv->IsOption("n")) {
  ------------------
  |  Branch (4245:10): [True: 242k, False: 0]
  ------------------
 4246|   242k|        buffer += '\t';
 4247|   242k|        buffer += pmol->GetTitle();
 4248|   242k|      }
 4249|       |
 4250|   242k|      if (pConv->IsOption("x") && pmol->HasData("SMILES Atom Order")) {
  ------------------
  |  Branch (4250:11): [True: 0, False: 242k]
  |  Branch (4250:35): [True: 0, False: 0]
  ------------------
 4251|      0|        vector<string> vs;
 4252|      0|        string canorder = pmol->GetData("SMILES Atom Order")->GetValue();
 4253|      0|        tokenize(vs, canorder);
 4254|      0|        buffer += '\t';
 4255|      0|        char tmp[15];
 4256|      0|        for (unsigned int i = 0; i < vs.size(); i++) {
  ------------------
  |  Branch (4256:34): [True: 0, False: 0]
  ------------------
 4257|      0|          int idx = atoi(vs[i].c_str());
 4258|      0|          OBAtom *atom = pmol->GetAtom(idx);
 4259|      0|          if (i > 0)
  ------------------
  |  Branch (4259:15): [True: 0, False: 0]
  ------------------
 4260|      0|            buffer += ',';
 4261|      0|          snprintf(tmp, 15, "%.4f", atom->GetX());
 4262|      0|          buffer += tmp;
 4263|      0|          buffer += ',';
 4264|      0|          snprintf(tmp, 15, "%.4f", atom->GetY());
 4265|      0|          buffer += tmp;
 4266|      0|        }
 4267|      0|      }
 4268|       |
 4269|   242k|      if(!pConv->IsOption("nonewline"))
  ------------------
  |  Branch (4269:10): [True: 242k, False: 0]
  ------------------
 4270|   242k|        writenewline = true;
 4271|   242k|    }
 4272|       |
 4273|   242k|    ofs << buffer;
 4274|   242k|    if (writenewline)
  ------------------
  |  Branch (4274:9): [True: 242k, False: 0]
  ------------------
 4275|   242k|      ofs << NewLine();
 4276|       |
 4277|   242k|    return true;
 4278|   242k|  }
_ZN9OpenBabel9SMIFormatC2Ev:
  119|      2|    {
  120|      2|      OBConversion::RegisterFormat("smi",this, "chemical/x-daylight-smiles");
  121|      2|      OBConversion::RegisterFormat("smiles",this, "chemical/x-daylight-smiles");
  122|      2|      OBConversion::RegisterOptionParam("n", this);
  123|      2|      OBConversion::RegisterOptionParam("t", this);
  124|      2|      OBConversion::RegisterOptionParam("r", this);
  125|      2|      OBConversion::RegisterOptionParam("a", this);
  126|      2|      OBConversion::RegisterOptionParam("h", this);
  127|      2|      OBConversion::RegisterOptionParam("x", this);
  128|      2|      OBConversion::RegisterOptionParam("C", this);	// "anti-canonical" form (random order)
  129|      2|    }
_ZN9OpenBabel12CANSMIFormatC2Ev:
  212|      2|    {
  213|      2|      OBConversion::RegisterFormat("can", this, "chemical/x-daylight-cansmiles");
  214|      2|    }
_ZN9OpenBabel12CANSMIFormat13WriteMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
  217|   242k|    {
  218|       |      //The "c" option sets us to use canonical ordering
  219|   242k|      pConv->AddOption("c",OBConversion::OUTOPTIONS);
  220|   242k|      return SMIBaseFormat::WriteMolecule(pOb, pConv);
  221|   242k|    }
_ZN9OpenBabel14OBSmilesParserC2Eb:
  318|  7.00k|    OBSmilesParser(bool preserve_aromaticity=false): _preserve_aromaticity(preserve_aromaticity), _rxnrole(1) { }
_ZN9OpenBabel14OBSmilesParserD2Ev:
  319|  7.00k|    ~OBSmilesParser() { }
_ZN9OpenBabel14OBSmilesParser15ClearStereoMapsEv:
  323|  7.00k|    {
  324|  7.00k|      for (auto& kv : _tetrahedralMap)
  ------------------
  |  Branch (324:21): [True: 4.64k, False: 7.00k]
  ------------------
  325|  4.64k|        delete kv.second;
  326|  7.00k|      _tetrahedralMap.clear();
  327|  7.00k|      for (auto& kv : _squarePlanarMap)
  ------------------
  |  Branch (327:21): [True: 0, False: 7.00k]
  ------------------
  328|      0|        delete kv.second;
  329|  7.00k|      _squarePlanarMap.clear();
  330|  7.00k|    }
smilesformat.cpp:_ZN9OpenBabelL15CanHaveLonePairEj:
   64|  17.3k|  {
   65|  17.3k|    switch (elem) {
   66|  1.57k|    case OBElements::Nitrogen:
  ------------------
  |  Branch (66:5): [True: 1.57k, False: 15.8k]
  ------------------
   67|  9.55k|    case OBElements::Sulfur:
  ------------------
  |  Branch (67:5): [True: 7.98k, False: 9.41k]
  ------------------
   68|  9.55k|      return true;
   69|  7.84k|    default:
  ------------------
  |  Branch (69:5): [True: 7.84k, False: 9.55k]
  ------------------
   70|  7.84k|      return false;
   71|  17.3k|    }
   72|  17.3k|  }
_ZN9OpenBabel12OBCanSmiNode7GetAtomEv:
 2304|  2.93M|    {
 2305|  2.93M|      return(_atom);
 2306|  2.93M|    }
smilesformat.cpp:_ZN9OpenBabelL15NeedsBondSymbolEPNS_6OBBondE:
 3109|   788k|  {
 3110|   788k|    if (bond->IsAromatic())
  ------------------
  |  Branch (3110:9): [True: 1.00k, False: 787k]
  ------------------
 3111|  1.00k|      return false;
 3112|   787k|    switch (bond->GetBondOrder()) {
 3113|   702k|    case 1:
  ------------------
  |  Branch (3113:5): [True: 702k, False: 85.1k]
  ------------------
 3114|   702k|      if (bond->IsInRing() && bond->GetBeginAtom()->IsAromatic() && bond->GetEndAtom()->IsAromatic())
  ------------------
  |  Branch (3114:11): [True: 275k, False: 426k]
  |  Branch (3114:31): [True: 91, False: 275k]
  |  Branch (3114:69): [True: 30, False: 61]
  ------------------
 3115|     30|        return true;
 3116|   702k|      return false;
 3117|  85.1k|    default: // bond orders != 1
  ------------------
  |  Branch (3117:5): [True: 85.1k, False: 702k]
  ------------------
 3118|  85.1k|      return true;
 3119|   787k|    }
 3120|   787k|  }
_ZN9OpenBabel12OBCanSmiNode9SetParentEPNS_6OBAtomE:
 2297|   353k|    {
 2298|   353k|      _parent = a;
 2299|   353k|    }
_ZN9OpenBabel12OBCanSmiNode9GetParentEv:
 2309|  31.4k|    {
 2310|  31.4k|      return(_parent);
 2311|  31.4k|    }
_ZN9OpenBabel12OBCanSmiNode4SizeEv:
 2292|  1.68M|    {
 2293|  1.68M|      return(_child_nodes.empty() ? 0 : _child_nodes.size());
  ------------------
  |  Branch (2293:14): [True: 261k, False: 1.42M]
  ------------------
 2294|  1.68M|    }
_ZN9OpenBabel12OBCanSmiNode12GetChildAtomEi:
 2314|  17.7k|    {
 2315|  17.7k|      return(_child_nodes[i]->GetAtom());
 2316|  17.7k|    }
_ZN9OpenBabel12OBCanSmiNode12GetChildBondEi:
 2319|   353k|    {
 2320|   353k|      return(_child_bonds[i]);
 2321|   353k|    }
_ZN9OpenBabel12OBCanSmiNode12GetChildNodeEi:
 2324|   353k|    {
 2325|   353k|      return(_child_nodes[i]);
 2326|   353k|    }
_ZN9OpenBabel10OutOptionsC2EbbbbbPKc:
 2361|   242k|      isomeric(_isomeric), kekulesmi(_kekulesmi), showatomclass(_showatomclass), showexplicitH(_showexplicitH),
 2362|   242k|      smarts(_smarts),
 2363|   242k|      ordering(_ordering)
 2364|   242k|      {}
_ZN9OpenBabel12OBMol2CansmiC2ERNS_10OutOptionsE:
 2392|   242k|    OBMol2Cansmi(OutOptions &_options): options(_options)
 2393|   242k|    {
 2394|   242k|    }
_ZN9OpenBabel12OBMol2CansmiD2Ev:
 2396|   242k|    {
 2397|   242k|      delete _stereoFacade;
 2398|   242k|    }
smilesformat.cpp:_ZN9OpenBabelL7NewLineEv:
 4173|   242k|  {
 4174|       |#ifdef _WIN32
 4175|       |    return "\r\n";
 4176|       |#else
 4177|   242k|    return "\n";
 4178|   242k|#endif
 4179|   242k|  }
_ZN9OpenBabel9FIXFormatC2Ev:
 4286|      2|    {
 4287|      2|      OBConversion::RegisterFormat("fix",this);
 4288|      2|    }
_ZN9OpenBabel9FIXFormat5FlagsEv:
 4303|      2|    {
 4304|      2|      return NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
 4305|      2|    }

smilesformat.cpp:_ZL13SmilesValencejjb:
   43|   999k|{
   44|   999k|  switch (elem) {
  ------------------
  |  Branch (44:11): [True: 996k, False: 2.23k]
  ------------------
   45|  60.1k|  case  5: // B
  ------------------
  |  Branch (45:3): [True: 60.1k, False: 939k]
  ------------------
   46|  60.1k|    if (val <= 3) return 3;
  ------------------
  |  Branch (46:9): [True: 48.7k, False: 11.4k]
  ------------------
   47|  11.4k|    break;
   48|   309k|  case  6: // C
  ------------------
  |  Branch (48:3): [True: 309k, False: 689k]
  ------------------
   49|   309k|    if (val <= 4) return 4;
  ------------------
  |  Branch (49:9): [True: 303k, False: 6.25k]
  ------------------
   50|  6.25k|    break;
   51|   246k|  case  7: // N
  ------------------
  |  Branch (51:3): [True: 246k, False: 753k]
  ------------------
   52|   320k|  case 15: // P
  ------------------
  |  Branch (52:3): [True: 74.3k, False: 924k]
  ------------------
   53|   320k|    switch (val) {
  ------------------
  |  Branch (53:13): [True: 320k, False: 384]
  ------------------
   54|  17.0k|    case 0:
  ------------------
  |  Branch (54:5): [True: 17.0k, False: 303k]
  ------------------
   55|  26.3k|    case 1:
  ------------------
  |  Branch (55:5): [True: 9.25k, False: 311k]
  ------------------
   56|   244k|    case 2:
  ------------------
  |  Branch (56:5): [True: 218k, False: 102k]
  ------------------
   57|   296k|    case 3:
  ------------------
  |  Branch (57:5): [True: 51.6k, False: 268k]
  ------------------
   58|   296k|      return 3;
   59|  13.5k|    case 4:
  ------------------
  |  Branch (59:5): [True: 13.5k, False: 306k]
  ------------------
   60|  23.9k|    case 5:
  ------------------
  |  Branch (60:5): [True: 10.3k, False: 310k]
  ------------------
   61|  23.9k|      return 5;
   62|   320k|    }
   63|    384|    break;
   64|  22.6k|  case  8: // O
  ------------------
  |  Branch (64:3): [True: 22.6k, False: 976k]
  ------------------
   65|  22.6k|    if (val <= 2) return 2;
  ------------------
  |  Branch (65:9): [True: 16.7k, False: 5.91k]
  ------------------
   66|  5.91k|    break;
   67|  44.4k|  case 16:  // S
  ------------------
  |  Branch (67:3): [True: 44.4k, False: 954k]
  ------------------
   68|  44.4k|    switch (val) {
  ------------------
  |  Branch (68:13): [True: 43.5k, False: 975]
  ------------------
   69|  11.0k|    case 0:
  ------------------
  |  Branch (69:5): [True: 11.0k, False: 33.3k]
  ------------------
   70|  13.6k|    case 1:
  ------------------
  |  Branch (70:5): [True: 2.56k, False: 41.9k]
  ------------------
   71|  23.2k|    case 2:
  ------------------
  |  Branch (71:5): [True: 9.62k, False: 34.8k]
  ------------------
   72|  23.2k|      return 2;
   73|  10.1k|    case 3:
  ------------------
  |  Branch (73:5): [True: 10.1k, False: 34.3k]
  ------------------
   74|  18.4k|    case 4:
  ------------------
  |  Branch (74:5): [True: 8.28k, False: 36.2k]
  ------------------
   75|  18.4k|      return 4;
   76|  1.55k|    case 5:
  ------------------
  |  Branch (76:5): [True: 1.55k, False: 42.9k]
  ------------------
   77|  1.81k|    case 6:
  ------------------
  |  Branch (77:5): [True: 255, False: 44.2k]
  ------------------
   78|  1.81k|      return 6;
   79|  44.4k|    }
   80|    975|    break;
   81|   143k|  case  9:  // F
  ------------------
  |  Branch (81:3): [True: 143k, False: 855k]
  ------------------
   82|   144k|  case 17:  // Cl
  ------------------
  |  Branch (82:3): [True: 935, False: 998k]
  ------------------
   83|   144k|  case 35:  // Br
  ------------------
  |  Branch (83:3): [True: 555, False: 998k]
  ------------------
   84|   239k|  case 53:  // I
  ------------------
  |  Branch (84:3): [True: 95.0k, False: 904k]
  ------------------
   85|   239k|    if (val <= 1) return 1;
  ------------------
  |  Branch (85:9): [True: 5.08k, False: 234k]
  ------------------
   86|   234k|    break;
   87|   999k|  }
   88|   262k|  return reading ? val : 0;
  ------------------
  |  Branch (88:10): [True: 140k, False: 121k]
  ------------------
   89|   999k|}
smilesformat.cpp:_ZL22IsOutsideOrganicSubsetj:
   20|   596k|{
   21|   596k|  switch (elem) {
   22|  53.0k|  case  0: // *
  ------------------
  |  Branch (22:3): [True: 53.0k, False: 543k]
  ------------------
   23|  76.7k|  case  5: // B
  ------------------
  |  Branch (23:3): [True: 23.7k, False: 572k]
  ------------------
   24|   215k|  case  6: // C
  ------------------
  |  Branch (24:3): [True: 139k, False: 457k]
  ------------------
   25|   306k|  case  7: // N
  ------------------
  |  Branch (25:3): [True: 90.6k, False: 505k]
  ------------------
   26|   352k|  case 15: // P
  ------------------
  |  Branch (26:3): [True: 46.0k, False: 550k]
  ------------------
   27|   363k|  case  8: // O
  ------------------
  |  Branch (27:3): [True: 10.9k, False: 585k]
  ------------------
   28|   388k|  case 16: // S
  ------------------
  |  Branch (28:3): [True: 25.1k, False: 571k]
  ------------------
   29|   458k|  case  9: // F
  ------------------
  |  Branch (29:3): [True: 70.1k, False: 526k]
  ------------------
   30|   459k|  case 17: // Cl
  ------------------
  |  Branch (30:3): [True: 770, False: 595k]
  ------------------
   31|   460k|  case 35: // Br
  ------------------
  |  Branch (31:3): [True: 485, False: 595k]
  ------------------
   32|   506k|  case 53: // I
  ------------------
  |  Branch (32:3): [True: 45.9k, False: 550k]
  ------------------
   33|   506k|    return false;
   34|  90.2k|  default:
  ------------------
  |  Branch (34:3): [True: 90.2k, False: 506k]
  ------------------
   35|  90.2k|    return true;
   36|   596k|  }
   37|   596k|}

_ZN9OpenBabel9STLFormatC2Ev:
  110|      2|      {
  111|      2|        OpenBabel::OBConversion::RegisterFormat( "stl", this );
  112|       |        /*
  113|       |        OBConversion::RegisterOptionParam("p", this, 1, OBConversion::OUTOPTIONS);
  114|       |        OBConversion::RegisterOptionParam("s", this, 1, OBConversion::OUTOPTIONS);
  115|       |        OBConversion::RegisterOptionParam("c", this, 1, OBConversion::OUTOPTIONS);
  116|       |        */
  117|      2|        OBConversion::RegisterOptionParam("bond-size", this, 1, OBConversion::GENOPTIONS);
  118|      2|        OBConversion::RegisterOptionParam("bond-radius", this, 1, OBConversion::GENOPTIONS);
  119|      2|        OBConversion::RegisterOptionParam("colour-order-rgb", this, 0, OBConversion::GENOPTIONS);
  120|      2|      }
_ZN9OpenBabel9STLFormat5FlagsEv:
  149|      2|      {
  150|      2|        return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
                      return WRITEONEONLY | NOTREADABLE;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
  151|      2|      }

_ZN9OpenBabel9SVGFormatC2Ev:
   32|      2|  SVGFormat() : _ncols(0), _nrows(0), _nmax(0)
   33|      2|  {
   34|      2|    OBConversion::RegisterFormat("svg",this);
   35|      2|    OBConversion::RegisterOptionParam("N", this, 1, OBConversion::OUTOPTIONS);
   36|      2|    OBConversion::RegisterOptionParam("rows", this, 1, OBConversion::GENOPTIONS);
   37|      2|    OBConversion::RegisterOptionParam("cols", this, 1, OBConversion::GENOPTIONS);
   38|      2|    OBConversion::RegisterOptionParam("px", this, 1, OBConversion::GENOPTIONS);
   39|      2| }
_ZN9OpenBabel9SVGFormat5FlagsEv:
  157|      2|  {
  158|      2|      return NOTREADABLE | ZEROATOMSOK | DEPICTION2D;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | ZEROATOMSOK | DEPICTION2D;
  ------------------
  |  |   34|      2|#define ZEROATOMSOK     0x08
  ------------------
                    return NOTREADABLE | ZEROATOMSOK | DEPICTION2D;
  ------------------
  |  |   39|      2|#define DEPICTION2D     0x100
  ------------------
  159|      2|  }

_ZN9OpenBabel10TextFormatC2Ev:
   25|      2|  {
   26|      2|    OBConversion::RegisterFormat("text",this);
   27|      2|  }

_ZN9OpenBabel12ThermoFormatC2Ev:
   38|      2|  {
   39|      2|      OBConversion::RegisterFormat("therm",this);
   40|      2|      OBConversion::RegisterFormat("tdd",this);
   41|      2|  }

_ZN9OpenBabel12TinkerFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("txyz",this);
   40|      2|    }
_ZN9OpenBabel12TinkerFormat5FlagsEv:
   65|      2|    {
   66|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   67|      2|    }

_ZN9OpenBabel11TitleFormatC2Ev:
   29|      2|  {
   30|      2|      OBConversion::RegisterFormat("txt",this);
   31|      2|  }
_ZN9OpenBabel11TitleFormat5FlagsEv:
   39|      2|  unsigned int Flags() override { return ZEROATOMSOK; }
  ------------------
  |  |   34|      2|#define ZEROATOMSOK     0x08
  ------------------

_ZN9OpenBabel15TurbomoleFormatC2Ev:
   38|      2|    {
   39|      2|      OBConversion::RegisterFormat("tmol",this);
   40|      2|      OBConversion::RegisterOptionParam("a", this, OBConversion::INOPTIONS);
   41|      2|    }
_ZN9OpenBabel15TurbomoleFormat5FlagsEv:
   62|      2|    {
   63|      2|        return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   64|      2|    }

_ZN9OpenBabel13UniChemFormatC2Ev:
   33|      2|    {
   34|      2|        OBConversion::RegisterFormat("unixyz",this);
   35|      2|    }
_ZN9OpenBabel13UniChemFormat5FlagsEv:
   52|      2|    {
   53|      2|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   54|      2|    }

_ZN9OpenBabel10VASPFormatC2Ev:
   65|      2|    {
   66|       |      // This will actually read the CONTCAR file:
   67|      2|      OBConversion::RegisterFormat("CONTCAR",this);
   68|      2|      OBConversion::RegisterFormat("POSCAR",this);
   69|      2|      OBConversion::RegisterFormat("VASP",this);
   70|      2|      OBConversion::RegisterOptionParam("s", this, 0, OBConversion::INOPTIONS);
   71|      2|      OBConversion::RegisterOptionParam("b", this, 0, OBConversion::INOPTIONS);
   72|      2|      OBConversion::RegisterOptionParam("w", this, 0, OBConversion::OUTOPTIONS);
   73|      2|      OBConversion::RegisterOptionParam("z", this, 0, OBConversion::OUTOPTIONS);
   74|      2|      OBConversion::RegisterOptionParam("4", this, 0, OBConversion::OUTOPTIONS);
   75|      2|    }
_ZN9OpenBabel10VASPFormat5FlagsEv:
  122|      6|    {
  123|      6|      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      6|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      6|#define WRITEONEONLY    0x20
  ------------------
  124|      6|    }

_ZN9OpenBabel13ViewMolFormatC2Ev:
   32|      2|  {
   33|      2|    OBConversion::RegisterFormat("vmol",this);
   34|      2|  }
_ZN9OpenBabel13ViewMolFormat5FlagsEv:
   51|      2|    {
   52|      2|        return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                      return READONEONLY | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   53|      2|    }

_ZN9OpenBabel9XEDFormatC2Ev:
   35|      2|    {
   36|      2|        OBConversion::RegisterFormat("xed",this);
   37|      2|    }
_ZN9OpenBabel9XEDFormat5FlagsEv:
   52|      2|    {
   53|      2|        return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   54|      2|    }

_ZN9OpenBabel9XSFFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("xsf",this);
   37|       |      // animation variant
   38|      2|      OBConversion::RegisterFormat("axsf",this);
   39|      2|    }
_ZN9OpenBabel9XSFFormat5FlagsEv:
   57|      4|    {
   58|      4|      return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   32|      4|#define READONEONLY     0x02
  ------------------
                    return READONEONLY | NOTWRITABLE;
  ------------------
  |  |   35|      4|#define NOTWRITABLE     0x10
  ------------------
   59|      4|    }

_ZN9OpenBabel9XYZFormat12ReadMoleculeEPNS_6OBBaseEPNS_12OBConversionE:
  108|    115|  {
  109|    115|    OBMol* pmol = pOb->CastAndClear<OBMol>();
  110|    115|    if (pmol == nullptr)
  ------------------
  |  Branch (110:9): [True: 0, False: 115]
  ------------------
  111|      0|      return false;
  112|       |
  113|       |    //Define some references so we can use the old parameter names
  114|    115|    istream &ifs = *pConv->GetInStream();
  115|    115|    OBMol &mol = *pmol;
  116|    115|    const char* title = pConv->GetTitle();
  117|    115|    char buffer[BUFF_SIZE];
  118|       |
  119|    115|    stringstream errorMsg;
  120|       |
  121|    115|    unsigned int natoms = 0;	// [ejk] assumed natoms could not be -ve
  122|       |
  123|    115|    if (!ifs)
  ------------------
  |  Branch (123:9): [True: 0, False: 115]
  ------------------
  124|      0|      return false; // we're attempting to read past the end of the file
  125|       |
  126|    115|    if (!ifs.getline(buffer,BUFF_SIZE))
  ------------------
  |  |  771|    115|#define BUFF_SIZE 32768
  ------------------
  |  Branch (126:9): [True: 1, False: 114]
  ------------------
  127|      1|      {
  128|      1|        obErrorLog.ThrowError(__FUNCTION__,
  129|      1|                              "Problems reading an XYZ file: Cannot read the first line.", obWarning);
  130|      1|        return(false);
  131|      1|      }
  132|       |
  133|    114|    if (sscanf(buffer, "%u", &natoms) == 0 || !natoms || natoms >= 100000000)
  ------------------
  |  Branch (133:9): [True: 1, False: 113]
  |  Branch (133:47): [True: 2, False: 111]
  |  Branch (133:58): [True: 10, False: 101]
  ------------------
  134|     13|      {
  135|     13|        obErrorLog.ThrowError(__FUNCTION__,
  136|     13|                              "Problems reading an XYZ file: The first line must contain the number of atoms.", obWarning);
  137|     13|        return(false);
  138|     13|      }
  139|       |
  140|    101|    mol.ReserveAtoms(natoms);
  141|       |
  142|       |    // The next line contains a title string for the molecule. Use this
  143|       |    // as the title for the molecule if the line is not
  144|       |    // empty. Otherwise, use the title given by the calling function.
  145|    101|    if (!ifs.getline(buffer,BUFF_SIZE))
  ------------------
  |  |  771|    101|#define BUFF_SIZE 32768
  ------------------
  |  Branch (145:9): [True: 4, False: 97]
  ------------------
  146|      4|      {
  147|      4|        obErrorLog.ThrowError(__FUNCTION__,
  148|      4|                              "Problems reading an XYZ file: Could not read the second line (title/comments).", obWarning);
  149|      4|        return(false);
  150|      4|      }
  151|     97|    string readTitle(buffer);
  152|     97|    string::size_type location = readTitle.find("Energy");
  153|     97|    if (location != string::npos)
  ------------------
  |  Branch (153:9): [True: 6, False: 91]
  ------------------
  154|      6|      readTitle.erase(location);
  155|     97|    Trim(readTitle);
  156|       |
  157|     97|    location = readTitle.find_first_not_of(" \t\n\r");
  158|     97|    if (location != string::npos)
  ------------------
  |  Branch (158:9): [True: 95, False: 2]
  ------------------
  159|     95|      mol.SetTitle(readTitle);
  160|      2|    else
  161|      2|      mol.SetTitle(title);
  162|       |
  163|     97|    mol.BeginModify();
  164|       |
  165|       |    // The next lines contain four items each, separated by white
  166|       |    // spaces: the atom type, and the coordinates of the atom
  167|     97|    vector<string> vs;
  168|    337|    for (unsigned int i = 1; i <= natoms; i ++)
  ------------------
  |  Branch (168:30): [True: 304, False: 33]
  ------------------
  169|    304|      {
  170|    304|        if (!ifs.getline(buffer,BUFF_SIZE))
  ------------------
  |  |  771|    304|#define BUFF_SIZE 32768
  ------------------
  |  Branch (170:13): [True: 28, False: 276]
  ------------------
  171|     28|          {
  172|     28|            errorMsg << "Problems reading an XYZ file: "
  173|     28|                     << "Could not read line #" << i+2 << ", file error." << endl
  174|     28|                     << " According to line one, there should be " << natoms
  175|     28|                     << " atoms, and therefore " << natoms+2 << " lines in the file.";
  176|       |
  177|     28|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  178|     28|            return(false);
  179|     28|          }
  180|    276|        tokenize(vs,buffer);
  181|    276|        if (vs.size() < 4) // ignore extra columns which some applications add
  ------------------
  |  Branch (181:13): [True: 26, False: 250]
  ------------------
  182|     26|          {
  183|     26|            errorMsg << "Problems reading an XYZ file: "
  184|     26|                     << "Could not read line #" << i+2 << "." << endl
  185|     26|                     << "OpenBabel found the line '" << buffer << "'" << endl
  186|     26|                     << "According to the specifications, this line should contain exactly 4 entries, separated by white space." << endl
  187|     26|                     << "However, OpenBabel found " << vs.size() << " items.";
  188|       |
  189|     26|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  190|     26|            return(false);
  191|     26|          }
  192|       |
  193|       |        // Atom Type: get the atomic number from the element table, using
  194|       |        // the first entry in the currently read line. If the entry makes
  195|       |        // sense, set the atomic number and leave the atomic type open
  196|       |        // (the type is then later faulted in when atom->GetType() is
  197|       |        // called). If the entry does not make sense to use, set the atom
  198|       |        // type manually, assuming that the author of the xyz-file had
  199|       |        // something "special" in mind.
  200|    250|        OBAtom *atom  = mol.NewAtom();
  201|       |
  202|    250|        int atomicNum = OBElements::GetAtomicNum(vs[0].c_str());
  203|       |        //set atomic number, or '0' if the atom type is not recognized
  204|    250|        if (atomicNum == 0) {
  ------------------
  |  Branch (204:13): [True: 247, False: 3]
  ------------------
  205|       |          // Sometimes people call this an XYZ file, but it's actually Unichem
  206|       |          // i.e., the first column is the atomic number, not a symbol
  207|       |          // so we'll first check if we can convert this to an element number
  208|    247|          atomicNum = atoi(vs[0].c_str());
  209|    247|        }
  210|       |
  211|    250|        atom->SetAtomicNum(atomicNum);
  212|    250|        if (atomicNum == 0) // still strange, try using an atom type
  ------------------
  |  Branch (212:13): [True: 122, False: 128]
  ------------------
  213|    122|          atom->SetType(vs[0]);
  214|       |
  215|       |        // Read the atom coordinates
  216|    250|        char *endptr;
  217|    250|        double x = strtod((char*)vs[1].c_str(),&endptr);
  218|    250|        if (endptr == (char*)vs[1].c_str())
  ------------------
  |  Branch (218:13): [True: 3, False: 247]
  ------------------
  219|      3|          {
  220|      3|            errorMsg << "Problems reading an XYZ file: "
  221|      3|                     << "Could not read line #" << i+2 << "." << endl
  222|      3|                     << "OpenBabel found the line '" << buffer << "'" << endl
  223|      3|                     << "According to the specifications, this line should contain exactly 4 entries, separated by white space." << endl
  224|      3|                     << "OpenBabel could not interpret item #1 as a number.";
  225|       |
  226|      3|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  227|      3|            return(false);
  228|      3|          }
  229|    247|        double y = strtod((char*)vs[2].c_str(),&endptr);
  230|    247|        if (endptr == (char*)vs[2].c_str())
  ------------------
  |  Branch (230:13): [True: 3, False: 244]
  ------------------
  231|      3|          {
  232|      3|            errorMsg << "Problems reading an XYZ file: "
  233|      3|                     << "Could not read line #" << i+2 << "." << endl
  234|      3|                     << "OpenBabel found the line '" << buffer << "'" << endl
  235|      3|                     << "According to the specifications, this line should contain exactly 4 entries, separated by white space." << endl
  236|      3|                     << "OpenBabel could not interpret item #2 as a number.";
  237|       |
  238|      3|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  239|      3|            return(false);
  240|      3|          }
  241|    244|        double z = strtod((char*)vs[3].c_str(),&endptr);
  242|    244|        if (endptr == (char*)vs[3].c_str())
  ------------------
  |  Branch (242:13): [True: 4, False: 240]
  ------------------
  243|      4|          {
  244|      4|            errorMsg << "Problems reading an XYZ file: "
  245|      4|                     << "Could not read line #" << i+2 << "." << endl
  246|      4|                     << "OpenBabel found the line '" << buffer << "'" << endl
  247|      4|                     << "According to the specifications, this line should contain exactly 4 entries, separated by white space." << endl
  248|      4|                     << "OpenBabel could not interpret item #3 as a number.";
  249|       |
  250|      4|            obErrorLog.ThrowError(__FUNCTION__, errorMsg.str() , obWarning);
  251|      4|            return(false);
  252|      4|          }
  253|    240|        atom->SetVector(x,y,z); //set coordinates
  254|       |
  255|       |        // OK, sometimes there's sym x y z charge -- accepted by Jmol
  256|    240|        if (vs.size() > 5) {
  ------------------
  |  Branch (256:13): [True: 78, False: 162]
  ------------------
  257|     78|          string::size_type decimal = vs[4].find('.');
  258|     78|          if (decimal !=string::npos) { // period found
  ------------------
  |  Branch (258:15): [True: 8, False: 70]
  ------------------
  259|      8|            double charge = strtod((char*)vs[4].c_str(),&endptr);
  260|      8|            if (endptr != (char*)vs[4].c_str())
  ------------------
  |  Branch (260:17): [True: 7, False: 1]
  ------------------
  261|      7|              atom->SetPartialCharge(charge);
  262|      8|          }
  263|     78|        } // attempt to parse charges
  264|    240|      }
  265|       |
  266|       |    // clean out any remaining blank lines
  267|     33|    std::streampos ipos;
  268|     33|    do
  269|    121|    {
  270|    121|      ipos = ifs.tellg();
  271|    121|      ifs.getline(buffer,BUFF_SIZE);
  ------------------
  |  |  771|    121|#define BUFF_SIZE 32768
  ------------------
  272|    121|    }
  273|    121|    while(strlen(buffer) == 0 && !ifs.eof() );
  ------------------
  |  Branch (273:11): [True: 90, False: 31]
  |  Branch (273:34): [True: 88, False: 2]
  ------------------
  274|     33|    ifs.seekg(ipos);
  275|       |
  276|     33|    if (!pConv->IsOption("b",OBConversion::INOPTIONS))
  ------------------
  |  Branch (276:9): [True: 33, False: 0]
  ------------------
  277|     33|      mol.ConnectTheDots();
  278|     33|    if (!pConv->IsOption("s",OBConversion::INOPTIONS) && !pConv->IsOption("b",OBConversion::INOPTIONS))
  ------------------
  |  Branch (278:9): [True: 33, False: 0]
  |  Branch (278:58): [True: 33, False: 0]
  ------------------
  279|     33|      mol.PerceiveBondOrders();
  280|       |
  281|     33|    mol.EndModify();
  282|       |
  283|     33|    return(true);
  284|     97|  }
_ZN9OpenBabel9XYZFormatC2Ev:
   35|      2|    {
   36|      2|      OBConversion::RegisterFormat("xyz", this, "chemical/x-xyz");
   37|      2|    }

_ZN9OpenBabel9YOBFormatC2Ev:
  320|      2|    {
  321|      2|        OBConversion::RegisterFormat("yob",this);
  322|      2|    }
_ZN9OpenBabel9YOBFormat5FlagsEv:
  337|      2|    {
  338|      2|        return READONEONLY|READBINARY|WRITEBINARY;
  ------------------
  |  |   32|      2|#define READONEONLY     0x02
  ------------------
                      return READONEONLY|READBINARY|WRITEBINARY;
  ------------------
  |  |   33|      2|#define READBINARY      0x04
  ------------------
                      return READONEONLY|READBINARY|WRITEBINARY;
  ------------------
  |  |   37|      2|#define WRITEBINARY     0x40
  ------------------
  339|      2|    }

_ZN9OpenBabel11ZINDOFormatC2Ev:
   33|      2|    {
   34|      2|      OBConversion::RegisterFormat("zin",this);
   35|      2|    }
_ZN9OpenBabel11ZINDOFormat5FlagsEv:
   52|      2|    {
   53|      2|      return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   31|      2|#define NOTREADABLE     0x01
  ------------------
                    return NOTREADABLE | WRITEONEONLY;
  ------------------
  |  |   36|      2|#define WRITEONEONLY    0x20
  ------------------
   54|      2|    }

_ZN9OpenBabel13OBGenericDataC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEjNS_10DataOriginE:
  168|  1.38M|    _attr(attr), _type(type), _source(source)
  169|  1.38M|  { }
_ZN9OpenBabel13OBCommentDataC2Ev:
  196|    327|    OBGenericData("Comment", OBGenericDataType::CommentData)
  197|    327|  { }
_ZN9OpenBabel13OBCommentDataC2ERKS0_:
  200|    223|    OBGenericData(src), _data(src._data)
  201|    223|  {  }
_ZN9OpenBabel14OBExternalBondC2EPNS_6OBAtomEPNS_6OBBondEi:
  207|     77|    _idx(idx), _atom(atom), _bond(bond)
  208|     77|  {  }
_ZN9OpenBabel14OBExternalBondC2ERKS0_:
  211|    133|    _idx(src._idx), _atom(src._atom), _bond(src._bond)
  212|    133|  { }
_ZN9OpenBabel18OBExternalBondDataC2Ev:
  219|     35|    OBGenericData("ExternalBondData", OBGenericDataType::ExternalBondData,
  220|     35|                  perceived)
  221|     35|  { }
_ZN9OpenBabel18OBExternalBondData7SetDataEPNS_6OBAtomEPNS_6OBBondEi:
  224|     77|  {
  225|     77|    OBExternalBond xb(atom,bond,idx);
  226|     77|    _vexbnd.push_back(xb);
  227|     77|  }
_ZN9OpenBabel10OBPairDataC2Ev:
  234|   531k|    OBGenericData("PairData", OBGenericDataType::PairData)
  235|   531k|  { }
_ZN9OpenBabel10OBUnitCellC2Ev:
  255|     44|    OBGenericData("UnitCell", OBGenericDataType::UnitCell),
  256|     44|    _mOrtho(matrix3x3()),
  257|     44|    _mOrient(matrix3x3()),
  258|     44|    _offset(vector3()),
  259|     44|    _spaceGroupName(""), _spaceGroup(nullptr),
  260|     44|    _lattice(Undefined)
  261|     44|  {  }
_ZN9OpenBabel10OBUnitCellC2ERKS0_:
  264|     17|    OBGenericData("UnitCell", OBGenericDataType::UnitCell),
  265|     17|    _mOrtho(src._mOrtho),
  266|     17|    _mOrient(src._mOrient),
  267|     17|    _offset(src._offset),
  268|     17|    _spaceGroupName(src._spaceGroupName), _spaceGroup(src._spaceGroup),
  269|     17|    _lattice(src._lattice)
  270|     17|  {  }
_ZN9OpenBabel10OBUnitCell7SetDataEdddddd:
  291|     44|  {
  292|     44|    _mOrtho.FillOrth(alpha, beta, gamma, a, b, c);
  293|     44|    _mOrient = matrix3x3(1);
  294|     44|    _spaceGroup = nullptr;
  295|     44|    _spaceGroupName = "";
  296|     44|    _lattice = OBUnitCell::Undefined;
  297|     44|  }
_ZN9OpenBabel10OBRingDataC2Ev:
  809|   304k|    OBGenericData("RingData", OBGenericDataType::RingData)
  810|   304k|  {
  811|   304k|    _vr.clear();
  812|   304k|  }
_ZN9OpenBabel10OBRingDataD2Ev:
  836|   304k|  {
  837|   304k|    vector<OBRing*>::iterator ring;
  838|   633k|    for (ring = _vr.begin();ring != _vr.end();++ring)
  ------------------
  |  Branch (838:29): [True: 328k, False: 304k]
  ------------------
  839|   328k|      {
  840|   328k|        delete *ring;
  841|   328k|      }
  842|   304k|  }
_ZN9OpenBabel7OBAngleC2Ev:
  903|  8.94k|    _vertex(nullptr), _termini(nullptr, nullptr), _radians(0.0)
  904|  8.94k|  {  }
_ZN9OpenBabel7OBAngleC2ERKS0_:
  919|  1.68M|    _vertex(src._vertex), _termini(src._termini), _radians(src._radians)
  920|  1.68M|  {  }
_ZN9OpenBabel7OBAngle5ClearEv:
  942|   493k|  {
  943|   493k|    _vertex         = nullptr;
  944|   493k|    _termini.first  = 0;
  945|   493k|    _termini.second = 0;
  946|   493k|    _radians        = 0.0;
  947|   493k|    return;
  948|   493k|  }
_ZN9OpenBabel7OBAngle8SetAtomsEPNS_6OBAtomES2_S2_:
  955|   493k|  {
  956|   493k|    _vertex         = vertex;
  957|   493k|    _termini.first  = a;
  958|   493k|    _termini.second = b;
  959|   493k|    SortByIndex();
  960|   493k|    return;
  961|   493k|  }
_ZN9OpenBabel7OBAngle11SortByIndexEv:
  993|   493k|  {
  994|   493k|    OBAtom *tmp;
  995|       |
  996|   493k|    if(_termini.first->GetIdx() > _termini.second->GetIdx())
  ------------------
  |  Branch (996:8): [True: 52.7k, False: 440k]
  ------------------
  997|  52.7k|      {
  998|  52.7k|        tmp             = _termini.first;
  999|  52.7k|        _termini.first  = _termini.second;
 1000|  52.7k|        _termini.second = tmp;
 1001|  52.7k|      }
 1002|   493k|  }
_ZN9OpenBabel11OBAngleDataC2Ev:
 1023|  8.94k|    :	OBGenericData("AngleData", OBGenericDataType::AngleData)
 1024|  8.94k|  {  }
_ZN9OpenBabel11OBAngleDataC2ERKS0_:
 1030|  10.6k|    :	OBGenericData(src), _angles(src._angles)
 1031|  10.6k|  {  }
_ZN9OpenBabel11OBAngleData7SetDataERNS_7OBAngleE:
 1060|   493k|  {
 1061|   493k|    _angles.push_back(angle);
 1062|   493k|    return;
 1063|   493k|  }
_ZN9OpenBabel11OBAngleData14FillAngleArrayERNSt3__16vectorINS2_IjNS1_9allocatorIjEEEENS3_IS5_EEEE:
 1071|    424|  {
 1072|    424|    if(_angles.empty())
  ------------------
  |  Branch (1072:8): [True: 424, False: 0]
  ------------------
 1073|    424|      return(false);
 1074|       |
 1075|      0|    vector<OBAngle>::iterator angle;
 1076|       |
 1077|      0|    angles.clear();
 1078|      0|    angles.resize(_angles.size());
 1079|       |
 1080|      0|    unsigned int ct = 0;
 1081|       |
 1082|      0|    for( angle=_angles.begin(); angle!=_angles.end(); ++angle,ct++)
  ------------------
  |  Branch (1082:33): [True: 0, False: 0]
  ------------------
 1083|      0|      {
 1084|      0|        angles[ct].resize(3);
 1085|      0|        angles[ct][0] = angle->_vertex->GetIdx() - 1;
 1086|      0|        angles[ct][1] = angle->_termini.first->GetIdx() - 1;
 1087|      0|        angles[ct][2] = angle->_termini.second->GetIdx() - 1;
 1088|      0|      }
 1089|       |
 1090|      0|    return(true);
 1091|    424|  }
_ZN9OpenBabel9OBTorsionC2ERKS0_:
 1139|   897k|    :	_bc(src._bc), _ads(src._ads)
 1140|   897k|  {}
_ZN9OpenBabel9OBTorsion5ClearEv:
 1183|   284k|  {
 1184|   284k|    _bc.first  = 0;
 1185|   284k|    _bc.second = 0;
 1186|   284k|    _ads.erase(_ads.begin(),_ads.end());
 1187|   284k|  }
_ZN9OpenBabel9OBTorsion10AddTorsionEPNS_6OBAtomES2_S2_S2_:
 1247|  1.24M|  {
 1248|  1.24M|    if(!Empty() && (b != _bc.first || c != _bc.second))
  ------------------
  |  Branch (1248:8): [True: 979k, False: 265k]
  |  Branch (1248:21): [True: 0, False: 979k]
  |  Branch (1248:39): [True: 0, False: 979k]
  ------------------
 1249|      0|      return(false);
 1250|       |
 1251|  1.24M|    if(Empty())
  ------------------
  |  Branch (1251:8): [True: 265k, False: 979k]
  ------------------
 1252|   265k|      {
 1253|   265k|        _bc.first  = b;
 1254|   265k|        _bc.second = c;
 1255|   265k|      }
 1256|       |
 1257|  1.24M|    triple<OBAtom*,OBAtom*,double> ad(a,d,0.0);
 1258|  1.24M|    _ads.push_back(ad);
 1259|       |
 1260|  1.24M|    return(true);
 1261|  1.24M|  }
_ZN9OpenBabel13OBTorsionDataC2Ev:
 1285|  9.31k|    : OBGenericData("TorsionData", OBGenericDataType::TorsionData)
 1286|  9.31k|  {  }
_ZN9OpenBabel13OBTorsionDataC2ERKS0_:
 1292|  10.6k|    :	OBGenericData(src), _torsions(src._torsions)
 1293|  10.6k|  {  }
_ZN9OpenBabel13OBTorsionData7SetDataERNS_9OBTorsionE:
 1314|   265k|  {
 1315|   265k|    _torsions.push_back(torsion);
 1316|   265k|  }
_ZN9OpenBabel13OBTorsionData16FillTorsionArrayERNSt3__16vectorINS2_IjNS1_9allocatorIjEEEENS3_IS5_EEEE:
 1324|    424|  {
 1325|    424|    if(_torsions.empty())
  ------------------
  |  Branch (1325:8): [True: 424, False: 0]
  ------------------
 1326|    424|      return(false);
 1327|       |
 1328|      0|    vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > tmpquads,quads;
 1329|      0|    vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> >::iterator thisQuad;
 1330|      0|    vector<OBTorsion>::iterator torsion;
 1331|       |
 1332|       |    //generate set of all 4 atom abcd's from torsion structure
 1333|      0|    for (torsion = _torsions.begin();torsion != _torsions.end();++torsion)
  ------------------
  |  Branch (1333:38): [True: 0, False: 0]
  ------------------
 1334|      0|      {
 1335|      0|        tmpquads = torsion->GetTorsions();
 1336|      0|        for(thisQuad = tmpquads.begin();thisQuad != tmpquads.end();++thisQuad)
  ------------------
  |  Branch (1336:41): [True: 0, False: 0]
  ------------------
 1337|      0|          quads.push_back(*thisQuad);
 1338|      0|      }
 1339|       |
 1340|       |    //fill array of torsion atoms
 1341|       |
 1342|      0|    torsions.clear();
 1343|      0|    torsions.resize(quads.size());
 1344|       |
 1345|      0|    unsigned int ct = 0;
 1346|       |
 1347|      0|    for (thisQuad = quads.begin();thisQuad != quads.end();++thisQuad,++ct)
  ------------------
  |  Branch (1347:35): [True: 0, False: 0]
  ------------------
 1348|      0|      {
 1349|      0|        torsions[ct].resize(4);
 1350|      0|        torsions[ct][0] = thisQuad->first->GetIdx()-1;
 1351|      0|        torsions[ct][1] = thisQuad->second->GetIdx()-1;
 1352|      0|        torsions[ct][2] = thisQuad->third->GetIdx()-1;
 1353|      0|        torsions[ct][3] = thisQuad->fourth->GetIdx()-1;
 1354|      0|      }
 1355|       |
 1356|      0|    return(true);
 1357|    424|  }

_ZN9OpenBabel10OBGraphSymC2EPNS_5OBMolEPKNS_8OBBitVecE:
   98|   487k|  OBGraphSym::OBGraphSym(OBMol* pmol, const OBBitVec* frag_atoms) : d(new OBGraphSymPrivate)
   99|   487k|  {
  100|   487k|    d->_pmol = pmol;
  101|   487k|    if (frag_atoms) {
  ------------------
  |  Branch (101:9): [True: 242k, False: 244k]
  ------------------
  102|   242k|      d->_frag_atoms = *frag_atoms;
  103|   244k|    } else {
  104|   244k|      d->_frag_atoms.Resize(d->_pmol->NumAtoms());
  105|   244k|      FOR_ATOMS_OF_MOL(a, d->_pmol)
  ------------------
  |  |  417|   244k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 809k, False: 244k]
  |  |  ------------------
  ------------------
  106|   809k|        d->_frag_atoms.SetBitOn(a->GetIdx());
  107|   244k|    }
  108|   487k|  }
_ZN9OpenBabel10OBGraphSymD2Ev:
  111|   487k|  {
  112|   487k|    delete d;
  113|   487k|  }
_ZN9OpenBabel17OBGraphSymPrivate12GetHvyDegreeEPNS_6OBAtomE:
  141|  1.40M|  {
  142|  1.40M|    unsigned int count = 0;
  143|  1.40M|    OBBond *bond;
  144|  1.40M|    OBAtom *nbr;
  145|       |
  146|  1.40M|    vector<OBBond*>::iterator bi;
  147|  3.65M|    for (bond = atom->BeginBond(bi); bond; bond = atom->NextBond(bi)) {
  ------------------
  |  Branch (147:38): [True: 2.25M, False: 1.40M]
  ------------------
  148|  2.25M|      nbr = bond->GetNbrAtom(atom);
  149|  2.25M|      if (_frag_atoms.BitIsSet(nbr->GetIdx()) && nbr->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (149:11): [True: 2.04M, False: 207k]
  |  Branch (149:50): [True: 1.80M, False: 237k]
  ------------------
  150|  1.80M|        count++;
  151|  2.25M|    }
  152|       |
  153|  1.40M|    return(count);
  154|  1.40M|  }
_ZN9OpenBabel17OBGraphSymPrivate13GetHvyBondSumEPNS_6OBAtomE:
  168|  1.40M|  {
  169|  1.40M|    float count = 0.0f;
  170|  1.40M|    OBBond *bond;
  171|  1.40M|    OBAtom *nbr;
  172|       |
  173|  1.40M|    vector<OBBond*>::iterator bi;
  174|  3.65M|    for (bond = atom->BeginBond(bi); bond; bond = atom->NextBond(bi)) {
  ------------------
  |  Branch (174:38): [True: 2.25M, False: 1.40M]
  ------------------
  175|  2.25M|      nbr = bond->GetNbrAtom(atom);
  176|  2.25M|      if (_frag_atoms.BitIsSet(nbr->GetIdx()) && nbr->GetAtomicNum() != OBElements::Hydrogen) {
  ------------------
  |  Branch (176:11): [True: 2.04M, False: 207k]
  |  Branch (176:50): [True: 1.80M, False: 237k]
  ------------------
  177|  1.80M|        if (bond->IsAromatic())
  ------------------
  |  Branch (177:13): [True: 3.20k, False: 1.80M]
  ------------------
  178|  3.20k|          count += 1.6f;
  179|  1.80M|        else
  180|  1.80M|          count += (float)bond->GetBondOrder();
  181|  1.80M|      }
  182|  2.25M|    }
  183|  1.40M|    if (atom->GetAtomicNum() == 7 && atom->IsAromatic() && atom->GetTotalDegree() == 3) {
  ------------------
  |  Branch (183:9): [True: 181k, False: 1.22M]
  |  Branch (183:38): [True: 882, False: 180k]
  |  Branch (183:60): [True: 424, False: 458]
  ------------------
  184|    424|      count += 1.0f;         // [nH] - add another bond
  185|    424|    }
  186|  1.40M|    return(int(count + 0.5));     // round to nearest int
  187|  1.40M|  }
_ZN9OpenBabel17OBGraphSymPrivate12GetGTDVectorERNSt3__16vectorIiNS1_9allocatorIiEEEE:
  204|   487k|  {
  205|   487k|    gtd.clear();
  206|   487k|    gtd.resize(_pmol->NumAtoms());
  207|       |
  208|   487k|    int gtdcount, natom;
  209|   487k|    OBBitVec used, curr, next;
  210|   487k|    OBAtom *atom, *atom1;
  211|   487k|    OBBond *bond;
  212|   487k|    vector<OBNodeBase*>::iterator ai;
  213|   487k|    vector<OBBond*>::iterator j;
  214|       |
  215|   487k|    next.Clear();
  216|       |
  217|  2.10M|    for (atom = _pmol->BeginAtom(ai); atom; atom = _pmol->NextAtom(ai)) {
  ------------------
  |  Branch (217:39): [True: 1.61M, False: 487k]
  ------------------
  218|       |
  219|  1.61M|      int idx = atom->GetIdx();
  220|  1.61M|      if (!_frag_atoms.BitIsSet(idx)) {     // Not in this fragment?
  ------------------
  |  Branch (220:11): [True: 207k, False: 1.40M]
  ------------------
  221|   207k|        gtd[idx-1] = OBGraphSym::NoSymmetryClass;
  222|   207k|        continue;
  223|   207k|      }
  224|       |
  225|  1.40M|      gtdcount = 0;
  226|  1.40M|      used.Clear();curr.Clear();
  227|  1.40M|      used.SetBitOn(idx);
  228|  1.40M|      curr.SetBitOn(idx);
  229|       |
  230|  93.4M|      while (!curr.IsEmpty()) {
  ------------------
  |  Branch (230:14): [True: 92.0M, False: 1.40M]
  ------------------
  231|  92.0M|        next.Clear();
  232|   325M|        for (natom = curr.NextBit(-1);natom != curr.EndBit();natom = curr.NextBit(natom)) {
  ------------------
  |  Branch (232:39): [True: 233M, False: 92.0M]
  ------------------
  233|   233M|          atom1 = _pmol->GetAtom(natom);
  234|   233M|          if (!_frag_atoms.BitIsSet(atom1->GetIdx()))
  ------------------
  |  Branch (234:15): [True: 0, False: 233M]
  ------------------
  235|      0|            continue;
  236|   884M|          for (bond = atom1->BeginBond(j);bond;bond = atom1->NextBond(j)) {
  ------------------
  |  Branch (236:43): [True: 650M, False: 233M]
  ------------------
  237|   650M|            int nbr_idx = bond->GetNbrAtomIdx(atom1);
  238|   650M|            if (   _frag_atoms.BitIsSet(nbr_idx)
  ------------------
  |  Branch (238:20): [True: 603M, False: 47.6M]
  ------------------
  239|   603M|                && !used.BitIsSet(nbr_idx)
  ------------------
  |  Branch (239:20): [True: 355M, False: 247M]
  ------------------
  240|   355M|                && !curr.BitIsSet(nbr_idx)
  ------------------
  |  Branch (240:20): [True: 355M, False: 0]
  ------------------
  241|   355M|                && bond->GetNbrAtom(atom1)->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (241:20): [True: 240M, False: 114M]
  ------------------
  242|   240M|              next.SetBitOn(nbr_idx);
  243|   650M|          }
  244|   233M|        }
  245|  92.0M|        used |= next;
  246|  92.0M|        curr = next;
  247|  92.0M|        gtdcount++;
  248|  92.0M|      }
  249|  1.40M|      gtd[idx-1] = gtdcount;
  250|  1.40M|    }
  251|       |
  252|   487k|    return(true);
  253|   487k|  }
_ZN9OpenBabel17OBGraphSymPrivate13FindRingAtomsERNS_8OBBitVecE:
  264|   487k|  {
  265|   487k|    vector<OBRing*> sssRings;
  266|   487k|    vector<OBRing*>::iterator ri;
  267|       |
  268|   487k|    ring_atoms.Resize(_pmol->NumAtoms());
  269|   487k|    ring_atoms.Clear();
  270|       |
  271|   487k|    sssRings = _pmol->GetSSSR();
  272|   594k|    for (ri = sssRings.begin(); ri != sssRings.end(); ++ri) {
  ------------------
  |  Branch (272:33): [True: 107k, False: 487k]
  ------------------
  273|   107k|      OBRing *ring = *ri;
  274|   107k|      OBBitVec bvtmp = _frag_atoms & ring->_pathset;      // intersection: fragment and ring
  275|   107k|      if (bvtmp == ring->_pathset)                        // all ring atoms in fragment?
  ------------------
  |  Branch (275:11): [True: 107k, False: 0]
  ------------------
  276|   107k|        ring_atoms |= ring->_pathset;                     //   yes - add this ring's atoms
  277|   107k|    }
  278|   487k|  }
_ZN9OpenBabel17OBGraphSymPrivate11GetGIVectorERNSt3__16vectorIjNS1_9allocatorIjEEEE:
  295|   487k|  {
  296|       |    // Prepare the vector...
  297|   487k|    vid.clear();
  298|   487k|    vid.resize(_pmol->NumAtoms());
  299|       |
  300|       |    // The "graph theoretical distance" for each atom (see comments in the function)
  301|   487k|    vector<int> v;
  302|   487k|    GetGTDVector(v);
  303|       |
  304|       |    // Compute the ring atoms for this particular fragment (set of atoms)
  305|   487k|    OBBitVec ring_atoms;
  306|   487k|    FindRingAtoms(ring_atoms);
  307|       |
  308|   487k|    int i;
  309|   487k|    OBAtom *atom;
  310|   487k|    vector<OBNodeBase*>::iterator ai;
  311|  2.10M|    for (i=0, atom = _pmol->BeginAtom(ai); atom; atom = _pmol->NextAtom(ai)) {
  ------------------
  |  Branch (311:44): [True: 1.61M, False: 487k]
  ------------------
  312|       |      //    vid[i] = 0;
  313|  1.61M|      vid[i] = OBGraphSym::NoSymmetryClass;
  314|  1.61M|      if (_frag_atoms.BitIsSet(atom->GetIdx())) {
  ------------------
  |  Branch (314:11): [True: 1.40M, False: 207k]
  ------------------
  315|       |        // Mask each field to its bit width so a pathological input (e.g.
  316|       |        // formal charge outside -7..+8, or Z > 127) cannot bleed into the
  317|       |        // next field or trigger UB from a left shift overflowing int.
  318|  1.40M|        unsigned int dist    = static_cast<unsigned int>(v[i]) & 0x3FFu;       // 10 bits
  319|  1.40M|        unsigned int hvyDeg  = GetHvyDegree(atom)              & 0xFu;        //  4 bits
  320|  1.40M|        unsigned int aro     = atom->IsAromatic() ? 1u : 0u;                  //  1 bit
  ------------------
  |  Branch (320:32): [True: 1.56k, False: 1.40M]
  ------------------
  321|  1.40M|        unsigned int ring    = ring_atoms.BitIsSet(atom->GetIdx()) ? 1u : 0u; //  1 bit
  ------------------
  |  Branch (321:32): [True: 363k, False: 1.04M]
  ------------------
  322|  1.40M|        unsigned int z       = atom->GetAtomicNum()            & 0x7Fu;       //  7 bits
  323|  1.40M|        unsigned int hvyBond = GetHvyBondSum(atom)             & 0xFu;        //  4 bits
  324|  1.40M|        unsigned int charge  = static_cast<unsigned int>(7 + atom->GetFormalCharge()) & 0xFu; // 4 bits
  325|  1.40M|        vid[i] = dist
  326|  1.40M|               | (hvyDeg  << 10)
  327|  1.40M|               | (aro     << 14)
  328|  1.40M|               | (ring    << 15)
  329|  1.40M|               | (z       << 16)
  330|  1.40M|               | (hvyBond << 23)
  331|  1.40M|               | (charge  << 27);
  332|  1.40M|      }
  333|  1.61M|      i++;
  334|  1.61M|    }
  335|   487k|  }
_ZN9OpenBabel17OBGraphSymPrivate20CreateNewClassVectorERNSt3__16vectorINS1_4pairIPNS_6OBAtomEjEENS1_9allocatorIS6_EEEESA_:
  356|   681k|  {
  357|   681k|    unsigned int m,id;
  358|   681k|    OBAtom *atom, *nbr;
  359|   681k|    vector<OBBond*>::iterator nbr_iter;
  360|   681k|    vector<unsigned int>::iterator k;
  361|   681k|    vector<pair<OBAtom*,unsigned int> >::iterator vp_iter;
  362|       |
  363|       |#if DEBUG2
  364|       |    cout << "CreateNewClassVector: START\n";
  365|       |    //print_vector_pairs("    ", vp1);
  366|       |#endif
  367|       |
  368|       |    // There may be fewer atoms than in the whole molecule, so we can't
  369|       |    // index the vp1 array by atom->GetIdx().  Instead, create a quick
  370|       |    // mapping vector of idx-to-index for vp1.
  371|   681k|    vector<int> idx2index(_pmol->NumAtoms() + 1, -1);  // natoms + 1
  372|   681k|    int index = 0;
  373|  31.9M|    for (vp_iter = vp1.begin(); vp_iter != vp1.end(); ++vp_iter) {
  ------------------
  |  Branch (373:33): [True: 31.3M, False: 681k]
  ------------------
  374|  31.3M|      int idx = vp_iter->first->GetIdx();
  375|  31.3M|      idx2index[idx] = index++;
  376|  31.3M|    }
  377|       |
  378|       |    // vp2 will hold the newly-extended symmetry classes
  379|   681k|    vp2.resize(vp1.size());
  380|   681k|    vp2.clear();
  381|       |
  382|       |    // Loop over original atoms.
  383|       |    // Create a new extended varient for each atom.  Get its neighbors' class ID's,
  384|       |    // sort them into ascending order, and create a sum of (c0 + c1*10^2 + c2*10^4 + ...)
  385|       |    // which becomes the new class ID (where c0 is the current classID).
  386|       |
  387|  31.9M|    for (vp_iter = vp1.begin(); vp_iter != vp1.end(); ++vp_iter) {
  ------------------
  |  Branch (387:33): [True: 31.3M, False: 681k]
  ------------------
  388|  31.3M|      atom = vp_iter->first;
  389|  31.3M|      id   = vp_iter->second;
  390|  31.3M|      vector<unsigned int> vtmp;
  391|  94.9M|      for (nbr = atom->BeginNbrAtom(nbr_iter); nbr; nbr = atom->NextNbrAtom(nbr_iter)) {
  ------------------
  |  Branch (391:48): [True: 63.6M, False: 31.3M]
  ------------------
  392|  63.6M|        int idx = nbr->GetIdx();
  393|  63.6M|        if (_frag_atoms.BitIsSet(idx))
  ------------------
  |  Branch (393:13): [True: 62.3M, False: 1.23M]
  ------------------
  394|  62.3M|          vtmp.push_back(vp1[idx2index[idx]].second);
  395|  63.6M|      }
  396|       |
  397|  31.3M|      sort(vtmp.begin(),vtmp.end(),CompareUnsigned);
  398|       |      // Combine this atom's class with its sorted neighbour classes as base-100
  399|       |      // "digits": id + n0*100 + n1*100^2 + ... This deliberately wraps modulo
  400|       |      // 2^32 for high-degree atoms (the base-100 packing overflows past ~4
  401|       |      // neighbours), and the wrapped value is part of the established canonical
  402|       |      // ordering, so it must be preserved bit-for-bit. Do the multiply/add in
  403|       |      // 64-bit and truncate back to 32-bit: identical result to the old
  404|       |      // uint32 overflow, but without tripping the sanitizer. Operands stay
  405|       |      // below 2^32 (neighbour classes are small renumbered ids), so the 64-bit
  406|       |      // math itself never overflows.
  407|  31.3M|      m = 100;
  408|  93.6M|      for (k = vtmp.begin(); k != vtmp.end(); ++k) {
  ------------------
  |  Branch (408:30): [True: 62.3M, False: 31.3M]
  ------------------
  409|  62.3M|        id = static_cast<unsigned int>(id + static_cast<unsigned long long>(*k) * m);
  410|  62.3M|        m  = static_cast<unsigned int>(static_cast<unsigned long long>(m) * 100);
  411|  62.3M|      }
  412|  31.3M|      vp2.push_back(pair<OBAtom*,unsigned int> (atom, id));
  413|  31.3M|    }
  414|       |#if DEBUG2
  415|       |    cout << "CreateNewClassVector: FINISH\n";
  416|       |    //print_vector_pairs("    ", vp2);
  417|       |#endif
  418|   681k|  }
_ZN9OpenBabel17OBGraphSymPrivate23CountAndRenumberClassesERNSt3__16vectorINS1_4pairIPNS_6OBAtomEjEENS1_9allocatorIS6_EEEERj:
  490|  1.16M|  {
  491|  1.16M|    count = 1;
  492|  1.16M|    vector<pair<OBAtom*,unsigned int> >::iterator k;
  493|       |
  494|  1.16M|    sort(vp.begin(), vp.end(), ComparePairSecond);
  495|  1.16M|    k = vp.begin();
  496|  1.16M|    if (k != vp.end()) {
  ------------------
  |  Branch (496:9): [True: 1.16M, False: 484]
  ------------------
  497|  1.16M|      unsigned int id = k->second;
  498|  1.16M|      if (id) {
  ------------------
  |  Branch (498:11): [True: 1.16M, False: 0]
  ------------------
  499|  1.16M|      k->second = 1;
  500|  1.16M|      ++k;
  501|  33.3M|      for (;k != vp.end(); ++k) {
  ------------------
  |  Branch (501:13): [True: 32.1M, False: 1.16M]
  ------------------
  502|  32.1M|        if (k->second != id) {
  ------------------
  |  Branch (502:13): [True: 23.8M, False: 8.36M]
  ------------------
  503|  23.8M|          id = k->second;
  504|  23.8M|          k->second = ++count;
  505|  23.8M|        } else {
  506|  8.36M|          k->second = count;
  507|  8.36M|        }
  508|  32.1M|      }
  509|  1.16M|      }
  510|  1.16M|    }
  511|  1.16M|  }
_ZN9OpenBabel17OBGraphSymPrivate16ExtendInvariantsERNSt3__16vectorINS1_4pairIPNS_6OBAtomEjEENS1_9allocatorIS6_EEEE:
  523|   487k|  {
  524|   487k|    unsigned int nclasses1, nclasses2;
  525|   487k|    vector<pair<OBAtom*,unsigned int> > tmp_classes;
  526|       |
  527|       |    // How many classes are we starting with?  (The "renumber" part isn't relevant.)
  528|   487k|    CountAndRenumberClasses(symmetry_classes, nclasses1);
  529|       |
  530|   487k|    unsigned int nfragatoms = _frag_atoms.CountBits();
  531|       |
  532|       |    // LOOP: Do extended sum-of-invarients until no further changes are
  533|       |    // noted.  (Note: This is inefficient, as it re-computes extended sums
  534|       |    // and re-sorts the entire list each time.  You can save a lot of time by
  535|       |    // only recomputing and resorting within regions where there is a tie
  536|       |    // initially.  But it's a lot more code.)
  537|       |
  538|   487k|    if (nclasses1 < nfragatoms) {
  ------------------
  |  Branch (538:9): [True: 119k, False: 368k]
  ------------------
  539|   193k|      for (int i = 0; i < 100;i++) {  //sanity check - shouldn't ever hit this number
  ------------------
  |  Branch (539:23): [True: 193k, False: 152]
  ------------------
  540|   193k|        CreateNewClassVector(symmetry_classes, tmp_classes);
  541|   193k|        CountAndRenumberClasses(tmp_classes, nclasses2);
  542|   193k|        symmetry_classes = tmp_classes;
  543|   193k|        if (nclasses1 == nclasses2) break;
  ------------------
  |  Branch (543:13): [True: 119k, False: 74.8k]
  ------------------
  544|  74.8k|        nclasses1 = nclasses2;
  545|  74.8k|      }
  546|   119k|    }
  547|       |
  548|   487k|    CreateNewClassVector(symmetry_classes, tmp_classes);
  549|   487k|    CountAndRenumberClasses(tmp_classes, nclasses2);
  550|       |
  551|       |
  552|   487k|    if (nclasses1 != nclasses2) {
  ------------------
  |  Branch (552:9): [True: 509, False: 487k]
  ------------------
  553|    509|      symmetry_classes = tmp_classes;
  554|    509|      return ExtendInvariants(symmetry_classes);
  555|    509|    }
  556|       |
  557|       |
  558|   487k|    return nclasses1;
  559|   487k|  }
_ZN9OpenBabel17OBGraphSymPrivate17CalculateSymmetryERNSt3__16vectorIjNS1_9allocatorIjEEEE:
  576|   487k|  {
  577|   487k|    vector<unsigned int> vgi;
  578|   487k|    vector<OBNodeBase*>::iterator j;
  579|   487k|    OBAtom *atom;
  580|       |
  581|       |    // Get vector of graph invariants.  These are the starting "symmetry classes".
  582|   487k|    GetGIVector(vgi);
  583|       |
  584|       |
  585|       |    // Create a vector-of-pairs, associating each atom with its Class ID.
  586|   487k|    std::vector<std::pair<OBAtom*, unsigned int> > symmetry_classes;
  587|  2.10M|    for (atom = _pmol->BeginAtom(j); atom; atom = _pmol->NextAtom(j)) {
  ------------------
  |  Branch (587:38): [True: 1.61M, False: 487k]
  ------------------
  588|  1.61M|      int idx = atom->GetIdx();
  589|  1.61M|      if (_frag_atoms.BitIsSet(idx))
  ------------------
  |  Branch (589:11): [True: 1.40M, False: 207k]
  ------------------
  590|  1.40M|        symmetry_classes.push_back(pair<OBAtom*, unsigned int> (atom, vgi[idx-1]));
  591|       |      //else
  592|       |      //  symmetry_classes.push_back(pair<OBAtom*, unsigned int> (atom, OBGraphSym::NoSymmetryClass));
  593|  1.61M|    }
  594|       |
  595|       |
  596|       |    // The heart of the matter: Do extended sum-of-invariants until no further
  597|       |    // changes are noted.
  598|   487k|    int nclasses = ExtendInvariants(symmetry_classes);
  599|       |
  600|       |    // Convert to a vector indexed by Index
  601|       |    // Atoms not in the fragment will have a value of OBGraphSym::NoSymmetryClass
  602|   487k|    atom_sym_classes.clear();
  603|   487k|    atom_sym_classes.resize(_pmol->NumAtoms(), OBGraphSym::NoSymmetryClass);
  604|  1.89M|    for (unsigned int i = 0; i < symmetry_classes.size(); ++i) {
  ------------------
  |  Branch (604:30): [True: 1.40M, False: 487k]
  ------------------
  605|  1.40M|      atom_sym_classes[symmetry_classes.at(i).first->GetIndex()] = symmetry_classes.at(i).second;
  606|  1.40M|    }
  607|       |
  608|       |    // Store the symmetry classes in an OBPairData
  609|   487k|    stringstream temp;
  610|   487k|    vector<unsigned int>::iterator sym_iter = atom_sym_classes.begin();
  611|   487k|    if (sym_iter != atom_sym_classes.end())
  ------------------
  |  Branch (611:9): [True: 487k, False: 242]
  ------------------
  612|   487k|      temp << (*sym_iter++);
  613|  1.61M|    for (; sym_iter != atom_sym_classes.end(); ++sym_iter)
  ------------------
  |  Branch (613:12): [True: 1.12M, False: 487k]
  ------------------
  614|  1.12M|      temp << " " << (*sym_iter);
  615|       |
  616|   487k|    OBPairData *symData = new OBPairData;
  617|   487k|    symData->SetAttribute("OpenBabel Symmetry Classes");
  618|   487k|    symData->SetOrigin(local); //will not show as sdf or cml property
  619|   487k|    symData->SetValue(temp.str());
  620|   487k|    _pmol->SetData(symData);
  621|       |
  622|   487k|    return nclasses;
  623|   487k|  }
_ZN9OpenBabel10OBGraphSym11GetSymmetryERNSt3__16vectorIjNS1_9allocatorIjEEEE:
  626|   487k|  {
  627|   487k|    ClearSymmetry(); // For the moment just recalculate the symmetry classes
  628|       |
  629|       |    // Check to see whether we have already calculated the symmetry classes
  630|   487k|    OBPairData *pd = dynamic_cast<OBPairData*>(d->_pmol->GetData("OpenBabel Symmetry Classes"));
  631|       |
  632|   487k|    int nclasses = 0;
  633|   487k|    if (!pd) {
  ------------------
  |  Branch (633:9): [True: 487k, False: 0]
  ------------------
  634|   487k|      nclasses = d->CalculateSymmetry(symmetry_classes);
  635|   487k|    } else {
  636|      0|      istringstream iss(pd->GetValue());
  637|      0|      symmetry_classes.clear();
  638|      0|      copy(istream_iterator<unsigned int>(iss),
  639|      0|           istream_iterator<unsigned int>(),
  640|      0|           back_inserter<vector<unsigned int> >(symmetry_classes));
  641|       |      // Now find the number of unique elements
  642|      0|      vector<unsigned int> copy_sym = symmetry_classes;
  643|      0|      sort(copy_sym.begin(), copy_sym.end());
  644|      0|      vector<unsigned int>::iterator end_pos = unique(copy_sym.begin(), copy_sym.end()); // Requires sorted elements
  645|      0|      nclasses = end_pos - copy_sym.begin();
  646|      0|    }
  647|       |
  648|   487k|    return nclasses;
  649|   487k|  }
_ZN9OpenBabel10OBGraphSym13ClearSymmetryEv:
  679|   487k|  {
  680|   487k|    d->_pmol->DeleteData("OpenBabel Symmetry Classes");
  681|   487k|  }
_ZN9OpenBabel15CompareUnsignedERKjS1_:
  121|  35.4M|  {
  122|  35.4M|    return(a<b);
  123|  35.4M|  }
_ZN9OpenBabel17ComparePairSecondERKNSt3__14pairIPNS_6OBAtomEjEES6_:
  131|   302M|  {
  132|   302M|    return(a.second < b.second);
  133|   302M|  }

_ZN9OpenBabel9Kekulizer17AssignDoubleBondsEv:
  190|  6.31k|  {
  191|  6.31k|    int bit;
  192|   108k|    for (bit = doubleBonds->FirstBit(); bit != doubleBonds->EndBit(); bit = doubleBonds->NextBit(bit)) {
  ------------------
  |  Branch (192:41): [True: 102k, False: 6.31k]
  ------------------
  193|   102k|      m_mol->GetBond(bit)->SetBondOrder(2);
  194|   102k|    }
  195|  6.31k|  }
_ZN9OpenBabel9Kekulizer11GreedyMatchEv:
  198|  6.31k|  {
  199|       |
  200|       |    // What atoms need a double bond? The job of kekulization is
  201|       |    // to give all of these atoms a single double bond.
  202|  6.31k|    needs_dbl_bond = new OBBitVec(atomArraySize); // defaults to all False
  203|   562k|    FOR_ATOMS_OF_MOL(atom, m_mol) {
  ------------------
  |  |  417|  6.31k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 562k, False: 6.31k]
  |  |  ------------------
  ------------------
  204|   562k|      if (NeedsDoubleBond(&*atom)) {
  ------------------
  |  Branch (204:11): [True: 240k, False: 321k]
  ------------------
  205|   240k|        needs_dbl_bond->SetBitOn(atom->GetIdx());
  206|   240k|      }
  207|   562k|    }
  208|       |    // Make a copy of needs_dbl_bond, to restrict the traversal in BackTrack()
  209|  6.31k|    kekule_system = new OBBitVec(*needs_dbl_bond);
  210|       |
  211|       |    // Create lookup of degrees
  212|  6.31k|    unsigned int *degrees = (unsigned int*)calloc(atomArraySize,sizeof(unsigned int));
  213|  6.31k|    std::vector<OBAtom*> degreeOneAtoms;
  214|   562k|    FOR_ATOMS_OF_MOL(atom, m_mol) {
  ------------------
  |  |  417|  6.31k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 562k, False: 6.31k]
  |  |  ------------------
  ------------------
  215|   562k|      unsigned int atom_idx = atom->GetIdx();
  216|   562k|      if (!needs_dbl_bond->BitIsSet(atom_idx)) {
  ------------------
  |  Branch (216:11): [True: 321k, False: 240k]
  ------------------
  217|   321k|        degrees[atom_idx] = 0;
  218|   321k|        continue;
  219|   321k|      }
  220|   240k|      unsigned int mdeg = 0;
  221|   505k|      FOR_BONDS_OF_ATOM(bond, &*atom) {
  ------------------
  |  |  420|   240k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 505k, False: 240k]
  |  |  ------------------
  ------------------
  222|   505k|        if (!bond->IsAromatic()) continue;
  ------------------
  |  Branch (222:13): [True: 97.6k, False: 408k]
  ------------------
  223|   408k|        OBAtom *nbr = bond->GetNbrAtom(&*atom);
  224|   408k|        if (needs_dbl_bond->BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (224:13): [True: 368k, False: 40.1k]
  ------------------
  225|   368k|          mdeg++;
  226|   408k|      }
  227|   240k|      degrees[atom_idx] = mdeg;
  228|   240k|      if (mdeg == 1)
  ------------------
  |  Branch (228:11): [True: 61.7k, False: 179k]
  ------------------
  229|  61.7k|        degreeOneAtoms.push_back(&*atom);
  230|   240k|    }
  231|       |    
  232|       |    // Location of assigned double bonds
  233|  6.31k|    doubleBonds = new OBBitVec(bondArraySize); // defaults to all False
  234|       |
  235|  6.31k|    bool finished = false;
  236|  7.79k|    while (true) { // Main loop
  ------------------
  |  Branch (236:12): [True: 7.79k, Folded]
  ------------------
  237|       |      
  238|       |      // Complete all of the degree one nodes
  239|   140k|      while (!degreeOneAtoms.empty()) {
  ------------------
  |  Branch (239:14): [True: 132k, False: 7.79k]
  ------------------
  240|   132k|        OBAtom* atom = degreeOneAtoms.back();
  241|   132k|        degreeOneAtoms.pop_back();
  242|       |        // some nodes may already have been handled
  243|   132k|        if (!needs_dbl_bond->BitIsSet(atom->GetIdx())) continue;
  ------------------
  |  Branch (243:13): [True: 24.4k, False: 108k]
  ------------------
  244|   136k|        FOR_BONDS_OF_ATOM(bond, atom) {
  ------------------
  |  |  420|   108k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 136k, False: 7.46k]
  |  |  ------------------
  ------------------
  245|   136k|          if (!bond->IsAromatic()) continue;
  ------------------
  |  Branch (245:15): [True: 8.47k, False: 127k]
  ------------------
  246|   127k|          OBAtom *nbr = bond->GetNbrAtom(&*atom);
  247|   127k|          if (!needs_dbl_bond->BitIsSet(nbr->GetIdx())) continue;
  ------------------
  |  Branch (247:15): [True: 27.2k, False: 100k]
  ------------------
  248|       |          // create a double bond from atom -> nbr
  249|   100k|          doubleBonds->SetBitOn(bond->GetIdx());
  250|   100k|          needs_dbl_bond->SetBitOff(atom->GetIdx());
  251|   100k|          needs_dbl_bond->SetBitOff(nbr->GetIdx());
  252|       |          // now update degree information for nbr's neighbors
  253|   215k|          FOR_BONDS_OF_ATOM(nbrbond, nbr) {
  ------------------
  |  |  420|   100k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 215k, False: 100k]
  |  |  ------------------
  ------------------
  254|   215k|            if (&(*nbrbond) == &(*bond) || !nbrbond->IsAromatic()) continue;
  ------------------
  |  Branch (254:17): [True: 100k, False: 115k]
  |  Branch (254:44): [True: 26.2k, False: 88.9k]
  ------------------
  255|  88.9k|            OBAtom* nbrnbr = nbrbond->GetNbrAtom(nbr);
  256|  88.9k|            unsigned int nbrnbrIdx = nbrnbr->GetIdx();
  257|  88.9k|            if (!needs_dbl_bond->BitIsSet(nbrnbrIdx)) continue;
  ------------------
  |  Branch (257:17): [True: 10.2k, False: 78.6k]
  ------------------
  258|  78.6k|            degrees[nbrnbrIdx]--;
  259|  78.6k|            if (degrees[nbrnbrIdx] == 1)
  ------------------
  |  Branch (259:17): [True: 68.0k, False: 10.6k]
  ------------------
  260|  68.0k|              degreeOneAtoms.push_back(nbrnbr);
  261|  78.6k|          }
  262|       |          // only a single double bond can be made to atom so we can break here
  263|   100k|          break;
  264|   127k|        }
  265|   108k|      }
  266|       |      
  267|  7.79k|      if (needs_dbl_bond->IsEmpty()) {
  ------------------
  |  Branch (267:11): [True: 3.74k, False: 4.05k]
  ------------------
  268|  3.74k|        finished = true;
  269|  3.74k|        break;
  270|  3.74k|      }
  271|       |
  272|       |      // Now handle any remaining degree 2 or 3 nodes
  273|       |      // We handle deg 2 nodes first and then 3, and the iteration over these nodes
  274|       |      // is abstracted away. Once a double-bond is added that generates more
  275|       |      // degree one nodes, then the iterator is exited
  276|  4.05k|      NodeIterator iterator(degrees, atomArraySize);
  277|  4.05k|      bool change = false;
  278|   173k|      while (unsigned int atomIdx = iterator.next()) {
  ------------------
  |  Branch (278:27): [True: 170k, False: 2.56k]
  ------------------
  279|   170k|        if (!needs_dbl_bond->BitIsSet(atomIdx)) continue;
  ------------------
  |  Branch (279:13): [True: 169k, False: 1.48k]
  ------------------
  280|       |        // The following is almost identical to the code above for deg 1 atoms
  281|       |        // except for handling the variable 'change'
  282|  1.48k|        OBAtom *atom = m_mol->GetAtom(atomIdx);
  283|  2.99k|        FOR_BONDS_OF_ATOM(bond, atom) {
  ------------------
  |  |  420|  1.48k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 2.99k, False: 0]
  |  |  ------------------
  ------------------
  284|  2.99k|          if (!bond->IsAromatic()) continue;
  ------------------
  |  Branch (284:15): [True: 1.28k, False: 1.71k]
  ------------------
  285|  1.71k|          OBAtom *nbr = bond->GetNbrAtom(&*atom);
  286|  1.71k|          if (!needs_dbl_bond->BitIsSet(nbr->GetIdx())) continue;
  ------------------
  |  Branch (286:15): [True: 227, False: 1.48k]
  ------------------
  287|       |          // create a double bond from atom -> nbr
  288|  1.48k|          doubleBonds->SetBitOn(bond->GetIdx());
  289|  1.48k|          needs_dbl_bond->SetBitOff(atomIdx);
  290|  1.48k|          needs_dbl_bond->SetBitOff(nbr->GetIdx());
  291|       |          // now update degree information for both atom's and nbr's neighbors
  292|  4.45k|          for(int N=0; N<2; N++) {
  ------------------
  |  Branch (292:24): [True: 2.97k, False: 1.48k]
  ------------------
  293|  2.97k|            OBAtom *ref = N == 0 ? atom : nbr;
  ------------------
  |  Branch (293:27): [True: 1.48k, False: 1.48k]
  ------------------
  294|  9.46k|            FOR_BONDS_OF_ATOM(nbrbond, ref) {
  ------------------
  |  |  420|  2.97k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 9.46k, False: 2.97k]
  |  |  ------------------
  ------------------
  295|  9.46k|              if (&(*nbrbond) == &(*bond) || !nbrbond->IsAromatic()) continue;
  ------------------
  |  Branch (295:19): [True: 2.97k, False: 6.49k]
  |  Branch (295:46): [True: 2.43k, False: 4.05k]
  ------------------
  296|  4.05k|              OBAtom* nbrnbr = nbrbond->GetNbrAtom(ref);
  297|  4.05k|              unsigned int nbrnbrIdx = nbrnbr->GetIdx();
  298|  4.05k|              if (!needs_dbl_bond->BitIsSet(nbrnbrIdx)) continue;
  ------------------
  |  Branch (298:19): [True: 823, False: 3.23k]
  ------------------
  299|  3.23k|              degrees[nbrnbrIdx]--;
  300|  3.23k|              if (degrees[nbrnbrIdx] == 1) {
  ------------------
  |  Branch (300:19): [True: 2.83k, False: 399]
  ------------------
  301|  2.83k|                degreeOneAtoms.push_back(nbrnbr);
  302|  2.83k|                change = true;
  303|  2.83k|              }
  304|  3.23k|            }
  305|  2.97k|          }
  306|       |          // only a single double bond can be made to atom so we can break here
  307|  1.48k|          break;
  308|  1.71k|        }
  309|  1.48k|        if (change)
  ------------------
  |  Branch (309:13): [True: 1.48k, False: 1]
  ------------------
  310|  1.48k|          break; // exit the iterator once we have actually set a double bond
  311|  1.48k|      }
  312|       |
  313|       |      // We exit if we are finished or if no degree 2/3 nodes can be set
  314|  4.05k|      if (!change)
  ------------------
  |  Branch (314:11): [True: 2.56k, False: 1.48k]
  ------------------
  315|  2.56k|        break;
  316|  4.05k|    }
  317|       |
  318|       |    // Tidy up
  319|  6.31k|    free(degrees);
  320|       |
  321|  6.31k|    return finished;
  322|  6.31k|  }
_ZN9OpenBabel9Kekulizer8FindPathEjbRNS_8OBBitVecE:
  327|   118k|  {
  328|   118k|    if (++m_findPathCalls > FindPathCallLimit)
  ------------------
  |  Branch (328:9): [True: 74, False: 118k]
  ------------------
  329|     74|      return false;
  330|   118k|    if (needs_dbl_bond->BitIsSet(atomidx))
  ------------------
  |  Branch (330:9): [True: 30, False: 118k]
  ------------------
  331|     30|      return true;
  332|   118k|    visited.SetBitOn(atomidx);
  333|   118k|    OBAtom* atom = m_mol->GetAtom(atomidx);
  334|   268k|    FOR_BONDS_OF_ATOM(bond, atom) {
  ------------------
  |  |  420|   118k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 268k, False: 117k]
  |  |  ------------------
  ------------------
  335|   268k|      if (!bond->IsAromatic()) continue;
  ------------------
  |  Branch (335:11): [True: 61.5k, False: 206k]
  ------------------
  336|   206k|      OBAtom *nbr = bond->GetNbrAtom(atom);
  337|   206k|      if (!kekule_system->BitIsSet(nbr->GetIdx())) continue;
  ------------------
  |  Branch (337:11): [True: 28.2k, False: 178k]
  ------------------
  338|   178k|      if (doubleBonds->BitIsSet(bond->GetIdx()) == isDoubleBond) {
  ------------------
  |  Branch (338:11): [True: 86.4k, False: 91.9k]
  ------------------
  339|  86.4k|        if (visited.BitIsSet(nbr->GetIdx())) continue;
  ------------------
  |  Branch (339:13): [True: 2.10k, False: 84.3k]
  ------------------
  340|  84.3k|        bool found_path = FindPath(nbr->GetIdx(), !isDoubleBond, visited);
  341|  84.3k|        if (found_path) {
  ------------------
  |  Branch (341:13): [True: 350, False: 84.0k]
  ------------------
  342|    350|          m_path.push_back(nbr->GetIdx());
  343|    350|          return true;
  344|    350|        }
  345|  84.3k|      }
  346|   178k|    }
  347|   117k|    visited.SetBitOff(atomidx);
  348|   117k|    return false;
  349|   118k|  }
_ZN9OpenBabel9Kekulizer9BackTrackEv:
  352|  2.56k|  {
  353|       |    // With an odd number of bits, it's never going to kekulize fully, but let's fill in as many as we can
  354|  2.56k|    unsigned int count = needs_dbl_bond->CountBits();
  355|       |
  356|  2.56k|    unsigned int total_handled = 0;
  357|  2.56k|    int idx;
  358|  36.4k|    for (idx = needs_dbl_bond->FirstBit(); idx != needs_dbl_bond->EndBit(); idx = needs_dbl_bond->NextBit(idx)) {
  ------------------
  |  Branch (358:44): [True: 36.4k, False: 8]
  ------------------
  359|  36.4k|      total_handled++;
  360|       |      // If there is no additional bit available to match this bit, then terminate
  361|  36.4k|      if (total_handled == count)
  ------------------
  |  Branch (361:11): [True: 2.55k, False: 33.8k]
  ------------------
  362|  2.55k|        return false;
  363|       |
  364|       |      // Our goal is to find an alternating path to another atom
  365|       |      // that needs a double bond
  366|  33.8k|      needs_dbl_bond->SetBitOff(idx); // to avoid the trivial null path being found
  367|  33.8k|      OBBitVec visited(atomArraySize);
  368|  33.8k|      m_path.clear();
  369|  33.8k|      m_findPathCalls = 0;
  370|  33.8k|      bool found_path = FindPath(idx, false, visited);
  371|  33.8k|      if (!found_path) { // could only happen if not kekulizable
  ------------------
  |  Branch (371:11): [True: 33.8k, False: 30]
  ------------------
  372|  33.8k|        needs_dbl_bond->SetBitOn(idx); // reset
  373|  33.8k|        continue;
  374|  33.8k|      }
  375|     30|      total_handled++;
  376|     30|      m_path.push_back(idx);
  377|     30|      needs_dbl_bond->SetBitOff(m_path[0]);
  378|       |      // Flip all of the bond orders on the path from double<-->single
  379|    380|      for (unsigned int i = 0; i < m_path.size()-1; ++i) {
  ------------------
  |  Branch (379:32): [True: 350, False: 30]
  ------------------
  380|    350|        OBBond *bond = m_mol->GetBond(m_path[i], m_path[i + 1]);
  381|    350|        if (i % 2 == 0)
  ------------------
  |  Branch (381:13): [True: 190, False: 160]
  ------------------
  382|    190|          doubleBonds->SetBitOn(bond->GetIdx());
  383|    160|        else
  384|    160|          doubleBonds->SetBitOff(bond->GetIdx());
  385|    350|      }
  386|     30|    }
  387|      8|    return needs_dbl_bond->IsEmpty();
  388|  2.56k|  }
_ZN9OpenBabel10OBKekulizeEPNS_5OBMolE:
  421|  6.31k|  {
  422|  6.31k|    Kekulizer kekulizer(mol);
  423|  6.31k|    bool success = kekulizer.GreedyMatch();
  424|  6.31k|    if (!success) {
  ------------------
  |  Branch (424:9): [True: 2.56k, False: 3.74k]
  ------------------
  425|  2.56k|      success = kekulizer.BackTrack();
  426|  2.56k|    }
  427|       |
  428|  6.31k|    kekulizer.AssignDoubleBonds();
  429|       |
  430|  6.31k|    return success;
  431|  6.31k|  }
kekulize.cpp:_ZN9OpenBabelL15NeedsDoubleBondEPNS_6OBAtomE:
   93|   562k|  {
   94|   562k|    if (!atom->IsAromatic())
  ------------------
  |  Branch (94:9): [True: 290k, False: 272k]
  ------------------
   95|   290k|      return false;
   96|       |
   97|       |    // Does it already have an explicit double bond?
   98|   582k|    FOR_BONDS_OF_ATOM(bond, atom) {
  ------------------
  |  |  420|   272k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 582k, False: 265k]
  |  |  ------------------
  ------------------
   99|   582k|      if (bond->IsAromatic()) continue;
  ------------------
  |  Branch (99:11): [True: 456k, False: 126k]
  ------------------
  100|   126k|      OBAtom *nbr = bond->GetNbrAtom(atom);
  101|   126k|      switch (bond->GetBondOrder()) {
  102|   119k|      case 0: case 1:
  ------------------
  |  Branch (102:7): [True: 187, False: 126k]
  |  Branch (102:15): [True: 119k, False: 6.81k]
  ------------------
  103|   119k|        continue;
  104|  2.70k|      case 2:
  ------------------
  |  Branch (104:7): [True: 2.70k, False: 123k]
  ------------------
  105|  2.70k|        if (IsSpecialCase(atom))
  ------------------
  |  Branch (105:13): [True: 1.08k, False: 1.62k]
  ------------------
  106|  1.08k|          return true;
  107|  1.62k|        return false;
  108|  3.92k|      default: // bond order > 2
  ------------------
  |  Branch (108:7): [True: 3.92k, False: 122k]
  ------------------
  109|  3.92k|        return false;
  110|   126k|      }
  111|   126k|    }
  112|       |
  113|       |    // Is it one of the cases where we know that it only has single bonds?
  114|   265k|    int chg = atom->GetFormalCharge();
  115|   265k|    int deg = atom->GetTotalDegree();
  116|   265k|    switch (atom->GetAtomicNum()) {
  ------------------
  |  Branch (116:13): [True: 265k, False: 64]
  ------------------
  117|  69.0k|    case 6:
  ------------------
  |  Branch (117:5): [True: 69.0k, False: 196k]
  ------------------
  118|  69.0k|      if (deg == 3 && (chg == 1 || chg == -1))
  ------------------
  |  Branch (118:11): [True: 68.7k, False: 205]
  |  Branch (118:24): [True: 37, False: 68.7k]
  |  Branch (118:36): [True: 0, False: 68.7k]
  ------------------
  119|     37|        return false;
  120|  68.9k|      break;
  121|   173k|    case 5: case 7: case 15: case 33: case 51: case 83:
  ------------------
  |  Branch (121:5): [True: 23.2k, False: 242k]
  |  Branch (121:13): [True: 124k, False: 141k]
  |  Branch (121:21): [True: 25.7k, False: 239k]
  |  Branch (121:30): [True: 75, False: 265k]
  |  Branch (121:39): [True: 13, False: 265k]
  |  Branch (121:48): [True: 111, False: 265k]
  ------------------
  122|   173k|      switch (chg) {
  ------------------
  |  Branch (122:15): [True: 173k, False: 21]
  ------------------
  123|   173k|      case 0: // e.g. a pyrrole-type nitrogen
  ------------------
  |  Branch (123:7): [True: 173k, False: 111]
  ------------------
  124|   173k|        if (deg == 3 || deg > 4)
  ------------------
  |  Branch (124:13): [True: 15.9k, False: 157k]
  |  Branch (124:25): [True: 262, False: 156k]
  ------------------
  125|  16.2k|          return false;
  126|   156k|        break;
  127|   156k|      case -1:
  ------------------
  |  Branch (127:7): [True: 27, False: 173k]
  ------------------
  128|     27|        if (deg == 2)
  ------------------
  |  Branch (128:13): [True: 7, False: 20]
  ------------------
  129|      7|          return false;
  130|     20|        break;
  131|     63|      case 1:
  ------------------
  |  Branch (131:7): [True: 63, False: 173k]
  ------------------
  132|     63|        if (deg > 3)
  ------------------
  |  Branch (132:13): [True: 25, False: 38]
  ------------------
  133|     25|          return false;
  134|   173k|      }
  135|   157k|      break;
  136|   157k|    case 8: case 16: case 34: case 52:
  ------------------
  |  Branch (136:5): [True: 9.80k, False: 255k]
  |  Branch (136:13): [True: 13.4k, False: 252k]
  |  Branch (136:22): [True: 18, False: 265k]
  |  Branch (136:31): [True: 99, False: 265k]
  ------------------
  137|  23.3k|      switch (chg) {
  ------------------
  |  Branch (137:15): [True: 23.1k, False: 165]
  ------------------
  138|  23.0k|      case 0:
  ------------------
  |  Branch (138:7): [True: 23.0k, False: 244]
  ------------------
  139|  23.0k|        if (deg == 2 || deg == 4 || deg > 5)
  ------------------
  |  Branch (139:13): [True: 9.52k, False: 13.5k]
  |  Branch (139:25): [True: 165, False: 13.3k]
  |  Branch (139:37): [True: 7, False: 13.3k]
  ------------------
  140|  9.70k|          return false;
  141|  13.3k|        break;
  142|  13.3k|      case -1: case 1:
  ------------------
  |  Branch (142:7): [True: 60, False: 23.2k]
  |  Branch (142:16): [True: 19, False: 23.3k]
  ------------------
  143|     79|        if (deg == 3 || deg == 5 || deg > 6)
  ------------------
  |  Branch (143:13): [True: 13, False: 66]
  |  Branch (143:25): [True: 0, False: 66]
  |  Branch (143:37): [True: 0, False: 66]
  ------------------
  144|     13|          return false;
  145|  23.3k|      }
  146|   265k|    }
  147|       |
  148|   239k|    return true; // It needs a double bond
  149|   265k|  }
kekulize.cpp:_ZN9OpenBabelL13IsSpecialCaseEPNS_6OBAtomE:
   75|  2.70k|  {
   76|  2.70k|    switch(atom->GetAtomicNum()) {
  ------------------
  |  Branch (76:12): [True: 1.98k, False: 718]
  ------------------
   77|  1.83k|    case 7:
  ------------------
  |  Branch (77:5): [True: 1.83k, False: 869]
  ------------------
   78|       |      // Any exo-cyclic double bond from a N
   79|       |      // e.g. pyridine N-oxide as the double bond form
   80|  1.83k|      if (atom->GetTotalDegree() == 3 && atom->GetFormalCharge() == 0)
  ------------------
  |  Branch (80:11): [True: 1.08k, False: 756]
  |  Branch (80:42): [True: 1.08k, False: 0]
  ------------------
   81|  1.08k|        return true;
   82|    756|      break;
   83|    756|    case 16: // e.g. Cs1(=O)ccccn1 but not O=s1(=O)cccn1
  ------------------
  |  Branch (83:5): [True: 151, False: 2.55k]
  ------------------
   84|    151|      if (atom->GetTotalDegree() == 4 && atom->GetFormalCharge() == 0
  ------------------
  |  Branch (84:11): [True: 8, False: 143]
  |  Branch (84:42): [True: 8, False: 0]
  ------------------
   85|      8|          && atom->GetTotalValence() < 6)
  ------------------
  |  Branch (85:14): [True: 1, False: 7]
  ------------------
   86|      1|        return true;
   87|    150|      break;
   88|  2.70k|    }
   89|  1.62k|    return false;
   90|  2.70k|  }
_ZN9OpenBabel12NodeIteratorC2ERPjj:
  155|  4.05k|      m_degrees(degrees), m_atomArraySize(atomArraySize),
  156|  4.05k|      m_counter(0), finishedDegTwo(false)
  157|  4.05k|    { }
_ZN9OpenBabel12NodeIterator4nextEv:
  159|   173k|    {
  160|   173k|      m_counter++;
  161|       |
  162|   173k|      if (!finishedDegTwo) { // return deg 2 nodes first
  ------------------
  |  Branch (162:11): [True: 170k, False: 2.59k]
  ------------------
  163|   865k|        for (; m_counter < m_atomArraySize; ++m_counter) {
  ------------------
  |  Branch (163:16): [True: 863k, False: 2.56k]
  ------------------
  164|   863k|          if (m_degrees[m_counter] == 2) {
  ------------------
  |  Branch (164:15): [True: 168k, False: 695k]
  ------------------
  165|   168k|            return m_counter;
  166|   168k|          }
  167|   863k|        }
  168|  2.56k|        finishedDegTwo = true;
  169|  2.56k|        m_counter = 1; // first atom has idx 1
  170|  2.56k|      }
  171|       |
  172|       |      // return nodes with degree > 2
  173|   486k|      for (; m_counter < m_atomArraySize; ++m_counter) {
  ------------------
  |  Branch (173:14): [True: 483k, False: 2.56k]
  ------------------
  174|   483k|        if (m_degrees[m_counter] > 2) {
  ------------------
  |  Branch (174:13): [True: 2.59k, False: 481k]
  ------------------
  175|  2.59k|          return m_counter;
  176|  2.59k|        }
  177|   483k|      }
  178|       |
  179|       |      // Finished - return 0 signalling the end of iteration
  180|  2.56k|      return 0;
  181|  5.16k|    }
_ZN9OpenBabel9KekulizerC2EPNS_5OBMolE:
   44|  6.31k|    Kekulizer(OBMol* mol) : m_mol(mol), needs_dbl_bond(nullptr), doubleBonds(nullptr),
   45|  6.31k|      kekule_system(nullptr), m_findPathCalls(0)
   46|  6.31k|    {
   47|  6.31k|      atomArraySize = GetMaxAtomIdx(m_mol) + 1;
   48|  6.31k|      bondArraySize = GetMaxBondIdx(m_mol) + 1;
   49|  6.31k|    }
kekulize.cpp:_ZN9OpenBabelL13GetMaxAtomIdxEPNS_5OBMolE:
   32|  6.31k|  {
   33|  6.31k|    return mol->NumAtoms() + 1;
   34|  6.31k|  }
kekulize.cpp:_ZN9OpenBabelL13GetMaxBondIdxEPNS_5OBMolE:
   37|  6.31k|  {
   38|  6.31k|    return mol->NumBonds();
   39|  6.31k|  }
_ZN9OpenBabel9KekulizerD2Ev:
   50|  6.31k|    ~Kekulizer() {
   51|  6.31k|      delete needs_dbl_bond;
   52|  6.31k|      delete doubleBonds;
   53|  6.31k|      delete kekule_system;
   54|  6.31k|    }

_ZN9OpenBabel8OBLocaleC2Ev:
   80|      2|  {
   81|      2|    d = new OBLocalePrivate;
   82|      2|  }
_ZN9OpenBabel8OBLocale9SetLocaleEv:
   93|   258k|  {
   94|   258k|    if (d->counter == 0) {
  ------------------
  |  Branch (94:9): [True: 215, False: 258k]
  ------------------
   95|       |      // Set the locale for number parsing to avoid locale issues: PR#1785463
   96|       |#if HAVE_USELOCALE
   97|       |      // Extended per-thread interface
   98|       |      d->old_locale = uselocale(d->new_c_num_locale);
   99|       |#else
  100|    215|#ifndef ANDROID
  101|       |      // Original global POSIX interface
  102|       |      // regular UNIX, no USELOCALE, no ANDROID
  103|    215|      d->old_locale_string = strdup(setlocale(LC_NUMERIC, nullptr));
  104|       |#else
  105|       |      // ANDROID should stay as "C" -- Igor Filippov
  106|       |      d->old_locale_string = "C";
  107|       |#endif
  108|    215|  	  setlocale(LC_NUMERIC, "C");
  109|    215|#endif
  110|    215|    }
  111|       |
  112|   258k|    ++d->counter;
  113|   258k|  }
_ZN9OpenBabel8OBLocale13RestoreLocaleEv:
  116|   258k|  {
  117|   258k|    --d->counter;
  118|   258k|    if(d->counter == 0) {
  ------------------
  |  Branch (118:8): [True: 214, False: 258k]
  ------------------
  119|       |      // return the locale to the original one
  120|       |#ifdef HAVE_USELOCALE
  121|       |      uselocale(d->old_locale);
  122|       |#else
  123|    214|      setlocale(LC_NUMERIC, d->old_locale_string);
  124|    214|#ifndef ANDROID
  125|       |      // Don't free on Android because "C" is a static ctring constant
  126|    214|      free (d->old_locale_string);
  127|    214|#endif
  128|    214|#endif
  129|    214|    }
  130|   258k|  }
_ZN9OpenBabel15OBLocalePrivateC2Ev:
   41|      2|    OBLocalePrivate(): counter(0)
   42|      2|    {
   43|       |#if HAVE_USELOCALE
   44|       |      new_c_num_locale = newlocale(LC_NUMERIC_MASK, NULL, NULL);
   45|       |#endif
   46|      2|    }

_ZN9OpenBabel10OBDaleCodeEi:
  325|  1.01k|  {
  326|  1.01k|    if (n < 6)
  ------------------
  |  Branch (326:9): [True: 0, False: 1.01k]
  ------------------
  327|      0|      return {};
  328|  1.01k|    const auto &table = daleCodeTable();
  329|  1.01k|    auto it = table.find(n);
  330|  1.01k|    if (it != table.end())
  ------------------
  |  Branch (330:9): [True: 888, False: 131]
  ------------------
  331|    888|      return it->second;
  332|    131|    return generateCode(n);
  333|  1.01k|  }
_ZN9OpenBabel14OBDaleTorsionsEidd:
  337|  1.01k|  {
  338|  1.01k|    std::vector<double> tors;
  339|  1.01k|    if (n < 6)
  ------------------
  |  Branch (339:9): [True: 0, False: 1.01k]
  ------------------
  340|      0|      return tors;
  341|       |
  342|  1.01k|    std::vector<int> code = OBDaleCode(n);
  343|  1.01k|    if (code.empty())
  ------------------
  |  Branch (343:9): [True: 0, False: 1.01k]
  ------------------
  344|      0|      return tors;
  345|       |
  346|  1.01k|    std::vector<int> signs = findClosureSigns(code, bondLength, bondAngleRad);
  347|  1.01k|    expandTorsions(code, signs, tors);
  348|  1.01k|    return tors;
  349|  1.01k|  }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_113daleCodeTableEv:
   54|  1.01k|    {
   55|  1.01k|      static const std::map<int, std::vector<int> > table = {
   56|  1.01k|        { 25, {3,1,3,1,3,1,1,3,1,3,1,3,1} },                       // closure 2.515, min 2.515
   57|  1.01k|        { 26, {3,1,3,1,1,3,1,3,1,3,1,1,3,1} },                     // closure 1.540, min 1.540
   58|  1.01k|        { 27, {3,3,3,3,3,3,3,1,1,1,1,1,1} },                       // closure 2.515, min 1.540
   59|  1.01k|        { 28, {3,1,1,3,1,3,1,1,3,1,1,3,1,3,1,1} },                 // closure 1.540, min 2.515
   60|  1.01k|        { 29, {3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1} },               // closure 2.515, min 1.540
   61|  1.01k|        { 30, {3,1,3,1,3,3,1,3,1,3,1,3,3,1} },                     // closure 1.540, min 1.540
   62|  1.01k|        { 31, {3,3,3,3,3,1,3,1,3,1,3,1,3} },                       // closure 2.515, min 2.515
   63|  1.01k|        { 32, {3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1} },                 // closure 1.540, min 1.540
   64|  1.01k|        { 33, {3,1,3,1,3,1,3,1,1,3,1,3,1,3,1,3,1} },               // closure 2.515, min 2.515
   65|  1.01k|        { 34, {3,3,3,3,3,3,1,3,3,3,3,3} },                         // closure 1.540, min 2.515
   66|  1.01k|        { 35, {3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3} },               // closure 2.515, min 2.515
   67|  1.01k|        { 36, {3,3,1,3,3,3,3,1,3,3,3,3,1,3} },                     // closure 1.540, min 1.540
   68|  1.01k|        { 37, {5,5,3,3,3,3,3,3,3,3,3} },                           // closure 2.515, min 2.515
   69|  1.01k|        { 38, {5,3,3,3,3,3,3,3,3,3,3,3} },                         // closure 1.540, min 2.515
   70|  1.01k|        { 39, {3,1,3,3,1,3,3,1,3,3,1,3,3,1,3,3,1} },               // closure 2.515, min 2.515
   71|  1.01k|        { 40, {3,3,1,3,3,3,1,3,3,3,1,3,3,3,1,3} },                 // closure 1.540, min 2.515
   72|  1.01k|        { 41, {3,3,3,3,3,3,3,1,3,1,3,1,3,1,3,1,3} },               // closure 2.515, min 1.540
   73|  1.01k|        { 42, {5,3,3,3,5,3,3,3,5,3,3,3} },                         // closure 1.540, min 2.515
   74|  1.01k|        { 43, {5,5,3,3,3,3,3,3,3,3,3,3,3} },                       // closure 2.515, min 1.540
   75|  1.01k|        { 44, {3,3,3,3,1,3,3,3,3,3,3,3,1,3,3,3} },                 // closure 1.540, min 2.515
   76|  1.01k|        { 45, {3,3,3,1,3,3,3,3,1,3,3,3,3,3,1,3,3} },               // closure 2.515, min 1.540
   77|  1.01k|        { 46, {3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3} },                 // closure 1.540, min 1.540
   78|  1.01k|        { 47, {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1} },               // closure 2.515, min 2.515
   79|  1.01k|        { 48, {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3} },                 // closure 1.540, min 2.515
   80|  1.01k|        { 49, {3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3} },               // closure 2.515, min 2.515
   81|  1.01k|        { 50, {5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3} },                 // closure 1.540, min 2.515
   82|  1.01k|        { 51, {5,3,5,3,5,3,3,3,3,3,3,3,3,3,3} },                   // closure 2.515, min 1.540
   83|  1.01k|        { 52, {5,3,3,3,3,3,3,3,5,3,3,3,3,3,3,3} },                 // closure 1.540, min 1.540
   84|  1.01k|        { 53, {5,3,3,3,5,3,3,3,5,3,3,5,3,3,3} },                   // closure 2.515, min 2.515
   85|  1.01k|        { 54, {5,3,5,3,3,5,3,5,3,5,3,3,5,3} },                     // closure 1.540, min 1.540
   86|  1.01k|        { 55, {5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3} },               // closure 2.515, min 2.515
   87|  1.01k|        { 56, {5,3,3,3,5,3,3,3,5,3,3,3,5,3,3,3} },                 // closure 1.540, min 2.515
   88|  1.01k|        { 57, {5,3,5,3,5,3,3,3,3,3,3,3,3,3,3,3,3} },               // closure 2.515, min 2.515
   89|  1.01k|        { 58, {5,3,5,3,5,5,3,5,3,5,3,5,5,3} },                     // closure 1.540, min 2.515
   90|  1.01k|        { 59, {5,3,3,3,5,3,3,3,3,5,3,3,3,5,3,3,3} },               // closure 2.515, min 1.540
   91|  1.01k|        { 60, {5,3,3,5,3,5,3,3,5,3,3,5,3,5,3,3} },                 // closure 1.540, min 2.515
   92|  1.01k|        { 61, {5,5,5,3,5,5,5,5,5,5,3,5,5} },                       // closure 2.515, min 1.540
   93|  1.01k|        { 62, {5,3,5,3,3,5,3,5,3,5,3,5,3,3,5,3} },                 // closure 1.540, min 1.540
   94|  1.01k|        { 63, {5,3,3,5,3,3,5,3,3,5,3,5,3,3,5,3,3} },               // closure 2.515, min 1.540
   95|  1.01k|        { 64, {5,3,5,3,5,3,5,3,5,3,5,3,5,3,5,3} },                 // closure 1.540, min 2.515
   96|  1.01k|        { 65, {7,7,7,7,7,5,5,5,5,5,5} },                           // closure 2.515, min 1.540
   97|  1.01k|        { 66, {5,5,5,3,5,5,5,5,5,5,3,5,5,5} },                     // closure 1.540, min 1.540
   98|  1.01k|        { 67, {5,5,5,5,5,5,5,3,5,3,5,3,5,3,5} },                   // closure 2.515, min 2.515
   99|  1.01k|        { 68, {5,3,5,5,3,5,5,3,5,3,5,5,3,5,5,3} },                 // closure 1.540, min 2.515
  100|  1.01k|        { 69, {5,5,5,5,5,5,5,5,5,3,5,3,5,3,5} },                   // closure 2.515, min 1.540
  101|  1.01k|        { 70, {5,5,3,5,5,3,5,5,3,5,5,3,5,5,3,5} },                 // closure 1.540, min 1.540
  102|  1.01k|        { 71, {5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3} },               // closure 2.515, min 1.540
  103|  1.01k|        { 72, {5,5,3,5,5,5,3,5,5,5,3,5,5,5,3,5} },                 // closure 1.540, min 2.515
  104|  1.01k|        { 73, {5,5,5,5,5,3,5,3,5,3,5,3,5,3,5,3,5} },               // closure 2.515, min 2.515
  105|  1.01k|        { 74, {7,5,5,5,5,5,5,7,5,5,5,5,5,5} },                     // closure 1.540, min 1.540
  106|  1.01k|        { 75, {5,5,5,5,5,5,5,3,5,3,5,3,5,3,5,3,5} },               // closure 2.515, min 2.515
  107|  1.01k|        { 76, {5,5,5,5,3,5,5,5,5,5,5,5,3,5,5,5} },                 // closure 1.540, min 2.515
  108|  1.01k|        { 77, {5,5,3,5,5,5,3,5,5,5,5,3,5,5,5,3,5} },               // closure 2.515, min 1.540
  109|  1.01k|        { 78, {7,5,5,5,7,5,5,7,5,5,5,7,5,5} },                     // closure 1.540, min 1.540
  110|  1.01k|        { 79, {5,5,5,3,5,5,5,5,3,5,5,5,5,5,3,5,5} },               // closure 2.515, min 1.540
  111|  1.01k|        { 80, {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5} },                 // closure 1.540, min 2.515
  112|  1.01k|        { 81, {7,7,7,7,7,7,7,7,5,5,5,5,5} },                       // closure 2.515, min 1.540
  113|  1.01k|        { 82, {7,5,7,5,5,7,5,7,5,7,5,5,7,5} },                     // closure 1.540, min 1.540
  114|  1.01k|        { 83, {5,5,5,5,5,5,5,5,3,5,5,5,5,5,5,5,5} },               // closure 2.515, min 2.515
  115|  1.01k|        { 84, {7,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5} },                 // closure 1.540, min 2.515
  116|  1.01k|        { 85, {7,7,7,7,7,7,7,5,7,5,7,5,7} },                       // closure 2.515, min 1.540
  117|  1.01k|        { 86, {7,5,7,5,7,7,5,7,5,7,5,7,7,5} },                     // closure 1.540, min 1.540
  118|  1.01k|        { 87, {9,9,9,9,9,7,7,7,7,7,7} },                           // closure 2.515, min 1.540
  119|  1.01k|        { 88, {7,5,5,5,7,5,5,5,7,5,5,5,7,5,5,5} },                 // closure 1.540, min 2.515
  120|  1.01k|        { 89, {7,7,7,7,7,7,7,5,5,5,5,5,5,5,5} },                   // closure 2.515, min 2.515
  121|  1.01k|        { 90, {7,7,5,7,7,5,7,7,7,5,7,7,5,7} },                     // closure 1.540, min 1.540
  122|  1.01k|        { 91, {7,7,7,7,7,7,7,7,5,5,5,5,5,5,5} },                   // closure 2.515, min 2.515
  123|  1.01k|        { 92, {7,5,5,7,5,7,5,5,7,5,5,7,5,7,5,5} },                 // closure 1.540, min 2.515
  124|  1.01k|        { 93, {9,9,9,9,9,7,9,7,9,7,9} },                           // closure 2.515, min 1.540
  125|  1.01k|        { 94, {7,7,7,5,7,7,7,7,7,7,5,7,7,7} },                     // closure 1.540, min 2.515
  126|  1.01k|        { 95, {7,5,7,5,7,5,7,5,7,5,5,5,5,5,5,5,5} },               // closure 2.515, min 1.540
  127|  1.01k|        { 96, {7,5,7,5,7,5,7,5,7,5,7,5,7,5,7,5} },                 // closure 1.540, min 2.515
  128|  1.01k|        { 97, {7,7,7,7,7,7,5,5,5,5,5,5,5,5,5,5,5} },               // closure 2.515, min 2.515
  129|  1.01k|        { 98, {7,5,7,5,7,7,5,7,5,7,5,7,7,5,7,5} },                 // closure 1.540, min 1.540
  130|  1.01k|        { 99, {7,7,7,7,7,7,7,7,7,5,7,5,7,5,7} },                   // closure 2.515, min 1.540
  131|  1.01k|        {100, {7,5,7,7,5,7,7,5,7,5,7,7,5,7,7,5} },                 // closure 1.540, min 2.515
  132|  1.01k|      };
  133|  1.01k|      return table;
  134|  1.01k|    }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_112generateCodeEi:
  142|    131|    {
  143|    131|      std::vector<int> code;
  144|    131|      if (n < 6)
  ------------------
  |  Branch (144:11): [True: 0, False: 131]
  ------------------
  145|      0|        return code;
  146|       |      // m has same parity as n so n - base*m can be even with odd base.
  147|    131|      int m = (n % 2 == 0) ? 12 : 13;
  ------------------
  |  Branch (147:15): [True: 67, False: 64]
  ------------------
  148|    131|      int base = (n / m) | 1;
  149|    186|      while (base * m > n && base >= 3)
  ------------------
  |  Branch (149:14): [True: 55, False: 131]
  |  Branch (149:30): [True: 55, False: 0]
  ------------------
  150|     55|        base -= 2;
  151|    131|      if (base < 1)
  ------------------
  |  Branch (151:11): [True: 0, False: 131]
  ------------------
  152|      0|        return code;
  153|    131|      int bumps = (n - base * m) / 2;
  154|    131|      if (bumps > m)
  ------------------
  |  Branch (154:11): [True: 0, False: 131]
  ------------------
  155|      0|        return code;
  156|    131|      code.assign(m, base);
  157|    131|      if (bumps > 0) {
  ------------------
  |  Branch (157:11): [True: 118, False: 13]
  ------------------
  158|    118|        double step = double(m) / double(bumps);
  159|    836|        for (int i = 0; i < bumps; ++i)
  ------------------
  |  Branch (159:25): [True: 718, False: 118]
  ------------------
  160|    718|          code[int(i * step) % m] += 2;
  161|    118|      }
  162|    131|      return code;
  163|    131|    }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_116findClosureSignsERKNSt3__16vectorIiNS1_9allocatorIiEEEEdd:
  287|  1.01k|    {
  288|  1.01k|      const int m = static_cast<int>(code.size());
  289|  1.01k|      std::vector<int> best(m, 1);
  290|  1.01k|      if (m == 0)
  ------------------
  |  Branch (290:11): [True: 0, False: 1.01k]
  ------------------
  291|      0|        return best;
  292|       |
  293|       |      // Greedy fallback for very high corner counts.
  294|  1.01k|      if (m > 18) {
  ------------------
  |  Branch (294:11): [True: 0, False: 1.01k]
  ------------------
  295|      0|        for (int i = 0; i < m; ++i)
  ------------------
  |  Branch (295:25): [True: 0, False: 0]
  ------------------
  296|      0|          best[i] = ((i / 2) % 2 == 0) ? 1 : -1;
  ------------------
  |  Branch (296:21): [True: 0, False: 0]
  ------------------
  297|      0|        return best;
  298|      0|      }
  299|       |
  300|  1.01k|      const unsigned long long total = 1ULL << (m - 1);
  301|  1.01k|      double bestErr = std::numeric_limits<double>::infinity();
  302|  1.01k|      std::vector<int> signs(m, 1);
  303|  1.01k|      std::vector<double> tors;
  304|  1.01k|      std::vector<vector3> coords;
  305|       |
  306|  19.1M|      for (unsigned long long mask = 0; mask < total; ++mask) {
  ------------------
  |  Branch (306:41): [True: 19.1M, False: 1.01k]
  ------------------
  307|  19.1M|        signs[0] = 1;
  308|   307M|        for (int i = 1; i < m; ++i)
  ------------------
  |  Branch (308:25): [True: 287M, False: 19.1M]
  ------------------
  309|   287M|          signs[i] = (mask & (1ULL << (i - 1))) ? -1 : 1;
  ------------------
  |  Branch (309:22): [True: 143M, False: 143M]
  ------------------
  310|       |
  311|  19.1M|        expandTorsions(code, signs, tors);
  312|  19.1M|        nerfChain(tors, bondLen, angleRad, coords);
  313|  19.1M|        double err = signScore(coords, bestErr);
  314|  19.1M|        if (err < bestErr) {
  ------------------
  |  Branch (314:13): [True: 24.4k, False: 19.1M]
  ------------------
  315|  24.4k|          bestErr = err;
  316|  24.4k|          best = signs;
  317|  24.4k|        }
  318|  19.1M|      }
  319|  1.01k|      return best;
  320|  1.01k|    }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_19nerfChainERKNSt3__16vectorIdNS1_9allocatorIdEEEEddRNS2_INS_7vector3ENS3_IS8_EEEE:
  173|  19.1M|    {
  174|  19.1M|      const int n = static_cast<int>(tors.size());
  175|  19.1M|      coords.assign(n + 2, vector3(0.0, 0.0, 0.0));
  176|       |
  177|  19.1M|      const double piMinusTheta = kPi - angleRad;
  178|  19.1M|      const double cosA = std::cos(piMinusTheta);
  179|  19.1M|      const double sinA = std::sin(piMinusTheta);
  180|       |
  181|  19.1M|      coords[1] = vector3(bondLen, 0.0, 0.0);
  182|  19.1M|      coords[2] = coords[1] + vector3(bondLen * cosA, bondLen * sinA, 0.0);
  183|       |
  184|   890M|      for (int i = 3; i < n + 2; ++i) {
  ------------------
  |  Branch (184:23): [True: 870M, False: 19.1M]
  ------------------
  185|   870M|        const vector3 &A = coords[i - 3];
  186|   870M|        const vector3 &B = coords[i - 2];
  187|   870M|        const vector3 &C = coords[i - 1];
  188|       |
  189|   870M|        vector3 bc = C - B;
  190|   870M|        bc.normalize();
  191|   870M|        vector3 nhat = cross(B - A, bc);
  192|   870M|        nhat.normalize();
  193|   870M|        vector3 mhat = cross(bc, nhat);
  194|       |
  195|       |        // -cos(phi)*mhat (rather than +cos(phi)) aligns phi with the
  196|       |        // standard A-B-C-D dihedral convention: phi=180 places D anti
  197|       |        // to A, since mhat points away from A's projection onto bc.
  198|   870M|        double phi = tors[i - 2];
  199|   870M|        coords[i] = C + bondLen * (cosA * bc
  200|   870M|                                   + sinA * (-std::cos(phi) * mhat
  201|   870M|                                             + std::sin(phi) * nhat));
  202|   870M|      }
  203|  19.1M|    }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_19signScoreERKNSt3__16vectorINS_7vector3ENS1_9allocatorIS3_EEEEd:
  252|  19.1M|    {
  253|  19.1M|      int n = static_cast<int>(coords.size()) - 2;
  254|  19.1M|      double base = (coords[n]     - coords[0]).length()
  255|  19.1M|                  + (coords[n + 1] - coords[1]).length();
  256|  19.1M|      if (base >= bestSoFar)
  ------------------
  |  Branch (256:11): [True: 19.0M, False: 61.2k]
  ------------------
  257|  19.0M|        return base;
  258|  61.2k|      const double cutoff2 = kOverlapCutoff * kOverlapCutoff;
  259|  61.2k|      double minD2 = cutoff2; // only track distances that would trigger overlap
  260|  61.2k|      bool overlapped = false;
  261|  2.02M|      for (int i = 0; i < n; ++i)
  ------------------
  |  Branch (261:23): [True: 1.99M, False: 24.4k]
  ------------------
  262|   202M|        for (int j = i + 2; j < n; ++j) {
  ------------------
  |  Branch (262:29): [True: 200M, False: 1.96M]
  ------------------
  263|   200M|          if (i == 0 && j == n - 1) continue; // closure bond
  ------------------
  |  Branch (263:15): [True: 3.38M, False: 196M]
  |  Branch (263:25): [True: 55.7k, False: 3.33M]
  ------------------
  264|   200M|          double d2 = (coords[i] - coords[j]).length_2();
  265|   200M|          if (d2 < minD2) {
  ------------------
  |  Branch (265:15): [True: 41.4k, False: 199M]
  ------------------
  266|  41.4k|            minD2 = d2;
  267|  41.4k|            overlapped = true;
  268|  41.4k|            double penalty = kOverlapWeight * (kOverlapCutoff - std::sqrt(d2));
  269|  41.4k|            if (base + penalty >= bestSoFar)
  ------------------
  |  Branch (269:17): [True: 36.8k, False: 4.66k]
  ------------------
  270|  36.8k|              return base + penalty;
  271|  41.4k|          }
  272|   200M|        }
  273|  24.4k|      if (!overlapped)
  ------------------
  |  Branch (273:11): [True: 23.0k, False: 1.37k]
  ------------------
  274|  23.0k|        return base;
  275|  1.37k|      return base + kOverlapWeight * (kOverlapCutoff - std::sqrt(minD2));
  276|  24.4k|    }
macrocycle.cpp:_ZN9OpenBabel12_GLOBAL__N_114expandTorsionsERKNSt3__16vectorIiNS1_9allocatorIiEEEES7_RNS2_IdNS3_IdEEEE:
  217|  19.1M|    {
  218|  19.1M|      const double kAnti   = kPi;
  219|  19.1M|      const double kGauche = kPi / 3.0;
  220|  19.1M|      int n = 0;
  221|   307M|      for (int a : code) n += a;
  ------------------
  |  Branch (221:18): [True: 307M, False: 19.1M]
  ------------------
  222|  19.1M|      tors.assign(n, kAnti);
  223|       |
  224|  19.1M|      int m = static_cast<int>(code.size());
  225|  19.1M|      int maxSide = 0, maxIdx = 0;
  226|   326M|      for (int i = 0; i < m; ++i) {
  ------------------
  |  Branch (226:23): [True: 307M, False: 19.1M]
  ------------------
  227|   307M|        if (code[i] > maxSide) { maxSide = code[i]; maxIdx = i; }
  ------------------
  |  Branch (227:13): [True: 19.1M, False: 287M]
  ------------------
  228|   307M|      }
  229|  19.1M|      std::vector<int> rcode(m), rsign(m);
  230|   326M|      for (int i = 0; i < m; ++i) {
  ------------------
  |  Branch (230:23): [True: 307M, False: 19.1M]
  ------------------
  231|   307M|        rcode[i] = code[(maxIdx + 1 + i) % m];
  232|   307M|        rsign[i] = signs[(maxIdx + 1 + i) % m];
  233|   307M|      }
  234|  19.1M|      int pos = 1;
  235|   326M|      for (int i = 0; i < m; ++i) {
  ------------------
  |  Branch (235:23): [True: 307M, False: 19.1M]
  ------------------
  236|   307M|        tors[pos % n] = rsign[i] * kGauche;
  237|   307M|        pos += rcode[i];
  238|   307M|      }
  239|  19.1M|    }

_ZN9OpenBabel9matrix3x311SetupRotMatEddd:
   52|  6.51k|  {
   53|  6.51k|    double p  = phi * DEG_TO_RAD;
  ------------------
  |  |   35|  6.51k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
   54|  6.51k|    double h  = theta * DEG_TO_RAD;
  ------------------
  |  |   35|  6.51k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
   55|  6.51k|    double b  = psi * DEG_TO_RAD;
  ------------------
  |  |   35|  6.51k|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
   56|       |
   57|  6.51k|    double cx = cos(p);
   58|  6.51k|    double sx = sin(p);
   59|  6.51k|    double cy = cos(h);
   60|  6.51k|    double sy = sin(h);
   61|  6.51k|    double cz = cos(b);
   62|  6.51k|    double sz = sin(b);
   63|       |
   64|  6.51k|    ele[0][0] = cy*cz;
   65|  6.51k|    ele[0][1] = cy*sz;
   66|  6.51k|    ele[0][2] = -sy;
   67|       |
   68|  6.51k|    ele[1][0] = sx*sy*cz-cx*sz;
   69|  6.51k|    ele[1][1] = sx*sy*sz+cx*cz;
   70|  6.51k|    ele[1][2] = sx*cy;
   71|       |
   72|  6.51k|    ele[2][0] = cx*sy*cz+sx*sz;
   73|  6.51k|    ele[2][1] = cx*sy*sz-sx*cz;
   74|  6.51k|    ele[2][2] = cx*cy;
   75|  6.51k|  }
_ZN9OpenBabel9matrix3x319RotAboutAxisByAngleERKNS_7vector3Ed:
  131|    789|  {
  132|    789|    double theta = angle*DEG_TO_RAD;
  ------------------
  |  |   35|    789|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  133|    789|    double s = sin(theta);
  134|    789|    double c = cos(theta);
  135|    789|    double t = 1 - c;
  136|       |
  137|    789|    vector3 vtmp = v;
  138|    789|    vtmp.normalize();
  139|       |
  140|    789|    double x = vtmp.x(),
  141|    789|           y = vtmp.y(),
  142|    789|           z = vtmp.z();
  143|       |
  144|    789|    ele[0][0] = t*x*x + c;
  145|    789|    ele[0][1] = t*x*y + s*z;
  146|    789|    ele[0][2] = t*x*z - s*y;
  147|       |
  148|    789|    ele[1][0] = t*x*y - s*z;
  149|    789|    ele[1][1] = t*y*y + c;
  150|    789|    ele[1][2] = t*y*z + s*x;
  151|       |
  152|    789|    ele[2][0] = t*x*z + s*y;
  153|    789|    ele[2][1] = t*y*z - s*x;
  154|    789|    ele[2][2] = t*z*z + c;
  155|    789|  }
_ZN9OpenBabelmlERKNS_9matrix3x3ERKNS_7vector3E:
  237|    771|  {
  238|    771|    vector3 vv;
  239|       |
  240|    771|    vv.x() = v.x()*m.ele[0][0] + v.y()*m.ele[0][1] + v.z()*m.ele[0][2];
  241|    771|    vv.y() = v.x()*m.ele[1][0] + v.y()*m.ele[1][1] + v.z()*m.ele[1][2];
  242|    771|    vv.z() = v.x()*m.ele[2][0] + v.y()*m.ele[2][1] + v.z()*m.ele[2][2];
  243|       |
  244|    771|    return(vv);
  245|    771|  }
_ZN9OpenBabel7vector3mLERKNS_9matrix3x3E:
  270|   200k|  {
  271|   200k|    vector3 vv;
  272|       |
  273|   200k|    vv.SetX(x()*m(0,0) + y()*m(0,1) + z()*m(0,2));
  274|   200k|    vv.SetY(x()*m(1,0) + y()*m(1,1) + z()*m(1,2));
  275|   200k|    vv.SetZ(x()*m(2,0) + y()*m(2,1) + z()*m(2,2));
  276|   200k|    x() = vv.x();
  277|   200k|    y() = vv.y();
  278|   200k|    z() = vv.z();
  279|       |
  280|   200k|    return(*this);
  281|   200k|  }
_ZNK9OpenBabel9matrix3x311determinantEv:
  341|  6.96k|  {
  342|  6.96k|    return( ele[0][0] * (ele[1][1] * ele[2][2] - ele[1][2] * ele[2][1])
  343|  6.96k|          + ele[0][1] * (ele[1][2] * ele[2][0] - ele[1][0] * ele[2][2])
  344|  6.96k|          + ele[0][2] * (ele[1][0] * ele[2][1] - ele[1][1] * ele[2][0]) );
  345|  6.96k|  }
_ZN9OpenBabel9matrix3x38FillOrthEdddddd:
  447|     44|  {
  448|     44|    double V;
  449|       |
  450|     44|    Alpha *= DEG_TO_RAD;
  ------------------
  |  |   35|     44|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  451|     44|    Beta  *= DEG_TO_RAD;
  ------------------
  |  |   35|     44|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  452|     44|    Gamma *= DEG_TO_RAD;
  ------------------
  |  |   35|     44|#define DEG_TO_RAD (M_PI/180.0)
  ------------------
  453|       |
  454|       |    // from the PDB specification:
  455|       |    //  http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part_75.html
  456|       |
  457|       |
  458|       |    // since we'll ultimately divide by (a * b), we've factored those out here
  459|     44|    V = C * sqrt(1 - SQUARE(cos(Alpha)) - SQUARE(cos(Beta)) - SQUARE(cos(Gamma))
  460|     44|                 + 2 * cos(Alpha) * cos(Beta) * cos(Gamma));
  461|       |
  462|     44|    ele[0][0] = A;
  463|     44|    ele[0][1] = B*cos(Gamma);
  464|     44|    ele[0][2] = C*cos(Beta);
  465|       |
  466|     44|    ele[1][0] = 0.0;
  467|     44|    ele[1][1] = B*sin(Gamma);
  468|     44|    ele[1][2] = C*(cos(Alpha)-cos(Beta)*cos(Gamma))/sin(Gamma);
  469|       |
  470|     44|    ele[2][0] = 0.0;
  471|     44|    ele[2][1] = 0.0;
  472|     44|    ele[2][2] = V / (sin(Gamma)); // again, we factored out A * B when defining V
  473|     44|  }
matrix3x3.cpp:_ZN9OpenBabelL6SQUAREEd:
  443|    132|  static inline double SQUARE( double x ) { return x*x; }

_ZN9OpenBabel26RemoveWhiteSpaceUnderscoreERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
   42|  7.59k|  std::string RemoveWhiteSpaceUnderscore(const string &in){
   43|  7.59k|    std::string out=in;
   44|  95.6k|    for(std::string::iterator pos=out.begin();pos!=out.end();){
  ------------------
  |  Branch (44:47): [True: 88.0k, False: 7.59k]
  ------------------
   45|  88.0k|      if( ((char)(*pos)==' ') ||((char)(*pos)=='_'))  pos=out.erase(pos);
  ------------------
  |  Branch (45:11): [True: 330, False: 87.7k]
  |  Branch (45:33): [True: 0, False: 87.7k]
  ------------------
   46|  87.7k|      else ++pos;
   47|  88.0k|    }
   48|  7.59k|    return out;
   49|  7.59k|  }
_ZN9OpenBabel11SpaceGroupsC2Ev:
   69|      2|  {
   70|      2|    sgbi.assign(230, list<const SpaceGroup*>());
   71|      2|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      2|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
   72|      2|    _envvar = "BABEL_DATADIR";
   73|      2|    _filename = "space-groups.txt";
   74|      2|    _subdir = "data";
   75|      2|    _dataptr = SpaceGroupsData;
   76|      2|  }
_ZN9OpenBabel11SpaceGroups9ParseLineEPKc:
   94|  9.09k|  {
   95|  9.09k|    static SpaceGroup *group = nullptr;
   96|  9.09k|    static int step = SPACE_GROUP_ID;
   97|  9.09k|    static string HMs;
   98|  9.09k|    switch (step)
  ------------------
  |  Branch (98:13): [True: 9.09k, False: 0]
  ------------------
   99|  9.09k|      {
  100|      1|      case SPACE_GROUP_ID:
  ------------------
  |  Branch (100:7): [True: 1, False: 9.09k]
  ------------------
  101|      1|        group = new SpaceGroup();
  102|      1|        group->SetId(atoi (line));
  103|      1|        step++;
  104|      1|        break;
  105|      1|      case SPACE_GROUP_HALL:
  ------------------
  |  Branch (105:7): [True: 1, False: 9.09k]
  ------------------
  106|      1|        group->SetHallName(line);
  107|      1|        step++;
  108|      1|        break;
  109|      1|      case SPACE_GROUP_HM:
  ------------------
  |  Branch (109:7): [True: 1, False: 9.09k]
  ------------------
  110|      1|        {
  111|      1|          string linestr = std::string(line);
  112|      1|          std::string::size_type idx = linestr.find(',');
  113|      1|          if (idx != std::string::npos)
  ------------------
  |  Branch (113:15): [True: 0, False: 1]
  ------------------
  114|      0|            {
  115|      0|              std::string alt = linestr.substr(0, idx);
  116|      0|              if (alt.length() > 0 && _SpaceGroups.sgbn[alt] == nullptr)
  ------------------
  |  Branch (116:19): [True: 0, False: 0]
  |  Branch (116:39): [True: 0, False: 0]
  ------------------
  117|      0|                _SpaceGroups.sgbn[alt] = group;
  118|      0|              std::string stripped_HM=RemoveWhiteSpaceUnderscore(alt);
  119|      0|              if (stripped_HM.length() > 0 && _SpaceGroups.sgbn[stripped_HM] == nullptr)
  ------------------
  |  Branch (119:19): [True: 0, False: 0]
  |  Branch (119:47): [True: 0, False: 0]
  ------------------
  120|      0|                _SpaceGroups.sgbn[stripped_HM] = group;
  121|      0|              group->SetHMName(linestr.substr(idx+1, std::string::npos).c_str());
  122|      0|            }
  123|      1|          else
  124|      1|            group->SetHMName(line);
  125|      1|          step++;
  126|      1|          break;
  127|      0|        }
  128|  9.09k|      case SPACE_GROUP_TRANSFORM:
  ------------------
  |  Branch (128:7): [True: 9.09k, False: 3]
  ------------------
  129|  9.09k|        if (strlen(line) == 0)
  ------------------
  |  Branch (129:13): [True: 0, False: 9.09k]
  ------------------
  130|      0|          {
  131|      0|            step = SPACE_GROUP_ID;
  132|      0|            if (HMs.length() > 0)
  ------------------
  |  Branch (132:17): [True: 0, False: 0]
  ------------------
  133|      0|              group->RegisterSpaceGroup(1, HMs.c_str());
  134|      0|            else
  135|      0|              group->RegisterSpaceGroup();
  136|      0|            group = nullptr;
  137|      0|            HMs.clear();
  138|      0|		      }
  139|  9.09k|        else
  140|  9.09k|          group->AddTransform(line);
  141|  9.09k|        break;
  142|  9.09k|      }
  143|  9.09k|  }
_ZN9OpenBabel10SpaceGroupC2Ev:
  146|      1|    HEXAGONAL_ORIGIN(10), m_HM(""),m_Hall(""),m_id(0),m_OriginAlternative(0)
  147|      1|  {
  148|      1|  }
_ZN9OpenBabel10SpaceGroup9SetHMNameEPKc:
  158|      1|  {
  159|      1|    string name = std::string(name_in);
  160|      1|    std::string::size_type idx = name.find(':');
  161|      1|    if (idx != std::string::npos)
  ------------------
  |  Branch (161:9): [True: 0, False: 1]
  ------------------
  162|      0|      {
  163|      0|        std::string origin = name.substr(idx + 1, std::string::npos);
  164|      0|        if (origin == "H")
  ------------------
  |  Branch (164:13): [True: 0, False: 0]
  ------------------
  165|      0|          {
  166|      0|            m_OriginAlternative = HEXAGONAL_ORIGIN;
  167|      0|          } else {
  168|      0|            m_OriginAlternative = atoi (origin.c_str());
  169|      0|          }
  170|      0|      }
  171|      1|    m_HM = name;
  172|      1|  }
_ZN9OpenBabel10SpaceGroup12AddTransformERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  177|  9.09k|  {
  178|  9.09k|    matrix3x3 m;
  179|  9.09k|    vector3 v;
  180|  9.09k|    locale cLocale("C");
  181|       |
  182|  9.09k|    if (s.find(',') != string::npos)
  ------------------
  |  Branch (182:9): [True: 7.55k, False: 1.54k]
  ------------------
  183|  7.55k|      {
  184|  7.55k|        string s1 = RemoveWhiteSpaceUnderscore(s);
  185|  7.55k|        istringstream iss(s1);
  186|  7.55k|        iss.imbue(cLocale);
  187|       |
  188|  7.55k|        string row;
  189|  7.55k|        int i;
  190|  7.55k|        size_t j;
  191|  7.55k|        bool neg;
  192|  7.55k|        double *t;
  193|  30.2k|        for (i = 0; i < 3; i++)
  ------------------
  |  Branch (193:21): [True: 22.6k, False: 7.55k]
  ------------------
  194|  22.6k|          {
  195|  22.6k|            getline(iss, row, ',');
  196|  22.6k|            j = 0;
  197|  22.6k|            neg = false;
  198|  73.6k|            while (j < row.length())
  ------------------
  |  Branch (198:20): [True: 51.0k, False: 22.6k]
  ------------------
  199|  51.0k|              {
  200|  51.0k|                switch (row[j])
  ------------------
  |  Branch (200:25): [True: 50.5k, False: 459]
  ------------------
  201|  51.0k|                  {
  202|      0|                  case '0':
  ------------------
  |  Branch (202:19): [True: 0, False: 51.0k]
  ------------------
  203|      0|                  case '.': // anticipating something like 0.5 or .3333
  ------------------
  |  Branch (203:19): [True: 0, False: 51.0k]
  ------------------
  204|      0|                    {
  205|      0|                      char *end;
  206|      0|                      switch (i)
  ------------------
  |  Branch (206:31): [True: 0, False: 0]
  ------------------
  207|      0|                        {
  208|      0|                        case 0:
  ------------------
  |  Branch (208:25): [True: 0, False: 0]
  ------------------
  209|      0|                          t = &v.x();
  210|      0|                          break;
  211|      0|                        case 1:
  ------------------
  |  Branch (211:25): [True: 0, False: 0]
  ------------------
  212|      0|                          t = &v.y();
  213|      0|                          break;
  214|      0|                        case 2:
  ------------------
  |  Branch (214:25): [True: 0, False: 0]
  ------------------
  215|      0|                          t = &v.z();
  216|      0|                          break;
  217|      0|                        }
  218|      0|                      *t = strtod(row.c_str() + j, &end);
  219|      0|                      j = end - row.c_str() - 1;
  220|      0|                      if (neg)
  ------------------
  |  Branch (220:27): [True: 0, False: 0]
  ------------------
  221|      0|                        *t = - *t;
  222|      0|                      break;
  223|      0|                    }
  224|  9.61k|                  case '1':
  ------------------
  |  Branch (224:19): [True: 9.61k, False: 41.3k]
  ------------------
  225|  9.89k|                  case '2':
  ------------------
  |  Branch (225:19): [True: 280, False: 50.7k]
  ------------------
  226|  11.1k|                  case '3':
  ------------------
  |  Branch (226:19): [True: 1.23k, False: 49.7k]
  ------------------
  227|  11.1k|                  case '4':
  ------------------
  |  Branch (227:19): [True: 0, False: 51.0k]
  ------------------
  228|  11.1k|                  case '5':
  ------------------
  |  Branch (228:19): [True: 15, False: 50.9k]
  ------------------
  229|  11.1k|                  case '6':
  ------------------
  |  Branch (229:19): [True: 0, False: 51.0k]
  ------------------
  230|  11.1k|                  case '7':
  ------------------
  |  Branch (230:19): [True: 0, False: 51.0k]
  ------------------
  231|  11.1k|                  case '8':
  ------------------
  |  Branch (231:19): [True: 0, False: 51.0k]
  ------------------
  232|  11.1k|                  case '9':
  ------------------
  |  Branch (232:19): [True: 0, False: 51.0k]
  ------------------
  233|  11.1k|                    if (j+2 < row.length() && row[j+1] == '/')
  ------------------
  |  Branch (233:25): [True: 10.9k, False: 181]
  |  Branch (233:47): [True: 10.8k, False: 161]
  ------------------
  234|  10.8k|                      {
  235|  10.8k|                        double *t = nullptr;
  236|  10.8k|                        switch (i)
  ------------------
  |  Branch (236:33): [True: 10.8k, False: 0]
  ------------------
  237|  10.8k|                          {
  238|  3.52k|                          case 0:
  ------------------
  |  Branch (238:27): [True: 3.52k, False: 7.27k]
  ------------------
  239|  3.52k|                            t = &v.x();
  240|  3.52k|                            break;
  241|  3.52k|                          case 1:
  ------------------
  |  Branch (241:27): [True: 3.52k, False: 7.27k]
  ------------------
  242|  3.52k|                            t = &v.y();
  243|  3.52k|                            break;
  244|  3.75k|                          case 2:
  ------------------
  |  Branch (244:27): [True: 3.75k, False: 7.05k]
  ------------------
  245|  3.75k|                            t = &v.z();
  246|  3.75k|                            break;
  247|  10.8k|                          }
  248|  10.8k|                        *t = ((double) (row[j] - '0')) / (row[j+2] - '0');
  249|  10.8k|                        if (neg)
  ------------------
  |  Branch (249:29): [True: 0, False: 10.8k]
  ------------------
  250|      0|                          *t = - *t;
  251|       |
  252|  10.8k|                        j +=2;
  253|  10.8k|                      }
  254|  11.1k|                    break;
  255|  11.1k|                  case '-':
  ------------------
  |  Branch (255:19): [True: 10.7k, False: 40.2k]
  ------------------
  256|  10.7k|                    neg = true;
  257|  10.7k|                    break;
  258|  5.82k|                  case '+':
  ------------------
  |  Branch (258:19): [True: 5.82k, False: 45.1k]
  ------------------
  259|  5.82k|                    neg = false;
  260|  5.82k|                    break;
  261|      0|                  case 'X':
  ------------------
  |  Branch (261:19): [True: 0, False: 51.0k]
  ------------------
  262|  7.67k|                  case 'x':
  ------------------
  |  Branch (262:19): [True: 7.67k, False: 43.3k]
  ------------------
  263|  7.67k|                    m(i, 0) = (neg)? -1.: 1.;
  ------------------
  |  Branch (263:31): [True: 3.66k, False: 4.01k]
  ------------------
  264|  7.67k|                  break;
  265|      0|                  case 'Y':
  ------------------
  |  Branch (265:19): [True: 0, False: 51.0k]
  ------------------
  266|  7.67k|                  case 'y':
  ------------------
  |  Branch (266:19): [True: 7.67k, False: 43.3k]
  ------------------
  267|  7.67k|                    m(i, 1) = (neg)? -1.: 1.;
  ------------------
  |  Branch (267:31): [True: 3.66k, False: 4.01k]
  ------------------
  268|  7.67k|                  break;
  269|      0|                  case 'Z':
  ------------------
  |  Branch (269:19): [True: 0, False: 51.0k]
  ------------------
  270|  7.47k|                  case 'z':
  ------------------
  |  Branch (270:19): [True: 7.47k, False: 43.5k]
  ------------------
  271|  7.47k|                    m(i, 2) = (neg)? -1.: 1.;
  ------------------
  |  Branch (271:31): [True: 3.39k, False: 4.07k]
  ------------------
  272|  7.47k|                  break;
  273|  51.0k|                  }
  274|  51.0k|                j++;
  275|  51.0k|              }
  276|  22.6k|          }
  277|  7.55k|      }
  278|  1.54k|    else if (s.find(' ') != string::npos)
  ------------------
  |  Branch (278:14): [True: 1.00k, False: 540]
  ------------------
  279|  1.00k|      {
  280|  1.00k|        istringstream iss(s);
  281|  1.00k|        iss.imbue(cLocale);
  282|       |        /* supposing the string is a list of at least 12 float values. If there are
  283|       |           16, the last four are 0., 0., 0. and 1. and are not needed */
  284|  1.00k|        iss >> m(0,0) >> m(0,1) >> m(0,2) >> v.x();
  285|  1.00k|        iss >> m(1,0) >> m(1,1) >> m(1,2) >> v.y();
  286|  1.00k|        iss >> m(2,0) >> m(2,1) >> m(2,2) >> v.z();
  287|  1.00k|      }
  288|  9.09k|		if (v.x() < 0)
  ------------------
  |  Branch (288:7): [True: 0, False: 9.09k]
  ------------------
  289|      0|			v.x() += 1.;
  290|  9.09k|		else if (v.x() >= 1.)
  ------------------
  |  Branch (290:12): [True: 0, False: 9.09k]
  ------------------
  291|      0|			v.x() -= 1.;
  292|  9.09k|		if (v.y() < 0)
  ------------------
  |  Branch (292:7): [True: 0, False: 9.09k]
  ------------------
  293|      0|			v.y() += 1.;
  294|  9.09k|		else if (v.y() >= 1.)
  ------------------
  |  Branch (294:12): [True: 0, False: 9.09k]
  ------------------
  295|      0|			v.y() -= 1.;
  296|  9.09k|		if (v.z() < 0)
  ------------------
  |  Branch (296:7): [True: 0, False: 9.09k]
  ------------------
  297|      0|			v.z() += 1.;
  298|  9.09k|		else if (v.z() >= 1.)
  ------------------
  |  Branch (298:12): [True: 0, False: 9.09k]
  ------------------
  299|      0|			v.z() -= 1.;
  300|       |
  301|       |    // only push_back unique transformations
  302|  9.09k|    transform3dIterator i, iend = m_transforms.end();
  303|  9.09k|    transform3d* candidate = new transform3d (m, v);
  304|  9.09k|    bool transform_exists = false;
  305|       |
  306|  1.35M|    for (i = m_transforms.begin(); i!= iend; i++)
  ------------------
  |  Branch (306:36): [True: 1.35M, False: 883]
  ------------------
  307|  1.35M|    {
  308|  1.35M|      if (candidate->DescribeAsString() == (*i)->DescribeAsString())
  ------------------
  |  Branch (308:11): [True: 8.21k, False: 1.34M]
  ------------------
  309|  8.21k|      {
  310|  8.21k|        transform_exists = true;
  311|  8.21k|        break;
  312|  8.21k|      }
  313|  1.35M|    }
  314|       |
  315|  9.09k|    if (transform_exists){
  ------------------
  |  Branch (315:9): [True: 8.21k, False: 883]
  ------------------
  316|  8.21k|      delete candidate;
  317|  8.21k|    }else{
  318|    883|      m_transforms.push_back (candidate);
  319|    883|    }
  320|  9.09k|  }
_ZN9OpenBabel10SpaceGroup13GetSpaceGroupERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  386|     44|  {
  387|     44|    if (!_SpaceGroups.Inited())
  ------------------
  |  Branch (387:9): [True: 1, False: 43]
  ------------------
  388|      1|      _SpaceGroups.Init();
  389|       |
  390|       |    // This needs to be more forgiving
  391|       |    // First, try it without removing the white space
  392|     44|    const SpaceGroup *match = _SpaceGroups.sgbn.find(name_in) != _SpaceGroups.sgbn.end() ? _SpaceGroups.sgbn[name_in] : nullptr;
  ------------------
  |  Branch (392:31): [True: 0, False: 44]
  ------------------
  393|     44|    if (match) return match;
  ------------------
  |  Branch (393:9): [True: 0, False: 44]
  ------------------
  394|       |
  395|       |    // If a match wasn't found, remove the white space and try again
  396|     44|    string name = RemoveWhiteSpaceUnderscore(name_in);
  397|     44|    match = _SpaceGroups.sgbn.find(name) != _SpaceGroups.sgbn.end() ? _SpaceGroups.sgbn[name] : nullptr;
  ------------------
  |  Branch (397:13): [True: 0, False: 44]
  ------------------
  398|       |
  399|     44|    if (!match) {
  ------------------
  |  Branch (399:9): [True: 44, False: 0]
  ------------------
  400|       |      // Try another search, e.g. Fm-3m instead of Fm3m
  401|     44|      string search = name;
  402|     44|      bool hasMirror = (name.find('m') != string::npos || name.find('d') != string::npos || name.find('n') != string::npos || name.find('c') != string::npos);
  ------------------
  |  Branch (402:25): [True: 3, False: 41]
  |  Branch (402:59): [True: 27, False: 14]
  |  Branch (402:93): [True: 2, False: 12]
  |  Branch (402:127): [True: 1, False: 11]
  ------------------
  403|     44|      if (name.find('4') != string::npos && hasMirror && name.find('-') == string::npos) {
  ------------------
  |  Branch (403:11): [True: 2, False: 42]
  |  Branch (403:45): [True: 2, False: 0]
  |  Branch (403:58): [True: 1, False: 1]
  ------------------
  404|      1|        search.insert(name.find('4'), "-");
  405|     43|      } else if (name.find('3') != string::npos && hasMirror && name.find('-') == string::npos) {
  ------------------
  |  Branch (405:18): [True: 3, False: 40]
  |  Branch (405:52): [True: 3, False: 0]
  |  Branch (405:65): [True: 2, False: 1]
  ------------------
  406|      2|        search.insert(name.find('3'), "-");
  407|     41|      } else if (name.find('6') != string::npos && hasMirror && name.find('-') == string::npos) {
  ------------------
  |  Branch (407:18): [True: 19, False: 22]
  |  Branch (407:52): [True: 19, False: 0]
  |  Branch (407:65): [True: 19, False: 0]
  ------------------
  408|     19|        search.insert(name.find('6'), "-");
  409|     19|      }
  410|       |
  411|     44|      match = _SpaceGroups.sgbn.find(search) != _SpaceGroups.sgbn.end() ? _SpaceGroups.sgbn[search] : nullptr;
  ------------------
  |  Branch (411:15): [True: 0, False: 44]
  ------------------
  412|     44|    }
  413|       |
  414|     44|    return (match);
  415|     44|  }
_ZN9OpenBabel11SpaceGroups6InitedEv:
   59|     44|    bool Inited() { return _init;}
_ZN9OpenBabel11SpaceGroups7GetSizeEv:
   58|      1|    size_t GetSize() override { return sgs.size(); }

_ZNK9OpenBabel11transform3d16DescribeAsStringEv:
   48|  2.70M|    {
   49|  2.70M|      ostringstream r;
   50|  2.70M|      int n, i, j;
   51|  2.70M|      const matrix3x3 *m = static_cast <const matrix3x3 *> (this);
   52|  2.70M|      const vector3 *v = static_cast <const vector3 *> (this);
   53|  2.70M|      bool neg, first;
   54|  10.8M|      for (i = 0; i < 3; i++)
  ------------------
  |  Branch (54:19): [True: 8.11M, False: 2.70M]
  ------------------
   55|  8.11M|        {
   56|  8.11M|          if (i)
  ------------------
  |  Branch (56:15): [True: 5.41M, False: 2.70M]
  ------------------
   57|  5.41M|            r << ",";
   58|  8.11M|          n = static_cast<int> (floor((*v)[i] * 12.0 + 0.1));
   59|  8.11M|          j = 0;
   60|  16.1M|          while (j < 3 && (*m)(i, j) == 0.)
  ------------------
  |  Branch (60:18): [True: 16.1M, False: 35.3k]
  |  Branch (60:27): [True: 8.05M, False: 8.08M]
  ------------------
   61|  8.05M|            j++;
   62|  8.11M|          if (j >= 3)
  ------------------
  |  Branch (62:15): [True: 35.3k, False: 8.08M]
  ------------------
   63|  35.3k|            continue;
   64|  8.08M|          neg = (*m)(i, j) < 0.;
   65|  8.08M|          switch (n)
  ------------------
  |  Branch (65:19): [True: 5.03M, False: 3.04M]
  ------------------
   66|  8.08M|            {
   67|  24.1k|              case 2:
  ------------------
  |  Branch (67:15): [True: 24.1k, False: 8.05M]
  ------------------
   68|  24.1k|                r << ((neg)? "1/6": "1/6+");
  ------------------
  |  Branch (68:23): [True: 11.2k, False: 12.9k]
  ------------------
   69|  24.1k|                break;
   70|  1.03M|              case 3:
  ------------------
  |  Branch (70:15): [True: 1.03M, False: 7.04M]
  ------------------
   71|  1.03M|                r << ((neg)? "1/4": "1/4+");
  ------------------
  |  Branch (71:23): [True: 515k, False: 519k]
  ------------------
   72|  1.03M|                break;
   73|   169k|              case 4:
  ------------------
  |  Branch (73:15): [True: 169k, False: 7.91M]
  ------------------
   74|   169k|                r << ((neg)? "1/3": "1/3+");
  ------------------
  |  Branch (74:23): [True: 84.2k, False: 85.2k]
  ------------------
   75|   169k|                break;
   76|  2.57M|              case 6:
  ------------------
  |  Branch (76:15): [True: 2.57M, False: 5.50M]
  ------------------
   77|  2.57M|                r << ((neg)? "1/2": "1/2+");
  ------------------
  |  Branch (77:23): [True: 1.27M, False: 1.29M]
  ------------------
   78|  2.57M|                break;
   79|   169k|              case 8:
  ------------------
  |  Branch (79:15): [True: 169k, False: 7.91M]
  ------------------
   80|   169k|                r << ((neg)? "2/3": "2/3+");
  ------------------
  |  Branch (80:23): [True: 84.2k, False: 85.2k]
  ------------------
   81|   169k|                break;
   82|  1.03M|              case 9:
  ------------------
  |  Branch (82:15): [True: 1.03M, False: 7.04M]
  ------------------
   83|  1.03M|                r << ((neg)? "3/4": "3/4+");
  ------------------
  |  Branch (83:23): [True: 516k, False: 519k]
  ------------------
   84|  1.03M|                break;
   85|  24.1k|              case 10:
  ------------------
  |  Branch (85:15): [True: 24.1k, False: 8.05M]
  ------------------
   86|  24.1k|                r << ((neg)? "5/6": "5/6+");
  ------------------
  |  Branch (86:23): [True: 11.2k, False: 12.9k]
  ------------------
   87|  24.1k|                break;
   88|  8.08M|            }
   89|  8.08M|            first = true;
   90|  24.3M|            while (j < 3) {
  ------------------
  |  Branch (90:20): [True: 16.2M, False: 8.08M]
  ------------------
   91|  16.2M|              if ((*m)(i, j) != 0.)
  ------------------
  |  Branch (91:19): [True: 8.34M, False: 7.95M]
  ------------------
   92|  8.34M|                {
   93|  8.34M|                  neg = (*m)(i, j) < 0.;
   94|  8.34M|                  switch (j)
  ------------------
  |  Branch (94:27): [True: 8.34M, False: 0]
  ------------------
   95|  8.34M|                    {
   96|  2.82M|                      case 0:
  ------------------
  |  Branch (96:23): [True: 2.82M, False: 5.51M]
  ------------------
   97|  2.82M|                        r << ((neg)? "-x": (first? "x": "+x"));
  ------------------
  |  Branch (97:31): [True: 1.41M, False: 1.41M]
  |  Branch (97:45): [True: 1.41M, False: 0]
  ------------------
   98|  2.82M|                        break;
   99|  2.82M|                     case 1:
  ------------------
  |  Branch (99:22): [True: 2.82M, False: 5.52M]
  ------------------
  100|  2.82M|                        r << ((neg)? "-y": (first? "y": "+y"));
  ------------------
  |  Branch (100:31): [True: 1.41M, False: 1.40M]
  |  Branch (100:45): [True: 1.27M, False: 129k]
  ------------------
  101|  2.82M|                        break;
  102|  2.69M|                     case 2:
  ------------------
  |  Branch (102:22): [True: 2.69M, False: 5.64M]
  ------------------
  103|  2.69M|                        r << ((neg)? "-z": (first? "z": "+z"));
  ------------------
  |  Branch (103:31): [True: 1.33M, False: 1.36M]
  |  Branch (103:45): [True: 1.36M, False: 0]
  ------------------
  104|  2.69M|                        break;
  105|  8.34M|                    }
  106|  8.34M|                  first = false;
  107|  8.34M|                }
  108|  16.2M|              j++;
  109|  16.2M|            }
  110|  8.08M|        }
  111|  2.70M|      return r.str();
  112|  2.70M|    }
_ZN9OpenBabel11transform3d9NormalizeEv:
  130|  9.09k|	{
  131|  9.09k|      vector3 *vv = static_cast<vector3*>(this);
  132|  9.09k|      vv->x() -= floor (vv->x() + .01); /* .01 should work in all cases in
  133|       |                                        this context */
  134|  9.09k|      vv->y() -= floor (vv->y() + .01);
  135|  9.09k|      vv->z() -= floor (vv->z() + .01);
  136|  9.09k|	}

_ZNK9OpenBabel7vector3ixEj:
   73|  8.11M|  {
   74|  8.11M|    switch (i) {
   75|  2.70M|      case 0u:
  ------------------
  |  Branch (75:7): [True: 2.70M, False: 5.41M]
  ------------------
   76|  2.70M|        return _vx;
   77|  2.70M|      case 1u:
  ------------------
  |  Branch (77:7): [True: 2.70M, False: 5.41M]
  ------------------
   78|  2.70M|        return _vy;
   79|  2.70M|      case 2u:
  ------------------
  |  Branch (79:7): [True: 2.70M, False: 5.41M]
  ------------------
   80|  2.70M|        return _vz;
   81|      0|      default:
  ------------------
  |  Branch (81:7): [True: 0, False: 8.11M]
  ------------------
   82|      0|        cerr << "ERROR in OpenBabel::vector3::operator[]\n"
   83|      0|             << "The method has been called with an illegal index i=" << i << ".\n"
   84|      0|             << "Please contact the author of the offending program immediately." << endl;
   85|      0|        return 0.0;
   86|  8.11M|    }
   87|  8.11M|  }
_ZN9OpenBabel7vector316randomUnitVectorEv:
   93|   378k|  {
   94|       |#if !OB_USE_OBRANDOMMT
   95|       |    static OBRandom singleRand(true);
   96|       |#else
   97|   378k|    static OBRandomMT singleRand{};
   98|   378k|#endif
   99|       |
  100|   378k|#if !OB_USE_IMPROVED_RANDOM_UNIT_VECTOR
  101|       |    // obtain a random vector with 0.001 <= length^2 <= 1.0, normalize
  102|       |    // the vector to obtain a random vector of length 1.0.
  103|   378k|    double l;
  104|   378k|    do
  105|   378k|      {
  106|   378k|        this->Set(singleRand.UniformReal(-0.5, 0.5), singleRand.UniformReal(-0.5, 0.5), singleRand.UniformReal(-0.5, 0.5));
  107|   378k|        l = length_2();
  108|   378k|      }
  109|   378k|    while ( (l > 1.0) || (l < 1e-4) );
  ------------------
  |  Branch (109:13): [True: 0, False: 378k]
  |  Branch (109:26): [True: 3, False: 378k]
  ------------------
  110|   378k|    this->normalize();
  111|       |#else
  112|       |    double z = singleRand.UniformReal(-1.0, 1.0);
  113|       |    double phi = singleRand.UniformReal(0.0, 2 * M_PI);
  114|       |    double rho = sqrt(1.0 - z * z);
  115|       |    this->Set(rho * cos(phi), rho * sin(phi), z);
  116|       |#endif
  117|   378k|  }
_ZN9OpenBabel7vector39normalizeEv:
  163|  1.74G|  {
  164|       |#ifdef OB_OLD_MATH_CHECKS
  165|       |    if( CanBeNormalized() )
  166|       |      (*this) /= length();
  167|       |#else
  168|  1.74G|    (*this) /= length();
  169|  1.74G|#endif
  170|  1.74G|    return(*this);
  171|  1.74G|  }
_ZN9OpenBabel5crossERKNS_7vector3ES2_:
  174|  1.74G|  {
  175|  1.74G|    vector3 vv ;
  176|       |
  177|  1.74G|    vv.x() =   v1.y()*v2.z() - v1.z()*v2.y() ;
  178|  1.74G|    vv.y() = - v1.x()*v2.z() + v1.z()*v2.x() ;
  179|  1.74G|    vv.z() =   v1.x()*v2.y() - v1.y()*v2.x() ;
  180|       |
  181|  1.74G|    return ( vv ) ;
  182|  1.74G|  }
_ZN9OpenBabel11vectorAngleERKNS_7vector3ES2_:
  205|  1.87M|  {
  206|  1.87M|    double dp;
  207|       |
  208|  1.87M|    dp = dot(v1,v2)/ ( v1.length() * v2.length() );
  209|       |
  210|       |
  211|  1.87M|    if (dp < -0.999999)
  ------------------
  |  Branch (211:9): [True: 11.2k, False: 1.86M]
  ------------------
  212|  11.2k|      dp = -0.9999999;
  213|       |
  214|  1.87M|    if (dp > 0.9999999)
  ------------------
  |  Branch (214:9): [True: 297k, False: 1.57M]
  ------------------
  215|   297k|      dp = 0.9999999;
  216|       |
  217|       |
  218|       |    return((RAD_TO_DEG * acos(dp)));
  ------------------
  |  |   31|  1.87M|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  219|  1.87M|  }
_ZN9OpenBabel16CalcTorsionAngleERKNS_7vector3ES2_S2_S2_:
  234|   149k|  {
  235|   149k|    vector3 b1 = a - b;
  236|   149k|    vector3 b2 = b - c;
  237|   149k|    vector3 b3 = c - d;
  238|       |
  239|       |#ifdef OB_OLD_MATH_CHECKS
  240|       |    vector3 c1 = cross(b1, b2);
  241|       |    vector3 c2 = cross(b2, b3);
  242|       |
  243|       |    if (c1.length() * c2.length() < 0.001)
  244|       |    {
  245|       |      return 0.0;
  246|       |    }
  247|       |#endif
  248|       |
  249|   149k|    double rb2 = sqrt(dot(b2, b2));
  250|       |
  251|   149k|    vector3 b2xb3 = cross(b2, b3);
  252|   149k|    vector3 b1xb2 = cross(b1, b2);
  253|   149k|    double torsion = - atan2(dot(rb2 * b1, b2xb3), dot(b1xb2, b2xb3));
  254|       |
  255|       |    return(torsion * RAD_TO_DEG);
  ------------------
  |  |   31|   149k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  256|   149k|  }

_ZN9OpenBabel5OBMol8SetTitleEPKc:
  172|  7.03k|  {
  173|  7.03k|    _title = title;
  174|  7.03k|    Trim(_title);
  175|  7.03k|  }
_ZN9OpenBabel5OBMol8SetTitleERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  178|  2.34k|  {
  179|  2.34k|    _title = title;
  180|  2.34k|    Trim(_title);
  181|  2.34k|  }
_ZNK9OpenBabel5OBMol8GetTitleEb:
  184|   863k|  {
  185|   863k|    if (!replaceNewlines || _title.find('\n')== string::npos )
  ------------------
  |  Branch (185:9): [True: 1.56k, False: 862k]
  |  Branch (185:29): [True: 862k, False: 82]
  ------------------
  186|   863k|      return(_title.c_str());
  187|       |
  188|       |    //Only multiline titles use the following to replace newlines by spaces
  189|     82|    static string title;
  190|     82|    title=_title;
  191|       |    // Single pass; previous implementation was O(n^2) on titles with many
  192|       |    // newlines because find_first_of always restarted from position 0.
  193|   387k|    for (char& c : title) {
  ------------------
  |  Branch (193:18): [True: 387k, False: 82]
  ------------------
  194|   387k|      if (c == '\n' || c == '\r')
  ------------------
  |  Branch (194:11): [True: 3.91k, False: 383k]
  |  Branch (194:24): [True: 0, False: 383k]
  ------------------
  195|  3.91k|        c = ' ';
  196|   387k|    }
  197|       |
  198|     82|    return(title.c_str());
  199|   863k|  }
_ZN9OpenBabel9SortAtomZERKNSt3__14pairIPNS_6OBAtomEdEES6_:
  207|  5.85M|  {
  208|  5.85M|    return (a.second < b.second);
  209|  5.85M|  }
_ZN9OpenBabel5OBMol10GetTorsionEiiii:
  217|    786|  {
  218|    786|    return(GetTorsion((OBAtom*)_vatom[a-1],
  219|    786|                      (OBAtom*)_vatom[b-1],
  220|    786|                      (OBAtom*)_vatom[c-1],
  221|    786|                      (OBAtom*)_vatom[d-1]));
  222|    786|  }
_ZN9OpenBabel5OBMol10SetTorsionEPNS_6OBAtomES2_S2_S2_d:
  225|   119k|  {
  226|   119k|    vector<int> tor;
  227|   119k|    vector<int> atoms;
  228|       |
  229|   119k|    obErrorLog.ThrowError(__FUNCTION__,
  230|   119k|                          "Ran OpenBabel::SetTorsion", obAuditMsg);
  231|       |
  232|   119k|    tor.push_back(a->GetCoordinateIdx());
  233|   119k|    tor.push_back(b->GetCoordinateIdx());
  234|   119k|    tor.push_back(c->GetCoordinateIdx());
  235|   119k|    tor.push_back(d->GetCoordinateIdx());
  236|       |
  237|   119k|    FindChildren(atoms, b->GetIdx(), c->GetIdx());
  238|   119k|    int j;
  239|  68.8M|    for (j = 0 ; (unsigned)j < atoms.size() ; j++ )
  ------------------
  |  Branch (239:18): [True: 68.7M, False: 119k]
  ------------------
  240|  68.7M|      atoms[j] = (atoms[j] - 1) * 3;
  241|       |
  242|   119k|    double v2x,v2y,v2z;
  243|   119k|    double radang,m[9];
  244|   119k|    double x,y,z,mag,rotang,sn,cs,t,tx,ty,tz;
  245|       |
  246|       |    //calculate the torsion angle
  247|       |    // TODO: fix this calculation for periodic systems
  248|   119k|    radang = CalcTorsionAngle(a->GetVector(),
  249|   119k|                              b->GetVector(),
  250|   119k|                              c->GetVector(),
  251|   119k|                              d->GetVector()) / RAD_TO_DEG;
  ------------------
  |  |   31|   119k|#define RAD_TO_DEG (180.0/M_PI)
  ------------------
  252|       |    //
  253|       |    // now we have the torsion angle (radang) - set up the rot matrix
  254|       |    //
  255|       |
  256|       |    //find the difference between current and requested
  257|   119k|    rotang = ang - radang;
  258|       |
  259|   119k|    sn = sin(rotang);
  260|   119k|    cs = cos(rotang);
  261|   119k|    t = 1 - cs;
  262|       |
  263|   119k|    v2x = _c[tor[1]]   - _c[tor[2]];
  264|   119k|    v2y = _c[tor[1]+1] - _c[tor[2]+1];
  265|   119k|    v2z = _c[tor[1]+2] - _c[tor[2]+2];
  266|       |
  267|       |   //normalize the rotation vector
  268|   119k|    mag = sqrt(SQUARE(v2x)+SQUARE(v2y)+SQUARE(v2z));
  ------------------
  |  |  783|   119k|#define SQUARE(x) ((x)*(x))
  ------------------
                  mag = sqrt(SQUARE(v2x)+SQUARE(v2y)+SQUARE(v2z));
  ------------------
  |  |  783|   119k|#define SQUARE(x) ((x)*(x))
  ------------------
                  mag = sqrt(SQUARE(v2x)+SQUARE(v2y)+SQUARE(v2z));
  ------------------
  |  |  783|   119k|#define SQUARE(x) ((x)*(x))
  ------------------
  269|   119k|    x = v2x/mag;
  270|   119k|    y = v2y/mag;
  271|   119k|    z = v2z/mag;
  272|       |
  273|       |    //set up the rotation matrix
  274|   119k|    m[0]= t*x*x + cs;
  275|   119k|    m[1] = t*x*y + sn*z;
  276|   119k|    m[2] = t*x*z - sn*y;
  277|   119k|    m[3] = t*x*y - sn*z;
  278|   119k|    m[4] = t*y*y + cs;
  279|   119k|    m[5] = t*y*z + sn*x;
  280|   119k|    m[6] = t*x*z + sn*y;
  281|   119k|    m[7] = t*y*z - sn*x;
  282|   119k|    m[8] = t*z*z + cs;
  283|       |
  284|       |    //
  285|       |    //now the matrix is set - time to rotate the atoms
  286|       |    //
  287|   119k|    tx = _c[tor[1]];
  288|   119k|    ty = _c[tor[1]+1];
  289|   119k|    tz = _c[tor[1]+2];
  290|   119k|    vector<int>::iterator i;
  291|  68.8M|    for (i = atoms.begin(); i != atoms.end(); ++i)
  ------------------
  |  Branch (291:29): [True: 68.7M, False: 119k]
  ------------------
  292|  68.7M|      {
  293|  68.7M|        j = *i;
  294|       |
  295|  68.7M|        _c[j] -= tx;
  296|  68.7M|        _c[j+1] -= ty;
  297|  68.7M|        _c[j+2]-= tz;
  298|  68.7M|        x = _c[j]*m[0] + _c[j+1]*m[1] + _c[j+2]*m[2];
  299|  68.7M|        y = _c[j]*m[3] + _c[j+1]*m[4] + _c[j+2]*m[5];
  300|  68.7M|        z = _c[j]*m[6] + _c[j+1]*m[7] + _c[j+2]*m[8];
  301|  68.7M|        _c[j] = x;
  302|  68.7M|        _c[j+1] = y;
  303|  68.7M|        _c[j+2] = z;
  304|  68.7M|        _c[j] += tx;
  305|  68.7M|        _c[j+1] += ty;
  306|  68.7M|        _c[j+2] += tz;
  307|  68.7M|      }
  308|   119k|  }
_ZN9OpenBabel5OBMol10GetTorsionEPNS_6OBAtomES2_S2_S2_:
  312|  2.34k|  {
  313|  2.34k|    if (!IsPeriodic())
  ------------------
  |  Branch (313:9): [True: 2.34k, False: 0]
  ------------------
  314|  2.34k|      {
  315|  2.34k|        return(CalcTorsionAngle(a->GetVector(),
  316|  2.34k|                                b->GetVector(),
  317|  2.34k|                                c->GetVector(),
  318|  2.34k|                                d->GetVector()));
  319|  2.34k|      }
  320|      0|    else
  321|      0|      {
  322|      0|        vector3 v1, v2, v3, v4;
  323|       |        // Wrap the atomic positions in a continuous chain that makes sense based on the unit cell
  324|       |        // Start by extracting the absolute Cartesian coordinates
  325|      0|        v1 = a->GetVector();
  326|      0|        v2 = b->GetVector();
  327|      0|        v3 = c->GetVector();
  328|      0|        v4 = d->GetVector();
  329|       |        // Then redefine the positions based on proximity to the previous atom
  330|       |        // to build a continuous chain of expanded Cartesian coordinates
  331|      0|        OBUnitCell *unitCell = (OBUnitCell * ) GetData(OBGenericDataType::UnitCell);
  332|      0|        v2 = unitCell->UnwrapCartesianNear(v2, v1);
  333|      0|        v3 = unitCell->UnwrapCartesianNear(v3, v2);
  334|      0|        v4 = unitCell->UnwrapCartesianNear(v4, v3);
  335|      0|        return(CalcTorsionAngle(v1, v2, v3, v4));
  336|      0|      }
  337|  2.34k|  }
_ZN9OpenBabel5OBMol10FindAnglesEv:
  392|  9.31k|  {
  393|       |    //if already has data return
  394|  9.31k|    if(HasData(OBGenericDataType::AngleData))
  ------------------
  |  Branch (394:8): [True: 373, False: 8.94k]
  ------------------
  395|    373|      return;
  396|       |
  397|       |    //get new data and attach it to molecule
  398|  8.94k|    OBAngleData *angles = new OBAngleData;
  399|  8.94k|    angles->SetOrigin(perceived);
  400|  8.94k|    SetData(angles);
  401|       |
  402|  8.94k|    OBAngle angle;
  403|  8.94k|    OBAtom *b;
  404|  8.94k|    int unique_angle;
  405|       |
  406|  8.94k|    unique_angle = 0;
  407|       |
  408|   394k|    FOR_ATOMS_OF_MOL(atom, this) {
  ------------------
  |  |  417|  8.94k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 394k, False: 8.94k]
  |  |  ------------------
  ------------------
  409|   394k|      if(atom->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (409:10): [True: 6.27k, False: 388k]
  ------------------
  410|  6.27k|        continue;
  411|       |
  412|   388k|      b = (OBAtom*) &*atom;
  413|       |
  414|   571k|      FOR_NBORS_OF_ATOM(a, b) {
  ------------------
  |  |  419|   388k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 571k, False: 388k]
  |  |  ------------------
  ------------------
  415|  1.55M|        FOR_NBORS_OF_ATOM(c, b) {
  ------------------
  |  |  419|   571k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.55M, False: 571k]
  |  |  ------------------
  ------------------
  416|  1.55M|          if(&*a == &*c) {
  ------------------
  |  Branch (416:14): [True: 571k, False: 986k]
  ------------------
  417|   571k|            unique_angle = 1;
  418|   571k|            continue;
  419|   571k|          }
  420|       |
  421|   986k|          if (unique_angle) {
  ------------------
  |  Branch (421:15): [True: 493k, False: 493k]
  ------------------
  422|   493k|            angle.SetAtoms((OBAtom*)b, (OBAtom*)&*a, (OBAtom*)&*c);
  423|   493k|            angles->SetData(angle);
  424|   493k|            angle.Clear();
  425|   493k|          }
  426|   986k|        }
  427|   571k|        unique_angle = 0;
  428|   571k|      }
  429|   388k|    }
  430|       |
  431|  8.94k|    return;
  432|  9.31k|  }
_ZN9OpenBabel5OBMol12FindTorsionsEv:
  435|  9.31k|  {
  436|       |    //if already has data return
  437|  9.31k|    if(HasData(OBGenericDataType::TorsionData))
  ------------------
  |  Branch (437:8): [True: 0, False: 9.31k]
  ------------------
  438|      0|      return;
  439|       |
  440|       |    //get new data and attach it to molecule
  441|  9.31k|    OBTorsionData *torsions = new OBTorsionData;
  442|  9.31k|    torsions->SetOrigin(perceived);
  443|  9.31k|    SetData(torsions);
  444|       |
  445|  9.31k|    OBTorsion torsion;
  446|  9.31k|    vector<OBBond*>::iterator bi1,bi2,bi3;
  447|  9.31k|    OBBond* bond;
  448|  9.31k|    OBAtom *a,*b,*c,*d;
  449|       |
  450|       |    //loop through all bonds generating torsions
  451|   296k|    for(bond = BeginBond(bi1);bond;bond = NextBond(bi1))
  ------------------
  |  Branch (451:31): [True: 287k, False: 9.31k]
  ------------------
  452|   287k|      {
  453|   287k|        b = bond->GetBeginAtom();
  454|   287k|        c = bond->GetEndAtom();
  455|   287k|        if(b->GetAtomicNum() == OBElements::Hydrogen || c->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (455:12): [True: 1.34k, False: 285k]
  |  Branch (455:57): [True: 1.14k, False: 284k]
  ------------------
  456|  2.48k|          continue;
  457|       |
  458|  1.05M|        for(a = b->BeginNbrAtom(bi2);a;a = b->NextNbrAtom(bi2))
  ------------------
  |  Branch (458:38): [True: 766k, False: 284k]
  ------------------
  459|   766k|          {
  460|   766k|            if(a == c)
  ------------------
  |  Branch (460:16): [True: 284k, False: 481k]
  ------------------
  461|   284k|              continue;
  462|       |
  463|  2.31M|            for(d = c->BeginNbrAtom(bi3);d;d = c->NextNbrAtom(bi3))
  ------------------
  |  Branch (463:42): [True: 1.83M, False: 481k]
  ------------------
  464|  1.83M|              {
  465|  1.83M|                if ((d == b) || (d == a))
  ------------------
  |  Branch (465:21): [True: 481k, False: 1.35M]
  |  Branch (465:33): [True: 110k, False: 1.24M]
  ------------------
  466|   592k|                  continue;
  467|  1.24M|                torsion.AddTorsion(a,b,c,d);
  468|  1.24M|              }
  469|   481k|          }
  470|       |        //add torsion to torsionData
  471|   284k|        if(torsion.GetSize())
  ------------------
  |  Branch (471:12): [True: 265k, False: 18.9k]
  ------------------
  472|   265k|          torsions->SetData(torsion);
  473|   284k|        torsion.Clear();
  474|   284k|      }
  475|       |
  476|  9.31k|    return;
  477|  9.31k|  }
_ZN9OpenBabel5OBMol12FindChildrenERNSt3__16vectorIiNS1_9allocatorIiEEEEii:
  563|   119k|  {
  564|   119k|    int i;
  565|   119k|    OBBitVec used,curr,next;
  566|       |
  567|   119k|    used.SetBitOn(first);
  568|   119k|    used.SetBitOn(second);
  569|   119k|    curr.SetBitOn(second);
  570|       |
  571|   119k|    OBAtom *atom;
  572|  11.4M|    while (!curr.IsEmpty())
  ------------------
  |  Branch (572:12): [True: 11.3M, False: 119k]
  ------------------
  573|  11.3M|      {
  574|  11.3M|        next.Clear();
  575|  80.2M|        for (i = curr.NextBit(-1);i != curr.EndBit();i = curr.NextBit(i))
  ------------------
  |  Branch (575:35): [True: 68.8M, False: 11.3M]
  ------------------
  576|  68.8M|          {
  577|  68.8M|            atom = GetAtom(i);
  578|  68.8M|            FOR_BONDS_OF_ATOM (bond, atom)
  ------------------
  |  |  420|  68.8M|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 137M, False: 68.8M]
  |  |  ------------------
  ------------------
  579|   137M|              if (!used.BitIsSet(bond->GetNbrAtomIdx(atom)))
  ------------------
  |  Branch (579:19): [True: 68.7M, False: 68.9M]
  ------------------
  580|  68.7M|                next.SetBitOn(bond->GetNbrAtomIdx(atom));
  581|  68.8M|          }
  582|       |
  583|  11.3M|        used |= next;
  584|  11.3M|        curr = next;
  585|  11.3M|      }
  586|       |
  587|   119k|    used.SetBitOff(first);
  588|   119k|    used.SetBitOff(second);
  589|   119k|    used.ToVecInt(children);
  590|   119k|  }
_ZNK9OpenBabel5OBMol11NumHvyAtomsEv:
  817|  8.89k|  {
  818|  8.89k|    const OBAtom *atom;
  819|  8.89k|    vector<OBAtom*>::const_iterator(i);
  820|  8.89k|    unsigned int count = 0;
  821|       |
  822|   402k|    for(atom = this->BeginAtom(i); atom; atom = this->NextAtom(i))
  ------------------
  |  Branch (822:36): [True: 393k, False: 8.89k]
  ------------------
  823|   393k|      {
  824|   393k|        if (atom->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (824:13): [True: 387k, False: 6.19k]
  ------------------
  825|   387k|          count++;
  826|   393k|      }
  827|       |
  828|  8.89k|    return(count);
  829|  8.89k|  }
_ZNK9OpenBabel5OBMol7GetAtomEi:
  841|   538M|  {
  842|   538M|    if ((unsigned)idx < 1 || (unsigned)idx > NumAtoms())
  ------------------
  |  Branch (842:9): [True: 650, False: 538M]
  |  Branch (842:30): [True: 288, False: 538M]
  ------------------
  843|    938|      {
  844|    938|        obErrorLog.ThrowError(__FUNCTION__, "Requested Atom Out of Range", obDebug);
  845|    938|        return nullptr;
  846|    938|      }
  847|       |
  848|   538M|    return((OBAtom*)_vatom[idx-1]);
  849|   538M|  }
_ZNK9OpenBabel5OBMol11GetAtomByIdEm:
  852|   941k|  {
  853|   941k|    if (id >= _atomIds.size()) {
  ------------------
  |  Branch (853:9): [True: 13.6k, False: 928k]
  ------------------
  854|  13.6k|      obErrorLog.ThrowError(__FUNCTION__, "Requested atom with invalid id.", obDebug);
  855|  13.6k|      return nullptr;
  856|  13.6k|    }
  857|       |
  858|   928k|    return((OBAtom*)_atomIds[id]);
  859|   941k|  }
_ZNK9OpenBabel5OBMol7GetBondEi:
  869|  1.50M|  {
  870|  1.50M|    if (idx < 0 || (unsigned)idx >= NumBonds())
  ------------------
  |  Branch (870:9): [True: 0, False: 1.50M]
  |  Branch (870:20): [True: 1, False: 1.50M]
  ------------------
  871|      1|      {
  872|      1|        obErrorLog.ThrowError(__FUNCTION__, "Requested Bond Out of Range", obDebug);
  873|      1|        return nullptr;
  874|      1|      }
  875|       |
  876|  1.50M|    return((OBBond*)_vbond[idx]);
  877|  1.50M|  }
_ZNK9OpenBabel5OBMol11GetBondByIdEm:
  880|   102k|  {
  881|   102k|    if (id >= _bondIds.size()) {
  ------------------
  |  Branch (881:9): [True: 0, False: 102k]
  ------------------
  882|      0|      obErrorLog.ThrowError(__FUNCTION__, "Requested bond with invalid id.", obDebug);
  883|      0|      return nullptr;
  884|      0|    }
  885|       |
  886|   102k|    return((OBBond*)_bondIds[id]);
  887|   102k|  }
_ZNK9OpenBabel5OBMol7GetBondEii:
  890|  69.5M|  {
  891|  69.5M|    return(GetBond(GetAtom(bgn),GetAtom(end)));
  892|  69.5M|  }
_ZNK9OpenBabel5OBMol7GetBondEPNS_6OBAtomES2_:
  895|   509M|  {
  896|   509M|    OBAtom *nbr;
  897|   509M|    vector<OBBond*>::iterator i;
  898|       |
  899|   509M|    if (!bgn || !end) return nullptr;
  ------------------
  |  Branch (899:9): [True: 0, False: 509M]
  |  Branch (899:17): [True: 0, False: 509M]
  ------------------
  900|       |
  901|  2.96G|    for (nbr = bgn->BeginNbrAtom(i);nbr;nbr = bgn->NextNbrAtom(i))
  ------------------
  |  Branch (901:37): [True: 2.95G, False: 13.6M]
  ------------------
  902|  2.95G|      if (nbr == end)
  ------------------
  |  Branch (902:11): [True: 495M, False: 2.45G]
  ------------------
  903|   495M|        return((OBBond *)*i);
  904|       |
  905|  13.6M|    return nullptr; //just to keep the SGI compiler happy
  906|   509M|  }
_ZNK9OpenBabel5OBMol10GetResidueEi:
  909|   791k|  {
  910|   791k|    if (idx < 0 || (unsigned)idx >= NumResidues())
  ------------------
  |  Branch (910:9): [True: 0, False: 791k]
  |  Branch (910:20): [True: 0, False: 791k]
  ------------------
  911|      0|      {
  912|      0|        obErrorLog.ThrowError(__FUNCTION__, "Requested Residue Out of Range", obDebug);
  913|      0|        return nullptr;
  914|      0|      }
  915|       |
  916|   791k|    return (_residue[idx]);
  917|   791k|  }
_ZN9OpenBabel5OBMol7GetSSSREv:
  935|  1.86M|  {
  936|  1.86M|    if (!HasSSSRPerceived())
  ------------------
  |  Branch (936:9): [True: 253k, False: 1.60M]
  ------------------
  937|   253k|      FindSSSR();
  938|       |
  939|       |    // SDF / MDL files can inject "<SSSR>" as a property field, which
  940|       |    // ends up stored as an OBPairData under that attribute. The legacy
  941|       |    // C-style cast misinterpreted it as OBRingData (UBSAN catches the
  942|       |    // vptr mismatch). Validate the type and replace if wrong.
  943|  1.86M|    OBGenericData *existing = GetData("SSSR");
  944|  1.86M|    OBRingData *rd = dynamic_cast<OBRingData *>(existing);
  945|  1.86M|    if (rd == nullptr) {
  ------------------
  |  Branch (945:9): [True: 244k, False: 1.61M]
  ------------------
  946|   244k|      if (existing) DeleteData(existing);
  ------------------
  |  Branch (946:11): [True: 20, False: 244k]
  ------------------
  947|   244k|      rd = new OBRingData();
  948|   244k|      rd->SetAttribute("SSSR");
  949|   244k|      SetData(rd);
  950|   244k|    }
  951|  1.86M|    rd->SetOrigin(perceived);
  952|  1.86M|    return(rd->GetData());
  953|  1.86M|  }
_ZN9OpenBabel5OBMol7GetLSSREv:
  956|  52.6k|  {
  957|  52.6k|    if (!HasLSSRPerceived())
  ------------------
  |  Branch (957:9): [True: 40.7k, False: 11.8k]
  ------------------
  958|  40.7k|      FindLSSR();
  959|       |
  960|       |    // Same type-confusion guard as GetSSSR().
  961|  52.6k|    OBGenericData *existing = GetData("LSSR");
  962|  52.6k|    OBRingData *rd = dynamic_cast<OBRingData *>(existing);
  963|  52.6k|    if (rd == nullptr) {
  ------------------
  |  Branch (963:9): [True: 32.9k, False: 19.6k]
  ------------------
  964|  32.9k|      if (existing) DeleteData(existing);
  ------------------
  |  Branch (964:11): [True: 0, False: 32.9k]
  ------------------
  965|  32.9k|      rd = new OBRingData();
  966|  32.9k|      rd->SetAttribute("LSSR");
  967|  32.9k|      SetData(rd);
  968|  32.9k|    }
  969|  52.6k|    rd->SetOrigin(perceived);
  970|  52.6k|    return(rd->GetData());
  971|  52.6k|  }
_ZN9OpenBabel5OBMol8GetMolWtEb:
  974|  8.89k|  {
  975|  8.89k|    double molwt=0.0;
  976|  8.89k|    OBAtom *atom;
  977|  8.89k|    vector<OBAtom*>::iterator i;
  978|       |
  979|  8.89k|    double hmass = OBElements::GetMass(1);
  980|   402k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i)) {
  ------------------
  |  Branch (980:30): [True: 393k, False: 8.89k]
  ------------------
  981|   393k|      molwt += atom->GetAtomicMass();
  982|   393k|      if (implicitH)
  ------------------
  |  Branch (982:11): [True: 393k, False: 0]
  ------------------
  983|   393k|        molwt += atom->GetImplicitHCount() * hmass;
  984|   393k|    }
  985|  8.89k|    return(molwt);
  986|  8.89k|  }
_ZN9OpenBabel5OBMol12GetExactMassEb:
  989|  8.89k|  {
  990|  8.89k|    double mass=0.0;
  991|  8.89k|    OBAtom *atom;
  992|  8.89k|    vector<OBAtom*>::iterator i;
  993|       |
  994|  8.89k|    double hmass = OBElements::GetExactMass(1, 1);
  995|   402k|    for (atom = BeginAtom(i); atom; atom = NextAtom(i)) {
  ------------------
  |  Branch (995:31): [True: 393k, False: 8.89k]
  ------------------
  996|   393k|      mass += atom->GetExactMass();
  997|   393k|      if (implicitH)
  ------------------
  |  Branch (997:11): [True: 393k, False: 0]
  ------------------
  998|   393k|        mass += atom->GetImplicitHCount() * hmass;
  999|   393k|    }
 1000|       |
 1001|  8.89k|    return(mass);
 1002|  8.89k|  }
_ZN9OpenBabel5OBMol16GetSpacedFormulaEiPKcb:
 1008|  8.89k|  {
 1009|       |    //Default ones=0, sp=" ".
 1010|       |    //Using ones=1 and sp="" will give unspaced formula (and no pair data entry)
 1011|       |    // These are the atomic numbers of the elements in alphabetical order, plus
 1012|       |    // pseudo atomic numbers for D, T isotopes.
 1013|  8.89k|    const int NumElements = 118 + 2;
 1014|  8.89k|    const int alphabetical[NumElements] = {
 1015|  8.89k|      89, 47, 13, 95, 18, 33, 85, 79, 5, 56, 4, 107, 83, 97, 35, 6, 20, 48,
 1016|  8.89k|      58, 98, 17, 96, 112, 27, 24, 55, 29, NumElements-1,
 1017|  8.89k|      105, 110, 66, 68, 99, 63, 9, 26, 114, 100, 87, 31,
 1018|  8.89k|      64, 32, 1, 2, 72, 80, 67, 108, 53, 49, 77, 19, 36, 57, 3, 103, 71, 116, 115, 101,
 1019|  8.89k|      12, 25, 42, 109, 7, 11, 41, 60, 10, 113, 28, 102, 93, 8, 118, 76, 15, 91, 82, 46,
 1020|  8.89k|      61, 84, 59, 78, 94, 88, 37, 75, 104, 111, 45, 86, 44, 16, 51, 21, 34, 106, 14,
 1021|  8.89k|      62, 50, 38, NumElements, 73, 65, 43, 52, 90, 22, 81, 69, 117, 92, 23, 74, 54, 39, 70,
 1022|  8.89k|      30, 40 };
 1023|       |
 1024|  8.89k|    int atomicCount[NumElements];
 1025|  8.89k|    stringstream formula;
 1026|       |
 1027|  1.07M|    for (int i = 0; i < NumElements; ++i)
  ------------------
  |  Branch (1027:21): [True: 1.06M, False: 8.89k]
  ------------------
 1028|  1.06M|      atomicCount[i] = 0;
 1029|       |
 1030|  8.89k|    bool UseImplicitH = (NumBonds()!=0 || NumAtoms()==1);
  ------------------
  |  Branch (1030:26): [True: 6.09k, False: 2.79k]
  |  Branch (1030:43): [True: 2.27k, False: 525]
  ------------------
 1031|       |    // Do not use implicit hydrogens if explicitly required not to
 1032|  8.89k|    if (!implicitH) UseImplicitH = false;
  ------------------
  |  Branch (1032:9): [True: 0, False: 8.89k]
  ------------------
 1033|  8.89k|    bool HasHvyAtoms = NumHvyAtoms()>0;
 1034|  8.89k|    FOR_ATOMS_OF_MOL(a, *this)
  ------------------
  |  |  417|  8.89k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 393k, False: 8.89k]
  |  |  ------------------
  ------------------
 1035|   393k|      {
 1036|   393k|        int anum = a->GetAtomicNum();
 1037|   393k|        if(anum==0)
  ------------------
  |  Branch (1037:12): [True: 54.0k, False: 339k]
  ------------------
 1038|  54.0k|          continue;
 1039|   339k|        if(anum > (NumElements-2)) {
  ------------------
  |  Branch (1039:12): [True: 4, False: 339k]
  ------------------
 1040|      4|          char buffer[BUFF_SIZE];  // error buffer
 1041|      4|          snprintf(buffer, BUFF_SIZE, "Skipping unknown element with atomic number %d", anum);
  ------------------
  |  |  771|      4|#define BUFF_SIZE 32768
  ------------------
 1042|      4|          obErrorLog.ThrowError(__FUNCTION__, buffer, obWarning);
 1043|      4|          continue;
 1044|      4|        }
 1045|   339k|        unsigned int iso = a->GetIsotope();
 1046|   339k|        bool IsHiso = anum == 1 && (iso == 2 || iso == 3);
  ------------------
  |  Branch (1046:23): [True: 6.19k, False: 333k]
  |  Branch (1046:37): [True: 57, False: 6.13k]
  |  Branch (1046:49): [True: 35, False: 6.09k]
  ------------------
 1047|   339k|        if(UseImplicitH)
  ------------------
  |  Branch (1047:12): [True: 333k, False: 6.70k]
  ------------------
 1048|   333k|          {
 1049|   333k|            if (anum == 1 && !IsHiso && HasHvyAtoms)
  ------------------
  |  Branch (1049:17): [True: 6.05k, False: 327k]
  |  Branch (1049:30): [True: 5.99k, False: 56]
  |  Branch (1049:41): [True: 5.91k, False: 78]
  ------------------
 1050|  5.91k|              continue; // skip explicit hydrogens except D,T
 1051|   327k|            if(anum==1)
  ------------------
  |  Branch (1051:16): [True: 134, False: 327k]
  ------------------
 1052|    134|              {
 1053|    134|                if (IsHiso && HasHvyAtoms)
  ------------------
  |  Branch (1053:21): [True: 56, False: 78]
  |  Branch (1053:31): [True: 49, False: 7]
  ------------------
 1054|     49|                  --atomicCount[0]; //one of the implicit hydrogens is now explicit
 1055|    134|              }
 1056|   327k|            else
 1057|   327k|              atomicCount[0] += a->GetImplicitHCount() + a->ExplicitHydrogenCount();
 1058|   327k|          }
 1059|   333k|        if (IsHiso)
  ------------------
  |  Branch (1059:13): [True: 92, False: 333k]
  ------------------
 1060|     92|          anum = NumElements + iso - 3; //pseudo AtNo for D, T
 1061|   333k|        atomicCount[anum - 1]++;
 1062|   333k|      }
 1063|       |
 1064|  8.89k|    if (atomicCount[5] != 0) // Carbon (i.e. 6 - 1 = 5)
  ------------------
  |  Branch (1064:9): [True: 1.73k, False: 7.16k]
  ------------------
 1065|  1.73k|      {
 1066|  1.73k|        if (atomicCount[5] > ones)
  ------------------
  |  Branch (1066:13): [True: 1.28k, False: 451]
  ------------------
 1067|  1.28k|          formula << "C" << sp << atomicCount[5] << sp;
 1068|    451|        else if (atomicCount[5] == 1)
  ------------------
  |  Branch (1068:18): [True: 451, False: 0]
  ------------------
 1069|    451|          formula << "C";
 1070|       |
 1071|  1.73k|        atomicCount[5] = 0; // So we don't output C twice
 1072|       |
 1073|       |        // only output H if there's also carbon -- otherwise do it alphabetical
 1074|  1.73k|        if (atomicCount[0] != 0) // Hydrogen (i.e., 1 - 1 = 0)
  ------------------
  |  Branch (1074:13): [True: 1.65k, False: 81]
  ------------------
 1075|  1.65k|          {
 1076|  1.65k|            if (atomicCount[0] > ones)
  ------------------
  |  Branch (1076:17): [True: 1.58k, False: 67]
  ------------------
 1077|  1.58k|              formula << "H" << sp << atomicCount[0] << sp;
 1078|     67|            else if (atomicCount[0] == 1)
  ------------------
  |  Branch (1078:22): [True: 66, False: 1]
  ------------------
 1079|     66|              formula << "H";
 1080|       |
 1081|  1.65k|            atomicCount[0] = 0;
 1082|  1.65k|          }
 1083|  1.73k|      }
 1084|       |
 1085|  1.07M|    for (int j = 0; j < NumElements; ++j)
  ------------------
  |  Branch (1085:21): [True: 1.06M, False: 8.89k]
  ------------------
 1086|  1.06M|      {
 1087|  1.06M|        char DT[4] = {'D',0,'T',0};
 1088|  1.06M|        const char* symb;
 1089|  1.06M|        int alph = alphabetical[j]-1;
 1090|  1.06M|        if (atomicCount[ alph ])
  ------------------
  |  Branch (1090:13): [True: 24.0k, False: 1.04M]
  ------------------
 1091|  24.0k|          {
 1092|  24.0k|            if(alph==NumElements-1)
  ------------------
  |  Branch (1092:16): [True: 9, False: 24.0k]
  ------------------
 1093|      9|              symb = DT + 2;//T
 1094|  24.0k|            else if (alph==NumElements-2)
  ------------------
  |  Branch (1094:22): [True: 18, False: 24.0k]
  ------------------
 1095|     18|              symb = DT; //D
 1096|  24.0k|            else
 1097|  24.0k|              symb = OBElements::GetSymbol(alphabetical[j]);
 1098|       |
 1099|  24.0k|            formula << symb << sp;
 1100|  24.0k|            if(atomicCount[alph] > ones)
  ------------------
  |  Branch (1100:16): [True: 14.8k, False: 9.15k]
  ------------------
 1101|  14.8k|              formula << atomicCount[alph] << sp;
 1102|  24.0k|          }
 1103|  1.06M|      }
 1104|       |
 1105|  8.89k|    int chg = GetTotalCharge();
 1106|  8.89k|    char ch = chg>0 ? '+' : '-' ;
  ------------------
  |  Branch (1106:15): [True: 821, False: 8.07k]
  ------------------
 1107|  8.89k|    chg = abs(chg);
 1108|  31.4k|    while(chg--)
  ------------------
  |  Branch (1108:11): [True: 22.5k, False: 8.89k]
  ------------------
 1109|  22.5k|      formula << ch << sp;
 1110|       |
 1111|  8.89k|    string f_str = formula.str();
 1112|  8.89k|    return (Trim(f_str));
 1113|  8.89k|  }
_ZN9OpenBabel5OBMol10GetFormulaEv:
 1120|  8.89k|  {
 1121|  8.89k|    string attr = "Formula";
 1122|  8.89k|    OBPairData *dp = (OBPairData *) GetData(attr);
 1123|       |
 1124|  8.89k|    if (dp != nullptr) // we already set the formula (or it was read from a file)
  ------------------
  |  Branch (1124:9): [True: 0, False: 8.89k]
  ------------------
 1125|      0|      return dp->GetValue();
 1126|       |
 1127|  8.89k|    obErrorLog.ThrowError(__FUNCTION__,
 1128|  8.89k|                          "Ran OpenBabel::SetFormula -- Hill order formula",
 1129|  8.89k|                          obAuditMsg);
 1130|       |
 1131|  8.89k|    string sformula = GetSpacedFormula(1, "");
 1132|       |
 1133|  8.89k|    dp = new OBPairData;
 1134|  8.89k|    dp->SetAttribute(attr);
 1135|  8.89k|    dp->SetValue( sformula );
 1136|  8.89k|    dp->SetOrigin( perceived ); // internal generation
 1137|  8.89k|    SetData(dp);
 1138|  8.89k|    return sformula;
 1139|  8.89k|  }
_ZN9OpenBabel5OBMol14SetTotalChargeEi:
 1157|   615k|  {
 1158|   615k|    SetFlag(OB_TCHARGE_MOL);
  ------------------
  |  |   95|   615k|#define OB_TCHARGE_MOL		       (1<<16)
  ------------------
 1159|   615k|    _totalCharge = charge;
 1160|   615k|  }
_ZN9OpenBabel5OBMol14GetTotalChargeEv:
 1168|  1.24M|  {
 1169|  1.24M|    if(HasFlag(OB_TCHARGE_MOL))
  ------------------
  |  |   95|  1.24M|#define OB_TCHARGE_MOL		       (1<<16)
  ------------------
  |  Branch (1169:8): [True: 0, False: 1.24M]
  ------------------
 1170|      0|      return(_totalCharge);
 1171|  1.24M|    else // calculate from atomic formal charges (seems the best default)
 1172|  1.24M|      {
 1173|  1.24M|        obErrorLog.ThrowError(__FUNCTION__,
 1174|  1.24M|                              "Ran OpenBabel::GetTotalCharge -- calculated from formal charges",
 1175|  1.24M|                              obAuditMsg);
 1176|       |
 1177|  1.24M|        OBAtom *atom;
 1178|  1.24M|        vector<OBAtom*>::iterator i;
 1179|  1.24M|        int chg = 0;
 1180|       |
 1181|  17.3M|        for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (1181:34): [True: 16.0M, False: 1.24M]
  ------------------
 1182|  16.0M|          chg += atom->GetFormalCharge();
 1183|  1.24M|        return (chg);
 1184|  1.24M|      }
 1185|  1.24M|  }
_ZN9OpenBabel5OBMol24SetTotalSpinMultiplicityEj:
 1188|   615k|  {
 1189|   615k|    SetFlag(OB_TSPIN_MOL);
  ------------------
  |  |   97|   615k|#define OB_TSPIN_MOL             (1<<17)
  ------------------
 1190|   615k|    _totalSpin = spin;
 1191|   615k|  }
_ZN9OpenBabel5OBMol24GetTotalSpinMultiplicityEv:
 1218|   615k|  {
 1219|   615k|    if (HasFlag(OB_TSPIN_MOL))
  ------------------
  |  |   97|   615k|#define OB_TSPIN_MOL             (1<<17)
  ------------------
  |  Branch (1219:9): [True: 0, False: 615k]
  ------------------
 1220|      0|      return(_totalSpin);
 1221|   615k|    else // calculate from atomic spin information (assuming high-spin case)
 1222|   615k|      {
 1223|   615k|        obErrorLog.ThrowError(__FUNCTION__,
 1224|   615k|                              "Ran OpenBabel::GetTotalSpinMultiplicity -- calculating from atomic spins assuming high spin case",
 1225|   615k|                              obAuditMsg);
 1226|       |
 1227|   615k|        OBAtom *atom;
 1228|   615k|        vector<OBAtom*>::iterator i;
 1229|   615k|        unsigned int unpaired_electrons = 0;
 1230|   615k|        int chg = GetTotalCharge();
 1231|  8.45M|        for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (1231:34): [True: 7.83M, False: 615k]
  ------------------
 1232|  7.83M|          {
 1233|  7.83M|            if (atom->GetSpinMultiplicity() > 1)
  ------------------
  |  Branch (1233:17): [True: 128, False: 7.83M]
  ------------------
 1234|    128|              unpaired_electrons += (atom->GetSpinMultiplicity() - 1);
 1235|  7.83M|           chg += static_cast<int>(atom->GetAtomicNum());
 1236|  7.83M|          }
 1237|   615k|        if (chg % 2 != unpaired_electrons %2)
  ------------------
  |  Branch (1237:13): [True: 137k, False: 478k]
  ------------------
 1238|   137k|          return ((abs(chg) % 2) + 1);
 1239|   478k|        else
 1240|   478k|          return (unpaired_electrons + 1);
 1241|   615k|      }
 1242|   615k|  }
_ZN9OpenBabel5OBMolaSERKS0_:
 1251|   615k|  {
 1252|   615k|    if (this == &source)
  ------------------
  |  Branch (1252:9): [True: 0, False: 615k]
  ------------------
 1253|      0|      return *this;
 1254|       |
 1255|   615k|    OBMol &src = (OBMol &)source;
 1256|   615k|    vector<OBAtom*>::iterator i;
 1257|   615k|    vector<OBBond*>::iterator j;
 1258|   615k|    OBAtom *atom;
 1259|   615k|    OBBond *bond;
 1260|       |
 1261|   615k|    Clear();
 1262|   615k|    BeginModify();
 1263|       |
 1264|   615k|    _vatom.reserve(src.NumAtoms());
 1265|   615k|    _atomIds.reserve(src.NumAtoms());
 1266|   615k|    _vbond.reserve(src.NumBonds());
 1267|   615k|    _bondIds.reserve(src.NumBonds());
 1268|       |
 1269|  8.45M|    for (atom = src.BeginAtom(i);atom;atom = src.NextAtom(i))
  ------------------
  |  Branch (1269:34): [True: 7.83M, False: 615k]
  ------------------
 1270|  7.83M|      AddAtom(*atom);
 1271|  8.09M|    for (bond = src.BeginBond(j);bond;bond = src.NextBond(j))
  ------------------
  |  Branch (1271:34): [True: 7.47M, False: 615k]
  ------------------
 1272|  7.47M|      AddBond(*bond);
 1273|       |
 1274|   615k|    this->_title  = src.GetTitle();
 1275|   615k|    this->_energy = src.GetEnergy();
 1276|   615k|    this->_dimension = src.GetDimension();
 1277|   615k|    this->SetTotalCharge(src.GetTotalCharge()); //also sets a flag
 1278|   615k|    this->SetTotalSpinMultiplicity(src.GetTotalSpinMultiplicity()); //also sets a flag
 1279|       |
 1280|   615k|    EndModify(); //zeros flags!
 1281|       |
 1282|   615k|    if (src.HasFlag(OB_PATTERN_STRUCTURE))
  ------------------
  |  |  101|   615k|#define OB_PATTERN_STRUCTURE     (1<<19)
  ------------------
  |  Branch (1282:9): [True: 0, False: 615k]
  ------------------
 1283|      0|      this->SetFlag(OB_PATTERN_STRUCTURE);
  ------------------
  |  |  101|      0|#define OB_PATTERN_STRUCTURE     (1<<19)
  ------------------
 1284|   615k|    if (src.HasFlag(OB_TSPIN_MOL))
  ------------------
  |  |   97|   615k|#define OB_TSPIN_MOL             (1<<17)
  ------------------
  |  Branch (1284:9): [True: 0, False: 615k]
  ------------------
 1285|      0|      this->SetFlag(OB_TSPIN_MOL);
  ------------------
  |  |   97|      0|#define OB_TSPIN_MOL             (1<<17)
  ------------------
 1286|   615k|    if (src.HasFlag(OB_TCHARGE_MOL))
  ------------------
  |  |   95|   615k|#define OB_TCHARGE_MOL		       (1<<16)
  ------------------
  |  Branch (1286:9): [True: 0, False: 615k]
  ------------------
 1287|      0|      this->SetFlag(OB_TCHARGE_MOL);
  ------------------
  |  |   95|      0|#define OB_TCHARGE_MOL		       (1<<16)
  ------------------
 1288|   615k|    if (src.HasFlag(OB_PCHARGE_MOL))
  ------------------
  |  |   83|   615k|#define OB_PCHARGE_MOL           (1<<6)
  ------------------
  |  Branch (1288:9): [True: 0, False: 615k]
  ------------------
 1289|      0|      this->SetFlag(OB_PCHARGE_MOL);
  ------------------
  |  |   83|      0|#define OB_PCHARGE_MOL           (1<<6)
  ------------------
 1290|   615k|    if (src.HasFlag(OB_PERIODIC_MOL))
  ------------------
  |  |  109|   615k|#define OB_PERIODIC_MOL          (1<<23)
  ------------------
  |  Branch (1290:9): [True: 0, False: 615k]
  ------------------
 1291|      0|      this->SetFlag(OB_PERIODIC_MOL);
  ------------------
  |  |  109|      0|#define OB_PERIODIC_MOL          (1<<23)
  ------------------
 1292|   615k|    if (src.HasFlag(OB_HYBRID_MOL))
  ------------------
  |  |   85|   615k|#define OB_HYBRID_MOL            (1<<8)
  ------------------
  |  Branch (1292:9): [True: 14.5k, False: 601k]
  ------------------
 1293|  14.5k|      this->SetFlag(OB_HYBRID_MOL);
  ------------------
  |  |   85|  14.5k|#define OB_HYBRID_MOL            (1<<8)
  ------------------
 1294|   615k|    if (src.HasFlag(OB_AROMATIC_MOL))
  ------------------
  |  |   77|   615k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
  |  Branch (1294:9): [True: 613k, False: 2.45k]
  ------------------
 1295|   613k|      this->SetFlag(OB_AROMATIC_MOL);
  ------------------
  |  |   77|   613k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
 1296|   615k|    if (src.HasFlag(OB_CHAINS_MOL))
  ------------------
  |  |   93|   615k|#define OB_CHAINS_MOL            (1<<15)
  ------------------
  |  Branch (1296:9): [True: 329k, False: 286k]
  ------------------
 1297|   329k|      this->SetFlag(OB_CHAINS_MOL);
  ------------------
  |  |   93|   329k|#define OB_CHAINS_MOL            (1<<15)
  ------------------
 1298|       |    //this->_flags = src.GetFlags(); //Copy all flags. Perhaps too drastic a change
 1299|       |
 1300|       |
 1301|       |    //Copy Residue information
 1302|   615k|    unsigned int NumRes = src.NumResidues();
 1303|   615k|    if (NumRes)
  ------------------
  |  Branch (1303:9): [True: 334k, False: 281k]
  ------------------
 1304|   334k|      {
 1305|   334k|        unsigned int k;
 1306|   334k|        OBResidue *src_res = nullptr;
 1307|   334k|        OBResidue *res = nullptr;
 1308|   334k|        OBAtom *src_atom = nullptr;
 1309|   334k|        OBAtom *atom = nullptr;
 1310|   334k|        vector<OBAtom*>::iterator ii;
 1311|   849k|        for (k=0 ; k<NumRes ; ++k)
  ------------------
  |  Branch (1311:20): [True: 515k, False: 334k]
  ------------------
 1312|   515k|          {
 1313|   515k|            res = NewResidue();
 1314|   515k|            src_res = src.GetResidue(k);
 1315|   515k|            *res = *src_res; //does not copy atoms
 1316|  1.74M|            for (src_atom=src_res->BeginAtom(ii) ; src_atom ; src_atom=src_res->NextAtom(ii))
  ------------------
  |  Branch (1316:52): [True: 1.22M, False: 515k]
  ------------------
 1317|  1.22M|              {
 1318|  1.22M|                atom = GetAtom(src_atom->GetIdx());
 1319|  1.22M|                res->AddAtom(atom);
 1320|  1.22M|                res->SetAtomID(atom,src_res->GetAtomID(src_atom));
 1321|  1.22M|                res->SetHetAtom(atom,src_res->IsHetAtom(src_atom));
 1322|  1.22M|                res->SetSerialNum(atom,src_res->GetSerialNum(src_atom));
 1323|  1.22M|              }
 1324|   515k|          }
 1325|   334k|      }
 1326|       |
 1327|       |    //Copy conformer information
 1328|   615k|    if (src.NumConformers() > 1) {
  ------------------
  |  Branch (1328:9): [True: 0, False: 615k]
  ------------------
 1329|      0|      int k;//,l;
 1330|      0|      vector<double*> conf;
 1331|      0|      int currConf = -1;
 1332|      0|      double* xyz = nullptr;
 1333|      0|      for (k=0 ; k<src.NumConformers() ; ++k) {
  ------------------
  |  Branch (1333:18): [True: 0, False: 0]
  ------------------
 1334|      0|        xyz = new double [3*src.NumAtoms()];
 1335|      0|        memcpy( xyz, src.GetConformer(k), sizeof( double )*3*src.NumAtoms() );
 1336|      0|        conf.push_back(xyz);
 1337|       |
 1338|      0|        if( src.GetConformer(k) == src._c ) {
  ------------------
  |  Branch (1338:13): [True: 0, False: 0]
  ------------------
 1339|      0|          currConf = k;
 1340|      0|        }
 1341|      0|      }
 1342|       |
 1343|      0|      SetConformers(conf);
 1344|      0|      if( currConf >= 0 && _vconf.size() ) {
  ------------------
  |  Branch (1344:11): [True: 0, False: 0]
  |  Branch (1344:28): [True: 0, False: 0]
  ------------------
 1345|      0|        _c = _vconf[currConf];
 1346|      0|      }
 1347|      0|    }
 1348|       |
 1349|       |    //Copy all the OBGenericData, providing the new molecule, this,
 1350|       |    //for those classes like OBRotameterList which contain Atom pointers
 1351|       |    //OBGenericData classes can choose not to be cloned by returning NULL
 1352|   615k|    vector<OBGenericData*>::iterator itr;
 1353|   900k|    for(itr=src.BeginData();itr!=src.EndData();++itr)
  ------------------
  |  Branch (1353:29): [True: 284k, False: 615k]
  ------------------
 1354|   284k|      {
 1355|   284k|        OBGenericData* pCopiedData = (*itr)->Clone(this);
 1356|   284k|        SetData(pCopiedData);
 1357|   284k|      }
 1358|       |
 1359|   615k|    if (src.HasChiralityPerceived())
  ------------------
  |  Branch (1359:9): [True: 14.0k, False: 601k]
  ------------------
 1360|  14.0k|      SetChiralityPerceived();
 1361|       |
 1362|   615k|    return(*this);
 1363|   615k|  }
_ZN9OpenBabel5OBMol5ClearEv:
 1455|   875k|  {
 1456|   875k|    if (obErrorLog.GetOutputLevel() >= obAuditMsg)
  ------------------
  |  Branch (1456:9): [True: 0, False: 875k]
  ------------------
 1457|      0|      obErrorLog.ThrowError(__FUNCTION__,
 1458|      0|                            "Ran OpenBabel::Clear Molecule", obAuditMsg);
 1459|       |
 1460|       |    // Destroy residues first: ~OBResidue() walks its atom list to clear
 1461|       |    // back-pointers via SetResidue(nullptr). If atoms were destroyed
 1462|       |    // first, those calls would dereference dead pointers (UBSAN trips
 1463|       |    // in residue.cpp:853). The symmetric path in ~OBAtom() already
 1464|       |    // handles the reverse direction by checking _residue != nullptr.
 1465|   875k|    unsigned int ii;
 1466|  1.11M|    for (ii=0 ; ii<_residue.size() ; ++ii)
  ------------------
  |  Branch (1466:17): [True: 238k, False: 875k]
  ------------------
 1467|   238k|      {
 1468|   238k|        DestroyResidue(_residue[ii]);
 1469|   238k|      }
 1470|   875k|    _residue.clear();
 1471|       |
 1472|   875k|    vector<OBAtom*>::iterator i;
 1473|   875k|    vector<OBBond*>::iterator j;
 1474|  41.3M|    for (i = _vatom.begin();i != _vatom.end();++i)
  ------------------
  |  Branch (1474:29): [True: 40.4M, False: 875k]
  ------------------
 1475|  40.4M|      {
 1476|  40.4M|        DestroyAtom(*i);
 1477|  40.4M|        *i = nullptr;
 1478|  40.4M|      }
 1479|  39.8M|    for (j = _vbond.begin();j != _vbond.end();++j)
  ------------------
  |  Branch (1479:29): [True: 38.9M, False: 875k]
  ------------------
 1480|  38.9M|      {
 1481|  38.9M|        DestroyBond(*j);
 1482|  38.9M|        *j = nullptr;
 1483|  38.9M|      }
 1484|       |
 1485|   875k|    _atomIds.clear();
 1486|   875k|    _bondIds.clear();
 1487|   875k|    _natoms = _nbonds = 0;
 1488|       |
 1489|       |    //clear out the multiconformer data
 1490|   875k|    vector<double*>::iterator k;
 1491|   891k|    for (k = _vconf.begin();k != _vconf.end();++k)
  ------------------
  |  Branch (1491:29): [True: 16.3k, False: 875k]
  ------------------
 1492|  16.3k|      delete [] *k;
 1493|   875k|    _vconf.clear();
 1494|       |
 1495|       |    //Clear flags except OB_PATTERN_STRUCTURE which is left the same
 1496|   875k|    _flags &= OB_PATTERN_STRUCTURE;
  ------------------
  |  |  101|   875k|#define OB_PATTERN_STRUCTURE     (1<<19)
  ------------------
 1497|       |
 1498|   875k|    _c = nullptr;
 1499|   875k|    _mod = 0;
 1500|       |
 1501|       |    // Clean up generic data via the base class
 1502|   875k|    return(OBBase::Clear());
 1503|   875k|  }
_ZN9OpenBabel5OBMol11BeginModifyEv:
 1506|  4.35M|  {
 1507|       |    //suck coordinates from _c into _v for each atom
 1508|  4.35M|    if (!_mod && !Empty())
  ------------------
  |  Branch (1508:9): [True: 2.01M, False: 2.34M]
  |  Branch (1508:18): [True: 1.38M, False: 631k]
  ------------------
 1509|  1.38M|      {
 1510|  1.38M|        OBAtom *atom;
 1511|  1.38M|        vector<OBAtom*>::iterator i;
 1512|  1.60G|        for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (1512:34): [True: 1.59G, False: 1.38M]
  ------------------
 1513|  1.59G|          {
 1514|  1.59G|            atom->SetVector();
 1515|  1.59G|            atom->ClearCoordPtr();
 1516|  1.59G|          }
 1517|       |
 1518|  1.38M|        vector<double*>::iterator j;
 1519|  2.77M|        for (j = _vconf.begin();j != _vconf.end();++j)
  ------------------
  |  Branch (1519:33): [True: 1.38M, False: 1.38M]
  ------------------
 1520|  1.38M|          delete [] *j;
 1521|       |
 1522|  1.38M|        _c = nullptr;
 1523|  1.38M|        _vconf.clear();
 1524|       |
 1525|       |        //Destroy rotamer list if necessary
 1526|  1.38M|        if ((OBRotamerList *)GetData(OBGenericDataType::RotamerList))
  ------------------
  |  Branch (1526:13): [True: 0, False: 1.38M]
  ------------------
 1527|      0|          {
 1528|      0|            delete (OBRotamerList *)GetData(OBGenericDataType::RotamerList);
 1529|      0|            DeleteData(OBGenericDataType::RotamerList);
 1530|      0|          }
 1531|  1.38M|      }
 1532|       |
 1533|  4.35M|    _mod++;
 1534|  4.35M|  }
_ZN9OpenBabel5OBMol9EndModifyEb:
 1537|  4.35M|  {
 1538|  4.35M|    if (_mod == 0)
  ------------------
  |  Branch (1538:9): [True: 0, False: 4.35M]
  ------------------
 1539|      0|      {
 1540|      0|        obErrorLog.ThrowError(__FUNCTION__, "_mod is negative - EndModify() called too many times", obDebug);
 1541|      0|        return;
 1542|      0|      }
 1543|       |
 1544|  4.35M|    _mod--;
 1545|       |
 1546|  4.35M|    if (_mod)
  ------------------
  |  Branch (1546:9): [True: 2.34M, False: 2.01M]
  ------------------
 1547|  2.34M|      return;
 1548|       |
 1549|       |    // wipe all but whether it has aromaticity perceived, is a reaction, or has periodic boundaries enabled
 1550|  2.01M|    if (nukePerceivedData)
  ------------------
  |  Branch (1550:9): [True: 2.01M, False: 6.30k]
  ------------------
 1551|  2.01M|      _flags = _flags & (OB_AROMATIC_MOL|OB_REACTION_MOL|OB_PERIODIC_MOL);
  ------------------
  |  |   77|  2.01M|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
                    _flags = _flags & (OB_AROMATIC_MOL|OB_REACTION_MOL|OB_PERIODIC_MOL);
  ------------------
  |  |  107|  2.01M|#define OB_REACTION_MOL          (1<<22)
  ------------------
                    _flags = _flags & (OB_AROMATIC_MOL|OB_REACTION_MOL|OB_PERIODIC_MOL);
  ------------------
  |  |  109|  2.01M|#define OB_PERIODIC_MOL          (1<<23)
  ------------------
 1552|       |
 1553|  2.01M|    _c = nullptr;
 1554|       |
 1555|  2.01M|    if (Empty())
  ------------------
  |  Branch (1555:9): [True: 480, False: 2.01M]
  ------------------
 1556|    480|      return;
 1557|       |
 1558|       |    //if atoms present convert coords into array
 1559|  2.01M|    double *c = new double [NumAtoms()*3];
 1560|  2.01M|    _c = c;
 1561|       |
 1562|  2.01M|    unsigned int idx;
 1563|  2.01M|    OBAtom *atom;
 1564|  2.01M|    vector<OBAtom*>::iterator j;
 1565|  1.61G|    for (idx=0,atom = BeginAtom(j);atom;atom = NextAtom(j),++idx)
  ------------------
  |  Branch (1565:36): [True: 1.60G, False: 2.01M]
  ------------------
 1566|  1.60G|      {
 1567|  1.60G|        atom->SetIdx(idx+1);
 1568|  1.60G|        (atom->GetVector()).Get(&_c[idx*3]);
 1569|  1.60G|        atom->SetCoordPtr(&_c);
 1570|  1.60G|      }
 1571|  2.01M|    _vconf.push_back(c);
 1572|       |
 1573|       |    // Always remove angle and torsion data, since they will interfere with the iterators
 1574|       |    // PR#2812013
 1575|  2.01M|    DeleteData(OBGenericDataType::AngleData);
 1576|  2.01M|    DeleteData(OBGenericDataType::TorsionData);
 1577|  2.01M|  }
_ZN9OpenBabel5OBMol11DestroyAtomEPNS_6OBAtomE:
 1580|  48.6M|  {
 1581|  48.6M|    if (atom)
  ------------------
  |  Branch (1581:9): [True: 10.7M, False: 37.8M]
  ------------------
 1582|  10.7M|      {
 1583|  10.7M|        delete atom;
 1584|  10.7M|        atom = nullptr;
 1585|  10.7M|      }
 1586|  48.6M|  }
_ZN9OpenBabel5OBMol11DestroyBondEPNS_6OBBondE:
 1589|  50.3M|  {
 1590|  50.3M|    if (bond)
  ------------------
  |  Branch (1590:9): [True: 13.5M, False: 36.7M]
  ------------------
 1591|  13.5M|      {
 1592|  13.5M|        delete bond;
 1593|  13.5M|        bond = nullptr;
 1594|  13.5M|      }
 1595|  50.3M|  }
_ZN9OpenBabel5OBMol14DestroyResidueEPNS_9OBResidueE:
 1598|   775k|  {
 1599|   775k|    if (residue)
  ------------------
  |  Branch (1599:9): [True: 775k, False: 0]
  ------------------
 1600|   775k|      {
 1601|   775k|        delete residue;
 1602|   775k|        residue = nullptr;
 1603|   775k|      }
 1604|   775k|  }
_ZN9OpenBabel5OBMol7NewAtomEv:
 1607|  1.02M|  {
 1608|  1.02M|    return NewAtom(_atomIds.size());
 1609|  1.02M|  }
_ZN9OpenBabel5OBMol7NewAtomEm:
 1616|  1.02M|  {
 1617|       |    //   BeginModify();
 1618|       |
 1619|       |    // resize _atomIds if needed
 1620|  1.02M|    if (id >= _atomIds.size()) {
  ------------------
  |  Branch (1620:9): [True: 1.02M, False: 0]
  ------------------
 1621|  1.02M|      unsigned int size = _atomIds.size();
 1622|  1.02M|      _atomIds.resize(id+1);
 1623|  1.02M|      for (unsigned long i = size; i < id; ++i)
  ------------------
  |  Branch (1623:36): [True: 0, False: 1.02M]
  ------------------
 1624|      0|        _atomIds[i] = nullptr;
 1625|  1.02M|    }
 1626|       |
 1627|  1.02M|    if (_atomIds.at(id))
  ------------------
  |  Branch (1627:9): [True: 0, False: 1.02M]
  ------------------
 1628|      0|      return nullptr;
 1629|       |
 1630|  1.02M|    OBAtom *obatom = new OBAtom;
 1631|  1.02M|    obatom->SetIdx(_natoms+1);
 1632|  1.02M|    obatom->SetParent(this);
 1633|       |
 1634|  1.02M|    _atomIds[id] = obatom;
 1635|  1.02M|    obatom->SetId(id);
 1636|       |
 1637|  1.02M|#define OBAtomIncrement 100
 1638|       |
 1639|  1.02M|    if (_natoms+1 >= _vatom.size())
  ------------------
  |  Branch (1639:9): [True: 17.5k, False: 1.00M]
  ------------------
 1640|  17.5k|      {
 1641|  17.5k|        _vatom.resize(_natoms+OBAtomIncrement);
  ------------------
  |  | 1637|  17.5k|#define OBAtomIncrement 100
  ------------------
 1642|  17.5k|        vector<OBAtom*>::iterator j;
 1643|  1.75M|        for (j = _vatom.begin(),j+=(_natoms+1);j != _vatom.end();++j)
  ------------------
  |  Branch (1643:48): [True: 1.73M, False: 17.5k]
  ------------------
 1644|  1.73M|          *j = nullptr;
 1645|  17.5k|      }
 1646|  1.02M|#undef OBAtomIncrement
 1647|       |
 1648|       |
 1649|  1.02M|    _vatom[_natoms] = obatom;
 1650|  1.02M|    _natoms++;
 1651|       |
 1652|  1.02M|    if (HasData(OBGenericDataType::VirtualBondData))
  ------------------
  |  Branch (1652:9): [True: 0, False: 1.02M]
  ------------------
 1653|      0|      {
 1654|       |        /*add bonds that have been queued*/
 1655|      0|        OBVirtualBond *vb;
 1656|      0|        vector<OBGenericData*> verase;
 1657|      0|        vector<OBGenericData*>::iterator i;
 1658|      0|        for (i = BeginData();i != EndData();++i)
  ------------------
  |  Branch (1658:30): [True: 0, False: 0]
  ------------------
 1659|      0|          if ((*i)->GetDataType() == OBGenericDataType::VirtualBondData)
  ------------------
  |  Branch (1659:15): [True: 0, False: 0]
  ------------------
 1660|      0|            {
 1661|      0|              vb = (OBVirtualBond*)*i;
 1662|      0|              if (vb->GetBgn() > _natoms || vb->GetEnd() > _natoms)
  ------------------
  |  Branch (1662:19): [True: 0, False: 0]
  |  Branch (1662:45): [True: 0, False: 0]
  ------------------
 1663|      0|                continue;
 1664|      0|              if (obatom->GetIdx() == static_cast<unsigned int>(vb->GetBgn())
  ------------------
  |  Branch (1664:19): [True: 0, False: 0]
  ------------------
 1665|      0|                  || obatom->GetIdx() == static_cast<unsigned int>(vb->GetEnd()))
  ------------------
  |  Branch (1665:22): [True: 0, False: 0]
  ------------------
 1666|      0|                {
 1667|      0|                  AddBond(vb->GetBgn(),vb->GetEnd(),vb->GetOrder());
 1668|      0|                  verase.push_back(*i);
 1669|      0|                }
 1670|      0|            }
 1671|       |
 1672|      0|        if (!verase.empty())
  ------------------
  |  Branch (1672:13): [True: 0, False: 0]
  ------------------
 1673|      0|          DeleteData(verase);
 1674|      0|      }
 1675|       |
 1676|       |    // EndModify();
 1677|       |
 1678|  1.02M|    return(obatom);
 1679|  1.02M|  }
_ZN9OpenBabel5OBMol10NewResidueEv:
 1682|   775k|  {
 1683|   775k|    OBResidue *obresidue = new OBResidue;
 1684|   775k|    obresidue->SetIdx(_residue.size());
 1685|   775k|    _residue.push_back(obresidue);
 1686|   775k|    return(obresidue);
 1687|   775k|  }
_ZN9OpenBabel5OBMol7NewBondEv:
 1690|  2.17k|  {
 1691|  2.17k|    return NewBond(_bondIds.size());
 1692|  2.17k|  }
_ZN9OpenBabel5OBMol7NewBondEm:
 1699|  2.17k|  {
 1700|       |    // resize _bondIds if needed
 1701|  2.17k|    if (id >= _bondIds.size()) {
  ------------------
  |  Branch (1701:9): [True: 2.17k, False: 0]
  ------------------
 1702|  2.17k|      unsigned int size = _bondIds.size();
 1703|  2.17k|      _bondIds.resize(id+1);
 1704|  2.17k|      for (unsigned long i = size; i < id; ++i)
  ------------------
  |  Branch (1704:36): [True: 0, False: 2.17k]
  ------------------
 1705|      0|        _bondIds[i] = nullptr;
 1706|  2.17k|    }
 1707|       |
 1708|  2.17k|    if (_bondIds.at(id))
  ------------------
  |  Branch (1708:9): [True: 0, False: 2.17k]
  ------------------
 1709|      0|      return nullptr;
 1710|       |
 1711|  2.17k|    OBBond *pBond = new OBBond;
 1712|  2.17k|    pBond->SetParent(this);
 1713|  2.17k|    pBond->SetIdx(_nbonds);
 1714|       |
 1715|  2.17k|    _bondIds[id] = pBond;
 1716|  2.17k|    pBond->SetId(id);
 1717|       |
 1718|  2.17k|#define OBBondIncrement 100
 1719|  2.17k|    if (_nbonds+1 >= _vbond.size())
  ------------------
  |  Branch (1719:9): [True: 13, False: 2.16k]
  ------------------
 1720|     13|      {
 1721|     13|        _vbond.resize(_nbonds+OBBondIncrement);
  ------------------
  |  | 1718|     13|#define OBBondIncrement 100
  ------------------
 1722|     13|        vector<OBBond*>::iterator i;
 1723|  1.30k|        for (i = _vbond.begin(),i+=(_nbonds+1);i != _vbond.end();++i)
  ------------------
  |  Branch (1723:48): [True: 1.28k, False: 13]
  ------------------
 1724|  1.28k|          *i = nullptr;
 1725|     13|      }
 1726|  2.17k|#undef  OBBondIncrement
 1727|       |
 1728|  2.17k|    _vbond[_nbonds] = (OBBond*)pBond;
 1729|  2.17k|    _nbonds++;
 1730|       |
 1731|  2.17k|    return(pBond);
 1732|  2.17k|  }
_ZN9OpenBabel5OBMol7AddAtomERNS_6OBAtomEb:
 1738|  9.72M|  {
 1739|       |    //    BeginModify();
 1740|       |
 1741|       |    // Use the existing atom Id unless either it's invalid or forceNewId has been specified
 1742|  9.72M|    unsigned long id;
 1743|  9.72M|    if (forceNewId)
  ------------------
  |  Branch (1743:9): [True: 0, False: 9.72M]
  ------------------
 1744|      0|      id = _atomIds.size();
 1745|  9.72M|    else {
 1746|  9.72M|      id = atom.GetId();
 1747|  9.72M|      if (id == NoId)
  ------------------
  |  Branch (1747:11): [True: 282k, False: 9.44M]
  ------------------
 1748|   282k|        id = _atomIds.size();
 1749|  9.72M|    }
 1750|       |
 1751|  9.72M|    OBAtom *obatom = new OBAtom;
 1752|  9.72M|    *obatom = atom;
 1753|  9.72M|    obatom->SetIdx(_natoms+1);
 1754|  9.72M|    obatom->SetParent(this);
 1755|       |
 1756|       |    // resize _atomIds if needed
 1757|  9.72M|    if (id >= _atomIds.size()) {
  ------------------
  |  Branch (1757:9): [True: 9.72M, False: 0]
  ------------------
 1758|  9.72M|      unsigned int size = _atomIds.size();
 1759|  9.72M|      _atomIds.resize(id+1);
 1760|   345M|      for (unsigned long i = size; i < id; ++i)
  ------------------
  |  Branch (1760:36): [True: 335M, False: 9.72M]
  ------------------
 1761|   335M|        _atomIds[i] = nullptr;
 1762|  9.72M|    }
 1763|       |
 1764|  9.72M|    obatom->SetId(id);
 1765|  9.72M|    _atomIds[id] = obatom;
 1766|       |
 1767|  9.72M|#define OBAtomIncrement 100
 1768|       |
 1769|  9.72M|    if (_natoms+1 >= _vatom.size())
  ------------------
  |  Branch (1769:9): [True: 675k, False: 9.05M]
  ------------------
 1770|   675k|      {
 1771|   675k|        _vatom.resize(_natoms+OBAtomIncrement);
  ------------------
  |  | 1767|   675k|#define OBAtomIncrement 100
  ------------------
 1772|   675k|        vector<OBAtom*>::iterator j;
 1773|  67.5M|        for (j = _vatom.begin(),j+=(_natoms+1);j != _vatom.end();++j)
  ------------------
  |  Branch (1773:48): [True: 66.8M, False: 675k]
  ------------------
 1774|  66.8M|          *j = nullptr;
 1775|   675k|      }
 1776|  9.72M|#undef OBAtomIncrement
 1777|       |
 1778|  9.72M|    _vatom[_natoms] = (OBAtom*)obatom;
 1779|  9.72M|    _natoms++;
 1780|       |
 1781|  9.72M|    if (HasData(OBGenericDataType::VirtualBondData))
  ------------------
  |  Branch (1781:9): [True: 0, False: 9.72M]
  ------------------
 1782|      0|      {
 1783|       |        /*add bonds that have been queued*/
 1784|      0|        OBVirtualBond *vb;
 1785|      0|        vector<OBGenericData*> verase;
 1786|      0|        vector<OBGenericData*>::iterator i;
 1787|      0|        for (i = BeginData();i != EndData();++i)
  ------------------
  |  Branch (1787:30): [True: 0, False: 0]
  ------------------
 1788|      0|          if ((*i)->GetDataType() == OBGenericDataType::VirtualBondData)
  ------------------
  |  Branch (1788:15): [True: 0, False: 0]
  ------------------
 1789|      0|            {
 1790|      0|              vb = (OBVirtualBond*)*i;
 1791|      0|              if (vb->GetBgn() > _natoms || vb->GetEnd() > _natoms)
  ------------------
  |  Branch (1791:19): [True: 0, False: 0]
  |  Branch (1791:45): [True: 0, False: 0]
  ------------------
 1792|      0|                continue;
 1793|      0|              if (obatom->GetIdx() == static_cast<unsigned int>(vb->GetBgn())
  ------------------
  |  Branch (1793:19): [True: 0, False: 0]
  ------------------
 1794|      0|                  || obatom->GetIdx() == static_cast<unsigned int>(vb->GetEnd()))
  ------------------
  |  Branch (1794:22): [True: 0, False: 0]
  ------------------
 1795|      0|                {
 1796|      0|                  AddBond(vb->GetBgn(),vb->GetEnd(),vb->GetOrder());
 1797|      0|                  verase.push_back(*i);
 1798|      0|                }
 1799|      0|            }
 1800|       |
 1801|      0|        if (!verase.empty())
  ------------------
  |  Branch (1801:13): [True: 0, False: 0]
  ------------------
 1802|      0|          DeleteData(verase);
 1803|      0|      }
 1804|       |
 1805|       |    //    EndModify();
 1806|       |
 1807|  9.72M|    return(true);
 1808|  9.72M|  }
_ZN9OpenBabel5OBMol15DeleteHydrogensEv:
 1973|  2.05k|  {
 1974|  2.05k|    OBAtom *atom;//,*nbr;
 1975|  2.05k|    vector<OBAtom*>::iterator i;
 1976|  2.05k|    vector<OBAtom*> delatoms,va;
 1977|       |
 1978|  2.05k|    obErrorLog.ThrowError(__FUNCTION__,
 1979|  2.05k|                          "Ran OpenBabel::DeleteHydrogens", obAuditMsg);
 1980|       |
 1981|  65.3k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (1981:30): [True: 63.3k, False: 2.05k]
  ------------------
 1982|  63.3k|      if (atom->GetAtomicNum() == OBElements::Hydrogen && IsSuppressibleHydrogen(atom))
  ------------------
  |  Branch (1982:11): [True: 1.58k, False: 61.7k]
  |  Branch (1982:59): [True: 427, False: 1.15k]
  ------------------
 1983|    427|        delatoms.push_back(atom);
 1984|       |
 1985|  2.05k|    SetHydrogensAdded(false);
 1986|       |
 1987|  2.05k|    if (delatoms.empty())
  ------------------
  |  Branch (1987:9): [True: 1.91k, False: 133]
  ------------------
 1988|  1.91k|      return(true);
 1989|       |
 1990|       |    /* decide whether these flags need to be reset
 1991|       |       _flags &= (~(OB_ATOMTYPES_MOL));
 1992|       |       _flags &= (~(OB_HYBRID_MOL));
 1993|       |       _flags &= (~(OB_PCHARGE_MOL));
 1994|       |       _flags &= (~(OB_IMPVAL_MOL));
 1995|       |    */
 1996|       |
 1997|    133|    IncrementMod();
 1998|       |
 1999|       |    // This is slow -- we need methods to delete a set of atoms
 2000|       |    //  and to delete a set of bonds
 2001|       |    // Calling this sequentially does result in correct behavior
 2002|       |    //  (e.g., fixing PR# 1704551)
 2003|    133|    OBBondIterator bi;
 2004|    560|    for (i = delatoms.begin(); i != delatoms.end(); ++i) {
  ------------------
  |  Branch (2004:32): [True: 427, False: 133]
  ------------------
 2005|    427|      OBAtom* nbr = (*i)->BeginNbrAtom(bi);
 2006|    427|      if (nbr) // defensive
  ------------------
  |  Branch (2006:11): [True: 427, False: 0]
  ------------------
 2007|    427|        nbr->SetImplicitHCount(nbr->GetImplicitHCount() + 1);
 2008|    427|      DeleteAtom((OBAtom *)*i);
 2009|    427|    }
 2010|       |
 2011|    133|    DecrementMod();
 2012|       |
 2013|    133|    SetSSSRPerceived(false);
 2014|    133|    SetLSSRPerceived(false);
 2015|    133|    return(true);
 2016|  2.05k|  }
_ZN9OpenBabel5OBMol14DeleteHydrogenEPNS_6OBAtomE:
 2046|    427|  {
 2047|    427|    if (atom->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (2047:9): [True: 0, False: 427]
  ------------------
 2048|      0|      return false;
 2049|       |
 2050|       |    // OBAngleData/OBTorsionData cache raw OBAtom* pointers; drop them now so
 2051|       |    // a later FOR_ANGLES_OF_MOL doesn't read freed memory.
 2052|    427|    DeleteData(OBGenericDataType::AngleData);
 2053|    427|    DeleteData(OBGenericDataType::TorsionData);
 2054|       |
 2055|    427|    unsigned atomidx = atom->GetIdx();
 2056|       |
 2057|       |    //find bonds to delete
 2058|    427|    OBAtom *nbr;
 2059|    427|    vector<OBBond*> vdb;
 2060|    427|    vector<OBBond*>::iterator j;
 2061|    884|    for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j))
  ------------------
  |  Branch (2061:38): [True: 457, False: 427]
  ------------------
 2062|    457|      vdb.push_back(*j);
 2063|       |
 2064|    427|    IncrementMod();
 2065|    884|    for (j = vdb.begin();j != vdb.end();++j)
  ------------------
  |  Branch (2065:26): [True: 457, False: 427]
  ------------------
 2066|    457|      DeleteBond((OBBond*)*j); //delete bonds
 2067|    427|    DecrementMod();
 2068|       |
 2069|    427|    int idx;
 2070|    427|    if (atomidx != NumAtoms())
  ------------------
  |  Branch (2070:9): [True: 399, False: 28]
  ------------------
 2071|    399|      {
 2072|    399|        idx = atom->GetCoordinateIdx();
 2073|    399|        int size = NumAtoms()-atom->GetIdx();
 2074|    399|        vector<double*>::iterator k;
 2075|    798|        for (k = _vconf.begin();k != _vconf.end();++k)
  ------------------
  |  Branch (2075:33): [True: 399, False: 399]
  ------------------
 2076|    399|          memmove((char*)&(*k)[idx],(char*)&(*k)[idx+3],sizeof(double)*3*size);
 2077|       |
 2078|    399|      }
 2079|       |
 2080|       |    // Deleting hydrogens does not invalidate the stereo objects
 2081|       |    // - however, any explicit refs to the hydrogen atom must be
 2082|       |    //   converted to implicit refs
 2083|    427|    OBStereo::Ref id = atom->GetId();
 2084|    427|    StereoRefToImplicit(*this, id);
 2085|       |
 2086|    427|    _atomIds[id] = nullptr;
 2087|    427|    _vatom.erase(_vatom.begin()+(atomidx-1));
 2088|    427|    _natoms--;
 2089|       |
 2090|       |    //reset all the indices to the atoms
 2091|    427|    vector<OBAtom*>::iterator i;
 2092|    427|    OBAtom *atomi;
 2093|  44.3k|    for (idx=1,atomi = BeginAtom(i);atomi;atomi = NextAtom(i),++idx)
  ------------------
  |  Branch (2093:37): [True: 43.9k, False: 427]
  ------------------
 2094|  43.9k|      atomi->SetIdx(idx);
 2095|       |
 2096|    427|    SetHydrogensAdded(false);
 2097|       |
 2098|    427|    DestroyAtom(atom);
 2099|       |
 2100|    427|    SetSSSRPerceived(false);
 2101|    427|    SetLSSRPerceived(false);
 2102|    427|    return(true);
 2103|    427|  }
_ZN9OpenBabel5OBMol12AddHydrogensEbbd:
 2109|  5.59k|  {
 2110|  5.59k|    return(AddNewHydrogens(polaronly ? PolarHydrogen : AllHydrogen, correctForPH, pH));
  ------------------
  |  Branch (2110:28): [True: 0, False: 5.59k]
  ------------------
 2111|  5.59k|  }
_ZN9OpenBabel5OBMol15AddNewHydrogensENS_12HydrogenTypeEbd:
 2142|  5.59k|  {
 2143|  5.59k|    if (!IsCorrectedForPH() && correctForPH)
  ------------------
  |  Branch (2143:9): [True: 5.59k, False: 0]
  |  Branch (2143:32): [True: 0, False: 5.59k]
  ------------------
 2144|      0|      CorrectForPH(pH);
 2145|       |
 2146|  5.59k|    if (HasHydrogensAdded())
  ------------------
  |  Branch (2146:9): [True: 0, False: 5.59k]
  ------------------
 2147|      0|      return(true);
 2148|       |
 2149|  5.59k|    bool hasChiralityPerceived = this->HasChiralityPerceived(); // remember
 2150|       |
 2151|       |    /*
 2152|       |    //
 2153|       |    // This was causing bug #1892844 in avogadro. We also want to add hydrogens if the molecule has no bonds.
 2154|       |    //
 2155|       |    if(NumBonds()==0 && NumAtoms()!=1)
 2156|       |    {
 2157|       |    obErrorLog.ThrowError(__FUNCTION__,
 2158|       |    "Did not run OpenBabel::AddHydrogens on molecule with no bonds", obAuditMsg);
 2159|       |    return true;
 2160|       |    }
 2161|       |    */
 2162|  5.59k|    if (whichHydrogen == AllHydrogen)
  ------------------
  |  Branch (2162:9): [True: 5.59k, False: 0]
  ------------------
 2163|  5.59k|      obErrorLog.ThrowError(__FUNCTION__,
 2164|  5.59k|                            "Ran OpenBabel::AddHydrogens", obAuditMsg);
 2165|      0|    else if (whichHydrogen == PolarHydrogen)
  ------------------
  |  Branch (2165:14): [True: 0, False: 0]
  ------------------
 2166|      0|      obErrorLog.ThrowError(__FUNCTION__,
 2167|      0|                            "Ran OpenBabel::AddHydrogens -- polar only", obAuditMsg);
 2168|      0|    else
 2169|      0|      obErrorLog.ThrowError(__FUNCTION__,
 2170|      0|                            "Ran OpenBabel::AddHydrogens -- nonpolar only", obAuditMsg);
 2171|       |
 2172|       |    // Make sure we have conformers (PR#1665519)
 2173|  5.59k|    if (!_vconf.empty() && !Empty()) {
  ------------------
  |  Branch (2173:9): [True: 5.54k, False: 42]
  |  Branch (2173:28): [True: 5.54k, False: 0]
  ------------------
 2174|  5.54k|      OBAtom *atom;
 2175|  5.54k|      vector<OBAtom*>::iterator i;
 2176|   394k|      for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2176:32): [True: 388k, False: 5.54k]
  ------------------
 2177|   388k|        {
 2178|   388k|          atom->SetVector();
 2179|   388k|        }
 2180|  5.54k|    }
 2181|       |
 2182|  5.59k|    SetHydrogensAdded(); // This must come after EndModify() as EndModify() wipes the flags
 2183|       |    // If chirality was already perceived, remember this (to avoid wiping information
 2184|  5.59k|    if (hasChiralityPerceived)
  ------------------
  |  Branch (2184:9): [True: 3.52k, False: 2.07k]
  ------------------
 2185|  3.52k|      this->SetChiralityPerceived();
 2186|       |
 2187|       |    //count up number of hydrogens to add
 2188|  5.59k|    OBAtom *atom,*h;
 2189|  5.59k|    int hcount,count=0;
 2190|  5.59k|    vector<pair<OBAtom*,int> > vhadd;
 2191|  5.59k|    vector<OBAtom*>::iterator i;
 2192|   394k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2192:30): [True: 388k, False: 5.59k]
  ------------------
 2193|   388k|      {
 2194|   388k|        if (whichHydrogen == PolarHydrogen && !AtomIsNSOP(atom))
  ------------------
  |  Branch (2194:13): [True: 0, False: 388k]
  |  Branch (2194:47): [True: 0, False: 0]
  ------------------
 2195|      0|          continue;
 2196|   388k|        if (whichHydrogen == NonPolarHydrogen && AtomIsNSOP(atom))
  ------------------
  |  Branch (2196:13): [True: 0, False: 388k]
  |  Branch (2196:50): [True: 0, False: 0]
  ------------------
 2197|      0|          continue;
 2198|       |
 2199|   388k|        hcount = atom->GetImplicitHCount();
 2200|   388k|        atom->SetImplicitHCount(0);
 2201|       |
 2202|   388k|        if (hcount)
  ------------------
  |  Branch (2202:13): [True: 141k, False: 247k]
  ------------------
 2203|   141k|          {
 2204|   141k|            vhadd.push_back(pair<OBAtom*,int>(atom,hcount));
 2205|   141k|            count += hcount;
 2206|   141k|          }
 2207|   388k|      }
 2208|       |
 2209|  5.59k|    if (count == 0) {
  ------------------
  |  Branch (2209:9): [True: 2.38k, False: 3.20k]
  ------------------
 2210|       |      // Make sure to clear SSSR and aromatic flags we may have tripped above
 2211|  2.38k|      _flags &= (~(OB_SSSR_MOL|OB_AROMATIC_MOL));
  ------------------
  |  |   73|  2.38k|#define OB_SSSR_MOL              (1<<1)
  ------------------
                    _flags &= (~(OB_SSSR_MOL|OB_AROMATIC_MOL));
  ------------------
  |  |   77|  2.38k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
 2212|  2.38k|      return(true);
 2213|  2.38k|    }
 2214|  3.20k|    bool hasCoords = HasNonZeroCoords();
 2215|       |
 2216|       |    //realloc memory in coordinate arrays for new hydrogens
 2217|  3.20k|    double *tmpf;
 2218|  3.20k|    vector<double*>::iterator j;
 2219|  6.41k|    for (j = _vconf.begin();j != _vconf.end();++j)
  ------------------
  |  Branch (2219:29): [True: 3.20k, False: 3.20k]
  ------------------
 2220|  3.20k|      {
 2221|  3.20k|        tmpf = new double [(NumAtoms()+count)*3];
 2222|  3.20k|        memset(tmpf,'\0',sizeof(double)*(NumAtoms()+count)*3);
 2223|  3.20k|        if (hasCoords)
  ------------------
  |  Branch (2223:13): [True: 1.61k, False: 1.59k]
  ------------------
 2224|  1.61k|          memcpy(tmpf,(*j),sizeof(double)*NumAtoms()*3);
 2225|  3.20k|        delete []*j;
 2226|  3.20k|        *j = tmpf;
 2227|  3.20k|      }
 2228|       |
 2229|  3.20k|    IncrementMod();
 2230|       |
 2231|  3.20k|    int m,n;
 2232|  3.20k|    vector3 v;
 2233|  3.20k|    vector<pair<OBAtom*,int> >::iterator k;
 2234|  3.20k|    double hbrad = CorrectedBondRad(1, 0);
 2235|       |
 2236|   144k|    for (k = vhadd.begin();k != vhadd.end();++k)
  ------------------
  |  Branch (2236:28): [True: 141k, False: 3.20k]
  ------------------
 2237|   141k|      {
 2238|   141k|        atom = k->first;
 2239|   141k|        double bondlen = hbrad + CorrectedBondRad(atom->GetAtomicNum(), atom->GetHyb());
 2240|   432k|        for (m = 0;m < k->second;++m)
  ------------------
  |  Branch (2240:20): [True: 291k, False: 141k]
  ------------------
 2241|   291k|          {
 2242|   291k|            int badh = 0;
 2243|   582k|            for (n = 0;n < NumConformers();++n)
  ------------------
  |  Branch (2243:24): [True: 291k, False: 291k]
  ------------------
 2244|   291k|              {
 2245|   291k|                SetConformer(n);
 2246|   291k|                if (hasCoords)
  ------------------
  |  Branch (2246:21): [True: 121k, False: 169k]
  ------------------
 2247|   121k|                  {
 2248|       |                    // Ensure that add hydrogens only returns finite coords
 2249|       |                    //atom->GetNewBondVector(v,bondlen);
 2250|   121k|                    v = OBBuilder::GetNewBondVector(atom,bondlen);
 2251|   121k|                    if (isfinite(v.x()) || isfinite(v.y()) || isfinite(v.z())) {
  ------------------
  |  Branch (2251:25): [True: 49.9k, False: 71.6k]
  |  Branch (2251:44): [True: 142, False: 71.5k]
  |  Branch (2251:63): [True: 1, False: 71.5k]
  ------------------
 2252|  50.1k|                      _c[(NumAtoms())*3]   = v.x();
 2253|  50.1k|                      _c[(NumAtoms())*3+1] = v.y();
 2254|  50.1k|                      _c[(NumAtoms())*3+2] = v.z();
 2255|  50.1k|                    }
 2256|  71.5k|                    else {
 2257|  71.5k|                      _c[(NumAtoms())*3]   = 0.0;
 2258|  71.5k|                      _c[(NumAtoms())*3+1] = 0.0;
 2259|  71.5k|                      _c[(NumAtoms())*3+2] = 0.0;
 2260|  71.5k|                      obErrorLog.ThrowError(__FUNCTION__,
 2261|  71.5k|                                            "Ran OpenBabel::AddHydrogens -- no reasonable bond geometry for desired hydrogen.",
 2262|  71.5k|                                            obAuditMsg);
 2263|  71.5k|                      badh++;
 2264|  71.5k|                    }
 2265|   121k|                  }
 2266|   169k|                else
 2267|   169k|                  memset((char*)&_c[NumAtoms()*3],'\0',sizeof(double)*3);
 2268|   291k|              }
 2269|   291k|            if(badh == 0 || badh < NumConformers())
  ------------------
  |  Branch (2269:16): [True: 219k, False: 71.5k]
  |  Branch (2269:29): [True: 0, False: 71.5k]
  ------------------
 2270|   219k|              {
 2271|       |                // Add the new H atom to the appropriate residue list
 2272|       |                //but avoid doing perception by checking for existence of residue
 2273|       |                //just in case perception is trigger, make sure GetResidue is called
 2274|       |                //before adding the hydrogen to the molecule
 2275|   219k|                OBResidue *res = atom->HasResidue() ? atom->GetResidue() : nullptr;
  ------------------
  |  Branch (2275:34): [True: 49.6k, False: 170k]
  ------------------
 2276|   219k|                h = NewAtom();
 2277|   219k|                h->SetType("H");
 2278|   219k|                h->SetAtomicNum(1);
 2279|   219k|                string aname = "H";
 2280|       |
 2281|   219k|                if(res)
  ------------------
  |  Branch (2281:20): [True: 49.6k, False: 170k]
  ------------------
 2282|  49.6k|                {
 2283|  49.6k|                  res->AddAtom(h);
 2284|  49.6k|                  res->SetAtomID(h,aname);
 2285|       |
 2286|       |                  //hydrogen should inherit hetatm status of heteroatom (default is false)
 2287|  49.6k|                  if(res->IsHetAtom(atom))
  ------------------
  |  Branch (2287:22): [True: 905, False: 48.7k]
  ------------------
 2288|    905|                  {
 2289|    905|                      res->SetHetAtom(h, true);
 2290|    905|                  }
 2291|  49.6k|                }
 2292|       |
 2293|   219k|                int bondFlags = 0;
 2294|   219k|                AddBond(atom->GetIdx(),h->GetIdx(),1, bondFlags);
 2295|   219k|                if (_c) {
  ------------------
  |  Branch (2295:21): [True: 219k, False: 0]
  ------------------
 2296|   219k|                  h->SetCoordPtr(&_c);
 2297|   219k|                }
 2298|   219k|                OpenBabel::ImplicitRefToStereo(*this, atom->GetId(), h->GetId());
 2299|   219k|              }
 2300|   291k|          }
 2301|   141k|      }
 2302|       |
 2303|  3.20k|    DecrementMod();
 2304|       |
 2305|       |    //reset atom type and partial charge flags
 2306|  3.20k|    _flags &= (~(OB_PCHARGE_MOL|OB_ATOMTYPES_MOL|OB_SSSR_MOL|OB_AROMATIC_MOL|OB_HYBRID_MOL));
  ------------------
  |  |   83|  3.20k|#define OB_PCHARGE_MOL           (1<<6)
  ------------------
                  _flags &= (~(OB_PCHARGE_MOL|OB_ATOMTYPES_MOL|OB_SSSR_MOL|OB_AROMATIC_MOL|OB_HYBRID_MOL));
  ------------------
  |  |   79|  3.20k|#define OB_ATOMTYPES_MOL         (1<<4)
  ------------------
                  _flags &= (~(OB_PCHARGE_MOL|OB_ATOMTYPES_MOL|OB_SSSR_MOL|OB_AROMATIC_MOL|OB_HYBRID_MOL));
  ------------------
  |  |   73|  3.20k|#define OB_SSSR_MOL              (1<<1)
  ------------------
                  _flags &= (~(OB_PCHARGE_MOL|OB_ATOMTYPES_MOL|OB_SSSR_MOL|OB_AROMATIC_MOL|OB_HYBRID_MOL));
  ------------------
  |  |   77|  3.20k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
                  _flags &= (~(OB_PCHARGE_MOL|OB_ATOMTYPES_MOL|OB_SSSR_MOL|OB_AROMATIC_MOL|OB_HYBRID_MOL));
  ------------------
  |  |   85|  3.20k|#define OB_HYBRID_MOL            (1<<8)
  ------------------
 2307|       |
 2308|  3.20k|    return(true);
 2309|  5.59k|  }
_ZN9OpenBabel5OBMol10DeleteAtomEPNS_6OBAtomEb:
 2455|    427|  {
 2456|    427|    if (atom->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (2456:9): [True: 427, False: 0]
  ------------------
 2457|    427|      return(DeleteHydrogen(atom));
 2458|       |
 2459|       |    // OBAngleData/OBTorsionData cache raw OBAtom* pointers; drop them now so
 2460|       |    // a later FOR_ANGLES_OF_MOL doesn't read freed memory.
 2461|      0|    DeleteData(OBGenericDataType::AngleData);
 2462|      0|    DeleteData(OBGenericDataType::TorsionData);
 2463|       |
 2464|      0|    BeginModify();
 2465|       |    //don't need to do anything with coordinates b/c
 2466|       |    //BeginModify() blows away coordinates
 2467|       |
 2468|       |    //find bonds to delete
 2469|      0|    OBAtom *nbr;
 2470|      0|    vector<OBBond*> vdb;
 2471|      0|    vector<OBBond*>::iterator j;
 2472|      0|    for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j))
  ------------------
  |  Branch (2472:38): [True: 0, False: 0]
  ------------------
 2473|      0|      vdb.push_back(*j);
 2474|       |
 2475|      0|    for (j = vdb.begin();j != vdb.end();++j)
  ------------------
  |  Branch (2475:26): [True: 0, False: 0]
  ------------------
 2476|      0|      DeleteBond((OBBond *)*j); //delete bonds
 2477|       |
 2478|      0|    _atomIds[atom->GetId()] = nullptr;
 2479|      0|    _vatom.erase(_vatom.begin()+(atom->GetIdx()-1));
 2480|      0|    _natoms--;
 2481|       |
 2482|       |    //reset all the indices to the atoms
 2483|      0|    int idx;
 2484|      0|    vector<OBAtom*>::iterator i;
 2485|      0|    OBAtom *atomi;
 2486|      0|    for (idx=1,atomi = BeginAtom(i);atomi;atomi = NextAtom(i),++idx)
  ------------------
  |  Branch (2486:37): [True: 0, False: 0]
  ------------------
 2487|      0|      atomi->SetIdx(idx);
 2488|       |
 2489|      0|    EndModify();
 2490|       |
 2491|       |    // Delete any stereo objects involving this atom
 2492|      0|    OBStereo::Ref id = atom->GetId();
 2493|      0|    DeleteStereoOnAtom(*this, id);
 2494|       |
 2495|      0|    if (destroyAtom)
  ------------------
  |  Branch (2495:9): [True: 0, False: 0]
  ------------------
 2496|      0|      DestroyAtom(atom);
 2497|       |
 2498|      0|    SetSSSRPerceived(false);
 2499|      0|    SetLSSRPerceived(false);
 2500|      0|    return(true);
 2501|    427|  }
_ZN9OpenBabel5OBMol10DeleteBondEPNS_6OBBondEb:
 2520|  3.72M|  {
 2521|       |    // Cached angles/torsions are derived from bond connectivity. They aren't
 2522|       |    // a UAF risk here, but they no longer match the topology — invalidate.
 2523|  3.72M|    DeleteData(OBGenericDataType::AngleData);
 2524|  3.72M|    DeleteData(OBGenericDataType::TorsionData);
 2525|       |
 2526|  3.72M|    BeginModify();
 2527|       |
 2528|  3.72M|    (bond->GetBeginAtom())->DeleteBond(bond);
 2529|  3.72M|    (bond->GetEndAtom())->DeleteBond(bond);
 2530|  3.72M|    _bondIds[bond->GetId()] = nullptr;
 2531|  3.72M|    _vbond.erase(_vbond.begin() + bond->GetIdx()); // bond index starts at 0!!!
 2532|  3.72M|    _nbonds--;
 2533|       |
 2534|  3.72M|    vector<OBBond*>::iterator i;
 2535|  3.72M|    int j;
 2536|  3.72M|    OBBond *bondi;
 2537|  12.5G|    for (bondi = BeginBond(i),j=0;bondi;bondi = NextBond(i),++j)
  ------------------
  |  Branch (2537:35): [True: 12.5G, False: 3.72M]
  ------------------
 2538|  12.5G|      bondi->SetIdx(j);
 2539|       |
 2540|  3.72M|    EndModify();
 2541|       |
 2542|  3.72M|    if (destroyBond)
  ------------------
  |  Branch (2542:9): [True: 3.72M, False: 0]
  ------------------
 2543|  3.72M|      DestroyBond(bond);
 2544|       |
 2545|  3.72M|    SetSSSRPerceived(false);
 2546|  3.72M|    SetLSSRPerceived(false);
 2547|  3.72M|    return(true);
 2548|  3.72M|  }
_ZN9OpenBabel5OBMol7AddBondEiiiii:
 2551|  13.5M|  {
 2552|       |    // Don't add the bond if it already exists
 2553|  13.5M|    if (first == second || GetBond(first, second) != nullptr)
  ------------------
  |  Branch (2553:9): [True: 293, False: 13.5M]
  |  Branch (2553:28): [True: 13.9k, False: 13.5M]
  ------------------
 2554|  14.2k|      return(false);
 2555|       |
 2556|       |    //    BeginModify();
 2557|       |
 2558|  13.5M|    if ((unsigned)first <= NumAtoms() && (unsigned)second <= NumAtoms())
  ------------------
  |  Branch (2558:9): [True: 13.5M, False: 0]
  |  Branch (2558:42): [True: 13.5M, False: 0]
  ------------------
 2559|       |      //atoms exist and bond doesn't
 2560|  13.5M|      {
 2561|  13.5M|        OBBond *bond = new OBBond;
 2562|  13.5M|        if (!bond)
  ------------------
  |  Branch (2562:13): [True: 0, False: 13.5M]
  ------------------
 2563|      0|          {
 2564|       |            //EndModify();
 2565|      0|            return(false);
 2566|      0|          }
 2567|       |
 2568|  13.5M|        OBAtom *bgn,*end;
 2569|  13.5M|        bgn = GetAtom(first);
 2570|  13.5M|        end = GetAtom(second);
 2571|  13.5M|        if (!bgn || !end)
  ------------------
  |  Branch (2571:13): [True: 0, False: 13.5M]
  |  Branch (2571:21): [True: 0, False: 13.5M]
  ------------------
 2572|      0|          {
 2573|      0|            obErrorLog.ThrowError(__FUNCTION__, "Unable to add bond - invalid atom index", obDebug);
 2574|      0|            delete bond;
 2575|      0|            return(false);
 2576|      0|          }
 2577|  13.5M|        bond->Set(_nbonds,bgn,end,order,flags);
 2578|  13.5M|        bond->SetParent(this);
 2579|       |
 2580|  13.5M|        bond->SetId(_bondIds.size());
 2581|  13.5M|        _bondIds.push_back(bond);
 2582|       |
 2583|  13.5M|#define OBBondIncrement 100
 2584|  13.5M|        if (_nbonds+1 >= _vbond.size())
  ------------------
  |  Branch (2584:13): [True: 384k, False: 13.1M]
  ------------------
 2585|   384k|          {
 2586|   384k|            _vbond.resize(_nbonds+OBBondIncrement);
  ------------------
  |  | 2583|   384k|#define OBBondIncrement 100
  ------------------
 2587|   384k|            vector<OBBond*>::iterator i;
 2588|  38.4M|            for (i = _vbond.begin(),i+=(_nbonds+1);i != _vbond.end();++i)
  ------------------
  |  Branch (2588:52): [True: 38.0M, False: 384k]
  ------------------
 2589|  38.0M|              *i = nullptr;
 2590|   384k|          }
 2591|  13.5M|#undef  OBBondIncrement
 2592|       |
 2593|  13.5M|        _vbond[_nbonds] = (OBBond*)bond;
 2594|  13.5M|        _nbonds++;
 2595|       |
 2596|  13.5M|        if (insertpos == -1)
  ------------------
  |  Branch (2596:13): [True: 13.5M, False: 42.3k]
  ------------------
 2597|  13.5M|          {
 2598|  13.5M|            bgn->AddBond(bond);
 2599|  13.5M|            end->AddBond(bond);
 2600|  13.5M|          }
 2601|  42.3k|        else
 2602|  42.3k|          {
 2603|  42.3k|            if (insertpos >= static_cast<int>(bgn->GetExplicitDegree()))
  ------------------
  |  Branch (2603:17): [True: 2.81k, False: 39.5k]
  ------------------
 2604|  2.81k|              bgn->AddBond(bond);
 2605|  39.5k|            else //need to insert the bond for the connectivity order to be preserved
 2606|  39.5k|              {    //otherwise stereochemistry gets screwed up
 2607|  39.5k|                vector<OBBond*>::iterator bi;
 2608|  39.5k|                bgn->BeginNbrAtom(bi);
 2609|  39.5k|                bi += insertpos;
 2610|  39.5k|                bgn->InsertBond(bi,bond);
 2611|  39.5k|              }
 2612|  42.3k|            end->AddBond(bond);
 2613|  42.3k|          }
 2614|  13.5M|      }
 2615|      0|    else //at least one atom doesn't exist yet - add to bond_q
 2616|      0|      SetData(new OBVirtualBond(first,second,order,flags));
 2617|       |
 2618|       |    //    EndModify();
 2619|       |
 2620|  13.5M|    return(true);
 2621|  13.5M|  }
_ZN9OpenBabel5OBMol7AddBondERNS_6OBBondE:
 2624|  8.13M|  {
 2625|  8.13M|    if(!AddBond(bond.GetBeginAtomIdx(),
  ------------------
  |  Branch (2625:8): [True: 0, False: 8.13M]
  ------------------
 2626|  8.13M|                   bond.GetEndAtomIdx(),
 2627|  8.13M|                   bond.GetBondOrder(),
 2628|  8.13M|                   bond.GetFlags()))
 2629|      0|      return false;
 2630|       |    //copy the bond's generic data
 2631|  8.13M|    OBDataIterator diter;
 2632|  8.13M|    for(diter=bond.BeginData(); diter!=bond.EndData();++diter)
  ------------------
  |  Branch (2632:33): [True: 0, False: 8.13M]
  ------------------
 2633|      0|      GetBond(NumBonds()-1)->CloneData(*diter);
 2634|  8.13M|    return true;
 2635|  8.13M|  }
_ZN9OpenBabel5OBMolC2Ev:
 2755|  32.1k|  {
 2756|  32.1k|    _natoms = _nbonds = 0;
 2757|  32.1k|    _mod = 0;
 2758|  32.1k|    _totalCharge = 0;
 2759|  32.1k|    _dimension = 3;
 2760|  32.1k|    _vatom.clear();
 2761|  32.1k|    _atomIds.clear();
 2762|  32.1k|    _vbond.clear();
 2763|  32.1k|    _bondIds.clear();
 2764|  32.1k|    _vdata.clear();
 2765|  32.1k|    _title = "";
 2766|  32.1k|    _c = nullptr;
 2767|  32.1k|    _flags = 0;
 2768|  32.1k|    _vconf.clear();
 2769|  32.1k|    _autoPartialCharge = true;
 2770|  32.1k|    _autoFormalCharge = true;
 2771|  32.1k|    _energy = 0.0;
 2772|  32.1k|  }
_ZN9OpenBabel5OBMolC2ERKS0_:
 2774|   599k|  OBMol::OBMol(const OBMol &mol) : OBBase(mol)
 2775|   599k|  {
 2776|   599k|    _natoms = _nbonds = 0;
 2777|   599k|    _mod = 0;
 2778|   599k|    _totalCharge = 0;
 2779|   599k|    _dimension = 3;
 2780|   599k|    _vatom.clear();
 2781|   599k|    _atomIds.clear();
 2782|   599k|    _vbond.clear();
 2783|   599k|    _bondIds.clear();
 2784|   599k|    _vdata.clear();
 2785|   599k|    _title = "";
 2786|   599k|    _c = nullptr;
 2787|   599k|    _flags = 0;
 2788|   599k|    _vconf.clear();
 2789|   599k|    _autoPartialCharge = true;
 2790|   599k|    _autoFormalCharge = true;
 2791|       |    //NF  _compressed = false;
 2792|   599k|    _energy = 0.0;
 2793|   599k|    *this = mol;
 2794|   599k|  }
_ZN9OpenBabel5OBMolD2Ev:
 2797|   631k|  {
 2798|   631k|    OBAtom    *atom;
 2799|   631k|    OBBond    *bond;
 2800|   631k|    OBResidue *residue;
 2801|   631k|    vector<OBAtom*>::iterator i;
 2802|   631k|    vector<OBBond*>::iterator j;
 2803|   631k|    vector<OBResidue*>::iterator r;
 2804|       |    // Destroy residues before atoms so ~OBResidue() can clear back-
 2805|       |    // pointers on still-live atoms (see Clear() for the same reason).
 2806|  1.16M|    for (residue = BeginResidue(r);residue;residue = NextResidue(r))
  ------------------
  |  Branch (2806:36): [True: 536k, False: 631k]
  ------------------
 2807|   536k|      DestroyResidue(residue);
 2808|  8.82M|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2808:30): [True: 8.19M, False: 631k]
  ------------------
 2809|  8.19M|      DestroyAtom(atom);
 2810|  8.27M|    for (bond = BeginBond(j);bond;bond = NextBond(j))
  ------------------
  |  Branch (2810:30): [True: 7.64M, False: 631k]
  ------------------
 2811|  7.64M|      DestroyBond(bond);
 2812|       |
 2813|       |    //clear out the multiconformer data
 2814|   631k|    vector<double*>::iterator k;
 2815|  1.24M|    for (k = _vconf.begin();k != _vconf.end();++k)
  ------------------
  |  Branch (2815:29): [True: 613k, False: 631k]
  ------------------
 2816|   613k|      delete [] *k;
 2817|   631k|    _vconf.clear();
 2818|   631k|  }
_ZN9OpenBabel5OBMol16HasNonZeroCoordsEv:
 2821|  3.20k|  {
 2822|  3.20k|    OBAtom *atom;
 2823|  3.20k|    vector<OBAtom*>::iterator i;
 2824|       |
 2825|   283k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2825:30): [True: 282k, False: 1.59k]
  ------------------
 2826|   282k|      if (atom->GetVector().length_2() != 0.0)
  ------------------
  |  Branch (2826:11): [True: 1.61k, False: 280k]
  ------------------
 2827|  1.61k|        return(true);
 2828|       |
 2829|  1.59k|    return(false);
 2830|  3.20k|  }
_ZN9OpenBabel5OBMol5Has2DEb:
 2833|  1.38k|  {
 2834|  1.38k|    bool hasX,hasY;
 2835|  1.38k|    OBAtom *atom;
 2836|  1.38k|    vector<OBAtom*>::iterator i;
 2837|       |
 2838|  1.38k|    hasX = hasY = false;
 2839|  5.81k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2839:30): [True: 4.42k, False: 1.38k]
  ------------------
 2840|  4.42k|      {
 2841|  4.42k|        if (!hasX && fabs(atom->x()) >= 2e-6)
  ------------------
  |  Branch (2841:13): [True: 2.55k, False: 1.86k]
  |  Branch (2841:22): [True: 73, False: 2.48k]
  ------------------
 2842|     73|          hasX = true;
 2843|  4.42k|        if (!hasY && fabs(atom->y()) >= 2e-6)
  ------------------
  |  Branch (2843:13): [True: 3.77k, False: 645]
  |  Branch (2843:22): [True: 582, False: 3.19k]
  ------------------
 2844|    582|          hasY = true;
 2845|  4.42k|        if(Not3D && atom->z())
  ------------------
  |  Branch (2845:12): [True: 0, False: 4.42k]
  |  Branch (2845:21): [True: 0, False: 0]
  ------------------
 2846|      0|          return false;
 2847|  4.42k|      }
 2848|  1.38k|    if (hasX || hasY) //was && but this excluded vertically or horizontally aligned linear mols
  ------------------
  |  Branch (2848:9): [True: 73, False: 1.31k]
  |  Branch (2848:17): [True: 571, False: 744]
  ------------------
 2849|    644|      return(true);
 2850|    744|    return(false);
 2851|  1.38k|  }
_ZN9OpenBabel5OBMol5Has3DEv:
 2854|  1.42k|  {
 2855|  1.42k|    bool hasX,hasY,hasZ;
 2856|  1.42k|    OBAtom *atom;
 2857|  1.42k|    vector<OBAtom*>::iterator i;
 2858|       |
 2859|  1.42k|    hasX = hasY = hasZ = false;
 2860|       |    //    if (this->_c == NULL) **Test removed** Prevented function use during molecule construction
 2861|       |    //      return(false);
 2862|  6.13k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (2862:30): [True: 4.74k, False: 1.38k]
  ------------------
 2863|  4.74k|      {
 2864|  4.74k|        if (!hasX && fabs(atom->x()) >= 2e-6)
  ------------------
  |  Branch (2864:13): [True: 2.65k, False: 2.08k]
  |  Branch (2864:22): [True: 113, False: 2.54k]
  ------------------
 2865|    113|          hasX = true;
 2866|  4.74k|        if (!hasY && fabs(atom->y()) >= 2e-6)
  ------------------
  |  Branch (2866:13): [True: 4.04k, False: 703]
  |  Branch (2866:22): [True: 622, False: 3.41k]
  ------------------
 2867|    622|          hasY = true;
 2868|  4.74k|        if (!hasZ && fabs(atom->z()) >= 2e-6)
  ------------------
  |  Branch (2868:13): [True: 3.78k, False: 963]
  |  Branch (2868:22): [True: 131, False: 3.64k]
  ------------------
 2869|    131|          hasZ = true;
 2870|       |
 2871|  4.74k|        if (hasX && hasY && hasZ)
  ------------------
  |  Branch (2871:13): [True: 2.20k, False: 2.54k]
  |  Branch (2871:21): [True: 105, False: 2.09k]
  |  Branch (2871:29): [True: 40, False: 65]
  ------------------
 2872|     40|          return(true);
 2873|  4.74k|      }
 2874|  1.38k|    return(false);
 2875|  1.42k|  }
_ZN9OpenBabel5OBMol14ConnectTheDotsEv:
 3004|  6.08k|  {
 3005|  6.08k|    if (Empty())
  ------------------
  |  Branch (3005:9): [True: 0, False: 6.08k]
  ------------------
 3006|      0|      return;
 3007|  6.08k|    if (_dimension != 3) return; // not useful on non-3D structures
  ------------------
  |  Branch (3007:9): [True: 0, False: 6.08k]
  ------------------
 3008|       |
 3009|  6.08k|    if (IsPeriodic())
  ------------------
  |  Branch (3009:9): [True: 0, False: 6.08k]
  ------------------
 3010|      0|      obErrorLog.ThrowError(__FUNCTION__,
 3011|      0|                            "Ran OpenBabel::ConnectTheDots -- using periodic boundary conditions",
 3012|      0|                            obAuditMsg);
 3013|  6.08k|    else
 3014|  6.08k|      obErrorLog.ThrowError(__FUNCTION__,
 3015|  6.08k|                            "Ran OpenBabel::ConnectTheDots", obAuditMsg);
 3016|       |
 3017|       |
 3018|  6.08k|    int j,k,max;
 3019|  6.08k|    double maxrad = 0;
 3020|  6.08k|    bool unset = false;
 3021|  6.08k|    OBAtom *atom,*nbr;
 3022|  6.08k|    vector<OBAtom*>::iterator i;
 3023|  6.08k|    vector<pair<OBAtom*,double> > zsortedAtoms;
 3024|  6.08k|    vector<double> rad;
 3025|  6.08k|    vector<int> zsorted;
 3026|  6.08k|    vector<int> bondCount; // existing bonds (e.g., from residues in PDB)
 3027|       |
 3028|  6.08k|    double *c = new double [NumAtoms()*3];
 3029|  6.08k|    rad.resize(_natoms);
 3030|       |
 3031|   287k|    for (j = 0, atom = BeginAtom(i) ; atom ; atom = NextAtom(i), ++j)
  ------------------
  |  Branch (3031:39): [True: 281k, False: 6.08k]
  ------------------
 3032|   281k|      {
 3033|   281k|        bondCount.push_back(atom->GetExplicitDegree());
 3034|       |        //don't consider atoms with a full valance already
 3035|       |        //this is both for correctness (trust existing bonds) and performance
 3036|   281k|        if(atom->GetExplicitValence() >= OBElements::GetMaxBonds(atom->GetAtomicNum()))
  ------------------
  |  Branch (3036:12): [True: 80.2k, False: 200k]
  ------------------
 3037|  80.2k|          continue;
 3038|   200k|        if(atom->GetAtomicNum() == 7 && atom->GetFormalCharge() == 0 && atom->GetExplicitValence() >= 3)
  ------------------
  |  Branch (3038:12): [True: 10.8k, False: 189k]
  |  Branch (3038:41): [True: 9.51k, False: 1.31k]
  |  Branch (3038:73): [True: 7, False: 9.50k]
  ------------------
 3039|      7|          continue;
 3040|   200k|        (atom->GetVector()).Get(&c[j*3]);
 3041|   200k|        pair<OBAtom*,double> entry(atom, atom->GetVector().z());
 3042|   200k|        zsortedAtoms.push_back(entry);
 3043|   200k|      }
 3044|  6.08k|    sort(zsortedAtoms.begin(), zsortedAtoms.end(), SortAtomZ);
 3045|       |
 3046|  6.08k|    max = zsortedAtoms.size();
 3047|       |
 3048|   206k|    for ( j = 0 ; j < max ; j++ )
  ------------------
  |  Branch (3048:19): [True: 200k, False: 6.08k]
  ------------------
 3049|   200k|      {
 3050|   200k|        atom   = zsortedAtoms[j].first;
 3051|   200k|        rad[j] = OBElements::GetCovalentRad(atom->GetAtomicNum());
 3052|   200k|        maxrad = std::max(rad[j],maxrad);
 3053|   200k|        zsorted.push_back(atom->GetIdx()-1);
 3054|   200k|      }
 3055|       |
 3056|  6.08k|    int idx1, idx2;
 3057|  6.08k|    double d2,cutoff,zd;
 3058|  6.08k|    vector3 atom1, atom2, wrapped_coords;  // Only used for periodic coords
 3059|   206k|    for (j = 0 ; j < max ; ++j)
  ------------------
  |  Branch (3059:18): [True: 200k, False: 6.08k]
  ------------------
 3060|   200k|      {
 3061|   200k|        double maxcutoff = SQUARE(rad[j]+maxrad+0.45);
  ------------------
  |  |  783|   200k|#define SQUARE(x) ((x)*(x))
  ------------------
 3062|   200k|        idx1 = zsorted[j];
 3063|  13.4M|        for (k = j + 1 ; k < max ; k++ )
  ------------------
  |  Branch (3063:26): [True: 13.3M, False: 118k]
  ------------------
 3064|  13.3M|          {
 3065|  13.3M|            idx2 = zsorted[k];
 3066|       |
 3067|       |            // bonded if closer than elemental Rcov + tolerance
 3068|  13.3M|            cutoff = SQUARE(rad[j] + rad[k] + 0.45);
  ------------------
  |  |  783|  13.3M|#define SQUARE(x) ((x)*(x))
  ------------------
 3069|       |
 3070|       |            // Use minimum image convention if the unit cell is periodic
 3071|       |            // Otherwise, use a simpler (faster) distance calculation based on raw coordinates
 3072|  13.3M|            if (IsPeriodic())
  ------------------
  |  Branch (3072:17): [True: 0, False: 13.3M]
  ------------------
 3073|      0|              {
 3074|      0|                atom1 = vector3(c[idx1*3], c[idx1*3+1], c[idx1*3+2]);
 3075|      0|                atom2 = vector3(c[idx2*3], c[idx2*3+1], c[idx2*3+2]);
 3076|      0|                OBUnitCell *unitCell = (OBUnitCell * ) GetData(OBGenericDataType::UnitCell);
 3077|      0|                wrapped_coords = unitCell->MinimumImageCartesian(atom1 - atom2);
 3078|      0|                d2 = wrapped_coords.length_2();
 3079|      0|              }
 3080|  13.3M|            else
 3081|  13.3M|              {
 3082|  13.3M|                zd  = SQUARE(c[idx1*3+2] - c[idx2*3+2]);
  ------------------
  |  |  783|  13.3M|#define SQUARE(x) ((x)*(x))
  ------------------
 3083|       |                // bigger than max cutoff, which is determined using largest radius,
 3084|       |                // not the radius of k (which might be small, ie H, and cause an early  termination)
 3085|       |                // since we sort by z, anything beyond k will also fail
 3086|  13.3M|                if (zd > maxcutoff )
  ------------------
  |  Branch (3086:21): [True: 82.4k, False: 13.2M]
  ------------------
 3087|  82.4k|                  break;
 3088|       |
 3089|  13.2M|                d2  = SQUARE(c[idx1*3]   - c[idx2*3]);
  ------------------
  |  |  783|  13.2M|#define SQUARE(x) ((x)*(x))
  ------------------
 3090|  13.2M|                if (d2 > cutoff)
  ------------------
  |  Branch (3090:21): [True: 1.44M, False: 11.8M]
  ------------------
 3091|  1.44M|                  continue; // x's bigger than cutoff
 3092|  11.8M|                d2 += SQUARE(c[idx1*3+1] - c[idx2*3+1]);
  ------------------
  |  |  783|  11.8M|#define SQUARE(x) ((x)*(x))
  ------------------
 3093|  11.8M|                if (d2 > cutoff)
  ------------------
  |  Branch (3093:21): [True: 225k, False: 11.5M]
  ------------------
 3094|   225k|                  continue; // x^2 + y^2 bigger than cutoff
 3095|  11.5M|                d2 += zd;
 3096|  11.5M|              }
 3097|       |
 3098|  11.5M|            if (d2 > cutoff)
  ------------------
  |  Branch (3098:17): [True: 25.1k, False: 11.5M]
  ------------------
 3099|  25.1k|              continue;
 3100|  11.5M|            if (d2 < 0.16) // 0.4 * 0.4 = 0.16
  ------------------
  |  Branch (3100:17): [True: 7.40M, False: 4.14M]
  ------------------
 3101|  7.40M|              continue;
 3102|       |
 3103|  4.14M|            atom = GetAtom(idx1+1);
 3104|  4.14M|            nbr  = GetAtom(idx2+1);
 3105|       |
 3106|  4.14M|            if (atom->IsConnected(nbr))
  ------------------
  |  Branch (3106:17): [True: 16, False: 4.14M]
  ------------------
 3107|     16|              continue;
 3108|       |
 3109|  4.14M|            if (!validAdditionalBond(atom,nbr) || !validAdditionalBond(nbr, atom))
  ------------------
  |  Branch (3109:17): [True: 1.02M, False: 3.12M]
  |  Branch (3109:51): [True: 691k, False: 2.43M]
  ------------------
 3110|  1.71M|              continue;
 3111|       |
 3112|  2.43M|            AddBond(idx1+1,idx2+1,1);
 3113|  2.43M|          }
 3114|   200k|      }
 3115|       |
 3116|       |    // If between BeginModify and EndModify, coord pointers are NULL
 3117|       |    // setup molecule to handle current coordinates
 3118|       |
 3119|  6.08k|    if (_c == nullptr)
  ------------------
  |  Branch (3119:9): [True: 33, False: 6.05k]
  ------------------
 3120|     33|      {
 3121|     33|        _c = c;
 3122|    129|        for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (3122:34): [True: 96, False: 33]
  ------------------
 3123|     96|          atom->SetCoordPtr(&_c);
 3124|     33|        _vconf.push_back(c);
 3125|     33|        unset = true;
 3126|     33|      }
 3127|       |
 3128|       |    // Cleanup -- delete long bonds that exceed max valence
 3129|  6.08k|    OBBond *maxbond, *bond;
 3130|  6.08k|    double maxlength;
 3131|  6.08k|    vector<OBBond*>::iterator l, m;
 3132|  6.08k|    int valCount;
 3133|  6.08k|    bool changed;
 3134|  6.08k|    BeginModify(); //prevent needless re-perception in DeleteBond
 3135|   287k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (3135:30): [True: 281k, False: 6.08k]
  ------------------
 3136|   281k|      {
 3137|  2.62M|        while (atom->GetExplicitValence() > static_cast<unsigned int>(OBElements::GetMaxBonds(atom->GetAtomicNum()))
  ------------------
  |  Branch (3137:16): [True: 2.26M, False: 360k]
  ------------------
 3138|   360k|               || atom->SmallestBondAngle() < 45.0)
  ------------------
  |  Branch (3138:19): [True: 79.6k, False: 280k]
  ------------------
 3139|  2.34M|          {
 3140|  2.34M|            bond = atom->BeginBond(l);
 3141|  2.34M|            maxbond = bond;
 3142|       |            // Fix from Liu Zhiguo 2008-01-26
 3143|       |            // loop past any bonds
 3144|       |            // which existed before ConnectTheDots was called
 3145|       |            // (e.g., from PDB resdata.txt)
 3146|  2.34M|            valCount = 0;
 3147|  2.34M|            while (valCount < bondCount[atom->GetIdx() - 1]) {
  ------------------
  |  Branch (3147:20): [True: 1.18k, False: 2.33M]
  ------------------
 3148|  1.18k|              bond = atom->NextBond(l);
 3149|       |              // timvdm: 2008-03-05
 3150|       |              // NextBond only returns NULL if the iterator l == _bonds.end().
 3151|       |              // This was casuing problems as follows:
 3152|       |              // NextBond = 0x????????
 3153|       |              // NextBond = 0x????????
 3154|       |              // NextBond = 0x????????
 3155|       |              // NextBond = 0x????????
 3156|       |              // NextBond = NULL  <-- this NULL was not detected
 3157|       |              // NextBond = 0x????????
 3158|  1.18k|              if (!bond) // so we add an additional check
  ------------------
  |  Branch (3158:19): [True: 336, False: 844]
  ------------------
 3159|    336|                break;
 3160|    844|              maxbond = bond;
 3161|    844|              valCount++;
 3162|    844|            }
 3163|  2.34M|            if (!bond) // no new bonds added for this atom, just skip it
  ------------------
  |  Branch (3163:17): [True: 336, False: 2.33M]
  ------------------
 3164|    336|              break;
 3165|       |
 3166|       |            // delete bonds between hydrogens when over max valence
 3167|  2.33M|            if (atom->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (3167:17): [True: 68.4k, False: 2.27M]
  ------------------
 3168|  68.4k|              {
 3169|  68.4k|                m = l;
 3170|  68.4k|                changed = false;
 3171|  1.42M|                for (;bond;bond = atom->NextBond(m))
  ------------------
  |  Branch (3171:23): [True: 1.36M, False: 57.3k]
  ------------------
 3172|  1.36M|                  {
 3173|  1.36M|                    if (bond->GetNbrAtom(atom)->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (3173:25): [True: 11.0k, False: 1.35M]
  ------------------
 3174|  11.0k|                      {
 3175|  11.0k|                        DeleteBond(bond);
 3176|  11.0k|                        changed = true;
 3177|  11.0k|                        break;
 3178|  11.0k|                      }
 3179|  1.36M|                  }
 3180|  68.4k|                if (changed)
  ------------------
  |  Branch (3180:21): [True: 11.0k, False: 57.3k]
  ------------------
 3181|  11.0k|                  {
 3182|       |                    // bond deleted, reevaluate BOSum
 3183|  11.0k|                    continue;
 3184|  11.0k|                  }
 3185|  57.3k|                else
 3186|  57.3k|                  {
 3187|       |                    // reset to first new bond
 3188|  57.3k|                    bond = maxbond;
 3189|  57.3k|                  }
 3190|  68.4k|              }
 3191|       |
 3192|  2.32M|            maxlength = maxbond->GetLength();
 3193|   118M|            for (bond = atom->NextBond(l);bond;bond = atom->NextBond(l))
  ------------------
  |  Branch (3193:43): [True: 116M, False: 2.32M]
  ------------------
 3194|   116M|              {
 3195|   116M|                if (bond->GetLength() > maxlength)
  ------------------
  |  Branch (3195:21): [True: 93.3k, False: 116M]
  ------------------
 3196|  93.3k|                  {
 3197|  93.3k|                    maxbond = bond;
 3198|  93.3k|                    maxlength = bond->GetLength();
 3199|  93.3k|                  }
 3200|   116M|              }
 3201|  2.32M|            DeleteBond(maxbond); // delete the new bond with the longest length
 3202|  2.32M|          }
 3203|   281k|      }
 3204|  6.08k|    EndModify();
 3205|  6.08k|    if (unset)
  ------------------
  |  Branch (3205:9): [True: 33, False: 6.05k]
  ------------------
 3206|     33|      {
 3207|     33|        if (_c != nullptr){
  ------------------
  |  Branch (3207:13): [True: 33, False: 0]
  ------------------
 3208|     33|          delete [] _c;
 3209|       |
 3210|       |          // Note that the above delete doesn't set _c value to nullptr
 3211|     33|          _c = nullptr;
 3212|     33|        }
 3213|       |
 3214|    129|        for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (3214:34): [True: 96, False: 33]
  ------------------
 3215|     96|          atom->ClearCoordPtr();
 3216|     33|	if (_vconf.size() > 0)
  ------------------
  |  Branch (3216:6): [True: 33, False: 0]
  ------------------
 3217|     33|	  _vconf.resize(_vconf.size()-1);
 3218|     33|      }
 3219|       |
 3220|  6.08k|    if (_c != nullptr)
  ------------------
  |  Branch (3220:9): [True: 6.05k, False: 33]
  ------------------
 3221|  6.05k|      delete [] c;
 3222|  6.08k|  }
_ZN9OpenBabel5OBMol18PerceiveBondOrdersEv:
 3233|  14.9k|  {
 3234|  14.9k|    if (Empty())
  ------------------
  |  Branch (3234:9): [True: 57, False: 14.9k]
  ------------------
 3235|     57|      return;
 3236|  14.9k|    if (_dimension != 3) return; // not useful on non-3D structures
  ------------------
  |  Branch (3236:9): [True: 5.71k, False: 9.21k]
  ------------------
 3237|       |
 3238|  9.21k|    obErrorLog.ThrowError(__FUNCTION__,
 3239|  9.21k|                          "Ran OpenBabel::PerceiveBondOrders", obAuditMsg);
 3240|       |
 3241|  9.21k|    OBAtom *atom, *b, *c;
 3242|  9.21k|    vector3 v1, v2;
 3243|  9.21k|    double angle;//, dist1, dist2;
 3244|  9.21k|    vector<OBAtom*>::iterator i;
 3245|  9.21k|    vector<OBBond*>::iterator j;//,k;
 3246|       |
 3247|       |    //  BeginModify();
 3248|       |
 3249|       |    // Pass 1: Assign estimated hybridization based on avg. angles
 3250|   468k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (3250:30): [True: 459k, False: 9.21k]
  ------------------
 3251|   459k|      {
 3252|   459k|        angle = atom->AverageBondAngle();
 3253|       |
 3254|       |        //        cout << atom->GetAtomicNum() << " " << angle << endl;
 3255|       |
 3256|   459k|        if (angle > 155.0)
  ------------------
  |  Branch (3256:13): [True: 723, False: 458k]
  ------------------
 3257|    723|          atom->SetHyb(1);
 3258|   458k|        else if (angle <= 155.0 && angle > 115.0)
  ------------------
  |  Branch (3258:18): [True: 391k, False: 67.6k]
  |  Branch (3258:36): [True: 490, False: 390k]
  ------------------
 3259|    490|          atom->SetHyb(2);
 3260|       |
 3261|       |        // special case for imines
 3262|   459k|        if (atom->GetAtomicNum() == OBElements::Nitrogen
  ------------------
  |  Branch (3262:13): [True: 17.0k, False: 442k]
  ------------------
 3263|  17.0k|            && atom->ExplicitHydrogenCount() == 1
  ------------------
  |  Branch (3263:16): [True: 227, False: 16.7k]
  ------------------
 3264|    227|            && atom->GetExplicitDegree() == 2
  ------------------
  |  Branch (3264:16): [True: 59, False: 168]
  ------------------
 3265|     59|            && angle > 109.5)
  ------------------
  |  Branch (3265:16): [True: 9, False: 50]
  ------------------
 3266|      9|          atom->SetHyb(2);
 3267|   459k|        else if(atom->GetAtomicNum() == OBElements::Nitrogen
  ------------------
  |  Branch (3267:17): [True: 17.0k, False: 442k]
  ------------------
 3268|  17.0k|            && atom->GetExplicitDegree() == 2
  ------------------
  |  Branch (3268:16): [True: 988, False: 16.0k]
  ------------------
 3269|    988|            && atom->IsInRing()) //azete
  ------------------
  |  Branch (3269:16): [True: 840, False: 148]
  ------------------
 3270|    840|          atom->SetHyb(2);
 3271|   459k|      } // pass 1
 3272|       |
 3273|       |    // Make sure upcoming calls to GetHyb() don't kill these temporary values
 3274|  9.21k|    SetHybridizationPerceived();
 3275|       |
 3276|       |    // Pass 2: look for 5-member rings with torsions <= 7.5 degrees
 3277|       |    //         and 6-member rings with torsions <= 12 degrees
 3278|       |    //         (set all atoms with at least two bonds to sp2)
 3279|       |
 3280|  9.21k|    vector<OBRing*> rlist;
 3281|  9.21k|    vector<OBRing*>::iterator ringit;
 3282|  9.21k|    vector<int> path;
 3283|  9.21k|    double torsions = 0.0;
 3284|       |
 3285|  9.21k|    if (!HasSSSRPerceived())
  ------------------
  |  Branch (3285:9): [True: 6.08k, False: 3.12k]
  ------------------
 3286|  6.08k|      FindSSSR();
 3287|  9.21k|    rlist = GetSSSR();
 3288|  79.2k|    for (ringit = rlist.begin(); ringit != rlist.end(); ++ringit)
  ------------------
  |  Branch (3288:34): [True: 70.0k, False: 9.21k]
  ------------------
 3289|  70.0k|      {
 3290|  70.0k|        if ((*ringit)->Size() == 5)
  ------------------
  |  Branch (3290:13): [True: 144, False: 69.9k]
  ------------------
 3291|    144|          {
 3292|    144|            path = (*ringit)->_path;
 3293|    144|            torsions =
 3294|    144|              ( fabs(GetTorsion(path[0], path[1], path[2], path[3])) +
 3295|    144|                fabs(GetTorsion(path[1], path[2], path[3], path[4])) +
 3296|    144|                fabs(GetTorsion(path[2], path[3], path[4], path[0])) +
 3297|    144|                fabs(GetTorsion(path[3], path[4], path[0], path[1])) +
 3298|    144|                fabs(GetTorsion(path[4], path[0], path[1], path[2])) ) / 5.0;
 3299|    144|            if (torsions <= 7.5)
  ------------------
  |  Branch (3299:17): [True: 28, False: 116]
  ------------------
 3300|     28|              {
 3301|    168|                for (unsigned int ringAtom = 0; ringAtom != path.size(); ++ringAtom)
  ------------------
  |  Branch (3301:49): [True: 140, False: 28]
  ------------------
 3302|    140|                  {
 3303|    140|                    b = GetAtom(path[ringAtom]);
 3304|       |                    // if an aromatic ring atom has valence 3, it is already set
 3305|       |                    // to sp2 because the average angles should be 120 anyway
 3306|       |                    // so only look for valence 2
 3307|    140|                    if (b->GetExplicitDegree() == 2)
  ------------------
  |  Branch (3307:25): [True: 114, False: 26]
  ------------------
 3308|    114|                      b->SetHyb(2);
 3309|    140|                  }
 3310|     28|              }
 3311|    144|          }
 3312|  69.9k|        else if ((*ringit)->Size() == 6)
  ------------------
  |  Branch (3312:18): [True: 11, False: 69.9k]
  ------------------
 3313|     11|          {
 3314|     11|            path = (*ringit)->_path;
 3315|     11|            torsions =
 3316|     11|              ( fabs(GetTorsion(path[0], path[1], path[2], path[3])) +
 3317|     11|                fabs(GetTorsion(path[1], path[2], path[3], path[4])) +
 3318|     11|                fabs(GetTorsion(path[2], path[3], path[4], path[5])) +
 3319|     11|                fabs(GetTorsion(path[3], path[4], path[5], path[0])) +
 3320|     11|                fabs(GetTorsion(path[4], path[5], path[0], path[1])) +
 3321|     11|                fabs(GetTorsion(path[5], path[0], path[1], path[2])) ) / 6.0;
 3322|     11|            if (torsions <= 12.0)
  ------------------
  |  Branch (3322:17): [True: 2, False: 9]
  ------------------
 3323|      2|              {
 3324|     14|                for (unsigned int ringAtom = 0; ringAtom != path.size(); ++ringAtom)
  ------------------
  |  Branch (3324:49): [True: 12, False: 2]
  ------------------
 3325|     12|                  {
 3326|     12|                    b = GetAtom(path[ringAtom]);
 3327|     12|                    if (b->GetExplicitDegree() == 2 || b->GetExplicitDegree() == 3)
  ------------------
  |  Branch (3327:25): [True: 11, False: 1]
  |  Branch (3327:56): [True: 1, False: 0]
  ------------------
 3328|     12|                      b->SetHyb(2);
 3329|     12|                  }
 3330|      2|              }
 3331|     11|          }
 3332|  70.0k|      }
 3333|       |
 3334|       |    // Pass 3: "Antialiasing" If an atom marked as sp hybrid isn't
 3335|       |    //          bonded to another or an sp2 hybrid isn't bonded
 3336|       |    //          to another (or terminal atoms in both cases)
 3337|       |    //          mark them to a lower hybridization for now
 3338|  9.21k|    bool openNbr;
 3339|   468k|    for (atom = BeginAtom(i);atom;atom = NextAtom(i))
  ------------------
  |  Branch (3339:30): [True: 459k, False: 9.21k]
  ------------------
 3340|   459k|      {
 3341|   459k|        if (atom->GetHyb() == 2 || atom->GetHyb() == 1)
  ------------------
  |  Branch (3341:13): [True: 1.40k, False: 458k]
  |  Branch (3341:36): [True: 817, False: 457k]
  ------------------
 3342|  2.22k|          {
 3343|  2.22k|            openNbr = false;
 3344|  2.22k|            for (b = atom->BeginNbrAtom(j); b; b = atom->NextNbrAtom(j))
  ------------------
  |  Branch (3344:45): [True: 2.10k, False: 120]
  ------------------
 3345|  2.10k|              {
 3346|  2.10k|                if (b->GetHyb() < 3 || b->GetExplicitDegree() == 1)
  ------------------
  |  Branch (3346:21): [True: 2.10k, False: 8]
  |  Branch (3346:40): [True: 5, False: 3]
  ------------------
 3347|  2.10k|                  {
 3348|  2.10k|                    openNbr = true;
 3349|  2.10k|                    break;
 3350|  2.10k|                  }
 3351|  2.10k|              }
 3352|  2.22k|            if (!openNbr && atom->GetHyb() == 2)
  ------------------
  |  Branch (3352:17): [True: 120, False: 2.10k]
  |  Branch (3352:29): [True: 12, False: 108]
  ------------------
 3353|     12|              atom->SetHyb(3);
 3354|  2.21k|            else if (!openNbr && atom->GetHyb() == 1)
  ------------------
  |  Branch (3354:22): [True: 108, False: 2.10k]
  |  Branch (3354:34): [True: 108, False: 0]
  ------------------
 3355|    108|              atom->SetHyb(2);
 3356|  2.22k|          }
 3357|   459k|      } // pass 3
 3358|       |
 3359|       |    // Pass 4: Check for known functional group patterns and assign bonds
 3360|       |    //         to the canonical form
 3361|       |    //      Currently we have explicit code to do this, but a "bond typer"
 3362|       |    //      is in progress to make it simpler to test and debug.
 3363|  9.21k|    bondtyper.AssignFunctionalGroupBonds(*this);
 3364|       |
 3365|       |    // Pass 5: Check for aromatic rings and assign bonds as appropriate
 3366|       |    // This is just a quick and dirty approximation that marks everything
 3367|       |    //  as potentially aromatic
 3368|       |
 3369|       |    // This doesn't work perfectly, but it's pretty decent.
 3370|       |    //  Need to have a list of SMARTS patterns for common rings
 3371|       |    //  which would "break ties" on complicated multi-ring systems
 3372|       |    // (Most of the current problems lie in the interface with the
 3373|       |    //   Kekulize code anyway, not in marking everything as potentially aromatic)
 3374|       |
 3375|  9.21k|    bool needs_kekulization = false; // are there any aromatic bonds?
 3376|  9.21k|    bool typed; // has this ring been typed?
 3377|  9.21k|    unsigned int loop, loopSize;
 3378|  79.2k|    for (ringit = rlist.begin(); ringit != rlist.end(); ++ringit)
  ------------------
  |  Branch (3378:34): [True: 70.0k, False: 9.21k]
  ------------------
 3379|  70.0k|      {
 3380|  70.0k|        typed = false;
 3381|  70.0k|        loopSize = (*ringit)->Size();
 3382|  70.0k|        if (loopSize == 5 || loopSize == 6 || loopSize == 7)
  ------------------
  |  Branch (3382:13): [True: 144, False: 69.9k]
  |  Branch (3382:30): [True: 11, False: 69.9k]
  |  Branch (3382:47): [True: 11, False: 69.9k]
  ------------------
 3383|    166|          {
 3384|    166|            path = (*ringit)->_path;
 3385|    275|            for(loop = 0; loop < loopSize; ++loop)
  ------------------
  |  Branch (3385:27): [True: 262, False: 13]
  ------------------
 3386|    262|              {
 3387|    262|                atom = GetAtom(path[loop]);
 3388|    262|                if(atom->HasBondOfOrder(2) || atom->HasBondOfOrder(3)
  ------------------
  |  Branch (3388:20): [True: 10, False: 252]
  |  Branch (3388:47): [True: 1, False: 251]
  ------------------
 3389|    251|                   || atom->GetHyb() != 2)
  ------------------
  |  Branch (3389:23): [True: 142, False: 109]
  ------------------
 3390|    153|                  {
 3391|    153|                    typed = true;
 3392|    153|                    break;
 3393|    153|                  }
 3394|    262|              }
 3395|       |
 3396|    166|            if (!typed)
  ------------------
  |  Branch (3396:17): [True: 13, False: 153]
  ------------------
 3397|     80|              for(loop = 0; loop < loopSize; ++loop)
  ------------------
  |  Branch (3397:29): [True: 67, False: 13]
  ------------------
 3398|     67|                {
 3399|       |                  //    cout << " set aromatic " << path[loop] << endl;
 3400|     67|                  (GetBond(path[loop], path[(loop+1) % loopSize]))->SetAromatic();
 3401|     67|                  needs_kekulization = true;
 3402|     67|                }
 3403|    166|          }
 3404|  70.0k|      }
 3405|       |
 3406|       |    // Kekulization is necessary if an aromatic bond is present
 3407|  9.21k|    if (needs_kekulization) {
  ------------------
  |  Branch (3407:9): [True: 12, False: 9.19k]
  ------------------
 3408|     12|      this->SetAromaticPerceived();
 3409|       |      // First of all, set the atoms at the ends of the aromatic bonds to also
 3410|       |      // be aromatic. This information is required for OBKekulize.
 3411|    354|      FOR_BONDS_OF_MOL(bond, this) {
  ------------------
  |  |  418|     12|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 354, False: 12]
  |  |  ------------------
  ------------------
 3412|    354|        if (bond->IsAromatic()) {
  ------------------
  |  Branch (3412:13): [True: 67, False: 287]
  ------------------
 3413|     67|          bond->GetBeginAtom()->SetAromatic();
 3414|     67|          bond->GetEndAtom()->SetAromatic();
 3415|     67|        }
 3416|    354|      }
 3417|     12|      bool ok = OBKekulize(this);
 3418|     12|      if (!ok) {
  ------------------
  |  Branch (3418:11): [True: 6, False: 6]
  ------------------
 3419|      6|        stringstream errorMsg;
 3420|      6|        errorMsg << "Failed to kekulize aromatic bonds in OBMol::PerceiveBondOrders";
 3421|      6|        std::string title = this->GetTitle();
 3422|      6|        if (!title.empty())
  ------------------
  |  Branch (3422:13): [True: 0, False: 6]
  ------------------
 3423|      0|          errorMsg << " (title is " << title << ")";
 3424|      6|        errorMsg << endl;
 3425|      6|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning);
 3426|       |        // return false; Should we return false for a kekulization failure?
 3427|      6|      }
 3428|     12|      this->SetAromaticPerceived(false);
 3429|     12|    }
 3430|       |
 3431|       |    // Quick pass.. eliminate inter-ring sulfur atom multiple bonds
 3432|       |    // dkoes - I have removed this code - if double bonds are set,
 3433|       |    // we should trust them.  See pdb_ligands_sdf/4iph_1fj.sdf for
 3434|       |    // a case where the charge isn't set, but we break the molecule
 3435|       |    // if we remove the double bond.  Also, the previous code was
 3436|       |    // fragile - relying on the total mol charge being set.  If we
 3437|       |    // are going to do anything, we should "perceive" a formal charge
 3438|       |    // in the case of a ring sulfur with a double bond (thiopyrylium)
 3439|       |
 3440|       |    // Pass 6: Assign remaining bond types, ordered by atom electronegativity
 3441|  9.21k|    vector<pair<OBAtom*,double> > sortedAtoms;
 3442|  9.21k|    vector<double> rad;
 3443|  9.21k|    vector<int> sorted;
 3444|  9.21k|    int iter, max;
 3445|  9.21k|    double maxElNeg, shortestBond, currentElNeg;
 3446|  9.21k|    double bondLength, testLength;
 3447|       |
 3448|   468k|    for (atom = BeginAtom(i) ; atom ; atom = NextAtom(i))
  ------------------
  |  Branch (3448:32): [True: 459k, False: 9.21k]
  ------------------
 3449|   459k|      {
 3450|       |        // if atoms have the same electronegativity, make sure those with shorter bonds
 3451|       |        // are handled first (helps with assignment of conjugated single/double bonds)
 3452|   459k|        shortestBond = 1.0e5;
 3453|   781k|        for (b = atom->BeginNbrAtom(j); b; b = atom->NextNbrAtom(j))
  ------------------
  |  Branch (3453:41): [True: 321k, False: 459k]
  ------------------
 3454|   321k|          {
 3455|   321k|            if (b->GetAtomicNum()!=1) shortestBond =
  ------------------
  |  Branch (3455:17): [True: 318k, False: 3.20k]
  ------------------
 3456|   318k|                                        std::min(shortestBond,(atom->GetBond(b))->GetLength());
 3457|   321k|          }
 3458|   459k|        pair<OBAtom*,double> entry(atom,
 3459|   459k|                                   OBElements::GetElectroNeg(atom->GetAtomicNum())*1e6+shortestBond);
 3460|       |
 3461|   459k|        sortedAtoms.push_back(entry);
 3462|   459k|      }
 3463|  9.21k|    sort(sortedAtoms.begin(), sortedAtoms.end(), SortAtomZ);
 3464|       |
 3465|  9.21k|    max = sortedAtoms.size();
 3466|   468k|    for (iter = 0 ; iter < max ; iter++ )
  ------------------
  |  Branch (3466:21): [True: 459k, False: 9.21k]
  ------------------
 3467|   459k|      {
 3468|   459k|        atom = sortedAtoms[iter].first;
 3469|       |        // Debugging statement
 3470|       |        //        cout << " atom->Hyb " << atom->GetAtomicNum() << " " << atom->GetIdx() << " " << atom->GetHyb()
 3471|       |        //             << " BO: " << atom->GetExplicitValence() << endl;
 3472|       |
 3473|       |        // Possible sp-hybrids
 3474|   459k|        if ( (atom->GetHyb() == 1 || atom->GetExplicitDegree() == 1)
  ------------------
  |  Branch (3474:15): [True: 709, False: 458k]
  |  Branch (3474:38): [True: 35.8k, False: 423k]
  ------------------
 3475|  36.5k|             && atom->GetExplicitValence() + 2  <= static_cast<unsigned int>(OBElements::GetMaxBonds(atom->GetAtomicNum()))
  ------------------
  |  Branch (3475:17): [True: 22.6k, False: 13.8k]
  ------------------
 3476|   459k|             )
 3477|  22.6k|          {
 3478|       |
 3479|       |            // loop through the neighbors looking for a hybrid or terminal atom
 3480|       |            // (and pick the one with highest electronegativity first)
 3481|       |            // *or* pick a neighbor that's a terminal atom
 3482|  22.6k|            if (atom->HasNonSingleBond() ||
  ------------------
  |  Branch (3482:17): [True: 2.88k, False: 19.8k]
  ------------------
 3483|  19.8k|                (atom->GetAtomicNum() == 7 && atom->GetExplicitValence() + 2 > 3))
  ------------------
  |  Branch (3483:18): [True: 2.78k, False: 17.0k]
  |  Branch (3483:47): [True: 14, False: 2.77k]
  ------------------
 3484|  2.89k|              continue;
 3485|       |
 3486|  19.7k|            maxElNeg = 0.0;
 3487|  19.7k|            shortestBond = 5000.0;
 3488|  19.7k|            c = nullptr;
 3489|  39.7k|            for (b = atom->BeginNbrAtom(j); b; b = atom->NextNbrAtom(j))
  ------------------
  |  Branch (3489:45): [True: 19.9k, False: 19.7k]
  ------------------
 3490|  19.9k|              {
 3491|  19.9k|                currentElNeg = OBElements::GetElectroNeg(b->GetAtomicNum());
 3492|  19.9k|                if ( (b->GetHyb() == 1 || b->GetExplicitDegree() == 1)
  ------------------
  |  Branch (3492:23): [True: 561, False: 19.4k]
  |  Branch (3492:43): [True: 3.27k, False: 16.1k]
  ------------------
 3493|  3.83k|                     && b->GetExplicitValence() + 2 <= static_cast<unsigned int>(OBElements::GetMaxBonds(b->GetAtomicNum()))
  ------------------
  |  Branch (3493:25): [True: 2.43k, False: 1.40k]
  ------------------
 3494|  2.43k|                     && (currentElNeg > maxElNeg ||
  ------------------
  |  Branch (3494:26): [True: 2.25k, False: 172]
  ------------------
 3495|    172|                         (IsApprox(currentElNeg,maxElNeg, 1.0e-6)
  ------------------
  |  Branch (3495:27): [True: 140, False: 32]
  ------------------
 3496|    140|                          && (atom->GetBond(b))->GetLength() < shortestBond)) )
  ------------------
  |  Branch (3496:30): [True: 56, False: 84]
  ------------------
 3497|  2.31k|                  {
 3498|  2.31k|                    if (b->HasNonSingleBond() ||
  ------------------
  |  Branch (3498:25): [True: 324, False: 1.99k]
  ------------------
 3499|  1.99k|                        (b->GetAtomicNum() == 7 && b->GetExplicitValence() + 2 > 3))
  ------------------
  |  Branch (3499:26): [True: 244, False: 1.74k]
  |  Branch (3499:52): [True: 25, False: 219]
  ------------------
 3500|    349|                      continue;
 3501|       |
 3502|       |                    // Test terminal bonds against expected triple bond lengths
 3503|  1.96k|                    bondLength = (atom->GetBond(b))->GetLength();
 3504|  1.96k|                    if (atom->GetExplicitDegree() == 1 || b->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (3504:25): [True: 1.77k, False: 194]
  |  Branch (3504:59): [True: 107, False: 87]
  ------------------
 3505|  1.87k|                      testLength = CorrectedBondRad(atom->GetAtomicNum(), atom->GetHyb())
 3506|  1.87k|                        + CorrectedBondRad(b->GetAtomicNum(), b->GetHyb());
 3507|  1.87k|                      if (bondLength > 0.9 * testLength)
  ------------------
  |  Branch (3507:27): [True: 630, False: 1.24k]
  ------------------
 3508|    630|                        continue; // too long, ignore it
 3509|  1.87k|                    }
 3510|       |
 3511|  1.33k|                    shortestBond = bondLength;
 3512|  1.33k|                    maxElNeg = OBElements::GetElectroNeg(b->GetAtomicNum());
 3513|  1.33k|                    c = b; // save this atom for later use
 3514|  1.33k|                  }
 3515|  19.9k|              }
 3516|  19.7k|            if (c)
  ------------------
  |  Branch (3516:17): [True: 1.32k, False: 18.4k]
  ------------------
 3517|  1.32k|              (atom->GetBond(c))->SetBondOrder(3);
 3518|  19.7k|          }
 3519|       |        // Possible sp2-hybrid atoms
 3520|   437k|        else if ( (atom->GetHyb() == 2 || atom->GetExplicitDegree() == 1)
  ------------------
  |  Branch (3520:20): [True: 1.50k, False: 435k]
  |  Branch (3520:43): [True: 13.7k, False: 421k]
  ------------------
 3521|  15.2k|                  && atom->GetExplicitValence() + 1 <= static_cast<unsigned int>(OBElements::GetMaxBonds(atom->GetAtomicNum())) )
  ------------------
  |  Branch (3521:22): [True: 7.19k, False: 8.04k]
  ------------------
 3522|  7.19k|          {
 3523|       |            // as above
 3524|  7.19k|            if (atom->HasNonSingleBond() ||
  ------------------
  |  Branch (3524:17): [True: 884, False: 6.30k]
  ------------------
 3525|  6.30k|                (atom->GetAtomicNum() == 7 && atom->GetExplicitValence() + 1 > 3))
  ------------------
  |  Branch (3525:18): [True: 791, False: 5.51k]
  |  Branch (3525:47): [True: 6, False: 785]
  ------------------
 3526|    890|              continue;
 3527|       |
 3528|       |            // Don't build multiple bonds to ring sulfurs
 3529|       |            //  except thiopyrylium
 3530|  6.30k|            if (atom->IsInRing() && atom->GetAtomicNum() == 16) {
  ------------------
  |  Branch (3530:17): [True: 926, False: 5.37k]
  |  Branch (3530:37): [True: 55, False: 871]
  ------------------
 3531|     55|              if (_totalCharge > 1 && atom->GetFormalCharge() == 0)
  ------------------
  |  Branch (3531:19): [True: 0, False: 55]
  |  Branch (3531:39): [True: 0, False: 0]
  ------------------
 3532|      0|                atom->SetFormalCharge(+1);
 3533|     55|              else
 3534|     55|                continue;
 3535|     55|            }
 3536|       |
 3537|  6.24k|            maxElNeg = 0.0;
 3538|  6.24k|            shortestBond = 5000.0;
 3539|  6.24k|            c = nullptr;
 3540|  13.5k|            for (b = atom->BeginNbrAtom(j); b; b = atom->NextNbrAtom(j))
  ------------------
  |  Branch (3540:45): [True: 7.32k, False: 6.24k]
  ------------------
 3541|  7.32k|              {
 3542|  7.32k|                currentElNeg = OBElements::GetElectroNeg(b->GetAtomicNum());
 3543|  7.32k|                if ( (b->GetHyb() == 2 || b->GetExplicitDegree() == 1)
  ------------------
  |  Branch (3543:23): [True: 218, False: 7.10k]
  |  Branch (3543:43): [True: 1.17k, False: 5.93k]
  ------------------
 3544|  1.38k|                     && b->GetExplicitValence() + 1 <= static_cast<unsigned int>(OBElements::GetMaxBonds(b->GetAtomicNum()))
  ------------------
  |  Branch (3544:25): [True: 1.17k, False: 213]
  ------------------
 3545|  1.17k|                     && (GetBond(atom, b))->IsDoubleBondGeometry()
  ------------------
  |  Branch (3545:25): [True: 1.15k, False: 16]
  ------------------
 3546|  1.15k|                     && (currentElNeg > maxElNeg || (IsApprox(currentElNeg,maxElNeg, 1.0e-6)) ) )
  ------------------
  |  Branch (3546:26): [True: 1.09k, False: 64]
  |  Branch (3546:53): [True: 49, False: 15]
  ------------------
 3547|  1.14k|                  {
 3548|  1.14k|                    if (b->HasNonSingleBond() ||
  ------------------
  |  Branch (3548:25): [True: 23, False: 1.12k]
  ------------------
 3549|  1.12k|                        (b->GetAtomicNum() == 7 && b->GetExplicitValence() + 1 > 3))
  ------------------
  |  Branch (3549:26): [True: 108, False: 1.01k]
  |  Branch (3549:52): [True: 7, False: 101]
  ------------------
 3550|     30|                      continue;
 3551|       |
 3552|  1.11k|                    if (b->IsInRing() && b->GetAtomicNum() == 16) {
  ------------------
  |  Branch (3552:25): [True: 132, False: 982]
  |  Branch (3552:42): [True: 17, False: 115]
  ------------------
 3553|     17|                      if (_totalCharge > 1 && b->GetFormalCharge() == 0)
  ------------------
  |  Branch (3553:27): [True: 0, False: 17]
  |  Branch (3553:47): [True: 0, False: 0]
  ------------------
 3554|      0|                        b->SetFormalCharge(+1);
 3555|     17|                      else
 3556|     17|                        continue;
 3557|     17|                    }
 3558|       |
 3559|       |                    // Test terminal bonds against expected double bond lengths
 3560|  1.09k|                    bondLength = (atom->GetBond(b))->GetLength();
 3561|  1.09k|                    if (atom->GetExplicitDegree() == 1 || b->GetExplicitDegree() == 1) {
  ------------------
  |  Branch (3561:25): [True: 840, False: 257]
  |  Branch (3561:59): [True: 138, False: 119]
  ------------------
 3562|    978|                      testLength = CorrectedBondRad(atom->GetAtomicNum(), atom->GetHyb())
 3563|    978|                        + CorrectedBondRad(b->GetAtomicNum(), b->GetHyb());
 3564|    978|                      if (bondLength > 0.93 * testLength)
  ------------------
  |  Branch (3564:27): [True: 122, False: 856]
  ------------------
 3565|    122|                        continue; // too long, ignore it
 3566|    978|                    }
 3567|       |
 3568|       |                    // OK, see if this is better than the previous choice
 3569|       |                    // If it's much shorter, pick it (e.g., fulvene)
 3570|       |                    // If they're close (0.1A) then prefer the bond in the ring
 3571|    975|                    double difference = shortestBond - (atom->GetBond(b))->GetLength();
 3572|    975|                    if ( (difference > 0.1)
  ------------------
  |  Branch (3572:26): [True: 587, False: 388]
  ------------------
 3573|    388|                         || ( (difference > -0.01) &&
  ------------------
  |  Branch (3573:31): [True: 33, False: 355]
  ------------------
 3574|     33|                              ( (!atom->IsInRing() || !c || !c->IsInRing() || b->IsInRing())
  ------------------
  |  Branch (3574:34): [True: 18, False: 15]
  |  Branch (3574:55): [True: 0, False: 15]
  |  Branch (3574:61): [True: 2, False: 13]
  |  Branch (3574:79): [True: 2, False: 11]
  ------------------
 3575|    609|                                || (atom->IsInRing() && c && !c->IsInRing() && b->IsInRing()) ) ) ) {
  ------------------
  |  Branch (3575:37): [True: 11, False: 0]
  |  Branch (3575:57): [True: 11, False: 0]
  |  Branch (3575:62): [True: 0, False: 11]
  |  Branch (3575:80): [True: 0, False: 0]
  ------------------
 3576|    609|                      shortestBond = (atom->GetBond(b))->GetLength();
 3577|    609|                      maxElNeg = OBElements::GetElectroNeg(b->GetAtomicNum());
 3578|    609|                      c = b; // save this atom for later use
 3579|    609|                    } // is this bond better than previous choices
 3580|    975|                  }
 3581|  7.32k|              } // loop through neighbors
 3582|  6.24k|            if (c)
  ------------------
  |  Branch (3582:17): [True: 579, False: 5.66k]
  ------------------
 3583|    579|              (atom->GetBond(c))->SetBondOrder(2);
 3584|  6.24k|          }
 3585|   459k|      } // pass 6
 3586|       |
 3587|       |    // Now let the atom typer go to work again
 3588|  9.21k|    _flags &= (~(OB_HYBRID_MOL));
  ------------------
  |  |   85|  9.21k|#define OB_HYBRID_MOL            (1<<8)
  ------------------
 3589|  9.21k|    _flags &= (~(OB_AROMATIC_MOL));
  ------------------
  |  |   77|  9.21k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
 3590|  9.21k|    _flags &= (~(OB_ATOMTYPES_MOL));
  ------------------
  |  |   79|  9.21k|#define OB_ATOMTYPES_MOL         (1<<4)
  ------------------
 3591|       |    //  EndModify(true); // "nuke" perceived data
 3592|       |
 3593|       |    //Set _spinMultiplicity other than zero for atoms which are hydrogen
 3594|       |    //deficient and which have implicit valency definitions (essentially the
 3595|       |    //organic subset in SMILES). There are assumed to no implicit hydrogens.
 3596|       |    //AssignSpinMultiplicity(true); // TODO: sort out radicals
 3597|  9.21k|    }
_ZN9OpenBabel5OBMol12SetConformerEj:
 3753|   291k|  {
 3754|   291k|    if (i < _vconf.size())
  ------------------
  |  Branch (3754:9): [True: 291k, False: 0]
  ------------------
 3755|   291k|      _c = _vconf[i];
 3756|   291k|  }
_ZN9OpenBabel5OBMol9BeginAtomERNSt3__111__wrap_iterIPPNS_6OBAtomEEE:
 3994|  24.5M|  {
 3995|  24.5M|    i = _vatom.begin();
 3996|  24.5M|    return i == _vatom.end() ? nullptr : (OBAtom*)*i;
  ------------------
  |  Branch (3996:12): [True: 2.58k, False: 24.5M]
  ------------------
 3997|  24.5M|  }
_ZNK9OpenBabel5OBMol9BeginAtomERNSt3__111__wrap_iterIPKPNS_6OBAtomEEE:
 4000|  8.89k|  {
 4001|  8.89k|    i = _vatom.cbegin();
 4002|  8.89k|    return i == _vatom.cend() ? nullptr : (OBAtom *)*i;
  ------------------
  |  Branch (4002:12): [True: 57, False: 8.83k]
  ------------------
 4003|  8.89k|  }
_ZN9OpenBabel5OBMol8NextAtomERNSt3__111__wrap_iterIPPNS_6OBAtomEEE:
 4006|  3.44G|  {
 4007|  3.44G|    ++i;
 4008|  3.44G|    return i == _vatom.end() ? nullptr : (OBAtom*)*i;
  ------------------
  |  Branch (4008:12): [True: 0, False: 3.44G]
  ------------------
 4009|  3.44G|  }
_ZNK9OpenBabel5OBMol8NextAtomERNSt3__111__wrap_iterIPKPNS_6OBAtomEEE:
 4012|   393k|  {
 4013|   393k|    ++i;
 4014|   393k|    return i == _vatom.cend() ? nullptr : (OBAtom *)*i;
  ------------------
  |  Branch (4014:12): [True: 0, False: 393k]
  ------------------
 4015|   393k|  }
_ZN9OpenBabel5OBMol9BeginBondERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 4018|  5.38M|  {
 4019|  5.38M|    i = _vbond.begin();
 4020|  5.38M|    return i == _vbond.end() ? nullptr : (OBBond*)*i;
  ------------------
  |  Branch (4020:12): [True: 712k, False: 4.66M]
  ------------------
 4021|  5.38M|  }
_ZN9OpenBabel5OBMol8NextBondERNSt3__111__wrap_iterIPPNS_6OBBondEEE:
 4024|  12.5G|  {
 4025|  12.5G|    ++i;
 4026|  12.5G|    return i == _vbond.end() ? nullptr : (OBBond*)*i;
  ------------------
  |  Branch (4026:12): [True: 0, False: 12.5G]
  ------------------
 4027|  12.5G|  }
_ZN9OpenBabel5OBMol13AreInSameRingEPNS_6OBAtomES2_:
 4031|  6.96k|  {
 4032|  6.96k|    bool a_in, b_in;
 4033|  6.96k|    vector<OBRing*> vr;
 4034|  6.96k|    vr = GetLSSR();
 4035|       |
 4036|  6.96k|    vector<OBRing*>::iterator i;
 4037|  6.96k|    vector<int>::iterator j;
 4038|       |
 4039|   104k|    for (i = vr.begin();i != vr.end();++i) {
  ------------------
  |  Branch (4039:25): [True: 104k, False: 225]
  ------------------
 4040|   104k|      a_in = false;
 4041|   104k|      b_in = false;
 4042|       |      // Go through the path of the ring and see if a and/or b match
 4043|       |      // each node in the path
 4044|   564k|      for(j = (*i)->_path.begin();j != (*i)->_path.end();++j) {
  ------------------
  |  Branch (4044:35): [True: 460k, False: 104k]
  ------------------
 4045|   460k|        if ((unsigned)(*j) == a->GetIdx())
  ------------------
  |  Branch (4045:13): [True: 8.36k, False: 452k]
  ------------------
 4046|  8.36k|          a_in = true;
 4047|   460k|        if ((unsigned)(*j) == b->GetIdx())
  ------------------
  |  Branch (4047:13): [True: 10.8k, False: 450k]
  ------------------
 4048|  10.8k|          b_in = true;
 4049|   460k|      }
 4050|       |
 4051|   104k|      if (a_in && b_in)
  ------------------
  |  Branch (4051:11): [True: 8.36k, False: 95.6k]
  |  Branch (4051:19): [True: 6.73k, False: 1.62k]
  ------------------
 4052|  6.73k|        return (*i)->Size();
 4053|   104k|    }
 4054|       |
 4055|    225|    return 0;
 4056|  6.96k|  }
_ZN9OpenBabel5OBMol8SeparateEi:
 4059|  8.40k|  {
 4060|  8.40k|    vector<OBMol> result;
 4061|  8.40k|    if( NumAtoms() == 0 )
  ------------------
  |  Branch (4061:9): [True: 0, False: 8.40k]
  ------------------
 4062|      0|      return result; // nothing to do, but let's prevent a crash
 4063|       |
 4064|  8.40k|    OBMolAtomDFSIter iter( this, StartIndex );
 4065|  8.40k|    OBMol newMol;
 4066|   251k|    while( GetNextFragment( iter, newMol ) ) {
  ------------------
  |  Branch (4066:12): [True: 242k, False: 8.40k]
  ------------------
 4067|   242k|      result.push_back( newMol );
 4068|   242k|      newMol.Clear();
 4069|   242k|    }
 4070|       |
 4071|  8.40k|    return result;
 4072|  8.40k|  }
_ZN9OpenBabel5OBMol16CopySubstructureERS0_PNS_8OBBitVecES3_jPNSt3__16vectorIjNS4_9allocatorIjEEEES9_:
 4154|   251k|  {
 4155|   251k|    if (!atoms)
  ------------------
  |  Branch (4155:9): [True: 0, False: 251k]
  ------------------
 4156|      0|      return false;
 4157|       |
 4158|   251k|    bool record_atomorder = atomorder != nullptr;
 4159|   251k|    bool record_bondorder = bondorder != nullptr;
 4160|   251k|    bool bonds_specified = excludebonds != nullptr;
 4161|       |
 4162|   251k|    newmol.SetDimension(GetDimension());
 4163|       |
 4164|       |    // If the parent is set to periodic, then also apply boundary conditions to the fragments
 4165|   251k|    if (IsPeriodic()) {
  ------------------
  |  Branch (4165:9): [True: 0, False: 251k]
  ------------------
 4166|      0|      OBUnitCell* parent_uc = (OBUnitCell*)GetData(OBGenericDataType::UnitCell);
 4167|      0|      newmol.SetData(parent_uc->Clone(nullptr));
 4168|      0|      newmol.SetPeriodicMol();
 4169|      0|    }
 4170|       |    // If the parent had aromaticity perceived, then retain that for the fragment
 4171|   251k|    newmol.SetFlag(_flags & OB_AROMATIC_MOL);
  ------------------
  |  |   77|   251k|#define OB_AROMATIC_MOL          (1<<3)
  ------------------
 4172|       |    // The fragment will preserve the "chains perceived" flag of the parent
 4173|   251k|    newmol.SetFlag(_flags & OB_CHAINS_MOL);
  ------------------
  |  |   93|   251k|#define OB_CHAINS_MOL            (1<<15)
  ------------------
 4174|       |    // We will check for residues only if the parent has chains perceived already
 4175|   251k|    bool checkresidues = HasChainsPerceived();
 4176|       |
 4177|       |    // Now add the atoms
 4178|   251k|    map<OBAtom*, OBAtom*> AtomMap;//key is from old mol; value from new mol
 4179|  1.85M|    for (int bit = atoms->FirstBit(); bit != atoms->EndBit(); bit = atoms->NextBit(bit)) {
  ------------------
  |  Branch (4179:39): [True: 1.60M, False: 251k]
  ------------------
 4180|  1.60M|      OBAtom* atom = this->GetAtom(bit);
 4181|  1.60M|      if (!atom)
  ------------------
  |  Branch (4181:11): [True: 0, False: 1.60M]
  ------------------
 4182|      0|        return false;
 4183|  1.60M|      newmol.AddAtom(*atom); // each subsequent atom
 4184|  1.60M|      if (record_atomorder)
  ------------------
  |  Branch (4184:11): [True: 0, False: 1.60M]
  ------------------
 4185|      0|        atomorder->push_back(bit);
 4186|  1.60M|      AtomMap[&*atom] = newmol.GetAtom(newmol.NumAtoms());
 4187|  1.60M|    }
 4188|       |
 4189|       |    //Add the residues
 4190|   251k|    if (checkresidues) {
  ------------------
  |  Branch (4190:9): [True: 138k, False: 113k]
  ------------------
 4191|   138k|      map<OBResidue*, OBResidue*> ResidueMap; // map from old->new
 4192|   574k|      for (int bit = atoms->FirstBit(); bit != atoms->EndBit(); bit = atoms->NextBit(bit)) {
  ------------------
  |  Branch (4192:41): [True: 436k, False: 138k]
  ------------------
 4193|   436k|        OBAtom* atom = this->GetAtom(bit);
 4194|   436k|        OBResidue* res = atom->GetResidue();
 4195|   436k|        if (!res) continue;
  ------------------
  |  Branch (4195:13): [True: 0, False: 436k]
  ------------------
 4196|   436k|        map<OBResidue*, OBResidue*>::iterator mit = ResidueMap.find(res);
 4197|   436k|        OBResidue *newres;
 4198|   436k|        if (mit == ResidueMap.end()) {
  ------------------
  |  Branch (4198:13): [True: 197k, False: 238k]
  ------------------
 4199|   197k|          newres = newmol.NewResidue();
 4200|   197k|          *newres = *res;
 4201|   197k|          ResidueMap[res] = newres;
 4202|   238k|        } else {
 4203|   238k|          newres = mit->second;
 4204|   238k|        }
 4205|   436k|        OBAtom* newatom = AtomMap[&*atom];
 4206|   436k|        newres->AddAtom(newatom);
 4207|   436k|        newres->SetAtomID(newatom, res->GetAtomID(atom));
 4208|   436k|        newres->SetHetAtom(newatom, res->IsHetAtom(atom));
 4209|   436k|        newres->SetSerialNum(newatom, res->GetSerialNum(atom));
 4210|   436k|      }
 4211|   138k|    }
 4212|       |
 4213|       |    // Update Stereo
 4214|   251k|    std::vector<OBGenericData*>::iterator data;
 4215|   251k|    std::vector<OBGenericData*> stereoData = GetAllData(OBGenericDataType::StereoData);
 4216|   433k|    for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (4216:37): [True: 182k, False: 251k]
  ------------------
 4217|   182k|      if (static_cast<OBStereoBase*>(*data)->GetType() == OBStereo::CisTrans) {
  ------------------
  |  Branch (4217:11): [True: 137k, False: 45.2k]
  ------------------
 4218|   137k|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 4219|       |
 4220|       |        // Check that the entirety of this cistrans cfg occurs in this substructure
 4221|   137k|        OBCisTransStereo::Config cfg = ct->GetConfig();
 4222|   137k|        OBAtom* begin = GetAtomById(cfg.begin);
 4223|   137k|        if (AtomMap.find(begin) == AtomMap.end())
  ------------------
  |  Branch (4223:13): [True: 128k, False: 8.75k]
  ------------------
 4224|   128k|          continue;
 4225|  8.75k|        OBAtom* end = GetAtomById(cfg.end);
 4226|  8.75k|        if (AtomMap.find(end) == AtomMap.end())
  ------------------
  |  Branch (4226:13): [True: 0, False: 8.75k]
  ------------------
 4227|      0|          continue;
 4228|  8.75k|        bool skip_cfg = false;
 4229|  8.75k|        if (bonds_specified) {
  ------------------
  |  Branch (4229:13): [True: 6.83k, False: 1.92k]
  ------------------
 4230|  9.23k|          FOR_BONDS_OF_ATOM(bond, begin) {
  ------------------
  |  |  420|  6.83k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 9.23k, False: 2.01k]
  |  |  ------------------
  ------------------
 4231|  9.23k|            if (excludebonds->BitIsSet(bond->GetIdx())) {
  ------------------
  |  Branch (4231:17): [True: 4.81k, False: 4.42k]
  ------------------
 4232|  4.81k|              skip_cfg = true;
 4233|  4.81k|              break;
 4234|  4.81k|            }
 4235|  9.23k|          }
 4236|  6.83k|          if (skip_cfg)
  ------------------
  |  Branch (4236:15): [True: 4.81k, False: 2.01k]
  ------------------
 4237|  4.81k|            continue;
 4238|  4.77k|          FOR_BONDS_OF_ATOM(bond, end) {
  ------------------
  |  |  420|  2.01k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 4.77k, False: 1.92k]
  |  |  ------------------
  ------------------
 4239|  4.77k|            if (excludebonds->BitIsSet(bond->GetIdx())) {
  ------------------
  |  Branch (4239:17): [True: 95, False: 4.68k]
  ------------------
 4240|     95|              skip_cfg = true;
 4241|     95|              break;
 4242|     95|            }
 4243|  4.77k|          }
 4244|  2.01k|          if (skip_cfg)
  ------------------
  |  Branch (4244:15): [True: 95, False: 1.92k]
  ------------------
 4245|     95|            continue;
 4246|  2.01k|        }
 4247|  19.2k|        for (OBStereo::RefIter ri = cfg.refs.begin(); ri != cfg.refs.end(); ++ri) {
  ------------------
  |  Branch (4247:55): [True: 15.3k, False: 3.84k]
  ------------------
 4248|  15.3k|          if (*ri != OBStereo::ImplicitRef && AtomMap.find(GetAtomById(*ri)) == AtomMap.end()) {
  ------------------
  |  Branch (4248:15): [True: 9.78k, False: 5.59k]
  |  Branch (4248:15): [True: 0, False: 15.3k]
  |  Branch (4248:47): [True: 0, False: 9.78k]
  ------------------
 4249|      0|            skip_cfg = true;
 4250|      0|            break;
 4251|      0|          }
 4252|  15.3k|        }
 4253|  3.84k|        if (skip_cfg)
  ------------------
  |  Branch (4253:13): [True: 0, False: 3.84k]
  ------------------
 4254|      0|          continue;
 4255|       |
 4256|  3.84k|        OBCisTransStereo::Config newcfg;
 4257|  3.84k|        newcfg.specified = cfg.specified;
 4258|  3.84k|        newcfg.begin = cfg.begin == OBStereo::ImplicitRef ? OBStereo::ImplicitRef : AtomMap[GetAtomById(cfg.begin)]->GetId();
  ------------------
  |  Branch (4258:24): [True: 0, False: 3.84k]
  ------------------
 4259|  3.84k|        newcfg.end = cfg.end == OBStereo::ImplicitRef ? OBStereo::ImplicitRef : AtomMap[GetAtomById(cfg.end)]->GetId();
  ------------------
  |  Branch (4259:22): [True: 0, False: 3.84k]
  ------------------
 4260|  3.84k|        OBStereo::Refs refs;
 4261|  19.2k|        for (OBStereo::RefIter ri = cfg.refs.begin(); ri != cfg.refs.end(); ++ri) {
  ------------------
  |  Branch (4261:55): [True: 15.3k, False: 3.84k]
  ------------------
 4262|  15.3k|          OBStereo::Ref ref = *ri == OBStereo::ImplicitRef ? OBStereo::ImplicitRef : AtomMap[GetAtomById(*ri)]->GetId();
  ------------------
  |  Branch (4262:31): [True: 5.59k, False: 9.78k]
  ------------------
 4263|  15.3k|          refs.push_back(ref);
 4264|  15.3k|        }
 4265|  3.84k|        newcfg.refs = refs;
 4266|       |
 4267|  3.84k|        OBCisTransStereo *newct = new OBCisTransStereo(this);
 4268|  3.84k|        newct->SetConfig(newcfg);
 4269|  3.84k|        newmol.SetData(newct);
 4270|  3.84k|      }
 4271|  45.2k|      else if (static_cast<OBStereoBase*>(*data)->GetType() == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (4271:16): [True: 45.2k, False: 0]
  ------------------
 4272|  45.2k|        OBTetrahedralStereo *tet = dynamic_cast<OBTetrahedralStereo*>(*data);
 4273|  45.2k|        OBTetrahedralStereo::Config cfg = tet->GetConfig();
 4274|       |
 4275|       |        // Check that the entirety of this tet cfg occurs in this substructure
 4276|  45.2k|        OBAtom *center = GetAtomById(cfg.center);
 4277|  45.2k|        std::map<OBAtom*, OBAtom*>::iterator centerit = AtomMap.find(center);
 4278|  45.2k|        if (centerit == AtomMap.end())
  ------------------
  |  Branch (4278:13): [True: 42.6k, False: 2.55k]
  ------------------
 4279|  42.6k|          continue;
 4280|  2.55k|        if (cfg.from != OBStereo::ImplicitRef && AtomMap.find(GetAtomById(cfg.from)) == AtomMap.end())
  ------------------
  |  Branch (4280:13): [True: 2.46k, False: 92]
  |  Branch (4280:13): [True: 0, False: 2.55k]
  |  Branch (4280:50): [True: 0, False: 2.46k]
  ------------------
 4281|      0|          continue;
 4282|  2.55k|        bool skip_cfg = false;
 4283|  2.55k|        if (bonds_specified) {
  ------------------
  |  Branch (4283:13): [True: 1.71k, False: 845]
  ------------------
 4284|  4.61k|          FOR_BONDS_OF_ATOM(bond, center) {
  ------------------
  |  |  420|  1.71k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 4.61k, False: 956]
  |  |  ------------------
  ------------------
 4285|  4.61k|            if (excludebonds->BitIsSet(bond->GetIdx())) {
  ------------------
  |  Branch (4285:17): [True: 754, False: 3.85k]
  ------------------
 4286|    754|              skip_cfg = true;
 4287|    754|              break;
 4288|    754|            }
 4289|  4.61k|          }
 4290|  1.71k|          if (skip_cfg)
  ------------------
  |  Branch (4290:15): [True: 754, False: 956]
  ------------------
 4291|    754|            continue;
 4292|  1.71k|        }
 4293|  6.99k|        for (OBStereo::RefIter ri = cfg.refs.begin(); ri != cfg.refs.end(); ++ri) {
  ------------------
  |  Branch (4293:55): [True: 5.30k, False: 1.69k]
  ------------------
 4294|  5.30k|          if (*ri != OBStereo::ImplicitRef && AtomMap.find(GetAtomById(*ri)) == AtomMap.end()) {
  ------------------
  |  Branch (4294:15): [True: 5.11k, False: 182]
  |  Branch (4294:15): [True: 111, False: 5.19k]
  |  Branch (4294:47): [True: 111, False: 5.00k]
  ------------------
 4295|    111|            skip_cfg = true;
 4296|    111|            break;
 4297|    111|          }
 4298|  5.30k|        }
 4299|  1.80k|        if (skip_cfg)
  ------------------
  |  Branch (4299:13): [True: 111, False: 1.69k]
  ------------------
 4300|    111|          continue;
 4301|       |
 4302|  1.69k|        OBTetrahedralStereo::Config newcfg;
 4303|  1.69k|        newcfg.specified = cfg.specified;
 4304|  1.69k|        newcfg.center = centerit->second->GetId();
 4305|  1.69k|        newcfg.from = cfg.from == OBStereo::ImplicitRef ? OBStereo::ImplicitRef : AtomMap[GetAtomById(cfg.from)]->GetId();
  ------------------
  |  Branch (4305:23): [True: 28, False: 1.66k]
  ------------------
 4306|  1.69k|        OBStereo::Refs refs;
 4307|  6.76k|        for (OBStereo::RefIter ri = cfg.refs.begin(); ri != cfg.refs.end(); ++ri) {
  ------------------
  |  Branch (4307:55): [True: 5.07k, False: 1.69k]
  ------------------
 4308|  5.07k|          OBStereo::Ref ref = *ri == OBStereo::ImplicitRef ? OBStereo::ImplicitRef : AtomMap[GetAtomById(*ri)]->GetId();
  ------------------
  |  Branch (4308:31): [True: 98, False: 4.97k]
  ------------------
 4309|  5.07k|          refs.push_back(ref);
 4310|  5.07k|        }
 4311|  1.69k|        newcfg.refs = refs;
 4312|       |
 4313|  1.69k|        OBTetrahedralStereo *newtet = new OBTetrahedralStereo(this);
 4314|  1.69k|        newtet->SetConfig(newcfg);
 4315|  1.69k|        newmol.SetData(newtet);
 4316|  1.69k|      }
 4317|   182k|    }
 4318|       |
 4319|       |    // Options:
 4320|       |    // 1. Bonds that do not connect atoms in the subset are ignored
 4321|       |    // 2. As 1. but implicit Hs are added to replace them
 4322|       |    // 3. As 1. but asterisks are added to replace them
 4323|   101M|    FOR_BONDS_OF_MOL(bond, this) {
  ------------------
  |  |  418|   251k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 101M, False: 251k]
  |  |  ------------------
  ------------------
 4324|   101M|      bool skipping_bond = bonds_specified && excludebonds->BitIsSet(bond->GetIdx());
  ------------------
  |  Branch (4324:28): [True: 716k, False: 100M]
  |  Branch (4324:47): [True: 101k, False: 614k]
  ------------------
 4325|   101M|      map<OBAtom*, OBAtom*>::iterator posB = AtomMap.find(bond->GetBeginAtom());
 4326|   101M|      map<OBAtom*, OBAtom*>::iterator posE = AtomMap.find(bond->GetEndAtom());
 4327|   101M|      if (posB == AtomMap.end() && posE == AtomMap.end())
  ------------------
  |  Branch (4327:11): [True: 100M, False: 1.33M]
  |  Branch (4327:11): [True: 100M, False: 1.33M]
  |  Branch (4327:36): [True: 100M, False: 0]
  ------------------
 4328|   100M|        continue;
 4329|       |
 4330|  1.33M|      if (posB == AtomMap.end() || posE == AtomMap.end() || skipping_bond) {
  ------------------
  |  Branch (4330:11): [True: 0, False: 1.33M]
  |  Branch (4330:11): [True: 101k, False: 1.22M]
  |  Branch (4330:36): [True: 0, False: 1.33M]
  |  Branch (4330:61): [True: 101k, False: 1.22M]
  ------------------
 4331|   101k|        switch(correctvalence) {
 4332|   101k|        case 1:
  ------------------
  |  Branch (4332:9): [True: 101k, False: 0]
  ------------------
 4333|   101k|          if (posB == AtomMap.end() || (skipping_bond && posE != AtomMap.end()))
  ------------------
  |  Branch (4333:15): [True: 0, False: 101k]
  |  Branch (4333:15): [True: 101k, False: 0]
  |  Branch (4333:41): [True: 101k, False: 0]
  |  Branch (4333:58): [True: 101k, False: 0]
  ------------------
 4334|   101k|            posE->second->SetImplicitHCount(posE->second->GetImplicitHCount() + bond->GetBondOrder());
 4335|   101k|          if (posE == AtomMap.end() || (skipping_bond && posB != AtomMap.end()))
  ------------------
  |  Branch (4335:15): [True: 0, False: 101k]
  |  Branch (4335:15): [True: 101k, False: 0]
  |  Branch (4335:41): [True: 101k, False: 0]
  |  Branch (4335:58): [True: 101k, False: 0]
  ------------------
 4336|   101k|            posB->second->SetImplicitHCount(posB->second->GetImplicitHCount() + bond->GetBondOrder());
 4337|   101k|          break;
 4338|      0|        case 2: {
  ------------------
  |  Branch (4338:9): [True: 0, False: 101k]
  ------------------
 4339|      0|            OBAtom *atomB, *atomE;
 4340|      0|            if (skipping_bond) {
  ------------------
  |  Branch (4340:17): [True: 0, False: 0]
  ------------------
 4341|      0|              for(int N=0; N<2; ++N) {
  ------------------
  |  Branch (4341:28): [True: 0, False: 0]
  ------------------
 4342|      0|                atomB = nullptr;
 4343|      0|                atomE = nullptr;
 4344|      0|                if (N==0) {
  ------------------
  |  Branch (4344:21): [True: 0, False: 0]
  ------------------
 4345|      0|                  if (posB != AtomMap.end()) {
  ------------------
  |  Branch (4345:23): [True: 0, False: 0]
  ------------------
 4346|      0|                    atomB = posB->second;
 4347|      0|                    atomE = newmol.NewAtom();
 4348|      0|                    if (record_atomorder)
  ------------------
  |  Branch (4348:25): [True: 0, False: 0]
  ------------------
 4349|      0|                      atomorder->push_back(bond->GetEndAtomIdx());
 4350|      0|                  }
 4351|      0|                } else if (posE != AtomMap.end()) {
  ------------------
  |  Branch (4351:28): [True: 0, False: 0]
  ------------------
 4352|      0|                  atomE = posE->second;
 4353|      0|                  atomB = newmol.NewAtom();
 4354|      0|                  if (record_atomorder)
  ------------------
  |  Branch (4354:23): [True: 0, False: 0]
  ------------------
 4355|      0|                    atomorder->push_back(bond->GetBeginAtomIdx());
 4356|      0|                }
 4357|      0|                if (atomB == nullptr || atomE == nullptr)
  ------------------
  |  Branch (4357:21): [True: 0, False: 0]
  |  Branch (4357:41): [True: 0, False: 0]
  ------------------
 4358|      0|                  continue;
 4359|      0|                newmol.AddBond(atomB->GetIdx(), atomE->GetIdx(),
 4360|      0|                  bond->GetBondOrder(), bond->GetFlags());
 4361|      0|                if (record_bondorder)
  ------------------
  |  Branch (4361:21): [True: 0, False: 0]
  ------------------
 4362|      0|                  bondorder->push_back(bond->GetIdx());
 4363|      0|              }
 4364|      0|            }
 4365|      0|            else {
 4366|      0|              atomB = (posB == AtomMap.end()) ? newmol.NewAtom() : posB->second;
  ------------------
  |  Branch (4366:23): [True: 0, False: 0]
  ------------------
 4367|      0|              atomE = (posE == AtomMap.end()) ? newmol.NewAtom() : posE->second;
  ------------------
  |  Branch (4367:23): [True: 0, False: 0]
  ------------------
 4368|      0|              if (record_atomorder) {
  ------------------
  |  Branch (4368:19): [True: 0, False: 0]
  ------------------
 4369|      0|                if (posB == AtomMap.end())
  ------------------
  |  Branch (4369:21): [True: 0, False: 0]
  ------------------
 4370|      0|                  atomorder->push_back(bond->GetBeginAtomIdx());
 4371|      0|                else
 4372|      0|                  atomorder->push_back(bond->GetEndAtomIdx());
 4373|      0|              }
 4374|      0|              newmol.AddBond(atomB->GetIdx(), atomE->GetIdx(),
 4375|      0|                bond->GetBondOrder(), bond->GetFlags());
 4376|      0|              if (record_bondorder)
  ------------------
  |  Branch (4376:19): [True: 0, False: 0]
  ------------------
 4377|      0|                bondorder->push_back(bond->GetIdx());
 4378|      0|            }
 4379|      0|          }
 4380|      0|          break;
 4381|      0|        default:
  ------------------
  |  Branch (4381:9): [True: 0, False: 101k]
  ------------------
 4382|      0|          break;
 4383|   101k|        }
 4384|   101k|      }
 4385|  1.22M|      else {
 4386|  1.22M|        newmol.AddBond((posB->second)->GetIdx(), posE->second->GetIdx(),
 4387|  1.22M|                       bond->GetBondOrder(), bond->GetFlags());
 4388|  1.22M|        if (record_bondorder)
  ------------------
  |  Branch (4388:13): [True: 0, False: 1.22M]
  ------------------
 4389|      0|          bondorder->push_back(bond->GetIdx());
 4390|  1.22M|      }
 4391|  1.33M|    }
 4392|       |
 4393|   251k|    return true;
 4394|   251k|  }
_ZN9OpenBabel5OBMol15GetNextFragmentERNS_16OBMolAtomDFSIterERS0_:
 4396|   251k|  bool OBMol::GetNextFragment( OBMolAtomDFSIter& iter, OBMol& newmol ) {
 4397|   251k|    if( ! iter ) return false;
  ------------------
  |  Branch (4397:9): [True: 8.40k, False: 242k]
  ------------------
 4398|       |
 4399|       |    // We want to keep the atoms in their original order rather than use
 4400|       |    // the DFS order so just record the information first
 4401|   242k|    OBBitVec infragment(this->NumAtoms()+1);
 4402|   804k|    do { //for each atom in fragment
 4403|   804k|      infragment.SetBitOn(iter->GetIdx());
 4404|   804k|    } while ((iter++).next());
  ------------------
  |  Branch (4404:14): [True: 561k, False: 242k]
  ------------------
 4405|       |
 4406|   242k|    bool ok = CopySubstructure(newmol, &infragment);
 4407|       |
 4408|   242k|    return ok;
 4409|   251k|  }
mol.cpp:_ZN9OpenBabelL22IsSuppressibleHydrogenEPNS_6OBAtomE:
 1892|  1.58k|  {
 1893|  1.58k|    if (atom->GetIsotope() == 0 && atom->GetHvyDegree() == 1 && atom->GetFormalCharge() == 0
  ------------------
  |  Branch (1893:9): [True: 1.48k, False: 93]
  |  Branch (1893:36): [True: 443, False: 1.04k]
  |  Branch (1893:65): [True: 427, False: 16]
  ------------------
 1894|    427|        && !atom->GetData("Atom Class"))
  ------------------
  |  Branch (1894:12): [True: 427, False: 0]
  ------------------
 1895|    427|      return true;
 1896|  1.15k|    else
 1897|  1.15k|      return false;
 1898|  1.58k|  }
mol.cpp:_ZN9OpenBabelL16CorrectedBondRadEjj:
 2129|   149k|  {
 2130|   149k|    double rad = OBElements::GetCovalentRad(elem);
 2131|   149k|    switch (hyb) {
 2132|  53.1k|    case 2:
  ------------------
  |  Branch (2132:5): [True: 53.1k, False: 96.7k]
  ------------------
 2133|  53.1k|      return rad * 0.95;
 2134|  8.62k|    case 1:
  ------------------
  |  Branch (2134:5): [True: 8.62k, False: 141k]
  ------------------
 2135|  8.62k|      return rad * 0.90;
 2136|  88.1k|    default:
  ------------------
  |  Branch (2136:5): [True: 88.1k, False: 61.8k]
  ------------------
 2137|  88.1k|      return rad;
 2138|   149k|    }
 2139|   149k|  }
mol.cpp:_ZN9OpenBabelL19validAdditionalBondEPNS_6OBAtomES1_:
 2983|  7.27M|  {
 2984|  7.27M|    if(a->GetExplicitValence() == 5 && a->GetAtomicNum() == 15)
  ------------------
  |  Branch (2984:8): [True: 1.82M, False: 5.44M]
  |  Branch (2984:40): [True: 1.72M, False: 101k]
  ------------------
 2985|  1.72M|    {
 2986|       |      //only allow octhedral bonding for F and Cl
 2987|  1.72M|      if(n->GetAtomicNum() == 9 || n->GetAtomicNum() == 17)
  ------------------
  |  Branch (2987:10): [True: 1.60k, False: 1.71M]
  |  Branch (2987:36): [True: 909, False: 1.71M]
  ------------------
 2988|  2.51k|        return true;
 2989|  1.71M|      else
 2990|  1.71M|        return false;
 2991|  1.72M|    }
 2992|       |    //other things to check?
 2993|  5.54M|    return true;
 2994|  7.27M|  }

_ZN9OpenBabel10OBGastChrg20AssignPartialChargesERNS_5OBMolE:
   66|    926|  {
   67|       |    //InitialPartialCharges(mol);
   68|    926|    obErrorLog.ThrowError(__FUNCTION__,
   69|    926|                          "Ran OpenBabel::AssignPartialCharges", obAuditMsg);
   70|       |
   71|       |    // Annotate that partial charges come from Gasteiger
   72|    926|    OBPairData *dp = new OBPairData;
   73|    926|    dp->SetAttribute("PartialCharges");
   74|    926|    dp->SetValue("Gasteiger");
   75|    926|    dp->SetOrigin(perceived);
   76|    926|    mol.SetData(dp);
   77|       |
   78|    926|    OBAtom *atom;
   79|    926|    vector<OBAtom*>::iterator i;
   80|       |
   81|    926|    GSVResize(mol.NumAtoms()+1);
   82|    926|    double a,b,c;
   83|  24.8k|    for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
  ------------------
  |  Branch (83:34): [True: 24.5k, False: 261]
  ------------------
   84|  24.5k|      {
   85|  24.5k|        if (!GasteigerSigmaChi(atom,a,b,c))
  ------------------
  |  Branch (85:13): [True: 665, False: 23.9k]
  ------------------
   86|    665|          return(false);
   87|  23.9k|        _gsv[atom->GetIdx()]->SetValues(a,b,c,atom->GetPartialCharge());
   88|  23.9k|      }
   89|       |
   90|    261|    double alpha,charge,denom;
   91|    261|    unsigned j;
   92|    261|    int iter;
   93|    261|    OBBond *bond;
   94|    261|    OBAtom *src,*dst;
   95|    261|    vector<OBBond*>::iterator k;
   96|    261|    alpha = 1.0;
   97|  1.82k|    for(iter = 0;iter < OB_GASTEIGER_ITERS;++iter)
  ------------------
  |  |   78|  1.82k|#define OB_GASTEIGER_ITERS  6
  ------------------
  |  Branch (97:18): [True: 1.56k, False: 261]
  ------------------
   98|  1.56k|      {
   99|  1.56k|        alpha *= OB_GASTEIGER_DAMP;
  ------------------
  |  |   77|  1.56k|#define OB_GASTEIGER_DAMP   0.5
  ------------------
  100|       |
  101|   104k|        for( j=1;j < _gsv.size();++j)
  ------------------
  |  Branch (101:18): [True: 103k, False: 1.56k]
  ------------------
  102|   103k|          {
  103|   103k|            charge = _gsv[j]->q;
  104|   103k|            _gsv[j]->chi = (_gsv[j]->c*charge+_gsv[j]->b)*charge+_gsv[j]->a;
  105|   103k|          }
  106|       |
  107|   110k|        for (bond = mol.BeginBond(k);bond;bond = mol.NextBond(k))
  ------------------
  |  Branch (107:38): [True: 108k, False: 1.56k]
  ------------------
  108|   108k|          {
  109|   108k|            src = bond->GetBeginAtom();
  110|   108k|            dst = bond->GetEndAtom();
  111|       |
  112|   108k|            if (_gsv[src->GetIdx()]->chi >= _gsv[dst->GetIdx()]->chi)
  ------------------
  |  Branch (112:17): [True: 81.1k, False: 27.5k]
  ------------------
  113|  81.1k|              {
  114|  81.1k|                if (dst->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (114:21): [True: 9.68k, False: 71.4k]
  ------------------
  115|  9.68k|                  denom = double(OB_GASTEIGER_DENOM);
  ------------------
  |  |   76|  9.68k|#define OB_GASTEIGER_DENOM  20.02
  ------------------
  116|  71.4k|                else
  117|  71.4k|                  denom = _gsv[dst->GetIdx()]->denom;
  118|  81.1k|              }
  119|  27.5k|            else
  120|  27.5k|              {
  121|  27.5k|                if (src->GetAtomicNum() == OBElements::Hydrogen)
  ------------------
  |  Branch (121:21): [True: 215, False: 27.3k]
  ------------------
  122|    215|                  denom = double(OB_GASTEIGER_DENOM);
  ------------------
  |  |   76|    215|#define OB_GASTEIGER_DENOM  20.02
  ------------------
  123|  27.3k|                else
  124|  27.3k|                  denom = _gsv[src->GetIdx()]->denom;
  125|  27.5k|              }
  126|       |
  127|   108k|            charge = (_gsv[src->GetIdx()]->chi - _gsv[dst->GetIdx()]->chi)/denom;
  128|   108k|            _gsv[src->GetIdx()]->q -= alpha*charge;
  129|   108k|            _gsv[dst->GetIdx()]->q += alpha*charge;
  130|   108k|          }
  131|  1.56k|      }
  132|       |
  133|  17.4k|    for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
  ------------------
  |  Branch (133:34): [True: 17.2k, False: 261]
  ------------------
  134|  17.2k|      atom->SetPartialCharge(_gsv[atom->GetIdx()]->q);
  135|       |
  136|    261|    return(true);
  137|    926|  }
_ZN9OpenBabel10OBGastChrg17GasteigerSigmaChiEPNS_6OBAtomERdS3_S3_:
  164|  24.5k|  {
  165|  24.5k|    int count;
  166|  24.5k|    double val[3] = {0.0,0.0,0.0};
  167|       |
  168|  24.5k|    switch(atom->GetAtomicNum())
  ------------------
  |  Branch (168:12): [True: 23.9k, False: 663]
  ------------------
  169|  24.5k|      {
  170|  1.67k|      case 1: //H
  ------------------
  |  Branch (170:7): [True: 1.67k, False: 22.9k]
  ------------------
  171|  1.67k|        val[0] = 0.37;
  172|  1.67k|        val[1] = 7.17;
  173|  1.67k|        val[2] = 12.85;
  174|  1.67k|        break;
  175|  10.3k|      case 6: //C
  ------------------
  |  Branch (175:7): [True: 10.3k, False: 14.2k]
  ------------------
  176|  10.3k|        if (atom->GetHyb() == 3)
  ------------------
  |  Branch (176:13): [True: 530, False: 9.78k]
  ------------------
  177|    530|          {
  178|    530|            val[0] = 0.68;
  179|    530|            val[1] = 7.98;
  180|    530|            val[2] = 19.04;
  181|    530|          }
  182|  10.3k|        if (atom->GetHyb() == 2)
  ------------------
  |  Branch (182:13): [True: 9.73k, False: 575]
  ------------------
  183|  9.73k|          {
  184|  9.73k|            val[0] = 0.98;
  185|  9.73k|            val[1] = 8.79;
  186|  9.73k|            val[2] = 19.62;
  187|  9.73k|          }
  188|  10.3k|        if (atom->GetHyb() == 1)
  ------------------
  |  Branch (188:13): [True: 45, False: 10.2k]
  ------------------
  189|     45|          {
  190|     45|            val[0] = 1.67;
  191|     45|            val[1] = 10.39;
  192|     45|            val[2] = 20.57;
  193|     45|          }
  194|  10.3k|        break;
  195|  4.49k|      case 7: //N
  ------------------
  |  Branch (195:7): [True: 4.49k, False: 20.0k]
  ------------------
  196|  4.49k|        if (atom->GetHyb() == 3)
  ------------------
  |  Branch (196:13): [True: 1.00k, False: 3.49k]
  ------------------
  197|  1.00k|          {
  198|  1.00k|            if (atom->GetExplicitDegree() == 4 || atom->GetFormalCharge())
  ------------------
  |  Branch (198:17): [True: 10, False: 992]
  |  Branch (198:51): [True: 36, False: 956]
  ------------------
  199|     46|              {
  200|     46|                val[0] = 0.0;
  201|     46|                val[1] = 0.0;
  202|     46|                val[2] = 23.72;
  203|     46|              }
  204|    956|            else
  205|    956|              {
  206|    956|                val[0] = 2.08;
  207|    956|                val[1] = 11.54;
  208|    956|                val[2] = 23.72;
  209|    956|              }
  210|  1.00k|          }
  211|       |
  212|  4.49k|        if (atom->GetHyb() == 2)
  ------------------
  |  Branch (212:13): [True: 3.47k, False: 1.01k]
  ------------------
  213|  3.47k|          {
  214|  3.47k|            if (EQ(atom->GetType(),"Npl") || EQ(atom->GetType(),"Nam"))
  ------------------
  |  |  775|  6.94k|#define EQ(a,b) (!strcmp((a), (b)))
  |  |  ------------------
  |  |  |  Branch (775:17): [True: 311, False: 3.16k]
  |  |  ------------------
  ------------------
                          if (EQ(atom->GetType(),"Npl") || EQ(atom->GetType(),"Nam"))
  ------------------
  |  |  775|  3.16k|#define EQ(a,b) (!strcmp((a), (b)))
  |  |  ------------------
  |  |  |  Branch (775:17): [True: 5, False: 3.15k]
  |  |  ------------------
  ------------------
  215|    316|              {
  216|    316|                val[0] = 2.46;
  217|    316|                val[1] = 12.32;
  218|    316|                val[2] = 24.86;
  219|    316|              }
  220|  3.15k|            else
  221|  3.15k|              {
  222|  3.15k|                val[0] = 2.57;
  223|  3.15k|                val[1] = 12.87;
  224|  3.15k|                val[2] = 24.87;
  225|  3.15k|              }
  226|  3.47k|          }
  227|       |
  228|  4.49k|        if (atom->GetHyb() == 1)
  ------------------
  |  Branch (228:13): [True: 17, False: 4.47k]
  ------------------
  229|     17|          {
  230|     17|            val[0] = 3.71;
  231|     17|            val[1] = 15.68;
  232|     17|            val[2] = 27.11;
  233|     17|          }
  234|  4.49k|        break;
  235|    363|      case 8: //O
  ------------------
  |  Branch (235:7): [True: 363, False: 24.2k]
  ------------------
  236|    363|        if (atom->GetHyb() == 3)
  ------------------
  |  Branch (236:13): [True: 188, False: 175]
  ------------------
  237|    188|          {
  238|    188|            val[0] = 2.65;
  239|    188|            val[1] = 14.18;
  240|    188|            val[2] = 28.49;
  241|    188|          }
  242|    363|        if (atom->GetHyb() == 2)
  ------------------
  |  Branch (242:13): [True: 173, False: 190]
  ------------------
  243|    173|          {
  244|    173|            val[0] = 3.75;
  245|    173|            val[1] = 17.07;
  246|    173|            val[2] = 31.33;
  247|    173|          }
  248|    363|        break;
  249|  3.94k|      case 9: //F
  ------------------
  |  Branch (249:7): [True: 3.94k, False: 20.6k]
  ------------------
  250|  3.94k|        val[0] = 3.12;
  251|  3.94k|        val[1] = 14.66;
  252|  3.94k|        val[2] = 30.82;
  253|  3.94k|        break;
  254|    405|      case 15: //P
  ------------------
  |  Branch (254:7): [True: 405, False: 24.1k]
  ------------------
  255|    405|        val[0] = 1.62;
  256|    405|        val[1] = 8.90;
  257|    405|        val[2] = 18.10;
  258|    405|        break;
  259|  2.25k|      case 16: //S
  ------------------
  |  Branch (259:7): [True: 2.25k, False: 22.3k]
  ------------------
  260|  2.25k|        count = atom->CountFreeOxygens();
  261|  2.25k|        if (count == 0 || count == 1)
  ------------------
  |  Branch (261:13): [True: 2.24k, False: 6]
  |  Branch (261:27): [True: 2, False: 4]
  ------------------
  262|  2.25k|          {
  263|  2.25k|            val[0] = 2.39;
  264|  2.25k|            val[1] = 10.14;
  265|  2.25k|            val[2] = 20.65;
  266|  2.25k|          }
  267|  2.25k|        if (count > 1)
  ------------------
  |  Branch (267:13): [True: 4, False: 2.25k]
  ------------------
  268|      4|          {
  269|      4|            val[0] = 2.39;
  270|      4|            val[1] = 12.00;
  271|      4|            val[2] = 24.00;
  272|      4|          }
  273|       |        /*S2? if (count == 0) {val[0] = 2.72;val[1] = 10.88;val[2] = 21.69;}*/
  274|  2.25k|        break;
  275|     65|      case 17: //Cl
  ------------------
  |  Branch (275:7): [True: 65, False: 24.5k]
  ------------------
  276|     65|        val[0] = 2.66;
  277|     65|        val[1] = 11.00;
  278|     65|        val[2] = 22.04;
  279|     65|        break;
  280|     18|      case 35: //Br
  ------------------
  |  Branch (280:7): [True: 18, False: 24.5k]
  ------------------
  281|     18|        val[0] = 2.77;
  282|     18|        val[1] = 10.08;
  283|     18|        val[2] = 19.71;
  284|     18|        break;
  285|    350|      case 53: //I
  ------------------
  |  Branch (285:7): [True: 350, False: 24.2k]
  ------------------
  286|    350|        val[0] = 2.90;
  287|    350|        val[1] = 9.90;
  288|    350|        val[2] = 18.82;
  289|    350|        break;
  290|     35|      case 13: //Al
  ------------------
  |  Branch (290:7): [True: 35, False: 24.5k]
  ------------------
  291|     35|        val[0] = 1.06;
  292|     35|        val[1] = 5.47;
  293|     35|        val[2] = 11.65;
  294|     35|        break;
  295|  24.5k|      }
  296|       |
  297|  24.5k|    if (fabs(val[2]) >= 2e-6)
  ------------------
  |  Branch (297:9): [True: 23.9k, False: 665]
  ------------------
  298|  23.9k|      {
  299|  23.9k|        a = val[1];
  300|  23.9k|        b = (val[2]-val[0])/2;
  301|  23.9k|        c = (val[2]+val[0])/2 - val[1];
  302|  23.9k|      }
  303|    665|    else
  304|    665|      return(false);
  305|       |
  306|  23.9k|    return(true);
  307|  24.5k|  }
_ZN9OpenBabel10OBGastChrg9GSVResizeEi:
  310|    926|  {
  311|    926|    vector <GasteigerState*>::iterator i;
  312|    926|    for (i = _gsv.begin();i != _gsv.end();++i)
  ------------------
  |  Branch (312:27): [True: 0, False: 926]
  ------------------
  313|      0|      delete *i;
  314|    926|    _gsv.clear();
  315|       |
  316|   106k|    for (int j = 0;j < size;++j)
  ------------------
  |  Branch (316:20): [True: 105k, False: 926]
  ------------------
  317|   105k|      _gsv.push_back(new GasteigerState);
  318|    926|  }
_ZN9OpenBabel10OBGastChrgD2Ev:
  321|    926|  {
  322|    926|    vector <GasteigerState*>::iterator i;
  323|   106k|    for (i = _gsv.begin();i != _gsv.end();++i)
  ------------------
  |  Branch (323:27): [True: 105k, False: 926]
  ------------------
  324|   105k|      delete *i;
  325|    926|  }
_ZN9OpenBabel14GasteigerStateC2Ev:
  328|   105k|  {
  329|   105k|    a = 0.0;
  330|   105k|    b = 0.0;
  331|   105k|    c = 0.0;
  332|   105k|    denom = 0.0;
  333|   105k|    chi = 0.0;
  334|   105k|    q = 0.0;
  335|   105k|  }

_ZN9OpenBabel12OBConversionC2EPNSt3__113basic_istreamIcNS1_11char_traitsIcEEEEPNS1_13basic_ostreamIcS4_EE:
  232|  23.7k|    pInput(nullptr), pOutput(nullptr),
  233|  23.7k|    pInFormat(nullptr),pOutFormat(nullptr), Index(0), StartNumber(1),
  234|  23.7k|    EndNumber(0), Count(-1), m_IsFirstInput(true), m_IsLast(true),
  235|  23.7k|    MoreFilesToCome(false), OneObjectOnly(false), ReadyToInput(false), SkippedMolecules(false),
  236|  23.7k|    inFormatGzip(false), outFormatGzip(false),
  237|  23.7k|    pOb1(nullptr), wInpos(0), wInlen(0), pAuxConv(nullptr)
  238|  23.7k|  {
  239|  23.7k|   	SetInStream(is);
  240|  23.7k|   	SetOutStream(os);
  241|       |
  242|       |    //These options take a parameter
  243|  23.7k|    RegisterOptionParam("f", nullptr, 1,GENOPTIONS);
  244|  23.7k|    RegisterOptionParam("l", nullptr, 1,GENOPTIONS);
  245|  23.7k|  }
_ZN9OpenBabel12OBConversionD2Ev:
  313|  23.7k|  {
  314|  23.7k|    if(pAuxConv!=this)
  ------------------
  |  Branch (314:8): [True: 23.7k, False: 0]
  ------------------
  315|  23.7k|      delete pAuxConv;
  316|       |    // Free any remaining streams from convenience functions
  317|  23.7k|    SetInStream(nullptr);
  318|  23.7k|    SetOutStream(nullptr);
  319|       |
  320|  23.7k|  }
_ZN9OpenBabel12OBConversion14RegisterFormatEPKcPNS_8OBFormatES2_:
  330|    320|  {
  331|    320|    return pFormat->RegisterFormat(ID, MIME);
  332|    320|  }
_ZN9OpenBabel12OBConversion11SetInStreamEPNSt3__113basic_istreamIcNS1_11char_traitsIcEEEEb:
  337|  62.8k|  {
  338|       |      //clear and deallocate any existing streams
  339|  93.5k|      for(unsigned i = 0, n = ownedInStreams.size(); i < n; i++)
  ------------------
  |  Branch (339:54): [True: 30.6k, False: 62.8k]
  ------------------
  340|  30.6k|      {
  341|  30.6k|        delete ownedInStreams[i];
  342|  30.6k|      }
  343|  62.8k|      ownedInStreams.clear();
  344|  62.8k|      pInput = nullptr;
  345|       |
  346|  62.8k|      if (pIn)
  ------------------
  |  Branch (346:11): [True: 15.3k, False: 47.5k]
  ------------------
  347|  15.3k|      {
  348|  15.3k|          if(takeOwnership)
  ------------------
  |  Branch (348:14): [True: 15.3k, False: 0]
  ------------------
  349|  15.3k|              ownedInStreams.push_back(pIn);
  350|  15.3k|          pInput = pIn; //simplest case
  351|       |
  352|       |  #ifdef HAVE_LIBZ
  353|       |          if(IsOption("zin", GENOPTIONS) || inFormatGzip)
  354|       |          {
  355|       |            zlib_stream::zip_istream *zIn = new zlib_stream::zip_istream(*pInput);
  356|       |            ownedInStreams.push_back(zIn);
  357|       |            pInput = zIn;
  358|       |          }
  359|       |  #endif
  360|       |          //always transform newlines if input isn't binary/xml
  361|  15.3k|          if(pInFormat && !(pInFormat->Flags() & (READBINARY | READXML)) &&
  ------------------
  |  |   33|  15.3k|#define READBINARY      0x04
  ------------------
                        if(pInFormat && !(pInFormat->Flags() & (READBINARY | READXML)) &&
  ------------------
  |  |   38|  15.3k|#define READXML         0x80
  ------------------
  |  Branch (361:14): [True: 15.3k, False: 0]
  |  Branch (361:27): [True: 15.3k, False: 0]
  ------------------
  362|  15.3k|              pIn != &std::cin) //avoid filtering stdin as well
  ------------------
  |  Branch (362:15): [True: 15.3k, False: 0]
  ------------------
  363|  15.3k|          {
  364|  15.3k|            LEInStream *leIn = new LEInStream(*pInput);
  365|  15.3k|            ownedInStreams.push_back(leIn);
  366|  15.3k|            pInput = leIn;
  367|  15.3k|          }
  368|  15.3k|      }
  369|  62.8k|  }
_ZN9OpenBabel12OBConversion12SetOutStreamEPNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEb:
  377|   533k|  {
  378|       |    //clear and deallocate any existing streams
  379|   533k|    for (unsigned i = 0, n = ownedOutStreams.size(); i < n; i++)
  ------------------
  |  Branch (379:54): [True: 0, False: 533k]
  ------------------
  380|      0|    {
  381|      0|      delete ownedOutStreams[i];
  382|      0|    }
  383|   533k|    ownedOutStreams.clear();
  384|   533k|    pOutput = nullptr;
  385|       |
  386|   533k|    if (pOut)
  ------------------
  |  Branch (386:9): [True: 242k, False: 290k]
  ------------------
  387|   242k|    {
  388|   242k|      if (takeOwnership)
  ------------------
  |  Branch (388:11): [True: 0, False: 242k]
  ------------------
  389|      0|        ownedOutStreams.push_back(pOut);
  390|   242k|      pOutput = pOut;
  391|       |
  392|       |#ifdef HAVE_LIBZ
  393|       |
  394|       |      if (IsOption("z", GENOPTIONS) || outFormatGzip)
  395|       |      {
  396|       |        zlib_stream::zip_ostream *zOut = new zlib_stream::zip_ostream(*pOutput, true);
  397|       |        //we need to delete the zstream _before_ the underlying stream so it can add the footer
  398|       |        ownedOutStreams.insert(ownedOutStreams.begin(),zOut);
  399|       |        pOutput = zOut;
  400|       |      }
  401|       |#endif
  402|   242k|    }
  403|   533k|  }
_ZN9OpenBabel12OBConversion11SetInFormatEPKcb:
  439|  15.3k|  {
  440|  15.3k|    inFormatGzip = gzip;
  441|  15.3k|    if(inID)
  ------------------
  |  Branch (441:8): [True: 15.3k, False: 0]
  ------------------
  442|  15.3k|      pInFormat = FindFormat(inID);
  443|  15.3k|    return pInFormat && !(pInFormat->Flags() & NOTREADABLE);
  ------------------
  |  |   31|  15.3k|#define NOTREADABLE     0x01
  ------------------
  |  Branch (443:12): [True: 15.3k, False: 3]
  |  Branch (443:25): [True: 15.3k, False: 1]
  ------------------
  444|  15.3k|  }
_ZN9OpenBabel12OBConversion12SetOutFormatEPKcb:
  448|  8.44k|  {
  449|  8.44k|    outFormatGzip = gzip;
  450|  8.44k|    if(outID)
  ------------------
  |  Branch (450:8): [True: 8.44k, False: 0]
  ------------------
  451|  8.44k|      pOutFormat= FindFormat(outID);
  452|  8.44k|    return pOutFormat && !(pOutFormat->Flags() & NOTWRITABLE);
  ------------------
  |  |   35|  8.44k|#define NOTWRITABLE     0x10
  ------------------
  |  Branch (452:12): [True: 8.44k, False: 0]
  |  Branch (452:26): [True: 8.44k, False: 0]
  ------------------
  453|  8.44k|  }
_ZN9OpenBabel12OBConversion14SetStartAndEndEv:
  622|  15.3k|  {
  623|  15.3k|    unsigned int TempStartNumber=0;
  624|  15.3k|    const char* p = IsOption("f",GENOPTIONS);
  625|  15.3k|    if(p)
  ------------------
  |  Branch (625:8): [True: 0, False: 15.3k]
  ------------------
  626|      0|      {
  627|      0|        StartNumber=atoi(p);
  628|      0|        if(StartNumber>1)
  ------------------
  |  Branch (628:12): [True: 0, False: 0]
  ------------------
  629|      0|          {
  630|      0|            TempStartNumber=StartNumber;
  631|       |            //Try to skip objects now
  632|      0|            int ret = pInFormat->SkipObjects(StartNumber-1,this);
  633|      0|            if(ret==-1) //error
  ------------------
  |  Branch (633:16): [True: 0, False: 0]
  ------------------
  634|      0|              return false;
  635|      0|            if(ret==1) //success:objects skipped
  ------------------
  |  Branch (635:16): [True: 0, False: 0]
  ------------------
  636|      0|              {
  637|      0|                Count = StartNumber-1;
  638|      0|                StartNumber=0;
  639|      0|              }
  640|      0|          }
  641|      0|      }
  642|       |
  643|  15.3k|    p = IsOption("l",GENOPTIONS);
  644|  15.3k|    if(p)
  ------------------
  |  Branch (644:8): [True: 0, False: 15.3k]
  ------------------
  645|      0|      {
  646|      0|        EndNumber=atoi(p);
  647|      0|        if(TempStartNumber && EndNumber<TempStartNumber)
  ------------------
  |  Branch (647:12): [True: 0, False: 0]
  |  Branch (647:31): [True: 0, False: 0]
  ------------------
  648|      0|          EndNumber=TempStartNumber;
  649|      0|      }
  650|       |
  651|  15.3k|    return true;
  652|  15.3k|  }
_ZN9OpenBabel12OBConversion10FindFormatEPKc:
  756|  23.7k|  {
  757|  23.7k|    return OBFormat::FindType(ID);
  758|  23.7k|  }
_ZNK9OpenBabel12OBConversion8GetTitleEv:
  767|  6.39k|  {
  768|  6.39k|    return(InFilename.c_str());
  769|  6.39k|  }
_ZN9OpenBabel12OBConversion16SetOneObjectOnlyEb:
  777|   242k|  {
  778|   242k|    OneObjectOnly=b;
  779|   242k|    m_IsLast=b;
  780|   242k|  }
_ZN9OpenBabel12OBConversion4ReadEPNS_6OBBaseEPNSt3__113basic_istreamIcNS3_11char_traitsIcEEEE:
  838|  15.3k|  {
  839|  15.3k|    if(pin) {
  ------------------
  |  Branch (839:8): [True: 0, False: 15.3k]
  ------------------
  840|       |      //for backwards compatibility, attempt to detect a gzip file
  841|       |#ifdef HAVE_LIBZ
  842|       |		if(!inFormatGzip && pInFormat && zlib_stream::isGZip(*pin))
  843|       |      {
  844|       |        inFormatGzip = true;
  845|       |      }
  846|       |#endif
  847|      0|      SetInStream(pin, false);
  848|      0|    }
  849|       |
  850|       |
  851|  15.3k|    if(!pInFormat || !pInput) return false;
  ------------------
  |  Branch (851:8): [True: 0, False: 15.3k]
  |  Branch (851:22): [True: 0, False: 15.3k]
  ------------------
  852|       |
  853|       |    //mysterious line to ensure backwards compatibility
  854|       |    //previously, even an open istream would have the gzip check applied
  855|       |    //this meant that a stream at the eof position would end up in an error state
  856|       |    //code has come to depend on this behavior
  857|  15.3k|    if(pInput->eof()) pInput->get();
  ------------------
  |  Branch (857:8): [True: 0, False: 15.3k]
  ------------------
  858|       |
  859|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  860|  15.3k|    obLocale.SetLocale();
  861|       |
  862|       |    // Also set the C++ stream locale
  863|  15.3k|    locale originalLocale = pInput->getloc(); // save the original
  864|  15.3k|    locale cNumericLocale(originalLocale, "C", locale::numeric);
  865|  15.3k|    pInput->imbue(cNumericLocale);
  866|       |
  867|       |    // skip molecules if -f or -l option is set
  868|  15.3k|    if (!SkippedMolecules) {
  ------------------
  |  Branch (868:9): [True: 15.3k, False: 0]
  ------------------
  869|  15.3k|        Count = 0; // make sure it's 0
  870|  15.3k|        if(!SetStartAndEnd()) {
  ------------------
  |  Branch (870:12): [True: 0, False: 15.3k]
  ------------------
  871|      0|           return false;
  872|      0|        }
  873|  15.3k|        SkippedMolecules = true;
  874|  15.3k|    }
  875|       |
  876|       |    // catch last molecule acording to -l
  877|  15.3k|    Count++;
  878|  15.3k|    bool success = false;
  879|  15.3k|    if (EndNumber==0 || (unsigned)Count<=EndNumber) {
  ------------------
  |  Branch (879:9): [True: 15.3k, False: 0]
  |  Branch (879:25): [True: 0, False: 0]
  ------------------
  880|  15.3k|        success = pInFormat->ReadMolecule(pOb, this);
  881|  15.3k|    }
  882|       |
  883|       |    // return the C locale to the original one
  884|  15.3k|    obLocale.RestoreLocale();
  885|       |    // Restore the original C++ locale as well
  886|  15.3k|    pInput->imbue(originalLocale);
  887|       |
  888|       |    // If we failed to read, plus the stream is over, then check if this is a stream from ReadFile
  889|  15.3k|    if (!success && !pInput->good() && ownedInStreams.size() > 0) {
  ------------------
  |  Branch (889:9): [True: 1.49k, False: 13.8k]
  |  Branch (889:21): [True: 1.19k, False: 303]
  |  Branch (889:40): [True: 1.19k, False: 0]
  ------------------
  890|  1.19k|      ifstream *inFstream = dynamic_cast<ifstream*>(ownedInStreams[0]);
  891|  1.19k|      if (inFstream != nullptr)
  ------------------
  |  Branch (891:11): [True: 0, False: 1.19k]
  ------------------
  892|      0|        inFstream->close(); // We will free the stream later, but close the file now
  893|  1.19k|    }
  894|       |
  895|  15.3k|    return success;
  896|  15.3k|  }
_ZN9OpenBabel12OBConversion5WriteEPNS_6OBBaseEPNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEE:
  904|   242k|  {
  905|   242k|    if(pos) SetOutStream(pos, false);
  ------------------
  |  Branch (905:8): [True: 0, False: 242k]
  ------------------
  906|       |
  907|   242k|    if(!pOutFormat || !pOutput) return false;
  ------------------
  |  Branch (907:8): [True: 0, False: 242k]
  |  Branch (907:23): [True: 0, False: 242k]
  ------------------
  908|       |
  909|       |    // Set the locale for number parsing to avoid locale issues: PR#1785463
  910|   242k|    obLocale.SetLocale();
  911|       |    // Also set the C++ stream locale
  912|   242k|    locale originalLocale = pOutput->getloc(); // save the original
  913|   242k|    locale cNumericLocale(originalLocale, "C", locale::numeric);
  914|   242k|    pOutput->imbue(cNumericLocale);
  915|       |
  916|       |    // Increment the output counter.
  917|       |    // This is done *before* the WriteMolecule because some of
  918|       |    // the format plugins initialized when GetOutputIndex() == 1.
  919|       |    // This matches the original Convert(), which increments
  920|       |    // the count for GetChemObject() before the write.
  921|   242k|    Index++;
  922|       |
  923|       |    // The actual work is done here
  924|   242k|    bool success = pOutFormat->WriteMolecule(pOb,this);
  925|       |
  926|       |    // return the C locale to the original one
  927|   242k|    obLocale.RestoreLocale();
  928|       |    // Restore the C++ stream locale too
  929|   242k|    pOutput->imbue(originalLocale);
  930|       |
  931|   242k|    return success;
  932|   242k|  }
_ZN9OpenBabel12OBConversion11StreamState10pushOutputERS0_:
  967|   242k|  {
  968|   242k|    assert(ownedStreams.size() == 0); //should be empty
  969|       |
  970|   242k|    pStream = conv.pOutput;
  971|   242k|    std::copy(conv.ownedOutStreams.begin(), conv.ownedOutStreams.end(), std::back_inserter(ownedStreams));
  972|       |
  973|   242k|    conv.pOutput = nullptr;
  974|   242k|    conv.ownedOutStreams.clear();
  975|   242k|  }
_ZN9OpenBabel12OBConversion11StreamState9popOutputERS0_:
  979|   242k|  {
  980|   242k|    conv.SetOutStream(nullptr);
  981|   242k|    conv.pOutput =  dynamic_cast<std::ostream*>(pStream);
  982|       |
  983|   242k|    assert(conv.ownedOutStreams.size() == 0); //should be empty
  984|       |
  985|   242k|    for(unsigned i = 0, n = conv.ownedOutStreams.size(); i < n; i++)
  ------------------
  |  Branch (985:58): [True: 0, False: 242k]
  ------------------
  986|      0|    {
  987|      0|      std::ostream *s = dynamic_cast<std::ostream*>(conv.ownedOutStreams[i]);
  988|      0|      assert(s);
  989|      0|      conv.ownedOutStreams.push_back(s);
  990|      0|    }
  991|       |
  992|   242k|    pStream = nullptr;
  993|   242k|    ownedStreams.clear();
  994|   242k|  }
_ZN9OpenBabel12OBConversion11WriteStringEPNS_6OBBaseEb:
 1001|   242k|  {
 1002|   242k|    stringstream newStream;
 1003|   242k|    string temp;
 1004|       |
 1005|   242k|    if(pOutFormat)
  ------------------
  |  Branch (1005:8): [True: 242k, False: 0]
  ------------------
 1006|   242k|    {
 1007|   242k|      StreamState savedOut;
 1008|   242k|      savedOut.pushOutput(*this);
 1009|       |      // The StreamState doesn't save all of the properties so
 1010|       |      // do it manually here.
 1011|       |      
 1012|       |      // Set/reset the Index to 0 so that any initialization
 1013|       |      // code in the formatters will be executed.
 1014|   242k|      int oldIndex = Index;
 1015|   242k|      Index = 0;
 1016|       |      
 1017|       |      // We'll only send one object, so save those properties too.
 1018|   242k|      bool oldOneObjectOnly = OneObjectOnly;
 1019|   242k|      bool oldm_IsLast = m_IsLast;
 1020|       |      
 1021|   242k|      SetOneObjectOnly(true);
 1022|       |
 1023|   242k|      SetOutStream(&newStream, false);
 1024|   242k|      Write(pOb);
 1025|   242k|      savedOut.popOutput(*this);
 1026|       |
 1027|       |      // Restore the other stream properties
 1028|   242k|      m_IsLast = oldm_IsLast;
 1029|   242k|      OneObjectOnly = oldOneObjectOnly;
 1030|   242k|      Index = oldIndex;
 1031|   242k|    }
 1032|       |
 1033|   242k|    temp = newStream.str();
 1034|   242k|    if (trimWhitespace) // trim the trailing whitespace
  ------------------
  |  Branch (1034:9): [True: 242k, False: 0]
  ------------------
 1035|   242k|      {
 1036|   242k|        string::size_type notwhite = temp.find_last_not_of(" \t\n\r");
 1037|   242k|        temp.erase(notwhite+1);
 1038|   242k|      }
 1039|   242k|    return temp;
 1040|   242k|  }
_ZN9OpenBabel12OBConversion10ReadStringEPNS_6OBBaseENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
 1082|  15.3k|  {
 1083|  15.3k|    SetInStream(new stringstream(input), true);
 1084|  15.3k|    return Read(pOb);
 1085|  15.3k|  }
_ZN9OpenBabel12OBConversion9AddOptionEPKcNS0_11Option_typeES2_:
 1618|   242k|  {
 1619|       |    //Also updates an option
 1620|   242k|    if (txt == nullptr)
  ------------------
  |  Branch (1620:9): [True: 242k, False: 0]
  ------------------
 1621|   242k|      OptionsArray[opttyp][opt]=string();
 1622|      0|    else
 1623|      0|      OptionsArray[opttyp][opt]=txt;
 1624|   242k|  }
_ZN9OpenBabel12OBConversion8IsOptionEPKcNS0_11Option_typeE:
 1627|  5.96M|  {
 1628|       |    //Returns NULL if option not found or a pointer to the text if it is
 1629|  5.96M|    map<string,string>::iterator pos;
 1630|  5.96M|    pos = OptionsArray[opttyp].find(opt);
 1631|  5.96M|    if(pos==OptionsArray[opttyp].end())
  ------------------
  |  Branch (1631:8): [True: 5.71M, False: 242k]
  ------------------
 1632|  5.71M|      return nullptr;
 1633|   242k|    return pos->second.c_str();
 1634|  5.96M|  }
_ZN9OpenBabel12OBConversion16OptionParamArrayENS0_11Option_typeE:
 1667|   143k|  {
 1668|   143k|    static OPAMapType opa[3];
 1669|   143k|    return opa[typ];
 1670|   143k|  }
_ZN9OpenBabel12OBConversion19RegisterOptionParamENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPNS_8OBFormatEiNS0_11Option_typeE:
 1674|  47.7k|  {
 1675|       |    //Gives error message if the number of parameters conflicts with an existing registration
 1676|  47.7k|    map<string,int>::iterator pos;
 1677|  47.7k|    pos =	OptionParamArray(typ).find(name);
 1678|  47.7k|    if(pos!=OptionParamArray(typ).end())
  ------------------
  |  Branch (1678:8): [True: 47.6k, False: 134]
  ------------------
 1679|  47.6k|      {
 1680|  47.6k|        if(pos->second!=numberParams)
  ------------------
  |  Branch (1680:12): [True: 0, False: 47.6k]
  ------------------
 1681|      0|          {
 1682|      0|            string description("API");
 1683|      0|            if(pFormat)
  ------------------
  |  Branch (1683:16): [True: 0, False: 0]
  ------------------
 1684|      0|              description=pFormat->Description();
 1685|      0|            obErrorLog.ThrowError(__FUNCTION__,
 1686|      0|                                  "The number of parameters needed by option \"" + name + "\" in "
 1687|      0|                                  + description.substr(0,description.find('\n'))
 1688|      0|                                  + " differs from an earlier registration.", obError);
 1689|      0|            return;
 1690|      0|          }
 1691|  47.6k|      }
 1692|  47.7k|    OptionParamArray(typ)[name] = numberParams;
 1693|  47.7k|  }

_ZN9OpenBabel7OBErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_S9_S9_S9_NS_14obMessageLevelE:
   41|  3.92M|    _method(method), _errorMsg(errorMsg), _explanation(explanation),
   42|  3.92M|    _possibleCause(possibleCause), _suggestedRemedy(suggestedRemedy),
   43|  3.92M|    _level(level)
   44|  3.92M|  { }
_ZN9OpenBabel16OBMessageHandlerC2Ev:
  146|      2|    _outputLevel(obWarning), _outputStream(&clog), _logging(true), _maxEntries(100)
  147|      2|  {
  148|      2|    _messageCount[0] = _messageCount[1] = _messageCount[2] = 0;
  149|      2|    _messageCount[3] = _messageCount[4] = 0;
  150|      2|    _filterStreamBuf = _inWrapStreamBuf = nullptr;
  151|       |    //  StartErrorWrap(); // (don't turn on error wrapping by default)
  152|      2|  }
_ZN9OpenBabel16OBMessageHandler10ThrowErrorENS_7OBErrorENS_14errorQualifierE:
  163|  3.92M|  {
  164|  3.92M|    if (!_logging)
  ------------------
  |  Branch (164:9): [True: 3.92M, False: 0]
  ------------------
  165|  3.92M|      return;
  166|       |
  167|       |    //Output error message if level sufficiently high and, if onceOnly set, it has not been logged before
  168|      0|    if (err.GetLevel() <= _outputLevel &&
  ------------------
  |  Branch (168:9): [True: 0, False: 0]
  |  Branch (168:9): [True: 0, False: 0]
  ------------------
  169|      0|      (qualifier!=onceOnly || find(_messageList.begin(), _messageList.end(), err)==_messageList.end()))
  ------------------
  |  Branch (169:8): [True: 0, False: 0]
  |  Branch (169:31): [True: 0, False: 0]
  ------------------
  170|      0|    {
  171|      0|      *_outputStream << err;
  172|      0|    }
  173|       |
  174|      0|    _messageList.push_back(err);
  175|      0|    _messageCount[err.GetLevel()]++;
  176|      0|    if (_maxEntries != 0 && _messageList.size() > _maxEntries)
  ------------------
  |  Branch (176:9): [True: 0, False: 0]
  |  Branch (176:29): [True: 0, False: 0]
  ------------------
  177|      0|      _messageList.pop_front();
  178|      0|  }
_ZN9OpenBabel16OBMessageHandler10ThrowErrorERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_NS_14obMessageLevelENS_14errorQualifierE:
  183|  3.92M|  {
  184|  3.92M|    if (errorMsg.length() > 1)
  ------------------
  |  Branch (184:9): [True: 3.92M, False: 0]
  ------------------
  185|  3.92M|      {
  186|  3.92M|        OBError err(method, errorMsg, "", "", "", level);
  187|  3.92M|        ThrowError(err, qualifier);
  188|  3.92M|      }
  189|  3.92M|  }

_ZN9OpenBabel25OBBondGetSmallestRingSizeEPNS_6OBBondEj:
   26|  8.87k|  {
   27|       |    // A bounded BFS from one side of a bond trying to find the other side.
   28|       |    //   - The required queue is implemented using a std::vector for efficiency
   29|       |    //   - Note that items are never popped from the queue, I just move a pointer
   30|       |    //     along to mark the left hand side
   31|       |    //   - A potential improvement would be to BFS from both sides at the same time
   32|       |
   33|  8.87k|    if (!bond->IsInRing()) return 0;
  ------------------
  |  Branch (33:9): [True: 415, False: 8.46k]
  ------------------
   34|  8.46k|    OBAtom* start = bond->GetBeginAtom();
   35|  8.46k|    OBAtom* end = bond->GetEndAtom();
   36|  8.46k|    std::vector<OBAtom*> qatoms;
   37|  8.46k|    unsigned int numatoms = bond->GetParent()->NumAtoms();
   38|  8.46k|    qatoms.reserve(numatoms < 42 ? numatoms : 42); // Value chosen by inspection on ChEMBL when using bound of 8
  ------------------
  |  Branch (38:20): [True: 3.99k, False: 4.46k]
  ------------------
   39|  8.46k|    OBBitVec seen(numatoms + 1);
   40|  8.46k|    seen.SetBitOn(start->GetIdx());
   41|  19.7k|    FOR_BONDS_OF_ATOM(nbond, start) {
  ------------------
  |  |  420|  8.46k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 19.7k, False: 8.46k]
  |  |  ------------------
  ------------------
   42|  19.7k|      if (&*nbond == bond) continue;
  ------------------
  |  Branch (42:11): [True: 8.46k, False: 11.2k]
  ------------------
   43|  11.2k|      if (!nbond->IsInRing()) continue;
  ------------------
  |  Branch (43:11): [True: 2.68k, False: 8.60k]
  ------------------
   44|  8.60k|      OBAtom* nbr = nbond->GetNbrAtom(start);
   45|  8.60k|      qatoms.push_back(nbr);
   46|  8.60k|    }
   47|  8.46k|    unsigned int depthmarker = qatoms.size(); // when qstart reaches this, increment the depth
   48|  8.46k|    unsigned int qstart = 0;
   49|  8.46k|    unsigned int depth = 2;
   50|  38.7k|    while (qatoms.size() - qstart) { // While queue not empty
  ------------------
  |  Branch (50:12): [True: 37.5k, False: 1.22k]
  ------------------
   51|  37.5k|      OBAtom* curr = qatoms[qstart];
   52|  37.5k|      if (qstart == depthmarker) {
  ------------------
  |  Branch (52:11): [True: 18.6k, False: 18.8k]
  ------------------
   53|  18.6k|        depth++;
   54|  18.6k|        depthmarker = qatoms.size();
   55|  18.6k|      }
   56|  37.5k|      qstart++;
   57|  37.5k|      if (seen.BitIsSet(curr->GetIdx()))
  ------------------
  |  Branch (57:11): [True: 902, False: 36.6k]
  ------------------
   58|    902|        continue;
   59|  36.6k|      seen.SetBitOn(curr->GetIdx());
   60|  36.6k|      if (depth < bound) {
  ------------------
  |  Branch (60:11): [True: 35.2k, False: 1.36k]
  ------------------
   61|  87.6k|        FOR_BONDS_OF_ATOM(nbond, curr) {
  ------------------
  |  |  420|  35.2k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 87.6k, False: 28.0k]
  |  |  ------------------
  ------------------
   62|  87.6k|          if (!nbond->IsInRing()) continue;
  ------------------
  |  Branch (62:15): [True: 9.66k, False: 77.9k]
  ------------------
   63|  77.9k|          OBAtom* nbr = nbond->GetNbrAtom(curr);
   64|  77.9k|          if (nbr == end)
  ------------------
  |  Branch (64:15): [True: 7.23k, False: 70.7k]
  ------------------
   65|  7.23k|            return depth + 1;
   66|  70.7k|          if (!seen.BitIsSet(nbr->GetIdx())) {
  ------------------
  |  Branch (66:15): [True: 38.4k, False: 32.2k]
  ------------------
   67|  38.4k|            qatoms.push_back(nbr);
   68|  38.4k|          }
   69|  70.7k|        }
   70|  35.2k|      }
   71|  36.6k|    }
   72|  1.22k|    return 0;
   73|  8.46k|  }
_ZN9OpenBabel17GetTypicalValenceEjji:
   78|   280k|  {
   79|   280k|    switch (element) {
  ------------------
  |  Branch (79:13): [True: 118k, False: 162k]
  ------------------
   80|  8.38k|    case 1:
  ------------------
  |  Branch (80:5): [True: 8.38k, False: 272k]
  ------------------
   81|  8.38k|      switch (charge) {
  ------------------
  |  Branch (81:15): [True: 8.20k, False: 186]
  ------------------
   82|  7.75k|      case 0:
  ------------------
  |  Branch (82:7): [True: 7.75k, False: 631]
  ------------------
   83|  7.75k|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (83:13): [True: 7.74k, False: 10]
  ------------------
   84|     10|        break;
   85|    445|      case 1:
  ------------------
  |  Branch (85:7): [True: 445, False: 7.94k]
  ------------------
   86|    445|        if (bosum == 0) return 0;
  ------------------
  |  Branch (86:13): [True: 378, False: 67]
  ------------------
   87|     67|        break;
   88|  8.38k|      }
   89|    263|      break;
   90|    416|    case 2:
  ------------------
  |  Branch (90:5): [True: 416, False: 280k]
  ------------------
   91|    416|      if (charge == 0) {
  ------------------
  |  Branch (91:11): [True: 246, False: 170]
  ------------------
   92|    246|        if (bosum == 0) return 0;
  ------------------
  |  Branch (92:13): [True: 245, False: 1]
  ------------------
   93|    246|      }
   94|    171|      break;
   95|    548|    case 3:
  ------------------
  |  Branch (95:5): [True: 548, False: 280k]
  ------------------
   96|    548|      switch (charge) {
  ------------------
  |  Branch (96:15): [True: 522, False: 26]
  ------------------
   97|    310|      case 0:
  ------------------
  |  Branch (97:7): [True: 310, False: 238]
  ------------------
   98|    310|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (98:13): [True: 307, False: 3]
  ------------------
   99|      3|        break;
  100|    212|      case 1:
  ------------------
  |  Branch (100:7): [True: 212, False: 336]
  ------------------
  101|    212|        if (bosum == 0) return 0;
  ------------------
  |  Branch (101:13): [True: 162, False: 50]
  ------------------
  102|     50|        break;
  103|    548|      }
  104|     79|      break;
  105|    631|    case 4:
  ------------------
  |  Branch (105:5): [True: 631, False: 280k]
  ------------------
  106|    631|      switch (charge) {
  ------------------
  |  Branch (106:15): [True: 616, False: 15]
  ------------------
  107|    287|      case 0:
  ------------------
  |  Branch (107:7): [True: 287, False: 344]
  ------------------
  108|    287|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (108:13): [True: 286, False: 1]
  ------------------
  109|      1|        break;
  110|    113|      case 1:
  ------------------
  |  Branch (110:7): [True: 113, False: 518]
  ------------------
  111|    113|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (111:13): [True: 79, False: 34]
  ------------------
  112|     34|        break;
  113|    216|      case 2:
  ------------------
  |  Branch (113:7): [True: 216, False: 415]
  ------------------
  114|    216|        if (bosum == 0) return 0;
  ------------------
  |  Branch (114:13): [True: 148, False: 68]
  ------------------
  115|     68|        break;
  116|    631|      }
  117|    118|      break;
  118|  1.47k|    case 5:
  ------------------
  |  Branch (118:5): [True: 1.47k, False: 279k]
  ------------------
  119|  1.47k|      switch (charge) {
  ------------------
  |  Branch (119:15): [True: 1.43k, False: 35]
  ------------------
  120|    280|      case -2:
  ------------------
  |  Branch (120:7): [True: 280, False: 1.19k]
  ------------------
  121|    280|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (121:13): [True: 241, False: 39]
  ------------------
  122|     39|        break;
  123|    226|      case -1:
  ------------------
  |  Branch (123:7): [True: 226, False: 1.24k]
  ------------------
  124|    226|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (124:13): [True: 225, False: 1]
  ------------------
  125|      1|        break;
  126|    648|      case 0:
  ------------------
  |  Branch (126:7): [True: 648, False: 825]
  ------------------
  127|    648|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (127:13): [True: 555, False: 93]
  ------------------
  128|     93|        break;
  129|     93|      case 1:
  ------------------
  |  Branch (129:7): [True: 68, False: 1.40k]
  ------------------
  130|     68|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (130:13): [True: 49, False: 19]
  ------------------
  131|     19|        break;
  132|    216|      case 2:
  ------------------
  |  Branch (132:7): [True: 216, False: 1.25k]
  ------------------
  133|    216|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (133:13): [True: 158, False: 58]
  ------------------
  134|     58|        break;
  135|  1.47k|      }
  136|    245|      break;
  137|  5.68k|    case 6:
  ------------------
  |  Branch (137:5): [True: 5.68k, False: 275k]
  ------------------
  138|  5.68k|      switch (charge) {
  ------------------
  |  Branch (138:15): [True: 5.59k, False: 85]
  ------------------
  139|    203|      case -2:
  ------------------
  |  Branch (139:7): [True: 203, False: 5.48k]
  ------------------
  140|    203|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (140:13): [True: 156, False: 47]
  ------------------
  141|     47|        break;
  142|    173|      case -1:
  ------------------
  |  Branch (142:7): [True: 173, False: 5.51k]
  ------------------
  143|    173|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (143:13): [True: 133, False: 40]
  ------------------
  144|     40|        break;
  145|  4.76k|      case 0:
  ------------------
  |  Branch (145:7): [True: 4.76k, False: 921]
  ------------------
  146|  4.76k|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (146:13): [True: 4.74k, False: 18]
  ------------------
  147|     18|        break;
  148|    190|      case 1:
  ------------------
  |  Branch (148:7): [True: 190, False: 5.49k]
  ------------------
  149|    190|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (149:13): [True: 141, False: 49]
  ------------------
  150|     49|        break;
  151|    270|      case 2:
  ------------------
  |  Branch (151:7): [True: 270, False: 5.41k]
  ------------------
  152|    270|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (152:13): [True: 177, False: 93]
  ------------------
  153|     93|        break;
  154|  5.68k|      }
  155|    332|      break;
  156|  10.8k|    case 7:
  ------------------
  |  Branch (156:5): [True: 10.8k, False: 270k]
  ------------------
  157|       |      // Note that while N can have valence 5, it doesn't make sense
  158|       |      // to round up to 5 when adding hydrogens
  159|  10.8k|      switch (charge) {
  ------------------
  |  Branch (159:15): [True: 10.6k, False: 255]
  ------------------
  160|    302|      case -2:
  ------------------
  |  Branch (160:7): [True: 302, False: 10.5k]
  ------------------
  161|    302|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (161:13): [True: 233, False: 69]
  ------------------
  162|     69|        break;
  163|    151|      case -1:
  ------------------
  |  Branch (163:7): [True: 151, False: 10.7k]
  ------------------
  164|    151|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (164:13): [True: 107, False: 44]
  ------------------
  165|     44|        break;
  166|  9.56k|      case 0:
  ------------------
  |  Branch (166:7): [True: 9.56k, False: 1.31k]
  ------------------
  167|  9.56k|        switch (bosum) {
  ------------------
  |  Branch (167:17): [True: 9.52k, False: 37]
  ------------------
  168|  8.99k|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (168:9): [True: 6.51k, False: 3.04k]
  |  Branch (168:17): [True: 1.45k, False: 8.11k]
  |  Branch (168:25): [True: 484, False: 9.07k]
  |  Branch (168:33): [True: 542, False: 9.01k]
  ------------------
  169|    522|        case 4: return 4; // don't round up to 5 for nitrogen
  ------------------
  |  Branch (169:9): [True: 522, False: 9.03k]
  ------------------
  170|      7|        case 5: return 5;
  ------------------
  |  Branch (170:9): [True: 7, False: 9.55k]
  ------------------
  171|  9.56k|        }
  172|     37|        break;
  173|    459|      case 1:
  ------------------
  |  Branch (173:7): [True: 459, False: 10.4k]
  ------------------
  174|    459|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (174:13): [True: 458, False: 1]
  ------------------
  175|      1|        break;
  176|    145|      case 2:
  ------------------
  |  Branch (176:7): [True: 145, False: 10.7k]
  ------------------
  177|    145|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (177:13): [True: 117, False: 28]
  ------------------
  178|     28|        break;
  179|  10.8k|      }
  180|    434|      break;
  181|  11.4k|    case 8:
  ------------------
  |  Branch (181:5): [True: 11.4k, False: 269k]
  ------------------
  182|  11.4k|      switch (charge) {
  ------------------
  |  Branch (182:15): [True: 11.4k, False: 57]
  ------------------
  183|    183|      case -2:
  ------------------
  |  Branch (183:7): [True: 183, False: 11.3k]
  ------------------
  184|    183|        if (bosum == 0) return 0;
  ------------------
  |  Branch (184:13): [True: 145, False: 38]
  ------------------
  185|     38|        break;
  186|    121|      case -1:
  ------------------
  |  Branch (186:7): [True: 121, False: 11.3k]
  ------------------
  187|    121|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (187:13): [True: 95, False: 26]
  ------------------
  188|     26|        break;
  189|  10.5k|      case 0:
  ------------------
  |  Branch (189:7): [True: 10.5k, False: 993]
  ------------------
  190|  10.5k|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (190:13): [True: 10.4k, False: 18]
  ------------------
  191|     18|        break;
  192|    632|      case 1:
  ------------------
  |  Branch (192:7): [True: 632, False: 10.8k]
  ------------------
  193|    632|        switch (bosum) {
  ------------------
  |  Branch (193:17): [True: 631, False: 1]
  ------------------
  194|    631|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (194:9): [True: 539, False: 93]
  |  Branch (194:17): [True: 47, False: 585]
  |  Branch (194:25): [True: 45, False: 587]
  |  Branch (194:33): [True: 0, False: 632]
  ------------------
  195|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (195:9): [True: 0, False: 632]
  |  Branch (195:17): [True: 0, False: 632]
  ------------------
  196|    632|        }
  197|      1|        break;
  198|  11.4k|      }
  199|    140|      break;
  200|  1.84k|    case 9:
  ------------------
  |  Branch (200:5): [True: 1.84k, False: 279k]
  ------------------
  201|  1.84k|      switch (charge) {
  ------------------
  |  Branch (201:15): [True: 1.76k, False: 76]
  ------------------
  202|    213|      case -1:
  ------------------
  |  Branch (202:7): [True: 213, False: 1.62k]
  ------------------
  203|    213|        if (bosum == 0) return 0;
  ------------------
  |  Branch (203:13): [True: 178, False: 35]
  ------------------
  204|     35|        break;
  205|  1.11k|      case 0:
  ------------------
  |  Branch (205:7): [True: 1.11k, False: 724]
  ------------------
  206|  1.11k|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (206:13): [True: 1.11k, False: 1]
  ------------------
  207|      1|        break;
  208|    168|      case 1:
  ------------------
  |  Branch (208:7): [True: 168, False: 1.67k]
  ------------------
  209|    168|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (209:13): [True: 166, False: 2]
  ------------------
  210|      2|        break;
  211|    267|      case 2:
  ------------------
  |  Branch (211:7): [True: 267, False: 1.57k]
  ------------------
  212|    267|        switch (bosum) {
  ------------------
  |  Branch (212:17): [True: 265, False: 2]
  ------------------
  213|    264|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (213:9): [True: 240, False: 27]
  |  Branch (213:17): [True: 23, False: 244]
  |  Branch (213:25): [True: 0, False: 267]
  |  Branch (213:33): [True: 1, False: 266]
  ------------------
  214|      1|        case 4: case 5: return 5;
  ------------------
  |  Branch (214:9): [True: 0, False: 267]
  |  Branch (214:17): [True: 1, False: 266]
  ------------------
  215|    267|        }
  216|      2|        break;
  217|  1.84k|      }
  218|    116|      break;
  219|    396|    case 10:
  ------------------
  |  Branch (219:5): [True: 396, False: 280k]
  ------------------
  220|    396|      if (charge == 0) {
  ------------------
  |  Branch (220:11): [True: 329, False: 67]
  ------------------
  221|    329|        if (bosum == 0) return 0;
  ------------------
  |  Branch (221:13): [True: 329, False: 0]
  ------------------
  222|    329|      }
  223|     67|      break;
  224|    896|    case 11:
  ------------------
  |  Branch (224:5): [True: 896, False: 280k]
  ------------------
  225|    896|      switch (charge) {
  ------------------
  |  Branch (225:15): [True: 766, False: 130]
  ------------------
  226|    121|      case -1:
  ------------------
  |  Branch (226:7): [True: 121, False: 775]
  ------------------
  227|    121|        if (bosum == 0) return 0;
  ------------------
  |  Branch (227:13): [True: 100, False: 21]
  ------------------
  228|     21|        break;
  229|    518|      case 0:
  ------------------
  |  Branch (229:7): [True: 518, False: 378]
  ------------------
  230|    518|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (230:13): [True: 513, False: 5]
  ------------------
  231|      5|        break;
  232|    127|      case 1:
  ------------------
  |  Branch (232:7): [True: 127, False: 769]
  ------------------
  233|    127|        if (bosum == 0) return 0;
  ------------------
  |  Branch (233:13): [True: 107, False: 20]
  ------------------
  234|     20|        break;
  235|    896|      }
  236|    176|      break;
  237|    638|    case 12:
  ------------------
  |  Branch (237:5): [True: 638, False: 280k]
  ------------------
  238|    638|      switch (charge) {
  ------------------
  |  Branch (238:15): [True: 628, False: 10]
  ------------------
  239|    628|      case 0:
  ------------------
  |  Branch (239:7): [True: 628, False: 10]
  ------------------
  240|    628|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (240:13): [True: 627, False: 1]
  ------------------
  241|      1|        break;
  242|      1|      case 2:
  ------------------
  |  Branch (242:7): [True: 0, False: 638]
  ------------------
  243|      0|        if (bosum == 0) return 0;
  ------------------
  |  Branch (243:13): [True: 0, False: 0]
  ------------------
  244|      0|        break;
  245|    638|      }
  246|     11|      break;
  247|  2.12k|    case 13:
  ------------------
  |  Branch (247:5): [True: 2.12k, False: 278k]
  ------------------
  248|  2.12k|      switch (charge) {
  ------------------
  |  Branch (248:15): [True: 2.08k, False: 44]
  ------------------
  249|    426|      case -2:
  ------------------
  |  Branch (249:7): [True: 426, False: 1.69k]
  ------------------
  250|    426|        switch (bosum) {
  ------------------
  |  Branch (250:17): [True: 396, False: 30]
  ------------------
  251|    379|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (251:9): [True: 354, False: 72]
  |  Branch (251:17): [True: 10, False: 416]
  |  Branch (251:25): [True: 3, False: 423]
  |  Branch (251:33): [True: 12, False: 414]
  ------------------
  252|     17|        case 4: case 5: return 5;
  ------------------
  |  Branch (252:9): [True: 5, False: 421]
  |  Branch (252:17): [True: 12, False: 414]
  ------------------
  253|    426|        }
  254|     30|        break;
  255|    128|      case -1:
  ------------------
  |  Branch (255:7): [True: 128, False: 1.99k]
  ------------------
  256|    128|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (256:13): [True: 84, False: 44]
  ------------------
  257|     44|        break;
  258|    663|      case 0:
  ------------------
  |  Branch (258:7): [True: 663, False: 1.46k]
  ------------------
  259|    663|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (259:13): [True: 540, False: 123]
  ------------------
  260|    123|        break;
  261|    154|      case 1:
  ------------------
  |  Branch (261:7): [True: 154, False: 1.97k]
  ------------------
  262|    154|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (262:13): [True: 90, False: 64]
  ------------------
  263|     64|        break;
  264|    254|      case 2:
  ------------------
  |  Branch (264:7): [True: 254, False: 1.87k]
  ------------------
  265|    254|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (265:13): [True: 199, False: 55]
  ------------------
  266|     55|        break;
  267|    456|      case 3:
  ------------------
  |  Branch (267:7): [True: 456, False: 1.66k]
  ------------------
  268|    456|        if (bosum == 0) return 0;
  ------------------
  |  Branch (268:13): [True: 402, False: 54]
  ------------------
  269|     54|        break;
  270|  2.12k|      }
  271|    414|      break;
  272|  1.55k|    case 14:
  ------------------
  |  Branch (272:5): [True: 1.55k, False: 279k]
  ------------------
  273|  1.55k|      switch (charge) {
  ------------------
  |  Branch (273:15): [True: 1.51k, False: 37]
  ------------------
  274|    281|      case -2:
  ------------------
  |  Branch (274:7): [True: 281, False: 1.27k]
  ------------------
  275|    281|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (275:13): [True: 218, False: 63]
  ------------------
  276|     63|        break;
  277|    588|      case -1:
  ------------------
  |  Branch (277:7): [True: 588, False: 966]
  ------------------
  278|    588|        switch (bosum) {
  ------------------
  |  Branch (278:17): [True: 466, False: 122]
  ------------------
  279|    431|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (279:9): [True: 386, False: 202]
  |  Branch (279:17): [True: 18, False: 570]
  |  Branch (279:25): [True: 15, False: 573]
  |  Branch (279:33): [True: 12, False: 576]
  ------------------
  280|     35|        case 4: case 5: return 5;
  ------------------
  |  Branch (280:9): [True: 16, False: 572]
  |  Branch (280:17): [True: 19, False: 569]
  ------------------
  281|    588|        }
  282|    122|        break;
  283|    258|      case 0:
  ------------------
  |  Branch (283:7): [True: 258, False: 1.29k]
  ------------------
  284|    258|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (284:13): [True: 232, False: 26]
  ------------------
  285|     26|        break;
  286|    320|      case 1:
  ------------------
  |  Branch (286:7): [True: 320, False: 1.23k]
  ------------------
  287|    320|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (287:13): [True: 292, False: 28]
  ------------------
  288|     28|        break;
  289|     70|      case 2:
  ------------------
  |  Branch (289:7): [True: 70, False: 1.48k]
  ------------------
  290|     70|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (290:13): [True: 59, False: 11]
  ------------------
  291|     11|        break;
  292|  1.55k|      }
  293|    287|      break;
  294|  22.8k|    case 15:
  ------------------
  |  Branch (294:5): [True: 22.8k, False: 258k]
  ------------------
  295|  22.8k|      switch (charge) {
  ------------------
  |  Branch (295:15): [True: 22.7k, False: 46]
  ------------------
  296|    136|      case -2:
  ------------------
  |  Branch (296:7): [True: 136, False: 22.6k]
  ------------------
  297|    136|        switch (bosum) {
  ------------------
  |  Branch (297:17): [True: 135, False: 1]
  ------------------
  298|     84|        case 0: case 1: return 1;
  ------------------
  |  Branch (298:9): [True: 71, False: 65]
  |  Branch (298:17): [True: 13, False: 123]
  ------------------
  299|     23|        case 2: case 3: return 3;
  ------------------
  |  Branch (299:9): [True: 11, False: 125]
  |  Branch (299:17): [True: 12, False: 124]
  ------------------
  300|     23|        case 4: case 5: return 5;
  ------------------
  |  Branch (300:9): [True: 3, False: 133]
  |  Branch (300:17): [True: 20, False: 116]
  ------------------
  301|      5|        case 6: case 7: return 7;
  ------------------
  |  Branch (301:9): [True: 5, False: 131]
  |  Branch (301:17): [True: 0, False: 136]
  ------------------
  302|    136|        }
  303|      1|        break;
  304|    557|      case -1:
  ------------------
  |  Branch (304:7): [True: 557, False: 22.2k]
  ------------------
  305|    557|        switch (bosum) {
  ------------------
  |  Branch (305:17): [True: 555, False: 2]
  ------------------
  306|    444|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (306:9): [True: 405, False: 152]
  |  Branch (306:17): [True: 9, False: 548]
  |  Branch (306:25): [True: 30, False: 527]
  ------------------
  307|     62|        case 3: case 4: return 4;
  ------------------
  |  Branch (307:9): [True: 45, False: 512]
  |  Branch (307:17): [True: 17, False: 540]
  ------------------
  308|     49|        case 5: case 6: return 6;
  ------------------
  |  Branch (308:9): [True: 46, False: 511]
  |  Branch (308:17): [True: 3, False: 554]
  ------------------
  309|    557|        }
  310|      2|        break;
  311|  20.2k|      case 0:
  ------------------
  |  Branch (311:7): [True: 20.2k, False: 2.60k]
  ------------------
  312|  20.2k|        switch (bosum) {
  ------------------
  |  Branch (312:17): [True: 20.0k, False: 158]
  ------------------
  313|  12.5k|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (313:9): [True: 5.59k, False: 14.6k]
  |  Branch (313:17): [True: 1.48k, False: 18.7k]
  |  Branch (313:25): [True: 1.76k, False: 18.4k]
  |  Branch (313:33): [True: 3.71k, False: 16.4k]
  ------------------
  314|  7.48k|        case 4: case 5: return 5;
  ------------------
  |  Branch (314:9): [True: 3.77k, False: 16.4k]
  |  Branch (314:17): [True: 3.71k, False: 16.4k]
  ------------------
  315|  20.2k|        }
  316|    158|        break;
  317|    159|      case 1:
  ------------------
  |  Branch (317:7): [True: 159, False: 22.6k]
  ------------------
  318|    159|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (318:13): [True: 123, False: 36]
  ------------------
  319|     36|        break;
  320|  1.70k|      case 2:
  ------------------
  |  Branch (320:7): [True: 1.70k, False: 21.1k]
  ------------------
  321|  1.70k|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (321:13): [True: 1.41k, False: 290]
  ------------------
  322|    290|        break;
  323|  22.8k|      }
  324|    533|      break;
  325|  14.7k|    case 16:
  ------------------
  |  Branch (325:5): [True: 14.7k, False: 266k]
  ------------------
  326|  14.7k|      switch (charge) {
  ------------------
  |  Branch (326:15): [True: 14.5k, False: 173]
  ------------------
  327|    205|      case -2:
  ------------------
  |  Branch (327:7): [True: 205, False: 14.5k]
  ------------------
  328|    205|        if (bosum == 0) return 0;
  ------------------
  |  Branch (328:13): [True: 179, False: 26]
  ------------------
  329|     26|        break;
  330|    518|      case -1:
  ------------------
  |  Branch (330:7): [True: 518, False: 14.2k]
  ------------------
  331|    518|        switch (bosum) {
  ------------------
  |  Branch (331:17): [True: 516, False: 2]
  ------------------
  332|    470|        case 0: case 1: return 1;
  ------------------
  |  Branch (332:9): [True: 455, False: 63]
  |  Branch (332:17): [True: 15, False: 503]
  ------------------
  333|     10|        case 2: case 3: return 3;
  ------------------
  |  Branch (333:9): [True: 2, False: 516]
  |  Branch (333:17): [True: 8, False: 510]
  ------------------
  334|     13|        case 4: case 5: return 5;
  ------------------
  |  Branch (334:9): [True: 4, False: 514]
  |  Branch (334:17): [True: 9, False: 509]
  ------------------
  335|     23|        case 6: case 7: return 7;
  ------------------
  |  Branch (335:9): [True: 23, False: 495]
  |  Branch (335:17): [True: 0, False: 518]
  ------------------
  336|    518|        }
  337|      2|        break;
  338|  12.6k|      case 0:
  ------------------
  |  Branch (338:7): [True: 12.6k, False: 2.08k]
  ------------------
  339|  12.6k|        switch (bosum) {
  ------------------
  |  Branch (339:17): [True: 12.6k, False: 1]
  ------------------
  340|  11.9k|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (340:9): [True: 10.8k, False: 1.84k]
  |  Branch (340:17): [True: 789, False: 11.8k]
  |  Branch (340:25): [True: 300, False: 12.3k]
  ------------------
  341|    480|        case 3: case 4: return 4;
  ------------------
  |  Branch (341:9): [True: 329, False: 12.3k]
  |  Branch (341:17): [True: 151, False: 12.5k]
  ------------------
  342|    279|        case 5: case 6: return 6;
  ------------------
  |  Branch (342:9): [True: 68, False: 12.5k]
  |  Branch (342:17): [True: 211, False: 12.4k]
  ------------------
  343|  12.6k|        }
  344|      1|        break;
  345|  1.08k|      case 1:
  ------------------
  |  Branch (345:7): [True: 1.08k, False: 13.6k]
  ------------------
  346|  1.08k|        switch (bosum) {
  ------------------
  |  Branch (346:17): [True: 1.03k, False: 47]
  ------------------
  347|  1.00k|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (347:9): [True: 590, False: 492]
  |  Branch (347:17): [True: 313, False: 769]
  |  Branch (347:25): [True: 52, False: 1.03k]
  |  Branch (347:33): [True: 45, False: 1.03k]
  ------------------
  348|     35|        case 4: case 5: return 5;
  ------------------
  |  Branch (348:9): [True: 10, False: 1.07k]
  |  Branch (348:17): [True: 25, False: 1.05k]
  ------------------
  349|  1.08k|        }
  350|     47|        break;
  351|    109|      case 2:
  ------------------
  |  Branch (351:7): [True: 109, False: 14.6k]
  ------------------
  352|    109|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (352:13): [True: 76, False: 33]
  ------------------
  353|     33|        break;
  354|  14.7k|      }
  355|    282|      break;
  356|  1.50k|    case 17:
  ------------------
  |  Branch (356:5): [True: 1.50k, False: 279k]
  ------------------
  357|  1.50k|      switch (charge) {
  ------------------
  |  Branch (357:15): [True: 1.46k, False: 44]
  ------------------
  358|     99|      case -1:
  ------------------
  |  Branch (358:7): [True: 99, False: 1.40k]
  ------------------
  359|     99|        if (bosum == 0) return 0;
  ------------------
  |  Branch (359:13): [True: 77, False: 22]
  ------------------
  360|     22|        break;
  361|    641|      case 0:
  ------------------
  |  Branch (361:7): [True: 641, False: 866]
  ------------------
  362|    641|        switch (bosum) {
  ------------------
  |  Branch (362:17): [True: 638, False: 3]
  ------------------
  363|    632|        case 0: case 1: return 1;
  ------------------
  |  Branch (363:9): [True: 534, False: 107]
  |  Branch (363:17): [True: 98, False: 543]
  ------------------
  364|      2|        case 2: case 3: return 3;
  ------------------
  |  Branch (364:9): [True: 2, False: 639]
  |  Branch (364:17): [True: 0, False: 641]
  ------------------
  365|      2|        case 4: case 5: return 5;
  ------------------
  |  Branch (365:9): [True: 1, False: 640]
  |  Branch (365:17): [True: 1, False: 640]
  ------------------
  366|      2|        case 6: case 7: return 7;
  ------------------
  |  Branch (366:9): [True: 2, False: 639]
  |  Branch (366:17): [True: 0, False: 641]
  ------------------
  367|    641|        }
  368|      3|        break;
  369|    427|      case 1:
  ------------------
  |  Branch (369:7): [True: 427, False: 1.08k]
  ------------------
  370|    427|        switch (bosum) {
  ------------------
  |  Branch (370:17): [True: 426, False: 1]
  ------------------
  371|    426|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (371:9): [True: 329, False: 98]
  |  Branch (371:17): [True: 97, False: 330]
  |  Branch (371:25): [True: 0, False: 427]
  ------------------
  372|      0|        case 3: case 4: return 4;
  ------------------
  |  Branch (372:9): [True: 0, False: 427]
  |  Branch (372:17): [True: 0, False: 427]
  ------------------
  373|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (373:9): [True: 0, False: 427]
  |  Branch (373:17): [True: 0, False: 427]
  ------------------
  374|    427|        }
  375|      1|        break;
  376|    296|      case 2:
  ------------------
  |  Branch (376:7): [True: 296, False: 1.21k]
  ------------------
  377|    296|        switch (bosum) {
  ------------------
  |  Branch (377:17): [True: 295, False: 1]
  ------------------
  378|    295|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (378:9): [True: 242, False: 54]
  |  Branch (378:17): [True: 53, False: 243]
  |  Branch (378:25): [True: 0, False: 296]
  |  Branch (378:33): [True: 0, False: 296]
  ------------------
  379|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (379:9): [True: 0, False: 296]
  |  Branch (379:17): [True: 0, False: 296]
  ------------------
  380|    296|        }
  381|      1|        break;
  382|  1.50k|      }
  383|     71|      break;
  384|    714|    case 18:
  ------------------
  |  Branch (384:5): [True: 714, False: 280k]
  ------------------
  385|    714|      if (charge == 0) {
  ------------------
  |  Branch (385:11): [True: 552, False: 162]
  ------------------
  386|    552|        if (bosum == 0) return 0;
  ------------------
  |  Branch (386:13): [True: 551, False: 1]
  ------------------
  387|    552|      }
  388|    163|      break;
  389|  1.04k|    case 19:
  ------------------
  |  Branch (389:5): [True: 1.04k, False: 279k]
  ------------------
  390|  1.04k|      switch (charge) {
  ------------------
  |  Branch (390:15): [True: 993, False: 51]
  ------------------
  391|    445|      case -1:
  ------------------
  |  Branch (391:7): [True: 445, False: 599]
  ------------------
  392|    445|        if (bosum == 0) return 0;
  ------------------
  |  Branch (392:13): [True: 321, False: 124]
  ------------------
  393|    124|        break;
  394|    313|      case 0:
  ------------------
  |  Branch (394:7): [True: 313, False: 731]
  ------------------
  395|    313|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (395:13): [True: 306, False: 7]
  ------------------
  396|      7|        break;
  397|    235|      case 1:
  ------------------
  |  Branch (397:7): [True: 235, False: 809]
  ------------------
  398|    235|        if (bosum == 0) return 0;
  ------------------
  |  Branch (398:13): [True: 190, False: 45]
  ------------------
  399|     45|        break;
  400|  1.04k|      }
  401|    227|      break;
  402|    951|    case 20:
  ------------------
  |  Branch (402:5): [True: 951, False: 279k]
  ------------------
  403|    951|      switch (charge) {
  ------------------
  |  Branch (403:15): [True: 913, False: 38]
  ------------------
  404|    695|      case 0:
  ------------------
  |  Branch (404:7): [True: 695, False: 256]
  ------------------
  405|    695|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (405:13): [True: 691, False: 4]
  ------------------
  406|      4|        break;
  407|     74|      case 1:
  ------------------
  |  Branch (407:7): [True: 74, False: 877]
  ------------------
  408|     74|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (408:13): [True: 45, False: 29]
  ------------------
  409|     29|        break;
  410|    144|      case 2:
  ------------------
  |  Branch (410:7): [True: 144, False: 807]
  ------------------
  411|    144|        if (bosum == 0) return 0;
  ------------------
  |  Branch (411:13): [True: 105, False: 39]
  ------------------
  412|     39|        break;
  413|    951|      }
  414|    110|      break;
  415|  1.83k|    case 31:
  ------------------
  |  Branch (415:5): [True: 1.83k, False: 279k]
  ------------------
  416|  1.83k|      switch (charge) {
  ------------------
  |  Branch (416:15): [True: 1.50k, False: 333]
  ------------------
  417|     60|      case -2:
  ------------------
  |  Branch (417:7): [True: 60, False: 1.77k]
  ------------------
  418|     60|        switch (bosum) {
  ------------------
  |  Branch (418:17): [True: 60, False: 0]
  ------------------
  419|     60|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (419:9): [True: 27, False: 33]
  |  Branch (419:17): [True: 12, False: 48]
  |  Branch (419:25): [True: 0, False: 60]
  |  Branch (419:33): [True: 21, False: 39]
  ------------------
  420|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (420:9): [True: 0, False: 60]
  |  Branch (420:17): [True: 0, False: 60]
  ------------------
  421|     60|        }
  422|      0|        break;
  423|    456|      case -1:
  ------------------
  |  Branch (423:7): [True: 456, False: 1.37k]
  ------------------
  424|    456|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (424:13): [True: 453, False: 3]
  ------------------
  425|      3|        break;
  426|    603|      case 0:
  ------------------
  |  Branch (426:7): [True: 603, False: 1.23k]
  ------------------
  427|    603|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (427:13): [True: 601, False: 2]
  ------------------
  428|      2|        break;
  429|    116|      case 1:
  ------------------
  |  Branch (429:7): [True: 116, False: 1.71k]
  ------------------
  430|    116|        if (bosum == 0) return 0;
  ------------------
  |  Branch (430:13): [True: 94, False: 22]
  ------------------
  431|     22|        break;
  432|    114|      case 2:
  ------------------
  |  Branch (432:7): [True: 114, False: 1.72k]
  ------------------
  433|    114|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (433:13): [True: 86, False: 28]
  ------------------
  434|     28|        break;
  435|    153|      case 3:
  ------------------
  |  Branch (435:7): [True: 153, False: 1.68k]
  ------------------
  436|    153|        if (bosum == 0) return 0;
  ------------------
  |  Branch (436:13): [True: 109, False: 44]
  ------------------
  437|     44|        break;
  438|  1.83k|      }
  439|    432|      break;
  440|    665|    case 32:
  ------------------
  |  Branch (440:5): [True: 665, False: 280k]
  ------------------
  441|    665|      switch (charge) {
  ------------------
  |  Branch (441:15): [True: 547, False: 118]
  ------------------
  442|    165|      case -2:
  ------------------
  |  Branch (442:7): [True: 165, False: 500]
  ------------------
  443|    165|        switch (bosum) {
  ------------------
  |  Branch (443:17): [True: 165, False: 0]
  ------------------
  444|    146|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (444:9): [True: 142, False: 23]
  |  Branch (444:17): [True: 2, False: 163]
  |  Branch (444:25): [True: 2, False: 163]
  ------------------
  445|     19|        case 3: case 4: return 4;
  ------------------
  |  Branch (445:9): [True: 4, False: 161]
  |  Branch (445:17): [True: 15, False: 150]
  ------------------
  446|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (446:9): [True: 0, False: 165]
  |  Branch (446:17): [True: 0, False: 165]
  ------------------
  447|    165|        }
  448|      0|        break;
  449|     49|      case -1:
  ------------------
  |  Branch (449:7): [True: 49, False: 616]
  ------------------
  450|     49|        switch (bosum) {
  ------------------
  |  Branch (450:17): [True: 48, False: 1]
  ------------------
  451|     23|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (451:9): [True: 9, False: 40]
  |  Branch (451:17): [True: 1, False: 48]
  |  Branch (451:25): [True: 10, False: 39]
  |  Branch (451:33): [True: 3, False: 46]
  ------------------
  452|     25|        case 4: case 5: return 5;
  ------------------
  |  Branch (452:9): [True: 25, False: 24]
  |  Branch (452:17): [True: 0, False: 49]
  ------------------
  453|     49|        }
  454|      1|        break;
  455|    200|      case 0:
  ------------------
  |  Branch (455:7): [True: 200, False: 465]
  ------------------
  456|    200|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (456:13): [True: 199, False: 1]
  ------------------
  457|      1|        break;
  458|     69|      case 1:
  ------------------
  |  Branch (458:7): [True: 69, False: 596]
  ------------------
  459|     69|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (459:13): [True: 51, False: 18]
  ------------------
  460|     18|        break;
  461|     64|      case 4:
  ------------------
  |  Branch (461:7): [True: 64, False: 601]
  ------------------
  462|     64|        if (bosum == 0) return 0;
  ------------------
  |  Branch (462:13): [True: 43, False: 21]
  ------------------
  463|     21|        break;
  464|    665|      }
  465|    159|      break;
  466|  1.74k|    case 33:
  ------------------
  |  Branch (466:5): [True: 1.74k, False: 279k]
  ------------------
  467|  1.74k|      switch (charge) {
  ------------------
  |  Branch (467:15): [True: 1.64k, False: 104]
  ------------------
  468|    251|      case -3:
  ------------------
  |  Branch (468:7): [True: 251, False: 1.49k]
  ------------------
  469|    251|        if (bosum == 0) return 0;
  ------------------
  |  Branch (469:13): [True: 202, False: 49]
  ------------------
  470|     49|        break;
  471|    445|      case -2:
  ------------------
  |  Branch (471:7): [True: 445, False: 1.30k]
  ------------------
  472|    445|        switch (bosum) {
  ------------------
  |  Branch (472:17): [True: 439, False: 6]
  ------------------
  473|    370|        case 0: case 1: return 1;
  ------------------
  |  Branch (473:9): [True: 358, False: 87]
  |  Branch (473:17): [True: 12, False: 433]
  ------------------
  474|     67|        case 2: case 3: return 3;
  ------------------
  |  Branch (474:9): [True: 12, False: 433]
  |  Branch (474:17): [True: 55, False: 390]
  ------------------
  475|      1|        case 4: case 5: return 5;
  ------------------
  |  Branch (475:9): [True: 1, False: 444]
  |  Branch (475:17): [True: 0, False: 445]
  ------------------
  476|      1|        case 6: case 7: return 7;
  ------------------
  |  Branch (476:9): [True: 1, False: 444]
  |  Branch (476:17): [True: 0, False: 445]
  ------------------
  477|    445|        }
  478|      6|        break;
  479|    138|      case -1:
  ------------------
  |  Branch (479:7): [True: 138, False: 1.60k]
  ------------------
  480|    138|        switch (bosum) {
  ------------------
  |  Branch (480:17): [True: 137, False: 1]
  ------------------
  481|    117|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (481:9): [True: 102, False: 36]
  |  Branch (481:17): [True: 5, False: 133]
  |  Branch (481:25): [True: 10, False: 128]
  ------------------
  482|     20|        case 3: case 4: return 4;
  ------------------
  |  Branch (482:9): [True: 20, False: 118]
  |  Branch (482:17): [True: 0, False: 138]
  ------------------
  483|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (483:9): [True: 0, False: 138]
  |  Branch (483:17): [True: 0, False: 138]
  ------------------
  484|    138|        }
  485|      1|        break;
  486|    347|      case 0:
  ------------------
  |  Branch (486:7): [True: 347, False: 1.39k]
  ------------------
  487|    347|        switch (bosum) {
  ------------------
  |  Branch (487:17): [True: 345, False: 2]
  ------------------
  488|    344|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (488:9): [True: 213, False: 134]
  |  Branch (488:17): [True: 24, False: 323]
  |  Branch (488:25): [True: 36, False: 311]
  |  Branch (488:33): [True: 71, False: 276]
  ------------------
  489|      1|        case 4: case 5: return 5;
  ------------------
  |  Branch (489:9): [True: 0, False: 347]
  |  Branch (489:17): [True: 1, False: 346]
  ------------------
  490|    347|        }
  491|      2|        break;
  492|     78|      case 1:
  ------------------
  |  Branch (492:7): [True: 78, False: 1.66k]
  ------------------
  493|     78|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (493:13): [True: 77, False: 1]
  ------------------
  494|      1|        break;
  495|    382|      case 2:
  ------------------
  |  Branch (495:7): [True: 382, False: 1.36k]
  ------------------
  496|    382|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (496:13): [True: 381, False: 1]
  ------------------
  497|      1|        break;
  498|  1.74k|      }
  499|    164|      break;
  500|  1.78k|    case 34:
  ------------------
  |  Branch (500:5): [True: 1.78k, False: 279k]
  ------------------
  501|  1.78k|      switch (charge) {
  ------------------
  |  Branch (501:15): [True: 1.76k, False: 19]
  ------------------
  502|    169|      case -2:
  ------------------
  |  Branch (502:7): [True: 169, False: 1.61k]
  ------------------
  503|    169|        if (bosum == 0) return 0;
  ------------------
  |  Branch (503:13): [True: 139, False: 30]
  ------------------
  504|     30|        break;
  505|    339|      case -1:
  ------------------
  |  Branch (505:7): [True: 339, False: 1.44k]
  ------------------
  506|    339|        switch (bosum) {
  ------------------
  |  Branch (506:17): [True: 338, False: 1]
  ------------------
  507|    322|        case 0: case 1: return 1;
  ------------------
  |  Branch (507:9): [True: 310, False: 29]
  |  Branch (507:17): [True: 12, False: 327]
  ------------------
  508|     16|        case 2: case 3: return 3;
  ------------------
  |  Branch (508:9): [True: 16, False: 323]
  |  Branch (508:17): [True: 0, False: 339]
  ------------------
  509|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (509:9): [True: 0, False: 339]
  |  Branch (509:17): [True: 0, False: 339]
  ------------------
  510|      0|        case 6: case 7: return 7;
  ------------------
  |  Branch (510:9): [True: 0, False: 339]
  |  Branch (510:17): [True: 0, False: 339]
  ------------------
  511|    339|        }
  512|      1|        break;
  513|    548|      case 0:
  ------------------
  |  Branch (513:7): [True: 548, False: 1.23k]
  ------------------
  514|    548|        switch (bosum) {
  ------------------
  |  Branch (514:17): [True: 547, False: 1]
  ------------------
  515|    542|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (515:9): [True: 474, False: 74]
  |  Branch (515:17): [True: 17, False: 531]
  |  Branch (515:25): [True: 51, False: 497]
  ------------------
  516|      2|        case 3: case 4: return 4;
  ------------------
  |  Branch (516:9): [True: 1, False: 547]
  |  Branch (516:17): [True: 1, False: 547]
  ------------------
  517|      3|        case 5: case 6: return 6;
  ------------------
  |  Branch (517:9): [True: 2, False: 546]
  |  Branch (517:17): [True: 1, False: 547]
  ------------------
  518|    548|        }
  519|      1|        break;
  520|    450|      case 1:
  ------------------
  |  Branch (520:7): [True: 450, False: 1.33k]
  ------------------
  521|    450|        switch (bosum) {
  ------------------
  |  Branch (521:17): [True: 449, False: 1]
  ------------------
  522|    449|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (522:9): [True: 402, False: 48]
  |  Branch (522:17): [True: 15, False: 435]
  |  Branch (522:25): [True: 32, False: 418]
  |  Branch (522:33): [True: 0, False: 450]
  ------------------
  523|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (523:9): [True: 0, False: 450]
  |  Branch (523:17): [True: 0, False: 450]
  ------------------
  524|    450|        }
  525|      1|        break;
  526|    255|      case 2:
  ------------------
  |  Branch (526:7): [True: 255, False: 1.52k]
  ------------------
  527|    255|        if (bosum <= 4) return 4;
  ------------------
  |  Branch (527:13): [True: 254, False: 1]
  ------------------
  528|      1|        break;
  529|  1.78k|      }
  530|     53|      break;
  531|    940|    case 35:
  ------------------
  |  Branch (531:5): [True: 940, False: 279k]
  ------------------
  532|    940|      switch (charge) {
  ------------------
  |  Branch (532:15): [True: 888, False: 52]
  ------------------
  533|    195|      case -1:
  ------------------
  |  Branch (533:7): [True: 195, False: 745]
  ------------------
  534|    195|        if (bosum == 0) return 0;
  ------------------
  |  Branch (534:13): [True: 157, False: 38]
  ------------------
  535|     38|        break;
  536|    361|      case 0:
  ------------------
  |  Branch (536:7): [True: 361, False: 579]
  ------------------
  537|    361|        switch (bosum) {
  ------------------
  |  Branch (537:17): [True: 360, False: 1]
  ------------------
  538|    358|        case 0: case 1: return 1;
  ------------------
  |  Branch (538:9): [True: 327, False: 34]
  |  Branch (538:17): [True: 31, False: 330]
  ------------------
  539|      1|        case 2: case 3: return 3;
  ------------------
  |  Branch (539:9): [True: 1, False: 360]
  |  Branch (539:17): [True: 0, False: 361]
  ------------------
  540|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (540:9): [True: 0, False: 361]
  |  Branch (540:17): [True: 0, False: 361]
  ------------------
  541|      1|        case 6: case 7: return 7;
  ------------------
  |  Branch (541:9): [True: 1, False: 360]
  |  Branch (541:17): [True: 0, False: 361]
  ------------------
  542|    361|        }
  543|      1|        break;
  544|     68|      case 1:
  ------------------
  |  Branch (544:7): [True: 68, False: 872]
  ------------------
  545|     68|        switch (bosum) {
  ------------------
  |  Branch (545:17): [True: 67, False: 1]
  ------------------
  546|     67|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (546:9): [True: 52, False: 16]
  |  Branch (546:17): [True: 15, False: 53]
  |  Branch (546:25): [True: 0, False: 68]
  ------------------
  547|      0|        case 3: case 4: return 4;
  ------------------
  |  Branch (547:9): [True: 0, False: 68]
  |  Branch (547:17): [True: 0, False: 68]
  ------------------
  548|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (548:9): [True: 0, False: 68]
  |  Branch (548:17): [True: 0, False: 68]
  ------------------
  549|     68|        }
  550|      1|        break;
  551|    264|      case 2:
  ------------------
  |  Branch (551:7): [True: 264, False: 676]
  ------------------
  552|    264|        switch (bosum) {
  ------------------
  |  Branch (552:17): [True: 263, False: 1]
  ------------------
  553|    263|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (553:9): [True: 197, False: 67]
  |  Branch (553:17): [True: 66, False: 198]
  |  Branch (553:25): [True: 0, False: 264]
  |  Branch (553:33): [True: 0, False: 264]
  ------------------
  554|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (554:9): [True: 0, False: 264]
  |  Branch (554:17): [True: 0, False: 264]
  ------------------
  555|    264|        }
  556|      1|        break;
  557|    940|      }
  558|     93|      break;
  559|    218|    case 36:
  ------------------
  |  Branch (559:5): [True: 218, False: 280k]
  ------------------
  560|    218|      if (charge == 0) {
  ------------------
  |  Branch (560:11): [True: 185, False: 33]
  ------------------
  561|    185|        switch (bosum) {
  ------------------
  |  Branch (561:17): [True: 184, False: 1]
  ------------------
  562|    181|        case 0: return 0;
  ------------------
  |  Branch (562:9): [True: 181, False: 4]
  ------------------
  563|      3|        case 1: case 2: return 2;
  ------------------
  |  Branch (563:9): [True: 0, False: 185]
  |  Branch (563:17): [True: 3, False: 182]
  ------------------
  564|    185|        }
  565|    185|      }
  566|     34|      break;
  567|  1.09k|    case 37:
  ------------------
  |  Branch (567:5): [True: 1.09k, False: 279k]
  ------------------
  568|  1.09k|      switch (charge) {
  ------------------
  |  Branch (568:15): [True: 1.07k, False: 18]
  ------------------
  569|    165|      case -1:
  ------------------
  |  Branch (569:7): [True: 165, False: 929]
  ------------------
  570|    165|        if (bosum == 0) return 0;
  ------------------
  |  Branch (570:13): [True: 124, False: 41]
  ------------------
  571|     41|        break;
  572|    357|      case 0:
  ------------------
  |  Branch (572:7): [True: 357, False: 737]
  ------------------
  573|    357|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (573:13): [True: 356, False: 1]
  ------------------
  574|      1|        break;
  575|    554|      case 1:
  ------------------
  |  Branch (575:7): [True: 554, False: 540]
  ------------------
  576|    554|        if (bosum == 0) return 0;
  ------------------
  |  Branch (576:13): [True: 524, False: 30]
  ------------------
  577|     30|        break;
  578|  1.09k|      }
  579|     90|      break;
  580|    479|    case 38:
  ------------------
  |  Branch (580:5): [True: 479, False: 280k]
  ------------------
  581|    479|      switch (charge) {
  ------------------
  |  Branch (581:15): [True: 431, False: 48]
  ------------------
  582|    235|      case 0:
  ------------------
  |  Branch (582:7): [True: 235, False: 244]
  ------------------
  583|    235|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (583:13): [True: 233, False: 2]
  ------------------
  584|      2|        break;
  585|     53|      case 1:
  ------------------
  |  Branch (585:7): [True: 53, False: 426]
  ------------------
  586|     53|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (586:13): [True: 34, False: 19]
  ------------------
  587|     19|        break;
  588|    143|      case 2:
  ------------------
  |  Branch (588:7): [True: 143, False: 336]
  ------------------
  589|    143|        if (bosum == 0) return 0;
  ------------------
  |  Branch (589:13): [True: 121, False: 22]
  ------------------
  590|     22|        break;
  591|    479|      }
  592|     91|      break;
  593|  1.62k|    case 49:
  ------------------
  |  Branch (593:5): [True: 1.62k, False: 279k]
  ------------------
  594|  1.62k|      switch (charge) {
  ------------------
  |  Branch (594:15): [True: 1.61k, False: 11]
  ------------------
  595|    127|      case -2:
  ------------------
  |  Branch (595:7): [True: 127, False: 1.49k]
  ------------------
  596|    127|        switch (bosum) {
  ------------------
  |  Branch (596:17): [True: 126, False: 1]
  ------------------
  597|    126|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (597:9): [True: 84, False: 43]
  |  Branch (597:17): [True: 9, False: 118]
  |  Branch (597:25): [True: 10, False: 117]
  |  Branch (597:33): [True: 23, False: 104]
  ------------------
  598|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (598:9): [True: 0, False: 127]
  |  Branch (598:17): [True: 0, False: 127]
  ------------------
  599|    127|        }
  600|      1|        break;
  601|    254|      case -1:
  ------------------
  |  Branch (601:7): [True: 254, False: 1.37k]
  ------------------
  602|    254|        switch (bosum) {
  ------------------
  |  Branch (602:17): [True: 253, False: 1]
  ------------------
  603|    227|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (603:9): [True: 210, False: 44]
  |  Branch (603:17): [True: 9, False: 245]
  |  Branch (603:25): [True: 8, False: 246]
  ------------------
  604|     26|        case 3: case 4: return 4;
  ------------------
  |  Branch (604:9): [True: 26, False: 228]
  |  Branch (604:17): [True: 0, False: 254]
  ------------------
  605|    254|        }
  606|      1|        break;
  607|    298|      case 0:
  ------------------
  |  Branch (607:7): [True: 298, False: 1.32k]
  ------------------
  608|    298|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (608:13): [True: 297, False: 1]
  ------------------
  609|      1|        break;
  610|    473|      case 1:
  ------------------
  |  Branch (610:7): [True: 473, False: 1.15k]
  ------------------
  611|    473|        if (bosum == 0) return 0;
  ------------------
  |  Branch (611:13): [True: 430, False: 43]
  ------------------
  612|     43|        break;
  613|    327|      case 2:
  ------------------
  |  Branch (613:7): [True: 327, False: 1.29k]
  ------------------
  614|    327|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (614:13): [True: 288, False: 39]
  ------------------
  615|     39|        break;
  616|    135|      case 3:
  ------------------
  |  Branch (616:7): [True: 135, False: 1.49k]
  ------------------
  617|    135|        if (bosum == 0) return 0;
  ------------------
  |  Branch (617:13): [True: 93, False: 42]
  ------------------
  618|     42|        break;
  619|  1.62k|      }
  620|    138|      break;
  621|  1.87k|    case 50:
  ------------------
  |  Branch (621:5): [True: 1.87k, False: 279k]
  ------------------
  622|  1.87k|      switch (charge) {
  ------------------
  |  Branch (622:15): [True: 1.83k, False: 42]
  ------------------
  623|    331|      case -2:
  ------------------
  |  Branch (623:7): [True: 331, False: 1.54k]
  ------------------
  624|    331|        switch (bosum) {
  ------------------
  |  Branch (624:17): [True: 329, False: 2]
  ------------------
  625|    306|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (625:9): [True: 296, False: 35]
  |  Branch (625:17): [True: 4, False: 327]
  |  Branch (625:25): [True: 6, False: 325]
  ------------------
  626|     23|        case 3: case 4: return 4;
  ------------------
  |  Branch (626:9): [True: 11, False: 320]
  |  Branch (626:17): [True: 12, False: 319]
  ------------------
  627|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (627:9): [True: 0, False: 331]
  |  Branch (627:17): [True: 0, False: 331]
  ------------------
  628|    331|        }
  629|      2|        break;
  630|     69|      case -1:
  ------------------
  |  Branch (630:7): [True: 69, False: 1.80k]
  ------------------
  631|     69|        switch (bosum) {
  ------------------
  |  Branch (631:17): [True: 68, False: 1]
  ------------------
  632|     58|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (632:9): [True: 42, False: 27]
  |  Branch (632:17): [True: 6, False: 63]
  |  Branch (632:25): [True: 8, False: 61]
  |  Branch (632:33): [True: 2, False: 67]
  ------------------
  633|     10|        case 4: case 5: return 5;
  ------------------
  |  Branch (633:9): [True: 10, False: 59]
  |  Branch (633:17): [True: 0, False: 69]
  ------------------
  634|     69|        }
  635|      1|        break;
  636|    851|      case 0:
  ------------------
  |  Branch (636:7): [True: 851, False: 1.02k]
  ------------------
  637|    851|        switch (bosum) {
  ------------------
  |  Branch (637:17): [True: 848, False: 3]
  ------------------
  638|    564|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (638:9): [True: 447, False: 404]
  |  Branch (638:17): [True: 41, False: 810]
  |  Branch (638:25): [True: 76, False: 775]
  ------------------
  639|    284|        case 3: case 4: return 4;
  ------------------
  |  Branch (639:9): [True: 123, False: 728]
  |  Branch (639:17): [True: 161, False: 690]
  ------------------
  640|    851|        }
  641|      3|        break;
  642|    197|      case 1:
  ------------------
  |  Branch (642:7): [True: 197, False: 1.67k]
  ------------------
  643|    197|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (643:13): [True: 163, False: 34]
  ------------------
  644|     34|        break;
  645|    288|      case 2:
  ------------------
  |  Branch (645:7): [True: 288, False: 1.58k]
  ------------------
  646|    288|        if (bosum == 0) return 0;
  ------------------
  |  Branch (646:13): [True: 256, False: 32]
  ------------------
  647|     32|        break;
  648|     98|      case 4:
  ------------------
  |  Branch (648:7): [True: 98, False: 1.77k]
  ------------------
  649|     98|        if (bosum == 0) return 0;
  ------------------
  |  Branch (649:13): [True: 64, False: 34]
  ------------------
  650|     34|        break;
  651|  1.87k|      }
  652|    148|      break;
  653|  2.32k|    case 51:
  ------------------
  |  Branch (653:5): [True: 2.32k, False: 278k]
  ------------------
  654|  2.32k|      switch (charge) {
  ------------------
  |  Branch (654:15): [True: 2.28k, False: 38]
  ------------------
  655|    153|      case -2:
  ------------------
  |  Branch (655:7): [True: 153, False: 2.16k]
  ------------------
  656|    153|        switch (bosum) {
  ------------------
  |  Branch (656:17): [True: 152, False: 1]
  ------------------
  657|    111|        case 0: case 1: return 1;
  ------------------
  |  Branch (657:9): [True: 106, False: 47]
  |  Branch (657:17): [True: 5, False: 148]
  ------------------
  658|     41|        case 2: case 3: return 3;
  ------------------
  |  Branch (658:9): [True: 14, False: 139]
  |  Branch (658:17): [True: 27, False: 126]
  ------------------
  659|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (659:9): [True: 0, False: 153]
  |  Branch (659:17): [True: 0, False: 153]
  ------------------
  660|      0|        case 6: case 7: return 7;
  ------------------
  |  Branch (660:9): [True: 0, False: 153]
  |  Branch (660:17): [True: 0, False: 153]
  ------------------
  661|    153|        }
  662|      1|        break;
  663|    137|      case -1:
  ------------------
  |  Branch (663:7): [True: 137, False: 2.18k]
  ------------------
  664|    137|        switch (bosum) {
  ------------------
  |  Branch (664:17): [True: 136, False: 1]
  ------------------
  665|    122|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (665:9): [True: 106, False: 31]
  |  Branch (665:17): [True: 2, False: 135]
  |  Branch (665:25): [True: 14, False: 123]
  ------------------
  666|     14|        case 3: case 4: return 4;
  ------------------
  |  Branch (666:9): [True: 14, False: 123]
  |  Branch (666:17): [True: 0, False: 137]
  ------------------
  667|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (667:9): [True: 0, False: 137]
  |  Branch (667:17): [True: 0, False: 137]
  ------------------
  668|    137|        }
  669|      1|        break;
  670|    672|      case 0:
  ------------------
  |  Branch (670:7): [True: 672, False: 1.65k]
  ------------------
  671|    672|        switch (bosum) {
  ------------------
  |  Branch (671:17): [True: 669, False: 3]
  ------------------
  672|    667|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (672:9): [True: 612, False: 60]
  |  Branch (672:17): [True: 26, False: 646]
  |  Branch (672:25): [True: 11, False: 661]
  |  Branch (672:33): [True: 18, False: 654]
  ------------------
  673|      2|        case 4: case 5: return 5;
  ------------------
  |  Branch (673:9): [True: 1, False: 671]
  |  Branch (673:17): [True: 1, False: 671]
  ------------------
  674|    672|        }
  675|      3|        break;
  676|    209|      case 1:
  ------------------
  |  Branch (676:7): [True: 209, False: 2.11k]
  ------------------
  677|    209|        switch (bosum) {
  ------------------
  |  Branch (677:17): [True: 208, False: 1]
  ------------------
  678|    200|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (678:9): [True: 187, False: 22]
  |  Branch (678:17): [True: 8, False: 201]
  |  Branch (678:25): [True: 5, False: 204]
  ------------------
  679|      8|        case 3: case 4: return 4;
  ------------------
  |  Branch (679:9): [True: 8, False: 201]
  |  Branch (679:17): [True: 0, False: 209]
  ------------------
  680|    209|        }
  681|      1|        break;
  682|    942|      case 2:
  ------------------
  |  Branch (682:7): [True: 942, False: 1.38k]
  ------------------
  683|    942|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (683:13): [True: 941, False: 1]
  ------------------
  684|      1|        break;
  685|    171|      case 3:
  ------------------
  |  Branch (685:7): [True: 171, False: 2.15k]
  ------------------
  686|    171|        if (bosum == 0) return 0;
  ------------------
  |  Branch (686:13): [True: 142, False: 29]
  ------------------
  687|     29|        break;
  688|  2.32k|      }
  689|     74|      break;
  690|  1.86k|    case 52:
  ------------------
  |  Branch (690:5): [True: 1.86k, False: 279k]
  ------------------
  691|  1.86k|      switch (charge) {
  ------------------
  |  Branch (691:15): [True: 1.82k, False: 41]
  ------------------
  692|    493|      case -2:
  ------------------
  |  Branch (692:7): [True: 493, False: 1.37k]
  ------------------
  693|    493|        if (bosum == 0) return 0;
  ------------------
  |  Branch (693:13): [True: 208, False: 285]
  ------------------
  694|    285|        break;
  695|    395|      case -1:
  ------------------
  |  Branch (695:7): [True: 395, False: 1.46k]
  ------------------
  696|    395|        switch (bosum) {
  ------------------
  |  Branch (696:17): [True: 393, False: 2]
  ------------------
  697|    286|        case 0: case 1: return 1;
  ------------------
  |  Branch (697:9): [True: 217, False: 178]
  |  Branch (697:17): [True: 69, False: 326]
  ------------------
  698|    107|        case 2: case 3: return 3;
  ------------------
  |  Branch (698:9): [True: 107, False: 288]
  |  Branch (698:17): [True: 0, False: 395]
  ------------------
  699|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (699:9): [True: 0, False: 395]
  |  Branch (699:17): [True: 0, False: 395]
  ------------------
  700|      0|        case 6: case 7: return 7;
  ------------------
  |  Branch (700:9): [True: 0, False: 395]
  |  Branch (700:17): [True: 0, False: 395]
  ------------------
  701|    395|        }
  702|      2|        break;
  703|    329|      case 0:
  ------------------
  |  Branch (703:7): [True: 329, False: 1.53k]
  ------------------
  704|    329|        switch (bosum) {
  ------------------
  |  Branch (704:17): [True: 325, False: 4]
  ------------------
  705|    322|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (705:9): [True: 211, False: 118]
  |  Branch (705:17): [True: 61, False: 268]
  |  Branch (705:25): [True: 50, False: 279]
  ------------------
  706|      2|        case 3: case 4: return 4;
  ------------------
  |  Branch (706:9): [True: 1, False: 328]
  |  Branch (706:17): [True: 1, False: 328]
  ------------------
  707|      1|        case 5: case 6: return 6;
  ------------------
  |  Branch (707:9): [True: 0, False: 329]
  |  Branch (707:17): [True: 1, False: 328]
  ------------------
  708|    329|        }
  709|      4|        break;
  710|    350|      case 1:
  ------------------
  |  Branch (710:7): [True: 350, False: 1.51k]
  ------------------
  711|    350|        switch (bosum) {
  ------------------
  |  Branch (711:17): [True: 349, False: 1]
  ------------------
  712|    349|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (712:9): [True: 310, False: 40]
  |  Branch (712:17): [True: 11, False: 339]
  |  Branch (712:25): [True: 27, False: 323]
  |  Branch (712:33): [True: 1, False: 349]
  ------------------
  713|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (713:9): [True: 0, False: 350]
  |  Branch (713:17): [True: 0, False: 350]
  ------------------
  714|    350|        }
  715|      1|        break;
  716|    255|      case 2:
  ------------------
  |  Branch (716:7): [True: 255, False: 1.60k]
  ------------------
  717|    255|        switch (bosum) {
  ------------------
  |  Branch (717:17): [True: 254, False: 1]
  ------------------
  718|    254|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (718:9): [True: 202, False: 53]
  |  Branch (718:17): [True: 20, False: 235]
  |  Branch (718:25): [True: 32, False: 223]
  ------------------
  719|      0|        case 3: case 4: return 4;
  ------------------
  |  Branch (719:9): [True: 0, False: 255]
  |  Branch (719:17): [True: 0, False: 255]
  ------------------
  720|    255|        }
  721|      1|        break;
  722|  1.86k|      }
  723|    334|      break;
  724|  3.07k|    case 53:
  ------------------
  |  Branch (724:5): [True: 3.07k, False: 277k]
  ------------------
  725|  3.07k|      switch (charge) {
  ------------------
  |  Branch (725:15): [True: 3.05k, False: 22]
  ------------------
  726|    342|      case -1:
  ------------------
  |  Branch (726:7): [True: 342, False: 2.73k]
  ------------------
  727|    342|        if (bosum == 0) return 0;
  ------------------
  |  Branch (727:13): [True: 317, False: 25]
  ------------------
  728|     25|        break;
  729|  1.95k|      case 0:
  ------------------
  |  Branch (729:7): [True: 1.95k, False: 1.11k]
  ------------------
  730|  1.95k|        switch (bosum) {
  ------------------
  |  Branch (730:17): [True: 1.95k, False: 3]
  ------------------
  731|  1.94k|        case 0: case 1: return 1;
  ------------------
  |  Branch (731:9): [True: 1.77k, False: 180]
  |  Branch (731:17): [True: 162, False: 1.79k]
  ------------------
  732|      7|        case 2: case 3: return 3;
  ------------------
  |  Branch (732:9): [True: 3, False: 1.95k]
  |  Branch (732:17): [True: 4, False: 1.95k]
  ------------------
  733|      5|        case 4: case 5: return 5;
  ------------------
  |  Branch (733:9): [True: 4, False: 1.95k]
  |  Branch (733:17): [True: 1, False: 1.95k]
  ------------------
  734|      3|        case 6: case 7: return 7;
  ------------------
  |  Branch (734:9): [True: 0, False: 1.95k]
  |  Branch (734:17): [True: 3, False: 1.95k]
  ------------------
  735|  1.95k|        }
  736|      3|        break;
  737|    547|      case 1:
  ------------------
  |  Branch (737:7): [True: 547, False: 2.52k]
  ------------------
  738|    547|        switch (bosum) {
  ------------------
  |  Branch (738:17): [True: 546, False: 1]
  ------------------
  739|    545|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (739:9): [True: 515, False: 32]
  |  Branch (739:17): [True: 30, False: 517]
  |  Branch (739:25): [True: 0, False: 547]
  ------------------
  740|      1|        case 3: case 4: return 4;
  ------------------
  |  Branch (740:9): [True: 0, False: 547]
  |  Branch (740:17): [True: 1, False: 546]
  ------------------
  741|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (741:9): [True: 0, False: 547]
  |  Branch (741:17): [True: 0, False: 547]
  ------------------
  742|    547|        }
  743|      1|        break;
  744|    205|      case 2:
  ------------------
  |  Branch (744:7): [True: 205, False: 2.86k]
  ------------------
  745|    205|        switch (bosum) {
  ------------------
  |  Branch (745:17): [True: 203, False: 2]
  ------------------
  746|    203|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (746:9): [True: 169, False: 36]
  |  Branch (746:17): [True: 34, False: 171]
  |  Branch (746:25): [True: 0, False: 205]
  |  Branch (746:33): [True: 0, False: 205]
  ------------------
  747|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (747:9): [True: 0, False: 205]
  |  Branch (747:17): [True: 0, False: 205]
  ------------------
  748|    205|        }
  749|      2|        break;
  750|  3.07k|      }
  751|     53|      break;
  752|    151|    case 54:
  ------------------
  |  Branch (752:5): [True: 151, False: 280k]
  ------------------
  753|    151|      if (charge == 0) {
  ------------------
  |  Branch (753:11): [True: 130, False: 21]
  ------------------
  754|    130|        switch (bosum) {
  ------------------
  |  Branch (754:17): [True: 129, False: 1]
  ------------------
  755|    117|        case 0: return 0;
  ------------------
  |  Branch (755:9): [True: 117, False: 13]
  ------------------
  756|      6|        case 1: case 2: return 2;
  ------------------
  |  Branch (756:9): [True: 4, False: 126]
  |  Branch (756:17): [True: 2, False: 128]
  ------------------
  757|      4|        case 3: case 4: return 4;
  ------------------
  |  Branch (757:9): [True: 2, False: 128]
  |  Branch (757:17): [True: 2, False: 128]
  ------------------
  758|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (758:9): [True: 0, False: 130]
  |  Branch (758:17): [True: 0, False: 130]
  ------------------
  759|      2|        case 7: case 8: return 8;
  ------------------
  |  Branch (759:9): [True: 0, False: 130]
  |  Branch (759:17): [True: 2, False: 128]
  ------------------
  760|    130|        }
  761|    130|      }
  762|     22|      break;
  763|    766|    case 55:
  ------------------
  |  Branch (763:5): [True: 766, False: 280k]
  ------------------
  764|    766|      switch (charge) {
  ------------------
  |  Branch (764:15): [True: 746, False: 20]
  ------------------
  765|    218|      case -1:
  ------------------
  |  Branch (765:7): [True: 218, False: 548]
  ------------------
  766|    218|        if (bosum == 0) return 0;
  ------------------
  |  Branch (766:13): [True: 154, False: 64]
  ------------------
  767|     64|        break;
  768|    352|      case 0:
  ------------------
  |  Branch (768:7): [True: 352, False: 414]
  ------------------
  769|    352|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (769:13): [True: 349, False: 3]
  ------------------
  770|      3|        break;
  771|    176|      case 1:
  ------------------
  |  Branch (771:7): [True: 176, False: 590]
  ------------------
  772|    176|        if (bosum == 0) return 0;
  ------------------
  |  Branch (772:13): [True: 165, False: 11]
  ------------------
  773|     11|        break;
  774|    766|      }
  775|     98|      break;
  776|    937|    case 56:
  ------------------
  |  Branch (776:5): [True: 937, False: 279k]
  ------------------
  777|    937|      switch (charge) {
  ------------------
  |  Branch (777:15): [True: 899, False: 38]
  ------------------
  778|    639|      case 0:
  ------------------
  |  Branch (778:7): [True: 639, False: 298]
  ------------------
  779|    639|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (779:13): [True: 638, False: 1]
  ------------------
  780|      1|        break;
  781|    221|      case 1:
  ------------------
  |  Branch (781:7): [True: 221, False: 716]
  ------------------
  782|    221|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (782:13): [True: 186, False: 35]
  ------------------
  783|     35|        break;
  784|     39|      case 2:
  ------------------
  |  Branch (784:7): [True: 39, False: 898]
  ------------------
  785|     39|        if (bosum == 0) return 0;
  ------------------
  |  Branch (785:13): [True: 26, False: 13]
  ------------------
  786|     13|        break;
  787|    937|      }
  788|     87|      break;
  789|    437|    case 81:
  ------------------
  |  Branch (789:5): [True: 437, False: 280k]
  ------------------
  790|    437|      if (charge == 0) {
  ------------------
  |  Branch (790:11): [True: 391, False: 46]
  ------------------
  791|    391|        switch (bosum) {
  ------------------
  |  Branch (791:17): [True: 390, False: 1]
  ------------------
  792|    344|        case 0: case 1: return 1;
  ------------------
  |  Branch (792:9): [True: 306, False: 85]
  |  Branch (792:17): [True: 38, False: 353]
  ------------------
  793|     46|        case 2: case 3: return 3;
  ------------------
  |  Branch (793:9): [True: 18, False: 373]
  |  Branch (793:17): [True: 28, False: 363]
  ------------------
  794|    391|        }
  795|    391|      }
  796|     47|      break;
  797|  1.37k|    case 82:
  ------------------
  |  Branch (797:5): [True: 1.37k, False: 279k]
  ------------------
  798|  1.37k|      switch (charge) {
  ------------------
  |  Branch (798:15): [True: 1.34k, False: 23]
  ------------------
  799|    181|      case -2:
  ------------------
  |  Branch (799:7): [True: 181, False: 1.19k]
  ------------------
  800|    181|        switch (bosum) {
  ------------------
  |  Branch (800:17): [True: 180, False: 1]
  ------------------
  801|    159|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (801:9): [True: 145, False: 36]
  |  Branch (801:17): [True: 8, False: 173]
  |  Branch (801:25): [True: 6, False: 175]
  ------------------
  802|     21|        case 3: case 4: return 4;
  ------------------
  |  Branch (802:9): [True: 8, False: 173]
  |  Branch (802:17): [True: 13, False: 168]
  ------------------
  803|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (803:9): [True: 0, False: 181]
  |  Branch (803:17): [True: 0, False: 181]
  ------------------
  804|    181|        }
  805|      1|        break;
  806|    213|      case -1:
  ------------------
  |  Branch (806:7): [True: 213, False: 1.15k]
  ------------------
  807|    213|        switch (bosum) {
  ------------------
  |  Branch (807:17): [True: 210, False: 3]
  ------------------
  808|    169|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (808:9): [True: 113, False: 100]
  |  Branch (808:17): [True: 13, False: 200]
  |  Branch (808:25): [True: 11, False: 202]
  |  Branch (808:33): [True: 32, False: 181]
  ------------------
  809|     41|        case 4: case 5: return 5;
  ------------------
  |  Branch (809:9): [True: 41, False: 172]
  |  Branch (809:17): [True: 0, False: 213]
  ------------------
  810|    213|        }
  811|      3|        break;
  812|    704|      case 0:
  ------------------
  |  Branch (812:7): [True: 704, False: 668]
  ------------------
  813|    704|        switch (bosum) {
  ------------------
  |  Branch (813:17): [True: 701, False: 3]
  ------------------
  814|    620|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (814:9): [True: 427, False: 277]
  |  Branch (814:17): [True: 167, False: 537]
  |  Branch (814:25): [True: 26, False: 678]
  ------------------
  815|     81|        case 3: case 4: return 4;
  ------------------
  |  Branch (815:9): [True: 38, False: 666]
  |  Branch (815:17): [True: 43, False: 661]
  ------------------
  816|    704|        }
  817|      3|        break;
  818|    162|      case 1:
  ------------------
  |  Branch (818:7): [True: 162, False: 1.21k]
  ------------------
  819|    162|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (819:13): [True: 123, False: 39]
  ------------------
  820|     39|        break;
  821|     89|      case 2:
  ------------------
  |  Branch (821:7): [True: 89, False: 1.28k]
  ------------------
  822|     89|        if (bosum == 0) return 0;
  ------------------
  |  Branch (822:13): [True: 60, False: 29]
  ------------------
  823|     29|        break;
  824|  1.37k|      }
  825|     98|      break;
  826|  2.94k|    case 83:
  ------------------
  |  Branch (826:5): [True: 2.94k, False: 277k]
  ------------------
  827|  2.94k|      switch (charge) {
  ------------------
  |  Branch (827:15): [True: 2.91k, False: 22]
  ------------------
  828|  1.45k|      case -2:
  ------------------
  |  Branch (828:7): [True: 1.45k, False: 1.48k]
  ------------------
  829|  1.45k|        switch (bosum) {
  ------------------
  |  Branch (829:17): [True: 1.45k, False: 1]
  ------------------
  830|  1.35k|        case 0: case 1: return 1;
  ------------------
  |  Branch (830:9): [True: 1.29k, False: 155]
  |  Branch (830:17): [True: 52, False: 1.40k]
  ------------------
  831|    101|        case 2: case 3: return 3;
  ------------------
  |  Branch (831:9): [True: 37, False: 1.41k]
  |  Branch (831:17): [True: 64, False: 1.39k]
  ------------------
  832|      1|        case 4: case 5: return 5;
  ------------------
  |  Branch (832:9): [True: 0, False: 1.45k]
  |  Branch (832:17): [True: 1, False: 1.45k]
  ------------------
  833|      0|        case 6: case 7: return 7;
  ------------------
  |  Branch (833:9): [True: 0, False: 1.45k]
  |  Branch (833:17): [True: 0, False: 1.45k]
  ------------------
  834|  1.45k|        }
  835|      1|        break;
  836|     57|      case -1:
  ------------------
  |  Branch (836:7): [True: 57, False: 2.88k]
  ------------------
  837|     57|        switch (bosum) {
  ------------------
  |  Branch (837:17): [True: 56, False: 1]
  ------------------
  838|     42|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (838:9): [True: 30, False: 27]
  |  Branch (838:17): [True: 9, False: 48]
  |  Branch (838:25): [True: 3, False: 54]
  ------------------
  839|     12|        case 3: case 4: return 4;
  ------------------
  |  Branch (839:9): [True: 11, False: 46]
  |  Branch (839:17): [True: 1, False: 56]
  ------------------
  840|      2|        case 5: case 6: return 6;
  ------------------
  |  Branch (840:9): [True: 1, False: 56]
  |  Branch (840:17): [True: 1, False: 56]
  ------------------
  841|     57|        }
  842|      1|        break;
  843|    757|      case 0:
  ------------------
  |  Branch (843:7): [True: 757, False: 2.18k]
  ------------------
  844|    757|        switch (bosum) {
  ------------------
  |  Branch (844:17): [True: 754, False: 3]
  ------------------
  845|    754|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (845:9): [True: 685, False: 72]
  |  Branch (845:17): [True: 10, False: 747]
  |  Branch (845:25): [True: 14, False: 743]
  |  Branch (845:33): [True: 45, False: 712]
  ------------------
  846|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (846:9): [True: 0, False: 757]
  |  Branch (846:17): [True: 0, False: 757]
  ------------------
  847|    757|        }
  848|      3|        break;
  849|    166|      case 1:
  ------------------
  |  Branch (849:7): [True: 166, False: 2.77k]
  ------------------
  850|    166|        switch (bosum) {
  ------------------
  |  Branch (850:17): [True: 162, False: 4]
  ------------------
  851|    126|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (851:9): [True: 91, False: 75]
  |  Branch (851:17): [True: 12, False: 154]
  |  Branch (851:25): [True: 23, False: 143]
  ------------------
  852|     36|        case 3: case 4: return 4;
  ------------------
  |  Branch (852:9): [True: 36, False: 130]
  |  Branch (852:17): [True: 0, False: 166]
  ------------------
  853|    166|        }
  854|      4|        break;
  855|     73|      case 2:
  ------------------
  |  Branch (855:7): [True: 73, False: 2.86k]
  ------------------
  856|     73|        if (bosum <= 3) return 3;
  ------------------
  |  Branch (856:13): [True: 72, False: 1]
  ------------------
  857|      1|        break;
  858|    411|      case 3:
  ------------------
  |  Branch (858:7): [True: 411, False: 2.52k]
  ------------------
  859|    411|        if (bosum == 0) return 0;
  ------------------
  |  Branch (859:13): [True: 355, False: 56]
  ------------------
  860|     56|        break;
  861|  2.94k|      }
  862|     88|      break;
  863|    810|    case 84:
  ------------------
  |  Branch (863:5): [True: 810, False: 280k]
  ------------------
  864|    810|      if (charge == 0) {
  ------------------
  |  Branch (864:11): [True: 792, False: 18]
  ------------------
  865|    792|        switch (bosum) {
  ------------------
  |  Branch (865:17): [True: 791, False: 1]
  ------------------
  866|    787|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (866:9): [True: 535, False: 257]
  |  Branch (866:17): [True: 121, False: 671]
  |  Branch (866:25): [True: 131, False: 661]
  ------------------
  867|      2|        case 3: case 4: return 4;
  ------------------
  |  Branch (867:9): [True: 1, False: 791]
  |  Branch (867:17): [True: 1, False: 791]
  ------------------
  868|      2|        case 5: case 6: return 6;
  ------------------
  |  Branch (868:9): [True: 2, False: 790]
  |  Branch (868:17): [True: 0, False: 792]
  ------------------
  869|    792|        }
  870|    792|      }
  871|     19|      break;
  872|    732|    case 85:
  ------------------
  |  Branch (872:5): [True: 732, False: 280k]
  ------------------
  873|    732|      switch (charge) {
  ------------------
  |  Branch (873:15): [True: 696, False: 36]
  ------------------
  874|    119|      case -1:
  ------------------
  |  Branch (874:7): [True: 119, False: 613]
  ------------------
  875|    119|        if (bosum == 0) return 0;
  ------------------
  |  Branch (875:13): [True: 81, False: 38]
  ------------------
  876|     38|        break;
  877|    367|      case 0:
  ------------------
  |  Branch (877:7): [True: 367, False: 365]
  ------------------
  878|    367|        switch (bosum) {
  ------------------
  |  Branch (878:17): [True: 366, False: 1]
  ------------------
  879|    365|        case 0: case 1: return 1;
  ------------------
  |  Branch (879:9): [True: 284, False: 83]
  |  Branch (879:17): [True: 81, False: 286]
  ------------------
  880|      0|        case 2: case 3: return 3;
  ------------------
  |  Branch (880:9): [True: 0, False: 367]
  |  Branch (880:17): [True: 0, False: 367]
  ------------------
  881|      1|        case 4: case 5: return 5;
  ------------------
  |  Branch (881:9): [True: 1, False: 366]
  |  Branch (881:17): [True: 0, False: 367]
  ------------------
  882|      0|        case 6: case 7: return 7;
  ------------------
  |  Branch (882:9): [True: 0, False: 367]
  |  Branch (882:17): [True: 0, False: 367]
  ------------------
  883|    367|        }
  884|      1|        break;
  885|     74|      case 1:
  ------------------
  |  Branch (885:7): [True: 74, False: 658]
  ------------------
  886|     74|        switch (bosum) {
  ------------------
  |  Branch (886:17): [True: 74, False: 0]
  ------------------
  887|     74|        case 0: case 1: case 2: return 2;
  ------------------
  |  Branch (887:9): [True: 60, False: 14]
  |  Branch (887:17): [True: 14, False: 60]
  |  Branch (887:25): [True: 0, False: 74]
  ------------------
  888|      0|        case 3: case 4: return 4;
  ------------------
  |  Branch (888:9): [True: 0, False: 74]
  |  Branch (888:17): [True: 0, False: 74]
  ------------------
  889|      0|        case 5: case 6: return 6;
  ------------------
  |  Branch (889:9): [True: 0, False: 74]
  |  Branch (889:17): [True: 0, False: 74]
  ------------------
  890|     74|        }
  891|      0|        break;
  892|    136|      case 2:
  ------------------
  |  Branch (892:7): [True: 136, False: 596]
  ------------------
  893|    136|        switch (bosum) {
  ------------------
  |  Branch (893:17): [True: 135, False: 1]
  ------------------
  894|    135|        case 0: case 1: case 2: case 3: return 3;
  ------------------
  |  Branch (894:9): [True: 106, False: 30]
  |  Branch (894:17): [True: 29, False: 107]
  |  Branch (894:25): [True: 0, False: 136]
  |  Branch (894:33): [True: 0, False: 136]
  ------------------
  895|      0|        case 4: case 5: return 5;
  ------------------
  |  Branch (895:9): [True: 0, False: 136]
  |  Branch (895:17): [True: 0, False: 136]
  ------------------
  896|    136|        }
  897|      1|        break;
  898|    732|      }
  899|     76|      break;
  900|    805|    case 86:
  ------------------
  |  Branch (900:5): [True: 805, False: 280k]
  ------------------
  901|    805|      if (charge == 0) {
  ------------------
  |  Branch (901:11): [True: 654, False: 151]
  ------------------
  902|    654|        switch (bosum) {
  ------------------
  |  Branch (902:17): [True: 653, False: 1]
  ------------------
  903|    644|        case 0: return 0;
  ------------------
  |  Branch (903:9): [True: 644, False: 10]
  ------------------
  904|      1|        case 1: case 2: return 2;
  ------------------
  |  Branch (904:9): [True: 1, False: 653]
  |  Branch (904:17): [True: 0, False: 654]
  ------------------
  905|      1|        case 3: case 4: return 4;
  ------------------
  |  Branch (905:9): [True: 1, False: 653]
  |  Branch (905:17): [True: 0, False: 654]
  ------------------
  906|      2|        case 5: case 6: return 6;
  ------------------
  |  Branch (906:9): [True: 1, False: 653]
  |  Branch (906:17): [True: 1, False: 653]
  ------------------
  907|      5|        case 7: case 8: return 8;
  ------------------
  |  Branch (907:9): [True: 2, False: 652]
  |  Branch (907:17): [True: 3, False: 651]
  ------------------
  908|    654|        }
  909|    654|      }
  910|    152|      break;
  911|    486|    case 87:
  ------------------
  |  Branch (911:5): [True: 486, False: 280k]
  ------------------
  912|    486|      switch (charge) {
  ------------------
  |  Branch (912:15): [True: 466, False: 20]
  ------------------
  913|    351|      case 0:
  ------------------
  |  Branch (913:7): [True: 351, False: 135]
  ------------------
  914|    351|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (914:13): [True: 350, False: 1]
  ------------------
  915|      1|        break;
  916|    115|      case 1:
  ------------------
  |  Branch (916:7): [True: 115, False: 371]
  ------------------
  917|    115|        if (bosum == 0) return 0;
  ------------------
  |  Branch (917:13): [True: 91, False: 24]
  ------------------
  918|     24|        break;
  919|    486|      }
  920|     45|      break;
  921|    824|    case 88:
  ------------------
  |  Branch (921:5): [True: 824, False: 280k]
  ------------------
  922|    824|      switch (charge) {
  ------------------
  |  Branch (922:15): [True: 801, False: 23]
  ------------------
  923|    530|      case 0:
  ------------------
  |  Branch (923:7): [True: 530, False: 294]
  ------------------
  924|    530|        if (bosum <= 2) return 2;
  ------------------
  |  Branch (924:13): [True: 529, False: 1]
  ------------------
  925|      1|        break;
  926|     78|      case 1:
  ------------------
  |  Branch (926:7): [True: 78, False: 746]
  ------------------
  927|     78|        if (bosum <= 1) return 1;
  ------------------
  |  Branch (927:13): [True: 51, False: 27]
  ------------------
  928|     27|        break;
  929|    193|      case 2:
  ------------------
  |  Branch (929:7): [True: 193, False: 631]
  ------------------
  930|    193|        if (bosum == 0) return 0;
  ------------------
  |  Branch (930:13): [True: 149, False: 44]
  ------------------
  931|     44|        break;
  932|    824|      }
  933|     95|      break;
  934|   280k|    }
  935|       |
  936|   169k|    return bosum;
  937|   280k|  }
_ZN9OpenBabel36OBAtomAssignTypicalImplicitHydrogensEPNS_6OBAtomE:
  941|   280k|  {
  942|   280k|    unsigned int bosum = atom->GetExplicitValence();
  943|   280k|    unsigned int valence = GetTypicalValence(atom->GetAtomicNum(), bosum, atom->GetFormalCharge());
  944|   280k|    atom->SetImplicitHCount(valence - bosum);
  945|   280k|  }

_ZN9OpenBabel16OBMolAtomDFSIterC2EPNS_5OBMolEi:
  149|  8.44k|    _parent(mol), _ptr(_parent->GetAtom(StartIndex))
  150|  8.44k|  {
  151|  8.44k|    if (!_ptr) return;
  ------------------
  |  Branch (151:9): [True: 2, False: 8.44k]
  ------------------
  152|       |
  153|  8.44k|    _notVisited.Resize(_parent->NumAtoms());
  154|  8.44k|    _notVisited.SetRangeOn(0, _parent->NumAtoms() - 1);
  155|       |    
  156|  8.44k|    _notVisited.SetBitOff(_ptr->GetIdx() - 1);
  157|       |
  158|  8.44k|    vector<OBBond*>::iterator i;
  159|  8.44k|    OBAtom *a;
  160|       |
  161|  23.5k|    for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i))
  ------------------
  |  Branch (161:37): [True: 15.0k, False: 8.44k]
  ------------------
  162|  15.0k|      {
  163|  15.0k|        _stack.push(a);
  164|  15.0k|        _notVisited.SetBitOff(a->GetIdx() - 1);
  165|  15.0k|      }
  166|  8.44k|  }
_ZN9OpenBabel16OBMolAtomDFSIterC2ERNS_5OBMolEi:
  169|  8.40k|    _parent(&mol), _ptr(_parent->GetAtom(StartIndex))
  170|  8.40k|  {
  171|  8.40k|    if (!_ptr) return;
  ------------------
  |  Branch (171:9): [True: 0, False: 8.40k]
  ------------------
  172|       |
  173|  8.40k|    _notVisited.Resize(_parent->NumAtoms());
  174|  8.40k|    _notVisited.SetRangeOn(0, _parent->NumAtoms() - 1);
  175|       |    
  176|  8.40k|    _notVisited.SetBitOff(_ptr->GetIdx() - 1);
  177|       |
  178|  8.40k|    vector<OBBond*>::iterator i;
  179|  8.40k|    OBAtom *a;
  180|       |
  181|  23.4k|    for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i))
  ------------------
  |  Branch (181:37): [True: 15.0k, False: 8.40k]
  ------------------
  182|  15.0k|      {
  183|  15.0k|        _stack.push(a);
  184|  15.0k|        _notVisited.SetBitOff(a->GetIdx() - 1);
  185|  15.0k|      }
  186|  8.40k|  }
_ZN9OpenBabel16OBMolAtomDFSIterC2ERKS0_:
  189|   807k|  {
  190|   807k|    _parent = ai._parent;
  191|   807k|    _ptr = ai._ptr;
  192|   807k|    _notVisited = ai._notVisited;
  193|   807k|    _stack = ai._stack;
  194|   807k|  }
_ZN9OpenBabel16OBMolAtomDFSIterppEv:
  209|  1.61M|  {
  210|  1.61M|    if (!_stack.empty())
  ------------------
  |  Branch (210:9): [True: 1.22M, False: 385k]
  ------------------
  211|  1.22M|      {
  212|  1.22M|        _ptr = _stack.top();
  213|  1.22M|        _stack.pop();
  214|  1.22M|      }
  215|   385k|    else // are there any disconnected subgraphs?
  216|   385k|      {
  217|   385k|        int next = _notVisited.FirstBit();
  218|   385k|        if (next != _notVisited.EndBit())
  ------------------
  |  Branch (218:13): [True: 368k, False: 16.8k]
  ------------------
  219|   368k|          {
  220|   368k|            _ptr = _parent->GetAtom(next + 1);
  221|   368k|            _notVisited.SetBitOff(next);
  222|   368k|          }
  223|  16.8k|        else
  224|  16.8k|          _ptr = nullptr;
  225|   385k|      }
  226|       |
  227|  1.61M|    if (_ptr)
  ------------------
  |  Branch (227:9): [True: 1.59M, False: 16.8k]
  ------------------
  228|  1.59M|      {
  229|  1.59M|        vector<OBBond*>::iterator i;
  230|  1.59M|        OBAtom *a;
  231|       |
  232|  4.23M|        for (a = _ptr->BeginNbrAtom(i); a; a = _ptr->NextNbrAtom(i))
  ------------------
  |  Branch (232:41): [True: 2.63M, False: 1.59M]
  ------------------
  233|  2.63M|          if (_notVisited[a->GetIdx() - 1])
  ------------------
  |  Branch (233:15): [True: 1.19M, False: 1.44M]
  ------------------
  234|  1.19M|            {
  235|  1.19M|              _stack.push(a);
  236|  1.19M|              _notVisited.SetBitOff(a->GetIdx() - 1);
  237|  1.19M|            }
  238|  1.59M|      }
  239|       |
  240|  1.61M|    return *this;
  241|  1.61M|  }
_ZN9OpenBabel16OBMolAtomDFSIterppEi:
  244|   807k|  {
  245|   807k|    OBMolAtomDFSIter tmp(*this);
  246|   807k|    operator++();
  247|   807k|    return tmp;
  248|   807k|  }
_ZN9OpenBabel14OBMolAngleIterC2ERNS_5OBMolE:
 1130|    424|  {
 1131|    424|    mol.FindAngles();
 1132|    424|    OBAngleData *ad = (OBAngleData *) mol.GetData(OBGenericDataType::AngleData);
 1133|    424|    ad->FillAngleArray(_vangle);
 1134|       |
 1135|    424|    _parent = &mol;
 1136|    424|    if (!_vangle.empty()) {
  ------------------
  |  Branch (1136:9): [True: 0, False: 424]
  ------------------
 1137|      0|      _i = _vangle.begin();
 1138|      0|      _angle = *_i;
 1139|    424|	} else {
 1140|    424|      _i = _vangle.end();
 1141|    424|	}
 1142|    424|  }
_ZN9OpenBabel16OBMolTorsionIterC2ERNS_5OBMolE:
 1229|    424|  {
 1230|    424|    mol.FindTorsions();
 1231|    424|    OBTorsionData *td = (OBTorsionData *) mol.GetData(OBGenericDataType::TorsionData);
 1232|    424|    td->FillTorsionArray(_vtorsion);
 1233|       |
 1234|    424|    _parent = &mol;
 1235|    424|    if (!_vtorsion.empty()) {
  ------------------
  |  Branch (1235:9): [True: 0, False: 424]
  ------------------
 1236|      0|      _i = _vtorsion.begin();
 1237|      0|      _torsion = *_i;
 1238|    424|	} else {
 1239|       |	  // Avogadro bug #1972244
 1240|       |	  // always set _i, _i will be compared to _vtorsion.end() in OBMolTorsionIter::bool()
 1241|    424|	  _i = _vtorsion.end();
 1242|    424|	}
 1243|    424|  }
_ZN9OpenBabel13OBMolPairIterC2ERNS_5OBMolE:
 1345|    762|  {
 1346|    762|    _parent = &mol;
 1347|       |
 1348|    762|    bool foundPair = false;
 1349|    762|    OBAtom *a = _parent->BeginAtom(_i);
 1350|    762|    if (!a)
  ------------------
  |  Branch (1350:9): [True: 22, False: 740]
  ------------------
 1351|     22|      return;
 1352|    740|    OBAtom *b = _parent->BeginAtom(_j);
 1353|    826|    while (!foundPair) {
  ------------------
  |  Branch (1353:12): [True: 740, False: 86]
  ------------------
 1354|    740|      b = _parent->NextAtom(_j);
 1355|       |
 1356|    740|      if (!b) {
  ------------------
  |  Branch (1356:11): [True: 654, False: 86]
  ------------------
 1357|    654|        a = _parent->NextAtom(_i);
 1358|    654|	if (!a)
  ------------------
  |  Branch (1358:6): [True: 654, False: 0]
  ------------------
 1359|    654|          return;
 1360|      0|        b = _parent->BeginAtom(_j);
 1361|      0|      }
 1362|       |
 1363|     86|      if (a->GetIdx() >= b->GetIdx()) continue;
  ------------------
  |  Branch (1363:11): [True: 0, False: 86]
  ------------------
 1364|     86|      if (a->IsConnected(b)) continue;
  ------------------
  |  Branch (1364:11): [True: 0, False: 86]
  ------------------
 1365|     86|      if (a->IsOneThree(b)) continue;
  ------------------
  |  Branch (1365:11): [True: 0, False: 86]
  ------------------
 1366|       |
 1367|     86|      foundPair = true;
 1368|     86|    }
 1369|       |
 1370|     86|    _pair.clear();
 1371|     86|    _pair.push_back(a->GetIdx());
 1372|     86|    _pair.push_back(b->GetIdx());
 1373|     86|  }

_ZN9OpenBabel5IsNanERKd:
   95|  2.24M|  {
   96|  2.24M|    return ((a) != (a));
   97|  2.24M|  }

_ZN9OpenBabel12OpAddInIndexC2EPKc:
   30|      2|  OpAddInIndex(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel14OpAddNonPolarHC2EPKc:
   29|      2|  OpAddNonPolarH(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel11OpAddPolarHC2EPKc:
   29|      2|  OpAddPolarH(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel11OpCanonicalC2EPKc:
   31|      2|  OpCanonical(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel14OpDelNonPolarHC2EPKc:
   29|      2|  OpDelNonPolarH(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel11OpDelPolarHC2EPKc:
   29|      2|  OpDelPolarH(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel8OpFillUCC2EPKc:
   38|      2|  OpFillUC(const char* ID) : OBOp(ID, false){
   39|      2|    OBConversion::RegisterOptionParam("fillUC", nullptr, 1, OBConversion::GENOPTIONS);
   40|      2|  }

_ZN9OpenBabel8OpEnergyC2EPKc:
   49|      2|      OpEnergy(const char *ID) : OBOp(ID, false) {}
_ZN9OpenBabel10OpMinimizeC2EPKc:
  138|      2|      OpMinimize(const char* ID) : OBOp(ID, false) {}

_ZN9OpenBabel7OpGen2DC2EPKc:
   33|      2|  OpGen2D(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel7OpGen3DC2EPKc:
   36|      2|  OpGen3D(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel6OpNewSC2EPKc:
   48|      4|  OpNewS(const char* ID) : OBOp(ID, false){}

_ZN9OpenBabel15OpPartialChargeC2EPKc:
   34|      2|  OpPartialCharge(const char* ID) : OBOp(ID, false) {
   35|      2|    OBConversion::RegisterOptionParam(ID, nullptr, 1, OBConversion::GENOPTIONS);
   36|      2|  }

_ZN9OpenBabel16OpReadConformersC2EPKc:
   31|      2|  OpReadConformers(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel6OpSortC2EPKc:
   48|      2|  OpSort(const char* ID) : OBOp(ID, false)
   49|      2|  {
   50|      2|    OBConversion::RegisterOptionParam(ID, nullptr, 1, OBConversion::GENOPTIONS);
   51|      2|  }

_ZN9OpenBabel10OpExtraOutC2EPKc:
  122|      2|  OpExtraOut(const char* ID) : OBOp(ID, false){};

_ZN9OpenBabel15OBSmartsPattern24ParseSimpleAtomPrimitiveEv:
  616|  37.3k|  {
  617|  37.3k|    switch( *LexPtr++ )
  ------------------
  |  Branch (617:13): [True: 37.3k, False: 0]
  ------------------
  618|  37.3k|      {
  619|  36.8k|      case '*':
  ------------------
  |  Branch (619:7): [True: 36.8k, False: 435]
  ------------------
  620|  36.8k|        return BuildAtomPred(AE_TRUE);
  ------------------
  |  |  104|  36.8k|#define AE_TRUE         6
  ------------------
  621|      0|      case 'A':
  ------------------
  |  Branch (621:7): [True: 0, False: 37.3k]
  ------------------
  622|      0|        return BuildAtomPred(AE_ALIPHATIC);
  ------------------
  |  |  107|      0|#define AE_ALIPHATIC    9
  ------------------
  623|      0|      case 'B':
  ------------------
  |  Branch (623:7): [True: 0, False: 37.3k]
  ------------------
  624|      0|        if( *LexPtr == 'r' )
  ------------------
  |  Branch (624:13): [True: 0, False: 0]
  ------------------
  625|      0|          {
  626|      0|            LexPtr++;
  627|      0|            return GenerateElement(35);
  628|      0|          }
  629|      0|        return GenerateElement(5);
  630|    174|      case 'C':
  ------------------
  |  Branch (630:7): [True: 174, False: 37.1k]
  ------------------
  631|    174|        if( *LexPtr == 'l' )
  ------------------
  |  Branch (631:13): [True: 0, False: 174]
  ------------------
  632|      0|          {
  633|      0|            LexPtr++;
  634|      0|            return GenerateElement(17);
  635|      0|          }
  636|    174|        return GenerateAromElem(6,false);
  637|      0|      case 'F':
  ------------------
  |  Branch (637:7): [True: 0, False: 37.3k]
  ------------------
  638|      0|        return GenerateElement( 9);
  639|      0|      case 'I':
  ------------------
  |  Branch (639:7): [True: 0, False: 37.3k]
  ------------------
  640|      0|        return GenerateElement(53);
  641|     65|      case 'N':
  ------------------
  |  Branch (641:7): [True: 65, False: 37.2k]
  ------------------
  642|     65|        return GenerateAromElem(7,false);
  643|    116|      case 'O':
  ------------------
  |  Branch (643:7): [True: 116, False: 37.1k]
  ------------------
  644|    116|        return GenerateAromElem(8,false);
  645|      7|      case 'P':
  ------------------
  |  Branch (645:7): [True: 7, False: 37.3k]
  ------------------
  646|      7|        return GenerateAromElem(15, false);
  647|      2|      case 'S':
  ------------------
  |  Branch (647:7): [True: 2, False: 37.3k]
  ------------------
  648|      2|        return GenerateAromElem(16,false);
  649|      3|      case 'a':
  ------------------
  |  Branch (649:7): [True: 3, False: 37.3k]
  ------------------
  650|      3|        if( *LexPtr == 's' )
  ------------------
  |  Branch (650:13): [True: 0, False: 3]
  ------------------
  651|      0|          {
  652|      0|            LexPtr++;
  653|      0|            return GenerateAromElem(33, true);
  654|      0|          }
  655|      3|        return BuildAtomPred(AE_AROMATIC);
  ------------------
  |  |  106|      3|#define AE_AROMATIC     8
  ------------------
  656|     56|      case 'c':
  ------------------
  |  Branch (656:7): [True: 56, False: 37.2k]
  ------------------
  657|     56|        return GenerateAromElem( 6,true);
  658|     12|      case 'n':
  ------------------
  |  Branch (658:7): [True: 12, False: 37.3k]
  ------------------
  659|     12|        return GenerateAromElem( 7,true);
  660|      0|      case 'o':
  ------------------
  |  Branch (660:7): [True: 0, False: 37.3k]
  ------------------
  661|      0|        return GenerateAromElem( 8,true);
  662|      0|      case 'p':
  ------------------
  |  Branch (662:7): [True: 0, False: 37.3k]
  ------------------
  663|      0|        return GenerateAromElem(15,true);
  664|      0|      case 's':
  ------------------
  |  Branch (664:7): [True: 0, False: 37.3k]
  ------------------
  665|      0|        if( *LexPtr == 'e' )
  ------------------
  |  Branch (665:13): [True: 0, False: 0]
  ------------------
  666|      0|          {
  667|      0|            LexPtr++;
  668|      0|            return GenerateAromElem(34, true);
  669|      0|          }
  670|      0|        return GenerateAromElem(16,true);
  671|  37.3k|      }
  672|      0|    LexPtr--;
  673|      0|    return nullptr;
  674|  37.3k|  }
_ZN9OpenBabel15OBSmartsPattern25ParseComplexAtomPrimitiveEv:
  677|   231k|  {
  678|   231k|    Pattern *pat;
  679|   231k|    int index;
  680|       |
  681|   231k|    switch( *LexPtr++ )
  ------------------
  |  Branch (681:13): [True: 231k, False: 117]
  ------------------
  682|   231k|      {
  683|   119k|      case('#'):
  ------------------
  |  Branch (683:7): [True: 119k, False: 111k]
  ------------------
  684|   119k|        if( !isdigit(*LexPtr) )
  ------------------
  |  Branch (684:13): [True: 0, False: 119k]
  ------------------
  685|      0|          return nullptr;
  686|       |
  687|   119k|        index = 0;
  688|   119k|        if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (688:13): [True: 0, False: 119k]
  ------------------
  689|      0|          return nullptr;
  690|   119k|        if( index > 255 )
  ------------------
  |  Branch (690:13): [True: 0, False: 119k]
  ------------------
  691|      0|          {
  692|      0|            LexPtr--;
  693|      0|            return nullptr;
  694|      0|          }
  695|   119k|        return( GenerateElement(index) );
  696|       |
  697|     35|      case('$'):
  ------------------
  |  Branch (697:7): [True: 35, False: 231k]
  ------------------
  698|     35|        if( *LexPtr != '(' )
  ------------------
  |  Branch (698:13): [True: 0, False: 35]
  ------------------
  699|      0|          return nullptr;
  700|     35|        LexPtr++;
  701|     35|        pat = ParseSMARTSPattern();
  702|       |
  703|     35|        if( !pat )
  ------------------
  |  Branch (703:13): [True: 0, False: 35]
  ------------------
  704|      0|          return nullptr;
  705|     35|        if( *LexPtr != ')' )
  ------------------
  |  Branch (705:13): [True: 0, False: 35]
  ------------------
  706|      0|          {
  707|      0|            FreePattern(pat);
  708|      0|            return nullptr;
  709|      0|          }
  710|     35|        LexPtr++;
  711|     35|        return( BuildAtomRecurs(pat) );
  712|       |
  713|      9|      case('*'):
  ------------------
  |  Branch (713:7): [True: 9, False: 231k]
  ------------------
  714|      9|        return BuildAtomPred(AE_TRUE);
  ------------------
  |  |  104|      9|#define AE_TRUE         6
  ------------------
  715|       |
  716|     31|      case('+'):
  ------------------
  |  Branch (716:7): [True: 31, False: 231k]
  ------------------
  717|     31|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (717:13): [True: 4, False: 27]
  ------------------
  718|      4|          {
  719|      4|            index = 0;
  720|      4|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (720:17): [True: 0, False: 4]
  ------------------
  721|      0|              return nullptr;
  722|      4|          }
  723|     27|        else
  724|     27|          {
  725|     27|            index = 1;
  726|     27|            while( *LexPtr == '+' )
  ------------------
  |  Branch (726:20): [True: 0, False: 27]
  ------------------
  727|      0|              {
  728|      0|                LexPtr++;
  729|      0|                index++;
  730|      0|              }
  731|     27|          }
  732|     31|        return BuildAtomLeaf(AE_CHARGE,index);
  ------------------
  |  |  115|     31|#define AE_CHARGE       17
  ------------------
  733|       |
  734|  9.26k|      case('-'):
  ------------------
  |  Branch (734:7): [True: 9.26k, False: 222k]
  ------------------
  735|  9.26k|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (735:13): [True: 2, False: 9.25k]
  ------------------
  736|      2|          {
  737|      2|            index = 0;
  738|      2|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (738:17): [True: 0, False: 2]
  ------------------
  739|      0|              return nullptr;
  740|      2|          }
  741|  9.25k|        else
  742|  9.25k|          {
  743|  9.25k|            index = 1;
  744|  9.25k|            while( *LexPtr == '-' )
  ------------------
  |  Branch (744:20): [True: 0, False: 9.25k]
  ------------------
  745|      0|              {
  746|      0|                LexPtr++;
  747|      0|                index++;
  748|      0|              }
  749|  9.25k|          }
  750|  9.26k|        return BuildAtomLeaf(AE_CHARGE,-index);
  ------------------
  |  |  115|  9.26k|#define AE_CHARGE       17
  ------------------
  751|       |
  752|      0|      case '@':
  ------------------
  |  Branch (752:7): [True: 0, False: 231k]
  ------------------
  753|      0|        if (*LexPtr == '?')
  ------------------
  |  Branch (753:13): [True: 0, False: 0]
  ------------------
  754|      0|          {
  755|      0|            LexPtr++;
  756|      0|            return BuildAtomLeaf(AE_CHIRAL,AL_UNSPECIFIED); // unspecified
  ------------------
  |  |  122|      0|#define AE_CHIRAL       24
  ------------------
                          return BuildAtomLeaf(AE_CHIRAL,AL_UNSPECIFIED); // unspecified
  ------------------
  |  |  128|      0|#define AL_UNSPECIFIED    0
  ------------------
  757|      0|          }
  758|      0|        else if (*LexPtr != '@')
  ------------------
  |  Branch (758:18): [True: 0, False: 0]
  ------------------
  759|      0|          return BuildAtomLeaf(AE_CHIRAL,AL_ANTICLOCKWISE);
  ------------------
  |  |  122|      0|#define AE_CHIRAL       24
  ------------------
                        return BuildAtomLeaf(AE_CHIRAL,AL_ANTICLOCKWISE);
  ------------------
  |  |  127|      0|#define AL_ANTICLOCKWISE  2
  ------------------
  760|      0|        else
  761|      0|          {
  762|      0|            LexPtr++;
  763|      0|            return BuildAtomLeaf(AE_CHIRAL,AL_CLOCKWISE);
  ------------------
  |  |  122|      0|#define AE_CHIRAL       24
  ------------------
                          return BuildAtomLeaf(AE_CHIRAL,AL_CLOCKWISE);
  ------------------
  |  |  126|      0|#define AL_CLOCKWISE      1
  ------------------
  764|      0|          }
  765|       |
  766|     42|      case '^':
  ------------------
  |  Branch (766:7): [True: 42, False: 231k]
  ------------------
  767|     42|        if (isdigit(*LexPtr))
  ------------------
  |  Branch (767:13): [True: 42, False: 0]
  ------------------
  768|     42|          {
  769|     42|            index = 0;
  770|     42|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (770:17): [True: 0, False: 42]
  ------------------
  771|      0|              return nullptr;
  772|     42|            return BuildAtomLeaf(AE_HYB,index);
  ------------------
  |  |  123|     42|#define AE_HYB          25
  ------------------
  773|     42|          }
  774|      0|        else
  775|      0|          return BuildAtomLeaf(AE_HYB,1);
  ------------------
  |  |  123|      0|#define AE_HYB          25
  ------------------
  776|       |
  777|      0|      case('0'): case('1'): case('2'): case('3'): case('4'):
  ------------------
  |  Branch (777:7): [True: 0, False: 231k]
  |  Branch (777:18): [True: 0, False: 231k]
  |  Branch (777:29): [True: 0, False: 231k]
  |  Branch (777:40): [True: 0, False: 231k]
  |  Branch (777:51): [True: 0, False: 231k]
  ------------------
  778|      0|      case('5'): case('6'): case('7'): case('8'): case('9'):
  ------------------
  |  Branch (778:7): [True: 0, False: 231k]
  |  Branch (778:18): [True: 0, False: 231k]
  |  Branch (778:29): [True: 0, False: 231k]
  |  Branch (778:40): [True: 0, False: 231k]
  |  Branch (778:51): [True: 0, False: 231k]
  ------------------
  779|      0|        index = LexPtr[-1]-'0';
  780|      0|        if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (780:13): [True: 0, False: 0]
  ------------------
  781|      0|          return nullptr;
  782|      0|        return BuildAtomLeaf(AE_MASS,index);
  ------------------
  |  |  110|      0|#define AE_MASS         12
  ------------------
  783|       |
  784|      3|      case('A'):
  ------------------
  |  Branch (784:7): [True: 3, False: 231k]
  ------------------
  785|      3|        switch( *LexPtr++ )
  ------------------
  |  Branch (785:17): [True: 3, False: 0]
  ------------------
  786|      3|          {
  787|      0|          case('c'):  return GenerateElement(89);
  ------------------
  |  Branch (787:11): [True: 0, False: 3]
  ------------------
  788|      0|          case('g'):  return GenerateElement(47);
  ------------------
  |  Branch (788:11): [True: 0, False: 3]
  ------------------
  789|      2|          case('l'):  return GenerateElement(13);
  ------------------
  |  Branch (789:11): [True: 2, False: 1]
  ------------------
  790|      0|          case('m'):  return GenerateElement(95);
  ------------------
  |  Branch (790:11): [True: 0, False: 3]
  ------------------
  791|      0|          case('r'):  return GenerateElement(18);
  ------------------
  |  Branch (791:11): [True: 0, False: 3]
  ------------------
  792|      1|          case('s'):  return GenerateElement(33);
  ------------------
  |  Branch (792:11): [True: 1, False: 2]
  ------------------
  793|      0|          case('t'):  return GenerateElement(85);
  ------------------
  |  Branch (793:11): [True: 0, False: 3]
  ------------------
  794|      0|          case('u'):  return GenerateElement(79);
  ------------------
  |  Branch (794:11): [True: 0, False: 3]
  ------------------
  795|      3|          }
  796|      0|        LexPtr--;
  797|      0|        return BuildAtomPred(AE_ALIPHATIC);
  ------------------
  |  |  107|      0|#define AE_ALIPHATIC    9
  ------------------
  798|       |
  799|      6|      case('B'):
  ------------------
  |  Branch (799:7): [True: 6, False: 231k]
  ------------------
  800|      6|        switch( *LexPtr++ )
  ------------------
  |  Branch (800:17): [True: 4, False: 2]
  ------------------
  801|      6|          {
  802|      1|          case('a'):  return GenerateElement(56);
  ------------------
  |  Branch (802:11): [True: 1, False: 5]
  ------------------
  803|      1|          case('e'):  return GenerateElement( 4);
  ------------------
  |  Branch (803:11): [True: 1, False: 5]
  ------------------
  804|      2|          case('i'):  return GenerateElement(83);
  ------------------
  |  Branch (804:11): [True: 2, False: 4]
  ------------------
  805|      0|          case('k'):  return GenerateElement(97);
  ------------------
  |  Branch (805:11): [True: 0, False: 6]
  ------------------
  806|      0|          case('r'):  return GenerateElement(35);
  ------------------
  |  Branch (806:11): [True: 0, False: 6]
  ------------------
  807|      6|          }
  808|      2|        LexPtr--;
  809|      2|        return GenerateElement(5);
  810|       |
  811|     11|      case('C'):
  ------------------
  |  Branch (811:7): [True: 11, False: 231k]
  ------------------
  812|     11|        switch( *LexPtr++ )
  ------------------
  |  Branch (812:17): [True: 1, False: 10]
  ------------------
  813|     11|          {
  814|      1|          case('a'):  return GenerateElement(20);
  ------------------
  |  Branch (814:11): [True: 1, False: 10]
  ------------------
  815|      0|          case('d'):  return GenerateElement(48);
  ------------------
  |  Branch (815:11): [True: 0, False: 11]
  ------------------
  816|      0|          case('e'):  return GenerateElement(58);
  ------------------
  |  Branch (816:11): [True: 0, False: 11]
  ------------------
  817|      0|          case('f'):  return GenerateElement(98);
  ------------------
  |  Branch (817:11): [True: 0, False: 11]
  ------------------
  818|      0|          case('l'):  return GenerateElement(17);
  ------------------
  |  Branch (818:11): [True: 0, False: 11]
  ------------------
  819|      0|          case('m'):  return GenerateElement(96);
  ------------------
  |  Branch (819:11): [True: 0, False: 11]
  ------------------
  820|      0|          case('o'):  return GenerateElement(27);
  ------------------
  |  Branch (820:11): [True: 0, False: 11]
  ------------------
  821|      0|          case('r'):  return GenerateElement(24);
  ------------------
  |  Branch (821:11): [True: 0, False: 11]
  ------------------
  822|      0|          case('s'):  return GenerateElement(55);
  ------------------
  |  Branch (822:11): [True: 0, False: 11]
  ------------------
  823|      0|          case('u'):  return GenerateElement(29);
  ------------------
  |  Branch (823:11): [True: 0, False: 11]
  ------------------
  824|     11|          }
  825|     10|        LexPtr--;
  826|     10|        return GenerateAromElem(6,false);
  827|       |
  828|  92.3k|      case('D'):
  ------------------
  |  Branch (828:7): [True: 92.3k, False: 138k]
  ------------------
  829|  92.3k|        if( *LexPtr == 'y' )
  ------------------
  |  Branch (829:13): [True: 0, False: 92.3k]
  ------------------
  830|      0|          {
  831|      0|            LexPtr++;
  832|      0|            return GenerateElement(66);
  833|      0|          }
  834|  92.3k|        else if( isdigit(*LexPtr) )
  ------------------
  |  Branch (834:18): [True: 92.3k, False: 0]
  ------------------
  835|  92.3k|          {
  836|  92.3k|            index = 0;
  837|  92.3k|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (837:17): [True: 0, False: 92.3k]
  ------------------
  838|      0|              return nullptr;
  839|  92.3k|            return BuildAtomLeaf(AE_DEGREE,index);
  ------------------
  |  |  117|  92.3k|#define AE_DEGREE       19
  ------------------
  840|  92.3k|          }
  841|      0|        return BuildAtomLeaf(AE_DEGREE,1);
  ------------------
  |  |  117|      0|#define AE_DEGREE       19
  ------------------
  842|       |
  843|      0|      case('E'):
  ------------------
  |  Branch (843:7): [True: 0, False: 231k]
  ------------------
  844|      0|        if( *LexPtr == 'r' )
  ------------------
  |  Branch (844:13): [True: 0, False: 0]
  ------------------
  845|      0|          {
  846|      0|            LexPtr++;
  847|      0|            return GenerateElement(68);
  848|      0|          }
  849|      0|        else if( *LexPtr == 's' )
  ------------------
  |  Branch (849:18): [True: 0, False: 0]
  ------------------
  850|      0|          {
  851|      0|            LexPtr++;
  852|      0|            return GenerateElement(99);
  853|      0|          }
  854|      0|        else if( *LexPtr == 'u' )
  ------------------
  |  Branch (854:18): [True: 0, False: 0]
  ------------------
  855|      0|          {
  856|      0|            LexPtr++;
  857|      0|            return GenerateElement(63);
  858|      0|          }
  859|      0|        break;
  860|       |
  861|      0|      case('F'):
  ------------------
  |  Branch (861:7): [True: 0, False: 231k]
  ------------------
  862|      0|        if( *LexPtr == 'e' )
  ------------------
  |  Branch (862:13): [True: 0, False: 0]
  ------------------
  863|      0|          {
  864|      0|            LexPtr++;
  865|      0|            return GenerateElement(26);
  866|      0|          }
  867|      0|        else if( *LexPtr == 'm' )
  ------------------
  |  Branch (867:18): [True: 0, False: 0]
  ------------------
  868|      0|          {
  869|      0|            LexPtr++;
  870|      0|            return GenerateElement(100);
  871|      0|          }
  872|      0|        else if( *LexPtr == 'r' )
  ------------------
  |  Branch (872:18): [True: 0, False: 0]
  ------------------
  873|      0|          {
  874|      0|            LexPtr++;
  875|      0|            return GenerateElement(87);
  876|      0|          }
  877|      0|        return GenerateElement(9);
  878|       |
  879|      2|      case('G'):
  ------------------
  |  Branch (879:7): [True: 2, False: 231k]
  ------------------
  880|      2|        if( *LexPtr == 'a' )
  ------------------
  |  Branch (880:13): [True: 1, False: 1]
  ------------------
  881|      1|          {
  882|      1|            LexPtr++;
  883|      1|            return( GenerateElement(31) );
  884|      1|          }
  885|      1|        else if( *LexPtr == 'd' )
  ------------------
  |  Branch (885:18): [True: 0, False: 1]
  ------------------
  886|      0|          {
  887|      0|            LexPtr++;
  888|      0|            return( GenerateElement(64) );
  889|      0|          }
  890|      1|        else if( *LexPtr == 'e' )
  ------------------
  |  Branch (890:18): [True: 1, False: 0]
  ------------------
  891|      1|          {
  892|      1|            LexPtr++;
  893|      1|            return( GenerateElement(32) );
  894|      1|          }
  895|      0|        break;
  896|       |
  897|     24|      case('H'):
  ------------------
  |  Branch (897:7): [True: 24, False: 231k]
  ------------------
  898|     24|        if( *LexPtr == 'e' )
  ------------------
  |  Branch (898:13): [True: 0, False: 24]
  ------------------
  899|      0|          {
  900|      0|            LexPtr++;
  901|      0|            return( GenerateElement( 2) );
  902|      0|          }
  903|     24|        else if( *LexPtr == 'f' )
  ------------------
  |  Branch (903:18): [True: 0, False: 24]
  ------------------
  904|      0|          {
  905|      0|            LexPtr++;
  906|      0|            return( GenerateElement(72) );
  907|      0|          }
  908|     24|        else if( *LexPtr == 'g' )
  ------------------
  |  Branch (908:18): [True: 0, False: 24]
  ------------------
  909|      0|          {
  910|      0|            LexPtr++;
  911|      0|            return( GenerateElement(80) );
  912|      0|          }
  913|     24|        else if( *LexPtr == 'o' )
  ------------------
  |  Branch (913:18): [True: 0, False: 24]
  ------------------
  914|      0|          {
  915|      0|            LexPtr++;
  916|      0|            return( GenerateElement(67) );
  917|      0|          }
  918|     24|        else if( isdigit(*LexPtr) )
  ------------------
  |  Branch (918:18): [True: 12, False: 12]
  ------------------
  919|     12|          {
  920|     12|            index = 0;
  921|     12|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (921:17): [True: 0, False: 12]
  ------------------
  922|      0|              return nullptr;
  923|     12|            return BuildAtomLeaf(AE_HCOUNT,index);
  ------------------
  |  |  114|     12|#define AE_HCOUNT       16
  ------------------
  924|     12|          }
  925|     12|        return BuildAtomLeaf(AE_HCOUNT,1);
  ------------------
  |  |  114|     12|#define AE_HCOUNT       16
  ------------------
  926|       |
  927|      1|      case('I'):
  ------------------
  |  Branch (927:7): [True: 1, False: 231k]
  ------------------
  928|      1|        if( *LexPtr == 'n' )
  ------------------
  |  Branch (928:13): [True: 1, False: 0]
  ------------------
  929|      1|          {
  930|      1|            LexPtr++;
  931|      1|            return( GenerateElement(49) );
  932|      1|          }
  933|      0|        else if( *LexPtr == 'r' )
  ------------------
  |  Branch (933:18): [True: 0, False: 0]
  ------------------
  934|      0|          {
  935|      0|            LexPtr++;
  936|      0|            return( GenerateElement(77) );
  937|      0|          }
  938|      0|        return( GenerateElement(53) );
  939|       |
  940|      0|      case('K'):
  ------------------
  |  Branch (940:7): [True: 0, False: 231k]
  ------------------
  941|      0|        if( *LexPtr == 'r' )
  ------------------
  |  Branch (941:13): [True: 0, False: 0]
  ------------------
  942|      0|          {
  943|      0|            LexPtr++;
  944|      0|            return( GenerateElement(36) );
  945|      0|          }
  946|      0|        return( GenerateElement(19) );
  947|       |
  948|      0|      case('L'):
  ------------------
  |  Branch (948:7): [True: 0, False: 231k]
  ------------------
  949|      0|        if( *LexPtr == 'a' )
  ------------------
  |  Branch (949:13): [True: 0, False: 0]
  ------------------
  950|      0|          {
  951|      0|            LexPtr++;
  952|      0|            return( GenerateElement( 57) );
  953|      0|          }
  954|      0|        else if( *LexPtr == 'i' )
  ------------------
  |  Branch (954:18): [True: 0, False: 0]
  ------------------
  955|      0|          {
  956|      0|            LexPtr++;
  957|      0|            return( GenerateElement(  3) );
  958|      0|          }
  959|      0|        else if( *LexPtr == 'r' )
  ------------------
  |  Branch (959:18): [True: 0, False: 0]
  ------------------
  960|      0|          {
  961|      0|            LexPtr++;
  962|      0|            return( GenerateElement(103) );
  963|      0|          }
  964|      0|        else if( *LexPtr == 'u' )
  ------------------
  |  Branch (964:18): [True: 0, False: 0]
  ------------------
  965|      0|          {
  966|      0|            LexPtr++;
  967|      0|            return( GenerateElement( 71) );
  968|      0|          }
  969|      0|        break;
  970|       |
  971|      1|      case('M'):
  ------------------
  |  Branch (971:7): [True: 1, False: 231k]
  ------------------
  972|      1|        if( *LexPtr == 'd' )
  ------------------
  |  Branch (972:13): [True: 0, False: 1]
  ------------------
  973|      0|          {
  974|      0|            LexPtr++;
  975|      0|            return( GenerateElement(101) );
  976|      0|          }
  977|      1|        else if( *LexPtr == 'g' )
  ------------------
  |  Branch (977:18): [True: 1, False: 0]
  ------------------
  978|      1|          {
  979|      1|            LexPtr++;
  980|      1|            return( GenerateElement( 12) );
  981|      1|          }
  982|      0|        else if( *LexPtr == 'n' )
  ------------------
  |  Branch (982:18): [True: 0, False: 0]
  ------------------
  983|      0|          {
  984|      0|            LexPtr++;
  985|      0|            return( GenerateElement( 25) );
  986|      0|          }
  987|      0|        else if( *LexPtr == 'o' )
  ------------------
  |  Branch (987:18): [True: 0, False: 0]
  ------------------
  988|      0|          {
  989|      0|            LexPtr++;
  990|      0|            return( GenerateElement( 42) );
  991|      0|          }
  992|      0|        break;
  993|       |
  994|     66|      case('N'):
  ------------------
  |  Branch (994:7): [True: 66, False: 231k]
  ------------------
  995|     66|        switch( *LexPtr++ )
  ------------------
  |  Branch (995:17): [True: 0, False: 66]
  ------------------
  996|     66|          {
  997|      0|          case('a'):  return( GenerateElement( 11) );
  ------------------
  |  Branch (997:11): [True: 0, False: 66]
  ------------------
  998|      0|          case('b'):  return( GenerateElement( 41) );
  ------------------
  |  Branch (998:11): [True: 0, False: 66]
  ------------------
  999|      0|          case('d'):  return( GenerateElement( 60) );
  ------------------
  |  Branch (999:11): [True: 0, False: 66]
  ------------------
 1000|      0|          case('e'):  return( GenerateElement( 10) );
  ------------------
  |  Branch (1000:11): [True: 0, False: 66]
  ------------------
 1001|      0|          case('i'):  return( GenerateElement( 28) );
  ------------------
  |  Branch (1001:11): [True: 0, False: 66]
  ------------------
 1002|      0|          case('o'):  return( GenerateElement(102) );
  ------------------
  |  Branch (1002:11): [True: 0, False: 66]
  ------------------
 1003|      0|          case('p'):  return( GenerateElement( 93) );
  ------------------
  |  Branch (1003:11): [True: 0, False: 66]
  ------------------
 1004|     66|          }
 1005|     66|        LexPtr--;
 1006|     66|        return( GenerateAromElem(7,false) );
 1007|       |
 1008|     89|      case('O'):
  ------------------
  |  Branch (1008:7): [True: 89, False: 231k]
  ------------------
 1009|     89|        if( *LexPtr == 's' )
  ------------------
  |  Branch (1009:13): [True: 0, False: 89]
  ------------------
 1010|      0|          {
 1011|      0|            LexPtr++;
 1012|      0|            return( GenerateElement(76) );
 1013|      0|          }
 1014|     89|        return( GenerateAromElem(8,false) );
 1015|       |
 1016|     11|      case('P'):
  ------------------
  |  Branch (1016:7): [True: 11, False: 231k]
  ------------------
 1017|     11|        switch( *LexPtr++ )
  ------------------
  |  Branch (1017:17): [True: 2, False: 9]
  ------------------
 1018|     11|          {
 1019|      0|          case('a'):  return( GenerateElement(91) );
  ------------------
  |  Branch (1019:11): [True: 0, False: 11]
  ------------------
 1020|      1|          case('b'):  return( GenerateElement(82) );
  ------------------
  |  Branch (1020:11): [True: 1, False: 10]
  ------------------
 1021|      0|          case('d'):  return( GenerateElement(46) );
  ------------------
  |  Branch (1021:11): [True: 0, False: 11]
  ------------------
 1022|      0|          case('m'):  return( GenerateElement(61) );
  ------------------
  |  Branch (1022:11): [True: 0, False: 11]
  ------------------
 1023|      1|          case('o'):  return( GenerateElement(84) );
  ------------------
  |  Branch (1023:11): [True: 1, False: 10]
  ------------------
 1024|      0|          case('r'):  return( GenerateElement(59) );
  ------------------
  |  Branch (1024:11): [True: 0, False: 11]
  ------------------
 1025|      0|          case('t'):  return( GenerateElement(78) );
  ------------------
  |  Branch (1025:11): [True: 0, False: 11]
  ------------------
 1026|      0|          case('u'):  return( GenerateElement(94) );
  ------------------
  |  Branch (1026:11): [True: 0, False: 11]
  ------------------
 1027|     11|          }
 1028|      9|        LexPtr--;
 1029|      9|        return( GenerateElement(15) );
 1030|       |
 1031|     16|      case('R'):
  ------------------
  |  Branch (1031:7): [True: 16, False: 231k]
  ------------------
 1032|     16|        switch( *LexPtr++ )
  ------------------
  |  Branch (1032:17): [True: 1, False: 15]
  ------------------
 1033|     16|          {
 1034|      1|          case('a'):  return( GenerateElement(88) );
  ------------------
  |  Branch (1034:11): [True: 1, False: 15]
  ------------------
 1035|      0|          case('b'):  return( GenerateElement(37) );
  ------------------
  |  Branch (1035:11): [True: 0, False: 16]
  ------------------
 1036|      0|          case('e'):  return( GenerateElement(75) );
  ------------------
  |  Branch (1036:11): [True: 0, False: 16]
  ------------------
 1037|      0|          case('h'):  return( GenerateElement(45) );
  ------------------
  |  Branch (1037:11): [True: 0, False: 16]
  ------------------
 1038|      0|          case('n'):  return( GenerateElement(86) );
  ------------------
  |  Branch (1038:11): [True: 0, False: 16]
  ------------------
 1039|      0|          case('u'):  return( GenerateElement(44) );
  ------------------
  |  Branch (1039:11): [True: 0, False: 16]
  ------------------
 1040|     16|          }
 1041|     15|        LexPtr--;
 1042|     15|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1042:13): [True: 0, False: 15]
  ------------------
 1043|      0|          {
 1044|      0|            index = 0;
 1045|      0|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1045:17): [True: 0, False: 0]
  ------------------
 1046|      0|              return nullptr;
 1047|      0|            if( index == 0 )
  ------------------
  |  Branch (1047:17): [True: 0, False: 0]
  ------------------
 1048|      0|              return BuildAtomPred(AE_ACYCLIC);
  ------------------
  |  |  109|      0|#define AE_ACYCLIC      11
  ------------------
 1049|      0|            return BuildAtomLeaf(AE_RINGS,index);
  ------------------
  |  |  119|      0|#define AE_RINGS        21
  ------------------
 1050|      0|          }
 1051|     15|        return BuildAtomPred(AE_CYCLIC);
  ------------------
  |  |  108|     15|#define AE_CYCLIC       10
  ------------------
 1052|       |
 1053|     26|      case('S'):
  ------------------
  |  Branch (1053:7): [True: 26, False: 231k]
  ------------------
 1054|     26|        switch( *LexPtr++ )
  ------------------
  |  Branch (1054:17): [True: 5, False: 21]
  ------------------
 1055|     26|          {
 1056|      1|          case('b'):  return( GenerateElement(51) );
  ------------------
  |  Branch (1056:11): [True: 1, False: 25]
  ------------------
 1057|      0|          case('c'):  return( GenerateElement(21) );
  ------------------
  |  Branch (1057:11): [True: 0, False: 26]
  ------------------
 1058|      1|          case('e'):  return( GenerateElement(34) );
  ------------------
  |  Branch (1058:11): [True: 1, False: 25]
  ------------------
 1059|      1|          case('i'):  return( GenerateElement(14) );
  ------------------
  |  Branch (1059:11): [True: 1, False: 25]
  ------------------
 1060|      0|          case('m'):  return( GenerateElement(62) );
  ------------------
  |  Branch (1060:11): [True: 0, False: 26]
  ------------------
 1061|      1|          case('n'):  return( GenerateElement(50) );
  ------------------
  |  Branch (1061:11): [True: 1, False: 25]
  ------------------
 1062|      1|          case('r'):  return( GenerateElement(38) );
  ------------------
  |  Branch (1062:11): [True: 1, False: 25]
  ------------------
 1063|     26|          }
 1064|     21|        LexPtr--;
 1065|     21|        return( GenerateAromElem(16,false) );
 1066|       |
 1067|      2|      case('T'):
  ------------------
  |  Branch (1067:7): [True: 2, False: 231k]
  ------------------
 1068|      2|        switch( *LexPtr++ )
  ------------------
  |  Branch (1068:17): [True: 2, False: 0]
  ------------------
 1069|      2|          {
 1070|      0|          case('a'):  return( GenerateElement(73) );
  ------------------
  |  Branch (1070:11): [True: 0, False: 2]
  ------------------
 1071|      0|          case('b'):  return( GenerateElement(65) );
  ------------------
  |  Branch (1071:11): [True: 0, False: 2]
  ------------------
 1072|      0|          case('c'):  return( GenerateElement(43) );
  ------------------
  |  Branch (1072:11): [True: 0, False: 2]
  ------------------
 1073|      1|          case('e'):  return( GenerateElement(52) );
  ------------------
  |  Branch (1073:11): [True: 1, False: 1]
  ------------------
 1074|      0|          case('h'):  return( GenerateElement(90) );
  ------------------
  |  Branch (1074:11): [True: 0, False: 2]
  ------------------
 1075|      0|          case('i'):  return( GenerateElement(22) );
  ------------------
  |  Branch (1075:11): [True: 0, False: 2]
  ------------------
 1076|      1|          case('l'):  return( GenerateElement(81) );
  ------------------
  |  Branch (1076:11): [True: 1, False: 1]
  ------------------
 1077|      0|          case('m'):  return( GenerateElement(69) );
  ------------------
  |  Branch (1077:11): [True: 0, False: 2]
  ------------------
 1078|      2|          }
 1079|      0|        LexPtr--;
 1080|      0|        break;
 1081|       |
 1082|      0|      case('U'):  return( GenerateElement(92) );
  ------------------
  |  Branch (1082:7): [True: 0, False: 231k]
  ------------------
 1083|      0|      case('V'):  return( GenerateElement(23) );
  ------------------
  |  Branch (1083:7): [True: 0, False: 231k]
  ------------------
 1084|      0|      case('W'):  return( GenerateElement(74) );
  ------------------
  |  Branch (1084:7): [True: 0, False: 231k]
  ------------------
 1085|       |
 1086|     27|      case('X'):
  ------------------
  |  Branch (1086:7): [True: 27, False: 231k]
  ------------------
 1087|     27|        if( *LexPtr == 'e' )
  ------------------
  |  Branch (1087:13): [True: 0, False: 27]
  ------------------
 1088|      0|          {
 1089|      0|            LexPtr++;
 1090|      0|            return( GenerateElement(54) );
 1091|      0|          }
 1092|     27|        else if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1092:18): [True: 27, False: 0]
  ------------------
 1093|     27|          {
 1094|     27|            index = 0;
 1095|     27|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1095:17): [True: 0, False: 27]
  ------------------
 1096|      0|              return nullptr;
 1097|     27|            if (index == 0) // default to 1 (if no number present)
  ------------------
  |  Branch (1097:17): [True: 0, False: 27]
  ------------------
 1098|      0|              index = 1;
 1099|     27|            return BuildAtomLeaf(AE_CONNECT,index);
  ------------------
  |  |  116|     27|#define AE_CONNECT      18
  ------------------
 1100|     27|          }
 1101|      0|        return BuildAtomLeaf(AE_CONNECT,1);
  ------------------
  |  |  116|      0|#define AE_CONNECT      18
  ------------------
 1102|       |
 1103|      0|      case('Y'):
  ------------------
  |  Branch (1103:7): [True: 0, False: 231k]
  ------------------
 1104|      0|        if( *LexPtr == 'b' )
  ------------------
  |  Branch (1104:13): [True: 0, False: 0]
  ------------------
 1105|      0|          {
 1106|      0|            LexPtr++;
 1107|      0|            return( GenerateElement(70) );
 1108|      0|          }
 1109|      0|        return( GenerateElement(39) );
 1110|       |
 1111|      0|      case('Z'):
  ------------------
  |  Branch (1111:7): [True: 0, False: 231k]
  ------------------
 1112|      0|        if( *LexPtr == 'n' )
  ------------------
  |  Branch (1112:13): [True: 0, False: 0]
  ------------------
 1113|      0|          {
 1114|      0|            LexPtr++;
 1115|      0|            return GenerateElement(30);
 1116|      0|          }
 1117|      0|        else if( *LexPtr == 'r' )
  ------------------
  |  Branch (1117:18): [True: 0, False: 0]
  ------------------
 1118|      0|          {
 1119|      0|            LexPtr++;
 1120|      0|            return GenerateElement(40);
 1121|      0|          }
 1122|      0|        break;
 1123|       |
 1124|      0|      case('a'):
  ------------------
  |  Branch (1124:7): [True: 0, False: 231k]
  ------------------
 1125|      0|        if( *LexPtr == 's' )
  ------------------
  |  Branch (1125:13): [True: 0, False: 0]
  ------------------
 1126|      0|          {
 1127|      0|            LexPtr++;
 1128|      0|            return GenerateAromElem(33,true);
 1129|      0|          }
 1130|      0|        return BuildAtomPred(AE_AROMATIC);
  ------------------
  |  |  106|      0|#define AE_AROMATIC     8
  ------------------
 1131|       |
 1132|      2|      case('c'):
  ------------------
  |  Branch (1132:7): [True: 2, False: 231k]
  ------------------
 1133|      2|        return GenerateAromElem(6,true);
 1134|       |
 1135|      0|      case('h'):
  ------------------
  |  Branch (1135:7): [True: 0, False: 231k]
  ------------------
 1136|      0|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1136:13): [True: 0, False: 0]
  ------------------
 1137|      0|          {
 1138|      0|            index = 0;
 1139|      0|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1139:17): [True: 0, False: 0]
  ------------------
 1140|      0|              return nullptr;
 1141|      0|          }
 1142|      0|        else
 1143|      0|          index = 1;
 1144|      0|        return BuildAtomLeaf(AE_IMPLICIT,index);
  ------------------
  |  |  118|      0|#define AE_IMPLICIT     20
  ------------------
 1145|       |
 1146|     28|      case('n'):  return GenerateAromElem(7,true);
  ------------------
  |  Branch (1146:7): [True: 28, False: 231k]
  ------------------
 1147|      1|      case('o'):  return GenerateAromElem(8,true);
  ------------------
  |  Branch (1147:7): [True: 1, False: 231k]
  ------------------
 1148|      0|      case('p'):  return GenerateAromElem(15,true);
  ------------------
  |  Branch (1148:7): [True: 0, False: 231k]
  ------------------
 1149|       |
 1150|  9.21k|      case('r'):
  ------------------
  |  Branch (1150:7): [True: 9.21k, False: 222k]
  ------------------
 1151|  9.21k|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1151:13): [True: 9.21k, False: 0]
  ------------------
 1152|  9.21k|          {
 1153|  9.21k|            index = 0;
 1154|  9.21k|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1154:17): [True: 0, False: 9.21k]
  ------------------
 1155|      0|              return nullptr;
 1156|  9.21k|            if( index == 0 )
  ------------------
  |  Branch (1156:17): [True: 6, False: 9.21k]
  ------------------
 1157|      6|              return BuildAtomPred(AE_ACYCLIC);
  ------------------
  |  |  109|      6|#define AE_ACYCLIC      11
  ------------------
 1158|  9.21k|            return BuildAtomLeaf(AE_SIZE,index);
  ------------------
  |  |  120|  9.21k|#define AE_SIZE         22
  ------------------
 1159|  9.21k|          }
 1160|      0|        return BuildAtomPred(AE_CYCLIC);
  ------------------
  |  |  108|      0|#define AE_CYCLIC       10
  ------------------
 1161|       |
 1162|      3|      case('s'):
  ------------------
  |  Branch (1162:7): [True: 3, False: 231k]
  ------------------
 1163|      3|        if( *LexPtr == 'e' )
  ------------------
  |  Branch (1163:13): [True: 1, False: 2]
  ------------------
 1164|      1|          {
 1165|      1|            LexPtr++;
 1166|      1|            return GenerateAromElem(34,true);
 1167|      1|          }
 1168|      2|        return GenerateAromElem(16,true);
 1169|       |
 1170|      1|      case('v'):
  ------------------
  |  Branch (1170:7): [True: 1, False: 231k]
  ------------------
 1171|      1|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1171:13): [True: 1, False: 0]
  ------------------
 1172|      1|          {
 1173|      1|            index = 0;
 1174|      1|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1174:17): [True: 0, False: 1]
  ------------------
 1175|      0|              return nullptr;
 1176|      1|            return BuildAtomLeaf(AE_VALENCE,index);
  ------------------
  |  |  121|      1|#define AE_VALENCE      23
  ------------------
 1177|      1|          }
 1178|      0|        return BuildAtomLeaf(AE_VALENCE,1);
  ------------------
  |  |  121|      0|#define AE_VALENCE      23
  ------------------
 1179|       |
 1180|      0|      case('x'):
  ------------------
  |  Branch (1180:7): [True: 0, False: 231k]
  ------------------
 1181|      0|        if( isdigit(*LexPtr) )
  ------------------
  |  Branch (1181:13): [True: 0, False: 0]
  ------------------
 1182|      0|          {
 1183|      0|            index = 0;
 1184|      0|            if( !ReadInt(LexPtr, index) )
  ------------------
  |  Branch (1184:17): [True: 0, False: 0]
  ------------------
 1185|      0|              return nullptr;
 1186|      0|            return BuildAtomLeaf(AE_RINGCONNECT,index);
  ------------------
  |  |  124|      0|#define AE_RINGCONNECT  26
  ------------------
 1187|      0|          }
 1188|      0|        return BuildAtomPred(AE_CYCLIC);
  ------------------
  |  |  108|      0|#define AE_CYCLIC       10
  ------------------
 1189|   231k|      }
 1190|    117|    LexPtr--;
 1191|    117|    return nullptr;
 1192|   231k|  }
_ZN9OpenBabel15OBSmartsPattern13ParseAtomExprEi:
 1195|   619k|  {
 1196|   619k|    AtomExpr *expr1 = nullptr;
 1197|   619k|    AtomExpr *expr2 = nullptr;
 1198|   619k|    char *prev;
 1199|       |
 1200|   619k|    switch( level )
  ------------------
  |  Branch (1200:13): [True: 619k, False: 0]
  ------------------
 1201|   619k|      {
 1202|   111k|      case(0): /* Low Precedence Conjunction */
  ------------------
  |  Branch (1202:7): [True: 111k, False: 508k]
  ------------------
 1203|   111k|        if( !(expr1=ParseAtomExpr(1)) )
  ------------------
  |  Branch (1203:13): [True: 0, False: 111k]
  ------------------
 1204|      0|          return nullptr;
 1205|       |
 1206|   129k|        while( *LexPtr == ';' )
  ------------------
  |  Branch (1206:16): [True: 18.4k, False: 111k]
  ------------------
 1207|  18.4k|          {
 1208|  18.4k|            LexPtr++;
 1209|  18.4k|            if( !(expr2=ParseAtomExpr(1)) )
  ------------------
  |  Branch (1209:17): [True: 0, False: 18.4k]
  ------------------
 1210|      0|              {
 1211|      0|                FreeAtomExpr(expr1);
 1212|      0|                return nullptr;
 1213|      0|              }
 1214|  18.4k|            expr1 = BuildAtomBin(AE_ANDLO,expr1,expr2);
  ------------------
  |  |  100|  18.4k|#define AE_ANDLO        2
  ------------------
 1215|  18.4k|          }
 1216|   111k|        return expr1;
 1217|       |
 1218|   129k|      case(1): /* Disjunction */
  ------------------
  |  Branch (1218:7): [True: 129k, False: 490k]
  ------------------
 1219|   129k|        if( !(expr1=ParseAtomExpr(2)) )
  ------------------
  |  Branch (1219:13): [True: 0, False: 129k]
  ------------------
 1220|      0|          return nullptr;
 1221|       |
 1222|   138k|        while( *LexPtr == ',' )
  ------------------
  |  Branch (1222:16): [True: 9.24k, False: 129k]
  ------------------
 1223|  9.24k|          {
 1224|  9.24k|            LexPtr++;
 1225|  9.24k|            if( !(expr2=ParseAtomExpr(2)) )
  ------------------
  |  Branch (1225:17): [True: 0, False: 9.24k]
  ------------------
 1226|      0|              {
 1227|      0|                FreeAtomExpr(expr1);
 1228|      0|                return nullptr;
 1229|      0|              }
 1230|  9.24k|            expr1 = BuildAtomBin(AE_OR,expr1,expr2);
  ------------------
  |  |  101|  9.24k|#define AE_OR           3
  ------------------
 1231|  9.24k|          }
 1232|   129k|        return( expr1 );
 1233|       |
 1234|   138k|      case(2): /* High Precedence Conjunction */
  ------------------
  |  Branch (1234:7): [True: 138k, False: 481k]
  ------------------
 1235|   138k|        if( !(expr1=ParseAtomExpr(3)) )
  ------------------
  |  Branch (1235:13): [True: 0, False: 138k]
  ------------------
 1236|      0|          return nullptr;
 1237|       |
 1238|   231k|        while( (*LexPtr!=']') && (*LexPtr!=';') &&
  ------------------
  |  Branch (1238:16): [True: 120k, False: 110k]
  |  Branch (1238:34): [True: 101k, False: 18.4k]
  ------------------
 1239|   101k|               (*LexPtr!=',') && *LexPtr )
  ------------------
  |  Branch (1239:16): [True: 92.5k, False: 9.24k]
  |  Branch (1239:34): [True: 92.5k, False: 0]
  ------------------
 1240|  92.5k|          {
 1241|  92.5k|            if( *LexPtr=='&' )
  ------------------
  |  Branch (1241:17): [True: 0, False: 92.5k]
  ------------------
 1242|      0|              LexPtr++;
 1243|  92.5k|            prev = LexPtr;
 1244|  92.5k|            if( !(expr2=ParseAtomExpr(3)) )
  ------------------
  |  Branch (1244:17): [True: 117, False: 92.4k]
  ------------------
 1245|    117|              {
 1246|    117|                if( prev != LexPtr )
  ------------------
  |  Branch (1246:21): [True: 0, False: 117]
  ------------------
 1247|      0|                  {
 1248|      0|                    FreeAtomExpr(expr1);
 1249|      0|                    return nullptr;
 1250|      0|                  }
 1251|    117|                else
 1252|    117|                  return( expr1 );
 1253|    117|              }
 1254|  92.4k|            expr1 = BuildAtomBin(AE_ANDHI,expr1,expr2);
  ------------------
  |  |   99|  92.4k|#define AE_ANDHI        1
  ------------------
 1255|  92.4k|          }
 1256|   138k|        return( expr1 );
 1257|       |
 1258|   240k|      case(3): /* Negation or Primitive */
  ------------------
  |  Branch (1258:7): [True: 240k, False: 379k]
  ------------------
 1259|   240k|        if( *LexPtr == '!' )
  ------------------
  |  Branch (1259:13): [True: 9.24k, False: 231k]
  ------------------
 1260|  9.24k|          {
 1261|  9.24k|            LexPtr++;
 1262|  9.24k|            if( !(expr1=ParseAtomExpr(3)) )
  ------------------
  |  Branch (1262:17): [True: 0, False: 9.24k]
  ------------------
 1263|      0|              return nullptr;
 1264|  9.24k|            return( BuildAtomNot(expr1) );
 1265|  9.24k|          }
 1266|   231k|        return( ParseComplexAtomPrimitive() );
 1267|   619k|      }
 1268|      0|    return nullptr;
 1269|   619k|  }
_ZN9OpenBabel15OBSmartsPattern18ParseBondPrimitiveEv:
 1272|    377|  {
 1273|    377|    char bsym = *LexPtr++;
 1274|       |
 1275|    377|    switch(bsym)
  ------------------
  |  Branch (1275:12): [True: 190, False: 187]
  ------------------
 1276|    377|      {
 1277|      8|      case '-':  return BuildBondLeaf(BE_SINGLE);
  ------------------
  |  |  142|      8|#define BE_SINGLE       7
  ------------------
  |  Branch (1277:7): [True: 8, False: 369]
  ------------------
 1278|    135|      case '=':  return BuildBondLeaf(BE_DOUBLE);
  ------------------
  |  |  143|    135|#define BE_DOUBLE       8
  ------------------
  |  Branch (1278:7): [True: 135, False: 242]
  ------------------
 1279|      4|      case '#':  return BuildBondLeaf(BE_TRIPLE);
  ------------------
  |  |  144|      4|#define BE_TRIPLE       9
  ------------------
  |  Branch (1279:7): [True: 4, False: 373]
  ------------------
 1280|      0|      case '$':  return BuildBondLeaf(BE_QUAD);
  ------------------
  |  |  145|      0|#define BE_QUAD         10
  ------------------
  |  Branch (1280:7): [True: 0, False: 377]
  ------------------
 1281|      2|      case ':':  return BuildBondLeaf(BE_AROM);
  ------------------
  |  |  146|      2|#define BE_AROM         11
  ------------------
  |  Branch (1281:7): [True: 2, False: 375]
  ------------------
 1282|      0|      case '@':  return BuildBondLeaf(BE_RING);
  ------------------
  |  |  147|      0|#define BE_RING         12
  ------------------
  |  Branch (1282:7): [True: 0, False: 377]
  ------------------
 1283|     41|      case '~':  return BuildBondLeaf(BE_ANY);
  ------------------
  |  |  140|     41|#define BE_ANY          5
  ------------------
  |  Branch (1283:7): [True: 41, False: 336]
  ------------------
 1284|       |
 1285|       |      // return BuildBondLeaf(*LexPtr == '?' ? BE_UPUNSPEC : BE_UP);
 1286|      0|      case '/':  return BuildBondLeaf(BE_SINGLE);
  ------------------
  |  |  142|      0|#define BE_SINGLE       7
  ------------------
  |  Branch (1286:7): [True: 0, False: 377]
  ------------------
 1287|       |      // return BuildBondLeaf(*LexPtr == '?' ? BE_DOWNUNSPEC : BE_DOWN);
 1288|      0|      case '\\': return BuildBondLeaf(BE_SINGLE);
  ------------------
  |  |  142|      0|#define BE_SINGLE       7
  ------------------
  |  Branch (1288:7): [True: 0, False: 377]
  ------------------
 1289|    377|      }
 1290|    187|    LexPtr--;
 1291|    187|    return nullptr;
 1292|    377|  }
_ZN9OpenBabel15OBSmartsPattern13ParseBondExprEi:
 1295|    941|  {
 1296|    941|    BondExpr *expr1 = nullptr;
 1297|    941|    BondExpr *expr2 = nullptr;
 1298|    941|    char *prev;
 1299|       |
 1300|    941|    switch( level )
  ------------------
  |  Branch (1300:13): [True: 941, False: 0]
  ------------------
 1301|    941|      {
 1302|    187|      case(0): /* Low Precedence Conjunction */
  ------------------
  |  Branch (1302:7): [True: 187, False: 754]
  ------------------
 1303|    187|        if( !(expr1=ParseBondExpr(1)) )
  ------------------
  |  Branch (1303:13): [True: 0, False: 187]
  ------------------
 1304|      0|          return nullptr;
 1305|       |
 1306|    187|        while( *LexPtr == ';' )
  ------------------
  |  Branch (1306:16): [True: 0, False: 187]
  ------------------
 1307|      0|          {
 1308|      0|            LexPtr++;
 1309|      0|            if( !(expr2=ParseBondExpr(1)) )
  ------------------
  |  Branch (1309:17): [True: 0, False: 0]
  ------------------
 1310|      0|              {
 1311|      0|                FreeBondExpr(expr1);
 1312|      0|                return nullptr;
 1313|      0|              }
 1314|      0|            expr1 = BuildBondBin(BE_ANDLO,expr1,expr2);
  ------------------
  |  |  137|      0|#define BE_ANDLO        2
  ------------------
 1315|      0|          }
 1316|    187|        return expr1;
 1317|       |
 1318|    187|      case(1): /* Disjunction */
  ------------------
  |  Branch (1318:7): [True: 187, False: 754]
  ------------------
 1319|    187|        if( !(expr1=ParseBondExpr(2)) )
  ------------------
  |  Branch (1319:13): [True: 0, False: 187]
  ------------------
 1320|      0|          return nullptr;
 1321|       |
 1322|    190|        while( *LexPtr == ',' )
  ------------------
  |  Branch (1322:16): [True: 3, False: 187]
  ------------------
 1323|      3|          {
 1324|      3|            LexPtr++;
 1325|      3|            if( !(expr2=ParseBondExpr(2)) )
  ------------------
  |  Branch (1325:17): [True: 0, False: 3]
  ------------------
 1326|      0|              {
 1327|      0|                FreeBondExpr(expr1);
 1328|      0|                return nullptr;
 1329|      0|              }
 1330|      3|            expr1 = BuildBondBin(BE_OR,expr1,expr2);
  ------------------
  |  |  138|      3|#define BE_OR           3
  ------------------
 1331|      3|          }
 1332|    187|        return expr1;
 1333|       |
 1334|    190|      case(2): /* High Precedence Conjunction */
  ------------------
  |  Branch (1334:7): [True: 190, False: 751]
  ------------------
 1335|    190|        if( !(expr1=ParseBondExpr(3)) )
  ------------------
  |  Branch (1335:13): [True: 0, False: 190]
  ------------------
 1336|      0|          return nullptr;
 1337|       |
 1338|    190|        while( (*LexPtr!=']') && (*LexPtr!=';') &&
  ------------------
  |  Branch (1338:16): [True: 190, False: 0]
  |  Branch (1338:34): [True: 190, False: 0]
  ------------------
 1339|    190|               (*LexPtr!=',') && *LexPtr )
  ------------------
  |  Branch (1339:16): [True: 187, False: 3]
  |  Branch (1339:34): [True: 187, False: 0]
  ------------------
 1340|    187|          {
 1341|    187|            if( *LexPtr == '&' )
  ------------------
  |  Branch (1341:17): [True: 0, False: 187]
  ------------------
 1342|      0|              LexPtr++;
 1343|    187|            prev = LexPtr;
 1344|    187|            if( !(expr2=ParseBondExpr(3)) )
  ------------------
  |  Branch (1344:17): [True: 187, False: 0]
  ------------------
 1345|    187|              {
 1346|    187|                if( prev != LexPtr )
  ------------------
  |  Branch (1346:21): [True: 0, False: 187]
  ------------------
 1347|      0|                  {
 1348|      0|                    FreeBondExpr(expr1);
 1349|      0|                    return nullptr;
 1350|      0|                  }
 1351|    187|                else
 1352|    187|                  return expr1;
 1353|    187|              }
 1354|      0|            expr1 = BuildBondBin(BE_ANDHI,expr1,expr2);
  ------------------
  |  |  136|      0|#define BE_ANDHI        1
  ------------------
 1355|      0|          }
 1356|      3|        return expr1;
 1357|       |
 1358|    377|      case(3): /* Negation or Primitive */
  ------------------
  |  Branch (1358:7): [True: 377, False: 564]
  ------------------
 1359|    377|        if( *LexPtr == '!' )
  ------------------
  |  Branch (1359:13): [True: 0, False: 377]
  ------------------
 1360|      0|          {
 1361|      0|            LexPtr++;
 1362|      0|            if( !(expr1=ParseBondExpr(3)) )
  ------------------
  |  Branch (1362:17): [True: 0, False: 0]
  ------------------
 1363|      0|              return nullptr;
 1364|      0|            return BuildBondNot(expr1);
 1365|      0|          }
 1366|    377|        return ParseBondPrimitive();
 1367|    941|      }
 1368|      0|    return nullptr;
 1369|    941|  }
_ZN9OpenBabel15OBSmartsPattern16GetVectorBindingEv:
 1372|    117|  {
 1373|    117|    int vb=0;
 1374|       |
 1375|    117|    LexPtr++; //skip colon
 1376|    117|    if(isdigit(*LexPtr))
  ------------------
  |  Branch (1376:8): [True: 117, False: 0]
  ------------------
 1377|    117|      {
 1378|    117|        vb = 0;
 1379|       |        // On overflow, ReadInt leaves LexPtr at the offending digit; the
 1380|       |        // outer parser then sees a non-']' and errors out via ParseSMARTSError.
 1381|    117|        ReadInt(LexPtr, vb);
 1382|    117|      }
 1383|       |
 1384|    117|    return(vb);
 1385|    117|  }
_ZN9OpenBabel15OBSmartsPattern12SMARTSParserEPNS_7PatternEPNS_10ParseStateEiii:
 1396|  83.3k|  {
 1397|  83.3k|    int vb = 0;
 1398|  83.3k|    AtomExpr *aexpr;
 1399|  83.3k|    BondExpr *bexpr;
 1400|  83.3k|    int index;
 1401|       |
 1402|  83.3k|    aexpr = nullptr;
 1403|  83.3k|    bexpr = nullptr;
 1404|       |
 1405|       |    // Branch nesting recurses through this function. Cap depth to avoid
 1406|       |    // stack overflow on pathological inputs like "((((((..." with deeply
 1407|       |    // nested parens. Legitimate SMARTS patterns nest only a few levels.
 1408|  83.3k|    if (depth > 1000)
  ------------------
  |  Branch (1408:9): [True: 0, False: 83.3k]
  ------------------
 1409|      0|      return ParseSMARTSError(pat, bexpr);
 1410|       |
 1411|   269k|    while( *LexPtr )
  ------------------
  |  Branch (1411:12): [True: 222k, False: 46.2k]
  ------------------
 1412|   222k|      {
 1413|   222k|        switch( *LexPtr++ )
 1414|   222k|          {
 1415|      0|          case('.'):
  ------------------
  |  Branch (1415:11): [True: 0, False: 222k]
  ------------------
 1416|      0|            return ParseSMARTSError(pat,bexpr);
 1417|       |
 1418|    146|          case('-'):  case('='):  case('#'): case('$'):
  ------------------
  |  Branch (1418:11): [True: 8, False: 222k]
  |  Branch (1418:23): [True: 135, False: 222k]
  |  Branch (1418:35): [True: 3, False: 222k]
  |  Branch (1418:46): [True: 0, False: 222k]
  ------------------
 1419|    187|          case(':'):  case('~'):  case('@'):
  ------------------
  |  Branch (1419:11): [True: 0, False: 222k]
  |  Branch (1419:23): [True: 41, False: 222k]
  |  Branch (1419:35): [True: 0, False: 222k]
  ------------------
 1420|    187|          case('/'):  case('\\'): case('!'):
  ------------------
  |  Branch (1420:11): [True: 0, False: 222k]
  |  Branch (1420:23): [True: 0, False: 222k]
  |  Branch (1420:35): [True: 0, False: 222k]
  ------------------
 1421|    187|            LexPtr--;
 1422|    187|            if( (prev==-1) || bexpr )
  ------------------
  |  Branch (1422:17): [True: 0, False: 187]
  |  Branch (1422:31): [True: 0, False: 187]
  ------------------
 1423|      0|              return ParseSMARTSError(pat,bexpr);
 1424|    187|            if( !(bexpr=ParseBondExpr(0)) )
  ------------------
  |  Branch (1424:17): [True: 0, False: 187]
  ------------------
 1425|      0|              return ParseSMARTSError(pat,bexpr);
 1426|    187|            break;
 1427|       |
 1428|  37.0k|          case('('):
  ------------------
  |  Branch (1428:11): [True: 37.0k, False: 185k]
  ------------------
 1429|  37.0k|            if( bexpr )
  ------------------
  |  Branch (1429:17): [True: 0, False: 37.0k]
  ------------------
 1430|      0|              {
 1431|      0|                LexPtr--;
 1432|      0|                return ParseSMARTSError(pat,bexpr);
 1433|      0|              }
 1434|  37.0k|            if( prev == -1 )
  ------------------
  |  Branch (1434:17): [True: 0, False: 37.0k]
  ------------------
 1435|      0|              {
 1436|      0|                index = pat->acount;
 1437|      0|                pat = SMARTSParser(pat,stat,-1,part,depth+1);
 1438|      0|                if( !pat )
  ------------------
  |  Branch (1438:21): [True: 0, False: 0]
  ------------------
 1439|      0|                  return nullptr;
 1440|      0|                if( index == pat->acount )
  ------------------
  |  Branch (1440:21): [True: 0, False: 0]
  ------------------
 1441|      0|                  return ParseSMARTSError(pat,bexpr);
 1442|      0|                prev = index;
 1443|      0|              }
 1444|  37.0k|            else
 1445|  37.0k|              {
 1446|  37.0k|                pat = SMARTSParser(pat,stat,prev,part,depth+1);
 1447|  37.0k|                if( !pat )
  ------------------
  |  Branch (1447:21): [True: 0, False: 37.0k]
  ------------------
 1448|      0|                  return nullptr;
 1449|  37.0k|              }
 1450|       |
 1451|  37.0k|            if( *LexPtr != ')' )
  ------------------
  |  Branch (1451:17): [True: 0, False: 37.0k]
  ------------------
 1452|      0|              return ParseSMARTSError(pat,bexpr);
 1453|  37.0k|            LexPtr++;
 1454|  37.0k|            break;
 1455|       |
 1456|  37.1k|          case(')'):  LexPtr--;
  ------------------
  |  Branch (1456:11): [True: 37.1k, False: 185k]
  ------------------
 1457|  37.1k|            if( (prev==-1) || bexpr )
  ------------------
  |  Branch (1457:17): [True: 0, False: 37.1k]
  |  Branch (1457:31): [True: 0, False: 37.1k]
  ------------------
 1458|      0|              return ParseSMARTSError(pat,bexpr);
 1459|  37.1k|            return pat;
 1460|       |
 1461|      0|          case('%'):  if( prev == -1 )
  ------------------
  |  Branch (1461:11): [True: 0, False: 222k]
  |  Branch (1461:27): [True: 0, False: 0]
  ------------------
 1462|      0|              {
 1463|      0|                LexPtr--;
 1464|      0|                return ParseSMARTSError(pat,bexpr);
 1465|      0|              }
 1466|       |
 1467|      0|            if( isdigit(LexPtr[0]) && isdigit(LexPtr[1]) )
  ------------------
  |  Branch (1467:17): [True: 0, False: 0]
  |  Branch (1467:39): [True: 0, False: 0]
  ------------------
 1468|      0|              {
 1469|      0|                index = 10*(LexPtr[0]-'0') + (LexPtr[1]-'0');
 1470|      0|                LexPtr += 2;
 1471|      0|              }
 1472|      0|            else
 1473|      0|              return ParseSMARTSError(pat,bexpr);
 1474|       |
 1475|      0|            if( stat->closure[index] == -1 )
  ------------------
  |  Branch (1475:17): [True: 0, False: 0]
  ------------------
 1476|      0|              {
 1477|      0|                stat->closord[index] = bexpr;
 1478|      0|                stat->closure[index] = prev;
 1479|      0|                bexpr = nullptr;
 1480|      0|              }
 1481|      0|            else if( stat->closure[index] != prev )
  ------------------
  |  Branch (1481:22): [True: 0, False: 0]
  ------------------
 1482|      0|              {
 1483|      0|                if( !bexpr ) {
  ------------------
  |  Branch (1483:21): [True: 0, False: 0]
  ------------------
 1484|      0|                  if (!stat->closord[index]) {
  ------------------
  |  Branch (1484:23): [True: 0, False: 0]
  ------------------
 1485|      0|                    bexpr = GenerateDefaultBond();
 1486|      0|                  } else {
 1487|      0|                    bexpr = stat->closord[index];
 1488|      0|                  }
 1489|      0|                } else if (stat->closord[index] && !EquivalentBondExpr(bexpr, stat->closord[index])) {
  ------------------
  |  Branch (1489:28): [True: 0, False: 0]
  |  Branch (1489:52): [True: 0, False: 0]
  ------------------
 1490|      0|                  return ParseSMARTSError(pat,bexpr);
 1491|      0|                } else if (stat->closord[index]) {
  ------------------
  |  Branch (1491:28): [True: 0, False: 0]
  ------------------
 1492|       |                  // equivalent: discard the redundant opening bond expression
 1493|      0|                  FreeBondExpr(stat->closord[index]);
 1494|      0|                }
 1495|      0|                stat->closord[index] = nullptr;
 1496|       |
 1497|      0|                CreateBond(pat,bexpr,prev,stat->closure[index]);
 1498|      0|                stat->closure[index] = -1;
 1499|      0|                bexpr = nullptr;
 1500|      0|              }
 1501|      0|            else
 1502|      0|              return ParseSMARTSError(pat,bexpr);
 1503|      0|            break;
 1504|       |
 1505|     48|          case('0'):  case('1'):  case('2'):
  ------------------
  |  Branch (1505:11): [True: 0, False: 222k]
  |  Branch (1505:23): [True: 42, False: 222k]
  |  Branch (1505:35): [True: 6, False: 222k]
  ------------------
 1506|     66|          case('3'):  case('4'):  case('5'):
  ------------------
  |  Branch (1506:11): [True: 6, False: 222k]
  |  Branch (1506:23): [True: 6, False: 222k]
  |  Branch (1506:35): [True: 6, False: 222k]
  ------------------
 1507|     66|          case('6'):  case('7'):  case('8'):
  ------------------
  |  Branch (1507:11): [True: 0, False: 222k]
  |  Branch (1507:23): [True: 0, False: 222k]
  |  Branch (1507:35): [True: 0, False: 222k]
  ------------------
 1508|     66|          case('9'):  LexPtr--;
  ------------------
  |  Branch (1508:11): [True: 0, False: 222k]
  ------------------
 1509|     66|            if( prev == -1 )
  ------------------
  |  Branch (1509:17): [True: 0, False: 66]
  ------------------
 1510|      0|              return ParseSMARTSError(pat,bexpr);
 1511|     66|            index = (*LexPtr++)-'0';
 1512|       |
 1513|     66|            if( stat->closure[index] == -1 )
  ------------------
  |  Branch (1513:17): [True: 33, False: 33]
  ------------------
 1514|     33|              { // Ring opening
 1515|     33|                stat->closord[index] = bexpr;
 1516|     33|                stat->closure[index] = prev;
 1517|     33|                pat->atom[prev].nbrs.push_back(-index); // Store the BC idx as a -ve
 1518|     33|                bexpr = nullptr;
 1519|     33|              }
 1520|     33|            else if( stat->closure[index] != prev )
  ------------------
  |  Branch (1520:22): [True: 33, False: 0]
  ------------------
 1521|     33|              { // Ring closure
 1522|     33|                if( !bexpr ) {
  ------------------
  |  Branch (1522:21): [True: 33, False: 0]
  ------------------
 1523|     33|                  if (!stat->closord[index]) {
  ------------------
  |  Branch (1523:23): [True: 33, False: 0]
  ------------------
 1524|     33|                    bexpr = GenerateDefaultBond();
 1525|     33|                  } else {
 1526|      0|                    bexpr = stat->closord[index];
 1527|      0|                  }
 1528|     33|                } else if (stat->closord[index] && !EquivalentBondExpr(bexpr, stat->closord[index])) {
  ------------------
  |  Branch (1528:28): [True: 0, False: 0]
  |  Branch (1528:52): [True: 0, False: 0]
  ------------------
 1529|      0|                  return ParseSMARTSError(pat,bexpr);
 1530|      0|                } else if (stat->closord[index]) {
  ------------------
  |  Branch (1530:28): [True: 0, False: 0]
  ------------------
 1531|       |                  // equivalent: discard the redundant opening bond expression
 1532|      0|                  FreeBondExpr(stat->closord[index]);
 1533|      0|                }
 1534|     33|                stat->closord[index] = nullptr;
 1535|       |
 1536|     33|                CreateBond(pat,bexpr,prev,stat->closure[index]);
 1537|     33|                pat->atom[prev].nbrs.push_back(stat->closure[index]);
 1538|    109|                for (unsigned int nbr_idx=0; nbr_idx < pat->atom[stat->closure[index]].nbrs.size(); ++nbr_idx) {
  ------------------
  |  Branch (1538:46): [True: 76, False: 33]
  ------------------
 1539|     76|                  if (pat->atom[stat->closure[index]].nbrs[nbr_idx] == -index)
  ------------------
  |  Branch (1539:23): [True: 33, False: 43]
  ------------------
 1540|     33|                    pat->atom[stat->closure[index]].nbrs[nbr_idx] = prev;
 1541|     76|                }
 1542|     33|                stat->closure[index] = -1;
 1543|     33|                bexpr = nullptr;
 1544|     33|              }
 1545|      0|            else
 1546|      0|              return ParseSMARTSError(pat,bexpr);
 1547|     66|            break;
 1548|       |
 1549|   111k|          case('['):
  ------------------
  |  Branch (1549:11): [True: 111k, False: 111k]
  ------------------
 1550|       |            // shortcut for '[H]' primitive (PR#1463791)
 1551|   111k|            if (*LexPtr == 'H' && *(LexPtr+1) == ']')
  ------------------
  |  Branch (1551:17): [True: 0, False: 111k]
  |  Branch (1551:35): [True: 0, False: 0]
  ------------------
 1552|      0|              {
 1553|      0|                aexpr = GenerateElement(1);
 1554|      0|                LexPtr++; // skip the 'H'
 1555|      0|                pat->hasExplicitH = true;
 1556|      0|              }
 1557|   111k|            else
 1558|   111k|              aexpr = ParseAtomExpr(0);
 1559|   111k|            vb = (*LexPtr == ':') ? GetVectorBinding():0;
  ------------------
  |  Branch (1559:18): [True: 117, False: 110k]
  ------------------
 1560|   111k|            if( aexpr == nullptr || (*LexPtr!=']') ){
  ------------------
  |  Branch (1560:17): [True: 0, False: 111k]
  |  Branch (1560:37): [True: 0, False: 111k]
  ------------------
 1561|      0|              if (aexpr != nullptr){
  ------------------
  |  Branch (1561:19): [True: 0, False: 0]
  ------------------
 1562|      0|                FreeAtomExpr(aexpr);
 1563|      0|                aexpr = nullptr;
 1564|      0|              }
 1565|       |
 1566|      0|              return ParseSMARTSError(pat,bexpr);
 1567|      0|            }
 1568|   111k|            index = CreateAtom(pat,aexpr,part,vb);
 1569|   111k|            if( prev != -1 )
  ------------------
  |  Branch (1569:17): [True: 64.7k, False: 46.2k]
  ------------------
 1570|  64.7k|              {
 1571|  64.7k|                if( !bexpr )
  ------------------
  |  Branch (1571:21): [True: 64.7k, False: 70]
  ------------------
 1572|  64.7k|                  bexpr = GenerateDefaultBond();
 1573|  64.7k|                CreateBond(pat,bexpr,prev,index);
 1574|  64.7k|                pat->atom[index].nbrs.push_back(prev);
 1575|  64.7k|                pat->atom[prev].nbrs.push_back(index);
 1576|  64.7k|                bexpr = nullptr;
 1577|  64.7k|              }
 1578|   111k|            if(*(LexPtr-1) == 'H' && *(LexPtr-2) == '@' ) { // i.e. [C@H] or [C@@H]
  ------------------
  |  Branch (1578:16): [True: 10, False: 111k]
  |  Branch (1578:38): [True: 0, False: 10]
  ------------------
 1579|      0|              pat->atom[index].nbrs.push_back(SmartsImplicitRef);
 1580|      0|            }
 1581|   111k|            prev = index;
 1582|   111k|            LexPtr++;
 1583|   111k|            break;
 1584|       |
 1585|  37.3k|          default:
  ------------------
  |  Branch (1585:11): [True: 37.3k, False: 185k]
  ------------------
 1586|  37.3k|            LexPtr--;
 1587|  37.3k|            aexpr = ParseSimpleAtomPrimitive();
 1588|  37.3k|            if( !aexpr )
  ------------------
  |  Branch (1588:17): [True: 0, False: 37.3k]
  ------------------
 1589|      0|              return ParseSMARTSError(pat,bexpr);
 1590|  37.3k|            index = CreateAtom(pat,aexpr,part);
 1591|  37.3k|            if( prev != -1 )
  ------------------
  |  Branch (1591:17): [True: 37.2k, False: 67]
  ------------------
 1592|  37.2k|              {
 1593|  37.2k|                if( !bexpr )
  ------------------
  |  Branch (1593:21): [True: 37.1k, False: 117]
  ------------------
 1594|  37.1k|                  bexpr = GenerateDefaultBond();
 1595|  37.2k|                CreateBond(pat,bexpr,prev,index);
 1596|  37.2k|                pat->atom[index].nbrs.push_back(prev);
 1597|  37.2k|                pat->atom[prev].nbrs.push_back(index);
 1598|  37.2k|                bexpr = nullptr;
 1599|  37.2k|              }
 1600|  37.3k|            prev = index;
 1601|   222k|          }
 1602|   222k|      }
 1603|       |
 1604|  46.2k|    if( (prev==-1) || bexpr )
  ------------------
  |  Branch (1604:9): [True: 0, False: 46.2k]
  |  Branch (1604:23): [True: 0, False: 46.2k]
  ------------------
 1605|      0|      return ParseSMARTSError(pat,bexpr);
 1606|       |
 1607|  46.2k|    return pat;
 1608|  46.2k|  }
_ZN9OpenBabel15OBSmartsPattern15ParseSMARTSPartEPNS_7PatternEi:
 1662|  46.3k|  {
 1663|  46.3k|    ParseState stat;
 1664|  46.3k|    int i,flag;
 1665|       |
 1666|  4.67M|    for( i=0; i<100; i++ ) {
  ------------------
  |  Branch (1666:15): [True: 4.63M, False: 46.3k]
  ------------------
 1667|  4.63M|      stat.closure[i] = -1;
 1668|  4.63M|      stat.closord[i] = nullptr;
 1669|  4.63M|    }
 1670|       |
 1671|  46.3k|    result = SMARTSParser(result,&stat,-1,part);
 1672|       |
 1673|  46.3k|    flag = false;
 1674|  4.67M|    for( i=0; i<100; i++ )
  ------------------
  |  Branch (1674:15): [True: 4.63M, False: 46.3k]
  ------------------
 1675|  4.63M|      if( stat.closure[i] != -1 )
  ------------------
  |  Branch (1675:11): [True: 0, False: 4.63M]
  ------------------
 1676|      0|        {
 1677|      0|          FreeBondExpr(stat.closord[i]);
 1678|      0|          flag = true;
 1679|      0|        }
 1680|       |
 1681|  46.3k|    if( result )
  ------------------
  |  Branch (1681:9): [True: 46.3k, False: 0]
  ------------------
 1682|  46.3k|      {
 1683|  46.3k|        if( flag )
  ------------------
  |  Branch (1683:13): [True: 0, False: 46.3k]
  ------------------
 1684|      0|          return(SMARTSError(result));
 1685|  46.3k|        else
 1686|  46.3k|          {
 1687|  46.3k|            MarkGrowBonds(result);
 1688|  46.3k|            result->ischiral = false;
 1689|   194k|            for (i = 0;i < result->acount;++i)
  ------------------
  |  Branch (1689:24): [True: 148k, False: 46.3k]
  ------------------
 1690|   148k|              {
 1691|   148k|                result->atom[i].chiral_flag = GetChiralFlag(result->atom[i].expr);
 1692|   148k|                if (result->atom[i].chiral_flag)
  ------------------
  |  Branch (1692:21): [True: 0, False: 148k]
  ------------------
 1693|      0|                  result->ischiral = true;
 1694|   148k|              }
 1695|  46.3k|            return(result);
 1696|  46.3k|          }
 1697|  46.3k|      }
 1698|      0|    else
 1699|      0|      return nullptr;
 1700|  46.3k|  }
_ZN9OpenBabel15OBSmartsPattern18ParseSMARTSPatternEv:
 1704|  46.3k|  {
 1705|  46.3k|    Pattern *result;
 1706|  46.3k|    result = AllocPattern();
 1707|       |
 1708|  46.3k|    while( *LexPtr == '(' )
  ------------------
  |  Branch (1708:12): [True: 0, False: 46.3k]
  ------------------
 1709|      0|      {
 1710|      0|        if (!result)
  ------------------
  |  Branch (1710:13): [True: 0, False: 0]
  ------------------
 1711|      0|          return nullptr; // ensure we don't get a null dereference
 1712|       |
 1713|      0|        LexPtr++;
 1714|      0|        result = ParseSMARTSPart(result,result->parts);
 1715|      0|        if( !result )
  ------------------
  |  Branch (1715:13): [True: 0, False: 0]
  ------------------
 1716|      0|          return nullptr;
 1717|      0|        result->parts++;
 1718|       |
 1719|      0|        if( *LexPtr != ')' )
  ------------------
  |  Branch (1719:13): [True: 0, False: 0]
  ------------------
 1720|      0|          return SMARTSError(result);
 1721|      0|        LexPtr++;
 1722|       |
 1723|      0|        if( !*LexPtr || (*LexPtr==')') )
  ------------------
  |  Branch (1723:13): [True: 0, False: 0]
  |  Branch (1723:25): [True: 0, False: 0]
  ------------------
 1724|      0|          return result;
 1725|       |
 1726|      0|        if( *LexPtr != '.' )
  ------------------
  |  Branch (1726:13): [True: 0, False: 0]
  ------------------
 1727|      0|          return SMARTSError(result);
 1728|       |
 1729|       |        // Here's where we'd handle fragments
 1730|       |        //        cerr << " conjunction " << LexPtr[0] << endl;
 1731|      0|        LexPtr++;
 1732|      0|      }
 1733|       |
 1734|  46.3k|    return ParseSMARTSPart(result,0);
 1735|  46.3k|  }
_ZN9OpenBabel15OBSmartsPattern17ParseSMARTSStringEPc:
 1738|  46.2k|  {
 1739|  46.2k|    Pattern *result;
 1740|       |
 1741|  46.2k|    if( !ptr || !*ptr )
  ------------------
  |  Branch (1741:9): [True: 0, False: 46.2k]
  |  Branch (1741:17): [True: 0, False: 46.2k]
  ------------------
 1742|      0|      return nullptr;
 1743|       |
 1744|  46.2k|    LexPtr = MainPtr = ptr;
 1745|  46.2k|    result = ParseSMARTSPattern();
 1746|  46.2k|    if( result && *LexPtr )
  ------------------
  |  Branch (1746:9): [True: 46.2k, False: 0]
  |  Branch (1746:19): [True: 0, False: 46.2k]
  ------------------
 1747|      0|      return SMARTSError(result);
 1748|  46.2k|    return result;
 1749|  46.2k|  }
_ZN9OpenBabel15OBSmartsPattern17ParseSMARTSRecordEPc:
 1752|  46.2k|  {
 1753|  46.2k|    char *src;
 1754|       |
 1755|  46.2k|    src = ptr;
 1756|   888k|    while( *src && !isspace(*src) )
  ------------------
  |  Branch (1756:12): [True: 842k, False: 46.2k]
  |  Branch (1756:20): [True: 842k, False: 0]
  ------------------
 1757|   842k|      src++;
 1758|       |
 1759|  46.2k|    if( isspace(*src) )
  ------------------
  |  Branch (1759:9): [True: 0, False: 46.2k]
  ------------------
 1760|      0|      {
 1761|      0|        *src++ = '\0';
 1762|      0|        while( isspace(*src) )
  ------------------
  |  Branch (1762:16): [True: 0, False: 0]
  ------------------
 1763|      0|          src++;
 1764|      0|      }
 1765|       |
 1766|  46.2k|    return ParseSMARTSString(ptr);
 1767|  46.2k|  }
_ZN9OpenBabel15OBSmartsPattern4InitEPKc:
 1774|  46.0k|  {
 1775|  46.0k|    if (strlen(buffer) > MaxSmartsLength)
  ------------------
  |  Branch (1775:9): [True: 0, False: 46.0k]
  ------------------
 1776|      0|      return false;
 1777|       |
 1778|  46.0k|      delete[] _buffer;
 1779|  46.0k|    _buffer = new char[strlen(buffer) + 1];
 1780|  46.0k|    strcpy(_buffer,buffer);
 1781|       |
 1782|  46.0k|    if (_pat != nullptr)
  ------------------
  |  Branch (1782:9): [True: 0, False: 46.0k]
  ------------------
 1783|      0|      FreePattern(_pat);
 1784|  46.0k|    _pat = ParseSMARTSRecord(_buffer);
 1785|  46.0k|    _str = _buffer;
 1786|       |
 1787|  46.0k|    return _pat != nullptr;
 1788|  46.0k|  }
_ZN9OpenBabel15OBSmartsPattern4InitERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1791|    221|  {
 1792|    221|    if (s.length() > MaxSmartsLength)
  ------------------
  |  Branch (1792:9): [True: 0, False: 221]
  ------------------
 1793|      0|      return false;
 1794|       |
 1795|    221|    delete[] _buffer;
 1796|    221|    _buffer = new char[s.length() + 1];
 1797|    221|    strcpy(_buffer, s.c_str());
 1798|       |
 1799|    221|    if (_pat != nullptr)
  ------------------
  |  Branch (1799:9): [True: 0, False: 221]
  ------------------
 1800|      0|      FreePattern(_pat);
 1801|    221|    _pat = ParseSMARTSRecord(_buffer);
 1802|    221|    _str = s;
 1803|       |
 1804|    221|    return _pat != nullptr;
 1805|    221|  }
_ZN9OpenBabel15OBSmartsPatternD2Ev:
 1808|  46.2k|  {
 1809|  46.2k|    if (_pat)
  ------------------
  |  Branch (1809:9): [True: 46.2k, False: 0]
  ------------------
 1810|  46.2k|      FreePattern(_pat);
 1811|  46.2k|    delete [] _buffer;
 1812|  46.2k|  }
_ZN9OpenBabel15OBSmartsPattern5MatchERNS_5OBMolEb:
 1815|   349k|  {
 1816|   349k|	OBSmartsMatcher matcher;
 1817|   349k|	if (_pat == nullptr)
  ------------------
  |  Branch (1817:6): [True: 0, False: 349k]
  ------------------
 1818|      0|      return false;
 1819|   349k|    if(_pat->hasExplicitH) //The SMARTS pattern contains [H]
  ------------------
  |  Branch (1819:8): [True: 0, False: 349k]
  ------------------
 1820|      0|      {
 1821|       |        //Do matching on a copy of mol with explicit hydrogens
 1822|      0|        OBMol tmol = mol;
 1823|      0|        tmol.AddHydrogens(false,false);
 1824|      0|        return(matcher.match(tmol,_pat,_mlist,single));
 1825|      0|      }
 1826|   349k|    return(matcher.match(mol,_pat,_mlist,single));
 1827|   349k|  }
_ZNK9OpenBabel15OBSmartsPattern5MatchERNS_5OBMolERNSt3__16vectorINS4_IiNS3_9allocatorIiEEEENS5_IS7_EEEENS0_9MatchTypeE:
 1838|  11.9M|  {
 1839|  11.9M|	OBSmartsMatcher matcher;
 1840|  11.9M|	mlist.clear();
 1841|  11.9M|	if (_pat == nullptr)
  ------------------
  |  Branch (1841:6): [True: 0, False: 11.9M]
  ------------------
 1842|      0|      return false;
 1843|  11.9M|    if(_pat->hasExplicitH) //The SMARTS pattern contains [H]
  ------------------
  |  Branch (1843:8): [True: 0, False: 11.9M]
  ------------------
 1844|      0|      {
 1845|       |        //Do matching on a copy of mol with explicit hydrogens
 1846|      0|        OBMol tmol = mol;
 1847|      0|        tmol.AddHydrogens(false,false);
 1848|      0|        if(!matcher.match(tmol,_pat,mlist,mtype == Single))
  ------------------
  |  Branch (1848:12): [True: 0, False: 0]
  ------------------
 1849|      0|        	return false;
 1850|      0|      }
 1851|  11.9M|    else if(!matcher.match(mol,_pat,mlist,mtype == Single))
  ------------------
  |  Branch (1851:13): [True: 11.6M, False: 275k]
  ------------------
 1852|  11.6M|    	return false;
 1853|       |
 1854|   275k|    if((mtype == AllUnique) && mlist.size() > 1)
  ------------------
  |  Branch (1854:8): [True: 87, False: 275k]
  |  Branch (1854:32): [True: 58, False: 29]
  ------------------
 1855|     58|    {
 1856|       |    	//uniquify
 1857|     58|         bool ok;
 1858|     58|        OBBitVec bv;
 1859|     58|        std::vector<OBBitVec> vbv;
 1860|     58|        std::vector<std::vector<int> > ulist;
 1861|     58|        std::vector<std::vector<int> >::iterator i;
 1862|     58|        std::vector<OBBitVec>::iterator j;
 1863|       |
 1864|  1.04k|        for (i = mlist.begin();i != mlist.end();++i)
  ------------------
  |  Branch (1864:32): [True: 985, False: 58]
  ------------------
 1865|    985|          {
 1866|    985|            ok = true;
 1867|    985|            bv.Clear();
 1868|    985|            bv.FromVecInt(*i);
 1869|  18.2k|            for (j = vbv.begin();j != vbv.end() && ok;++j)
  ------------------
  |  Branch (1869:34): [True: 17.7k, False: 509]
  |  Branch (1869:34): [True: 17.2k, False: 985]
  |  Branch (1869:52): [True: 17.2k, False: 476]
  ------------------
 1870|  17.2k|              if ((*j) == bv)
  ------------------
  |  Branch (1870:19): [True: 639, False: 16.6k]
  ------------------
 1871|    639|                ok = false;
 1872|       |
 1873|    985|            if (ok)
  ------------------
  |  Branch (1873:17): [True: 346, False: 639]
  ------------------
 1874|    346|              {
 1875|    346|                ulist.push_back(*i);
 1876|    346|                vbv.push_back(bv);
 1877|    346|              }
 1878|    985|          }
 1879|       |
 1880|     58|        mlist = ulist;
 1881|     58|    }
 1882|   275k|    return true;
 1883|  11.9M|  }
_ZN9OpenBabel15OBSmartsMatcher5matchERNS_5OBMolEPKNS_7PatternERNSt3__16vectorINS7_IiNS6_9allocatorIiEEEENS8_ISA_EEEEb:
 2063|  15.1M|  {
 2064|  15.1M|    mlist.clear();
 2065|  15.1M|    if (!pat || pat->acount == 0)
  ------------------
  |  Branch (2065:9): [True: 0, False: 15.1M]
  |  Branch (2065:17): [True: 0, False: 15.1M]
  ------------------
 2066|      0|      return(false);//shouldn't ever happen
 2067|       |
 2068|  15.1M|    if (single && !pat->ischiral) {
  ------------------
  |  Branch (2068:9): [True: 0, False: 15.1M]
  |  Branch (2068:19): [True: 0, False: 0]
  ------------------
 2069|       |      // perform a fast single match (only works for non-chiral SMARTS)
 2070|      0|      FastSingleMatch(mol,pat,mlist);
 2071|  15.1M|    } else {
 2072|       |      // perform normal match (chirality ignored and checked below)
 2073|  15.1M|      OBSSMatch ssm(mol,pat);
 2074|  15.1M|      ssm.Match(mlist);
 2075|  15.1M|    }
 2076|       |
 2077|  15.1M|    if (pat->ischiral) {
  ------------------
  |  Branch (2077:9): [True: 0, False: 15.1M]
  ------------------
 2078|      0|      std::vector<std::vector<int> >::iterator m;
 2079|      0|      std::vector<std::vector<int> > tmpmlist;
 2080|       |
 2081|      0|      tmpmlist.clear();
 2082|       |      // iterate over the atom mappings
 2083|      0|      for (m = mlist.begin();m != mlist.end();++m) {
  ------------------
  |  Branch (2083:30): [True: 0, False: 0]
  ------------------
 2084|       |
 2085|      0|        bool allStereoCentersMatch = true;
 2086|       |
 2087|       |        // for each pattern atom
 2088|      0|        for (int j = 0; j < pat->acount; ++j) {
  ------------------
  |  Branch (2088:25): [True: 0, False: 0]
  ------------------
 2089|       |          // skip non-chiral pattern atoms
 2090|      0|          if (!pat->atom[j].chiral_flag)
  ------------------
  |  Branch (2090:15): [True: 0, False: 0]
  ------------------
 2091|      0|            continue;
 2092|       |          // ignore @? in smarts, parse like any other smarts
 2093|      0|          if (pat->atom[j].chiral_flag == AL_UNSPECIFIED)
  ------------------
  |  |  128|      0|#define AL_UNSPECIFIED    0
  ------------------
  |  Branch (2093:15): [True: 0, False: 0]
  ------------------
 2094|      0|            continue;
 2095|       |
 2096|       |          // use the mapping the get the chiral atom in the molecule being queried
 2097|      0|          OBAtom *center = mol.GetAtom((*m)[j]);
 2098|      0|          if (!center) {
  ------------------
  |  Branch (2098:15): [True: 0, False: 0]
  ------------------
 2099|       |            // mapping index out of range (e.g. from a degenerate match)
 2100|      0|            allStereoCentersMatch = false;
 2101|      0|            break;
 2102|      0|          }
 2103|       |
 2104|       |          // get the OBTetrahedralStereo::Config from the molecule
 2105|      0|          OBStereoFacade stereo(&mol);
 2106|      0|          OBTetrahedralStereo *ts = stereo.GetTetrahedralStereo(center->GetId());
 2107|      0|          if (!ts || !ts->GetConfig().specified) {
  ------------------
  |  Branch (2107:15): [True: 0, False: 0]
  |  Branch (2107:15): [True: 0, False: 0]
  |  Branch (2107:22): [True: 0, False: 0]
  ------------------
 2108|       |            // no stereochemistry specified in molecule for the atom
 2109|       |            // corresponding to the chiral pattern atom using the current
 2110|       |            // mapping --> no match
 2111|      0|            allStereoCentersMatch = false;
 2112|      0|            break;
 2113|      0|          }
 2114|       |
 2115|      0|          std::vector<int> nbrs = pat->atom[j].nbrs;
 2116|       |
 2117|      0|          if (nbrs.size() != 4) { // 3 nbrs currently not supported. Other values are errors.
  ------------------
  |  Branch (2117:15): [True: 0, False: 0]
  ------------------
 2118|       |            //stringstream ss;
 2119|       |            //ss << "Ignoring stereochemistry. There are " << nbrs.size() << " connections to this atom instead of 4. Title: " << mol.GetTitle();
 2120|       |            //obErrorLog.ThrowError(__FUNCTION__, ss.str(), obWarning);
 2121|      0|            continue;
 2122|      0|          }
 2123|       |
 2124|       |          // construct a OBTetrahedralStereo::Config using the smarts pattern
 2125|      0|          OBTetrahedralStereo::Config smartsConfig;
 2126|      0|          smartsConfig.center = center->GetId();
 2127|      0|          if (nbrs.at(0) == SmartsImplicitRef)
  ------------------
  |  Branch (2127:15): [True: 0, False: 0]
  ------------------
 2128|      0|            smartsConfig.from = OBStereo::ImplicitRef;
 2129|      0|          else {
 2130|      0|            OBAtom *ra0 = mol.GetAtom( (*m)[nbrs.at(0)] );
 2131|      0|            if (!ra0) { allStereoCentersMatch = false; break; }
  ------------------
  |  Branch (2131:17): [True: 0, False: 0]
  ------------------
 2132|      0|            smartsConfig.from = ra0->GetId();
 2133|      0|          }
 2134|      0|          OBStereo::Ref firstref;
 2135|      0|          if (nbrs.at(1) == SmartsImplicitRef)
  ------------------
  |  Branch (2135:15): [True: 0, False: 0]
  ------------------
 2136|      0|            firstref = OBStereo::ImplicitRef;
 2137|      0|          else {
 2138|      0|            OBAtom *ra1 = mol.GetAtom( (*m)[nbrs.at(1)] );
 2139|      0|            if (!ra1) { allStereoCentersMatch = false; break; }
  ------------------
  |  Branch (2139:17): [True: 0, False: 0]
  ------------------
 2140|      0|            firstref = ra1->GetId();
 2141|      0|          }
 2142|      0|          OBAtom *ra2 = mol.GetAtom( (*m)[nbrs.at(2)] );
 2143|      0|          OBAtom *ra3 = mol.GetAtom( (*m)[nbrs.at(3)] );
 2144|      0|          if (!ra2 || !ra3) { allStereoCentersMatch = false; break; }
  ------------------
  |  Branch (2144:15): [True: 0, False: 0]
  |  Branch (2144:23): [True: 0, False: 0]
  ------------------
 2145|      0|          smartsConfig.refs = OBStereo::MakeRefs(firstref, ra2->GetId(), ra3->GetId());
 2146|       |
 2147|      0|          smartsConfig.view = OBStereo::ViewFrom;
 2148|      0|          switch (pat->atom[j].chiral_flag) {
 2149|      0|            case AL_CLOCKWISE:
  ------------------
  |  |  126|      0|#define AL_CLOCKWISE      1
  ------------------
  |  Branch (2149:13): [True: 0, False: 0]
  ------------------
 2150|      0|              smartsConfig.winding = OBStereo::Clockwise;
 2151|      0|              break;
 2152|      0|            case AL_ANTICLOCKWISE:
  ------------------
  |  |  127|      0|#define AL_ANTICLOCKWISE  2
  ------------------
  |  Branch (2152:13): [True: 0, False: 0]
  ------------------
 2153|      0|              smartsConfig.winding = OBStereo::AntiClockwise;
 2154|      0|              break;
 2155|      0|            default:
  ------------------
  |  Branch (2155:13): [True: 0, False: 0]
  ------------------
 2156|      0|              smartsConfig.specified = false;
 2157|      0|          }
 2158|       |
 2159|       |          // cout << "smarts config = " << smartsConfig << endl;
 2160|       |          // cout << "molecule config = " << ts->GetConfig() << endl;
 2161|       |          // cout << "match = " << (ts->GetConfig() == smartsConfig) << endl;
 2162|       |
 2163|       |          // and save the match if the two configurations are the same
 2164|      0|          if (ts->GetConfig() != smartsConfig)
  ------------------
  |  Branch (2164:15): [True: 0, False: 0]
  ------------------
 2165|      0|            allStereoCentersMatch = false;
 2166|       |
 2167|       |          // don't waste time checking more stereocenters using this mapping if one didn't match
 2168|      0|          if (!allStereoCentersMatch)
  ------------------
  |  Branch (2168:15): [True: 0, False: 0]
  ------------------
 2169|      0|            break;
 2170|      0|        }
 2171|       |
 2172|       |        // if all the atoms in the molecule match the stereochemistry specified
 2173|       |        // in the smarts pattern, save this mapping as a match
 2174|      0|        if (allStereoCentersMatch)
  ------------------
  |  Branch (2174:13): [True: 0, False: 0]
  ------------------
 2175|      0|          tmpmlist.push_back(*m);
 2176|      0|      }
 2177|       |
 2178|      0|      mlist = tmpmlist;
 2179|      0|    }
 2180|       |
 2181|  15.1M|    return(!mlist.empty());
 2182|  15.1M|  }
_ZN9OpenBabel15OBSmartsMatcher12EvalAtomExprEPNS_9_AtomExprEPNS_6OBAtomE:
 2185|   294M|  {
 2186|   294M|    for (;;)
 2187|   324M|      switch (expr->type)
 2188|   324M|        {
 2189|  8.15M|        case AE_TRUE:
  ------------------
  |  |  104|  8.15M|#define AE_TRUE         6
  ------------------
  |  Branch (2189:9): [True: 8.15M, False: 316M]
  ------------------
 2190|  8.15M|          return true;
 2191|      0|        case AE_FALSE:
  ------------------
  |  |  105|      0|#define AE_FALSE        7
  ------------------
  |  Branch (2191:9): [True: 0, False: 324M]
  ------------------
 2192|      0|          return false;
 2193|  1.00M|        case AE_AROMATIC:
  ------------------
  |  |  106|  1.00M|#define AE_AROMATIC     8
  ------------------
  |  Branch (2193:9): [True: 1.00M, False: 323M]
  ------------------
 2194|  1.00M|          return atom->IsAromatic();
 2195|      0|        case AE_ALIPHATIC:
  ------------------
  |  |  107|      0|#define AE_ALIPHATIC    9
  ------------------
  |  Branch (2195:9): [True: 0, False: 324M]
  ------------------
 2196|      0|          return !atom->IsAromatic();
 2197|    573|        case AE_CYCLIC:
  ------------------
  |  |  108|    573|#define AE_CYCLIC       10
  ------------------
  |  Branch (2197:9): [True: 573, False: 324M]
  ------------------
 2198|    573|          return atom->IsInRing();
 2199|  9.61k|        case AE_ACYCLIC:
  ------------------
  |  |  109|  9.61k|#define AE_ACYCLIC      11
  ------------------
  |  Branch (2199:9): [True: 9.61k, False: 324M]
  ------------------
 2200|  9.61k|          return !atom->IsInRing();
 2201|       |
 2202|      0|        case AE_MASS:
  ------------------
  |  |  110|      0|#define AE_MASS         12
  ------------------
  |  Branch (2202:9): [True: 0, False: 324M]
  ------------------
 2203|      0|          return expr->leaf.value == atom->GetIsotope();
 2204|   102M|        case AE_ELEM:
  ------------------
  |  |  111|   102M|#define AE_ELEM         13
  ------------------
  |  Branch (2204:9): [True: 102M, False: 221M]
  ------------------
 2205|   102M|          return expr->leaf.value == (int)atom->GetAtomicNum();
 2206|  11.1M|        case AE_AROMELEM:
  ------------------
  |  |  112|  11.1M|#define AE_AROMELEM     14
  ------------------
  |  Branch (2206:9): [True: 11.1M, False: 313M]
  ------------------
 2207|  11.1M|          return expr->leaf.value == (int)atom->GetAtomicNum() &&
  ------------------
  |  Branch (2207:18): [True: 1.07M, False: 10.0M]
  ------------------
 2208|  1.07M|                 atom->IsAromatic();
  ------------------
  |  Branch (2208:18): [True: 1.71k, False: 1.07M]
  ------------------
 2209|  51.5M|        case AE_ALIPHELEM:
  ------------------
  |  |  113|  51.5M|#define AE_ALIPHELEM    15
  ------------------
  |  Branch (2209:9): [True: 51.5M, False: 272M]
  ------------------
 2210|  51.5M|          return expr->leaf.value == (int)atom->GetAtomicNum() &&
  ------------------
  |  Branch (2210:18): [True: 5.87M, False: 45.7M]
  ------------------
 2211|  5.87M|                 !atom->IsAromatic();
  ------------------
  |  Branch (2211:18): [True: 5.86M, False: 11.0k]
  ------------------
 2212|     71|        case AE_HCOUNT:
  ------------------
  |  |  114|     71|#define AE_HCOUNT       16
  ------------------
  |  Branch (2212:9): [True: 71, False: 324M]
  ------------------
 2213|     71|          return expr->leaf.value == ((int)atom->ExplicitHydrogenCount() +
 2214|     71|                                      (int)atom->GetImplicitHCount());
 2215|   130k|        case AE_CHARGE:
  ------------------
  |  |  115|   130k|#define AE_CHARGE       17
  ------------------
  |  Branch (2215:9): [True: 130k, False: 324M]
  ------------------
 2216|   130k|          return expr->leaf.value == atom->GetFormalCharge();
 2217|  2.67M|        case AE_CONNECT:
  ------------------
  |  |  116|  2.67M|#define AE_CONNECT      18
  ------------------
  |  Branch (2217:9): [True: 2.67M, False: 321M]
  ------------------
 2218|  2.67M|          return expr->leaf.value == (int)atom->GetTotalDegree();
 2219|  10.8M|        case AE_DEGREE:
  ------------------
  |  |  117|  10.8M|#define AE_DEGREE       19
  ------------------
  |  Branch (2219:9): [True: 10.8M, False: 313M]
  ------------------
 2220|  10.8M|          return expr->leaf.value == (int)atom->GetExplicitDegree();
 2221|      0|        case AE_IMPLICIT:
  ------------------
  |  |  118|      0|#define AE_IMPLICIT     20
  ------------------
  |  Branch (2221:9): [True: 0, False: 324M]
  ------------------
 2222|      0|          return expr->leaf.value == (int)atom->GetImplicitHCount();
 2223|      0|        case AE_RINGS:
  ------------------
  |  |  119|      0|#define AE_RINGS        21
  ------------------
  |  Branch (2223:9): [True: 0, False: 324M]
  ------------------
 2224|      0|          return expr->leaf.value == (int)atom->MemberOfRingCount();
 2225|     30|        case AE_SIZE:
  ------------------
  |  |  120|     30|#define AE_SIZE         22
  ------------------
  |  Branch (2225:9): [True: 30, False: 324M]
  ------------------
 2226|     30|          return atom->IsInRingSize(expr->leaf.value);
 2227|   120k|        case AE_VALENCE:
  ------------------
  |  |  121|   120k|#define AE_VALENCE      23
  ------------------
  |  Branch (2227:9): [True: 120k, False: 324M]
  ------------------
 2228|   120k|          return expr->leaf.value == (int)atom->GetTotalValence();
 2229|      0|        case AE_CHIRAL:
  ------------------
  |  |  122|      0|#define AE_CHIRAL       24
  ------------------
  |  Branch (2229:9): [True: 0, False: 324M]
  ------------------
 2230|       |          // always return true (i.e. accept the match) and check later
 2231|      0|          return true;
 2232|   118k|        case AE_HYB:
  ------------------
  |  |  123|   118k|#define AE_HYB          25
  ------------------
  |  Branch (2232:9): [True: 118k, False: 324M]
  ------------------
 2233|   118k|          return expr->leaf.value == (int)atom->GetHyb();
 2234|      0|        case AE_RINGCONNECT:
  ------------------
  |  |  124|      0|#define AE_RINGCONNECT  26
  ------------------
  |  Branch (2234:9): [True: 0, False: 324M]
  ------------------
 2235|      0|          return expr->leaf.value == (int)atom->CountRingBonds();
 2236|       |
 2237|  8.19k|        case AE_NOT:
  ------------------
  |  |  103|  8.19k|#define AE_NOT          5
  ------------------
  |  Branch (2237:9): [True: 8.19k, False: 324M]
  ------------------
 2238|  8.19k|          return !EvalAtomExpr(expr->mon.arg,atom);
 2239|  63.5M|        case AE_ANDHI: /* Same as AE_ANDLO */
  ------------------
  |  |   99|  63.5M|#define AE_ANDHI        1
  ------------------
  |  Branch (2239:9): [True: 63.5M, False: 260M]
  ------------------
 2240|  77.6M|        case AE_ANDLO:
  ------------------
  |  |  100|  77.6M|#define AE_ANDLO        2
  ------------------
  |  Branch (2240:9): [True: 14.1M, False: 310M]
  ------------------
 2241|  77.6M|          if (!EvalAtomExpr(expr->bin.lft,atom))
  ------------------
  |  Branch (2241:15): [True: 74.3M, False: 3.34M]
  ------------------
 2242|  74.3M|            return false;
 2243|  3.34M|          expr = expr->bin.rgt;
 2244|  3.34M|          break;
 2245|  28.4M|        case AE_OR:
  ------------------
  |  |  101|  28.4M|#define AE_OR           3
  ------------------
  |  Branch (2245:9): [True: 28.4M, False: 296M]
  ------------------
 2246|  28.4M|          if (EvalAtomExpr(expr->bin.lft,atom))
  ------------------
  |  Branch (2246:15): [True: 1.43M, False: 27.0M]
  ------------------
 2247|  1.43M|            return true;
 2248|  27.0M|          expr = expr->bin.rgt;
 2249|  27.0M|          break;
 2250|       |
 2251|  29.8M|        case AE_RECUR:
  ------------------
  |  |  102|  29.8M|#define AE_RECUR        4
  ------------------
  |  Branch (2251:9): [True: 29.8M, False: 294M]
  ------------------
 2252|  29.8M|          {
 2253|       |            //see if pattern has been matched
 2254|  29.8M|            std::vector<std::pair<const Pattern*,std::vector<bool> > >::iterator i;
 2255|  40.5M|            for (i = RSCACHE.begin();i != RSCACHE.end();++i)
  ------------------
  |  Branch (2255:38): [True: 37.6M, False: 2.87M]
  ------------------
 2256|  37.6M|              if (i->first == (Pattern*)expr->recur.recur)
  ------------------
  |  Branch (2256:19): [True: 27.0M, False: 10.6M]
  ------------------
 2257|  27.0M|                return(i->second[atom->GetIdx()]);
 2258|       |
 2259|       |            //perceive and match pattern
 2260|  2.87M|            std::vector<std::vector<int> >::iterator j;
 2261|  2.87M|            std::vector<bool> vb(((OBMol*) atom->GetParent())->NumAtoms()+1);
 2262|  2.87M|            std::vector<std::vector<int> > mlist;
 2263|  2.87M|            if (match( *((OBMol *) atom->GetParent()),
  ------------------
  |  Branch (2263:17): [True: 64.3k, False: 2.81M]
  ------------------
 2264|  2.87M|                       (Pattern*)expr->recur.recur,mlist))
 2265|   657k|              for (j = mlist.begin();j != mlist.end();++j)
  ------------------
  |  Branch (2265:38): [True: 593k, False: 64.3k]
  ------------------
 2266|   593k|                vb[(*j)[0]] = true;
 2267|       |
 2268|  2.87M|            RSCACHE.push_back(std::pair<const Pattern*,
 2269|  2.87M|                              std::vector<bool> > ((const Pattern*)expr->recur.recur,
 2270|  2.87M|                                                   vb));
 2271|       |
 2272|  2.87M|            return(vb[atom->GetIdx()]);
 2273|  29.8M|          }
 2274|       |
 2275|      0|        default:
  ------------------
  |  Branch (2275:9): [True: 0, False: 324M]
  ------------------
 2276|      0|          return false;
 2277|   324M|        }
 2278|   294M|  }
_ZN9OpenBabel15OBSmartsMatcher12EvalBondExprEPNS_9_BondExprEPNS_6OBBondE:
 2281|  11.3M|  {
 2282|  11.3M|    for (;;)
 2283|  13.3M|      switch( expr->type )
 2284|  13.3M|        {
 2285|      0|        case BE_ANDHI:
  ------------------
  |  |  136|      0|#define BE_ANDHI        1
  ------------------
  |  Branch (2285:9): [True: 0, False: 13.3M]
  ------------------
 2286|      0|        case BE_ANDLO:
  ------------------
  |  |  137|      0|#define BE_ANDLO        2
  ------------------
  |  Branch (2286:9): [True: 0, False: 13.3M]
  ------------------
 2287|      0|          if (!EvalBondExpr(expr->bin.lft,bond))
  ------------------
  |  Branch (2287:15): [True: 0, False: 0]
  ------------------
 2288|      0|            return false;
 2289|      0|          expr = expr->bin.rgt;
 2290|      0|          break;
 2291|       |
 2292|  2.30M|        case BE_OR:
  ------------------
  |  |  138|  2.30M|#define BE_OR           3
  ------------------
  |  Branch (2292:9): [True: 2.30M, False: 11.0M]
  ------------------
 2293|  2.30M|          if (EvalBondExpr(expr->bin.lft,bond))
  ------------------
  |  Branch (2293:15): [True: 299k, False: 2.00M]
  ------------------
 2294|   299k|            return true;
 2295|  2.00M|          expr = expr->bin.rgt;
 2296|  2.00M|          break;
 2297|       |
 2298|      0|        case BE_NOT:
  ------------------
  |  |  139|      0|#define BE_NOT          4
  ------------------
  |  Branch (2298:9): [True: 0, False: 13.3M]
  ------------------
 2299|      0|          return !EvalBondExpr(expr->mon.arg,bond);
 2300|       |
 2301|  56.7k|        case BE_ANY:
  ------------------
  |  |  140|  56.7k|#define BE_ANY          5
  ------------------
  |  Branch (2301:9): [True: 56.7k, False: 13.2M]
  ------------------
 2302|  56.7k|          return true;
 2303|   844k|        case BE_DEFAULT:
  ------------------
  |  |  141|   844k|#define BE_DEFAULT      6
  ------------------
  |  Branch (2303:9): [True: 844k, False: 12.5M]
  ------------------
 2304|   844k|          return bond->GetBondOrder()==1 || bond->IsAromatic();
  ------------------
  |  Branch (2304:18): [True: 696k, False: 148k]
  |  Branch (2304:45): [True: 34, False: 148k]
  ------------------
 2305|      0|        case BE_SINGLE:
  ------------------
  |  |  142|      0|#define BE_SINGLE       7
  ------------------
  |  Branch (2305:9): [True: 0, False: 13.3M]
  ------------------
 2306|      0|          return bond->GetBondOrder()==1 && !bond->IsAromatic();
  ------------------
  |  Branch (2306:18): [True: 0, False: 0]
  |  Branch (2306:45): [True: 0, False: 0]
  ------------------
 2307|  5.75M|        case BE_DOUBLE:
  ------------------
  |  |  143|  5.75M|#define BE_DOUBLE       8
  ------------------
  |  Branch (2307:9): [True: 5.75M, False: 7.59M]
  ------------------
 2308|  5.75M|          return bond->GetBondOrder()==2 && !bond->IsAromatic();
  ------------------
  |  Branch (2308:18): [True: 942k, False: 4.81M]
  |  Branch (2308:45): [True: 942k, False: 14]
  ------------------
 2309|  3.37M|        case BE_TRIPLE:
  ------------------
  |  |  144|  3.37M|#define BE_TRIPLE       9
  ------------------
  |  Branch (2309:9): [True: 3.37M, False: 9.97M]
  ------------------
 2310|  3.37M|          return bond->GetBondOrder() == 3;
 2311|      0|        case BE_QUAD:
  ------------------
  |  |  145|      0|#define BE_QUAD         10
  ------------------
  |  Branch (2311:9): [True: 0, False: 13.3M]
  ------------------
 2312|      0|          return bond->GetBondOrder() == 4;
 2313|  1.01M|        case BE_AROM:
  ------------------
  |  |  146|  1.01M|#define BE_AROM         11
  ------------------
  |  Branch (2313:9): [True: 1.01M, False: 12.3M]
  ------------------
 2314|  1.01M|          return bond->IsAromatic();
 2315|      0|        case BE_RING:
  ------------------
  |  |  147|      0|#define BE_RING         12
  ------------------
  |  Branch (2315:9): [True: 0, False: 13.3M]
  ------------------
 2316|      0|          return bond->IsInRing();
 2317|       |        //case BE_UP:
 2318|       |        //  return bond->IsUp();
 2319|       |        //case BE_DOWN:
 2320|       |        //  return bond->IsDown();
 2321|       |        //case BE_UPUNSPEC: // up or unspecified (i.e., not down)
 2322|       |        //  return !bond->IsDown();
 2323|       |        //case BE_DOWNUNSPEC: // down or unspecified (i.e., not up)
 2324|       |        //  return !bond->IsUp();
 2325|      0|        default:
  ------------------
  |  Branch (2325:9): [True: 0, False: 13.3M]
  ------------------
 2326|      0|          return false;
 2327|  13.3M|        }
 2328|  11.3M|  }
_ZN9OpenBabel15OBSmartsPattern11GetUMapListEv:
 2331|    314|  {
 2332|    314|    if (_mlist.empty() || _mlist.size() == 1)
  ------------------
  |  Branch (2332:9): [True: 0, False: 314]
  |  Branch (2332:27): [True: 47, False: 267]
  ------------------
 2333|     47|      return(_mlist);
 2334|       |
 2335|    267|    bool ok;
 2336|    267|    OBBitVec bv;
 2337|    267|    std::vector<OBBitVec> vbv;
 2338|    267|    std::vector<std::vector<int> > mlist;
 2339|    267|    std::vector<std::vector<int> >::iterator i;
 2340|    267|    std::vector<OBBitVec>::iterator j;
 2341|       |
 2342|  3.62k|    for (i = _mlist.begin();i != _mlist.end();++i)
  ------------------
  |  Branch (2342:29): [True: 3.35k, False: 267]
  ------------------
 2343|  3.35k|      {
 2344|  3.35k|        ok = true;
 2345|  3.35k|        bv.Clear();
 2346|  3.35k|        bv.FromVecInt(*i);
 2347|  18.1k|        for (j = vbv.begin();j != vbv.end() && ok;++j)
  ------------------
  |  Branch (2347:30): [True: 15.4k, False: 2.74k]
  |  Branch (2347:30): [True: 14.8k, False: 3.35k]
  |  Branch (2347:48): [True: 14.8k, False: 608]
  ------------------
 2348|  14.8k|          if ((*j) == bv)
  ------------------
  |  Branch (2348:15): [True: 2.55k, False: 12.2k]
  ------------------
 2349|  2.55k|            ok = false;
 2350|       |
 2351|  3.35k|        if (ok)
  ------------------
  |  Branch (2351:13): [True: 799, False: 2.55k]
  ------------------
 2352|    799|          {
 2353|    799|            mlist.push_back(*i);
 2354|    799|            vbv.push_back(bv);
 2355|    799|          }
 2356|  3.35k|      }
 2357|       |
 2358|    267|    _mlist = mlist;
 2359|    267|    return(_mlist);
 2360|    314|  }
_ZN9OpenBabel9OBSSMatchC2ERNS_5OBMolEPKNS_7PatternE:
 2382|  15.1M|  {
 2383|  15.1M|    _mol = &mol;
 2384|  15.1M|    _pat = pat;
 2385|  15.1M|    _map.resize(pat->acount);
 2386|       |
 2387|  15.1M|    if (!mol.Empty())
  ------------------
  |  Branch (2387:9): [True: 15.1M, False: 0]
  ------------------
 2388|  15.1M|      {
 2389|  15.1M|        _uatoms = new bool [mol.NumAtoms()+1];
 2390|  15.1M|        memset((char*)_uatoms,'\0',sizeof(bool)*(mol.NumAtoms()+1));
 2391|  15.1M|      }
 2392|      0|    else
 2393|      0|      _uatoms = nullptr;
 2394|  15.1M|  }
_ZN9OpenBabel9OBSSMatchD2Ev:
 2397|  15.1M|  {
 2398|  15.1M|    delete [] _uatoms;
 2399|  15.1M|  }
_ZN9OpenBabel9OBSSMatch5MatchERNSt3__16vectorINS2_IiNS1_9allocatorIiEEEENS3_IS5_EEEEi:
 2402|  22.8M|  {
 2403|  22.8M|	  OBSmartsMatcher matcher;
 2404|  22.8M|    if (bidx == -1)
  ------------------
  |  Branch (2404:9): [True: 15.1M, False: 7.67M]
  ------------------
 2405|  15.1M|      {
 2406|  15.1M|        OBAtom *atom;
 2407|  15.1M|        std::vector<OBAtom*>::iterator i;
 2408|   191M|        for (atom = _mol->BeginAtom(i);atom;atom = _mol->NextAtom(i))
  ------------------
  |  Branch (2408:40): [True: 176M, False: 15.1M]
  ------------------
 2409|   176M|          if (matcher.EvalAtomExpr(_pat->atom[0].expr,atom))
  ------------------
  |  Branch (2409:15): [True: 5.96M, False: 170M]
  ------------------
 2410|  5.96M|            {
 2411|  5.96M|              _map[0] = atom->GetIdx();
 2412|  5.96M|              _uatoms[atom->GetIdx()] = true;
 2413|  5.96M|              Match(mlist,0);
 2414|  5.96M|              _map[0] = 0;
 2415|  5.96M|              _uatoms[atom->GetIdx()] = false;
 2416|  5.96M|            }
 2417|  15.1M|        return;
 2418|  15.1M|      }
 2419|       |
 2420|  7.67M|    if (bidx == _pat->bcount) //save full match here
  ------------------
  |  Branch (2420:9): [True: 2.60M, False: 5.06M]
  ------------------
 2421|  2.60M|      {
 2422|  2.60M|        mlist.push_back(_map);
 2423|  2.60M|        return;
 2424|  2.60M|      }
 2425|       |
 2426|  5.06M|    if (_pat->bond[bidx].grow) //match the next bond
  ------------------
  |  Branch (2426:9): [True: 5.06M, False: 167]
  ------------------
 2427|  5.06M|      {
 2428|  5.06M|        int src = _pat->bond[bidx].src;
 2429|  5.06M|        int dst = _pat->bond[bidx].dst;
 2430|       |
 2431|  5.06M|        if (_map[src] <= 0 || _map[src] > (signed)_mol->NumAtoms())
  ------------------
  |  Branch (2431:13): [True: 0, False: 5.06M]
  |  Branch (2431:31): [True: 0, False: 5.06M]
  ------------------
 2432|      0|          return;
 2433|       |
 2434|  5.06M|        AtomExpr *aexpr = _pat->atom[dst].expr;
 2435|  5.06M|        BondExpr *bexpr = _pat->bond[bidx].expr;
 2436|  5.06M|        OBAtom *atom,*nbr;
 2437|  5.06M|        std::vector<OBBond*>::iterator i;
 2438|       |
 2439|  5.06M|        atom = _mol->GetAtom(_map[src]);
 2440|  17.3M|        for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i))
  ------------------
  |  Branch (2440:42): [True: 12.2M, False: 5.06M]
  ------------------
 2441|  12.2M|          if (!_uatoms[nbr->GetIdx()] && matcher.EvalAtomExpr(aexpr,nbr) &&
  ------------------
  |  Branch (2441:15): [True: 11.1M, False: 1.11M]
  |  Branch (2441:42): [True: 9.04M, False: 2.08M]
  ------------------
 2442|  9.04M|        		  matcher.EvalBondExpr(bexpr,((OBBond*) *i)))
  ------------------
  |  Branch (2442:13): [True: 1.70M, False: 7.34M]
  ------------------
 2443|  1.70M|            {
 2444|  1.70M|              _map[dst] = nbr->GetIdx();
 2445|  1.70M|              _uatoms[nbr->GetIdx()] = true;
 2446|  1.70M|              Match(mlist,bidx+1);
 2447|  1.70M|              _uatoms[nbr->GetIdx()] = false;
 2448|  1.70M|              _map[dst] = 0;
 2449|  1.70M|            }
 2450|  5.06M|      }
 2451|    167|    else //just check bond here
 2452|    167|      {
 2453|    167|        OBBond *bond = _mol->GetBond(_map[_pat->bond[bidx].src],
 2454|    167|                                     _map[_pat->bond[bidx].dst]);
 2455|    167|        if (bond && matcher.EvalBondExpr(_pat->bond[bidx].expr,bond))
  ------------------
  |  Branch (2455:13): [True: 46, False: 121]
  |  Branch (2455:21): [True: 46, False: 0]
  ------------------
 2456|     46|          Match(mlist,bidx+1);
 2457|    167|      }
 2458|  5.06M|  }
_ZN9OpenBabel15OBSmartsPattern9GetChargeEi:
 2530|    162|  {
 2531|    162|    return GetExprCharge(_pat->atom[idx].expr);
 2532|    162|  }
_ZN9OpenBabel15OBSmartsPattern12GetAtomicNumEi:
 2567|    117|  {
 2568|    117|    return GetExprAtomicNum(_pat->atom[idx].expr);
 2569|    117|  }
_ZN9OpenBabel15OBSmartsPattern7GetBondERiS1_S1_i:
 2572|    281|  {
 2573|    281|    src = _pat->bond[idx].src;
 2574|    281|    dst = _pat->bond[idx].dst;
 2575|    281|    ord = GetExprOrder(_pat->bond[idx].expr);
 2576|    281|  }
parsmart.cpp:_ZN9OpenBabelL11FreePatternEPNS_7PatternE:
  568|  46.3k|  {
  569|  46.3k|    int i;
  570|       |
  571|  46.3k|    if( pat )
  ------------------
  |  Branch (571:9): [True: 46.3k, False: 0]
  ------------------
  572|  46.3k|      {
  573|  46.3k|        if( pat->aalloc )
  ------------------
  |  Branch (573:13): [True: 46.3k, False: 0]
  ------------------
  574|  46.3k|          {
  575|   194k|            for( i=0; i<pat->acount; i++ )
  ------------------
  |  Branch (575:23): [True: 148k, False: 46.3k]
  ------------------
  576|   148k|              FreeAtomExpr(pat->atom[i].expr);
  577|  46.3k|            if (pat->atom != nullptr) {
  ------------------
  |  Branch (577:17): [True: 46.3k, False: 0]
  ------------------
  578|       |              //free(pat->atom);
  579|  46.3k|              delete [] pat->atom;
  580|  46.3k|              pat->atom = nullptr;
  581|  46.3k|            }
  582|  46.3k|          }
  583|       |
  584|  46.3k|        if( pat->balloc )
  ------------------
  |  Branch (584:13): [True: 46.2k, False: 98]
  ------------------
  585|  46.2k|          {
  586|   148k|            for( i=0; i<pat->bcount; i++ )
  ------------------
  |  Branch (586:23): [True: 102k, False: 46.2k]
  ------------------
  587|   102k|              FreeBondExpr(pat->bond[i].expr);
  588|  46.2k|            if (pat->bond != nullptr) {
  ------------------
  |  Branch (588:17): [True: 46.2k, False: 0]
  ------------------
  589|       |              //free(pat->bond);
  590|  46.2k|              delete [] pat->bond;
  591|  46.2k|              pat->bond = nullptr;
  592|  46.2k|            }
  593|  46.2k|          }
  594|  46.3k|        delete pat;
  595|  46.3k|        pat = nullptr;
  596|  46.3k|      }
  597|  46.3k|  }
parsmart.cpp:_ZN9OpenBabelL13BuildAtomPredEi:
  256|  36.9k|  {
  257|  36.9k|    AtomExpr *result;
  258|       |
  259|  36.9k|    result = new AtomExpr;
  260|  36.9k|    result->leaf.type = type;
  261|  36.9k|    result->leaf.value = 0;
  262|  36.9k|    return result;
  263|  36.9k|  }
parsmart.cpp:_ZN9OpenBabelL15GenerateElementEi:
  307|   120k|  {
  308|   120k|    return BuildAtomLeaf(AE_ELEM,elem);
  ------------------
  |  |  111|   120k|#define AE_ELEM         13
  ------------------
  309|   120k|  }
parsmart.cpp:_ZN9OpenBabelL16GenerateAromElemEii:
  312|    652|  {
  313|    652|    return flag ? BuildAtomLeaf(AE_AROMELEM,elem)
  ------------------
  |  |  112|    102|#define AE_AROMELEM     14
  ------------------
  |  Branch (313:12): [True: 102, False: 550]
  ------------------
  314|    652|                : BuildAtomLeaf(AE_ALIPHELEM,elem);
  ------------------
  |  |  113|    550|#define AE_ALIPHELEM    15
  ------------------
  315|    652|  }
parsmart.cpp:_ZN9OpenBabelL7ReadIntERPcRi:
  180|   221k|  {
  181|   461k|    while( isdigit(*LexPtr) )
  ------------------
  |  Branch (181:12): [True: 240k, False: 221k]
  ------------------
  182|   240k|      {
  183|   240k|        int digit = *LexPtr - '0';
  184|   240k|        if( result > (INT_MAX - digit) / 10 )
  ------------------
  |  Branch (184:13): [True: 0, False: 240k]
  ------------------
  185|      0|          return false;
  186|   240k|        result = result*10 + digit;
  187|   240k|        LexPtr++;
  188|   240k|      }
  189|   221k|    return true;
  190|   221k|  }
parsmart.cpp:_ZN9OpenBabelL15BuildAtomRecursEPNS_7PatternE:
  297|     35|  {
  298|     35|    AtomExpr *result;
  299|       |
  300|     35|    result = new AtomExpr;
  301|     35|    result->recur.type = AE_RECUR;
  ------------------
  |  |  102|     35|#define AE_RECUR        4
  ------------------
  302|     35|    result->recur.recur = (void*)pat;
  303|     35|    return result;
  304|     35|  }
parsmart.cpp:_ZN9OpenBabelL13BuildAtomLeafEii:
  266|   231k|  {
  267|   231k|    AtomExpr *result;
  268|       |
  269|   231k|    result = new AtomExpr;
  270|   231k|    result->leaf.type = type;
  271|   231k|    result->leaf.value = val;
  272|   231k|    return result;
  273|   231k|  }
parsmart.cpp:_ZN9OpenBabelL12FreeAtomExprEPNS_9_AtomExprE:
  230|   397k|  {
  231|   397k|    if( expr )
  ------------------
  |  Branch (231:9): [True: 397k, False: 0]
  ------------------
  232|   397k|      {
  233|   397k|        switch( expr->type )
  ------------------
  |  Branch (233:17): [True: 129k, False: 268k]
  ------------------
  234|   397k|          {
  235|  92.4k|          case AE_ANDHI:
  ------------------
  |  |   99|  92.4k|#define AE_ANDHI        1
  ------------------
  |  Branch (235:11): [True: 92.4k, False: 305k]
  ------------------
  236|   110k|          case AE_ANDLO:
  ------------------
  |  |  100|   110k|#define AE_ANDLO        2
  ------------------
  |  Branch (236:11): [True: 18.4k, False: 379k]
  ------------------
  237|   120k|          case AE_OR:
  ------------------
  |  |  101|   120k|#define AE_OR           3
  ------------------
  |  Branch (237:11): [True: 9.24k, False: 388k]
  ------------------
  238|   120k|            FreeAtomExpr(expr->bin.lft);
  239|   120k|            FreeAtomExpr(expr->bin.rgt);
  240|   120k|            break;
  241|       |
  242|  9.24k|          case AE_NOT:
  ------------------
  |  |  103|  9.24k|#define AE_NOT          5
  ------------------
  |  Branch (242:11): [True: 9.24k, False: 388k]
  ------------------
  243|  9.24k|            FreeAtomExpr(expr->mon.arg);
  244|  9.24k|            break;
  245|       |
  246|     35|          case AE_RECUR:
  ------------------
  |  |  102|     35|#define AE_RECUR        4
  ------------------
  |  Branch (246:11): [True: 35, False: 397k]
  ------------------
  247|     35|            FreePattern((Pattern*)expr->recur.recur);
  248|     35|            break;
  249|   397k|          }
  250|       |
  251|   397k|        delete expr;
  252|   397k|      }
  253|   397k|  }
parsmart.cpp:_ZN9OpenBabelL12BuildAtomBinEiPNS_9_AtomExprES1_:
  286|   120k|  {
  287|   120k|    AtomExpr *result;
  288|       |
  289|   120k|    result = new AtomExpr;
  290|   120k|    result->bin.type = op;
  291|   120k|    result->bin.lft = lft;
  292|   120k|    result->bin.rgt = rgt;
  293|   120k|    return result;
  294|   120k|  }
parsmart.cpp:_ZN9OpenBabelL12BuildAtomNotEPNS_9_AtomExprE:
  276|  9.24k|  {
  277|  9.24k|    AtomExpr *result;
  278|       |
  279|  9.24k|    result = new AtomExpr;
  280|  9.24k|    result->mon.type = AE_NOT;
  ------------------
  |  |  103|  9.24k|#define AE_NOT          5
  ------------------
  281|  9.24k|    result->mon.arg = expr;
  282|  9.24k|    return result;
  283|  9.24k|  }
parsmart.cpp:_ZN9OpenBabelL13BuildBondLeafEi:
  405|   102k|  {
  406|   102k|    BondExpr *result;
  407|       |
  408|   102k|    result = new BondExpr;
  409|   102k|    result->type = type;
  410|   102k|    return result;
  411|   102k|  }
parsmart.cpp:_ZN9OpenBabelL12FreeBondExprEPNS_9_BondExprE:
  383|   102k|  {
  384|   102k|    if( expr )
  ------------------
  |  Branch (384:9): [True: 102k, False: 0]
  ------------------
  385|   102k|      {
  386|   102k|        switch( expr->type )
  ------------------
  |  Branch (386:17): [True: 3, False: 102k]
  ------------------
  387|   102k|          {
  388|      0|          case BE_ANDHI:
  ------------------
  |  |  136|      0|#define BE_ANDHI        1
  ------------------
  |  Branch (388:11): [True: 0, False: 102k]
  ------------------
  389|      0|          case BE_ANDLO:
  ------------------
  |  |  137|      0|#define BE_ANDLO        2
  ------------------
  |  Branch (389:11): [True: 0, False: 102k]
  ------------------
  390|      3|          case BE_OR:
  ------------------
  |  |  138|      3|#define BE_OR           3
  ------------------
  |  Branch (390:11): [True: 3, False: 102k]
  ------------------
  391|      3|            FreeBondExpr(expr->bin.lft);
  392|      3|            FreeBondExpr(expr->bin.rgt);
  393|      3|            break;
  394|       |
  395|      0|          case BE_NOT:
  ------------------
  |  |  139|      0|#define BE_NOT          4
  ------------------
  |  Branch (395:11): [True: 0, False: 102k]
  ------------------
  396|      0|            FreeBondExpr(expr->mon.arg);
  397|      0|            break;
  398|   102k|          }
  399|       |
  400|   102k|        delete expr;
  401|   102k|      }
  402|   102k|  }
parsmart.cpp:_ZN9OpenBabelL12BuildBondBinEiPNS_9_BondExprES1_:
  424|      3|  {
  425|      3|    BondExpr *result;
  426|       |
  427|      3|    result = new BondExpr;
  428|      3|    result->bin.type = op;
  429|      3|    result->bin.lft = lft;
  430|      3|    result->bin.rgt = rgt;
  431|      3|    return result;
  432|      3|  }
parsmart.cpp:_ZN9OpenBabelL19GenerateDefaultBondEv:
  435|   101k|  {
  436|   101k|    return BuildBondLeaf(BE_DEFAULT);
  ------------------
  |  |  141|   101k|#define BE_DEFAULT      6
  ------------------
  437|   101k|  }
parsmart.cpp:_ZN9OpenBabelL10CreateBondEPNS_7PatternEPNS_9_BondExprEii:
  508|   102k|  {
  509|   102k|    int index;
  510|       |
  511|   102k|    if (!pat)
  ------------------
  |  Branch (511:9): [True: 0, False: 102k]
  ------------------
  512|      0|      return -1; // should never happen
  513|       |
  514|   102k|    if( pat->bcount == pat->balloc )
  ------------------
  |  Branch (514:9): [True: 101k, False: 288]
  ------------------
  515|   101k|      {
  516|   101k|        int oldalloc = pat->balloc;
  517|   101k|        if( oldalloc > INT_MAX/2 )
  ------------------
  |  Branch (517:13): [True: 0, False: 101k]
  ------------------
  518|      0|          {
  519|      0|            FatalAllocationError("bond pool");
  520|      0|            return -1;
  521|      0|          }
  522|   101k|        pat->balloc = oldalloc ? oldalloc * 2 : BONDPOOL;
  ------------------
  |  |   97|   147k|#define BONDPOOL      1
  ------------------
  |  Branch (522:23): [True: 55.5k, False: 46.2k]
  ------------------
  523|   101k|        if( pat->bond )
  ------------------
  |  Branch (523:13): [True: 55.5k, False: 46.2k]
  ------------------
  524|  55.5k|          {
  525|  55.5k|            BondSpec *tmp = new BondSpec[pat->balloc];
  526|  55.5k|            copy(pat->bond, pat->bond + oldalloc, tmp);
  527|  55.5k|            delete [] pat->bond;
  528|  55.5k|            pat->bond = tmp;
  529|  55.5k|          }
  530|  46.2k|        else
  531|  46.2k|          pat->bond = new BondSpec[pat->balloc];
  532|   101k|        if( !pat->bond )
  ------------------
  |  Branch (532:13): [True: 0, False: 101k]
  ------------------
  533|      0|          FatalAllocationError("bond pool");
  534|   101k|      }
  535|       |
  536|   102k|    index = pat->bcount++;
  537|   102k|    pat->bond[index].expr = expr;
  538|   102k|    pat->bond[index].src = src;
  539|   102k|    pat->bond[index].dst = dst;
  540|   102k|    return(index);
  541|   102k|  }
parsmart.cpp:_ZN9OpenBabelL10CreateAtomEPNS_7PatternEPNS_9_AtomExprEii:
  468|   148k|  {
  469|   148k|    int index;
  470|       |
  471|   148k|    if (!pat)
  ------------------
  |  Branch (471:9): [True: 0, False: 148k]
  ------------------
  472|      0|      return -1; // should never happen
  473|       |
  474|   148k|    if( pat->acount == pat->aalloc )
  ------------------
  |  Branch (474:9): [True: 129k, False: 18.7k]
  ------------------
  475|   129k|      {
  476|       |        // Double the pool to keep insertion amortized O(1); the previous
  477|       |        // linear growth was O(N^2) and made large fuzzer inputs time out.
  478|   129k|        int oldalloc = pat->aalloc;
  479|   129k|        if( oldalloc > INT_MAX/2 )
  ------------------
  |  Branch (479:13): [True: 0, False: 129k]
  ------------------
  480|      0|          {
  481|       |            // Would overflow on doubling — leave aalloc untouched and bail.
  482|      0|            FatalAllocationError("atom pool");
  483|      0|            return -1;
  484|      0|          }
  485|   129k|        pat->aalloc = oldalloc ? oldalloc * 2 : ATOMPOOL;
  ------------------
  |  |   96|   175k|#define ATOMPOOL      1
  ------------------
  |  Branch (485:23): [True: 83.2k, False: 46.3k]
  ------------------
  486|   129k|        if( pat->atom )
  ------------------
  |  Branch (486:13): [True: 83.2k, False: 46.3k]
  ------------------
  487|  83.2k|          {
  488|  83.2k|            AtomSpec *tmp = new AtomSpec[pat->aalloc];
  489|  83.2k|            copy(pat->atom, pat->atom + oldalloc, tmp);
  490|  83.2k|            delete [] pat->atom;
  491|  83.2k|            pat->atom = tmp;
  492|  83.2k|          }
  493|  46.3k|        else
  494|  46.3k|          pat->atom = new AtomSpec[pat->aalloc];
  495|   129k|        if( !pat->atom )
  ------------------
  |  Branch (495:13): [True: 0, False: 129k]
  ------------------
  496|      0|          FatalAllocationError("atom pool");
  497|   129k|      }
  498|       |
  499|   148k|    index = pat->acount++;
  500|   148k|    pat->atom[index].part = part;
  501|   148k|    pat->atom[index].expr = expr;
  502|   148k|    pat->atom[index].vb = vb; //std::vector binding
  503|       |
  504|   148k|    return index;
  505|   148k|  }
parsmart.cpp:_ZN9OpenBabelL13MarkGrowBondsEPNS_7PatternE:
 1611|  46.3k|  {
 1612|  46.3k|    int i;
 1613|  46.3k|    OBBitVec bv;
 1614|       |
 1615|   148k|    for (i = 0;i < pat->bcount;++i)
  ------------------
  |  Branch (1615:16): [True: 102k, False: 46.3k]
  ------------------
 1616|   102k|      {
 1617|   102k|        pat->bond[i].grow = (bv[pat->bond[i].src] && bv[pat->bond[i].dst])?
  ------------------
  |  Branch (1617:30): [True: 55.8k, False: 46.2k]
  |  Branch (1617:54): [True: 33, False: 55.8k]
  ------------------
 1618|   102k|          false:true;
 1619|       |
 1620|   102k|        bv.SetBitOn(pat->bond[i].src);
 1621|   102k|        bv.SetBitOn(pat->bond[i].dst);
 1622|   102k|      }
 1623|  46.3k|  }
parsmart.cpp:_ZN9OpenBabelL13GetChiralFlagEPNS_9_AtomExprE:
 1626|   397k|  {
 1627|   397k|    int tmp1,tmp2;
 1628|       |
 1629|   397k|    switch (expr->type)
  ------------------
  |  Branch (1629:13): [True: 129k, False: 268k]
  ------------------
 1630|   397k|      {
 1631|      0|        case AE_CHIRAL:
  ------------------
  |  |  122|      0|#define AE_CHIRAL       24
  ------------------
  |  Branch (1631:9): [True: 0, False: 397k]
  ------------------
 1632|      0|          return expr->leaf.value;
 1633|       |
 1634|  92.4k|        case AE_ANDHI:
  ------------------
  |  |   99|  92.4k|#define AE_ANDHI        1
  ------------------
  |  Branch (1634:9): [True: 92.4k, False: 305k]
  ------------------
 1635|   110k|        case AE_ANDLO:
  ------------------
  |  |  100|   110k|#define AE_ANDLO        2
  ------------------
  |  Branch (1635:9): [True: 18.4k, False: 379k]
  ------------------
 1636|   110k|          tmp1 = GetChiralFlag(expr->bin.lft);
 1637|   110k|          tmp2 = GetChiralFlag(expr->bin.rgt);
 1638|   110k|          if (tmp1 == 0) return tmp2;
  ------------------
  |  Branch (1638:15): [True: 110k, False: 0]
  ------------------
 1639|      0|          if (tmp2 == 0) return tmp1;
  ------------------
  |  Branch (1639:15): [True: 0, False: 0]
  ------------------
 1640|      0|          if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (1640:15): [True: 0, False: 0]
  ------------------
 1641|      0|          break;
 1642|       |
 1643|  9.24k|        case AE_OR:
  ------------------
  |  |  101|  9.24k|#define AE_OR           3
  ------------------
  |  Branch (1643:9): [True: 9.24k, False: 388k]
  ------------------
 1644|  9.24k|          tmp1 = GetChiralFlag(expr->bin.lft);
 1645|  9.24k|          tmp2 = GetChiralFlag(expr->bin.rgt);
 1646|  9.24k|          if (tmp1 == 0 || tmp2 == 0) return 0;
  ------------------
  |  Branch (1646:15): [True: 9.24k, False: 0]
  |  Branch (1646:28): [True: 0, False: 0]
  ------------------
 1647|      0|          if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (1647:15): [True: 0, False: 0]
  ------------------
 1648|      0|          break;
 1649|       |
 1650|  9.24k|        case AE_NOT:
  ------------------
  |  |  103|  9.24k|#define AE_NOT          5
  ------------------
  |  Branch (1650:9): [True: 9.24k, False: 388k]
  ------------------
 1651|       |          // Treat [!@] as [@@], and [!@@] as [@]
 1652|  9.24k|          tmp1 = GetChiralFlag(expr->mon.arg);
 1653|  9.24k|          if (tmp1 == AL_ANTICLOCKWISE) return AL_CLOCKWISE;
  ------------------
  |  |  127|  9.24k|#define AL_ANTICLOCKWISE  2
  ------------------
                        if (tmp1 == AL_ANTICLOCKWISE) return AL_CLOCKWISE;
  ------------------
  |  |  126|      0|#define AL_CLOCKWISE      1
  ------------------
  |  Branch (1653:15): [True: 0, False: 9.24k]
  ------------------
 1654|  9.24k|          if (tmp1 == AL_CLOCKWISE) return AL_ANTICLOCKWISE;
  ------------------
  |  |  126|  9.24k|#define AL_CLOCKWISE      1
  ------------------
                        if (tmp1 == AL_CLOCKWISE) return AL_ANTICLOCKWISE;
  ------------------
  |  |  127|      0|#define AL_ANTICLOCKWISE  2
  ------------------
  |  Branch (1654:15): [True: 0, False: 9.24k]
  ------------------
 1655|  9.24k|          break;
 1656|   397k|      }
 1657|       |
 1658|   277k|    return 0;
 1659|   397k|  }
parsmart.cpp:_ZN9OpenBabelL12AllocPatternEv:
  444|  46.3k|  {
  445|  46.3k|    Pattern *ptr;
  446|       |
  447|  46.3k|    ptr = new Pattern;
  448|  46.3k|    if( !ptr ) {
  ------------------
  |  Branch (448:9): [True: 0, False: 46.3k]
  ------------------
  449|      0|      FatalAllocationError("pattern");
  450|      0|      return nullptr;
  451|      0|    }
  452|       |
  453|  46.3k|    ptr->atom = nullptr;
  454|  46.3k|    ptr->aalloc = 0;
  455|  46.3k|    ptr->acount = 0;
  456|       |
  457|  46.3k|    ptr->bond = nullptr;
  458|  46.3k|    ptr->balloc = 0;
  459|  46.3k|    ptr->bcount = 0;
  460|       |
  461|  46.3k|    ptr->parts = 1;
  462|       |
  463|  46.3k|    ptr->hasExplicitH=false;
  464|  46.3k|    return ptr;
  465|  46.3k|  }
parsmart.cpp:_ZN9OpenBabelL13GetExprChargeEPNS_9_AtomExprE:
 2500|    428|  {
 2501|    428|    int tmp1,tmp2;
 2502|       |
 2503|    428|    switch( expr->type )
  ------------------
  |  Branch (2503:13): [True: 228, False: 200]
  ------------------
 2504|    428|      {
 2505|     95|      case AE_CHARGE:
  ------------------
  |  |  115|     95|#define AE_CHARGE       17
  ------------------
  |  Branch (2505:7): [True: 95, False: 333]
  ------------------
 2506|     95|        return expr->leaf.value;
 2507|       |
 2508|    132|      case AE_ANDHI:
  ------------------
  |  |   99|    132|#define AE_ANDHI        1
  ------------------
  |  Branch (2508:7): [True: 132, False: 296]
  ------------------
 2509|    133|      case AE_ANDLO:
  ------------------
  |  |  100|    133|#define AE_ANDLO        2
  ------------------
  |  Branch (2509:7): [True: 1, False: 427]
  ------------------
 2510|    133|        tmp1 = GetExprCharge(expr->bin.lft);
 2511|    133|        tmp2 = GetExprCharge(expr->bin.rgt);
 2512|    133|        if (tmp1 == 0) return tmp2;
  ------------------
  |  Branch (2512:13): [True: 133, False: 0]
  ------------------
 2513|      0|        if (tmp2 == 0) return tmp1;
  ------------------
  |  Branch (2513:13): [True: 0, False: 0]
  ------------------
 2514|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2514:13): [True: 0, False: 0]
  ------------------
 2515|      0|        break;
 2516|       |
 2517|      0|      case AE_OR:
  ------------------
  |  |  101|      0|#define AE_OR           3
  ------------------
  |  Branch (2517:7): [True: 0, False: 428]
  ------------------
 2518|      0|        tmp1 = GetExprCharge(expr->bin.lft);
 2519|      0|        if (tmp1 == 0) return 0;
  ------------------
  |  Branch (2519:13): [True: 0, False: 0]
  ------------------
 2520|      0|        tmp2 = GetExprCharge(expr->bin.rgt);
 2521|      0|        if (tmp2 == 0) return 0;
  ------------------
  |  Branch (2521:13): [True: 0, False: 0]
  ------------------
 2522|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2522:13): [True: 0, False: 0]
  ------------------
 2523|      0|        break;
 2524|    428|      }
 2525|       |
 2526|    200|    return 0;
 2527|    428|  }
parsmart.cpp:_ZN9OpenBabelL16GetExprAtomicNumEPNS_9_AtomExprE:
 2535|    291|  {
 2536|    291|    int tmp1,tmp2;
 2537|       |
 2538|    291|    switch( expr->type )
  ------------------
  |  Branch (2538:13): [True: 204, False: 87]
  ------------------
 2539|    291|      {
 2540|      5|      case AE_ELEM:
  ------------------
  |  |  111|      5|#define AE_ELEM         13
  ------------------
  |  Branch (2540:7): [True: 5, False: 286]
  ------------------
 2541|     17|      case AE_AROMELEM:
  ------------------
  |  |  112|     17|#define AE_AROMELEM     14
  ------------------
  |  Branch (2541:7): [True: 12, False: 279]
  ------------------
 2542|    117|      case AE_ALIPHELEM:
  ------------------
  |  |  113|    117|#define AE_ALIPHELEM    15
  ------------------
  |  Branch (2542:7): [True: 100, False: 191]
  ------------------
 2543|    117|        return expr->leaf.value;
 2544|       |
 2545|     86|      case AE_ANDHI:
  ------------------
  |  |   99|     86|#define AE_ANDHI        1
  ------------------
  |  Branch (2545:7): [True: 86, False: 205]
  ------------------
 2546|     87|      case AE_ANDLO:
  ------------------
  |  |  100|     87|#define AE_ANDLO        2
  ------------------
  |  Branch (2546:7): [True: 1, False: 290]
  ------------------
 2547|     87|        tmp1 = GetExprAtomicNum(expr->bin.lft);
 2548|     87|        tmp2 = GetExprAtomicNum(expr->bin.rgt);
 2549|     87|        if (tmp1 == 0) return tmp2;
  ------------------
  |  Branch (2549:13): [True: 0, False: 87]
  ------------------
 2550|     87|        if (tmp2 == 0) return tmp1;
  ------------------
  |  Branch (2550:13): [True: 87, False: 0]
  ------------------
 2551|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2551:13): [True: 0, False: 0]
  ------------------
 2552|      0|        break;
 2553|       |
 2554|      0|      case AE_OR:
  ------------------
  |  |  101|      0|#define AE_OR           3
  ------------------
  |  Branch (2554:7): [True: 0, False: 291]
  ------------------
 2555|      0|        tmp1 = GetExprAtomicNum(expr->bin.lft);
 2556|      0|        if (tmp1 == 0) return 0;
  ------------------
  |  Branch (2556:13): [True: 0, False: 0]
  ------------------
 2557|      0|        tmp2 = GetExprAtomicNum(expr->bin.rgt);
 2558|      0|        if (tmp2 == 0) return 0;
  ------------------
  |  Branch (2558:13): [True: 0, False: 0]
  ------------------
 2559|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2559:13): [True: 0, False: 0]
  ------------------
 2560|      0|        break;
 2561|    291|      }
 2562|       |
 2563|     87|    return 0;
 2564|    291|  }
parsmart.cpp:_ZN9OpenBabelL12GetExprOrderEPNS_9_BondExprE:
 2461|    281|  {
 2462|    281|    int tmp1,tmp2;
 2463|       |
 2464|    281|    switch( expr->type )
  ------------------
  |  Branch (2464:13): [True: 78, False: 203]
  ------------------
 2465|    281|      {
 2466|      5|      case BE_SINGLE:  return 1;
  ------------------
  |  |  142|      5|#define BE_SINGLE       7
  ------------------
  |  Branch (2466:7): [True: 5, False: 276]
  ------------------
 2467|     73|      case BE_DOUBLE:  return 2;
  ------------------
  |  |  143|     73|#define BE_DOUBLE       8
  ------------------
  |  Branch (2467:7): [True: 73, False: 208]
  ------------------
 2468|      0|      case BE_TRIPLE:  return 3;
  ------------------
  |  |  144|      0|#define BE_TRIPLE       9
  ------------------
  |  Branch (2468:7): [True: 0, False: 281]
  ------------------
 2469|      0|      case BE_QUAD:    return 4;
  ------------------
  |  |  145|      0|#define BE_QUAD         10
  ------------------
  |  Branch (2469:7): [True: 0, False: 281]
  ------------------
 2470|      0|      case BE_AROM:    return 5;
  ------------------
  |  |  146|      0|#define BE_AROM         11
  ------------------
  |  Branch (2470:7): [True: 0, False: 281]
  ------------------
 2471|       |
 2472|      0|      case BE_UP:
  ------------------
  |  |  148|      0|#define BE_UP           13
  ------------------
  |  Branch (2472:7): [True: 0, False: 281]
  ------------------
 2473|      0|      case BE_DOWN:
  ------------------
  |  |  149|      0|#define BE_DOWN         14
  ------------------
  |  Branch (2473:7): [True: 0, False: 281]
  ------------------
 2474|      0|      case BE_UPUNSPEC:
  ------------------
  |  |  150|      0|#define BE_UPUNSPEC     15
  ------------------
  |  Branch (2474:7): [True: 0, False: 281]
  ------------------
 2475|      0|      case BE_DOWNUNSPEC:
  ------------------
  |  |  151|      0|#define BE_DOWNUNSPEC   16
  ------------------
  |  Branch (2475:7): [True: 0, False: 281]
  ------------------
 2476|      0|        return 1;
 2477|       |      
 2478|      0|      case BE_ANDHI:
  ------------------
  |  |  136|      0|#define BE_ANDHI        1
  ------------------
  |  Branch (2478:7): [True: 0, False: 281]
  ------------------
 2479|      0|      case BE_ANDLO:
  ------------------
  |  |  137|      0|#define BE_ANDLO        2
  ------------------
  |  Branch (2479:7): [True: 0, False: 281]
  ------------------
 2480|      0|        tmp1 = GetExprOrder(expr->bin.lft);
 2481|      0|        tmp2 = GetExprOrder(expr->bin.rgt);
 2482|      0|        if (tmp1 == 0) return tmp2;
  ------------------
  |  Branch (2482:13): [True: 0, False: 0]
  ------------------
 2483|      0|        if (tmp2 == 0) return tmp1;
  ------------------
  |  Branch (2483:13): [True: 0, False: 0]
  ------------------
 2484|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2484:13): [True: 0, False: 0]
  ------------------
 2485|      0|        break;
 2486|       |
 2487|      0|      case BE_OR:
  ------------------
  |  |  138|      0|#define BE_OR           3
  ------------------
  |  Branch (2487:7): [True: 0, False: 281]
  ------------------
 2488|      0|        tmp1 = GetExprOrder(expr->bin.lft);
 2489|      0|        if (tmp1 == 0) return 0;
  ------------------
  |  Branch (2489:13): [True: 0, False: 0]
  ------------------
 2490|      0|        tmp2 = GetExprOrder(expr->bin.rgt);
 2491|      0|        if (tmp2 == 0) return 0;
  ------------------
  |  Branch (2491:13): [True: 0, False: 0]
  ------------------
 2492|      0|        if (tmp1 == tmp2) return tmp1;
  ------------------
  |  Branch (2492:13): [True: 0, False: 0]
  ------------------
 2493|      0|        break;
 2494|    281|      }
 2495|       |
 2496|    203|    return 0;
 2497|    281|  }

_ZN9OpenBabel9OBPhModelC2Ev:
   48|      1|  {
   49|      1|    _init = false;
   50|      1|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      1|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
   51|      1|    _envvar = "BABEL_DATADIR";
   52|      1|    _filename = "phmodel.txt";
   53|      1|    _subdir = "data";
   54|      1|    _dataptr = PhModelData;
   55|      1|  }
_ZN9OpenBabel9OBPhModelD2Ev:
   58|      1|  {
   59|      1|    vector<OBChemTsfm*>::iterator k;
   60|     39|    for (k = _vtsfm.begin();k != _vtsfm.end();++k)
  ------------------
  |  Branch (60:29): [True: 38, False: 1]
  ------------------
   61|     38|      delete *k;
   62|       |
   63|      1|    vector<pair<OBSmartsPattern*,vector<double> > >::iterator m;
   64|     26|    for (m = _vschrg.begin();m != _vschrg.end();++m)
  ------------------
  |  Branch (64:30): [True: 25, False: 1]
  ------------------
   65|     25|      delete m->first;
   66|      1|  }
_ZN9OpenBabel9OBPhModel9ParseLineEPKc:
   69|     63|  {
   70|     63|    vector<string> vs;
   71|     63|    OBSmartsPattern *sp;
   72|       |
   73|     63|    if (buffer[0] == '#')
  ------------------
  |  Branch (73:9): [True: 0, False: 63]
  ------------------
   74|      0|      return;
   75|       |
   76|     63|    if (EQn(buffer,"TRANSFORM",7))
  ------------------
  |  |  779|     63|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 38, False: 25]
  |  |  ------------------
  ------------------
   77|     38|      {
   78|     38|        tokenize(vs,buffer);
   79|     38|        if (vs.size() < 5)
  ------------------
  |  Branch (79:13): [True: 0, False: 38]
  ------------------
   80|      0|          {
   81|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse line in phmodel table from phmodel.txt", obInfo);
   82|      0|            return;
   83|      0|          }
   84|       |
   85|     38|        OBChemTsfm *tsfm = new OBChemTsfm;
   86|     38|        if (!tsfm->Init(vs[1],vs[3]))
  ------------------
  |  Branch (86:13): [True: 0, False: 38]
  ------------------
   87|      0|          {
   88|      0|            delete tsfm;
   89|      0|            tsfm = nullptr;
   90|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse line in phmodel table from phmodel.txt", obInfo);
   91|      0|            return;
   92|      0|          }
   93|       |
   94|     38|        _vtsfm.push_back(tsfm);
   95|     38|        _vpKa.push_back(atof(vs[4].c_str()));
   96|     38|      }
   97|     25|    else if (EQn(buffer,"SEEDCHARGE",10))
  ------------------
  |  |  779|     25|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 25, False: 0]
  |  |  ------------------
  ------------------
   98|     25|      {
   99|     25|        tokenize(vs,buffer);
  100|     25|        if (vs.size() < 2)
  ------------------
  |  Branch (100:13): [True: 0, False: 25]
  ------------------
  101|      0|          {
  102|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse line in phmodel table from phmodel.txt", obInfo);
  103|      0|            return;
  104|      0|          }
  105|       |
  106|     25|        sp = new OBSmartsPattern;
  107|     25|        if (!sp->Init(vs[1]) || (vs.size()-2) != sp->NumAtoms())
  ------------------
  |  Branch (107:13): [True: 0, False: 25]
  |  Branch (107:33): [True: 0, False: 25]
  ------------------
  108|      0|          {
  109|      0|            delete sp;
  110|      0|            sp = nullptr;
  111|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse line in phmodel table from phmodel.txt", obInfo);
  112|      0|            return;
  113|      0|          }
  114|       |
  115|     25|        vector<double> vf;
  116|     25|        vector<string>::iterator i;
  117|    101|        for (i = vs.begin()+2;i != vs.end();++i)
  ------------------
  |  Branch (117:31): [True: 76, False: 25]
  ------------------
  118|     76|          vf.push_back(atof((char*)i->c_str()));
  119|       |
  120|     25|        _vschrg.push_back(pair<OBSmartsPattern*,vector<double> > (sp,vf));
  121|     25|      }
  122|     63|  }
_ZN9OpenBabel9OBPhModel23AssignSeedPartialChargeERNS_5OBMolE:
  125|    926|  {
  126|    926|    if (!_init)
  ------------------
  |  Branch (126:9): [True: 1, False: 925]
  ------------------
  127|      1|      Init();
  128|       |
  129|    926|    mol.SetPartialChargesPerceived();
  130|    926|    if (!mol.AutomaticPartialCharge())
  ------------------
  |  Branch (130:9): [True: 0, False: 926]
  ------------------
  131|      0|      return;
  132|       |
  133|    926|    vector<pair<OBSmartsPattern*,vector<double> > >::iterator i;
  134|  24.0k|    for (i = _vschrg.begin(); i != _vschrg.end(); ++i) {
  ------------------
  |  Branch (134:31): [True: 23.1k, False: 926]
  ------------------
  135|  23.1k|      std::vector<std::vector<int> > mlist;
  136|  23.1k|      if (i->first->Match(mol, mlist, OBSmartsPattern::AllUnique))
  ------------------
  |  Branch (136:11): [True: 87, False: 23.0k]
  ------------------
  137|     87|      {
  138|     87|        unsigned int k;
  139|     87|        vector<vector<int> >::iterator j;
  140|       |
  141|    462|        for (j = mlist.begin(); j != mlist.end(); ++j)
  ------------------
  |  Branch (141:33): [True: 375, False: 87]
  ------------------
  142|  1.14k|          for (k = 0; k < j->size(); ++k)
  ------------------
  |  Branch (142:23): [True: 772, False: 375]
  ------------------
  143|    772|            mol.GetAtom((*j)[k])->SetPartialCharge(i->second[k]);
  144|     87|      }
  145|  23.1k|    }
  146|    926|  }
_ZN9OpenBabel10OBChemTsfm4InitERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES8_:
  222|     38|  {
  223|     38|    if (!_bgn.Init(bgn))
  ------------------
  |  Branch (223:9): [True: 0, False: 38]
  ------------------
  224|      0|      return(false);
  225|     38|    if (!end.empty())
  ------------------
  |  Branch (225:9): [True: 38, False: 0]
  ------------------
  226|     38|      if (!_end.Init(end))
  ------------------
  |  Branch (226:11): [True: 0, False: 38]
  ------------------
  227|      0|        return(false);
  228|       |
  229|       |    //find atoms to be deleted
  230|     38|    unsigned int i,j;
  231|     38|    int vb;
  232|     38|    bool found;
  233|    308|    for (i = 0;i < _bgn.NumAtoms();++i)
  ------------------
  |  Branch (233:16): [True: 270, False: 38]
  ------------------
  234|    270|      if ((vb = _bgn.GetVectorBinding(i)))
  ------------------
  |  Branch (234:11): [True: 60, False: 210]
  ------------------
  235|     60|        {
  236|     60|          found = false;
  237|    292|          for (j = 0;j < _end.NumAtoms();++j)
  ------------------
  |  Branch (237:22): [True: 289, False: 3]
  ------------------
  238|    289|            if (vb == _end.GetVectorBinding(j))
  ------------------
  |  Branch (238:17): [True: 57, False: 232]
  ------------------
  239|     57|              {
  240|     57|                found = true;
  241|     57|                break;
  242|     57|              }
  243|       |
  244|     60|          if (!found)
  ------------------
  |  Branch (244:15): [True: 3, False: 57]
  ------------------
  245|      3|            _vadel.push_back(i);
  246|     60|        }
  247|       |
  248|       |    //find elements to be changed
  249|     38|    int ele;
  250|    308|    for (i = 0;i < _bgn.NumAtoms();++i)
  ------------------
  |  Branch (250:16): [True: 270, False: 38]
  ------------------
  251|       |      // Allow single-atom transformations without vector bindings
  252|    270|      if ((vb = _bgn.GetVectorBinding(i)) || _bgn.NumAtoms() == 1)
  ------------------
  |  Branch (252:11): [True: 60, False: 210]
  |  Branch (252:46): [True: 0, False: 210]
  ------------------
  253|     60|        {
  254|     60|          ele = _bgn.GetAtomicNum(i);
  255|    415|          for (j = 0;j < _end.NumAtoms();++j)
  ------------------
  |  Branch (255:22): [True: 355, False: 60]
  ------------------
  256|    355|            if (vb == _end.GetVectorBinding(j))
  ------------------
  |  Branch (256:17): [True: 57, False: 298]
  ------------------
  257|     57|              if (ele != _end.GetAtomicNum(j))
  ------------------
  |  Branch (257:19): [True: 0, False: 57]
  ------------------
  258|      0|                {
  259|      0|                  _vele.push_back(pair<int,int> (i,_end.GetAtomicNum(j)));
  260|      0|                  break;
  261|      0|                }
  262|     60|        }
  263|       |
  264|       |    //find charges to modify
  265|     38|    int chrg;
  266|    308|    for (i = 0;i < _bgn.NumAtoms();++i)
  ------------------
  |  Branch (266:16): [True: 270, False: 38]
  ------------------
  267|       |      // Allow single-atom transformations without vector bindings
  268|       |      // PR#2802980.
  269|    270|      if ((vb = _bgn.GetVectorBinding(i)) || _bgn.NumAtoms() == 1)
  ------------------
  |  Branch (269:11): [True: 60, False: 210]
  |  Branch (269:46): [True: 0, False: 210]
  ------------------
  270|     60|        {
  271|     60|          chrg = _bgn.GetCharge(i);
  272|    415|          for (j = 0;j < _end.NumAtoms();++j)
  ------------------
  |  Branch (272:22): [True: 355, False: 60]
  ------------------
  273|    355|            if (vb == _end.GetVectorBinding(j))
  ------------------
  |  Branch (273:17): [True: 57, False: 298]
  ------------------
  274|     57|              if (chrg != _end.GetCharge(j))
  ------------------
  |  Branch (274:19): [True: 45, False: 12]
  ------------------
  275|     45|                _vchrg.push_back(pair<int,int> (i,_end.GetCharge(j)));
  276|     60|        }
  277|       |
  278|       |    //find bonds to be modified
  279|       |    //find bonds to be modified
  280|     38|    int bsrc,bdst,bord,bvb1,bvb2;
  281|     38|    int esrc,edst,eord,evb1,evb2;
  282|       |
  283|    278|    for (i = 0;i < _bgn.NumBonds();++i)
  ------------------
  |  Branch (283:16): [True: 240, False: 38]
  ------------------
  284|    240|      {
  285|    240|        _bgn.GetBond(bsrc,bdst,bord,i);
  286|    240|        bvb1 = _bgn.GetVectorBinding(bsrc);
  287|    240|        bvb2 = _bgn.GetVectorBinding(bdst);
  288|    240|        if (!bvb1 || !bvb2)
  ------------------
  |  Branch (288:13): [True: 208, False: 32]
  |  Branch (288:22): [True: 11, False: 21]
  ------------------
  289|    219|          continue;
  290|       |
  291|     44|        for (j = 0;j < _end.NumBonds();++j)
  ------------------
  |  Branch (291:20): [True: 41, False: 3]
  ------------------
  292|     41|          {
  293|     41|            _end.GetBond(esrc,edst,eord,j);
  294|     41|            evb1 = _end.GetVectorBinding(esrc);
  295|     41|            evb2 = _end.GetVectorBinding(edst);
  296|     41|            if ((bvb1 == evb1 && bvb2 == evb2) || (bvb1 == evb2 && bvb2 == evb1))
  ------------------
  |  Branch (296:18): [True: 19, False: 22]
  |  Branch (296:34): [True: 18, False: 1]
  |  Branch (296:52): [True: 12, False: 11]
  |  Branch (296:68): [True: 0, False: 12]
  ------------------
  297|     18|              {
  298|     18|                if (bord == eord)
  ------------------
  |  Branch (298:21): [True: 9, False: 9]
  ------------------
  299|      9|                  break; //nothing to modify if bond orders identical
  300|      9|                _vbond.push_back(pair<pair<int,int>,int> (pair<int,int> (bsrc,bdst),eord));
  301|      9|                break;
  302|     18|              }
  303|     41|          }
  304|     21|      }
  305|       |
  306|       |    //make sure there is some kind of transform to do here
  307|     38|    if (_vadel.empty() && _vchrg.empty() && _vbond.empty() && _vele.empty())
  ------------------
  |  Branch (307:9): [True: 35, False: 3]
  |  Branch (307:27): [True: 0, False: 35]
  |  Branch (307:45): [True: 0, False: 0]
  |  Branch (307:63): [True: 0, False: 0]
  ------------------
  308|      0|      return(false);
  309|       |
  310|     38|    return(true);
  311|     38|  }

_ZN9OpenBabel8OBPlugin10GetTypeMapEPKc:
   30|      1|{
   31|      1|  PluginMapType::iterator itr;
   32|       |
   33|       |  // Make sure the plugins are loaded
   34|      1|  if (AllPluginsLoaded == 0) {
  ------------------
  |  Branch (34:7): [True: 0, False: 1]
  ------------------
   35|      0|    OBPlugin::LoadAllPlugins();
   36|      0|  }
   37|       |
   38|      1|  itr = PluginMap().find(PluginID);
   39|      1|  if(itr!=PluginMap().end())
  ------------------
  |  Branch (39:6): [True: 0, False: 1]
  ------------------
   40|      0|    return itr->second->GetMap();
   41|      1|  return PluginMap();//error: type not found; return plugins map
   42|      1|}
_ZN9OpenBabel8OBPlugin14LoadAllPluginsEv:
   47|      1|{
   48|      1|  int count = 0;
   49|       |#if  defined(USING_DYNAMIC_LIBS)
   50|       |  // Depending on availability, look successively in
   51|       |  // FORMATFILE_DIR, executable directory or current directory
   52|       |  string TargetDir;
   53|       |
   54|       |#ifdef FORMATFILE_DIR
   55|       |  TargetDir="FORMATFILE_DIR";
   56|       |#endif
   57|       |
   58|       |  DLHandler::getConvDirectory(TargetDir);
   59|       |
   60|       |  vector<string> files;
   61|       |  if(!DLHandler::findFiles(files,DLHandler::getFormatFilePattern(),TargetDir)) {
   62|       |    obErrorLog.ThrowError(__FUNCTION__, "Unable to find OpenBabel plugins. Try setting the BABEL_LIBDIR environment variable.", obError);
   63|       |    return;
   64|       |  }
   65|       |
   66|       |  vector<string>::iterator itr;
   67|       |  for(itr=files.begin();itr!=files.end();++itr) {
   68|       |    if(DLHandler::openLib(*itr))
   69|       |      count++;
   70|       |  }
   71|       |  if(!count) {
   72|       |    string error = "No valid OpenBabel plugs found in "+TargetDir;
   73|       |    obErrorLog.ThrowError(__FUNCTION__, error, obError);
   74|       |    return;
   75|       |  }
   76|       |#else
   77|      1|  count = 1; // Avoid calling this function several times
   78|      1|#endif //USING_DYNAMIC_LIBS
   79|       |
   80|       |  // Status have to be updated now
   81|      1|  AllPluginsLoaded = count;
   82|       |
   83|       |  // Make instances for plugin classes defined in the data file.
   84|       |  // This is hook for OBDefine, but does nothing if it is not loaded
   85|       |  // or if plugindefines.txt is not found.
   86|      1|  OBPlugin* pdef = OBPlugin::GetPlugin("loaders","define");
   87|      1|  if(pdef) {
  ------------------
  |  Branch (87:6): [True: 0, False: 1]
  ------------------
   88|      0|    static vector<string> vec(3);
   89|      0|    vec[1] = string("define");
   90|      0|    vec[2] = string("plugindefines.txt");
   91|      0|    pdef->MakeInstance(vec);
   92|      0|  }
   93|       |
   94|      1|  return;
   95|      1|}
_ZN9OpenBabel8OBPlugin12BaseFindTypeERNSt3__13mapIPKcPS0_NS_11CharPtrLessENS1_9allocatorINS1_4pairIKS4_S5_EEEEEES4_:
   98|  31.5k|{
   99|       |  // Make sure the plugins are loaded
  100|  31.5k|  if (AllPluginsLoaded == 0) {
  ------------------
  |  Branch (100:7): [True: 1, False: 31.5k]
  ------------------
  101|      1|    OBPlugin::LoadAllPlugins();
  102|      1|  }
  103|       |
  104|  31.5k|  if(!ID || !*ID)
  ------------------
  |  Branch (104:6): [True: 0, False: 31.5k]
  |  Branch (104:13): [True: 0, False: 31.5k]
  ------------------
  105|      0|    return nullptr;
  106|  31.5k|  PluginMapType::iterator itr = Map.find(ID);
  107|  31.5k|  if(itr==Map.end())
  ------------------
  |  Branch (107:6): [True: 4, False: 31.5k]
  ------------------
  108|      4|    return nullptr;
  109|  31.5k|  else
  110|  31.5k|    return itr->second;
  111|  31.5k|}
_ZN9OpenBabel8OBPlugin9GetPluginEPKcS2_:
  114|      1|{
  115|      1|  if (Type != nullptr)
  ------------------
  |  Branch (115:7): [True: 1, False: 0]
  ------------------
  116|      1|    return BaseFindType(GetTypeMap(Type), ID);
  117|       |
  118|       |  // Make sure the plugins are loaded
  119|      0|  if (AllPluginsLoaded == 0) {
  ------------------
  |  Branch (119:7): [True: 0, False: 0]
  ------------------
  120|      0|    OBPlugin::LoadAllPlugins();
  121|      0|  }
  122|       |
  123|       |  //When Type==NULL, search all types for matching ID and stop when found
  124|      0|  PluginMapType::iterator itr;
  125|      0|  for(itr=PluginMap().begin();itr!= PluginMap().end();++itr)
  ------------------
  |  Branch (125:31): [True: 0, False: 0]
  ------------------
  126|      0|  {
  127|      0|    OBPlugin* result = BaseFindType(itr->second->GetMap(), ID);
  128|      0|    if(result)
  ------------------
  |  Branch (128:8): [True: 0, False: 0]
  ------------------
  129|      0|      return result;
  130|      0|  }
  131|      0|  return nullptr; //not found
  132|      0|}

_ZNK9OpenBabel10OBRandomMT10randomSeedEv:
  537|      1|  uint_fast64_t OBRandomMT::randomSeed() const {
  538|      1|    auto ob_random_seed = std::getenv("OB_RANDOM_SEED");
  539|      1|    if (ob_random_seed && ob_random_seed[0] != '\0') {
  ------------------
  |  Branch (539:9): [True: 0, False: 1]
  |  Branch (539:27): [True: 0, False: 0]
  ------------------
  540|      0|      return std::atol(ob_random_seed);
  541|      0|    }
  542|       |#if defined(WIN32) || defined(__MINGW32__)
  543|       |    // for VC++ do it this way
  544|       |    time_t ltime;
  545|       |    time(&ltime);
  546|       |    return ltime;
  547|       |#else
  548|      1|    return std::random_device{}();
  549|      1|#endif
  550|      1|  }

_ZN9OpenBabel10OBRandomMTC2Ev:
  112|      1|    OBRandomMT() : OBRandomMT{randomSeed()} {}
_ZN9OpenBabel10OBRandomMTC2Em:
  115|      1|    explicit OBRandomMT(uint_fast64_t seed) {
  116|      1|      prng.reset(new std::mt19937_64{seed});
  117|      1|    }
_ZN9OpenBabel10OBRandomMTD2Ev:
  118|      1|    ~OBRandomMT() = default;
_ZNK9OpenBabel10OBRandomMT11UniformRealIdEET_S2_S2_:
  143|  1.13M|    T UniformReal(T a, T b) const {
  144|  1.13M|      std::uniform_real_distribution<T> u{a, b};
  145|  1.13M|      return u(*prng);
  146|  1.13M|    }

_ZN9OpenBabel23OBReactionFacadePrivate18AssignComponentIdsEb:
   96|     38|  {
   97|     38|    unsigned int compid = 1;
   98|       |
   99|     38|    OBMolAtomDFSIter iter(_mol);
  100|    150|    while(iter) { // for each connected component
  ------------------
  |  Branch (100:11): [True: 112, False: 38]
  ------------------
  101|  3.11k|      do { // for each atom in connected component
  102|  3.11k|        if (wipe || !(iter->HasData("rxncomp")))
  ------------------
  |  Branch (102:13): [True: 3.11k, False: 0]
  |  Branch (102:21): [True: 0, False: 0]
  ------------------
  103|  3.11k|          SetComponentId(&*iter, compid);
  104|  3.11k|      } while ((iter++).next());
  ------------------
  |  Branch (104:16): [True: 3.00k, False: 112]
  ------------------
  105|    112|      compid++;
  106|    112|    }
  107|     38|  }
_ZN9OpenBabel23OBReactionFacadePrivate5SetIdEPKcPNS_6OBAtomEi:
  301|  3.11k|  {
  302|       |    // Note: this replaces any existing data
  303|  3.11k|    OBGenericData *data = atom->GetData(idtype);
  304|  3.11k|    OBPairInteger *pi;
  305|  3.11k|    if (data) {
  ------------------
  |  Branch (305:9): [True: 0, False: 3.11k]
  ------------------
  306|      0|      pi = (OBPairInteger*)data;
  307|      0|      pi->SetValue(idval);
  308|      0|    }
  309|  3.11k|    else {
  310|  3.11k|      pi = new OBPairInteger();
  311|  3.11k|      pi->SetAttribute(idtype);
  312|  3.11k|      pi->SetValue(idval);
  313|  3.11k|      atom->SetData(pi);
  314|  3.11k|    }
  315|  3.11k|  }
_ZN9OpenBabel23OBReactionFacadePrivate14SetComponentIdEPNS_6OBAtomEj:
  318|  3.11k|  {
  319|  3.11k|    SetId("rxncomp", atom, compid);
  320|  3.11k|  }
_ZN9OpenBabel16OBReactionFacadeC2EPNS_5OBMolE:
  331|   243k|  OBReactionFacade::OBReactionFacade(OBMol *mol) : d(new OBReactionFacadePrivate(mol))
  332|   243k|  {
  333|   243k|  };
_ZN9OpenBabel16OBReactionFacadeD2Ev:
  335|   243k|  {
  336|   243k|    delete d;
  337|   243k|  }
_ZN9OpenBabel16OBReactionFacade18AssignComponentIdsEb:
  343|     38|  {
  344|     38|    d->AssignComponentIds(wipe);
  345|     38|  }
_ZN9OpenBabel23OBReactionFacadePrivateC2EPNS_5OBMolE:
   36|   243k|    OBReactionFacadePrivate(OBMol *mol) : _mol(mol), _found_components(false)
   37|   243k|    {
   38|   243k|    }

_ZN9OpenBabel9OBResidue16SetInsertionCodeEc:
  740|  62.3k|  void    OBResidue::SetInsertionCode(const char insertioncode) {
  741|  62.3k|	_insertioncode=insertioncode;
  742|  62.3k|  }
_ZN9OpenBabel9OBResidueC2Ev:
  823|   775k|  {
  824|   775k|    _chain    = 'A';
  825|   775k|    _idx      = 0;
  826|   775k|    _aakey    = 0;
  827|   775k|    _reskey   = OBResidueIndex::UNK;
  828|   775k|    _resnum   = "";
  829|   775k|    _resname  = "";
  830|   775k|    _vdata.clear();
  831|   775k|    _insertioncode=0;
  832|   775k|  }
_ZN9OpenBabel9OBResidueD2Ev:
  850|   775k|  {
  851|   775k|    vector<OBAtom*>::iterator a;
  852|  2.76M|    for ( a = _atoms.begin() ; a != _atoms.end() ; ++a )
  ------------------
  |  Branch (852:32): [True: 1.99M, False: 775k]
  ------------------
  853|  1.99M|      (*a)->SetResidue(nullptr);
  854|   775k|    _atoms.clear();
  855|       |
  856|   775k|  }
_ZN9OpenBabel9OBResidueaSERKS0_:
  865|   712k|  {
  866|   712k|    if (this != &src)
  ------------------
  |  Branch (866:9): [True: 712k, False: 0]
  ------------------
  867|   712k|      {
  868|   712k|        _chain    = src._chain;
  869|   712k|        _aakey    = src._aakey;
  870|   712k|        _reskey   = src._reskey;
  871|   712k|        _resnum   = src._resnum;
  872|   712k|        _resname  = src._resname;
  873|   712k|        _atomid   = src._atomid;
  874|   712k|        _hetatm   = src._hetatm;
  875|   712k|        _sernum   = src._sernum;
  876|   712k|        _insertioncode = src._insertioncode;
  877|   712k|      }
  878|       |
  879|   712k|    return(*this);
  880|   712k|  }
_ZN9OpenBabel9OBResidue7AddAtomEPNS_6OBAtomE:
  887|  1.99M|  {
  888|  1.99M|    if (atom != nullptr)
  ------------------
  |  Branch (888:9): [True: 1.99M, False: 0]
  ------------------
  889|  1.99M|      {
  890|  1.99M|        atom->SetResidue(this);
  891|       |
  892|  1.99M|        _atoms.push_back(atom);
  893|  1.99M|        _atomid.push_back("");
  894|  1.99M|        _hetatm.push_back(false);
  895|  1.99M|        _sernum.push_back(0);
  896|  1.99M|      }
  897|  1.99M|  }
_ZN9OpenBabel9OBResidue10RemoveAtomEPNS_6OBAtomE:
  905|    394|  {
  906|    394|    if (atom == nullptr || _atoms.empty())
  ------------------
  |  Branch (906:9): [True: 0, False: 394]
  |  Branch (906:28): [True: 0, False: 394]
  ------------------
  907|      0|      return;
  908|       |    // Iterate from the back so that erase doesn't shift elements past
  909|       |    // the cursor: an atom may have been AddAtom'd more than once, and
  910|       |    // every occurrence needs to go (otherwise ~OBResidue() later walks
  911|       |    // a stale pointer to the now-destroyed atom).
  912|  4.27k|    for (size_t i = _atoms.size(); i > 0; )
  ------------------
  |  Branch (912:36): [True: 3.88k, False: 394]
  ------------------
  913|  3.88k|      {
  914|  3.88k|        --i;
  915|  3.88k|        if (_atoms[i] == atom)
  ------------------
  |  Branch (915:13): [True: 394, False: 3.48k]
  ------------------
  916|    394|          {
  917|    394|            atom->SetResidue(nullptr);
  918|    394|            _atoms.erase(_atoms.begin() + i);
  919|    394|            _atomid.erase(_atomid.begin() + i);
  920|    394|            _hetatm.erase(_hetatm.begin() + i);
  921|    394|            _sernum.erase(_sernum.begin() + i);
  922|    394|          }
  923|  3.88k|      }
  924|    394|  }
_ZN9OpenBabel9OBResidue8SetChainEc:
  948|  62.3k|  {
  949|  62.3k|    _chain = chain;
  950|  62.3k|  }
_ZN9OpenBabel9OBResidue6SetIdxEj:
  958|   775k|  {
  959|   775k|    _idx = idx;
  960|   775k|  }
_ZN9OpenBabel9OBResidue7SetNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  963|  62.3k|  {
  964|  62.3k|    _resname = name;
  965|  62.3k|    SetResidueKeys(_resname.c_str(), _reskey, _aakey);
  966|  62.3k|  }
_ZN9OpenBabel9OBResidue10SetSegNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  969|  62.3k|  {
  970|  62.3k|    _segname = name;
  971|  62.3k|  }  
_ZN9OpenBabel9OBResidue6SetNumENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  981|  62.3k|  {
  982|  62.3k|    _resnum = resnum;
  983|  62.3k|  }
_ZN9OpenBabel9OBResidue9SetAtomIDEPNS_6OBAtomERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
  986|  1.99M|  {
  987|  50.3M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (987:32): [True: 48.3M, False: 1.99M]
  ------------------
  988|  48.3M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (988:11): [True: 1.99M, False: 46.3M]
  ------------------
  989|  1.99M|        _atomid[i] = id;
  990|  1.99M|  }
_ZN9OpenBabel9OBResidue10SetHetAtomEPNS_6OBAtomEb:
  993|  1.94M|  {
  994|  44.5M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (994:32): [True: 42.5M, False: 1.94M]
  ------------------
  995|  42.5M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (995:11): [True: 1.94M, False: 40.6M]
  ------------------
  996|  1.94M|        _hetatm[i] = hetatm;
  997|  1.94M|  }
_ZN9OpenBabel9OBResidue12SetSerialNumEPNS_6OBAtomEj:
 1000|  1.94M|  {
 1001|  44.4M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (1001:32): [True: 42.5M, False: 1.94M]
  ------------------
 1002|  42.5M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (1002:11): [True: 1.94M, False: 40.5M]
  ------------------
 1003|  1.94M|        _sernum[i] = sernum;
 1004|  1.94M|  }
_ZNK9OpenBabel9OBResidue7GetNameEv:
 1045|  3.72M|  {
 1046|  3.72M|    return _resname;
 1047|  3.72M|  }
_ZNK9OpenBabel9OBResidue10GetSegNameEv:
 1050|   372k|  {
 1051|   372k|    return _segname;
 1052|   372k|  }
_ZN9OpenBabel9OBResidue12GetNumStringEv:
 1055|  1.97M|  {
 1056|  1.97M|    return _resnum;
 1057|  1.97M|  }
_ZNK9OpenBabel9OBResidue8GetChainEv:
 1085|   625k|  {
 1086|   625k|    return _chain;
 1087|   625k|  }
_ZNK9OpenBabel9OBResidue16GetInsertionCodeEv:
 1108|   381k|  {
 1109|   381k|    return(_insertioncode);
 1110|   381k|  }
_ZNK9OpenBabel9OBResidue9GetAtomIDEPNS_6OBAtomE:
 1113|  2.09M|  {
 1114|  55.8M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (1114:32): [True: 55.8M, False: 0]
  ------------------
 1115|  55.8M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (1115:11): [True: 2.09M, False: 53.7M]
  ------------------
 1116|  2.09M|        return _atomid[i];
 1117|      0|    return "";
 1118|  2.09M|  }
_ZNK9OpenBabel9OBResidue12GetSerialNumEPNS_6OBAtomE:
 1121|  1.71M|  {
 1122|  43.7M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (1122:32): [True: 43.7M, False: 0]
  ------------------
 1123|  43.7M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (1123:11): [True: 1.71M, False: 42.0M]
  ------------------
 1124|  1.71M|        return _sernum[i];
 1125|      0|    return 0;
 1126|  1.71M|  }
_ZNK9OpenBabel9OBResidue9IsHetAtomEPNS_6OBAtomE:
 1129|  1.71M|  {
 1130|  44.5M|    for ( unsigned int i = 0 ; i < _atoms.size() ; ++i )
  ------------------
  |  Branch (1130:32): [True: 44.5M, False: 0]
  ------------------
 1131|  44.5M|      if (_atoms[i] == atom)
  ------------------
  |  Branch (1131:11): [True: 1.71M, False: 42.7M]
  ------------------
 1132|  1.71M|        return _hetatm[i];
 1133|      0|    return false;
 1134|  1.71M|  }
_ZN9OpenBabel9OBResidue9BeginAtomERNSt3__111__wrap_iterIPPNS_6OBAtomEEE:
 1141|   515k|  {
 1142|   515k|    i = _atoms.begin();
 1143|   515k|    return ((i == _atoms.end()) ? nullptr : *i);
  ------------------
  |  Branch (1143:13): [True: 233, False: 515k]
  ------------------
 1144|   515k|  }
_ZN9OpenBabel9OBResidue8NextAtomERNSt3__111__wrap_iterIPPNS_6OBAtomEEE:
 1147|  1.22M|  {
 1148|  1.22M|    ++i;
 1149|  1.22M|    return ((i == _atoms.end()) ? nullptr : *i);
  ------------------
  |  Branch (1149:13): [True: 515k, False: 713k]
  ------------------
 1150|  1.22M|  }
residue.cpp:_ZN9OpenBabelL14SetResidueKeysEPKcRjS2_:
  748|  62.3k|  {
  749|  62.3k|    reskey = GetResidueNumber(residue);
  750|  62.3k|    switch(reskey)
  751|  62.3k|      {
  752|     26|      case OBResidueIndex::ALA:
  ------------------
  |  Branch (752:7): [True: 26, False: 62.3k]
  ------------------
  753|     26|        aakey = AA_ALA;
  ------------------
  |  |  208|     26|#define AA_ALA (1<<1)
  ------------------
  754|     26|        break;
  755|     14|      case OBResidueIndex::GLY:
  ------------------
  |  Branch (755:7): [True: 14, False: 62.3k]
  ------------------
  756|     14|        aakey = AA_GLY;
  ------------------
  |  |  209|     14|#define AA_GLY (1<<2)
  ------------------
  757|     14|        break;
  758|     12|      case OBResidueIndex::LEU:
  ------------------
  |  Branch (758:7): [True: 12, False: 62.3k]
  ------------------
  759|     12|        aakey = AA_LEU;
  ------------------
  |  |  210|     12|#define AA_LEU (1<<3)
  ------------------
  760|     12|        break;
  761|     39|      case OBResidueIndex::SER:
  ------------------
  |  Branch (761:7): [True: 39, False: 62.3k]
  ------------------
  762|     39|        aakey = AA_SER;
  ------------------
  |  |  211|     39|#define AA_SER (1<<4)
  ------------------
  763|     39|        break;
  764|     19|      case OBResidueIndex::VAL:
  ------------------
  |  Branch (764:7): [True: 19, False: 62.3k]
  ------------------
  765|     19|        aakey = AA_VAL;
  ------------------
  |  |  212|     19|#define AA_VAL (1<<5)
  ------------------
  766|     19|        break;
  767|      3|      case OBResidueIndex::THR:
  ------------------
  |  Branch (767:7): [True: 3, False: 62.3k]
  ------------------
  768|      3|        aakey = AA_THR;
  ------------------
  |  |  213|      3|#define AA_THR (1<<6)
  ------------------
  769|      3|        break;
  770|     19|      case OBResidueIndex::LYS:
  ------------------
  |  Branch (770:7): [True: 19, False: 62.3k]
  ------------------
  771|     19|        aakey = AA_LYS;
  ------------------
  |  |  214|     19|#define AA_LYS (1<<7)
  ------------------
  772|     19|        break;
  773|      9|      case OBResidueIndex::ASP:
  ------------------
  |  Branch (773:7): [True: 9, False: 62.3k]
  ------------------
  774|      9|        aakey = AA_ASP;
  ------------------
  |  |  215|      9|#define AA_ASP (1<<8)
  ------------------
  775|      9|        break;
  776|     10|      case OBResidueIndex::ILE:
  ------------------
  |  Branch (776:7): [True: 10, False: 62.3k]
  ------------------
  777|     10|        aakey = AA_ILE;
  ------------------
  |  |  216|     10|#define AA_ILE (1<<9)
  ------------------
  778|     10|        break;
  779|     23|      case OBResidueIndex::ASN:
  ------------------
  |  Branch (779:7): [True: 23, False: 62.3k]
  ------------------
  780|     23|        aakey = AA_ASN;
  ------------------
  |  |  217|     23|#define AA_ASN (1<<10)
  ------------------
  781|     23|        break;
  782|      3|      case OBResidueIndex::GLU:
  ------------------
  |  Branch (782:7): [True: 3, False: 62.3k]
  ------------------
  783|      3|        aakey = AA_GLU;
  ------------------
  |  |  218|      3|#define AA_GLU (1<<11)
  ------------------
  784|      3|        break;
  785|     12|      case OBResidueIndex::PRO:
  ------------------
  |  Branch (785:7): [True: 12, False: 62.3k]
  ------------------
  786|     12|        aakey = AA_PRO;
  ------------------
  |  |  219|     12|#define AA_PRO (1<<12)
  ------------------
  787|     12|        break;
  788|      1|      case OBResidueIndex::ARG:
  ------------------
  |  Branch (788:7): [True: 1, False: 62.3k]
  ------------------
  789|      1|        aakey = AA_ARG;
  ------------------
  |  |  220|      1|#define AA_ARG (1<<13)
  ------------------
  790|      1|        break;
  791|      1|      case OBResidueIndex::PHE:
  ------------------
  |  Branch (791:7): [True: 1, False: 62.3k]
  ------------------
  792|      1|        aakey = AA_PHE;
  ------------------
  |  |  221|      1|#define AA_PHE (1<<14)
  ------------------
  793|      1|        break;
  794|     11|      case OBResidueIndex::GLN:
  ------------------
  |  Branch (794:7): [True: 11, False: 62.3k]
  ------------------
  795|     11|        aakey = AA_GLN;
  ------------------
  |  |  222|     11|#define AA_GLN (1<<15)
  ------------------
  796|     11|        break;
  797|      1|      case OBResidueIndex::TYR:
  ------------------
  |  Branch (797:7): [True: 1, False: 62.3k]
  ------------------
  798|      1|        aakey = AA_TYR;
  ------------------
  |  |  223|      1|#define AA_TYR (1<<16)
  ------------------
  799|      1|        break;
  800|  1.60k|      case OBResidueIndex::HIS:
  ------------------
  |  Branch (800:7): [True: 1.60k, False: 60.7k]
  ------------------
  801|  1.60k|        aakey = AA_HIS;
  ------------------
  |  |  224|  1.60k|#define AA_HIS (1<<17)
  ------------------
  802|  1.60k|        break;
  803|     52|      case OBResidueIndex::CYS:
  ------------------
  |  Branch (803:7): [True: 52, False: 62.3k]
  ------------------
  804|     52|        aakey = AA_CYS;
  ------------------
  |  |  225|     52|#define AA_CYS (1<<18)
  ------------------
  805|     52|        break;
  806|     26|      case OBResidueIndex::MET:
  ------------------
  |  Branch (806:7): [True: 26, False: 62.3k]
  ------------------
  807|     26|        aakey = AA_MET;
  ------------------
  |  |  226|     26|#define AA_MET (1<<19)
  ------------------
  808|     26|        break;
  809|     31|      case OBResidueIndex::TRP:
  ------------------
  |  Branch (809:7): [True: 31, False: 62.3k]
  ------------------
  810|     31|        aakey = AA_TRP;
  ------------------
  |  |  227|     31|#define AA_TRP (1<<20)
  ------------------
  811|     31|        break;
  812|  60.4k|      default:
  ------------------
  |  Branch (812:7): [True: 60.4k, False: 1.91k]
  ------------------
  813|  60.4k|        aakey = 0;
  814|  60.4k|        break;
  815|  62.3k|      }
  816|  62.3k|  }
residue.cpp:_ZN9OpenBabelL16GetResidueNumberEPKc:
  341|  62.3k|  {
  342|  62.3k|    if (res != nullptr && strlen(res) > 2)
  ------------------
  |  Branch (342:9): [True: 62.3k, False: 0]
  |  Branch (342:27): [True: 61.6k, False: 739]
  ------------------
  343|  61.6k|      {
  344|  61.6k|        int ch1 = toupper(res[0]);
  345|  61.6k|        int ch2 = toupper(res[1]);
  346|  61.6k|        int ch3 = toupper(res[2]);
  347|       |
  348|  61.6k|        switch( ch1 )
  ------------------
  |  Branch (348:17): [True: 38.8k, False: 22.7k]
  ------------------
  349|  61.6k|          {
  350|      0|          case(' '):
  ------------------
  |  Branch (350:11): [True: 0, False: 61.6k]
  ------------------
  351|       |
  352|      0|            if( ch2 == ' ' )
  ------------------
  |  Branch (352:17): [True: 0, False: 0]
  ------------------
  353|      0|              {
  354|      0|                switch( ch3 )
  ------------------
  |  Branch (354:25): [True: 0, False: 0]
  ------------------
  355|      0|                  {
  356|      0|                  case('A'):  return( 24 );
  ------------------
  |  Branch (356:19): [True: 0, False: 0]
  ------------------
  357|      0|                  case('C'):  return( 25 );
  ------------------
  |  Branch (357:19): [True: 0, False: 0]
  ------------------
  358|      0|                  case('G'):  return( 26 );
  ------------------
  |  Branch (358:19): [True: 0, False: 0]
  ------------------
  359|      0|                  case('T'):  return( 27 );
  ------------------
  |  Branch (359:19): [True: 0, False: 0]
  ------------------
  360|      0|                  case('U'):  return( 28 );
  ------------------
  |  Branch (360:19): [True: 0, False: 0]
  ------------------
  361|      0|                  case('I'):  return( 30 );
  ------------------
  |  Branch (361:19): [True: 0, False: 0]
  ------------------
  362|      0|                  }
  363|      0|              }
  364|      0|            else if( ch2 == '+' )
  ------------------
  |  Branch (364:22): [True: 0, False: 0]
  ------------------
  365|      0|              {
  366|      0|                if( ch3 == 'U' )
  ------------------
  |  Branch (366:21): [True: 0, False: 0]
  ------------------
  367|      0|                  return( 29 );
  368|      0|              }
  369|      0|            else if( ch2 == 'Y' )
  ------------------
  |  Branch (369:22): [True: 0, False: 0]
  ------------------
  370|      0|              {
  371|      0|                if( ch3 == 'G' )
  ------------------
  |  Branch (371:21): [True: 0, False: 0]
  ------------------
  372|      0|                  return( 39 );
  373|      0|              }
  374|       |
  375|      0|            break;
  376|       |
  377|    382|          case('0'):
  ------------------
  |  Branch (377:11): [True: 382, False: 61.2k]
  ------------------
  378|       |
  379|    382|            if( ch2 == 'M' )
  ------------------
  |  Branch (379:17): [True: 38, False: 344]
  ------------------
  380|     38|              {
  381|     38|                if( ch3 == 'C' )
  ------------------
  |  Branch (381:21): [True: 17, False: 21]
  ------------------
  382|     17|                  return( 33 );
  383|     21|                else if( ch3 == 'G' )
  ------------------
  |  Branch (383:26): [True: 11, False: 10]
  ------------------
  384|     11|                  return( 38 );
  385|     38|              }
  386|       |
  387|    354|            break;
  388|       |
  389|  2.46k|          case('1'):
  ------------------
  |  Branch (389:11): [True: 2.46k, False: 59.1k]
  ------------------
  390|       |
  391|  2.46k|            if( ch2 == 'M' )
  ------------------
  |  Branch (391:17): [True: 24, False: 2.43k]
  ------------------
  392|     24|              {
  393|     24|                if( ch3 == 'A' )
  ------------------
  |  Branch (393:21): [True: 1, False: 23]
  ------------------
  394|      1|                  return( 31 );
  395|     23|                else if( ch3 == 'G' )
  ------------------
  |  Branch (395:26): [True: 10, False: 13]
  ------------------
  396|     10|                  return( 34 );
  397|     24|              }
  398|       |
  399|  2.44k|            break;
  400|       |
  401|  2.44k|          case('2'):
  ------------------
  |  Branch (401:11): [True: 679, False: 60.9k]
  ------------------
  402|       |
  403|    679|            if( ch2 == 'M' )
  ------------------
  |  Branch (403:17): [True: 2, False: 677]
  ------------------
  404|      2|              if( ch3 == 'G' )
  ------------------
  |  Branch (404:19): [True: 1, False: 1]
  ------------------
  405|      1|                return( 35 );
  406|       |
  407|    678|            break;
  408|       |
  409|    678|          case('5'):
  ------------------
  |  Branch (409:11): [True: 72, False: 61.5k]
  ------------------
  410|       |
  411|     72|            if( ch2 == 'M' )
  ------------------
  |  Branch (411:17): [True: 6, False: 66]
  ------------------
  412|      6|              {
  413|      6|                if( ch3 == 'C' )
  ------------------
  |  Branch (413:21): [True: 3, False: 3]
  ------------------
  414|      3|                  return( 32 );
  415|      3|                else if( ch3 == 'U' )
  ------------------
  |  Branch (415:26): [True: 1, False: 2]
  ------------------
  416|      1|                  return( 41 );
  417|      6|              }
  418|       |
  419|     68|            break;
  420|       |
  421|  3.05k|          case('7'):
  ------------------
  |  Branch (421:11): [True: 3.05k, False: 58.5k]
  ------------------
  422|       |
  423|  3.05k|            if( ch2 == 'M' )
  ------------------
  |  Branch (423:17): [True: 38, False: 3.01k]
  ------------------
  424|     38|              if( ch3 == 'G' )
  ------------------
  |  Branch (424:19): [True: 13, False: 25]
  ------------------
  425|     13|                return( 37 );
  426|       |
  427|  3.04k|            break;
  428|       |
  429|  3.04k|          case('A'):
  ------------------
  |  Branch (429:11): [True: 900, False: 60.7k]
  ------------------
  430|       |
  431|    900|            if( ch2 == 'L' )
  ------------------
  |  Branch (431:17): [True: 46, False: 854]
  ------------------
  432|     46|              {
  433|     46|                if( ch3 == 'A' )
  ------------------
  |  Branch (433:21): [True: 26, False: 20]
  ------------------
  434|     26|                  return(  0 );
  435|     46|              }
  436|    854|            else if( ch2 == 'S' )
  ------------------
  |  Branch (436:22): [True: 74, False: 780]
  ------------------
  437|     74|              {
  438|     74|                if( ch3 == 'P' )
  ------------------
  |  Branch (438:21): [True: 9, False: 65]
  ------------------
  439|      9|                  return(  7 );
  440|     65|                else if( ch3 == 'N' )
  ------------------
  |  Branch (440:26): [True: 23, False: 42]
  ------------------
  441|     23|                  return(  9 );
  442|     42|                else if( ch3 == 'X' )
  ------------------
  |  Branch (442:26): [True: 6, False: 36]
  ------------------
  443|      6|                  return( 20 );
  444|     74|              }
  445|    780|            else if( ch2 == 'R' )
  ------------------
  |  Branch (445:22): [True: 8, False: 772]
  ------------------
  446|      8|              {
  447|      8|                if( ch3 == 'G' )
  ------------------
  |  Branch (447:21): [True: 1, False: 7]
  ------------------
  448|      1|                  return( 12 );
  449|      8|              }
  450|    772|            else if( ch2 == 'C' )
  ------------------
  |  Branch (450:22): [True: 188, False: 584]
  ------------------
  451|    188|              {
  452|    188|                if( ch3 == 'E' )
  ------------------
  |  Branch (452:21): [True: 27, False: 161]
  ------------------
  453|     27|                  return( 44 );
  454|    188|              }
  455|    584|            else if( ch2 == 'D' )
  ------------------
  |  Branch (455:22): [True: 33, False: 551]
  ------------------
  456|     33|              {
  457|     33|                if( ch3 == 'E' )
  ------------------
  |  Branch (457:21): [True: 23, False: 10]
  ------------------
  458|     23|                  return( 24 );    /* "ADE" -> "  A" */
  459|     33|              }
  460|       |
  461|    785|            break;
  462|       |
  463|  2.95k|          case('C'):
  ------------------
  |  Branch (463:11): [True: 2.95k, False: 58.6k]
  ------------------
  464|       |
  465|  2.95k|            if( ch2 == 'Y' )
  ------------------
  |  Branch (465:17): [True: 62, False: 2.89k]
  ------------------
  466|     62|              {
  467|     62|                if( ch3 == 'S' )
  ------------------
  |  Branch (467:21): [True: 22, False: 40]
  ------------------
  468|     22|                  return( 17 );
  469|     40|                else if( ch3 == 'H' )
  ------------------
  |  Branch (469:26): [True: 10, False: 30]
  ------------------
  470|     10|                  return( 17 );    /* "CYH" -> "CYS" */
  471|     30|                else if( ch3 == 'T' )
  ------------------
  |  Branch (471:26): [True: 3, False: 27]
  ------------------
  472|      3|                  return( 25 );    /* "CYT" -> "  C" */
  473|     62|              }
  474|  2.89k|            else if( ch2 == 'O' )
  ------------------
  |  Branch (474:22): [True: 31, False: 2.85k]
  ------------------
  475|     31|              {
  476|     31|                if( ch3 == 'A' )
  ------------------
  |  Branch (476:21): [True: 20, False: 11]
  ------------------
  477|     20|                  return( 51 );
  478|     31|              }
  479|  2.85k|            else if( ch2 == 'P' )
  ------------------
  |  Branch (479:22): [True: 159, False: 2.70k]
  ------------------
  480|    159|              {
  481|    159|                if( ch3 == 'R' )
  ------------------
  |  Branch (481:21): [True: 11, False: 148]
  ------------------
  482|     11|                  return( 11 );    /* "CPR" -> "PRO" */
  483|    159|              }
  484|  2.70k|            else if( ch2 == 'S' )
  ------------------
  |  Branch (484:22): [True: 168, False: 2.53k]
  ------------------
  485|    168|              {
  486|    168|                if( ch3 == 'H' )
  ------------------
  |  Branch (486:21): [True: 10, False: 158]
  ------------------
  487|     10|                  return( 17 );    /* "CSH" -> "CYS" */
  488|    158|                else if( ch3 == 'M' )
  ------------------
  |  Branch (488:26): [True: 10, False: 148]
  ------------------
  489|     10|                  return( 17 );    /* "CSM" -> "CYS" */
  490|    168|              }
  491|       |
  492|  2.86k|            break;
  493|       |
  494|  2.86k|          case('D'):
  ------------------
  |  Branch (494:11): [True: 268, False: 61.3k]
  ------------------
  495|       |
  496|    268|            if( ch2 == 'O' )
  ------------------
  |  Branch (496:17): [True: 20, False: 248]
  ------------------
  497|     20|              {
  498|     20|                if( ch3 == 'D' )
  ------------------
  |  Branch (498:21): [True: 8, False: 12]
  ------------------
  499|      8|                  return( 47 );
  500|     20|              }
  501|    248|            else if( ch2 == '2' )
  ------------------
  |  Branch (501:22): [True: 13, False: 235]
  ------------------
  502|     13|              {
  503|     13|                if( ch3 == 'O' )
  ------------------
  |  Branch (503:21): [True: 1, False: 12]
  ------------------
  504|      1|                  return( 47 );    /* "D2O" -> "DOD" */
  505|     13|              }
  506|       |
  507|    259|            break;
  508|       |
  509|  1.37k|          case('F'):
  ------------------
  |  Branch (509:11): [True: 1.37k, False: 60.2k]
  ------------------
  510|       |
  511|  1.37k|            if( ch2 == 'O' )
  ------------------
  |  Branch (511:17): [True: 35, False: 1.33k]
  ------------------
  512|     35|              if( ch3 == 'R' )
  ------------------
  |  Branch (512:19): [True: 14, False: 21]
  ------------------
  513|     14|                return( 45 );
  514|       |
  515|  1.35k|            break;
  516|       |
  517|  1.35k|          case('G'):
  ------------------
  |  Branch (517:11): [True: 213, False: 61.4k]
  ------------------
  518|       |
  519|    213|            if( ch2 == 'L' )
  ------------------
  |  Branch (519:17): [True: 97, False: 116]
  ------------------
  520|     97|              {
  521|     97|                if( ch3 == 'Y' )
  ------------------
  |  Branch (521:21): [True: 14, False: 83]
  ------------------
  522|     14|                  return(  1 );
  523|     83|                else if( ch3 == 'U' )
  ------------------
  |  Branch (523:26): [True: 3, False: 80]
  ------------------
  524|      3|                  return( 10 );
  525|     80|                else if( ch3 == 'N' )
  ------------------
  |  Branch (525:26): [True: 11, False: 69]
  ------------------
  526|     11|                  return( 14 );
  527|     69|                else if( ch3 == 'X' )
  ------------------
  |  Branch (527:26): [True: 16, False: 53]
  ------------------
  528|     16|                  return( 21 );
  529|     97|              }
  530|    116|            else if( ch2 == 'U' )
  ------------------
  |  Branch (530:22): [True: 3, False: 113]
  ------------------
  531|      3|              {
  532|      3|                if( ch3 == 'A' )
  ------------------
  |  Branch (532:21): [True: 0, False: 3]
  ------------------
  533|      0|                  return( 26 );    /* "GUA" -> "  G" */
  534|      3|              }
  535|       |
  536|    169|            break;
  537|       |
  538|  2.74k|          case('H'):
  ------------------
  |  Branch (538:11): [True: 2.74k, False: 58.8k]
  ------------------
  539|       |
  540|  2.74k|            if( ch2 == 'I' )
  ------------------
  |  Branch (540:17): [True: 2.12k, False: 626]
  ------------------
  541|  2.12k|              {
  542|  2.12k|                if( ch3 == 'S' )
  ------------------
  |  Branch (542:21): [True: 1.60k, False: 514]
  ------------------
  543|  1.60k|                  return( 16 );
  544|  2.12k|              }
  545|    626|            else if( ch2 == 'O' )
  ------------------
  |  Branch (545:22): [True: 18, False: 608]
  ------------------
  546|     18|              {
  547|     18|                if( ch3 == 'H' )
  ------------------
  |  Branch (547:21): [True: 10, False: 8]
  ------------------
  548|     10|                  return( 46 );
  549|     18|              }
  550|    608|            else if( ch2 == 'Y' )
  ------------------
  |  Branch (550:22): [True: 15, False: 593]
  ------------------
  551|     15|              {
  552|     15|                if( ch3 == 'P' )
  ------------------
  |  Branch (552:21): [True: 1, False: 14]
  ------------------
  553|      1|                  return( 23 );
  554|     15|              }
  555|    593|            else if( ch2 == '2' )
  ------------------
  |  Branch (555:22): [True: 43, False: 550]
  ------------------
  556|     43|              {
  557|     43|                if( ch3 == 'O' )
  ------------------
  |  Branch (557:21): [True: 14, False: 29]
  ------------------
  558|     14|                  return( 46 );    /* "H20" -> "HOH" */
  559|     29|                else if( ch3 == 'U' )
  ------------------
  |  Branch (559:26): [True: 10, False: 19]
  ------------------
  560|     10|                  return( 40 );
  561|     43|              }
  562|       |
  563|  1.10k|            break;
  564|       |
  565|  1.10k|          case('I'):
  ------------------
  |  Branch (565:11): [True: 330, False: 61.3k]
  ------------------
  566|       |
  567|    330|            if( ch2 == 'L' )
  ------------------
  |  Branch (567:17): [True: 10, False: 320]
  ------------------
  568|     10|              if( ch3 == 'E' )
  ------------------
  |  Branch (568:19): [True: 10, False: 0]
  ------------------
  569|     10|                return(  8 );
  570|       |
  571|    320|            break;
  572|       |
  573|    434|          case('L'):
  ------------------
  |  Branch (573:11): [True: 434, False: 61.2k]
  ------------------
  574|       |
  575|    434|            if( ch2 == 'E' )
  ------------------
  |  Branch (575:17): [True: 25, False: 409]
  ------------------
  576|     25|              {
  577|     25|                if( ch3 == 'U' )
  ------------------
  |  Branch (577:21): [True: 12, False: 13]
  ------------------
  578|     12|                  return(  2 );
  579|     25|              }
  580|    409|            else if( ch2 == 'Y' )
  ------------------
  |  Branch (580:22): [True: 35, False: 374]
  ------------------
  581|     35|              {
  582|     35|                if( ch3 == 'S' )
  ------------------
  |  Branch (582:21): [True: 19, False: 16]
  ------------------
  583|     19|                  return(  6 );
  584|     35|              }
  585|       |
  586|    403|            break;
  587|       |
  588|    403|          case('M'):
  ------------------
  |  Branch (588:11): [True: 204, False: 61.4k]
  ------------------
  589|       |
  590|    204|            if( ch2 == 'E' )
  ------------------
  |  Branch (590:17): [True: 43, False: 161]
  ------------------
  591|     43|              {
  592|     43|                if( ch3 == 'T' )
  ------------------
  |  Branch (592:21): [True: 26, False: 17]
  ------------------
  593|     26|                  return( 18 );
  594|     43|              }
  595|    161|            else if( ch2 == '2' )
  ------------------
  |  Branch (595:22): [True: 26, False: 135]
  ------------------
  596|     26|              {
  597|     26|                if( ch3 == 'G' )
  ------------------
  |  Branch (597:21): [True: 0, False: 26]
  ------------------
  598|      0|                  return( 36 );
  599|     26|              }
  600|       |
  601|    178|            break;
  602|       |
  603|  2.82k|          case('N'):
  ------------------
  |  Branch (603:11): [True: 2.82k, False: 58.8k]
  ------------------
  604|       |
  605|  2.82k|            if( ch2 == 'A' )
  ------------------
  |  Branch (605:17): [True: 177, False: 2.64k]
  ------------------
  606|    177|              {
  607|    177|                if( ch3 == 'D' )
  ------------------
  |  Branch (607:21): [True: 38, False: 139]
  ------------------
  608|     38|                  return( 50 );
  609|    139|                else if( ch3 == 'P' )
  ------------------
  |  Branch (609:26): [True: 3, False: 136]
  ------------------
  610|      3|                  return( 52 );
  611|    177|              }
  612|  2.64k|            else if( ch2 == 'D' )
  ------------------
  |  Branch (612:22): [True: 28, False: 2.61k]
  ------------------
  613|     28|              {
  614|     28|                if( ch3 == 'P' )
  ------------------
  |  Branch (614:21): [True: 16, False: 12]
  ------------------
  615|     16|                  return( 53 );
  616|     28|              }
  617|       |
  618|  2.76k|            break;
  619|       |
  620|  2.76k|          case('P'):
  ------------------
  |  Branch (620:11): [True: 780, False: 60.8k]
  ------------------
  621|       |
  622|    780|            if( ch2 == 'R' )
  ------------------
  |  Branch (622:17): [True: 51, False: 729]
  ------------------
  623|     51|              {
  624|     51|                if( ch3 == 'O' )
  ------------------
  |  Branch (624:21): [True: 1, False: 50]
  ------------------
  625|      1|                  return( 11 );
  626|     51|              }
  627|    729|            else if( ch2 == 'H' )
  ------------------
  |  Branch (627:22): [True: 3, False: 726]
  ------------------
  628|      3|              {
  629|      3|                if( ch3 == 'E' )
  ------------------
  |  Branch (629:21): [True: 1, False: 2]
  ------------------
  630|      1|                  return( 13 );
  631|      3|              }
  632|    726|            else if( ch2 == 'C' )
  ------------------
  |  Branch (632:22): [True: 108, False: 618]
  ------------------
  633|    108|              {
  634|    108|                if( ch3 == 'A' )
  ------------------
  |  Branch (634:21): [True: 10, False: 98]
  ------------------
  635|     10|                  return( 22 );
  636|    108|              }
  637|    618|            else if( ch2 == 'O' )
  ------------------
  |  Branch (637:22): [True: 21, False: 597]
  ------------------
  638|     21|              {
  639|     21|                if( ch3 == '4' )
  ------------------
  |  Branch (639:21): [True: 0, False: 21]
  ------------------
  640|      0|                  return( 49 );
  641|     21|              }
  642|    597|            else if( ch2 == 'S' )
  ------------------
  |  Branch (642:22): [True: 58, False: 539]
  ------------------
  643|     58|              {
  644|     58|                if( ch3 == 'U' )
  ------------------
  |  Branch (644:21): [True: 1, False: 57]
  ------------------
  645|      1|                  return( 42 );
  646|     58|              }
  647|       |
  648|    767|            break;
  649|       |
  650|  2.95k|          case('S'):
  ------------------
  |  Branch (650:11): [True: 2.95k, False: 58.6k]
  ------------------
  651|       |
  652|  2.95k|            if( ch2 == 'E' )
  ------------------
  |  Branch (652:17): [True: 50, False: 2.90k]
  ------------------
  653|     50|              {
  654|     50|                if( ch3 == 'R' )
  ------------------
  |  Branch (654:21): [True: 39, False: 11]
  ------------------
  655|     39|                  return(  3 );
  656|     50|              }
  657|  2.90k|            else if( ch2 == 'O' )
  ------------------
  |  Branch (657:22): [True: 115, False: 2.78k]
  ------------------
  658|    115|              {
  659|    115|                if( ch3 == '4' )
  ------------------
  |  Branch (659:21): [True: 1, False: 114]
  ------------------
  660|      1|                  return( 48 );
  661|    114|                else if( ch3 == 'L' )
  ------------------
  |  Branch (661:26): [True: 103, False: 11]
  ------------------
  662|    103|                  return( 46 );    /* "SOL" -> "HOH" */
  663|    115|              }
  664|  2.78k|            else if( ch2 == 'U' )
  ------------------
  |  Branch (664:22): [True: 126, False: 2.66k]
  ------------------
  665|    126|              {
  666|    126|                if( ch3 == 'L' )
  ------------------
  |  Branch (666:21): [True: 8, False: 118]
  ------------------
  667|      8|                  return( 48 );    /* "SUL" -> "SO4" */
  668|    126|              }
  669|       |
  670|  2.80k|            break;
  671|       |
  672|  2.80k|          case('T'):
  ------------------
  |  Branch (672:11): [True: 444, False: 61.2k]
  ------------------
  673|       |
  674|    444|            if( ch2 == 'H' )
  ------------------
  |  Branch (674:17): [True: 53, False: 391]
  ------------------
  675|     53|              {
  676|     53|                if( ch3 == 'R' )
  ------------------
  |  Branch (676:21): [True: 3, False: 50]
  ------------------
  677|      3|                  return(  5 );
  678|     50|                else if( ch3 == 'Y' )
  ------------------
  |  Branch (678:26): [True: 12, False: 38]
  ------------------
  679|     12|                  return( 27 );    /* "THY" -> "  T" */
  680|     53|              }
  681|    391|            else if( ch2 == 'Y' )
  ------------------
  |  Branch (681:22): [True: 30, False: 361]
  ------------------
  682|     30|              {
  683|     30|                if( ch3 == 'R' )
  ------------------
  |  Branch (683:21): [True: 1, False: 29]
  ------------------
  684|      1|                  return( 15 );
  685|     30|              }
  686|    361|            else if( ch2 == 'R' )
  ------------------
  |  Branch (686:22): [True: 39, False: 322]
  ------------------
  687|     39|              {
  688|     39|                if( ch3 == 'P' )
  ------------------
  |  Branch (688:21): [True: 30, False: 9]
  ------------------
  689|     30|                  return( 19 );
  690|      9|                else if( ch3 == 'Y' )
  ------------------
  |  Branch (690:26): [True: 1, False: 8]
  ------------------
  691|      1|                  return( 19 );    /* "TRY" -> "TRP" */
  692|     39|              }
  693|    322|            else if( ch2 == 'I' )
  ------------------
  |  Branch (693:22): [True: 114, False: 208]
  ------------------
  694|    114|              {
  695|    114|                if( ch3 == 'P' )
  ------------------
  |  Branch (695:21): [True: 72, False: 42]
  ------------------
  696|     72|                  return( 46 );    /* "TIP" -> "HOH" */
  697|    114|              }
  698|       |
  699|    325|            break;
  700|       |
  701|  15.4k|          case('U'):
  ------------------
  |  Branch (701:11): [True: 15.4k, False: 46.1k]
  ------------------
  702|       |
  703|  15.4k|            if( ch2 == 'N' )
  ------------------
  |  Branch (703:17): [True: 398, False: 15.0k]
  ------------------
  704|    398|              {
  705|    398|                if( ch3 == 'K' )
  ------------------
  |  Branch (705:21): [True: 179, False: 219]
  ------------------
  706|    179|                  return( 43 );
  707|    398|              }
  708|  15.0k|            else if( ch2 == 'R' )
  ------------------
  |  Branch (708:22): [True: 116, False: 14.9k]
  ------------------
  709|    116|              {
  710|    116|                if( ch3 == 'A' )
  ------------------
  |  Branch (710:21): [True: 12, False: 104]
  ------------------
  711|     12|                  return( 28 );    /* "URA" -> "  U" */
  712|    104|                else if( ch3 == 'I' )
  ------------------
  |  Branch (712:26): [True: 12, False: 92]
  ------------------
  713|     12|                  return( 28 );    /* "URI" -> "  U" */
  714|    116|              }
  715|       |
  716|  15.2k|            break;
  717|       |
  718|  15.2k|          case('V'):
  ------------------
  |  Branch (718:11): [True: 92, False: 61.5k]
  ------------------
  719|       |
  720|     92|            if( ch2 == 'A' )
  ------------------
  |  Branch (720:17): [True: 20, False: 72]
  ------------------
  721|     20|              if( ch3 == 'L' )
  ------------------
  |  Branch (721:19): [True: 19, False: 1]
  ------------------
  722|     19|                return(  4 );
  723|       |
  724|     73|            break;
  725|       |
  726|    221|          case('W'):
  ------------------
  |  Branch (726:11): [True: 221, False: 61.4k]
  ------------------
  727|       |
  728|    221|            if( ch2 == 'A' )
  ------------------
  |  Branch (728:17): [True: 81, False: 140]
  ------------------
  729|     81|              if( ch3 == 'T' )
  ------------------
  |  Branch (729:19): [True: 51, False: 30]
  ------------------
  730|     51|                return( 46 );    /* "WAT" -> "HOH" */
  731|       |
  732|    170|            break;
  733|  61.6k|          }
  734|       |
  735|  61.6k|      }
  736|       |
  737|  59.7k|    return OBResidueIndex::UNK;
  738|  62.3k|  }

_ZN9OpenBabel5OBMol8FindSSSREv:
   92|   268k|  {
   93|   268k|    if (HasSSSRPerceived())
  ------------------
  |  Branch (93:9): [True: 4.97k, False: 263k]
  ------------------
   94|  4.97k|      return;
   95|   263k|    SetSSSRPerceived();
   96|   263k|    obErrorLog.ThrowError(__FUNCTION__,
   97|   263k|                          "Ran OpenBabel::FindSSSR", obAuditMsg);
   98|       |
   99|       |    // Delete any old data before we start finding new rings
  100|       |    // The following procedure is slow
  101|       |    // So if client code is multi-threaded, we don't want to make them wait
  102|   263k|    if (HasData("SSSR")) {
  ------------------
  |  Branch (102:9): [True: 3.71k, False: 259k]
  ------------------
  103|  3.71k|      DeleteData("SSSR");
  104|  3.71k|    }
  105|       |
  106|   263k|    OBRing *ring;
  107|   263k|    vector<OBRing*>::iterator j;
  108|       |
  109|       |    //get Fr�rejacque taking int account multiple possible spanning graphs
  110|   263k|    int frj = DetermineFRJ(*this);
  111|   263k|    if (frj)
  ------------------
  |  Branch (111:9): [True: 17.1k, False: 246k]
  ------------------
  112|  17.1k|      {
  113|  17.1k|        vector<OBRing*> vr;
  114|  17.1k|        FindRingAtomsAndBonds();
  115|       |
  116|  17.1k|        OBBond *bond;
  117|  17.1k|        vector<OBBond*> cbonds;
  118|  17.1k|        vector<OBBond*>::iterator k;
  119|       |
  120|       |        //restrict search for rings around closure bonds
  121|  1.39M|        for (bond = BeginBond(k);bond;bond = NextBond(k))
  ------------------
  |  Branch (121:34): [True: 1.37M, False: 17.1k]
  ------------------
  122|  1.37M|          if (bond->IsClosure())
  ------------------
  |  Branch (122:15): [True: 168k, False: 1.20M]
  ------------------
  123|   168k|            cbonds.push_back(bond);
  124|       |
  125|  17.1k|        if (!cbonds.empty())
  ------------------
  |  Branch (125:13): [True: 17.1k, False: 0]
  ------------------
  126|  17.1k|          {
  127|  17.1k|            OBRingSearch rs;
  128|       |            //search for all rings about closures
  129|  17.1k|            vector<OBBond*>::iterator i;
  130|       |
  131|   185k|            for (i = cbonds.begin();i != cbonds.end();++i)
  ------------------
  |  Branch (131:37): [True: 168k, False: 17.1k]
  ------------------
  132|   168k|              rs.AddRingFromClosure(*this,(OBBond*)*i);
  133|       |
  134|  17.1k|            rs.SortRings();
  135|  17.1k|            rs.RemoveRedundant(frj);
  136|       |            //store the SSSR set
  137|       |
  138|   185k|            for (j = rs.BeginRings();j != rs.EndRings();++j)
  ------------------
  |  Branch (138:38): [True: 167k, False: 17.1k]
  ------------------
  139|   167k|              {
  140|   167k|                ring = new OBRing ((*j)->_path,NumAtoms()+1);
  141|   167k|                ring->SetParent(this);
  142|   167k|                vr.push_back(ring);
  143|   167k|              }
  144|       |            //rs.WriteRings();
  145|  17.1k|          }
  146|       |
  147|  17.1k|        OBRingData *rd = new OBRingData();
  148|  17.1k|        rd->SetOrigin(perceived); // to separate from user or file input
  149|  17.1k|        rd->SetAttribute("SSSR");
  150|  17.1k|        rd->SetData(vr);
  151|  17.1k|        SetData(rd);
  152|  17.1k|      }
  153|   263k|  }
_ZN9OpenBabel18atomRingToBondRingEPNS_5OBMolERKNSt3__16vectorIiNS2_9allocatorIiEEEE:
  156|  14.6M|  {
  157|  14.6M|    std::vector<unsigned int> bonds;
  158|  54.9M|    for (unsigned int i = 0; i < atoms.size() - 1; ++i) {
  ------------------
  |  Branch (158:30): [True: 40.3M, False: 14.6M]
  ------------------
  159|  40.3M|      unsigned int beginIndex = atoms[i];
  160|  40.3M|      unsigned int endIndex = atoms[i+1];
  161|  40.3M|      unsigned int index = mol->GetBond(beginIndex, endIndex)->GetIdx();
  162|  40.3M|      bonds.push_back(index);
  163|  40.3M|    }
  164|  14.6M|    bonds.push_back(mol->GetBond(atoms[0], atoms[atoms.size()-1])->GetIdx());
  165|  14.6M|    return bonds;
  166|  14.6M|  }
_ZN9OpenBabel9visitRingEPNS_5OBMolEPNS_6OBRingERNSt3__16vectorIS3_NS4_9allocatorIS3_EEEES9_:
  184|   230k|  {
  185|   230k|    OBBitVec mask;
  186|       |    // Make sure mask is the same size as the maximum ring atom/bond index.
  187|   230k|    mask.SetBitOn(mol->NumAtoms());
  188|   230k|    mask.SetBitOn(mol->NumBonds());
  189|       |
  190|       |    //
  191|       |    // Remove larger rings that cover the same atoms as smaller rings.
  192|       |    //
  193|   230k|    mask.Clear();
  194|  14.2M|    for (unsigned int j = 0; j < rlist.size(); ++j)
  ------------------
  |  Branch (194:30): [True: 14.0M, False: 230k]
  ------------------
  195|       |      // Here we select only smaller rings.
  196|  14.0M|      if (rlist[j]->_path.size() < ring->_path.size())
  ------------------
  |  Branch (196:11): [True: 7.32M, False: 6.69M]
  ------------------
  197|  7.32M|        mask |= rlist[j]->_pathset;
  198|       |
  199|   230k|    mask = mask & ring->_pathset;
  200|       |
  201|   230k|    bool containsSmallerAtomRing = (mask == ring->_pathset) ? true : false;
  ------------------
  |  Branch (201:36): [True: 74.4k, False: 155k]
  ------------------
  202|       |
  203|       |    // Translate ring atom indexes to ring bond indexes.
  204|   230k|    std::vector<unsigned int> bonds = atomRingToBondRing(mol, ring->_path);
  205|   230k|    OBBitVec bondset;
  206|  1.56M|    for (unsigned int i = 0; i < bonds.size(); ++i)
  ------------------
  |  Branch (206:30): [True: 1.33M, False: 230k]
  ------------------
  207|  1.33M|      bondset.SetBitOn(bonds[i]);
  208|       |
  209|       |    //
  210|       |    // Remove larger rings that cover the same bonds as smaller rings.
  211|       |    //
  212|   230k|    mask.Clear();
  213|  14.2M|    for (unsigned int j = 0; j < rlist.size(); ++j) {
  ------------------
  |  Branch (213:30): [True: 14.0M, False: 230k]
  ------------------
  214|  14.0M|      std::vector<unsigned int> otherBonds = atomRingToBondRing(mol, rlist[j]->_path);
  215|  14.0M|      OBBitVec bs;
  216|  65.5M|      for (unsigned int i = 0; i < otherBonds.size(); ++i)
  ------------------
  |  Branch (216:32): [True: 51.5M, False: 14.0M]
  ------------------
  217|  51.5M|        bs.SetBitOn(otherBonds[i]);
  218|       |
  219|       |      // Here we select only smaller rings.
  220|  14.0M|      if (otherBonds.size() < bonds.size())
  ------------------
  |  Branch (220:11): [True: 7.32M, False: 6.69M]
  ------------------
  221|  7.32M|        mask |= bs;
  222|  14.0M|    }
  223|       |
  224|   230k|    mask = mask & bondset;
  225|       |
  226|   230k|    bool containsSmallerBondRing = (mask == bondset) ? true : false;
  ------------------
  |  Branch (226:36): [True: 69.7k, False: 160k]
  ------------------
  227|       |
  228|       |    // The ring is part of the LSSR if all it's atoms and bonds are not
  229|       |    // found in smaller rings.
  230|   230k|    if (!containsSmallerAtomRing || !containsSmallerBondRing) {
  ------------------
  |  Branch (230:9): [True: 155k, False: 74.4k]
  |  Branch (230:37): [True: 4.72k, False: 69.7k]
  ------------------
  231|   160k|      rlist.push_back(ring);
  232|   160k|    } else {
  233|  69.7k|      rignored.push_back(ring);
  234|  69.7k|    }
  235|   230k|  }
_ZN9OpenBabel5OBMol8FindLSSREv:
  239|  49.6k|  {
  240|  49.6k|    if (HasLSSRPerceived())
  ------------------
  |  Branch (240:9): [True: 0, False: 49.6k]
  ------------------
  241|      0|      return;
  242|  49.6k|    SetLSSRPerceived();
  243|  49.6k|    obErrorLog.ThrowError(__FUNCTION__,
  244|  49.6k|                          "Ran OpenBabel::FindLSSR", obAuditMsg);
  245|       |
  246|       |    // Delete any old data before we start finding new rings
  247|       |    // The following procedure is slow
  248|       |    // So if client code is multi-threaded, we don't want to make them wait
  249|  49.6k|    if (HasData("LSSR")) {
  ------------------
  |  Branch (249:9): [True: 53, False: 49.5k]
  ------------------
  250|     53|      DeleteData("LSSR");
  251|     53|    }
  252|       |
  253|  49.6k|    OBRing *ring;
  254|  49.6k|    vector<OBRing*>::iterator j;
  255|       |
  256|       |    //get frerejaque taking int account multiple possible spanning graphs
  257|  49.6k|    int frj = DetermineFRJ(*this);
  258|  49.6k|    if (frj)
  ------------------
  |  Branch (258:9): [True: 10.4k, False: 39.2k]
  ------------------
  259|  10.4k|      {
  260|  10.4k|        vector<OBRing*> vr;
  261|  10.4k|        FindRingAtomsAndBonds();
  262|       |
  263|  10.4k|        OBBond *bond;
  264|  10.4k|        vector<OBBond*> cbonds;
  265|  10.4k|        vector<OBBond*>::iterator k;
  266|       |
  267|       |        //restrict search for rings around closure bonds
  268|   633k|        for (bond = BeginBond(k);bond;bond = NextBond(k))
  ------------------
  |  Branch (268:34): [True: 623k, False: 10.4k]
  ------------------
  269|   623k|          if (bond->IsClosure())
  ------------------
  |  Branch (269:15): [True: 87.1k, False: 536k]
  ------------------
  270|  87.1k|            cbonds.push_back(bond);
  271|       |
  272|  10.4k|        if (!cbonds.empty())
  ------------------
  |  Branch (272:13): [True: 10.4k, False: 0]
  ------------------
  273|  10.4k|          {
  274|  10.4k|            OBRingSearch rs;
  275|       |            //search for all rings about closures
  276|  10.4k|            vector<OBBond*>::iterator i;
  277|       |
  278|  97.5k|            for (i = cbonds.begin();i != cbonds.end();++i)
  ------------------
  |  Branch (278:37): [True: 87.1k, False: 10.4k]
  ------------------
  279|  87.1k|              rs.AddRingFromClosure(*this,(OBBond*)*i);
  280|       |
  281|  10.4k|            rs.SortRings();
  282|  10.4k|            rs.RemoveRedundant(-1); // -1 means LSSR
  283|       |
  284|       |            //store the LSSR set
  285|       |
  286|   170k|            for (j = rs.BeginRings();j != rs.EndRings();++j)
  ------------------
  |  Branch (286:38): [True: 160k, False: 10.4k]
  ------------------
  287|   160k|              {
  288|   160k|                ring = new OBRing ((*j)->_path,NumAtoms()+1);
  289|   160k|                ring->SetParent(this);
  290|   160k|                vr.push_back(ring);
  291|   160k|              }
  292|       |            //rs.WriteRings();
  293|  10.4k|          }
  294|       |
  295|  10.4k|        OBRingData *rd = new OBRingData();
  296|  10.4k|        rd->SetOrigin(perceived); // to separate from user or file input
  297|  10.4k|        rd->SetAttribute("LSSR");
  298|  10.4k|        rd->SetData(vr);
  299|  10.4k|        SetData(rd);
  300|  10.4k|      }
  301|  49.6k|  }
_ZN9OpenBabel12OBRingSearch15RemoveRedundantEi:
  320|  27.5k|  {
  321|  27.5k|    int i,j;
  322|       |
  323|       |    // Remove identical rings in O(R log R) via a fingerprint set instead of
  324|       |    // the previous O(R^2) bitvec scan (which blew the OSS-Fuzz 60s budget
  325|       |    // on densely-fused inputs). Two rings are identical iff their atom-index
  326|       |    // sets match; NextBit yields those indices in sorted order.
  327|  27.5k|    {
  328|  27.5k|      std::set<std::vector<int> > seen;
  329|   701k|      for (i = (int)_rlist.size() - 1; i >= 0; --i) {
  ------------------
  |  Branch (329:40): [True: 673k, False: 27.5k]
  ------------------
  330|   673k|        std::vector<int> fp;
  331|   673k|        const OBBitVec &bv = _rlist[i]->_pathset;
  332|  4.41M|        for (int b = bv.NextBit(-1); b >= 0; b = bv.NextBit(b))
  ------------------
  |  Branch (332:38): [True: 3.73M, False: 673k]
  ------------------
  333|  3.73M|          fp.push_back(b);
  334|   673k|        if (!seen.insert(fp).second) {
  ------------------
  |  Branch (334:13): [True: 0, False: 673k]
  ------------------
  335|      0|          delete _rlist[i];
  336|      0|          _rlist.erase(_rlist.begin() + i);
  337|      0|        }
  338|   673k|      }
  339|  27.5k|    }
  340|       |
  341|  27.5k|    if (_rlist.size() == 0)
  ------------------
  |  Branch (341:9): [True: 77, False: 27.5k]
  ------------------
  342|     77|      return; // nothing to do
  343|       |
  344|       |    // handle LSSR
  345|  27.5k|    if (frj < 0) {
  ------------------
  |  Branch (345:9): [True: 10.3k, False: 17.1k]
  ------------------
  346|  10.3k|      OBMol *mol = _rlist[0]->GetParent();
  347|  10.3k|      std::vector<OBRing*> rlist, rignored;
  348|   240k|      for (unsigned int i = 0; i < _rlist.size(); ++i) {
  ------------------
  |  Branch (348:32): [True: 230k, False: 10.3k]
  ------------------
  349|   230k|        visitRing(mol, _rlist[i], rlist, rignored);
  350|   230k|      }
  351|  80.1k|      for (unsigned int i = 0; i < rignored.size(); ++i)
  ------------------
  |  Branch (351:32): [True: 69.7k, False: 10.3k]
  ------------------
  352|  69.7k|        delete rignored[i];
  353|  10.3k|      _rlist = rlist;
  354|  10.3k|      return;
  355|  10.3k|    }
  356|       |
  357|       |    // Pruning can only remove rings, so once we're at or below frj there's
  358|       |    // nothing left to do. (Was '== frj', which let the size-< frj case fall
  359|       |    // into an O(R^2 * B/64) loop that found nothing.)
  360|  17.1k|    if (_rlist.size() <= (unsigned)frj)
  ------------------
  |  Branch (360:9): [True: 7.62k, False: 9.49k]
  ------------------
  361|  7.62k|      return;
  362|       |
  363|       |    // create bondsets
  364|  9.49k|    std::vector<OBBitVec> _bslist;
  365|  9.49k|    std::vector<unsigned int> bonds;
  366|  9.49k|    OBBitVec bondset;
  367|  9.49k|    OBMol *mol = _rlist[0]->GetParent();
  368|   419k|    for (j = 0; j < (signed)_rlist.size(); ++j)
  ------------------
  |  Branch (368:17): [True: 409k, False: 9.49k]
  ------------------
  369|   409k|    {
  370|   409k|      bondset.Clear();
  371|   409k|      bonds = atomRingToBondRing(mol, (_rlist[j])->_path);
  372|  2.54M|      for (unsigned int i = 0; i < bonds.size(); ++i)
  ------------------
  |  Branch (372:32): [True: 2.13M, False: 409k]
  ------------------
  373|  2.13M|        bondset.SetBitOn(bonds[i]);
  374|   409k|      _bslist.push_back(bondset);
  375|   409k|    }
  376|       |
  377|       |    // make sure tmp is the same size as the rings
  378|  9.49k|    OBBitVec tmp;
  379|   419k|    for (j = 0; j < (signed)_bslist.size(); ++j)
  ------------------
  |  Branch (379:17): [True: 409k, False: 9.49k]
  ------------------
  380|   409k|      tmp = _bslist[j];
  381|       |
  382|       |    //remove larger rings that cover the same atoms as smaller rings
  383|   313k|    for (i = _rlist.size()-1;i >= 0;i--)
  ------------------
  |  Branch (383:30): [True: 313k, False: 0]
  ------------------
  384|   313k|      {
  385|   313k|        tmp.Clear();
  386|  38.9M|        for (j = 0;j < (signed)_rlist.size();++j)
  ------------------
  |  Branch (386:20): [True: 38.6M, False: 313k]
  ------------------
  387|  38.6M|          if ((_rlist[j])->_path.size() <= (_rlist[i])->_path.size() && i != j)
  ------------------
  |  Branch (387:15): [True: 38.2M, False: 365k]
  |  Branch (387:73): [True: 37.9M, False: 313k]
  ------------------
  388|  37.9M|          tmp |= _bslist[j];
  389|       |
  390|   313k|      tmp = tmp & _bslist[i];
  391|       |
  392|   313k|      if (tmp == _bslist[i])
  ------------------
  |  Branch (392:11): [True: 275k, False: 37.3k]
  ------------------
  393|   275k|      {
  394|   275k|        delete _rlist[i];
  395|   275k|        _rlist.erase(_rlist.begin() + i);
  396|   275k|        _bslist.erase(_bslist.begin() + i);
  397|   275k|      }
  398|       |
  399|   313k|        if (_rlist.size() == (unsigned)frj)
  ------------------
  |  Branch (399:13): [True: 9.49k, False: 303k]
  ------------------
  400|  9.49k|          break;
  401|   313k|      }
  402|  9.49k|  }
_ZN9OpenBabel12OBRingSearch18AddRingFromClosureERNS_5OBMolEPNS_6OBBondE:
  406|   255k|  {
  407|   255k|    vector<OBRTree*> t1(mol.NumAtoms()+1, nullptr);
  408|   255k|    vector<OBRTree*> t2(mol.NumAtoms()+1, nullptr);
  409|   255k|    OBBitVec bv1,bv2;
  410|       |
  411|   255k|    bv1.SetBitOn(cbond->GetEndAtomIdx());
  412|   255k|    bv2.SetBitOn(cbond->GetBeginAtomIdx());
  413|   255k|    BuildOBRTreeVector(cbond->GetBeginAtom(), nullptr, t1, bv1);
  414|   255k|    BuildOBRTreeVector(cbond->GetEndAtom(), nullptr, t2, bv2);
  415|       |
  416|   255k|    bool pathok;
  417|   255k|    deque<int> p1,p2;
  418|   255k|    vector<OBAtom*> path1,path2;
  419|   255k|    vector<OBAtom*>::iterator m,n;
  420|   255k|    vector<OBRTree*>::iterator i;
  421|       |
  422|  69.3M|    for (i = t1.begin();i != t1.end();++i)
  ------------------
  |  Branch (422:25): [True: 69.0M, False: 255k]
  ------------------
  423|  69.0M|      if (*i)
  ------------------
  |  Branch (423:11): [True: 15.8M, False: 53.2M]
  ------------------
  424|  15.8M|        {
  425|  15.8M|          path1.clear();
  426|  15.8M|          (*i)->PathToRoot(path1);
  427|       |
  428|  15.8M|          if (t2[(*i)->GetAtomIdx()])
  ------------------
  |  Branch (428:15): [True: 7.12M, False: 8.74M]
  ------------------
  429|  7.12M|            {
  430|  7.12M|              pathok = true;
  431|  7.12M|              path2.clear();
  432|  7.12M|              t2[(*i)->GetAtomIdx()]->PathToRoot(path2);
  433|       |
  434|  7.12M|              p1.clear();
  435|  7.12M|              m = path1.begin();
  436|  7.12M|              if (m != path1.end())
  ------------------
  |  Branch (436:19): [True: 7.12M, False: 0]
  ------------------
  437|  7.12M|                p1.push_back((*m)->GetIdx());
  438|  16.0M|              for (m = path1.begin(),++m;m != path1.end();++m)
  ------------------
  |  Branch (438:42): [True: 13.9M, False: 2.09M]
  ------------------
  439|  13.9M|                {
  440|  13.9M|                  p1.push_back((*m)->GetIdx());
  441|  13.9M|                  p2.clear();
  442|  77.5M|                  for (n = path2.begin(),++n;n != path2.end();++n)
  ------------------
  |  Branch (442:46): [True: 68.5M, False: 8.94M]
  ------------------
  443|  68.5M|                    {
  444|  68.5M|                      p2.push_front((*n)->GetIdx());
  445|  68.5M|                      if (*n == *m)//don't traverse across identical atoms
  ------------------
  |  Branch (445:27): [True: 5.03M, False: 63.5M]
  ------------------
  446|  5.03M|                        {
  447|  5.03M|                          p2.pop_front();
  448|  5.03M|                          if (p1.size()+p2.size() > 2)
  ------------------
  |  Branch (448:31): [True: 0, False: 5.03M]
  ------------------
  449|      0|                            SaveUniqueRing(p1,p2);
  450|  5.03M|                          pathok = false;
  451|  5.03M|                          break;
  452|  5.03M|                        }
  453|  63.5M|                      if ((*n)->IsConnected(*m) && p1.size()+p2.size() > 2)
  ------------------
  |  Branch (453:27): [True: 2.59M, False: 60.9M]
  |  Branch (453:52): [True: 2.59M, False: 0]
  ------------------
  454|  2.59M|                        SaveUniqueRing(p1,p2);
  455|  63.5M|                    }
  456|  13.9M|                  if (!pathok)
  ------------------
  |  Branch (456:23): [True: 5.03M, False: 8.94M]
  ------------------
  457|  5.03M|                    break;
  458|  13.9M|                }
  459|  7.12M|            }
  460|  15.8M|        }
  461|       |
  462|       |    //clean up OBRTree vectors
  463|  69.3M|    for (i = t1.begin();i != t1.end();++i)
  ------------------
  |  Branch (463:25): [True: 69.0M, False: 255k]
  ------------------
  464|  69.0M|      if (*i)
  ------------------
  |  Branch (464:11): [True: 15.8M, False: 53.2M]
  ------------------
  465|  15.8M|        delete *i;
  466|       |
  467|  69.3M|    for (i = t2.begin();i != t2.end();++i)
  ------------------
  |  Branch (467:25): [True: 69.0M, False: 255k]
  ------------------
  468|  69.0M|      if (*i)
  ------------------
  |  Branch (468:11): [True: 14.2M, False: 54.8M]
  ------------------
  469|  14.2M|        delete *i;
  470|       |
  471|       |    // set parent for all rings
  472|  17.9M|    for (unsigned int j = 0; j < _rlist.size(); ++j)
  ------------------
  |  Branch (472:30): [True: 17.6M, False: 255k]
  ------------------
  473|  17.6M|      _rlist[j]->SetParent(&mol);
  474|   255k|  }
_ZN9OpenBabel12OBRingSearchC2Ev:
  484|  27.5k|  OBRingSearch::OBRingSearch() : _d(new OBRingSearchPrivate())
  485|  27.5k|  {}
_ZN9OpenBabel12OBRingSearch14SaveUniqueRingERNSt3__15dequeIiNS1_9allocatorIiEEEES6_:
  488|  2.59M|  {
  489|  2.59M|    vector<int> path;
  490|  2.59M|    OBBitVec bv;
  491|  2.59M|    deque<int>::iterator i;
  492|       |
  493|  15.1M|    for (i = d1.begin();i != d1.end();++i)
  ------------------
  |  Branch (493:25): [True: 12.5M, False: 2.59M]
  ------------------
  494|  12.5M|      {
  495|  12.5M|        bv.SetBitOn(*i);
  496|  12.5M|        path.push_back(*i);
  497|  12.5M|      }
  498|       |
  499|  12.8M|    for (i = d2.begin();i != d2.end();++i)
  ------------------
  |  Branch (499:25): [True: 10.2M, False: 2.59M]
  ------------------
  500|  10.2M|      {
  501|  10.2M|        bv.SetBitOn(*i);
  502|  10.2M|        path.push_back(*i);
  503|  10.2M|      }
  504|       |
  505|       |    // Build a canonical fingerprint from the bitvec's set bits (already
  506|       |    // sorted by NextBit) so two rings covering the same atoms hash to
  507|       |    // the same key, even when d1/d2 happen to share an atom.
  508|  2.59M|    std::vector<int> fp;
  509|  25.4M|    for (int b = bv.NextBit(-1); b >= 0; b = bv.NextBit(b))
  ------------------
  |  Branch (509:34): [True: 22.8M, False: 2.59M]
  ------------------
  510|  22.8M|      fp.push_back(b);
  511|  2.59M|    if (!_d->ringfingerprints.insert(fp).second)
  ------------------
  |  Branch (511:9): [True: 1.91M, False: 673k]
  ------------------
  512|  1.91M|      return false;
  513|       |
  514|   673k|    OBRing *ring = new OBRing(path, bv);
  515|   673k|    _rlist.push_back(ring);
  516|       |
  517|   673k|    return(true);
  518|  2.59M|  }
_ZN9OpenBabel12OBRingSearchD2Ev:
  522|  27.5k|  {
  523|  27.5k|    vector<OBRing*>::iterator i;
  524|   355k|    for (i = _rlist.begin();i != _rlist.end();++i)
  ------------------
  |  Branch (524:29): [True: 328k, False: 27.5k]
  ------------------
  525|   328k|      delete *i;
  526|  27.5k|  }
_ZN9OpenBabel15CompareRingSizeEPKNS_6OBRingES2_:
  529|  4.40M|  {
  530|  4.40M|    return(a->Size() == b->Size() ? a->ring_id < b->ring_id : a->Size() < b->Size()); // ensure stable sort
  ------------------
  |  Branch (530:12): [True: 3.23M, False: 1.17M]
  ------------------
  531|  4.40M|  }
_ZN9OpenBabel5OBMol21FindRingAtomsAndBondsEv:
  670|  43.4k|  {
  671|  43.4k|    if (HasFlag(OB_RINGFLAGS_MOL))
  ------------------
  |  |   75|  43.4k|#define OB_RINGFLAGS_MOL         (1<<2)
  ------------------
  |  Branch (671:9): [True: 36.4k, False: 6.98k]
  ------------------
  672|  36.4k|      return;
  673|  6.98k|    if (obErrorLog.GetOutputLevel() >= obAuditMsg)
  ------------------
  |  Branch (673:9): [True: 0, False: 6.98k]
  ------------------
  674|      0|      obErrorLog.ThrowError(__FUNCTION__,
  675|      0|                            "Ran OpenBabel::FindRingAtomsAndBonds", obAuditMsg);
  676|  6.98k|    FindRingAtomsAndBonds2(*this);
  677|  6.98k|  }
_ZN9OpenBabel6OBRing10IsAromaticEv:
  680|  10.0k|  {
  681|  10.0k|    OBMol *mol = _parent;
  682|  10.0k|    vector<int>::iterator i;
  683|  11.1k|    for (i = _path.begin();i != _path.end();++i)
  ------------------
  |  Branch (683:28): [True: 10.9k, False: 212]
  ------------------
  684|  10.9k|      if (!(mol->GetAtom(*i))->IsAromatic())
  ------------------
  |  Branch (684:11): [True: 9.80k, False: 1.09k]
  ------------------
  685|  9.80k|        return(false);
  686|       |
  687|    212|    return(true);
  688|  10.0k|  }
_ZN9OpenBabel6OBRing11GetRootAtomEv:
  712|  1.79k|  {
  713|  1.79k|    vector<int>::iterator i;
  714|  1.79k|    OBMol *mol = (OBMol*)GetParent();
  715|       |
  716|       |    //if (!IsAromatic())
  717|       |    //  return 0;
  718|       |
  719|  1.79k|    if (Size() == 6)
  ------------------
  |  Branch (719:9): [True: 0, False: 1.79k]
  ------------------
  720|      0|      for (i = _path.begin();i != _path.end();++i)
  ------------------
  |  Branch (720:30): [True: 0, False: 0]
  ------------------
  721|      0|        if (mol->GetAtom(*i)->GetAtomicNum() != OBElements::Carbon)
  ------------------
  |  Branch (721:13): [True: 0, False: 0]
  ------------------
  722|      0|	        return (*i);
  723|       |
  724|  1.79k|    if (Size() == 5)
  ------------------
  |  Branch (724:9): [True: 1.79k, False: 0]
  ------------------
  725|  4.67k|      for (i = _path.begin();i != _path.end();++i) {
  ------------------
  |  Branch (725:30): [True: 4.34k, False: 332]
  ------------------
  726|  4.34k|        OBAtom *atom = mol->GetAtom(*i);
  727|  4.34k|        switch (atom->GetAtomicNum()) {
  ------------------
  |  Branch (727:17): [True: 2.44k, False: 1.90k]
  ------------------
  728|    212|        case OBElements::Sulfur:
  ------------------
  |  Branch (728:9): [True: 212, False: 4.13k]
  ------------------
  729|    212|          if (atom->GetExplicitDegree() == 2)
  ------------------
  |  Branch (729:15): [True: 63, False: 149]
  ------------------
  730|     63|            return (*i);
  731|    149|          break;
  732|    247|        case OBElements::Oxygen:
  ------------------
  |  Branch (732:9): [True: 247, False: 4.10k]
  ------------------
  733|    247|          if (atom->GetExplicitDegree() == 2)
  ------------------
  |  Branch (733:15): [True: 190, False: 57]
  ------------------
  734|    190|            return (*i);
  735|     57|          break;
  736|  1.98k|        case OBElements::Nitrogen:
  ------------------
  |  Branch (736:9): [True: 1.98k, False: 2.36k]
  ------------------
  737|  1.98k|          if (atom->GetExplicitValence() == atom->GetExplicitDegree())
  ------------------
  |  Branch (737:15): [True: 1.20k, False: 776]
  ------------------
  738|  1.20k|            return (*i);
  739|    776|          break;
  740|  4.34k|        }
  741|  4.34k|      }
  742|       |
  743|    332|    return 0;
  744|  1.79k|  }
_ZN9OpenBabel6OBRing8IsMemberEPNS_6OBAtomE:
  747|  14.4k|  {
  748|  14.4k|    return(_pathset.BitIsSet(a->GetIdx()));
  749|  14.4k|  }
_ZN9OpenBabel6OBRing8IsMemberEPNS_6OBBondE:
  752|  19.8M|  {
  753|  19.8M|    return((_pathset.BitIsSet(b->GetBeginAtomIdx()))&&(_pathset.BitIsSet(b->GetEndAtomIdx())));
  ------------------
  |  Branch (753:12): [True: 623k, False: 19.2M]
  |  Branch (753:55): [True: 281k, False: 342k]
  ------------------
  754|  19.8M|  }
_ZN9OpenBabel6OBRingC2ERNSt3__16vectorIiNS1_9allocatorIiEEEEi:
  756|   328k|  OBRing::OBRing(vector<int> &path,int size) : _path(path)
  757|   328k|  {
  758|   328k|    _pathset.FromVecInt(_path);
  759|   328k|    _pathset.Resize(size);
  760|   328k|    _type[0] = '\0';
  761|   328k|  }
_ZN9OpenBabel7OBRTreeC2EPNS_6OBAtomEPS0_:
  839|  30.1M|  {
  840|  30.1M|    _atom = atom;
  841|  30.1M|    _prv = prv;
  842|  30.1M|  }
_ZN9OpenBabel7OBRTree10PathToRootERNSt3__16vectorIPNS_6OBAtomENS1_9allocatorIS4_EEEE:
  847|   251M|  {
  848|   251M|    path.push_back(_atom);
  849|   251M|    if (_prv)
  ------------------
  |  Branch (849:9): [True: 228M, False: 23.0M]
  ------------------
  850|   228M|      _prv->PathToRoot(path);
  851|   251M|  }
_ZN9OpenBabel7OBRTree10GetAtomIdxEv:
  854|  23.0M|  {
  855|  23.0M|    return(_atom->GetIdx());
  856|  23.0M|  }
ring.cpp:_ZN9OpenBabelL12DetermineFRJERNS_5OBMolE:
  306|   313k|  {
  307|   313k|    if (!mol.HasClosureBondsPerceived())
  ------------------
  |  Branch (307:9): [True: 256k, False: 57.2k]
  ------------------
  308|   256k|      return (int)FindRingAtomsAndBonds2(mol);
  309|       |
  310|  57.2k|    int frj = 0;
  311|  57.2k|    OBBond *bond;
  312|  57.2k|    vector<OBBond*>::iterator j;
  313|  1.87M|    for (bond = mol.BeginBond(j);bond;bond = mol.NextBond(j))
  ------------------
  |  Branch (313:34): [True: 1.82M, False: 57.2k]
  ------------------
  314|  1.82M|      if (bond->IsClosure()) // bond->HasFlag(OB_CLOSURE_BOND)?
  ------------------
  |  Branch (314:11): [True: 149k, False: 1.67M]
  ------------------
  315|   149k|        frj++;
  316|  57.2k|    return frj;
  317|   313k|  }
ring.cpp:_ZN9OpenBabelL22FindRingAtomsAndBonds2ERNS_5OBMolE:
  637|   263k|  {
  638|   263k|    mol.SetRingAtomsAndBondsPerceived(); // mol.SetFlag(OB_RINGFLAGS_MOL);
  639|   263k|    mol.SetClosureBondsPerceived();      // mol.SetFlag(OB_CLOSURE_MOL);
  640|       |
  641|   263k|    FOR_ATOMS_OF_MOL(atom, mol)
  ------------------
  |  |  417|   263k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 2.88M, False: 263k]
  |  |  ------------------
  ------------------
  642|  2.88M|      atom->SetInRing(false);
  643|  2.56M|    FOR_BONDS_OF_MOL(bond, mol) {
  ------------------
  |  |  418|   263k|#define FOR_BONDS_OF_MOL(b,m)     for (auto b : impl::MolGetBonds(m))
  |  |  ------------------
  |  |  |  Branch (418:47): [True: 2.56M, False: 263k]
  |  |  ------------------
  ------------------
  644|  2.56M|      bond->SetInRing(false);
  645|  2.56M|      bond->SetClosure(false);
  646|  2.56M|    }
  647|       |
  648|   263k|    unsigned int bsize = mol.NumBonds()+1;
  649|   263k|    unsigned char *bvisit = (unsigned char*)malloc(bsize);
  650|   263k|    memset(bvisit,0,bsize);
  651|       |
  652|   263k|    unsigned int acount = mol.NumAtoms();
  653|   263k|    unsigned int asize = (unsigned int)((acount+1)*sizeof(int));
  654|   263k|    int *avisit = (int*)malloc(asize);
  655|   263k|    memset(avisit,0,asize);
  656|       |
  657|   263k|    unsigned int frj = 0;
  658|  3.14M|    for(unsigned int i=1; i<=acount; i++ )
  ------------------
  |  Branch (658:27): [True: 2.88M, False: 263k]
  ------------------
  659|  2.88M|      if(avisit[i] == 0) {
  ------------------
  |  Branch (659:10): [True: 542k, False: 2.34M]
  ------------------
  660|   542k|        avisit[i] = 1;
  661|   542k|        OBAtom *atom = mol.GetAtom(i);
  662|   542k|        FindRings(atom,avisit,bvisit,frj,1);
  663|   542k|      }
  664|   263k|    free(avisit);
  665|   263k|    free(bvisit);
  666|   263k|    return frj;
  667|   263k|  }
ring.cpp:_ZN9OpenBabelL9FindRingsEPNS_6OBAtomEPiPhRji:
  551|   542k|  {
  552|   542k|    struct Frame {
  553|   542k|      OBAtom *atom;
  554|   542k|      int depth;
  555|   542k|      int result;
  556|   542k|      vector<OBBond*>::iterator it;
  557|   542k|      OBBond *bond; // bond currently being processed (also the one
  558|       |                    // awaiting the child's return value when we recurse)
  559|   542k|    };
  560|       |
  561|   542k|    std::vector<Frame> stack;
  562|   542k|    stack.reserve(64);
  563|       |
  564|   542k|    {
  565|   542k|      Frame f;
  566|   542k|      f.atom = root;
  567|   542k|      f.depth = rootDepth;
  568|   542k|      f.result = -1;
  569|   542k|      f.bond = root->BeginBond(f.it);
  570|   542k|      stack.push_back(f);
  571|   542k|    }
  572|       |
  573|   542k|    int childResult = 0;
  574|   542k|    bool returning = false;
  575|       |
  576|  5.76M|    while (!stack.empty()) {
  ------------------
  |  Branch (576:12): [True: 5.22M, False: 542k]
  ------------------
  577|  5.22M|      Frame &cur = stack.back();
  578|       |
  579|  5.22M|      if (returning) {
  ------------------
  |  Branch (579:11): [True: 2.34M, False: 2.88M]
  ------------------
  580|       |        // childResult is the recursive call's return value for cur.bond's neighbor
  581|  2.34M|        returning = false;
  582|  2.34M|        int nvisit = childResult;
  583|  2.34M|        if (nvisit > 0 && nvisit <= cur.depth) {
  ------------------
  |  Branch (583:13): [True: 1.16M, False: 1.18M]
  |  Branch (583:27): [True: 1.11M, False: 44.4k]
  ------------------
  584|  1.11M|          cur.bond->SetInRing();
  585|  1.11M|          if (cur.result < 0 || nvisit < cur.result)
  ------------------
  |  Branch (585:15): [True: 1.01M, False: 104k]
  |  Branch (585:33): [True: 38.1k, False: 66.8k]
  ------------------
  586|  1.05M|            cur.result = nvisit;
  587|  1.11M|        }
  588|  2.34M|        cur.bond = cur.atom->NextBond(cur.it);
  589|  2.34M|      }
  590|       |
  591|  5.22M|      bool recursed = false;
  592|  8.01M|      while (cur.bond) {
  ------------------
  |  Branch (592:14): [True: 5.12M, False: 2.88M]
  ------------------
  593|  5.12M|        OBBond *bond = cur.bond;
  594|  5.12M|        unsigned int bidx = bond->GetIdx();
  595|  5.12M|        if (bvisit[bidx] == 0) {
  ------------------
  |  Branch (595:13): [True: 2.56M, False: 2.56M]
  ------------------
  596|  2.56M|          bvisit[bidx] = 1;
  597|  2.56M|          OBAtom *nbor = bond->GetNbrAtom(cur.atom);
  598|  2.56M|          unsigned int nidx = nbor->GetIdx();
  599|  2.56M|          int nvisit = avisit[nidx];
  600|  2.56M|          if (nvisit == 0) {
  ------------------
  |  Branch (600:15): [True: 2.34M, False: 222k]
  ------------------
  601|  2.34M|            avisit[nidx] = cur.depth + 1;
  602|  2.34M|            Frame nf;
  603|  2.34M|            nf.atom = nbor;
  604|  2.34M|            nf.depth = cur.depth + 1;
  605|  2.34M|            nf.result = -1;
  606|  2.34M|            nf.bond = nbor->BeginBond(nf.it);
  607|       |            // push_back may invalidate `cur`; we don't touch it again before break
  608|  2.34M|            stack.push_back(nf);
  609|  2.34M|            recursed = true;
  610|  2.34M|            break;
  611|  2.34M|          } else {
  612|   222k|            if (cur.result < 0 || nvisit < cur.result)
  ------------------
  |  Branch (612:17): [True: 159k, False: 62.5k]
  |  Branch (612:35): [True: 15.6k, False: 46.8k]
  ------------------
  613|   175k|              cur.result = nvisit;
  614|   222k|            bond->SetClosure();
  615|   222k|            bond->SetInRing();
  616|   222k|            frj++;
  617|   222k|          }
  618|  2.56M|        }
  619|  2.78M|        cur.bond = cur.atom->NextBond(cur.it);
  620|  2.78M|      }
  621|       |
  622|  5.22M|      if (recursed)
  ------------------
  |  Branch (622:11): [True: 2.34M, False: 2.88M]
  ------------------
  623|  2.34M|        continue;
  624|       |
  625|       |      // done with this atom's bonds
  626|  2.88M|      if (cur.result > 0 && cur.result <= cur.depth)
  ------------------
  |  Branch (626:11): [True: 1.17M, False: 1.71M]
  |  Branch (626:29): [True: 1.17M, False: 0]
  ------------------
  627|  1.17M|        cur.atom->SetInRing();
  628|  2.88M|      childResult = cur.result;
  629|  2.88M|      returning = true;
  630|  2.88M|      stack.pop_back();
  631|  2.88M|    }
  632|       |
  633|   542k|    return childResult;
  634|   542k|  }
ring.cpp:_ZN9OpenBabelL18BuildOBRTreeVectorEPNS_6OBAtomEPNS_7OBRTreeERNSt3__16vectorIS3_NS4_9allocatorIS3_EEEERNS_8OBBitVecE:
  799|   510k|  {
  800|   510k|    vt[atom->GetIdx()] = new OBRTree (atom,prv);
  801|       |
  802|   510k|    int i;
  803|   510k|    OBAtom *nbr;
  804|   510k|    OBMol *mol = (OBMol*)atom->GetParent();
  805|   510k|    OBBitVec curr,used,next;
  806|   510k|    vector<OBBond*>::iterator j;
  807|   510k|    curr |= atom->GetIdx();
  808|   510k|    used = bv|curr;
  809|       |
  810|   510k|#define OB_RTREE_CUTOFF 20
  811|       |
  812|   510k|    int level=0;
  813|   510k|    for (;;)
  814|  5.23M|      {
  815|  5.23M|        next.Clear();
  816|  34.1M|        for (i = curr.NextBit(0);i != bv.EndBit();i = curr.NextBit(i))
  ------------------
  |  Branch (816:34): [True: 28.9M, False: 5.23M]
  ------------------
  817|  28.9M|          {
  818|  28.9M|            atom = mol->GetAtom(i);
  819|   106M|            for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j))
  ------------------
  |  Branch (819:46): [True: 77.6M, False: 28.9M]
  ------------------
  820|  77.6M|              if (!used[nbr->GetIdx()])
  ------------------
  |  Branch (820:19): [True: 29.6M, False: 48.0M]
  ------------------
  821|  29.6M|                {
  822|  29.6M|                  next |= nbr->GetIdx();
  823|  29.6M|                  used |= nbr->GetIdx();
  824|  29.6M|                  vt[nbr->GetIdx()] = new OBRTree (nbr,vt[atom->GetIdx()]);
  825|  29.6M|                }
  826|  28.9M|          }
  827|       |
  828|  5.23M|        if (next.IsEmpty())
  ------------------
  |  Branch (828:13): [True: 361k, False: 4.87M]
  ------------------
  829|   361k|          break;
  830|  4.87M|        curr = next;
  831|  4.87M|        level++;
  832|  4.87M|        if (level > OB_RTREE_CUTOFF)
  ------------------
  |  |  810|  4.87M|#define OB_RTREE_CUTOFF 20
  ------------------
  |  Branch (832:13): [True: 149k, False: 4.72M]
  ------------------
  833|   149k|          break;
  834|  4.87M|      }
  835|   510k|#undef OB_RTREE_CUTOFF
  836|   510k|  }

_ZNK9OpenBabel16OBCisTransStereo6ConfigeqERKS1_:
   15|  6.76k|  {
   16|  6.76k|    if ((begin != other.begin) && (begin != other.end))
  ------------------
  |  Branch (16:9): [True: 0, False: 6.76k]
  |  Branch (16:35): [True: 0, False: 0]
  ------------------
   17|      0|      return false;
   18|  6.76k|    if ((end != other.begin) && (end != other.end))
  ------------------
  |  Branch (18:9): [True: 6.76k, False: 0]
  |  Branch (18:33): [True: 0, False: 6.76k]
  ------------------
   19|      0|      return false;
   20|  6.76k|    if ((refs.size() != 4) || (other.refs.size() != 4))
  ------------------
  |  Branch (20:9): [True: 0, False: 6.76k]
  |  Branch (20:31): [True: 0, False: 6.76k]
  ------------------
   21|      0|      return false;
   22|       |
   23|  6.76k|    Config u1, u2;
   24|  6.76k|    if (!OBStereo::ContainsSameRefs(refs, other.refs)) {
  ------------------
  |  Branch (24:9): [True: 0, False: 6.76k]
  ------------------
   25|       |      // find a ref that occurs in both
   26|      0|      for (OBStereo::ConstRefIter i = refs.begin(); i != refs.end(); ++i)
  ------------------
  |  Branch (26:53): [True: 0, False: 0]
  ------------------
   27|      0|        if (OBStereo::ContainsRef(other.refs, *i)) {
  ------------------
  |  Branch (27:13): [True: 0, False: 0]
  ------------------
   28|      0|          u1 = OBTetraPlanarStereo::ToConfig(*this, *i, OBStereo::ShapeU); // refs[0] = u1.refs[0]
   29|      0|          u2 = OBTetraPlanarStereo::ToConfig(other, *i, OBStereo::ShapeU); // refs[0] = u2.refs[0]
   30|      0|        }
   31|       |
   32|       |      // check if they actualy share an id...
   33|      0|      if (u1.refs.empty())
  ------------------
  |  Branch (33:11): [True: 0, False: 0]
  ------------------
   34|      0|        return false;
   35|  6.76k|    } else {
   36|       |      // normalize the other Config struct
   37|  6.76k|      u1 = OBTetraPlanarStereo::ToConfig(*this, refs.at(0), OBStereo::ShapeU); // refs[0] = u1.refs[0]
   38|  6.76k|      u2 = OBTetraPlanarStereo::ToConfig(other, refs.at(0), OBStereo::ShapeU); // refs[0] = u2.refs[0]
   39|       |      // both now start with the same ref
   40|       |      //
   41|       |      // 2 possiblilities:
   42|       |      //
   43|       |      //   1 2 3 4      1 2 3 4
   44|       |      //   |   |        |   |      <- in any case, refs[0] & refs[2] remain unchanged
   45|       |      //   1 2 3 4      1 4 3 2
   46|       |      //
   47|  6.76k|      return (u1.refs[2] == u2.refs[2]);
   48|  6.76k|    }
   49|       |
   50|       |    // possibilities:
   51|       |    //
   52|       |    //   1 2 3 4
   53|       |    //   |   |      <- refs[0] & refs[2] remain unchanged
   54|       |    //   1 H 3 H
   55|       |    //
   56|       |    //   1 2 3 4
   57|       |    //   |     |    <- refs[0] & refs[3] remain unchanged
   58|       |    //   1 H H 4
   59|       |    //
   60|       |    //   1 2 3 4
   61|       |    //   | |        <- refs[0] & refs[1] remain unchanged
   62|       |    //   1 2 H H
   63|      0|    if ((u1.refs[2] == OBStereo::ImplicitRef) || (u2.refs[2] == OBStereo::ImplicitRef)) {
  ------------------
  |  Branch (63:9): [True: 0, False: 0]
  |  Branch (63:50): [True: 0, False: 0]
  ------------------
   64|       |      // 1 2 H 4
   65|      0|      if ((u1.refs[3] == OBStereo::ImplicitRef) || (u2.refs[3] == OBStereo::ImplicitRef)) {
  ------------------
  |  Branch (65:11): [True: 0, False: 0]
  |  Branch (65:52): [True: 0, False: 0]
  ------------------
   66|      0|        return (u1.refs[1] == u2.refs[1]); // 1 2 H H
   67|      0|      } else {
   68|      0|        return (u1.refs[3] == u2.refs[3]); // 1 H H 4
   69|      0|      }
   70|      0|    } else
   71|      0|      return (u1.refs[2] == u2.refs[2]); // 1 2 3 4  &  1 H 3 4  &  1 2 3 H
   72|       |
   73|      0|    return false;
   74|      0|  }
_ZN9OpenBabel16OBCisTransStereoC2EPNS_5OBMolE:
   80|  77.1k|  OBCisTransStereo::OBCisTransStereo(OBMol *mol) : OBTetraPlanarStereo(mol)
   81|  77.1k|  {
   82|  77.1k|  }
_ZN9OpenBabel16OBCisTransStereoD2Ev:
   85|  81.7k|  {
   86|  81.7k|  }
_ZNK9OpenBabel16OBCisTransStereo7IsValidEv:
   89|  1.03M|  {
   90|  1.03M|    if ((m_cfg.begin == OBStereo::NoRef) || (m_cfg.end == OBStereo::NoRef))
  ------------------
  |  Branch (90:9): [True: 0, False: 1.03M]
  |  Branch (90:45): [True: 0, False: 1.03M]
  ------------------
   91|      0|      return false;
   92|  1.03M|    if (m_cfg.refs.size() != 4)
  ------------------
  |  Branch (92:9): [True: 0, False: 1.03M]
  ------------------
   93|      0|      return false;
   94|  1.03M|    return true;
   95|  1.03M|  }
_ZN9OpenBabel16OBCisTransStereo9SetConfigERKNS0_6ConfigE:
   98|  85.6k|  {
   99|  85.6k|    if (config.begin == OBStereo::NoRef) {
  ------------------
  |  Branch (99:9): [True: 0, False: 85.6k]
  ------------------
  100|      0|      obErrorLog.ThrowError(__FUNCTION__,
  101|      0|          "OBCisTransStereo::SetConfig : double bond begin id is invalid.", obError);
  102|      0|      m_cfg = Config();
  103|      0|      return;
  104|      0|    }
  105|  85.6k|    if (config.end == OBStereo::NoRef) {
  ------------------
  |  Branch (105:9): [True: 0, False: 85.6k]
  ------------------
  106|      0|      obErrorLog.ThrowError(__FUNCTION__,
  107|      0|          "OBCisTransStereo::SetConfig : double bond end id is invalid.", obError);
  108|      0|      m_cfg = Config();
  109|      0|      return;
  110|      0|    }
  111|  85.6k|    if (config.refs.size() != 4) {
  ------------------
  |  Branch (111:9): [True: 0, False: 85.6k]
  ------------------
  112|      0|      std::stringstream ss;
  113|      0|      ss << "OBCisTransStereo::SetConfig : found " << config.refs.size();
  114|      0|      ss << " reference ids, should be 4.";
  115|      0|      obErrorLog.ThrowError(__FUNCTION__, ss.str(), obError);
  116|      0|      m_cfg = Config();
  117|      0|      return;
  118|      0|    }
  119|       |
  120|       |    // store using U shape
  121|  85.6k|    m_cfg = OBTetraPlanarStereo::ToConfig(config, config.refs.at(0), OBStereo::ShapeU);
  122|  85.6k|  }
_ZNK9OpenBabel16OBCisTransStereo9GetConfigENS_8OBStereo5ShapeE:
  125|   994k|  {
  126|   994k|    if (!IsValid())
  ------------------
  |  Branch (126:9): [True: 0, False: 994k]
  ------------------
  127|      0|      return Config();
  128|       |
  129|   994k|    return OBTetraPlanarStereo::ToConfig(m_cfg, m_cfg.refs.at(0), shape);
  130|   994k|  }
_ZNK9OpenBabel16OBCisTransStereo5IsCisEmm:
  147|  7.22k|  {
  148|  7.22k|    return (GetCisRef(id1) == id2);
  149|  7.22k|  }
_ZNK9OpenBabel16OBCisTransStereo16GetCisOrTransRefEmb:
  177|  7.22k|  {
  178|  7.22k|    if (!IsValid())
  ------------------
  |  Branch (178:9): [True: 0, False: 7.22k]
  ------------------
  179|      0|      return OBStereo::NoRef;
  180|       |
  181|  7.22k|    if (id == OBStereo::ImplicitRef)
  ------------------
  |  Branch (181:9): [True: 0, False: 7.22k]
  ------------------
  182|      0|      return OBStereo::NoRef;
  183|       |
  184|       |    // find id
  185|  7.95k|    for (int i = 0; i < 4; ++i) {
  ------------------
  |  Branch (185:21): [True: 7.95k, False: 0]
  ------------------
  186|  7.95k|      if (m_cfg.refs.at(i) == id) {
  ------------------
  |  Branch (186:11): [True: 7.22k, False: 731]
  ------------------
  187|       |        // Use its index to find the index of the cis (or trans) atom
  188|  7.22k|        int j;
  189|  7.22k|        if (getcisref) // GetCisRef
  ------------------
  |  Branch (189:13): [True: 7.22k, False: 0]
  ------------------
  190|  7.22k|          j = 3 - i; // Convert 0 to 3, and 3 to 0
  191|      0|        else // GetTransRef
  192|      0|          j = (i > 1) ? i - 2 : i + 2;
  ------------------
  |  Branch (192:15): [True: 0, False: 0]
  ------------------
  193|       |
  194|  7.22k|        unsigned long refId = m_cfg.refs.at(j);
  195|  7.22k|        return refId;
  196|  7.22k|      }
  197|  7.95k|    }
  198|       |
  199|       |    // id not found
  200|      0|    return OBStereo::NoRef;
  201|  7.22k|  }
_ZNK9OpenBabel16OBCisTransStereo9GetCisRefEm:
  209|  7.22k|  {
  210|  7.22k|    return GetCisOrTransRef(id, true);
  211|  7.22k|  }
_ZNK9OpenBabel16OBCisTransStereo5CloneEPNS_6OBBaseE:
  341|  26.5k|  {
  342|  26.5k|    OBCisTransStereo *data = new OBCisTransStereo(static_cast<OBMol*>(mol));
  343|  26.5k|    data->SetConfig(m_cfg);
  344|  26.5k|    return data;
  345|  26.5k|  }

_ZN9OpenBabel14OBStereoFacade20HasTetrahedralStereoEm:
   89|  1.43M|  {
   90|  1.43M|    EnsureInit();
   91|  1.43M|    if (m_tetrahedralMap.find(atomId) != m_tetrahedralMap.end())
  ------------------
  |  Branch (91:9): [True: 80.4k, False: 1.35M]
  ------------------
   92|  80.4k|      return true;
   93|  1.35M|    return false;
   94|  1.43M|  }
_ZN9OpenBabel14OBStereoFacade17HasCisTransStereoEm:
   97|   473k|  {
   98|   473k|    EnsureInit();
   99|   473k|    if (m_cistransMap.find(bondId) != m_cistransMap.end())
  ------------------
  |  Branch (99:9): [True: 83.6k, False: 389k]
  ------------------
  100|  83.6k|      return true;
  101|   389k|    return false;
  102|   473k|  }
_ZN9OpenBabel14OBStereoFacade21HasSquarePlanarStereoEm:
  105|   769k|  {
  106|   769k|    EnsureInit();
  107|   769k|    if (m_squarePlanarMap.find(atomId) != m_squarePlanarMap.end())
  ------------------
  |  Branch (107:9): [True: 0, False: 769k]
  ------------------
  108|      0|      return true;
  109|   769k|    return false;
  110|   769k|  }
_ZN9OpenBabel14OBStereoFacade20GetTetrahedralStereoEm:
  113|  38.8k|  {
  114|  38.8k|    if (!HasTetrahedralStereo(atomId))
  ------------------
  |  Branch (114:9): [True: 6, False: 38.8k]
  ------------------
  115|      6|      return nullptr;
  116|  38.8k|    return m_tetrahedralMap[atomId];
  117|  38.8k|  }
_ZN9OpenBabel14OBStereoFacade17GetCisTransStereoEm:
  120|  41.8k|  {
  121|  41.8k|    if (!HasCisTransStereo(bondId))
  ------------------
  |  Branch (121:9): [True: 0, False: 41.8k]
  ------------------
  122|      0|      return nullptr;
  123|  41.8k|    return m_cistransMap[bondId];
  124|  41.8k|  }
_ZN9OpenBabel14OBStereoFacade21GetSquarePlanarStereoEm:
  127|  9.77k|  {
  128|  9.77k|    if (!HasSquarePlanarStereo(atomId))
  ------------------
  |  Branch (128:9): [True: 9.77k, False: 0]
  ------------------
  129|  9.77k|      return nullptr;
  130|      0|    return m_squarePlanarMap[atomId];
  131|  9.77k|  }
_ZN9OpenBabel14OBStereoFacade8InitMapsEv:
  134|   670k|  {
  135|   670k|    if (m_perceive && !m_mol->HasChiralityPerceived())
  ------------------
  |  Branch (135:9): [True: 243k, False: 427k]
  |  Branch (135:23): [True: 0, False: 243k]
  ------------------
  136|      0|      PerceiveStereo(m_mol);
  137|       |
  138|   670k|    std::vector<OBGenericData *> stereoData = m_mol->GetAllData(OBGenericDataType::StereoData);
  139|       |
  140|   670k|    std::vector<OBGenericData*>::iterator data;
  141|  1.25M|    for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (141:37): [True: 584k, False: 670k]
  ------------------
  142|   584k|      OBStereo::Type type = ((OBStereoBase*)*data)->GetType();
  143|   584k|      if (type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (143:11): [True: 172k, False: 412k]
  ------------------
  144|   172k|        OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(*data);
  145|   172k|        OBTetrahedralStereo::Config config = ts->GetConfig();
  146|   172k|        if (config.center == OBStereo::NoRef)
  ------------------
  |  Branch (146:13): [True: 0, False: 172k]
  ------------------
  147|      0|          continue;
  148|   172k|        m_tetrahedralMap[config.center] = ts;
  149|   172k|      } else
  150|   412k|      if (type == OBStereo::SquarePlanar) {
  ------------------
  |  Branch (150:11): [True: 0, False: 412k]
  ------------------
  151|      0|        OBSquarePlanarStereo *sp = dynamic_cast<OBSquarePlanarStereo*>(*data);
  152|      0|        OBSquarePlanarStereo::Config config = sp->GetConfig();
  153|      0|        if (config.center == OBStereo::NoRef)
  ------------------
  |  Branch (153:13): [True: 0, False: 0]
  ------------------
  154|      0|          continue;
  155|      0|        m_squarePlanarMap[config.center] = sp;
  156|      0|      } else
  157|   412k|      if (type == OBStereo::CisTrans) {
  ------------------
  |  Branch (157:11): [True: 412k, False: 0]
  ------------------
  158|   412k|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
  159|   412k|        OBCisTransStereo::Config config = ct->GetConfig();
  160|       |        // find the bond id from begin & end atom ids
  161|   412k|        unsigned long id = OBStereo::NoRef;
  162|   412k|        OBAtom *a = m_mol->GetAtomById(config.begin);
  163|   412k|        if (!a)
  ------------------
  |  Branch (163:13): [True: 0, False: 412k]
  ------------------
  164|      0|          continue;
  165|   476k|        FOR_BONDS_OF_ATOM (bond, a) {
  ------------------
  |  |  420|   412k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 476k, False: 179k]
  |  |  ------------------
  ------------------
  166|   476k|          unsigned long beginId = bond->GetBeginAtom()->GetId();
  167|   476k|          unsigned long endId = bond->GetEndAtom()->GetId();
  168|   476k|          if ((beginId == config.begin && endId == config.end) ||
  ------------------
  |  Branch (168:16): [True: 245k, False: 230k]
  |  Branch (168:43): [True: 233k, False: 12.1k]
  ------------------
  169|   242k|              (beginId == config.end && endId == config.begin)) {
  ------------------
  |  Branch (169:16): [True: 0, False: 242k]
  |  Branch (169:41): [True: 0, False: 0]
  ------------------
  170|   233k|            id = bond->GetId();
  171|   233k|            break;
  172|   233k|          }
  173|   476k|        }
  174|   412k|        if (id == OBStereo::NoRef)
  ------------------
  |  Branch (174:13): [True: 179k, False: 233k]
  ------------------
  175|   179k|          continue;
  176|   233k|        m_cistransMap[id] = ct;
  177|   233k|      }
  178|   584k|    }
  179|       |
  180|   670k|    m_init = true;
  181|   670k|  }

_ZN9OpenBabel14PerceiveStereoEPNS_5OBMolEb:
   80|   242k|  {
   81|   242k|    switch (mol->GetDimension()) {
   82|   135k|      case 3:
  ------------------
  |  Branch (82:7): [True: 135k, False: 107k]
  ------------------
   83|   135k|        StereoFrom3D(mol, force);
   84|   135k|        break;
   85|  1.33k|      case 2:
  ------------------
  |  Branch (85:7): [True: 1.33k, False: 241k]
  ------------------
   86|  1.33k|        StereoFrom2D(mol, nullptr, force);
   87|  1.33k|        break;
   88|   106k|      default:
  ------------------
  |  Branch (88:7): [True: 106k, False: 136k]
  ------------------
   89|   106k|        StereoFrom0D(mol);
   90|   106k|        break;
   91|   242k|    }
   92|   242k|    if (obErrorLog.GetOutputLevel() >= obAuditMsg)
  ------------------
  |  Branch (92:9): [True: 0, False: 242k]
  ------------------
   93|      0|      obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::PerceiveStereo", obAuditMsg);
   94|   242k|  }
_ZN9OpenBabel24mayHaveTetrahedralCenterEPNS_5OBMolE:
  101|   249k|  {
  102|   249k|    std::vector<OBAtom*>::iterator ia;
  103|  1.02M|    for (OBAtom *atom = mol->BeginAtom(ia); atom; atom = mol->NextAtom(ia))
  ------------------
  |  Branch (103:45): [True: 780k, False: 241k]
  ------------------
  104|   780k|      if (atom->GetHyb() == 3 && atom->GetHvyDegree() >= 3) {
  ------------------
  |  Branch (104:11): [True: 171k, False: 608k]
  |  Branch (104:34): [True: 8.10k, False: 163k]
  ------------------
  105|  8.10k|        return true;
  106|  8.10k|      }
  107|   241k|    return false;
  108|   249k|  }
_ZN9OpenBabel19mayHaveCisTransBondEPNS_5OBMolE:
  115|   241k|  {
  116|   241k|    std::vector<OBBond*>::iterator ib;
  117|   458k|    for (OBBond *bond = mol->BeginBond(ib); bond; bond = mol->NextBond(ib))
  ------------------
  |  Branch (117:45): [True: 254k, False: 203k]
  ------------------
  118|   254k|      if (bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (118:11): [True: 37.5k, False: 217k]
  ------------------
  119|  37.5k|        return true;
  120|  37.5k|      }
  121|   203k|    return false;
  122|   241k|  }
_ZN9OpenBabel22isPotentialTetrahedralEPNS_6OBAtomE:
  138|   679k|  {
  139|       |    // consider only potential steroecenters
  140|   679k|    if ((atom->GetHyb() != 3 && !(atom->GetHyb() == 5 && atom->GetAtomicNum() == OBElements::Phosphorus))
  ------------------
  |  Branch (140:10): [True: 529k, False: 149k]
  |  Branch (140:35): [True: 12.4k, False: 516k]
  |  Branch (140:58): [True: 9.87k, False: 2.59k]
  ------------------
  141|   159k|        || atom->GetTotalDegree() > 4 || atom->GetHvyDegree() < 3 || atom->GetHvyDegree() > 4)
  ------------------
  |  Branch (141:12): [True: 10.0k, False: 149k]
  |  Branch (141:42): [True: 117k, False: 32.6k]
  |  Branch (141:70): [True: 0, False: 32.6k]
  ------------------
  142|   646k|      return false;
  143|       |    // skip non-chiral N
  144|  32.6k|    if (atom->GetAtomicNum() == OBElements::Nitrogen && atom->GetFormalCharge()==0) {
  ------------------
  |  Branch (144:9): [True: 4.18k, False: 28.4k]
  |  Branch (144:57): [True: 4.05k, False: 129]
  ------------------
  145|  4.05k|      int nbrRingAtomCount = 0;
  146|  12.9k|      FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  4.05k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 12.9k, False: 4.05k]
  |  |  ------------------
  ------------------
  147|  12.9k|        if (nbr->IsInRing())
  ------------------
  |  Branch (147:13): [True: 12.0k, False: 874]
  ------------------
  148|  12.0k|          nbrRingAtomCount++;
  149|  12.9k|      }
  150|  4.05k|      if (nbrRingAtomCount < 3)
  ------------------
  |  Branch (150:11): [True: 764, False: 3.29k]
  ------------------
  151|    764|        return false;
  152|  4.05k|    }
  153|  31.8k|    if (atom->GetAtomicNum() == OBElements::Carbon) {
  ------------------
  |  Branch (153:9): [True: 1.51k, False: 30.3k]
  ------------------
  154|  1.51k|      if (atom->GetFormalCharge())
  ------------------
  |  Branch (154:11): [True: 192, False: 1.32k]
  ------------------
  155|    192|        return false;
  156|  4.67k|      FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.32k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 4.67k, False: 1.32k]
  |  |  ------------------
  ------------------
  157|  4.67k|        if (nbr->GetAtomicNum() == 26 && nbr->GetExplicitDegree() > 7)
  ------------------
  |  Branch (157:13): [True: 33, False: 4.64k]
  |  Branch (157:42): [True: 0, False: 33]
  ------------------
  158|      0|          return false;
  159|  4.67k|      }
  160|  1.32k|    }
  161|       |
  162|  31.6k|    return true;
  163|  31.8k|  }
_ZN9OpenBabel16isUnitInFragmentEPNS_5OBMolERKNS_12OBStereoUnitERKNS_8OBBitVecE:
  204|  16.5k|  {
  205|  16.5k|    if (unit.type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (205:9): [True: 8.49k, False: 8.02k]
  ------------------
  206|  8.49k|      if (fragment.BitIsSet(unit.id))
  ------------------
  |  Branch (206:11): [True: 3.90k, False: 4.58k]
  ------------------
  207|  3.90k|        return true;
  208|  8.49k|    } else if(unit.type == OBStereo::CisTrans) {
  ------------------
  |  Branch (208:15): [True: 8.02k, False: 0]
  ------------------
  209|  8.02k|      OBBond *bond = mol->GetBondById(unit.id);
  210|  8.02k|      OBAtom *begin = bond->GetBeginAtom();
  211|  8.02k|      OBAtom *end = bond->GetEndAtom();
  212|  8.02k|      if (fragment.BitIsSet(begin->GetId()) || fragment.BitIsSet(end->GetId()))
  ------------------
  |  Branch (212:11): [True: 2.03k, False: 5.98k]
  |  Branch (212:48): [True: 11, False: 5.97k]
  ------------------
  213|  2.05k|        return true;
  214|  8.02k|    }
  215|  10.5k|    return false;
  216|  16.5k|  }
_ZN9OpenBabel13isTetrahedralEPNS_6OBAtomERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEE:
  237|  14.2k|  {
  238|   148k|    for (std::size_t i = 0; i < units.size(); ++i) {
  ------------------
  |  Branch (238:29): [True: 148k, False: 63]
  ------------------
  239|   148k|      const OBStereoUnit &unit = units[i];
  240|   148k|      if (unit.type != OBStereo::Tetrahedral)
  ------------------
  |  Branch (240:11): [True: 3.73k, False: 144k]
  ------------------
  241|  3.73k|        continue;
  242|   144k|      if (unit.id == atom->GetId())
  ------------------
  |  Branch (242:11): [True: 14.1k, False: 130k]
  ------------------
  243|  14.1k|        return true;
  244|   144k|    }
  245|     63|    return false;
  246|  14.2k|  }
_ZN9OpenBabel10isCisTransEPNS_6OBBondERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEE:
  253|  30.5k|  {
  254|  1.71M|    for (std::size_t i = 0; i < units.size(); ++i) {
  ------------------
  |  Branch (254:29): [True: 1.71M, False: 23]
  ------------------
  255|  1.71M|      const OBStereoUnit &unit = units[i];
  256|  1.71M|      if (unit.type != OBStereo::CisTrans)
  ------------------
  |  Branch (256:11): [True: 656k, False: 1.06M]
  ------------------
  257|   656k|        continue;
  258|  1.06M|      if (unit.id == bond->GetId())
  ------------------
  |  Branch (258:11): [True: 30.5k, False: 1.03M]
  ------------------
  259|  30.5k|        return true;
  260|  1.06M|    }
  261|     23|    return false;
  262|  30.5k|  }
_ZN9OpenBabel32classifyTetrahedralNbrSymClassesERKNSt3__16vectorIjNS0_9allocatorIjEEEEPNS_6OBAtomE:
  269|  15.7k|  {
  270|  15.7k|    std::vector<unsigned int> nbrClasses, nbrClassesCopy, uniqueClasses;
  271|  15.7k|    FOR_NBORS_OF_ATOM (nbr, atom)
  ------------------
  |  |  419|  15.7k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 67.9k, False: 15.7k]
  |  |  ------------------
  ------------------
  272|  67.9k|      nbrClasses.push_back(symClasses.at(nbr->GetIndex()));
  273|       |    // add an implicit ref if there are only 3 explicit
  274|  15.7k|    if (nbrClasses.size() == 3)
  ------------------
  |  Branch (274:9): [True: 1.16k, False: 14.6k]
  ------------------
  275|  1.16k|      nbrClasses.push_back(OBStereo::ImplicitRef);
  276|       |
  277|       |    // use some STL to work out the number of unique classes
  278|  15.7k|    nbrClassesCopy = nbrClasses; // keep copy for count below
  279|  15.7k|    std::sort(nbrClasses.begin(), nbrClasses.end());
  280|  15.7k|    std::vector<unsigned int>::iterator endLoc = std::unique(nbrClasses.begin(), nbrClasses.end());
  281|  15.7k|    std::copy(nbrClasses.begin(), endLoc, std::back_inserter(uniqueClasses));
  282|       |
  283|  15.7k|    switch (uniqueClasses.size()) {
  284|  9.64k|      case 4:
  ------------------
  |  Branch (284:7): [True: 9.64k, False: 6.12k]
  ------------------
  285|  9.64k|        return T1234; // e.g. 1 2 3 4
  286|  3.05k|      case 3:
  ------------------
  |  Branch (286:7): [True: 3.05k, False: 12.7k]
  ------------------
  287|  3.05k|        return T1123; // e.g. 1 1 2 3
  288|  1.09k|      case 2:
  ------------------
  |  Branch (288:7): [True: 1.09k, False: 14.6k]
  ------------------
  289|       |        // differentiate between T1122 and T1112
  290|  1.09k|        if (std::count(nbrClassesCopy.begin(), nbrClassesCopy.end(), uniqueClasses.at(0)) == 2)
  ------------------
  |  Branch (290:13): [True: 382, False: 710]
  ------------------
  291|    382|          return T1122; // e.g. 1 1 2 2
  292|    710|        else
  293|    710|          return T1112; // e.g. 1 1 1 2
  294|    480|      case 1:
  ------------------
  |  Branch (294:7): [True: 480, False: 15.2k]
  ------------------
  295|  1.97k|	  default:
  ------------------
  |  Branch (295:4): [True: 1.49k, False: 14.2k]
  ------------------
  296|  1.97k|        return T1111; // e.g. 1 1 1 1
  297|  15.7k|    }
  298|  15.7k|  }
_ZN9OpenBabel29classifyCisTransNbrSymClassesERKNSt3__16vectorIjNS0_9allocatorIjEEEEPNS_6OBBondEPNS_6OBAtomE:
  304|  1.69k|  {
  305|  1.69k|    std::vector<unsigned int> nbrClasses, uniqueClasses;
  306|  4.74k|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  1.69k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 4.74k, False: 1.69k]
  |  |  ------------------
  ------------------
  307|  4.74k|      if (nbr->GetIdx() != doubleBond->GetNbrAtom(atom)->GetIdx())
  ------------------
  |  Branch (307:11): [True: 3.05k, False: 1.69k]
  ------------------
  308|  3.05k|        nbrClasses.push_back(symClasses.at(nbr->GetIndex()));
  309|  4.74k|    }
  310|       |
  311|  1.69k|    if (nbrClasses.size() == 1)
  ------------------
  |  Branch (311:9): [True: 336, False: 1.35k]
  ------------------
  312|    336|      nbrClasses.push_back(OBStereo::ImplicitRef);
  313|       |
  314|  1.69k|    if (nbrClasses.at(0) == nbrClasses.at(1))
  ------------------
  |  Branch (314:9): [True: 1.13k, False: 556]
  ------------------
  315|  1.13k|      return C11; // e.g. 1 1
  316|    556|    else
  317|    556|      return C12; // e.g. 1 2
  318|  1.69k|  }
_ZN9OpenBabel10mergeRingsEPNS_5OBMolERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
  326|  45.6k|  {
  327|  45.6k|    std::vector<OBRing*> rings = mol->GetSSSR();
  328|       |
  329|  45.6k|    std::vector<OBBitVec> result;
  330|   120k|    for (std::size_t i = 0; i < rings.size(); ++i) {
  ------------------
  |  Branch (330:29): [True: 75.3k, False: 45.6k]
  ------------------
  331|       |      // check if ring shares atom with previously found ring
  332|  75.3k|      bool found = false;
  333|   368k|      for (std::size_t j = 0; j < result.size(); ++j) {
  ------------------
  |  Branch (333:31): [True: 334k, False: 34.9k]
  ------------------
  334|   334k|        std::vector<unsigned int> shared;
  335|       |        // foreach ring atom
  336|  4.27M|        for (std::size_t k = 0; k < rings[i]->_path.size(); ++k) {
  ------------------
  |  Branch (336:33): [True: 3.93M, False: 334k]
  ------------------
  337|       |          // check if the ring atom is in the current result bitvec
  338|  3.93M|          if (result[j].BitIsSet(rings[i]->_path[k])) {
  ------------------
  |  Branch (338:15): [True: 117k, False: 3.82M]
  ------------------
  339|   117k|            shared.push_back(rings[i]->_path[k]);
  340|   117k|          }
  341|  3.93M|        }
  342|       |
  343|   334k|        if (shared.size() > 1) {
  ------------------
  |  Branch (343:13): [True: 38.6k, False: 295k]
  ------------------
  344|  38.6k|          found = true;
  345|   295k|        } else if (shared.size() == 1) {
  ------------------
  |  Branch (345:20): [True: 12.8k, False: 282k]
  ------------------
  346|  12.8k|          int classification = classifyTetrahedralNbrSymClasses(symClasses, mol->GetAtom(shared[0]));
  347|  12.8k|          if (classification == T1122 || classification == T1111)
  ------------------
  |  Branch (347:15): [True: 236, False: 12.5k]
  |  Branch (347:42): [True: 1.49k, False: 11.0k]
  ------------------
  348|  1.73k|            found = true;
  349|  12.8k|        }
  350|       |
  351|   334k|        if (found) {
  ------------------
  |  Branch (351:13): [True: 40.3k, False: 293k]
  ------------------
  352|       |          // add bits for the atoms in the ring
  353|   227k|          for (std::size_t l = 0; l < rings[i]->_path.size(); ++l)
  ------------------
  |  Branch (353:35): [True: 186k, False: 40.3k]
  ------------------
  354|   186k|            result[j].SetBitOn(rings[i]->_path[l]);
  355|  40.3k|          break;
  356|  40.3k|        }
  357|   334k|      }
  358|       |
  359|       |      // add the ring as a new bitvec if it shares no atom with a previous ring
  360|  75.3k|      if (!found) {
  ------------------
  |  Branch (360:11): [True: 34.9k, False: 40.3k]
  ------------------
  361|  34.9k|        OBBitVec r;
  362|   294k|        for (std::size_t l = 0; l < rings[i]->_path.size(); ++l)
  ------------------
  |  Branch (362:33): [True: 260k, False: 34.9k]
  ------------------
  363|   260k|          r.SetBitOn(rings[i]->_path[l]);
  364|  34.9k|        result.push_back(r);
  365|  34.9k|      }
  366|  75.3k|    }
  367|       |
  368|  45.6k|    return result;
  369|  45.6k|  }
_ZN9OpenBabel7addNbrsERNS_8OBBitVecEPNS_6OBAtomES3_:
  386|  77.3k|  {
  387|   288k|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  77.3k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 288k, False: 77.3k]
  |  |  ------------------
  ------------------
  388|       |      // don't pass through skip
  389|   288k|      if (nbr->GetId() == skip->GetId())
  ------------------
  |  Branch (389:11): [True: 20.7k, False: 267k]
  ------------------
  390|  20.7k|        continue;
  391|       |      // skip visited atoms
  392|   267k|      if (fragment.BitIsSet(nbr->GetId()))
  ------------------
  |  Branch (392:11): [True: 197k, False: 70.1k]
  ------------------
  393|   197k|        continue;
  394|       |      // add the neighbor atom to the fragment
  395|  70.1k|      fragment.SetBitOn(nbr->GetId());
  396|       |      // recurse...
  397|  70.1k|      addNbrs(fragment, &*nbr, skip);
  398|  70.1k|    }
  399|  77.3k|  }
_ZN9OpenBabel11getFragmentEPNS_6OBAtomES1_:
  407|  7.24k|  {
  408|  7.24k|    OBBitVec fragment;
  409|  7.24k|    fragment.SetBitOn(atom->GetId());
  410|       |    // start the recursion
  411|  7.24k|    addNbrs(fragment, atom, skip);
  412|  7.24k|    return fragment;
  413|  7.24k|  }
_ZN9OpenBabel10StartRule1ERKNSt3__16vectorIjNS0_9allocatorIjEEEERKNS1_INS_10StereoRingENS2_IS7_EEEERNS1_INS_12OBStereoUnitENS2_ISC_EEEERS4_:
  603|  47.5k|  {
  604|   220k|    for (std::size_t i = 0; i < rings.size(); ++i) {
  ------------------
  |  Branch (604:29): [True: 173k, False: 47.5k]
  ------------------
  605|       |      //cout << "Checking ring: " << i << endl;
  606|       |
  607|       |      // tetrahedral atoms
  608|   255k|      for (std::size_t j = 0; j < rings[i].paraAtoms.size(); ++j) {
  ------------------
  |  Branch (608:31): [True: 82.1k, False: 173k]
  ------------------
  609|  82.1k|        const StereoRing::ParaAtom &paraAtom = rings[i].paraAtoms[j];
  610|       |        // skip the atom if it is already in stereoAtoms
  611|  82.1k|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraAtom.inIdx) != stereoAtoms.end())
  ------------------
  |  Branch (611:13): [True: 69.1k, False: 12.9k]
  ------------------
  612|  69.1k|          continue;
  613|       |
  614|  12.9k|        std::vector<bool> visitedRings(rings.size(), false);
  615|       |        //visitedRings[i] = true;
  616|  12.9k|        if (ApplyRule1(paraAtom, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (616:13): [True: 7.28k, False: 5.68k]
  ------------------
  617|  7.28k|          bool isStereoUnit = false;
  618|  7.28k|          if (paraAtom.outsideNbrs.size() == 1)
  ------------------
  |  Branch (618:15): [True: 2.23k, False: 5.04k]
  ------------------
  619|  2.23k|            isStereoUnit = true;
  620|  7.28k|          if (paraAtom.outsideNbrs.size() == 2) {
  ------------------
  |  Branch (620:15): [True: 5.04k, False: 2.23k]
  ------------------
  621|  5.04k|            if (symmetry_classes[paraAtom.outsideNbrs[0]->GetIndex()] == symmetry_classes[paraAtom.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (621:17): [True: 2.55k, False: 2.49k]
  ------------------
  622|       |              // check for spiro atom
  623|  2.55k|              bool isSpiro = false;
  624|  8.80k|              for (std::size_t k = 0; k < rings[i].paraAtoms.size(); ++k) {
  ------------------
  |  Branch (624:39): [True: 6.25k, False: 2.55k]
  ------------------
  625|  6.25k|                const StereoRing::ParaAtom &paraAtom2 = rings[i].paraAtoms[k];
  626|  6.25k|                if (paraAtom.inIdx == paraAtom2.outIdx && paraAtom.insideNbrs == paraAtom2.outsideNbrs) {
  ------------------
  |  Branch (626:21): [True: 2.55k, False: 3.70k]
  |  Branch (626:59): [True: 0, False: 2.55k]
  ------------------
  627|      0|                  isSpiro = true;
  628|      0|                  if (ApplyRule1(paraAtom2, symmetry_classes, rings, visitedRings, units, stereoAtoms))
  ------------------
  |  Branch (628:23): [True: 0, False: 0]
  ------------------
  629|      0|                    isStereoUnit = true;
  630|      0|                }
  631|  6.25k|              }
  632|  2.55k|              if (!isSpiro)
  ------------------
  |  Branch (632:19): [True: 2.55k, False: 0]
  ------------------
  633|  2.55k|                isStereoUnit = checkLigands(paraAtom, units);
  634|       |              //cout << "isStereoUnit = " << isStereoUnit << endl;
  635|  2.55k|            } else {
  636|  2.49k|              isStereoUnit = true;
  637|  2.49k|            }
  638|  5.04k|          }
  639|       |
  640|  7.28k|          if (isStereoUnit) {
  ------------------
  |  Branch (640:15): [True: 5.54k, False: 1.74k]
  ------------------
  641|  5.54k|            stereoAtoms.push_back(paraAtom.inIdx);
  642|  5.54k|            OBAtom *atom = paraAtom.insideNbrs[0]->GetParent()->GetAtomById(paraAtom.id);
  643|  5.54k|            units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId(), true));
  644|  5.54k|          }
  645|  7.28k|        }
  646|       |
  647|  12.9k|      }
  648|       |
  649|       |      // cistrans bonds
  650|   182k|      for (std::size_t j = 0; j < rings[i].paraBonds.size(); ++j) {
  ------------------
  |  Branch (650:31): [True: 8.96k, False: 173k]
  ------------------
  651|  8.96k|        const StereoRing::ParaBond &paraBond = rings[i].paraBonds[j];
  652|       |        // skip the atom if it is already in stereoAtoms
  653|  8.96k|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraBond.inIdx) != stereoAtoms.end())
  ------------------
  |  Branch (653:13): [True: 7.14k, False: 1.82k]
  ------------------
  654|  7.14k|          continue;
  655|       |
  656|  1.82k|        std::vector<bool> visitedRings(rings.size(), false);
  657|       |        //visitedRings[i] = true;
  658|  1.82k|        if (ApplyRule1(paraBond, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (658:13): [True: 1.03k, False: 785]
  ------------------
  659|  1.03k|          bool isStereoUnit = false;
  660|  1.03k|          if (paraBond.outsideNbrs.size() == 1)
  ------------------
  |  Branch (660:15): [True: 181, False: 854]
  ------------------
  661|    181|            isStereoUnit = true;
  662|  1.03k|          if (paraBond.outsideNbrs.size() == 2) {
  ------------------
  |  Branch (662:15): [True: 854, False: 181]
  ------------------
  663|    854|            if (symmetry_classes[paraBond.outsideNbrs[0]->GetIndex()] == symmetry_classes[paraBond.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (663:17): [True: 754, False: 100]
  ------------------
  664|       |              // check for spiro bond
  665|    754|              bool isSpiro = false;
  666|  2.45k|              for (std::size_t k = 0; k < rings[i].paraBonds.size(); ++k) {
  ------------------
  |  Branch (666:39): [True: 1.70k, False: 754]
  ------------------
  667|  1.70k|                const StereoRing::ParaBond &paraBond2 = rings[i].paraBonds[k];
  668|  1.70k|                if (paraBond.inIdx == paraBond2.outIdx && paraBond.insideNbrs == paraBond2.outsideNbrs) {
  ------------------
  |  Branch (668:21): [True: 195, False: 1.50k]
  |  Branch (668:59): [True: 190, False: 5]
  ------------------
  669|    190|                  isSpiro = true;
  670|    190|                  if (ApplyRule1(paraBond2, symmetry_classes, rings, visitedRings, units, stereoAtoms))
  ------------------
  |  Branch (670:23): [True: 30, False: 160]
  ------------------
  671|     30|                    isStereoUnit = true;
  672|    190|                }
  673|  1.70k|              }
  674|    754|              if (!isSpiro)
  ------------------
  |  Branch (674:19): [True: 564, False: 190]
  ------------------
  675|    564|                isStereoUnit = checkLigands(paraBond, units);
  676|       |              //cout << "isStereoUnit = " << isStereoUnit << endl;
  677|    754|            } else {
  678|    100|              isStereoUnit = true;
  679|    100|            }
  680|    854|          }
  681|       |
  682|  1.03k|          if (isStereoUnit) {
  ------------------
  |  Branch (682:15): [True: 655, False: 380]
  ------------------
  683|    655|            stereoAtoms.push_back(paraBond.inIdx);
  684|    655|            stereoAtoms.push_back(paraBond.outIdx);
  685|    655|            OBBond *bond = paraBond.insideNbrs[0]->GetParent()->GetBondById(paraBond.id);
  686|    655|            units.push_back(OBStereoUnit(OBStereo::CisTrans, bond->GetId(), true));
  687|    655|          }
  688|  1.03k|        }
  689|       |
  690|  1.82k|      }
  691|       |
  692|       |
  693|   173k|    }
  694|       |
  695|  47.5k|  }
_ZN9OpenBabel20FindStereogenicUnitsEPNS_5OBMolERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
  703|   249k|  {
  704|   249k|    OBStereoUnitSet units;
  705|       |
  706|       |    // do quick test to see if there are any possible stereogenic units
  707|   249k|    if (!mayHaveTetrahedralCenter(mol) && !mayHaveCisTransBond(mol))
  ------------------
  |  Branch (707:9): [True: 241k, False: 8.10k]
  |  Branch (707:43): [True: 203k, False: 37.5k]
  ------------------
  708|   203k|      return units;
  709|       |
  710|       |    // make sure we have symmetry classes for all atoms
  711|  45.6k|    if (symClasses.size() != mol->NumAtoms())
  ------------------
  |  Branch (711:9): [True: 0, False: 45.6k]
  ------------------
  712|      0|      return units;
  713|       |
  714|       |    // para-stereocenters candidates
  715|  45.6k|    std::vector<unsigned int> stereoAtoms; // Tetrahedral = idx, CisTrans = begin & end idx
  716|  45.6k|    std::vector<unsigned int> paraAtoms;
  717|  45.6k|    std::vector<unsigned int> paraBonds;
  718|       |
  719|       |    /**
  720|       |     * true Tetrahedral stereocenters:
  721|       |     * - have four different symmetry classes for the ligands to the central atom
  722|       |     */
  723|  45.6k|    bool ischiral;
  724|  45.6k|    std::vector<OBAtom*>::iterator ia;
  725|   724k|    for (OBAtom *atom = mol->BeginAtom(ia); atom; atom = mol->NextAtom(ia)) {
  ------------------
  |  Branch (725:45): [True: 679k, False: 45.6k]
  ------------------
  726|   679k|      if (!isPotentialTetrahedral(atom))
  ------------------
  |  Branch (726:11): [True: 647k, False: 31.6k]
  ------------------
  727|   647k|        continue;
  728|       |
  729|       |      // list containing neighbor symmetry classes
  730|  31.6k|      std::vector<unsigned int> tlist;
  731|  31.6k|      ischiral = true;
  732|       |
  733|       |      // check neighbors to see if this atom is stereogenic
  734|  31.6k|      std::vector<OBBond*>::iterator j;
  735|   118k|      for (OBAtom *nbr = atom->BeginNbrAtom(j); nbr; nbr = atom->NextNbrAtom(j)) {
  ------------------
  |  Branch (735:49): [True: 95.4k, False: 23.1k]
  ------------------
  736|       |        // check if we already have a neighbor with this symmetry class
  737|  95.4k|        std::vector<unsigned int>::iterator k;
  738|   196k|        for (k = tlist.begin(); k != tlist.end(); ++k)
  ------------------
  |  Branch (738:33): [True: 100k, False: 95.4k]
  ------------------
  739|   100k|          if (symClasses[nbr->GetIndex()] == *k) {
  ------------------
  |  Branch (739:15): [True: 8.48k, False: 92.2k]
  ------------------
  740|  8.48k|            ischiral = false;
  741|       |            // if so, might still be a para-stereocenter
  742|  8.48k|            paraAtoms.push_back(atom->GetIdx());
  743|  8.48k|          }
  744|       |
  745|  95.4k|        if (ischiral)
  ------------------
  |  Branch (745:13): [True: 87.0k, False: 8.48k]
  ------------------
  746|       |          // keep track of all neighbors, so we can detect duplicates
  747|  87.0k|          tlist.push_back(symClasses[nbr->GetIndex()]);
  748|  8.48k|        else
  749|  8.48k|          break;
  750|  95.4k|      }
  751|       |
  752|  31.6k|      if (ischiral) {
  ------------------
  |  Branch (752:11): [True: 23.1k, False: 8.48k]
  ------------------
  753|       |        // true-stereocenter found
  754|  23.1k|        stereoAtoms.push_back(atom->GetIdx());
  755|  23.1k|        units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId()));
  756|  23.1k|      }
  757|  31.6k|    }
  758|       |
  759|       |    /**
  760|       |     * true CisTrans stereocenters:
  761|       |     * - each terminal has two different symmetry classes for it's ligands
  762|       |     */
  763|  45.6k|    bool isCisTransBond;
  764|  45.6k|    std::vector<OBBond*>::iterator ib;
  765|   754k|    for (OBBond *bond = mol->BeginBond(ib); bond; bond = mol->NextBond(ib)) {
  ------------------
  |  Branch (765:45): [True: 708k, False: 45.6k]
  ------------------
  766|   708k|      if (bond->IsInRing() && bond->IsAromatic())
  ------------------
  |  Branch (766:11): [True: 369k, False: 339k]
  |  Branch (766:31): [True: 1.03k, False: 368k]
  ------------------
  767|  1.03k|        continue; // Exclude C=C in phenyl rings for example
  768|       |
  769|   707k|      if (bond->GetBondOrder() == 2) {
  ------------------
  |  Branch (769:11): [True: 108k, False: 599k]
  ------------------
  770|   108k|        OBAtom *begin = bond->GetBeginAtom();
  771|   108k|        OBAtom *end = bond->GetEndAtom();
  772|   108k|        if (!begin || !end)
  ------------------
  |  Branch (772:13): [True: 0, False: 108k]
  |  Branch (772:23): [True: 0, False: 108k]
  ------------------
  773|      0|          continue;
  774|       |
  775|   108k|        if (begin->GetTotalDegree() > 3 || end->GetTotalDegree() > 3)
  ------------------
  |  Branch (775:13): [True: 7.05k, False: 101k]
  |  Branch (775:44): [True: 594, False: 100k]
  ------------------
  776|  7.64k|          continue; // e.g. C=Ru where the Ru has four substituents
  777|       |
  778|       |        // Needs to have at least one explicit single bond at either end
  779|       |        // FIXME: timvdm: what about C=C=C=C
  780|   100k|        if (!begin->HasSingleBond() || !end->HasSingleBond())
  ------------------
  |  Branch (780:13): [True: 26.3k, False: 74.4k]
  |  Branch (780:40): [True: 1.99k, False: 72.4k]
  ------------------
  781|  28.3k|          continue;
  782|       |
  783|  72.4k|        isCisTransBond = true;
  784|  72.4k|        std::vector<OBBond*>::iterator j;
  785|       |
  786|  72.4k|        if (begin->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (786:13): [True: 37.2k, False: 35.1k]
  ------------------
  787|       |          // Begin atom has two explicit neighbors. One is the end atom. The other should
  788|       |          // be a heavy atom - this is what we test here.
  789|       |          // (There is a third, implicit, neighbor which is either a hydrogen
  790|       |          // or a lone pair.)
  791|  37.2k|          if (begin->ExplicitHydrogenCount() == 1)
  ------------------
  |  Branch (791:15): [True: 6.85k, False: 30.4k]
  ------------------
  792|  6.85k|            isCisTransBond = false;
  793|  37.2k|        } else if (begin->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (793:20): [True: 35.1k, False: 0]
  ------------------
  794|  35.1k|          std::vector<unsigned int> tlist;
  795|       |
  796|   100k|          for (OBAtom *nbr = begin->BeginNbrAtom(j); nbr; nbr = begin->NextNbrAtom(j)) {
  ------------------
  |  Branch (796:54): [True: 100k, False: 0]
  ------------------
  797|       |            // skip end atom
  798|   100k|            if (nbr->GetId() == end->GetId())
  ------------------
  |  Branch (798:17): [True: 30.3k, False: 70.3k]
  ------------------
  799|  30.3k|              continue;
  800|       |            // do we already have an atom with this symmetry class?
  801|  70.3k|            if (tlist.size()) {
  ------------------
  |  Branch (801:17): [True: 35.1k, False: 35.1k]
  ------------------
  802|       |              // compare second with first
  803|  35.1k|              if (symClasses[nbr->GetIndex()] == tlist.at(0)) {
  ------------------
  |  Branch (803:19): [True: 1.13k, False: 34.0k]
  ------------------
  804|  1.13k|                isCisTransBond = false;
  805|       |                // if same, might still be a para-stereocenter
  806|  1.13k|                paraBonds.push_back(bond->GetIdx());
  807|  1.13k|              }
  808|  35.1k|              break;
  809|  35.1k|            }
  810|       |
  811|       |            // save first symmetry class
  812|  35.1k|            tlist.push_back(symClasses[nbr->GetIndex()]);
  813|  35.1k|          }
  814|  35.1k|        } else {
  815|       |          // Valence is not 2 or 3, for example SR3=NR
  816|      0|          isCisTransBond = false;
  817|      0|        }
  818|       |
  819|  72.4k|        if (!isCisTransBond)
  ------------------
  |  Branch (819:13): [True: 7.99k, False: 64.4k]
  ------------------
  820|  7.99k|          continue;
  821|       |
  822|  64.4k|        if (end->GetExplicitDegree() == 2) {
  ------------------
  |  Branch (822:13): [True: 28.0k, False: 36.4k]
  ------------------
  823|       |          // see comment above for begin atom
  824|  28.0k|          if (end->ExplicitHydrogenCount() == 1)
  ------------------
  |  Branch (824:15): [True: 762, False: 27.2k]
  ------------------
  825|    762|            isCisTransBond = false;
  826|  36.4k|        } else if (end->GetExplicitDegree() == 3) {
  ------------------
  |  Branch (826:20): [True: 36.4k, False: 0]
  ------------------
  827|  36.4k|          std::vector<unsigned int> tlist;
  828|       |
  829|   109k|          for (OBAtom *nbr = end->BeginNbrAtom(j); nbr; nbr = end->NextNbrAtom(j)) {
  ------------------
  |  Branch (829:52): [True: 109k, False: 0]
  ------------------
  830|       |            // skip end atom
  831|   109k|            if (nbr->GetId() == begin->GetId())
  ------------------
  |  Branch (831:17): [True: 36.3k, False: 72.8k]
  ------------------
  832|  36.3k|              continue;
  833|       |            // do we already have an atom with this symmetry class?
  834|  72.8k|            if (tlist.size()) {
  ------------------
  |  Branch (834:17): [True: 36.4k, False: 36.4k]
  ------------------
  835|       |              // compare second with first
  836|  36.4k|              if (symClasses[nbr->GetIndex()] == tlist.at(0)) {
  ------------------
  |  Branch (836:19): [True: 579, False: 35.8k]
  ------------------
  837|       |                // if same, might still be a para-stereocenter
  838|    579|                paraBonds.push_back(bond->GetIdx());
  839|    579|                isCisTransBond = false;
  840|    579|              }
  841|  36.4k|              break;
  842|  36.4k|            }
  843|       |
  844|       |            // save first symmetry class
  845|  36.4k|            tlist.push_back(symClasses[nbr->GetIndex()]);
  846|  36.4k|          }
  847|  36.4k|        } else {
  848|       |          // Valence is not 2 or 3, for example SR3=NR
  849|      0|          isCisTransBond = false;
  850|      0|        }
  851|       |
  852|  64.4k|        if (isCisTransBond)
  ------------------
  |  Branch (852:13): [True: 63.1k, False: 1.34k]
  ------------------
  853|       |          // true-stereocenter found
  854|  63.1k|          units.push_back(OBStereoUnit(OBStereo::CisTrans, bond->GetId()));
  855|  64.4k|      }
  856|   707k|    }
  857|       |
  858|       |    /**
  859|       |     * Apply rule 1 from the Razinger paper recusively:
  860|       |     *
  861|       |     * All rings are merged "mergedRings". A merged ring is simply a fragment consisting
  862|       |     * of all atoms of a ring system (bridged, spiro, adjacent, ...). If two rings in the
  863|       |     * SSSR set share an atom, they are merged.
  864|       |     *
  865|       |     * Each merged must at least have two para-stereocenters (or 1 true + 1 para) in order
  866|       |     * for the para-stereocenter to be valid. This is repeated until no new stereocenters
  867|       |     * are identified.
  868|       |     *
  869|       |     * rule 1a for double bonds:
  870|       |     * - bond atom in ring has two identical symmetry classes for it's neighbor atoms (-> para)
  871|       |     * - other bond atom:
  872|       |     *   - has two different symmetry classes for it's neighbours -> new stereocenter
  873|       |     *   - has two identical symmetry classes, but the ligand contains at least 1 true or para stereocenter -> new stereocenter
  874|       |     *
  875|       |     * rule 1b for tetracoord atoms:
  876|       |     * - at least two neighbour symmetry classes are the same (-> para)
  877|       |     * - other pair:
  878|       |     *   - has two different symmetry classes for it's neighbours -> new stereocenter
  879|       |     *   - has two identical symmetry classes, but the ligand contains at least 1 true or para stereocenter -> new stereocenter
  880|       |     *
  881|       |     * NOTE: there must always be at least 2 new stereocenters (or one existing + 1 newly found) in order for them to be valid
  882|       |     */
  883|  45.6k|    std::vector<OBRing*> lssr = mol->GetLSSR();
  884|  45.6k|    std::vector<StereoRing> rings;
  885|       |
  886|       |    //cout << "=====================================================" << endl;
  887|   170k|    for (std::size_t i = 0; i < lssr.size(); ++i) {
  ------------------
  |  Branch (887:29): [True: 125k, False: 45.6k]
  ------------------
  888|   125k|      rings.push_back(StereoRing());
  889|   125k|      StereoRing &ring = rings.back();
  890|       |
  891|       |
  892|   545k|      for (std::size_t j = 0; j < stereoAtoms.size(); ++j)
  ------------------
  |  Branch (892:31): [True: 420k, False: 125k]
  ------------------
  893|   420k|        if (lssr[i]->_pathset.BitIsSet(stereoAtoms[j]))
  ------------------
  |  Branch (893:13): [True: 42.0k, False: 378k]
  ------------------
  894|  42.0k|          ring.trueCount++;
  895|       |
  896|       |      //cout << "StereoRing: trueCount = " << ring.trueCount << endl;
  897|   390k|      for (std::size_t j = 0; j < paraAtoms.size(); ++j) {
  ------------------
  |  Branch (897:31): [True: 265k, False: 125k]
  ------------------
  898|   265k|        if (lssr[i]->_pathset.BitIsSet(paraAtoms[j])) {
  ------------------
  |  Branch (898:13): [True: 63.2k, False: 202k]
  ------------------
  899|  63.2k|          OBAtom *atom = mol->GetAtom(paraAtoms[j]);
  900|  63.2k|          ring.paraAtoms.push_back(StereoRing::ParaAtom(atom->GetId(), paraAtoms[j]));
  901|       |
  902|   241k|          FOR_NBORS_OF_ATOM (nbr, mol->GetAtom(paraAtoms[j])) {
  ------------------
  |  |  419|  63.2k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 241k, False: 63.2k]
  |  |  ------------------
  ------------------
  903|   241k|            if (lssr[i]->_pathset.BitIsSet(nbr->GetIdx()))
  ------------------
  |  Branch (903:17): [True: 126k, False: 115k]
  ------------------
  904|   126k|              ring.paraAtoms.back().insideNbrs.push_back(&*nbr);
  905|   115k|            else
  906|   115k|              ring.paraAtoms.back().outsideNbrs.push_back(&*nbr);
  907|   241k|          }
  908|       |
  909|       |          //cout << "  ParaAtom(idx = " << ring.paraAtoms.back().inIdx << ", outside = " << ring.paraAtoms.back().outsideNbrs.size() << ")" << endl;
  910|  63.2k|          if (ring.paraAtoms.back().insideNbrs.size() != 2)
  ------------------
  |  Branch (910:15): [True: 0, False: 63.2k]
  ------------------
  911|      0|            ring.paraAtoms.pop_back();
  912|  63.2k|        }
  913|   265k|      }
  914|       |
  915|   146k|      for (std::size_t j = 0; j < paraBonds.size(); ++j) {
  ------------------
  |  Branch (915:31): [True: 20.9k, False: 125k]
  ------------------
  916|  20.9k|        OBBond *bond = mol->GetBond(paraBonds[j]);
  917|  20.9k|        unsigned int beginIdx = bond->GetBeginAtomIdx();
  918|  20.9k|        unsigned int endIdx = bond->GetEndAtomIdx();
  919|       |
  920|  20.9k|        if (lssr[i]->_pathset.BitIsSet(beginIdx)) {
  ------------------
  |  Branch (920:13): [True: 2.96k, False: 18.0k]
  ------------------
  921|  2.96k|          ring.paraBonds.push_back(StereoRing::ParaBond(bond->GetId(), beginIdx, endIdx));
  922|       |
  923|  8.38k|          FOR_NBORS_OF_ATOM (nbr, bond->GetBeginAtom()) {
  ------------------
  |  |  419|  2.96k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 8.38k, False: 2.96k]
  |  |  ------------------
  ------------------
  924|  8.38k|            if (nbr->GetIdx() == endIdx)
  ------------------
  |  Branch (924:17): [True: 2.96k, False: 5.42k]
  ------------------
  925|  2.96k|              continue;
  926|  5.42k|            ring.paraBonds.back().insideNbrs.push_back(&*nbr);
  927|  5.42k|          }
  928|  8.26k|          FOR_NBORS_OF_ATOM (nbr, bond->GetEndAtom()) {
  ------------------
  |  |  419|  2.96k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 8.26k, False: 2.96k]
  |  |  ------------------
  ------------------
  929|  8.26k|            if (nbr->GetIdx() == beginIdx)
  ------------------
  |  Branch (929:17): [True: 2.96k, False: 5.29k]
  ------------------
  930|  2.96k|              continue;
  931|  5.29k|            ring.paraBonds.back().outsideNbrs.push_back(&*nbr);
  932|  5.29k|          }
  933|       |
  934|       |          //cout << "  ParaBond(inIdx = " << beginIdx << ", outIdx = " << endIdx << ", outside = " << ring.paraBonds.back().outsideNbrs.size() << ")" << endl;
  935|  2.96k|          if (ring.paraBonds.back().insideNbrs.size() != 2)
  ------------------
  |  Branch (935:15): [True: 513, False: 2.45k]
  ------------------
  936|    513|            ring.paraBonds.pop_back();
  937|  2.96k|        }
  938|       |
  939|  20.9k|        if (lssr[i]->_pathset.BitIsSet(endIdx)) {
  ------------------
  |  Branch (939:13): [True: 3.23k, False: 17.7k]
  ------------------
  940|  3.23k|          ring.paraBonds.push_back(StereoRing::ParaBond(bond->GetId(), endIdx, beginIdx));
  941|       |
  942|  9.42k|          FOR_NBORS_OF_ATOM (nbr, bond->GetEndAtom()) {
  ------------------
  |  |  419|  3.23k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 9.42k, False: 3.23k]
  |  |  ------------------
  ------------------
  943|  9.42k|            if (nbr->GetIdx() == beginIdx)
  ------------------
  |  Branch (943:17): [True: 3.23k, False: 6.18k]
  ------------------
  944|  3.23k|              continue;
  945|  6.18k|            ring.paraBonds.back().insideNbrs.push_back(&*nbr);
  946|  6.18k|          }
  947|  8.81k|          FOR_NBORS_OF_ATOM (nbr, bond->GetBeginAtom()) {
  ------------------
  |  |  419|  3.23k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 8.81k, False: 3.23k]
  |  |  ------------------
  ------------------
  948|  8.81k|            if (nbr->GetIdx() == endIdx)
  ------------------
  |  Branch (948:17): [True: 3.23k, False: 5.58k]
  ------------------
  949|  3.23k|              continue;
  950|  5.58k|            ring.paraBonds.back().outsideNbrs.push_back(&*nbr);
  951|  5.58k|          }
  952|       |
  953|       |          //cout << "  ParaBond(inIdx = " << endIdx << ", outIdx = " << beginIdx << ", outside = " << ring.paraBonds.back().outsideNbrs.size() << ")" << endl;
  954|  3.23k|          if (ring.paraBonds.back().insideNbrs.size() != 2)
  ------------------
  |  Branch (954:15): [True: 283, False: 2.95k]
  ------------------
  955|    283|            ring.paraBonds.pop_back();
  956|  3.23k|        }
  957|       |
  958|  20.9k|      }
  959|       |
  960|   125k|      if (ring.paraAtoms.size() + ring.paraBonds.size() == 1) {
  ------------------
  |  Branch (960:11): [True: 22.5k, False: 102k]
  ------------------
  961|  22.5k|        ring.paraAtoms.clear();
  962|  22.5k|        ring.paraBonds.clear();
  963|  22.5k|      }
  964|       |
  965|   125k|    }
  966|       |    //cout << "=====================================================" << endl;
  967|       |
  968|  45.6k|    unsigned int numStereoUnits;
  969|  47.5k|    do {
  970|  47.5k|      numStereoUnits = units.size();
  971|  47.5k|      StartRule1(symClasses, rings, units, stereoAtoms);
  972|  47.5k|    } while (units.size() > numStereoUnits);
  ------------------
  |  Branch (972:14): [True: 1.84k, False: 45.6k]
  ------------------
  973|       |
  974|       |
  975|  45.6k|    std::vector<OBBitVec> mergedRings = mergeRings(mol, symClasses);
  976|       |    /**
  977|       |     * Apply rule 2a for tetracoordinate carbon:
  978|       |     * - 1 or 2 pair identical ligands
  979|       |     * - each pair contains at least 1 true-stereocenter or 2 para-stereocenters
  980|       |     *
  981|       |     * Apply rule 2b for tetracoordinate carbon:
  982|       |     * - 3 or 4 identical ligands with at least
  983|       |     *   - 2 true-stereocenters
  984|       |     *   - 2 separate assemblies of para-stereocenters
  985|       |     */
  986|  54.1k|    for (std::vector<unsigned int>::iterator idx = paraAtoms.begin(); idx != paraAtoms.end(); ++idx) {
  ------------------
  |  Branch (986:71): [True: 8.48k, False: 45.6k]
  ------------------
  987|  8.48k|      OBAtom *atom = mol->GetAtom(*idx);
  988|       |      // make sure we didn't add this atom already from rule 1
  989|  8.48k|      bool alreadyAdded = false;
  990|  51.5k|      for (OBStereoUnitSet::iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (990:58): [True: 43.0k, False: 8.48k]
  ------------------
  991|  43.0k|        if ((*u2).type == OBStereo::Tetrahedral)
  ------------------
  |  Branch (991:13): [True: 34.3k, False: 8.72k]
  ------------------
  992|  34.3k|          if (atom->GetId() == (*u2).id) {
  ------------------
  |  Branch (992:15): [True: 5.54k, False: 28.8k]
  ------------------
  993|  5.54k|            alreadyAdded = true;
  994|  5.54k|          }
  995|  43.0k|      }
  996|  8.48k|      if (alreadyAdded)
  ------------------
  |  Branch (996:11): [True: 5.54k, False: 2.94k]
  ------------------
  997|  5.54k|        continue;
  998|       |
  999|       |
 1000|  2.94k|      int classification = classifyTetrahedralNbrSymClasses(symClasses, atom);
 1001|  2.94k|      switch (classification) {
  ------------------
  |  Branch (1001:15): [True: 2.94k, False: 0]
  ------------------
 1002|  1.76k|        case T1123:
  ------------------
  |  Branch (1002:9): [True: 1.76k, False: 1.17k]
  ------------------
 1003|       |          // rule 2a with 1 pair
 1004|  1.76k|          {
 1005|  1.76k|            unsigned int duplicatedSymClass = findDuplicatedSymmetryClass(atom, symClasses);
 1006|  1.76k|            OBAtom *ligandAtom = findAtomWithSymmetryClass(atom, duplicatedSymClass, symClasses);
 1007|  1.76k|            if (containsAtLeast_1true_2para(ligandAtom, atom, units)) {
  ------------------
  |  Branch (1007:17): [True: 1.00k, False: 762]
  ------------------
 1008|  1.00k|              units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId(), true));
 1009|  1.00k|            }
 1010|  1.76k|          }
 1011|  1.76k|          break;
 1012|    146|        case T1122:
  ------------------
  |  Branch (1012:9): [True: 146, False: 2.79k]
  ------------------
 1013|       |          // rule 2a with 2 pairs
 1014|    146|          {
 1015|    146|            unsigned int duplicatedSymClass1, duplicatedSymClass2;
 1016|    146|            findDuplicatedSymmetryClasses(atom, symClasses, duplicatedSymClass1, duplicatedSymClass2);
 1017|    146|            OBAtom *ligandAtom1 = findAtomWithSymmetryClass(atom, duplicatedSymClass1, symClasses);
 1018|    146|            OBAtom *ligandAtom2 = findAtomWithSymmetryClass(atom, duplicatedSymClass2, symClasses);
 1019|    146|            if (containsAtLeast_1true_2para(ligandAtom1, atom, units) &&
  ------------------
  |  Branch (1019:17): [True: 46, False: 100]
  ------------------
 1020|     46|                containsAtLeast_1true_2para(ligandAtom2, atom, units))
  ------------------
  |  Branch (1020:17): [True: 39, False: 7]
  ------------------
 1021|     39|              units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId(), true));
 1022|    146|          }
 1023|    146|          break;
 1024|    553|        case T1112:
  ------------------
  |  Branch (1024:9): [True: 553, False: 2.38k]
  ------------------
 1025|       |          // rule 2b with 3 identical
 1026|    553|          {
 1027|    553|            unsigned int duplicatedSymClass = findDuplicatedSymmetryClass(atom, symClasses);
 1028|    553|            OBAtom *ligandAtom = findAtomWithSymmetryClass(atom, duplicatedSymClass, symClasses);
 1029|    553|            if (containsAtLeast_2true_2paraAssemblies(ligandAtom, atom, units, mergedRings))
  ------------------
  |  Branch (1029:17): [True: 148, False: 405]
  ------------------
 1030|    148|              units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId(), true));
 1031|    553|          }
 1032|    553|          break;
 1033|    478|        case T1111:
  ------------------
  |  Branch (1033:9): [True: 478, False: 2.46k]
  ------------------
 1034|       |          // rule 2b with 4 identical
 1035|    478|          {
 1036|    478|            unsigned int duplicatedSymClass = findDuplicatedSymmetryClass(atom, symClasses);
 1037|    478|            OBAtom *ligandAtom = findAtomWithSymmetryClass(atom, duplicatedSymClass, symClasses);
 1038|    478|            if (containsAtLeast_2true_2paraAssemblies(ligandAtom, atom, units, mergedRings)) {
  ------------------
  |  Branch (1038:17): [True: 34, False: 444]
  ------------------
 1039|     34|              units.push_back(OBStereoUnit(OBStereo::Tetrahedral, atom->GetId(), true));
 1040|     34|            }
 1041|    478|          }
 1042|    478|          break;
 1043|       |
 1044|  2.94k|      }
 1045|       |
 1046|  2.94k|    }
 1047|       |
 1048|       |    /**
 1049|       |     * Apply rule 3 for double bonds.
 1050|       |     * - 1 or 2 pair identical ligands (on begin and end atom)
 1051|       |     * - each pair contains at least 1 true-stereocenter or 2 para-stereocenters (from rule1)
 1052|       |     */
 1053|  47.3k|    for (std::vector<unsigned int>::iterator idx = paraBonds.begin(); idx != paraBonds.end(); ++idx) {
  ------------------
  |  Branch (1053:71): [True: 1.71k, False: 45.6k]
  ------------------
 1054|  1.71k|      OBBond *bond = mol->GetBond(*idx);
 1055|       |
 1056|       |      // make sure we didn't add this atom already from rule 1
 1057|  1.71k|      bool alreadyAdded = false;
 1058|  43.0k|      for (OBStereoUnitSet::iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (1058:58): [True: 41.2k, False: 1.71k]
  ------------------
 1059|  41.2k|        if ((*u2).type == OBStereo::CisTrans)
  ------------------
  |  Branch (1059:13): [True: 28.6k, False: 12.6k]
  ------------------
 1060|  28.6k|          if (bond->GetId() == (*u2).id) {
  ------------------
  |  Branch (1060:15): [True: 655, False: 27.9k]
  ------------------
 1061|    655|            alreadyAdded = true;
 1062|    655|          }
 1063|  41.2k|      }
 1064|  1.71k|      if (alreadyAdded)
  ------------------
  |  Branch (1064:11): [True: 655, False: 1.06k]
  ------------------
 1065|    655|        continue;
 1066|       |
 1067|  1.06k|      OBAtom *begin = bond->GetBeginAtom();
 1068|  1.06k|      OBAtom *end = bond->GetEndAtom();
 1069|       |
 1070|  1.06k|      int beginClassification = classifyCisTransNbrSymClasses(symClasses, bond, bond->GetBeginAtom());
 1071|  1.06k|      bool beginValid = false;
 1072|  1.06k|      switch (beginClassification) {
  ------------------
  |  Branch (1072:15): [True: 1.06k, False: 0]
  ------------------
 1073|    443|        case C12:
  ------------------
  |  Branch (1073:9): [True: 443, False: 620]
  ------------------
 1074|    443|          beginValid = true;
 1075|    443|          break;
 1076|    620|        case C11:
  ------------------
  |  Branch (1076:9): [True: 620, False: 443]
  ------------------
 1077|    620|          {
 1078|       |            // find the ligand
 1079|    620|            OBAtom *ligandAtom = nullptr;
 1080|    985|            FOR_NBORS_OF_ATOM (nbr, begin) {
  ------------------
  |  |  419|    620|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 985, False: 0]
  |  |  ------------------
  ------------------
 1081|    985|              if ((nbr->GetIdx() != bond->GetBeginAtomIdx()) && (nbr->GetIdx() != bond->GetEndAtomIdx())) {
  ------------------
  |  Branch (1081:19): [True: 985, False: 0]
  |  Branch (1081:65): [True: 620, False: 365]
  ------------------
 1082|    620|                ligandAtom = &*nbr;
 1083|    620|                break;
 1084|    620|              }
 1085|    985|            }
 1086|       |
 1087|    620|            OBBitVec ligand = getFragment(ligandAtom, begin);
 1088|  25.5k|            for (OBStereoUnitSet::iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (1088:64): [True: 24.9k, False: 620]
  ------------------
 1089|  24.9k|              if ((*u2).type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1089:19): [True: 6.66k, False: 18.2k]
  ------------------
 1090|  6.66k|                if (ligand.BitIsSet((*u2).id))
  ------------------
  |  Branch (1090:21): [True: 274, False: 6.39k]
  ------------------
 1091|    274|                  beginValid = true;
 1092|  18.2k|              } else if((*u2).type == OBStereo::CisTrans) {
  ------------------
  |  Branch (1092:25): [True: 18.2k, False: 0]
  ------------------
 1093|  18.2k|                OBBond *bond = mol->GetBondById((*u2).id);
 1094|  18.2k|                OBAtom *begin = bond->GetBeginAtom();
 1095|  18.2k|                OBAtom *end = bond->GetEndAtom();
 1096|  18.2k|                if (ligand.BitIsSet(begin->GetId()) || ligand.BitIsSet(end->GetId()))
  ------------------
  |  Branch (1096:21): [True: 501, False: 17.7k]
  |  Branch (1096:56): [True: 2, False: 17.7k]
  ------------------
 1097|    503|                  beginValid = true;
 1098|  18.2k|              }
 1099|  24.9k|            }
 1100|    620|          }
 1101|    620|          break;
 1102|  1.06k|      }
 1103|       |
 1104|  1.06k|      if (!beginValid)
  ------------------
  |  Branch (1104:11): [True: 433, False: 630]
  ------------------
 1105|    433|        continue;
 1106|       |
 1107|    630|      int endClassification = classifyCisTransNbrSymClasses(symClasses, bond, bond->GetEndAtom());
 1108|    630|      bool endValid = false;
 1109|    630|      switch (endClassification) {
  ------------------
  |  Branch (1109:15): [True: 630, False: 0]
  ------------------
 1110|    113|        case C12:
  ------------------
  |  Branch (1110:9): [True: 113, False: 517]
  ------------------
 1111|    113|          endValid = true;
 1112|    113|          break;
 1113|    517|        case C11:
  ------------------
  |  Branch (1113:9): [True: 517, False: 113]
  ------------------
 1114|    517|          {
 1115|       |            // find the ligand
 1116|    517|            OBAtom *ligandAtom = nullptr;
 1117|  1.02k|            FOR_NBORS_OF_ATOM (nbr, end) {
  ------------------
  |  |  419|    517|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 1.02k, False: 0]
  |  |  ------------------
  ------------------
 1118|  1.02k|              if ((nbr->GetIdx() != bond->GetBeginAtomIdx()) && (nbr->GetIdx() != bond->GetEndAtomIdx())) {
  ------------------
  |  Branch (1118:19): [True: 517, False: 509]
  |  Branch (1118:65): [True: 517, False: 0]
  ------------------
 1119|    517|                ligandAtom = &*nbr;
 1120|    517|                break;
 1121|    517|              }
 1122|  1.02k|            }
 1123|       |
 1124|    517|            OBBitVec ligand = getFragment(ligandAtom, end);
 1125|  8.40k|            for (OBStereoUnitSet::iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (1125:64): [True: 7.88k, False: 517]
  ------------------
 1126|  7.88k|              if ((*u2).type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1126:19): [True: 2.79k, False: 5.08k]
  ------------------
 1127|  2.79k|                if (ligand.BitIsSet((*u2).id))
  ------------------
  |  Branch (1127:21): [True: 462, False: 2.33k]
  ------------------
 1128|    462|                  endValid = true;
 1129|  5.08k|              } else if((*u2).type == OBStereo::CisTrans) {
  ------------------
  |  Branch (1129:25): [True: 5.08k, False: 0]
  ------------------
 1130|  5.08k|                OBBond *bond = mol->GetBondById((*u2).id);
 1131|  5.08k|                OBAtom *begin = bond->GetBeginAtom();
 1132|  5.08k|                OBAtom *end = bond->GetEndAtom();
 1133|  5.08k|                if (ligand.BitIsSet(begin->GetId()) || ligand.BitIsSet(end->GetId()))
  ------------------
  |  Branch (1133:21): [True: 780, False: 4.30k]
  |  Branch (1133:56): [True: 6, False: 4.30k]
  ------------------
 1134|    786|                  endValid = true;
 1135|  5.08k|              }
 1136|  7.88k|            }
 1137|    517|          }
 1138|    517|          break;
 1139|    630|      }
 1140|       |
 1141|    630|      if (endValid)
  ------------------
  |  Branch (1141:11): [True: 367, False: 263]
  ------------------
 1142|    367|        units.push_back(OBStereoUnit(OBStereo::CisTrans, bond->GetId(), true));
 1143|    630|    }
 1144|       |
 1145|  45.6k|    if (DEBUG) {
  ------------------
  |  |   50|  45.6k|#define DEBUG 0
  |  |  ------------------
  |  |  |  Branch (50:15): [Folded, False: 45.6k]
  |  |  ------------------
  ------------------
 1146|      0|      for (OBStereoUnitSet::iterator unit = units.begin(); unit != units.end(); ++unit) {
  ------------------
  |  Branch (1146:60): [True: 0, False: 0]
  ------------------
 1147|      0|        if (unit->type == OBStereo::Tetrahedral)
  ------------------
  |  Branch (1147:13): [True: 0, False: 0]
  ------------------
 1148|      0|          cout << "Tetrahedral(center = " << unit->id << ", para = " << unit->para << ")" << endl;
 1149|      0|        if (unit->type == OBStereo::CisTrans)
  ------------------
  |  Branch (1149:13): [True: 0, False: 0]
  ------------------
 1150|      0|          cout << "CisTrans(bond = " << unit->id << ", para = " << unit->para << ")" << endl;
 1151|      0|        if (unit->type == OBStereo::SquarePlanar)
  ------------------
  |  Branch (1151:13): [True: 0, False: 0]
  ------------------
 1152|      0|          cout << "SquarePlanar(bond = " << unit->id << ", para = " << unit->para << ")" << endl;
 1153|      0|      }
 1154|      0|    }
 1155|       |
 1156|       |
 1157|  45.6k|    return units;
 1158|  45.6k|  }
_ZN9OpenBabel27findDuplicatedSymmetryClassEPNS_6OBAtomERKNSt3__16vectorIjNS2_9allocatorIjEEEE:
 1194|  2.79k|  {
 1195|       |    // find the duplicated symmetry class
 1196|  2.79k|    unsigned int duplicatedSymClass = OBGraphSym::NoSymmetryClass; // FIXME
 1197|  2.79k|    std::vector<unsigned int> nbrSymClasses;
 1198|  10.0k|    FOR_NBORS_OF_ATOM (nbr, atom) {
  ------------------
  |  |  419|  2.79k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 10.0k, False: 2.79k]
  |  |  ------------------
  ------------------
 1199|  10.0k|      nbrSymClasses.push_back(symClasses.at(nbr->GetIndex()));
 1200|  10.0k|    }
 1201|  4.19k|    for (std::size_t i = 0; i < nbrSymClasses.size(); ++i) {
  ------------------
  |  Branch (1201:29): [True: 4.19k, False: 0]
  ------------------
 1202|  4.19k|      if (std::count(nbrSymClasses.begin(), nbrSymClasses.end(), nbrSymClasses.at(i)) >= 2) {
  ------------------
  |  Branch (1202:11): [True: 2.79k, False: 1.39k]
  ------------------
 1203|  2.79k|        duplicatedSymClass = nbrSymClasses.at(i);
 1204|  2.79k|        break;
 1205|  2.79k|      }
 1206|  4.19k|    }
 1207|  2.79k|    return duplicatedSymClass;
 1208|  2.79k|  }
_ZN9OpenBabel29findDuplicatedSymmetryClassesEPNS_6OBAtomERKNSt3__16vectorIjNS2_9allocatorIjEEEERjS9_:
 1218|    146|  {
 1219|    146|    std::vector<unsigned int> nbrSymClasses;
 1220|    146|    FOR_NBORS_OF_ATOM (nbr, atom)
  ------------------
  |  |  419|    146|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 584, False: 146]
  |  |  ------------------
  ------------------
 1221|    584|      nbrSymClasses.push_back(symClasses.at(nbr->GetIndex()));
 1222|    146|    std::sort(nbrSymClasses.begin(), nbrSymClasses.end());
 1223|    146|    duplicated1 = nbrSymClasses[0];
 1224|    146|    duplicated2 = nbrSymClasses[2];
 1225|    146|  }
_ZN9OpenBabel25findAtomWithSymmetryClassEPNS_6OBAtomEjRKNSt3__16vectorIjNS2_9allocatorIjEEEE:
 1484|  3.08k|  {
 1485|  3.08k|    OBAtom *ligandAtom = nullptr;
 1486|  3.08k|    FOR_NBORS_OF_ATOM (nbr, atom)
  ------------------
  |  |  419|  3.08k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 11.1k, False: 3.08k]
  |  |  ------------------
  ------------------
 1487|  11.1k|      if (symClasses.at(nbr->GetIndex()) == symClass)
  ------------------
  |  Branch (1487:11): [True: 7.68k, False: 3.50k]
  ------------------
 1488|  7.68k|        ligandAtom = &*nbr;
 1489|  3.08k|    return ligandAtom;
 1490|  3.08k|  }
_ZN9OpenBabel27containsAtLeast_1true_2paraEPNS_6OBAtomES1_RKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEE:
 1521|  1.95k|  {
 1522|  1.95k|    OBMol *mol = atom->GetParent();
 1523|       |    // check if ligand contains at least:
 1524|       |    // - 1 true-stereocenter
 1525|       |    // - 2 para-stereocenters
 1526|  1.95k|    OBBitVec ligand = getFragment(ligandAtom, atom);
 1527|  1.95k|    bool foundTrueStereoCenter = false;
 1528|  1.95k|    int paraStereoCenterCount = 0;
 1529|  14.1k|    for (OBStereoUnitSet::const_iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (1529:62): [True: 12.2k, False: 1.95k]
  ------------------
 1530|  12.2k|      if (isUnitInFragment(mol, *u2, ligand)) {
  ------------------
  |  Branch (1530:11): [True: 4.80k, False: 7.42k]
  ------------------
 1531|  4.80k|        if ((*u2).para) {
  ------------------
  |  Branch (1531:13): [True: 2.09k, False: 2.70k]
  ------------------
 1532|  2.09k|          paraStereoCenterCount++;
 1533|  2.70k|        } else {
 1534|  2.70k|          foundTrueStereoCenter = true;
 1535|  2.70k|        }
 1536|  4.80k|      }
 1537|  12.2k|    }
 1538|       |
 1539|  1.95k|    if (foundTrueStereoCenter || paraStereoCenterCount >= 2)
  ------------------
  |  Branch (1539:9): [True: 992, False: 964]
  |  Branch (1539:34): [True: 88, False: 876]
  ------------------
 1540|  1.08k|      return true;
 1541|    876|    if (ligandAtom->IsInRing() && atom->IsInRing() && paraStereoCenterCount)
  ------------------
  |  Branch (1541:9): [True: 654, False: 222]
  |  Branch (1541:35): [True: 654, False: 0]
  |  Branch (1541:55): [True: 7, False: 647]
  ------------------
 1542|      7|      return true;
 1543|    869|    return false;
 1544|    876|  }
_ZN9OpenBabel37containsAtLeast_2true_2paraAssembliesEPNS_6OBAtomES1_RKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEERKNS3_INS_8OBBitVecENS5_ISA_EEEE:
 1555|  1.03k|  {
 1556|  1.03k|    OBMol *mol = atom->GetParent();
 1557|       |    // check if ligand contains at least:
 1558|       |    // - 2 true-stereocenter
 1559|       |    // - 2 separate para-stereocenters assemblies
 1560|  1.03k|    OBBitVec ligand = getFragment(ligandAtom, atom);
 1561|  1.03k|    int trueStereoCenterCount = 0;
 1562|  1.03k|    std::vector<unsigned int> ringIndices;
 1563|  2.50k|    for (OBStereoUnitSet::const_iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (1563:62): [True: 1.47k, False: 1.03k]
  ------------------
 1564|  1.47k|      if ((*u2).type == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1564:11): [True: 1.46k, False: 12]
  ------------------
 1565|  1.46k|        if (ligand.BitIsSet((*u2).id)) {
  ------------------
  |  Branch (1565:13): [True: 1.41k, False: 56]
  ------------------
 1566|  1.41k|          if ((*u2).para) {
  ------------------
  |  Branch (1566:15): [True: 720, False: 690]
  ------------------
 1567|    720|            OBAtom *paraAtom = mol->GetAtomById((*u2).id);
 1568|  3.68k|            for (std::size_t ringIdx = 0; ringIdx < mergedRings.size(); ++ringIdx) {
  ------------------
  |  Branch (1568:43): [True: 2.96k, False: 720]
  ------------------
 1569|  2.96k|              if (mergedRings.at(ringIdx).BitIsSet(paraAtom->GetIdx()))
  ------------------
  |  Branch (1569:19): [True: 919, False: 2.04k]
  ------------------
 1570|    919|                if (std::find(ringIndices.begin(), ringIndices.end(), ringIdx) == ringIndices.end())
  ------------------
  |  Branch (1570:21): [True: 373, False: 546]
  ------------------
 1571|    373|                  ringIndices.push_back(ringIdx);
 1572|  2.96k|            }
 1573|    720|          } else
 1574|    690|            trueStereoCenterCount++;
 1575|  1.41k|        }
 1576|  1.46k|      } else if((*u2).type == OBStereo::CisTrans) {
  ------------------
  |  Branch (1576:17): [True: 12, False: 0]
  ------------------
 1577|     12|        OBBond *bond = mol->GetBondById((*u2).id);
 1578|     12|        OBAtom *begin = bond->GetBeginAtom();
 1579|     12|        OBAtom *end = bond->GetEndAtom();
 1580|     12|        if (ligand.BitIsSet(begin->GetId()) || ligand.BitIsSet(end->GetId())) {
  ------------------
  |  Branch (1580:13): [True: 11, False: 1]
  |  Branch (1580:48): [True: 0, False: 1]
  ------------------
 1581|     11|          if ((*u2).para) {
  ------------------
  |  Branch (1581:15): [True: 0, False: 11]
  ------------------
 1582|      0|            for (std::size_t ringIdx = 0; ringIdx < mergedRings.size(); ++ringIdx) {
  ------------------
  |  Branch (1582:43): [True: 0, False: 0]
  ------------------
 1583|      0|              if (mergedRings.at(ringIdx).BitIsSet(begin->GetIdx()) || mergedRings.at(ringIdx).BitIsSet(end->GetIdx())) {
  ------------------
  |  Branch (1583:19): [True: 0, False: 0]
  |  Branch (1583:72): [True: 0, False: 0]
  ------------------
 1584|      0|                if (std::find(ringIndices.begin(), ringIndices.end(), ringIdx) == ringIndices.end()) {
  ------------------
  |  Branch (1584:21): [True: 0, False: 0]
  ------------------
 1585|      0|                  ringIndices.push_back(ringIdx);
 1586|      0|                }
 1587|      0|              }
 1588|      0|            }
 1589|     11|          } else {
 1590|     11|            trueStereoCenterCount++;
 1591|     11|          }
 1592|     11|        }
 1593|     12|      }
 1594|  1.47k|    }
 1595|       |
 1596|  1.03k|    if (trueStereoCenterCount >= 2 || ringIndices.size() >= 2)
  ------------------
  |  Branch (1596:9): [True: 155, False: 876]
  |  Branch (1596:39): [True: 27, False: 849]
  ------------------
 1597|    182|      return true;
 1598|    849|    return false;
 1599|  1.03k|  }
_ZN9OpenBabel12FindSymmetryEPNS_5OBMolE:
 1832|   244k|  {
 1833|   244k|    OBGraphSym symmetry(mol);
 1834|   244k|    std::vector<unsigned int> symClasses;
 1835|   244k|    symmetry.GetSymmetry(symClasses);
 1836|   244k|    return symClasses;
 1837|   244k|  }
_ZN9OpenBabel12StereoFrom0DEPNS_5OBMolE:
 1850|   106k|  {
 1851|   106k|    if (mol->HasChiralityPerceived())
  ------------------
  |  Branch (1851:9): [True: 0, False: 106k]
  ------------------
 1852|      0|      return;
 1853|       |
 1854|   106k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::StereoFrom0D", obAuditMsg);
 1855|       |
 1856|   106k|    std::vector<unsigned int> symmetry_classes = FindSymmetry(mol);
 1857|   106k|    OBStereoUnitSet stereogenicUnits = FindStereogenicUnits(mol, symmetry_classes);
 1858|       |
 1859|   106k|    TetrahedralFrom0D(mol, stereogenicUnits);
 1860|   106k|    CisTransFrom0D(mol, stereogenicUnits);
 1861|   106k|    mol->SetChiralityPerceived();
 1862|   106k|  }
_ZN9OpenBabel17TetrahedralFrom0DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEb:
 1866|   106k|  {
 1867|   106k|    std::vector<OBTetrahedralStereo*> configs;
 1868|   106k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::TetrahedralFrom0D", obAuditMsg);
 1869|       |
 1870|       |    // Delete any existing stereo objects that are not a member of 'centers'
 1871|       |    // and make a map of the remaining ones
 1872|   106k|    std::map<unsigned long, OBTetrahedralStereo*> existingMap;
 1873|   106k|    std::vector<OBGenericData*>::iterator data;
 1874|   106k|    std::vector<OBGenericData*> stereoData = mol->GetAllData(OBGenericDataType::StereoData);
 1875|   109k|    for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (1875:37): [True: 2.84k, False: 106k]
  ------------------
 1876|  2.84k|      if (static_cast<OBStereoBase*>(*data)->GetType() == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (1876:11): [True: 921, False: 1.92k]
  ------------------
 1877|    921|        OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(*data);
 1878|    921|        unsigned long center = ts->GetConfig().center;
 1879|       |        // check if the center is really stereogenic
 1880|    921|        bool isStereogenic = false;
 1881|    921|        OBStereoUnitSet::const_iterator u;
 1882|  10.9k|        for (u = stereoUnits.begin(); u != stereoUnits.end(); ++u) {
  ------------------
  |  Branch (1882:39): [True: 10.0k, False: 921]
  ------------------
 1883|  10.0k|          if ((*u).type == OBStereo::Tetrahedral)
  ------------------
  |  Branch (1883:15): [True: 7.56k, False: 2.48k]
  ------------------
 1884|  7.56k|            if ((*u).id == center)
  ------------------
  |  Branch (1884:17): [True: 509, False: 7.05k]
  ------------------
 1885|    509|              isStereogenic = true;
 1886|  10.0k|        }
 1887|       |
 1888|    921|        if (isStereogenic) {
  ------------------
  |  Branch (1888:13): [True: 509, False: 412]
  ------------------
 1889|    509|          existingMap[center] = ts;
 1890|    509|          configs.push_back(ts);
 1891|    509|        } else {
 1892|       |          // According to OpenBabel, this is not a tetrahedral stereo
 1893|    412|          obErrorLog.ThrowError(__FUNCTION__, "Removed spurious TetrahedralStereo object", obAuditMsg);
 1894|    412|          mol->DeleteData(ts);
 1895|    412|        }
 1896|    921|      }
 1897|  2.84k|    }
 1898|       |
 1899|   106k|    OBStereoUnitSet::const_iterator u;
 1900|   151k|    for (u = stereoUnits.begin(); u != stereoUnits.end(); ++u) {
  ------------------
  |  Branch (1900:35): [True: 44.1k, False: 106k]
  ------------------
 1901|       |      // skip non-tetrahedral units
 1902|  44.1k|      if ((*u).type != OBStereo::Tetrahedral)
  ------------------
  |  Branch (1902:11): [True: 33.4k, False: 10.7k]
  ------------------
 1903|  33.4k|        continue;
 1904|       |      // if there already exists a OBTetrahedralStereo object for this
 1905|       |      // center, continue
 1906|  10.7k|      if (existingMap.find((*u).id) != existingMap.end())
  ------------------
  |  Branch (1906:11): [True: 509, False: 10.2k]
  ------------------
 1907|    509|        continue;
 1908|       |
 1909|  10.2k|      OBAtom *center = mol->GetAtomById((*u).id);
 1910|       |
 1911|  10.2k|      OBTetrahedralStereo::Config config;
 1912|  10.2k|      config.specified = false;
 1913|  10.2k|      config.center = (*u).id;
 1914|  31.4k|      FOR_NBORS_OF_ATOM(nbr, center) {
  ------------------
  |  |  419|  10.2k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 31.4k, False: 10.2k]
  |  |  ------------------
  ------------------
 1915|  31.4k|        if (config.from == OBStereo::NoRef)
  ------------------
  |  Branch (1915:13): [True: 10.2k, False: 21.2k]
  ------------------
 1916|  10.2k|          config.from = nbr->GetId();
 1917|  21.2k|        else
 1918|  21.2k|          config.refs.push_back(nbr->GetId());
 1919|  31.4k|      }
 1920|       |
 1921|  10.2k|      if ((config.refs.size() == 2))
  ------------------
  |  Branch (1921:11): [True: 9.33k, False: 871]
  ------------------
 1922|  9.33k|        config.refs.push_back(OBStereo::ImplicitRef); // need to add largest number on end to work
 1923|       |
 1924|  10.2k|      OBTetrahedralStereo *th = new OBTetrahedralStereo(mol);
 1925|  10.2k|      th->SetConfig(config);
 1926|       |
 1927|  10.2k|      configs.push_back(th);
 1928|       |      // add the data to the molecule if needed
 1929|  10.2k|      if (addToMol)
  ------------------
  |  Branch (1929:11): [True: 10.2k, False: 0]
  ------------------
 1930|  10.2k|        mol->SetData(th);
 1931|  10.2k|    }
 1932|       |
 1933|   106k|    return configs;
 1934|   106k|  }
_ZN9OpenBabel14CisTransFrom0DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEb:
 1939|   106k|  {
 1940|   106k|    std::vector<OBCisTransStereo*> configs;
 1941|   106k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::CisTransFrom0D", obAuditMsg);
 1942|       |
 1943|   106k|    std::vector<unsigned long> bonds;
 1944|   151k|    for (OBStereoUnitSet::const_iterator u = stereoUnits.begin(); u != stereoUnits.end(); ++u)
  ------------------
  |  Branch (1944:67): [True: 44.1k, False: 106k]
  ------------------
 1945|  44.1k|      if ((*u).type == OBStereo::CisTrans)
  ------------------
  |  Branch (1945:11): [True: 33.4k, False: 10.7k]
  ------------------
 1946|  33.4k|        bonds.push_back((*u).id);
 1947|       |
 1948|       |    // Delete any existing stereo objects that are not a member of 'bonds'
 1949|       |    // and make a map of the remaining ones
 1950|   106k|    std::map<unsigned long, OBCisTransStereo*> existingMap;
 1951|   106k|    std::vector<OBGenericData*>::iterator data;
 1952|   106k|    std::vector<OBGenericData*> stereoData = mol->GetAllData(OBGenericDataType::StereoData);
 1953|   119k|    for (data = stereoData.begin(); data != stereoData.end(); ++data) {
  ------------------
  |  Branch (1953:37): [True: 12.6k, False: 106k]
  ------------------
 1954|  12.6k|      if (static_cast<OBStereoBase*>(*data)->GetType() == OBStereo::CisTrans) {
  ------------------
  |  Branch (1954:11): [True: 1.92k, False: 10.7k]
  ------------------
 1955|  1.92k|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 1956|  1.92k|        OBCisTransStereo::Config config = ct->GetConfig();
 1957|       |        // find the bond id from begin & end atom ids
 1958|  1.92k|        unsigned long id = OBStereo::NoRef;
 1959|  1.92k|        OBAtom *a = mol->GetAtomById(config.begin);
 1960|  1.92k|        if (!a)
  ------------------
  |  Branch (1960:13): [True: 0, False: 1.92k]
  ------------------
 1961|      0|          continue;
 1962|  3.97k|        FOR_BONDS_OF_ATOM (bond, a) {
  ------------------
  |  |  420|  1.92k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 3.97k, False: 0]
  |  |  ------------------
  ------------------
 1963|  3.97k|          unsigned long beginId = bond->GetBeginAtom()->GetId();
 1964|  3.97k|          unsigned long endId = bond->GetEndAtom()->GetId();
 1965|  3.97k|          if ((beginId == config.begin && endId == config.end) ||
  ------------------
  |  Branch (1965:16): [True: 1.94k, False: 2.03k]
  |  Branch (1965:43): [True: 1.92k, False: 19]
  ------------------
 1966|  2.05k|              (beginId == config.end && endId == config.begin)) {
  ------------------
  |  Branch (1966:16): [True: 0, False: 2.05k]
  |  Branch (1966:41): [True: 0, False: 0]
  ------------------
 1967|  1.92k|            id = bond->GetId();
 1968|  1.92k|            break;
 1969|  1.92k|          }
 1970|  3.97k|        }
 1971|       |
 1972|  1.92k|        if (std::find(bonds.begin(), bonds.end(), id) == bonds.end()) {
  ------------------
  |  Branch (1972:13): [True: 106, False: 1.81k]
  ------------------
 1973|       |          // According to OpenBabel, this is not a cis trans stereo
 1974|    106|          obErrorLog.ThrowError(__FUNCTION__, "Removed spurious CisTransStereo object", obAuditMsg);
 1975|    106|          mol->DeleteData(ct);
 1976|    106|        }
 1977|  1.81k|        else {
 1978|  1.81k|          existingMap[id] = ct;
 1979|  1.81k|          configs.push_back(ct);
 1980|  1.81k|        }
 1981|  1.92k|      }
 1982|  12.6k|    }
 1983|       |
 1984|   106k|    std::vector<unsigned long>::iterator i;
 1985|   140k|    for (i = bonds.begin(); i != bonds.end(); ++i) {
  ------------------
  |  Branch (1985:29): [True: 33.4k, False: 106k]
  ------------------
 1986|       |      // If there already exists a OBCisTransStereo object for this
 1987|       |      // bond, leave it alone unless it's in a ring of small size
 1988|       |
 1989|  33.4k|      bool alreadyExists = (existingMap.find(*i) != existingMap.end());
 1990|  33.4k|      OBBond *bond = mol->GetBondById(*i);
 1991|       |      // The bond id may not correspond to a bond in this molecule (e.g. for
 1992|       |      // stale stereo data on a rebuilt structure); GetBondById returns null.
 1993|  33.4k|      if (!bond)
  ------------------
  |  Branch (1993:11): [True: 0, False: 33.4k]
  ------------------
 1994|      0|        continue;
 1995|       |
 1996|  33.4k|      OBCisTransStereo *ct;
 1997|  33.4k|      OBCisTransStereo::Config config;
 1998|  33.4k|      if (alreadyExists)
  ------------------
  |  Branch (1998:11): [True: 1.81k, False: 31.6k]
  ------------------
 1999|  1.81k|      {
 2000|  1.81k|        ct = existingMap[*i];
 2001|  1.81k|        config = ct->GetConfig();
 2002|  1.81k|      }
 2003|  31.6k|      else
 2004|  31.6k|      {
 2005|  31.6k|        OBAtom *begin = bond->GetBeginAtom();
 2006|  31.6k|        OBAtom *end = bond->GetEndAtom();
 2007|       |
 2008|  31.6k|        config.specified = false;
 2009|       |        // begin
 2010|  31.6k|        config.begin = begin->GetId();
 2011|  80.6k|        FOR_NBORS_OF_ATOM (nbr, begin) {
  ------------------
  |  |  419|  31.6k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 80.6k, False: 31.6k]
  |  |  ------------------
  ------------------
 2012|  80.6k|          if (nbr->GetId() == end->GetId())
  ------------------
  |  Branch (2012:15): [True: 31.6k, False: 48.9k]
  ------------------
 2013|  31.6k|            continue;
 2014|  48.9k|          config.refs.push_back(nbr->GetId());
 2015|  48.9k|        }
 2016|  31.6k|        if (config.refs.size() == 1) {
  ------------------
  |  Branch (2016:13): [True: 14.3k, False: 17.3k]
  ------------------
 2017|  14.3k|          config.refs.push_back(OBStereo::ImplicitRef);
 2018|  14.3k|        }
 2019|       |        // end
 2020|  31.6k|        config.end = end->GetId();
 2021|  81.7k|        FOR_NBORS_OF_ATOM (nbr, end) {
  ------------------
  |  |  419|  31.6k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 81.7k, False: 31.6k]
  |  |  ------------------
  ------------------
 2022|  81.7k|          if (nbr->GetId() == begin->GetId())
  ------------------
  |  Branch (2022:15): [True: 31.6k, False: 50.0k]
  ------------------
 2023|  31.6k|            continue;
 2024|  50.0k|          config.refs.push_back(nbr->GetId());
 2025|  50.0k|        }
 2026|  31.6k|        if (config.refs.size() == 3) {
  ------------------
  |  Branch (2026:13): [True: 13.2k, False: 18.4k]
  ------------------
 2027|  13.2k|          config.refs.push_back(OBStereo::ImplicitRef);
 2028|  13.2k|        }
 2029|       |
 2030|  31.6k|        ct = new OBCisTransStereo(mol);
 2031|  31.6k|        ct->SetConfig(config);
 2032|  31.6k|      }
 2033|       |
 2034|       |      // For a double bond in a ring of size IMPLICIT_CIS_RING_SIZE or less
 2035|       |      // the stereochemistry is implicitly cis (in terms
 2036|       |      // of the ring atoms)
 2037|  33.4k|      OBRing* ring = bond->FindSmallestRing();
 2038|  33.4k|      if (ring && ring->Size() <= IMPLICIT_CIS_RING_SIZE) {
  ------------------
  |  |   52|  31.5k|#define IMPLICIT_CIS_RING_SIZE 8
  ------------------
  |  Branch (2038:11): [True: 31.5k, False: 1.88k]
  |  Branch (2038:19): [True: 7.22k, False: 24.3k]
  ------------------
 2039|       |
 2040|       |        // Find the ring atoms in the config.refs
 2041|  7.22k|        vector<unsigned int> ringrefs(2);
 2042|  21.6k|        for (int i = 0; i<2; ++i) {
  ------------------
  |  Branch (2042:25): [True: 14.4k, False: 7.22k]
  ------------------
 2043|  14.4k|          if (config.refs[i*2] != OBStereo::ImplicitRef && ring->IsMember(mol->GetAtomById(config.refs[i*2])))
  ------------------
  |  Branch (2043:15): [True: 14.3k, False: 73]
  |  Branch (2043:60): [True: 13.5k, False: 868]
  ------------------
 2044|  13.5k|            ringrefs[i] = config.refs[i*2];
 2045|    941|          else
 2046|    941|            ringrefs[i] = config.refs[i*2 + 1];
 2047|  14.4k|        }
 2048|  7.22k|        if (!ct->IsCis(ringrefs[0], ringrefs[1])) // Need to invert the stereo
  ------------------
  |  Branch (2048:13): [True: 6.49k, False: 729]
  ------------------
 2049|  6.49k|          config.shape = OBStereo::ShapeZ;
 2050|       |
 2051|  7.22k|        config.specified = true;
 2052|  7.22k|        ct->SetConfig(config);
 2053|  7.22k|      }
 2054|       |
 2055|  33.4k|      configs.push_back(ct);
 2056|       |      // add the data to the molecule if needed
 2057|  33.4k|      if (addToMol && !alreadyExists)
  ------------------
  |  Branch (2057:11): [True: 33.4k, False: 0]
  |  Branch (2057:23): [True: 31.6k, False: 1.81k]
  ------------------
 2058|  31.6k|        mol->SetData(ct);
 2059|       |
 2060|  33.4k|    }
 2061|       |
 2062|   106k|    return configs;
 2063|   106k|  }
_ZN9OpenBabel12StereoFrom3DEPNS_5OBMolEb:
 2076|   135k|  {
 2077|   135k|    if (mol->HasChiralityPerceived() && !force)
  ------------------
  |  Branch (2077:9): [True: 0, False: 135k]
  |  Branch (2077:41): [True: 0, False: 0]
  ------------------
 2078|      0|      return;
 2079|       |
 2080|   135k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::StereoFrom3D", obAuditMsg);
 2081|       |
 2082|   135k|    std::vector<unsigned int> symmetry_classes = FindSymmetry(mol);
 2083|   135k|    OBStereoUnitSet stereogenicUnits = FindStereogenicUnits(mol, symmetry_classes);
 2084|       |
 2085|   135k|    mol->DeleteData(OBGenericDataType::StereoData);
 2086|   135k|    TetrahedralFrom3D(mol, stereogenicUnits);
 2087|   135k|    CisTransFrom3D(mol, stereogenicUnits);
 2088|   135k|    mol->SetChiralityPerceived();
 2089|   135k|  }
_ZN9OpenBabel10VolumeSignERKNS_7vector3ES2_S2_S2_:
 2093|  6.96k|  {
 2094|  6.96k|    vector3 A, B, C;
 2095|  6.96k|    A = b - a;
 2096|  6.96k|    B = c - a;
 2097|  6.96k|    C = d - a;
 2098|  6.96k|    matrix3x3 m(A, B, C);
 2099|  6.96k|    return m.determinant();
 2100|  6.96k|  }
_ZN9OpenBabel17TetrahedralFrom3DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEb:
 2104|   144k|  {
 2105|   144k|    std::vector<OBTetrahedralStereo*> configs;
 2106|   144k|    OBUnitCell *uc = (OBUnitCell*)mol->GetData(OBGenericDataType::UnitCell);
 2107|   144k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::TetrahedralFrom3D", obAuditMsg);
 2108|       |
 2109|       |    // find all tetrahedral centers
 2110|   144k|    std::vector<unsigned long> centers;
 2111|   151k|    for (OBStereoUnitSet::const_iterator u = stereoUnits.begin(); u != stereoUnits.end(); ++u)
  ------------------
  |  Branch (2111:67): [True: 7.24k, False: 144k]
  ------------------
 2112|  7.24k|      if ((*u).type == OBStereo::Tetrahedral)
  ------------------
  |  Branch (2112:11): [True: 7.15k, False: 86]
  ------------------
 2113|  7.15k|        centers.push_back((*u).id);
 2114|       |
 2115|   144k|    std::vector<unsigned long>::iterator i;
 2116|   151k|    for (i = centers.begin(); i != centers.end(); ++i) {
  ------------------
  |  Branch (2116:31): [True: 7.15k, False: 144k]
  ------------------
 2117|  7.15k|      OBAtom *center = mol->GetAtomById(*i);
 2118|       |      // The center id may originate from pre-existing stereo data that no
 2119|       |      // longer corresponds to an atom in this molecule (e.g. after rebuilding
 2120|       |      // a malformed structure), in which case GetAtomById returns null.
 2121|  7.15k|      if (!center)
  ------------------
  |  Branch (2121:11): [True: 3, False: 7.15k]
  ------------------
 2122|      3|        continue;
 2123|       |
 2124|       |      // the stereo unit may reference an id that is not a valid atom
 2125|       |      // (e.g. a center removed since the unit was created)
 2126|  7.15k|      if (!center)
  ------------------
  |  Branch (2126:11): [True: 0, False: 7.15k]
  ------------------
 2127|      0|        continue;
 2128|       |
 2129|       |      // make sure we have at least 3 heavy atom neighbors
 2130|       |      // timvdm 28 Jun 2009: This is already checked in FindStereogenicUnits
 2131|  7.15k|      if (center->GetHvyDegree() < 3) {
  ------------------
  |  Branch (2131:11): [True: 188, False: 6.96k]
  ------------------
 2132|    188|        std::stringstream errorMsg;
 2133|    188|        errorMsg << "Cannot calculate a signed volume for an atom with a heavy atom valence of "
 2134|    188|                 << center->GetHvyDegree() << std::endl;
 2135|    188|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obInfo);
 2136|    188|        continue;
 2137|    188|      }
 2138|       |
 2139|  6.96k|      OBTetrahedralStereo::Config config;
 2140|  6.96k|      config.center = *i;
 2141|  24.5k|      FOR_NBORS_OF_ATOM(nbr, center) {
  ------------------
  |  |  419|  6.96k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 24.5k, False: 6.96k]
  |  |  ------------------
  ------------------
 2142|  24.5k|        if (config.from == OBStereo::NoRef)
  ------------------
  |  Branch (2142:13): [True: 6.96k, False: 17.5k]
  ------------------
 2143|  6.96k|          config.from = nbr->GetId();
 2144|  17.5k|        else
 2145|  17.5k|          config.refs.push_back(nbr->GetId());
 2146|  24.5k|      }
 2147|       |
 2148|  6.96k|      bool use_central_atom = false;
 2149|       |
 2150|       |      // Create a vector with the coordinates of the neighbor atoms
 2151|       |      // and check for a bond that indicates unspecified stereochemistry
 2152|  6.96k|      std::vector<vector3> nbrCoords;
 2153|  6.96k|      OBAtom *from = mol->GetAtomById(config.from);
 2154|  6.96k|      OBBond *bond = mol->GetBond(from, center);
 2155|  6.96k|      if (bond->IsWedgeOrHash() && bond->GetBeginAtom()==center)
  ------------------
  |  Branch (2155:11): [True: 0, False: 6.96k]
  |  Branch (2155:36): [True: 0, False: 0]
  ------------------
 2156|      0|        config.specified = false;
 2157|       |
 2158|  6.96k|      vector3 center_coord = center->GetVector();
 2159|       |
 2160|  6.96k|      if (uc)
  ------------------
  |  Branch (2160:11): [True: 0, False: 6.96k]
  ------------------
 2161|      0|        nbrCoords.push_back(uc->UnwrapCartesianNear(from->GetVector(), center_coord));
 2162|  6.96k|      else
 2163|  6.96k|        nbrCoords.push_back(from->GetVector());
 2164|  24.5k|      for (OBStereo::RefIter id = config.refs.begin(); id != config.refs.end(); ++id) {
  ------------------
  |  Branch (2164:56): [True: 17.5k, False: 6.96k]
  ------------------
 2165|  17.5k|        OBAtom *nbr = mol->GetAtomById(*id);
 2166|  17.5k|        if (uc)
  ------------------
  |  Branch (2166:13): [True: 0, False: 17.5k]
  ------------------
 2167|      0|          nbrCoords.push_back(uc->UnwrapCartesianNear(nbr->GetVector(), center_coord));
 2168|  17.5k|        else
 2169|  17.5k|          nbrCoords.push_back(nbr->GetVector());
 2170|  17.5k|        OBBond *bond = mol->GetBond(nbr, center);
 2171|  17.5k|        if (bond->IsWedgeOrHash() && bond->GetBeginAtom()==center)
  ------------------
  |  Branch (2171:13): [True: 0, False: 17.5k]
  |  Branch (2171:38): [True: 0, False: 0]
  ------------------
 2172|      0|          config.specified = false;
 2173|  17.5k|      }
 2174|       |
 2175|       |        // Checks for a neighbour having 0 co-ords (added hydrogen etc)
 2176|       |        /* FIXME: needed? if the molecule has 3D coords, additional
 2177|       |         * hydrogens will get coords using OBAtom::GetNewBondVector
 2178|       |        for (std::vector<vector3>::iterator coord = nbrCoords.begin(); coord != nbrCoords.end(); ++coord) {
 2179|       |          // are the coordinates zero to 6 or more significant figures
 2180|       |          if (coord->IsApprox(VZero, 1.0e-6)) {
 2181|       |            if (!use_central_atom) {
 2182|       |              use_central_atom = true;
 2183|       |            } else {
 2184|       |              obErrorLog.ThrowError(__FUNCTION__,
 2185|       |                  "More than 2 neighbours have 0 co-ords when attempting 3D chiral calculation", obInfo);
 2186|       |            }
 2187|       |          }
 2188|       |        }
 2189|       |        */
 2190|       |
 2191|       |      // If we have three heavy atoms we can use the chiral center atom itself for the fourth
 2192|       |      // will always give same sign (for tetrahedron), magnitude will be smaller.
 2193|  6.96k|      if ((config.refs.size() == 2) || use_central_atom) {
  ------------------
  |  Branch (2193:11): [True: 3.44k, False: 3.52k]
  |  Branch (2193:40): [True: 0, False: 3.52k]
  ------------------
 2194|  3.44k|        nbrCoords.push_back(center_coord);
 2195|  3.44k|        config.refs.push_back(OBStereo::ImplicitRef); // need to add largest number on end to work
 2196|  3.44k|      }
 2197|       |
 2198|  6.96k|      double sign = VolumeSign(nbrCoords[0], nbrCoords[1], nbrCoords[2], nbrCoords[3]);
 2199|  6.96k|      if (sign < 0.0)
  ------------------
  |  Branch (2199:11): [True: 832, False: 6.13k]
  ------------------
 2200|    832|        config.winding = OBStereo::AntiClockwise;
 2201|       |
 2202|  6.96k|      OBTetrahedralStereo *th = new OBTetrahedralStereo(mol);
 2203|  6.96k|      th->SetConfig(config);
 2204|       |
 2205|  6.96k|      configs.push_back(th);
 2206|       |      // add the data to the molecule if needed
 2207|  6.96k|      if (addToMol)
  ------------------
  |  Branch (2207:11): [True: 5.10k, False: 1.86k]
  ------------------
 2208|  5.10k|        mol->SetData(th);
 2209|  6.96k|    }
 2210|       |
 2211|   144k|    return configs;
 2212|   144k|  }
_ZN9OpenBabel14CisTransFrom3DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEb:
 2216|   143k|  {
 2217|   143k|    std::vector<OBCisTransStereo*> configs;
 2218|   143k|    OBUnitCell *uc = (OBUnitCell*)mol->GetData(OBGenericDataType::UnitCell);
 2219|   143k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::CisTransFrom3D", obAuditMsg);
 2220|       |
 2221|       |    // find all cis/trans bonds
 2222|   143k|    std::vector<unsigned long> bonds;
 2223|   156k|    for (OBStereoUnitSet::const_iterator u = stereoUnits.begin(); u != stereoUnits.end(); ++u)
  ------------------
  |  Branch (2223:67): [True: 12.0k, False: 143k]
  ------------------
 2224|  12.0k|      if ((*u).type == OBStereo::CisTrans)
  ------------------
  |  Branch (2224:11): [True: 6.91k, False: 5.10k]
  ------------------
 2225|  6.91k|        bonds.push_back((*u).id);
 2226|       |
 2227|   143k|    std::vector<unsigned long>::iterator i;
 2228|   150k|    for (i = bonds.begin(); i != bonds.end(); ++i) {
  ------------------
  |  Branch (2228:29): [True: 6.91k, False: 143k]
  ------------------
 2229|  6.91k|      OBBond *bond = mol->GetBondById(*i);
 2230|       |      // the stereo unit may reference an id that is not a valid bond
 2231|  6.91k|      if (!bond)
  ------------------
  |  Branch (2231:11): [True: 0, False: 6.91k]
  ------------------
 2232|      0|        continue;
 2233|  6.91k|      OBAtom *begin = bond->GetBeginAtom();
 2234|  6.91k|      OBAtom *end = bond->GetEndAtom();
 2235|       |
 2236|       |      // Create a vector with the coordinates of the neighbor atoms
 2237|  6.91k|      std::vector<vector3> bondVecs;
 2238|  6.91k|      OBCisTransStereo::Config config;
 2239|       |      // begin
 2240|  6.91k|      config.begin = begin->GetId();
 2241|  14.6k|      FOR_NBORS_OF_ATOM (nbr, begin) {
  ------------------
  |  |  419|  6.91k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 14.6k, False: 6.91k]
  |  |  ------------------
  ------------------
 2242|  14.6k|        if (nbr->GetId() == end->GetId())
  ------------------
  |  Branch (2242:13): [True: 6.91k, False: 7.77k]
  ------------------
 2243|  6.91k|          continue;
 2244|  7.77k|        config.refs.push_back(nbr->GetId());
 2245|  7.77k|        if (uc)
  ------------------
  |  Branch (2245:13): [True: 0, False: 7.77k]
  ------------------
 2246|      0|          bondVecs.push_back(uc->MinimumImageCartesian(nbr->GetVector() - begin->GetVector()));
 2247|  7.77k|        else
 2248|  7.77k|          bondVecs.push_back(nbr->GetVector() - begin->GetVector());
 2249|  7.77k|      }
 2250|  6.91k|      if (config.refs.size() == 1) {
  ------------------
  |  Branch (2250:11): [True: 6.07k, False: 849]
  ------------------
 2251|  6.07k|        config.refs.push_back(OBStereo::ImplicitRef);
 2252|  6.07k|        vector3 pos;
 2253|  6.07k|        begin->GetNewBondVector(pos, 1.0);
 2254|       |        // WARNING: GetNewBondVector code has not yet been checked, since it's part of builder.cpp
 2255|  6.07k|        if (uc)
  ------------------
  |  Branch (2255:13): [True: 0, False: 6.07k]
  ------------------
 2256|      0|          bondVecs.push_back(uc->MinimumImageCartesian(pos - begin->GetVector()));
 2257|  6.07k|        else
 2258|  6.07k|          bondVecs.push_back(pos - begin->GetVector());
 2259|  6.07k|      }
 2260|       |      // the torsion code below indexes bondVecs[0..3], assuming exactly two
 2261|       |      // reference vectors from begin (0,1) and two from end (2,3); a malformed
 2262|       |      // cis/trans unit (sp atom, too many neighbors) breaks this assumption
 2263|  6.91k|      size_t nBeginVecs = bondVecs.size();
 2264|       |      // end
 2265|  6.91k|      config.end = end->GetId();
 2266|  6.91k|      vector3 end_vec = end->GetVector();
 2267|  6.91k|      if (uc)
  ------------------
  |  Branch (2267:11): [True: 0, False: 6.91k]
  ------------------
 2268|      0|        end_vec = uc->UnwrapCartesianNear(end_vec, begin->GetVector());
 2269|  15.0k|      FOR_NBORS_OF_ATOM (nbr, end) {
  ------------------
  |  |  419|  6.91k|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 15.0k, False: 6.91k]
  |  |  ------------------
  ------------------
 2270|  15.0k|        if (nbr->GetId() == begin->GetId())
  ------------------
  |  Branch (2270:13): [True: 6.91k, False: 8.17k]
  ------------------
 2271|  6.91k|          continue;
 2272|  8.17k|        config.refs.push_back(nbr->GetId());
 2273|  8.17k|        if (uc)
  ------------------
  |  Branch (2273:13): [True: 0, False: 8.17k]
  ------------------
 2274|      0|          bondVecs.push_back(uc->MinimumImageCartesian(nbr->GetVector() - end_vec));
 2275|  8.17k|        else
 2276|  8.17k|          bondVecs.push_back(nbr->GetVector() - end_vec);
 2277|  8.17k|      }
 2278|  6.91k|      if (config.refs.size() == 3) {
  ------------------
  |  Branch (2278:11): [True: 5.71k, False: 1.20k]
  ------------------
 2279|  5.71k|        config.refs.push_back(OBStereo::ImplicitRef);
 2280|  5.71k|        vector3 pos;
 2281|  5.71k|        end->GetNewBondVector(pos, 1.0);
 2282|  5.71k|        if (uc)
  ------------------
  |  Branch (2282:13): [True: 0, False: 5.71k]
  ------------------
 2283|      0|          bondVecs.push_back(uc->MinimumImageCartesian(pos - end_vec));
 2284|  5.71k|        else
 2285|  5.71k|          bondVecs.push_back(pos - end_vec);
 2286|  5.71k|      }
 2287|       |
 2288|       |      // A cis/trans bond needs two neighbor directions on each end (four in
 2289|       |      // total, padded with implicit refs above). A malformed structure can
 2290|       |      // leave one end with too few neighbors; skip it rather than indexing
 2291|       |      // past the end of bondVecs.
 2292|  6.91k|      if (nBeginVecs != 2 || bondVecs.size() != 4) {
  ------------------
  |  Branch (2292:11): [True: 7, False: 6.91k]
  |  Branch (2292:30): [True: 58, False: 6.85k]
  ------------------
 2293|     65|        obErrorLog.ThrowError(__FUNCTION__,
 2294|     65|          "Cannot determine cis/trans: unexpected neighbor count", obInfo);
 2295|     65|        continue;
 2296|     65|      }
 2297|       |
 2298|  6.85k|      double tor02, tor03, tor12, tor13;
 2299|  6.85k|      if (uc) {
  ------------------
  |  Branch (2299:11): [True: 0, False: 6.85k]
  ------------------
 2300|      0|        vector3 v0 = begin->GetVector() + bondVecs[0];
 2301|      0|        vector3 v1 = begin->GetVector() + bondVecs[1];
 2302|      0|        vector3 v2 = end->GetVector() + bondVecs[2];
 2303|      0|        vector3 v3 = end->GetVector() + bondVecs[3];
 2304|       |
 2305|      0|        vector3 b, c, d;
 2306|      0|        b = uc->UnwrapCartesianNear(begin->GetVector(), v0);
 2307|      0|        c = uc->UnwrapCartesianNear(end->GetVector(), b);
 2308|      0|        d = uc->UnwrapCartesianNear(v2, c);
 2309|      0|        tor02 = CalcTorsionAngle(v0, b, c, d);
 2310|       |
 2311|      0|        d = uc->UnwrapCartesianNear(v3, c);
 2312|      0|        tor03 = CalcTorsionAngle(v0, b, c, d);
 2313|       |
 2314|      0|        b = uc->UnwrapCartesianNear(begin->GetVector(), v1);
 2315|      0|        c = uc->UnwrapCartesianNear(end->GetVector(), b);
 2316|      0|        d = uc->UnwrapCartesianNear(v2, c);
 2317|      0|        tor12 = CalcTorsionAngle(v1, b, c, d);
 2318|       |
 2319|      0|        d = uc->UnwrapCartesianNear(v3, c);
 2320|      0|        tor13 = CalcTorsionAngle(v1, b, c, d);
 2321|  6.85k|      } else {
 2322|  6.85k|        tor02 = CalcTorsionAngle(begin->GetVector() + bondVecs[0], begin->GetVector(), end->GetVector(), end->GetVector() + bondVecs[2]);
 2323|  6.85k|        tor03 = CalcTorsionAngle(begin->GetVector() + bondVecs[0], begin->GetVector(), end->GetVector(), end->GetVector() + bondVecs[3]);
 2324|  6.85k|        tor12 = CalcTorsionAngle(begin->GetVector() + bondVecs[1], begin->GetVector(), end->GetVector(), end->GetVector() + bondVecs[2]);
 2325|  6.85k|        tor13 = CalcTorsionAngle(begin->GetVector() + bondVecs[1], begin->GetVector(), end->GetVector(), end->GetVector() + bondVecs[3]);
 2326|  6.85k|      }
 2327|       |
 2328|  6.85k|      if (std::abs(tor02) < 90.0 && std::abs(tor03) > 90.0) {
  ------------------
  |  Branch (2328:11): [True: 616, False: 6.23k]
  |  Branch (2328:37): [True: 509, False: 107]
  ------------------
 2329|       |        // 0      2 //
 2330|       |        //  \    /  //
 2331|       |        //   C==C   //
 2332|       |        //  /    \  //
 2333|       |        // 1      3 //
 2334|    509|        config.shape = OBStereo::ShapeZ;
 2335|       |
 2336|    509|        if (std::abs(tor12) < 90.0 || std::abs(tor13) > 90.0) {
  ------------------
  |  Branch (2336:13): [True: 128, False: 381]
  |  Branch (2336:39): [True: 2, False: 379]
  ------------------
 2337|    130|          obErrorLog.ThrowError(__FUNCTION__, "Could not determine cis/trans from 3D coordinates, using unspecified", obInfo);
 2338|    130|          config.specified = false;
 2339|    130|        }
 2340|  6.34k|      } else if (std::abs(tor02) > 90.0 && std::abs(tor03) < 90.0) {
  ------------------
  |  Branch (2340:18): [True: 5.71k, False: 628]
  |  Branch (2340:44): [True: 5.67k, False: 46]
  ------------------
 2341|       |        // 0      3 //
 2342|       |        //  \    /  //
 2343|       |        //   C==C   //
 2344|       |        //  /    \  //
 2345|       |        // 1      2 //
 2346|  5.67k|        config.shape = OBStereo::ShapeU;
 2347|       |
 2348|  5.67k|        if (std::abs(tor12) > 90.0 || std::abs(tor13) < 90.0) {
  ------------------
  |  Branch (2348:13): [True: 239, False: 5.43k]
  |  Branch (2348:39): [True: 18, False: 5.41k]
  ------------------
 2349|    257|          obErrorLog.ThrowError(__FUNCTION__, "Could not determine cis/trans from 3D coordinates, using unspecified", obInfo);
 2350|    257|          config.specified = false;
 2351|    257|        }
 2352|  5.67k|      } else {
 2353|    674|        obErrorLog.ThrowError(__FUNCTION__, "Could not determine cis/trans from 3D coordinates, using unspecified", obInfo);
 2354|    674|        config.shape = OBStereo::ShapeU;
 2355|    674|        config.specified = false;
 2356|    674|      }
 2357|       |
 2358|  6.85k|      OBCisTransStereo *ct = new OBCisTransStereo(mol);
 2359|  6.85k|      ct->SetConfig(config);
 2360|       |
 2361|  6.85k|      configs.push_back(ct);
 2362|       |      // add the data to the molecule if needed
 2363|  6.85k|      if (addToMol)
  ------------------
  |  Branch (2363:11): [True: 86, False: 6.76k]
  ------------------
 2364|     86|        mol->SetData(ct);
 2365|  6.85k|    }
 2366|       |
 2367|   143k|    return configs;
 2368|   143k|  }
_ZN9OpenBabel12StereoFrom2DEPNS_5OBMolEPNSt3__13mapIPNS_6OBBondENS_8OBStereo13BondDirectionENS2_4lessIS5_EENS2_9allocatorINS2_4pairIKS5_S7_EEEEEEb:
 2385|  1.98k|  {
 2386|  1.98k|    if (mol->HasChiralityPerceived() && !force)
  ------------------
  |  Branch (2386:9): [True: 0, False: 1.98k]
  |  Branch (2386:41): [True: 0, False: 0]
  ------------------
 2387|      0|      return;
 2388|       |
 2389|  1.98k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::StereoFrom2D", obAuditMsg);
 2390|       |
 2391|  1.98k|    std::vector<unsigned int> symmetry_classes = FindSymmetry(mol);
 2392|  1.98k|    OBStereoUnitSet stereogenicUnits = FindStereogenicUnits(mol, symmetry_classes);
 2393|       |
 2394|  1.98k|    mol->DeleteData(OBGenericDataType::StereoData);
 2395|  1.98k|    TetrahedralFrom2D(mol, stereogenicUnits);
 2396|  1.98k|    CisTransFrom2D(mol, stereogenicUnits, updown);
 2397|  1.98k|    mol->SetChiralityPerceived();
 2398|  1.98k|  }
_ZN9OpenBabel17TetrahedralFrom2DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEb:
 2444|  1.98k|  {
 2445|  1.98k|    std::vector<OBTetrahedralStereo*> configs;
 2446|  1.98k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::TetrahedralFrom2D", obAuditMsg);
 2447|       |
 2448|       |    // find all tetrahedral centers
 2449|  1.98k|    std::vector<unsigned long> centers;
 2450|  1.98k|    for (OBStereoUnitSet::const_iterator u = stereoUnits.begin(); u != stereoUnits.end(); ++u)
  ------------------
  |  Branch (2450:67): [True: 0, False: 1.98k]
  ------------------
 2451|      0|      if ((*u).type == OBStereo::Tetrahedral)
  ------------------
  |  Branch (2451:11): [True: 0, False: 0]
  ------------------
 2452|      0|        centers.push_back((*u).id);
 2453|       |
 2454|       |
 2455|  1.98k|    std::vector<unsigned long>::iterator i;
 2456|  1.98k|    for (i = centers.begin(); i != centers.end(); ++i) {
  ------------------
  |  Branch (2456:31): [True: 0, False: 1.98k]
  ------------------
 2457|      0|      OBAtom *center = mol->GetAtomById(*i);
 2458|       |
 2459|       |      // make sure we have at least 3 heavy atom neighbors
 2460|      0|      if (center->GetHvyDegree() < 3) {
  ------------------
  |  Branch (2460:11): [True: 0, False: 0]
  ------------------
 2461|      0|        std::stringstream errorMsg;
 2462|      0|        errorMsg << "Cannot calculate a signed volume for an atom with a heavy atom valence of "
 2463|      0|                 << center->GetHvyDegree() << std::endl;
 2464|      0|        obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obInfo);
 2465|      0|        continue;
 2466|      0|      }
 2467|       |
 2468|      0|      OBTetrahedralStereo::Config config;
 2469|      0|      config.center = *i;
 2470|       |
 2471|       |      // We assume the 'tip-only' convention. That is, wedge or hash bonds only
 2472|       |      // determine the stereochemistry at their thin end (the BeginAtom)
 2473|      0|      bool tiponly = true;
 2474|       |
 2475|       |      // find the hash, wedge and 2 plane atoms
 2476|      0|      std::vector<OBAtom*> planeAtoms;
 2477|      0|      std::vector<OBAtom*> wedgeAtoms;
 2478|      0|      std::vector<OBAtom*> hashAtoms;
 2479|      0|      FOR_BONDS_OF_ATOM(bond, center) {
  ------------------
  |  |  420|      0|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2480|      0|        OBAtom *nbr = bond->GetNbrAtom(center);
 2481|       |        // hash bonds
 2482|      0|        if (bond->IsHash()) {
  ------------------
  |  Branch (2482:13): [True: 0, False: 0]
  ------------------
 2483|      0|          if (bond->GetBeginAtom()->GetId() == center->GetId()) {
  ------------------
  |  Branch (2483:15): [True: 0, False: 0]
  ------------------
 2484|       |            // this is a 'real' hash bond going from center to nbr
 2485|      0|            hashAtoms.push_back(nbr);
 2486|      0|          } else {
 2487|       |            // this is an 'inverted' hash bond going from nbr to center
 2488|      0|            if (tiponly)
  ------------------
  |  Branch (2488:17): [True: 0, False: 0]
  ------------------
 2489|      0|              planeAtoms.push_back(nbr);
 2490|      0|            else
 2491|      0|              wedgeAtoms.push_back(nbr);
 2492|      0|          }
 2493|      0|        } else if (bond->IsWedge()) {
  ------------------
  |  Branch (2493:20): [True: 0, False: 0]
  ------------------
 2494|       |          // wedge bonds
 2495|      0|          if (bond->GetBeginAtom()->GetId() == center->GetId()) {
  ------------------
  |  Branch (2495:15): [True: 0, False: 0]
  ------------------
 2496|       |            // this is a 'real' wedge bond going from center to nbr
 2497|      0|            wedgeAtoms.push_back(nbr);
 2498|      0|          } else {
 2499|       |            // this is an 'inverted' wedge bond going from nbr to center
 2500|      0|            if (tiponly)
  ------------------
  |  Branch (2500:17): [True: 0, False: 0]
  ------------------
 2501|      0|              planeAtoms.push_back(nbr);
 2502|      0|            else
 2503|      0|              hashAtoms.push_back(nbr);
 2504|      0|          }
 2505|      0|        } else if (bond->IsWedgeOrHash()) {
  ------------------
  |  Branch (2505:20): [True: 0, False: 0]
  ------------------
 2506|      0|          if (!tiponly || (tiponly && bond->GetBeginAtom()->GetId() == center->GetId())) {
  ------------------
  |  Branch (2506:15): [True: 0, False: 0]
  |  Branch (2506:28): [True: 0, False: 0]
  |  Branch (2506:39): [True: 0, False: 0]
  ------------------
 2507|      0|            config.specified = true;
 2508|      0|            config.winding = OBStereo::UnknownWinding;
 2509|      0|            break;
 2510|      0|          }
 2511|      0|          else
 2512|      0|            planeAtoms.push_back(nbr);
 2513|      0|        } else {
 2514|       |          // plane bonds
 2515|      0|          planeAtoms.push_back(nbr);
 2516|      0|        }
 2517|      0|      }
 2518|       |
 2519|       |      // Handle the case of a tet center with four plane atoms or
 2520|       |      //        3 plane atoms with the fourth bond implicit
 2521|      0|      if (planeAtoms.size() == 4 || (planeAtoms.size() == 3 && center->GetExplicitDegree()==3))
  ------------------
  |  Branch (2521:11): [True: 0, False: 0]
  |  Branch (2521:38): [True: 0, False: 0]
  |  Branch (2521:64): [True: 0, False: 0]
  ------------------
 2522|      0|        config.specified = false;
 2523|       |
 2524|      0|      bool success = true;
 2525|       |
 2526|      0|      using namespace std;
 2527|      0|      if (!config.specified || (config.specified && config.winding==OBStereo::UnknownWinding)) {
  ------------------
  |  Branch (2527:11): [True: 0, False: 0]
  |  Branch (2527:33): [True: 0, False: 0]
  |  Branch (2527:53): [True: 0, False: 0]
  ------------------
 2528|       |        // unspecified or specified as unknown
 2529|      0|        FOR_NBORS_OF_ATOM (nbr, center)
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2530|      0|          if (config.from == OBStereo::NoRef)
  ------------------
  |  Branch (2530:15): [True: 0, False: 0]
  ------------------
 2531|      0|            config.from = nbr->GetId();
 2532|      0|          else
 2533|      0|            config.refs.push_back(nbr->GetId());
 2534|      0|        while (config.refs.size() < 3)
  ------------------
  |  Branch (2534:16): [True: 0, False: 0]
  ------------------
 2535|      0|          config.refs.push_back(OBStereo::ImplicitRef);
 2536|      0|      } else {
 2537|       |
 2538|       |        // config.specified
 2539|       |
 2540|      0|        if (hashAtoms.size() == 4 || wedgeAtoms.size() == 4)
  ------------------
  |  Branch (2540:13): [True: 0, False: 0]
  |  Branch (2540:38): [True: 0, False: 0]
  ------------------
 2541|      0|        {
 2542|      0|          success = false;
 2543|      0|        } else if (planeAtoms.size() + hashAtoms.size() + wedgeAtoms.size() == 4)
  ------------------
  |  Branch (2543:20): [True: 0, False: 0]
  ------------------
 2544|      0|        {
 2545|       |          // Handle all explicit tetra with at least one stereobond
 2546|      0|          vector<OBAtom*> order;
 2547|       |
 2548|       |          // First of all, handle the case of three wedge (or three hash) and one other bond
 2549|       |          //          by converting it into a single hash (or single wedge) and three planes
 2550|      0|          if (wedgeAtoms.size() == 3 || hashAtoms.size() == 3) {
  ------------------
  |  Branch (2550:15): [True: 0, False: 0]
  |  Branch (2550:41): [True: 0, False: 0]
  ------------------
 2551|      0|            vector<OBAtom*> *pwedge, *phash;
 2552|      0|            if (wedgeAtoms.size() == 3) {
  ------------------
  |  Branch (2552:17): [True: 0, False: 0]
  ------------------
 2553|      0|              pwedge = &wedgeAtoms; phash = &hashAtoms;
 2554|      0|            }
 2555|      0|            else {
 2556|      0|              phash = &wedgeAtoms; pwedge = &hashAtoms;
 2557|      0|            }
 2558|      0|            if (planeAtoms.size() == 0) { // Already has the hash bond
  ------------------
  |  Branch (2558:17): [True: 0, False: 0]
  ------------------
 2559|      0|              planeAtoms.insert(planeAtoms.end(), pwedge->begin(), pwedge->end());
 2560|      0|              pwedge->clear();
 2561|      0|            }
 2562|      0|            else { // Does not already have the hash bond
 2563|      0|              phash->push_back(planeAtoms[0]);
 2564|      0|              planeAtoms.clear();
 2565|      0|              pwedge->clear();
 2566|      0|            }
 2567|      0|          }
 2568|       |
 2569|       |          // Pick a stereobond on which to base the stereochemistry:
 2570|      0|          bool wedge = wedgeAtoms.size() > 0;
 2571|      0|          order.push_back(wedge?wedgeAtoms[0]:hashAtoms[0]);
  ------------------
  |  Branch (2571:27): [True: 0, False: 0]
  ------------------
 2572|      0|          vector<OBAtom*> nbrs;
 2573|      0|          FOR_NBORS_OF_ATOM(nbr, center) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2574|      0|            if (&*nbr != order[0])
  ------------------
  |  Branch (2574:17): [True: 0, False: 0]
  ------------------
 2575|      0|              nbrs.push_back(&*nbr);
 2576|      0|          }
 2577|       |          // Add "nbrs" to "order" in order of anticlockwise stereo
 2578|      0|          order.push_back(nbrs[0]);
 2579|      0|          if (AngleOrder(order[0]->GetVector(), order[1]->GetVector(), nbrs[1]->GetVector(), center->GetVector()))
  ------------------
  |  Branch (2579:15): [True: 0, False: 0]
  ------------------
 2580|      0|            order.push_back(nbrs[1]);
 2581|      0|          else
 2582|      0|            order.insert(order.begin()+1, nbrs[1]);
 2583|      0|          if (AngleOrder(order[0]->GetVector(), order[2]->GetVector(), nbrs[2]->GetVector(), center->GetVector()))
  ------------------
  |  Branch (2583:15): [True: 0, False: 0]
  ------------------
 2584|      0|            order.push_back(nbrs[2]);
 2585|      0|          else {
 2586|      0|            if (AngleOrder(order[0]->GetVector(), order[1]->GetVector(), nbrs[2]->GetVector(), center->GetVector()))
  ------------------
  |  Branch (2586:17): [True: 0, False: 0]
  ------------------
 2587|      0|              order.insert(order.begin()+2, nbrs[2]);
 2588|      0|            else
 2589|      0|              order.insert(order.begin()+1, nbrs[2]);
 2590|      0|          }
 2591|       |
 2592|       |          // Handle the case of two planes with a wedge and hash bond opposite each other.
 2593|       |          // This is handled as in the InChI TechMan (Figure 9) by marking it ambiguous if
 2594|       |          // the (small) angle between the plane bonds is > 133, and basing the stereo on
 2595|       |          // the 'inner' bond otherwise. This is commonly used for stereo in rings.
 2596|       |          // See also Get2DTetrahedralAmbiguity() in ichister.c (part of InChI)
 2597|      0|          if (planeAtoms.size() == 2 && wedgeAtoms.size() == 1) { // Two planes, 1 wedge, 1 hash
  ------------------
  |  Branch (2597:15): [True: 0, False: 0]
  |  Branch (2597:41): [True: 0, False: 0]
  ------------------
 2598|      0|            if (order[2] == hashAtoms[0]) { // The wedge and hash are opposite
  ------------------
  |  Branch (2598:17): [True: 0, False: 0]
  ------------------
 2599|      0|              double angle = GetAngle(order[1], center, order[3]); // The anticlockwise angle between the plane atoms
 2600|      0|              if (angle > -133 && angle < 133) { // This value is from the InChI TechMan Figure 9
  ------------------
  |  Branch (2600:19): [True: 0, False: 0]
  |  Branch (2600:35): [True: 0, False: 0]
  ------------------
 2601|      0|                if (angle > 0) { // Change to three planes and the hash bond
  ------------------
  |  Branch (2601:21): [True: 0, False: 0]
  ------------------
 2602|      0|                  std::rotate(order.begin(), order.begin() + 2, order.end()); // Change the order so that it begins with the hash bond
 2603|      0|                  wedge = false;
 2604|      0|                  planeAtoms.push_back(wedgeAtoms[0]);
 2605|      0|                  wedgeAtoms.clear();
 2606|      0|                }
 2607|      0|                else { // Change to three planes and the wedge bond (note: order is already correct)
 2608|      0|                  planeAtoms.push_back(hashAtoms[0]);
 2609|      0|                  hashAtoms.clear();
 2610|      0|                }
 2611|      0|              } // No need for "else" statement, as this will be picked up as ambiguous stereo below
 2612|      0|            }
 2613|      0|          }
 2614|       |
 2615|      0|          config.from = order[0]->GetId();
 2616|      0|          config.refs.resize(3);
 2617|      0|          for(int i=0; i<3; ++i)
  ------------------
  |  Branch (2617:24): [True: 0, False: 0]
  ------------------
 2618|      0|            config.refs[i] = order[i+1]->GetId();
 2619|      0|          if (wedge)
  ------------------
  |  Branch (2619:15): [True: 0, False: 0]
  ------------------
 2620|      0|            config.winding = OBStereo::AntiClockwise;
 2621|       |
 2622|       |          // Check for ambiguous stereo based on the members of "order".
 2623|       |          // If the first is a wedge bond, then the next should be a plane/hash, then plane/wedge, then plane/hash
 2624|       |          // If not, then the stereo is considered ambiguous.
 2625|      0|          vector<OBAtom*> *pwedge, *phash;
 2626|      0|          if (wedge) {
  ------------------
  |  Branch (2626:15): [True: 0, False: 0]
  ------------------
 2627|      0|            pwedge = &wedgeAtoms; phash = &hashAtoms;
 2628|      0|          }
 2629|      0|          else {
 2630|      0|            phash = &wedgeAtoms; pwedge = &hashAtoms;
 2631|      0|          }
 2632|      0|          if (std::find(pwedge->begin(), pwedge->end(), order[1]) != pwedge->end() ||
  ------------------
  |  Branch (2632:15): [True: 0, False: 0]
  |  Branch (2632:15): [True: 0, False: 0]
  ------------------
 2633|      0|              std::find(phash->begin(), phash->end(), order[2]) != phash->end()  ||
  ------------------
  |  Branch (2633:15): [True: 0, False: 0]
  ------------------
 2634|      0|              std::find(pwedge->begin(), pwedge->end(), order[3]) != pwedge->end()) { // Ambiguous stereo
  ------------------
  |  Branch (2634:15): [True: 0, False: 0]
  ------------------
 2635|      0|                success = false;
 2636|      0|          }
 2637|      0|        } else // 3 explicit bonds from here on
 2638|      0|          if(hashAtoms.size() == 0 || wedgeAtoms.size() == 0) {
  ------------------
  |  Branch (2638:14): [True: 0, False: 0]
  |  Branch (2638:39): [True: 0, False: 0]
  ------------------
 2639|       |            // Composed of just wedge bonds and plane bonds, or just hash bonds and plane bonds
 2640|       |
 2641|       |            // Pick a stereobond on which to base the stereochemistry:
 2642|      0|            vector<OBAtom*> order;
 2643|      0|            bool wedge = wedgeAtoms.size() > 0;
 2644|      0|            order.push_back(wedge?wedgeAtoms[0]:hashAtoms[0]);
  ------------------
  |  Branch (2644:29): [True: 0, False: 0]
  ------------------
 2645|      0|            vector<OBAtom*> nbrs;
 2646|      0|            FOR_NBORS_OF_ATOM(nbr, center) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2647|      0|              if (&*nbr != order[0])
  ------------------
  |  Branch (2647:19): [True: 0, False: 0]
  ------------------
 2648|      0|                nbrs.push_back(&*nbr);
 2649|      0|            }
 2650|       |            // Add "nbrs" to "order" in order of anticlockwise stereo
 2651|      0|            order.push_back(nbrs[0]);
 2652|      0|            if (AngleOrder(order[0]->GetVector(), order[1]->GetVector(), nbrs[1]->GetVector(), center->GetVector()))
  ------------------
  |  Branch (2652:17): [True: 0, False: 0]
  ------------------
 2653|      0|              order.push_back(nbrs[1]);
 2654|      0|            else
 2655|      0|              order.insert(order.begin()+1, nbrs[1]);
 2656|       |
 2657|       |            // Handle the case of two planes with a wedge/hash in the small angle between them.
 2658|       |            // This is handled similar to the InChI TechMan (Figure 10) by treating the stereo bond
 2659|       |            // as being in the large angle. This is consistent with Symyx Draw.
 2660|      0|            if (planeAtoms.size() == 2) { // Two planes, 1 stereo
  ------------------
  |  Branch (2660:17): [True: 0, False: 0]
  ------------------
 2661|      0|              double angle = GetAngle(order[1], center, order[2]); // The anticlockwise angle between the plane atoms
 2662|      0|              if (angle < 0) // Invert the stereo of the stereobond
  ------------------
  |  Branch (2662:19): [True: 0, False: 0]
  ------------------
 2663|      0|                wedge = !wedge;
 2664|      0|            }
 2665|       |
 2666|      0|            config.from = OBStereo::ImplicitRef;
 2667|      0|            config.refs.resize(3);
 2668|      0|            for(int i=0; i<3; ++i)
  ------------------
  |  Branch (2668:26): [True: 0, False: 0]
  ------------------
 2669|      0|              config.refs[i] = order[i]->GetId();
 2670|      0|            if (!wedge)
  ------------------
  |  Branch (2670:17): [True: 0, False: 0]
  ------------------
 2671|      0|              config.winding = OBStereo::AntiClockwise;
 2672|      0|        }  else { // 3 explicit bonds with at least one hash and at least one wedge
 2673|      0|          success = false;
 2674|      0|        }
 2675|      0|      } // end of config.specified
 2676|       |
 2677|      0|      if (!success) {
  ------------------
  |  Branch (2677:11): [True: 0, False: 0]
  ------------------
 2678|       |//         std::stringstream errorMsg;
 2679|       |//         errorMsg << "Symmetry analysis found atom with id " << center->GetId()
 2680|       |//             << " to be a tetrahedral atom but the wedge/hash bonds can't be interpreted." << std::endl
 2681|       |//             << " # in-plane bonds = " << planeAtoms.size() << std::endl
 2682|       |//             << " # wedge bonds = " << wedgeAtoms.size() << std::endl
 2683|       |//             << " # hash bonds = " << hashAtoms.size() << std::endl
 2684|       |//             << std::endl;
 2685|       |//         obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obError);
 2686|      0|        continue;
 2687|      0|      }
 2688|       |
 2689|       |
 2690|      0|      OBTetrahedralStereo *th = new OBTetrahedralStereo(mol);
 2691|      0|      th->SetConfig(config);
 2692|       |
 2693|      0|      configs.push_back(th);
 2694|       |      // add the data to the molecule if needed
 2695|      0|      if (addToMol)
  ------------------
  |  Branch (2695:11): [True: 0, False: 0]
  ------------------
 2696|      0|        mol->SetData(th);
 2697|      0|    }
 2698|       |
 2699|  1.98k|    return configs;
 2700|  1.98k|  }
_ZN9OpenBabel14CisTransFrom2DEPNS_5OBMolERKNSt3__16vectorINS_12OBStereoUnitENS2_9allocatorIS4_EEEEPKNS2_3mapIPNS_6OBBondENS_8OBStereo13BondDirectionENS2_4lessISC_EENS5_INS2_4pairIKSC_SE_EEEEEEb:
 2705|  1.98k|  {
 2706|  1.98k|    std::vector<OBCisTransStereo*> configs;
 2707|  1.98k|    std::map<OBBond*, enum OBStereo::BondDirection>::const_iterator ud_cit;
 2708|  1.98k|    obErrorLog.ThrowError(__FUNCTION__, "Ran OpenBabel::CisTransFrom2D", obAuditMsg);
 2709|       |
 2710|       |    // find all cis/trans bonds
 2711|  1.98k|    std::vector<unsigned long> bonds;
 2712|  1.98k|    for (OBStereoUnitSet::const_iterator u = stereoUnits.begin(); u != stereoUnits.end(); ++u)
  ------------------
  |  Branch (2712:67): [True: 0, False: 1.98k]
  ------------------
 2713|      0|      if ((*u).type == OBStereo::CisTrans)
  ------------------
  |  Branch (2713:11): [True: 0, False: 0]
  ------------------
 2714|      0|        bonds.push_back((*u).id);
 2715|       |
 2716|  1.98k|    std::vector<unsigned long>::iterator i;
 2717|  1.98k|    for (i = bonds.begin(); i != bonds.end(); ++i) {
  ------------------
  |  Branch (2717:29): [True: 0, False: 1.98k]
  ------------------
 2718|      0|      OBBond *bond = mol->GetBondById(*i);
 2719|       |      // the stereo unit may reference an id that is not a valid bond
 2720|      0|      if (!bond)
  ------------------
  |  Branch (2720:11): [True: 0, False: 0]
  ------------------
 2721|      0|        continue;
 2722|      0|      OBAtom *begin = bond->GetBeginAtom();
 2723|      0|      OBAtom *end = bond->GetEndAtom();
 2724|       |
 2725|       |      // Create a vector with the coordinates of the neighbor atoms
 2726|      0|      std::vector<vector3> bondVecs;
 2727|      0|      OBCisTransStereo::Config config;
 2728|      0|      config.specified = true;
 2729|       |
 2730|       |      // begin
 2731|      0|      config.begin = begin->GetId();
 2732|      0|      FOR_NBORS_OF_ATOM (nbr, begin) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2733|      0|        if (nbr->GetId() == end->GetId())
  ------------------
  |  Branch (2733:13): [True: 0, False: 0]
  ------------------
 2734|      0|          continue;
 2735|      0|        config.refs.push_back(nbr->GetId());
 2736|      0|        bondVecs.push_back(nbr->GetVector());
 2737|       |
 2738|       |        // Check whether a single bond with unknown dir starts at the dbl bond (tip-only convention)
 2739|      0|        OBBond *b = mol->GetBond(begin, &*nbr);
 2740|      0|        if (updown) {
  ------------------
  |  Branch (2740:13): [True: 0, False: 0]
  ------------------
 2741|      0|          ud_cit = updown->find(b);
 2742|      0|          if (ud_cit!=updown->end() && ud_cit->second==OBStereo::UnknownDir && b->GetBeginAtom()==begin)
  ------------------
  |  Branch (2742:15): [True: 0, False: 0]
  |  Branch (2742:15): [True: 0, False: 0]
  |  Branch (2742:40): [True: 0, False: 0]
  |  Branch (2742:80): [True: 0, False: 0]
  ------------------
 2743|      0|            config.specified = false;
 2744|      0|        }
 2745|      0|      }
 2746|      0|      if (config.refs.size() == 1) {
  ------------------
  |  Branch (2746:11): [True: 0, False: 0]
  ------------------
 2747|      0|        config.refs.push_back(OBStereo::ImplicitRef);
 2748|      0|        vector3 pos;
 2749|      0|        begin->GetNewBondVector(pos, 1.0);
 2750|      0|        bondVecs.push_back(pos);
 2751|      0|      }
 2752|       |      // the stereochemistry code below indexes bondVecs[0..3], assuming exactly
 2753|       |      // two reference vectors from begin (0,1) and two from end (2,3)
 2754|      0|      size_t nBeginVecs = bondVecs.size();
 2755|       |      // end
 2756|      0|      config.end = end->GetId();
 2757|      0|      FOR_NBORS_OF_ATOM (nbr, end) {
  ------------------
  |  |  419|      0|#define FOR_NBORS_OF_ATOM(a,p)    for (auto a : impl::AtomGetNbrs(p))
  |  |  ------------------
  |  |  |  Branch (419:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2758|      0|        if (nbr->GetId() == begin->GetId())
  ------------------
  |  Branch (2758:13): [True: 0, False: 0]
  ------------------
 2759|      0|          continue;
 2760|      0|        config.refs.push_back(nbr->GetId());
 2761|      0|        bondVecs.push_back(nbr->GetVector());
 2762|       |
 2763|       |        // Check whether a single bond with unknown dir starts at the dbl bond (tip-only convention)
 2764|      0|        OBBond *b = mol->GetBond(end, &*nbr);
 2765|      0|        if (updown) {
  ------------------
  |  Branch (2765:13): [True: 0, False: 0]
  ------------------
 2766|      0|          ud_cit = updown->find(b);
 2767|      0|          if (ud_cit!=updown->end() && ud_cit->second==OBStereo::UnknownDir && b->GetBeginAtom()==end)
  ------------------
  |  Branch (2767:15): [True: 0, False: 0]
  |  Branch (2767:15): [True: 0, False: 0]
  |  Branch (2767:40): [True: 0, False: 0]
  |  Branch (2767:80): [True: 0, False: 0]
  ------------------
 2768|      0|            config.specified = false;
 2769|      0|        }
 2770|      0|      }
 2771|      0|      if (config.refs.size() == 3) {
  ------------------
  |  Branch (2771:11): [True: 0, False: 0]
  ------------------
 2772|      0|        config.refs.push_back(OBStereo::ImplicitRef);
 2773|      0|        vector3 pos;
 2774|      0|        end->GetNewBondVector(pos, 1.0);
 2775|      0|        bondVecs.push_back(pos);
 2776|      0|      }
 2777|       |
 2778|       |      // Handle the case where the dbl bond is marked as unknown stereo
 2779|      0|      if (updown) {
  ------------------
  |  Branch (2779:11): [True: 0, False: 0]
  ------------------
 2780|      0|        ud_cit = updown->find(bond);
 2781|      0|        if (ud_cit!=updown->end() && ud_cit->second==OBStereo::UnknownDir)
  ------------------
  |  Branch (2781:13): [True: 0, False: 0]
  |  Branch (2781:13): [True: 0, False: 0]
  |  Branch (2781:38): [True: 0, False: 0]
  ------------------
 2782|      0|            config.specified = false;
 2783|      0|      }
 2784|       |
 2785|       |      // a malformed cis/trans unit (sp atom, too many neighbors) breaks the
 2786|       |      // 2/2 split the stereochemistry code below relies on
 2787|      0|      if (nBeginVecs != 2 || bondVecs.size() != 4)
  ------------------
  |  Branch (2787:11): [True: 0, False: 0]
  |  Branch (2787:30): [True: 0, False: 0]
  ------------------
 2788|      0|        config.specified = false;
 2789|       |
 2790|      0|      if (config.specified==true) { // Work out the stereochemistry
  ------------------
  |  Branch (2790:11): [True: 0, False: 0]
  ------------------
 2791|       |        // 0      3
 2792|       |        //  \    /        2 triangles: 0-1-b & 2-3-a
 2793|       |        //   a==b    -->  same sign: U
 2794|       |        //  /    \        opposite sign: Z
 2795|       |        // 1      2
 2796|       |        /*
 2797|       |        double sign1 = TriangleSign(begin->GetVector(), end->GetVector(), bondVecs[0]);
 2798|       |        double sign2 = TriangleSign(begin->GetVector(), end->GetVector(), bondVecs[2]);
 2799|       |        */
 2800|      0|        double sign1 = TriangleSign(bondVecs[0], bondVecs[1], end->GetVector());
 2801|      0|        double sign2 = TriangleSign(bondVecs[2], bondVecs[3], begin->GetVector());
 2802|      0|        double sign = sign1 * sign2;
 2803|       |
 2804|      0|        if (sign < 0.0) // opposite sign
  ------------------
  |  Branch (2804:13): [True: 0, False: 0]
  ------------------
 2805|      0|          config.shape = OBStereo::ShapeZ;
 2806|      0|      }
 2807|       |
 2808|      0|      OBCisTransStereo *ct = new OBCisTransStereo(mol);
 2809|      0|      ct->SetConfig(config);
 2810|       |
 2811|      0|      configs.push_back(ct);
 2812|       |      // add the data to the molecule if needed
 2813|      0|      if (addToMol)
  ------------------
  |  Branch (2813:11): [True: 0, False: 0]
  ------------------
 2814|      0|        mol->SetData(ct);
 2815|      0|    }
 2816|       |
 2817|  1.98k|    return configs;
 2818|  1.98k|  }
_ZN9OpenBabel19StereoRefToImplicitERNS_5OBMolEm:
 3013|    427|  void StereoRefToImplicit(OBMol& mol, OBStereo::Ref atomId) {
 3014|    427|    std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 3015|    456|    for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data) {
  ------------------
  |  Branch (3015:70): [True: 29, False: 427]
  ------------------
 3016|     29|      OBStereo::Type datatype = ((OBStereoBase*)*data)->GetType();
 3017|       |
 3018|     29|      if (datatype != OBStereo::CisTrans && datatype != OBStereo::Tetrahedral) {
  ------------------
  |  Branch (3018:11): [True: 14, False: 15]
  |  Branch (3018:45): [True: 0, False: 14]
  ------------------
 3019|       |        // Maybe I should just unset the stereochemistry if this happens?
 3020|      0|        obErrorLog.ThrowError(__FUNCTION__,
 3021|      0|            "This function should be updated to handle additional stereo types.\nSome stereochemistry objects may contain explicit refs to hydrogens which have been removed.", obWarning);
 3022|      0|        continue;
 3023|      0|      }
 3024|       |
 3025|       |      // Replace any references to atomId with ImplicitRef
 3026|     29|      if (datatype == OBStereo::CisTrans) {
  ------------------
  |  Branch (3026:11): [True: 15, False: 14]
  ------------------
 3027|     15|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 3028|     15|        OBCisTransStereo::Config ct_cfg = ct->GetConfig();
 3029|     15|        replace(ct_cfg.refs.begin(), ct_cfg.refs.end(), atomId, (OBStereo::Ref) OBStereo::ImplicitRef);
 3030|     15|        ct->SetConfig(ct_cfg);
 3031|     15|      }
 3032|     14|      else if (datatype == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (3032:16): [True: 14, False: 0]
  ------------------
 3033|     14|        OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(*data);
 3034|     14|        OBTetrahedralStereo::Config ts_cfg = ts->GetConfig();
 3035|     14|        if (ts_cfg.from == atomId) ts_cfg.from = OBStereo::ImplicitRef;
  ------------------
  |  Branch (3035:13): [True: 5, False: 9]
  ------------------
 3036|     14|        replace(ts_cfg.refs.begin(), ts_cfg.refs.end(), atomId, (OBStereo::Ref) OBStereo::ImplicitRef);
 3037|     14|        ts->SetConfig(ts_cfg);
 3038|     14|      }
 3039|     29|    }
 3040|    427|  }
_ZN9OpenBabel19ImplicitRefToStereoERNS_5OBMolEmm:
 3042|   219k|  void ImplicitRefToStereo(OBMol& mol, OBStereo::Ref centerId, OBStereo::Ref newId) {
 3043|   219k|    std::vector<OBGenericData*> vdata = mol.GetAllData(OBGenericDataType::StereoData);
 3044|   515k|    for (std::vector<OBGenericData*>::iterator data = vdata.begin(); data != vdata.end(); ++data) {
  ------------------
  |  Branch (3044:70): [True: 295k, False: 219k]
  ------------------
 3045|   295k|      OBStereo::Type datatype = ((OBStereoBase*)*data)->GetType();
 3046|       |
 3047|   295k|      if (datatype != OBStereo::CisTrans && datatype != OBStereo::Tetrahedral) {
  ------------------
  |  Branch (3047:11): [True: 63.5k, False: 232k]
  |  Branch (3047:45): [True: 0, False: 63.5k]
  ------------------
 3048|       |        // Maybe I should just unset the stereochemistry if this happens?
 3049|      0|        obErrorLog.ThrowError(__FUNCTION__,
 3050|      0|            "This function should be updated to handle additional stereo types.\nSome stereochemistry objects may contain implicit refs to hydrogens which need to be converted to explicit.", obWarning);
 3051|      0|        continue;
 3052|      0|      }
 3053|       |
 3054|       |      // Replace any references to ImplicitRef (attached to centerId) with newId
 3055|   295k|      if (datatype == OBStereo::CisTrans) {
  ------------------
  |  Branch (3055:11): [True: 232k, False: 63.5k]
  ------------------
 3056|   232k|        OBCisTransStereo *ct = dynamic_cast<OBCisTransStereo*>(*data);
 3057|   232k|        OBCisTransStereo::Config ct_cfg = ct->GetConfig();
 3058|   232k|        if (ct_cfg.begin == centerId || ct_cfg.end == centerId) {
  ------------------
  |  Branch (3058:13): [True: 582, False: 231k]
  |  Branch (3058:41): [True: 746, False: 230k]
  ------------------
 3059|       |          // Assumption: the first two refs are on the begin atom, the last two on the end atom
 3060|  1.32k|          if (ct_cfg.begin == centerId)
  ------------------
  |  Branch (3060:15): [True: 582, False: 746]
  ------------------
 3061|    582|            replace(ct_cfg.refs.begin(), ct_cfg.refs.begin()+2, (OBStereo::Ref) OBStereo::ImplicitRef, (OBStereo::Ref) newId);
 3062|  1.32k|          if (ct_cfg.end == centerId)
  ------------------
  |  Branch (3062:15): [True: 746, False: 582]
  ------------------
 3063|    746|            replace(ct_cfg.refs.begin()+2, ct_cfg.refs.end(), (OBStereo::Ref) OBStereo::ImplicitRef, (OBStereo::Ref) newId);
 3064|  1.32k|          ct->SetConfig(ct_cfg);
 3065|  1.32k|        }
 3066|   232k|      }
 3067|  63.5k|      else if (datatype == OBStereo::Tetrahedral) {
  ------------------
  |  Branch (3067:16): [True: 63.5k, False: 0]
  ------------------
 3068|  63.5k|        OBTetrahedralStereo *ts = dynamic_cast<OBTetrahedralStereo*>(*data);
 3069|  63.5k|        OBTetrahedralStereo::Config ts_cfg = ts->GetConfig();
 3070|  63.5k|        if (ts_cfg.center == centerId) {
  ------------------
  |  Branch (3070:13): [True: 146, False: 63.3k]
  ------------------
 3071|    146|          if (ts_cfg.from == OBStereo::ImplicitRef) ts_cfg.from = newId;
  ------------------
  |  Branch (3071:15): [True: 50, False: 96]
  ------------------
 3072|    146|          replace(ts_cfg.refs.begin(), ts_cfg.refs.end(), (OBStereo::Ref) OBStereo::ImplicitRef, (OBStereo::Ref) newId);
 3073|    146|          ts->SetConfig(ts_cfg);
 3074|    146|        }
 3075|  63.5k|      }
 3076|   295k|    }
 3077|   219k|  }
_ZN9OpenBabel10StereoRingC2Ev:
  456|   125k|    StereoRing() : trueCount(0) {}
_ZN9OpenBabel10StereoRing8ParaAtomC2Emj:
  422|  63.2k|      ParaAtom(unsigned long _id, unsigned int idx) : id(_id), inIdx(idx) {}
_ZN9OpenBabel10StereoRing8ParaBondC2Emjj:
  441|  6.20k|      ParaBond(unsigned long _id, unsigned int _inIdx, unsigned int _outIdx) : id(_id), inIdx(_inIdx), outIdx(_outIdx) {}
_ZN9OpenBabel10ApplyRule1INS_10StereoRing8ParaAtomEEEbRKT_RKNSt3__16vectorIjNS6_9allocatorIjEEEERKNS7_IS1_NS8_IS1_EEEERNS7_IbNS8_IbEEEERKNS7_INS_12OBStereoUnitENS8_ISK_EEEESA_:
  488|   252k|  {
  489|   252k|    bool foundRing = false;
  490|   252k|    unsigned int idx = currentPara.inIdx;
  491|       |
  492|       |    /*
  493|       |    for (std::size_t i = 0; i < visitedRings.size(); ++i)
  494|       |      if (visitedRings[i])
  495|       |        cout << "  ";
  496|       |    cout << "ApplyRule1(" << currentPara.inIdx << ", " << currentPara.outIdx << ", outside = " << currentPara.outsideNbrs.size() << ")" << endl;
  497|       |    */
  498|       |
  499|  23.9M|    for (std::size_t i = 0; i < rings.size(); ++i) {
  ------------------
  |  Branch (499:29): [True: 23.7M, False: 237k]
  ------------------
  500|       |      // skip visited rings
  501|  23.7M|      if (visitedRings[i])
  ------------------
  |  Branch (501:11): [True: 17.5M, False: 6.20M]
  ------------------
  502|  17.5M|        continue;
  503|       |
  504|       |      // Check if currentPara is in this ring
  505|  6.20M|      if (!currentPara.isInRing(rings[i]))
  ------------------
  |  Branch (505:11): [True: 5.98M, False: 214k]
  ------------------
  506|  5.98M|        continue;
  507|       |
  508|       |      //
  509|       |      // A new ring containing currentPara is found
  510|       |      //
  511|   214k|      foundRing = true;
  512|       |
  513|       |      // if there are one or more true stereo centers, currentPara is a stereo center
  514|   214k|      if (rings[i].trueCount) {
  ------------------
  |  Branch (514:11): [True: 346, False: 213k]
  ------------------
  515|       |        //cout << "OK: " << __LINE__ << endl;
  516|    346|        return true;
  517|    346|      }
  518|       |
  519|       |      // check if there is at least one other potential atom
  520|   650k|      for (std::size_t j = 0; j < rings[i].paraAtoms.size(); ++j) {
  ------------------
  |  Branch (520:31): [True: 451k, False: 198k]
  ------------------
  521|   451k|        const StereoRing::ParaAtom &paraAtom = rings[i].paraAtoms[j];
  522|       |        // skip idx
  523|   451k|        if (paraAtom.inIdx == idx)
  ------------------
  |  Branch (523:13): [True: 205k, False: 246k]
  ------------------
  524|   205k|          continue;
  525|       |        // there is another atom already identified as stereo atom
  526|   246k|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraAtom.inIdx) != stereoAtoms.end()) {
  ------------------
  |  Branch (526:13): [True: 3.68k, False: 242k]
  ------------------
  527|       |          //cout << "OK: " << __LINE__ << endl;
  528|  3.68k|          return true;
  529|  3.68k|        }
  530|       |
  531|   242k|        if (paraAtom.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (531:13): [True: 818, False: 241k]
  ------------------
  532|       |          // only 1 ring substituent, the other is implicit H -> topologically different
  533|       |          //cout << "OK: " << __LINE__ << endl;
  534|    818|          return true;
  535|   241k|        } else {
  536|   241k|          if (paraAtom.outsideNbrs.size() != 2)
  ------------------
  |  Branch (536:15): [True: 0, False: 241k]
  ------------------
  537|      0|            return false;
  538|       |          // two ring substituents, need to check for topological difference
  539|   241k|          if (symmetry_classes[paraAtom.outsideNbrs[0]->GetIndex()] != symmetry_classes[paraAtom.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (539:15): [True: 2.16k, False: 239k]
  ------------------
  540|       |            // they are different
  541|       |            //cout << "OK: " << __LINE__ << endl;
  542|  2.16k|            return true;
  543|   239k|          } else {
  544|       |            // they are the same and they might also be in a ring -> apply rule 1 recursive
  545|   239k|            visitedRings[i] = true;
  546|   239k|            if (ApplyRule1(paraAtom, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (546:17): [True: 8.37k, False: 231k]
  ------------------
  547|       |              //cout << "OK: " << __LINE__ << endl;
  548|  8.37k|              return true;
  549|  8.37k|            }
  550|   239k|          }
  551|   241k|        }
  552|   242k|      }
  553|       |      // check if there is at least one other potential bond
  554|   200k|      for (std::size_t j = 0; j < rings[i].paraBonds.size(); ++j) {
  ------------------
  |  Branch (554:31): [True: 2.24k, False: 198k]
  ------------------
  555|  2.24k|        const StereoRing::ParaBond &paraBond = rings[i].paraBonds[j];
  556|       |        // skip idx
  557|  2.24k|        if (paraBond.inIdx == idx)
  ------------------
  |  Branch (557:13): [True: 1.50k, False: 741]
  ------------------
  558|  1.50k|          continue;
  559|       |        // there is another atom already identified as stereo atom
  560|    741|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraBond.inIdx) != stereoAtoms.end()) {
  ------------------
  |  Branch (560:13): [True: 145, False: 596]
  ------------------
  561|       |          //cout << "OK: " << __LINE__ << endl;
  562|    145|          return true;
  563|    145|        }
  564|       |
  565|    596|        if (paraBond.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (565:13): [True: 94, False: 502]
  ------------------
  566|       |          // only 1 ring substituent, the other is implicit H -> topologically different
  567|       |          //cout << "OK: " << __LINE__ << endl;
  568|     94|          return true;
  569|    502|        } else {
  570|    502|          if (paraBond.outsideNbrs.size() != 2)
  ------------------
  |  Branch (570:15): [True: 0, False: 502]
  ------------------
  571|      0|            continue;
  572|       |          // two ring substituents, need to check for topological difference
  573|    502|          if (symmetry_classes[paraBond.outsideNbrs[0]->GetIndex()] != symmetry_classes[paraBond.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (573:15): [True: 28, False: 474]
  ------------------
  574|       |            // they are different
  575|       |            //cout << "OK: " << __LINE__ << endl;
  576|     28|            return true;
  577|    474|          } else {
  578|       |            // they are the same and they might also be in a ring -> apply rule 1 recursive
  579|    474|            visitedRings[i] = true;
  580|    474|            if (ApplyRule1(paraBond, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (580:17): [True: 16, False: 458]
  ------------------
  581|       |              //cout << "OK: " << __LINE__ << endl;
  582|     16|              return true;
  583|     16|            }
  584|    474|          }
  585|    502|        }
  586|    596|      }
  587|       |
  588|   198k|    }
  589|       |
  590|       |    // if a non-visited ring was found and true was not returned -> it does not
  591|       |    // contain any stereocenters other than idx
  592|   237k|    if (foundRing) {
  ------------------
  |  Branch (592:9): [True: 191k, False: 46.0k]
  ------------------
  593|       |      //cout << "NOT OK: " << __LINE__ << endl;
  594|   191k|      return false;
  595|   191k|    }
  596|       |
  597|       |    //cout << "NOT OK: " << __LINE__ << endl;
  598|  46.0k|    return false;
  599|   237k|  }
_ZNK9OpenBabel10StereoRing8ParaAtom8isInRingERKS0_:
  425|  6.20M|      {
  426|  7.73M|        for (std::size_t i = 0; i < ring.paraAtoms.size(); ++i)
  ------------------
  |  Branch (426:33): [True: 1.74M, False: 5.98M]
  ------------------
  427|  1.74M|          if (ring.paraAtoms[i].inIdx == inIdx)
  ------------------
  |  Branch (427:15): [True: 214k, False: 1.52M]
  ------------------
  428|   214k|            return true;
  429|  5.98M|        return false;
  430|  6.20M|      }
_ZN9OpenBabel12checkLigandsINS_10StereoRing8ParaAtomEEEbRKT_RKNSt3__16vectorINS_12OBStereoUnitENS6_9allocatorIS8_EEEE:
  465|  2.55k|  {
  466|  2.55k|    if (currentPara.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (466:9): [True: 0, False: 2.55k]
  ------------------
  467|       |      //cout << "OK: " << __LINE__ << endl;
  468|      0|      return true;
  469|      0|    }
  470|  2.55k|    OBMol *mol = currentPara.insideNbrs[0]->GetParent();
  471|  2.55k|    assert(mol->GetAtom(currentPara.outIdx));
  472|  2.55k|    OBBitVec ligand = getFragment(currentPara.outsideNbrs[0], mol->GetAtom(currentPara.outIdx));
  473|  3.82k|    for (OBStereoUnitSet::const_iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (473:62): [True: 2.07k, False: 1.74k]
  ------------------
  474|  2.07k|      if (isUnitInFragment(mol, *u2, ligand)) {
  ------------------
  |  Branch (474:11): [True: 808, False: 1.26k]
  ------------------
  475|       |        //cout << "OK: " << __LINE__ << endl;
  476|    808|        return true;
  477|    808|      }
  478|  2.07k|    }
  479|       |    //cout << "NOT OK: " << __LINE__ << endl;
  480|  1.74k|    return false;
  481|  2.55k|  }
_ZN9OpenBabel10ApplyRule1INS_10StereoRing8ParaBondEEEbRKT_RKNSt3__16vectorIjNS6_9allocatorIjEEEERKNS7_IS1_NS8_IS1_EEEERNS7_IbNS8_IbEEEERKNS7_INS_12OBStereoUnitENS8_ISK_EEEESA_:
  488|  4.57k|  {
  489|  4.57k|    bool foundRing = false;
  490|  4.57k|    unsigned int idx = currentPara.inIdx;
  491|       |
  492|       |    /*
  493|       |    for (std::size_t i = 0; i < visitedRings.size(); ++i)
  494|       |      if (visitedRings[i])
  495|       |        cout << "  ";
  496|       |    cout << "ApplyRule1(" << currentPara.inIdx << ", " << currentPara.outIdx << ", outside = " << currentPara.outsideNbrs.size() << ")" << endl;
  497|       |    */
  498|       |
  499|  61.4k|    for (std::size_t i = 0; i < rings.size(); ++i) {
  ------------------
  |  Branch (499:29): [True: 58.8k, False: 2.61k]
  ------------------
  500|       |      // skip visited rings
  501|  58.8k|      if (visitedRings[i])
  ------------------
  |  Branch (501:11): [True: 9.95k, False: 48.8k]
  ------------------
  502|  9.95k|        continue;
  503|       |
  504|       |      // Check if currentPara is in this ring
  505|  48.8k|      if (!currentPara.isInRing(rings[i]))
  ------------------
  |  Branch (505:11): [True: 45.3k, False: 3.48k]
  ------------------
  506|  45.3k|        continue;
  507|       |
  508|       |      //
  509|       |      // A new ring containing currentPara is found
  510|       |      //
  511|  3.48k|      foundRing = true;
  512|       |
  513|       |      // if there are one or more true stereo centers, currentPara is a stereo center
  514|  3.48k|      if (rings[i].trueCount) {
  ------------------
  |  Branch (514:11): [True: 52, False: 3.43k]
  ------------------
  515|       |        //cout << "OK: " << __LINE__ << endl;
  516|     52|        return true;
  517|     52|      }
  518|       |
  519|       |      // check if there is at least one other potential atom
  520|  4.66k|      for (std::size_t j = 0; j < rings[i].paraAtoms.size(); ++j) {
  ------------------
  |  Branch (520:31): [True: 1.91k, False: 2.75k]
  ------------------
  521|  1.91k|        const StereoRing::ParaAtom &paraAtom = rings[i].paraAtoms[j];
  522|       |        // skip idx
  523|  1.91k|        if (paraAtom.inIdx == idx)
  ------------------
  |  Branch (523:13): [True: 1.19k, False: 719]
  ------------------
  524|  1.19k|          continue;
  525|       |        // there is another atom already identified as stereo atom
  526|    719|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraAtom.inIdx) != stereoAtoms.end()) {
  ------------------
  |  Branch (526:13): [True: 405, False: 314]
  ------------------
  527|       |          //cout << "OK: " << __LINE__ << endl;
  528|    405|          return true;
  529|    405|        }
  530|       |
  531|    314|        if (paraAtom.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (531:13): [True: 233, False: 81]
  ------------------
  532|       |          // only 1 ring substituent, the other is implicit H -> topologically different
  533|       |          //cout << "OK: " << __LINE__ << endl;
  534|    233|          return true;
  535|    233|        } else {
  536|     81|          if (paraAtom.outsideNbrs.size() != 2)
  ------------------
  |  Branch (536:15): [True: 0, False: 81]
  ------------------
  537|      0|            return false;
  538|       |          // two ring substituents, need to check for topological difference
  539|     81|          if (symmetry_classes[paraAtom.outsideNbrs[0]->GetIndex()] != symmetry_classes[paraAtom.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (539:15): [True: 34, False: 47]
  ------------------
  540|       |            // they are different
  541|       |            //cout << "OK: " << __LINE__ << endl;
  542|     34|            return true;
  543|     47|          } else {
  544|       |            // they are the same and they might also be in a ring -> apply rule 1 recursive
  545|     47|            visitedRings[i] = true;
  546|     47|            if (ApplyRule1(paraAtom, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (546:17): [True: 9, False: 38]
  ------------------
  547|       |              //cout << "OK: " << __LINE__ << endl;
  548|      9|              return true;
  549|      9|            }
  550|     47|          }
  551|     81|        }
  552|    314|      }
  553|       |      // check if there is at least one other potential bond
  554|  6.18k|      for (std::size_t j = 0; j < rings[i].paraBonds.size(); ++j) {
  ------------------
  |  Branch (554:31): [True: 4.64k, False: 1.53k]
  ------------------
  555|  4.64k|        const StereoRing::ParaBond &paraBond = rings[i].paraBonds[j];
  556|       |        // skip idx
  557|  4.64k|        if (paraBond.inIdx == idx)
  ------------------
  |  Branch (557:13): [True: 2.21k, False: 2.43k]
  ------------------
  558|  2.21k|          continue;
  559|       |        // there is another atom already identified as stereo atom
  560|  2.43k|        if (std::find(stereoAtoms.begin(), stereoAtoms.end(), paraBond.inIdx) != stereoAtoms.end()) {
  ------------------
  |  Branch (560:13): [True: 242, False: 2.19k]
  ------------------
  561|       |          //cout << "OK: " << __LINE__ << endl;
  562|    242|          return true;
  563|    242|        }
  564|       |
  565|  2.19k|        if (paraBond.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (565:13): [True: 44, False: 2.15k]
  ------------------
  566|       |          // only 1 ring substituent, the other is implicit H -> topologically different
  567|       |          //cout << "OK: " << __LINE__ << endl;
  568|     44|          return true;
  569|  2.15k|        } else {
  570|  2.15k|          if (paraBond.outsideNbrs.size() != 2)
  ------------------
  |  Branch (570:15): [True: 0, False: 2.15k]
  ------------------
  571|      0|            continue;
  572|       |          // two ring substituents, need to check for topological difference
  573|  2.15k|          if (symmetry_classes[paraBond.outsideNbrs[0]->GetIndex()] != symmetry_classes[paraBond.outsideNbrs[1]->GetIndex()]) {
  ------------------
  |  Branch (573:15): [True: 62, False: 2.08k]
  ------------------
  574|       |            // they are different
  575|       |            //cout << "OK: " << __LINE__ << endl;
  576|     62|            return true;
  577|  2.08k|          } else {
  578|       |            // they are the same and they might also be in a ring -> apply rule 1 recursive
  579|  2.08k|            visitedRings[i] = true;
  580|  2.08k|            if (ApplyRule1(paraBond, symmetry_classes, rings, visitedRings, units, stereoAtoms)) {
  ------------------
  |  Branch (580:17): [True: 875, False: 1.21k]
  ------------------
  581|       |              //cout << "OK: " << __LINE__ << endl;
  582|    875|              return true;
  583|    875|            }
  584|  2.08k|          }
  585|  2.15k|        }
  586|  2.19k|      }
  587|       |
  588|  2.75k|    }
  589|       |
  590|       |    // if a non-visited ring was found and true was not returned -> it does not
  591|       |    // contain any stereocenters other than idx
  592|  2.61k|    if (foundRing) {
  ------------------
  |  Branch (592:9): [True: 989, False: 1.62k]
  ------------------
  593|       |      //cout << "NOT OK: " << __LINE__ << endl;
  594|    989|      return false;
  595|    989|    }
  596|       |
  597|       |    //cout << "NOT OK: " << __LINE__ << endl;
  598|  1.62k|    return false;
  599|  2.61k|  }
_ZNK9OpenBabel10StereoRing8ParaBond8isInRingERKS0_:
  444|  48.8k|      {
  445|  70.2k|        for (std::size_t i = 0; i < ring.paraBonds.size(); ++i)
  ------------------
  |  Branch (445:33): [True: 24.8k, False: 45.3k]
  ------------------
  446|  24.8k|          if (ring.paraBonds[i].inIdx == inIdx)
  ------------------
  |  Branch (446:15): [True: 3.48k, False: 21.3k]
  ------------------
  447|  3.48k|            return true;
  448|  45.3k|        return false;
  449|  48.8k|      }
_ZN9OpenBabel12checkLigandsINS_10StereoRing8ParaBondEEEbRKT_RKNSt3__16vectorINS_12OBStereoUnitENS6_9allocatorIS8_EEEE:
  465|    564|  {
  466|    564|    if (currentPara.outsideNbrs.size() == 1) {
  ------------------
  |  Branch (466:9): [True: 0, False: 564]
  ------------------
  467|       |      //cout << "OK: " << __LINE__ << endl;
  468|      0|      return true;
  469|      0|    }
  470|    564|    OBMol *mol = currentPara.insideNbrs[0]->GetParent();
  471|    564|    assert(mol->GetAtom(currentPara.outIdx));
  472|    564|    OBBitVec ligand = getFragment(currentPara.outsideNbrs[0], mol->GetAtom(currentPara.outIdx));
  473|  2.42k|    for (OBStereoUnitSet::const_iterator u2 = units.begin(); u2 != units.end(); ++u2) {
  ------------------
  |  Branch (473:62): [True: 2.20k, False: 220]
  ------------------
  474|  2.20k|      if (isUnitInFragment(mol, *u2, ligand)) {
  ------------------
  |  Branch (474:11): [True: 344, False: 1.86k]
  ------------------
  475|       |        //cout << "OK: " << __LINE__ << endl;
  476|    344|        return true;
  477|    344|      }
  478|  2.20k|    }
  479|       |    //cout << "NOT OK: " << __LINE__ << endl;
  480|    220|    return false;
  481|    564|  }

_ZN9OpenBabel8OBStereo16ContainsSameRefsERKNSt3__16vectorImNS1_9allocatorImEEEES7_:
   29|  11.4k|  {
   30|  11.4k|    if (refs1.size() != refs2.size())
  ------------------
  |  Branch (30:9): [True: 0, False: 11.4k]
  ------------------
   31|      0|      return false;
   32|       |
   33|  11.4k|    unsigned int count = 0;
   34|  52.7k|    for (ConstRefIter i = refs1.begin(); i != refs1.end(); ++i)
  ------------------
  |  Branch (34:42): [True: 41.2k, False: 11.4k]
  ------------------
   35|  85.2k|      for (ConstRefIter j = refs2.begin(); j != refs2.end(); ++j)
  ------------------
  |  Branch (35:44): [True: 85.1k, False: 131]
  ------------------
   36|  85.1k|        if (*i == *j) {
  ------------------
  |  Branch (36:13): [True: 41.1k, False: 44.0k]
  ------------------
   37|  41.1k|          count++;
   38|  41.1k|          break;
   39|  41.1k|        }
   40|       |
   41|  11.4k|    return (count == refs1.size());
   42|  11.4k|  }
_ZN9OpenBabel8OBStereo11ContainsRefERKNSt3__16vectorImNS1_9allocatorImEEEEm:
   45|    294|  {
   46|    838|    for (ConstRefIter i = refs.begin(); i != refs.end(); ++i)
  ------------------
  |  Branch (46:41): [True: 693, False: 145]
  ------------------
   47|    693|      if (*i == id)
  ------------------
  |  Branch (47:11): [True: 149, False: 544]
  ------------------
   48|    149|        return true;
   49|       |
   50|    145|    return false;
   51|    294|  }
_ZN9OpenBabel8OBStereo13NumInversionsERKNSt3__16vectorImNS1_9allocatorImEEEE:
   54|  3.76M|  {
   55|  3.76M|    OBStereo::Refs invVec; // the inversion vector
   56|  3.76M|    OBStereo::ConstRefIter i, j;
   57|  11.2M|    for (i = refs.begin(); i != refs.end(); ++i) {
  ------------------
  |  Branch (57:28): [True: 7.53M, False: 3.76M]
  ------------------
   58|  7.53M|      int e = 0; // ith element
   59|       |      // loop over elements to the right
   60|  26.1M|      for (j = i; j != refs.end(); ++j)
  ------------------
  |  Branch (60:19): [True: 18.6M, False: 7.53M]
  ------------------
   61|       |        // increment e if element to the right is lower
   62|  18.6M|        if (*j < *i)
  ------------------
  |  Branch (62:13): [True: 3.03M, False: 15.6M]
  ------------------
   63|  3.03M|          e++;
   64|       |
   65|  7.53M|      invVec.push_back(e);
   66|  7.53M|    }
   67|       |
   68|  3.76M|    int sum = 0;
   69|  11.2M|    for (OBStereo::RefIter k = invVec.begin(); k != invVec.end(); ++k)
  ------------------
  |  Branch (69:48): [True: 7.53M, False: 3.76M]
  ------------------
   70|  7.53M|      sum += *k;
   71|       |
   72|  3.76M|    return sum;
   73|  3.76M|  }
_ZN9OpenBabel8OBStereo9PermutateERNSt3__16vectorImNS1_9allocatorImEEEEjj:
   76|   198k|  {
   77|   198k|    if (i >= refs.size())
  ------------------
  |  Branch (77:9): [True: 0, False: 198k]
  ------------------
   78|      0|      return;
   79|   198k|    if (j >= refs.size())
  ------------------
  |  Branch (79:9): [True: 0, False: 198k]
  ------------------
   80|      0|      return;
   81|   198k|    unsigned long id = refs.at(i);
   82|   198k|    refs[i] = refs.at(j);
   83|   198k|    refs[j] = id;
   84|   198k|  }

_ZNK9OpenBabel19OBTetrahedralStereo6ConfigeqERKS1_:
   34|  4.72k|  {
   35|  4.72k|    if (center != other.center)
  ------------------
  |  Branch (35:9): [True: 0, False: 4.72k]
  ------------------
   36|      0|      return false;
   37|  4.72k|    if ((refs.size() != 3) || (other.refs.size() != 3))
  ------------------
  |  Branch (37:9): [True: 0, False: 4.72k]
  |  Branch (37:31): [True: 0, False: 4.72k]
  ------------------
   38|      0|      return false;
   39|       |    // return true if either is unspecified (i.e. accidental)
   40|  4.72k|    if (!specified || !other.specified)
  ------------------
  |  Branch (40:9): [True: 0, False: 4.72k]
  |  Branch (40:23): [True: 0, False: 4.72k]
  ------------------
   41|      0|      return true;
   42|       |
   43|       |    // Convert both Config's refs to same from, winding and view while
   44|       |    // avoiding having an ImplicitRef in the 'from' position of either
   45|  4.72k|    Config thisConfig, otherConfig;
   46|  4.72k|    if (from == OBStereo::ImplicitRef) {
  ------------------
  |  Branch (46:9): [True: 39, False: 4.68k]
  ------------------
   47|     39|      thisConfig = OBTetraNonPlanarStereo::ToConfig(*this, refs[0], winding, view);
   48|     39|      otherConfig = OBTetraNonPlanarStereo::ToConfig(other, thisConfig.from, winding, view);
   49|     39|    }
   50|  4.68k|    else if (other.from == OBStereo::ImplicitRef) {
  ------------------
  |  Branch (50:14): [True: 35, False: 4.65k]
  ------------------
   51|     35|      otherConfig = OBTetraNonPlanarStereo::ToConfig(other, other.refs[0], winding, view);
   52|     35|      thisConfig = OBTetraNonPlanarStereo::ToConfig(*this, otherConfig.from, winding, view);
   53|     35|    }
   54|  4.65k|    else {
   55|  4.65k|      thisConfig = *this;
   56|  4.65k|      otherConfig = OBTetraNonPlanarStereo::ToConfig(other, thisConfig.from, winding, view);
   57|  4.65k|    }
   58|       |
   59|  4.72k|    if (!OBStereo::ContainsSameRefs(thisConfig.refs, otherConfig.refs)) {
  ------------------
  |  Branch (59:9): [True: 129, False: 4.59k]
  ------------------
   60|    129|      if (OBStereo::ContainsRef(thisConfig.refs, OBStereo::ImplicitRef)) {
  ------------------
  |  Branch (60:11): [True: 84, False: 45]
  ------------------
   61|       |        // if both refs already contain ImplicitRef, return false
   62|     84|        if (OBStereo::ContainsRef(otherConfig.refs, OBStereo::ImplicitRef))
  ------------------
  |  Branch (62:13): [True: 29, False: 55]
  ------------------
   63|     29|          return false;
   64|       |
   65|       |        // example: *this       = 23H
   66|       |        //          otherConfig = 234 --> 23H
   67|       |
   68|       |        // for each ref in otherConfig
   69|    118|        for (unsigned int i = 0; i < otherConfig.refs.size(); ++i) {
  ------------------
  |  Branch (69:34): [True: 118, False: 0]
  ------------------
   70|    118|          bool found = false;
   71|    472|          for (OBStereo::RefIter j = thisConfig.refs.begin(); j != thisConfig.refs.end(); ++j)
  ------------------
  |  Branch (71:63): [True: 354, False: 118]
  ------------------
   72|    354|            if (otherConfig.refs.at(i) == *j)
  ------------------
  |  Branch (72:17): [True: 63, False: 291]
  ------------------
   73|     63|              found = true;
   74|       |
   75|    118|          if (!found) {
  ------------------
  |  Branch (75:15): [True: 55, False: 63]
  ------------------
   76|       |            // the ref from otherConfig is not found in this config
   77|     55|            otherConfig.refs[i] = OBStereo::ImplicitRef;
   78|     55|            break;
   79|     55|          }
   80|    118|        }
   81|     55|      } else
   82|     45|      if (OBStereo::ContainsRef(otherConfig.refs, OBStereo::ImplicitRef)) {
  ------------------
  |  Branch (82:11): [True: 36, False: 9]
  ------------------
   83|       |        // if both refs already contain ImplicitRef, return false
   84|     36|        if (OBStereo::ContainsRef(thisConfig.refs, OBStereo::ImplicitRef))
  ------------------
  |  Branch (84:13): [True: 0, False: 36]
  ------------------
   85|      0|          return false;
   86|       |
   87|       |        // example: *this       = 234
   88|       |        //          otherConfig = 23H --> 234
   89|       |
   90|       |        // for each ref in *this
   91|     40|        for (unsigned int i = 0; i < thisConfig.refs.size(); ++i) {
  ------------------
  |  Branch (91:34): [True: 40, False: 0]
  ------------------
   92|     40|          bool found = false;
   93|       |          // for each refs in otherConfig
   94|    160|          for (OBStereo::RefIter j = otherConfig.refs.begin(); j != otherConfig.refs.end(); ++j)
  ------------------
  |  Branch (94:64): [True: 120, False: 40]
  ------------------
   95|    120|            if (thisConfig.refs.at(i) == *j)
  ------------------
  |  Branch (95:17): [True: 4, False: 116]
  ------------------
   96|      4|              found = true;
   97|       |
   98|     40|          if (!found) {
  ------------------
  |  Branch (98:15): [True: 36, False: 4]
  ------------------
   99|    144|            for (OBStereo::RefIter j = otherConfig.refs.begin(); j != otherConfig.refs.end(); ++j)
  ------------------
  |  Branch (99:66): [True: 108, False: 36]
  ------------------
  100|    108|              if (*j == OBStereo::ImplicitRef)
  ------------------
  |  Branch (100:19): [True: 36, False: 72]
  ------------------
  101|     36|                *j = thisConfig.refs.at(i);
  102|     36|            break;
  103|     36|          }
  104|     40|        }
  105|     36|      }
  106|    129|    }
  107|       |
  108|  4.69k|    int Ni1 = OBStereo::NumInversions(thisConfig.refs);
  109|  4.69k|    int Ni2 = OBStereo::NumInversions(otherConfig.refs);
  110|  4.69k|    return ((Ni1 + Ni2) % 2 == 0);
  111|  4.72k|  }
_ZN9OpenBabel19OBTetrahedralStereoC2EPNS_5OBMolE:
  118|   153k|      OBTetraNonPlanarStereo(mol), m_cfg(Config())
  119|   153k|  {
  120|   153k|  }
_ZN9OpenBabel19OBTetrahedralStereoD2Ev:
  123|   153k|  {
  124|   153k|  }
_ZNK9OpenBabel19OBTetrahedralStereo7IsValidEv:
  127|   361k|  {
  128|   361k|    if (m_cfg.center == OBStereo::NoRef)
  ------------------
  |  Branch (128:9): [True: 157, False: 361k]
  ------------------
  129|    157|      return false;
  130|   361k|    if (m_cfg.from == OBStereo::NoRef)
  ------------------
  |  Branch (130:9): [True: 0, False: 361k]
  ------------------
  131|      0|      return false;
  132|   361k|    if (m_cfg.refs.size() != 3)
  ------------------
  |  Branch (132:9): [True: 0, False: 361k]
  ------------------
  133|      0|      return false;
  134|   361k|    return true;
  135|   361k|  }
_ZN9OpenBabel19OBTetrahedralStereo9SetConfigERKNS0_6ConfigE:
  138|   153k|  {
  139|   153k|    if (config.center == OBStereo::NoRef) {
  ------------------
  |  Branch (139:9): [True: 0, False: 153k]
  ------------------
  140|      0|      obErrorLog.ThrowError(__FUNCTION__,
  141|      0|          "OBTetrahedralStereo::SetConfig : center atom id is invalid.", obError);
  142|      0|      m_cfg = Config();
  143|      0|      return;
  144|      0|    }
  145|   153k|    if (config.from == OBStereo::NoRef) {
  ------------------
  |  Branch (145:9): [True: 0, False: 153k]
  ------------------
  146|      0|      obErrorLog.ThrowError(__FUNCTION__,
  147|      0|          "OBTetrahedralStereo::SetConfig : from/towards atom id is invalid.", obError);
  148|      0|      m_cfg = Config();
  149|      0|      return;
  150|      0|    }
  151|   153k|    if (config.refs.size() != 3) {
  ------------------
  |  Branch (151:9): [True: 157, False: 153k]
  ------------------
  152|    157|      std::stringstream ss;
  153|    157|      ss << "OBTetrahedralStereo::SetConfig : found " << config.refs.size();
  154|    157|      ss << " reference ids, should be 3.";
  155|    157|      obErrorLog.ThrowError(__FUNCTION__, ss.str(), obError);
  156|    157|      m_cfg = Config();
  157|    157|      return;
  158|    157|    }
  159|       |
  160|   153k|    m_cfg = config;
  161|   153k|  }
_ZNK9OpenBabel19OBTetrahedralStereo9GetConfigENS_8OBStereo7WindingENS1_4ViewE:
  165|   346k|  {
  166|   346k|    if (!IsValid())
  ------------------
  |  Branch (166:9): [True: 157, False: 346k]
  ------------------
  167|    157|      return Config();
  168|       |
  169|   346k|    if (m_cfg.winding != OBStereo::UnknownWinding)
  ------------------
  |  Branch (169:9): [True: 346k, False: 0]
  ------------------
  170|   346k|      return OBTetraNonPlanarStereo::ToConfig(m_cfg, m_cfg.from, winding, view);
  171|      0|    else
  172|      0|      return OBTetraNonPlanarStereo::ToConfig(m_cfg, m_cfg.from, OBStereo::UnknownWinding, view);
  173|   346k|  }
_ZNK9OpenBabel19OBTetrahedralStereo5CloneEPNS_6OBBaseE:
  199|   132k|  {
  200|   132k|    OBTetrahedralStereo *data = new OBTetrahedralStereo(static_cast<OBMol*>(mol));
  201|   132k|    data->SetConfig(m_cfg);
  202|   132k|    return data;
  203|   132k|  }

_ZN9OpenBabel22OBTetraNonPlanarStereoC2EPNS_5OBMolE:
   28|   153k|  OBTetraNonPlanarStereo::OBTetraNonPlanarStereo(OBMol *mol) : OBStereoBase(mol)
   29|   153k|  {
   30|   153k|  }
_ZN9OpenBabel22OBTetraNonPlanarStereoD2Ev:
   33|   153k|  {
   34|   153k|  }

_ZN9OpenBabel19OBTetraPlanarStereoC2EPNS_5OBMolE:
   29|  77.1k|  OBTetraPlanarStereo::OBTetraPlanarStereo(OBMol *mol) : OBStereoBase(mol)
   30|  77.1k|  {
   31|  77.1k|  }
_ZN9OpenBabel19OBTetraPlanarStereoD2Ev:
   34|  81.7k|  {
   35|  81.7k|  }

_ZN9OpenBabel8tokenizeERNSt3__16vectorINS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS5_IS7_EEEEPKcSC_:
   38|  7.22k|  {
   39|  7.22k|    vcr.clear();
   40|  7.22k|    if (!buf || !delimstr)
  ------------------
  |  Branch (40:9): [True: 0, False: 7.22k]
  |  Branch (40:17): [True: 0, False: 7.22k]
  ------------------
   41|      0|      return false;
   42|       |
   43|  7.22k|    string s(buf);
   44|  7.22k|    s += delimstr[0]; //forces last token to be parsed
   45|  7.22k|    size_t startpos=0,endpos=0;
   46|       |
   47|  7.22k|    for (;;)
   48|  33.0k|      {
   49|  33.0k|        startpos = s.find_first_not_of(delimstr,startpos);
   50|  33.0k|        endpos = s.find_first_of(delimstr,startpos);
   51|       |
   52|  33.0k|        if (endpos <= s.size() && startpos <= s.size())
  ------------------
  |  Branch (52:13): [True: 25.7k, False: 7.22k]
  |  Branch (52:35): [True: 25.7k, False: 0]
  ------------------
   53|  25.7k|          vcr.push_back(s.substr(startpos,endpos-startpos));
   54|  7.22k|        else
   55|  7.22k|          break;
   56|       |
   57|  25.7k|        startpos = endpos+1;
   58|  25.7k|      }
   59|       |
   60|  7.22k|    return(true);
   61|  7.22k|  }
_ZN9OpenBabel4TrimERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  136|   160k|  {
  137|   160k|    string::size_type pos = txt.find_last_not_of(" \t\n\r");
  138|   160k|    if(pos!=string::npos)
  ------------------
  |  Branch (138:8): [True: 144k, False: 16.2k]
  ------------------
  139|   144k|      txt.erase(pos+1);
  140|  16.2k|    else
  141|  16.2k|      txt.erase();
  142|       |
  143|   160k|    pos = txt.find_first_not_of(" \t\n\r");
  144|   160k|    if(pos!=string::npos)
  ------------------
  |  Branch (144:8): [True: 144k, False: 16.2k]
  ------------------
  145|   144k|      txt.erase(0, pos);
  146|  16.2k|    else
  147|  16.2k|      txt.erase();
  148|   160k|    return txt;
  149|   160k|  }
_ZN9OpenBabel12OpenDatafileERNSt3__114basic_ifstreamIcNS0_11char_traitsIcEEEERKNS0_12basic_stringIcS3_NS0_9allocatorIcEEEESB_:
  193|  21.3k|  {
  194|  21.3k|    ios_base::openmode imode = ios_base::in;
  195|       |    #ifdef ALL_READS_BINARY //Makes unix files compatible with VC++6
  196|       |      imode = ios_base::in|ios_base::binary;
  197|       |    #endif
  198|       |
  199|       |    // check the current directory
  200|  21.3k|    ifs.close();
  201|  21.3k|    ifs.clear();
  202|  21.3k|    ifs.open(filename.c_str(),imode);
  203|  21.3k|    if(ifs)
  ------------------
  |  Branch (203:8): [True: 0, False: 21.3k]
  ------------------
  204|      0|      return filename;
  205|       |
  206|  21.3k|    string file;
  207|  21.3k|    const char* datadir = getenv(envvar.c_str());
  208|  21.3k|    if(!datadir)
  ------------------
  |  Branch (208:8): [True: 21.3k, False: 0]
  ------------------
  209|  21.3k|      datadir = BABEL_DATADIR;
  ------------------
  |  |    4|  21.3k|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
  210|       |
  211|       |    // check the subdirectory for this version number
  212|  21.3k|    file = datadir;
  213|  21.3k|    file += FILE_SEP_CHAR;
  ------------------
  |  |   67|  21.3k|#define FILE_SEP_CHAR "/"
  ------------------
  214|  21.3k|    file += BABEL_VERSION;
  ------------------
  |  |    7|  21.3k|#define BABEL_VERSION "3.2.1"
  ------------------
  215|  21.3k|    file += FILE_SEP_CHAR + filename;
  ------------------
  |  |   67|  42.6k|#define FILE_SEP_CHAR "/"
  ------------------
  216|       |
  217|  21.3k|    ifs.clear();
  218|  21.3k|    ifs.open(file.c_str(),imode);
  219|  21.3k|    if(ifs)
  ------------------
  |  Branch (219:8): [True: 0, False: 21.3k]
  ------------------
  220|      0|      return file;
  221|       |
  222|       |    // couldn't find it with the version built in, so try the parent
  223|  21.3k|    file = datadir;
  224|  21.3k|    file += FILE_SEP_CHAR;
  ------------------
  |  |   67|  21.3k|#define FILE_SEP_CHAR "/"
  ------------------
  225|  21.3k|    file += filename;
  226|       |
  227|  21.3k|    ifs.clear();
  228|  21.3k|    ifs.open(file.c_str(),imode);
  229|       |
  230|  21.3k|    if (ifs)
  ------------------
  |  Branch (230:9): [True: 0, False: 21.3k]
  ------------------
  231|      0|      return file;
  232|       |
  233|  21.3k|    ifs.clear();
  234|  21.3k|    ifs.close();
  235|  21.3k|    return(""); // error
  236|  21.3k|  }

_ZN9OpenBabel11OBAtomTyperC2Ev:
   62|      1|  {
   63|      1|    _init = false;
   64|      1|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      1|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
   65|      1|    _envvar = "BABEL_DATADIR";
   66|      1|    _filename = "atomtyp.txt";
   67|      1|    _subdir = "data";
   68|      1|    _dataptr = AtomTypeData;
   69|      1|  }
_ZN9OpenBabel11OBAtomTyper9ParseLineEPKc:
   72|    169|  {
   73|    169|    vector<string> vs;
   74|    169|    OBSmartsPattern *sp;
   75|       |
   76|    169|    if (EQn(buffer,"INTHYB",6))
  ------------------
  |  |  779|    169|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 46, False: 123]
  |  |  ------------------
  ------------------
   77|     46|      {
   78|     46|        tokenize(vs,buffer);
   79|     46|        if (vs.size() < 3)
  ------------------
  |  Branch (79:13): [True: 0, False: 46]
  ------------------
   80|      0|          {
   81|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse INTHYB line in atom type table from atomtyp.txt", obInfo);
   82|      0|            return;
   83|      0|          }
   84|       |
   85|     46|        sp = new OBSmartsPattern;
   86|     46|        if (sp->Init(vs[1]))
  ------------------
  |  Branch (86:13): [True: 46, False: 0]
  ------------------
   87|     46|          _vinthyb.push_back(pair<OBSmartsPattern*,int> (sp,atoi((char*)vs[2].c_str())));
   88|      0|        else
   89|      0|          {
   90|      0|            delete sp;
   91|      0|            sp = nullptr;
   92|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse INTHYB line in atom type table from atomtyp.txt", obInfo);
   93|      0|            return;
   94|      0|          }
   95|     46|      }
   96|    123|    else if (EQn(buffer,"EXTTYP",6))
  ------------------
  |  |  779|    123|#define EQn(a,b,n) (!strncmp((a), (b), (n)))
  |  |  ------------------
  |  |  |  Branch (779:20): [True: 41, False: 82]
  |  |  ------------------
  ------------------
   97|     41|      {
   98|     41|        tokenize(vs,buffer);
   99|     41|        if (vs.size() < 3)
  ------------------
  |  Branch (99:13): [True: 0, False: 41]
  ------------------
  100|      0|          {
  101|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse EXTTYP line in atom type table from atomtyp.txt", obInfo);
  102|      0|            return;
  103|      0|          }
  104|     41|        sp = new OBSmartsPattern;
  105|     41|        if (sp->Init(vs[1]))
  ------------------
  |  Branch (105:13): [True: 41, False: 0]
  ------------------
  106|     41|          _vexttyp.push_back(pair<OBSmartsPattern*,string> (sp,vs[2]));
  107|      0|        else
  108|      0|          {
  109|      0|            delete sp;
  110|      0|            sp = nullptr;
  111|      0|            obErrorLog.ThrowError(__FUNCTION__, " Could not parse EXTTYP line in atom type table from atomtyp.txt", obInfo);
  112|      0|            return;
  113|      0|          }
  114|     41|      }
  115|    169|  }
_ZN9OpenBabel11OBAtomTyperD2Ev:
  118|      1|  {
  119|      1|    vector<pair<OBSmartsPattern*,int> >::iterator i;
  120|     47|    for (i = _vinthyb.begin();i != _vinthyb.end();++i)
  ------------------
  |  Branch (120:31): [True: 46, False: 1]
  ------------------
  121|     46|      {
  122|     46|        delete i->first;
  123|     46|        i->first = nullptr;
  124|     46|      }
  125|       |
  126|      1|    vector<pair<OBSmartsPattern*,string> >::iterator j;
  127|     42|    for (j = _vexttyp.begin();j != _vexttyp.end();++j)
  ------------------
  |  Branch (127:31): [True: 41, False: 1]
  ------------------
  128|     41|      {
  129|     41|        delete j->first;
  130|     41|        j->first = nullptr;
  131|     41|      }
  132|       |
  133|      1|  }
_ZN9OpenBabel11OBAtomTyper11AssignTypesERNS_5OBMolE:
  136|    198|  {
  137|    198|    if (!_init)
  ------------------
  |  Branch (137:9): [True: 0, False: 198]
  ------------------
  138|      0|      Init();
  139|       |
  140|    198|    obErrorLog.ThrowError(__FUNCTION__,
  141|    198|                          "Ran OpenBabel::AssignTypes", obAuditMsg);
  142|       |
  143|    198|    mol.SetAtomTypesPerceived();
  144|       |
  145|    198|    vector<vector<int> >::iterator j;
  146|    198|    vector<pair<OBSmartsPattern*,string> >::iterator i;
  147|       |
  148|  8.31k|    for (i = _vexttyp.begin(); i != _vexttyp.end(); ++i) {
  ------------------
  |  Branch (148:32): [True: 8.11k, False: 198]
  ------------------
  149|  8.11k|      std::vector<std::vector<int> > mlist;
  150|  8.11k|      if (i->first->Match(mol, mlist))
  ------------------
  |  Branch (150:11): [True: 1.21k, False: 6.90k]
  ------------------
  151|  1.21k|      {
  152|  16.5k|        for (j = mlist.begin(); j != mlist.end(); ++j)
  ------------------
  |  Branch (152:33): [True: 15.3k, False: 1.21k]
  ------------------
  153|  15.3k|          mol.GetAtom((*j)[0])->SetType(i->second);
  154|  1.21k|      }
  155|  8.11k|    }
  156|       |
  157|       |    // Special cases
  158|    198|    vector<OBAtom*>::iterator a;
  159|    198|    OBAtom* atom;
  160|  16.1k|    for (atom = mol.BeginAtom(a); atom; atom = mol.NextAtom(a)) {
  ------------------
  |  Branch (160:35): [True: 15.9k, False: 198]
  ------------------
  161|       |      // guanidinium. Fixes PR#1800964
  162|  15.9k|      if (strncasecmp(atom->GetType(),"C2", 2) == 0) {
  ------------------
  |  Branch (162:11): [True: 4.86k, False: 11.1k]
  ------------------
  163|  4.86k|        int guanidineN = 0;
  164|  4.86k|        OBAtom *nbr;
  165|  4.86k|        vector<OBBond*>::iterator k;
  166|  14.8k|        for (nbr = atom->BeginNbrAtom(k);nbr;nbr = atom->NextNbrAtom(k)) {
  ------------------
  |  Branch (166:42): [True: 10.0k, False: 4.86k]
  ------------------
  167|  10.0k|          if (strncasecmp(nbr->GetType(),"Npl", 3) == 0 ||
  ------------------
  |  Branch (167:15): [True: 76, False: 9.95k]
  ------------------
  168|  9.95k|              strncasecmp(nbr->GetType(),"N2", 2) == 0 ||
  ------------------
  |  Branch (168:15): [True: 121, False: 9.82k]
  ------------------
  169|  9.82k|              strncasecmp(nbr->GetType(),"Ng+", 3) == 0)
  ------------------
  |  Branch (169:15): [True: 2, False: 9.82k]
  ------------------
  170|    199|            ++guanidineN;
  171|  10.0k|        }
  172|  4.86k|        if (guanidineN == 3)
  ------------------
  |  Branch (172:13): [True: 22, False: 4.84k]
  ------------------
  173|     22|          atom->SetType("C+");
  174|       |
  175|  4.86k|      } // end C2 carbon for guanidinium
  176|       |
  177|  15.9k|    } // end special cases
  178|    198|  }
_ZN9OpenBabel11OBAtomTyper9AssignHybERNS_5OBMolE:
  181|   258k|  {
  182|   258k|    if (!_init)
  ------------------
  |  Branch (182:9): [True: 1, False: 258k]
  ------------------
  183|      1|      Init();
  184|       |
  185|   258k|    aromtyper.AssignAromaticFlags(mol);
  186|       |
  187|   258k|    mol.SetHybridizationPerceived();
  188|   258k|    obErrorLog.ThrowError(__FUNCTION__,
  189|   258k|                          "Ran OpenBabel::AssignHybridization", obAuditMsg);
  190|       |
  191|   258k|    OBAtom *atom;
  192|   258k|    vector<OBAtom*>::iterator k;
  193|  2.95M|    for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k))
  ------------------
  |  Branch (193:34): [True: 2.69M, False: 258k]
  ------------------
  194|  2.69M|      atom->SetHyb(0);
  195|       |
  196|   258k|    vector<vector<int> >::iterator j;
  197|   258k|    vector<pair<OBSmartsPattern*,int> >::iterator i;
  198|       |
  199|  12.1M|    for (i = _vinthyb.begin(); i != _vinthyb.end(); ++i) {
  ------------------
  |  Branch (199:32): [True: 11.8M, False: 258k]
  ------------------
  200|  11.8M|      std::vector<std::vector<int> > mlist;
  201|  11.8M|      if (i->first->Match(mol, mlist))
  ------------------
  |  Branch (201:11): [True: 273k, False: 11.5M]
  ------------------
  202|   273k|      {
  203|  2.26M|        for (j = mlist.begin(); j != mlist.end(); ++j)
  ------------------
  |  Branch (203:33): [True: 1.99M, False: 273k]
  ------------------
  204|  1.99M|          mol.GetAtom((*j)[0])->SetHyb(i->second);
  205|   273k|      }
  206|  11.8M|    }
  207|       |
  208|       |    // check all atoms to make sure *some* hybridization is assigned
  209|  2.95M|    for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k))
  ------------------
  |  Branch (209:34): [True: 2.69M, False: 258k]
  ------------------
  210|  2.69M|      if (atom->GetHyb() == 0) {
  ------------------
  |  Branch (210:11): [True: 1.37M, False: 1.32M]
  ------------------
  211|  1.37M|        switch (atom->GetExplicitDegree()) {
  212|   259k|          case 0:
  ------------------
  |  Branch (212:11): [True: 259k, False: 1.11M]
  ------------------
  213|   948k|          case 1:
  ------------------
  |  Branch (213:11): [True: 688k, False: 683k]
  ------------------
  214|  1.35M|          case 2:
  ------------------
  |  Branch (214:11): [True: 409k, False: 962k]
  ------------------
  215|  1.35M|            atom->SetHyb(1);
  216|  1.35M|            break;
  217|  11.0k|          case 3:
  ------------------
  |  Branch (217:11): [True: 11.0k, False: 1.36M]
  ------------------
  218|  11.0k|            atom->SetHyb(2);
  219|  11.0k|            break;
  220|      0|          case 4:
  ------------------
  |  Branch (220:11): [True: 0, False: 1.37M]
  ------------------
  221|      0|            atom->SetHyb(3);
  222|      0|            break;
  223|  3.09k|          default:
  ------------------
  |  Branch (223:11): [True: 3.09k, False: 1.36M]
  ------------------
  224|  3.09k|            atom->SetHyb(atom->GetExplicitDegree());
  225|  1.37M|        }
  226|  1.37M|      }
  227|   258k|  }
_ZN9OpenBabel11OBRingTyperC2Ev:
  245|      2|  {
  246|      2|    _init = false;
  247|      2|    _dir = BABEL_DATADIR;
  ------------------
  |  |    4|      2|#define BABEL_DATADIR "/usr/local/share/openbabel"
  ------------------
  248|      2|    _envvar = "BABEL_DATADIR";
  249|      2|    _filename = "ringtyp.txt";
  250|      2|    _subdir = "data";
  251|      2|    _dataptr = RingTypeData;
  252|      2|  }
_ZN9OpenBabel23OBAromaticTyperMolState19AssignAromaticFlagsEv:
  613|  15.0k|  {
  614|  15.0k|    OBBond *bond;
  615|  15.0k|    OBAtom *atom;
  616|  15.0k|    vector<OBAtom*>::iterator i;
  617|  15.0k|    vector<OBBond*>::iterator j;
  618|       |
  619|       |    //unset all aromatic flags
  620|  1.46M|    for (atom = mol.BeginAtom(i); atom; atom = mol.NextAtom(i))
  ------------------
  |  Branch (620:35): [True: 1.44M, False: 15.0k]
  ------------------
  621|  1.44M|      atom->SetAromatic(false);
  622|  1.21M|    for (bond = mol.BeginBond(j); bond; bond = mol.NextBond(j))
  ------------------
  |  Branch (622:35): [True: 1.19M, False: 15.0k]
  ------------------
  623|  1.19M|      bond->SetAromatic(false);
  624|       |
  625|       |    // New code using lookups instead of SMARTS patterns
  626|  1.44M|    FOR_ATOMS_OF_MOL(atom, mol) {
  ------------------
  |  |  417|  15.0k|#define FOR_ATOMS_OF_MOL(a,m)     for (auto a : impl::MolGetAtoms(m))
  |  |  ------------------
  |  |  |  Branch (417:47): [True: 1.44M, False: 15.0k]
  |  |  ------------------
  ------------------
  627|  1.44M|      unsigned int idx = atom->GetIdx();
  628|  1.44M|      _vpa[idx] = AssignOBAromaticityModel(&(*atom), _velec[idx].first, _velec[idx].second);
  629|  1.44M|    }
  630|       |
  631|       |    //propagate potentially aromatic atoms
  632|  1.46M|    for (atom = mol.BeginAtom(i); atom; atom = mol.NextAtom(i))
  ------------------
  |  Branch (632:35): [True: 1.44M, False: 15.0k]
  ------------------
  633|  1.44M|      if (_vpa[atom->GetIdx()])
  ------------------
  |  Branch (633:11): [True: 60.2k, False: 1.38M]
  ------------------
  634|  60.2k|        PropagatePotentialAromatic(atom);
  635|       |
  636|       |    //select root atoms
  637|  15.0k|    SelectRootAtoms();
  638|       |
  639|  15.0k|    ExcludeSmallRing(); //remove 3 membered rings from consideration
  640|       |
  641|       |    //loop over root atoms and look for aromatic rings
  642|       |
  643|  1.46M|    for (atom = mol.BeginAtom(i); atom; atom = mol.NextAtom(i))
  ------------------
  |  Branch (643:35): [True: 1.44M, False: 15.0k]
  ------------------
  644|  1.44M|      if (_root[atom->GetIdx()])
  ------------------
  |  Branch (644:11): [True: 70.3k, False: 1.37M]
  ------------------
  645|  70.3k|        CheckAromaticity(atom, 14);
  646|       |
  647|       |    //for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
  648|       |    //	  if (atom->IsAromatic())
  649|       |    //		  cerr << "aro = " <<atom->GetIdx()  << endl;
  650|       |
  651|       |    //for (bond = mol.BeginBond(j);bond;bond = mol.NextBond(j))
  652|       |    //if (bond->IsAromatic())
  653|       |    //cerr << bond->GetIdx() << ' ' << bond->IsAromatic() << endl;
  654|  15.0k|  }
_ZN9OpenBabel15OBAromaticTyper19AssignAromaticFlagsERNS_5OBMolE:
  671|   263k|  {
  672|   263k|    if (mol.HasAromaticPerceived())
  ------------------
  |  Branch (672:9): [True: 248k, False: 15.0k]
  ------------------
  673|   248k|      return;
  674|  15.0k|    mol.SetAromaticPerceived();
  675|  15.0k|    obErrorLog.ThrowError(__FUNCTION__,
  676|  15.0k|                          "Ran OpenBabel::AssignAromaticFlags", obAuditMsg);
  677|       |
  678|  15.0k|    OBAromaticTyperMolState molstate(mol);
  679|  15.0k|    molstate.AssignAromaticFlags();
  680|  15.0k|  }
_ZN9OpenBabel23OBAromaticTyperMolState13TraverseCycleEPNS_6OBAtomES2_PNS_6OBBondERNSt3__14pairIiiEEi:
  697|   260k|  {
  698|   260k|    if (atom == root)
  ------------------
  |  Branch (698:9): [True: 2.34k, False: 258k]
  ------------------
  699|  2.34k|      {
  700|  2.34k|        int i;
  701|  4.13k|        for (i = er.first;i <= er.second;++i)
  ------------------
  |  Branch (701:27): [True: 2.47k, False: 1.65k]
  ------------------
  702|  2.47k|          if (i%4 == 2 && i > 2)
  ------------------
  |  Branch (702:15): [True: 756, False: 1.72k]
  |  Branch (702:27): [True: 686, False: 70]
  ------------------
  703|    686|            return(true);
  704|       |
  705|  1.65k|        return(false);
  706|  2.34k|      }
  707|       |
  708|   258k|    if (!depth || !_vpa[atom->GetIdx()] || _visit[atom->GetIdx()])
  ------------------
  |  Branch (708:9): [True: 424, False: 258k]
  |  Branch (708:9): [True: 240k, False: 17.5k]
  |  Branch (708:19): [True: 238k, False: 19.4k]
  |  Branch (708:44): [True: 1.92k, False: 17.5k]
  ------------------
  709|   240k|      return(false);
  710|       |
  711|  17.5k|    bool result = false;
  712|       |
  713|  17.5k|    depth--;
  714|  17.5k|    er.first  += _velec[atom->GetIdx()].first;
  715|  17.5k|    er.second += _velec[atom->GetIdx()].second;
  716|       |
  717|  17.5k|    _visit[atom->GetIdx()] = true;
  718|  17.5k|    OBAtom *nbr;
  719|  17.5k|    vector<OBBond*>::iterator i;
  720|  61.9k|    for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i))
  ------------------
  |  Branch (720:38): [True: 44.3k, False: 17.5k]
  ------------------
  721|  44.3k|      if (*i != prev && (*i)->IsInRing() && _vpa[nbr->GetIdx()])
  ------------------
  |  Branch (721:11): [True: 26.8k, False: 17.5k]
  |  Branch (721:11): [True: 19.9k, False: 24.4k]
  |  Branch (721:25): [True: 24.3k, False: 2.48k]
  |  Branch (721:45): [True: 19.9k, False: 4.35k]
  ------------------
  722|  19.9k|        {
  723|  19.9k|          if (TraverseCycle(root,nbr,(OBBond*)(*i),er,depth))
  ------------------
  |  Branch (723:15): [True: 3.03k, False: 16.9k]
  ------------------
  724|  3.03k|            {
  725|  3.03k|              result = true;
  726|  3.03k|              ((OBBond*) *i)->SetAromatic();
  727|  3.03k|            }
  728|  19.9k|        }
  729|       |
  730|  17.5k|    _visit[atom->GetIdx()] = false;
  731|  17.5k|    if (result)
  ------------------
  |  Branch (731:9): [True: 2.96k, False: 14.5k]
  ------------------
  732|  2.96k|      atom->SetAromatic();
  733|       |
  734|  17.5k|    er.first  -= _velec[atom->GetIdx()].first;
  735|  17.5k|    er.second -= _velec[atom->GetIdx()].second;
  736|       |
  737|  17.5k|    return(result);
  738|   258k|  }
_ZN9OpenBabel23OBAromaticTyperMolState16CheckAromaticityEPNS_6OBAtomEi:
  741|  70.3k|  {
  742|  70.3k|    OBAtom *nbr;
  743|  70.3k|    vector<OBBond*>::iterator i;
  744|       |
  745|  70.3k|    pair<int,int> erange;
  746|   336k|    for (nbr = atom->BeginNbrAtom(i);nbr;nbr = atom->NextNbrAtom(i))
  ------------------
  |  Branch (746:38): [True: 265k, False: 70.3k]
  ------------------
  747|   265k|      if ((*i)->IsInRing()) // check all rings, regardless of assumed aromaticity
  ------------------
  |  Branch (747:11): [True: 240k, False: 24.8k]
  ------------------
  748|   240k|        {
  749|   240k|          erange = _velec[atom->GetIdx()];
  750|       |
  751|   240k|          if (TraverseCycle(atom,nbr,(OBBond *)*i,erange,depth-1))
  ------------------
  |  Branch (751:15): [True: 617, False: 240k]
  ------------------
  752|    617|            {
  753|    617|              atom->SetAromatic();
  754|    617|              ((OBBond*) *i)->SetAromatic();
  755|    617|            }
  756|   240k|        }
  757|  70.3k|  }
_ZN9OpenBabel23OBAromaticTyperMolState26PropagatePotentialAromaticEPNS_6OBAtomE:
  760|  60.2k|  {
  761|       |    // Iterative peel: when count == 1 the recurse path collapses to a
  762|       |    // single neighbor, so a long chain produced unbounded recursion and
  763|       |    // could blow the stack on pathological fuzz inputs.
  764|  60.2k|    OBAtom *nbr;
  765|  60.2k|    vector<OBBond*>::iterator i;
  766|       |
  767|   258k|    while (atom)
  ------------------
  |  Branch (767:12): [True: 212k, False: 46.1k]
  ------------------
  768|   212k|      {
  769|   212k|        int count = 0;
  770|   212k|        OBAtom *nextAtom = nullptr;
  771|   715k|        for (nbr = atom->BeginNbrAtom(i); nbr; nbr = atom->NextNbrAtom(i))
  ------------------
  |  Branch (771:43): [True: 502k, False: 212k]
  ------------------
  772|   502k|          if ((*i)->IsInRing() && _vpa[nbr->GetIdx()])
  ------------------
  |  Branch (772:15): [True: 441k, False: 61.0k]
  |  Branch (772:15): [True: 181k, False: 321k]
  |  Branch (772:35): [True: 181k, False: 260k]
  ------------------
  773|   181k|            {
  774|   181k|              count++;
  775|   181k|              nextAtom = nbr;
  776|   181k|            }
  777|       |
  778|   212k|        if (count >= 2)
  ------------------
  |  Branch (778:13): [True: 14.1k, False: 198k]
  ------------------
  779|  14.1k|          return;
  780|       |
  781|   198k|        _vpa[atom->GetIdx()] = false;
  782|   198k|        atom = (count == 1) ? nextAtom : nullptr;
  ------------------
  |  Branch (782:16): [True: 152k, False: 46.1k]
  ------------------
  783|   198k|      }
  784|  60.2k|  }
_ZN9OpenBabel23OBAromaticTyperMolState15SelectRootAtomsEb:
  804|  15.0k|  {
  805|  15.0k|    OBBond *bond;
  806|  15.0k|    OBAtom *atom, *nbr, *nbr2;
  807|  15.0k|    OBRing *ring;
  808|       |    //    vector<OBAtom*>::iterator i;
  809|  15.0k|    vector<OBBond*>::iterator j, l, nbr2Iter;
  810|  15.0k|    vector<OBRing*> sssRings = mol.GetSSSR();
  811|  15.0k|    vector<OBRing*>::iterator k;
  812|       |
  813|  15.0k|    int rootAtom;
  814|  15.0k|    int ringNbrs;
  815|  15.0k|    int heavyNbrs;
  816|  15.0k|    int newRoot = -1;
  817|  15.0k|    vector<int> tmpRootAtoms;
  818|  15.0k|    vector<int> tmp;
  819|       |
  820|  15.0k|    vector<OBBond*> cbonds;
  821|  15.0k|    vector< vector<OBRing*> > ringAtoms; // store ring pointers on an atom basis
  822|       |
  823|       |    //generate list of closure bonds
  824|  1.21M|    for (bond = mol.BeginBond(j);bond;bond = mol.NextBond(j))
  ------------------
  |  Branch (824:34): [True: 1.19M, False: 15.0k]
  ------------------
  825|  1.19M|      {
  826|  1.19M|        if( bond->IsClosure() )
  ------------------
  |  Branch (826:13): [True: 106k, False: 1.09M]
  ------------------
  827|   106k|          {
  828|   106k|            cbonds.push_back(bond);
  829|   106k|            if(avoidInnerRingAtoms)
  ------------------
  |  Branch (829:16): [True: 106k, False: 0]
  ------------------
  830|   106k|              {
  831|   106k|                tmpRootAtoms.push_back(bond->GetBeginAtomIdx());
  832|   106k|              }
  833|   106k|          }
  834|  1.19M|      }
  835|       |
  836|  15.0k|    if(avoidInnerRingAtoms)
  ------------------
  |  Branch (836:8): [True: 15.0k, False: 0]
  ------------------
  837|  15.0k|      {
  838|       |        //for every atom fill vector with ring pointer it's associated with
  839|  15.0k|        ringAtoms.resize(mol.NumAtoms()+1);
  840|   120k|        for (k = sssRings.begin();k != sssRings.end();++k)
  ------------------
  |  Branch (840:35): [True: 105k, False: 15.0k]
  ------------------
  841|   105k|          {
  842|   105k|            tmp = (*k)->_path;
  843|   649k|            for (unsigned int j (0),j_end(tmp.size()); j < j_end; ++j)
  ------------------
  |  Branch (843:56): [True: 544k, False: 105k]
  ------------------
  844|   544k|              {
  845|   544k|                ringAtoms[tmp[j]].push_back(*k);
  846|   544k|              }
  847|   105k|          }
  848|  15.0k|      }
  849|       |
  850|       |
  851|       |    //loop over closure bonds
  852|   121k|    for(OBBondIterator bd(cbonds.begin()),bd_end(cbonds.end());bd!=bd_end;++bd)
  ------------------
  |  Branch (852:64): [True: 106k, False: 15.0k]
  ------------------
  853|   106k|      {
  854|   106k|        bond = *bd;
  855|       |
  856|       |        // BASIC APPROACH
  857|       |        // pick beginning atom at closure bond
  858|       |        // this is really ready, isn't it ! ;-)
  859|   106k|        rootAtom = bond->GetBeginAtomIdx();
  860|   106k|        _root[rootAtom] = true;
  861|       |
  862|       |        // EXTENDED APPROACH
  863|   106k|        if (avoidInnerRingAtoms)
  ------------------
  |  Branch (863:13): [True: 106k, False: 0]
  ------------------
  864|   106k|          {
  865|       |            // count the number of neighbor ring atoms
  866|   106k|            atom = mol.GetAtom(rootAtom);
  867|   106k|            ringNbrs = heavyNbrs = 0;
  868|       |
  869|   591k|            for (nbr = atom->BeginNbrAtom(l);nbr;nbr = atom->NextNbrAtom(l))
  ------------------
  |  Branch (869:46): [True: 485k, False: 106k]
  ------------------
  870|   485k|              {
  871|       |                // we can get this from atom->GetHvyDegree()
  872|       |                // but we need to find neighbors in rings too
  873|       |                // so let's save some time
  874|   485k|                if (nbr->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (874:21): [True: 482k, False: 2.29k]
  ------------------
  875|   482k|                  {
  876|   482k|                    heavyNbrs++;
  877|   482k|                    if (nbr->IsInRing())
  ------------------
  |  Branch (877:25): [True: 457k, False: 25.0k]
  ------------------
  878|   457k|                      ringNbrs++;
  879|   482k|                  }
  880|       |
  881|       |                // if this atom has more than 2 neighbor ring atoms
  882|       |                // we could get trapped later when traversing cycles
  883|       |                // which can cause aromaticity false detection
  884|   485k|                newRoot = -1;
  885|       |
  886|   485k|                if (ringNbrs > 2)
  ------------------
  |  Branch (886:21): [True: 247k, False: 237k]
  ------------------
  887|   247k|                  {
  888|       |                    // try to find another root atom
  889|       |                    // only loop over rings which contain rootAtom
  890|  2.12M|                    for(k = ringAtoms[rootAtom].begin() ; k != ringAtoms[rootAtom].end(); ++k)
  ------------------
  |  Branch (890:59): [True: 1.87M, False: 247k]
  ------------------
  891|  1.87M|                      {
  892|  1.87M|                        ring = (*k);
  893|  1.87M|                        tmp = ring->_path;
  894|       |
  895|  1.87M|                        bool checkThisRing = false;
  896|  1.87M|                        int rootAtomNumber=0;
  897|  1.87M|                        int idx=0;
  898|       |                        // avoiding two root atoms in one ring !
  899|  25.0M|                        for (unsigned int j = 0; j < tmpRootAtoms.size(); ++j)
  ------------------
  |  Branch (899:50): [True: 25.0M, False: 11.3k]
  ------------------
  900|  25.0M|                          {
  901|  25.0M|                            idx= tmpRootAtoms[j];
  902|  25.0M|                            if(ring->IsInRing(idx))
  ------------------
  |  Branch (902:32): [True: 3.74M, False: 21.2M]
  ------------------
  903|  3.74M|                              {
  904|  3.74M|                                rootAtomNumber++;
  905|  3.74M|                                if(rootAtomNumber>=2)
  ------------------
  |  Branch (905:36): [True: 1.86M, False: 1.87M]
  ------------------
  906|  1.86M|                                  break;
  907|  3.74M|                              }
  908|  25.0M|                          }
  909|  1.87M|                        if(rootAtomNumber<2)
  ------------------
  |  Branch (909:28): [True: 11.3k, False: 1.86M]
  ------------------
  910|  11.3k|                          {
  911|  71.5k|                            for (unsigned int j = 0; j < tmp.size(); ++j)
  ------------------
  |  Branch (911:54): [True: 62.5k, False: 9.03k]
  ------------------
  912|  62.5k|                              {
  913|       |                                // find critical ring
  914|  62.5k|                                if (tmp[j] == rootAtom)
  ------------------
  |  Branch (914:37): [True: 10.4k, False: 52.0k]
  ------------------
  915|  10.4k|                                  {
  916|  10.4k|                                    checkThisRing = true;
  917|  10.4k|                                  }
  918|  52.0k|                                else
  919|  52.0k|                                  {
  920|       |                                    // second root atom in this ring ?
  921|  52.0k|                                    if (_root[tmp[j]] == true)
  ------------------
  |  Branch (921:41): [True: 2.30k, False: 49.7k]
  ------------------
  922|  2.30k|                                      {
  923|       |                                        // when there is a second root
  924|       |                                        // atom this ring can not be
  925|       |                                        // used for getting an other
  926|       |                                        // root atom
  927|  2.30k|                                        checkThisRing = false;
  928|       |
  929|  2.30k|                                        break;
  930|  2.30k|                                      }
  931|  52.0k|                                  }
  932|  62.5k|                              }
  933|  11.3k|                          }
  934|       |
  935|       |                        // check ring for getting another
  936|       |                        // root atom to avoid aromaticity typer problems
  937|  1.87M|                        if (checkThisRing)
  ------------------
  |  Branch (937:29): [True: 9.03k, False: 1.86M]
  ------------------
  938|  9.03k|                          {
  939|       |                            // check if we can find another root atom
  940|  58.9k|                            for (unsigned int m = 0; m < tmp.size(); ++m)
  ------------------
  |  Branch (940:54): [True: 49.8k, False: 9.03k]
  ------------------
  941|  49.8k|                              {
  942|  49.8k|                                ringNbrs = heavyNbrs = 0;
  943|  49.8k|                                for (nbr2 = (mol.GetAtom(tmp[m]))->BeginNbrAtom(nbr2Iter);
  944|   183k|                                     nbr2;nbr2 = (mol.GetAtom(tmp[m]))->NextNbrAtom(nbr2Iter))
  ------------------
  |  Branch (944:38): [True: 133k, False: 49.8k]
  ------------------
  945|   133k|                                  {
  946|   133k|                                    if (nbr2->GetAtomicNum() != OBElements::Hydrogen)
  ------------------
  |  Branch (946:41): [True: 126k, False: 7.73k]
  ------------------
  947|   126k|                                      {
  948|   126k|                                        heavyNbrs++;
  949|       |
  950|   126k|                                        if (nbr2->IsInRing())
  ------------------
  |  Branch (950:45): [True: 123k, False: 2.68k]
  ------------------
  951|   123k|                                          ringNbrs++;
  952|   126k|                                      }
  953|   133k|                                  }
  954|       |
  955|       |                                // if the number of neighboured heavy atoms is also
  956|       |                                // the number of neighboured ring atoms, the aromaticity
  957|       |                                // typer could be stuck in a local traversing trap
  958|  49.8k|                                if (ringNbrs <= 2 && ring->IsInRing((mol.GetAtom(tmp[m])->GetIdx())))
  ------------------
  |  Branch (958:37): [True: 31.8k, False: 18.0k]
  |  Branch (958:54): [True: 31.8k, False: 0]
  ------------------
  959|  31.8k|                                  {
  960|  31.8k|                                    newRoot = tmp[m];
  961|  31.8k|                                  }
  962|  49.8k|                              }
  963|  9.03k|                          }
  964|  1.87M|                      }
  965|       |
  966|   247k|                    if ((newRoot != -1) && (rootAtom != newRoot))
  ------------------
  |  Branch (966:25): [True: 7.98k, False: 239k]
  |  Branch (966:44): [True: 7.98k, False: 0]
  ------------------
  967|  7.98k|                      {
  968|       |                        // unset root atom
  969|  7.98k|                        _root[rootAtom] = false;
  970|       |
  971|       |                        // pick new root atom
  972|  7.98k|                        _root[newRoot] = true;
  973|  7.98k|                      }
  974|   247k|                  } // if (ringNbrs > 2)
  975|       |
  976|   485k|              } // end for
  977|   106k|          } // if (avoid)
  978|   106k|      } // end for(closure bonds)
  979|  15.0k|  }
_ZN9OpenBabel23OBAromaticTyperMolState16ExcludeSmallRingEv:
  982|  15.0k|  {
  983|  15.0k|    OBAtom *atom,*nbr1,*nbr2;
  984|  15.0k|    vector<OBAtom*>::iterator i;
  985|  15.0k|    vector<OBBond*>::iterator j,k;
  986|       |
  987|  1.46M|    for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
  ------------------
  |  Branch (987:34): [True: 1.44M, False: 15.0k]
  ------------------
  988|  1.44M|      if (_root[atom->GetIdx()])
  ------------------
  |  Branch (988:11): [True: 72.1k, False: 1.37M]
  ------------------
  989|   342k|        for (nbr1 = atom->BeginNbrAtom(j);nbr1;nbr1 = atom->NextNbrAtom(j))
  ------------------
  |  Branch (989:43): [True: 270k, False: 72.1k]
  ------------------
  990|   270k|          if ((*j)->IsInRing() && _vpa[nbr1->GetIdx()])
  ------------------
  |  Branch (990:15): [True: 245k, False: 25.5k]
  |  Branch (990:15): [True: 6.22k, False: 264k]
  |  Branch (990:35): [True: 6.22k, False: 239k]
  ------------------
  991|  23.3k|            for (nbr2 = nbr1->BeginNbrAtom(k);nbr2;nbr2 = nbr1->NextNbrAtom(k))
  ------------------
  |  Branch (991:47): [True: 17.1k, False: 6.22k]
  ------------------
  992|  17.1k|              if (nbr2 != atom && (*k)->IsInRing() && _vpa[nbr2->GetIdx()])
  ------------------
  |  Branch (992:19): [True: 10.8k, False: 6.22k]
  |  Branch (992:19): [True: 8.44k, False: 8.67k]
  |  Branch (992:35): [True: 9.56k, False: 1.32k]
  |  Branch (992:55): [True: 8.44k, False: 1.12k]
  ------------------
  993|  8.44k|                if (atom->IsConnected(nbr2))
  ------------------
  |  Branch (993:21): [True: 4.88k, False: 3.55k]
  ------------------
  994|  4.88k|                  _root[atom->GetIdx()] = false;
  995|  15.0k|  }
typer.cpp:_ZN9OpenBabelL24AssignOBAromaticityModelEPNS_6OBAtomERiS2_:
  385|  1.44M|  {
  386|       |    // The Open Babel aromaticity model
  387|       |    //
  388|       |    // Return minimum and maximum pi-electrons contributed to an aromatic system
  389|       |    // The return value indicates a potentially aromatic atom (i.e. any patterns matched)
  390|       |    //
  391|       |    // The original code used SMARTS patterns organised in increasing order of
  392|       |    // prioirity (i.e. later matches overrode earlier ones). These SMARTS patterns
  393|       |    // are now implemented in the code below, but are included in the comments
  394|       |    // for reference (Case 1->22).
  395|       |
  396|  1.44M|    if (!atm->IsInRing()) {
  ------------------
  |  Branch (396:9): [True: 1.01M, False: 434k]
  ------------------
  397|  1.01M|      min = 0; max = 0; return false;
  398|  1.01M|    }
  399|       |
  400|   434k|    unsigned int elem = atm->GetAtomicNum();
  401|   434k|    int chg = atm->GetFormalCharge();
  402|   434k|    unsigned int deg = atm->GetExplicitDegree() + atm->GetImplicitHCount();
  403|   434k|    unsigned int val = atm->GetExplicitValence() + atm->GetImplicitHCount();
  404|       |
  405|   434k|    switch (elem) {
  ------------------
  |  Branch (405:13): [True: 356k, False: 78.6k]
  ------------------
  406|   153k|    case OBElements::Carbon:
  ------------------
  |  Branch (406:5): [True: 153k, False: 281k]
  ------------------
  407|   153k|      switch (chg) {
  ------------------
  |  Branch (407:15): [True: 152k, False: 452]
  ------------------
  408|   152k|      case 0:
  ------------------
  |  Branch (408:7): [True: 152k, False: 897]
  ------------------
  409|   152k|        if (val == 4 && deg == 3) {
  ------------------
  |  Branch (409:13): [True: 145k, False: 6.62k]
  |  Branch (409:25): [True: 70.9k, False: 74.8k]
  ------------------
  410|  70.9k|          if (HasExocyclicDblBondToHet(atm)) {
  ------------------
  |  Branch (410:15): [True: 679, False: 70.2k]
  ------------------
  411|    679|            min = 0; max = 0; return true;
  412|    679|          }
  413|  70.2k|          else {
  414|  70.2k|            min = 1; max = 1; return true;
  415|  70.2k|          }
  416|  70.9k|        }
  417|  81.4k|        break;
  418|  81.4k|      case 1:
  ------------------
  |  Branch (418:7): [True: 265, False: 153k]
  ------------------
  419|    265|        if (val == 3) {
  ------------------
  |  Branch (419:13): [True: 134, False: 131]
  ------------------
  420|    134|          switch (deg) {
  ------------------
  |  Branch (420:19): [True: 134, False: 0]
  ------------------
  421|    125|          case 3:
  ------------------
  |  Branch (421:11): [True: 125, False: 9]
  ------------------
  422|    125|            min = 0; max = 0; return true;
  423|      9|          case 2:
  ------------------
  |  Branch (423:11): [True: 9, False: 125]
  ------------------
  424|      9|            min = 1; max = 1; return true;
  425|    134|          }
  426|    134|        }
  427|    131|        break;
  428|    180|      case -1:
  ------------------
  |  Branch (428:7): [True: 180, False: 153k]
  ------------------
  429|    180|        if (val == 3) {
  ------------------
  |  Branch (429:13): [True: 56, False: 124]
  ------------------
  430|     56|          switch (deg) {
  ------------------
  |  Branch (430:19): [True: 56, False: 0]
  ------------------
  431|     53|          case 3:
  ------------------
  |  Branch (431:11): [True: 53, False: 3]
  ------------------
  432|     53|            min = 2; max = 2; return true;
  433|      3|          case 2:
  ------------------
  |  Branch (433:11): [True: 3, False: 53]
  ------------------
  434|      3|            min = 1; max = 1; return true;
  435|     56|          }
  436|     56|        }
  437|    124|        break;
  438|   153k|      }
  439|  82.1k|      break;
  440|       |
  441|   125k|    case OBElements::Nitrogen: // nitrogen
  ------------------
  |  Branch (441:5): [True: 125k, False: 309k]
  ------------------
  442|   150k|    case OBElements::Phosphorus: // phosphorus
  ------------------
  |  Branch (442:5): [True: 24.8k, False: 410k]
  ------------------
  443|   150k|      switch (chg) {
  ------------------
  |  Branch (443:15): [True: 150k, False: 467]
  ------------------
  444|   149k|      case 0:
  ------------------
  |  Branch (444:7): [True: 149k, False: 797]
  ------------------
  445|   149k|        switch (val) {
  ------------------
  |  Branch (445:17): [True: 128k, False: 20.9k]
  ------------------
  446|   109k|        case 3:
  ------------------
  |  Branch (446:9): [True: 109k, False: 40.5k]
  ------------------
  447|   109k|          switch (deg) {
  ------------------
  |  Branch (447:19): [True: 109k, False: 60]
  ------------------
  448|  50.7k|          case 3:
  ------------------
  |  Branch (448:11): [True: 50.7k, False: 58.5k]
  ------------------
  449|  50.7k|            min = 2; max = 2; return true;
  450|  58.4k|          case 2:
  ------------------
  |  Branch (450:11): [True: 58.4k, False: 50.8k]
  ------------------
  451|  58.4k|            min = 1; max = 1; return true;
  452|   109k|          }
  453|     60|          break;
  454|  19.5k|        case 5:
  ------------------
  |  Branch (454:9): [True: 19.5k, False: 130k]
  ------------------
  455|  19.5k|          if (deg == 3) {
  ------------------
  |  Branch (455:15): [True: 1.00k, False: 18.5k]
  ------------------
  456|  1.00k|            ExocyclicAtom exoatom = FindExocyclicAtom(atm);
  457|  1.00k|            switch (exoatom) {
  458|     17|            case EXO_OXYGEN:
  ------------------
  |  Branch (458:13): [True: 17, False: 989]
  ------------------
  459|     17|              min = 1; max = 1; return true;
  460|    151|            case EXO_NONOXYGEN:
  ------------------
  |  Branch (460:13): [True: 151, False: 855]
  ------------------
  461|    151|              min = 2; max = 2; return true;
  462|    838|            default:
  ------------------
  |  Branch (462:13): [True: 838, False: 168]
  ------------------
  463|    838|              ;
  464|  1.00k|            }
  465|  1.00k|          }
  466|   149k|        }
  467|  40.4k|        break;
  468|  40.4k|      case 1:
  ------------------
  |  Branch (468:7): [True: 142, False: 150k]
  ------------------
  469|    142|        if (val == 4 && deg == 3) {
  ------------------
  |  Branch (469:13): [True: 73, False: 69]
  |  Branch (469:25): [True: 24, False: 49]
  ------------------
  470|     24|          min = 1; max = 1; return true;
  471|     24|        }
  472|    118|        break;
  473|    188|      case -1:
  ------------------
  |  Branch (473:7): [True: 188, False: 150k]
  ------------------
  474|    188|        if (val == 2 && deg == 2) {
  ------------------
  |  Branch (474:13): [True: 28, False: 160]
  |  Branch (474:25): [True: 28, False: 0]
  ------------------
  475|     28|          min = 2; max = 2; return true;
  476|     28|        }
  477|   150k|      }
  478|  41.1k|      break;
  479|       |
  480|  41.1k|    case OBElements::Oxygen:
  ------------------
  |  Branch (480:5): [True: 9.26k, False: 425k]
  ------------------
  481|  9.39k|    case OBElements::Selenium:
  ------------------
  |  Branch (481:5): [True: 129, False: 434k]
  ------------------
  482|  9.39k|      switch (chg) {
  ------------------
  |  Branch (482:15): [True: 9.30k, False: 90]
  ------------------
  483|  9.19k|      case 0:
  ------------------
  |  Branch (483:7): [True: 9.19k, False: 195]
  ------------------
  484|  9.19k|        if (val == 2 && deg == 2) {
  ------------------
  |  Branch (484:13): [True: 4.11k, False: 5.08k]
  |  Branch (484:25): [True: 4.11k, False: 0]
  ------------------
  485|  4.11k|          min = 2; max = 2; return true;
  486|  4.11k|        }
  487|  5.18k|      case 1:
  ------------------
  |  Branch (487:7): [True: 105, False: 9.28k]
  ------------------
  488|  5.18k|        if (val == 3 && deg == 2) {
  ------------------
  |  Branch (488:13): [True: 326, False: 4.86k]
  |  Branch (488:25): [True: 131, False: 195]
  ------------------
  489|    131|          min = 1; max = 1; return true;
  490|    131|        }
  491|  9.39k|      }
  492|  5.14k|      break;
  493|       |
  494|  21.9k|    case OBElements::Sulfur:
  ------------------
  |  Branch (494:5): [True: 21.9k, False: 412k]
  ------------------
  495|  21.9k|      switch (chg) {
  ------------------
  |  Branch (495:15): [True: 21.7k, False: 177]
  ------------------
  496|  21.4k|      case 0:
  ------------------
  |  Branch (496:7): [True: 21.4k, False: 462]
  ------------------
  497|  21.4k|        switch (val) {
  ------------------
  |  Branch (497:17): [True: 19.8k, False: 1.59k]
  ------------------
  498|  4.08k|        case 2:
  ------------------
  |  Branch (498:9): [True: 4.08k, False: 17.3k]
  ------------------
  499|  4.08k|          if (deg == 2) {
  ------------------
  |  Branch (499:15): [True: 4.05k, False: 37]
  ------------------
  500|  4.05k|            min = 2; max = 2; return true;
  501|  4.05k|          }
  502|     37|          break;
  503|  15.7k|        case 4:
  ------------------
  |  Branch (503:9): [True: 15.7k, False: 5.68k]
  ------------------
  504|  15.7k|          if (deg == 3 && HasExocyclicDblBondToOxygen(atm)) {
  ------------------
  |  Branch (504:15): [True: 15.2k, False: 496]
  |  Branch (504:27): [True: 19, False: 15.2k]
  ------------------
  505|     19|            min = 2; max = 2; return true;
  506|     19|          }
  507|  21.4k|        }
  508|  17.3k|        break;
  509|  17.3k|      case 1:
  ------------------
  |  Branch (509:7): [True: 285, False: 21.6k]
  ------------------
  510|    285|        if (val == 3) {
  ------------------
  |  Branch (510:13): [True: 122, False: 163]
  ------------------
  511|    122|          switch (deg) {
  ------------------
  |  Branch (511:19): [True: 122, False: 0]
  ------------------
  512|      4|          case 2:
  ------------------
  |  Branch (512:11): [True: 4, False: 118]
  ------------------
  513|      4|            min = 1; max = 1; return true;
  514|    118|          case 3:
  ------------------
  |  Branch (514:11): [True: 118, False: 4]
  ------------------
  515|    118|            if (HasExocyclicBondToOxygenMinus(atm)) {
  ------------------
  |  Branch (515:17): [True: 0, False: 118]
  ------------------
  516|      0|              min = 2; max = 2; return true;
  517|      0|            }
  518|    122|          }
  519|    122|        }
  520|  21.9k|      }
  521|  17.8k|      break;
  522|       |
  523|  19.5k|    case OBElements::Boron:
  ------------------
  |  Branch (523:5): [True: 19.5k, False: 415k]
  ------------------
  524|  19.5k|      if (chg == 0 && val == 3) {
  ------------------
  |  Branch (524:11): [True: 19.3k, False: 270]
  |  Branch (524:23): [True: 17.1k, False: 2.15k]
  ------------------
  525|  17.1k|        switch (deg) {
  ------------------
  |  Branch (525:17): [True: 17.1k, False: 5]
  ------------------
  526|  2.42k|        case 2:
  ------------------
  |  Branch (526:9): [True: 2.42k, False: 14.7k]
  ------------------
  527|  2.42k|          min = 1; max = 1; return true;
  528|  14.7k|        case 3:
  ------------------
  |  Branch (528:9): [True: 14.7k, False: 2.43k]
  ------------------
  529|  14.7k|          min = 0; max = 0; return true;
  530|  17.1k|        }
  531|  17.1k|      }
  532|  2.42k|      break;
  533|       |
  534|  2.42k|    case OBElements::Arsenic:
  ------------------
  |  Branch (534:5): [True: 319, False: 434k]
  ------------------
  535|    319|      switch (chg) {
  ------------------
  |  Branch (535:15): [True: 175, False: 144]
  ------------------
  536|    119|      case 0:
  ------------------
  |  Branch (536:7): [True: 119, False: 200]
  ------------------
  537|    119|        if (val == 3) {
  ------------------
  |  Branch (537:13): [True: 80, False: 39]
  ------------------
  538|     80|          switch (deg) {
  ------------------
  |  Branch (538:19): [True: 80, False: 0]
  ------------------
  539|     22|          case 2:
  ------------------
  |  Branch (539:11): [True: 22, False: 58]
  ------------------
  540|     22|            min = 1; max = 1; return true;
  541|     58|          case 3:
  ------------------
  |  Branch (541:11): [True: 58, False: 22]
  ------------------
  542|     58|            min = 2; max = 2; return true;
  543|     80|          }
  544|     80|        }
  545|     39|        break;
  546|     56|      case 1:
  ------------------
  |  Branch (546:7): [True: 56, False: 263]
  ------------------
  547|     56|        if (val == 4 && deg == 3) {
  ------------------
  |  Branch (547:13): [True: 12, False: 44]
  |  Branch (547:25): [True: 0, False: 12]
  ------------------
  548|      0|          min = 1; max = 1; return true;
  549|      0|        }
  550|    319|      }
  551|    239|      break;
  552|       |
  553|       |
  554|  1.05k|    case 0: // Asterisk
  ------------------
  |  Branch (554:5): [True: 1.05k, False: 433k]
  ------------------
  555|  1.05k|      if (chg == 0) {
  ------------------
  |  Branch (555:11): [True: 1.05k, False: 0]
  ------------------
  556|  1.05k|        switch (val) {
  ------------------
  |  Branch (556:17): [True: 812, False: 245]
  ------------------
  557|    740|        case 2:
  ------------------
  |  Branch (557:9): [True: 740, False: 317]
  ------------------
  558|    740|          switch (deg) {
  ------------------
  |  Branch (558:19): [True: 740, False: 0]
  ------------------
  559|    740|          case 2:
  ------------------
  |  Branch (559:11): [True: 740, False: 0]
  ------------------
  560|    740|          case 3:
  ------------------
  |  Branch (560:11): [True: 0, False: 740]
  ------------------
  561|    740|            min = 0; max = 2; return true;
  562|    740|          }
  563|      0|          break;
  564|     72|        case 3:
  ------------------
  |  Branch (564:9): [True: 72, False: 985]
  ------------------
  565|     72|          switch (deg) {
  ------------------
  |  Branch (565:19): [True: 69, False: 3]
  ------------------
  566|      2|          case 2:
  ------------------
  |  Branch (566:11): [True: 2, False: 70]
  ------------------
  567|     69|          case 3:
  ------------------
  |  Branch (567:11): [True: 67, False: 5]
  ------------------
  568|     69|            min = 0; max = 1; return true;
  569|     72|          }
  570|      3|          break;
  571|  1.05k|        }
  572|  1.05k|      }
  573|    248|      break;
  574|   434k|    }
  575|       |
  576|   227k|    min = 0; max = 0; // nothing matched
  577|   227k|    return false;
  578|   434k|  }
typer.cpp:_ZN9OpenBabelL24HasExocyclicDblBondToHetEPNS_6OBAtomE:
  367|  70.9k|  {
  368|   175k|    FOR_BONDS_OF_ATOM(bond, atm) {
  ------------------
  |  |  420|  70.9k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 175k, False: 70.2k]
  |  |  ------------------
  ------------------
  369|   175k|      if (bond->GetBondOrder() == 2 && !bond->IsInRing()) {
  ------------------
  |  Branch (369:11): [True: 70.9k, False: 104k]
  |  Branch (369:40): [True: 1.05k, False: 69.8k]
  ------------------
  370|  1.05k|        unsigned int atomicnum = bond->GetNbrAtom(atm)->GetAtomicNum();
  371|  1.05k|        switch (atomicnum) {
  372|    379|        case OBElements::Carbon:
  ------------------
  |  Branch (372:9): [True: 379, False: 679]
  ------------------
  373|    379|        case OBElements::Hydrogen:
  ------------------
  |  Branch (373:9): [True: 0, False: 1.05k]
  ------------------
  374|    379|          break;
  375|    679|        default:
  ------------------
  |  Branch (375:9): [True: 679, False: 379]
  ------------------
  376|    679|          return true;
  377|  1.05k|        }
  378|  1.05k|      }
  379|   175k|    }
  380|  70.2k|    return false;
  381|  70.9k|  }
typer.cpp:_ZN9OpenBabelL17FindExocyclicAtomEPNS_6OBAtomE:
  329|  1.00k|  {
  330|  2.74k|    FOR_BONDS_OF_ATOM(bond, atm) {
  ------------------
  |  |  420|  1.00k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 2.74k, False: 838]
  |  |  ------------------
  ------------------
  331|  2.74k|      if (bond->GetBondOrder() == 2 && !bond->IsInRing()) {
  ------------------
  |  Branch (331:11): [True: 836, False: 1.91k]
  |  Branch (331:40): [True: 168, False: 668]
  ------------------
  332|    168|        unsigned int atomicnum = bond->GetNbrAtom(atm)->GetAtomicNum();
  333|    168|        switch (atomicnum) {
  334|     17|        case OBElements::Oxygen:
  ------------------
  |  Branch (334:9): [True: 17, False: 151]
  ------------------
  335|     17|          return EXO_OXYGEN;
  336|    151|        default:
  ------------------
  |  Branch (336:9): [True: 151, False: 17]
  ------------------
  337|    151|          return EXO_NONOXYGEN;
  338|    168|        }
  339|    168|      }
  340|  2.74k|    }
  341|    838|    return NO_EXOCYCLIC_ATOM;
  342|  1.00k|  }
typer.cpp:_ZN9OpenBabelL27HasExocyclicDblBondToOxygenEPNS_6OBAtomE:
  357|  15.2k|  {
  358|  45.8k|    FOR_BONDS_OF_ATOM(bond, atm) {
  ------------------
  |  |  420|  15.2k|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 45.8k, False: 15.2k]
  |  |  ------------------
  ------------------
  359|  45.8k|      if (bond->GetBondOrder() == 2 && !bond->IsInRing() &&
  ------------------
  |  Branch (359:11): [True: 15.2k, False: 30.5k]
  |  Branch (359:40): [True: 4.29k, False: 10.9k]
  ------------------
  360|  4.29k|          bond->GetNbrAtom(atm)->GetAtomicNum() == OBElements::Oxygen)
  ------------------
  |  Branch (360:11): [True: 19, False: 4.27k]
  ------------------
  361|     19|        return true;
  362|  45.8k|    }
  363|  15.2k|    return false;
  364|  15.2k|  }
typer.cpp:_ZN9OpenBabelL29HasExocyclicBondToOxygenMinusEPNS_6OBAtomE:
  345|    118|  {
  346|    309|    FOR_BONDS_OF_ATOM(bond, atm) {
  ------------------
  |  |  420|    118|#define FOR_BONDS_OF_ATOM(b,p)    for (auto b : impl::AtomGetBonds(p))
  |  |  ------------------
  |  |  |  Branch (420:47): [True: 309, False: 118]
  |  |  ------------------
  ------------------
  347|    309|      if (bond->GetBondOrder() == 1 && !bond->IsInRing()) {
  ------------------
  |  Branch (347:11): [True: 309, False: 0]
  |  Branch (347:40): [True: 40, False: 269]
  ------------------
  348|     40|        OBAtom* nbr = bond->GetNbrAtom(atm);
  349|     40|        if (nbr->GetAtomicNum() == OBElements::Oxygen && nbr->GetFormalCharge() == -1)
  ------------------
  |  Branch (349:13): [True: 14, False: 26]
  |  Branch (349:58): [True: 0, False: 14]
  ------------------
  350|      0|          return true;
  351|     40|      }
  352|    309|    }
  353|    118|    return false;
  354|    118|  }
_ZN9OpenBabel23OBAromaticTyperMolStateC2ERNS_5OBMolE:
  583|  15.0k|    OBAromaticTyperMolState(OBMol &mol) : mol(mol)
  584|  15.0k|    {
  585|  15.0k|      _vpa.resize(mol.NumAtoms() + 1);
  586|  15.0k|      _velec.resize(mol.NumAtoms() + 1);
  587|  15.0k|      _root.resize(mol.NumAtoms() + 1);
  588|  15.0k|      _visit.resize(mol.NumAtoms() + 1);
  589|  15.0k|    }

_ZN18FuzzedDataProviderC2EPKhm:
   37|  15.3k|      : data_ptr_(data), remaining_bytes_(size) {}
_ZN18FuzzedDataProvider25ConsumeRandomLengthStringEv:
  181|  15.3k|inline std::string FuzzedDataProvider::ConsumeRandomLengthString() {
  182|  15.3k|  return ConsumeRandomLengthString(remaining_bytes_);
  183|  15.3k|}
_ZN18FuzzedDataProvider25ConsumeRandomLengthStringEm:
  153|  15.3k|FuzzedDataProvider::ConsumeRandomLengthString(size_t max_length) {
  154|       |  // Reads bytes from the start of |data_ptr_|. Maps "\\" to "\", and maps "\"
  155|       |  // followed by anything else to the end of the string. As a result of this
  156|       |  // logic, a fuzzer can insert characters into the string, and the string
  157|       |  // will be lengthened to include those new characters, resulting in a more
  158|       |  // stable fuzzer than picking the length of a string independently from
  159|       |  // picking its contents.
  160|  15.3k|  std::string result;
  161|       |
  162|       |  // Reserve the anticipated capacity to prevent several reallocations.
  163|  15.3k|  result.reserve(std::min(max_length, remaining_bytes_));
  164|  55.6M|  for (size_t i = 0; i < max_length && remaining_bytes_ != 0; ++i) {
  ------------------
  |  Branch (164:22): [True: 55.6M, False: 4.20k]
  |  Branch (164:40): [True: 55.6M, False: 115]
  ------------------
  165|  55.6M|    char next = ConvertUnsignedToSigned<char>(data_ptr_[0]);
  166|  55.6M|    Advance(1);
  167|  55.6M|    if (next == '\\' && remaining_bytes_ != 0) {
  ------------------
  |  Branch (167:9): [True: 16.1k, False: 55.6M]
  |  Branch (167:25): [True: 16.1k, False: 40]
  ------------------
  168|  16.1k|      next = ConvertUnsignedToSigned<char>(data_ptr_[0]);
  169|  16.1k|      Advance(1);
  170|  16.1k|      if (next != '\\')
  ------------------
  |  Branch (170:11): [True: 11.0k, False: 5.09k]
  ------------------
  171|  11.0k|        break;
  172|  16.1k|    }
  173|  55.6M|    result += next;
  174|  55.6M|  }
  175|       |
  176|  15.3k|  result.shrink_to_fit();
  177|  15.3k|  return result;
  178|  15.3k|}
_ZN18FuzzedDataProvider23ConvertUnsignedToSignedIchEET_T0_:
  378|  55.7M|TS FuzzedDataProvider::ConvertUnsignedToSigned(TU value) {
  379|  55.7M|  static_assert(sizeof(TS) == sizeof(TU), "Incompatible data types.");
  380|  55.7M|  static_assert(!std::numeric_limits<TU>::is_signed,
  381|  55.7M|                "Source type must be unsigned.");
  382|       |
  383|       |  if constexpr (std::numeric_limits<TS>::is_modulo)
  384|       |    return static_cast<TS>(value);
  385|       |
  386|       |  // Avoid using implementation-defined unsigned to signed conversions.
  387|       |  // To learn more, see https://stackoverflow.com/questions/13150449.
  388|  55.7M|  constexpr auto TS_max = static_cast<TU>(std::numeric_limits<TS>::max());
  389|  55.7M|  if (value <= TS_max) {
  ------------------
  |  Branch (389:7): [True: 38.3M, False: 17.3M]
  ------------------
  390|  38.3M|    return static_cast<TS>(value);
  391|  38.3M|  } else {
  392|  17.3M|    constexpr auto TS_min = std::numeric_limits<TS>::min();
  393|  17.3M|    return TS_min + static_cast<TS>(value - TS_min);
  394|  17.3M|  }
  395|  55.7M|}
_ZN18FuzzedDataProvider7AdvanceEm:
  343|  55.7M|inline void FuzzedDataProvider::Advance(size_t num_bytes) {
  344|  55.7M|  if (num_bytes > remaining_bytes_)
  ------------------
  |  Branch (344:7): [True: 0, False: 55.7M]
  ------------------
  345|      0|    abort();
  346|       |
  347|  55.7M|  data_ptr_ += num_bytes;
  348|  55.7M|  remaining_bytes_ -= num_bytes;
  349|  55.7M|}
_ZN18FuzzedDataProvider11ConsumeBoolEv:
  289|  62.9k|inline bool FuzzedDataProvider::ConsumeBool() {
  290|  62.9k|  return 1 & ConsumeIntegral<uint8_t>();
  291|  62.9k|}
_ZN18FuzzedDataProvider15ConsumeIntegralIhEET_v:
  195|  62.9k|template <typename T> T FuzzedDataProvider::ConsumeIntegral() {
  196|  62.9k|  return ConsumeIntegralInRange(std::numeric_limits<T>::min(),
  197|  62.9k|                                std::numeric_limits<T>::max());
  198|  62.9k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIiEET_S1_S1_:
  205|  23.1k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|  23.1k|  static_assert(std::is_integral_v<T>, "An integral type is required.");
  207|  23.1k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|  23.1k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 23.1k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|  23.1k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|  23.1k|  uint64_t result = 0;
  215|  23.1k|  size_t offset = 0;
  216|       |
  217|  46.0k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 46.0k, False: 0]
  |  Branch (217:43): [True: 23.1k, False: 22.9k]
  ------------------
  218|  23.1k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 22.9k, False: 190]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|  22.9k|    --remaining_bytes_;
  226|  22.9k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|  22.9k|    offset += CHAR_BIT;
  228|  22.9k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|  23.1k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 23.1k, False: 0]
  ------------------
  232|  23.1k|    result = result % (range + 1);
  233|       |
  234|  23.1k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|  23.1k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIhEET_S1_S1_:
  205|  63.3k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|  63.3k|  static_assert(std::is_integral_v<T>, "An integral type is required.");
  207|  63.3k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|  63.3k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 63.3k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|  63.3k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|  63.3k|  uint64_t result = 0;
  215|  63.3k|  size_t offset = 0;
  216|       |
  217|   113k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 63.3k, False: 49.8k]
  |  Branch (217:43): [True: 63.3k, False: 0]
  ------------------
  218|  63.3k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 49.8k, False: 13.4k]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|  49.8k|    --remaining_bytes_;
  226|  49.8k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|  49.8k|    offset += CHAR_BIT;
  228|  49.8k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|  63.3k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 63.3k, False: 0]
  ------------------
  232|  63.3k|    result = result % (range + 1);
  233|       |
  234|  63.3k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|  63.3k|}

LLVMFuzzerTestOneInput:
   17|  15.3k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
   18|  15.3k|    if (Size < 2) return 0;
  ------------------
  |  Branch (18:9): [True: 1, False: 15.3k]
  ------------------
   19|       |    
   20|  15.3k|    FuzzedDataProvider fdp(Data, Size);
   21|       |    
   22|       |    // List of common input formats in OpenBabel
   23|  15.3k|    static const std::vector<std::string> formats = {
   24|  15.3k|        "smi", "smiles", "sdf", "mol", "pdb", "ent", "xyz", "cml", "inchi", "mna", "can"
   25|  15.3k|    };
   26|       |    
   27|  15.3k|    int format_idx = fdp.ConsumeIntegralInRange<int>(0, formats.size() - 1);
   28|  15.3k|    std::string format = formats[format_idx];
   29|  15.3k|    std::string input = fdp.ConsumeRandomLengthString();
   30|       |    
   31|  15.3k|    if (input.empty()) return 0;
  ------------------
  |  Branch (31:9): [True: 1, False: 15.3k]
  ------------------
   32|       |
   33|  15.3k|    obErrorLog.StopLogging();
   34|       |
   35|  15.3k|    OBMol mol;
   36|  15.3k|    OBConversion conv;
   37|  15.3k|    if (conv.SetInFormat(format.c_str())) {
  ------------------
  |  Branch (37:9): [True: 15.3k, False: 4]
  ------------------
   38|  15.3k|        if (conv.ReadString(&mol, input)) {
  ------------------
  |  Branch (38:13): [True: 13.8k, False: 1.49k]
  ------------------
   39|       |            // Randomly perform various operations
   40|       |            
   41|  13.8k|            if (fdp.ConsumeBool()) {
  ------------------
  |  Branch (41:17): [True: 8.89k, False: 4.94k]
  ------------------
   42|       |                // Perception routines
   43|  8.89k|                mol.FindSSSR();
   44|  8.89k|                mol.FindLSSR();
   45|  8.89k|                mol.FindRingAtomsAndBonds();
   46|  8.89k|                mol.PerceiveBondOrders();
   47|  8.89k|                mol.FindAngles();
   48|  8.89k|                mol.FindTorsions();
   49|  8.89k|                mol.GetFormula();
   50|  8.89k|                mol.GetMolWt();
   51|  8.89k|                mol.GetExactMass();
   52|  8.89k|            }
   53|       |            
   54|  13.8k|            if (fdp.ConsumeBool()) {
  ------------------
  |  Branch (54:17): [True: 7.64k, False: 6.19k]
  ------------------
   55|       |                // Hydrogens
   56|  7.64k|                if (fdp.ConsumeBool()) {
  ------------------
  |  Branch (56:21): [True: 5.59k, False: 2.05k]
  ------------------
   57|  5.59k|                    mol.AddHydrogens();
   58|  5.59k|                } else {
   59|  2.05k|                    mol.DeleteHydrogens();
   60|  2.05k|                }
   61|  7.64k|            }
   62|       |
   63|  13.8k|            if (fdp.ConsumeBool()) {
  ------------------
  |  Branch (63:17): [True: 8.44k, False: 5.38k]
  ------------------
   64|       |                // 3D Builder
   65|  8.44k|                OBBuilder builder;
   66|  8.44k|                builder.Build(mol);
   67|  8.44k|            }
   68|       |            
   69|  13.8k|            if (fdp.ConsumeBool()) {
  ------------------
  |  Branch (69:17): [True: 7.77k, False: 6.05k]
  ------------------
   70|       |                // Force Fields
   71|  7.77k|                static const std::vector<std::string> ff_names = {
   72|  7.77k|                    "MMFF94", "UFF", "GAFF", "Ghemical"
   73|  7.77k|                };
   74|  7.77k|                int ff_idx = fdp.ConsumeIntegralInRange<int>(0, ff_names.size() - 1);
   75|  7.77k|                std::string ff_name = ff_names[ff_idx];
   76|  7.77k|                OBForceField *ff = OBForceField::FindType(ff_name.c_str());
   77|  7.77k|                if (ff && ff->Setup(mol)) {
  ------------------
  |  Branch (77:21): [True: 7.77k, False: 0]
  |  Branch (77:27): [True: 373, False: 7.40k]
  ------------------
   78|    373|                    ff->Energy();
   79|    373|                    uint8_t min_steps = fdp.ConsumeIntegralInRange<uint8_t>(0, 10);
   80|    373|                    if (min_steps > 0) {
  ------------------
  |  Branch (80:25): [True: 267, False: 106]
  ------------------
   81|    267|                        ff->SteepestDescent(min_steps);
   82|    267|                        ff->ConjugateGradients(min_steps);
   83|    267|                    }
   84|    373|                }
   85|  7.77k|            }
   86|  13.8k|        }
   87|  15.3k|    }
   88|       |
   89|  15.3k|    return 0;
   90|  15.3k|}

