source: tags/ms_r16q2/MULTI_PROBE/MultiProbe.hxx

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