Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
59 f9daq 1
#define USE_DAQ
2
 
3
// Izberi ustrezni interface v meniju projektnega okna
4
//  Options->CompilerDefines (dodaj /DSISVME ali /DWIENVME)
5
#ifdef USE_DAQ
6
#  ifdef SISVME
7
#    include "sisvme_dll.h"
8
#  endif
9
#  ifdef WIENVME
10
#    include "wienvme_dll.h"
11
#  endif
12
#  ifdef WUSBVME
13
#    include "wusbvme_dll.h"
14
#  endif
15
#  include "CAENV673A.h"
16
#endif
17
 
18
#include <utility.h>
19
#include <userint.h>
20
#include <cvirte.h>    /* Needed if linking in external compiler; harmless otherwise */
21
#include "rich_ui.h"
22
 
23
#define V673A_BASE_A24 0x130000
24
#define USBVME_NAME "VM0120"
25
 
26
#define MAPFILE "icfa2013.txt"
27
 
28
#define MAXDATA 2000
29
unsigned long dataa[3078];
30
unsigned long data0[MAXDATA];
31
unsigned long datac[1000];
32
 
33
 
34
int p1h, p2h, p3h ;
35
int p1h,rph,rID;
36
 
37
 
38
int pmtmaparr[8][8] ;
39
int pmtmap_i[64] ;
40
int pmtmap_j[64] ;
41
int data[64][64] ;
42
int nndata[64] ;
43
unsigned short acum_allch[65536] ;       
44
unsigned short acum_snglch[64][512] ;
45
//int offset=512 ;
46
int offset=0 ;
47
int min_tdc, max_tdc ;
48
int min_tdcR, max_tdcR ;
49
 
50
int single_event ;
51
 
52
unsigned long pmtbitmap[2] ;
53
unsigned long pmtbitmap_win[2] ;
54
 
55
int minhit ;
56
 
57
//*****************************************************************************
58
 
59
int read_pmtmap ( ) {
60
  FILE *fp=fopen(MAPFILE,"r");
61
  int ch, i, j ;
62
 
63
  while ( EOF != fscanf(fp,"%d %d %d\n",&ch,&i,&j) ) {
64
    if ( i>7 || j>7 ) {
65
      printf ( "Index out of range!!!! (%d,%d,%d)\n",ch,i,j ) ;
66
      continue ;
67
    }
68
    pmtmaparr[i][j]=ch ;
69
    pmtmap_i[ch] = i ;
70
    pmtmap_j[ch] = j ;
71
  }
72
 
73
  return 0 ;
74
}
75
 
76
//*****************************************************************************
77
 
78
int draw_histos ( ) {
79
  int i, ch ;
80
  int harr[4]={HISTOS_H_1,HISTOS_H_2,HISTOS_H_3,HISTOS_H_4} ;
81
 
82
  for ( ch=0; ch<4; ch++ ) {
83
    DeleteGraphPlot (p2h, harr[ch], -1, VAL_IMMEDIATE_DRAW);
84
 
85
    for ( i=0 ; i<nndata[ch] ; i++ ) {
86
      if ( (data[ch][i]>>16)&(0x1) ) {
87
        //printf ( "falling\n" ) ;
88
            PlotPoint (p2h, harr[ch], data[ch][i]&0xFFFF, 1.0, VAL_SOLID_SQUARE, VAL_RED);
89
        PlotLine (p2h, harr[ch], data[ch][i]&0xFFFF, 1.0, data[ch][i]&0xFFFF, 0.0, VAL_RED);
90
      } else {
91
        //printf ( "rising %d %X\n", ch, data[ch][i]&0xFFFF ) ;
92
        PlotPoint (p2h, harr[ch], data[ch][i]&0xFFFF, 1.0, VAL_EMPTY_SQUARE, VAL_BLUE);
93
        PlotLine (p2h, harr[ch], data[ch][i]&0xFFFF, 1.0, data[ch][i]&0xFFFF, 0.0, VAL_BLUE);
94
      }
95
    }
96
 
97
  }
98
 
99
 
100
  return 0 ;
101
}
102
 
