Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 326 | f9daq | 1 | #ifdef _CVI_ | 
        
| 2 | #  include <ansi_c.h> | 
        ||
| 3 | # else _CVI_ | 
        ||
| 4 | #  include <stdlib.h> | 
        ||
| 5 | #  include <stdio.h> | 
        ||
| 6 | #  include <string.h> | 
        ||
| 7 | #endif _CVI_ | 
        ||
| 8 | |||
| 9 | #include "H3D.h" | 
        ||
| 10 | |||
| 11 | #define H3DMAX 500 | 
        ||
| 12 | H3D *h3[H3DMAX];  | 
        ||
| 13 | //int Printf(char *format, ...); | 
        ||
| 14 | |||
| 15 | int H3DClear(int h3d) {  | 
        ||
| 16 | if (!h3[h3d]) return -1;  | 
        ||
| 17 | memset(h3[h3d]->data, 0,h3[h3d]->size );  | 
        ||
| 18 | h3[h3d]->min=0;  | 
        ||
| 19 | h3[h3d]->max=0;  | 
        ||
| 20 | h3[h3d]->nentries=0;  | 
        ||
| 21 | return 0;  | 
        ||
| 22 | |||
| 23 | } | 
        ||
| 24 | |||
| 25 | int H3DPrint(int h3d) {  | 
        ||
| 26 | if (!h3[h3d]) return -1;  | 
        ||
| 27 | //Printf("PrintH3D nx=%d minx=%f stepx=%f ny=%d miny=%f stepy=%f size=%d\n", h3[h3d]->nx, h3[h3d]->minx, h3[h3d]->stepx, h3[h3d]->ny, h3[h3d]->miny, h3[h3d]->stepy, h3[h3d]->size ) ; | 
        ||
| 28 | return 0;  | 
        ||
| 29 | |||
| 30 | } | 
        ||
| 31 | |||
| 32 | int H3DExist(int h) {  | 
        ||
| 33 | if (h3[h]) return 1;  | 
        ||
| 34 | else return 0;  | 
        ||
| 35 | } | 
        ||
| 36 | |||
| 37 | |||
| 38 | int H3DCalculateBin(int h, int axis, double value) {  | 
        ||
| 39 | int nx=1,xmin=0,dx=0;  | 
        ||
| 40 | int bin;  | 
        ||
| 41 | switch (axis) {  | 
        ||
| 42 | case 0:  | 
        ||
| 43 | nx = H3DGetNbinsX(h);  | 
        ||
| 44 | xmin= H3DGetMinX(h);  | 
        ||
| 45 | dx = H3DGetStepX(h);  | 
        ||
| 46 | break;  | 
        ||
| 47 | case 1:  | 
        ||
| 48 | nx = H3DGetNbinsY(h);  | 
        ||
| 49 | xmin= H3DGetMinY(h);  | 
        ||
| 50 | dx = H3DGetStepY(h);  | 
        ||
| 51 | break;  | 
        ||
| 52 | case 2:  | 
        ||
| 53 | nx = H3DGetNbinsZ(h);  | 
        ||
| 54 | xmin= H3DGetMinZ(h);  | 
        ||
| 55 | dx = H3DGetStepZ(h);  | 
        ||
| 56 | break;  | 
        ||
| 57 | |||
| 58 |   } | 
        ||
| 59 | if (dx==0) return -1;  | 
        ||
| 60 | if (value<xmin) return -1;  | 
        ||
| 61 | bin = (int)((value-xmin)/dx);  | 
        ||
| 62 | if (bin>=nx) return -1;  | 
        ||
| 63 | else return bin;  | 
        ||
| 64 | } | 
        ||
