00001 #include "DataQualityInterface.h"
00002
00003 #include "MessageService/MsgService.h"
00004
00005 #include "BeamDataUtil/BDSpillAccessor.h"
00006 #include "BeamDataUtil/BeamMonSpill.h"
00007 #include "BeamDataUtil/BMSpillAna.h"
00008 #include "SpillTiming/SpillTimeFinder.h"
00009 #include "SpillTiming/SpillServerMonFinder.h"
00010
00011 #include "DcsUser/HvStatus.h"
00012 #include "DcsUser/HvStatusFinder.h"
00013 #include "DcsUser/CoilTools.h"
00014
00015 #include <cmath>
00016
00017
00018
00019
00020
00021 ClassImp(DataQualityInterface)
00022
00023 CVSID("$Id: DataQualityInterface.cxx,v 1.9 2008/08/25 13:09:18 blake Exp $");
00024
00025 DataQualityInterface::DataQualityInterface() :
00026 fBeamTime(-1),
00027 fBeamStatus(-1),
00028 fNearDetStatus(-1),
00029 fBeamType(-1),
00030 fProtonsOnTarget(0.0),
00031 fDetectorTime(-1),
00032 fDetectorStatus(-1),
00033 fCoilStatus(-1),
00034 fHvStatus(-1),
00035 fGpsStatus(-1),
00036 fGpsError(-999),
00037 fDataQualityLookup(0)
00038 {
00039
00040 }
00041
00042 DataQualityInterface::DataQualityInterface(const DataQualityInterface& rhs) :
00043 TObject(rhs)
00044 {
00045
00046 }
00047
00048 DataQualityInterface::~DataQualityInterface()
00049 {
00050 if(fDataQualityLookup) delete fDataQualityLookup;
00051 }
00052
00053 Int_t DataQualityInterface::GetSpillStatus(VldContext vldc)
00054 {
00055 this->ProcessBeamStatus(vldc,1);
00056 return fNearDetStatus;
00057 }
00058
00059 Int_t DataQualityInterface::GetBeamStatus(VldContext vldc)
00060 {
00061 this->ProcessBeamStatus(vldc,1);
00062 return fBeamStatus;
00063 }
00064
00065 Int_t DataQualityInterface::GetBeamType(VldContext vldc)
00066 {
00067 this->ProcessBeamStatus(vldc,1);
00068 return fBeamType;
00069 }
00070
00071 Double_t DataQualityInterface::GetProtonsOnTarget(VldContext vldc)
00072 {
00073 this->ProcessBeamStatus(vldc,1);
00074 return fProtonsOnTarget;
00075 }
00076
00077 Int_t DataQualityInterface::GetDetectorStatus(VldContext vldc)
00078 {
00079 this->ProcessDetectorStatus(vldc,1);
00080 return fDetectorStatus;
00081 }
00082
00083 Int_t DataQualityInterface::GetHvStatus(VldContext vldc)
00084 {
00085 this->ProcessDetectorStatus(vldc,1);
00086 return fHvStatus;
00087 }
00088
00089 Int_t DataQualityInterface::GetCoilStatus(VldContext vldc)
00090 {
00091 this->ProcessDetectorStatus(vldc,1);
00092 return fCoilStatus;
00093 }
00094
00095 Int_t DataQualityInterface::GetGpsStatus(VldContext vldc)
00096 {
00097 this->ProcessDetectorStatus(vldc,1);
00098 return fGpsStatus;
00099 }
00100
00101 Int_t DataQualityInterface::LookupDetectorStatus(VldContext vldc)
00102 {
00103 this->ProcessDetectorStatus(vldc,0);
00104 return fDetectorStatus;
00105 }
00106
00107 Int_t DataQualityInterface::LookupHvStatus(VldContext vldc)
00108 {
00109 this->ProcessDetectorStatus(vldc,0);
00110 return fHvStatus;
00111 }
00112
00113 Int_t DataQualityInterface::LookupCoilStatus(VldContext vldc)
00114 {
00115 this->ProcessDetectorStatus(vldc,0);
00116 return fCoilStatus;
00117 }
00118
00119 Int_t DataQualityInterface::LookupGpsStatus(VldContext vldc)
00120 {
00121 this->ProcessDetectorStatus(vldc,0);
00122 return fGpsStatus;
00123 }
00124
00125 void DataQualityInterface::ProcessBeamStatus(VldContext vldc, Bool_t useDB)
00126 {
00127 if( vldc.GetTimeStamp().GetSec()!=fBeamTime ){
00128 MSG("DataQualityFilter",Msg::kVerbose) << " DataQualityInterface::ProcessBeamStatus(VldContext) " << endl;
00129
00130 fBeamTime=vldc.GetTimeStamp().GetSec();
00131 fBeamStatus=-1;
00132 fNearDetStatus=-1;
00133 fBeamMonStatus=-1;
00134 fNearDetSpill=0;
00135 fBeamMonSpill=0;
00136 fBeamType=-1;
00137 fProtonsOnTarget=0.0;
00138
00139
00140
00141 if( useDB ){
00142
00143
00144 SpillTimeFinder& NDaccess = SpillTimeFinder::Instance();
00145 fNearDetStatus = NDaccess.DataIsAvailable(vldc);
00146 const SpillTimeND& ndspill = NDaccess.GetNearestSpill(vldc);
00147 VldTimeStamp NDtime = ndspill.GetTimeStamp();
00148
00149 Double_t nd_subtime = NDaccess.GetTimeToNearestSpill(vldc);
00150
00151 if( nd_subtime>=0.0 && nd_subtime<1.0 ){
00152 fNearDetSpill = 1;
00153 }
00154
00155 MSG("DataQualityFilter",Msg::kVerbose) << " NearDet [status=" << fNearDetStatus << ", spill=" << fNearDetSpill << ", time=" << nd_subtime << "]" << endl;
00156
00157
00158 BDSpillAccessor& BMaccess = BDSpillAccessor::Get();
00159 const BeamMonSpill& BMspill = *(BMaccess.LoadSpill(NDtime));
00160 VldTimeStamp BMtime = BMspill.SpillTime();
00161
00162 Double_t bm_subtime = ( BMtime.GetSec()-NDtime.GetSec() )
00163 + 1.0e-9*( BMtime.GetNanoSec()-NDtime.GetNanoSec() );
00164
00165 BMSpillAna BMana;
00166 BMana.UseDatabaseCuts();
00167 BMana.SetSpill(BMspill);
00168 BMana.SetTimeDiff(bm_subtime);
00169
00170 Double_t pots = 0.0;
00171 if(BMspill.fTortgt !=0.) pots = BMspill.fTortgt;
00172 else if(BMspill.fTrtgtd !=0.) pots = BMspill.fTrtgtd;
00173 else if(BMspill.fTor101 !=0.) pots = BMspill.fTor101;
00174
00175 if( fNearDetSpill
00176 && abs(bm_subtime)<1.0 ){
00177 fBeamMonSpill = 1;
00178 fProtonsOnTarget = pots;
00179 fBeamType = BMspill.BeamType();
00180 fBeamMonStatus = BMana.SelectSpill();
00181 }
00182
00183 MSG("DataQualityFilter",Msg::kVerbose) << " BeamMon [spill=" << fBeamMonSpill << ", isgood=" << fBeamMonStatus << ", time=" << nd_subtime+bm_subtime << ", type=" << fBeamType << ", PoTs=" << fProtonsOnTarget << "]" << endl;
00184
00185 }
00186
00187
00188
00189 else{
00190
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200 if( fBeamMonStatus==1 && fNearDetStatus==1 ){
00201 fBeamStatus=1;
00202 }
00203 if( fBeamMonStatus==0 || fNearDetStatus==0 ){
00204 fBeamStatus=0;
00205 }
00206
00207 }
00208
00209 return;
00210 }
00211
00212 void DataQualityInterface::ProcessDetectorStatus(VldContext vldc, Bool_t useDB)
00213 {
00214 if( vldc.GetTimeStamp().GetSec()!=fDetectorTime ){
00215 MSG("DataQualityFilter",Msg::kVerbose) << " DataQualityInterface::ProcessDetectorStatus(VldContext) " << endl;
00216
00217 fDetectorTime=vldc.GetTimeStamp().GetSec();
00218 fDetectorStatus=-1;
00219 fCoilStatus=-1;
00220 fHvStatus=-1;
00221 fGpsStatus=1;
00222 fGpsError=-999;
00223
00224
00225
00226 if( useDB ){
00227
00228
00229 if( CoilTools::IsOK(vldc) ) fCoilStatus=1; else fCoilStatus=0;
00230 MSG("DataQualityFilter",Msg::kVerbose) << " CoilCurrentStatus [status=" << fCoilStatus << "]" << endl;
00231 MSG("DataQualityFilter",Msg::kVerbose) << " CoilCurrent [lookup=0, status=" << fCoilStatus << "]" << endl;
00232
00233
00234 HvStatus::HvStatus_t status = HvStatusFinder::Instance().GetHvStatus(vldc);
00235 if( (status&HvStatus::kOK)==(HvStatus::kOK) ) fHvStatus=1;
00236 if( (status&HvStatus::kBad)==(HvStatus::kBad) ) fHvStatus=0;
00237 MSG("DataQualityFilter",Msg::kVerbose) << " HighVoltageStatus [statusword=" << status << ", status=" << fHvStatus << "]" << endl;
00238 MSG("DataQualityFilter",Msg::kVerbose) << " HighVoltage [lookup=0, status=" << fHvStatus << "]" << endl;
00239
00240
00241 SpillServerMonFinder& GPSaccess = SpillServerMonFinder::Instance();
00242 if( GPSaccess.DataIsAvailable(vldc) ){
00243 const SpillServerMon& spill_nearest = GPSaccess.GetNearestSpill(vldc);
00244
00245 Double_t gps_subtime = ( spill_nearest.GetTimeStamp().GetSec()-vldc.GetTimeStamp().GetSec() )
00246 + 1.0e-9*( spill_nearest.GetTimeStamp().GetNanoSec()-vldc.GetTimeStamp().GetNanoSec() );
00247
00248 if( gps_subtime>=0.0 && gps_subtime<1.0 ){
00249 fGpsError = 0;
00250 if( spill_nearest.GetSpillType()==1 ){
00251 fGpsError = spill_nearest.GetSpillTimeError();
00252 if( fGpsError>1000 ) fGpsStatus = 0;
00253 }
00254 }
00255 }
00256 MSG("DataQualityFilter",Msg::kVerbose) << " GpsErrorStatus [error=" << fGpsError << ", status=" << fGpsStatus << "]" << endl;
00257 MSG("DataQualityFilter",Msg::kVerbose) << " GpsError [lookup=0, status=" << fGpsStatus << "]" << endl;
00258
00259 }
00260
00261
00262
00263 else{
00264 if(!fDataQualityLookup) fDataQualityLookup = new DataQualityLookup();
00265
00266
00267 fCoilStatus=fDataQualityLookup->GetCoilStatus(vldc);
00268 MSG("DataQualityFilter",Msg::kVerbose) << " CoilCurrent [lookup=1, status=" << fCoilStatus << "]" << endl;
00269
00270
00271 fHvStatus=fDataQualityLookup->GetHvStatus(vldc);
00272 MSG("DataQualityFilter",Msg::kVerbose) << " HighVoltage [lookup=1, status=" << fHvStatus << "]" << endl;
00273
00274
00275 fGpsStatus=1;
00276 MSG("DataQualityFilter",Msg::kVerbose) << " GpsError [lookup=1, status=" << fGpsStatus << "]" << endl;
00277
00278 }
00279
00280
00281
00282
00283
00284
00285
00286 if( fCoilStatus==1 && fHvStatus==1 && fGpsStatus==1 ){
00287 fDetectorStatus=1;
00288 }
00289 if( fCoilStatus==0 || fHvStatus==0 || fGpsStatus==0 ){
00290 fDetectorStatus=0;
00291 }
00292
00293 }
00294
00295 return;
00296 }