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 |