Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

BeamMonSwicPedsDbuModule.cxx

Go to the documentation of this file.
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 //  Instantiate associated Result Pointer class.
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; // FIXME: needs to be a configurable param.
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     // Do an initial run through to see if there is at least one
00109     // pedestal set ready.  This is done to avoid creating VLD entries
00110     // with no associated main table rows.
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 

Generated on Mon Nov 23 05:26:11 2009 for loon by  doxygen 1.3.9.1