00001 #include "St_spaceChargeCorC.h"
00002 #include "StDetectorDbRichScalers.h"
00003 #include "StMemStat.h"
00004
00005 Double_t St_spaceChargeCorC::getSpaceChargeCoulombs(Double_t scaleFactor)
00006 {
00007 StDetectorDbRichScalers* scalers = StDetectorDbRichScalers::instance();
00008 if (! scalers ) return 0;
00009 Double_t zf = zeroField(0);
00010 if (zf>0 && zf<1) scalers->setValidityMargin(zf);
00011 Double_t coulombs = 0;
00012
00013 int idate = StMaker::GetChain()->GetDate();
00014
00015
00016 bool use_powers = idate > 20090101;
00017
00018
00019 for (int row=0;row< (int) getNumRows();row++) {
00020 Double_t mult = 0;
00021 switch ((int) getSpaceChargeDetector(row)) {
00022 case (0) : mult = scalers->getMult(); break;
00023 case (1) : mult = scalers->getBBCX(); break;
00024 case (2) : mult = scalers->getZDCX(); break;
00025 case (3) : mult = scalers->getZDCEast()+scalers->getZDCWest(); break;
00026 case (4) : mult = scalers->getBBCEast()+scalers->getBBCWest(); break;
00027 case (5) : mult = scalers->getZDCEast(); break;
00028 case (6) : mult = scalers->getZDCWest(); break;
00029 case (7) : mult = scalers->getBBCEast(); break;
00030 case (8) : mult = scalers->getBBCWest(); break;
00031 case (9) : mult = scalers->getBBCYellowBkg(); break;
00032 case (10): mult = scalers->getBBCBlueBkg(); break;
00033 default : mult = 0.;
00034 }
00035 if (mult < 0) {
00036 Mark();
00037 return 0;
00038 } else UnMark();
00039 Double_t saturation = getSpaceChargeSatRate(row);
00040 Double_t correction = getSpaceChargeCorrection(scaleFactor,row);
00041 Double_t factor = getSpaceChargeFactor(row);
00042 Double_t offset = getSpaceChargeOffset(row);
00043 Double_t intens = (mult < saturation) ? mult : saturation;
00044 if (use_powers) coulombs += ::pow(intens-offset,factor) * correction ;
00045 else coulombs += factor * (intens-offset) * correction ;
00046 }
00047 return coulombs;
00048 }