103
//*****************************************************************************
104
 
105
int draw_acum_histos() {
106
  int hsts[64]={P3_ACUM_1,P3_ACUM_2,P3_ACUM_3,P3_ACUM_4,P3_ACUM_5,P3_ACUM_6,P3_ACUM_7,P3_ACUM_8,P3_ACUM_9,P3_ACUM_10,
107
                                P3_ACUM_11,P3_ACUM_12,P3_ACUM_13,P3_ACUM_14,P3_ACUM_15,P3_ACUM_16,P3_ACUM_17,P3_ACUM_18,P3_ACUM_19,P3_ACUM_20,
108
                                P3_ACUM_21,P3_ACUM_22,P3_ACUM_23,P3_ACUM_24,P3_ACUM_25,P3_ACUM_26,P3_ACUM_27,P3_ACUM_28,P3_ACUM_29,P3_ACUM_30,
109
                                P3_ACUM_31,P3_ACUM_32,P3_ACUM_33,P3_ACUM_34,P3_ACUM_35,P3_ACUM_36,P3_ACUM_37,P3_ACUM_38,P3_ACUM_39,P3_ACUM_40,
110
                                P3_ACUM_41,P3_ACUM_42,P3_ACUM_43,P3_ACUM_44,P3_ACUM_45,P3_ACUM_46,P3_ACUM_47,P3_ACUM_48,P3_ACUM_49,P3_ACUM_50,
111
                                P3_ACUM_51,P3_ACUM_52,P3_ACUM_53,P3_ACUM_54,P3_ACUM_55,P3_ACUM_56,P3_ACUM_57,P3_ACUM_58,P3_ACUM_59,P3_ACUM_60,
112
                                P3_ACUM_61,P3_ACUM_62,P3_ACUM_63,P3_ACUM_64} ;
113
  int i;               
114
  double grmin,grmax;
115
 
116
  GetCtrlVal (p1h, P1_TDC_MAX, &max_tdc ) ;
117
  GetCtrlVal (p1h, P1_TDC_MIN, &min_tdc ) ;
118
  GetCtrlVal (p1h, P1_TDC_MAX_2, &max_tdcR ) ;
119
  GetCtrlVal (p1h, P1_TDC_MIN_2, &min_tdcR ) ;
120
  //SetAxisScalingMode (p1h, P1_ACUM_WIN, VAL_XAXIS, VAL_MANUAL, min_tdc, max_tdc);
121
 
122
  DeleteGraphPlot (p1h, P1_ACUM, -1, VAL_IMMEDIATE_DRAW);
123
  DeleteGraphPlot (p1h, P1_ACUM_WIN, -1, VAL_IMMEDIATE_DRAW);
124
 
125
  PlotY (p1h, P1_ACUM, acum_allch, /*65536*/ 65536, VAL_UNSIGNED_SHORT_INTEGER,
126
                 VAL_VERTICAL_BAR, VAL_NO_POINT, VAL_SOLID, 1, VAL_DK_BLUE);
127
  PlotY (p1h, P1_ACUM_WIN, acum_allch, /*65536*/ 65536, VAL_UNSIGNED_SHORT_INTEGER,
128
                 VAL_VERTICAL_BAR, VAL_NO_POINT, VAL_SOLID, 1, VAL_DK_BLUE);
129
 
130
  GetAxisScalingMode (p1h, P1_ACUM_WIN, VAL_LEFT_YAXIS, 0, &grmin, &grmax );
131
 
132
  PlotLine (p1h, P1_ACUM_WIN, min_tdcR, 0, min_tdcR, grmax, VAL_RED);
133
  PlotLine (p1h, P1_ACUM_WIN, max_tdcR, 0, max_tdcR, grmax, VAL_RED);
134
  PlotLine (p1h, P1_ACUM_WIN, min_tdc, 0, min_tdc, grmax, VAL_GREEN);
135
  PlotLine (p1h, P1_ACUM_WIN, max_tdc, 0, max_tdc, grmax, VAL_GREEN);
136
 
137
  for ( i=0; i<64; i++ ) {
138
        DeleteGraphPlot (p3h, hsts[i], -1, VAL_IMMEDIATE_DRAW);
139
 
140
        PlotY (p3h, hsts[i], acum_snglch[i], 256, VAL_UNSIGNED_SHORT_INTEGER,
141
               VAL_VERTICAL_BAR, VAL_NO_POINT, VAL_SOLID, 1, VAL_DK_BLUE);
142
 
143
  }
144
 
145
  return 0 ;
146
}
147
 
