Ignore:
Timestamp:
03/01/14 22:05:02 (10 years ago)
Author:
sz
Message:

Warn against missing converter, convert() caller can differentiate between conversion failure and missing converter.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/genetics/geno.cpp

    r145 r150  
    88
    99SListTempl<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)
     10GenoConvManager *Geno::converters = NULL;
     11
     12void 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)
    2222        { // unknown format
    23         genformat='1';
    24         if (genstring.charAt(0)=='/')
     23                genformat = '1';
     24                if (genstring.charAt(0) == '/')
    2525                {
    26                 int end;
    27                 SString newcomment;
    28                 switch(genstring.charAt(1))
     26                        int end;
     27                        SString newcomment;
     28                        switch (genstring.charAt(1))
    2929                        {
    3030                        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                                }
    3838                                else
    39                                         {
    40                                         gencopy=0;
    41                                         mapinshift=genstring.len();
    42                                         }
     39                                {
     40                                        gencopy = 0;
     41                                        mapinshift = genstring.len();
     42                                }
    4343                                break;
    4444                        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                                }
    5252                                else
    53                                         {
    54                                         gencopy=0;
    55                                         mapinshift=genstring.len();
    56                                         }
     53                                {
     54                                        gencopy = 0;
     55                                        mapinshift = genstring.len();
     56                                }
    5757                                break;
    5858                        }
    59                 if (newcomment.len()>0)
     59                        if (newcomment.len() > 0)
    6060                        {
    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                                        }
    6969                        }
    7070                }
    7171        }
    7272
    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...?
    7979}
    8080
    8181void Geno::freeF0()
    8282{
    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
     86Geno::Geno(const char *genstring, char genformat, const char *genname, const char *comment)
     87{
     88        init(SString(genstring), genformat, SString(genname), SString(comment));
     89}
     90
     91Geno::Geno(const SString& genstring, char genformat, const SString& genname, const SString& comment)
     92{
     93        init(genstring, genformat, genname, comment);
    9494}
    9595
    9696Geno::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),
     98f0gen(0), mapinshift(src.mapinshift), mapoutshift(src.mapinshift),
     99multiline(src.multiline), owner(0)
     100{
     101        f0gen = src.f0gen ? new Geno(*src.f0gen) : 0; refcount = 1;
     102}
    101103
    102104void Geno::operator=(const Geno& src)
    103105{
    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;
    115117}
    116118
    117119Geno::Geno(const SString& src)
    118120{
    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
     124void Geno::setGene(const SString& g, char newformat)
     125{
     126        gen = g;
     127        isvalid = -1;
     128        freeF0();
     129        if (newformat >= 0) format = newformat;
    128130}
    129131
    130132void Geno::setString(const SString& g)
    131133{
    132 freeF0();
    133 init(g,-1,SString::empty(),SString::empty());
     134        freeF0();
     135        init(g, -1, SString::empty(), SString::empty());
    134136}
    135137
    136138void Geno::setName(const SString& n)
    137139{
    138 name=n;
     140        name = n;
    139141}
    140142
    141143void Geno::setComment(const SString& c)
    142144{
    143 txt=c;
     145        txt = c;
    144146}
    145147
    146148SString Geno::toString(void) const
    147149{
    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
     173SString 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
     195int 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
     202int 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
     210SString Geno::getGene(void) const { return gen; }
     211SString Geno::getName(void) const { return name; }
     212char Geno::getFormat(void) const { return format; }
     213SString Geno::getComment(void) const { return txt; }
     214
     215int ModelGenoValidator::testGenoValidity(Geno& g)
     216{
     217        if (g.getFormat() == '0')
     218        {
     219                Model mod(g);
     220                return mod.isValid();
     221        }
    154222        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
     232void 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
     243bool Geno::isValid(void)
     244{
     245        if (isvalid<0) validate();
     246        return isvalid>0;
     247}
     248
     249Geno 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))
    158256                {
    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;
    161260                }
    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);
    256263        }
    257264#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");
    259267}
    260268
    261269Geno::~Geno()
    262270{
    263 if (f0gen) delete f0gen;
    264 }
     271        if (f0gen) delete f0gen;
     272}
Note: See TracChangeset for help on using the changeset viewer.