/*CMZ :          23/02/2008  09.20.45  by  Samo Korpar*/
 
/*CMZ :  0.02/00 04/07/2001  00.52.00  by  Samo Korpar*/
 
/*CMZ :  0.01/00 29/11/99  13.07.26  by  Samo Korpar*/
 
/*CMZ :  0.00/00 08/10/99  13.05.24  by  Samo Korpar*/
 
/*-- Author :*/
 
#include <stdlib.h>
 
#include <stdio.h>
 
#include <stdint.h>
 
#include <string.h>
 
#include <time.h>
 
#include <tcl.h>
 
#include <tk.h>
 
 
 
extern int hvslow(char *sn);
 
extern int hvslowChannel(char *sn);
 
 
 
/*KEEP,evdp,T=C++.*/
 
#include "evdp.h"
 
/*KEEP,evd,T=C++.*/
 
#include "evd.h"
 
/*KEND.*/
 
#include <blt.h>
 
 
 
#define CMDLEN 300
 
 
 
/* parameters for the detector display */
 
 
 
#define FPXOFF 4
 
#define FPYOFF 17
 
#define SMXOFF 49
 
#define SMYOFF 138
 
#define BBXS 8
 
#define BBYS 8
 
#define SMXS 48
 
#define SMYS 128
 
 
 
static int curev;
 
static char hotchannels[MAXFED][128];
 
static int m4x[16],m4y[16],m4c[4][4];
 
static int m16x[4][16],m16y[4][16],m16a[8][8],m16c[8][8];
 
static int m4pm[16],m4pc[16],m16pm[4][16],m16pc[4][16];
 
static FPL_data fplch[14][6][16];
 
static FED_data fedch[MAXFED][64];
 
static FED_record fedr[MAXFED];
 
static FED_hist hits;
 
 
 
 
 
 
 
#ifdef __cplusplus
 
