/[PAMELA software]/yoda/techmodel/forroutines/anticounter/AC.c
ViewVC logotype

Diff of /yoda/techmodel/forroutines/anticounter/AC.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.1 by kusanagi, Sun Oct 17 12:42:54 2004 UTC revision 2.4 by kusanagi, Mon Dec 20 14:15:15 2004 UTC
# Line 1  Line 1 
1  /*****************************************************************  /*******************************v1.0********************************
2  Function to read AC physics data v1.1  
3    Functions to read AC physics data (ACphysics) and AC calibration
4    data (ACcalib).
5  Author: Petter Hofverberg, petter@particle.kth.se  Author: Petter Hofverberg, petter@particle.kth.se
6    
7  0408 v1.0 alive  0410 v1.0 alive
8  0409 Added shifting operators to fix problem with odd data (BBAC|11DD)  
                                                               -----  
9  Errors: (returned to the main program as the variable "err")  Errors: (returned to the main program as the variable "err")
10  err=  err=
11  0 - Ok  0xFF - data (physics or calibration) from both cards found
12  1 - Data found, but corrupt  0xF0 - only data from main card found
13  2 - Data dont found in buffer  0x0F - only data from extra card found
14    0x00 - no data found
15    
 ToDo: i)  do it endian-independent  
       ii) check for more events in the same file?  
16  ******************************************************************/  ******************************************************************/
17    
18  #include <stdio.h>  #include <stdio.h>
19  #include "AC.h"  #include "AC.h"
20    
21  int i,err,found,j;  int i,found,j;
 //unsigned short buffer[1000];  
 //unsigned short tmp1,tmp2;  
