FairRoot/PandaRoot
ReadMainzProto60v6.cxx
Go to the documentation of this file.
1 /**************************************
2 
3  chammann@hiskp.uni-bonn.de
4  code to parse data files taken from
5  peter.drexler@exp2.physik.uni-giessen.de
6 
7  **************************************/
8 
9 #ifdef GNUPRAGMA
10 #pragma interface
11 #endif
12 
13 #include "ReadMainzProto60v6.h"
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include "TNtuple.h"
17 
18 
19 // #include "NTECEvent.h"
20 
21 
23  for(int n=0;n<60;n++){
24  energies[n]=LG_CAL[n];
25  }
26 }
27 
29  for(int n=0;n<60;n++){
30  times[n]=TIME[n];
31  }
32 }
33 
35  for(int n=0; n<60;n++){
36  ADCs[n]=LG[n];
37  }
38 }
40  for(int n = 0; n<16;n++){
41  taggertimes[n]=TAGGER_CAL[n];
42  }
43 }
44 
46 /* // new energy calibration
47 
48  taggerEnergies[0]=692.27;
49  taggerEnergies[1]=658.17;
50  taggerEnergies[2]=609.87;
51  taggerEnergies[3]=587.47;
52  taggerEnergies[4]=518.84;
53  taggerEnergies[5]=453.01;
54  taggerEnergies[6]=396.68;
55  taggerEnergies[7]=348.89;
56  taggerEnergies[8]=278.88;
57  taggerEnergies[9]=208.78;
58  taggerEnergies[10]=160.74;
59  taggerEnergies[11]=115.54;
60  taggerEnergies[12]=101.37;
61  taggerEnergies[13]=91.96;
62  taggerEnergies[14]=68.55;
63  taggerEnergies[15]=59.24;
64 */
65  // old energy calibration
66  taggerEnergies[0]=685.58;
67  taggerEnergies[1]=650.81;
68  taggerEnergies[2]=601.77;
69  taggerEnergies[3]=579.10;
70  taggerEnergies[4]=509.88;
71  taggerEnergies[5]=443.77;
72  taggerEnergies[6]=387.38;
73  taggerEnergies[7]=339.67;
74  taggerEnergies[8]=269.95;
75  taggerEnergies[9]=200.33;
76  taggerEnergies[10]=152.72;
77  taggerEnergies[11]=107.98;
78  taggerEnergies[12]=93.97;
79  taggerEnergies[13]=84.67;
80  taggerEnergies[14]=61.54;
81  taggerEnergies[15]=52.34;
82 
83 }
84 
86  FILE * fin;
87 // char infilename[100];
88  char instr[100];
89  int ch;
90  double ped, sigped, thr, mu, gmev, fr_mev, thr_mev;
91 
92 // sprintf(infilename, "%s.thr_mev", filename);
93  printf("filename read in: %s\n", filename);
94 
95  fin = fopen(filename, "rt");
96  if(fin==NULL){
97  printf("No file \"%s\" found!\n", filename);
98  for(int n=0; n<60; n++){
99  lg_factor[n]=lg_ped[n]=0;
100  }
101  }
102  else{
103  fgets(instr, 100, fin); // root filename
104  printf("filename read in: %s\n", instr);
105  fgets(instr, 100, fin); // Ch Ped Sigped Thr Mu GMeV FR_MeV Thr_MeV
106  printf("header read in: %s\n", instr);
107  for(int i = 0; i < 60; i++){
108  fgets(instr, 100, fin); // values
109  if(strlen(instr)<2) fgets(instr, 100, fin); // empty line
110 
111  sscanf(instr, "%i%lf%lf%lf%lf%lf%lf%lf",
112  &ch, &ped, &sigped, &thr, &mu, &gmev, &fr_mev, &thr_mev);
113  printf("line %i: %s -> ch: %i, factor: %f, ped: %f\n",
114  i, instr, ch, gmev, ped);
115  if(i+1==ch){
116  lg_factor[i]=gmev;
117  lg_ped[i]=ped;
118  }
119  else{
120  printf("Wrong channel in %s detected!\n", filename);
121  exit(0);
122  }
123  }
124  }
125 }
126 
127 
129  printf("Printing Event Number %li\n",NumberOfEvents);
130  printf("ADCValues:\n");
131  for(Int_t row=0;row<6;row++){
132  for(Int_t col=0;col<10;col++){
133  printf("% 8.3f ",LG[row*10+col]);
134  }
135  printf("\n");
136  }
137 
138  printf("Energies:\n");
139  for(Int_t row=0;row<6;row++){
140  for(Int_t col=0;col<10;col++){
141  printf("% 8.3f ",LG_CAL[row*10+col]);
142  }
143  printf("\n");
144  }
145  printf("Times:\n");
146  for(Int_t row=0;row<6;row++){
147  for(Int_t col=0;col<10;col++){
148  printf("% 8.3f ",TIME_CAL[row*10+col]);
149  }
150  printf("\n");
151  }
152 
153  printf("TaggerTimes:\n");
154  for(Int_t row=0;row<2;row++){
155  for(Int_t col=0;col<8;col++){
156  printf("% 8.3f ",TAGGER_CAL[row*8+col]);
157  }
158  printf("\n");
159  }
160  printf("TaggerEnergies:\n");
161  Double_t tagger_energies[16];
162  GetTaggerEnergies(tagger_energies);
163  for(Int_t row=0;row<2;row++){
164  for(Int_t col=0;col<8;col++){
165  printf("% 8.3f ",tagger_energies[row*8+col]);
166  }
167  printf("\n");
168  }
169 
170 }
171 
172 
174  IsInit=kFALSE;
175  printf("do datafile given, nothing to do\n");
176 }
177 
178 ReadMainzProto60v6::ReadMainzProto60v6(const char *datafilename, const char *calibrationfilename){
179  IsInit=kFALSE;
180  ctime_factor=0.180;
181  central=34;
182  strcpy(versionsstr,"data_all_6.0.0");
183  NumberOfEvents=0;
184  ResetToFirstEvent=kFALSE;
185 
186  //unsigned int rv; //[R.K. 01/2017] unused variable?
187  //unsigned int noe=0; //[R.K. 01/2017] unused variable?
188  //int how_often=1000; //[R.K. 01/2017] unused variable?
189 
190  //int tagged_crystal=35; //[R.K. 01/2017] unused variable?
191  in = fopen(datafilename, "rb");
192  if(in==NULL){
193  printf("can't read datafile %s !!!\n", datafilename);
194  return;
195  }
196  read_energy_factor(calibrationfilename);
197 
198  IsInit=kTRUE;
199 }
200 
202  fclose(in);
203 }
204 
206  if(read_one_event()!=0){
207  NumberOfEvents++;
208  convert_60();
209  calibrate_60();
210  return NumberOfEvents;
211  } else {
212  return -1;
213  }
214 }
215 
217  Long_t RetVal = 0;
218  Reset();
219  while(ReadNextEvent()!=-1);
220  RetVal = NumberOfEvents;
221  Reset();
222  return RetVal;
223 }
224 
226  NumberOfEvents = 0;
227  ResetToFirstEvent = kTRUE;
228 }
229 
231  for(int n=0; n<60; n++){
232  TIME_CAL[n] = ((TIME[n]) * ctime_factor);
233  LG_CAL[n] = (((LG[n])-lg_ped[n]) * lg_factor[n]);
234  }
235  for(int n=0; n<16; n++){
236  TAGGER_CAL[n] = ((TAGGER[n]) * ctime_factor);
237  }
238  TP_CAL = ((TP) * ctime_factor);
239  MU_CAL = ((MU) * ctime_factor);
240  VETO_CAL = ((VETO) * ctime_factor);
241 }
242 
244  for(int n=0; n<32; n++){
245  TIME[n] = rawdata[n][0];
246  }
247  for(int n=32; n<60; n++){
248  TIME[n] = rawdata[n-32][1];
249  }
250  for(int n=0; n<16; n++){
251  LG[n] = rawdata[n][2];
252  }
253  for(int n=16; n<32; n++){
254  LG[n] = rawdata[n-16][3];
255  }
256  for(int n=32; n<48; n++){
257  LG[n] = rawdata[n-32][4];
258  }
259  for(int n=48; n<60; n++){
260  LG[n] = rawdata[n-48][5];
261  }
262  for(int n=0; n<16; n++){
263  TAGGER[n] = rawdata[n][6];
264  }
265 
266  for(int n=0; n<8; n++){
267  TIME_VETO[n] = rawdata[19+n][7];
268  if(n%2==0) // even
269  LG_VETO[n] = rawdata[15+(n/2)][7];
270  else
271  LG_VETO[n] = rawdata[12+((n-1)/2)][7];
272  }
273 
274  TIME[ central ] = rawdata[28][1]; // correct position for Proto60 Mainz
275  LG[ central ] = rawdata[12][5]; // correct position for Proto60 Mainz
276  TP = rawdata[31][1];
277  MU = rawdata[30][1];
278  VETO = rawdata[29][1];
279 
280 }
281 
283  static unsigned int dataword=0xffffffff; // current data word
284  static unsigned int events=0; // event counter
285  static unsigned int no_of_ev=0; // number of words in file
286  static char ververgl[100];
287 
288 // unsigned int rv; // return value
289  int wie_oft=200000; // how often status report
290  unsigned int dec_geo, dec_tow, dec_noch, dec_data, dec_ch; // decoded event informations
291  int n; // counting variables
292  int board_no;
293 
294  memset(noe_of_board, 0, sizeof(noe_of_board)); //
295  memset(rawdata, 0, sizeof(rawdata)); //
296 
297 
298  if(dataword==0xffffffff || ResetToFirstEvent){ // init readout
299  ResetToFirstEvent=kFALSE;
300  events=0;
301  fseek(in, 0, 2); //setze Zeiger auf Ende der Datei
302  no_of_ev=ftell(in)/4; // Dateilaenge/4 pro header, data word, trail
303  fseek(in, 0, 0); //setze Zeiger auf Anfang der Datei
304 
305  n=0;
306  do{
307  fread(&ververgl[n], 1, 1, in);
308  n++;
309  }while(ververgl[n-1]!=0);
310 
311  printf("The version of the readout was: %s (expected: %s)\n\n",
312  ververgl, versionsstr);
313 
314  n=0;
315  do{
316  fread(&starttime[n], 1, 1, in);
317  n++;
318  }while(starttime[n-1]!=0);
319  printf("The readout was started: %s\n",
320  starttime);
321 
322  n=0;
323  do{
324  fread(&stoptime[n], 1, 1, in);
325  n++;
326  }while(stoptime[n-1]!=0);
327  printf("The readout was stopped: %s\n\n",
328  stoptime);
329 
330  fread(&no_of_boards, sizeof(no_of_boards), 1, in);
331  printf("%i boards were read out.\n", no_of_boards);
332  while(no_of_boards==0);
333  fread(what, sizeof(what), 1, in);
334  fread(geos, sizeof(geos), 1, in);
335  for(n=0; n<no_of_boards; n++){
336  printf("Board no %i is a %i (geo %i)\n", n, what[n], geos[n]);
337  if(geos[n]>43) geos[n]=43;
338  geo_to_bnr[ geos[n] ]=n;
339  }
340 
341  }
342  for(board_no=0; board_no< no_of_boards; board_no++){
343  if(what[board_no]<80){
344  /* Header **********************/
345  if(0==fread((char*) &dataword, sizeof(dataword), 1, in)) return(0);
346  events++; if(events%wie_oft==0) printf("%i of %i read in (%3.0f%%)\n", events, no_of_ev, ((double) events)*100/ ((double)no_of_ev));
347  dec_tow=((dataword>>24) & 0x7); // decode type of dataword
348  if(dec_tow!=2){ // not a header
349 // do{
350  printf("H");
351 // fread((char*) &dataword, sizeof(dataword), 1, in);
352 // events++; if(events%wie_oft==0) printf("%i von %i read in (%3.0f%%)\n", events, no_of_[1]ev, ((double) events)*100/ ((double)no_of_ev));
353 // dec_tow=((dataword>>24) & 0x7);
354 // }while(dec_tow!=2); // repeat until first header
355  }
356  dec_geo = (dataword>>27); // decode board number
357  dec_noch = ((dataword>>8) & 0x3f); // decode no of events in board
358  /* Header **********************/
359 
360  /* Data Words **********************/
361  for(n=0; n< (int) dec_noch; n++){
362  if(0==fread((char*) &dataword, sizeof(dataword), 1, in)) return(0);
363  events++; if(events%wie_oft==0) printf("%i von %i read in (%3.0f%%)\n", events, no_of_ev, ((double) events)*100/ ((double)no_of_ev));
364  dec_tow=((dataword>>24) & 0x7); // decode type of dataword
365  dec_data = (dataword & 0xfff); // decode actual data
366  if((what[board_no]%10)==1){ // ch on board max 32
367  dec_ch =((dataword>>16) & 0x3f); // decode channel number
368  }
369  else if((what[board_no]%10)==0){ //ch on board max 16, N version of board
370  dec_ch =((dataword>>17) & 0x1f); // decode dataword
371  }
372  else printf("ERROR in WHAT!!!\n\n\n");
373  if(dec_tow==0 && (dec_geo==(dataword>>27))){ // tow and geo is ok
374 // rawdata[dec_ch][ geo_to_bnr[dec_geo] ] = dec_data;
375  if(what[board_no]==30 || what[board_no]==31) // tdc
376  if(((dataword>>14)&0x1)==0) dec_data=0; // valid data?
377  rawdata[dec_ch][ board_no ] = dec_data;
378  }
379  else printf("D");
380  }
381  /* Data Words **********************/
382 
383  /* Trail **********************/
384  if(0==fread((char*) &dataword, sizeof(dataword), 1, in)) return(0);
385  events++; if(events%wie_oft==0) printf("%i of %i read in (%3.0f%%)\n", events, no_of_ev, ((double) events)*100/ ((double)no_of_ev));
386  dec_tow=((dataword>>24) & 0x7); // decode type of word
387  if(dec_tow!=4) printf("T"); //if it wasn't trail
388  noe_of_board[geo_to_bnr[dec_geo] ] =((dataword) & 0xffffff); //
389 
390  /* Trail **********************/
391 
392  }
393  else if(what[board_no]==90){
394  for(n=0;n<7; n++){ // header, counter 1-4, direct data in, trail
395  if(0==fread((char*) &dataword, sizeof(dataword), 1, in)) return(0);
396  events++; if(events%wie_oft==0) printf("%i of %i read in (%3.0f%%)\n", events, no_of_ev, ((double) events)*100/ ((double)no_of_ev));
397  rawdata[n][ board_no ] = dec_data;
398  }
399  }
400  }
401 // rv=events; // of there is more data, return number of read in events
402 
403  return 1;
404 } //read_one_event
int row
Definition: anaLmdDigi.C:67
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void GetADCValues(Double_t *ADCs)
Int_t i
Definition: run_full.C:25
exit(0)
unsigned int geo_to_bnr[44]
void GetTaggerEnergies(Double_t *taggerEnergies)
int col
Definition: anaLmdDigi.C:67
int n
unsigned int noe_of_board[16]
void GetEnergies(Double_t *energies)
Double_t
unsigned int read_one_event()
void GetTaggerTimes(Double_t *taggertimes)
void read_energy_factor(const char *filename)
void GetTimes(Double_t *times)
unsigned int rawdata[32][16]
const string filename