extern "C" {
 
#endif
 
 
 
void mask_hot(int fed, char *data)
 
{
 
  int i;
 
 
 
  for (i=0;i<128;i++)
 
    *(data++)&=hotchannels[fed][i];
 
  return;
 
}
 
 
 
int find_hot()
 
{
 
  int i, j, k, ii, jj, nr, pos, nh, nhot;
 
  int sm, pr=0, pc=0, ch=0;
 
  unsigned int nev;
 
  unsigned char b, *hch;
 
  FILE *fhot;
 
 
 
  hch=(unsigned char *) hotchannels;
 
  for (i=0;i<128*MAXFED;i++) *(hch++)=0xFF;
 
 
 
  for (k=0;k<MAXFED;k++)
 
    for (i=0;i<64;i++)
 
      for (j=0;j<16;j++)
 
        hits.data[k][i][j]=0;
 
 
 
  if (reopen_data_file
()) exit(1);  
 
 
  nev=0;
 
 
 
  while ((nr=get_nextev(fedr, 0x500, 0)) && (nev<1000))
 
    {
 
    nh=0;
 
    for (k=0;k<nr;k++)
 
      for (ii=0;ii<128;ii++)
 
        {
 
        i=ii/2;
 
        if (fedr[k].data[ii] && fedch[fedr[k].fedid][i].pmt)
 
          for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
 
            if (fedr[k].data[ii]&b) nh++;
 
        }
 
    if (nh > 1000) continue;
 
    for (k=0;k<nr;k++)
 
      for (ii=0;ii<128;ii++)
 
        {
 
        i=ii/2;
 
        if (fedr[k].data[ii] && fedch[fedr[k].fedid][i].pmt)
 
          for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
 
            if (fedr[k].data[ii]&b) hits.data[fedr[k].fedid][i][j]++;
 
        }
 
    nev++;
 
    }
 
  if ((nev/=10) < 5) return 1;
 
  fhot
=fopen("hotchannels","w"); 
  nhot=0;
 
  for (k=0;k<MAXFED;k++)
 
      for (ii=0;ii<128;ii++)
 
        {
 
        i=ii/2;
 
        for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
 
          if (hits.data[k][i][j] > nev)
 
            {
 
            nhot++;
 
            sm=fedch[k][i].sm;
 
            switch (fedch[k][i].pmt)
 
              {
 
              case 4:
 
                pr=2*fedch[k][i].bbr+m4pm[j]/2;
 
                pc=2*fedch[k][i].bbc+m4pm[j]%2;
 
                ch=m4pc[j];
 
                break;
 
              case 16:
 
                pr=2*fedch[k][i].bbr+m16pm[fedch[k][i].asd][j]/2;
 
                pc=2*fedch[k][i].bbc+m16pm[fedch[k][i].asd][j]%2;
 
                ch=m16pc[fedch[k][i].asd][j];
 
                break;
 
              }
 
            if (sm>6)
 
              {
 
              sm=20-sm;
 
              pr=31-pr;
 
              pc=11-pc;
 
              }
 
            fprintf(fhot
, "%d%.2d%.2d%.2d 1\n", sm
, pr
, pc
, ch
);  
            hotchannels[k][ii]&=(~b);
 
            }
 
        }
 
  fhot
=fopen("hotchannels.raw","w"); 
  fwrite ((void *) hotchannels
, 1, MAXFED
*128, fhot
);  
  printf("%d hot channels found\n", nhot
);  
  if (reclose_data_file
()) exit(1);  
  return 0;
 
}
 
int Evd_evinit( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int pmt, asd, sm, bbr, bbc, mb, db, con, x0, y0, fx0, fy0, pmc;
 
  int status, i, j, k, ii, jj, ccon, fpon, casd, px, py;
 
  float sc;
 
  char cmd[CMDLEN], s1[10];
 
  FILE *fid;
 
 
 
  sscanf(Tcl_GetVar
(interp
, "evmap", TCL_GLOBAL_ONLY
), " %d ", &fpon
);  
 
 
          Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
 
  
 
  if ((fid
=fopen(cmd
, "r")) == NULL
) {  
     fprintf(stderr
,"%s %d: File not found %s\n",__FILE__
, __LINE__
, cmd
);  
    return TCL_ERROR;
 
   
 
  }
 
  while ( fgets( cmd
, 100, fid
) != NULL
)  
    if ((status
=sscanf( cmd
," %d %d %d ",&pmt
,&pmc
,&con
))==3)  
      {
 
      /*      printf("con=%d pmt=%d pmc=%d\n",con,pmt,pmc); */
 
      m4pm[con]=pmt;
 
      m4pc[con]=pmc;
 
      if (fpon)
 
        {
 
        px=2*(pmt%2)+1-(pmc%2);
 
        py=3-(2*(pmt/2)+1-(pmc/2));
 
        }
 
       else
 
        {
 
        px=2*(pmt%2)+(pmc%2);
 
        py=3-(2*(pmt/2)+(pmc/2));
 
        }
 
      m4c[px][py]=con;
 
      /*      printf("px=%d py=%d con=%d \n", px, py, con); fflush(stdout); */
 
      m4x[con]=2*px;
 
      m4y[con]=2*py;
 
      }
 
 
 
          Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
 
  if ((fid
=fopen(cmd
, "r")) == NULL
) return TCL_ERROR
;  
  while ( fgets( cmd
, 100, fid
) != NULL
)  
    if ((status
=sscanf(cmd
," %d %d ASD%d %d ",&pmt
,&pmc
,&asd
,&con
))==4)  
      {
 
      /*      printf("asd=%d con=%d pmt=%d bbc=%d\n",asd,con,pmt,pmc); */
 
      m16pm[asd][con]=pmt;
 
      m16pc[asd][con]=pmc;
 
      if (fpon)
 
        {
 
        px=4*(pmt%2)+3-(pmc%4);
 
        py=7-(4*(pmt/2)+3-(pmc/4));
 
        }
 
       else
 
        {
 
        px=4*(pmt%2)+(pmc%4);
 
        py=7-(4*(pmt/2)+(pmc/4));
 
        }
 
      m16a[px][py]=asd;
 
      m16c[px][py]=con;
 
      m16x[asd][con]=px;
 
      m16y[asd][con]=py;
 
      }
 
 
 
  for (i=0;i<MAXFED;i++)
 
    for (j=0;j<64;j++)
 
      {
 
      fedch[i][j].pmt=0;
 
      fedch[i][j].fx0=3+140*(i%2)+(j/16)*34;
 
      fedch[i][j].fy0=5+(i/2)*52+(j%16)*3;
 
      }
 
  for (i=0;i<14;i++)
 
    for (j=0;j<6;j++)
 
      for (k=0;k<16;k++)
 
      {
 
        fplch[i][j][k].pmt=0;
 
        fplch[i][j][k].mb[0]=-1;
 
        fplch[i][j][k].mb[1]=-1;
 
        fplch[i][j][k].mb[2]=-1;
 
        fplch[i][j][k].mb[3]=-1;
 
        fplch[i][j][k].sn[0][0][0]=0;
 
        fplch[i][j][k].sn[0][1][0]=0;
 
        fplch[i][j][k].sn[1][0][0]=0;
 
        fplch[i][j][k].sn[1][1][0]=0;
 
      }
 
 
 
  for (i=0;i<14;i++)
 
    {
 
      x0=FPXOFF+SMXOFF*(i%7);
 
      y0=FPYOFF+SMYOFF*(i/7);
 
      sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                    "-fill #AABBCC -outline \"\" -tags \"sm\"",
 
                    argv[1], sc*x0, sc*y0, sc*(x0+SMXS), sc*(y0+SMYS));
 
      Tcl_Eval(interp, cmd);
 
    }
 
 
 
          Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
 
  if ((fid
=fopen(cmd
, "r")) == NULL
) return TCL_ERROR
;  
  while ( fgets( cmd
, 100, fid
) != NULL
)  
    if ((status
=sscanf( cmd
," M%d ASD%d %d %d %d %d %d %d ",  
          &pmt,&asd,&sm,&bbr,&bbc,&mb,&db,&con))==8)
 
      {
 
      if (sm>6)
 
        {
 
        sm=20-sm;
 
        bbr=15-bbr;
 
        bbc=5-bbc;
 
        }
 
      ccon=db*16+con;
 
      x0=FPXOFF+SMXOFF*(sm%7)+BBXS*bbc;
 
      y0=FPYOFF+SMYS+SMYOFF*(sm/7)-BBYS*(bbr+1);
 
 
 
      fx0=fedch[mb][ccon].fx0;
 
      fy0=fedch[mb][ccon].fy0;
 
 
 
      if (fedch[mb][ccon].pmt)
 
        {
 
          printf("evinit: channel already mapped\n");  
        }
 
       else if (fplch[sm][bbc][bbr].mb[asd] != -1)
 
              {
 
          printf("evinit: area already mapped\n");  
              }
 
             else
 
              {
 
               fedch[mb][ccon].pmt=pmt;
 
               fedch[mb][ccon].asd=asd;
 
               fedch[mb][ccon].sm=sm;
 
               fedch[mb][ccon].bbr=bbr;
 
               fedch[mb][ccon].bbc=bbc;
 
               fedch[mb][ccon].x0=x0;
 
               fedch[mb][ccon].y0=y0;
 
               fplch[sm][bbc][bbr].pmt=pmt;
 
               fplch[sm][bbc][bbr].mb[asd]=mb;
 
               fplch[sm][bbc][bbr].wi[asd]=ccon;
 
               if (!asd)
 
               {
 
                 fplch[sm][bbc][bbr].x0=x0;
 
                 fplch[sm][bbc][bbr].y0=y0;
 
               }
 
/*
 
               fplch[sm][bbc][bbr].x0=fx0;
 
               fplch[sm][bbc][bbr].y0=fy0;
 
*/
 
               /*        printf("mb=%d con=%d pmt=%d\n",mb,con,pmt); */
 
              }
 
      switch (pmt)
 
         {
 
         case 4:
 
           sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                    "-fill $m4color -outline \"\" -tags \"m4\"",
 
                    argv[1], sc*x0, sc*y0, sc*(x0+BBXS), sc*(y0+BBYS));
 
           Tcl_Eval(interp, cmd);
 
           sscanf((char *) Tcl_GetStringResult
(interp
)," %d ", &fedch
[mb
][ccon
].
id);  
           sprintf (cmd
, "%s create rectangle %d %d %d %d "  
                    "-fill $m4color -outline \"\" -tags \"m4\"",
 
                    argv[2], fx0, fy0, fx0+32, fy0+2);
 
           Tcl_Eval(interp, cmd);
 
           sscanf((char *) Tcl_GetStringResult
(interp
)," %d ", &fplch
[sm
][bbc
][bbr
].
id[asd
]);  
           break;
 
         case 16:
 
           if (fpon) casd=asd^1; else casd=asd;
 
           sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                    "-fill $m16color -outline \"\" -tags \"m16\"",
 
                    argv[1], sc*(x0+casd*BBXS/4), sc*y0,
 
                    sc*(x0+(casd+1)*BBXS/4), sc*(y0+BBYS));
 
           Tcl_Eval(interp, cmd);
 
           sscanf( (char *) Tcl_GetStringResult
(interp
)," %d ", &fedch
[mb
][ccon
].
id);  
           sprintf (cmd
, "%s create rectangle %d %d %d %d "  
                    "-fill $m16color -outline \"\" -tags \"m16\"",
 
                    argv[2], fx0, fy0, fx0+32, fy0+2);
 
           Tcl_Eval(interp, cmd);
 
           sscanf((char *) Tcl_GetStringResult
(interp
)," %d ", &fplch
[sm
][bbc
][bbr
].
id[asd
]);  
         }
 
      }
 
 
 
          Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
 
  if ((fid
=fopen(cmd
, "r")) == NULL
) return TCL_ERROR
;  
  while ( fgets( cmd
, 100, fid
) != NULL
)  
    if (cmd[1]=='#')
 
    {
 
      if ((fgets( cmd
, 100, fid
))&&  
          ((status
=sscanf(cmd
,"\t  type  R5600-00-M%d", &pmt
))==1))  
        if ((fgets( cmd
, 100, fid
))&&  
            ((status
=sscanf(cmd
,"\t  serial_no\t%s", s1
))==1))  
          if ((fgets( cmd
, 100, fid
))&&  
              ((status
=sscanf(cmd
,"\t  position\t%d\t%d\t%d", &sm
, &bbr
, &bbc
))==3))  
          {
 
            if (sm>6)
 
            {
 
              sm=20-sm;
 
              bbr=31-bbr;
 
              bbc=11-bbc;
 
            }
 
            strcpy(fplch
[sm
][bbc
/2][bbr
/2].
sn[bbc
%2][bbr
%2], s1
);  
          }
 
    }
 
 
 
 
 
  for (i=0;i<14;i++)
 
    for (j=0;j<6;j++)
 
      for (k=0;k<16;k++)
 
