Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  1. /*CMZ :          23/02/2008  09.20.45  by  Samo Korpar*/
  2. /*CMZ :  0.02/00 04/07/2001  00.52.00  by  Samo Korpar*/
  3. /*CMZ :  0.01/00 29/11/99  13.07.26  by  Samo Korpar*/
  4. /*CMZ :  0.00/00 08/10/99  13.05.24  by  Samo Korpar*/
  5. /*-- Author :*/
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <stdint.h>
  9. #include <string.h>
  10. #include <time.h>
  11. #include <tcl.h>
  12. #include <tk.h>
  13.  
  14. extern int hvslow(char *sn);
  15. extern int hvslowChannel(char *sn);
  16.  
  17. /*KEEP,evdp,T=C++.*/
  18. #include "evdp.h"
  19. /*KEEP,evd,T=C++.*/
  20. #include "evd.h"
  21. /*KEND.*/
  22. #include <blt.h>
  23.  
  24. #define CMDLEN 300
  25.  
  26. /* parameters for the detector display */
  27.  
  28. #define FPXOFF 4
  29. #define FPYOFF 17
  30. #define SMXOFF 49
  31. #define SMYOFF 138
  32. #define BBXS 8
  33. #define BBYS 8
  34. #define SMXS 48
  35. #define SMYS 128
  36.  
  37. static int curev;
  38. static char hotchannels[MAXFED][128];
  39. static int m4x[16],m4y[16],m4c[4][4];
  40. static int m16x[4][16],m16y[4][16],m16a[8][8],m16c[8][8];
  41. static int m4pm[16],m4pc[16],m16pm[4][16],m16pc[4][16];
  42. static FPL_data fplch[14][6][16];
  43. static FED_data fedch[MAXFED][64];
  44. static FED_record fedr[MAXFED];
  45. static FED_hist hits;
  46.  
  47.  
  48.  
  49. #ifdef __cplusplus
  50. extern "C" {
  51. #endif
  52.  
  53. void mask_hot(int fed, char *data)
  54. {
  55.   int i;
  56.  
  57.   for (i=0;i<128;i++)
  58.     *(data++)&=hotchannels[fed][i];
  59.   return;
  60. }
  61.  
  62. int find_hot()
  63. {
  64.   int i, j, k, ii, jj, nr, pos, nh, nhot;
  65.   int sm, pr=0, pc=0, ch=0;
  66.   unsigned int nev;
  67.   unsigned char b, *hch;
  68.   FILE *fhot;
  69.  
  70.   hch=(unsigned char *) hotchannels;
  71.   for (i=0;i<128*MAXFED;i++) *(hch++)=0xFF;
  72.  
  73.   for (k=0;k<MAXFED;k++)
  74.     for (i=0;i<64;i++)
  75.       for (j=0;j<16;j++)
  76.         hits.data[k][i][j]=0;
  77.  
  78.   if (reopen_data_file()) exit(1);
  79.  
  80.   nev=0;
  81.  
  82.   while ((nr=get_nextev(fedr, 0x500, 0)) && (nev<1000))
  83.     {
  84.     nh=0;
  85.     for (k=0;k<nr;k++)
  86.       for (ii=0;ii<128;ii++)
  87.         {
  88.         i=ii/2;
  89.         if (fedr[k].data[ii] && fedch[fedr[k].fedid][i].pmt)
  90.           for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
  91.             if (fedr[k].data[ii]&b) nh++;
  92.         }
  93.     if (nh > 1000) continue;
  94.     for (k=0;k<nr;k++)
  95.       for (ii=0;ii<128;ii++)
  96.         {
  97.         i=ii/2;
  98.         if (fedr[k].data[ii] && fedch[fedr[k].fedid][i].pmt)
  99.           for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
  100.             if (fedr[k].data[ii]&b) hits.data[fedr[k].fedid][i][j]++;
  101.         }
  102.     nev++;
  103.     }
  104.   if ((nev/=10) < 5) return 1;
  105.   fhot=fopen("hotchannels","w");
  106.   nhot=0;
  107.   for (k=0;k<MAXFED;k++)
  108.       for (ii=0;ii<128;ii++)
  109.         {
  110.         i=ii/2;
  111.         for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
  112.           if (hits.data[k][i][j] > nev)
  113.             {
  114.             nhot++;
  115.             sm=fedch[k][i].sm;
  116.             switch (fedch[k][i].pmt)
  117.               {
  118.               case 4:
  119.                 pr=2*fedch[k][i].bbr+m4pm[j]/2;
  120.                 pc=2*fedch[k][i].bbc+m4pm[j]%2;
  121.                 ch=m4pc[j];
  122.                 break;
  123.               case 16:
  124.                 pr=2*fedch[k][i].bbr+m16pm[fedch[k][i].asd][j]/2;
  125.                 pc=2*fedch[k][i].bbc+m16pm[fedch[k][i].asd][j]%2;
  126.                 ch=m16pc[fedch[k][i].asd][j];
  127.                 break;
  128.               }
  129.             if (sm>6)
  130.               {
  131.               sm=20-sm;
  132.               pr=31-pr;
  133.               pc=11-pc;
  134.               }
  135.             fprintf(fhot, "%d%.2d%.2d%.2d 1\n", sm, pr, pc, ch);
  136.             hotchannels[k][ii]&=(~b);
  137.             }
  138.         }
  139.   fclose(fhot);
  140.   fhot=fopen("hotchannels.raw","w");
  141.   fwrite ((void *) hotchannels, 1, MAXFED*128, fhot);
  142.   fclose(fhot);
  143.   printf("%d hot channels found\n", nhot);
  144.   if (reclose_data_file()) exit(1);
  145.   return 0;
  146. }
  147. int Evd_evinit( ClientData clientData, Tcl_Interp *interp,
  148.                         int argc, CONST char *argv[])
  149. {
  150.   int pmt, asd, sm, bbr, bbc, mb, db, con, x0, y0, fx0, fy0, pmc;
  151.   int status, i, j, k, ii, jj, ccon, fpon, casd, px, py;
  152.   float sc;
  153.   char cmd[CMDLEN], s1[10];
  154.   FILE *fid;
  155.  
  156.   sscanf(argv[3]," %f ", &sc);
  157.   sscanf(Tcl_GetVar(interp, "evmap", TCL_GLOBAL_ONLY), " %d ", &fpon);
  158.  
  159.   sprintf(cmd, "%s/m4wiremap.dat",
  160.           Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
  161.  
  162.   if ((fid=fopen(cmd, "r")) == NULL) {
  163.      fprintf(stderr,"%s %d: File not found %s\n",__FILE__, __LINE__, cmd);
  164.     return TCL_ERROR;
  165.    
  166.   }
  167.   while ( fgets( cmd, 100, fid) != NULL)
  168.     if ((status=sscanf( cmd," %d %d %d ",&pmt,&pmc,&con))==3)
  169.       {
  170.       /*      printf("con=%d pmt=%d pmc=%d\n",con,pmt,pmc); */
  171.       m4pm[con]=pmt;
  172.       m4pc[con]=pmc;
  173.       if (fpon)
  174.         {
  175.         px=2*(pmt%2)+1-(pmc%2);
  176.         py=3-(2*(pmt/2)+1-(pmc/2));
  177.         }
  178.        else
  179.         {
  180.         px=2*(pmt%2)+(pmc%2);
  181.         py=3-(2*(pmt/2)+(pmc/2));
  182.         }
  183.       m4c[px][py]=con;
  184.       /*      printf("px=%d py=%d con=%d \n", px, py, con); fflush(stdout); */
  185.       m4x[con]=2*px;
  186.       m4y[con]=2*py;
  187.       }
  188.   fclose(fid);
  189.  
  190.   sprintf(cmd, "%s/m16wiremap.dat",
  191.           Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
  192.   if ((fid=fopen(cmd, "r")) == NULL) return TCL_ERROR;
  193.   while ( fgets( cmd, 100, fid) != NULL)
  194.     if ((status=sscanf(cmd," %d %d ASD%d %d ",&pmt,&pmc,&asd,&con))==4)
  195.       {
  196.       /*      printf("asd=%d con=%d pmt=%d bbc=%d\n",asd,con,pmt,pmc); */
  197.       m16pm[asd][con]=pmt;
  198.       m16pc[asd][con]=pmc;
  199.       if (fpon)
  200.         {
  201.         px=4*(pmt%2)+3-(pmc%4);
  202.         py=7-(4*(pmt/2)+3-(pmc/4));
  203.         }
  204.        else
  205.         {
  206.         px=4*(pmt%2)+(pmc%4);
  207.         py=7-(4*(pmt/2)+(pmc/4));
  208.         }
  209.       m16a[px][py]=asd;
  210.       m16c[px][py]=con;
  211.       m16x[asd][con]=px;
  212.       m16y[asd][con]=py;
  213.       }
  214.   fclose(fid);
  215.  
  216.   for (i=0;i<MAXFED;i++)
  217.     for (j=0;j<64;j++)
  218.       {
  219.       fedch[i][j].pmt=0;
  220.       fedch[i][j].fx0=3+140*(i%2)+(j/16)*34;
  221.       fedch[i][j].fy0=5+(i/2)*52+(j%16)*3;
  222.       }
  223.   for (i=0;i<14;i++)
  224.     for (j=0;j<6;j++)
  225.       for (k=0;k<16;k++)
  226.       {
  227.         fplch[i][j][k].pmt=0;
  228.         fplch[i][j][k].mb[0]=-1;
  229.         fplch[i][j][k].mb[1]=-1;
  230.         fplch[i][j][k].mb[2]=-1;
  231.         fplch[i][j][k].mb[3]=-1;
  232.         fplch[i][j][k].sn[0][0][0]=0;
  233.         fplch[i][j][k].sn[0][1][0]=0;
  234.         fplch[i][j][k].sn[1][0][0]=0;
  235.         fplch[i][j][k].sn[1][1][0]=0;
  236.       }
  237.  
  238.   for (i=0;i<14;i++)
  239.     {
  240.       x0=FPXOFF+SMXOFF*(i%7);
  241.       y0=FPYOFF+SMYOFF*(i/7);
  242.       sprintf (cmd, "%s create rectangle %f %f %f %f "
  243.                     "-fill #AABBCC -outline \"\" -tags \"sm\"",
  244.                     argv[1], sc*x0, sc*y0, sc*(x0+SMXS), sc*(y0+SMYS));
  245.       Tcl_Eval(interp, cmd);
  246.     }
  247.  
  248.   sprintf(cmd, "%s/ASD.dat",
  249.           Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
  250.   if ((fid=fopen(cmd, "r")) == NULL) return TCL_ERROR;
  251.   while ( fgets( cmd, 100, fid) != NULL)
  252.     if ((status=sscanf( cmd," M%d ASD%d %d %d %d %d %d %d ",
  253.           &pmt,&asd,&sm,&bbr,&bbc,&mb,&db,&con))==8)
  254.       {
  255.       if (sm>6)
  256.         {
  257.         sm=20-sm;
  258.         bbr=15-bbr;
  259.         bbc=5-bbc;
  260.         }
  261.       ccon=db*16+con;
  262.       x0=FPXOFF+SMXOFF*(sm%7)+BBXS*bbc;
  263.       y0=FPYOFF+SMYS+SMYOFF*(sm/7)-BBYS*(bbr+1);
  264.  
  265.       fx0=fedch[mb][ccon].fx0;
  266.       fy0=fedch[mb][ccon].fy0;
  267.  
  268.       if (fedch[mb][ccon].pmt)
  269.         {
  270.           printf("evinit: channel already mapped\n");
  271.           printf(">>\n");
  272.         }
  273.        else if (fplch[sm][bbc][bbr].mb[asd] != -1)
  274.               {
  275.           printf("evinit: area already mapped\n");
  276.           printf(">>\n");
  277.               }
  278.              else
  279.               {
  280.                fedch[mb][ccon].pmt=pmt;
  281.                fedch[mb][ccon].asd=asd;
  282.                fedch[mb][ccon].sm=sm;
  283.                fedch[mb][ccon].bbr=bbr;
  284.                fedch[mb][ccon].bbc=bbc;
  285.                fedch[mb][ccon].x0=x0;
  286.                fedch[mb][ccon].y0=y0;
  287.                fplch[sm][bbc][bbr].pmt=pmt;
  288.                fplch[sm][bbc][bbr].mb[asd]=mb;
  289.                fplch[sm][bbc][bbr].wi[asd]=ccon;
  290.                if (!asd)
  291.                {
  292.                  fplch[sm][bbc][bbr].x0=x0;
  293.                  fplch[sm][bbc][bbr].y0=y0;
  294.                }
  295. /*
  296.                fplch[sm][bbc][bbr].x0=fx0;
  297.                fplch[sm][bbc][bbr].y0=fy0;
  298. */
  299.                /*        printf("mb=%d con=%d pmt=%d\n",mb,con,pmt); */
  300.               }
  301.       switch (pmt)
  302.          {
  303.          case 4:
  304.            sprintf (cmd, "%s create rectangle %f %f %f %f "
  305.                     "-fill $m4color -outline \"\" -tags \"m4\"",
  306.                     argv[1], sc*x0, sc*y0, sc*(x0+BBXS), sc*(y0+BBYS));
  307.            Tcl_Eval(interp, cmd);
  308.            sscanf((char *) Tcl_GetStringResult(interp)," %d ", &fedch[mb][ccon].id);
  309.            sprintf (cmd, "%s create rectangle %d %d %d %d "
  310.                     "-fill $m4color -outline \"\" -tags \"m4\"",
  311.                     argv[2], fx0, fy0, fx0+32, fy0+2);
  312.            Tcl_Eval(interp, cmd);
  313.            sscanf((char *) Tcl_GetStringResult(interp)," %d ", &fplch[sm][bbc][bbr].id[asd]);
  314.            break;
  315.          case 16:
  316.            if (fpon) casd=asd^1; else casd=asd;
  317.            sprintf (cmd, "%s create rectangle %f %f %f %f "
  318.                     "-fill $m16color -outline \"\" -tags \"m16\"",
  319.                     argv[1], sc*(x0+casd*BBXS/4), sc*y0,
  320.                     sc*(x0+(casd+1)*BBXS/4), sc*(y0+BBYS));
  321.            Tcl_Eval(interp, cmd);
  322.            sscanf( (char *) Tcl_GetStringResult(interp)," %d ", &fedch[mb][ccon].id);
  323.            sprintf (cmd, "%s create rectangle %d %d %d %d "
  324.                     "-fill $m16color -outline \"\" -tags \"m16\"",
  325.                     argv[2], fx0, fy0, fx0+32, fy0+2);
  326.            Tcl_Eval(interp, cmd);
  327.            sscanf((char *) Tcl_GetStringResult(interp)," %d ", &fplch[sm][bbc][bbr].id[asd]);
  328.          }
  329.       }
  330.   fclose(fid);
  331.  
  332.   sprintf(cmd, "%s/pm.dat",
  333.           Tcl_GetVar(interp, "config_dir", TCL_GLOBAL_ONLY));
  334.   if ((fid=fopen(cmd, "r")) == NULL) return TCL_ERROR;
  335.   while ( fgets( cmd, 100, fid) != NULL)
  336.     if (cmd[1]=='#')
  337.     {
  338.       fgets( cmd, 100, fid);
  339.       if ((fgets( cmd, 100, fid))&&
  340.           ((status=sscanf(cmd,"\t  type  R5600-00-M%d", &pmt))==1))
  341.         if ((fgets( cmd, 100, fid))&&
  342.             ((status=sscanf(cmd,"\t  serial_no\t%s", s1))==1))
  343.           if ((fgets( cmd, 100, fid))&&
  344.               ((status=sscanf(cmd,"\t  position\t%d\t%d\t%d", &sm, &bbr, &bbc))==3))
  345.           {
  346.             if (sm>6)
  347.             {
  348.               sm=20-sm;
  349.               bbr=31-bbr;
  350.               bbc=11-bbc;
  351.             }
  352.             strcpy(fplch[sm][bbc/2][bbr/2].sn[bbc%2][bbr%2], s1);
  353.           }
  354.     }
  355.   fclose(fid);
  356.  
  357.  
  358.   for (i=0;i<14;i++)
  359.     for (j=0;j<6;j++)
  360.       for (k=0;k<16;k++)
  361. /*        if (fplch[i][j][k].pmt) */
  362.           for (ii=0;ii<2;ii++)
  363.             for (jj=0;jj<2;jj++)
  364.               if (fplch[i][j][k].sn[ii][jj][0]=='e')
  365.         {
  366.            sprintf (cmd, "%s create rectangle %f %f %f %f "
  367.                     "-fill #FFFF77 -outline \"\" -tags \"empty\"",
  368.                     argv[1],
  369.                     sc*(fplch[i][j][k].x0+ii*BBXS/2),
  370.                     sc*(fplch[i][j][k].y0+(1-jj)*BBYS/2),
  371.                     sc*(fplch[i][j][k].x0+(ii+1)*BBXS/2),
  372.                     sc*(fplch[i][j][k].y0+(2-jj)*BBYS/2));
  373.            Tcl_Eval(interp, cmd);
  374.  
  375.         }
  376.  
  377.   return TCL_OK;
  378. }
  379.  
  380. int Evd_evopen( ClientData clientData, Tcl_Interp *interp,
  381.                         int argc, CONST char *argv[])
  382. {
  383.   int evhot;
  384.   char fname[200];
  385.   FILE *fhot;
  386.  
  387.   strcpy(fname,argv[1]);
  388.   if (open_data_file(fname)) return TCL_ERROR;
  389.   curev=1;
  390.  
  391.   sscanf(Tcl_GetVar(interp, "evhot", TCL_GLOBAL_ONLY), " %d ", &evhot);
  392.   if (evhot)
  393.   {
  394.     (void) find_hot();
  395.   }
  396.    else
  397.   {
  398.     if ((fhot=fopen("hotchannels.raw","r")))
  399.     {
  400.       (void) fread ((void *) hotchannels, 1, MAXFED*128, fhot);
  401.       fclose(fhot);
  402.     }
  403.      else (void) find_hot();
  404.   }
  405.   return TCL_OK;
  406.  
  407. }
  408.  
  409. int Evd_evgoto( ClientData clientData, Tcl_Interp *interp,
  410.                         int argc, CONST char *argv[])
  411. {
  412.   int pos;
  413.   sscanf(argv[1]," %d ", &curev);
  414.  
  415.   pos=goto_event(curev);
  416.   if (pos != curev)
  417.     {
  418.     goto_event(pos);
  419.     curev=pos;
  420.     }
  421.   return TCL_OK;
  422. }
  423.  
  424. int Evd_evclose( ClientData clientData, Tcl_Interp *interp,
  425.                         int argc, CONST char *argv[])
  426. {
  427.   if (close_data_file()) return TCL_ERROR;
  428.   return TCL_OK;
  429. }
  430.  
  431. int Evd_evplot( ClientData clientData, Tcl_Interp *interp,
  432.                         int argc, CONST char *argv[])
  433. {
  434.   int i, j, k, ii, jj, nr, nhits, map, bx, evmask;
  435.   float sc;
  436.   unsigned char b;
  437.   char cmd[CMDLEN];
  438.  
  439.   sscanf(argv[2]," %f ", &sc);
  440.   sscanf(Tcl_GetVar(interp, "evmap", TCL_GLOBAL_ONLY), " %d ", &map);
  441.   sscanf(Tcl_GetVar(interp, "evmask", TCL_GLOBAL_ONLY), " %d ", &evmask);
  442.   nhits=0;
  443.  
  444.   if ((nr=get_nextev(fedr, 0x500, 1)))
  445.     {
  446.     bx=fedr[0].bxn;
  447.     for (k=0;k<nr;k++) if (fedr[k].fedid<MAXFED)
  448.       {
  449.       if (evmask) mask_hot(fedr[k].fedid,(char *)fedr[k].data);
  450.       if (bx!=fedr[k].bxn)
  451.         printf("bx=%d, bxn=%d\n", bx, fedr[k].bxn);
  452.       for (ii=0;ii<128;ii++)
  453.         {
  454.         i=ii/2;
  455.         if (fedr[k].data[ii])
  456.           for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
  457.             if (fedr[k].data[ii]&b)
  458.               switch (fedch[fedr[k].fedid][i].pmt)
  459.                 {
  460.                 case 4:
  461.                   nhits++;
  462.                   sprintf (cmd, "%s create rectangle %f %f %f %f "
  463.                            "-fill $evcolor -outline \"\" -tags \"ev\"",
  464.                            argv[1],
  465.                            sc*(fedch[fedr[k].fedid][i].x0+m4x[j]),
  466.                            sc*(fedch[fedr[k].fedid][i].y0+m4y[j]),
  467.                            sc*(fedch[fedr[k].fedid][i].x0+m4x[j]+BBXS/4),
  468.                            sc*(fedch[fedr[k].fedid][i].y0+m4y[j]+BBYS/4));
  469.                   Tcl_Eval(interp, cmd);
  470.                   if (!map)
  471.                     {
  472.                     sprintf (cmd, "%s create rectangle %d %d %d %d "
  473.                                 "-fill $evcolor -outline \"\" -tags \"ev\"",
  474.                                 argv[3],
  475.                                 fedch[fedr[k].fedid][i].fx0+2*j,
  476.                                 fedch[fedr[k].fedid][i].fy0,
  477.                                 fedch[fedr[k].fedid][i].fx0+2*j+2,
  478.                                 fedch[fedr[k].fedid][i].fy0+2);
  479.                     Tcl_Eval(interp, cmd);
  480.                     }
  481.                   break;
  482.                 case 16:
  483.                   nhits++;
  484.                   sprintf (cmd, "%s create rectangle %f %f %f %f "
  485.                            "-fill $evcolor -outline \"\" -tags \"ev\"",
  486.                            argv[1],
  487.                            sc*(fedch[fedr[k].fedid][i].x0+
  488.                            m16x[fedch[fedr[k].fedid][i].asd][j]),
  489.                            sc*(fedch[fedr[k].fedid][i].y0+
  490.                            m16y[fedch[fedr[k].fedid][i].asd][j]),
  491.                            sc*(fedch[fedr[k].fedid][i].x0+
  492.                            m16x[fedch[fedr[k].fedid][i].asd][j]+BBXS/8),
  493.                            sc*(fedch[fedr[k].fedid][i].y0+
  494.                            m16y[fedch[fedr[k].fedid][i].asd][j]+BBYS/8));
  495.                   Tcl_Eval(interp, cmd);
  496.                   if (!map)
  497.                     {
  498.                     sprintf (cmd, "%s create rectangle %d %d %d %d "
  499.                                 "-fill $evcolor -outline \"\" -tags \"ev\"",
  500.                                 argv[3],
  501.                                 fedch[fedr[k].fedid][i].fx0+2*j,
  502.                                 fedch[fedr[k].fedid][i].fy0,
  503.                                 fedch[fedr[k].fedid][i].fx0+2*j+2,
  504.                                 fedch[fedr[k].fedid][i].fy0+2);
  505.                     Tcl_Eval(interp, cmd);
  506.                     }
  507.                 }
  508.         }
  509.       }
  510.     sprintf(cmd, ".ev.tb.curev delete 0 end ");
  511.     Tcl_Eval(interp, cmd);
  512.     sprintf(cmd, ".ev.tb.curev insert 0 \"%d\" ", curev);
  513.     Tcl_Eval(interp, cmd);
  514.     sprintf(cmd, ".ev.det delete te ; set ura [clock format %d "
  515.                  "-format \"%%a %%b %%d %%H:%%M:%%S %%Y\"] ; "
  516.                  ".ev.det create text [expr $evmag*345] [expr $evmag*10] "
  517.                  "-text \"EVENT: %d %d %d $ura\" "
  518.                  "-fill \"#c0c000\" -anchor e -font $tfont -tags te ",
  519.                  evdata.event_time, logh.evt, evdata.run_number,
  520.                  evdata.exp_number);
  521.     /*                 logh.dtm, logh.evt, logh.run, logh.exp); */
  522.     Tcl_Eval(interp, cmd);
  523.     sprintf((char *) Tcl_GetStringResult(interp), "evplot: event#=%d #hits=%d #feds=%d bx=%d",
  524.             (curev++), nhits, nr, evdata.physBX);
  525.     }
  526.    else
  527.     {
  528.     Tcl_Eval(interp, "tk_messageBox -message "
  529.              "\"RUN WITHOUT RICH\" -icon warning -type ok");
  530.     }
  531.   return TCL_OK;
  532. }
  533.  
  534. int Evd_evscan( ClientData clientData, Tcl_Interp *interp,
  535.                         int argc, CONST char *argv[])
  536. {
  537.   int i, j, k, ii, jj, nr, pos, nh, pbx, norm, dif, evmask, sreset;
  538.   unsigned short b;
  539.   uint32_t prev[5000];
  540.   double nhy[2000] ,nbx[220] ,hbx[220], nco4y[101], nco16y[101];
  541.   double nrepy[100], nrep64y[100];
  542.   char cmd[CMDLEN];
  543.  
  544.   sscanf(Tcl_GetVar(interp, "evmask", TCL_GLOBAL_ONLY), " %d ", &evmask);
  545.   sscanf(Tcl_GetVar(interp, "sreset", TCL_GLOBAL_ONLY), " %d ", &sreset);
  546.  
  547.   for (i=0;i<5000;i++) prev[i]=0;
  548.   for (i=0;i<2000;i++) nhy[i]=0.;
  549.   for (i=0;i<220;i++)
  550.     {
  551.     nbx[i]=0.;
  552.     hbx[i]=0.;
  553.     }
  554.   for (i=0;i<101;i++)
  555.     {
  556.     nco4y[i]=0.;
  557.     nco16y[i]=0.;
  558.     }
  559.   for (i=0;i<100;i++)
  560.     {
  561.     nrepy[i]=0.;
  562.     nrep64y[i]=0.;
  563.     }
  564.   /*  if (Blt_GetVector(interp, "nhy", &nhyV) != TCL_OK) return TCL_ERROR;
  565.    */
  566.   if (sreset)
  567.   {
  568.     for (k=0;k<MAXFED;k++)
  569.       for (i=0;i<64;i++)
  570.         for (j=0;j<16;j++)
  571.           hits.data[k][i][j]=0;
  572.     hits.evt=0;
  573.   }
  574.  
  575.   if (reopen_data_file()) return TCL_ERROR;
  576.  
  577.   while ((nr=get_nextev(fedr, 0x500, 0)))
  578.     {
  579.     nh=0;
  580.     for (k=0;k<nr;k++)
  581.       {
  582.       if (evmask) mask_hot(fedr[k].fedid,(char *)fedr[k].data);
  583.       for (ii=0;ii<128;ii++)
  584.         {
  585.         i=ii/2;
  586.         if (fedr[k].data[ii])
  587.           for (jj=0,j=8*(ii%2),b=1;jj<8;jj++,j++,b<<=1)
  588.             if (fedr[k].data[ii]&b)
  589.               {
  590.               if (fedch[fedr[k].fedid][i].pmt) nh++;
  591.               hits.data[fedr[k].fedid][i][j]++;
  592.               }
  593.         }
  594.       }
  595.     hits.evt++;
  596.     pbx=evdata.physBX;
  597.     if ( (unsigned short) pbx > 219) pbx=219;
  598.     nbx[pbx]+=1.;
  599.     hbx[pbx]+=(double)nh;
  600.     nh/=10;
  601.     if (nh > 1999) nh=1999;
  602.     nhy[nh]+=1.;
  603.     if (nh<5000)
  604.       {
  605.       if (prev[nh])
  606.         {
  607.         dif=hits.evt-prev[nh];
  608.         if (dif<100) nrepy[dif]++;
  609.         if ((dif>>=6)<100) nrep64y[dif]++;
  610.         }
  611.       prev[nh]=hits.evt;
  612.       }
  613.     }
  614.   hits.max=0;
  615.   hits.min=0x7fffffff;
  616.   hits.ent=0;
  617.   norm=hits.evt+1;
  618.   for (i=0;i<MAXFED;i++)
  619.     for (j=0;j<64;j++)
  620.       if (fedch[i][j].pmt)
  621.         for (k=0;k<16;k++)
  622.           {
  623.           if (fedch[i][j].pmt == 4)
  624.             if (hits.data[i][j][k])
  625.               nco4y[(100*hits.data[i][j][k]/norm)+1]+=1.;
  626.              else
  627.               nco4y[0]+=1.;
  628.            else
  629.             if (hits.data[i][j][k])
  630.               nco16y[(100*hits.data[i][j][k]/norm)+1]+=1.;
  631.              else
  632.               nco16y[0]+=1.;
  633.           hits.ent+=hits.data[i][j][k];
  634.           if (hits.data[i][j][k]>hits.max) hits.max=hits.data[i][j][k];
  635.           if (hits.data[i][j][k]<hits.min) hits.min=hits.data[i][j][k];
  636.           }
  637.  
  638.   for (i=0;i<2000;i++)
  639.     {
  640.     sprintf(cmd, "set nhy(%d) %f ", i, nhy[i]);
  641.     Tcl_Eval(interp, cmd);
  642.     }
  643.   for (i=0;i<220;i++)
  644.     {
  645.     sprintf(cmd, "set nbxy(%d) %f ", i, nbx[i]);
  646.     Tcl_Eval(interp, cmd);
  647.     if (nbx[i]) hbx[i]/=nbx[i];
  648.     sprintf(cmd, "set hbxy(%d) %f ", i, hbx[i]);
  649.     Tcl_Eval(interp, cmd);
  650.     }
  651.   for (i=0;i<101;i++)
  652.     {
  653.     sprintf(cmd, "set nco4y(%d) %f ", i, nco4y[i]);
  654.     Tcl_Eval(interp, cmd);
  655.     sprintf(cmd, "set nco16y(%d) %f ", i, nco16y[i]);
  656.     Tcl_Eval(interp, cmd);
  657.     }
  658.   for (i=0;i<100;i++)
  659.     {
  660.     sprintf(cmd, "set nrepy(%d) %f ", i, nrepy[i]);
  661.     Tcl_Eval(interp, cmd);
  662.     sprintf(cmd, "set nrep64y(%d) %f ", i, nrep64y[i]);
  663.     Tcl_Eval(interp, cmd);
  664.     }
  665.   /*  if (Blt_ResetVector(nhyV, nhyd, 2000, 2000, TCL_VOLATILE) != TCL_OK)
  666.       return TCL_ERROR; */
  667.  
  668.   if (reclose_data_file()) return TCL_ERROR;
  669.   return TCL_OK;
  670. }
  671.  
  672. int Evd_evscanplot( ClientData clientData, Tcl_Interp *interp,
  673.                         int argc, CONST char *argv[])
  674. {
  675.   int i, j, k, coli, map, rev, evm4n;
  676.   float sc, sm, norm, norm1, evn;
  677.   char col[17][10]={"000000","111111","222222","333333",
  678.                     "444444","555555","666666","777777",
  679.                     "888888","999999","AAAAAA","BBBBBB",
  680.                     "CCCCCC","DDDDDD","EEEEEE","FFFFFF","FF0000"};
  681.   char cmd[CMDLEN];
  682.  
  683.   sscanf(argv[2]," %f ", &sc);
  684.   sscanf(argv[3]," %f ", &sm);
  685.   sscanf(Tcl_GetVar(interp, "evnorm", TCL_GLOBAL_ONLY), " %f ", &evn);
  686.   sscanf(Tcl_GetVar(interp, "evm4norm", TCL_GLOBAL_ONLY), " %d ", &evm4n);
  687.   sscanf(Tcl_GetVar(interp, "evreverse", TCL_GLOBAL_ONLY), " %d ", &rev);
  688.   sscanf(Tcl_GetVar(interp, "evmap", TCL_GLOBAL_ONLY), " %d ", &map);
  689.   if (evn) norm=sm*(float)(hits.evt)/100.;
  690.    else norm=sm*(float)(hits.max)/100.;
  691.  
  692.   for (i=0;i<MAXFED;i++)
  693.     for (j=0;j<64;j++)
  694.     {
  695.       if (evm4n && (fedch[i][j].pmt==4))
  696.         norm1=4.*norm;
  697.        else
  698.         norm1=norm;
  699.       for (k=0;k<16;k++)
  700.         if (hits.data[i][j][k]||map)
  701.           {
  702.           coli=(int)(16.*(float)hits.data[i][j][k]/norm1);
  703.           if (rev) coli^=0xF;
  704.           if (coli>16) coli=16;
  705.           if (coli<0) coli=0;
  706.           if (!map)
  707.             {
  708.             sprintf (cmd, "%s create rectangle %d %d %d %d "
  709.                          "-fill #%s -outline \"\" -tags \"sc c%d\"",
  710.                          argv[4],
  711.                          fedch[i][j].fx0+2*k,
  712.                          fedch[i][j].fy0,
  713.                          fedch[i][j].fx0+2*k+2,
  714.                          fedch[i][j].fy0+2,
  715.                          col[coli], coli);
  716.             Tcl_Eval(interp, cmd);
  717.             }
  718.           switch (fedch[i][j].pmt)
  719.             {
  720.             case 4:
  721.               sprintf (cmd, "%s create rectangle %f %f %f %f "
  722.                            "-fill #%s -outline \"\" -tags \"sc c%d\"",
  723.                            argv[1],
  724.                            sc*(fedch[i][j].x0+m4x[k]),
  725.                            sc*(fedch[i][j].y0+m4y[k]),
  726.                            sc*(fedch[i][j].x0+m4x[k]+BBXS/4),
  727.                            sc*(fedch[i][j].y0+m4y[k]+BBYS/4),
  728.                            col[coli], coli);
  729.               Tcl_Eval(interp, cmd);
  730.               break;
  731.             case 16:
  732.               sprintf (cmd, "%s create rectangle %f %f %f %f "
  733.                            "-fill #%s -outline \"\" -tags \"sc c%d\"",
  734.                            argv[1],
  735.                            sc*(fedch[i][j].x0+
  736.                            m16x[fedch[i][j].asd][k]),
  737.                            sc*(fedch[i][j].y0+
  738.                            m16y[fedch[i][j].asd][k]),
  739.                            sc*(fedch[i][j].x0+
  740.                            m16x[fedch[i][j].asd][k]+BBXS/8),
  741.                            sc*(fedch[i][j].y0+
  742.                            m16y[fedch[i][j].asd][k]+BBYS/8),
  743.                            col[coli], coli);
  744.               Tcl_Eval(interp, cmd);
  745.               break;
  746.             }
  747.           }
  748.     }
  749.   sprintf((char *) Tcl_GetStringResult(interp), "scan: #events=%u avg=%.2f channel:"
  750.                           " max=%u min=%u",
  751.                           hits.evt, (float)hits.ent/(float)hits.evt,
  752.                           hits.max, hits.min);
  753.   return TCL_OK;
  754. }
  755.  
  756. int Evd_evstatl( ClientData clientData, Tcl_Interp *interp,
  757.                         int argc, CONST char *argv[])
  758. {
  759.   int hv,hvch;
  760.   int x, y, wid, fpon, scan;
  761.   int mb, db, con, ch, ccon, sm , bbr, bbc, asd, px, py;
  762.   float sc, x0, x1, y0, y1;
  763.   char cmd[CMDLEN], *sn;
  764.  
  765.   sscanf(argv[1]," %d ", &wid);
  766.   sscanf(argv[2]," %d ", &x);
  767.   sscanf(argv[3]," %d ", &y);
  768.   Tcl_Eval(interp, ".ev.det delete hl");
  769.   Tcl_Eval(interp, ".ev.fed delete hl");
  770.   sscanf(Tcl_GetVar(interp, "evmap", TCL_GLOBAL_ONLY), " %d ", &fpon);
  771.   sscanf(Tcl_GetVar(interp, "new_scan", TCL_GLOBAL_ONLY), " %d ", &scan);
  772.  
  773.   switch (wid)
  774.     {
  775.     case 0:
  776.       sscanf(argv[4]," %f ", &sc);
  777.       x=x/(int)sc-FPXOFF;
  778.       y=y/(int)sc-FPYOFF;
  779. /*      if (x<0 || x>=FPXOFF+7*SMXOFF || y<0 || y>=FPYOFF+2*SMYOFF) break; */
  780.       if (x<0 || x>=7*SMXOFF || y<0 || y>=2*SMYOFF) break;
  781.       sm=x/SMXOFF+7*(y/SMYOFF);
  782.       bbr=(y%SMYOFF)/BBYS;
  783.       bbc=(x%SMXOFF)/BBXS;
  784.       px=(x%SMXOFF)%BBXS;
  785.       py=(y%SMYOFF)%BBYS;
  786.       if ((sm<14)&&(bbr<16)&&(bbc<6)&&(px<16)&&(py<16))
  787.         {
  788.         bbr=15-bbr;
  789.         asd=0;
  790.         ch=m4c[px/2][py/2];
  791.         sn=fplch[sm][bbc][bbr].sn[px/4][1-py/4];
  792.         Tcl_SetVar(interp, "pmtsntmp", sn, TCL_GLOBAL_ONLY);
  793.         switch(fplch[sm][bbc][bbr].pmt)
  794.           {
  795.           case 16:
  796.             asd=m16a[px][py];
  797.             ch=m16c[px][py];
  798.           case 4:
  799.             if ((mb=fplch[sm][bbc][bbr].mb[asd]) == -1) break;
  800.             ccon=fplch[sm][bbc][bbr].wi[asd];
  801.             db=ccon/16;
  802.             con=ccon%16;
  803.             sprintf(cmd, ".ev.fed coords %d", fplch[sm][bbc][bbr].id[asd]);
  804.             Tcl_Eval(interp, cmd);
  805.             sscanf((char *) Tcl_GetStringResult(interp), " %f %f %f %f ", &x0, &y0, &x1, &y1);
  806.             x0-=1.; y0-=1.; x1+=1.; y1+=1.;
  807.             sprintf(cmd, ".ev.fed create rectangle %f %f %f %f "
  808.                          "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
  809.                          x0, y0, x1, y1);
  810.             Tcl_Eval(interp, cmd);
  811.             sprintf(cmd, ".ev.det coords %d", fedch[mb][ccon].id);
  812.             Tcl_Eval(interp, cmd);
  813.             sscanf((char *) Tcl_GetStringResult(interp), " %f %f %f %f ", &x0, &y0, &x1, &y1);
  814.             x0-=1.; y0-=1.; x1+=1.; y1+=1.;
  815.             sprintf(cmd, ".ev.det create rectangle %f %f %f %f "
  816.                          "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
  817.                          x0, y0, x1, y1);
  818.             Tcl_Eval(interp, cmd);
  819.             hv=-1;     
  820.             hvch=-1;   
  821.             if (!scan)
  822.               sprintf((char *) Tcl_GetStringResult(interp), "mb:%2d db:%d con:%2d sm:%2d"
  823.                    " r:%2d c:%d asd:%d ch:%2d SN:%s hv:%3d hvch%3d entr:%d",
  824.                       mb, db, con, sm, bbr, bbc, asd, ch, sn, hv,hvch,
  825.                       hits.data[mb][ccon][ch]);
  826.              else
  827.               sprintf((char *) Tcl_GetStringResult(interp),
  828.                       "mb:%2d db:%d con:%2d sm:%2d r:%2d c:%d asd:%d ch:%2d SN:%s hv:%3d hvch%3d",
  829.                       mb, db, con, sm, bbr, bbc, asd, ch, sn, hv,hvch);
  830.             break;
  831.           }
  832.         }
  833.       break;
  834.     case 1:
  835.       y-=5;
  836.       x-=3;
  837.       if (x<0 || y<0) break;
  838.       mb=2*(y/52)+x/140;
  839.       con=(y%52)/3;
  840.       db=(x%140)/34;
  841.       ch=(x%34)/2;
  842.       if ((mb<28)&&(db<4)&&(con<16)&&(ch<16))
  843.         {
  844.         ccon=db*16+con;
  845.         if (fedch[mb][ccon].pmt)
  846.           {
  847.           sm=fedch[mb][ccon].sm;
  848.           bbr=fedch[mb][ccon].bbr;
  849.           bbc=fedch[mb][ccon].bbc;
  850.           asd=fedch[mb][ccon].asd;
  851.           sprintf(cmd, ".ev.det coords %d", fedch[mb][ccon].id);
  852.           Tcl_Eval(interp, cmd);
  853.           sscanf((char *) Tcl_GetStringResult(interp), " %f %f %f %f ", &x0, &y0, &x1, &y1);
  854.           x0-=1.; y0-=1.; x1+=1.; y1+=1.;
  855.           sprintf(cmd, ".ev.det create rectangle %f %f %f %f "
  856.                        "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
  857.                        x0, y0, x1, y1);
  858.           Tcl_Eval(interp, cmd);
  859.           sprintf(cmd, ".ev.fed coords %d", fplch[sm][bbc][bbr].id[asd]);
  860.           Tcl_Eval(interp, cmd);
  861.           sscanf((char *) Tcl_GetStringResult(interp), " %f %f %f %f ", &x0, &y0, &x1, &y1);
  862.           x0-=1.; y0-=1.; x1+=1.; y1+=1.;
  863.           sprintf(cmd, ".ev.fed create rectangle %f %f %f %f "
  864.                        "-fill \"\" -outline #FF00FF -width 2 -tags \"hl\"",
  865.                        x0, y0, x1, y1);
  866.           Tcl_Eval(interp, cmd);
  867.           if (!scan)
  868.             sprintf((char *) Tcl_GetStringResult(interp), "mb:%2d db:%d con:%2d sm:%2d"
  869.                     " r:%2d c:%d asd:%d ch:%2d entr:%d",
  870.                     mb, db, con, sm, bbr, bbc, asd, ch,
  871.                     hits.data[mb][ccon][ch]);
  872.            else
  873.             sprintf((char *) Tcl_GetStringResult(interp),
  874.                     "mb:%2d db:%d con:%2d sm:%2d r:%2d c:%d asd:%d ch:%2d",
  875.                     mb, db, con, sm, bbr, bbc, asd, ch);
  876.           }
  877.         }
  878.       break;
  879.     }
  880.  
  881.   return TCL_OK;
  882. }
  883.  
  884. int Evd_evdump( ClientData clientData, Tcl_Interp *interp,
  885.                         int argc, CONST char *argv[])
  886. {
  887.   FILE *fout;
  888.  
  889.   if (reopen_data_file()) return TCL_ERROR;
  890.   if ((fout=fopen(argv[1], "w"))==NULL) return TCL_ERROR;
  891.  
  892.   while (dump_cmp(fout, 0x500));
  893.  
  894.   if (fclose(fout)==EOF) return TCL_ERROR;
  895.   if (reclose_data_file()) return TCL_ERROR;
  896.  
  897.   return TCL_OK;
  898. }
  899.  
  900.  
  901. /*
  902. int Evd_proto( ClientData clientData, Tcl_Interp *interp,
  903.                         int argc, CONST char *argv[])
  904. {
  905.   return TCL_OK;
  906. }
  907. */
  908.  
  909. int Evd_Init(Tcl_Interp *interp)
  910. {
  911.   if (is_little_endian())
  912.     printf("Evd running on LittleEndian machine\n");
  913.    else
  914.     printf("Evd running on BigEndian machine\n");
  915.   Tcl_PkgProvide(interp, "Evd", "1.0");
  916.  
  917.   Tcl_CreateCommand(interp, "evinit", Evd_evinit, (ClientData) NULL,
  918.                   (Tcl_CmdDeleteProc *) NULL);
  919.   Tcl_CreateCommand(interp, "evopen", Evd_evopen, (ClientData) NULL,
  920.                   (Tcl_CmdDeleteProc *) NULL);
  921.   Tcl_CreateCommand(interp, "evgoto", Evd_evgoto, (ClientData) NULL,
  922.                   (Tcl_CmdDeleteProc *) NULL);
  923.   Tcl_CreateCommand(interp, "evclose", Evd_evclose, (ClientData) NULL,
  924.                   (Tcl_CmdDeleteProc *) NULL);
  925.   Tcl_CreateCommand(interp, "evplot", Evd_evplot, (ClientData) NULL,
  926.                   (Tcl_CmdDeleteProc *) NULL);
  927.   Tcl_CreateCommand(interp, "evscan", Evd_evscan, (ClientData) NULL,
  928.                   (Tcl_CmdDeleteProc *) NULL);
  929.   Tcl_CreateCommand(interp, "evscanplot", Evd_evscanplot, (ClientData) NULL,
  930.                   (Tcl_CmdDeleteProc *) NULL);
  931.   Tcl_CreateCommand(interp, "evstatl", Evd_evstatl, (ClientData) NULL,
  932.                   (Tcl_CmdDeleteProc *) NULL);
  933.   Tcl_CreateCommand(interp, "evdump", Evd_evdump, (ClientData) NULL,
  934.                   (Tcl_CmdDeleteProc *) NULL);
  935.   return TCL_OK;
  936. }
  937.  
  938.  
  939. #ifdef __cplusplus
  940. }
  941. #endif
  942.