$GOOPROC;

#define PI M_PI
#define SIND(phi) sin((phi)*PI/180E0)
#define COSD(phi) cos((phi)*PI/180E0)

$PARDCL( Q_CAL(8) ) type(3) init( (8)1E0 );
$PARDCL( phi ) type(3);
$PARDCL( x0 ) type(3);
$PARDCL( y0 ) type(3);
$PARDCL( ae ) type(3);
$PARDCL( be ) type(3);
$PARDCL( rmin ) type(3);
$PARDCL( rmax ) type(3);
$PARDCL( emev ) type(3);

$AGEN( ADC_E(8) ) NCND(1) LIMITS(1,4096); 
$AGEN( Q_E(3) ) LIMITS(1,4096);
$AGEN( E_E ) LIMITS(1,4096);
$AGEN( PAT_E ) LIMITS(0,15);
$AGEN( QSUM_E ) NCND(1) LIMITS(1,4096); 

$AGEN( X_E ) limits(1,500);
$AGEN( Y_E ) limits(1,500);
$AGEN( XY_E ) limits(1,500,1,500);
$AGEN( XY ) limits(-314,314,1,500) bins(2,1);
$AGEN( theta_v ) limits(-314,314,0,3500)   bins(2,5) type(24);
$AGEN( vx_vy   ) limits(-350,350,-350,350) bins(2,2) type(24);
$AGEN( theta_e ) limits(-314,314,0,16500)  bins(2,5) type(24);

/*
$ ACDEF( ADC_E(1), 1, 10,3840 );
$ ACDEF( ADC_E(2), 1, 10,3840 );
$ ACDEF( ADC_E(3), 1, 10,3840 );
$ ACDEF( ADC_E(4), 1, 10,3840 );
$ ACDEF( ADC_E(5), 1, 10,3840 );
$ ACDEF( ADC_E(6), 1, 10,3840 );
$ ACDEF( ADC_E(7), 1, 10,3840 );
$ ACDEF( ADC_E(8), 1, 10,3840 );
*/

$ANTRY;


$EVENT( p(8192) );
{
int ii;
short iADCE[8], iQ[8], iSumE;
float rEnergy, rXE, rYE, rHelp;
float rEEle, rvEle, rX, rY, rZ, rAlpha;
float rvPara, rvPerp, rEkin;
float rXIncr, rEIncr, rCIncr;
float rX0, rY0, rPHI;
int bFlagFrag = 0, bFlagE = 0;
unsigned long lPattern;

struct SIOGOOSYEVT10 *psE10;
struct SIOGOOSYEVT101SUB *psE101S;
struct SIOGOOSYEVT101DATA *psE101D;

                                      /* event address */
   psE10 = (struct SIOGOOSYEVT10 *) p_pars;
                                      /* subevent address */
   psE101S = (struct SIOGOOSYEVT101SUB *) (psE10+1);
                                      /* subevent data */
   psE101D = (struct SIOGOOSYEVT101DATA *) (psE101S+1);
    
   for( ii=0; ii<8; ii++ ) {
      iADCE[ii] = psE101D[ii].iValue;
      if ( ( iADCE[ii] < 10 ) || ( iADCE[ii] > 3840 ) ) iADCE[ii] = 5;
      $ANAL( ADC_E(ii+1), iADCE[ii] ); 
   }

   rEnergy = (float) iADCE[4];  
   $ANAL( E_E, rEnergy );
                    /* sortiere adc-werte in zu verwertende spektren */        
   for( ii=0; ii<3; ii++ ) {
      $ANAL( Q_E(ii+1), iADCE[ii] ); 
   }

   bFlagFrag = 0;
   bFlagE = 0;
   lPattern = 0;
                    /* nachsehen ob ereignisse im adc-fenster liegen, 
                       bzw. ob ein segment fehlt */
   for ( ii=0; ii<3; ii++ ) {
      if ( $AC( ADC_E(ii+1) , 1 ) ) lPattern |= (1L << ii); 
   }
   if ( lPattern == 0x00000007 ) bFlagE = 1;
   $ANAL( PAT_E, lPattern );
                    /* so, jetzt wird das ortsbild berechnet */ 
   iSumE = 0;
   for ( ii=0; ii<3; ii++ ) {
      iQ[ii] = $GLOPAR( Q_CAL(ii+1) ) * ( iADCE[ii] + _prn() - 0.5E0 );  
      iSumE += iQ[ii];
   }                  
   
   if ( bFlagE && (rEnergy>0E0) ) {
      bFlagE = 0;
      $ANAL( QSUM_E, iSumE/3 );
      if ( $AC( QSUM_E, 1 ) ) {
         bFlagE = 0;
         rXE = ( 1E3 * iQ[0] ) / iSumE;
         rYE = ( 1E3 * iQ[1] ) / iSumE;
         rHelp = rXE;
         rX0 = $GLOPAR(x0);
         rY0 = $GLOPAR(y0);
         rPHI = $GLOPAR(phi);
         if ( ( rX0 != 0E0 ) && ( rY0 != 0E0 ) ) {
            rXE =   COSD(rPHI) * (rXE  -rX0) + SIND(rPHI) * (rYE-rY0) + rX0;      
            rYE = - SIND(rPHI) * (rHelp-rX0) + COSD(rPHI) * (rYE-rY0) + rY0;               
         }
         rEEle = ( $GLOPAR(AE) * rEnergy + $GLOPAR(BE) ) / 27.21;
         rvEle = 0E0;
         if ( rEEle > 0E0 ) rvEle = sqrt( rEEle + rEEle );
         if ( ( rX0 != 0E0 ) && ( rY0 != 0E0 ) ) {
            rX = rXE - rX0;
            rY = rYE - rY0;
            rZ = sqrt( rX*rX + rY*rY );
            if ( ( rZ >= $GLOPAR(RMIN) ) && ( rZ <= $GLOPAR(RMAX) ) ) {
               rAlpha = atan2( rY, rX ); 
            }
            rvPara = cos( rAlpha ) * rvEle;    
            rvPerp = sin( rAlpha ) * rvEle;
            rEkin = rvEle * rvEle * 0.5E0 * 27.21;    
         }
         rXIncr = rEIncr = rCIncr = 0E0;
         if (   rvEle != 0E0 ) rXIncr = 2E0 / rvEle; 
         if ( ( rEEle >  0E0 ) && ( rEkin != 0E0 ) ) rEIncr = 1E0 / rEEle; 
         if (   rEkin != 0E0 ) rCIncr = 1E0; 

         
         $ANAL( X_E, rXE );
         $ANAL( Y_E, rYE );
         $ANAL( XY_E, rXE, rYE );
         $ANAL( XY, rAlpha * 1E2, rZ );
                                  /* Hier kommen die anderen Spektren hin ... */
         if ( ( rX0 != 0E0 ) && ( rY0 != 0E0 ) && ( rvEle > 0E0 ) ) {
            $ANAL( theta_v, rAlpha * 1E2, rvEle * 1E2 ) incr( rXIncr );
            $ANAL( vx_vy,   rvPara * 1E1, rvPerp * 1E1 ) incr( rXIncr );
            $ANAL( theta_e, rAlpha * 1E2, rEkin ) incr( rEIncr );
         }                           
      }       
   }
            
}
$ENDEVT;
$ENDANL;