source: tags/initial/MULTI_PROBE/MP_sondentopf.cxx

Last change on this file was 2, checked in by oldcode, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1#include <MultiProbe.hxx>
2#include <stdlib.h>
3#include <assert.h>
4#include <string.h>
5#include <arbdbt.h>
6#include <awt_tree.hxx>
7#include <aw_root.hxx>
8#include <math.h>
9#include <MP_probe.hxx>
10#include <SoTl.hxx>
11
12//############################################################################################
13/*
14*/
15//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Methoden ST_Container ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16
17ST_Container::ST_Container(int anz_sonden)              // ist ein define das auf 1000 steht. (wir wissen, das das nicht ganz sauber ist so!)
18{
19    long        laenge_markierte;
20   
21    Sondennamen = new List<char>;
22   
23    Auswahlliste = new MO_Liste();
24    Bakterienliste = new MO_Liste();
25   
26    Bakterienliste->get_all_species();
27
28    if (pt_server_different)
29        return;
30    laenge_markierte = Auswahlliste->fill_marked_bakts();
31
32    anz_elem_unmarked = Bakterienliste->debug_get_current()-1 - laenge_markierte;
33    // STATISTIK
34   
35    anzahl_basissonden =  anz_sonden;
36
37    cachehash = GBS_create_hash(anzahl_basissonden + 1,1);
38    // hashlaenge darf nicht 0 sein, groesser schadet nicht
39   
40    sondentopf = new Sondentopf(Bakterienliste,Auswahlliste);
41    // Momentan wird auf diesem sondentopf gearbeitet
42}
43
44
45ST_Container::~ST_Container()
46{
47    char* Sname;
48    Sonde* csonde;
49
50    delete Bakterienliste;
51    delete Auswahlliste;
52    delete sondentopf;
53
54    Sname = Sondennamen->get_first();
55    while (Sname)
56    {
57        csonde = get_cached_sonde(Sname);
58        delete csonde;
59        delete Sname;
60        Sondennamen->remove_first();
61        Sname = Sondennamen->get_first();
62    }
63
64    delete Sondennamen;
65    GBS_free_hash(cachehash);   
66}
67
68
69
70Sonde* ST_Container::cache_Sonde(char *name, int allowed_mis, double outside_mis)
71{
72    long        hashreturnval;
73    char*       name_for_plist = strdup(name);
74    //char*     hashname = name;
75    Sonde* s = new Sonde(name, allowed_mis, outside_mis);                               
76
77    Sondennamen->insert_as_first(name_for_plist);
78    s->gen_Hitliste(Bakterienliste);
79   
80    hashreturnval = GBS_write_hash(cachehash, name, (long) s);
81    // Reine Sonde plus Hitliste geschrieben, der Zeiger auf die Sonde liegt als long gecastet im Hash
82    return s;
83}
84
85Sonde* ST_Container::get_cached_sonde(char* name)
86{
87    if (name)
88        return (Sonde*)GBS_read_hash(cachehash,name);
89    else
90        return NULL;
91}
92
93//############################################################################################
94/*
95  Zu jeder Kombination von Mehrfachsonden gehoert ein Sondentopf. Dieser enthaelt eine Liste mit
96  Sonden und eine Liste mit Kombinationen aus diesen Sonden. Die Kombinationen entstehen aus den
97  Sonden und/oder aus Kombinationen durch Verknuepfung mit der Methode Probe_AND.
98*/
99//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Methoden SONDENTOPF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
100
101Sondentopf::Sondentopf(MO_Liste *BL, MO_Liste *AL)
102{
103    Listenliste = new List<void*>;
104    color_hash  = GBS_create_hash((long)(BL->get_laenge()/0.8)+1,1);
105    if (!BL)
106    {
107        aw_message("List of species is empty. Terminating program");
108        exit(333);
109    }
110    if (!AL)
111    {
112        aw_message("List of marked species is empty. Terminating program");
113        exit(334);
114    }
115    BaktList = BL;
116    Auswahllist = AL;
117    Listenliste->insert_as_last((void**) new List<Sonde>);
118
119}
120
121
122
123Sondentopf::~Sondentopf()
124{
125    //darf nur delete auf die listenliste machen, nicht auf die MO_Lists, da die zu dem ST_Container gehoeren
126    Sonde *stmp = NULL;
127
128    List<Sonde> *ltmp = LIST(Listenliste->get_first());
129    if (ltmp)
130    {
131        stmp = ltmp->get_first();
132    }
133    while (ltmp)
134    {
135        while (stmp)
136        {
137            ltmp->remove_first();
138            //delete stmp;
139            stmp = ltmp->get_first();
140        }
141        Listenliste->remove_first();
142        delete ltmp;
143        ltmp = LIST(Listenliste->get_first());
144    }
145   
146    delete Listenliste;
147    //delete BaktList;
148    //delete Auswahllist;
149    GBS_free_hash(color_hash);
150}
151
152
153
154void Sondentopf::put_Sonde(char *name, int allowed_mis, double outside_mis)
155{
156    positiontype        pos;
157    ST_Container        *stc = mp_main->get_stc();
158    List<Sonde>         *Sondenliste = LIST(Listenliste->get_first());
159    Sonde               *s;
160    int i=0;
161
162    if (!name)
163    {
164        aw_message("No name specified for species. Abort.");
165        exit(111);
166    }
167    if (!Sondenliste)
168    {
169        Sondenliste = new List<Sonde>;
170        Listenliste->insert_as_last((void**) Sondenliste );
171    }
172
173      s = stc->get_cached_sonde(name);
174    if (!s)
175     {
176        s = stc->cache_Sonde(name, allowed_mis, outside_mis);
177    }
178    pos = Sondenliste->insert_as_last( s );
179    if (! s->get_bitkennung())
180        s->set_bitkennung(new Bitvector( ((int) pos) ) );
181    s->set_far(0);
182    s->set_mor(pos);
183    s->get_bitkennung()->setbit(pos-1);
184    // im cache steht die Mismatch info noch an Stelle 0. Hier muss sie an Stelle pos  verschoben werden
185    if (pos!=0)
186        for (i=0; i<s->get_length_hitliste(); i++)
187            if (s->get_hitdata_by_number(i))
188                s->get_hitdata_by_number(i)->set_mismatch_at_pos( pos,s->get_hitdata_by_number(i)->get_mismatch_at_pos(0) );
189}
190
191
192double** Sondentopf::gen_Mergefeld()
193{
194   
195    // Zaehler
196    int                 i,j;
197
198    Sonde*              sonde;
199
200    List<Sonde>*        Sondenliste = LIST(Listenliste->get_first());
201    long                alle_bakterien = BaktList->debug_get_current()-1;
202    long                H_laenge, sondennummer;
203    double**            Mergefeld = new double*[alle_bakterien+1];     
204   
205    for (i=0; i<alle_bakterien+1; i++)
206    {
207        Mergefeld[i] = new double[mp_gl_awars.no_of_probes];                   
208        for(j=0; j<mp_gl_awars.no_of_probes; j++)
209            Mergefeld[i][j] = 100;
210    }
211
212    sondennummer=0;
213    sonde = Sondenliste->get_first();
214    while (sonde)
215    {
216        H_laenge = sonde->get_length_hitliste();
217        for (i=0; i<H_laenge; i++)
218        {
219            Mergefeld[sonde->get_hitdata_by_number(i)->get_baktid()][sondennummer] =
220                sonde->get_hitdata_by_number(i)->get_mismatch_at_pos(0) ;
221        }
222
223        sondennummer++;
224        sonde = Sondenliste->get_next();
225    }
226
227    return Mergefeld;
228}
229
230probe_tabs* Sondentopf::fill_Stat_Arrays()
231{
232    // erstmal generische Felder
233    List<Sonde>*        Sondenliste = LIST(Listenliste->get_first());
234    long                feldlen = (long) pow(3.0,(int)(mp_gl_awars.no_of_probes)); 
235    int*                markierte = new int[feldlen];                                   //MEL
236    int*                unmarkierte = new int[feldlen];                                 //MEL
237    int         i=0,j=0;
238    long                alle_bakterien = BaktList->debug_get_current()-1;
239    long                wertigkeit = 0;
240    double**    Mergefeld;
241    int*                AllowedMismatchFeld = new int[mp_gl_awars.no_of_probes];
242    Sonde*              sonde;
243
244    sonde = Sondenliste->get_first();
245    for (i=0; i<mp_gl_awars.no_of_probes; i++)
246    {
247        AllowedMismatchFeld[i] = (int) sonde->get_Allowed_Mismatch_no(0);
248        sonde = Sondenliste->get_next();
249    }
250
251   
252    for (i=0; i<feldlen; i++)
253    {
254        markierte[i] = 0;
255        unmarkierte[i] = 0;
256    }
257
258    int faktor=0;
259    Mergefeld = gen_Mergefeld();
260
261   
262    for (i=0; i < alle_bakterien+1; i++)
263    {
264        wertigkeit=0;
265        for (j=0; j<mp_gl_awars.no_of_probes; j++)
266        {
267            if ( Mergefeld[i][j] <= ((double) AllowedMismatchFeld[j] + (double) mp_gl_awars.greyzone ) )
268                faktor = 0;
269            else if ( Mergefeld[i][j] <= ( (double) AllowedMismatchFeld[j] +
270                                           (double) mp_gl_awars.greyzone +
271                                           mp_gl_awars.outside_mismatches_difference ) )
272                faktor = 1;
273            else
274                faktor = 2;
275
276            wertigkeit += faktor * (long) pow(3,j);
277        }
278       
279
280        if (BaktList->get_entry_by_index(i))
281        {
282            if (  Auswahllist->get_index_by_entry( BaktList->get_entry_by_index(i) )  )
283            {
284                markierte[wertigkeit]++;
285            }
286            else
287            {
288                unmarkierte[wertigkeit]++;
289            }
290        }
291    }
292
293    for (i=0;i<alle_bakterien+1;i++)
294        delete Mergefeld[i];
295    delete Mergefeld;
296    delete AllowedMismatchFeld;
297    probe_tabs *pt = new probe_tabs(markierte, unmarkierte,feldlen);                    //MEL (sollte bei Andrej passieren
298    return pt;
299}
300
301
302void Sondentopf::gen_color_hash(positiontype anz_sonden)
303{
304
305    List<Sonde>*        Sondenliste = LIST(Listenliste->get_first());
306    double**            Mergefeld;
307    long                alle_bakterien = BaktList->debug_get_current() -1;
308    int*                AllowedMismatchFeld = new int[mp_gl_awars.no_of_probes];                        //MEL
309    int*                rgb = new int[3];                                                               //MEL
310    Sonde*              sonde;
311    int                 i=0, j=0;
312    int                 marker=0;
313    int                 r=0,g=0,b=0,y=0,w=0,l=0,n=0;
314    int                 check;
315
316    sonde = Sondenliste->get_first();
317    for (i=0; i<mp_gl_awars.no_of_probes; i++)
318    {
319        AllowedMismatchFeld[i] = (int) sonde->get_Allowed_Mismatch_no(0);
320        sonde = Sondenliste->get_next();
321    }
322
323
324    if (!anz_sonden)
325        return;
326
327
328    Mergefeld = gen_Mergefeld();
329
330
331    for (i=1; i < alle_bakterien+1; i++)
332    {
333        rgb[0]=0; rgb[1]=0; rgb[2]=0;
334
335        for (j=0; j<mp_gl_awars.no_of_probes; j++)
336        {
337            check=0;
338            if (Mergefeld[i][j] <= ((double) AllowedMismatchFeld[j] + (double) mp_gl_awars.greyzone + mp_gl_awars.outside_mismatches_difference)  )
339            {
340                rgb[ j%3 ]++;
341                check++;
342            }
343            if (check)
344                marker++;
345        }
346       
347        int codenum = 0;
348        int color = 0;
349       
350        if (!rgb[0] && !rgb[1] && !rgb[2])
351        {           
352            codenum = 0;
353        }
354        else if (rgb[0] && !rgb[1] && !rgb[2])
355        {
356            codenum =  1;
357            if (Auswahllist->get_entry_by_index(i))
358                r++;
359        }
360        else if (!rgb[0] && rgb[1] && !rgb[2])
361        {
362            codenum =  2;
363            if (Auswahllist->get_entry_by_index(i))
364                g++;
365        }
366        else if (!rgb[0] && !rgb[1] && rgb[2])
367        {
368            codenum =  3;
369            if (Auswahllist->get_entry_by_index(i))
370                b++;
371        }
372        else if (rgb[0] && rgb[1] && !rgb[2])
373        {
374            codenum =  4;
375            if (Auswahllist->get_entry_by_index(i))
376                y++;
377        }
378        else if (rgb[0] && !rgb[1] && rgb[2])
379        {
380            codenum =  5;
381            if (Auswahllist->get_entry_by_index(i))
382                w++;
383        }
384        else if (!rgb[0] && rgb[1] && rgb[2])
385        {
386            codenum =  6;
387            if (Auswahllist->get_entry_by_index(i))
388                l++;
389        }
390        else if (rgb[0] && rgb[1] && rgb[2])
391        {
392            codenum =  7;
393            if (Auswahllist->get_entry_by_index(i))
394                n++;
395        }
396        else
397            aw_message("Error in color assignment");
398       
399        switch ( codenum ) {
400            case 0:     color = AWT_GC_BLACK;   break;
401            case 1:     color = AWT_GC_RED;     break;
402            case 2:     color = AWT_GC_GREEN;   break;
403            case 3:     color = AWT_GC_BLUE;    break;
404            case 4:     color = AWT_GC_YELLOW;  break;
405            case 5:     color = AWT_GC_MAGENTA; break; // was NAVY
406            case 6:     color = AWT_GC_CYAN;    break; // was LIGHTBLUE
407            case 7:     color = AWT_GC_WHITE ;  break;
408            default:   aw_message("Error in color assignment");
409        }
410
411        GBS_write_hash(color_hash, BaktList->get_entry_by_index(i) , (long) color);
412
413    }
414
415    for (i=0;i<alle_bakterien+1;i++)
416        delete Mergefeld[i];
417    delete Mergefeld;
418
419
420    delete AllowedMismatchFeld;
421    delete rgb;
422}
423
424
Note: See TracBrowser for help on using the repository browser.