StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
EEmcDbIO.C
1 // $Id: EEmcDbIO.C,v 1.1 2013/01/25 16:46:48 stevens4 Exp $:
2 
3 #include <stdlib.h>
4 #include <stdio.h>
5 
6 #include <string.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <ctype.h>
10 
11 #include "EEmcDbIO.h"
12 #include "eemcDb.h"
13 
14 
15 static const size_t MinLine = 4; // min length of a inp file line
16 static const size_t MaxLine = 256; // max length of a inp file line
17 
18 inline int min(int a,int b) { return (a<b) ? a : b; }
19 
20 // ----------------------------------------------------------------
21 // a terrible hack for our name array
22 // we pack a string no longer than maxlen into char[] buffer
23 // and then "terminate" it with a $ sing (sounds f77 like )
24 // ----------------------------------------------------------------
25 char *
26 resetString(char *buf, int nelem, int maxlen)
27 {
28  memset(buf,0x20,nelem*maxlen);
29  for(int i=0; i<nelem; i++ ) memset(buf+i*maxlen,EEMCDbStringDelim,0x01);
30  return buf;
31 }
32 
33 char *
34 packString(char *buf, int pos, int maxlen, char *str)
35 {
36  int len = min(maxlen,strlen(str));
37  memcpy(buf+pos*maxlen,str,len);
38  memset(buf+pos*maxlen+len,EEMCDbStringDelim,0x01);
39  return str;
40 }
41 
42 
43 char *
44 unpackString(char *buf, int pos, int maxlen, char *str) {
45  memcpy(str,buf+pos*maxlen,maxlen);
46  char *dollar = (char *)memchr(str,EEMCDbStringDelim,maxlen);
47  if( dollar == NULL ) *(str+maxlen) = 0; else *dollar = 0x0;
48  return str;
49 }
50 
51 
52 // THIS IS A PIECE OF 'EINE GROSSE SCHEISSE'
53 // WRITTEN ON 01/24/2003 IN PAIN BY PAZ (IU)
54 int
55 indexFromString(const char *str, const int MaxIndex)
56 {
57  //const int MaxSect=12;
58  //const int MaxInp =12;
59  char sbox[3] ="";
60  short sec=-1,inp=-1,box=-1;
61  int index=0;
62 
63  // more scheisse
64  if(str==NULL) {
65  fprintf(stderr,"indexFromString(): invalid string\n");
66  return -1;
67  }
68  // skip leading non digits
69  while(str[index]!=0x00 && ! isdigit(str[index]) ) index++;
70 
71  int ns=sscanf(str+index,"%2hd%2s%2hd",&sec,sbox,&inp);
72 
73  if(sec<=0 || kEEmcMaxSect < sec) {
74  fprintf(stderr,"indexFromString(): sector %d out of bounds (%s)\n",sec,str);
75  return -2;
76  }
77 
78  if(sbox!=NULL && strlen(sbox)>=2) {
79  for(int i=0; kEEmcBoxInp[i]!="" ; i++) {
80  if(strncmp(kEEmcBoxInp[i],sbox,2)==0) { box=i; break; }
81  }
82  }
83 
84  if(box<0 || kEEmcMaxBox<box) {
85  fprintf(stderr,"indexFromString(): box %.2s is invalid (%s)\n",sbox,str);
86  return(-3);
87  }
88 
89  if(ns==3 && inp>0) { // eg. 05TA11
90  if(inp<=0 || kEEmcMaxInput < inp ) {
91  fprintf(stderr,"indexFromString(): input %d out of bounds (%s)\n",inp,str);
92  return -4;
93  }
94  index = ((sec-1)*12+box)*12+inp;
95  } else {
96  index = (sec-1)*12+box ;
97  }
98  if(index<=0 || MaxIndex<index) {
99  fprintf(stderr,"indexFromString(): index %d out of bounds (%s)\n",index,str);
100  return -5;
101  }
102  //dprintf("STR: %s : %02hd-%s-%02hd %d\n",str,sec,sbox,inp,index);
103  return (index);
104 }
105 
106 
107 
108 // ================================================================
109 //
110 // ================================================================
111 EEmcDbIOBase::EEmcDbIOBase (int nelem, int size)
112 {
113  bytes = nelem*size;
114  nElem = nelem;
115  bytePtr = new char[bytes];
116  indexArr = new int[nElem];
117  comment = NULL;
118  for(int i=0;i<nElem;i++) indexArr[i]=i; // default index
119 }
120 
121 EEmcDbIOBase::~EEmcDbIOBase() {
122  if(bytePtr ) delete [] bytePtr ;
123  if(indexArr) delete [] indexArr;
124 };
125 
126 
127 bool
128 EEmcDbIOBase::checkLine(const char *line) {
129  if(strlen(line)<=MinLine) return false;
130  if(line[0]=='#' ) return false;
131  return true;
132 }
133 
134 
135 
136 // ================================================================
137 //
138 // ================================================================
139 template <class T>
140 int
141 EEmcDbCCIO<T>::read(FILE *f)
142 {
143  char line[MaxLine];
144  char tn [EEMCDbMaxName];
145  T* s = data();
146 
147  memset(bytePtr,0x00,bytes);
148  resetString(s->name,getSize(),EEMCDbMaxName);
149  memset(s->comment,0x20,sizeof(s->comment));
150 
151  int i=0;
152  while ( fgets(line,MaxLine,f) != NULL && i<getSize() ) {
153  if( ! checkLine(line) ) continue;
154  memset(tn,0x00,EEMCDbMaxName);
155  if( ! scan(line,tn,i) ) *tn=0x00;
156  packString(s->name,i,EEMCDbMaxName,tn);
157  i++;
158  };
159  s->name [sizeof(s->name) -1]=0x00; // *** potential bug for last name ***
160  if(comment) strncpy(s->comment,comment,EEMCDbMaxComment);
161  return (i>0);
162 }
163 
164 template <class T>
165 int
166 EEmcDbCCIO<T>::write(FILE *f)
167 {
168  char line[MaxLine];
169  T *s = data();
170  for(int i=0;i<getSize();i++) {
171  char tn[EEMCDbMaxName];
172  unpackString(s->name ,i,EEMCDbMaxName ,tn);
173  if(*tn==0x00) break;
174  print(line,tn,i);
175  fputs(line,f);
176  }
177  setComment(s->comment);
178  return 1;
179 }
180 
181 
182 // ================================================================
183 //
184 // ================================================================
185 template <class T>
186 int
187 EEmcDbQAIO<T>::read(FILE *f)
188 {
189  int i=0;
190  char line[MaxLine];
191  memset(bytePtr,0x00,bytes);
192  while(fgets(line,MaxLine,f) != NULL && i<getSize()) {
193  if( ! checkLine(line) ) continue;
194  //if(strlen(line)<=MinLine) continue;
195  if(! scan(line,i) ) break;
196  if(comment) strncpy(data(i)->comment,comment,EEMCDbMaxComment-1);
197  i++;
198  }
199  return i;
200 }
201 
202 template <class T>
203 int
204 EEmcDbQAIO<T>::write(FILE *f)
205 {
206  int i;
207  char line[MaxLine];
208  for(i=0;i<getSize();i++) {
209  if(! print(line,i) ) break;
210  fputs(line,f);
211  setComment(data(i)->comment);
212  }
213  return i;
214 }
215 
216 // ================================================================
217 //
218 // ================================================================
219 template <class T>
220 int
221 EEmcDbHVIO<T>::read(FILE *f)
222 {
223  int i=0;
224  char line[MaxLine];
225  memset(bytePtr,0x00,bytes);
226  while(fgets(line,MaxLine,f) != NULL && i<getSize()) {
227  if( ! checkLine(line) ) continue;
228  //if(strlen(line)<=MinLine) continue;
229  if(! scan(line,i) ) break;
230  if(comment && data(i)->comment[0]==0) strncpy(data(i)->comment,comment,EEMCDbMaxComment-1);
231  i++;
232  }
233  return i;
234 }
235 
236 template <class T>
237 int
238 EEmcDbHVIO<T>::write(FILE *f)
239 {
240  int i;
241  char line[MaxLine];
242  for(int i=0;i<getSize();i++) indexArr[i]=i; // reset index array
243  for(i=0;i<getSize();i++) {
244  memset(line,0x00,MaxLine);
245  int r = print(line,i);
246  if(r<0) break;
247  if(r>0) {
248  fputs(line,f);
249  setComment(data(i)->comment);
250  }
251  }
252  return i;
253 }
254 
255 // ================================================================
256 //
257 // ================================================================
258 template <class T>
259 int
260 EEmcDbXML<T>::read(FILE *f)
261 {
262  char line[MaxLine];
263  char *ptr=bytePtr;
264  int ret=0;
265  memset(bytePtr,0x00,bytes);
266 
267  while(fgets(line,MaxLine,f) != NULL ) {
268  int len=strlen(line);
269  dprintf( "%s",line);
270  strncpy(ptr,line,len);
271  ptr +=len;
272  ret=1;
273  }
274  if(comment) strncpy(data()->comment,comment,EEMCDbMaxComment-1);
275  return ret;
276 }
277 
278 template <class T>
279 int
280 EEmcDbXML<T>::write(FILE *f)
281 {
282  char line[MaxLine];
283  char *ptr=bytePtr;
284  int len=0;
285  do {
286  strncpy(line,ptr,MaxLine);
287  len=strlen(line);
288  if(len>0) {
289  fprintf(f,"%s",line);
290  dprintf( "%s",line);
291  }
292  ptr+=len;
293  } while(len>0);
294  setComment(data()->comment);
295  return 1;
296 }
297 
298 
299 // ================================================================
300 //
301 // ================================================================
302 
303 // ============== eemcDbADCconf ==================================
304 template<>
305 int
306 EEmcDbCCIO<eemcDbADCconf>::scan (const char *line, char *name, int i)
307 {
308  int r=sscanf(line,"%s %d %d ",name,data()->crate+i ,data()->channel+i);
309  if(r>=3)dprintf( "%s %d %d\n",name,data()->crate[i],data()->channel[i]);
310  return (r>=3);
311 }
312 
313 template<>
314 int
315 EEmcDbCCIO<eemcDbADCconf>::print( char *line, char *name, int i)
316 {
317  return (sprintf(line,"%s %d %d\n",name,data()->crate[i],data()->channel[i])>=3);
318 }
319 
320 
321 // ============== eemcDbPMTconf ==================================
322 template<>
323 int
324 EEmcDbCCIO<eemcDbPMTconf>::scan(const char *line, char *name, int i)
325 {
326  int r=sscanf(line,"%s %d %d %d %d %d",name,
327  data()->barcode+i, data()->sn+i , data()->baseBarcode+i,
328  data()->baseSN+i , data()->baseAddress+i);
329 
330  if(r>=6)dprintf("%s %d %d %d %d %d\n",name,
331  data()->barcode[i], data()->sn[i] , data()->baseBarcode[i],
332  data()->baseSN[i] , data()->baseAddress[i]);
333 
334  return (r>=6);
335 }
336 
337 template<>
338 int
339 EEmcDbCCIO<eemcDbPMTconf>::print(char *line, char *name, int i)
340 {
341  return (sprintf(line,"%s %d %d %d %d %d \n",name,
342  data()->barcode[i], data()->sn[i] ,data()->baseBarcode[i],
343  data()->baseSN[i] , data()->baseAddress[i])>=6);
344 }
345 
346 
347 // ============== eemcDbBoxconf ==================================
348 template<>
349 int
350 EEmcDbCCIO<eemcDbBoxconf>::scan (const char *line, char *name, int i)
351 {
352  int r=sscanf(line,"%s %d %d",name,data()->barcode+i, data()->hvBranch+i);
353  if(r>=3)dprintf("%s %d %d\n",name,data()->barcode[i],data()->hvBranch[i]);
354  return(r>=3);
355 }
356 
357 template<>
358  int
359 EEmcDbCCIO<eemcDbBoxconf>::print(char *line, char *name, int i)
360 {
361  return (sprintf(line,"%s %d %d\n",name,data()->barcode[i],data()->hvBranch[i])>=3);
362 }
363 
364 // ============== eemcDbPMTcal ==================================
365 template<>
366 int
367 EEmcDbCCIO<eemcDbPMTcal>::scan (const char *line , char *name, int i)
368 {
369  int r=sscanf(line,"%s %f %f %f" , name,data()->gain+i ,data()->egain+i ,data()->hv+i);
370  if(r>=3)dprintf("%s %.4f %.4f %.3f\n",name,data()->gain[i],data()->egain[i],data()->hv[i]);
371  return(r>=3);
372 }
373 
374 
375 template<>
376 int
377 EEmcDbCCIO<eemcDbPMTcal>::print(char *line, char *name, int i)
378 {
379  return (sprintf(line,"%s %.4f %.4f %.3f\n",name,data()->gain[i],data()->egain[i],data()->hv[i])>=3);
380 }
381 
382 // ============== eemcDbPMTname ==================================
383 template<>
384 int
385 EEmcDbCCIO<eemcDbPMTname>::scan (const char *line , char *name, int i)
386 {
387  if(i==0) {// clear data before first use
388  memset(data()->tubeName,' ',sizeof(data()->tubeName));
389  data()->tubeName[sizeof(data()->tubeName)-1]=0;
390  }
391  char txt [EEMCDbMaxName];
392  int r=sscanf(line,"%s %s", name,txt);
393  packString(data()->tubeName,i,EEMCDbMaxName,txt);
394  if(r>=2)dprintf("%s %s\n",name,txt);
395  return(r>=2);
396 }
397 
398 
399 template<>
400 int
401 EEmcDbCCIO<eemcDbPMTname>::print(char *line, char *name, int i)
402 {
403  char txt [EEMCDbMaxName];
404  unpackString(data()->tubeName ,i,EEMCDbMaxName ,txt);
405  return (sprintf(line,"%s %s\n",name,txt)>=2);
406 }
407 
408 // ============== eemcDbPMTped ==================================
409 template<>
410 int
411 EEmcDbCCIO<eemcDbPMTped>::scan (const char *line, char *name, int i)
412 {
413  int r=sscanf(line,"%s %f %f" ,name,data()->ped+i,data()->sig+i);
414  if(r>=3)dprintf( "%s %f %f\n",name,data()->ped[i],data()->sig[i]);
415  return(r>=3);
416 }
417 
418 template<>
419 int
420 EEmcDbCCIO<eemcDbPMTped>::print(char *line, char *name, int i)
421 {
422  return (sprintf(line,"%s %.4f %.4f\n",name,data()->ped[i],data()->sig[i])>=3);
423 }
424 
425 // ============== eemcDbPMTstat =================================
426 template<>
427 int
428 EEmcDbCCIO<eemcDbPMTstat>::scan (const char *line, char *name, int i)
429 {
430  int r=sscanf(line,"%s %hx %hx" ,name,data()->stat+i ,data()->fail+i);
431  if(r>=3)dprintf( "%s 0x%hx 0x%hx\n",name,data()->stat[i],data()->fail[i]);
432  return(r>=3);
433 }
434 
435 template<>
436 int
437 EEmcDbCCIO<eemcDbPMTstat>::print(char *line, char *name, int i)
438 {
439  return (sprintf(line,"%s 0x%04hx 0x%04hx\n",name,data()->stat[i],data()->fail[i])>=3);
440 }
441 
442 // ============== eemcDbPIXcal ==================================
443 template<>
444 int
445 EEmcDbCCIO<eemcDbPIXcal>::scan (const char *line , char *name, int i)
446 {
447  int r=sscanf(line,"%s %f %f " , name,data()->gain+i ,data()->egain+i );
448  if(r>=3)dprintf("%s %.4f %.4f\n",name,data()->gain[i],data()->egain[i]);
449  return(r>=3);
450 }
451 
452 
453 template<>
454 int
455 EEmcDbCCIO<eemcDbPIXcal>::print(char *line, char *name, int i)
456 {
457  return (sprintf(line,"%s %.4f %.4f\n",name,data()->gain[i],data()->egain[i])>=3);
458 }
459 
460 // ============== eemcDbPIXname ==================================
461 template<>
462 int
463 EEmcDbCCIO<eemcDbPIXname>::scan (const char *line , char *name, int i)
464 {
465  if(i==0) {// clear data before first use
466  memset(data()->tubeName,' ',sizeof(data()->tubeName));
467  data()->tubeName[sizeof(data()->tubeName)-1]=0;
468  }
469  char txt [EEMCDbMaxName];
470  int r=sscanf(line,"%s %s", name,txt);
471  packString(data()->tubeName,i,EEMCDbMaxName,txt);
472  if(r>=2)dprintf("%s %s\n",name,txt);
473  return(r>=2);
474 }
475 
476 
477 template<>
478 int
479 EEmcDbCCIO<eemcDbPIXname>::print(char *line, char *name, int i)
480 {
481  char txt [EEMCDbMaxName];
482  unpackString(data()->tubeName ,i,EEMCDbMaxName ,txt);
483  return (sprintf(line,"%s %s\n",name,txt)>=2);
484 }
485 // ================================================================
486 //
487 // ================================================================
488 
489 // ============== eemcDbPMTchar =================================
490 template<>
491 int
492 EEmcDbQAIO<eemcDbPMTchar>::scan(const char *line, int i)
493 {
494  eemcDbPMTchar *s = data(i);
495  int r=sscanf(line,"%d %f %f %f",&(s->sn),&(s->speRes),&(s->nomHV),&(s->darkC));
496  if( data(i)->sn<= 0 ) return 0;
497  data(i)->comment[0]=0x00; //
498  if(r>=4) dprintf("%8d %6.3f %8.3f %8.3f\n",s->sn,s->speRes,s->nomHV,s->darkC);
499  return(r>=4);
500 }
501 
502 template<>
503 int
504 EEmcDbQAIO<eemcDbPMTchar>::print(char *line, int i)
505 {
506  eemcDbPMTchar *s = data(i);
507  if( data(i)->sn<= 0 ) return 0;
508  return (sprintf(line,"%d %.4f %.3f %.3f\n",s->sn,s->speRes,s->nomHV,s->darkC));
509 }
510 
511 // ============== eemcDbCWchar =================================
512 template<>
513 int
514 EEmcDbQAIO<eemcDbCWchar>::scan(const char *line, int i)
515 {
516  eemcDbCWchar *s = data(i);
517  int r=sscanf(line,"%d %d %f",&(s->sn),&(s->address),&(s->maxHV));
518  if( data(i)->sn<= 0 ) return 0;
519  s->dumm = 0.0;
520  data(i)->comment[0]=0x00; //
521  if(r>=3) dprintf("%8d %8d %8.3f\n",s->sn,s->address,s->maxHV);
522  return(r>=3);
523 }
524 
525 template<>
526 int
527 EEmcDbQAIO<eemcDbCWchar>::print(char *line, int i)
528 {
529  eemcDbCWchar *s = data(i);
530  if( data(i)->sn<= 0 ) return 0;
531  return (sprintf(line,"%d %d %.3f\n",s->sn,s->address,s->maxHV));
532 }
533 
534 
535 // =============================================================
536 //
537 // =============================================================
538 
539 // ============== eemcDbHVsys =================================
540 template<>
541 int
542 EEmcDbHVIO<eemcDbHVsys>::scan(const char *line, int i)
543 {
544  eemcDbHVsys *s = new eemcDbHVsys;
545  int r=sscanf(line,"%s %d %d %f %d %f %s",
546  s->name,&(s->hvBranch),&(s->address),&(s->maxHV),&(s->dac),&(s->hv),s->comment);
547  if( (indexArr[i]=indexFromString(s->name,getSize())) < 0 ) {
548  fprintf(stderr,"EEmcDbHVIO<eemcDbHVsys>::scan(): name %s is invalid\n",s->name);
549  return -1;
550  }
551  memcpy(data(i),s,sizeof(eemcDbHVsys));
552  if(r>=6) dprintf("%8s %4d %4d %8.1f %4d %8.1f \"%s\" \n",
553  s->name,s->hvBranch,s->address,s->maxHV,s->dac,s->hv,s->comment);
554  return(r>=6);
555 }
556 
557 template<>
558 int
559 EEmcDbHVIO<eemcDbHVsys>::print(char *line, int i)
560 {
561  eemcDbHVsys *s = data(i);
562  if( s->name[0] == 0x00 ) return 0;
563  int r = sprintf(line,"%s %d %d %7.3f %d %7.3f %s\n",
564  s->name,s->hvBranch,s->address,s->maxHV,s->dac,s->hv, s->comment);
565  return r;
566 
567 }
568 
569 // ============== eemcDbHVtemp =================================
570 template<>
571 int
572 EEmcDbHVIO<eemcDbHVtemp>::scan(const char *line, int i)
573 {
574  eemcDbHVtemp *s = new eemcDbHVtemp;
575  int r=sscanf(line,"%s %f %s",
576  s->name,&(s->tempC),s->comment);
577  if( (indexArr[i]=indexFromString(s->name,getSize())) < 0 ) {
578  fprintf(stderr,"EEmcDbHVIO<eemcDbHVtemp>::scan(): name %s is invalid\n",s->name);
579  return -1;
580  }
581  memcpy(data(i),s,sizeof(eemcDbHVtemp));
582  if(r>=2) dprintf("%8s %8.1f \"%s\" \n",
583  s->name,s->tempC,s->comment);
584  return(r>=2);
585 }
586 
587 template<>
588 int
589 EEmcDbHVIO<eemcDbHVtemp>::print(char *line, int i)
590 {
591  eemcDbHVtemp *s = data(i);
592  if( s->name[0] == 0x00 ) return 0;
593  int r = sprintf(line,"%s %7.3f %s\n",
594  s->name,s->tempC, s->comment);
595  return r;
596 
597 }
598 
599 
600 // ================================================================
601 //
602 // ================================================================
603 #if __GNUG__
604 template class EEmcDbCCIO<eemcDbADCconf>;
605 template class EEmcDbCCIO<eemcDbPMTconf>;
606 template class EEmcDbCCIO<eemcDbBoxconf>;
607 template class EEmcDbCCIO<eemcDbPMTcal> ;
608 template class EEmcDbCCIO<eemcDbPMTname>;
609 template class EEmcDbCCIO<eemcDbPMTped> ;
610 template class EEmcDbCCIO<eemcDbPMTstat>;
611 template class EEmcDbCCIO<eemcDbPIXcal> ;
612 template class EEmcDbCCIO<eemcDbPIXname>;
613 
614 template class EEmcDbQAIO<eemcDbPMTchar>;
615 template class EEmcDbQAIO<eemcDbCWchar> ;
616 
617 template class EEmcDbHVIO<eemcDbHVsys> ;
618 template class EEmcDbHVIO<eemcDbHVtemp> ;
619 
620 template class EEmcDbXML<eemcDbXMLdata> ;
621 #endif
622 
623 // $Log: EEmcDbIO.C,v $
624 // Revision 1.1 2013/01/25 16:46:48 stevens4
625 // Scripts used to upload EEMC tables to the DB
626 //
627 // Revision 1.11 2004/01/13 16:43:20 zolnie
628 // allowed for inline comments
629 // lines starting with # will be ignored (except the first one
630 // which contains the signature)
631 // for EEmcDbCCIO, EEmcDbQAIO, EEmcDbHVIO
632 // but no for EEmcDbXML, KretDbBlobSIO
633 //
634 // Revision 1.10 2003/11/30 04:16:17 zolnie
635 // PIX dbases in eemcdb
636 //
637 // Revision 1.9 2003/10/28 21:18:48 zolnie
638 // updates for Run2004
639 //
640 // Revision 1.8 2003/08/20 17:10:15 zolnie
641 // fixed scan in eemcPMTstat
642 //
643 // Revision 1.7 2003/08/19 18:56:31 zolnie
644 // added PMTstat table
645 //
646 // Revision 1.6 2003/08/07 16:33:22 zolnie
647 // replaced confusing --noWrite/-w option with a clearer one: --dataonly/-d
648 //
649 // Revision 1.5 2003/04/11 18:04:46 balewski
650 // add I/O for PMTname
651 //
652 // Revision 1.4 2003/04/10 21:44:24 zolnie
653 // *** empty log message ***
654 //
655 // Revision 1.3 2003/04/10 15:12:48 zolnie
656 // new dbase changes
657 //
658 // Revision 1.2 2003/02/04 18:10:08 zolnie
659 // added eemcHVtemp online database
660 //
661 // Revision 1.1 2003/01/28 23:22:18 balewski
662 // start
663 //
664 // Revision 1.13 2003/01/28 22:34:59 zolnie
665 // make sure quiet is quiet (once more)
666 //
667 // Revision 1.12 2003/01/27 14:54:50 zolnie
668 // back at IU
669 //
670 // Revision 1.11 2003/01/25 20:09:10 balewski
671 // add BlobS, remove old kret*
672 //
673 // Revision 1.10 2003/01/24 20:54:32 zolnie
674 // merger with Jan + updates for "HVindex" stuff
675 //
676 // Revision 1.9 2003/01/24 17:11:34 balewski
677 // cleanup
678 //
679 // Revision 1.8 2003/01/24 16:44:48 balewski
680 // added WCM+someRing online info
681 //
682 // Revision 1.7 2003/01/22 02:31:57 balewski
683 // small fix
684 //
685 // Revision 1.6 2003/01/22 02:03:22 zolnie
686 // grand challenge for Jan
687 //
688 // Revision 1.5 2003/01/21 23:47:40 balewski
689 // HVsys table added
690 //
691 // Revision 1.4 2003/01/10 18:48:33 zolnie
692 // submision version
693 //
694 // Revision 1.3 2003/01/10 04:52:02 zolnie
695 // updates to Tcl/Tk interface (czyli Zadana Pana Jana)
696 //
697 // Revision 1.2 2003/01/03 21:14:49 zolnie
698 // fixed string packing in EEmcDbCCIO<T>::read(FILE *f)
699 // added resetString
700 // first version of tkEEmcDb
701 //