void OBOrbitalData::LoadBetaOrbitals(std::vector<double> energies, std::vector<std::string> symmetries, int betaHOMO) { if (energies.size() < symmetries.size()) return; // something is very weird -- it's OK to pass no symmetries (we'll assume "A") if (energies.size() == 0) return; if (betaHOMO > energies.size()) return; _betaHOMO = betaHOMO; _betaOrbitals.clear(); _openShell = true; if (symmetries.size() < energies.size()) // pad with "A" symmetry for (unsigned int i = symmetries.size(); i < energies.size(); ++i) symmetries.push_back("A"); OBOrbital currentOrbital; for (unsigned int i = 0; i < energies.size(); ++i) { if (i < betaHOMO) currentOrbital.SetData(energies[i], 2.0, symmetries[i]); else currentOrbital.SetData(energies[i], 0.0, symmetries[i]); _betaOrbitals.push_back(currentOrbital); } }
/** Method reads orbital information from input stream (ifs) and writes them to supplied OBMol object (molecule). Input stream must be set to begining of orbital data section in nwo file. (Line after "... Molecular Orbital Analysis") Stream will be set at next line after end of orbital section. */ void NWChemOutputFormat::ReadOrbitals(istream* ifs, OBMol* molecule) { if ((ifs == NULL) || (molecule == NULL)) return; vector<string> vs; char buffer[BUFF_SIZE]; vector<OBOrbital> orbitals; OBOrbitalData* orbital_data = new OBOrbitalData; ifs->getline(buffer, BUFF_SIZE); // --------- ifs->getline(buffer, BUFF_SIZE); // blank line while (ifs->getline(buffer,BUFF_SIZE)) { if (strstr(buffer, ORBITAL_START_PATTERN)) { tokenize(vs, buffer); // Vector N Occ=X E= Y Symmetry=a' // 0 1 2 3 4 5(optional) if (vs.size() < 5) break; // Orbital data is broken double energy = atof(vs[4].c_str()) * HARTREE_TO_KCAL; double occupation = atof(vs[2].c_str()+4); // Start from symbol after '=' string symbol; if (vs.size() > 5) symbol = vs[5].substr(9, string::npos); else symbol = " "; // Symmetry is unknown OBOrbital orbital; orbital.SetData(energy, occupation, symbol); orbitals.push_back(orbital); ifs->getline(buffer, BUFF_SIZE); // MO Center ... ifs->getline(buffer, BUFF_SIZE); // Table header ifs->getline(buffer,BUFF_SIZE); // ---------- while (ifs->getline(buffer,BUFF_SIZE)) if (strlen(buffer) < 2) // If blank line detected break; }// if Vector ... else if ((strstr(buffer, ORBITAL_SECTION_PATTERN_2) != NULL)&&(strstr(buffer, ORBITAL_SECTION_PATTERN_1) != NULL)) { orbital_data->SetAlphaOrbitals(orbitals); orbital_data->SetOpenShell(true); orbitals.clear(); ifs->getline(buffer, BUFF_SIZE); // --------- ifs->getline(buffer, BUFF_SIZE); // blank line }// if beta orbital section found else { if (orbital_data->IsOpenShell()) orbital_data->SetBetaOrbitals(orbitals); else orbital_data->SetAlphaOrbitals(orbitals); molecule->SetData(orbital_data); return; } } delete orbital_data; }