StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
St_spaceChargeCorC.cxx
1 #include "St_spaceChargeCorC.h"
2 #include "St_trigDetSumsC.h"
3 #include "StMemStat.h"
4 
5 Double_t St_spaceChargeCorC::getSpaceChargeCoulombs(Double_t scaleFactor)
6  {
7  St_trigDetSumsC* scalers = St_trigDetSumsC::instance();
8  if (! scalers ) return 0;
9  Double_t zf = zeroField(0); // potential validity margin for scalers
10  if (zf>0 && zf<1) scalers->setValidityMargin(zf);
11  Double_t coulombs = 0;
12 // StMemStat::PrintMem("Space charge before GetDate");
13  int idate = StMaker::GetChain()->GetDate();
14 // StMemStat::PrintMem("Space charge AFTER int GetDate() conversion");
15 
16  bool use_powers = idate > 20090101;
17 // bool use_powers = (StMaker::GetChain()->GetDate() > 20090101);
18 // StMemStat::PrintMem("Space charge AFTER comparision");
19  for (int row=0;row< (int) getNumRows();row++) {
20  Double_t mult = 0;
21  switch ((int) getSpaceChargeDetector(row)) {
22  case (0) : mult = scalers->getMult(); break; // vpdx as of 2007-12-19
23  case (1) : mult = scalers->getBBCX(); break;
24  case (2) : mult = scalers->getZDCX(); break;
25  case (3) : mult = scalers->getZDCEast()+scalers->getZDCWest(); break;
26  case (4) : mult = scalers->getBBCEast()+scalers->getBBCWest(); break;
27  case (5) : mult = scalers->getZDCEast(); break;
28  case (6) : mult = scalers->getZDCWest(); break;
29  case (7) : mult = scalers->getBBCEast(); break;
30  case (8) : mult = scalers->getBBCWest(); break;
31  case (9) : mult = scalers->getBBCYellowBkg(); break;
32  case (10): mult = scalers->getBBCBlueBkg(); break;
33  case (11): mult = scalers->getPVPDEast(); break;
34  case (12): mult = scalers->getPVPDWest(); break;
35  case (13) : mult = scalers->getCTBOrTOFp(); break; // zdcx-no-killer as of 2011
36  case (14) : mult = scalers->getCTBEast(); break; // zdce-no-killer as of 2011
37  case (15) : mult = scalers->getCTBWest(); break; // zdcw-no-killer as of 2011
38 
39  default : mult = 0.;
40  }
41  if (mult < 0) {
42  Mark();
43  return 0; // Unphysical scaler rates will be uncorrected
44  } else UnMark();
45  Double_t saturation = getSpaceChargeSatRate(row);
46  Double_t correction = getSpaceChargeCorrection(scaleFactor,row);
47  Double_t factor = getSpaceChargeFactor(row);
48  Double_t offset = getSpaceChargeOffset(row);
49  Double_t intens = (mult < saturation) ? mult : saturation;
50  if (use_powers) coulombs += ::pow(intens-offset,factor) * correction ;
51  else coulombs += factor * (intens-offset) * correction ;
52  }
53  return coulombs;
54  }
55 TString St_spaceChargeCorC::getSpaceChargeString(Double_t scaleFactor)
56  {
57  TString str,mult;
58  int idate = StMaker::GetChain()->GetDate();
59  bool use_powers = idate > 20090101;
60  for (int row=0;row< (int) getNumRows();row++) {
61  switch ((int) getSpaceChargeDetector(row)) {
62  case (0) : mult = "vpdx"; break; // vpdx as of 2007-12-19
63  case (1) : mult = "bbcx"; break;
64  case (2) : mult = "zdcx"; break;
65  case (3) : mult = "(zdce+zdcw)"; break;
66  case (4) : mult = "(bbce+bbcw)"; break;
67  case (5) : mult = "zdce"; break;
68  case (6) : mult = "zdcw"; break;
69  case (7) : mult = "bbce"; break;
70  case (8) : mult = "bbcw"; break;
71  case (9) : mult = "bbcyb"; break;
72  case (10): mult = "bbcbb"; break;
73  case (11): mult = "vpde"; break;
74  case (12): mult = "vpdw"; break;
75  case (13): mult = "zdcxnk"; break; // zdcx-no-killer as of 2011
76  case (14): mult = "zdcenk"; break; // zdce-no-killer as of 2011
77  case (15): mult = "zdcwnk"; break; // zdcw-no-killer as of 2011
78  default : mult = "";
79  }
80  Double_t correction = getSpaceChargeCorrection(scaleFactor,row);
81  Double_t factor = getSpaceChargeFactor(row);
82  Double_t offset = getSpaceChargeOffset(row);
83  if (factor==0 || correction==0 || mult.Length()==0) continue;
84  if (str.Length()) str += "+";
85  str += Form("(%g)*(",correction);
86  Bool_t factorIsInt = (TMath::Abs(factor - ((double) TMath::Nint(factor))) < 1e-6);
87  if (factorIsInt && factor>0.5 && factor<1.5) str += mult;
88  else {
89  if (use_powers) {
90  if (factorIsInt && factor>1.5) {
91  // use scaler*scaler*... form
92  while (factor>1.5) { (str += mult) += "*"; factor--; }
93  str += mult;
94  } else str += Form("pow(%s,%f)",mult.Data(),factor);
95  } else (str += Form("%g)*(",factor)) += mult;
96  }
97  if (offset!=0) str += Form("-(%g)",offset);
98  str += ")";
99  }
100  return str;
101  }