本文整理汇总了C++中OBMol::IsReaction方法的典型用法代码示例。如果您正苦于以下问题:C++ OBMol::IsReaction方法的具体用法?C++ OBMol::IsReaction怎么用?C++ OBMol::IsReaction使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OBMol
的用法示例。
在下文中一共展示了OBMol::IsReaction方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: WriteMolecule
bool ReactionInChIFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if (pmol == NULL || !pmol->IsReaction())
return false;
ostream &ofs = *pConv->GetOutStream();
OBFormat* pInChIFormat = OBConversion::FindFormat("inchi");
if (!pInChIFormat)
return false;
bool isEquilibrium = pConv->IsOption("e");
OBConversion inchiconv;
inchiconv.SetOutFormat(pInChIFormat);
stringstream ss;
inchiconv.SetOutStream(&ss);
#define M_REACTANTS 0
#define M_PRODUCTS 1
#define M_AGENTS 2
OBReactionFacade facade(pmol);
std::vector<std::vector<std::string> > inchis(3);
unsigned int nonInchi[3] = { 0, 0, 0 };
bool hasNonInchi = false;
OBMol mol;
for (int part = 0; part <= 2; ++part) {
unsigned int N;
switch (part) {
case M_REACTANTS: N = facade.NumComponents(REACTANT); break;
case M_PRODUCTS: N = facade.NumComponents(PRODUCT); break;
case M_AGENTS: N = facade.NumComponents(AGENT); break;
}
for (unsigned int i = 0; i < N; ++i) {
mol.Clear();
switch (part) {
case M_REACTANTS: facade.GetComponent(&mol, REACTANT, i); break;
case M_PRODUCTS: facade.GetComponent(&mol, PRODUCT, i); break;
case M_AGENTS: facade.GetComponent(&mol, AGENT, i); break;
}
if (mol.NumAtoms() == 1 && mol.GetFirstAtom()->GetAtomicNum() == 0) {
// This represents an unknown component
nonInchi[part]++;
hasNonInchi = true;
}
else {
bool ok = inchiconv.Write(&mol);
if (!ok) {
nonInchi[part]++;
hasNonInchi = true;
}
else {
string inchi = ss.str();
if (strncmp(inchi.c_str(), "InChI=1S/", 9) != 0)
return false;
inchis[part].push_back(TrimInChI(inchi.c_str()));
}
ss.str("");
}
}
}
std::sort(inchis[M_REACTANTS].begin(), inchis[M_REACTANTS].end());
std::sort(inchis[M_PRODUCTS].begin(), inchis[M_PRODUCTS].end());
std::sort(inchis[M_AGENTS].begin(), inchis[M_AGENTS].end());
std::string reactants_string = "";
const int rsize = inchis[M_REACTANTS].size();
for (int i = 0; i < rsize; ++i) {
if (i > 0)
reactants_string += '!';
reactants_string += inchis[M_REACTANTS][i];
}
std::string products_string = "";
const int psize = inchis[M_PRODUCTS].size();
for (int i = 0; i < psize; ++i) {
if (i > 0)
products_string += '!';
products_string += inchis[M_PRODUCTS][i];
}
bool reactants_first = reactants_string <= products_string;
ofs << RINCHI_VERSION_STRING;
if (rsize > 0 || psize > 0 || !inchis[M_AGENTS].empty()) {
ofs << (reactants_first ? reactants_string : products_string);
ofs << "<>";
ofs << (reactants_first ? products_string : reactants_string);
if (!inchis[M_AGENTS].empty()) {
ofs << "<>";
for (std::vector<std::string>::const_iterator vit = inchis[M_AGENTS].begin(); vit != inchis[M_AGENTS].end(); ++vit) {
if (vit != inchis[M_AGENTS].begin())
ofs << '!';
ofs << *vit;
}
}
}
ofs << "/d";
//.........这里部分代码省略.........
示例2: WriteMolecule
bool RXNFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if (pmol == NULL || !pmol->IsReaction())
return false;
pConv->AddOption("no$$$$",OBConversion::OUTOPTIONS);
OBFormat* pMolFormat = pConv->FindFormat("MOL");
if(pMolFormat==NULL)
{
obErrorLog.ThrowError(__FUNCTION__, "MDL MOL format not available", obError);
return false;
}
OBReactionFacade rxnfacade(pmol);
HandleAgent handleagent = ReadAgentOption(pConv->IsOption("G"));
bool hasAgent = rxnfacade.NumComponents(AGENT) > 0;
bool agentInReactants, agentInProducts;
if (hasAgent && (handleagent==BOTH_REACT_AND_PROD || handleagent==AS_REACT))
agentInReactants = true;
else
agentInReactants = false;
if (hasAgent && (handleagent==BOTH_REACT_AND_PROD || handleagent==AS_PROD))
agentInProducts = true;
else
agentInProducts = false;
ostream &ofs = *pConv->GetOutStream();
ofs << "$RXN" << '\n';
ofs << pmol->GetTitle() << '\n';
ofs << " OpenBabel" << '\n';
//ofs << pReact->GetComment() << '\n';
ofs << "\n";
ofs << setw(3);
if (agentInReactants)
ofs << rxnfacade.NumComponents(REACTANT) + rxnfacade.NumComponents(AGENT);
else
ofs << rxnfacade.NumComponents(REACTANT);
ofs << setw(3);
if (agentInProducts)
ofs << rxnfacade.NumComponents(PRODUCT) + rxnfacade.NumComponents(AGENT);
else
ofs << rxnfacade.NumComponents(PRODUCT);
if (hasAgent && handleagent==AS_AGENT)
ofs << setw(3) << rxnfacade.NumComponents(AGENT);
ofs << '\n';
// Write reactants
OBMol mol;
for(unsigned int i=0; i<rxnfacade.NumComponents(REACTANT); i++) {
mol.Clear();
rxnfacade.GetComponent(&mol, REACTANT, i);
WriteMolFile(&mol, pConv, pMolFormat);
}
if (agentInReactants)
WriteAgents(mol, rxnfacade, pConv, pMolFormat);
// Write products
for(unsigned int i=0; i<rxnfacade.NumComponents(PRODUCT); i++) {
mol.Clear();
rxnfacade.GetComponent(&mol, PRODUCT, i);
WriteMolFile(&mol, pConv, pMolFormat);
}
if (agentInProducts)
WriteAgents(mol, rxnfacade, pConv, pMolFormat);
// Write agent out (if treating AS_AGENT)
if(hasAgent && handleagent==AS_AGENT)
WriteAgents(mol, rxnfacade, pConv, pMolFormat);
return true;
}
示例3: ReadChemObjectImpl
bool OBMoleculeFormat::ReadChemObjectImpl(OBConversion* pConv, OBFormat* pFormat)
{
std::istream *ifs = pConv->GetInStream();
if (!ifs || !ifs->good())
return false;
OBMol* pmol = new OBMol;
if(pConv->IsOption("C",OBConversion::GENOPTIONS))
return DeferMolOutput(pmol, pConv, pFormat);
bool ret=true;
if(pConv->IsOption("separate",OBConversion::GENOPTIONS))
{
//On first call, separate molecule and put fragments in MolArray.
//On subsequent calls, remove a fragment from MolArray and send it for writing
//Done this way so that each fragment can be written to its own file (with -m option)
if(!StoredMolsReady)
{
while(ret) //do all the molecules in the file
{
ret = pFormat->ReadMolecule(pmol,pConv);
if(ret && (pmol->NumAtoms() > 0 || (pFormat->Flags()&ZEROATOMSOK)))
{
vector<OBMol> SepArray = pmol->Separate(); //use un-transformed molecule
//Add an appropriate title to each fragment
if(SepArray.size()>1)
for (unsigned int i=0; i<SepArray.size(); ++i)
{
stringstream ss;
ss << pmol->GetTitle() << '#' << i+1;
string title = ss.str();
SepArray[i].SetTitle(title);
}
else
SepArray[0].SetTitle(pmol->GetTitle());
copy(SepArray.begin(),SepArray.end(),back_inserter(MolArray));
}
}
reverse(MolArray.begin(),MolArray.end());
StoredMolsReady = true;
//Clear the flags of the input stream(which may have found eof) to ensure will
//try to read anothe molecule and allow the stored ones to be sent for output.
pConv->GetInStream()->clear();
}
if(MolArray.empty()) //normal end of fragments
ret =false;
else
{
// Copying is needed because the OBMol passed to AddChemObject will be deleted.
// The OBMol in the vector is deleted here.
OBMol* pMolCopy = new OBMol( MolArray.back());
MolArray.pop_back();
ret = pConv->AddChemObject(
pMolCopy->DoTransformations(pConv->GetOptions(OBConversion::GENOPTIONS), pConv))!=0;
}
if(!ret)
StoredMolsReady = false;
delete pmol;
return ret;
}
ret=pFormat->ReadMolecule(pmol,pConv);
OBMol* ptmol = NULL;
//Molecule is valid if it has some atoms
//or it represents a reaction
//or the format allows zero-atom molecules and it has a title or properties
if(ret && (pmol->NumAtoms() > 0
|| pmol->IsReaction()
|| (pFormat->Flags()&ZEROATOMSOK && (*pmol->GetTitle() || pmol->HasData(1)))))
{
ptmol = static_cast<OBMol*>(pmol->DoTransformations(pConv->GetOptions(OBConversion::GENOPTIONS),pConv));
if(ptmol && (pConv->IsOption("j",OBConversion::GENOPTIONS)
|| pConv->IsOption("join",OBConversion::GENOPTIONS)))
{
//With j option, accumulate all mols in one stored in this class
if(pConv->IsFirstInput())
_jmol = new OBMol;
pConv->AddChemObject(_jmol);
//will be discarded in WriteChemObjectImpl until the last input mol. This complication
//is needed to allow joined molecules to be from different files. pOb1 in AddChem Object
//is zeroed at the end of a file and _jmol is in danger of not being output.
*_jmol += *ptmol;
delete ptmol;
return true;
}
}
else
delete pmol;
// Normal operation - send molecule to be written
ret = ret && (pConv->AddChemObject(ptmol)!=0); //success of both writing and reading
return ret;
}