00001 #ifdef __cplusplus
00002
00003 #ifndef HBOOKCNV_NTUPLEINFO_H
00004 #define HBOOKCNV_NTUPLEINFO_H 1
00005
00006 #include "GaudiKernel/Kernel.h"
00007
00008 class NTUPLEINFO {
00009 public:
00010 long id;
00011 char title[128];
00012 char rzdir[256];
00013 long numEnt;
00014 long numVar;
00015 char block[32];
00016
00017
00018 char name[512][64];
00019 long dim[512];
00020 long theDim[512][5];
00021 long hasIndex[512];
00022 char index[512][64];
00023 char type[512];
00024 long size[512];
00025 long hasRange[512];
00026 long irange[512][2];
00027 double frange[512][2];
00028 template <class TYPE>
00029 void getBounds(long i, TYPE& min, TYPE& max, TYPE& null) const {
00030 if ( hasRange ) {
00031 min = (type[i]=='R') ? TYPE(frange[i][0]) : TYPE(irange[i][0]);
00032 max = (type[i]=='R') ? TYPE(frange[i][1]) : TYPE(irange[i][1]);
00033 }
00034 else {
00035 min = NTuple::Range<TYPE>::min();
00036 max = NTuple::Range<TYPE>::max();
00037 }
00038 null = TYPE(0);
00039 }
00040 TEMPLATE_SPECIALIZATION
00041 void getBounds(long , bool& min, bool& max, bool& null ) const {
00042 min = null = false;
00043 max = true;
00044 }
00045 template <class TYPE>
00046 bool isRangeWithin(long i, TYPE min, TYPE max) const {
00047 if ( hasRange[i] ) {
00048 return min <= (TYPE)irange[i][0] && (TYPE)irange[i][1] <= max;
00049 }
00050 else if ( type[i] == 'I' || type[i] == 'U' ) {
00051 return NTuple::Range<TYPE>::min() <= min && NTuple::Range<TYPE>::max() >= max;
00052 }
00053 return false;
00054 }
00055 TEMPLATE_SPECIALIZATION
00056 bool isRangeWithin(long i, float , float ) const {
00057 if ( size[i] == 32 ) return true;
00058 return false;
00059 }
00060 TEMPLATE_SPECIALIZATION
00061 bool isRangeWithin(long i, double , double ) const {
00062 if ( size[i] == 64 ) return true;
00063 return false;
00064 }
00065 TEMPLATE_SPECIALIZATION
00066 bool isRangeWithin(long , bool min, bool max) const {
00067 return min == false && max == true;
00068 }
00069 long idist(long i) const {
00070 return irange[i][1] - irange[i][0];
00071 }
00072 double fdist(long i) const {
00073 return frange[i][1] - frange[i][0];
00074 }
00075
00076
00077 long getIndex(const char* nam) const {
00078 if ( nam[0] != 0 ) {
00079 for ( int i = 0; i < numVar; i++ ) {
00080 if ( strncmp(name[i], nam, sizeof(name[i])) == 0 ) {
00081 return i;
00082 }
00083 }
00084 }
00085 return -1;
00086 }
00087 };
00088 #endif // HBOOKCNV_NTUPLEINFO_H
00089
00090 #else
00091 #ifdef WIN32
00092 STRUCTURE /NTUPLEVAR/
00093 CHARACTER*64 NAME
00094 INTEGER NDIM
00095 INTEGER THEDIM(5)
00096 INTEGER HASINDEX
00097 CHARACTER*64 INDEX
00098 CHARACTER*1 TYPE
00099 INTEGER SIZE
00100 INTEGER HASRANGE
00101 UNION
00102 MAP
00103 INTEGER IMIN, IMAX
00104 END MAP
00105 MAP
00106 REAL*8 FMIN, FMAX
00107 END MAP
00108 END UNION
00109 END STRUCTURE
00110
00111 STRUCTURE /NTUPLEINFO/
00112 INTEGER ID
00113 CHARACTER*128 TITLE
00114 INTEGER NOENT
00115 INTEGER NDIM
00116 CHARACTER*8 BLOCK
00117 RECORD /NTUPLEVAR/ VAR(512)
00118 END STRUCTURE
00119 #else
00120 c TYPE NTUPLEVAR
00121 CHARACTER*64 VNAME(512)
00122 INTEGER VNDIM(512)
00123 INTEGER VTHEDIM(512,5)
00124 INTEGER VHASINDEX(512)
00125 CHARACTER*64 VINDEX(512)
00126 CHARACTER*1 VTYPE(512)
00127 INTEGER VSIZE(512)
00128 INTEGER VHASRANGE(512)
00129 c UNION
00130 c MAP
00131 INTEGER VIMIN(512), VIMAX(512)
00132 c END MAP
00133 c MAP
00134 REAL*8 VFMIN(512), VFMAX(512)
00135 c END MAP
00136 c END UNION
00137 c END TYPE NTUPLEVAR
00138
00139 c TYPE NTUPLEINFO
00140 INTEGER NTID
00141 CHARACTER*128 NTTITLE
00142 INTEGER NTNOENT
00143 INTEGER NTNDIM
00144 CHARACTER*8 NTBLOCK
00145 c TYPE(NTUPLEVAR) VAR(512)
00146 c END TYPE NTUPLEINFO
00147 COMMON/NTUPLEINFO/VNAME,VNDIM,VTHEDIM,
00148 & VHASINDEX,VINDEX,VTYPE,VSIZE,
00149 & VHASRANGE, VIMIN, VIMAX, VFMIN, VFMAX,
00150 & NTID, NTTITLE, NTNDIM, NTBLOCK
00151 #endif
00152 #endif