本文整理汇总了C++中OBSmartsPattern::GetMapList方法的典型用法代码示例。如果您正苦于以下问题:C++ OBSmartsPattern::GetMapList方法的具体用法?C++ OBSmartsPattern::GetMapList怎么用?C++ OBSmartsPattern::GetMapList使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OBSmartsPattern
的用法示例。
在下文中一共展示了OBSmartsPattern::GetMapList方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Do
//.........这里部分代码省略.........
nPatternAtoms = patmol.NumHvyAtoms();
}
}
else
nPatternAtoms = 0;
//disable old versions
pConv->AddOption(GetID(), OBConversion::GENOPTIONS, "");
}
bool match;
//These are a vector of each mapping, each containing atom indxs.
vector<vector<int> > vecatomvec;
vector<vector<int> >* pMappedAtoms = NULL;
OBSmartsPattern sp;
if(nPatternAtoms)
if(pmol->NumHvyAtoms() != nPatternAtoms)
return false;
int imol=0; //index of mol in pattern file
if(!queries.empty()) //filename supplied
{
//match is set true if any of the structures match - OR behaviour
for(qiter=queries.begin();qiter!=queries.end();++qiter, ++imol)
{
OBIsomorphismMapper* mapper = OBIsomorphismMapper::GetInstance(*qiter);
OBIsomorphismMapper::Mappings mappings;
mapper->MapUnique(pmol, mappings);
if( (match = !mappings.empty()) ) // extra parens to indicate truth value
{
OBIsomorphismMapper::Mappings::iterator ita;
OBIsomorphismMapper::Mapping::iterator itb;
for(ita=mappings.begin(); ita!=mappings.end();++ita)//each mapping
{
vector<int> atomvec;
for(itb=ita->begin(); itb!=ita->end();++itb)//each atom index
atomvec.push_back(itb->second+1);
vecatomvec.push_back(atomvec);
atomvec.clear();
}
pMappedAtoms = &vecatomvec;
break;
}
}
}
else //SMARTS supplied
{
if(!sp.Init(vec[0]))
{
string msg = vec[0] + " cannot be interpreted as either valid SMARTS "
"or the name of a file with an extension known to OpenBabel "
"that contains one or more pattern molecules.";
obErrorLog.ThrowError(__FUNCTION__, msg, obError, onceOnly);
delete pmol;
pmol = NULL;
pConv->SetOneObjectOnly(); //stop conversion
return false;
}
if( (match = sp.Match(*pmol)) ) // extra parens to indicate truth value
pMappedAtoms = &sp.GetMapList();
}
if((!match && !inv) || (match && inv))
{
//delete a non-matching mol
delete pmol;
pmol = NULL;
return false;
}
if(!inv && vec.size()>=2 && !vec[1].empty() && !nPatternAtoms)
{
vector<vector<int> >::iterator iter;
if(vec[1]=="extract")
{
//Delete all unmatched atoms. Use only the first match
ExtractSubstruct(pmol, *pMappedAtoms->begin());
return true;
}
// color the substructure if there is a second parameter which is not "exact" or "extract"
// with multiple color parameters use the one corresponding to the query molecule, or the last
if(imol>vec.size()-2)
imol = vec.size()-2;
for(iter=pMappedAtoms->begin();iter!=pMappedAtoms->end();++iter)//each match
AddDataToSubstruct(pmol, *iter, "color", vec[imol+1]);
return true;
}
if(pConv && pConv->IsLast())
{
for(qiter=queries.begin();qiter!=queries.end();++qiter)
delete *qiter;
queries.clear();
}
return true;
}
示例2: main
//.........这里部分代码省略.........
// No incompleted jobs. Sleep for a while.
if (!sleeping) cout << local_time() << "Sleeping" << endl;
sleeping = true;
this_thread::sleep_for(chrono::seconds(10));
continue;
}
sleeping = false;
const auto job = value.Obj();
// Obtain job properties.
const auto _id = job["_id"].OID();
cout << local_time() << "Executing job " << _id.str() << endl;
const auto job_path = jobs_path / _id.str();
const auto format = job["format"].String();
const auto email = job["email"].String();
// Parse the user-supplied ligand.
OBMol obMol;
OBConversion obConversion;
obConversion.SetInFormat(format.c_str());
obConversion.ReadFile(&obMol, (job_path / ("ligand." + format)).string());
const auto num_atoms = obMol.NumAtoms();
// obMol.AddHydrogens(); // Adding hydrogens does not seem to affect SMARTS matching.
// Classify subset atoms.
array<vector<int>, num_subsets> subsets;
for (size_t k = 0; k < num_subsets; ++k)
{
auto& subset = subsets[k];
subset.reserve(num_atoms);
OBSmartsPattern smarts;
smarts.Init(SubsetSMARTS[k]);
smarts.Match(obMol);
for (const auto& map : smarts.GetMapList())
{
subset.push_back(map.front());
}
}
const auto& subset0 = subsets.front();
// Check user-provided ligand validity.
if (subset0.empty())
{
// Record job completion time stamp.
const auto millis_since_epoch = duration_cast<std::chrono::milliseconds>(system_clock::now().time_since_epoch()).count();
conn.update(collection, BSON("_id" << _id), BSON("$set" << BSON("done" << Date_t(millis_since_epoch))));
// Send error notification email.
cout << local_time() << "Sending an error notification email to " << email << endl;
MailMessage message;
message.setSender("usr <[email protected]>");
message.setSubject("Your usr job has failed");
message.setContent("Description: " + job["description"].String() + "\nSubmitted: " + to_simple_string(ptime(epoch, boost::posix_time::milliseconds(job["submitted"].Date().millis))) + " UTC\nFailed: " + to_simple_string(ptime(epoch, boost::posix_time::milliseconds(millis_since_epoch))) + " UTC\nReason: failed to parse the provided ligand.");
message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, email));
SMTPClientSession session("137.189.91.190");
session.login();
session.sendMessage(message);
session.close();
continue;
}
// Calculate the four reference points.
const auto n = subset0.size();
const auto v = 1.0 / n;
array<vector3, num_references> references{};
auto& ctd = references[0];
示例3: main
int main(int argc, char* argv[])
{
const array<string, 5> SmartsPatterns =
{
"[!#1]", // heavy
"[#6+0!$(*~[#7,#8,F]),SH0+0v2,s+0,S^3,Cl+0,Br+0,I+0]", // hydrophobic
"[a]", // aromatic
"[$([O,S;H1;v2]-[!$(*=[O,N,P,S])]),$([O,S;H0;v2]),$([O,S;-]),$([N&v3;H1,H2]-[!$(*=[O,N,P,S])]),$([N;v3;H0]),$([n,o,s;+0]),F]", // acceptor
"[N!H0v3,N!H0+v4,OH+0,SH+0,nH+0]", // donor
};
OBConversion obConversion;
obConversion.SetInFormat("pdbqt");
while (true)
{
vector<array<double, 3>> atoms;
atoms.reserve(80);
stringstream ss;
for (string line; getline(cin, line);)
{
ss << line << endl;
const auto record = line.substr(0, 6);
if (record == "TORSDO") break;
if (record != "ATOM " && record != "HETATM") continue;
atoms.push_back({ stod(line.substr(30, 8)), stod(line.substr(38, 8)), stod(line.substr(46, 8)) });
}
if (atoms.empty()) break;
OBMol obMol;
obConversion.Read(&obMol, &ss);
array<vector<int>, 5> subsets;
for (size_t k = 0; k < 5; ++k)
{
auto& subset = subsets[k];
subset.reserve(atoms.size());
OBSmartsPattern smarts;
smarts.Init(SmartsPatterns[k]);
smarts.Match(obMol);
for (const auto& map : smarts.GetMapList())
{
subset.push_back(map.front() - 1);
}
}
const auto& subset0 = subsets.front();
const auto n = subset0.size();
const auto v = 1.0 / n;
array<double, 3> ctd{};
array<double, 3> cst{};
array<double, 3> fct{};
array<double, 3> ftf{};
for (size_t k = 0; k < 3; ++k)
{
for (const auto i : subset0)
{
const auto& a = atoms[i];
ctd[k] += a[k];
}
ctd[k] *= v;
}
double cst_dist = numeric_limits<double>::max();
double fct_dist = numeric_limits<double>::lowest();
double ftf_dist = numeric_limits<double>::lowest();
for (const auto i : subset0)
{
const auto& a = atoms[i];
const auto this_dist = dist2(a, ctd);
if (this_dist < cst_dist)
{
cst = a;
cst_dist = this_dist;
}
if (this_dist > fct_dist)
{
fct = a;
fct_dist = this_dist;
}
}
for (const auto i : subset0)
{
const auto& a = atoms[i];
const auto this_dist = dist2(a, fct);
if (this_dist > ftf_dist)
{
ftf = a;
ftf_dist = this_dist;
}
}
for (const auto& subset : subsets)
{
const auto n = subset.size();
const auto v = 1.0 / n;
for (const auto& rpt : { ctd, cst, fct, ftf })
{
vector<double> dists(n);
for (size_t i = 0; i < n; ++i)
{
dists[i] = sqrt(dist2(atoms[subset[i]], rpt));
}
array<double, 3> m{};
for (size_t i = 0; i < n; ++i)
{
const auto d = dists[i];
//.........这里部分代码省略.........