예제 #1
0
Counter
Calculator::Calculate(Options* o, const std::vector<Scaffold*>& scaffolds)
{
   	Counter counter;
   	Scaffold* s;

   	// Print title line
   	if (o->OutFilename().empty())
   	{
      	std::cout << "NAME\tMOLECULE";
   	}
   	else
   	{
      	*(o->OutStream()) << "NAME\tMOLECULE";
   	}
   	for (unsigned int i(0); i < scaffolds.size(); ++i)
   	{
      	s = dynamic_cast<Scaffold*>(scaffolds[i]);
      	if (o->OutFilename().empty())
      	{
        	std::cout << "\t" << s->PrintName();
      	}
      	else
      	{
         	*(o->OutStream()) << "\t" << s->PrintName();
      	}
   	}
   	if (o->OutFilename().empty())
   	{
     	std::cout << std::endl;
   	}
   	else
   	{
      	*(o->OutStream()) << std::endl;
    }
      
   	// Process molecules
   	OpenBabel::OBMol mol;
   	std::string title;
   	OpenBabel::OBConversion mol2can;
   	mol2can.SetOutFormat("can");
   	mol2can.AddOption("n", OpenBabel::OBConversion::OUTOPTIONS);
		
	// first set the stream (needed in case of a zip stream)
    o->InputConverter()->SetInStream(o->InputStream());
   	while (o->InputConverter()->Read(&mol))
   	{
      	// Drop stereo information
      	mol.DeleteData(OpenBabel::OBGenericDataType::StereoData);

      	// Extract a suitable title from molecule
      	counter.NewMolecule();
      	title.clear();
      	title = mol.GetTitle();
      	if (title == "")
      	{
         	mol.SetTitle(mol2can.WriteString(&mol, true).c_str());
      	}
      	if (o->OutFilename().empty())
      	{
         	std::cout << mol.GetTitle();
      	}
      	else
      	{
         	*(o->OutStream()) << mol.GetTitle();
      	}
      	
		// Print smiles
      	if (o->OutFilename().empty())
      	{
         	std::cout << "\t" << mol2can.WriteString(&mol, true);
      	}
      	else
      	{
         	*(o->OutStream()) << "\t" << mol2can.WriteString(&mol, true);
      	}
      
      	// Extract scaffolds
      	for (unsigned int i(0); i < scaffolds.size(); ++i)
      	{
         	s = dynamic_cast<Scaffold*>(scaffolds[i]);
         	if (s->CalculateScaffold(mol, o))
         	{
            	counter.NewScaffold();
         	}
         	else
         	{
            	counter.FailedScaffold();
         	}
         	if (o->OutFilename().empty())
         	{
            	std::cout << "\t" << s->PrintScaffold();
         	}
         	else
         	{
            	*(o->OutStream()) << "\t" << s->PrintScaffold();
         	}
      	}
      	if (o->OutFilename().empty())
      	{
         	std::cout << std::endl;
      	}
      	else
      	{
         	*(o->OutStream()) << std::endl;
      	}
      	mol.Clear();
   	}

   	// Return
   	return counter;
}