source: tags/arb_5.0/DIST/distanalyse.cxx

Last change on this file was 6143, checked in by westram, 15 years ago
  • backport [6141] (parts changing code, but only strings and comments)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.1 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <memory.h>
4#include <string.h>
5
6#include <math.h>
7
8#include <arbdb.h>
9#include <arbdbt.h>
10
11#include <aw_root.hxx>
12#include <aw_device.hxx>
13#include <aw_window.hxx>
14
15#include <awt.hxx>
16
17#include <awt_tree.hxx>
18#include "dist.hxx"
19#include "di_matr.hxx"
20
21
22
23char *DI_MATRIX::analyse(AW_root *awrdummy)
24{
25    AWUSE(awrdummy);
26    long  row, pos;
27    char *sequ, ch, dummy[280];
28
29    long    act_gci, mean_gci=0;
30    float   act_gc, mean_gc, min_gc=9999.9, max_gc=0.0;
31    long    act_len, mean_len=0, min_len=9999999, max_len=0;
32
33    if (is_AA) {
34        if (nentries> 100) {
35            aw_message("A lot of sequences!\n   ==> fast Kimura selected! (instead of PAM)");
36            aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_KIMURA);
37        }else{
38            aw_message(     "Only limited number of sequences!\n"
39                            "   ==> slow PAM selected! (instead of Kimura)");
40            aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_PAM);
41        }
42        return 0;
43    }
44
45
46    //calculate meanvalue of sequencelength:
47
48    for(row=0; row<nentries; row++) {
49        act_gci = 0;
50        act_len = 0;
51        sequ = entries[row]->sequence_parsimony->sequence;
52        for(pos=0; pos<tree_root->filter->real_len; pos++) {
53            ch = sequ[pos];
54            if(ch == AP_C || ch == AP_G) act_gci++;
55            if(ch == AP_A || ch == AP_C || ch == AP_G || ch == AP_T) act_len++;
56        }
57        mean_gci += act_gci;
58        act_gc = ((float) act_gci) / act_len;
59        if(act_gc < min_gc) min_gc = act_gc;
60        if(act_gc > max_gc) max_gc = act_gc;
61        mean_len += act_len;
62        if(act_len < min_len) min_len = act_len;
63        if(act_len > max_len) max_len = act_len;
64    }
65
66    if (min_len * 1.3 < max_len) {
67        aw_message("Warning: The length of sequences differs significantly\n"
68                   "        be careful, neighbour joining is sensitive to\n"
69                   "        this kind of error");
70    }
71    mean_gc = ((float) mean_gci) / mean_len / nentries;
72    mean_len /= nentries;
73
74
75    if(mean_len < 100) {
76        aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_NONE);
77        aw_message("Too short sequences!\n   ==> No correction selected!");
78        return NULL;
79    }
80
81    if(mean_len < 300) {
82        aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_JUKES_CANTOR);
83        aw_message("Meanlength shorter than 300\n   ==> Jukes Cantor selected!");
84        return NULL;
85    }
86
87    if((mean_len < 1000) || ((max_gc / min_gc) < 1.2)) {
88        if(mean_len < 1000)
89            sprintf(dummy, "Too short sequences for Olsen! \n");
90        else
91            sprintf(dummy, "Maximal GC (%f) : Minimal GC (%f) < 1.2\n", max_gc, min_gc);
92        sprintf(dummy, "%s   ==> Felsenstein selected!", dummy);
93        aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_FELSENSTEIN);
94        aw_message(dummy);
95        return NULL;
96    }
97
98    aw_root->awar(AWAR_DIST_CORR_TRANS)->write_int(DI_TRANSFORMATION_OLSEN);
99    aw_message("Olsen selected!");
100    return NULL;
101
102}
Note: See TracBrowser for help on using the repository browser.