source: tags/cvs_2_svn/NTREE/NT_trackAliChanges.cxx

Last change on this file was 5309, checked in by westram, 16 years ago
  • replaced calls to GB_find with new find-functions
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : NT_trackAliChanges.cxx                            //
4//   Purpose   : Track alignment and sequences changes             //
5//   Time-stamp: <Fri May/16/2008 11:03 MET Coder@ReallySoft.de>   //
6//                                                                 //
7//   Coded by Ralf Westram (coder@reallysoft.de) in June 2007      //
8//   Institute of Microbiology (Technical University Munich)       //
9//   http://www.arb-home.de/                                       //
10//                                                                 //
11// =============================================================== //
12
13#include <cstdlib>
14#include <cstring>
15#include <ctime>
16
17
18#include <awt.hxx>
19#include <awt_sel_boxes.hxx>
20#include <arbdbt.h>
21
22#include "NT_trackAliChanges.h"
23
24extern GBDATA *GLOBAL_gb_main;
25
26#define AWAR_TRACK_BASE     "track/"
27#define AWAR_TRACK_ALI      AWAR_TRACK_BASE "ali"
28#define AWAR_TRACK_INITIALS AWAR_TRACK_BASE "initials"
29
30static GB_ERROR writeHistory(GBDATA *gb_species, const char *stamp, const char *entry) {
31    char     *newContent = GBS_global_string_copy("%s %s", stamp, entry);
32    GB_ERROR  error      = 0;
33    GBDATA   *gb_history = GB_entry(gb_species, "seq_history");
34
35    if (!gb_history) {
36        gb_history = GB_create(gb_species, "seq_history", GB_STRING);
37        if (!gb_history) error = GB_get_error();
38        else error = GB_write_string(gb_history, newContent);
39    }
40    else {
41        char *oldContent = GB_read_string(gb_history);
42        long  oldSize    = GB_read_string_count(gb_history);
43        long  newSize    = strlen(newContent);
44        long  size       = oldSize+1+newSize+1;
45        char *content    = (char*)malloc(size);
46
47        memcpy(content, newContent, newSize);
48        content[newSize] = '\n';
49        memcpy(content+newSize+1, oldContent, oldSize+1);
50
51        error = GB_write_string(gb_history, content);
52
53        free(content);
54        free(oldContent);
55    }
56
57    free(newContent);
58
59    return error;
60}
61
62static void trackAlignmentChanges(AW_window *aww) {
63    GB_transaction  ta(GLOBAL_gb_main);
64    AW_root        *root           = aww->get_root();
65    char           *ali            = root->awar(AWAR_TRACK_ALI)->read_string();
66    char           *checksum_field = GBS_string_2_key(GBS_global_string("checksum_%s", ali));
67    long            newSpecies     = 0;
68    long            ali_changed    = 0;
69    long            seq_changed    = 0;
70    long            unchanged      = 0;
71    long            species        = GBT_get_species_count(GLOBAL_gb_main);
72    long            count          = 0;
73    GB_ERROR        error          = 0;
74    char           *stamp;
75
76    {
77        char      *initials = root->awar(AWAR_TRACK_INITIALS)->read_string();
78        char       atime[256];
79        time_t     t        = time(0);
80        struct tm *tms      = localtime(&t);
81
82        strftime(atime, 255,"%Y/%m/%d %k:%M", tms);
83        stamp = GBS_global_string_copy("%s %s", atime, initials);
84        free(initials);
85    }
86
87    aw_openstatus(GBS_global_string("Tracking changes in '%s'", ali));
88
89    for (GBDATA *gb_species = GBT_first_species(GLOBAL_gb_main);
90         gb_species && !error;
91         gb_species = GBT_next_species(gb_species))
92    {
93        GBDATA *gb_seq = GBT_read_sequence(gb_species, ali);
94        if (gb_seq) {
95            // has data in wanted alignment
96            const char *seq          = GB_read_char_pntr(gb_seq);
97            long        char_cs      = GBS_checksum(seq, 0, ".-");
98            long        ali_cs       = GBS_checksum(seq, 0, "");
99            char       *char_entry   = GBS_global_string_copy("%lx", char_cs);
100            char       *ali_entry    = GBS_global_string_copy("%lx", ali_cs);
101            const char *save_comment = 0;
102
103            GBDATA *gb_checksum = GB_entry(gb_species, checksum_field);
104            if (!gb_checksum) {
105                newSpecies++;
106                gb_checksum = GB_create(gb_species, checksum_field, GB_STRING);
107                if (!gb_checksum) {
108                    error = GB_get_error();
109                }
110                else {
111                    save_comment = "new";
112                }
113            }
114            else {
115                char *oldValue = GB_read_string(gb_checksum);
116                if (!oldValue) {
117                    error = GB_get_error();
118                }
119                else {
120                    char *comma = strchr(oldValue, ',');
121                    if (!comma) {
122                        error = GBS_global_string("Invalid value '%s' in field '%s'", oldValue, checksum_field);
123                    }
124                    else {
125                        comma[0] = 0;
126                        if (strcmp(char_entry, oldValue) == 0) { // seq checksum is equal
127                            if (strcmp(ali_entry, comma+1) == 0) { // ali checksum is equal
128                                unchanged++;
129                            }
130                            else { // only alignment checksum changed
131                                ali_changed++;
132                                save_comment = "alignment changed";
133                            }
134                        }
135                        else {
136                            seq_changed++;
137                            save_comment = "sequence changed";
138                        }
139                    }
140                    free(oldValue);
141                }
142            }
143
144            if (save_comment) {
145                error             = GB_write_string(gb_checksum, GBS_global_string("%s,%s", char_entry, ali_entry));
146                if (!error) error = writeHistory(gb_species, stamp, GBS_global_string("%s %s", ali, save_comment));
147            }
148
149            free(ali_entry);
150            free(char_entry);
151        }
152        count++;
153        aw_status(count/(double)species);
154    }
155
156    aw_closestatus();
157
158    if (seq_changed) aw_message(GBS_global_string("%li species with changed sequence", seq_changed));
159    if (ali_changed) aw_message(GBS_global_string("%li species with changed alignment", ali_changed));
160    if (newSpecies) aw_message(GBS_global_string("%li new species", newSpecies));
161
162    free(stamp);
163    free(checksum_field);
164    free(ali);
165}
166
167void NT_create_trackAliChanges_Awars(AW_root *root, AW_default properties) {
168    root->awar_string(AWAR_TRACK_ALI, "???", GLOBAL_gb_main);
169    root->awar_string(AWAR_TRACK_INITIALS, GB_getenvUSER(), properties);
170}
171
172AW_window *NT_create_trackAliChanges_window(AW_root *root) {
173    AW_window_simple *aws = new AW_window_simple;
174    aws->init(root, "TRACK_ALI_CHANGES", "Track alignment changes");
175    aws->load_xfig("trackali.fig");
176
177    aws->at("close");
178    aws->callback((AW_CB0)AW_POPDOWN);
179    aws->create_button("CLOSE", "CLOSE", "C");
180
181    aws->at("help");
182    aws->callback( AW_POPUP_HELP,(AW_CL)"track_ali_changes.hlp");
183    aws->create_button("HELP","HELP","H");
184
185    aws->at("initials");
186    aws->create_input_field(AWAR_TRACK_INITIALS);
187   
188    aws->at("ali_sel");
189    awt_create_selection_list_on_ad(GLOBAL_gb_main, aws, AWAR_TRACK_ALI, "*=");
190
191    aws->at("go");
192    aws->callback(trackAlignmentChanges);
193    aws->create_autosize_button("TRACK", "Track changes", "T");
194
195    return aws;
196}
197
198
Note: See TracBrowser for help on using the repository browser.