Changeset 150 for cpp/frams/genetics/geno.cpp
- Timestamp:
- 03/01/14 22:05:02 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/genetics/geno.cpp
r145 r150 8 8 9 9 SListTempl<GenoValidator*> Geno::validators; 10 GenoConvManager *Geno::converters =NULL;11 12 void Geno::init(const SString& genstring, char genformat,const SString& genname,const SString& comment)13 { 14 refcount=1;15 owner=0;16 f0gen=0;17 mapinshift=0;18 mapoutshift=0;19 isvalid=-1;20 SString gencopy(genstring);21 if (genformat==-1)10 GenoConvManager *Geno::converters = NULL; 11 12 void Geno::init(const SString& genstring, char genformat, const SString& genname, const SString& comment) 13 { 14 refcount = 1; 15 owner = 0; 16 f0gen = 0; 17 mapinshift = 0; 18 mapoutshift = 0; 19 isvalid = -1; 20 SString gencopy(genstring); 21 if (genformat == -1) 22 22 { // unknown format 23 genformat='1';24 if (genstring.charAt(0)=='/')23 genformat = '1'; 24 if (genstring.charAt(0) == '/') 25 25 { 26 int end;27 SString newcomment;28 switch(genstring.charAt(1))26 int end; 27 SString newcomment; 28 switch (genstring.charAt(1)) 29 29 { 30 30 case '/': 31 genformat =genstring.charAt(2);32 if ((end =genstring.indexOf('\n'))>=0)33 34 newcomment =genstring.substr(2,end-2);35 gencopy =genstring.substr(end+1);36 mapinshift =end+1;37 31 genformat = genstring.charAt(2); 32 if ((end = genstring.indexOf('\n')) >= 0) 33 { 34 newcomment = genstring.substr(2, end - 2); 35 gencopy = genstring.substr(end + 1); 36 mapinshift = end + 1; 37 } 38 38 else 39 40 gencopy =0;41 mapinshift =genstring.len();42 39 { 40 gencopy = 0; 41 mapinshift = genstring.len(); 42 } 43 43 break; 44 44 case '*': 45 genformat =genstring.charAt(2);46 if ((end =genstring.indexOf("*/"))>=0)47 48 newcomment =genstring.substr(2,end-2);49 gencopy =genstring.substr(end+2);50 mapinshift =end+2;51 45 genformat = genstring.charAt(2); 46 if ((end = genstring.indexOf("*/")) >= 0) 47 { 48 newcomment = genstring.substr(2, end - 2); 49 gencopy = genstring.substr(end + 2); 50 mapinshift = end + 2; 51 } 52 52 else 53 54 gencopy =0;55 mapinshift =genstring.len();56 53 { 54 gencopy = 0; 55 mapinshift = genstring.len(); 56 } 57 57 break; 58 58 } 59 if (newcomment.len()>0)59 if (newcomment.len() > 0) 60 60 { 61 SString token; int pos=0;62 if (newcomment.getNextToken(pos,token,';'))63 if (newcomment.getNextToken(pos,token,';'))64 {65 if (token.len()) txt=token;66 if (newcomment.getNextToken(pos,token,';'))67 if (token.len()) name=token;68 }61 SString token; int pos = 0; 62 if (newcomment.getNextToken(pos, token, ';')) 63 if (newcomment.getNextToken(pos, token, ';')) 64 { 65 if (token.len()) txt = token; 66 if (newcomment.getNextToken(pos, token, ';')) 67 if (token.len()) name = token; 68 } 69 69 } 70 70 } 71 71 } 72 72 73 gen=gencopy;74 format=genformat;75 if (!name.len()) name=genname;76 if (!txt.len()) txt=comment;77 multiline=(strchr((const char*)gen,'\n')!=0);78 // mapoutshift...?73 gen = gencopy; 74 format = genformat; 75 if (!name.len()) name = genname; 76 if (!txt.len()) txt = comment; 77 multiline = (strchr((const char*)gen, '\n') != 0); 78 // mapoutshift...? 79 79 } 80 80 81 81 void Geno::freeF0() 82 82 { 83 if (f0gen) {delete f0gen; f0gen=0;}84 } 85 86 Geno::Geno(const char *genstring, char genformat,const char *genname,const char *comment)87 { 88 init(SString(genstring),genformat,SString(genname),SString(comment));89 } 90 91 Geno::Geno(const SString& genstring, char genformat,const SString& genname,const SString& comment)92 { 93 init(genstring,genformat,genname,comment);83 if (f0gen) { delete f0gen; f0gen = 0; } 84 } 85 86 Geno::Geno(const char *genstring, char genformat, const char *genname, const char *comment) 87 { 88 init(SString(genstring), genformat, SString(genname), SString(comment)); 89 } 90 91 Geno::Geno(const SString& genstring, char genformat, const SString& genname, const SString& comment) 92 { 93 init(genstring, genformat, genname, comment); 94 94 } 95 95 96 96 Geno::Geno(const Geno& src) 97 :gen(src.gen),name(src.name),format(src.format),txt(src.txt),isvalid(src.isvalid), 98 f0gen(0),mapinshift(src.mapinshift),mapoutshift(src.mapinshift), 99 multiline(src.multiline),owner(0) 100 {f0gen=src.f0gen?new Geno(*src.f0gen):0; refcount=1;} 97 :gen(src.gen), name(src.name), format(src.format), txt(src.txt), isvalid(src.isvalid), 98 f0gen(0), mapinshift(src.mapinshift), mapoutshift(src.mapinshift), 99 multiline(src.multiline), owner(0) 100 { 101 f0gen = src.f0gen ? new Geno(*src.f0gen) : 0; refcount = 1; 102 } 101 103 102 104 void Geno::operator=(const Geno& src) 103 105 { 104 freeF0();105 gen=src.gen;106 name=src.name;107 format=src.format;108 txt=src.txt;109 isvalid=src.isvalid;110 mapinshift=src.mapinshift;111 mapoutshift=src.mapinshift;112 multiline=src.multiline;113 f0gen=src.f0gen?new Geno(*src.f0gen):0;114 owner=0;106 freeF0(); 107 gen = src.gen; 108 name = src.name; 109 format = src.format; 110 txt = src.txt; 111 isvalid = src.isvalid; 112 mapinshift = src.mapinshift; 113 mapoutshift = src.mapinshift; 114 multiline = src.multiline; 115 f0gen = src.f0gen ? new Geno(*src.f0gen) : 0; 116 owner = 0; 115 117 } 116 118 117 119 Geno::Geno(const SString& src) 118 120 { 119 init(src,-1,SString::empty(),SString::empty());120 } 121 122 void Geno::setGene(const SString& g, char newformat)123 { 124 gen=g;125 isvalid=-1;126 freeF0();127 if (newformat>=0) format=newformat;121 init(src, -1, SString::empty(), SString::empty()); 122 } 123 124 void Geno::setGene(const SString& g, char newformat) 125 { 126 gen = g; 127 isvalid = -1; 128 freeF0(); 129 if (newformat >= 0) format = newformat; 128 130 } 129 131 130 132 void Geno::setString(const SString& g) 131 133 { 132 freeF0();133 init(g,-1,SString::empty(),SString::empty());134 freeF0(); 135 init(g, -1, SString::empty(), SString::empty()); 134 136 } 135 137 136 138 void Geno::setName(const SString& n) 137 139 { 138 name=n;140 name = n; 139 141 } 140 142 141 143 void Geno::setComment(const SString& c) 142 144 { 143 txt=c;145 txt = c; 144 146 } 145 147 146 148 SString Geno::toString(void) const 147 149 { 148 SString out; 149 int comment=0; 150 if ((format!='1')||(comment=(txt.len()||name.len()))) 151 { 152 if (multiline) 153 out+="//"; 150 SString out; 151 int comment = 0; 152 if ((format != '1') || (comment = (txt.len() || name.len()))) 153 { 154 if (multiline) 155 out += "//"; 156 else 157 out += "/*"; 158 out += format; 159 if (comment) 160 { 161 if (txt.len()) { out += ";"; out += txt; } 162 if (name.len()){ out += ";"; out += name; } 163 } 164 if (multiline) 165 out += "\n"; 166 else 167 out += "*/"; 168 } 169 out += gen; 170 return out; 171 } 172 173 SString Geno::shortString(void) const 174 { 175 SString out; 176 if (format != '1') 177 { 178 if (multiline) 179 out += "//"; 180 else 181 out += "/*"; 182 if (format == 0) 183 out += "invalid"; 184 else 185 out += format; 186 if (multiline) 187 out += "\n"; 188 else 189 out += "*/"; 190 } 191 out += gen; 192 return out; 193 } 194 195 int Geno::mapGenToString(int genpos) const 196 { 197 if (genpos > gen.len()) return -2; 198 if (genpos<0) return -1; 199 return mapinshift + genpos; 200 } 201 202 int Geno::mapStringToGen(int stringpos) const 203 { 204 stringpos -= mapinshift; 205 if (stringpos>gen.len()) return -2; 206 if (stringpos < 0) return -1; 207 return stringpos; 208 } 209 210 SString Geno::getGene(void) const { return gen; } 211 SString Geno::getName(void) const { return name; } 212 char Geno::getFormat(void) const { return format; } 213 SString Geno::getComment(void) const { return txt; } 214 215 int ModelGenoValidator::testGenoValidity(Geno& g) 216 { 217 if (g.getFormat() == '0') 218 { 219 Model mod(g); 220 return mod.isValid(); 221 } 154 222 else 155 out+="/*"; 156 out+=format; 157 if (comment) 223 { 224 bool converter_missing; 225 Geno f0geno = g.getConverted('0', NULL, &converter_missing); 226 if (converter_missing) 227 return -1;//no result 228 return f0geno.isValid(); 229 } 230 } 231 232 void Geno::validate() 233 { 234 if (isvalid >= 0) return; 235 if (gen.len() == 0) { isvalid = 0; return; } 236 FOREACH(GenoValidator*, v, validators) 237 if ((isvalid = v->testGenoValidity(*this)) >= 0) 238 return; 239 isvalid = 0; 240 FMprintf("Geno", "validate", FMLV_WARN, "Wrong configuration? No genotype validators defined for genetic format f%c.", format); 241 } 242 243 bool Geno::isValid(void) 244 { 245 if (isvalid<0) validate(); 246 return isvalid>0; 247 } 248 249 Geno Geno::getConverted(char otherformat, MultiMap *m, bool *converter_missing) 250 { 251 if (otherformat == getFormat()) { if (converter_missing) *converter_missing = false; return *this; } 252 #ifndef NO_GENOCONVMANAGER 253 if (converters) 254 { 255 if ((otherformat == '0') && (!m)) 158 256 { 159 if (txt.len()) {out+=";";out+=txt;} 160 if (name.len()){out+=";";out+=name;} 257 if (!f0gen) 258 f0gen = new Geno(converters->convert(*this, otherformat, NULL, converter_missing)); 259 return *f0gen; 161 260 } 162 if (multiline) 163 out+="\n"; 164 else 165 out+="*/"; 166 } 167 out+=gen; 168 return out; 169 } 170 171 SString Geno::shortString(void) const 172 { 173 SString out; 174 if (format!='1') 175 { 176 if (multiline) 177 out+="//"; 178 else 179 out+="/*"; 180 if (format==0) 181 out+="invalid"; 182 else 183 out+=format; 184 if (multiline) 185 out+="\n"; 186 else 187 out+="*/"; 188 } 189 out+=gen; 190 return out; 191 } 192 193 int Geno::mapGenToString(int genpos) const 194 { 195 if (genpos>gen.len()) return -2; 196 if (genpos<0) return -1; 197 return mapinshift+genpos; 198 } 199 200 int Geno::mapStringToGen(int stringpos) const 201 { 202 stringpos-=mapinshift; 203 if (stringpos>gen.len()) return -2; 204 if (stringpos<0) return -1; 205 return stringpos; 206 } 207 208 SString Geno::getGene(void) const {return gen;} 209 SString Geno::getName(void) const {return name;} 210 char Geno::getFormat(void) const {return format;} 211 SString Geno::getComment(void) const {return txt;} 212 213 int ModelGenoValidator::testGenoValidity(Geno& g) 214 { 215 if (g.getFormat()=='0') 216 { 217 Model mod(g); 218 return mod.isValid(); 219 } 220 else 221 { 222 Geno f0geno=g.getConverted('0'); 223 return f0geno.isValid(); 224 } 225 } 226 227 void Geno::validate() 228 { 229 if (isvalid>=0) return; 230 if (gen.len()==0) { isvalid=0; return; } 231 FOREACH(GenoValidator*,v,validators) 232 if ((isvalid=v->testGenoValidity(*this))>=0) 233 break; 234 } 235 236 bool Geno::isValid(void) 237 { 238 if (isvalid<0) validate(); 239 return isvalid>0; 240 } 241 242 Geno Geno::getConverted(char otherformat,MultiMap *m) 243 { 244 if (otherformat==getFormat()) return *this; 245 #ifndef NO_GENOCONVMANAGER 246 if (converters) 247 { 248 if ((otherformat=='0')&&(!m)) 249 { 250 if (!f0gen) 251 f0gen=new Geno(converters->convert(*this,otherformat)); 252 return *f0gen; 253 } 254 else 255 return converters->convert(*this,otherformat,m); 261 else 262 return converters->convert(*this, otherformat, m, converter_missing); 256 263 } 257 264 #endif 258 return (otherformat==getFormat())?*this:Geno(0,0,0,"GenConvManager not available"); 265 if (converter_missing) *converter_missing = true; 266 return (otherformat == getFormat()) ? *this : Geno(0, 0, 0, "GenConvManager not available"); 259 267 } 260 268 261 269 Geno::~Geno() 262 270 { 263 if (f0gen) delete f0gen;264 } 271 if (f0gen) delete f0gen; 272 }
Note: See TracChangeset
for help on using the changeset viewer.