/*        if (fplch[i][j][k].pmt) */
 
          for (ii=0;ii<2;ii++)
 
            for (jj=0;jj<2;jj++)
 
              if (fplch[i][j][k].sn[ii][jj][0]=='e')
 
        {
 
           sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                    "-fill #FFFF77 -outline \"\" -tags \"empty\"",
 
                    argv[1],
 
                    sc*(fplch[i][j][k].x0+ii*BBXS/2),
 
                    sc*(fplch[i][j][k].y0+(1-jj)*BBYS/2),
 
                    sc*(fplch[i][j][k].x0+(ii+1)*BBXS/2),
 
                    sc*(fplch[i][j][k].y0+(2-jj)*BBYS/2));
 
           Tcl_Eval(interp, cmd);
 
 
 
        }
 
 
 
  return TCL_OK;
 
}
 
 
 
int Evd_evopen( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int evhot;
 
  char fname[200];
 
  FILE *fhot;
 
 
 
  if (open_data_file(fname)) return TCL_ERROR;
 
  curev=1;
 
 
 
  sscanf(Tcl_GetVar
(interp
, "evhot", TCL_GLOBAL_ONLY
), " %d ", &evhot
);  
  if (evhot)
 
  {
 
    (void) find_hot();
 
  }
 
   else
 
  {
 
    if ((fhot
=fopen("hotchannels.raw","r")))  
    {
 
      (void) fread ((void *) hotchannels
, 1, MAXFED
*128, fhot
);  
    }
 
     else (void) find_hot();
 
  }
 
  return TCL_OK;
 
 
 
}
 
 
 
