qmca  0.0.20
bm12controller.cpp
Go to the documentation of this file.
1 #include "bm12controller.h"
2 #include <qwt_plot.h>
3 #include <qwt_plot_curve.h>
4 #include <qwt_symbol.h>
5 #include "mcacontroller.h"
6 #include <QFileDialog>
7 #include <QTextStream>
8 
9 #include <stdio.h>
10 
11 BM12Controller::BM12Controller(MCAController *ctrl, QwtPlot *graph, QObject *parent)
12  : QObject(parent),
13  m_NChannels(13),
14  m_MCA("bm12det:aim_adc1"),
15  m_ADC("bm12det:adc1"),
16  m_HVPS("bm12det:hvps1"),
17  m_Controller(ctrl),
18  m_Graph(graph),
19  m_CurrentChannel(0),
20  m_CurrentWindow(0),
21  m_SaveDataPath(QDir::currentPath()),
22  m_SaveWindowsPath(QDir::currentPath())
23 {
24 // printf("BM12Controller::BM12Controller\n");
25 
26  for (int i=0; i<m_NChannels; i++) {
27  m_TCA.append(new EpicsPulseAnalyser(QString("bm12det:tca%1").arg(i+1)));
28  m_Waveforms.append(new BM12Waveforms());
29  }
30 
31  connect(&m_MCA, SIGNAL(valueChanged()), this, SLOT(mcaValueChanged()));
32 
33  m_ADC.setGain(2048);
34  m_ADC.setRange(2048);
35  m_ADC.setOffset(0);
38 
39  m_HVPS.setVoltage(500);
40  m_HVPS.setLimit(500);
41 }
42 
44 {
45  while (!m_TCA.isEmpty()) {
46  delete m_TCA.takeFirst();
47  }
48 
49  while (!m_Waveforms.isEmpty()) {
50  delete m_Waveforms.takeFirst();
51  }
52 }
53 
55 {
56  return &m_MCA;
57 }
58 
60 {
61  return &m_ADC;
62 }
63 
65 {
66  return m_TCA.value(chan);
67 }
68 
70 {
71  return &m_HVPS;
72 }
73 
74 void BM12Controller::selectSCA(int ch, int win)
75 {
76 // printf("BM12Controller::selectSCA(%d,%d)\n", ch,win);
77 
78 // pulseAnalyser(m_CurrentChannel)->setSelected(false);
79 // pulseAnalyser(m_CurrentChannel)->setGated(m_CurrentWindow, false);
80 
81  m_CurrentChannel = ch;
82  m_CurrentWindow = win;
83 
84 // pulseAnalyser(m_CurrentChannel)->setSelected(true);
85 // pulseAnalyser(m_CurrentChannel)->setGated(m_CurrentWindow, true);
86 
87  for (int i=0; i<m_NChannels; i++) {
89 
90  p->setSelected(i==ch);
91 
92  for (int j=0; j<p->channelCount(); j++) {
93  p->setGated(j, j==(win-1));
94  }
95  }
96 
97  if (win == 0) {
99  } else {
101  }
102 
103  pulseAnalyser(0)->settle(0.25);
104 
105  updateGraph();
106 }
107 
108 void BM12Controller::clear(int ch, int win)
109 {
110  if (ch >= 0 && ch < 13) {
111  BM12Waveforms *wf = m_Waveforms[ch];
112 
113  if (wf) {
114  switch (win) {
115  case 0:
116  m_MCA.erase();
117  wf -> YData().clear();
118  break;
119 
120  case 1:
121  wf -> YDataSaved1().clear();
122  break;
123 
124  case 2:
125  wf -> YDataSaved2().clear();
126  break;
127 
128  case 3:
129  wf -> YDataSaved3().clear();
130  break;
131  }
132  }
133 
134  updateGraph();
135  }
136 }
137 
138 void BM12Controller::save(int ch, int win)
139 {
140  // printf("BM12Controller::save(%d,%d)\n", ch,win);
141 
142 // m_CurrentChannel = ch;
143 // m_CurrentWindow = win;
144 
145  if (ch >= 0 && ch < 13) {
146  BM12Waveforms *wf = m_Waveforms[ch];
147 
148  if (wf) {
149  switch (win) {
150  case 1:
151  wf -> YDataSaved1() = wf -> YData();
152  break;
153 
154  case 2:
155  wf -> YDataSaved2() = wf -> YData();
156  break;
157 
158  case 3:
159  wf -> YDataSaved3() = wf -> YData();
160  break;
161  }
162  }
163 
164  updateGraph();
165  }
166 }
167 
168 void BM12Controller::count(int ch, int win)
169 {
170 // printf("BM12Controller::count(%d,%d)\n", ch,win);
171 
172  m_CurrentChannel = ch;
173  m_CurrentWindow = win;
174 
176 
177  mcaValueChanged();
178 }
179 
181 {
182 // printf("BM12Controller::mcaValueChanged() %d, %d\n", m_CurrentChannel, m_CurrentWindow);
183 
184  if (m_CurrentChannel >= 0 && m_CurrentChannel < 13) {
186 
187  if (wf) {
188  switch (m_CurrentWindow) {
189 
190  case 0:
191  wf -> YData() = m_MCA.value();
192  break;
193 
194  case 1:
195  wf -> YDataSCA1() = m_MCA.value();
196  break;
197 
198  case 2:
199  wf -> YDataSCA2() = m_MCA.value();
200  break;
201 
202  case 3:
203  wf -> YDataSCA3() = m_MCA.value();
204  break;
205 
206  default:
207  break;
208  }
209  }
210  }
211 
212  updateGraph();
213 }
214 
216 {
217  return bin*0.0538287-0.060349;
218 }
219 
221 {
222  if (m_CurrentChannel >= 0 && m_CurrentChannel < 13) {
224 
225  if (wf) {
226  int xlen = wf->XData().size();
227  int ylen = wf->YData().size();
228 
229 // if (ylen != xlen) {
230  wf->XData().resize(ylen);
231  for (int i=0; i<ylen; i++) {
232  wf->XData()[i] = calibratedValue(i);
233  }
234 // }
235 
236  m_Graph -> detachItems(QwtPlotItem::Rtti_PlotCurve);
237  m_Graph -> detachItems(QwtPlotItem::Rtti_PlotMarker);
238 
239  QwtPlotCurve *pc = new QwtPlotCurve("Total");
240  pc -> setSamples(wf->XData().data(), wf->YData().data(), ylen);
241  QPen pen(Qt::black);
242  pc -> setPen(pen);
243  pc -> setSymbol(new QwtSymbol(QwtSymbol::Ellipse,QBrush(),pen,QSize(3,3)));
244  pc -> attach(m_Graph);
245 
246  if (ylen == wf->YDataSCA1().size()) {
247  QwtPlotCurve *pc1 = new QwtPlotCurve("SCA1");
248  QPen pen(Qt::red);
249  pc1 -> setSamples(wf->XData().data(), wf->YDataSCA1().data(), ylen);
250  pc1 -> setPen(pen);
251  pc1 -> setSymbol(new QwtSymbol(QwtSymbol::Ellipse,QBrush(),pen,QSize(3,3)));
252  pc1 -> setBrush(QBrush(QColor(255,0,0,20)));
253  pc1 -> attach(m_Graph);
254  }
255 
256  if (ylen == wf->YDataSCA2().size()) {
257  QwtPlotCurve *pc1 = new QwtPlotCurve("SCA2");
258  QPen pen(Qt::green);
259  pc1 -> setSamples(wf->XData().data(), wf->YDataSCA2().data(), ylen);
260  pc1 -> setPen(pen);
261  pc1 -> setSymbol(new QwtSymbol(QwtSymbol::Ellipse,QBrush(),pen,QSize(3,3)));
262  pc1 -> setBrush(QBrush(QColor(0,255,0,20)));
263  pc1 -> attach(m_Graph);
264  }
265 
266  if (ylen == wf->YDataSCA3().size()) {
267  QwtPlotCurve *pc1 = new QwtPlotCurve("SCA3");
268  QPen pen(Qt::blue);
269  pc1 -> setSamples(wf->XData().data(), wf->YDataSCA3().data(), ylen);
270  pc1 -> setPen(pen);
271  pc1 -> setSymbol(new QwtSymbol(QwtSymbol::Ellipse,QBrush(),pen,QSize(3,3)));
272  pc1 -> setBrush(QBrush(QColor(0,0,255,20)));
273  pc1 -> attach(m_Graph);
274  }
275 
276  if (ylen == wf->YDataSaved1().size()) {
277  QwtPlotCurve *pc1 = new QwtPlotCurve("Saved A");
278  QPen pen(Qt::darkRed);
279  pc1 -> setSamples(wf->XData().data(), wf->YDataSaved1().data(), ylen);
280  pc1 -> setPen(pen);
281  pc1 -> attach(m_Graph);
282  }
283 
284  if (ylen == wf->YDataSaved2().size()) {
285  QwtPlotCurve *pc1 = new QwtPlotCurve("Saved B");
286  QPen pen(Qt::darkGreen);
287  pc1 -> setSamples(wf->XData().data(), wf->YDataSaved2().data(), ylen);
288  pc1 -> setPen(pen);
289  pc1 -> attach(m_Graph);
290  }
291 
292  if (ylen == wf->YDataSaved3().size()) {
293  QwtPlotCurve *pc1 = new QwtPlotCurve("Saved C");
294  QPen pen(Qt::darkBlue);
295  pc1 -> setSamples(wf->XData().data(), wf->YDataSaved3().data(), ylen);
296  pc1 -> setPen(pen);
297  pc1 -> attach(m_Graph);
298  }
299 
300  m_Controller -> replot();
301  }
302  }
303 }
304 
305 static void max(int& ncol, int &max, int sz)
306 {
307  if (sz) {
308  ncol++;
309 
310  if (sz > max) {
311  max = sz;
312  }
313  }
314 }
315 
317 {
318  int maxsize = 0;
319  int ncolumns = 0;
320 
321  BM12Waveforms *wf;
322 
323  foreach(wf, m_Waveforms) {
324  max(ncolumns, maxsize, wf->YData().size());
325  max(ncolumns, maxsize, wf->YDataSCA1().size());
326  max(ncolumns, maxsize, wf->YDataSCA2().size());
327  max(ncolumns, maxsize, wf->YDataSCA3().size());
328  max(ncolumns, maxsize, wf->YDataSaved1().size());
329  max(ncolumns, maxsize, wf->YDataSaved2().size());
330  max(ncolumns, maxsize, wf->YDataSaved3().size());
331  }
332 
333  QString name = QFileDialog::getSaveFileName(NULL, "Save Data...", m_SaveDataPath);
334 
335  if (name.length()) {
336  m_SaveDataPath = name;
337 
338 // printf("save mca data in file %s\n", qPrintable(name));
339 // printf("dirName %s\n", qPrintable(m_SaveDataPath));
340 
341  FILE *ofile = fopen(qPrintable(name),"a+");
342 
343  fprintf(ofile, "#S 1\n");
344  fprintf(ofile, "#N %d\n", ncolumns+2);
345  fprintf(ofile, "#L point percent");
346 
347  for (int i=0; i<m_Waveforms.size(); i++) {
348  wf = m_Waveforms[i];
349  if (wf->YData().size()) fprintf(ofile," ch%d", i+1);
350  if (wf->YDataSCA1().size()) fprintf(ofile," ch%dsca1", i+1);
351  if (wf->YDataSCA2().size()) fprintf(ofile," ch%dsca2", i+1);
352  if (wf->YDataSCA3().size()) fprintf(ofile," ch%dsca3", i+1);
353  if (wf->YDataSaved1().size()) fprintf(ofile, " ch%dsav1", i+1);
354  if (wf->YDataSaved2().size()) fprintf(ofile, " ch%dsav2", i+1);
355  if (wf->YDataSaved3().size()) fprintf(ofile, " ch%dsav3", i+1);
356  }
357  fprintf(ofile, "\n");
358 
359  for (int row=0; row<maxsize; row++) {
360  fprintf(ofile,"%d\t%g", row, calibratedValue(row));
361 
362  for (int i=0; i<m_Waveforms.size(); i++) {
363  wf = m_Waveforms[i];
364  if (wf->YData().size()>row) fprintf(ofile,"\t%g", wf->YData()[row]);
365  if (wf->YDataSCA1().size()>row) fprintf(ofile,"\t%g", wf->YDataSCA1()[row]);
366  if (wf->YDataSCA2().size()>row) fprintf(ofile,"\t%g", wf->YDataSCA2()[row]);
367  if (wf->YDataSCA3().size()>row) fprintf(ofile,"\t%g", wf->YDataSCA3()[row]);
368  if (wf->YDataSaved1().size()>row) fprintf(ofile, "\t%g", wf->YDataSaved1()[row]);
369  if (wf->YDataSaved2().size()>row) fprintf(ofile, "\t%g", wf->YDataSaved2()[row]);
370  if (wf->YDataSaved3().size()>row) fprintf(ofile, "\t%g", wf->YDataSaved3()[row]);
371  }
372  fprintf(ofile, "\n");
373  }
374 
375  fclose(ofile);
376  }
377 }
378 
380 {
381  QString name = QFileDialog::getOpenFileName(NULL, "Load Energy Windows...", m_SaveWindowsPath);
382 
383  if (name.length()) {
384  m_SaveWindowsPath = name;
385 
386 // printf("load windows from file %s\n", qPrintable(name));
387 
388  FILE *ifile = fopen(qPrintable(name),"r");
389  QTextStream istr(ifile);
390  QString line;
391  QRegExp match("epics_put\\(\\s*\"bm12det:tca(\\d+)SCA(\\d+)(\\S+)\",\\s*(\\S+)\\s*\\)\\;");
392 
393  do {
394  line = istr.readLine();
395 
396  if (match.exactMatch(line)) {
397  int chan = match.cap(1).toInt()-1;
398  int win = match.cap(2).toInt()-1;
399  int islow = match.cap(3)=="_LOW";
400  int ishigh = match.cap(3)=="_HI";
401 
402  double val = match.cap(4).toDouble();
403 
404  if (islow) {
405 // printf("set chan %d, win %d _LOW = %g\n", chan, win, val);
406  pulseAnalyser(chan)->setLowerLevel(win,val);
407  } else if (ishigh) {
408 // printf("set chan %d, win %d _HI = %g\n", chan, win, val);
409  pulseAnalyser(chan)->setUpperLevel(win,val);
410  }
411  }
412 
413  } while (!line.isNull());
414  }
415 }
416 
418 {
419  QString cmd;
420  EpicsPulseAnalyser *tca;
421 
422  foreach(tca, m_TCA) {
423  for (int i=0; i<tca->channelCount(); i++) {
424  EpicsDouble *lll = tca->lowerLevel(i);
425  EpicsDouble *hll = tca->upperLevel(i);
426 
427  cmd += QString("epics_put( \"%1\", %2 );\n").arg(lll->pvName()).arg(lll->value());
428  cmd += QString("epics_put( \"%1\", %2 );\n").arg(hll->pvName()).arg(hll->value());
429  }
430  }
431 
432 // printf("Energy Windows\n%s\n", qPrintable(cmd));
433 
434  QString name = QFileDialog::getSaveFileName(NULL, "Save Energy Windows...", m_SaveWindowsPath);
435 
436  if (name.length()) {
437  m_SaveWindowsPath = name;
438 
439 // printf("save windows in file %s\n", qPrintable(name));
440 
441  FILE *ofile = fopen(qPrintable(name), "w");
442  fputs(qPrintable(cmd), ofile);
443  fclose(ofile);
444  }
445 }
QVector< double > & YDataSaved2()
void setSelected(int slct)
void setRange(int gain)
void setOffset(int gain)
void setLowerLevelDiscrim(double l)
virtual ~BM12Controller()
EpicsDouble * upperLevel(int chan)
EpicsMCA * mca()
EpicsDouble * lowerLevel(int chan)
double value()
EpicsA2DConverter * a2d()
QList< BM12Waveforms * > m_Waveforms
void settle(double t)
EpicsPowerSupply * powerSupply()
QVector< double > & YDataSCA3()
void setLowerLevel(int chan, double lowerlevel)
BM12Controller(MCAController *ctrl, QwtPlot *graph, QObject *parent=0)
double calibratedValue(int bin)
QString pvName()
Definition: epicsobject.cpp:30
void setVoltage(double v)
void setGated(int chan, int gtd)
void saveData(int ch)
EpicsPowerSupply m_HVPS
QwtPlot * m_Graph
QVector< double > value()
Definition: epicsarray.cpp:90
QList< EpicsPulseAnalyser * > m_TCA
void eraseAndStart()
Definition: epicsmca.cpp:65
EpicsPulseAnalyser * pulseAnalyser(int chan)
void setUpperLevelDiscrim(double l)
void erase()
Definition: epicsmca.cpp:55
QVector< double > & YDataSCA1()
QVector< double > & YData()
void count(int ch, int win)
QString m_SaveDataPath
QVector< double > & YDataSaved1()
void selectSCA(int ch, int win)
void setLimit(double v)
QVector< double > & XData()
static void max(int &ncol, int &max, int sz)
void saveEnergyWindows(int ch)
EpicsA2DConverter m_ADC
void setUpperLevel(int chan, double upperlevel)
void setGain(int gain)
void clear(int ch, int mem)
QVector< double > & YDataSCA2()
QVector< double > & YDataSaved3()
void loadEnergyWindows(int ch)
QString m_SaveWindowsPath
void save(int ch, int mem)
MCAController * m_Controller
void setCoincidence(int coinc)