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

BDataQualityModule.cxx

Go to the documentation of this file.
00001 #include "BDataQualityModule.h"
00002 
00003 #include <BeamDataUtil/BDUniquify.h>
00004 #include <BeamDataUtil/BDEarliest.h>
00005 #include <BeamDataUtil/BDSpillAccessor.h>
00006 #include <HistMan/HistMan.h>
00007 #include <SpillTiming/SpillTimeFinder.h>
00008 #include <DataUtil/GetRawBlock.h>
00009 #include <DataUtil/DumpMom.h>
00010 #include <RawData/RawBeamMonBlock.h>
00011 #include <RawData/RawBeamMonHeaderBlock.h>
00012 #include <RawData/RawBeamData.h>
00013 #include <RawData/RawBeamSwicData.h>
00014 
00015 #include <JobControl/JobCModuleRegistry.h>
00016 #include <MessageService/MsgService.h>
00017 
00018 #include <TSystem.h>
00019 
00020 #include <iostream>
00021 #include <string>
00022 using namespace std;
00023 
00024 
00025 CVSID("$Id: BDataQualityModule.cxx,v 1.5 2007/11/11 08:16:11 rhatcher Exp $");
00026 JOBMODULE(BDataQualityModule,"BDataQuality","BDP<-->STND data quality histogrammer");
00027 
00028 const char* file_hist_dir = "BDP Data Quality/File Hists";
00029 const char* db_hist_dir = "BDP Data Quality/DB Hists";
00030 
00031 BDataQualityModule::BDataQualityModule()
00032     : fFirstSpillTime(0)
00033     , fLastSpillTime(0)
00034 {
00035 }
00036 BDataQualityModule::~BDataQualityModule()
00037 {
00038 }
00039 
00040 const char* tor_names[] = {
00041     "E:TORTGT","E:TRTGTD","E:TOR101","E:TR101D", 0
00042 };
00043 
00044 const char* important_devs[] = {
00045     "E:TORTGT","E:TRTGTD","E:TOR101","E:TR101D", 
00046     "E:HP121","E:VP121","E:HPTGT","E:VPTGT",
00047     "E:MTGTDS",
00048     "E:HADMDS","E:MMA1DS","E:MMA2DS","E:MMA3DS",
00049     "E:NSLINA","E:NSLINB","E:NSLINC","E:NSLIND",
00050     "I:NUTARZ",0
00051 };
00052 
00053 const char* some_swics[] = {
00054     "E:MTGTDS",
00055     "E:HADMDS","E:MMA1DS","E:MMA2DS","E:MMA3DS",
00056     0
00057 };
00058 
00059 JobCResult BDataQualityModule::Ana(const MomNavigator *mom)
00060 {
00061     static BDUniquify uniquify;
00062     static int count=-1, mult=1;
00063     ++count;
00064     
00065     if (count>mult*10) {
00066         mult *= 10;
00067     }
00068     
00069     if (count%mult == 0)
00070         cerr << count << endl;
00071 
00072     
00073     if (!mom) return JobCResult::kFailed;
00074 
00075     HistMan hm(file_hist_dir);
00076 
00077     int ntotalblocks = DataUtil::GetRawBlocks<RawBeamMonBlock>(mom).size();
00078     hm.Fill1d("total_blocks",ntotalblocks);
00079 
00080     vector<BDUniquify::BlockPair> unique = uniquify.GetUniqueBlocks(*mom);
00081     size_t nblocks = unique.size();    
00082     
00083     if (nblocks && fFirstSpillTime == 0.0)
00084         fFirstSpillTime = unique[0].first->GetTimeStamp();
00085     if (nblocks)
00086         fLastSpillTime = unique[0].first->GetTimeStamp();
00087 
00088     if (nblocks != 1) {
00089         cerr << "Other than a single block in record " << count << ", " << nblocks << endl;
00090         DataUtil::dump_mom(mom,cerr);
00091     }
00092 
00093     hm.Fill1d("unique_blocks",nblocks);
00094 
00095     for (size_t ind=0; ind<nblocks; ++ind) {
00096         this->FillFile(*unique[ind].first,*unique[ind].second);
00097     }
00098 
00099     return JobCResult::kAOK;
00100 }
00101 
00102 
00103 
00104 void BDataQualityModule::BeginFile()
00105 {
00106     HistMan hm(file_hist_dir);
00107 
00108     // Per MOM
00109     const char* hname = "unique_blocks";
00110     TH1I* hi = hm.Get<TH1I>(hname);
00111     if (hi) hi->Clear();
00112     else hm.Book<TH1I>(hname,"Unique BeamMonBlocks in RawRecord (should always be 1)",5,0,5);
00113     hname = "total_blocks";
00114     hi = hm.Get<TH1I>(hname);
00115     if (hi) hi->Clear();
00116     else hm.Book<TH1I>(hname,"Total BeamMonBlocks in RawRecord (should always be 1)",5,0,5);
00117 
00118 
00119     // Per block
00120     hname = "earliest_dae_stnd";
00121     TH1F* hf = hm.Get<TH1F>(hname);
00122     if (hf) hf->Clear();
00123     else hm.Book<TH1F>(hname,"Earliest DAE - STND (should be < 0.5)",1000,-1,1);
00124 
00125     hname = "earliest_vme_stnd";
00126     hf = hm.Get<TH1F>(hname);
00127     if (hf) hf->Clear();
00128     else hm.Book<TH1F>(hname,"Earliest VME - STND (should be < 0.5)",1000,-1,1);
00129     
00130     hname = "earliest_last_dae";
00131     hf = hm.Get<TH1F>(hname);
00132     if (hf) hf->Clear();
00133     else hm.Book<TH1F>(hname,"Rep period = Earliest - Last DAE (typically ~2sec)",
00134                        1000,0,10);
00135 
00136     hname = "dae_vme_dt";
00137     hf = hm.Get<TH1F>(hname);
00138     if (hf) hf->Clear();
00139     else hm.Book<TH1F>(hname,"DAE - VME time over TGT-Prof,Had,Mu monitors (should be ~0.5 sec)",
00140                        1000,-1,1);
00141 
00142     hname = "dae_vme_dt_min";
00143     TH2F *dae_vme_dt_min = hm.Get<TH2F>(hname);
00144     if (dae_vme_dt_min) dae_vme_dt_min->Clear();
00145     else dae_vme_dt_min =
00146              hm.Book<TH2F>(hname,"DAE - VME dt per min for TGT-PM,Had,Mu (>1.0 implies lost data)",
00147                            12*60,0,12*60, 100,-5,5);
00148 
00149     //
00150 
00151     hname = "spills_per_hour";
00152     hf = hm.Get<TH1F>(hname);
00153     if (hf) hf->Clear();
00154     else  hm.Book<TH1F>(hname,"Spills per hour",12,0,12);
00155 
00156     hname = "npot_per_hour";
00157     hf = hm.Get<TH1F>(hname);
00158     if (hf) hf->Clear();
00159     else hm.Book<TH1F>(hname,"Npot per hour",12,0,12);
00160 
00161     hname = "spills_per_min";
00162     hf = hm.Get<TH1F>(hname);
00163     if (hf) hf->Clear();
00164     else  hm.Book<TH1F>(hname,"Spills per min",12*60,0,12*60);
00165 
00166     hname = "npot_per_min";
00167     hf = hm.Get<TH1F>(hname);
00168     if (hf) hf->Clear();
00169     else hm.Book<TH1F>(hname,"Npot per min",12*60,0,12*60);
00170     
00171     hname = "toroids";
00172     hf = hm.Get<TH1F>(hname);
00173     if (hf) hf->Clear();
00174     else hf = hm.Book<TH1F>(hname,"Toroids",4,0,4);
00175     for (int ind=0; tor_names[ind]; ++ind) {
00176         hf->GetXaxis()->SetBinLabel(ind+1,tor_names[ind]);
00177     }
00178 
00179     hname = "tortgt_trtgtd";
00180     hf = hm.Get<TH1F>(hname);
00181     if (hf) hf->Clear();
00182     else hm.Book<TH1F>(hname,"(TORTGT - TRTGTD)/(TORTGT + TRTGTD)",100,-1,1);
00183 
00184     hname = "tor101_tr101d";
00185     hf = hm.Get<TH1F>(hname);
00186     if (hf) hf->Clear();
00187     else hm.Book<TH1F>(hname,"(TOR101 - TR101D)/(TOR101 + TR101D)",100,-1,1);
00188 
00189     hname = "tortgt_tor101";
00190     hf = hm.Get<TH1F>(hname);
00191     if (hf) hf->Clear();
00192     else hm.Book<TH1F>(hname,"(TORTGT - TOR101)/(TORTGT + TOR101)",100,-1,1);
00193 
00194     hname = "trtgtd_tr101d";
00195     hf = hm.Get<TH1F>(hname);
00196     if (hf) hf->Clear();
00197     else hm.Book<TH1F>(hname,"(TRTGTD - TR101D)/(TRTGTD + TR101D)",100,-1,1);
00198     
00199 
00200     int ndevs = 0;
00201     while (important_devs[ndevs]) ++ndevs;
00202 
00203     hname = "dev_count";
00204     hf = hm.Get<TH1F>(hname);
00205     if (hf) hf->Clear();
00206     else hf = hm.Book<TH1F>(hname,"Device counts",ndevs,0,ndevs);
00207     for (int ind=0; ind<ndevs; ++ind)
00208         hf->GetXaxis()->SetBinLabel(ind+1,important_devs[ind]);
00209 }
00210 
00211 void BDataQualityModule::EndFile()
00212 {
00213     HistMan hm(db_hist_dir);
00214 
00215     const char* hname = "";
00216 
00217     hname = "stnd_bdp_dt";
00218     TH1F *stnd_bdp_dt = hm.Get<TH1F>(hname);
00219     if (stnd_bdp_dt) stnd_bdp_dt->Clear();
00220     else stnd_bdp_dt =
00221              hm.Book<TH1F>(hname,"SpillTimeND - BDP Time (>1.0 implies lost data)",
00222                            1000,-1,1);
00223 
00224     hname = "stnd_bdp_dt_hour";
00225     TH2F *stnd_bdp_dt_hour = hm.Get<TH2F>(hname);
00226     if (stnd_bdp_dt_hour) stnd_bdp_dt_hour->Clear();
00227     else stnd_bdp_dt_hour =
00228              hm.Book<TH2F>(hname,"SpillTimeND - BDP Time per hour (>1.0 implies lost data)",
00229                            12,0,12, 100,-5,5);
00230 
00231     hname = "stnd_bdp_dt_min";
00232     TH2F *stnd_bdp_dt_min = hm.Get<TH2F>(hname);
00233     if (stnd_bdp_dt_min) stnd_bdp_dt_min->Clear();
00234     else stnd_bdp_dt_min =
00235              hm.Book<TH2F>(hname,"SpillTimeND - BDP Time per min (>1.0 implies lost data)",
00236                            12*60,0,12*60, 100,-5,5);
00237     
00238     // also need to check how many spills are in STND between the end
00239     // of the last file and the begin of this one.
00240 
00241     Detector::Detector_t det = Detector::kNear;
00242     SimFlag::SimFlag_t simflag = SimFlag::kData;
00243     VldTimeStamp vts(fFirstSpillTime);
00244     VldTimeStamp numi_start(2005,1,1,0,0,0);
00245 
00246     SpillTimeFinder& stf = SpillTimeFinder::Instance();
00247     BDSpillAccessor& sa = BDSpillAccessor::Get();
00248 
00249     while ((double)vts <= fLastSpillTime + 1.0) {
00250         VldContext vc(det,simflag,vts);
00251         VldTimeStamp stnd_vts = stf.GetTimeOfNextSpill(vc);
00252         
00253         if (stnd_vts < numi_start) {
00254             cerr << "Bailing on file due to getting early SpillTimeND: "
00255                  << stnd_vts
00256                  << " last vts = " << vts
00257                  << endl;
00258             break;
00259         }
00260 
00261         const BeamMonSpill* bms = sa.LoadSpill(stnd_vts);
00262         VldTimeStamp bms_vts;
00263         if (!bms) {
00264             cerr << "No BeamMonSpill for " << stnd_vts << endl;
00265             bms_vts = VldTimeStamp::GetEOT();
00266         }
00267         else {
00268             bms_vts = bms->SpillTime();
00269         }
00270 
00271         double dt = stnd_vts-bms_vts;
00272 
00273         stnd_bdp_dt->Fill(dt);
00274         stnd_bdp_dt_hour->Fill(((double)stnd_vts-fFirstSpillTime)/(60*60),dt);
00275         stnd_bdp_dt_min->Fill(((double)stnd_vts-fFirstSpillTime)/(60),dt);
00276 
00277         if (vts >= stnd_vts) {
00278             cerr << "Error, infinite loop, bailing with\n\tbms= " << vts
00279                  << " stnd= " << stnd_vts << endl;
00280             break;
00281         }
00282         vts = stnd_vts;
00283 
00284     }
00285     
00286     
00287 }
00288 
00289 void BDataQualityModule::FillFile(const RawBeamMonHeaderBlock& head,
00290                                   const RawBeamMonBlock& block)
00291 {
00292     static BDEarliest bde;
00293     bde.SetSpill(head,block);
00294     double dae=0,vme=0,last_dae=0,last_vme=0;
00295     bde.GetTimestamps(dae,vme);
00296     bde.GetLastTimestamps(last_dae,last_vme);
00297 
00298 
00299     Detector::Detector_t det = Detector::kNear;
00300     SimFlag::SimFlag_t simflag = SimFlag::kData;
00301     VldTimeStamp dae_vts(dae);
00302     VldContext vc(det,simflag,dae_vts);
00303 
00304     SpillTimeFinder& stf = SpillTimeFinder::Instance();
00305     VldTimeStamp stnd_vts = stf.GetTimeOfNearestSpill(vc);
00306     double stnd = stnd_vts;
00307 
00308     HistMan hm(file_hist_dir);
00309 
00310     const char* hname = "earliest_dae_stnd";
00311     hm.Fill1d(hname,dae-stnd);
00312 
00313     hname = "earliest_vme_stnd";
00314     hm.Fill1d(hname,vme-stnd);
00315     
00316     hname = "earliest_last_dae";
00317     hm.Fill1d(hname,dae-last_dae);
00318     
00319 
00320     hname = "dae_vme_dt";
00321     TH1F* dae_vme_dt =hm.Get<TH1F>(hname);
00322     hname = "dae_vme_dt_min";
00323     TH2F* dae_vme_dt_min = hm.Get<TH2F>(hname);
00324 
00325     RawBeamSwicData swic;
00326     for (int ind=0; some_swics[ind]; ++ind) {
00327         const RawBeamData* rbd = block[some_swics[ind]];
00328         if (!rbd) continue;
00329         VldTimeStamp dae_vts(rbd->GetSeconds(), 1000000*rbd->GetMsecs());
00330 
00331         swic.SetData(*rbd);
00332         VldTimeStamp vme_vts(swic.VmeSeconds(), swic.VmeNanoseconds());
00333 
00334         double dt = (double)(dae_vts - vme_vts);
00335 
00336         if (dae_vme_dt)
00337             dae_vme_dt->Fill(dt);
00338 
00339         if (dae_vme_dt_min)
00340             dae_vme_dt_min->Fill((dae-fFirstSpillTime)/60.,dt);
00341     }
00342 
00343     hname = "spills_per_hour";
00344     hm.Fill1d(hname,(dae-fFirstSpillTime)/(60*60));
00345 
00346     hname = "spills_per_min";
00347     hm.Fill1d(hname,(dae-fFirstSpillTime)/(60));
00348 
00349     double pot=0, pots[4] = {0};
00350 
00351     for (int ind=0; tor_names[ind]; ++ind) {
00352         const RawBeamData* tor_dev = block[tor_names[ind]];
00353         if (tor_dev && tor_dev->GetDataLength())
00354             pots[ind] = tor_dev->GetData()[0];
00355         if (pot == 0) pot = pots[ind];
00356         hm.Fill1d("toroids",ind,pots[ind]);
00357     }
00358     
00359 
00360     hname = "npot_per_hour";
00361     hm.Fill1d(hname,(dae-fFirstSpillTime)/(60*60),pot);
00362 
00363     hname = "npot_per_min";
00364     hm.Fill1d(hname,(dae-fFirstSpillTime)/(60),pot);
00365 
00366     const char* hnames[] = {
00367         "tortgt_trtgtd",//0,1
00368         "tor101_tr101d",//2,3
00369         "tortgt_tor101",//0,2
00370         "trtgtd_tr101d",//1,3
00371         0
00372     };
00373     for (int ind=0; ind<2; ++ind) {
00374         double sum = pots[ind*2]+pots[ind*2+1];
00375         TH1F* h = hm.Get<TH1F>(hnames[ind]);
00376         if (sum == 0.0)
00377             h->Fill(-1);
00378         else
00379             h->Fill((pots[ind*2]-pots[ind*2+1])/sum);
00380 
00381         sum = pots[ind]+pots[ind+2];
00382         h = hm.Get<TH1F>(hnames[ind+2]);
00383         if (sum == 0.0)
00384             h->Fill(-1);
00385         else
00386             h->Fill((pots[ind]-pots[ind+2])/sum);
00387 
00388     }
00389 
00390     hname = "dev_count";
00391     TH1F* id = hm.Get<TH1F>(hname);
00392     if (id) {
00393         for (int ind=0; important_devs[ind]; ++ind) {
00394             const RawBeamData* dev = block[important_devs[ind]];
00395             if (dev && dev->GetDataLength())
00396                 id->Fill(ind);
00397             else 
00398                 cerr << "Failed to get " << important_devs[ind] << endl;
00399         }
00400     }
00401     else cerr << "Failed to get dev_count\n";
00402 
00403 }
00404 
00405     

Generated on Sat Nov 7 01:25:06 2009 for loon by  doxygen 1.3.9.1