00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <locale.h>
00029 #include <libintl.h>
00030
00031 #include "scan_event.h"
00032
00033
00034
00035
00036
00037
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
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
00086 if (!evcoords_var)
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)
00095 return;
00096
00097
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
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
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
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
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
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
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
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
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
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
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
00298 if (!evcoords_var)
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
00355
00356
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