scan_event.C

Go to the documentation of this file.
00001 /* Gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Copyright (C) 1999,2000,2001,2002,2003 Percy Zahl
00006  *
00007  * Authors: Percy Zahl <zahl@users.sf.net>
00008  * additional features: Andreas Klust <klust@users.sf.net>
00009  * WWW Home: http://gxsm.sf.net
00010  *
00011  * This program is free software; you can redistribute it and/or modify
00012  * it under the terms of the GNU General Public License as published by
00013  * the Free Software Foundation; either version 2 of the License, or
00014  * (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00024  */
00025 
00026 /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */
00027 
00028 #include <locale.h>
00029 #include <libintl.h>
00030 
00031 #include "scan_event.h"
00032 
00033 /*
00034  * Base Class for Event Data Storage
00035  * 
00036  *
00037  * Class: EventEntry
00038  */
00039 
00040 EventEntry::EventEntry (gchar *Name, time_t Time){ 
00041         XSM_DEBUG (DBG_L6, "EventEntry::EventEntry");
00042         name = g_strdup (Name);
00043         time = Time;
00044 }
00045  
00046 EventEntry::~EventEntry (){ 
00047         XSM_DEBUG (DBG_L6, "EventEntry::~EventEntry");
00048         g_free (name);
00049 }
00050 
00051 time_t EventEntry::get_time () { return time; };
00052 
00053 gchar* EventEntry::get_str_time () { return NULL; };
00054 
00055 ProbeEntry::ProbeEntry (gchar *Name, time_t Time, GPtrArray *Labels, GPtrArray *Unitssymbols, int Chunk_size) : EventEntry (Name, Time){ 
00056         XSM_DEBUG (DBG_L6, "ProbeEntry::ProbeEntry");
00057         chunk_size = Chunk_size;
00058         data = g_array_new (FALSE, TRUE, sizeof (double));
00059         labels = Labels;
00060         unitssymbols =Unitssymbols;
00061         num_sets=0;
00062 }
00063  
00064 ProbeEntry::ProbeEntry (gchar *Name, NcFile *ncf, int p_index, NcVar* &evdata_var, NcVar* &evcoords_var, ScanEvent* &se, int num, int &count, ProbeEntry *pe) : EventEntry (Name, 0){ 
00065         gchar *tmp;
00066 
00067         XSM_DEBUG (DBG_L6, "ProbeEntry::ProbeEntry -- Scan NC-File for Entry" << p_index);
00068 //      std::cout << "ProbeEntry::ProbeEntry -- Scan NC-File for Entry #" << p_index << " :" << num << std::endl;
00069 
00070         se = NULL;
00071 
00072         if (!pe){
00073 
00074                 chunk_size = 0;
00075                 num_sets=0;
00076                 data = NULL;
00077                 labels = NULL;
00078                 unitssymbols = NULL;
00079 
00080                 tmp = g_strdup_printf ("Event_Probe_%05d_coords", p_index);
00081                 std::cout << " ProbeEntry::ProbeEntry scanning for #" << p_index << " :" << tmp << std::endl;
00082                 evcoords_var = ncf->get_var(tmp); 
00083                 g_free (tmp);
00084 
00085                 // found that Event_Probe, else return?
00086                 if (!evcoords_var) // not OK?
00087                         return;
00088 
00089                 tmp = g_strdup_printf ("Event_Probe_%05d_data", p_index); 
00090                 std::cout << " ProbeEntry::ProbeEntry scanning for #" << p_index << " :" << tmp << std::endl;
00091                 evdata_var = ncf->get_var(tmp); 
00092                 g_free (tmp);
00093 
00094                 if (!evdata_var) // not OK?
00095                         return;
00096 
00097                 // got it now.
00098                 count      = evdata_var->get_dim(0)->size ();
00099                 chunk_size = evdata_var->get_dim(1)->size ();
00100                 num_sets   = evdata_var->get_dim(2)->size ();
00101 //              std::cout << "Count:" << count << " Chunk:" << chunk_size << " NumSets:" << num_sets << std::endl;
00102 
00103                 labels = g_ptr_array_new ();
00104                 NcAtt *data_labels = evdata_var->get_att ("Labels");
00105                 if (data_labels){
00106                         NcValues *v = data_labels->values ();
00107                         gchar **ss = g_strsplit (v->as_string (0), ",", chunk_size);
00108                         for (gchar **s = ss; *s; ++s)
00109                                 g_ptr_array_add (labels, (gpointer) *s);
00110                 }
00111 
00112                 unitssymbols = g_ptr_array_new ();
00113                 NcAtt *data_units  = evdata_var->get_att ("Units");
00114                 if (data_units){
00115                         NcValues *v = data_units->values ();
00116                         gchar **ss = g_strsplit (v->as_string (0), ",", chunk_size);
00117                         for (gchar **s = ss; *s; ++s)
00118                                 g_ptr_array_add (unitssymbols, (gpointer) *s);
00119                 }
00120                 
00121 //              std::cout << " ProbeEntry::ProbeEntry Data:" << num_sets << "," << chunk_size << std::endl;
00122                 data = g_array_sized_new (FALSE, TRUE, sizeof (double), num_sets*chunk_size);
00123 
00124         } else {
00125 
00126                 chunk_size = pe->get_chunk_size ();
00127                 num_sets = pe->get_num_sets ();
00128 //              std::cout << " ProbeEntry::ProbeEntry DataCPY:" << num_sets << "," << chunk_size << std::endl;
00129                 data = g_array_sized_new (FALSE, TRUE, sizeof (double), num_sets*chunk_size);
00130                 labels = g_ptr_array_new ();
00131                 unitssymbols =  g_ptr_array_new ();
00132                 for (int i=0; i<chunk_size; ++i){
00133                         g_ptr_array_add (labels, (gpointer)pe->get_label (i));
00134                         g_ptr_array_add (unitssymbols, (gpointer)pe->get_unit_symbol (i));
00135                 }
00136         }
00137 
00138         double coord[4];
00139         evcoords_var->set_cur (num,0);
00140         evcoords_var->get (coord, 1,4);
00141 
00142         se = new ScanEvent (coord[0], coord[1], coord[2]);
00143         time = (time_t) coord[3];
00144 
00145         float f;
00146         double vals[20];
00147         for (int n=0; n<num_sets; ++n){
00148                 for (int j=0; j<chunk_size; ++j){
00149                         evdata_var->set_cur (num,j,n);
00150                         evdata_var->get (&f, 1, 1, 1);
00151                         vals[j] = (double)f;
00152                 }
00153                 g_array_append_vals (data, (gconstpointer)vals, chunk_size);
00154         }
00155 }
00156 
00157 ProbeEntry::~ProbeEntry (){ 
00158         XSM_DEBUG (DBG_L6, "ProbeEntry::~ProbeEntry");
00159         g_array_free (data, TRUE);
00160         g_ptr_array_free (labels, TRUE);
00161         g_ptr_array_free (unitssymbols, TRUE);
00162 }
00163 
00164 gchar *ProbeEntry::get_label (int j){ 
00165         if (j < 0)
00166                 return "#";
00167         return (gchar*)g_ptr_array_index (labels,  j); 
00168 }
00169         
00170 gchar *ProbeEntry::get_unit_symbol (int j){ 
00171         if (j < 0)
00172                 return " ";
00173         return (gchar*)g_ptr_array_index (unitssymbols,  j); 
00174 }
00175 
00176 
00177 int ProbeEntry::write_nc_variable_set (NcFile *ncf, int p_index, NcVar* &evdata_var, NcVar* &evcoords_var, int total_count){
00178         gchar *tmp;
00179 
00180         tmp = g_strdup_printf ("Event_Probe_%05d_dim_events", p_index); 
00181 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00182         NcDim* ev_dim_events  = ncf->add_dim (tmp, total_count);
00183         g_free (tmp);
00184 
00185         tmp = g_strdup_printf ("Event_Probe_%05d_dim_coords", p_index);
00186 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00187         NcDim* ev_dim_coords  = ncf->add_dim (tmp, 4);
00188         g_free (tmp);
00189 
00190         tmp = g_strdup_printf ("Event_Probe_%05d_dim_sets", p_index);
00191 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00192         NcDim* ev_dim_chunks  = ncf->add_dim (tmp, chunk_size);
00193         g_free (tmp);
00194 
00195         tmp = g_strdup_printf ("Event_Probe_%05d_dim_samples", p_index); 
00196 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00197         NcDim* ev_dim_samples = ncf->add_dim (tmp, num_sets);
00198         g_free (tmp);
00199 
00200         tmp = g_strdup_printf ("Event_Probe_%05d_coords", p_index); 
00201 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00202         evcoords_var = ncf->add_var (tmp, ncDouble,  ev_dim_events, ev_dim_coords);
00203         evcoords_var->add_att ("long_name", "Probe Event coordinates list");
00204         evcoords_var->add_att ("Units", "X/Y/V/t ==> Ang/Ang/Volt/Unixtime");
00205         g_free (tmp);
00206         evcoords_var->add_att ("ID", p_index);
00207 
00208         GString* all_labels=NULL;
00209         GString* all_units=NULL;
00210         for (int j=0; j<chunk_size; ++j){
00211                 if (!j){
00212                         all_labels = g_string_new ((const gchar*)g_ptr_array_index(labels,j));
00213                         all_units  = g_string_new ((const gchar*)g_ptr_array_index(unitssymbols,j));
00214                 } else {
00215                         all_labels = g_string_append (all_labels, ",");
00216                         all_labels = g_string_append (all_labels, (const gchar*)g_ptr_array_index(labels,j));
00217                         all_units  = g_string_append (all_units, ",");
00218                         all_units  = g_string_append (all_units, (const gchar*)g_ptr_array_index(unitssymbols,j));
00219                 }
00220         }
00221         tmp = g_strdup_printf ("Event_Probe_%05d_data", p_index); 
00222 //      std::cout << " ProbeEntry::write_nc_variable_set #" << p_index << " :" << tmp << std::endl;
00223         evdata_var = ncf->add_var (tmp, ncFloat, ev_dim_events, ev_dim_chunks, ev_dim_samples);
00224         g_free (tmp);
00225         evdata_var->add_att ("long_name", "Probe Event Data Set");
00226         evdata_var->add_att ("Name", name);
00227         evdata_var->add_att ("Labels", all_labels->str);
00228         evdata_var->add_att ("Units", all_units->str);
00229 
00230         g_string_free (all_labels, TRUE);
00231         g_string_free (all_units, TRUE);
00232 
00233         return 0;
00234 }
00235 
00236 int ProbeEntry::write_nc_data (NcVar* evdata_var, NcVar* evcoords_var, ScanEvent *se, int count){
00237         double coord[4];
00238         coord[2] = se->get_position (coord[0], coord[1]);
00239         coord[3] = (double)time;
00240 //      std::cout << "Write, Coord, Data #" << count << " :XY" << coord[0] << "," << coord[1] << std::endl;
00241         evcoords_var->set_cur (count,0);
00242         evcoords_var->put (coord, 1,4);
00243 
00244         float f;
00245         for (int j=0; j<chunk_size; ++j)
00246                 for (int n=0; n<num_sets; ++n){
00247                         evdata_var->set_cur (count,j,n);
00248                         f = (float)get (n, j);
00249                         evdata_var->put (&f, 1, 1, 1);
00250                 }
00251 
00252         return 0;
00253 }
00254 
00255 
00256 void ProbeEntry::print (){
00257         std::cout << "ScanEvent::ProbeEntry " << name << " time: " << time << std::endl;
00258         std::cout << "### ";
00259         for (int j=0; j<chunk_size; ++j)
00260                 std::cout << (gchar*)g_ptr_array_index(labels,j) << "[" << (gchar*)g_ptr_array_index(unitssymbols,j) << "], ";
00261         std::cout << std::endl;
00262         for (int i=0; i<num_sets; ++i){
00263                 std::cout << i << " ";
00264                 for (int j=0; j<chunk_size; ++j)
00265                         std::cout << get (i, j) << " ";
00266                 std::cout << std::endl;
00267         }
00268 }
00269 
00270 
00271 UserEntry::UserEntry (gchar *Name, time_t Time, GPtrArray *Messages, int num) : EventEntry (Name, Time){ 
00272         XSM_DEBUG (DBG_L6, "UserEntry::UserEntry");
00273         num_sets=0;
00274         data = NULL;
00275 
00276         if (Messages && num>0){
00277                 data = Messages;
00278                 num_sets=num;
00279         } else
00280                 data = g_ptr_array_new ();
00281 }
00282  
00283 UserEntry::UserEntry (gchar *Name, NcFile *ncf, int u_index, ScanEvent* &se) : EventEntry (Name, 0){ 
00284         gchar *tmp;
00285 
00286         XSM_DEBUG (DBG_L6, "UserEntry::UserEntry -- Scan NC-File for User Entry" << u_index);
00287 
00288         se = NULL;
00289         num_sets=0;
00290         data = NULL;
00291 
00292         tmp = g_strdup_printf ("Event_User_%05d_coords", u_index);
00293         std::cout << " UserEntry::UserEntry scanning for #" << u_index << " :" << tmp << std::endl;
00294         NcVar* evcoords_var = ncf->get_var(tmp); 
00295         g_free (tmp);
00296 
00297         // found that Event_User, else return?
00298         if (!evcoords_var) // not OK?
00299                 return;
00300 
00301         NcAtt *data_message = evcoords_var->get_att ("Message");
00302         if (data_message){
00303                 data = g_ptr_array_new ();
00304                 add (data_message->values ()->as_string (0));
00305         }
00306 
00307         double coord[4];
00308         evcoords_var->get (coord, 4);
00309 
00310         se = new ScanEvent (coord[0], coord[1], coord[2]);
00311         time = (time_t) coord[3];
00312 }
00313 
00314 UserEntry::~UserEntry (){ 
00315         XSM_DEBUG (DBG_L6, "UserEntry::~UserEntry");
00316         g_ptr_array_free (data, TRUE);
00317 }
00318 
00319 void UserEntry::print (){
00320         std::cout << "ScanEvent::UserEntry " << name << " time: " << time 
00321                   << " Messages: " << std::endl;
00322         for (int i=0; i<num_sets; ++i)
00323                 std::cout << i << ": " << get (i) << std::endl;
00324 }
00325 
00326 int UserEntry::store_event_to_nc (NcFile* ncf, int u_index, ScanEvent *se){
00327         gchar *tmp;
00328 
00329         if (!num_sets) 
00330                 return 0;
00331 
00332         tmp = g_strdup_printf ("Event_User_%05d_dim_coords", u_index);
00333         NcDim* ev_dim_coords  = ncf->add_dim (tmp, 4);
00334         g_free (tmp);
00335 
00336         tmp = g_strdup_printf ("Event_User_%05d_coords", u_index); 
00337         NcVar* evcoords_var = ncf->add_var (tmp, ncDouble, ev_dim_coords);
00338         g_free (tmp);
00339         evcoords_var->add_att ("long_name", "User Event coordinates list");
00340         evcoords_var->add_att ("Units", "X/Y/V/t ==> Ang/Ang/Volt/Unixtime");
00341         evcoords_var->add_att ("Name", name);
00342         evcoords_var->add_att ("ID", u_index);
00343         evcoords_var->add_att ("Message", get (0));
00344 
00345         double coord[4];
00346         coord[2] = se->get_position (coord[0], coord[1]);
00347         coord[3] = (double)time;
00348         evcoords_var->put (coord, 4);
00349 
00350         return 0;
00351 }
00352 
00353 /*
00354  * Base Class implementation for one Scan Event at one Time/Location
00355  *
00356  * Class: ScanEvent
00357  */
00358 
00359 void ScanEvent::eeremove (EventEntry *entry, gpointer from){
00360         delete entry;
00361 }
00362 
00363 void ScanEvent::eeprint (EventEntry *entry, int *w){
00364         entry->print ();
00365 }
00366 
00367 ScanEvent::ScanEvent (double xPos, double yPos, double Val){
00368         XSM_DEBUG (DBG_L6, "ScanEvent::ScanEvent");
00369         event_list = NULL;
00370         xpos = xPos;
00371         ypos = yPos;
00372         val = Val;
00373         flag = FALSE;
00374 }
00375 
00376 
00377 ScanEvent::~ScanEvent (){
00378         XSM_DEBUG (DBG_L6, "ScanEvent::~ScanEvent");
00379         g_slist_foreach(event_list, (GFunc) ScanEvent::eeremove, event_list);
00380         g_slist_free (event_list);
00381 }
00382 
00383 void ScanEvent::add_event (EventEntry *ee){
00384         event_list = g_slist_prepend (event_list, ee);
00385 }
00386 

Generated on Sat Apr 1 09:04:04 2006 for GXSM by  doxygen 1.4.6