148
//*****************************************************************************
149
 
150
int draw_evnt() {
151
  int i,j,color,frame;
152
  int iijj[8]={1,3, 7,9, 13,15, 19,21} ;
153
//  int iijj[8]={1,3, 7,9, 13,15, 19,21} ;
154
 
155
  DeleteGraphPlot (p1h, P1_EV_DI, -1, VAL_IMMEDIATE_DRAW);
156
  for ( i=1; i<20; i+=6 ) {
157
    for ( j=1; j<20; j+=6 ) {
158
          PlotRectangle (p1h,P1_EV_DI,i,j,i+4,j+4,VAL_DK_GRAY,VAL_TRANSPARENT);
159
    }
160
  }  
161
  for ( i=0; i<64; i++ ) {
162
    if ( (pmtbitmap_win[i>>5]>>(i&0x1F))&0x1 ) {
163
      color = VAL_DK_GREEN;
164
      frame = VAL_DK_GREEN;
165
    } else if ( (pmtbitmap[i>>5]>>(i&0x1F))&0x1 ) {
166
      color = VAL_TRANSPARENT;
167
      frame = VAL_RED;
168
    } else {
169
      color = -1 ;
170
    }
171
 
172
    if ( color!=-1 ) {
173
          PlotRectangle (p1h, P1_EV_DI,
174
                         iijj[pmtmap_i[i]]+0.1,iijj[pmtmap_j[i]]+0.1,
175
                         iijj[pmtmap_i[i]]+1.9,iijj[pmtmap_j[i]]+1.9,
176
                         frame,color);
177
    }
178
  }
179
  return 0 ;
180
}
181
 
182
//*****************************************************************************
183
 
184
int num_gr_photons() {
185
 
186
  int rc=0;
187
  long bitmap[2];
188
  int i;
189
 
190
  bitmap[0]=pmtbitmap_win[0];
191
  bitmap[1]=pmtbitmap_win[1];
192
  for (i=0;i<32;i++) {
193
    if (bitmap[0]&0x1) rc++;
194
    if (bitmap[1]&0x1) rc++;
195
    bitmap[0]>>=1;
196
    bitmap[1]>>=1;
197
  }
198
  printf("%08X\t%08X\n",pmtbitmap_win[0],pmtbitmap_win[1]);
199
  printf("num_gr_photons %d\n",rc);    
200
  return rc;
201
}
202
 
203
//*****************************************************************************
204
 
205
int initvar(unsigned long xxx[],int n) {
206
  for (;--n>=0;xxx[n]=0);
207
  return 0;
208
}
209
 
210
//*****************************************************************************
211
 