int Evd_evgoto( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int pos;
 
  sscanf(argv
[1]," %d ", &curev
);  
 
 
  pos=goto_event(curev);
 
  if (pos != curev)
 
    {
 
    goto_event(pos);
 
    curev=pos;
 
    }
 
  return TCL_OK;
 
}
 
 
 
int Evd_evclose( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  if (close_data_file()) return TCL_ERROR;
 
  return TCL_OK;
 
}
 
 
 
int Evd_evplot( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int i, j, k, ii, jj, nr, nhits, map, bx, evmask;
 
  float sc;
 
  unsigned char b;
 
  char cmd[CMDLEN];
 
 
 
  sscanf(Tcl_GetVar
(interp
, "evmap", TCL_GLOBAL_ONLY
), " %d ", &map
);  
  sscanf(Tcl_GetVar
(interp
, "evmask", TCL_GLOBAL_ONLY
), " %d ", &evmask
);  
  nhits=0;
 
 
 
  if ((nr=get_nextev(fedr, 0x500, 1)))
 
    {
 
    bx=fedr[0].bxn;
 
    for (k=0;k<nr;k++) if (fedr[k].fedid<MAXFED)
 
      {
 
      if (evmask) mask_hot(fedr[k].fedid,(char *)fedr[k].data);
 
      if (bx!=fedr[k].bxn)
 
        printf("bx=%d, bxn=%d\n", bx
, fedr
[k
].
bxn);  
      for (ii=0;ii<128;ii++)
 
        {
 
        i=ii/2;
 
        if (fedr[k].data[ii])
 
          for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
 
            if (fedr[k].data[ii]&b)
 
              switch (fedch[fedr[k].fedid][i].pmt)
 
                {
 
                case 4:
 
                  nhits++;
 
                  sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                           "-fill $evcolor -outline \"\" -tags \"ev\"",
 
                           argv[1],
 
                           sc*(fedch[fedr[k].fedid][i].x0+m4x[j]),
 
                           sc*(fedch[fedr[k].fedid][i].y0+m4y[j]),
 
                           sc*(fedch[fedr[k].fedid][i].x0+m4x[j]+BBXS/4),
 
                           sc*(fedch[fedr[k].fedid][i].y0+m4y[j]+BBYS/4));
 
                  Tcl_Eval(interp, cmd);
 
                  if (!map)
 
                    {
 
                    sprintf (cmd
, "%s create rectangle %d %d %d %d "  
                                "-fill $evcolor -outline \"\" -tags \"ev\"",
 
                                argv[3],
 
                                fedch[fedr[k].fedid][i].fx0+2*j,
 
                                fedch[fedr[k].fedid][i].fy0,
 
                                fedch[fedr[k].fedid][i].fx0+2*j+2,
 
                                fedch[fedr[k].fedid][i].fy0+2);
 
                    Tcl_Eval(interp, cmd);
 
                    }
 
                  break;
 
                case 16:
 
                  nhits++;
 
                  sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                           "-fill $evcolor -outline \"\" -tags \"ev\"",
 
                           argv[1],
 
                           sc*(fedch[fedr[k].fedid][i].x0+
 
                           m16x[fedch[fedr[k].fedid][i].asd][j]),
 
                           sc*(fedch[fedr[k].fedid][i].y0+
 
                           m16y[fedch[fedr[k].fedid][i].asd][j]),
 
                           sc*(fedch[fedr[k].fedid][i].x0+
 
                           m16x[fedch[fedr[k].fedid][i].asd][j]+BBXS/8),
 
                           sc*(fedch[fedr[k].fedid][i].y0+
 
                           m16y[fedch[fedr[k].fedid][i].asd][j]+BBYS/8));
 
                  Tcl_Eval(interp, cmd);
 
                  if (!map)
 
                    {
 
                    sprintf (cmd
, "%s create rectangle %d %d %d %d "  
                                "-fill $evcolor -outline \"\" -tags \"ev\"",
 
                                argv[3],
 
                                fedch[fedr[k].fedid][i].fx0+2*j,
 
                                fedch[fedr[k].fedid][i].fy0,
 
                                fedch[fedr[k].fedid][i].fx0+2*j+2,
 
                                fedch[fedr[k].fedid][i].fy0+2);
 
                    Tcl_Eval(interp, cmd);
 
                    }
 
                }
 
        }
 
      }
 
    sprintf(cmd
, ".ev.tb.curev delete 0 end ");  
    Tcl_Eval(interp, cmd);
 
    sprintf(cmd
, ".ev.tb.curev insert 0 \"%d\" ", curev
);  
    Tcl_Eval(interp, cmd);
 
    sprintf(cmd
, ".ev.det delete te ; set ura [clock format %d "  
                 "-format \"%%a %%b %%d %%H:%%M:%%S %%Y\"] ; "
 
                 ".ev.det create text [expr $evmag*345] [expr $evmag*10] "
 
                 "-text \"EVENT: %d %d %d $ura\" "
 
                 "-fill \"#c0c000\" -anchor e -font $tfont -tags te ",
 
                 evdata.event_time, logh.evt, evdata.run_number,
 
                 evdata.exp_number);
 
    /*                 logh.dtm, logh.evt, logh.run, logh.exp); */
 
    Tcl_Eval(interp, cmd);
 
    sprintf((char *) Tcl_GetStringResult
(interp
), "evplot: event#=%d #hits=%d #feds=%d bx=%d",  
            (curev++), nhits, nr, evdata.physBX);
 
    }
 
   else
 
    {
 
    Tcl_Eval(interp, "tk_messageBox -message "
 
             "\"RUN WITHOUT RICH\" -icon warning -type ok");
 
    }
 
  return TCL_OK;
 
}
 
 
 
