00001 #include "BeamMonSwicPedsDbuModule.h"
00002
00003 #include <BeamDataUtil/BeamMonSwicPeds.h>
00004 #include <BeamDataUtil/BDUniquify.h>
00005
00006 #include <BeamDataUtil/BDSwicPeds.h>
00007 #include <BeamDataUtil/BDPipeline.h>
00008
00009 #include <MessageService/MsgService.h>
00010 #include <JobControl/JobCModuleRegistry.h>
00011
00012 #include <RawData/RawBeamMonHeaderBlock.h>
00013 #include <RawData/RawBeamMonBlock.h>
00014
00015 CVSID("$Id: BeamMonSwicPedsDbuModule.cxx,v 1.11 2006/04/19 20:58:05 rhatcher Exp $");
00016
00017 #include <DatabaseInterface/DbiWriter.h>
00018
00019 #include <DatabaseInterface/DbiWriter.tpl>
00020 template class DbiWriter<BeamMonSwicPeds>;
00021
00022 #include <Registry/Registry.h>
00023
00024 #include <DataUtil/GetRawBlock.h>
00025 using namespace DataUtil;
00026
00027
00028 JOBMODULE(BeamMonSwicPedsDbuModule,
00029 "BeamMonSwicPedsDbu",
00030 "Update the database with Beam Monitoring device pedestals.");
00031
00032 using namespace std;
00033
00034 BeamMonSwicPedsDbuModule::BeamMonSwicPedsDbuModule()
00035 : fPipe()
00036 , fPedsProc(new BDSwicPeds)
00037 , fCount(0)
00038 {
00039 fPipe.GetProcessPipeline().push_back(fPedsProc);
00040 }
00041
00042 BeamMonSwicPedsDbuModule::~BeamMonSwicPedsDbuModule()
00043 {
00044 }
00045
00046 JobCResult BeamMonSwicPedsDbuModule::Ana(const MomNavigator *mom)
00047 {
00048 static BDUniquify uniqifier;
00049 vector<BDUniquify::BlockPair> blocks = uniqifier.GetUniqueBlocks(*mom);
00050
00051 size_t nblocks = blocks.size();
00052
00053 if (nblocks == 0) {
00054 MSG("BD",Msg::kWarning)
00055 << "No good beam monitoring data in MOM\n";
00056 return JobCResult::kFailed;
00057 }
00058
00059 const int trigger_event = 0xa9;
00060 for (size_t iblock=0; iblock<nblocks; ++iblock) {
00061 const RawBeamMonHeaderBlock& rbmhb = *blocks[iblock].first;
00062 const RawBeamMonBlock& rbmb = *blocks[iblock].second;
00063
00064 if (rbmb.TclkTriggerEvent() != trigger_event) {
00065 MSG("BD",Msg::kWarning)
00066 << "Wrong trigger event: " << rbmb.TclkTriggerEvent()
00067 << " != " << trigger_event << endl;
00068 continue;
00069 }
00070
00071
00072 fPipe.SetSpill(rbmhb,rbmb);
00073 }
00074
00075 return JobCResult::kAOK;
00076 }
00077 void BeamMonSwicPedsDbuModule::BeginFile()
00078 {
00079 MSG("BD",Msg::kDebug) << "BeginFile: " << this->GetCurrentFile() << endl;
00080 }
00081
00082
00083 void BeamMonSwicPedsDbuModule::EndFile()
00084 {
00085 MSG("BD",Msg::kDebug) << "EOF\n";
00086 this->Dump();
00087 }
00088
00089 void BeamMonSwicPedsDbuModule::EndJob()
00090 {
00091 MSG("BD",Msg::kDebug) << "EOJ\n";
00092 }
00093
00094 void BeamMonSwicPedsDbuModule::Dump()
00095 {
00096 VldTimeStamp vts_start = fPedsProc->GetStart();
00097 VldTimeStamp vts_stop = fPedsProc->GetStop();
00098
00099 if (vts_stop < vts_start) {
00100 MSG("BD",Msg::kWarning)
00101 << "No Peds for any devices in this database dump\n";
00102 return;
00103 }
00104
00105 const BDSwicPeds::SwicMap& chmap = fPedsProc->GetAllChannels();
00106 BDSwicPeds::SwicMap::const_iterator it, done = chmap.end();
00107
00108
00109
00110
00111 bool got_one = false;
00112 for (it=chmap.begin(); it != done; ++it) {
00113 assert(it->second);
00114 if (it->second->GetPopulationSize() > 0) {
00115 got_one = true;
00116 break;
00117 }
00118 }
00119 if (!got_one) {
00120 MSG("BD",Msg::kWarning) << "Aborting DB dump, no data\n";
00121 return;
00122 }
00123
00124 VldRange range(Detector::kNear|Detector::kFar,SimFlag::kData,
00125 vts_start,vts_stop,"Beam");
00126
00127 VldTimeStamp now;
00128 DbiWriter<BeamMonSwicPeds> writer(range,-1,0,now);
00129
00130
00131 for (it=chmap.begin(); it != done; ++it) {
00132 const UtilRunningAverageVector& urav = *(it->second);
00133
00134 int nsamples = urav.GetPopulationSize();
00135 if (!nsamples) continue;
00136
00137 BeamMonSwicPeds ped(it->first.c_str());
00138 ped.SetNsamples(nsamples);
00139
00140 vector<double> means = urav.PopulationMean();
00141
00142 if (means.size() != 96) {
00143 MSG("BD",Msg::kFatal)
00144 << nsamples << " samples but size (" << means.size()
00145 << ") doesn't match for " << it->first << endl;
00146 abort();
00147 }
00148
00149 double tot = 0;
00150 for (int ind=0; ind<96; ++ind) tot += means[ind];
00151
00152 ped.SetChannelMeans(means);
00153 ped.SetChannelSigmas(urav.PopulationSigma());
00154
00155 writer << ped;
00156 MSG("BD",Msg::kDebug)
00157 << it->first << ", " << nsamples << " samples, tot peds = " << tot << endl;
00158 if (tot == 0.0) {
00159 MSG("BD",Msg::kWarning)
00160 << it->first << ", " << nsamples << " samples, tot peds = " << tot << endl;
00161 }
00162
00163 }
00164
00165 writer.Close();
00166 fPedsProc->Clear();
00167 }
00168