source: tags/svn.1.5.4/MULTI_PROBE/MultiProbe.hxx

Last change on this file was 8309, checked in by westram, 14 years ago
  • moved much code into static scope

(partly reverted by [8310])

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : MultiProbe.hxx                                    //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#ifndef MULTIPROBE_HXX
12#define MULTIPROBE_HXX
13
14#ifndef SOTL_HXX
15#include "SoTl.hxx"
16#endif
17#ifndef MPDEFS_H
18#include "mpdefs.h"
19#endif
20#ifndef AW_AWAR_HXX
21#include <aw_awar.hxx>
22#endif
23#ifndef AW_BASE_HXX
24#include <aw_base.hxx>
25#endif
26#ifndef ARB_ASSERT_H
27#include <arb_assert.h>
28#endif
29
30#define mp_assert(x) arb_assert(x)
31
32class MP_Main;
33class MP_Window;
34class AW_window;
35class AW_root;
36class AW_window_simple;
37class AWT_canvas;
38class ProbeValuation;
39
40class ST_Container;
41class Bitvector;
42class Sonde;
43
44#define MP_AWAR_SEQUENZEINGABE      "mp/sequenzeingabe"
45#define MP_AWAR_SELECTEDPROBES      "mp/selectedprobes"
46#define MP_AWAR_PROBELIST           "mp/probelist"
47#define MP_AWAR_WEIGHTEDMISMATCHES  "mp/weightedmismatches"
48#define MP_AWAR_COMPLEMENT          "mp/complement"
49#define MP_AWAR_MISMATCHES          "mp/mismatches"
50#define MP_AWAR_PTSERVER            AWAR_PT_SERVER
51#define MP_AWAR_LOADLIST            "mp/loadlist"
52#define MP_AWAR_RESULTPROBES        "mp/resultprobes"
53#define MP_AWAR_RESULTPROBESCOMMENT "mp/resultprobescomment"
54#define MP_AWAR_NOOFPROBES          "mp/noofprobes"
55#define MP_AWAR_QUALITY             "mp/quality"
56#define MP_AWAR_SINGLEMISMATCHES    "mp/singlemismatches"
57#define MP_AWAR_OUTSIDEMISMATCHES   "mp/outsidemismatches"
58#define MP_AWAR_QUALITYBORDER1      "mp/qualityborder1"
59#define MP_AWAR_GREYZONE            "mp/greyzone"
60#define MP_AWAR_EMPHASIS            "mp/emphasis"
61#define MP_AWAR_ECOLIPOS            "mp/ecolipos"
62#define MP_AWAR_AUTOADVANCE         "mp/auto_advance"
63
64#define MINQUALITY  1.0     // schlechteste Qualitaet einer Sonde
65#define MAXQUALITY  5.0     // beste Qualitaet einer Sonde
66#define QUALITYDEFAULT  3
67#define MAXPROBECOMBIS  6       // Maximale Anzahl der Sondenkombinationen
68#define MAXMISMATCHES   6       // von 0 bis 5 !!!!
69#define MAXRESULTSINLIST    40  // groesse der Ergebnisliste, die im Ergebnisfenster angezeigt wird
70#define FITNESSSCALEFACTOR  10  // wird benutzt um intern die hammingtabelle feiner zu granulieren
71// siehe probe_combi_statistic::calc_fitness
72
73#define MULTROULETTEFACTOR  10  // macht aus z.B. 4,231 42
74#define MAXINITPOPULATION 50        // Ausgangsgroesse der Population
75#define MAXPOPULATION   MAXINITPOPULATION
76#define CROSSOVER_WS    60      // Crossoverwahrscheinlichkeit liegt bei CROSSOVER_WS Prozent !!!
77#define MUTATION_WS 33      // Mutationswahrscheinlichkeit liegt bei 1/MUTATION_WS Prozent!!!
78#define SIGMATRUNCATION_CONST 2     // die Standardwerte liegen zwischen 1 und 3
79#define C_MULT      1.4     // Werte zwischen 1.2 und 2.0
80// #define USE_SIGMATRUNCATION       // diesen Namen definieren, wenn sigma_truncation in der linearen Skal. (=fitness skalierung) verwendet werden soll
81// #define USE_LINEARSCALING     // diesen Namen definieren, wenn lineare_skalierung (=fitness skalierung) verwendet werden soll
82// #define USE_DUP_TREE          //definieren, wenn eine Sondenkombination nur einmal pro generation vorkommen darf !!!
83
84#define ABS(x)          (x<0) ? -x : x
85#define LIST(TYP)       ((List<Sonde>*) TYP)
86
87#define MAXSONDENHASHSIZE   1000        // max 1000 Sonden koennen gecached werden, bei Bedarf aendern !!!!
88
89
90struct awar_vars {
91    char    *manual_sequence;
92    char    *selected_probes;
93    char    *probelist;
94    char    *result_probes;
95    char    *result_probes_comment;
96    float   outside_mismatches_difference;
97    long    weightedmismatches;
98    long    complement;
99    long    no_of_mismatches;
100    long    no_of_probes;
101    long    singlemismatches;
102    long    ptserver;
103    long    probe_quality;
104    long    qualityborder_best;
105    long    emphasis;
106    long    ecolipos;
107    float   min_weight;
108    float   max_weight;
109    float   greyzone;
110};
111
112class AW_selection_list;
113
114extern bool                Stop_evaluation;
115extern AW_selection_list  *selected_list;           // globale id's fuer
116extern AW_selection_list  *probelist;               // identifizierung der Listen
117extern char                MP_probe_tab[256];
118extern AW_selection_list  *result_probes_list;
119extern int                 remembered_mismatches;
120extern int                 anz_elem_marked;
121extern int                 anz_elem_unmarked;
122extern unsigned char     **hamming_tab;
123extern int               **system3_tab;
124extern bool                pt_server_different;
125extern bool                new_pt_server;
126
127long            k_aus_n(int k, int n);                      // Berechnung k aus n
128extern int      get_random(int min, int max);       // gibt eine Zufallszahl x mit der Eigenschaft : min <= x <= max
129
130// ********************************************************
131
132extern MP_Main   *mp_main;
133extern awar_vars  mp_gl_awars;                      // globale Variable, die manuell eingegebene Sequenz enthaelt
134
135// ********************************************************
136
137
138
139class MP_Main : virtual Noncopyable {
140    MP_Window   *mp_window;
141    AW_root *aw_root;
142    AWT_canvas  *ntw;
143    ST_Container *stc;
144    ProbeValuation *p_eval;
145
146    void    create_awars();
147
148public:
149    MP_Window   *get_mp_window()    { return mp_window; };
150    AW_root *get_aw_root()      { return aw_root; };
151    AWT_canvas  *get_ntw()      { return ntw; };
152    ProbeValuation *get_p_eval()    { return p_eval; };
153    ST_Container *get_stc()         { return stc; };
154    void    set_stc(ST_Container *stopfC) { stc = stopfC; }
155    void    set_p_eval (ProbeValuation *y) { p_eval = y; };
156    ProbeValuation  *new_probe_eval(char **field, int size, int* array, int *mismatches);
157    void        destroy_probe_eval();
158
159    MP_Main(AW_root *awr, AWT_canvas *canvas);
160    ~MP_Main();
161};
162
163
164
165class MP_Window : virtual Noncopyable {
166    AW_window_simple *aws;
167    AW_window_simple *result_window;
168
169    void build_pt_server_list();
170    // zeigt auf naechstes Zeichen
171
172public:
173    AW_window_simple    *get_window()       { return aws; };
174    AW_window_simple    *get_result_window()    { return result_window; };
175
176    AW_window_simple *create_result_window(AW_root *aw_root);
177
178    MP_Window(AW_root *aw_root, GBDATA *gb_main);
179    ~MP_Window();
180};
181
182
183
184// *****************************************************
185// Globale Klassenlose Funktionen
186// *****************************************************
187void MP_compute(AW_window *, AW_CL cl_gb_main);
188
189
190class Bakt_Info : virtual Noncopyable {
191    char* name;
192    long  hit_flag;
193
194public:
195    char*       get_name() { return name; };
196    long        inc_hit_flag() { return (++hit_flag); };
197    long        get_hit_flag() { return (hit_flag); };
198    void        kill_flag() { hit_flag = 0; };
199
200    Bakt_Info(const char* n);
201    ~Bakt_Info();
202};
203
204class Hit : virtual Noncopyable {
205    double  *mismatch;
206    long    baktid;
207
208public:
209    double*     get_mismatch()  { return mismatch; };
210    long    get_baktid()    { return baktid; };
211    void    set_mismatch_at_pos(int pos, double mm) { mismatch[pos] = mm; };
212    double  get_mismatch_at_pos(int pos) { return mismatch[pos]; };
213
214    Hit(long baktnummer);
215    ~Hit();
216};
217
218
219class probe_tabs;
220
221class Sondentopf : virtual Noncopyable {
222    List<void*>     *Listenliste;
223    GB_HASH     *color_hash;
224    MO_Liste        *BaktList;
225    MO_Liste        *Auswahllist;
226
227public:
228    probe_tabs*     fill_Stat_Arrays();
229    double**        gen_Mergefeld();
230    void        put_Sonde(char *name, int allowed_mis, double outside_mis);
231    long        get_length_hitliste();
232    void        gen_color_hash(positiontype anz_sonden);
233    GB_HASH         *get_color_hash() { return color_hash; };
234
235    Sondentopf(MO_Liste *BL, MO_Liste *AL);
236    ~Sondentopf();
237};
238
239class Sonde : virtual Noncopyable {
240    char*       kennung;        // Nukleinsaeuren, z.B. "atgatgatg"
241    Bitvector*      bitkennung;     // Sonde 1 Platz eins, ...zwei..., ... Analog zum Aufbau der Listenliste
242    Hit         **hitliste;     // start bei index 0, letztes element enthaelt NULL
243    long        length_hitliste;
244    long        minelem;
245    long        maxelem;
246    positiontype    kombi_far, kombi_mor;
247    long        *Allowed_Mismatch;
248    double      *Outside_Mismatch;
249
250public:
251    double              get_Allowed_Mismatch_no(int no) { return ((Allowed_Mismatch) ? Allowed_Mismatch[no] : 100); };
252    double              get_Outside_Mismatch_no(int no) { return ((Outside_Mismatch) ? Outside_Mismatch[no] : 100); };
253    char*       get_name() { return kennung; };
254    Hit*        get_hitdata_by_number(long index);
255    Hit**       get_Hitliste() {    return hitliste; };
256    long        get_length_hitliste() {    return length_hitliste; };
257    long        get_minelem() { return minelem; };
258    long        get_maxelem() { return maxelem; };
259    positiontype    get_far() { return kombi_far; };
260    positiontype    get_mor() { return kombi_mor; };
261    Bitvector*      get_bitkennung() { return bitkennung; };
262
263    void        set_Allowed_Mismatch_no(int pos, int no) { Allowed_Mismatch[pos] = no; };
264    void        set_Outside_Mismatch_no(int pos, int no) { Outside_Mismatch[pos] = no; };
265    void        set_bitkennung(Bitvector* bv);  // Setzt eine Leere Bitkennung der laenge bits
266    void        set_name(char* name) {  kennung = strdup(name); };
267    void        set_Hitliste(Hit** hitptr) {     hitliste = hitptr; };
268    void        set_length_hitliste(long lhl) { length_hitliste = lhl; };
269    void        set_minelem(long min) { minelem = min; };
270    void        set_maxelem(long max) { maxelem = max; };
271    void        set_far(positiontype far) {  kombi_far = far; };
272    void        set_mor(positiontype mor) {  kombi_mor = mor; };
273
274    void        print();
275    void        sink(long i, long t, MO_Mismatch** A);
276    void        heapsort(long feldlaenge, MO_Mismatch** Nr_Mm_Feld);
277    double      check_for_min(long k, MO_Mismatch** probebacts, long laenge);
278
279    MO_Mismatch**   get_matching_species(bool match_kompl,
280                                         int match_weight,
281                                         int match_mis,
282                                         char *match_seq,
283                                         MO_Liste *convert,
284                                         long *number_of_species);
285    int         gen_Hitliste(MO_Liste *Bakterienliste);
286
287    Sonde(char* bezeichner, int allowed_mis, double outside_mis);
288    ~Sonde();
289};
290// ##################################### Sondentopf Container  ###########################
291
292struct ST_Container : virtual Noncopyable {
293    MO_Liste        *Bakterienliste;
294    MO_Liste        *Auswahlliste;
295    Sondentopf      *sondentopf; // Wird einmal eine Sondentopfliste
296    List<Sondentopf>    *ST_Liste;
297    int         anzahl_basissonden;
298    GB_HASH*        cachehash;
299    List<char>      *Sondennamen;
300
301    Sonde*      cache_Sonde(char *name, int allowed_mis, double outside_mis);
302    Sonde*      get_cached_sonde(char* name);
303    ST_Container(int anz_sonden);
304    ~ST_Container();
305};
306
307// ##################################### MO_Liste #####################################
308/* Die Namen werden in die Hashtabelle mit fortlaufender Nummer abgespeichert
309 * Die Nummer bezeichnet das Feld in einem Array, indem momentan der B.-Name steht,
310 * spaeter
311 * aber auch z.B. ein Pointer auf eine Klasse mit mehr Informationen stehen kann
312 ACHTUNG:: Es kann passieren, dass eine Sonde mehrmals an einen Bakter bindet. Dann wird der Bakter nur einmal in die
313 Liste eingetragen, und damit ist die laenge nicht mehr aussagekraeftig. current-1 enthaelt das letzte element der liste, die
314 Liste beginnt bei 1
315*/
316
317class MO_Liste : virtual Noncopyable {
318    Bakt_Info** mo_liste;
319    long        laenge;
320    long        current;                            // zeigt auf den ersten freien eintrag
321    GB_HASH*    hashptr;
322
323    static GBDATA *gb_main;
324
325public:
326    positiontype fill_marked_bakts();
327    void         get_all_species();
328    long         debug_get_current();
329    long         get_laenge();
330    long         put_entry(const char* name);
331    char*        get_entry_by_index(long index);
332    long         get_index_by_entry(const char* key);
333    Bakt_Info*   get_bakt_info_by_index(long index);
334
335    Bakt_Info** get_mo_liste() { return mo_liste; }
336
337    static void set_gb_main(GBDATA *gb_main_) {
338        mp_assert(implicated(gb_main, gb_main == gb_main_));
339        gb_main = gb_main_;
340    }
341
342    MO_Liste();
343    ~MO_Liste();
344};
345
346
347class Bitvector : virtual Noncopyable {
348    // Bitpositionen sind 0 bis 7
349    char*   vector;
350    int     len;
351    int     num_of_bits;
352public:
353    int     gen_id();
354    Bitvector*  merge(Bitvector* x);
355    int     subset(Bitvector* Obermenge);
356    int     readbit(int pos);
357    int     setbit(int pos);
358    int     delbit(int pos);
359    void    rshift();
360    void    print();
361
362    char*   get_vector() { return vector; };
363    int     get_num_of_bits() { return num_of_bits; };
364    int     get_len() { return len; };
365
366    void    set_vector(char* back) { vector = back; };
367
368    Bitvector(int bits);
369    ~Bitvector();
370};
371
372#else
373#error MultiProbe.hxx included twice
374#endif // MULTIPROBE_HXX
Note: See TracBrowser for help on using the repository browser.