Cat
A3PE_BitFlip.cpp
Go to the documentation of this file.
1 // $Id: $
2 
3 // include files
4 #include <fstream>
5 #include <iostream>
6 #include <string>
7 
8 #include "TH1D.h"
9 
10 // local
11 #include "Proto40MHz_v1.h"
12 #include "A3PE.h"
13 #include "Run.h"
14 #include "Event.h"
15 #include "A3PE_BitFlip.h"
16 
17 //-----------------------------------------------------------------------------
18 // Implementation file for class : A3PE_BitFlip
19 //
20 // 2012-07-12 :
21 //-----------------------------------------------------------------------------
22 
23 //=============================================================================
24 // Standard constructor, initializes variables
25 //=============================================================================
27  m_filename(std::string("")),
28  m_offset(-6),
29  m_latencyMin(1000),
30  m_latencyMax(100000),
31  m_hLatency (0),
32  m_hErrorsLatency(0),
33  m_hErrorsWord(0)
34 {
35  setName ( "A3PE_BitFlip" );
36  setType ( "Proto40MHz_v1" );
37  setTitle( "Proto40MHz_v1 A3PE_BitFlip test" );
38 }
39 //=============================================================================
40 // Destructor
41 //=============================================================================
43 
44 //=============================================================================
45 
46 //=========================================================================
47 //
48 //=========================================================================
50  debug("A3PE_BitFlip" , "initialize");
51 
52  info("" );
53  info("____________________________");
54  info("A3PE bit flip test");
55  info(" =>" + element()->path() + " " +
56  element()->name() + " " + element()->type() );
57 
58  m_board=dynamic_cast<Proto40MHz_v1*>( element() );
59 
60  if (!m_board){
61  warning("A3PE_BitFlip","No Proto40MHz_v1 board found. Interrupt." );
62  return false;
63  }
64 
65  m_pga=m_board->a3pe();
67  m_toAX = m_pga->toAXRam();
68 
69  m_data =m_toAX->io()->dataU8();
71 
74 
75  if (m_pga->internalAXSequence()){
76  m_offset=-2;}
77  else {
78  m_offset=-5;
79  }
80 
81  if (m_filename!=std::string("")){
83  info("Static RAM mode ["+m_filename+"].");
84  }
85  else
86  info("Dynamic Random RAM mode.");
87  if (0==m_latency) info("Latency = random");
88  else info("Latency ="+itos(m_latency));
89  info("Length ="+itos(m_length));
90  info("Offset ="+itos(m_offset));
91 
92  warning("In internal loop the offset should be -3 with a Latency of 4 at least");
93  warning("In external loop the offset should be -6 with a Latency of 5 at least");
94  warning("The offset for this run is "+itos(m_offset));
95 
96  m_hLatency=new TH1D("Latency","Latency", 100, m_latencyMin, m_latencyMax );
97  m_hErrorsLatency =new TH1D("ErrorsLatency","Errors (Latency)", 100, m_latencyMin, m_latencyMax);
98  m_hErrorsWord =new TH1D("ErrorsWord","Errors (Word)", 100, 0, m_length);
102 
103  return StatusCode::SUCCESS;
104 }
105 
106 //=========================================================================
107 //
108 //=========================================================================
110  debug("A3PE_BitFlip" , "execute");
111  unsigned long latency;
112 
113  if (0==m_latency){
114  latency=m_latencyMin+((float)(rand())/RAND_MAX*((float)(m_latencyMax-m_latencyMin)));
115  m_pga->setLatencyAX(latency);
116  }
117  else latency=m_latency;
118 
119  if (m_filename==std::string("")){
120  randomValues();
121  }
122 
123  m_hLatency->Fill((float)(latency));
125 
126  m_pga->setAXRamUsb(true);
128  m_fromAX->read();
129 
130  bool error=false;
131 
132  char line[100];
133  bool errLatencySeen=false;
134  for (unsigned int d=0; d<m_length; ++d){
135  unsigned int position=(d+latency+m_offset)%512;
136  if ((m_dataProcessed[4*d]!=m_data[4*position])||
137  (m_dataProcessed[4*d+1]!=m_data[4*position+1])||
138  (m_dataProcessed[4*d+2]!=m_data[4*position+2])||
139  (m_dataProcessed[4*d+3]!=m_data[4*position+3]))
140  {
141  if (!errLatencySeen) {
142  m_hErrorsLatency->Fill((float)(latency));
143  errLatencySeen=true;
144  }
145  m_hErrorsWord->Fill((float)(d));
146  sprintf(line,"%3d -> %1d %1d %1d %1d / %1d %1d %1d %1d",
147  d,
149  m_data[4*position],m_data[1+4*position],m_data[2+4*position],m_data[3+4*position]);
150  warning(line);
151  error = true;
152  }
153  }
154  if (error) return StatusCode::FAILURE;
155  return StatusCode::SUCCESS;
156 }
157 
158 //=========================================================================
159 //
160 //=========================================================================
162  if (0==m_latency) m_pga->setLatencyAX(0);
163  return StatusCode::SUCCESS;
164 }
165 
166 //=========================================================================
167 //
168 //=========================================================================
170  m_pga->setAXRamUsb(true);
171  m_pga->setAddToAXRam(0);
172  int depth=m_toAX->depth();
173 
174  for (int i=0; i<depth ; ++i){
175  m_data[4*i ]=(unsigned int) ( (float)rand()/RAND_MAX * 255. );
176  m_data[4*i+1]=(unsigned int) ( (float)rand()/RAND_MAX * 255. );
177  m_data[4*i+2]=(unsigned int) ( (float)rand()/RAND_MAX * 255. );
178  m_data[4*i+3]=(unsigned int) ( (float)rand()/RAND_MAX * 255. );
179  }
180 
181  m_toAX->write();
182  return StatusCode::SUCCESS;
183 }
184 
185 
void info(std::string mymsg)
Definition: Object.h:38
std::string itos(int)
Definition: Tools.cpp:46
unsigned int latencyAX()
Definition: A3PE.cpp:348
virtual ~A3PE_BitFlip()
Destructor.
RAM * fromAXRam()
Definition: A3PE.h:552
virtual StatusCode write()
Definition: IOobject.h:80
StatusCode setAddToAXRam(int)
Definition: A3PE.cpp:179
void setName(std::string name)
Definition: Object.h:51
std::string m_filename
Definition: A3PE_BitFlip.h:54
TH1D * m_hLatency
Definition: A3PE_BitFlip.h:67
void loadToAX(std::string)
Definition: A3PE.cpp:858
Proto40MHz_v1 * m_board
Definition: A3PE_BitFlip.h:50
A3PE * a3pe()
Definition: Proto40MHz_v1.h:74
U8 * m_dataProcessed
Definition: A3PE_BitFlip.h:65
virtual StatusCode execute()
StatusCode startSequenceAX()
Definition: A3PE.cpp:949
virtual StatusCode read()
Definition: IOobject.h:73
StatusCode randomValues()
void setType(std::string type)
Definition: Object.h:52
void error(std::string mymsg)
Definition: Object.h:40
void debug(std::string mymsg)
Definition: Object.h:37
unsigned int m_length
Definition: A3PE_BitFlip.h:56
StatusCode setLatencyAX(unsigned int)
Definition: A3PE.cpp:327
void setTitle(std::string title)
Definition: Object.h:54
A3PE_BitFlip()
Standard constructor.
virtual StatusCode initialize()
StatusCode setAddFromAXRam(int)
Definition: A3PE.cpp:190
unsigned int lengthAX()
Definition: A3PE.cpp:338
int depth()
Definition: RAM.h:32
U8 * dataU8()
Definition: IOdata.h:214
A3PE * m_pga
Definition: A3PE_BitFlip.h:51
RAM * toAXRam()
Definition: A3PE.h:548
unsigned int m_latencyMin
Definition: A3PE_BitFlip.h:59
std::string name() const
Definition: Object.h:28
unsigned int m_latency
Definition: A3PE_BitFlip.h:57
void addHisto1d(TH1D *h)
Definition: Processus.h:160
Element * element()
Definition: Processus.h:231
TH1D * m_hErrorsWord
Definition: A3PE_BitFlip.h:67
unsigned int m_latencyMax
Definition: A3PE_BitFlip.h:60
std::string type()
Definition: Object.h:29
virtual StatusCode finalize()
void warning(std::string mymsg)
Definition: Object.h:39
StatusCode setAXRamUsb(bool)
Definition: A3PE.cpp:225
TH1D * m_hErrorsLatency
Definition: A3PE_BitFlip.h:67
bool internalAXSequence()
Definition: A3PE.cpp:285
IOdata * io()
Definition: IOobject.h:66
RAM * m_fromAX
Definition: A3PE_BitFlip.h:53