22  unsigned short buffer[1000];  unsigned short buffer[1000];
23  unsigned short tmp1;  unsigned short tmp1,tmp2;
24    unsigned char err;
25    
26  struct physicsstruct physicsdata;  struct physicsstruct physicsdata[2];
27  struct physicsstruct *physicspointer;  struct physicsstruct *physicspointer;
28    
29  struct calibstruct calibdata;  struct calibstruct calibdata[2];
30  struct calibstruct *calibpointer;  struct calibstruct *calibpointer;
31    
32    //Fill physicsdata from buffer
33    void fillphys(int k,unsigned short *buff)
34    {
35      for(i=0;i<2;i++) physicsdata[k].header[i]=buff[i];
36      physicsdata[k].status=buff[2];
37      physicsdata[k].hitmap=buff[3];
38      for(i=0;i<6;i++) physicsdata[k].regist[i]=buff[4+i];
39      for(i=0;i<16;i++) physicsdata[k].shift[i]=buff[10+i];
40      for(i=0;i<16;i++) physicsdata[k].counters[i]=buff[26+i];
41      for(i=0;i<8;i++) physicsdata[k].coinc[i]=buff[42+i];
42      physicsdata[k].trigg=buff[50];
43      for(i=0;i<2;i++) physicsdata[k].clock[i]=buff[51+i];
44      for(i=0;i<2;i++) physicsdata[k].temp[i]=buff[53+i];
45      for(i=0;i<8;i++) physicsdata[k].DAC[i]=buff[55+i];
46      physicsdata[k].CRC=buff[63];
47    
48    }
49    
50  //int ACphysics(int length,unsigned short* datapointer,struct physicsstruct* physicspointer)  //Fill calibdata from buffer
51  int ACphysics(int length,unsigned char* datapointer,struct physicsstruct* physicspointer)  void fillcalib(int k,unsigned short *buff)
52  {  {
53      for(i=0;i<2;i++) calibdata[k].header[i]=buff[i];
54      for(i=0;i<5;i++) calibdata[k].status[i]=buff[2+i];
55      for(i=0;i<8;i++) calibdata[k].temp[i]=buff[7+i];
56      for(i=0;i<8;i++) calibdata[k].DAC1[i]=buff[15+i];
57      for(i=0;i<8;i++) calibdata[k].DAC2[i]=buff[23+i];
58      for(i=0;i<6;i++) calibdata[k].regist[i]=buff[31+i];
59      for(i=0;i<8;i++) calibdata[k].time[i]=buff[37+i];
60      calibdata[k].n_tr=buff[45];
61      for(i=0;i<16;i++) calibdata[k].hitmap_tr[i]=buff[46+i];
62      for(i=0;i<4096;i++) calibdata[k].curve1[i]=buff[62+i];
63      for(i=0;i<4096;i++) calibdata[k].curve2[i]=buff[4158+i];
64      calibdata[k].iCRC=buff[8254];
65      calibdata[k].tail=buff[8255];
66      calibdata[k].CRC=buff[8256];
67      printf("tail:CRC > %hx:%hx\n",buff[8255],buff[8256]);
68    }
69    
  int iter=2;  
70    
71    *physicspointer=physicsdata;  unsigned char ACphysics(int length,unsigned char* datapointer,struct physicsstruct* physicspointer)
72    {
73    
74    //look for header AC11, then cut out the event to a temp buffer   int iter=2;
75    while(found==0 && iter<length)    physicspointer[0]=physicsdata[0];
76      physicspointer[1]=physicsdata[1];
77    
78      //look for top header ACAC, then unpack data to main card buffer or extra card buffer depending on the subheader
79      //AC11 for main, AC22 for extra
80      while(found<2 && iter<length)
81      {      {
82        tmp1 = ((*datapointer) << 8) | *(datapointer+1);        tmp1 = ((*datapointer) << 8) | *(datapointer+1);
83                tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);
84        if(tmp1==0xAC11)  
85        //if(tmp1==0xAC11) //flipped        if(tmp1 == 0xACAC && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xAC22 && (err&0x0F)==0x0)))
86          {          {
87            found=1;          
88            for(i=0;i<64;i++)            for(i=0;i<64;i++)
89              {              {
90                buffer[i]=((*datapointer) << 8) | *(datapointer+1);                buffer[i]=((*datapointer) << 8) | *(datapointer+1);
91                datapointer=datapointer+2;                datapointer=datapointer+2;
92              }              }
93            tmp1=0x0000;            
94              if(tmp2==0xAC11){          //main card
95                fillphys(0,&buffer[0]);
96                err |= 0xF0;
97              }
98              else{                      //extra card
99                fillphys(1,&buffer[0]);
100                err |= 0x0F;
101              }
102              tmp1=tmp2=0x0000;
103              found++;
104          }          }
105        else{        else{
106          datapointer++;          datapointer++;
107          iter=iter+1;}          iter=iter+1;}
108      }      }
     
   //check errors  
   if(found==0)  
     err=2;  
   else if(buffer[1]==0x22AC || buffer[1]==0xAC22)  
     err=0;  
   else  
     err=1;  
   
   //Fill physicsdata from buffer  
   for(i=0;i<2;i++) physicsdata.header[i]=buffer[i];  
   physicsdata.status=buffer[2];  
   physicsdata.hitmap=buffer[3];  
   for(i=0;i<6;i++) physicsdata.regist[i]=buffer[4+i];  
   for(i=0;i<16;i++) physicsdata.shift[i]=buffer[10+i];  
   for(i=0;i<16;i++) physicsdata.counters[i]=buffer[26+i];  
   for(i=0;i<8;i++) physicsdata.coinc[i]=buffer[42+i];  
   physicsdata.trigg=buffer[50];  
   for(i=0;i<2;i++) physicsdata.clock[i]=buffer[51+i];  
   for(i=0;i<2;i++) physicsdata.temp[i]=buffer[53+i];  
   for(i=0;i<8;i++) physicsdata.DAC[i]=buffer[55+i];  
   physicsdata.CRC=buffer[63];  
109    
110    return err;    return err;
111    
112  }  }
113    
114    
115  int ACcalib(int length, unsigned char* datapointer, struct calibstruct* calibpointer)  unsigned char ACcalib(int length, unsigned char* datapointer, struct calibstruct* calibpointer)
116  {  {
117    
118    int iter=2;    int iter=2;
119                            
120    //point struct-pointer to calibdata    //point struct-pointer to calibdata
121    *calibpointer=calibdata;      calibpointer[0]=calibdata[0];  //card1
122      calibpointer[1]=calibdata[1];  //card2
123    
124    //look for header 0xACCA    //look for the top header 0xACCA, then the subheaders 0xAC11 and 0xAC22, and unpack the data
125    while(found==0 && iter<length)    //to each card depending on these.
126      while(found<2 && iter<length)
127      {      {
128        tmp1 = ((*datapointer) << 8) | *(datapointer+1);        tmp1 = ((*datapointer) << 8) | *(datapointer+1);
129                tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);
130        if(tmp1==0xACCA)  
131          if(tmp1 == 0xACCA && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xAC22 && (err&0x0F)==0x0)))
132          {          {
133            found=1;            for(i=0;i<8258;i++)
           for(i=0;i<8256;i++)  
134              {              {
135                buffer[i]=((*datapointer) << 8) | *(datapointer+1);                buffer[i]=((*datapointer) << 8) | *(datapointer+1);
136                datapointer=datapointer+2;                datapointer=datapointer+2;
137              }              }
138            tmp1=0x0000;          
139              if(tmp2==0xAC11){          //main
140                fillcalib(0,&buffer[0]);
141                err |= 0xF0;
142              }
143              else{                      //extra
144                fillcalib(1,&buffer[0]);
145                err |= 0x0F;
146              }
147               tmp1=tmp2=0x0000;
148              found++;
149          }          }
150        else{        else{
151        datapointer++;          datapointer++;
152        iter=iter+1;}          iter=iter+1;}
     }  
   
   //check errors  
   if(found==0)  
     err=2;  
   else if(buffer[8254]==0xAC22)  
     err=0;  
   else  
     err=1;  
   
   printf("length: %d\n iter: %d\n",length,iter);  
   
   //Fill calibdata from buffer  
   calibdata.header=buffer[0];  
   for(i=0;i<5;i++) calibdata.status[i]=buffer[1+i];  
   for(i=0;i<8;i++) calibdata.temp[i]=buffer[6+i];  
   for(i=0;i<8;i++) calibdata.DAC1[i]=buffer[14+i];  
   for(i=0;i<8;i++) calibdata.DAC2[i]=buffer[22+i];  
   for(i=0;i<6;i++) calibdata.regist[i]=buffer[30+i];  
   for(i=0;i<8;i++) calibdata.time[i]=buffer[36+i];  
   calibdata.n_tr=buffer[44];  
   for(i=0;i<16;i++) calibdata.hitmap_tr[i]=buffer[45+i];  
   for(i=0;i<4096;i++) calibdata.curve1[i]=buffer[61+i];  
   for(i=0;i<4096;i++) calibdata.curve2[i]=buffer[4157+i];  
   calibdata.iCRC=buffer[8253];  
   calibdata.tail=buffer[8254];  
   calibdata.CRC=buffer[8255];  
   
   /*    
   //debug  
   if(err!=2)  
     {  
       printf("header.....   %hx\n",calibdata.header);  
       printf("status.....   %hx\n",calibdata.status[0]);  
       printf("temp.......   %hx\n",calibdata.temp[0]);  
       printf("DAC1.......   %hx\n",calibdata.DAC1[0]);  
       printf("DAC2.......   %hx\n",calibdata.DAC2[0]);  
       printf("regist.....   %hx\n",calibdata.regist[0]);  
       printf("time.......   %hx\n",calibdata.time[0]);  
       printf("n_tr.......   %hx\n",calibdata.n_tr);  
       printf("hitmap_tr..   %hx\n",calibdata.hitmap_tr[0]);  
       printf("curve1.....   %hx\n",calibdata.curve1[0]);  
       printf("curve2.....   %hx\n",calibdata.curve2[0]);  
       printf("iCRC.......   %hx\n",calibdata.iCRC);  
       printf("tail.......   %hx\n",calibdata.tail);  
       printf("CRC........   %hx\n",calibdata.CRC);  
153      }      }
   printf("err: %d\n",err);  
   */  
154    
155    return err;    return err;
156  }  }
157    
   
   
 //transposing function  
 int flip(int i16)  
 {  
   int temp;  
     
   temp = 0;  
   temp |= 0xFF00 & ((0x00FF & i16) << 8);  
   temp |= 0x00FF & ((0xFF00 & i16) >> 8);  
   return temp;  
 }  

Legend:
Removed from v.2.1  
changed lines
  Added in v.2.4

  ViewVC Help
Powered by ViewVC 1.1.23