Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

#include "vme.h"  
#include <userint.h>
#include "minirich.h"
#include "toolbox.h"
#include "icfa.h"
#include "H1D.h"
#include "H2D.h"
#include "H3D.h"
#include "HDraw.h"



int p6h;
int hxy=200;
int minirichplothandle=0;

int sa02Printf(const char *format, ...);

typedef struct {
  int feb;
  int chip;
  int ch;
  int chx;
  int chy;
  int pmtx;
  int pmty;
  int pmtid
} EID2MAPMT;

EID2MAPMT eid2mapmt[144*4];


int icfa_LoadElectronicMap(const char *fname) {

  FILE *fp = fopen(fname,"r");
  int febidx, feb,chip,ch,chx,chy,pmtx,pmty,pmt;
  int nread=0;
  int ndim=400;
  char line[400];
  int  nr=0;
  // file should be sorted feb [0..3], chip[0..3], ch [0.. 35]
  while (fgets(line,ndim,fp)!=NULL) {
    //  FEBCH   PMTCH   X       Y       PMTX    PMTY    PMTID

    nr = sscanf(line,"%d%d%d%d%d",&febidx,&ch,&chx,&chy,&pmt);
    if (nr) {
      chip = febidx / 36;
      ch   = febidx % 36;
      pmtx = pmt / 3;
      pmty = pmt % 3;
      for (feb = 0; feb<4; feb++){
        //  4 febs
        //  0 2  
        //  1 3  
        int fx = feb %2;
        int fy = feb /2;
        eid2mapmt[nread+feb*144].feb  = feb;
        eid2mapmt[nread+feb*144].chip = chip;
        eid2mapmt[nread+feb*144].ch   = ch  ;
        eid2mapmt[nread+feb*144].chx  = chx + fx * 18;
        eid2mapmt[nread+feb*144].chy  = chy + fy * 18;
        eid2mapmt[nread+feb*144].pmtx  = pmtx ;
        eid2mapmt[nread+feb*144].pmty  = pmty ;
      }  
    }
    nread++;
  }
  sa02Printf("eid2pmtxy %d records read.\n",nread);
  fclose(fp);
  return 0;

}


int icfa_GetPosition(unsigned int febchid, int *chx, int *chy) {

  if (febchid>=144*4)   return -1;
  *chx   = eid2mapmt[febchid].chx;
  *chy   = eid2mapmt[febchid].chy  ;
  return 0;
}

int icfa_Fill(int febchid, double weight){
  int x;
  int y;
  icfa_GetPosition(febchid, &x, &y);
  H2DFillBin(hxy, x,y,weight);  
  return 0;
}



int icfa_Init(){  // read mapmt mapping

  icfa_LoadElectronicMap("eid2pmtxy.map");
  //short VMUSB_VME_DGG(unsigned short channel, unsigned short trigger,unsigned short output,
  //                  long delay, unsigned short gate, unsigned short invert, unsigned short latch);
  // set DGG 1 to create ADC gate, I1 -> O1 delay:0, gate 0x400 = 12us
  WIENER_VMUSB_VME_DGG(0,1,0,0x0,0x100,0,0);
/*  
  channel
[in] The DGG channel you wish to modify. Valid values are:
0 – For DGG channel A
1 – For DGG channel B
trigger
[in] Determines the start of the DGG. Valid Values are:
0 – Channel Disabled
1 – NIM input 1
2 – NIM input 2
3 – Event Trigger
4 - End of Event
5 - USB Trigger
6 - Pulser
output
[in] Determines the NIM ouput used for the DGG channel. Valid values are:
0 – NIM O1
1 – NIM O2
delay
[in] 32 bit word in steps of 12.5ns between trigger and start of gate consisting of
lower 16 bits: Delay_fine
upper 16 bits: Delay_coarse
gate
[in] Sets the length of the gate in units of 12.5ns
invert
[in] Determines whether or not the DGG is inverted. Valid values are:
0 – Not inverted
1 – Is inverted
latch
[in] Determines whether or not the DGG is latched. Valid values are:
0 – Not latched
1 – Is latched
*/

// User Devices Source Selector - Read/Write Offset = 16 0x10
// xxusb_register_write(udev, XXUSB_ACTION_REGISTER, 0x2); // USB Trigger
  WIENER_VMUSB_VME_DGG(0,5,0,0xF,0xF,0,0);    
  //WIENER_VMUSB_VME_Output_settings(0,7,0,0);    // nekaj od tega bi moralo delat
  WIENER_VMUSB_register_write(10,0x2); // USB Trigger  


  return 0;
}