int Evd_evscan( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int i, j, k, ii, jj, nr, pos, nh, pbx, norm, dif, evmask, sreset;
 
  unsigned short b;
 
  uint32_t prev[5000];
 
  double nhy[2000] ,nbx[220] ,hbx[220], nco4y[101], nco16y[101];
 
  double nrepy[100], nrep64y[100];
 
  char cmd[CMDLEN];
 
 
 
  sscanf(Tcl_GetVar
(interp
, "evmask", TCL_GLOBAL_ONLY
), " %d ", &evmask
);  
  sscanf(Tcl_GetVar
(interp
, "sreset", TCL_GLOBAL_ONLY
), " %d ", &sreset
);  
 
 
  for (i=0;i<5000;i++) prev[i]=0;
 
  for (i=0;i<2000;i++) nhy[i]=0.;
 
  for (i=0;i<220;i++)
 
    {
 
    nbx[i]=0.;
 
    hbx[i]=0.;
 
    }
 
  for (i=0;i<101;i++)
 
    {
 
    nco4y[i]=0.;
 
    nco16y[i]=0.;
 
    }
 
  for (i=0;i<100;i++)
 
    {
 
    nrepy[i]=0.;
 
    nrep64y[i]=0.;
 
    }
 
  /*  if (Blt_GetVector(interp, "nhy", &nhyV) != TCL_OK) return TCL_ERROR;
 
   */
 
  if (sreset)
 
  {
 
    for (k=0;k<MAXFED;k++)
 
      for (i=0;i<64;i++)
 
        for (j=0;j<16;j++)
 
          hits.data[k][i][j]=0;
 
    hits.evt=0;
 
  }
 
 
 
  if (reopen_data_file()) return TCL_ERROR;
 
 
 
  while ((nr=get_nextev(fedr, 0x500, 0)))
 
    {
 
    nh=0;
 
    for (k=0;k<nr;k++)
 
      {
 
      if (evmask) mask_hot(fedr[k].fedid,(char *)fedr[k].data);
 
      for (ii=0;ii<128;ii++)
 
        {
 
        i=ii/2;
 
        if (fedr[k].data[ii])
 
          for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
 
            if (fedr[k].data[ii]&b)
 
              {
 
              if (fedch[fedr[k].fedid][i].pmt) nh++;
 
              hits.data[fedr[k].fedid][i][j]++;
 
              }
 
        }
 
      }
 
    hits.evt++;
 
    pbx=evdata.physBX;
 
    if ( (unsigned short) pbx > 219) pbx=219;
 
    nbx[pbx]+=1.;
 
    hbx[pbx]+=(double)nh;
 
    nh/=10;
 
    if (nh > 1999) nh=1999;
 
    nhy[nh]+=1.;
 
    if (nh<5000)
 
      {
 
      if (prev[nh])
 
        {
 
        dif=hits.evt-prev[nh];
 
        if (dif<100) nrepy[dif]++;
 
        if ((dif>>=6)<100) nrep64y[dif]++;
 
        }
 
      prev[nh]=hits.evt;
 
      }
 
    }
 
  hits.max=0;
 
  hits.min=0x7fffffff;
 
  hits.ent=0;
 
  norm=hits.evt+1;
 
  for (i=0;i<MAXFED;i++)
 
    for (j=0;j<64;j++)
 
      if (fedch[i][j].pmt)
 
        for (k=0;k<16;k++)
 
          {
 
          if (fedch[i][j].pmt == 4)
 
            if (hits.data[i][j][k])
 
              nco4y[(100*hits.data[i][j][k]/norm)+1]+=1.;
 
             else
 
              nco4y[0]+=1.;
 
           else
 
            if (hits.data[i][j][k])
 
              nco16y[(100*hits.data[i][j][k]/norm)+1]+=1.;
 
             else
 
              nco16y[0]+=1.;
 
          hits.ent+=hits.data[i][j][k];
 
          if (hits.data[i][j][k]>hits.max) hits.max=hits.data[i][j][k];
 
          if (hits.data[i][j][k]<hits.min) hits.min=hits.data[i][j][k];
 
          }
 
 
 
  for (i=0;i<2000;i++)
 
    {
 
    sprintf(cmd
, "set nhy(%d) %f ", i
, nhy
[i
]);  
    Tcl_Eval(interp, cmd);
 
    }
 
  for (i=0;i<220;i++)
 
    {
 
    sprintf(cmd
, "set nbxy(%d) %f ", i
, nbx
[i
]);  
    Tcl_Eval(interp, cmd);
 
    if (nbx[i]) hbx[i]/=nbx[i];
 
    sprintf(cmd
, "set hbxy(%d) %f ", i
, hbx
[i
]);  
    Tcl_Eval(interp, cmd);
 
    }
 
  for (i=0;i<101;i++)
 
    {
 
    sprintf(cmd
, "set nco4y(%d) %f ", i
, nco4y
[i
]);  
    Tcl_Eval(interp, cmd);
 
    sprintf(cmd
, "set nco16y(%d) %f ", i
, nco16y
[i
]);  
    Tcl_Eval(interp, cmd);
 
    }
 
  for (i=0;i<100;i++)
 
    {
 
    sprintf(cmd
, "set nrepy(%d) %f ", i
, nrepy
[i
]);  
    Tcl_Eval(interp, cmd);
 
    sprintf(cmd
, "set nrep64y(%d) %f ", i
, nrep64y
[i
]);  
    Tcl_Eval(interp, cmd);
 
    }
 
  /*  if (Blt_ResetVector(nhyV, nhyd, 2000, 2000, TCL_VOLATILE) != TCL_OK)
 
      return TCL_ERROR; */
 
 
 
  if (reclose_data_file()) return TCL_ERROR;
 
  return TCL_OK;
 
}
 
 
 
