QwAnalysis
QwRegression.cc
Go to the documentation of this file.
1 /*
2  * QwRegression.cc
3  *
4  * Created on: Oct 22, 2010
5  * Author: wdconinc
6  */
7 
8 #include "QwRegression.h"
9 
10 // Qweak headers
11 #include "VQwDataElement.h"
12 #include "QwVQWK_Channel.h"
13 #include "QwParameterFile.h"
14 #define MYSQLPP_SSQLS_NO_STATICS
15 #include "QwParitySSQLS.h"
16 #include "QwParityDB.h"
17 
18 
19 /** Constructor with single event and helicity pattern
20  *
21  * @param options Options object
22  * @param event Single event
23  * @param helicitypattern Helicity pattern
24  */
26  QwOptions &options,
28  QwHelicityPattern& helicitypattern)
29 {
30  fEnableRegression = false;
31  ProcessOptions(options);
32  fSubsystemArray = &event;
33  fHelicityPattern = &helicitypattern;
35  QwSubsystemArrayParity& asym = helicitypattern.fAsymmetry;
36  QwSubsystemArrayParity& diff = helicitypattern.fDifference;
37  ConnectChannels(event,asym,diff);
38 }
39 
40 /** Constructor with single event
41  *
42  * @param options Options object
43  * @param event Single event
44  *
45  */
46 QwRegression::QwRegression(QwOptions &options, QwSubsystemArrayParity& event):fHelicityPattern(NULL)
47 {
48  fEnableRegression = false;
49  ProcessOptions(options);
50  fSubsystemArray = &event;
52  ConnectChannels(event);
53 
54 }
55 
56 /** Constructor with only helicity pattern
57  *
58  * @param options Obtions object
59  * @param helicitypattern Helicity Pattern
60  *
61  */
62 QwRegression::QwRegression(QwOptions &options, QwHelicityPattern& helicitypattern):fSubsystemArray(NULL)
63 {
64  fEnableRegression = false;
65  ProcessOptions(options);
67  fHelicityPattern = &helicitypattern;
68  QwSubsystemArrayParity& asym = helicitypattern.fAsymmetry;
69  QwSubsystemArrayParity& diff = helicitypattern.fDifference;
70  ConnectChannels(asym,diff);
71 }
72 
73 /** Constructor with options
74  *
75  * @param options Obtions object
76  *
77  */
79 {
80  fEnableRegression = false;
81  ProcessOptions(options);
83 }
84 
85 
87  fEnableRegression(source.fEnableRegression),
88  fRegressionMapFile(source.fRegressionMapFile),
89  fErrorFlag(source.fErrorFlag)
90 {
91  this->fDependentVar.resize(source.fDependentVar.size());
92  fDependentVarType.resize(source.fDependentVar.size());
93  for (size_t i = 0; i < this->fDependentVar.size(); i++) {
94  const QwVQWK_Channel* vqwk = dynamic_cast<const QwVQWK_Channel*>(source.fDependentVar[i].second);
95  this->fDependentVar[i].first = NULL;
96  this->fDependentVar[i].second = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
97  fDependentVarType[i] = source.fDependentVarType[i];
98  }
99 }
100 
101 /// Destructor
103 {
104  PairIterator element;
105  for (element = fDependentVar.begin();
106  element != fDependentVar.end(); element++) {
107  if (element->second != NULL){
108  delete element->second;
109  }
110  }
111  fDependentVar.clear();
112 }
113 
114 
115 /** Parse the variable type and name from a section header
116  *
117  * @param variable String with variable type and name
118  * @return Pair of variable type and name
119  */
120 std::pair<QwRegression::EQwRegType,std::string> QwRegression::ParseRegressionVariable(
121  const std::string& variable)
122 {
123  std::pair<EQwRegType,std::string> type_name;
124  size_t len = variable.length();
125  size_t pos1 = variable.find_first_of(":");
126  size_t pos2 = variable.find_first_not_of(":",pos1);
127  if (pos1 == std::string::npos) {
128  type_name.first = kRegTypeUnknown;
129  type_name.second = variable;
130  } else {
131  std::string type = variable.substr(0,pos1);
132  std::string name = variable.substr(pos2,len-pos2);
133  if (type == "asym")
134  type_name.first = kRegTypeAsym;
135  else if (type == "diff")
136  type_name.first = kRegTypeDiff;
137  else if (type == "mps")
138  type_name.first = kRegTypeMps;
139  else
140  type_name.first = kRegTypeUnknown;
141  type_name.second = name;
142  }
143  return type_name;
144 }
145 
146 
147 /** Load the channel map
148  *
149  * @param mapfile Filename of map file
150  * @return Zero when success
151  */
152 Int_t QwRegression::LoadChannelMap(const std::string& mapfile)
153 {
154  // Return if regression is not enabled
155  if (! fEnableRegression) return 0;
156 
157  // Open the file
158  QwParameterFile map(mapfile);
159 
160  // Read the sections of dependent variables
161  bool keep_header = true;
162  std::string section_name;
163  QwParameterFile* section = 0;
164  std::pair<EQwRegType,std::string> type_name;
165  while ((section = map.ReadNextSection(section_name,keep_header))) {
166 
167  // Store index to the current position in the dv vector
168  size_t current_dv_start = fDependentName.size();
169 
170  // Add dependent variables from the section header
171  section->ReadNextLine();
172  if (section->LineHasSectionHeader()) {
173  section->TrimSectionHeader();
174  section->TrimWhitespace();
175  // Parse section header into tokens separated by a comma
176  std::string current_token;
177  std::string previous_token;
178  do {
179  previous_token = current_token;
180  current_token = section->GetNextToken(",");
181  if (current_token.size() == 0) continue;
182  // Parse current token into dependent variable type and name
183  type_name = ParseRegressionVariable(current_token);
184  fDependentType.push_back(type_name.first);
185  fDependentName.push_back(type_name.second);
186  // Resize the vectors of sensitivities and independent variables
187  fSensitivity.resize(fDependentName.size());
188  fIndependentType.resize(fDependentName.size());
189  fIndependentName.resize(fDependentName.size());
190  } while (current_token.size() != 0);
191  } else QwError << "Section does not start with header." << QwLog::endl;
192 
193  // Add independent variables and sensitivities
194  while (section->ReadNextLine()) {
195  // Throw away comments, whitespace, empty lines
196  section->TrimComment();
197  section->TrimWhitespace();
198  if (section->LineIsEmpty()) continue;
199  // Get first token: independent variable
200  std::string current_token = section->GetNextToken(",");
201  // Parse current token into independent variable type and name
202  type_name = ParseRegressionVariable(current_token);
203  // Loop over dependent variables to set sensitivities
204  for (size_t dv = current_dv_start; dv < fDependentName.size(); dv++) {
205  Double_t sensitivity = atof(section->GetNextToken(",").c_str());
206  fSensitivity.at(dv).push_back(sensitivity);
207  fIndependentType.at(dv).push_back(type_name.first);
208  fIndependentName.at(dv).push_back(type_name.second);
209  }
210  }
211  }
212  return 0;
213 }
214 
215 /** Connect to the dependent and independent channels
216  *
217  * @param event Helicity event structure
218  * @param asym Asymmetry event structure
219  * @param diff Difference event structure
220  * @return Zero on success
221  */
223  QwSubsystemArrayParity& event,
226 {
227  // Return if regression is not enabled
228  if (! fEnableRegression) return 0;
229 
230  /// Fill vector of pointers to the relevant data elements
231  for (size_t dv = 0; dv < fDependentName.size(); dv++) {
232  // Get the dependent variables
233 
234  VQwHardwareChannel* dv_ptr = 0;
235  QwVQWK_Channel* new_vqwk = NULL;
236  QwVQWK_Channel* vqwk = NULL;
237  string name = "";
238  string reg = "reg_";
239 
240  if(fDependentName.at(dv).at(0) == '@' ){
241  name = fDependentName.at(dv).substr(1,fDependentName.at(dv).length());
242  }else{
243  switch (fDependentType.at(dv)) {
244  case kRegTypeMps:
245  dv_ptr = event.ReturnInternalValueForFriends(fDependentName.at(dv));
246  break;
247  case kRegTypeAsym:
248  dv_ptr = asym.ReturnInternalValueForFriends(fDependentName.at(dv));
249  break;
250  case kRegTypeDiff:
251  dv_ptr = diff.ReturnInternalValueForFriends(fDependentName.at(dv));
252  break;
253  default:
254  QwWarning << "Dependent variable for regression has unknown type."
255  << QwLog::endl;
256  break;
257  }
258 
259  vqwk = dynamic_cast<QwVQWK_Channel*>(dv_ptr);
260  name = vqwk->GetElementName().Data();
261  name.insert(0, reg);
262  new_vqwk = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
263  new_vqwk->SetElementName(name);
264  }
265 
266  // alias
267  if(fDependentName.at(dv).at(0) == '@'){
268  QwMessage << "dv: " << name << QwLog::endl;
269  new_vqwk = new QwVQWK_Channel(name, VQwDataElement::kDerived);
270  }
271  // defined type
272  else if(dv_ptr!=NULL){
273  QwMessage << "dv: " << fDependentName.at(dv) << QwLog::endl;
274  }else {
275  QwWarning << "Dependent variable " << fDependentName.at(dv) << " could not be found, "
276  << "or is not a VQWK channel." << QwLog::endl;
277  continue;
278  }
279 
280  // pair creation
281  if(new_vqwk != NULL){
282  fDependentVarType.push_back(fDependentType.at(dv));
283  fDependentVar.push_back(std::make_pair(vqwk, new_vqwk));
284  }
285 
286  // Add independent variables
287  fIndependentVar.resize(fDependentVar.size());
288  for (size_t iv = 0; iv < fIndependentName.at(dv).size(); iv++) {
289  // Get the independent variables
290  const VQwHardwareChannel* iv_ptr = 0;
291  switch (fIndependentType.at(dv).at(iv)) {
292  case kRegTypeMps:
293  iv_ptr = event.ReturnInternalValue(fIndependentName.at(dv).at(iv));
294  break;
295  case kRegTypeAsym:
296  iv_ptr = asym.ReturnInternalValue(fIndependentName.at(dv).at(iv));
297  break;
298  case kRegTypeDiff:
299  iv_ptr = diff.ReturnInternalValue(fIndependentName.at(dv).at(iv));
300  break;
301  default:
302  QwWarning << "Independent variable for regression has unknown type."
303  << QwLog::endl;
304  break;
305  }
306  if (iv_ptr) {
307  QwMessage << " iv: " << fIndependentName.at(dv).at(iv) << " (sens = "
308  << fSensitivity.at(dv).at(iv) << ")" << QwLog::endl;
309  fIndependentVar.back().push_back(std::make_pair(fSensitivity.at(dv).at(iv),
310  iv_ptr));
311  } else {
312  QwWarning << "Independent variable " << fIndependentName.at(dv).at(iv) << " for regression of "
313  << "dependent variable " << fDependentName.at(dv) << " could not be found."
314  << QwLog::endl;
315  }
316  }
317  }
318 
319  return 0;
320 
321 }
322 /** Connect to the dependent and independent channels
323  *
324  * @param asym Asymmetry event structure
325  * @param diff Difference event structure
326  * @return Zero on success
327  */
331 {
332  // Return if regression is not enabled
333  if (! fEnableRegression) return 0;
334 
335  /// Fill vector of pointers to the relevant data elements
336  for (size_t dv = 0; dv < fDependentName.size(); dv++) {
337  // Get the dependent variables
338 
339  VQwHardwareChannel* dv_ptr = 0;
340  QwVQWK_Channel* new_vqwk = NULL;
341  QwVQWK_Channel* vqwk = NULL;
342  string name = "";
343  string reg = "reg_";
344 
345  if (fDependentType.at(dv)==kRegTypeMps){
346  // Quietly ignore the MPS type when we're connecting the asym & diff
347  continue;
348  } else if(fDependentName.at(dv).at(0) == '@' ){
349  name = fDependentName.at(dv).substr(1,fDependentName.at(dv).length());
350  }else{
351  switch (fDependentType.at(dv)) {
352  case kRegTypeAsym:
353  dv_ptr = asym.ReturnInternalValueForFriends(fDependentName.at(dv));
354  break;
355  case kRegTypeDiff:
356  dv_ptr = diff.ReturnInternalValueForFriends(fDependentName.at(dv));
357  break;
358  default:
359  QwWarning << "QwRegression::ConnectChannels(QwSubsystemArrayParity& asym, QwSubsystemArrayParity& diff): Dependent variable, "
360  << fDependentName.at(dv)
361  << ", for asym/diff regression does not have proper type, type=="
362  << fDependentType.at(dv) << "."<< QwLog::endl;
363  break;
364  }
365 
366  vqwk = dynamic_cast<QwVQWK_Channel*>(dv_ptr);
367  name = vqwk->GetElementName().Data();
368  name.insert(0, reg);
369  new_vqwk = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
370  new_vqwk->SetElementName(name);
371  }
372 
373  // alias
374  if(fDependentName.at(dv).at(0) == '@'){
375  QwMessage << "dv: " << name << QwLog::endl;
376  new_vqwk = new QwVQWK_Channel(name, VQwDataElement::kDerived);
377  }
378  // defined type
379  else if(dv_ptr!=NULL){
380  QwMessage << "dv: " << fDependentName.at(dv) << QwLog::endl;
381  }else {
382  QwWarning << "Dependent variable " << fDependentName.at(dv) << " could not be found, "
383  << "or is not a VQWK channel." << QwLog::endl;
384  continue;
385  }
386 
387  // pair creation
388  if(new_vqwk != NULL){
389  fDependentVarType.push_back(fDependentType.at(dv));
390  fDependentVar.push_back(std::make_pair(vqwk, new_vqwk));
391  }
392 
393  // Add independent variables
394  fIndependentVar.resize(fDependentVar.size());
395  for (size_t iv = 0; iv < fIndependentName.at(dv).size(); iv++) {
396  // Get the independent variables
397  const VQwHardwareChannel* iv_ptr = 0;
398  switch (fIndependentType.at(dv).at(iv)) {
399  case kRegTypeAsym:
400  iv_ptr = asym.ReturnInternalValue(fIndependentName.at(dv).at(iv));
401  break;
402  case kRegTypeDiff:
403  iv_ptr = diff.ReturnInternalValue(fIndependentName.at(dv).at(iv));
404  break;
405  default:
406  QwWarning << "Independent variable for regression has unknown type."
407  << QwLog::endl;
408  break;
409  }
410  if (iv_ptr) {
411  QwMessage << " iv: " << fIndependentName.at(dv).at(iv) << " (sens = "
412  << fSensitivity.at(dv).at(iv) << ")" << QwLog::endl;
413  fIndependentVar.back().push_back(std::make_pair(fSensitivity.at(dv).at(iv),
414  iv_ptr));
415  } else {
416  QwWarning << "Independent variable " << fIndependentName.at(dv).at(iv) << " for regression of "
417  << "dependent variable " << fDependentName.at(dv) << " could not be found."
418  << QwLog::endl;
419  }
420  }
421  }
422 
423  return 0;
424 
425 }
426 
427 /** Connect to the dependent and independent channels
428  *
429  * @param event Helicity event structure
430  * @return Zero on success
431  */
433 {
434  // Return if regression is not enabled
435  if (! fEnableRegression) return 0;
436 
437  /// Fill vector of pointers to the relevant data elements
438  for (size_t dv = 0; dv < fDependentName.size(); dv++) {
439  // Get the dependent variables
440 
441  VQwHardwareChannel* dv_ptr = 0;
442  QwVQWK_Channel* new_vqwk = NULL;
443  QwVQWK_Channel* vqwk = NULL;
444  string name = " s";
445  string reg = "reg_";
446 
447  if (fDependentType.at(dv)==kRegTypeAsym || fDependentType.at(dv)==kRegTypeDiff){
448  // Quietly skip the asymmetry or difference types.
449  continue;
450  } else if(fDependentType.at(dv) != kRegTypeMps){
451  QwWarning << "QwRegression::ConnectChannels(QwSubsystemArrayParity& event): Dependent variable, "
452  << fDependentName.at(dv)
453  << ", for MPS regression does not have MPS type, type=="
454  << fDependentType.at(dv) << "."<< QwLog::endl;
455  continue;
456  } else {
457  if(fDependentName.at(dv).at(0) == '@' ){
458  name = fDependentName.at(dv).substr(1,fDependentName.at(dv).length());
459  new_vqwk = new QwVQWK_Channel(name, VQwDataElement::kDerived);
460  } else {
461  dv_ptr = event.ReturnInternalValueForFriends(fDependentName.at(dv));
462 
463  vqwk = dynamic_cast<QwVQWK_Channel*>(dv_ptr);
464  name = vqwk->GetElementName().Data();
465  name.insert(0,reg);
466  new_vqwk = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
467  new_vqwk->SetElementName(name);
468  }
469  }
470 
471  // alias
472  if(new_vqwk==NULL){
473  QwWarning << "Dependent variable " << fDependentName.at(dv) << " could not be found, "
474  << "or is not a VQWK channel." << QwLog::endl;
475  continue;
476  } else {
477  QwMessage << "dv: " << new_vqwk->GetElementName() << QwLog::endl;
478  // pair creation
479  fDependentVarType.push_back(fDependentType.at(dv));
480  fDependentVar.push_back(std::make_pair(vqwk, new_vqwk));
481  }
482 
483  // Add independent variables
484  fIndependentVar.resize(fDependentVar.size());
485  for (size_t iv = 0; iv < fIndependentName.at(dv).size(); iv++) {
486  // Get the independent variables
487  const VQwHardwareChannel* iv_ptr = 0;
488  if(fIndependentType.at(dv).at(iv) == kRegTypeMps){
489  iv_ptr = event.ReturnInternalValue(fIndependentName.at(dv).at(iv));
490  }else{
491  QwWarning << "Independent variable for MPS regression has unknown type."
492  << QwLog::endl;
493  }
494  if (iv_ptr) {
495  QwMessage << " iv: " << fIndependentName.at(dv).at(iv) << " (sens = "
496  << fSensitivity.at(dv).at(iv) << ")" << QwLog::endl;
497  fIndependentVar.back().push_back(std::make_pair(fSensitivity.at(dv).at(iv),
498  iv_ptr));
499  } else {
500  QwWarning << "Independent variable " << fIndependentName.at(dv).at(iv) << " for regression of "
501  << "dependent variable " << fDependentName.at(dv) << " could not be found."
502  << QwLog::endl;
503  }
504  }
505  }
506 
507  return 0;
508 }
509 
510 /**
511  * Defines configuration options using QwOptions functionality.
512  * @param options Options object
513  */
515 {
516  options.AddOptions("Linear regression")
517  ("enable-regression", po::value<bool>()->zero_tokens()->default_value(false),
518  "enable linear regression");
519  options.AddOptions("Linear regression")
520  ("regression-map", po::value<std::string>()->default_value("regression.map"),
521  "variables and sensitivities for regression");
522 }
523 
524 /**
525  * Process configuration options using QwOptions functionality.
526  * @param options Options object
527  */
529 {
530  fEnableRegression = options.GetValue<bool>("enable-regression");
531  fRegressionMapFile = options.GetValue<std::string>("regression-map");
532 }
533 
534 
535 /// Do the linear regression
537 {
538  // Return if regression is not enabled
539  if (! fEnableRegression){
540  QwDebug << "Regression is not enabled!" << QwLog::endl;
541  return;
542  }
543  // Get error flag from QwHelicityPattern
544  if (fHelicityPattern != NULL){
546  } else if (fSubsystemArray != NULL){
548  } else {
549  QwError << "QwRegression::LinearRegression: Can't set fErrorFlag" << QwLog::endl;
550  fErrorFlag = 0;
551  }
552  // Linear regression for each dependent variable
553  for (size_t dv = 0; dv < fDependentVar.size(); dv++) {
554  // if second is NULL, can't do regression
555  if (fDependentVar.at(dv).second == NULL){
556  QwError<<"Second is value is NULL, unable to calculate regression."<<QwLog::endl;
557  continue;
558  }
559  // For correct type (asym, diff, mps)
560  if (fDependentVarType.at(dv) != type) continue;
561 
562  // Clear data in second, if first is NULL
563  if (fDependentVar.at(dv).first == NULL){
564  fDependentVar.at(dv).second->ClearEventData();
565  }else{
566  // Update second value
567  fDependentVar.at(dv).second->AssignValueFrom(fDependentVar.at(dv).first);
568  }
569  // Add corrections
570  for (size_t iv = 0; iv < fIndependentVar.at(dv).size(); iv++) {
571  fDependentVar.at(dv).second->ScaledAdd(fIndependentVar.at(dv).at(iv).first,
572  fIndependentVar.at(dv).at(iv).second);
573  }
574  }
575 }
576 
577 
578 /**
579  * Construct the branch and tree vector
580  * @param tree Tree
581  * @param prefix Prefix
582  * @param values Vector of values
583  */
585  TTree *tree,
586  TString& prefix,
587  std::vector<Double_t>& values)
588 {
589  PairConstIterator element;
590  for (element = fDependentVar.begin();
591  element != fDependentVar.end(); ++element) {
592  element->second->ConstructBranchAndVector(tree, prefix, values);
593  }
594 };
595 
596 /**
597  * Fill the tree vector
598  * @param values Vector of values
599  */
600 void QwRegression::FillTreeVector(std::vector<Double_t>& values) const
601 {
602  // Fill the data element
603  PairConstIterator element;
604  for (element = fDependentVar.begin();
605  element != fDependentVar.end(); ++element) {
606  if (element->second == NULL) continue;
607  element->second->FillTreeVector(values);
608  }
609 };
610 
611 
613 {
614  if (value.fErrorFlag==0){
615  for (size_t i = 0; i < value.fDependentVar.size(); i++){
616  this->fDependentVar[i].second->AccumulateRunningSum(value.fDependentVar[i].second);
617  }
618  }
619 }
620 
621 
623 {
624  for(size_t i = 0; i < fDependentVar.size(); i++) {
625  fDependentVar[i].second->CalculateRunningAverage();
626  }
627 
628  return;
629 }
630 
631 
633 {
634  QwMessage<<"=== QwRegression ==="<<QwLog::endl<<QwLog::endl;
635  for(size_t i = 0; i < fDependentVar.size(); i++) {
636  fDependentVar[i].second->PrintValue();
637  }
638 }
639 
640 void QwRegression::FillDB(QwParityDB *db, TString datatype)
641 {
642  if (! fEnableRegression){
643  QwDebug << " QwRegression::FillDB: Regression is not enabled!"
644  << QwLog::endl;
645  return;
646  }
647  Bool_t local_print_flag = kTRUE;
648 
649  UInt_t analysis_id = db->GetAnalysisID();
650 
651  TString measurement_type;
652  measurement_type = QwDBInterface::DetermineMeasurementTypeID(datatype);
653 
654  std::vector<QwDBInterface> interface;
655 
656  std::vector<QwParitySSQLS::beam> beamlist;
657  std::vector<QwParitySSQLS::md_data> mdlist;
658  std::vector<QwParitySSQLS::lumi_data> lumilist;
659 
661 
662 
663  for(size_t i = 0; i < fDependentVar.size(); i++) {
664  interface.clear();
665  fDependentVar[i].second->AddEntriesToList(interface);
666  for(size_t j=0; j<interface.size(); j++) {
667  interface.at(j).SetAnalysisID( analysis_id ) ;
668  interface.at(j).SetMeasurementTypeID( measurement_type );
669  tabletype = interface.at(j).SetDetectorID( db );
670  if (tabletype==QwDBInterface::kQwDBI_OtherTable){
671  TString tmp_name = interface.at(j).GetDeviceName();
672  tmp_name.Remove(0,5);
673  interface.at(j).SetDetectorName(tmp_name);
674  tabletype = interface.at(j).SetDetectorID( db );
675  }
676  if (tabletype==QwDBInterface::kQwDBI_BeamTable){
677  interface.at(j).AddThisEntryToList( beamlist );
678  } else if (tabletype==QwDBInterface::kQwDBI_MDTable){
679  interface.at(j).AddThisEntryToList( mdlist );
680  } else if (tabletype==QwDBInterface::kQwDBI_LumiTable){
681  interface.at(j).AddThisEntryToList( lumilist );
682  } else {
683  QwError << "QwRegression::FillDB: Unrecognized detector name: "
684  << interface.at(j).GetDeviceName() << QwLog::endl;
685  }
686  interface.at(j).PrintStatus( local_print_flag);
687  }
688  }
689 
690  db->Connect();
691  // Check the entrylist size, if it isn't zero, start to query..
692  if( beamlist.size() ) {
693  mysqlpp::Query query= db->Query();
694  query.insert(beamlist.begin(), beamlist.end());
695  query.execute();
696  } else {
697  QwMessage << "QwRegression::FillDB :: This is the case when the beamlist contains nothing for type="<< measurement_type.Data()
698  << QwLog::endl;
699  }
700  if( mdlist.size() ) {
701  mysqlpp::Query query= db->Query();
702  query.insert(mdlist.begin(), mdlist.end());
703  query.execute();
704  } else {
705  QwMessage << "QwRegression::FillDB :: This is the case when the mdlist contains nothing for type="<< measurement_type.Data()
706  << QwLog::endl;
707  }
708  if( lumilist.size() ) {
709  mysqlpp::Query query= db->Query();
710  query.insert(lumilist.begin(), lumilist.end());
711  query.execute();
712  } else {
713  QwMessage << "QwRegression::FillDB :: This is the case when the lumilist contains nothing for type="<< measurement_type.Data()
714  << QwLog::endl;
715  }
716  db->Disconnect();
717  return;
718 }
719 
720 
std::vector< std::string > fDependentName
Definition: QwRegression.h:115
#define QwMessage
Predefined log drain for regular messages.
Definition: QwLog.h:50
const VQwHardwareChannel * ReturnInternalValue(const TString &name) const
Retrieve the variable name from subsystems in this subsystem array.
std::string fRegressionMapFile
Regression dependent and independent variable map.
Definition: QwRegression.h:101
QwSubsystemArrayParity fDifference
std::pair< EQwRegType, std::string > ParseRegressionVariable(const std::string &variable)
Parse regression variable in type and name.
QwSubsystemArrayParity * fSubsystemArray
Single event pointer.
Definition: QwRegression.h:104
std::vector< std::vector< Double_t > > fSensitivity
Definition: QwRegression.h:118
virtual ~QwRegression()
Virtual destructor.
void Disconnect()
Definition: QwDatabase.h:59
Bool_t Connect()
Open a connection to the database using the predefined parameters.
Definition: QwDatabase.cc:175
An options class.
Definition: QwOptions.h:133
std::string GetNextToken(const std::string &separatorchars)
Get next token as a string.
EQwRegType
Type of regression variable.
Definition: QwRegression.h:24
void AccumulateRunningSum(QwRegression value)
std::vector< std::pair< VQwHardwareChannel *, VQwHardwareChannel * > > fDependentVar
Definition: QwRegression.h:121
void TrimComment(const char commentchar)
QwHelicityPattern * fHelicityPattern
Helicity pattern pointer.
Definition: QwRegression.h:106
UInt_t GetAnalysisID()
Definition: QwParityDB.h:71
QwSubsystemArrayParity fAsymmetry
void LinearRegression(EQwRegType type)
Linear regression.
UInt_t fErrorFlag
Definition: QwRegression.h:108
std::vector< std::vector< std::pair< Double_t, const VQwHardwareChannel * > > > fIndependentVar
Definition: QwRegression.h:122
po::options_description_easy_init AddOptions(const std::string &blockname="Specialized options")
Add an option to a named block or create new block.
Definition: QwOptions.h:164
QwParameterFile * ReadNextSection(std::string &secname, const bool keep_header=false)
void CalculateRunningAverage()
Definition of the pure virtual base class of all data elements.
T GetValue(const std::string &key)
Get a templated value.
Definition: QwOptions.h:240
Virtual base class for the parity subsystems.
std::vector< std::vector< std::string > > fIndependentName
Definition: QwRegression.h:117
void FillDB(QwParityDB *db, TString datatype)
#define QwDebug
Predefined log drain for debugging output.
Definition: QwLog.h:60
mysqlpp::Query Query(const char *qstr=0)
Definition: QwDatabase.h:66
Bool_t ReadNextLine()
bool fEnableRegression
Flag to enable regression.
Definition: QwRegression.h:94
void SetElementName(const TString &name)
Set the name of this element.
static void DefineOptions(QwOptions &options)
Define the configuration options.
void PrintValue() const
void ConstructBranchAndVector(TTree *tree, std::vector< Double_t > &values)
Construct the tree and vector for this subsystem.
Definition: QwRegression.h:74
UInt_t GetEventcutErrorFlag() const
Return the error flag to the main routine.
Bool_t LineHasSectionHeader()
UInt_t GetEventcutErrorFlag() const
Int_t ConnectChannels(QwSubsystemArrayParity &event, QwSubsystemArrayParity &asym, QwSubsystemArrayParity &diff)
Connect to channels.
static std::ostream & endl(std::ostream &)
End of the line.
Definition: QwLog.cc:299
void FillTreeVector(std::vector< Double_t > &values) const
Fill the vector for this subsystem.
virtual const TString & GetElementName() const
Get the name of this element.
void TrimWhitespace(TString::EStripType head_tail=TString::kBoth)
static TString DetermineMeasurementTypeID(TString type, TString suffix="", Bool_t forcediffs=kFALSE)
void ProcessOptions(QwOptions &options)
Process the configuration options.
QwRegression()
Private default constructor.
Definition: QwRegression.h:94
Int_t LoadChannelMap(const std::string &mapfile)
Load the channels and sensitivities.
#define QwWarning
Predefined log drain for warnings.
Definition: QwLog.h:45
std::vector< std::vector< EQwRegType > > fIndependentType
Definition: QwRegression.h:116
std::vector< EQwRegType > fDependentVarType
Definition: QwRegression.h:120
std::vector< std::pair< VQwHardwareChannel *, VQwHardwareChannel * > >::const_iterator PairConstIterator
Definition: QwRegression.h:29
#define QwError
Predefined log drain for errors.
Definition: QwLog.h:40
std::vector< EQwRegType > fDependentType
List of channels to use in the regression.
Definition: QwRegression.h:114
std::vector< std::pair< VQwHardwareChannel *, VQwHardwareChannel * > >::iterator PairIterator
Definition: QwRegression.h:28