1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <numeric>
#include <exception>
#include <map>
using namespace std;
//Fonction pour faire la somme des éléments d'un map.
template <class R, class A1, class A2>
struct map_value_adder
{
R operator()(R prev, const std::pair<A1,A2>& value)
{
return prev + value.second;
}
};
template <class A1, class A2>
struct map_value_adder<typename std::vector<A2>::value_type, A1, std::vector<A2> >
{
typedef typename std::vector<A2>::value_type result_type;
result_type operator()(result_type prev, const std::pair<A1,A2>& value)
{
std::vector<A2> & v = value.second;
return std::accumulate(v.begin(), v.end(), prev);
}
};
int main ()
{
// Creer mon tableau contenant les noms des èspéces et l'inserer dans un vecteur.
const char* espece[] =
{ "homo_sapiens", "pan_troglodytes", "gorilla_gorilla", "pongo_pygmaeus",
"macaca_mulatta", "callithrix_jacchus", "mus_musculus", "rattus_norvegicus",
"canis_familiaris", "bos_taurus", "sus_scrofa", "equus_caballus" };
set<string> especes;
especes.insert (espece, espece + 12);
ofstream fichier3 ("Alignement12Espces.txt", ios::out | ios::trunc); // Fichier pour recuperer tous les alignements dans lesquels les 12 éspèces sont présentes.
ifstream fichier ("Compara.12_eutherian_mammals_EPO.chr10_1.emf"); // ouvrir un fichier en lecture
ofstream fichier2 ("information.txt", ios::out | ios::trunc); // ouverture en écriture avec effacement du fichier ouvert
if(not fichier)
{
// ce test échoue si le fichier n'est pas ouvert
cerr << "fichier n'a pas pu être ouvert." << endl;
throw exception();
}
map<string, vector<int> > tailles_marqueurs;
map<string, map<string, int> > chromosome_sizes;
//map<string, vector<int> > tailles_marqueurs;
int n=0;//TODO Compteur de lignes
// On saute les six premières lignes
string part; // variable contenant chaque partie lue
for(unsigned i=0; i<6; ++i)
getline(fichier, part);
while( getline(fichier, part, '/') )
{
if(part=="")
continue;
fichier2 << part << endl;
fichier2 << "TOTO" << endl;
stringstream partSS (part);
string ligne; // variable contenant chaque ligne lue
while( getline(partSS, ligne) )
{
// {TODO
++n;
//cout << "ligne " << n << " : " << ligne << endl;
// TODO}
if(ligne.substr(0,3) == "SEQ")
{
stringstream ligneSS (ligne);
string espece;
string id_chromosome;
int debut_marqueur;
int fin_marqueur;
int sens;
string taille_chr_string;
int taille_chr;
ligneSS >> espece; // "SEQ"
ligneSS >> espece;
ligneSS >> id_chromosome;
ligneSS >> debut_marqueur;
ligneSS >> fin_marqueur;
ligneSS >> sens;
ligneSS >> taille_chr_string;
stringstream taille_chr_strstream (taille_chr_string.substr(12, taille_chr_string.size()-13));
taille_chr_strstream >> taille_chr;
int taille_marqueur = fin_marqueur - debut_marqueur;
tailles_marqueurs[espece].push_back(taille_marqueur);
chromosome_sizes[espece][id_chromosome] = taille_chr;
}
}
}
cout << "Il y a " << tailles_marqueurs["homo_sapiens"].size() << " marqueurs pour l'homme. Les tailles sont :" << endl;
for(vector<int>::iterator m = tailles_marqueurs["homo_sapiens"].begin(); m != tailles_marqueurs["homo_sapiens"].end(); ++m)
fichier2 << *m << " \t";
int first_value = 0;
int result = accumulate(
tailles_marqueurs.begin(),
tailles_marqueurs.end(),
first_value,
map_value_adder<int, string, vector<int> >()
)
fichier2 << result << endl;
}
Merci de votre aide! |