int Evd_evscanplot( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int i, j, k, coli, map, rev, evm4n;
 
  float sc, sm, norm, norm1, evn;
 
  char col[17][10]={"000000","111111","222222","333333",
 
                    "444444","555555","666666","777777",
 
                    "888888","999999","AAAAAA","BBBBBB",
 
                    "CCCCCC","DDDDDD","EEEEEE","FFFFFF","FF0000"};
 
  char cmd[CMDLEN];
 
 
 
  sscanf(Tcl_GetVar
(interp
, "evnorm", TCL_GLOBAL_ONLY
), " %f ", &evn
);  
  sscanf(Tcl_GetVar
(interp
, "evm4norm", TCL_GLOBAL_ONLY
), " %d ", &evm4n
);  
  sscanf(Tcl_GetVar
(interp
, "evreverse", TCL_GLOBAL_ONLY
), " %d ", &rev
);  
  sscanf(Tcl_GetVar
(interp
, "evmap", TCL_GLOBAL_ONLY
), " %d ", &map
);  
  if (evn) norm=sm*(float)(hits.evt)/100.;
 
   else norm=sm*(float)(hits.max)/100.;
 
 
 
  for (i=0;i<MAXFED;i++)
 
    for (j=0;j<64;j++)
 
    {
 
      if (evm4n && (fedch[i][j].pmt==4))
 
        norm1=4.*norm;
 
       else
 
        norm1=norm;
 
      for (k=0;k<16;k++)
 
        if (hits.data[i][j][k]||map)
 
          {
 
          coli=(int)(16.*(float)hits.data[i][j][k]/norm1);
 
          if (rev) coli^=0xF;
 
          if (coli>16) coli=16;
 
          if (coli<0) coli=0;
 
          if (!map)
 
            {
 
            sprintf (cmd
, "%s create rectangle %d %d %d %d "  
                         "-fill #%s -outline \"\" -tags \"sc c%d\"",
 
                         argv[4],
 
                         fedch[i][j].fx0+2*k,
 
                         fedch[i][j].fy0,
 
                         fedch[i][j].fx0+2*k+2,
 
                         fedch[i][j].fy0+2,
 
                         col[coli], coli);
 
            Tcl_Eval(interp, cmd);
 
            }
 
          switch (fedch[i][j].pmt)
 
            {
 
            case 4:
 
              sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                           "-fill #%s -outline \"\" -tags \"sc c%d\"",
 
                           argv[1],
 
                           sc*(fedch[i][j].x0+m4x[k]),
 
                           sc*(fedch[i][j].y0+m4y[k]),
 
                           sc*(fedch[i][j].x0+m4x[k]+BBXS/4),
 
                           sc*(fedch[i][j].y0+m4y[k]+BBYS/4),
 
                           col[coli], coli);
 
              Tcl_Eval(interp, cmd);
 
              break;
 
            case 16:
 
              sprintf (cmd
, "%s create rectangle %f %f %f %f "  
                           "-fill #%s -outline \"\" -tags \"sc c%d\"",
 
                           argv[1],
 
                           sc*(fedch[i][j].x0+
 
                           m16x[fedch[i][j].asd][k]),
 
                           sc*(fedch[i][j].y0+
 
                           m16y[fedch[i][j].asd][k]),
 
                           sc*(fedch[i][j].x0+
 
                           m16x[fedch[i][j].asd][k]+BBXS/8),
 
                           sc*(fedch[i][j].y0+
 
                           m16y[fedch[i][j].asd][k]+BBYS/8),
 
                           col[coli], coli);
 
              Tcl_Eval(interp, cmd);
 
              break;
 
            }
 
          }
 
    }
 
  sprintf((char *) Tcl_GetStringResult
(interp
), "scan: #events=%u avg=%.2f channel:"  
                          " max=%u min=%u",
 
                          hits.evt, (float)hits.ent/(float)hits.evt,
 
                          hits.max, hits.min);
 
  return TCL_OK;
 
}
 
 
 