int icfa_Histo(){  // read mapmt mapping

  H2DInit(hxy,"minirich","MiniRICH hit map",36,0, 1,36,0, 1);
  H2DSetTitleX(hxy,"x (channels)");
  H2DSetTitleY(hxy,"y (channels)");
  return 0;
}
                                                                 

int icfa_Draw(){
 
  if (minirichplothandle > 0 ) {
    DeleteGraphPlot (p6h, MINIRICH_GRAPH, minirichplothandle, VAL_IMMEDIATE_DRAW);
    minirichplothandle=0;
  }
  H2DDraw(hxy,p6h, MINIRICH_GRAPH, &minirichplothandle);
 
  return 0;
}

int icfa_Event(uint32_t *d, int mode){
  if (!mode) H2DClear(hxy);
  for (int i=0;i<144*4;i++){
     if (d[i]>0) icfa_Fill(i,d[i]);
  }
  return 0;
}

int CVICALLBACK daq_icfa(void *functionData) {
 
  int neve;
  int threshold;
  icfa_Init();
  GetCtrlVal(p6h,MINIRICH_NEVE, &neve);
  GetCtrlVal(p6h,MINIRICH_THR, &threshold);
 
  icfa_Histo();
 
  for (int k=0;k<144*4;k++){
     int i = Random(0,144*4);
     icfa_Fill(k,1);
  }
  icfa_Draw(hxy);
  return 0;
}


int CVICALLBACK rich_Draw_RingCB (int panel, int control, int event,
                                   void *callbackData, int eventData1, int eventData2) {
  static int oh1=0;
  static int oh2=0;
  switch (event) {
    case EVENT_COMMIT: {
      double min_r;
      double max_r;
      double x,y;
      GetCtrlVal (p6h, MINIRICH_R_MIN, &min_r ) ;
      GetCtrlVal (p6h, MINIRICH_R_MAX, &max_r ) ;
      double r1=min_r*2.0 ;
      double r2=max_r*2.0 ;
      GetGraphCursor (p6h, MINIRICH_GRAPH, 1, &x, &y);
      sa02Printf ( "x:%5.2f\ty:%5.2f OH1=%d OH2=%d\n", x, y, oh1, oh2 ) ;

      if (oh1 > 0 ) {
        DeleteGraphPlot (p6h, MINIRICH_GRAPH, oh1, VAL_IMMEDIATE_DRAW);
        oh1=0;
      }
      if (oh2 > 0 ) {
        DeleteGraphPlot (p6h, MINIRICH_GRAPH, oh2, VAL_IMMEDIATE_DRAW);
        oh2=0;
      }
      oh1 = PlotOval (p6h, MINIRICH_GRAPH, x-r1, y-r1, x+r1, y+r1, VAL_RED, VAL_TRANSPARENT);
      oh2 = PlotOval (p6h, MINIRICH_GRAPH, x-r2, y-r2, x+r2, y+r2, VAL_RED, VAL_TRANSPARENT);
      break;
    }
  }
  return 0;
}

int CVICALLBACK rich_Histo_ClearCB (int panel, int control, int event,
                                    void *callbackData, int eventData1, int eventData2) {
  switch (event) {
    case EVENT_COMMIT:
      H2DClear(hxy);
      icfa_Draw();
      break;
  }
  return 0;
}

int CVICALLBACK icfa_StartCB (int panel, int control, int event,
                              void *callbackData, int eventData1, int eventData2) {
  switch (event) {
    case EVENT_COMMIT:
      daq_icfa(NULL);
      break;
  }
  return 0;
}

extern HColorMap *colormap;
int CVICALLBACK SetMaximum (int panel, int control, int event,
                            void *callbackData, int eventData1, int eventData2) {
  switch (event) {
    case EVENT_COMMIT:
      if (minirichplothandle> 0 ) DeleteGraphPlot (panel, MINIRICH_GRAPH, minirichplothandle, VAL_IMMEDIATE_DRAW);
   
    int histogram=hxy;  
    double min = H2DGetMin(histogram);    
   
   
    double fx=0;
    GetCtrlVal(p6h,MINIRICH_MAXZ, &fx);
    double max = H2DGetMax(histogram)*fx/100.;
    RangeColors(min,max);      
    minirichplothandle = PlotScaledIntensity (panel, MINIRICH_GRAPH,
                                       H2DGetData(histogram),
                                       H2DGetNbinsX(histogram),
                                       H2DGetNbinsY(histogram),
                                       VAL_DOUBLE,
                                       H2DGetStepY(histogram),
                                       H2DGetMinY(histogram),
                                       H2DGetStepX(histogram),
                                       H2DGetMinX(histogram),
                                       colormap->array,
                                       colormap->HiColor,
                                       colormap->numberofColors, 1, 0);
      break;
  }
  return 0;
}