00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #include "JobControl/JobCModuleRegistry.h"
00012 #include "MinosObjectMap/MomNavigator.h"
00013 #include "OfflineTrigger/OltBlockScan.h"
00014 #include "MessageService/MsgService.h"
00015 #include "RawData/RawRecord.h"
00016 #include "RawData/RawHeader.h"
00017 #include "RawData/RawDataBlock.h"
00018 #include "RawData/RawDaqHeaderBlock.h"
00019 #include "RawData/RawSnarlHeaderBlock.h"
00020 #include "RawData/RawChannelId.h"
00021 #include "RawData/RawVaDigit.h"
00022 #include "RawData/RawQieDigit.h"
00023 #include "RawData/RawDigitDataBlock.h"
00024 #include "RawData/RawRunCommentBlock.h"
00025 #include "RawData/RawRunConfigBlock.h"
00026
00027 #include "Persistency/PerOutputStreamManager.h"
00028 #include "Persistency/PerOutputStream.h"
00029 #include "Rotorooter/RotoObjectifier.h"
00030 #include "Plex/PlexHandle.h"
00031 #include "Plex/PlexSEIdAltL.h"
00032 #include "Validity/VldContext.h"
00033
00034 #include "TString.h"
00035 #include "TFile.h"
00036 #include "TTree.h"
00037 #include <string>
00038
00039 #include <algorithm>
00040 #include <cstdio>
00041 #include <cstring>
00042 #include <iostream>
00043 #include <fstream>
00044 #ifndef __CINT__
00045 #include "OnlineUtil/mdBlockDefinitions.h"
00046 #endif
00047 ClassImp(OltBlockScan)
00048
00049
00050
00051 CVSID("$Id: OltBlockScan.cxx,v 1.13 2003/10/03 13:32:58 phil.adamson Exp $");
00052 JOBMODULE(OltBlockScan,"OltBlockScan","The Offline Trigger Block Scanner");
00053
00054
00055 OltBlockScan::OltBlockScan()
00056 {
00057 fRecord = 0;
00058 TDirectory *save = gDirectory;
00059 fFile = new TFile("/home/pa/bs.root","RECREATE");
00060 fTree = new TTree("tree","Timing Summary");
00061 fTree->Branch("crate",&fTreeCrate,"crate/I");
00062 fTree->Branch("time",&fTreeTime,"time/I");
00063 fTree->Branch("sec",&fCrateSec,"sec/I");
00064 fTree->Branch("nsec",&fCrateNSec,"nsec/I");
00065 fTree->Branch("tf",&fTreeTF,"tf/I");
00066 fTree->Branch("index",&fTreeIndex,"index/I");
00067 save->cd();
00068 }
00069
00070 OltBlockScan::~OltBlockScan()
00071 {
00072 TDirectory *save = gDirectory;
00073 fFile->cd();
00074 fTree->Write();
00075 fFile->Close();
00076 save->cd();
00077 }
00078
00079 JobCResult OltBlockScan::Reco(MomNavigator* mom)
00080 {
00081
00082
00083 TIter iter = mom->FragmentIter();
00084 while (TObject *obj = iter.Next()) {
00085 RawRecord *rawrec = dynamic_cast<RawRecord *>(obj);
00086 if (rawrec) {
00087 ++fRecord;
00088 MSG("Olt",Msg::kInfo) <<"---------------New Record---------------"<<endl;
00089 TIter recit = rawrec->GetRawBlockIter();
00090 while (TObject *obj = recit.Next()) {
00091 RawDataBlock *rawdata = dynamic_cast<RawDataBlock *>(obj);
00092 if (rawdata) {
00093 if (rawdata->InheritsFrom("RawDaqHeaderBlock")) {
00094 RawDaqHeaderBlock *rshb =dynamic_cast<RawDaqHeaderBlock *>(rawdata);
00095 MSG("Olt",Msg::kInfo)<<rshb->GetRun()<<" "<<rshb->GetSubRun()<<" "<<rshb->GetTimeStamp()<<endl;
00096 }
00097 if (rawdata->InheritsFrom("RawSnarlHeaderBlock")) {
00098 RawSnarlHeaderBlock *rshb =dynamic_cast<RawSnarlHeaderBlock *>(rawdata);
00099 fTreeTF = rshb->GetTimeFrameNo();
00100 MSG("Olt",Msg::kInfo) <<"Timeframe "<<rshb->GetTriggerTime()<<endl;
00101 MSG("Olt",Msg::kInfo) <<"Run "<<rshb->GetRun()<<" subrun "
00102 << rshb->GetSubRun()<<endl;
00103 MSG("Olt",Msg::kInfo) <<"Timeframe "<<fTreeTF<<endl;
00104 }
00105 fTreeIndex = 0;
00106 MSG("Olt",Msg::kInfo) <<fRecord<<": "<<rawdata->GetBlockId()<<endl;
00107 if (fDump) {
00108 RawDigitDataBlock *rddb = dynamic_cast<RawDigitDataBlock *>(rawdata);
00109 if (rddb) {
00110 if (fTreeTF>fStartTF) {
00111 TIter it = rddb->GetDatumIter();
00112 int vnumber = 0;
00113 int qnumber = 0;
00114 while (TObject *obj = it.Next()) {
00115 RawVaDigit *rvd = dynamic_cast<RawVaDigit *>(obj);
00116 if (rvd) {
00117 ++vnumber;
00118 if (fNumDump>0 && vnumber>fNumDump) continue;
00119 MSG("Olt",Msg::kInfo)<<fTreeTF<<" "<<*rvd<<endl;
00120 fTreeCrate = 0;
00121 fTreeTime = rvd->GetTDC();
00122 fCrateSec = rvd->GetCrateT0().GetSec();
00123 fCrateNSec = rvd->GetCrateT0().GetNanoSec();
00124
00125 TDirectory *save = gDirectory;
00126 if (fDoTree) {
00127 fFile->cd();
00128 fTree->Fill();
00129 save->cd();
00130 }
00131 ++fTreeIndex;
00132 }
00133 RawQieDigit *rqd = dynamic_cast<RawQieDigit *>(obj);
00134 if (rqd) {
00135 ++qnumber;
00136 if (fNumDump>0 && qnumber>fNumDump) break;
00137 MSG("Olt",Msg::kInfo)<<fTreeTF<<" "<<*rqd<<endl;
00138 RawChannelId rcid = rqd->GetChannel();
00139 fTreeCrate = rcid.GetCrate();
00140
00141 fTreeTime = rqd->GetTDC();
00142 fCrateSec = rqd->GetCrateT0().GetSec();
00143 fCrateNSec = rqd->GetCrateT0().GetNanoSec();
00144
00145 if (fDoTree) {
00146 TDirectory *save = gDirectory;
00147 fFile->cd();
00148 fTree->Fill();
00149 save->cd();
00150 }
00151 ++fTreeIndex;
00152 }
00153 }
00154 }
00155 }
00156 }
00157 RawRunCommentBlock *rc = dynamic_cast<RawRunCommentBlock *>(rawdata);
00158 if (rc) cout<<rc->GetRunComment()<<endl;
00159 RawRunConfigBlock *rcc = dynamic_cast<RawRunConfigBlock *>(rawdata);
00160 if (rcc) cout<<rcc->GetRunConfig()<<endl;
00161 }
00162 }
00163
00164 }
00165 }
00166 return JobCResult::kAOK;
00167
00168 }
00169
00170
00171
00172 const Registry& OltBlockScan::DefaultConfig() const
00173 {
00174
00175 static Registry r;
00176
00177
00178 std::string name = this->JobCModule::GetName();
00179 name += ".config.default";
00180 r.SetName(name.c_str());
00181
00182
00183 r.UnLockValues();
00184 r.Set("DumpData", true);
00185 r.Set("NumDump",10);
00186 r.Set("DoTree", false);
00187 r.Set("StartTF",0);
00188 r.LockValues();
00189
00190 return r;
00191 }
00192
00193
00194
00195 void OltBlockScan::Config(const Registry& r)
00196 {
00197 int tmpb;
00198 cout<<"Teapots\n";
00199 cout<<r<<endl;
00200 if (r.Get("DumpData",tmpb)) { cout<<"Hello "<<tmpb<<endl;fDump = bool(tmpb); }
00201 if (r.Get("DoTree",tmpb)) fDoTree = bool(tmpb);
00202 if (r.Get("StartTF",tmpb)) fStartTF = tmpb;
00203 if (r.Get("NumDump",tmpb)) fNumDump = tmpb;
00204 }
00205