00001 #include "BDSwicDevice.h"
00002 #include "BDSwicCalibrator.h"
00003
00004 #include <RawData/RawBeamData.h>
00005 #include <Conventions/Munits.h>
00006
00007 #include <MessageService/MsgService.h>
00008 CVSID("$Id: BDSwicDevice.cxx,v 1.9 2005/08/22 15:40:44 bishai Exp $");
00009
00010
00011 #include <string>
00012 using namespace std;
00013
00014 BDSwicDevice::BDSwicDevice()
00015 : RawBeamSwicData()
00016 , fPeds(96,0)
00017 , fMask(96,1)
00018 , fNoise(96,0.1)
00019 , fMvPerADC(-0.30518)
00020 , fScale(1.0)
00021 , fGain(1.0)
00022 , fCap(0)
00023 , fType(kUnknown)
00024
00025 {
00026 }
00027
00028 BDSwicDevice::BDSwicDevice(const RawBeamData& swic_data)
00029 : RawBeamSwicData(swic_data)
00030 , fPeds(96,0)
00031 , fMask(96,1)
00032 , fNoise(96,0.1)
00033 , fMvPerADC(-0.30518)
00034 , fScale(1.0)
00035 , fGain(1.0)
00036 , fCap(0)
00037 , fType(kUnknown)
00038 {
00039 this->RawBeamSwicData::UnscaledWireData(fData);
00040 this->UpdateType();
00041 BDSwicCalibrator::Get().AddDevice(*this);
00042 }
00043
00044 BDSwicDevice::~BDSwicDevice()
00045 {
00046 BDSwicCalibrator::Get().RemoveDevice(*this);
00047 }
00048 void BDSwicDevice::SetData(const RawBeamData& swic_data)
00049 {
00050 this->RawBeamSwicData::SetData(swic_data);
00051
00052 if (!this->IsValid())
00053 MSG("BDU",Msg::kInfo) << swic_data.GetName() << " given invalid data\n";
00054
00055
00056 fData.clear();
00057 this->RawBeamSwicData::UnscaledWireData(fData);
00058
00059 this->UpdateType();
00060 BDSwicCalibrator::Get().AddDevice(*this);
00061 }
00062 void BDSwicDevice::UpdateType()
00063 {
00064 if (!this->IsValid()) {
00065 MSG("BDU",Msg::kWarning)
00066 << "BDSwicDevice: Attempt to update with invalid data\n";
00067 fType = kUnknown;
00068 return;
00069 }
00070 string name = this->GetData().GetName();
00071 if (name == "E:HADMDS") {
00072 fType = kHadron;
00073 return;
00074 }
00075 if (name == "E:MMA1DS" || name == "E:MMA2DS" || name == "E:MMA3DS") {
00076 fType = kMuon;
00077 return;
00078 }
00079 if (name == "E:M117DS") {
00080 fType = kWire;
00081 return;
00082 }
00083 fType = kProfile;
00084 }
00085
00086 bool BDSwicDevice::SetPeds(const std::vector<double>& peds)
00087 {
00088 if (peds.size() != 96) return false;
00089 fPeds = peds;
00090 return true;
00091 }
00092 bool BDSwicDevice::SetMask(const std::vector<double>& mask)
00093 {
00094 if (mask.size() != 96) return false;
00095 fMask = mask;
00096 return true;
00097 }
00098
00099 bool BDSwicDevice::SetNoise(const std::vector<double>& noise)
00100 {
00101 if (noise.size() != 96) return false;
00102 fNoise = noise;
00103 return true;
00104 }
00105
00106
00107 void BDSwicDevice::SetScale(double scale)
00108 {
00109 fScale = scale;
00110 }
00111 void BDSwicDevice::SetMvPerADC(double mvperadc)
00112 {
00113 fMvPerADC = mvperadc;
00114 }
00115 void BDSwicDevice::SetGainCorrection(double gain)
00116 {
00117 fGain = gain;
00118 }
00119 void BDSwicDevice::SetCapacitance(double cap)
00120 {
00121 fCap = cap;
00122 }
00123
00124
00125 double BDSwicDevice::GetVoltage(int index) const
00126 {
00127 if (!fData.size() || index < 0 || index >= 96) {
00128 MSG("BDU",Msg::kWarning)
00129 << "BDSwicDevice::GetVoltage given bad index: " << index << endl;
00130 return 0;
00131 }
00132 return fScale*fMvPerADC*(fData[index] - fPeds[index])*fMask[index]*Munits::millivolt;
00133 }
00134
00135
00136 double BDSwicDevice::GetNoise(int index) const
00137 {
00138 if (!fData.size() || index < 0 || index >= 96) {
00139 MSG("BDU",Msg::kWarning)
00140 << "BDSwicDevice::GetNoise given bad index: " << index << endl;
00141 return 0;
00142 }
00143 return fScale*fMvPerADC*fNoise[index]*Munits::millivolt;
00144 }
00145
00146 double BDSwicDevice::GetTotalVoltage()
00147 {
00148 if (!fData.size()) return 0.0;
00149 double ret=0;
00150 for (int ind=0; ind<96; ++ind)
00151 ret += (fData[ind] - fPeds[ind])*fMask[ind];
00152 ret *= fScale*fMvPerADC*Munits::millivolt;
00153 return ret;
00154 }
00155 double BDSwicDevice::GetCharge(int index) const
00156 {
00157 return this->GetVoltage(index)*fCap;
00158 }
00159 double BDSwicDevice::GetTotalCharge()
00160 {
00161 if (fCap == 0.0) {
00162 MSG("BDU",Msg::kWarning)
00163 << "BDSwicDevice::GetTotalCharge called but capacitance is zero\n";
00164 return 0;
00165 }
00166 return this->GetTotalVoltage() * fCap;
00167 }