212
int daq(){
213
 
214
  static int cdaq=0;
215
  int dum;
216
  int error,i,j,fcount,fcountold=-1,nauto,fauto;
217
  int nfirst[3],ntrig[3],ndata[3],ndatac,neve,ntrold;
218
  unsigned short *j16=(unsigned short *) &j;
219
 
220
  unsigned long ext_c;
221
 
222
  char filename[256],path[256], fname[256];
223
  int maxeve,print,neve_sel=0,nueve=0;
224
 
225
  unsigned int bsr ;
226
  unsigned short dataxxx ;
227
  unsigned short edge_type, overflow, channel, ev_dat, tdc_num, last_dat, nval_dat;
228
  unsigned short gerror ;
229
  int hits=0 ;
230
  //int last[2] ;
231
  int last_ev_no = -1 ;
232
 
233
 
234
  if (cdaq==1) return -1;
235
  else cdaq=1;
236
 
237
// initialize VME interface             
238
#ifdef USE_DAQ
239
  error = V673A_map (0,V673A_BASE_A24, 1);
240
  error = V673A_init(0);
241
  V673A_setreg(0,0x1a,0x003e);
242
  V673A_setreg(0,0x1e,0x003e);
243
  error = V673A_clallb(0);
244
#endif
245
 
246
 
247
  SetCtrlVal (p1h, P1_LED_DAQ,1);
248
  SetCtrlVal (p1h, P1_TRIG, 0 ) ;
249
  GetCtrlVal (p1h, P1_DEBUG, &print ) ;
250
  GetCtrlVal (p1h, P1_NAUTO, &nauto ) ;
251
  GetCtrlVal (p1h, P1_AUTOSAVE, &fauto ) ;  
252
  GetCtrlVal (p1h, P1_NEVNT, &maxeve ) ;
253
  GetCtrlVal (p1h, P1_FNAME, fname );
254
  GetCtrlVal (p1h, P1_PATH, path );
255
  GetCtrlVal (p1h, P1_TDC_MAX, &max_tdc ) ;
256
  GetCtrlVal (p1h, P1_TDC_MIN, &min_tdc ) ;
257
  GetCtrlVal (p1h, P1_TDC_MAX_2, &max_tdcR ) ;
258
  GetCtrlVal (p1h, P1_TDC_MIN_2, &min_tdcR ) ;
259
  GetCtrlVal (p1h, P1_SINGLE, &single_event ) ;
260
  //PlotLine (p1h, P1_ACUM_WIN, min_tdcR, 0, min_tdcR, 1000, VAL_RED);
261
  //PlotLine (p1h, P1_ACUM_WIN, max_tdcR, 0, max_tdcR, 1000, VAL_RED);
262
  //PlotLine (p1h, P1_ACUM_WIN, min_tdc, 0, min_tdc, 1000, VAL_GREEN);
263
  //PlotLine (p1h, P1_ACUM_WIN, max_tdc, 0, max_tdc, 1000, VAL_GREEN);
264
  //SetAxisScalingMode (p1h, P1_ACUM_WIN, VAL_XAXIS, VAL_MANUAL, min_tdc, max_tdc);
265
  // start measurement
266
  neve=0;
267
  neve_sel=0;
268
  ntrold=0;
269
  rID=0;
270
 
271
  do {
272
/*
273
    if (( neve%nauto==0 && fauto==1 ) || (neve==0 && fauto==1)){
274
       fcount=neve/nauto;
275
       if ( fcountold < fcount ) {
276
             sprintf(filename,"%s\\%s_file%d.dat",path,fname,fcount);
277
         printf("%s\n",filename);
278
         fcountold=fcount ;
279
       }
280
    }
281
*/  
282
 
283
    if ( rID == P1_STOP ) break ;
284
#ifdef USE_DAQ
285
    ntrig[0] = V673A_ntrig (0);
286
#endif
287
    //printf ( "%d\t", ntrig[0] ) ;
288
    //if (ntrig[0]!=-1) {
289
    if (ntrig[0]>ntrold) {
290
      ntrold=ntrig[0]-1;
291
      initvar ( data0, 1024 ) ;
292
 
293
#ifdef USE_DAQ
294
      ndata[0] = V673A_getevnt (0,ntrold,data0,MAXDATA);
295
#endif
296
//printf ( "%d\t", ndata[0] ) ;
297
 
298
          for ( i=0;i<ndata[0];i++ ) {
299
            dataa[i]=0xc3ffffff & data0[i];
300
//        printf ( "%d\t", data0[i] ) ;
301
          }
302
      ntrold=(ntrold+1)&0xffff;
303
 
304
      if ( ndata[0] >0 ) {
305
        pmtbitmap[0] = 0 ;
306
            pmtbitmap[1] = 0 ;
307
        pmtbitmap_win[0] = 0 ;
308
            pmtbitmap_win[1] = 0 ;
309
 
310
        for (i=0;i<ndata[0];i++) {
311
          dataxxx   =  data0[i] & 0xFFFF ;
312
          edge_type = (data0[i]>>16)&0x1  ;
313
          overflow  = (data0[i]>>17)&0x1  ;
314
          tdc_num   = (data0[i]>>25)&0x1  ;
315
          channel   = (data0[i]>>18)&0x1F|tdc_num<<5 ;
316
          ev_dat    = (data0[i]>>23)&0x1  ;    
317
          last_dat  = (data0[i]>>30)&0x1  ;
318
          nval_dat  = (data0[i]>>31)&0x1  ;
319
          if (ev_dat == 0) { // event data
320
                hits++ ;
321
                    if ( nndata[channel] < 63 ) {
322
                      data[channel][nndata[channel]++] = dataxxx|edge_type<<16 ;
323
 
324
                    }
325
                    if ((edge_type & 0x1)==0 ) { // rising edge
326
                      acum_allch[dataxxx]++ ;
327
                      if ((0<=(dataxxx-offset))&&((dataxxx-offset)<512) ) {   // siroko okno   
328
                        acum_snglch[channel][dataxxx-offset]++ ;
329
                      }
330
                      if ((min_tdcR<=(dataxxx-offset)) && ((dataxxx-offset)<max_tdcR)) {   // rdece okno   
331
                if ( channel>31 )
332
                      pmtbitmap[1] |= 1<<(channel-32) ;
333
                    else
334
                          pmtbitmap[0] |= 1<<(channel) ;
335
                  }  
336
                  if ( (min_tdc<=(dataxxx-offset)) && ((dataxxx-offset)<max_tdc) ) {  // zeleno okno   
337
                if ( channel>31 )
338
                          pmtbitmap_win[1] |= 1<<(channel-32);
339
                        else
340
                          pmtbitmap_win[0] |= 1<<(channel);
341
                  }
342
                        }
343
              } else if (last_dat==0) { //not last datum
344
                //pmtbitmap[0] = 0;
345
                    //pmtbitmap[1] = 0;
346
                    last_ev_no = dataxxx;
347
              }
348
        }
349
 
350
                if (num_gr_photons() >= minhit) {
351
          draw_evnt();
352
          //draw_histos();
353
          draw_acum_histos();
354
              neve_sel++;
355
                }
356
 
357
      }
358
      neve++;
359
    } else {
360
      error = V673A_clallb(0);
361
      ntrold=0;
362
        }
363
    SetCtrlVal (p1h, P1_PROC, (neve*100)/maxeve ) ;
364
    SetCtrlVal (p1h, P1_TRIG, neve ) ;        
365
    do {
366
      nueve=GetUserEvent (0, &rph, &rID);
367
    } while ( rID != P1_STOP && nueve>0 );
368
        if ( rID == P1_STOP ) break ;
369
  } while ( (neve < maxeve) && (neve_sel<1 || !single_event) ) ;
370
 
371
  SetCtrlVal (p1h, P1_LED_DAQ,0);
372
  cdaq=0;
373
  return 0;
374
}
375
 
