test_Dune35tNoiseRemovalService.cxx
Go to the documentation of this file.
1 // test_Dune35tNoiseRemovalService.cxx
2 //
3 // David Adams
4 // May 2016
5 //
6 // Test Dune35tNoiseRemovalService.
7 
8 #include <string>
9 #include <iostream>
10 #include <sstream>
11 #include <fstream>
12 #include <iomanip>
15 #include "lbne-raw-data/Services/ChannelMap/ChannelMapService.h"
17 
18 #undef NDEBUG
19 #include <cassert>
20 
21 using std::string;
22 using std::vector;
23 using std::cout;
24 using std::endl;
25 using std::istringstream;
26 using std::ofstream;
27 using std::setw;
28 using std::setprecision;
29 using std::fixed;
30 using art::ServiceHandle;
31 
32 //**********************************************************************
33 
34 int test_Dune35tNoiseRemovalService(bool useExistingFcl) {
35  const string myname = "test_Dune35tNoiseRemovalService: ";
36 #ifdef NDEBUG
37  cout << myname << "NDEBUG must be off." << endl;
38  abort();
39 #endif
40  string line = "-----------------------------";
41 
42  cout << myname << line << endl;
43  if (useExistingFcl) {
44  cout << myname << "Using existing top-level FCL." << endl;
45  ArtServiceHelper::load_services("test_Dune35tNoiseRemovalService.fcl",
47  } else {
48  cout << myname << "Creating top-level FCL." << endl;
49  string gname = "dune35t4apa_v6";
50  std::stringstream config;
51  config << "services.Geometry: {" << endl;
52  config << " DisableWiresInG4: true" << endl;
53  config << " GDML: \"" << gname << ".gdml\"" << endl;
54  config << " Name: \"" << gname << "\"" << endl;
55  config << " ROOT: \"" << gname << "\"" << endl;
56  config << " SortingParameters: { DetectorVersion: \"" << gname << "\" ChannelsPerOpDet: 12} " << endl;
57  config << " SurfaceY: 0" << endl;
58  config << "}" << endl;
59  config << "services.ExptGeoHelperInterface: {" << endl;
60  config << " service_provider: \"DUNEGeometryHelper\"" << endl;
61  config << "}" << endl;
62  config << "services.ChannelMapService: {" << endl;
63  config << " LogLevel: 1" << endl;
64  config << " FileName: \"35tTPCChannelMap_v6.txt\"" << endl;
65  config << "}" << endl;
66  config << "services.AdcNoiseRemovalService: {" << endl;
67  config << " service_provider: Dune35tNoiseRemovalService" << endl;
68  config << " LogLevel: 1" << endl;
69  config << " GroupingFlag: 1" << endl;
70  config << " SkipStuckCodes: false" << endl;
71  config << " SkipSignals: false" << endl;
72  config << " CorrectStuckCodes: true" << endl;
73  config << " ShowGroups: 2" << endl;
74  config << " ShowGroupsChannel: 4" << endl;
75  config << "}" << endl;
77  }
78 
79  cout << myname << line << endl;
80  cout << myname << "Fetch channel map." << endl;
82 
83  cout << myname << line << endl;
84  cout << myname << "Fetch noise removal." << endl;
86  hanr->print();
87 
88  // Each channel is filled with a bipolar signal offset by one from preceding channel.
89  cout << myname << line << endl;
90  cout << myname << "Build offline channel list." << endl;
91  cout << myname << "Create data." << endl;
92  unsigned int nchan = 64;
93  unsigned int nsig = 200;
94  float fac = 25.0;
95  AdcChannelDataMap datamap;
96  for ( AdcChannel chan=0; chan<nchan; ++chan ) {
97  cout << " Online Channel: " << chan << endl;
98  AdcChannel chanoff = hlcm->Offline(chan);
99  cout << " Offline Channel: " << chanoff << endl;
100  assert( hlcm->Online(chanoff) == chan );
101  AdcChannelData& data = datamap[chanoff];
102  data.channel = chanoff;
103  AdcSignalVector& sigs = data.samples;
104  //AdcFlagVector& flags = data.flags;
105  unsigned int isig1 = 10 + chan;
106  for ( unsigned int isig=0; isig<isig1; ++isig ) sigs.push_back(0);
107  for ( unsigned int i=0; i<10; ++i ) sigs.push_back(fac*i);
108  for ( unsigned int i=10; i<1000; --i ) sigs.push_back(fac*i);
109  for ( unsigned int i=19; i<1000; --i ) sigs.push_back(-sigs[i+isig1]);
110  for ( unsigned int isig=sigs.size(); isig<nsig; ++isig ) sigs.push_back(0);
111  }
112  // Add noise.
113  for ( auto& chdata : datamap ) {
114  AdcChannel chanoff = chdata.first;
115  AdcChannelData& data = chdata.second;
116  int reg = hlcm->RegulatorFromOfflineChannel(chanoff);
117  int ori = hlcm->PlaneFromOfflineChannel(chanoff);
118  for ( unsigned int isig=0; isig<nsig; ++isig ) {
119  AdcSignal& sig = data.samples[isig];
120  AdcSignal noise = 50.0*reg + 10*ori + isig%5;
121  sig += noise;
122  }
123  }
124 
125  cout << myname << line << endl;
126  cout << myname << "Data before noise removal:" << endl;
127  unsigned int wcha = 5;
128  unsigned int wsig = 5;
129  for ( AdcChannelDataMap::value_type& idata : datamap ) {
130  AdcChannel chan = idata.first;
131  AdcChannelData& data = idata.second;
132  cout << setw(wcha) << chan << ": ";
133  for ( unsigned int isig=0; isig<40; ++isig ) {
134  cout << fixed << setprecision(0) << setw(wsig) << data.samples[isig];
135  }
136  cout << endl;
137  }
138 
139  cout << myname << line << endl;
140  cout << myname << "Remove noise." << endl;
141  assert( hanr->update(datamap) == 0 );
142 
143  cout << myname << line << endl;
144  cout << myname << "Data after noise removal:" << endl;
145  for ( AdcChannelDataMap::value_type& idata : datamap ) {
146  AdcChannel chan = idata.first;
147  AdcChannelData& data = idata.second;
148  cout << setw(wcha) << chan << ": ";
149  for ( unsigned int isig=0; isig<40; ++isig ) {
150  cout << fixed << setprecision(0) << setw(wsig) << data.samples[isig];
151  }
152  cout << endl;
153  }
154 
155  cout << myname << line << endl;
156  cout << myname << "Check unpolluted data after noise removal:" << endl;
157  for ( auto& chdata : datamap ) {
158  AdcChannelData& data = chdata.second;
159  for ( unsigned int isig=0; isig<10; ++isig ) {
160  assert(data.samples[isig] == 0.0);
161  }
162  }
163 
164  cout << myname << line << endl;
165  cout << myname << "Done." << endl;
166  return 0;
167 }
168 
169 //**********************************************************************
170 
171 int main(int argc, char* argv[]) {
172  bool useExistingFcl = false;
173  bool skipTest = false;
174  if ( argc > 1 ) {
175  string sarg(argv[1]);
176  if ( sarg == "-h" ) {
177  cout << "Usage: " << argv[0] << " [ARG]" << endl;
178  cout << " If ARG = true, existing FCL file is used." << endl;
179  return 0;
180  }
181  useExistingFcl = sarg == "true" || sarg == "1";
182  } else if ( skipTest ) {
183  cout << "Skipping test_Dune35tNoiseRemovalService to avoid hang." << endl;
184  cout << "See https://cdcvs.fnal.gov/redmine/issues/19206" << endl;
185  return 0;
186  }
187  return test_Dune35tNoiseRemovalService(useExistingFcl);
188 }
189 
190 //**********************************************************************
def line(rflist, normalization=13700 *units.eplus)
Definition: __init__.py:701
std::string string
Definition: nybbler.cc:12
static constexpr FileOnPath_t FileOnPath
struct vector vector
static void load_services(std::string const &config)
Q_EXPORT QTSManip setprecision(int p)
Definition: qtextstream.h:343
std::vector< AdcSignal > AdcSignalVector
Definition: AdcTypes.h:22
float AdcSignal
Definition: AdcTypes.h:21
static Config * config
Definition: config.cpp:1054
int main(int argc, char *argv[])
virtual int update(AdcChannelDataMap &datamap) const =0
Q_EXPORT QTSManip setw(int w)
Definition: qtextstream.h:331
virtual std::ostream & print(std::ostream &out=std::cout, std::string prefix="") const =0
int test_Dune35tNoiseRemovalService(bool useExistingFcl)
std::map< AdcChannel, AdcChannelData > AdcChannelDataMap
AdcSignalVector samples
unsigned int AdcChannel
Definition: AdcTypes.h:50
QTextStream & endl(QTextStream &s)