| 65 | |||
| 66 | int H3DFill(int h3d,double x, double y, double z, double val) {  | 
        ||
| 67 | |||
| 68 | int idx, ix,iy, iz;  | 
        ||
| 69 | if (!h3[h3d]) return -1;  | 
        ||
| 70 | |||
| 71 | ix = H3DCalculateBin(h3d,0,x);  | 
        ||
| 72 | if (ix<0) return ix;  | 
        ||
| 73 | |||
| 74 | iy = H3DCalculateBin(h3d,1,y);  | 
        ||
| 75 | if (iy<0) return iy;  | 
        ||
| 76 | |||
| 77 | iz = H3DCalculateBin(h3d,2,z);  | 
        ||
| 78 | if (iz<0) return iz;  | 
        ||
| 79 | |||
| 80 | |||
| 81 | H3DFillBin(h3d, ix, iy, iz, val);  | 
        ||
| 82 | return 0;  | 
        ||
| 83 | } | 
        ||
| 84 | |||
| 85 | int H3DGetBin(int h3d,int x, int y, int z) {  | 
        ||
| 86 | return x+h3[h3d]->nx *(y+z*h3[h3d]->ny);  | 
        ||
| 87 | } | 
        ||
| 88 | |||
| 89 | int H3DFillBin(int h3d,int x, int y, int z, double val) {  | 
        ||
| 90 | |||
| 91 | int idx;  | 
        ||
| 92 | if (!h3[h3d]) {  | 
        ||
| 93 | //Printf("FillH3D error h3d is not initialized\n"); | 
        ||
| 94 | return -1;  | 
        ||
| 95 |   } | 
        ||
| 96 | |||
| 97 | idx = H3DGetBin(h3d,x,y,z);  | 
        ||
| 98 | h3[h3d]->data[idx]+=val;  | 
        ||
| 99 | //Printf("%d %d data %f %f\n",x,y,val, h3[h3d]->data[idx]); | 
        ||
| 100 | if (h3[h3d]->data[idx]>h3[h3d]->max) h3[h3d]->max= h3[h3d]->data[idx];  | 
        ||
| 101 | if (h3[h3d]->data[idx]<h3[h3d]->min) h3[h3d]->min= h3[h3d]->data[idx];  | 
        ||
| 102 | h3[h3d]->nentries++;  | 
        ||
| 103 | return 0;  | 
        ||
| 104 | } | 
        ||
| 105 | |||
| 106 | double H3DGetBinContent(int h3d,int atx, int aty, int atz) {  | 
        ||
| 107 | |||
| 108 | int idx;  | 
        ||
| 109 | if (!h3[h3d]) return 0;  | 
        ||
| 110 | if (h3[h3d]->nx <= atx) return 0;  | 
        ||
| 111 | if (h3[h3d]->ny <= aty) return 0;  | 
        ||
| 112 | if (h3[h3d]->nz <= atz) return 0;  | 
        ||
| 113 | idx = H3DGetBin(h3d,atx,aty,atz);  | 
        ||
| 114 | if (idx*sizeof(double) < h3[h3d]->size ) return h3[h3d]->data[idx];  | 
        ||
| 115 | |||
| 116 | |||
| 117 | return 0;  | 
        ||
| 118 | } | 
        ||
| 119 | |||
| 120 | |||
| 121 | int H3DInit(int h3d,char *name, char *title,int nx, double minx, double stepx, int ny, double miny, double stepy, int nz, double minz, double stepz) {  | 
        ||
| 122 | |||
| 123 | if (h3[h3d]) {  | 
        ||
| 124 | |||
| 125 | free(h3[h3d]->data);  | 
        ||
| 126 | free(h3[h3d]);  | 
        ||
| 127 | h3[h3d] = NULL;  | 
        ||
| 128 |   } | 
        ||
| 129 |   //printf("InitH3D hID=%d\n",h3d); | 
        ||
| 130 | h3[h3d] = (H3D *) malloc(sizeof(H3D));  | 
        ||
| 131 | //h2  =h3d; | 
        ||
| 132 | |||
| 133 | H3DSetTitle(h3d,title);  | 
        ||
| 134 | H3DSetName(h3d,name);  | 
        ||
| 135 | h3[h3d]->id=H3D_ID;  | 
        ||
| 136 | h3[h3d]->nx = nx;  | 
        ||
| 137 | h3[h3d]->ny = ny;  | 
        ||
| 138 | h3[h3d]->nz = nz;  | 
        ||
| 139 | |||
| 140 | h3[h3d]->minx = minx;  | 
        ||
| 141 | h3[h3d]->miny = miny;  | 
        ||
| 142 | h3[h3d]->minz = minz;  | 
        ||
| 143 | |||
| 144 | h3[h3d]->stepx = stepx;  | 
        ||
| 145 | h3[h3d]->stepy = stepy;  | 
        ||
| 146 | h3[h3d]->stepz = stepz;  | 
        ||
| 147 | |||
| 148 | h3[h3d]->size = h3[h3d]->nx*h3[h3d]->ny*h3[h3d]->nz*sizeof(double);  | 
        ||
| 149 | h3[h3d]->data = (double *) malloc(h3[h3d]->size);  | 
        ||
| 150 | h3[h3d]->len=sizeof(H3D)-sizeof(double *)+h3[h3d]->size;  | 
        ||
| 151 | H3DClear(h3d);  | 
        ||
| 152 | H3DPrint(h3d);  | 
        ||
| 153 | //Printf("InitH3D 0x%x\n", h3d ); | 
        ||
| 154 | return 0;  | 
        ||
| 155 | |||
| 156 | } | 
        ||