int Evd_evstatl( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  int hv,hvch;
 
  int x, y, wid, fpon, scan;
 
  int mb, db, con, ch, ccon, sm , bbr, bbc, asd, px, py;
 
  float sc, x0, x1, y0, y1;
 
  char cmd[CMDLEN], *sn;
 
 
 
  Tcl_Eval(interp, ".ev.det delete hl");
 
  Tcl_Eval(interp, ".ev.fed delete hl");
 
  sscanf(Tcl_GetVar
(interp
, "evmap", TCL_GLOBAL_ONLY
), " %d ", &fpon
);  
  sscanf(Tcl_GetVar
(interp
, "new_scan", TCL_GLOBAL_ONLY
), " %d ", &scan
);  
 
 
  switch (wid)
 
    {
 
    case 0:
 
      x=x/(int)sc-FPXOFF;
 
      y=y/(int)sc-FPYOFF;
 
/*      if (x<0 || x>=FPXOFF+7*SMXOFF || y<0 || y>=FPYOFF+2*SMYOFF) break; */
 
      if (x<0 || x>=7*SMXOFF || y<0 || y>=2*SMYOFF) break;
 
      sm=x/SMXOFF+7*(y/SMYOFF);
 
      bbr=(y%SMYOFF)/BBYS;
 
      bbc=(x%SMXOFF)/BBXS;
 
      px=(x%SMXOFF)%BBXS;
 
      py=(y%SMYOFF)%BBYS;
 
      if ((sm<14)&&(bbr<16)&&(bbc<6)&&(px<16)&&(py<16))
 
        {
 
        bbr=15-bbr;
 
        asd=0;
 
        ch=m4c[px/2][py/2];
 
        sn=fplch[sm][bbc][bbr].sn[px/4][1-py/4];
 
        Tcl_SetVar(interp, "pmtsntmp", sn, TCL_GLOBAL_ONLY);
 
        switch(fplch[sm][bbc][bbr].pmt)
 
          {
 
          case 16:
 
            asd=m16a[px][py];
 
            ch=m16c[px][py];
 
          case 4:
 
            if ((mb=fplch[sm][bbc][bbr].mb[asd]) == -1) break;
 
            ccon=fplch[sm][bbc][bbr].wi[asd];
 
            db=ccon/16;
 
            con=ccon%16;
 
            sprintf(cmd
, ".ev.fed coords %d", fplch
[sm
][bbc
][bbr
].
id[asd
]);  
            Tcl_Eval(interp, cmd);
 
            sscanf((char *) Tcl_GetStringResult
(interp
), " %f %f %f %f ", &x0
, &y0
, &x1
, &y1
);  
            x0-=1.; y0-=1.; x1+=1.; y1+=1.;
 
            sprintf(cmd
, ".ev.fed create rectangle %f %f %f %f "  
                         "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
 
                         x0, y0, x1, y1);
 
            Tcl_Eval(interp, cmd);
 
            sprintf(cmd
, ".ev.det coords %d", fedch
[mb
][ccon
].
id);  
            Tcl_Eval(interp, cmd);
 
            sscanf((char *) Tcl_GetStringResult
(interp
), " %f %f %f %f ", &x0
, &y0
, &x1
, &y1
);  
            x0-=1.; y0-=1.; x1+=1.; y1+=1.;
 
            sprintf(cmd
, ".ev.det create rectangle %f %f %f %f "  
                         "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
 
                         x0, y0, x1, y1);
 
            Tcl_Eval(interp, cmd);
 
            hv=-1;      
 
            hvch=-1;    
 
            if (!scan)
 
              sprintf((char *) Tcl_GetStringResult
(interp
), "mb:%2d db:%d con:%2d sm:%2d"  
                   " r:%2d c:%d asd:%d ch:%2d SN:%s hv:%3d hvch%3d entr:%d",
 
                      mb, db, con, sm, bbr, bbc, asd, ch, sn, hv,hvch,
 
                      hits.data[mb][ccon][ch]);
 
             else
 
              sprintf((char *) Tcl_GetStringResult
(interp
),  
                      "mb:%2d db:%d con:%2d sm:%2d r:%2d c:%d asd:%d ch:%2d SN:%s hv:%3d hvch%3d",
 
                      mb, db, con, sm, bbr, bbc, asd, ch, sn, hv,hvch);
 
            break;
 
          }
 
        }
 
      break;
 
    case 1:
 
      y-=5;
 
      x-=3;
 
      if (x<0 || y<0) break;
 
      mb=2*(y/52)+x/140;
 
      con=(y%52)/3;
 
      db=(x%140)/34;
 
      ch=(x%34)/2;
 
      if ((mb<28)&&(db<4)&&(con<16)&&(ch<16))
 
        {
 
        ccon=db*16+con;
 
        if (fedch[mb][ccon].pmt)
 
          {
 
          sm=fedch[mb][ccon].sm;
 
          bbr=fedch[mb][ccon].bbr;
 
          bbc=fedch[mb][ccon].bbc;
 
          asd=fedch[mb][ccon].asd;
 
          sprintf(cmd
, ".ev.det coords %d", fedch
[mb
][ccon
].
id);  
          Tcl_Eval(interp, cmd);
 
          sscanf((char *) Tcl_GetStringResult
(interp
), " %f %f %f %f ", &x0
, &y0
, &x1
, &y1
);  
          x0-=1.; y0-=1.; x1+=1.; y1+=1.;
 
          sprintf(cmd
, ".ev.det create rectangle %f %f %f %f "  
                       "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
 
                       x0, y0, x1, y1);
 
          Tcl_Eval(interp, cmd);
 
          sprintf(cmd
, ".ev.fed coords %d", fplch
[sm
][bbc
][bbr
].
id[asd
]);  
          Tcl_Eval(interp, cmd);
 
          sscanf((char *) Tcl_GetStringResult
(interp
), " %f %f %f %f ", &x0
, &y0
, &x1
, &y1
);  
          x0-=1.; y0-=1.; x1+=1.; y1+=1.;
 
          sprintf(cmd
, ".ev.fed create rectangle %f %f %f %f "  
                       "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
 
                       x0, y0, x1, y1);
 
          Tcl_Eval(interp, cmd);
 
          if (!scan)
 
            sprintf((char *) Tcl_GetStringResult
(interp
), "mb:%2d db:%d con:%2d sm:%2d"  
                    " r:%2d c:%d asd:%d ch:%2d entr:%d",
 
                    mb, db, con, sm, bbr, bbc, asd, ch,
 
                    hits.data[mb][ccon][ch]);
 
           else
 
            sprintf((char *) Tcl_GetStringResult
(interp
),  
                    "mb:%2d db:%d con:%2d sm:%2d r:%2d c:%d asd:%d ch:%2d",
 
                    mb, db, con, sm, bbr, bbc, asd, ch);
 
          }
 
        }
 
      break;
 
    }
 
 
 
  return TCL_OK;
 
}
 
 
 
