source: tags/initial/DIST/PH_matr.cxx

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

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 46.8 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <memory.h>
4#include <malloc.h>
5#include <string.h>
6
7#include <math.h>
8
9#include <arbdb.h>
10#include <arbdbt.h>
11
12#include <aw_root.hxx>
13#include <aw_device.hxx>
14#include <aw_window.hxx>
15#include <aw_preset.hxx>
16#include <awt.hxx>
17
18#include <awt_tree.hxx>
19#include "dist.hxx"
20#include <BI_helix.hxx>
21#include <awt_csp.hxx>
22#include <CT_ctree.hxx>
23#include "ph_matr.hxx"
24#include "ph_protdist.hxx"
25#include "ph_view_matrix.hxx"
26
27#define AWAR_MATRIX_DNA_PREFIX "dist/dna/matrix"
28PHMATRIX *PHMATRIX::ROOT = 0;
29PH_dmatrix *ph_dmatrix = 0;
30AWT_csp *global_csp = 0;
31AW_CL dist_filter_cl = 0;
32
33AP_matrix DI_dna_matrix(AP_MAX);
34   
35void delete_matrix_cb(AW_root *dummy)
36{
37    AWUSE(dummy);
38    delete PHMATRIX::ROOT;
39    PHMATRIX::ROOT = 0;
40    if (ph_dmatrix){
41        ph_dmatrix->resized();          // @@@ OLIVER
42        ph_dmatrix->display();
43    }
44}
45
46AW_window *create_dna_matrix_window(AW_root *aw_root){
47    AW_window_simple *aws = 0;
48    aws = new AW_window_simple();
49    aws->init( aw_root, "SET_DNA_MATRIX","SET MATRIX", 10, 10 );
50    aws->auto_increment(50,50);
51    aws->button_length(10);
52    aws->callback(AW_POPDOWN);
53    aws->create_button("CLOSE", "CLOSE");
54
55    aws->callback(AW_POPUP_HELP,(AW_CL)"user_matrix.hlp");
56    aws->create_button("HELP", "HELP");
57   
58    aws->at_newline();
59   
60    DI_dna_matrix.create_input_fields(aws,AWAR_MATRIX_DNA_PREFIX);
61    aws->window_fit();
62    return aws;
63}
64
65void create_matrix_variables(AW_root *aw_root, AW_default def)
66{
67    GB_transaction dummy(gb_main);
68    DI_dna_matrix.set_description("","");
69    DI_dna_matrix.x_description[AP_A] = strdup("A");
70    DI_dna_matrix.x_description[AP_C] = strdup("C");
71    DI_dna_matrix.x_description[AP_G] = strdup("G");
72    DI_dna_matrix.x_description[AP_T] = strdup("TU");
73    DI_dna_matrix.x_description[AP_S] = strdup("GAP");
74
75    DI_dna_matrix.y_description[AP_A] = strdup("A");
76    DI_dna_matrix.y_description[AP_C] = strdup("C");
77    DI_dna_matrix.y_description[AP_G] = strdup("G");
78    DI_dna_matrix.y_description[AP_T] = strdup("TU");
79    DI_dna_matrix.y_description[AP_S] = strdup("GAP");
80       
81    DI_dna_matrix.create_awars(aw_root,AWAR_MATRIX_DNA_PREFIX);
82
83    aw_root->awar_int("tmp/" AWAR_MATRIX_DNA_PREFIX "/enable", 0)       ->add_callback(delete_matrix_cb); // user matrix disabled by default
84    {
85        GBDATA *gbd = GB_search((GBDATA *)aw_root->application_database,AWAR_MATRIX_DNA_PREFIX,GB_FIND);
86        GB_add_callback(gbd,GB_CB_CHANGED,(GB_CB)delete_matrix_cb,0);
87    }
88       
89    aw_root->awar_string( "tmp/dummy_string","0",def);
90
91    aw_root->awar_string( "dist/which_species","marked",def)->add_callback(delete_matrix_cb);
92    {
93        char *default_ali = GBT_get_default_alignment(gb_main);
94        aw_root->awar_string( "dist/alignment","",def)          ->add_callback(delete_matrix_cb)->write_string(default_ali);
95        delete default_ali;
96    }
97    aw_root->awar_string( "dist/filter/alignment","none",def);
98    aw_root->awar_string( "dist/filter/name","none",def);
99    aw_root->awar_string( "dist/filter/filter","",def)          ->add_callback(delete_matrix_cb);
100    aw_root->awar_int   ( "dist/filter/simplify",0,def)         ->add_callback(delete_matrix_cb);
101
102    aw_root->awar_string( "dist/col_stat/name","none",def);
103    aw_root->awar_string( "dist/col_stat/alignment","none",def);
104
105    aw_root->awar_string( "dist/cancel/chars",".",def)          ->add_callback(delete_matrix_cb);
106    aw_root->awar_int( "dist/correction/trans",0,def)           ->add_callback(delete_matrix_cb);
107
108    aw_root->awar("dist/filter/alignment")              ->map("dist/alignment");
109    aw_root->awar("dist/col_stat/alignment")    ->map("dist/alignment");
110
111    aw_root->awar_string( "tmp/dist/save_matrix/file_name", "infile",   def);
112    aw_root->awar_string( "tmp/dist/save_matrix/directory", ".",        def);
113    aw_root->awar_string( "tmp/dist/save_matrix/filter", "",    def);
114    aw_root->awar_int(  "tmp/dist/save_matrix/type",    0,      def);
115
116    aw_root->awar_string( "dist/tree/tree_name","tree_temp",def);
117    aw_root->awar_string( "dist/tree/list_tree_name","?????",def);
118    aw_root->awar_string( "dist/tree/sort_tree_name","?????",def)       ->add_callback(delete_matrix_cb);
119    aw_root->awar_string( "dist/tree/compr_tree_name","?????",def)      ->add_callback(delete_matrix_cb);
120    //  aw_root->awar_string( "dist/compress/tree_name","tree_main",def);
121       
122    aw_root->awar_float( "dist/alpha",1.0,def);
123
124
125    GB_push_transaction(gb_main);
126
127    GBDATA *gb_species_data = GB_search(gb_main,"species_data",GB_CREATE_CONTAINER);
128    GB_add_callback(gb_species_data,GB_CB_CHANGED,(GB_CB)delete_matrix_cb,0);
129
130    GB_pop_transaction(gb_main);
131
132}
133
134PHENTRY::PHENTRY(GBDATA *gbd,class PHMATRIX *phmatri)
135{
136    memset((char *)this,0,sizeof(PHENTRY));
137    phmatrix = phmatri;
138
139    GBDATA *gb_ali = GB_find(gbd,phmatrix->use,0,down_level);
140    if (!gb_ali) return;
141    GBDATA *gb_data = GB_find(gb_ali,"data",0,down_level);
142    if (!gb_data) return;
143
144    char *seq = GB_read_char_pntr(gb_data);
145    if (phmatrix->is_AA) {
146        sequence = (AP_sequence *)(sequence_protein = new AP_sequence_simple_protein(phmatrix->tree_root));
147    }else{
148        sequence = (AP_sequence *)(sequence_parsimony = new AP_sequence_parsimony(phmatrix->tree_root));
149    }
150    sequence->set(seq);
151
152    GBDATA *gb_name = GB_find(gbd,"name",0,down_level);
153    name = GB_read_string(gb_name);
154
155    GBDATA *gb_full_name = GB_find(gbd,"full_name",0,down_level);
156    if (gb_full_name) full_name = GB_read_string(gb_full_name);
157
158}
159
160PHENTRY::PHENTRY(char *namei,class PHMATRIX *phmatri)
161{
162    memset((char *)this,0,sizeof(PHENTRY));
163    phmatrix = phmatri;
164    this->name = strdup(namei); 
165}
166
167PHENTRY::~PHENTRY(void)
168{
169    delete sequence_protein;
170    delete sequence_parsimony;
171    delete name;
172    delete full_name;
173       
174}
175
176PHMATRIX::PHMATRIX(GBDATA *gb_maini,AW_root *awr)
177{
178    memset((char *)this,0,sizeof(PHMATRIX));
179    aw_root = awr;
180    gb_main = gb_maini;
181}
182
183char *PHMATRIX::unload(void)
184{
185    delete use;
186    use = 0;
187    long i;
188    for (i=0;i<nentries;i++){
189        delete entries[i];
190    }
191    delete tree_root;
192    delete entries;
193    entries = 0;
194    nentries = 0;
195    return 0;   
196}
197
198PHMATRIX::~PHMATRIX(void)
199{
200    unload();
201    delete matrix;
202}
203
204extern "C" int qsort_strcmp(const void *str1ptr, const void *str2ptr) {
205    GB_CSTR s1 = *(GB_CSTR*)str1ptr;
206    GB_CSTR s2 = *(GB_CSTR*)str2ptr;
207   
208    return strcmp(s1, s2);
209}
210
211char *PHMATRIX::load(char *usei,AP_filter *filter,AP_weights *weights,AP_smatrix *,int all, GB_CSTR sort_tree_name)
212{
213    delete tree_root;
214    tree_root = new AP_tree_root(gb_main,0,0);
215    tree_root->filter = filter;
216    tree_root->weights = weights;
217    this->use = strdup(usei);
218    this->gb_main = ::gb_main;
219    GB_push_transaction(gb_main);
220       
221    seq_len = GBT_get_alignment_len(gb_main,use);
222    is_AA = GBT_is_alignment_protein(gb_main,use);
223    gb_species_data = GB_search(gb_main,"species_data",GB_CREATE_CONTAINER);
224    entries_mem_size = 1000;
225    entries = (PHENTRY **)calloc(sizeof(PHENTRY*),(size_t)entries_mem_size);
226       
227    nentries = 0;
228    GBDATA *gb_species;
229    PHENTRY *phentry;
230   
231    int tree_size; 
232    GBT_TREE *sort_tree = GBT_read_tree_and_size(gb_main, sort_tree_name, sizeof(GBT_TREE), &tree_size);
233    tree_size++;
234    GB_CSTR *species_in_sort_tree = 0; 
235   
236    int no_of_species = all ? GBT_recount_species(gb_main) : GBT_count_marked_species(gb_main);
237    int in_tree_species = 0;
238    int out_tree_species = no_of_species;
239    int unknown_species_in_tree = 0;
240   
241    if (!sort_tree) {
242        aw_message("No valid tree given to sort matrix (using default database order)"); 
243    } 
244    else {
245        species_in_sort_tree = GBT_get_species_names_of_tree(sort_tree); 
246       
247        for (int i=0; i<tree_size; i++) { // read all marked species in tree
248            gb_species = GBT_find_species_rel_species_data(gb_species_data, species_in_sort_tree[i]);
249            if (!gb_species) {
250                aw_message(GB_export_error("Species '%s' found in tree '%s' but NOT in database.",
251                                           species_in_sort_tree[i], sort_tree_name));
252                unknown_species_in_tree++;
253                continue;
254            }
255            if (all || GB_read_flag(gb_species)) { 
256                in_tree_species++;
257                phentry = new PHENTRY(gb_species,this);
258                if (phentry->sequence) {        // a species found
259                    entries[nentries++] = phentry;
260                    if (nentries == entries_mem_size) {
261                        entries_mem_size +=1000;
262                        entries = (PHENTRY **)realloc((MALLOC_T)entries,(size_t)(sizeof(PHENTRY*)*entries_mem_size));
263                    }
264                }else{
265                    delete phentry;
266                } 
267            }
268        } 
269        out_tree_species = no_of_species-in_tree_species; // # of species not loaded yet (because not in tree)
270        gb_assert(out_tree_species>=0);
271        if (out_tree_species) { 
272            qsort(species_in_sort_tree, tree_size, sizeof(*species_in_sort_tree), qsort_strcmp); // sort species names
273#if defined(DEBUG) && 0
274            printf("Sorted tree:\n");
275            for (int x=0; x<tree_size; x++) {
276                printf("- %s\n", species_in_sort_tree[x]);
277            }
278#endif
279        }
280    }
281   
282    if (unknown_species_in_tree) {
283        aw_message(GB_export_error("We found %i species in tree '%s' which are not in database.\n"
284                                   "This does not aafect the current calculation, but you should think about it.",
285                                   unknown_species_in_tree, sort_tree_name));
286    }
287   
288    gb_assert(out_tree_species>=0);
289    if (out_tree_species) { // there are species outside the tree (or no valid sort tree selected) => load all marked species not loaded yet
290        int count = 0;
291       
292        if (all) gb_species = GBT_first_species_rel_species_data(gb_species_data);
293        else     gb_species = GBT_first_marked_species_rel_species_data(gb_species_data);
294       
295        while (gb_species) {
296            int load_species = 0; 
297           
298            if (in_tree_species) { // test if species already loaded
299                char *species_name = 0;
300                GBDATA *gb_name = GB_find(gb_species, "name", 0, down_level);
301                if (gb_name) {
302                    species_name = GB_read_string(gb_name); 
303                    if (bsearch(&species_name, species_in_sort_tree, tree_size, sizeof(*species_in_sort_tree), qsort_strcmp)==0) {
304                        load_species = 1;
305#if defined(DEBUG) && 0
306                        printf("Not in tree: %s\n", species_name);
307#endif
308                    }
309                    free(species_name);
310                } 
311            }
312            else { 
313                load_species = 1;
314            }
315           
316            if (load_species) {
317                count++;
318                phentry = new PHENTRY(gb_species,this);
319                if (phentry->sequence) {        // a species found
320                    entries[nentries++] = phentry;
321                    if (nentries == entries_mem_size) {
322                        entries_mem_size +=1000;
323                        entries = (PHENTRY **)realloc((MALLOC_T)entries,(size_t)(sizeof(PHENTRY*)*entries_mem_size));
324                    }
325                }else{
326                    delete phentry;
327                } 
328            }
329           
330            if (all) gb_species = GBT_next_species(gb_species);
331            else     gb_species = GBT_next_marked_species(gb_species);
332        }
333    }
334   
335    delete [] species_in_sort_tree;
336    if (sort_tree) GBT_delete_tree(sort_tree);
337   
338    GB_pop_transaction(gb_main);
339
340    return 0;
341}
342
343
344/******************************************************************************************
345                        Calculate the global rate_matrix
346******************************************************************************************/
347void PHMATRIX::clear(PH_MUT_MATR &hits)
348{
349    int i,j;
350    for (i=0;i<AP_MAX;i++){
351        for (j=0;j<AP_MAX;j++){
352            hits[i][j] = 0;
353        }
354    }
355}
356
357void PHMATRIX::make_sym(PH_MUT_MATR &hits)
358{
359    int i,j;
360    for (i=AP_A;i<AP_MAX;i*=2){
361        for (j=AP_A;j<=i;j*=2){
362            hits[i][j] = hits[j][i] = hits[i][j] + hits[j][i];
363        }
364    }
365}
366
367void PHMATRIX::rate_write(PH_MUT_MATR &hits,FILE *out){
368    int i,j;
369    for (i=AP_A;i<AP_MAX;i*=2){
370        for (j=AP_A;j<AP_MAX;j*=2){
371            fprintf(out,"%5li ",hits[i][j]);
372        }
373        fprintf(out,"\n");
374    }
375}
376
377long *PHMATRIX::create_helix_filter(BI_helix *helix,AP_filter *filter){
378    long *result = (long *)calloc(sizeof(long),(size_t)filter->real_len);
379    long *temp = (long *)calloc(sizeof(long),(size_t)filter->real_len);
380    int i,count;
381    count = 0;
382    for (i=0;i<filter->filter_len;i++) {
383        if (filter->filter_mask[i]) {
384            temp[i] = count;
385            if (helix->entries[i].pair_type== HELIX_PAIR) {
386                result[count] = helix->entries[i].pair_pos;
387            }else{
388                result[count] = -1;
389            }
390            count++;
391        }
392    }
393    while (--count >=0){
394        if (result[count] >= 0) {
395            result[count] = temp[result[count]];
396        }
397    }
398    free((char *)temp);
399    return result;
400}
401
402GB_ERROR PHMATRIX::calculate_rates(PH_MUT_MATR &hrates,PH_MUT_MATR &nrates,PH_MUT_MATR &pairs,long *filter){
403
404    if (nentries<=1) {
405        return "There are no species selected";
406    }
407    register long       row,col,pos,s_len;
408    register char *seq1,*seq2;
409    s_len = tree_root->filter->real_len;
410    this->clear(hrates);
411    this->clear(nrates);
412    this->clear(pairs);
413    for (row = 0; row<nentries;row++){
414        double gauge = (double)row/(double)nentries;
415        if (aw_status(gauge*gauge)) return "Aborted";
416        for (col=0; col<row; col++) {
417            seq1 = entries[row]->sequence_parsimony->sequence;
418            seq2= entries[col]->sequence_parsimony->sequence;
419            for (pos = 0; pos < s_len; pos++){
420                if(filter[pos]>=0) {
421                    hrates[*seq1][*seq2]++;
422                }else{
423                    nrates[*seq1][*seq2]++;
424                }
425                seq1++; seq2++;
426            }
427        }
428    }
429    for (row = 0; row<nentries;row++){
430        seq1 = entries[row]->sequence_parsimony->sequence;
431        for (pos = 0; pos < s_len; pos++){
432            if(filter[pos]>=0) {
433                pairs[seq1[pos]][seq1[filter[pos]]]++;
434            }
435        }
436    }
437    return 0;
438}
439
440/******************************************************************************************
441        Some test functions to check correlated base correction
442******************************************************************************************/
443
444
445GB_ERROR PHMATRIX::haeschoe(const char *path)
446{
447    PH_MUT_MATR temp,temp2,pairs;
448    static BI_helix *helix = 0;
449    if (!helix) helix = new BI_helix();
450    const char *error = helix->init(gb_main);
451    if (error) return error;
452
453    FILE *out = fopen(path,"w");
454    if (!out) return "Cannot open file";
455
456    aw_openstatus("Calculating Distanz Matrix");
457    aw_status("Calculating global rate matrix");
458
459    fprintf(out,"Pairs in helical regions:\n");
460    long *filter = create_helix_filter(helix,tree_root->filter);
461    error = calculate_rates(temp,temp2,pairs,filter);
462    if (error){
463        aw_closestatus();
464        fclose(out);
465        return error;
466    }   
467    rate_write(pairs,out);
468    make_sym(temp);make_sym(temp2);
469    fprintf(out,"\nRatematrix helical parts:\n");
470    rate_write(temp,out);
471    fprintf(out,"\nRatematrix non helical parts:\n");
472    rate_write(temp2,out);
473
474    register long       row,col,pos,s_len;
475    register char *seq1,*seq2;
476    s_len = tree_root->filter->real_len;
477    fprintf(out,"\nDistanzmatrix (Helixdist Helixlen Nonhelixdist Nonhelixlen):");
478    fprintf(out,"\n%li",nentries);
479    const int MAXDISTDEBUG = 1000;
480    double distdebug[MAXDISTDEBUG];
481    for (pos = 0;pos<MAXDISTDEBUG;pos++) distdebug[pos] = 0.0;
482    for (row = 0; row<nentries;row++){
483        if ( nentries > 100 || (row&0xf == 0)){
484            double gauge = (double)row/(double)nentries;
485            if (aw_status(gauge*gauge)) {
486                aw_closestatus();
487                return "Aborted";
488            }
489        }
490        fprintf (out,"\n%s      ",entries[row]->name);
491
492        for (col=0; col<row; col++) {
493            seq1 = entries[row]->sequence_parsimony->sequence;
494            seq2= entries[col]->sequence_parsimony->sequence;
495            this->clear(temp);
496            this->clear(temp2);
497            for (pos = 0; pos < s_len; pos++){
498                if(filter[pos]>=0) {
499                    temp[*seq1][*seq2]++;
500                }else{
501                    temp2[*seq1][*seq2]++;
502                }
503                seq1++; seq2++;
504            }
505            long hdist= 0, hall2 = 0;
506            int i,j;
507            for (i=AP_A;i<AP_MAX;i*=2){
508                for (j=AP_A;j<AP_MAX;j*=2){
509                    hall2 += temp[i][j];
510                    if (i!=j) hdist += temp[i][j];
511                }
512            }
513
514            long dist= 0, all = 0;
515            for (i=AP_A;i<=AP_T;i*=2){
516                for (j=AP_A;j<=AP_T;j*=2){
517                    all += temp2[i][j];
518                    if (i!=j) dist += temp2[i][j];
519                }
520            }
521            fprintf(out,"(%4li:%4li %4li:%4li) ",hdist,hall2, dist,all);
522            if (all>100){
523                distdebug[dist*MAXDISTDEBUG/all] = (double)hdist/(double)hall2;         
524            }
525        }
526    }
527
528    fprintf (out,"\n");
529    fprintf (out,"\nhdist/dist:\n");
530       
531    for (pos = 1;pos<MAXDISTDEBUG;pos++) {
532        if (distdebug[pos]) {
533            fprintf(out,"%4f %5f\n",(double)pos/(double)MAXDISTDEBUG,distdebug[pos]/(double)pos*(double)MAXDISTDEBUG);
534        }
535    }
536    aw_closestatus();
537    fclose(out);
538
539    return 0;
540}
541
542char           *PHMATRIX::calculate_overall_freqs(double rel_frequencies[AP_MAX], char *cancel)
543{
544    long            hits2[AP_MAX];
545    long            sum = 0;
546    int         i,row;
547    register    char *seq1;
548    register    int pos;
549    register    int b;
550    register long s_len = tree_root->filter->real_len;
551
552    memset((char *) &hits2[0], 0, sizeof(hits2));
553    for (row = 0; row < nentries; row++) {
554        seq1 = entries[row]->sequence_parsimony->sequence;
555        for (pos = 0; pos < s_len; pos++) {
556            b = *(seq1++);
557            if (cancel[b]) continue;
558            hits2[b]++;
559        }
560    }
561    for (i = 0; i < AP_MAX; i++)        sum += hits2[i];
562    for (i = 0; i < AP_MAX; i++)        rel_frequencies[i] = hits2[i] / (double) sum;
563    return 0;
564}
565
566double PHMATRIX::corr(double dist, double b, double & sigma){
567    const double eps = 0.01;
568    double ar = 1.0 - dist/b;
569    sigma = 1000.0;
570    if (ar< eps) return 3.0;
571    sigma = b/ar;
572    return - b * log(1-dist/b);
573}
574
575GB_ERROR PHMATRIX::calculate(AW_root *awr, char *cancel, double /*alpha*/, PH_TRANSFORMATION transformation)
576{
577
578    if (transformation == PH_TRANSFORMATION_HAESCH) {
579        GB_ERROR error = haeschoe("outfile");
580        if (error) return error;
581        return "Your matrizes have been written to 'outfile'\nSorry I can not make a tree";
582    }
583    int user_matrix_enabled = awr->awar("tmp/" AWAR_MATRIX_DNA_PREFIX "/enable")->read_int();
584    if (user_matrix_enabled){   // set transformation Matrix
585        switch (transformation){
586            case PH_TRANSFORMATION_NONE:
587            case PH_TRANSFORMATION_SIMILARITY:
588            case PH_TRANSFORMATION_JUKES_CANTOR:
589                break;
590            default:
591                return GB_export_error("Sorry not implemented:\n"
592                                       "        This kind of distance correction does not support\n"
593                                       "        a user defined matrix");
594        }
595        DI_dna_matrix.read_awars(awr,AWAR_MATRIX_DNA_PREFIX);
596        DI_dna_matrix.normize();
597    }
598
599
600       
601    matrix = new AP_smatrix(nentries);
602
603    register long s_len = tree_root->filter->real_len;
604    long        hits[AP_MAX][AP_MAX];
605    int row;
606    int col;
607    size_t      i;
608
609    if (nentries<=1) {
610        return "There are no species selected";
611    }
612    memset(&cancel_columns[0],0,256);
613
614    for (i=0;i<strlen(cancel);i++){
615        int j = cancel[i];
616        j = AP_sequence_parsimony::table[j];
617        cancel_columns[j] = 1;
618    }
619    long        columns;
620    double b;
621    long frequencies[AP_MAX];
622    double rel_frequencies[AP_MAX];
623    double S_square=0;
624
625    switch(transformation){
626        case PH_TRANSFORMATION_FELSENSTEIN:
627            this->calculate_overall_freqs(rel_frequencies,cancel_columns);
628            S_square = 0.0;
629            for (i=0;i<AP_MAX; i++) S_square+= rel_frequencies[i]*rel_frequencies[i];
630            break;
631        default:        break;
632    };
633
634    for (row = 0; row<nentries;row++){
635        if ( nentries > 100 || (row&0xf == 0)){
636            double gauge = (double)row/(double)nentries;
637            if (aw_status(gauge*gauge)) {
638                aw_closestatus();
639                return "Aborted";
640            }
641        }
642        for (col=0; col<=row; col++) {
643            columns = 0;
644            register char *seq1 = entries[row]->sequence_parsimony->sequence;
645            register char *seq2= entries[col]->sequence_parsimony->sequence;
646            b = 0.0;
647            switch(transformation){
648                case  PH_TRANSFORMATION_JUKES_CANTOR:
649                    b = 0.75;
650                case  PH_TRANSFORMATION_NONE:
651                case  PH_TRANSFORMATION_SIMILARITY:{
652                    double      dist = 0.0;
653                    if (user_matrix_enabled){
654                        memset((char *)hits,0,sizeof(long) * AP_MAX * AP_MAX);
655                        int pos;
656                        for (pos = s_len; pos >=0; pos--){
657                            hits[*(seq1++)][*(seq2++)]++;
658                        }
659                        int x,y;
660                        double diffsum = 0.0;
661                        double all_sum = 0.001;
662                        for (x = AP_A; x < AP_MAX; x*=2){
663                            for (y = AP_A; y < AP_MAX; y*=2){
664                                if (x==y){
665                                    all_sum += hits[x][y];
666                                }else{
667                                    diffsum += hits[x][y] * DI_dna_matrix.get(x,y);
668                                    all_sum += hits[x][y] * DI_dna_matrix.get(x,y);
669                                }
670                            }
671                        }
672                        dist = diffsum / all_sum;
673                    }else{
674                        register int pos;
675                        register int b1,b2;
676                        for (pos = s_len; pos >=0; pos--){
677                            b1 =*(seq1++);
678                            b2 =*(seq2++);
679                            if (cancel_columns[b1]) continue;
680                            if (cancel_columns[b2]) continue;
681                            columns++;
682                            if (b1&b2) continue;
683                            dist+=1.0;
684                        }
685                        if (columns== 0) columns = 1;
686                        dist /= columns;
687                    }
688                    if (transformation==PH_TRANSFORMATION_SIMILARITY){
689                        dist =  (1.0-dist);
690                    }else       if (b){
691                        double sigma;
692                        dist = this->corr(dist,b,sigma);
693                    }
694                    matrix->set(row,col,dist);
695                    break;
696                }
697                case PH_TRANSFORMATION_KIMURA:
698                case PH_TRANSFORMATION_OLSEN:
699                case PH_TRANSFORMATION_FELSENSTEIN:{
700                    register int pos;
701                    double      dist = 0.0;
702                    long N,P,Q,M;
703                    double p,q;
704                    memset((char *)hits,0,sizeof(long) * AP_MAX * AP_MAX);
705                    for (pos = s_len; pos >=0; pos--){
706                        hits[*(seq1++)][*(seq2++)]++;
707                    }
708                    switch(transformation){
709                        case PH_TRANSFORMATION_KIMURA:
710                            P = hits[AP_A][AP_G] +
711                                hits[AP_G][AP_A] +
712                                hits[AP_C][AP_T] +
713                                hits[AP_T][AP_C];
714                            Q = hits[AP_A][AP_C] +
715                                hits[AP_A][AP_T] +
716                                hits[AP_C][AP_A] +
717                                hits[AP_T][AP_A] +
718                                hits[AP_G][AP_C] +
719                                hits[AP_G][AP_T] +
720                                hits[AP_C][AP_G] +
721                                hits[AP_T][AP_G];
722                            M = hits[AP_A][AP_A] +
723                                hits[AP_C][AP_C] +
724                                hits[AP_G][AP_G] +
725                                hits[AP_T][AP_T];
726                            N = P+Q+M;
727                            if (N==0) N=1;
728                            p = (double)P/(double)N;
729                            q = (double)Q/(double)N;
730                            dist = - .5 * log(
731                                              (1.0-2.0*p-q)*sqrt(1.0-2.0*q)
732                                              );
733                            break;
734
735                        case PH_TRANSFORMATION_OLSEN:
736                        case PH_TRANSFORMATION_FELSENSTEIN:
737
738                            memset((char *)frequencies,0,
739                                   sizeof(long) * AP_MAX);
740
741                            N = 0;
742                            M = 0;
743
744                            for (i=0;i<AP_MAX;i++) {
745                                if (cancel_columns[i]) continue;
746                                unsigned int j;
747                                for (j=0;j<i;j++) {
748                                    if (cancel_columns[j]) continue;
749                                    frequencies[i] +=
750                                        hits[i][j]+
751                                        hits[j][i];
752                                }
753                                frequencies[i] += hits[i][i];
754                                N += frequencies[i];
755                                M += hits[i][i];;
756                            }
757                            if (N==0) N=1;
758                            if (transformation == PH_TRANSFORMATION_OLSEN){     // Calc sum square freq inividually for each line
759                                S_square = 0.0;
760                                for (i=0;i<AP_MAX; i++) S_square+= frequencies[i]*frequencies[i];
761                                b = 1.0 - S_square/((double)N*(double)N);
762                            }else{
763                                b = 1.0 - S_square;
764                            }
765
766                            dist = ((double)(N-M)) / (double) N;
767                            double sigma;
768                            dist = this->corr(dist,b,sigma);
769                            break;
770
771                        default: return "Sorry: Transformation not implemented";
772                    }
773                    matrix->set(row,col,dist);
774                    break;
775                }
776                default:;
777            }   /* switch */
778        }
779    }
780    return 0;
781}
782
783GB_ERROR PHMATRIX::calculate_pro(PH_TRANSFORMATION transformation){
784    ph_cattype whichcat;
785    ph_codetype whichcode = universal;
786       
787    switch (transformation){
788        case PH_TRANSFORMATION_NONE:
789            whichcat = none;
790            break;
791        case PH_TRANSFORMATION_SIMILARITY:
792            whichcat = similarity;
793            break;
794        case PH_TRANSFORMATION_KIMURA:
795            whichcat = kimura;
796            break;
797        case PH_TRANSFORMATION_PAM:
798            whichcat = pam;
799            break;
800        case PH_TRANSFORMATION_CATEGORIES_HALL:
801            whichcat = hall;
802            break;
803        case PH_TRANSFORMATION_CATEGORIES_BARKER:
804            whichcat = george;
805            break;
806        case PH_TRANSFORMATION_CATEGORIES_CHEMICAL:
807            whichcat = chemical;
808            break;
809        default:
810            return "This correction is not available for protein data";
811    }
812    matrix = new AP_smatrix(nentries);
813
814    ph_protdist prodist(whichcode, whichcat, nentries,entries, tree_root->filter->real_len,matrix);
815    return prodist.makedists();
816}
817
818
819GB_ERROR ph_calculate_matrix_cb(AW_window *aww, AW_CL bootstrap_flag) // returns "Aborted" if stopped by user
820{
821    GB_push_transaction(gb_main);
822    if (PHMATRIX::ROOT){
823        GB_pop_transaction(gb_main);
824        return 0;
825    }
826    AW_root *aw_root = aww->get_root();
827    char        *use = aw_root->awar("dist/alignment")->read_string();
828    long ali_len = GBT_get_alignment_len(gb_main,use);
829    if (ali_len<=0) {
830        GB_pop_transaction(gb_main);
831        delete use;
832        aw_message("Please select a valid alignment");
833        return "Error";
834    }
835    if (!bootstrap_flag){
836        aw_openstatus("Calculating Matrix");
837        aw_status("Read the database");
838    }
839
840    PHMATRIX *phm = new PHMATRIX(gb_main,aw_root);
841    phm->matrix_type = PH_MATRIX_FULL;
842    char        *cancel = aw_root->awar("dist/cancel/chars")->read_string();
843
844    AP_filter *ap_filter = awt_get_filter(aw_root,dist_filter_cl);
845    if (bootstrap_flag){
846        ap_filter->enable_bootstrap(0);
847    }
848
849    AP_weights *ap_weights = new AP_weights;
850    ap_weights->init(ap_filter);
851
852    AP_smatrix *ap_ratematrix = 0;
853
854    char *load_what = aw_root->awar("dist/which_species")->read_string();
855    char *sort_tree_name = aw_root->awar("dist/tree/sort_tree_name")->read_string();
856    int all_flag = 0;
857    if (!strcmp(load_what,"all")) all_flag = 1; 
858    phm->load(use,ap_filter,ap_weights,ap_ratematrix,all_flag, sort_tree_name);
859    free(sort_tree_name);
860    GB_pop_transaction(gb_main);
861    if (aw_status()) {
862        phm->unload();
863        return "Aborted";
864    }
865
866    PH_TRANSFORMATION trans;
867    trans = (PH_TRANSFORMATION)aw_root->awar("dist/correction/trans")->read_int();
868
869    GB_ERROR error;
870    if (phm->is_AA){
871        error = phm->calculate_pro(trans);
872    }else{
873        error = phm->calculate(aw_root,cancel,0.0,trans);
874    }
875    if (!bootstrap_flag){
876        aw_closestatus();
877    }
878    delete phm->ROOT;
879    if (error && strcmp(error,"Aborted")){
880        aw_message(error);
881        delete phm;
882        phm->ROOT = 0;
883    }else{
884        phm->ROOT = phm;
885
886    }
887    delete      load_what;
888
889    delete cancel;
890    delete ap_filter;
891    delete ap_weights;
892    delete ap_ratematrix;
893
894    delete use;
895    return error;
896}
897
898
899void ph_view_matrix_cb(AW_window *aww){
900    GB_ERROR error = ph_calculate_matrix_cb(aww,0);
901    if (error) return;
902
903    static AW_window *viewer = 0;
904    if (!ph_dmatrix){
905        ph_dmatrix = new PH_dmatrix();
906    }
907   
908    if (!viewer) viewer = PH_create_view_matrix_window(aww->get_root(), ph_dmatrix);
909   
910    ph_dmatrix->init();
911    ph_dmatrix->display();
912    viewer->show();
913}
914
915void ph_save_matrix_cb(AW_window *aww)
916{                       // save the matrix
917    GB_ERROR error = ph_calculate_matrix_cb(aww,0);
918    if (error) return;
919    char *filename = aww->get_root()->awar("tmp/dist/save_matrix/file_name")->read_string();
920    enum PH_SAVE_TYPE type = (enum PH_SAVE_TYPE)aww->get_root()->awar("tmp/dist/save_matrix/type")->read_int();
921    PHMATRIX::ROOT->save(filename,type);
922    delete filename;
923    if (error) aw_message(error);
924    else        aww->get_root()->awar("tmp/dist/save_matrix/directory")->touch();
925    aww->hide();
926}
927
928AW_window *create_save_matrix_window(AW_root *aw_root, char *base_name)
929{
930    static AW_window_simple *aws = 0;
931    if (aws) return aws;
932    aws = new AW_window_simple;
933    aws->init( aw_root, "SAVE_MATRIX", "Save Matrix", 10, 10 );
934    aws->load_xfig("sel_box.fig");
935
936    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
937    aws->create_button("CLOSE", "CANCEL","C");
938
939
940    aws->at("help");aws->callback(AW_POPUP_HELP,(AW_CL)"save_matrix.hlp");
941    aws->create_button("HELP", "HELP","H");
942
943    aws->at("user");
944    aws->create_option_menu("tmp/dist/save_matrix/type");
945    aws->insert_default_option("Phylip Format (Lower Triangular Matrix)","P",PH_SAVE_PHYLIP_COMP);
946    aws->insert_option("Readable (using NDS)","R",PH_SAVE_READABLE);
947    aws->update_option_menu(); 
948
949    awt_create_selection_box((AW_window *)aws,base_name);
950
951    aws->at("save2");aws->callback(ph_save_matrix_cb);
952    aws->create_button("SAVE", "SAVE","S");
953
954    aws->callback( (AW_CB0)AW_POPDOWN);
955    aws->at("cancel2");
956    aws->create_button("CLOSE", "CANCEL","C");
957
958    return aws;
959}
960
961AW_window *awt_create_select_cancel_window(AW_root *aw_root)
962{
963    AW_window_simple *aws = new AW_window_simple;
964    aws->init( aw_root, "SELECT_CHARS_TO_CANCEL_COLOUM", "CANCEL SELECT", 10, 10 );
965    aws->load_xfig("ph_cancel.fig");
966
967    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
968    aws->create_button("CLOSE", "CLOSE","C");
969
970    aws->at("cancel");
971    aws->create_input_field("dist/cancel/chars",12);
972
973    return (AW_window *)aws;
974}
975
976const char *enum_trans_to_string[] = {
977    "none",
978    "similarity",
979    "jukes_cantor",
980    "felsenstein",
981
982    "pam",
983    "hall",
984    "barker",
985    "chemical",
986
987    "haesch",
988    "kimura",
989    "olsen",
990    "felsenstein voigt",
991    "olsen voigt",
992    "max ml"
993};
994
995void ph_calculate_tree_cb(AW_window *aww,AW_CL bootstrap_flag)
996{
997    AW_root *aw_root = aww->get_root();
998    GB_ERROR error = 0;
999    GBT_TREE *tree = 0;
1000    char **all_names = 0;
1001    int loop_count = 0;
1002    PHMATRIX *matr;
1003   
1004    if (bootstrap_flag){
1005        switch (aw_message("Are You ABSOLUTELY sure that You have READ\n"
1006                           "the bootstrap help","Yes,Show Help,Cancel")){
1007            case 1:
1008                AW_POPUP_HELP(aww,(AW_CL)"bootstrap.hlp");
1009                return;
1010            case 2:
1011                return;
1012            default:
1013                break;
1014        }
1015        aw_openstatus("Calculate tree");
1016        ph_calculate_matrix_cb(aww,bootstrap_flag);
1017        matr = PHMATRIX::ROOT;
1018        if (!matr) return;
1019        all_names = (char **)calloc(sizeof(char *),(size_t)matr->nentries+2);
1020        for (long i=0;i<matr->nentries;i++){
1021            all_names[i] = strdup(matr->entries[i]->name);
1022        }
1023        ctree_init(matr->nentries,all_names);
1024    }else{
1025        aw_openstatus("Calculate tree");
1026    }
1027    do {
1028        if (bootstrap_flag) {
1029            loop_count++;
1030            if (aw_status(GBS_global_string("Tree #%i",loop_count))) break; // end of bootstrap
1031            delete PHMATRIX::ROOT;PHMATRIX::ROOT = 0;
1032        }
1033        error = ph_calculate_matrix_cb(aww,bootstrap_flag);
1034        if (error && !strcmp(error,"Aborted")) break;
1035        if (!PHMATRIX::ROOT) return;
1036
1037        matr = PHMATRIX::ROOT;
1038        char **names = (char **)calloc(sizeof(char *),(size_t)matr->nentries+2);
1039        for (long i=0;i<matr->nentries;i++){
1040            names[i] = matr->entries[i]->name;
1041        }
1042        tree = neighbourjoining(names,matr->matrix->m,matr->nentries,sizeof(GBT_TREE));
1043        if (0){
1044            FILE *out = fopen(GBS_global_string("tree_%i",loop_count),"w");
1045            GBT_export_tree(gb_main,out,tree,GB_FALSE);
1046            fclose(out);
1047        }
1048        if (bootstrap_flag){
1049            insert_ctree(tree,1);
1050            GBT_delete_tree(tree); tree = 0;
1051        }
1052        delete names;
1053       
1054    }while(bootstrap_flag);
1055   
1056    if (bootstrap_flag){
1057        tree = get_ctree();
1058    }
1059    {
1060        char *tree_name = aw_root->awar("dist/tree/tree_name")->read_string();
1061        GB_begin_transaction(gb_main);
1062        error = GBT_write_tree(gb_main,0,tree_name,tree);
1063        if (error) {
1064            GB_abort_transaction(gb_main);
1065            aw_message(error);
1066        }else{
1067            char *filter_name   = aw_root->awar("dist/filter/name")->read_string();
1068            int transr          = aw_root->awar("dist/correction/trans")->read_int();
1069               
1070            char *comment = (char *)GBS_global_string("PRG=dnadist CORR=%s FILTER=%s PKG=ARB",
1071                                                      enum_trans_to_string[transr], /*filter_name*/AWT_get_combined_filter_name(aw_root));
1072            delete filter_name;
1073            GBT_write_tree_rem(gb_main,tree_name,comment);
1074            GB_commit_transaction(gb_main);
1075        }
1076        delete tree_name;
1077    }
1078    if (tree) GBT_delete_tree(tree);
1079    aw_closestatus();
1080    aw_status();                // remove flag
1081    if (bootstrap_flag){
1082        GBT_free_names(all_names);
1083        delete PHMATRIX::ROOT;PHMATRIX::ROOT = 0;
1084    }
1085}
1086
1087
1088void ph_autodetect_callback(AW_window *aww) 
1089{
1090    GB_push_transaction(gb_main);
1091    if (PHMATRIX::ROOT){
1092        delete PHMATRIX::ROOT;
1093        PHMATRIX::ROOT = 0;
1094    }
1095    AW_root *aw_root = aww->get_root();
1096    char        *use = aw_root->awar("dist/alignment")->read_string();
1097    long ali_len = GBT_get_alignment_len(gb_main,use);
1098    if (ali_len<=0) {
1099        GB_pop_transaction(gb_main);
1100        delete use;
1101        aw_message("Please select a valid alignment");
1102        return;
1103    }
1104
1105    aw_openstatus("Analysing data...");
1106    aw_status("Read the database");
1107
1108    PHMATRIX *phm = new PHMATRIX(gb_main,aw_root);
1109    char        *filter_str = aw_root->awar("dist/filter/filter")->read_string();
1110    char        *cancel = aw_root->awar("dist/cancel/chars")->read_string();
1111
1112    AP_filter *ap_filter = new AP_filter;
1113    long flen = strlen(filter_str);
1114    if (flen == ali_len){
1115        ap_filter->init(filter_str,"0",ali_len);
1116    }else{
1117        if (flen){
1118            aw_message("WARNING: YOUR FILTER LEN IS NOT THE ALIGNMENT LEN\nFILTER IS TRUNCATED WITH ZEROS OR CUTTED");
1119            ap_filter->init(filter_str,"0",ali_len);
1120        }else{
1121            ap_filter->init(ali_len);
1122        }
1123    }
1124
1125    AP_weights *ap_weights = new AP_weights;
1126    ap_weights->init(ap_filter);
1127
1128    AP_smatrix *ap_ratematrix = 0;
1129
1130    char        *load_what = aw_root->awar("dist/which_species")->read_string();
1131    char *sort_tree_name = aw_root->awar("dist/tree/sort_tree_name")->read_string();
1132    int all_flag = 0;
1133    if (!strcmp(load_what,"all")) all_flag = 1;
1134
1135    delete phm->ROOT;
1136    phm->ROOT = 0;
1137    phm->load(use,ap_filter,ap_weights,ap_ratematrix,all_flag, sort_tree_name);
1138    free(sort_tree_name);
1139    GB_pop_transaction(gb_main);
1140
1141    aw_status("Search Correction");
1142
1143    PH_TRANSFORMATION trans;
1144    trans = (PH_TRANSFORMATION)aw_root->awar("dist/correction/trans")->read_int();
1145
1146
1147    char *error = phm->analyse(aw_root);   
1148    aw_closestatus();
1149
1150    delete phm;
1151    if (error) aw_message(error);
1152
1153    delete      load_what;
1154
1155    delete cancel;
1156    delete ap_filter;
1157    delete ap_weights;
1158    delete ap_ratematrix;
1159
1160    delete use;
1161    delete filter_str;
1162}
1163
1164void ap_exit(AW_window *)
1165{
1166    if (gb_main) GB_exit(gb_main);
1167    exit(0);
1168}
1169
1170void ph_calculate_full_matrix_cb(AW_window *aww){
1171    if (PHMATRIX::ROOT && PHMATRIX::ROOT->matrix_type == PH_MATRIX_FULL) return;
1172    delete_matrix_cb(0);
1173    ph_calculate_matrix_cb(aww,0);
1174    if (ph_dmatrix){
1175        ph_dmatrix->resized();         
1176        ph_dmatrix->display();
1177    }
1178}
1179
1180void ph_compress_tree_cb(AW_window *aww){
1181    GB_transaction dummy(gb_main);
1182    char *treename = aww->get_root()->awar("dist/tree/compr_tree_name")->read_string();
1183    GB_ERROR error = 0;
1184    GBT_TREE *tree = GBT_read_tree(gb_main,treename,sizeof(GBT_TREE));
1185    if (!tree) error = "Please select a valid tree first";
1186
1187    if (PHMATRIX::ROOT && PHMATRIX::ROOT->matrix_type!=PH_MATRIX_COMPRESSED){
1188        delete_matrix_cb(0);            // delete wrong matrix !!!
1189    }
1190       
1191    ph_calculate_matrix_cb(aww,0);
1192    if (!PHMATRIX::ROOT) error = "Cannot calculate your matrix";
1193
1194    if (!error) {
1195        error = PHMATRIX::ROOT->compress(tree);
1196    }
1197
1198    if (tree) GBT_delete_tree(tree);
1199   
1200    if (error) {
1201        aw_message(error);
1202    }
1203    else {
1204        //      aww->hide();
1205        if (ph_dmatrix){
1206            ph_dmatrix->resized();             
1207            ph_dmatrix->display();
1208        }
1209    }
1210    delete treename;
1211}
1212
1213/*
1214AW_window *create_select_compress_tree(AW_root *awr){
1215    static AW_window_simple *aws = 0;
1216    if (aws) return (AW_window *)aws;
1217
1218    aws = new AW_window_simple;
1219    aws->init( awr, "SELECT_TREE_TO_COMPRESS_MATRIX", "SELECT A TREE TO COMPRESS MATRIX", 400, 200 );
1220    aws->at(10,10);
1221    aws->auto_space(0,0);
1222    awt_create_selection_list_on_trees(gb_main,(AW_window *)aws,"dist/compress/tree_name");
1223    aws->at_newline();
1224
1225    aws->callback(AW_POPDOWN);
1226    aws->create_button("CLOSE", "CLOSE","C");
1227
1228    aws->callback(ph_compress_tree_cb);
1229    aws->help_text("compress_tree.hlp");
1230    aws->create_button("GO", "DO IT","D");
1231
1232    aws->callback(AW_POPUP_HELP,(AW_CL)"compress_tree.hlp");
1233    aws->create_button("HELP", "HELP","H");
1234
1235    aws->window_fit();
1236    return (AW_window *)aws;
1237}
1238*/
1239
1240static void ph_define_sort_tree_name_cb(AW_window *aww) {
1241    AW_root *aw_root = aww->get_root();
1242    char *tree_name = aw_root->awar("dist/tree/list_tree_name")->read_string();
1243    aw_root->awar("dist/tree/sort_tree_name")->write_string(tree_name);
1244    free(tree_name);
1245}
1246static void ph_define_compression_tree_name_cb(AW_window *aww) {   
1247    AW_root *aw_root = aww->get_root();
1248    char *tree_name = aw_root->awar("dist/tree/list_tree_name")->read_string();
1249    aw_root->awar("dist/tree/compr_tree_name")->write_string(tree_name);
1250    free(tree_name);
1251}
1252
1253static void ph_define_save_tree_name_cb(AW_window *aww) {
1254    AW_root *aw_root = aww->get_root();
1255    char *tree_name = aw_root->awar("dist/tree/list_tree_name")->read_string();
1256    aw_root->awar("dist/tree/tree_name")->write_string(tree_name);
1257    free(tree_name);
1258}
1259
1260AW_window *create_matrix_window(AW_root *aw_root) {
1261    AW_window_simple_menu *aws = new AW_window_simple_menu;
1262    aws->init( aw_root, "NEIGHBOR JOINING", "NEIGHBOR JOINING", 900,900,10, 10 );
1263    aws->load_xfig("ph_ge_ma.fig");
1264    aws->button_length( 10 );
1265
1266    aws->at("close");
1267    aws->callback(ap_exit);
1268    aws->create_button("CLOSE", "CLOSE","C");
1269
1270    aws->at("help");
1271    aws->callback(AW_POPUP_HELP,(AW_CL)"dist.hlp");
1272    aws->create_button("HELP", "HELP","H");
1273
1274
1275    GB_push_transaction(gb_main);
1276
1277    //  aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
1278    //  aws->create_button("CLOSE","C");
1279
1280    aws->create_menu(       0,  "FILE",                 "F", "HELP for Window",  AWM_ALL );
1281    aws->insert_menu_topic( "macros",   "Macros  ...",          "M", "macro.hlp",       AWM_ALL, (AW_CB)AW_POPUP,  (AW_CL)awt_open_macro_window,(AW_CL)"NEIGHBOR_JOINING" );
1282    aws->insert_menu_topic( "quit",     "Quit",                 "Q", "quit.hlp",        AWM_ALL, (AW_CB)ap_exit ,   0,  0 );
1283
1284    aws->create_menu(   0,      "Properties",           "P",    "properties.hlp", AWM_ALL);
1285    aws->insert_menu_topic(     "frame_props",  "Frame ...",            "F",    "props_frame.hlp",              AWM_ALL, AW_POPUP, (AW_CL)AW_preset_window, 0 );
1286    aws->insert_menu_topic(     "save_props",   "Save Properties (in ~/.arb_prop/dist.arb)",    "S", "savedef.hlp",     AWM_ALL, (AW_CB)AW_save_defaults, 0, 0 );
1287
1288    aws->insert_help_topic(     "help",         "help ...",             "h",    "dist.hlp",                     AWM_ALL, (AW_CB)AW_POPUP_HELP, (AW_CL)"dist.hlp", 0 );
1289
1290    aws->at( "which_species" );
1291    aws->create_option_menu( "dist/which_species" );
1292    aws->insert_option( "all", "a", "all" );
1293    aws->insert_default_option( "marked",  "m", "marked" );
1294    aws->update_option_menu();
1295
1296    aws->at("which_alignment");
1297    awt_create_selection_list_on_ad(gb_main,
1298                                    (AW_window *)aws,"dist/alignment","*=");
1299
1300
1301    aws->at("filter_select");
1302    AW_CL filtercd = awt_create_select_filter(aws->get_root(),gb_main,"dist/filter/name");
1303    dist_filter_cl = filtercd;
1304    aws->callback(AW_POPUP,(AW_CL)awt_create_select_filter_win,filtercd);
1305    aws->create_button("SELECT_FILTER", "dist/filter/name");
1306
1307    aws->at("weights_select");
1308    global_csp = new AWT_csp(gb_main,aws->get_root(),"dist/col_stat/name");
1309    aws->callback(AW_POPUP,(AW_CL)create_csp_window, (AW_CL)global_csp);
1310    aws->create_button("SELECT_COL_STAT","dist/col_stat/name");
1311
1312    aws->at("which_cancel");
1313    aws->create_input_field("dist/cancel/chars",12);
1314
1315    aws->at("cancel_select");
1316    aws->callback((AW_CB1)AW_POPUP,(AW_CL)awt_create_select_cancel_window);
1317    aws->create_button("SELECT_CANCEL_CHARS", "SELECT","C");
1318
1319    aws->at("change_matrix");
1320    aws->callback(AW_POPUP,(AW_CL)create_dna_matrix_window,0);
1321    aws->create_button("EDIT_MATRIX", "Edit Matrix");
1322
1323    aws->at("enable");
1324    aws->create_toggle("tmp/" AWAR_MATRIX_DNA_PREFIX "/enable");
1325
1326    aws->at("which_correction");
1327    aws->create_option_menu( "dist/correction/trans", NULL ,"" );
1328    aws->insert_option( "none",         "n",    (int)PH_TRANSFORMATION_NONE);
1329    aws->insert_option( "similarity",   "n",    (int)PH_TRANSFORMATION_SIMILARITY);
1330    aws->insert_option( "jukes-cantor (dna)","c",       (int)PH_TRANSFORMATION_JUKES_CANTOR );
1331    aws->insert_option( "felsenstein (dna)",    "f",    (int)PH_TRANSFORMATION_FELSENSTEIN );
1332    aws->insert_option("olsen (dna)",           "o",    (int)PH_TRANSFORMATION_OLSEN);
1333    aws->insert_option("felsenstein/voigt (exp)",       "1",    (int)PH_TRANSFORMATION_FELSENSTEIN_VOIGT);
1334    aws->insert_option("olsen/voigt (exp)",     "2",    (int)PH_TRANSFORMATION_OLSEN_VOIGT);
1335    aws->insert_option( "haesch (exp)",                 "f",    (int)PH_TRANSFORMATION_HAESCH );
1336    aws->insert_option( "kimura (pro)",                 "k",    (int)PH_TRANSFORMATION_KIMURA );
1337    aws->insert_option( "PAM (protein)",        "c",    (int)PH_TRANSFORMATION_PAM );
1338    aws->insert_option( "Cat. Hall(exp)",       "c",    (int)PH_TRANSFORMATION_CATEGORIES_HALL );
1339    aws->insert_option( "Cat. Barker(exp)",     "c",    (int)PH_TRANSFORMATION_CATEGORIES_BARKER );
1340    aws->insert_option( "Cat.Chem (exp)",       "c",    (int)PH_TRANSFORMATION_CATEGORIES_CHEMICAL );
1341    //          aws->insert_option("Maximum Likelihood (exp)","l",      (int)PH_TRANSFORMATION_NONE);
1342    aws->insert_default_option("unknown",       "u",    (int)PH_TRANSFORMATION_NONE);
1343
1344    aws->update_option_menu();
1345
1346    aws->button_length(18);
1347
1348    //     aws->at("compress");
1349    //     aws->callback(AW_POPUP,      (AW_CL)create_select_compress_tree,0);
1350    //     aws->help_text("compress_tree.hlp");
1351    //     aws->create_button("CALC_COMPRESSED_MATRIX", "Calculate\nCompressed M. ...","C");
1352
1353    aws->at("compress");
1354    aws->callback(ph_compress_tree_cb);
1355    aws->create_button("CALC_COMPRESSED_MATRIX", "Calculate\nCompressed Matrix","C");
1356
1357    aws->at("calculate");
1358    aws->callback(ph_calculate_full_matrix_cb);
1359    aws->create_button("CALC_FULL_MATRIX", "Calculate\nFull Matrix","F");
1360
1361    aws->button_length(12);
1362
1363    aws->at("save_matrix");
1364    aws->callback(AW_POPUP, (AW_CL)create_save_matrix_window,(AW_CL)"tmp/dist/save_matrix");
1365    aws->create_button("SAVE_MATRIX", "SAVE MATRIX","M");
1366
1367    aws->at("view_matrix");
1368    aws->callback(ph_view_matrix_cb);
1369    aws->create_button("VIEW_MATRIX", "VIEW MATRIX","V");
1370
1371    aws->at("tree_list");
1372    awt_create_selection_list_on_trees(gb_main,(AW_window *)aws,"dist/tree/list_tree_name");
1373
1374    aws->at("t_calculate");
1375    aws->callback(ph_calculate_tree_cb,0);
1376    aws->create_button("CALC_TREE", "CALCULATE \nTREE","C");
1377
1378    aws->at("bootstrap");
1379    aws->callback(ph_calculate_tree_cb,1);
1380    aws->create_button("CALC_BOOTSTRAP_TREE", "CALCULATE \nBOOTSTRAP TREE");
1381       
1382    aws->at("autodetect");   // auto
1383    aws->callback(ph_autodetect_callback);
1384    aws->create_button("AUTODETECT_CORRECTION", "AUTODETECT","A");
1385
1386    aws->at("sort_tree_name");
1387    aws->create_input_field("dist/tree/sort_tree_name",12); 
1388    aws->at("compr_tree_name");
1389    aws->create_input_field("dist/tree/compr_tree_name",12); 
1390    aws->at("calc_tree_name");
1391    aws->create_input_field("dist/tree/tree_name",12);
1392   
1393    aws->button_length(22);
1394   
1395    aws->at("use_compr_tree");
1396    aws->callback(ph_define_compression_tree_name_cb);
1397    aws->create_button("USE_COMPRESSION_TREE", "Use to compress", ""); 
1398   
1399    aws->at("use_sort_tree");
1400    aws->callback(ph_define_sort_tree_name_cb);
1401    aws->create_button("USE_SORT_TREE", "Use to sort", ""); 
1402       
1403    aws->at("use_existing");
1404    aws->callback(ph_define_save_tree_name_cb);
1405    aws->create_button("USE_NAME", "Use as new tree name", ""); 
1406       
1407    GB_pop_transaction(gb_main);
1408    return (AW_window *)aws;
1409}
Note: See TracBrowser for help on using the repository browser.