52 throw IOException(
"Genepop::read: fail to open stream.");
54 FileTools::getNextLine(is);
55 ios::pos_type entry_point = is.tellg();
57 bool loc_def_ok =
false;
58 bool loc_nbr_ok =
false;
60 vector<LocusInfo> tmp_loc;
61 vector<set<string> > al_ids;
62 map<string, size_t> ind_id_count;
63 map<string, size_t> ind_id_index;
69 if (is.peek() == EOF && !eof_ok)
72 is.seekg(entry_point);
78 temp = FileTools::getNextLine(is);
79 string cp_temp = TextTools::removeSurroundingWhiteSpaces(temp);
80 cp_temp = TextTools::toUpper(cp_temp);
81 if (cp_temp ==
string(
"POP"))
85 data_set.addEmptyGroup(grp_nbr);
89 StringTokenizer st(temp,
string(
", "),
true);
90 while (st.hasMoreToken())
91 tmp_loc.push_back(
LocusInfo(TextTools::removeSurroundingWhiteSpaces(st.nextToken())));
93 if (loc_def_ok && !loc_nbr_ok)
95 al_ids.resize(tmp_loc.size());
101 StringTokenizer st(temp,
string(
","));
102 if (st.numberOfRemainingTokens() == 2)
104 ind_id_count[TextTools::removeSurroundingWhiteSpaces(st.nextToken())]++;
105 alleles = st.nextToken();
107 StringTokenizer st2(alleles);
108 if ((
size_t)st2.numberOfRemainingTokens() == tmp_loc.size())
111 while (st2.hasMoreToken())
113 string ids = TextTools::removeSurroundingWhiteSpaces(st2.nextToken());
114 string tmp_id = string(ids.begin(), ids.begin() + (ids.size() / 2));
115 if (tmp_id !=
string(
"00") && tmp_id !=
string(
"000"))
116 al_ids[i].insert(tmp_id);
117 tmp_id = string(ids.begin() + (ids.size() / 2), ids.end());
118 if (tmp_id !=
string(
"00") && tmp_id != string(
"000"))
119 al_ids[i].insert(tmp_id);
128 data_set.initAnalyzedLoci(tmp_loc.size());
129 for (
size_t i = 0; i < tmp_loc.size(); i++)
131 data_set.setLocusInfo(i, tmp_loc[i]);
132 for (set<string>::iterator it = al_ids[i].begin(); it != al_ids[i].end(); it++)
144 temp = FileTools::getNextLine(is);
145 string cp_temp = TextTools::removeSurroundingWhiteSpaces(temp);
146 cp_temp = TextTools::toUpper(cp_temp);
147 if (cp_temp ==
string(
"POP"))
151 grp_pos = data_set.getGroupPosition(grp_nbr);
158 StringTokenizer st(temp,
string(
","));
160 if (st.numberOfRemainingTokens() == 2)
162 string ind_id = TextTools::removeSurroundingWhiteSpaces(st.nextToken());
163 if (ind_id_count[ind_id] > 1)
164 ind_id = ind_id + string(
"_") + TextTools::toString(++ind_id_index[ind_id]);
165 data_set.addEmptyIndividualToGroup(grp_pos, ind_id);
166 ind_pos = data_set.getIndividualPositionInGroup(grp_pos, ind_id);
167 data_set.initIndividualGenotypeInGroup(grp_pos, ind_pos);
168 alleles = st.nextToken();
170 StringTokenizer st2(alleles);
171 if ((
size_t)st2.numberOfRemainingTokens() == tmp_loc.size())
174 while (st2.hasMoreToken())
176 string ids = TextTools::removeSurroundingWhiteSpaces(st2.nextToken());
177 vector<string> tmp_ids;
178 tmp_ids.push_back(
string(ids.begin(), ids.begin() + (ids.size() / 2)));
179 tmp_ids.push_back(
string(ids.begin() + (ids.size() / 2), ids.end()));
180 if (tmp_ids[0] !=
string(
"00") && tmp_ids[0] != string(
"000")
181 && tmp_ids[1] != string(
"00") && tmp_ids[1] != string(
"000"))
183 data_set.setIndividualMonolocusGenotypeByAlleleIdInGroup(grp_pos, ind_pos, i, tmp_ids);
void read(std::istream &is, DataSet &data_set)
Read a DataSet on istream.
virtual void read(std::istream &is, DataSet &data_set)=0
Read a DataSet on istream.
The BasicAlleleInfo class.