| 157 | |||
| 158 | |||
| 159 | double H3DGetXBinCenter(int h3d,int xbin) {  | 
        ||
| 160 | return h3[h3d]->minx+xbin*h3[h3d]->stepx;  | 
        ||
| 161 | } | 
        ||
| 162 | |||
| 163 | double H3DGetYBinCenter(int h3d,int ybin) {  | 
        ||
| 164 | return h3[h3d]->miny+ybin*h3[h3d]->stepy;  | 
        ||
| 165 | } | 
        ||
| 166 | |||
| 167 | double H3DGetZBinCenter(int h3d,int zbin) {  | 
        ||
| 168 | return h3[h3d]->minz+zbin*h3[h3d]->stepz;  | 
        ||
| 169 | } | 
        ||
| 170 | |||
| 171 | |||
| 172 | int H3DWrite2File(int h3d,FILE *fp) {  | 
        ||
| 173 | |||
| 174 | if (!fp) return -1;  | 
        ||
| 175 | //printf("H3D sizeof(H3D)=%lu len-datasize=%d len=%lu datasize=%d\t",sizeof(H3D)-sizeof(double *),h3[h3d]->len-h3[h3d]->size,h3[h3d]->len,h3[h3d]->size); | 
        ||
| 176 | //printf("H3D sz=%d %d\n",sizeof(double),sizeof(double *)); | 
        ||
| 177 | fwrite (h3[h3d], 1, sizeof(H3D)-sizeof(double *), fp);  | 
        ||
| 178 | fwrite (h3[h3d]->data, 1, h3[h3d]->size, fp);  | 
        ||
| 179 | return 0;  | 
        ||
| 180 | } | 
        ||
| 181 | |||
| 182 | int H3DWrite(int h3d,const char *fname,const char *opt) {  | 
        ||
| 183 | FILE *fp=fopen(fname,opt);  | 
        ||
| 184 | H3DWrite2File(h3d,fp);  | 
        ||
| 185 | fclose(fp);  | 
        ||
| 186 | return 0;  | 
        ||
| 187 | } | 
        ||
| 188 | |||
| 189 | |||
| 190 | |||
| 191 | |||
| 192 | int H3DSetTitle(int h3d,char *title) {  | 
        ||
| 193 | sprintf(h3[h3d]->title,"%s",title);  | 
        ||
| 194 | return 0;  | 
        ||
| 195 | } | 
        ||
| 196 | |||
| 197 | |||
| 198 | int H3DSetTitleX(int h3d,char *title) {  | 
        ||
| 199 | sprintf(h3[h3d]->titlex,"%s",title);  | 
        ||
| 200 | return 0;  | 
        ||
| 201 | } | 
        ||
| 202 | |||
| 203 | |||
| 204 | int H3DSetTitleY(int h3d,char *title) {  | 
        ||
| 205 | sprintf(h3[h3d]->titley,"%s",title);  | 
        ||
| 206 | return 0;  | 
        ||
| 207 | } | 
        ||
