Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
298 | f9daq | 1 | #include <formatio.h> |
2 | #include "H1D.h" |
||
3 | #include "H2D.h" |
||
4 | #include <utility.h> |
||
5 | #include <ansi_c.h> |
||
6 | #include <cvirte.h> |
||
7 | #include <userint.h> |
||
8 | #include "vmusb_ctrl.h" |
||
9 | #include "daq_cvi.h" |
||
10 | static int p1, p2, p3; |
||
11 | |||
12 | |||
13 | static int daq_on; |
||
14 | static int plothandle[4]= {0,0,0, 0}; |
||
15 | static int tfID; |
||
16 | static int controlID; |
||
17 | static int verbose; |
||
18 | static int timeout; |
||
19 | extern int ctrlcflag; |
||
20 | |||
21 | #define MAX_THREADS 10 |
||
22 | |||
23 | static CmtThreadPoolHandle poolHandle = 0; |
||
24 | |||
25 | #define MAXCH 72 |
||
26 | float gSum[6]; |
||
27 | float gRawSum[6]; |
||
28 | float gMax[6]; |
||
29 | float gSumCluster[6]; |
||
30 | float gNtdata[MAXCH*3]; |
||
31 | int gNabove[5]; |
||
32 | double gData[MAXCH]; // korigirani ADC ji |
||
33 | double gAdc[MAXCH]; // raw ADC ji |
||
34 | |||
35 | double gPedestals[MAXCH]; |
||
36 | double gPeak[MAXCH]; |
||
37 | |||
38 | double gPeakScaling; |
||
39 | double gThreshold; |
||
40 | |||
41 | |||
42 | typedef struct Channel { |
||
43 | int ix; |
||
44 | int iy; |
||
45 | int idx; |
||
46 | |||
47 | }; |
||
48 | |||
49 | struct Channel m_geo_ch[16]; |
||
50 | |||
51 | |||
52 | char strbuf[0xFF]; |
||
53 | |||
54 | int gLog=0; |
||
55 | int printf(const char *format, ...) { |
||
56 | va_list aptr; |
||
57 | int ret; |
||
58 | FILE *flog; |
||
59 | |||
60 | va_start(aptr, format); |
||
61 | ret = vsprintf(strbuf, format, aptr); |
||
62 | va_end(aptr); |
||
63 | SetCtrlVal(p1,P1_IO,strbuf); |
||
64 | |||
65 | if (gLog) { |
||
66 | flog = fopen ("stdio.log", "a"); |
||
67 | fprintf (flog, "%s", strbuf); |
||
68 | fclose (flog); |
||
69 | } |
||
70 | return(ret); |
||
71 | } |
||
72 | |||
73 | |||
74 | |||
75 | int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, |
||
76 | LPSTR lpszCmdLine, int nCmdShow) { |
||
77 | if (InitCVIRTE (hInstance, 0, 0) == 0) |
||
78 | return -1; /* out of memory */ |
||
79 | if ((p1 = LoadPanel (0, "vmusb_ctrl.uir", P1)) < 0) |
||
80 | return -1; |
||
81 | if ((p2 = LoadPanel (0, "vmusb_ctrl.uir", P2)) < 0) |
||
82 | return -1; |
||
83 | if ((p3 = LoadPanel (0, "vmusb_ctrl.uir", P3)) < 0) |
||
84 | return -1; |
||
85 | SetStdioPort (CVI_STDIO_WINDOW); |
||
86 | SetSleepPolicy(VAL_SLEEP_MORE); |
||
87 | CmtNewThreadPool (MAX_THREADS, &poolHandle); |
||
88 | DisplayPanel (p1); |
||
89 | |||
90 | RunUserInterface (); |
||
91 | DiscardPanel (p1); |
||
92 | DiscardPanel (p2); |
||
93 | DiscardPanel (p3); |
||
94 | return 0; |
||
95 | } |
||
96 | |||
97 | static void start_timer (double tout) { |
||
98 | timeout = 0; |
||
99 | SetCtrlAttribute (p1, P1_TIMER, ATTR_INTERVAL, tout); |
||
100 | SetCtrlAttribute (p1, P1_TIMER, ATTR_ENABLED, 1); |
||
101 | } |
||
102 | |||
103 | static void stop_timer ( void ) { |
||
104 | SetCtrlAttribute (p1, P1_TIMER, ATTR_ENABLED, 0); |
||
105 | //DRSSetTimeout(); |
||
106 | } |
||
107 | |||
108 | |||
109 | |||
110 | |||
111 | |||
112 | int georead(){ |
||
113 | int i; |
||
114 | for (i=0; i<64; i++) { |
||
115 | int row=i+1; |
||
116 | double val; |
||
117 | unsigned short sval; |
||
118 | GetTableCellVal (p3, P3_CGEO, MakePoint (3,row), &sval); |
||
119 | fThreshold[i]=sval; |
||
120 | GetTableCellVal (p3, P3_CGEO, MakePoint (4,row), &val); |
||
121 | gPeak[i]=val; |
||
122 | GetTableCellVal (p3, P3_CGEO, MakePoint (5,row), &val); |
||
123 | gPedestals[i]=val; |
||
124 | } |
||
125 | |||
126 | GetCtrlVal(p3, P3_PEAKSCALING, &gPeakScaling ); |
||
127 | GetCtrlVal(p3, P3_GTHRESHOLD, &gThreshold ); |
||
128 | |||
129 | for (i=0; i<16; i++) { |
||
130 | int row=i+1; |
||
131 | double val; |
||
132 | unsigned short sval, id; |
||
133 | GetTableCellVal (p3, P3_CGEO, MakePoint (1,row), &id); |
||
134 | GetTableCellVal (p3, P3_CGEO, MakePoint (2,row), &sval); |
||
135 | m_geo_ch[id].ix=sval; |
||
136 | GetTableCellVal (p3, P3_CGEO, MakePoint (3,row), &sval); |
||
137 | m_geo_ch[id].iy=sval; |
||
138 | m_geo_ch[id].idx=id; |
||
139 | } |
||
140 | |||
141 | return 0; |
||
142 | } |
||
143 | |||
144 | void CVICALLBACK EndOfThread ( CmtThreadPoolHandle poolhandle, |
||
145 | CmtThreadFunctionID functionID, unsigned int event, |
||
146 | int value, void *callbackData ) { |
||
147 | |||
148 | daq_on=0; |
||
149 | //SetDimming(0); |
||
150 | printf("End of Thread \n"); |
||
151 | return ; |
||
152 | |||
153 | } |
||
154 | |||
155 | |||
156 | int CVICALLBACK RefreshGraphs (int panel, int control, int event, |
||
157 | void *callbackData, int eventData1, int eventData2) { |
||
158 | switch (event) { |
||
159 | case EVENT_TIMER_TICK: |
||
160 | // if (!daq_on ) return 0; |
||
161 | case EVENT_COMMIT: { |
||
162 | |||
163 | int ch=0; |
||
164 | int logy=0; |
||
165 | int pmt =0; |
||
166 | int updateplots=0; |
||
167 | GetCtrlVal(p1,P1_RECO, &updateplots); |
||
168 | if (!updateplots) return 0; |
||
169 | GetCtrlVal(p2,P2_PMT, &pmt); |
||
170 | GetCtrlVal(p2,P2_ADC, &ch); |
||
171 | |||
172 | |||
173 | H1D_Draw(10,p2,P2_GRAPHADC,&plothandle[1]); |
||
174 | H2D_Draw(0,p2,P2_GRAPH2D,&plothandle[2]); |
||
175 | |||
176 | |||
177 | } |
||
178 | |||
179 | |||
180 | break; |
||
181 | |||
182 | } |
||
183 | return 0; |
||
184 | } |
||
185 | |||
186 | |||
187 | |||
188 | int vmusb_init(){ |
||
189 | |||
190 | int range = 2056; |
||
191 | for (int i=0; i<MAXCH; i++) { |
||
192 | char name[0xFF]; |
||
193 | sprintf(name,"adc%d", i); |
||
194 | |||
195 | H1D_Init(i, name,name, range, 0 , range); |
||
196 | H1D_SetTitleX(0,"ADC"); |
||
197 | H1D_SetTitleY(0,"N"); |
||
198 | sprintf(name,"adc%d", i); |
||
199 | |||
200 | sprintf(name,"energy%d", i); |
||
201 | H1D_Init(100+i, name,name, range, 0 , range); |
||
202 | H1D_SetTitleX(0,"Energy"); |
||
203 | H1D_SetTitleY(0,"N"); |
||
204 | } |
||
205 | |||
206 | |||
207 | H2D_Init(0, "cog","Center of grg_peakscalingavity", 256, 0 ,1, 256, 0 ,1); |
||
208 | H2D_SetTitleX(0,"x"); |
||
209 | H2D_SetTitleY(0,"y"); |
||
210 | |||
211 | return 0; |
||
212 | } |
||
213 | |||
214 | double GetEnergy(int ch, int adc){ |
||
215 | return (adc-gPedestals[ch])/(gPeak[ch]-gPedestals[ch])*gPeakScaling; |
||
216 | } |
||
217 | |||
218 | int FillHistograms() { |
||
219 | |||
220 | int npmts = 4; |
||
221 | for (int ipmt=0; ipmt<npmts; ipmt++) { // zanka preko pmtjev |
||
222 | int j2= (ipmt/2)*2+1-ipmt%2; // sosednja fotopomnozevalka |
||
223 | |||
224 | float posx[2]= {0,0}; |
||
225 | float posy[2]= {0,0}; |
||
226 | float sum[2]= {0,0}; |
||
227 | float m_threshold =100; |
||
228 | for (int ich=0; ich<16; ich++) { // zanka preko elektronskih kanalov na fotopomnozevalki |
||
229 | int ch= ich+ipmt*16; |
||
230 | if (gMax[ipmt]>m_threshold) { |
||
231 | posx[0]+= gData[ch]*m_geo_ch[ich].ix; |
||
232 | posy[0]+= gData[ch]*m_geo_ch[ich].iy; |
||
233 | sum[0] += gData[ch]; |
||
234 | |||
235 | if (gData[ch]> 0.2*gMax[ipmt]) { // pri racunanju pozicije upostevaj le kanale, ki imajo vrednost vecjo od ratio*maksimalna na tisti fotopomnozevalki |
||
236 | posx[1]+= gData[ch]*m_geo_ch[ich].ix; |
||
237 | posy[1]+= gData[ch]*m_geo_ch[ich].iy; |
||
238 | sum[1] += gData[ch]; |
||
239 | } |
||
240 | } |
||
241 | } |
||
242 | |||
243 | if ( sum[0] > 0 ) { |
||
244 | float px=posx[0]/sum[0]; |
||
245 | float py=posy[0]/sum[0]; |
||
246 | H2D_Fill(0, px,py,1); |
||
247 | } |
||
248 | } |
||
249 | |||
250 | |||
251 | return 0; |
||
252 | }; |
||
253 | |||
254 | |||
255 | int DecodeData(int n, unsigned int *buf){ |
||
256 | |||
257 | int idx=1; |
||
258 | int neve=buf[0]/2; |
||
259 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
260 | for (int nev=0;nev<neve;nev++){ |
||
261 | int len=buf[idx]; |
||
262 | int sb =buf[idx+1]; |
||
263 | unsigned int *pbuf=&buf[idx+2]; |
||
264 | if (sb!=0xffab) { |
||
265 | printf("0x%04x!0xffab len=%d\n",sb,len); |
||
266 | break; |
||
267 | } |
||
268 | // postavi na nic |
||
269 | #define InitArrayWithAValue(arr,n,x) {for (int i=0;i<n;i++) arr[i]=x;} |
||
270 | InitArrayWithAValue( gSum , 4 , 0); |
||
271 | InitArrayWithAValue( gRawSum , 4 , 0); |
||
272 | InitArrayWithAValue( gMax , 4 , 0); |
||
273 | InitArrayWithAValue( gSumCluster, 4 , 0); |
||
274 | InitArrayWithAValue( gNabove , 4 , 0); |
||
275 | InitArrayWithAValue( gData , MAXCH, 0); |
||
276 | InitArrayWithAValue( gAdc , MAXCH, 0); |
||
277 | //------------------------------------------------------------ |
||
278 | for (int i0=0;i0<len-2;i0+=2) { |
||
279 | |||
280 | int data0 = pbuf[i0]; |
||
281 | int data1 = pbuf[i0+1]; |
||
282 | int geo = (data1 >> 11) & 0x1f; |
||
283 | int ch = (data1&0x1f) | (geo<<5); |
||
284 | int dtype = (data1>>9)&0x3; |
||
285 | int adc = data0&0xfff; |
||
286 | |||
287 | switch (dtype) { |
||
288 | case 0x0: |
||
289 | if (ch<MAXCH) { |
||
290 | H1D_Fill(ch,adc,1); |
||
291 | |||
292 | int ipmt = ch/16; |
||
293 | |||
294 | gAdc[ch]=adc; |
||
295 | gRawSum[ipmt]+=adc; |
||
296 | |||
297 | if (ch<64) gData[ch]= GetEnergy(ch,adc); else gData[ch]=adc; |
||
298 | H1D_Fill(1+ch,gData[ch],1); |
||
299 | gSum[ipmt]+=gData[ch]; |
||
300 | if (gData[ch] >gMax[ipmt] ) gMax[ipmt]= gData[ch]; |
||
301 | if (gData[ch] >gThreshold ) gNabove[ipmt]++; |
||
302 | } |
||
303 | break; |
||
304 | case 0x10: |
||
305 | case 0x11: |
||
306 | case 0x01: |
||
307 | break; |
||
308 | } |
||
309 | |||
310 | };// for (int i0=0;i0<len-2;i0+=2) |
||
311 | //------------------------------------------------------------ |
||
312 | |||
313 | idx+=len+1; |
||
314 | FillHistograms(); |
||
315 | } // for (int nev=0;nev<neve;nev++) |
||
316 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
317 | |||
318 | |||
319 | return 0; |
||
320 | } |
||
321 | int vmusb_daq(){ |
||
322 | |||
323 | |||
324 | vmusb_init(); |
||
325 | |||
326 | |||
327 | |||
328 | |||
329 | // print welcome message |
||
330 | time_t t,told=0, tstart, tstop; |
||
331 | time(&t); |
||
332 | printf("#############################################\n"); |
||
333 | printf("Program vmusb version\n"); |
||
334 | printf("Compiled on %s %s\n",__DATE__, __TIME__); |
||
335 | printf("Runtime %s \n",ctime(&t)); |
||
336 | printf("#############################################\n"); |
||
337 | |||
338 | |||
339 | int neve=-1; |
||
340 | char cfname[100]="test.dat"; |
||
341 | char fname[0xff]; |
||
342 | char fpedname[0xff]; |
||
343 | |||
344 | #define BSIZE 10000 |
||
345 | uint32_t data[10000]; |
||
346 | int oldValue; |
||
347 | //oldValue = SetBreakOnLibraryErrors (0); |
||
348 | daq_init(); /* Function calls that may legitimately return errors. */ |
||
349 | //SetBreakOnLibraryErrors (oldValue); |
||
350 | |||
351 | int output=0; |
||
352 | GetCtrlVal(p1,P1_OUTPUT, &output); |
||
353 | |||
354 | GetCtrlVal(p1,P1_FMASK, fpedname); |
||
355 | int fsize=0; |
||
356 | georead(); |
||
357 | |||
358 | GetCtrlVal(p1,P1_NEVE, &neve); |
||
359 | // negative argument time ( in s )limited event loop |
||
360 | GetCtrlVal(p1,P1_FNAME, fname); |
||
361 | |||
362 | if (GetFileInfo(fname,&fsize)==1) { |
||
363 | printf("Error !\n"); |
||
364 | printf( "File %s already exist. Appending ....\n",fname); |
||
365 | //fprintf(stdout,"Remove the file and restart !!!\n"); |
||
366 | //exit(0); |
||
367 | } |
||
368 | |||
369 | |||
370 | FILE *fp=NULL; |
||
371 | if (output) fp = fopen(fname,"a"); |
||
372 | //gzFile fp=gzopen(fname,"a"); |
||
373 | |||
374 | init(); |
||
375 | clear(); |
||
376 | |||
377 | int hdr[4]={2}; // recid od run 11 naprej |
||
378 | int i=0; |
||
379 | int ntotal=0; |
||
380 | int counters[30]={0,0,0,0,0, 0,0,0,0,0,0,0}; |
||
381 | char names[10][20]={"TRG","CAEN V965"}; |
||
382 | time(&t); |
||
383 | tstart=t; |
||
384 | tstop=tstart+360000; |
||
385 | int evetype=0; |
||
386 | GetCtrlVal(p1,P1_EVE, &evetype); |
||
387 | if (evetype) { |
||
388 | double ntime=0; |
||
389 | GetCtrlVal(p1,P1_NTIME, &ntime); |
||
390 | tstop=tstart+ntime; |
||
391 | neve=-1; |
||
392 | } |
||
393 | int reco=0; |
||
394 | GetCtrlVal(p1,P1_RECO, &reco); |
||
395 | for (i=0;i!=neve && !ctrlcflag && t<tstop;i++){ |
||
396 | time(&t); |
||
397 | if (t!=told ) { |
||
398 | printf("%d in %2.2f min daq::event() %s\n",i, (double)(t-tstart)/60., ctime(&t)); |
||
399 | GetCtrlVal(p1,P1_RECO, &reco); |
||
400 | RefreshGraphs(p2,P2_PMT,EVENT_COMMIT,NULL,0,0); |
||
401 | } |
||
402 | int nb=event(data,BSIZE, counters,t!=told); |
||
403 | SetCtrlVal(p1,P1_CEVE,i); |
||
404 | if (nb>0){ |
||
405 | |||
406 | if (reco) DecodeData(nb, data); |
||
407 | // zapis v datoteko |
||
408 | hdr[1]=nb+4*sizeof(int); |
||
409 | hdr[2]=time(NULL); |
||
410 | hdr[3]=i; |
||
411 | if (fp) fwrite(hdr, sizeof(int),4 , fp); |
||
412 | if (fp) ntotal += fwrite(data, 1,nb, fp); |
||
413 | |||
414 | } else i--; |
||
415 | told=t; |
||
416 | } |
||
417 | |||
418 | end(); |
||
419 | |||
420 | printf("Number of Events: %d\n",i); |
||
421 | if (ctrlcflag) printf("User Program termination CTRL-C\n"); |
||
422 | if (t>tstop ) printf("Timeout termination tstart# t>tstop: %d# %d >%d\n",(int)t, (int)tstart, (int) tstop); |
||
423 | |||
424 | |||
425 | if (fp) fclose(fp); |
||
426 | //gzclose(fp); |
||
427 | printf("%d bytes written to %s\nCounts:\n", (int) (ntotal*sizeof(int)),fname); |
||
428 | for (i=0;i<2;i++) printf("%s\t%d\t%d\n",names[i],counters[2*i],counters[2*i+1]) ; |
||
429 | |||
430 | |||
431 | |||
432 | printf("Usage: vmusb [filename] [number of events] [thresholdfile]\n negative number of events = acq time in seconds\n"); |
||
433 | |||
434 | disconnect(); |
||
435 | |||
436 | return 0; |
||
437 | } |
||
438 | |||
439 | int CVICALLBACK StartCB (int panel, int control, int event, |
||
440 | void *callbackData, int eventData1, int eventData2) { |
||
441 | ThreadFunctionPtr mythread = NULL; |
||
442 | switch (event) { |
||
443 | |||
444 | case EVENT_COMMIT: |
||
445 | |||
446 | controlID= control; |
||
447 | if (panel == p1 && control == P1_START) { |
||
448 | mythread = vmusb_daq; |
||
449 | |||
450 | } |
||
451 | //if (panel == xyscan && control == SCAN_SCAN) mythread = scan; |
||
452 | if (mythread!=NULL) { |
||
453 | printf("New Thread panel=%d button=%d\n", panel, control); |
||
454 | |||
455 | // SetDimming(1); |
||
456 | |||
457 | |||
458 | CmtScheduleThreadPoolFunctionAdv (poolHandle, mythread, &controlID, |
||
459 | DEFAULT_THREAD_PRIORITY, |
||
460 | EndOfThread, |
||
461 | EVENT_TP_THREAD_FUNCTION_END, |
||
462 | NULL, RUN_IN_SCHEDULED_THREAD, |
||
463 | &tfID); |
||
464 | } |
||
465 | break; |
||
466 | } |
||
467 | return 0; |
||
468 | } |
||
469 | |||
470 | int CVICALLBACK StopCB (int panel, int control, int event, |
||
471 | void *callbackData, int eventData1, int eventData2) { |
||
472 | switch (event) { |
||
473 | case EVENT_COMMIT: |
||
474 | ctrlcflag=1; |
||
475 | break; |
||
476 | } |
||
477 | return 0; |
||
478 | } |
||
479 | |||
480 | int CVICALLBACK ExitCB (int panel, int control, int event, |
||
481 | void *callbackData, int eventData1, int eventData2) { |
||
482 | switch (event) { |
||
483 | case EVENT_COMMIT: |
||
484 | QuitUserInterface (0); |
||
485 | break; |
||
486 | } |
||
487 | return 0; |
||
488 | } |
||
489 | |||
490 | int CVICALLBACK ShowHistoCB (int panel, int control, int event, |
||
491 | void *callbackData, int eventData1, int eventData2) { |
||
492 | switch (event) { |
||
493 | case EVENT_COMMIT: |
||
494 | DisplayPanel (p2); |
||
495 | break; |
||
496 | } |
||
497 | return 0; |
||
498 | } |
||
499 | |||
500 | int CVICALLBACK SetLogZCB (int panel, int control, int event, |
||
501 | void *callbackData, int eventData1, int eventData2) { |
||
502 | switch (event) { |
||
503 | case EVENT_COMMIT: |
||
504 | GetCtrlVal(panel,control, &log); |
||
505 | |||
506 | if (log) { |
||
507 | SetCtrlAttribute (p2, P2_GRAPH2D, ATTR_YMAP_MODE, VAL_LOG); |
||
508 | |||
509 | } else { |
||
510 | SetCtrlAttribute (p2, P2_GRAPH2D, ATTR_YMAP_MODE, VAL_LINEAR); |
||
511 | } |
||
512 | |||
513 | break; |
||
514 | } |
||
515 | return 0; |
||
516 | } |
||
517 | |||
518 | int CVICALLBACK SetLogYCB (int panel, int control, int event, |
||
519 | void *callbackData, int eventData1, int eventData2) { |
||
520 | |||
521 | switch (event) { |
||
522 | case EVENT_COMMIT:{ |
||
523 | int log=0; |
||
524 | GetCtrlVal(panel,control, &log); |
||
525 | |||
526 | if (log) { |
||
527 | SetCtrlAttribute (p2, P2_GRAPHADC, ATTR_YMAP_MODE, VAL_LOG); |
||
528 | |||
529 | } else { |
||
530 | SetCtrlAttribute (p2, P2_GRAPHADC, ATTR_YMAP_MODE, VAL_LINEAR); |
||
531 | } |
||
532 | |||
533 | } |
||
534 | break; |
||
535 | } |
||
536 | return 0; |
||
537 | } |
||
538 | |||
539 | |||
540 | int CVICALLBACK ShowMainCB (int panel, int control, int event, |
||
541 | void *callbackData, int eventData1, int eventData2) { |
||
542 | switch (event) { |
||
543 | case EVENT_COMMIT: |
||
544 | DisplayPanel (p1); |
||
545 | break; |
||
546 | } |
||
547 | return 0; |
||
548 | } |
||
549 | |||
550 | int CVICALLBACK ShowSettingsCB (int panel, int control, int event, |
||
551 | void *callbackData, int eventData1, int eventData2) { |
||
552 | switch (event) { |
||
553 | case EVENT_COMMIT: |
||
554 | DisplayPanel (p3); |
||
555 | break; |
||
556 | } |
||
557 | return 0; |
||
558 | } |