00001 #include "DataQualityFilter.h"
00002
00003 #include "MessageService/MsgService.h"
00004 #include "MinosObjectMap/MomNavigator.h"
00005 #include "JobControl/JobCommand.h"
00006 #include "JobControl/JobCModuleRegistry.h"
00007
00008 #include "RawData/RawRecord.h"
00009 #include "CandData/CandRecord.h"
00010
00011
00012
00013
00014
00015
00016 ClassImp(DataQualityFilter)
00017
00018 CVSID("$Id: DataQualityFilter.cxx,v 1.8 2008/08/25 13:09:18 blake Exp $");
00019
00020 JOBMODULE(DataQualityFilter,"DataQualityFilter","DataQualityFilter");
00021
00022 DataQualityFilter::DataQualityFilter() :
00023 fTime(0),
00024 fCurrentTime(0),
00025 fFilter(0),
00026 fSpillStatus(-1),
00027 fBeamStatus(-1),
00028 fHvStatus(-1),
00029 fCoilStatus(-1),
00030 fGpsStatus(-1),
00031 fDetectorStatus(-1),
00032 fFilterOnOff(0),
00033 fFilterBadBeam(0),
00034 fFilterBadDetector(0),
00035 fWriteOutResults(0),
00036 fUseLookup(0),
00037 fFilterFileName("dataqualityfilter.root"),
00038 fFilterFile(0),
00039 fFilterTree(0)
00040 {
00041 MSG("DataQualityFilter",Msg::kDebug) << " *** DataQualityFilter::DataQualityFilter() *** " << endl;
00042
00043 fDQhandle = new DataQualityInterface();
00044 }
00045
00046 DataQualityFilter::~DataQualityFilter()
00047 {
00048 MSG("DataQualityFilter",Msg::kDebug) << " *** DataQualityFilter::~DataQualityFilter() *** " << endl;
00049
00050 if( fDQhandle ) delete fDQhandle;
00051 }
00052
00053 void DataQualityFilter::BeginJob()
00054 {
00055 MSG("DataQualityFilter",Msg::kInfo) << " *** DataQualityFilter::BeginJob(...) *** " << endl;
00056
00057 }
00058
00059 JobCResult DataQualityFilter::Ana(const MomNavigator *mom)
00060 {
00061 MSG("DataQualityFilter",Msg::kInfo) << " *** DataQualityFilter::Ana(...) *** " << endl;
00062
00063 fSpillStatus=-1;
00064 fBeamStatus=-1;
00065 fHvStatus=-1;
00066 fCoilStatus=-1;
00067 fGpsStatus=-1;
00068 fDetectorStatus=-1;
00069 fBeamType=-1;
00070 fProtonsOnTarget=0.0;
00071 fFilter=0;
00072
00073 JobCResult result(JobCResult::kAOK);
00074
00075
00076
00077 RawRecord* rawrec = dynamic_cast<RawRecord*>(mom->GetFragment("RawRecord"));
00078 if( rawrec ){
00079 MSG("DataQualityFilter",Msg::kDebug) << " Found RawRecord " << endl;
00080 VldContext* vldc = (VldContext*)(rawrec->GetVldContext());
00081 fCurrentTime=vldc->GetTimeStamp().GetSec();
00082 fSpillStatus=fDQhandle->GetSpillStatus(*vldc);
00083 fBeamStatus=fDQhandle->GetBeamStatus(*vldc);
00084 fBeamType=fDQhandle->GetBeamType(*vldc);
00085 fProtonsOnTarget=fDQhandle->GetProtonsOnTarget(*vldc);
00086 if( fUseLookup ){
00087 fDetectorStatus=fDQhandle->LookupDetectorStatus(*vldc);
00088 fHvStatus=fDQhandle->LookupHvStatus(*vldc);
00089 fCoilStatus=fDQhandle->LookupCoilStatus(*vldc);
00090 fGpsStatus=1;
00091 }
00092 else{
00093 fDetectorStatus=fDQhandle->GetDetectorStatus(*vldc);
00094 fHvStatus=fDQhandle->GetHvStatus(*vldc);
00095 fCoilStatus=fDQhandle->GetCoilStatus(*vldc);
00096 fGpsStatus=fDQhandle->GetGpsStatus(*vldc);
00097 }
00098 }
00099
00100
00101
00102 CandRecord* candrec = dynamic_cast<CandRecord*>(mom->GetFragment("CandRecord"));
00103 if( candrec ){
00104 MSG("DataQualityFilter",Msg::kDebug) << " Found CandRecord " << endl;
00105
00106 }
00107
00108
00109
00110
00111 if( ( fFilterBadBeam==0 || fBeamStatus==1 )
00112 && ( fFilterBadDetector==0 || fDetectorStatus==1 ) ){
00113 fFilter=1;
00114 }
00115
00116
00117
00118 if( fCurrentTime!=fTime ){
00119 fLiveTime=1;
00120 if( fTime>0
00121 && fCurrentTime-fTime>1 ) fLiveTime=fCurrentTime-fTime;
00122 fTime=fCurrentTime;
00123 if( fWriteOutResults ) this->WriteOutResults();
00124 }
00125
00126 MSG("DataQualityFilter",Msg::kDebug) << " Time=" << fTime << endl;
00127 MSG("DataQualityFilter",Msg::kDebug) << " BeamType=" << fBeamType << endl;
00128 MSG("DataQualityFilter",Msg::kDebug) << " SpillStatus=" << fSpillStatus << endl;
00129 MSG("DataQualityFilter",Msg::kDebug) << " ProtonsOnTarget=" << fProtonsOnTarget << endl;
00130 MSG("DataQualityFilter",Msg::kDebug) << " DetectorStatus=" << fDetectorStatus << " [HV=" << fHvStatus << ", coil=" << fCoilStatus << ", gps=" << fGpsStatus << "]" << endl;
00131 MSG("DataQualityFilter",Msg::kDebug) << " Beam=[" << fFilterBadBeam << "|" << fBeamStatus << "] Detector=[" << fFilterBadDetector << "|" << fDetectorStatus << "]" << endl;
00132 MSG("DataQualityFilter",Msg::kDebug) << " Filter=[" << fFilterOnOff << "|" << fFilter << "]" << endl;
00133
00134
00135
00136 if( fFilterOnOff ){
00137 if( fFilter ){
00138 MSG("DataQualityFilter",Msg::kInfo) << " *** PASSED FILTER *** " << endl;
00139 return JobCResult::kPassed;
00140 }
00141 else{
00142 MSG("DataQualityFilter",Msg::kInfo) << " *** FAILED FILTER *** " << endl;
00143 return JobCResult::kFailed;
00144 }
00145 }
00146
00147 return result;
00148
00149 }
00150
00151 const Registry& DataQualityFilter::DefaultConfig() const
00152 {
00153 MSG("DataQualityFilter",Msg::kDebug) << " *** DataQualityFilter::DefaultConfig() *** " << endl;
00154
00155 static Registry r;
00156 r.SetName("DataQualityFilter.config.default");
00157 r.UnLockValues();
00158 r.Set("FilterOnOff",fFilterOnOff);
00159 r.Set("FilterBadBeam",fFilterBadBeam);
00160 r.Set("FilterBadDetector",fFilterBadDetector);
00161 r.Set("WriteOutResults",fWriteOutResults);
00162 r.Set("UseLookupTable",fUseLookup);
00163 r.Set("OutputFile",fFilterFileName);
00164 r.LockValues();
00165
00166 return r;
00167 }
00168
00169 void DataQualityFilter::Config(const Registry& r)
00170 {
00171 MSG("DataQualityFilter",Msg::kDebug) << " *** DataQualityFilter::Config() *** " << endl;
00172
00173 Int_t tmpint;
00174 const char* tmpchar = 0;
00175
00176 if(r.Get("FilterOnOff",tmpint)) fFilterOnOff = tmpint;
00177 if(r.Get("FilterBadBeam",tmpint)) fFilterBadBeam = tmpint;
00178 if(r.Get("FilterBadDetector",tmpint)) fFilterBadDetector = tmpint;
00179 if(r.Get("WriteOutResults",tmpint)) fWriteOutResults = tmpint;
00180 if(r.Get("UseLookupTable",tmpint)) fUseLookup = tmpint;
00181 if(r.Get("OutputFile",tmpchar)) fFilterFileName=tmpchar;
00182
00183 MSG("DataQualityFilter",Msg::kDebug)
00184 << " configuration: " << endl
00185 << " FilterOnOff=" << fFilterOnOff << endl
00186 << " FilterBadBeam=" << fFilterBadBeam << endl
00187 << " FilterBadDetector=" << fFilterBadDetector << endl
00188 << " WriteOutResults=" << fWriteOutResults << endl
00189 << " UseLookupTable=" << fUseLookup << endl
00190 << " OutputFile=" << fFilterFileName << endl;
00191
00192 return;
00193 }
00194
00195 void DataQualityFilter::HandleCommand(JobCommand* command)
00196 {
00197 TString cmd = command->PopCmd();
00198 if(cmd=="Set"){
00199 TString opt = command->PopOpt();
00200
00201 }
00202 }
00203
00204 void DataQualityFilter::EndJob()
00205 {
00206 MSG("DataQualityFilter",Msg::kInfo) << " *** DataQualityFilter::EndJob() *** " << endl;
00207 if(fFilterFile){
00208 MSG("DataQualityFilter",Msg::kInfo) << " *** saving info to file ... " << endl;
00209 TDirectory* tmpd = gDirectory;
00210 fFilterFile->cd();
00211 fFilterTree->Write();
00212 fFilterFile->Close();
00213 gDirectory = tmpd;
00214 MSG("DataQualityFilter",Msg::kInfo) << " ... info saved to file *** " << endl;
00215 }
00216 }
00217
00218 void DataQualityFilter::WriteOutResults()
00219 {
00220 MSG("DataQualityFilter",Msg::kDebug) << " *** DataQualityFilter::WriteOutResults() *** " << endl;
00221
00222 if(!fFilterFile){
00223 TDirectory* tmpd = gDirectory;
00224 fFilterFile = new TFile(fFilterFileName.Data(),"RECREATE");
00225 fFilterTree = new TTree("DataQualityFilter","DataQualityFilter");
00226 fFilterTree->SetAutoSave(300);
00227 fFilterTree->Branch("Time",&fTime,"Time/I");
00228 fFilterTree->Branch("BeamType",&fBeamType,"BeamType/I");
00229 fFilterTree->Branch("BeamStatus",&fBeamStatus,"BeamStatus/I");
00230 fFilterTree->Branch("SpillStatus",&fSpillStatus,"SpillStatus/I");
00231 fFilterTree->Branch("HvStatus",&fHvStatus,"HvStatus/I");
00232 fFilterTree->Branch("CoilStatus",&fCoilStatus,"CoilStatus/I");
00233 fFilterTree->Branch("GpsStatus",&fGpsStatus,"GpsStatus/I");
00234 fFilterTree->Branch("DetectorStatus",&fDetectorStatus,"DetectorStatus/I");
00235 fFilterTree->Branch("LiveTime",&fLiveTime,"LiveTime/I");
00236 fFilterTree->Branch("ProtonsOnTarget",&fProtonsOnTarget,"ProtonsOnTarget/D");
00237 fFilterTree->Branch("FilterOnOff",&fFilterOnOff,"FilterOnOff/I");
00238 fFilterTree->Branch("FilterBadBeam",&fFilterBadBeam,"FilterBadBeam/I");
00239 fFilterTree->Branch("FilterBadDetector",&fFilterBadDetector,"FilterDetector/I");
00240 fFilterTree->Branch("Filter",&fFilter,"Filter/I");
00241 gDirectory = tmpd;
00242 }
00243
00244 if(fFilterFile){
00245 TDirectory* tmpd = gDirectory;
00246 fFilterFile->cd();
00247 fFilterTree->Fill();
00248 gDirectory = tmpd;
00249 }
00250 }