| 208 | |||
| 209 | int H3DSetTitleZ(int h3d,char *title) {  | 
        ||
| 210 | sprintf(h3[h3d]->titlez,"%s",title);  | 
        ||
| 211 | return 0;  | 
        ||
| 212 | } | 
        ||
| 213 | |||
| 214 | |||
| 215 | int H3DSetName(int h3d,char *title) {  | 
        ||
| 216 | sprintf(h3[h3d]->name,"%s",title);  | 
        ||
| 217 | return 0;  | 
        ||
| 218 | } | 
        ||
| 219 | |||
| 220 | int H3DGetNbinsY(int h) {  | 
        ||
| 221 | if (h3[h]) return h3[h]->ny;  | 
        ||
| 222 | else return 0;  | 
        ||
| 223 | } | 
        ||
| 224 | |||
| 225 | int H3DGetNbinsX(int h) {  | 
        ||
| 226 | if (h3[h]) return h3[h]->nx;  | 
        ||
| 227 | else return 0;  | 
        ||
| 228 | } | 
        ||
| 229 | |||
| 230 | int H3DGetNbinsZ(int h) {  | 
        ||
| 231 | if (h3[h]) return h3[h]->nz;  | 
        ||
| 232 | else return 0;  | 
        ||
| 233 | } | 
        ||
| 234 | |||
| 235 | |||
| 236 | |||
| 237 | double H3DGetMinX(int h) {  | 
        ||
| 238 | if (h3[h]) return h3[h]->minx;  | 
        ||
| 239 | else return 0;  | 
        ||
| 240 | } | 
        ||
| 241 | |||
| 242 | double H3DGetMinY(int h) {  | 
        ||
| 243 | if (h3[h]) return h3[h]->miny;  | 
        ||
| 244 | else return 0;  | 
        ||
| 245 | } | 
        ||
| 246 | |||
| 247 | double H3DGetMinZ(int h) {  | 
        ||
| 248 | if (h3[h]) return h3[h]->minz;  | 
        ||
| 249 | else return 0;  | 
        ||
| 250 | } | 
        ||
| 251 | |||
| 252 | |||
| 253 | |||
| 254 | |||
| 255 | double H3DGetStepX(int h) {  | 
        ||
| 256 | if (h3[h]) return h3[h]->stepx;  | 
        ||
| 257 | else return 0;  | 
        ||
| 258 | } | 
        ||
| 259 | |||
| 260 | double H3DGetStepY(int h) {  | 
        ||
| 261 | if (h3[h]) return h3[h]->stepy;  | 
        ||
| 262 | else return 0;  | 
        ||
| 263 | } | 
        ||
| 264 | |||
| 265 | double H3DGetStepZ(int h) {  | 
        ||
| 266 | if (h3[h]) return h3[h]->stepz;  | 
        ||
| 267 | else return 0;  | 
        ||
| 268 | } | 
        ||
| 269 | |||
| 270 | |||
| 271 | |||
| 272 | |||
| 273 | double H3DGetMin(int h) {  | 
        ||
| 274 | if (h3[h]) return h3[h]->min;  | 
        ||
| 275 | else return 0;  | 
        ||
| 276 | } | 
        ||
| 277 | |||
| 278 | double H3DGetMax(int h) {  | 
        ||
| 279 | if (h3[h]) return h3[h]->max;  | 
        ||
| 280 | else return 0;  | 
        ||
| 281 | } | 
        ||
| 282 | |||
| 283 | double * H3DGetSliceXYData(int h, int slice) {  | 
        ||
| 284 | if (h3[h]) return (h3[h]->data+slice*h3[h]->nx*h3[h]->ny);  | 
        ||
| 285 | else return NULL;  | 
        ||
| 286 | } | 
        ||
| 287 | |||
| 288 | double * H3DGetData(int h) {  | 
        ||
| 289 | if (h3[h]) return h3[h]->data;  | 
        ||
| 290 | else return NULL;  | 
        ||
| 291 | } | 
        ||
| 292 |