376
//*****************************************************************************
377
//*************************** MAIN ********************************************
378
//*****************************************************************************
379
 
380
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
381
                                           LPSTR lpszCmdLine, int nCmdShow)
382
{
383
  int error;
384
  int i,j;
385
  int nevnt,cnt;
386
  int pmtmap[32][32] ;
387
  int gray[16] = {0x000000, 0x111111, 0x222222, 0x333333, 0x444444, 0x555555, 0x666666,
388
                  0x777777, 0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB, 0xCCCCCC, 0xDDDDDD,
389
                  0xEEEEEE, 0xFFFFFF } ;
390
  double x, y, min_r, max_r, r1, r2 ;
391
 
392
  ColorMapEntry grCol[16] ;
393
 
394
  grCol[0].dataValue.valInt = 0 ;
395
  grCol[0].color = gray[0] ;
396
  grCol[1].dataValue.valInt = 100000 ;
397
  grCol[1].color = gray[15] ;
398
 
399
 
400
  read_pmtmap ( ) ;
401
 
402
  for ( i=0 ; i<32; i++ ) {
403
    for ( j=0 ; j<32; j++ ) {
404
      if ( ( (((i+2)/4)%2) != 0 ) && ( (((j+2)/4)%2) != 0 ) )
405
        pmtmap[i][j]=1000000 ;
406
      else pmtmap[i][j]=0 ;
407
      //pmtmap[i][j]=(i+1)*(i+1)*(i+1)*(j+1) ;
408
    }
409
  }
410
 
411
  p1h = LoadPanel (0, "rich_ui.uir", P1);
412
//  p2h = LoadPanel (0, "laprich.uir", HISTOS);
413
  p3h = LoadPanel (0, "rich_ui.uir", P3);
414
  DisplayPanel (p1h);
415
//  DisplayPanel (p2h);
416
  DisplayPanel (p3h);
417
  for ( i=1; i<20; i+=6 ) {
418
    for ( j=1; j<20; j+=6 ) {
419
          PlotRectangle (p1h,P1_EV_DI,i,j,i+4,j+4,VAL_DK_GRAY,VAL_TRANSPARENT);
420
    }
421
  }  
422
 
423
#ifdef USE_DAQ
424
#  ifdef WUSBVME 
425
     VME_START(USBVME_NAME);
426
#   else
427
     VME_START(NULL);
428
#  endif
429
#endif  
430
 
431
  do {
432
    GetUserEvent (1, &rph, &rID);
433
        switch (rID){
434
      case P1_EV_PL:
435
//        PlotScaledIntensity (p1h, P1_EV_DI, pmtmap, 32, 32, VAL_INTEGER,
436
//                             1.0, 0.0, 1.0, 0.0, grCol, 0xff0000, 2, 1, 0);
437
            draw_evnt();
438
        break;
439
      case P1_READ_TDC:
440
        daq(); //read_tdc ( ) ;
441
        break;
442
      case P1_DRAWH:
443
//        draw_histos ( ) ;
444
        draw_acum_histos ( ) ;
445
        break;
446
      case P1_SINGLE:
447
        GetCtrlVal (p1h, P1_SINGLE, &single_event ) ;
448
        break;
449
      case P1_CONT_DAQ:
450
        nevnt=0;
451
        cnt=0;
452
        minhit=0;
453
        GetCtrlVal (p1h, P1_NEVNT, &nevnt );
454
        GetCtrlVal (p1h, P1_MINHIT, &minhit );
455
//        printf("%d %d\n", nevnt, minhit);
456
//        while((read_tdc()<minhit)&&(cnt++<nevnt)) ;
457
        daq();  
458
//        draw_evnt();
459
        break;
460
      case P1_EV_DI:
461
        GetCtrlVal (p1h, P1_R_MIN, &min_r ) ;
462
        GetCtrlVal (p1h, P1_R_MAX, &max_r ) ;
463
        r1=min_r*2.0 ;
464
        r2=max_r*2.0 ;
465
        GetGraphCursor (p1h, P1_EV_DI, 1, &x, &y);
466
        printf ( "x:%5.2f\ty:%5.2f\n", x, y ) ;
467
        draw_evnt();
468
            PlotOval (p1h, P1_EV_DI, x-r1, y-r1, x+r1, y+r1, VAL_RED, VAL_TRANSPARENT);
469
            PlotOval (p1h, P1_EV_DI, x-r2, y-r2, x+r2, y+r2, VAL_RED, VAL_TRANSPARENT);
470
        break;
471
      case P1_PRINT:
472
        SetCtrlVal (p1h, P1_PL,1);
473
                PrintCtrl (p1h, P1_EV_DI, "event.tif", 1, VAL_FULL_PANEL);
474
        SetCtrlVal (p1h, P1_PL,0);
475
        break;
476
      case P1_RESET:
477
        break;
478
//      case P1_PRINT:
479
//        break;
480
      default:
481
        break;
482
    }
483
//    if ( rID==P1_I_GATE ) init_gate ( ) ;
484
} while ( (rID!=P1_EXIT) || (rph!=p1h) ) ;
485
 
486
//  CloseHandle(nHandle); 
487
#ifdef USE_DAQ
488
  VME_STOP();
489
#endif  
490
//  printf ( "XXXX\n" ) ;
491
  return 0;
492
}