int Evd_evdump( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  FILE *fout;
 
 
 
  if (reopen_data_file()) return TCL_ERROR;
 
  if ((fout
=fopen(argv
[1], "w"))==NULL
) return TCL_ERROR
;  
 
 
  while (dump_cmp(fout, 0x500));
 
 
 
  if (fclose(fout
)==EOF
) return TCL_ERROR
;  
  if (reclose_data_file()) return TCL_ERROR;
 
 
 
  return TCL_OK;
 
}
 
 
 
 
 
/*
 
int Evd_proto( ClientData clientData, Tcl_Interp *interp,
 
                        int argc, CONST char *argv[])
 
{
 
  return TCL_OK;
 
}
 
*/
 
 
 
int Evd_Init(Tcl_Interp *interp)
 
{
 
  if (is_little_endian())
 
    printf("Evd running on LittleEndian machine\n");  
   else
 
    printf("Evd running on BigEndian machine\n");  
  Tcl_PkgProvide(interp, "Evd", "1.0");
 
 
 
  Tcl_CreateCommand(interp, "evinit", Evd_evinit, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evopen", Evd_evopen, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evgoto", Evd_evgoto, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evclose", Evd_evclose, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evplot", Evd_evplot, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evscan", Evd_evscan, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evscanplot", Evd_evscanplot, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evstatl", Evd_evstatl, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  Tcl_CreateCommand(interp, "evdump", Evd_evdump, (ClientData) NULL,
 
                  (Tcl_CmdDeleteProc *) NULL);
 
  return TCL_OK;
 
}
 
 
 
 
 
#ifdef __cplusplus
 
}
 
#endif