Cat
Acquisition.cpp
Go to the documentation of this file.
1 // $Id: $
2 
3 // include files
4 #include "TTree.h"
5 
6 // local
7 #include "Proto40MHz_v1.h"
8 #include "A3PE.h"
9 #include "Run.h"
10 #include "Event.h"
11 #include "Acquisition.h"
12 
13 //-----------------------------------------------------------------------------
14 // Implementation file for class : Acquisition
15 //
16 // 2006-10-23 :
17 //-----------------------------------------------------------------------------
18 
19 //=============================================================================
20 // Standard constructor, initializes variables
21 //=============================================================================
23  m_store_tree(true),
24  m_store_hist(false),
25  m_store_sample(true),
26  m_channels(0xFF),
27  m_depth(5),
28  m_trig(true),
29  m_nsample(0),
30  m_nbins(100),
31  m_minRange(0.),
32  m_maxRange(4096.),
33  m_deadtime(1000.)
34 {
35  setName ( "Acquisition" );
36  setType ( "Proto40MHz_v1" );
37  setTitle( "Proto40MHz_v1 data acquisition" );
38 }
39 //=============================================================================
40 // Destructor
41 //=============================================================================
43 
44 //=============================================================================
45 
46 //=========================================================================
47 //
48 //=========================================================================
50  debug("Acquisition" , "initialize");
51  info("" );
52  info("____________________________");
53  info("Acquisition run");
54  info(" =>" + element()->path() + " " +
55  element()->name() + " " + element()->type() );
56 
57  m_board=dynamic_cast<Proto40MHz_v1*>( element() );
58 
59  if (!m_board){
60  warning("Acquisition","No Proto40MHz_v1 board found. Interrupt." );
61  return false;
62  }
63 
64  m_pga=m_board->a3pe();
65  m_fifo = m_pga->storageRam();
69 
70  m_nch=0;
71  char hname[25];
72  char title[50];
73  for (int c=0; c<8; c++){
74  m_chEnable[c]=0;
75  m_channel[c]=-1;
76  if ((m_channels>>c)&1) {
77  m_pga->setEnableADC(c,true);
78  if (m_store_hist){
79  sprintf(hname,"Average_Ch_%1i",c);
80  sprintf(title,"Average Ch %1i",c);
81  m_a[c]=new TH1D(hname, title, m_depth , -0.5, (float)(m_depth)-0.5);
82  sprintf(hname,"RMS_Ch_%1i",c);
83  sprintf(title,"RMS Ch %1i",c);
84  m_s[c]=new TH1D(hname, title, m_depth , -0.5, (float)(m_depth)-0.5);
85  addHisto1d(m_a[c]);
86  addHisto1d(m_s[c]);
87  }
88  if (m_store_sample){
89  sprintf(hname,"Acquisition_Ch_%1i_%1i",c,m_nsample);
90  sprintf(title,"Acquisition Ch %1i - Sample %1i",c,m_nsample);
91  m_hsample[c]=new TH1D(hname, title, m_nbins, m_minRange, m_maxRange);
92  addHisto1d( m_hsample[c] );
93  }
94  m_chEnable[c]=1;
95  m_nch++;
96  }
97  else {
98  // m_channel[c]=-1.;
99  m_pga->setEnableADC(c,false);
100  }
101  }
102  if (m_store_tree){
103  m_tree = new TTree("Acquisition",name().c_str());
104  m_tree->Branch("Run",&m_runNumber,"Run/I");
105  m_tree->Branch("Event",&m_evtNumber,"Event/I");
106  m_tree->Branch("Time",&m_timestamp,"Time/D");
107  m_tree->Branch("Sample",&m_sample,"Sample/I");
108  m_tree->Branch("Channel",m_channel,"Channel[8]/I");
109  m_tree->Branch("ChEnable",m_chEnable,"ChEnable[8]/I");
110  }
112  return StatusCode::SUCCESS;
113 }
114 
115 //=========================================================================
116 //
117 //=========================================================================
119  debug("Acquisition" , "execute");
120  m_pga->enableStorage();
122 #ifdef WIN32
123  double time_unit=1000000.;
124 #else
125  double time_unit=1.e8;
126 #endif
127  clock_t start=clock();
128  double deadtime=(float)(m_deadtime);
129  double elapsed=0.;
130  if (m_trig) {m_pga->trigger();}
131  bool dataready=false;
132  while ((!dataready)&&(deadtime-elapsed>0)){
133  m_timestamp=(double)(clock());
134 // wait(1);
135  elapsed++;
136 // elapsed=((double)(CLOCKS_PER_SEC))/time_unit*(m_timestamp-(double)(start));
137  dataready=m_pga->dataReady();
138 // if (0==((int(elapsed/10000.))%10)) warning("Waiting for the acknowledge");
139  }
140  if (!dataready){
141  warning("Acquisition deadtime reached ("+
142  itos(m_deadtime)+"). Execution stopped.");
143  return StatusCode::FAILURE;
144  }
145  m_fifo->read();
146  int nch, c;
147  for (int d=0; d<m_depth; ++d){
148  m_sample=d;
149  nch=0; c=0;
150  while (nch<m_nch) {
151  if(m_chEnable[c]>0){
152  m_channel[c]=decodeFormat(c,d,m_fifo);
153 // info("sample "+itos(d)+"- channel "+itos(c)+" - value="+itos(m_channel[c]));
154  if (m_store_hist) {
155  v[c+8*d]+=m_channel[c];
156  v2[c+8*d]+=m_channel[c]*m_channel[c];
157  }
158  if (m_nsample==d){
159  if (m_store_sample) m_hsample[c]->Fill(m_channel[c]);
160  }
161  nch++;
162  }
163  c++;
164  }
165  if (m_store_tree) m_tree->Fill();
166  }
167  return StatusCode::SUCCESS;
168 }
169 
170 //=========================================================================
171 //
172 //=========================================================================
174  int nch; int c;
175  double val,tmp;
176  if (m_store_tree) m_tree->Print();
177  if (m_store_hist){
178  for (int d=0; d<m_depth; ++d){
179  nch=0; c=0;
180  while (nch<m_nch){
181  if((m_channels>>c)&1){
182  tmp=v[c+8*d]/(m_evtNumber+1);
183  m_a[c]->Fill(d,tmp);
184  if (m_evtNumber>0){
185  val=(v2[c+8*d]
186  -v[c+8*d]*tmp
187  )/(m_evtNumber);
188  m_s[c]->Fill(d,val>0.?sqrt(val):0.);
189  }
190  nch++;
191  }
192  c++;
193  }
194  }
195  }
196  return StatusCode::SUCCESS;
197 }
198 
199 //=========================================================================
200 //
201 //=========================================================================
203  if (depth>512){
204  warning("Cannot acquire more than 512 consecutive events. Interrupt.");
205  return StatusCode::FAILURE;
206  }
207  m_depth=depth;
208  return StatusCode::SUCCESS;
209 }
210 
211 //=========================================================================
212 //
213 //=========================================================================
215  if (channels>0xFF){
216  channels=(channels&0xFF);
217  warning("Channels coding not appropriate. Truncated at 0xFF.");
218  }
220  return StatusCode::SUCCESS;
221 }
222 
223 //=========================================================================
224 //
225 //=========================================================================
226 unsigned int Acquisition::decodeFormat (unsigned int channel, unsigned int evt, RAM* ram){
227  unsigned int val=0;
228  switch (channel) {
229  case 0:
230  val=ram->io()->dataU8(0+12*evt)+((ram->io()->dataU8(1+12*evt)&0xf)<<8);
231  break;
232  case 1:
233  val=(ram->io()->dataU8(1+12*evt)>>4)+(ram->io()->dataU8(2+12*evt)<<4);
234  break;
235  case 2:
236  val=ram->io()->dataU8(3+12*evt)+((ram->io()->dataU8(4+12*evt)&0xf)<<8);
237  break;
238  case 3:
239  val=(ram->io()->dataU8(4+12*evt)>>4)+(ram->io()->dataU8(5+12*evt)<<4);
240  break;
241  case 4:
242  val=ram->io()->dataU8(6+12*evt)+((ram->io()->dataU8(7+12*evt)&0xf)<<8);
243  break;
244  case 5:
245  val=(ram->io()->dataU8(7+12*evt)>>4)+(ram->io()->dataU8(8+12*evt)<<4);
246  break;
247  case 6:
248  val=ram->io()->dataU8(9+12*evt)+((ram->io()->dataU8(10+12*evt)&0xf)<<8);
249  break;
250  case 7:
251  val=(ram->io()->dataU8(10+12*evt)>>4)+(ram->io()->dataU8(11+12*evt)<<4);
252  break;
253  }
254  return val;
255 }
256 
void info(std::string mymsg)
Definition: Object.h:38
std::string itos(int)
Definition: Tools.cpp:46
StatusCode setChannels(unsigned int)
Int_t m_evtNumber
Definition: Acquisition.h:110
TH1D * m_a[8]
Definition: Acquisition.h:123
Definition: RAM.h:16
unsigned long nEvt()
Definition: Options.h:317
virtual StatusCode finalize()
RAM * m_fifo
Definition: Acquisition.h:121
unsigned int m_nsample
Definition: Acquisition.h:128
StatusCode setSoftwareTrigger(bool)
Definition: A3PE.cpp:368
double m_timestamp
Definition: Acquisition.h:116
std::string title()
Definition: Object.h:31
void setName(std::string name)
Definition: Object.h:51
StatusCode setFifoDepth(unsigned int)
Definition: A3PE.cpp:612
unsigned long runNumber()
Definition: Options.h:107
A3PE * a3pe()
Definition: Proto40MHz_v1.h:74
RAM * storageRam()
Definition: A3PE.h:536
TH1D * m_s[8]
Definition: Acquisition.h:124
Acquisition()
Standard constructor.
Definition: Acquisition.cpp:22
Application * application()
Definition: Tools.cpp:42
virtual StatusCode read()
Definition: IOobject.h:73
Options * options()
Definition: Application.h:86
void setType(std::string type)
Definition: Object.h:52
float m_maxRange
Definition: Acquisition.h:131
Int_t m_channel[8]
Definition: Acquisition.h:112
bool dataReady()
Definition: A3PE.cpp:406
void debug(std::string mymsg)
Definition: Object.h:37
virtual StatusCode execute()
Int_t m_runNumber
Definition: Acquisition.h:109
float m_minRange
Definition: Acquisition.h:130
bool m_store_sample
Definition: Acquisition.h:106
StatusCode trigger()
Definition: A3PE.cpp:363
unsigned int decodeFormat(unsigned int, unsigned int, RAM *)
void setTitle(std::string title)
Definition: Object.h:54
double v[8 *m_depthmax]
Definition: Acquisition.h:126
Proto40MHz_v1 * m_board
Definition: Acquisition.h:119
double v2[8 *m_depthmax]
Definition: Acquisition.h:127
unsigned int channels()
Definition: Acquisition.h:34
unsigned int m_nbins
Definition: Acquisition.h:129
StatusCode enableStorage()
Definition: A3PE.cpp:383
U8 * dataU8()
Definition: IOdata.h:214
std::string name() const
Definition: Object.h:28
A3PE * m_pga
Definition: Acquisition.h:120
void addHisto1d(TH1D *h)
Definition: Processus.h:160
bool m_store_tree
Definition: Acquisition.h:104
virtual ~Acquisition()
Destructor.
Definition: Acquisition.cpp:42
TH1D * m_hsample[8]
Definition: Acquisition.h:125
unsigned int depth()
Definition: Acquisition.h:31
Element * element()
Definition: Processus.h:231
StatusCode setWriteStorageFifoUsb(bool)
Definition: A3PE.cpp:99
Int_t m_chEnable[8]
Definition: Acquisition.h:113
std::string type()
Definition: Object.h:29
bool m_store_hist
Definition: Acquisition.h:105
void warning(std::string mymsg)
Definition: Object.h:39
TTree * m_tree
Definition: Acquisition.h:108
StatusCode setEnableADC(unsigned int, bool)
Definition: A3PE.cpp:87
StatusCode setDepth(unsigned int)
Int_t m_sample
Definition: Acquisition.h:111
IOdata * io()
Definition: IOobject.h:66
virtual StatusCode initialize()
Definition: Acquisition.cpp:49