00001 #include "chromatparser.h"
00002 #include <iostream>
00003 #include <qstring.h>
00004 #include <qtextstream.h>
00005 #include <map>
00006 #include <vector>
00007 #include <cassert>
00008
00009 using namespace std;
00010
00011 ChromatParser::ChromatParser() : inDATA(false), curr_tag_num(-1)
00012 {
00013
00014 }
00015
00016 ChromatParser::~ChromatParser()
00017 {
00018
00019 }
00020
00021 bool ChromatParser::startElement( const QString & namespaceURI, const QString & localName,
00022 const QString & qName, const QXmlAttributes & atts)
00023 {
00024
00025 if ( qName == "DATA") {
00026 inDATA = true;
00027 curr_tag_num = atts.value("tag_number").toInt();
00028 }
00029 else if ( qName == "FWO_") {
00030 FWO_ = atts.value("string");
00031
00032
00033 map<char, size_t> fwo_map;
00034 vector<char> fwo_vec(4);
00035
00036 fwo_map['C'] = FWO_.find('C');
00037 fwo_vec[ fwo_map['C'] ] = 'C';
00038 fwo_map['A'] = FWO_.find('A');
00039 fwo_vec[ fwo_map['A'] ] = 'A';
00040 fwo_map['G'] = FWO_.find('G');
00041 fwo_vec[ fwo_map['G'] ] = 'G';
00042 fwo_map['T'] = FWO_.find('T');
00043 fwo_vec[ fwo_map['T'] ] = 'T';
00044
00045
00046 if ( fwo_map['C'] != 0 ) {
00047 (*chromats)[ 0 ].stlVector().swap( (*chromats)[ fwo_map['C'] ].stlVector() );
00048
00049 fwo_map[ fwo_vec[ 0 ] ] = fwo_map['C'];
00050 fwo_vec[ fwo_map['C'] ] = fwo_vec[ 0 ];
00051
00052 fwo_map['C'] = 0;
00053 fwo_vec[ 0 ] = 'C';
00054
00055 }
00056 if ( fwo_map['A'] != 1 ) {
00057 (*chromats)[ 1 ].stlVector().swap( (*chromats)[ fwo_map['A'] ].stlVector() );
00058
00059 fwo_map[ fwo_vec[ 1 ] ] = fwo_map['A'];
00060 fwo_vec[ fwo_map['A'] ] = fwo_vec[ 1 ];
00061
00062 fwo_map['A'] = 1;
00063 fwo_vec[ 1 ] = 'A';
00064
00065 }
00066 if ( fwo_map['G'] != 2 ) {
00067 (*chromats)[ 2 ].stlVector().swap( (*chromats)[ fwo_map['G'] ].stlVector() );
00068
00069 fwo_map[ fwo_vec[ 2 ] ] = fwo_map['G'];
00070 fwo_vec[ fwo_map['G'] ] = fwo_vec[ 2 ];
00071
00072 fwo_map['G'] = 2;
00073 fwo_vec[ 2 ] = 'G';
00074
00075 }
00076 if ( fwo_map['T'] != 3 ) {
00077 (*chromats)[ 3 ].stlVector().swap( (*chromats)[ fwo_map['T'] ].stlVector() );
00078
00079 fwo_map[ fwo_vec[ 3 ] ] = fwo_map['T'];
00080 fwo_vec[ fwo_map['T'] ] = fwo_vec[ 3 ];
00081
00082 fwo_map['T'] = 3;
00083 fwo_vec[ 3 ] = 'T';
00084
00085 }
00086 assert( fwo_map['C'] == 0 );
00087 assert( fwo_map['A'] == 1 );
00088 assert( fwo_map['G'] == 2 );
00089 assert( fwo_map['T'] == 3 );
00090
00091 assert( fwo_vec[0] == 'C' );
00092 assert( fwo_vec[1] == 'A' );
00093 assert( fwo_vec[2] == 'G' );
00094 assert( fwo_vec[3] == 'T' );
00095
00096 }
00097 else if ( inDATA &&
00098 qName == "integer16" &&
00099 curr_tag_num > 8 &&
00100 curr_tag_num < 13) {
00101
00102 QString array = atts.value("value");
00103 QTextStream ts(&array, IO_ReadOnly);
00104
00105 while ( !ts.atEnd()) {
00106 int val;
00107 ts>>val;
00108 (*chromats)[ curr_tag_num - 9 ].stlVector().push_back(val);
00109 }
00110
00111
00112 }
00113
00114 return true;
00115 }
00116
00117 bool ChromatParser::endElement( const QString & namespaceURI, const QString & localName,
00118 const QString & qName )
00119 {
00120 if ( qName == "DATA") {
00121 inDATA = false;
00122 }
00123
00124 return true;
00125 }
00126
00127 void ChromatParser::set_result_array(vector<TrapperVector<Q_UINT32> >* array)
00128 {
00129 chromats = array;
00130 chromats->clear();
00131 TrapperVector<Q_UINT32> tmp;
00132
00133 chromats->push_back(tmp);
00134 chromats->push_back(tmp);
00135 chromats->push_back(tmp);
00136 chromats->push_back(tmp);
00137
00138 }
00139