00001 #include "HvStatusFinder.h"
00002 #include "MessageService/MsgService.h"
00003 #include "DatabaseInterface/DbiSqlContext.h"
00004 #include <cmath>
00005
00006 ClassImp(HvStatusFinder)
00007
00008 CVSID("$Id: HvStatusFinder.cxx,v 1.3 2007/08/14 17:31:53 blake Exp $");
00009
00010 HvStatusFinder* HvStatusFinder::fMyInstance = 0;
00011
00012 HvStatusFinder& HvStatusFinder::Instance()
00013 {
00014 MSG("HvStatus", Msg::kDebug) << " *** HvStatusFinder::Instance() *** " << endl;
00015
00016
00017 static Cleaner cleaner;
00018
00019
00020 if(!fMyInstance){
00021 MSG("HvStatus", Msg::kDebug) << " Creating new instance of HvStatusFinder " << endl;
00022 cleaner.UseMe();
00023 fMyInstance = new HvStatusFinder();
00024 }
00025
00026
00027 if(!fMyInstance){
00028 MSG("HvStatus", Msg::kFatal) << " No HvStatusFinder Instance - aagghhh, I'm going to die!!!." << endl;
00029 assert(fMyInstance);
00030 }
00031
00032
00033 if(fMyInstance){
00034
00035 }
00036
00037 return *fMyInstance;
00038 }
00039
00040 HvStatusFinder::HvStatusFinder()
00041 {
00042 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::HvStatusFinder() *** " << endl;
00043
00044 fWindow = 0;
00045 fTask = 1;
00046
00047 kStatusNearOK = HvStatus::kOK;
00048 kStatusNearOK = (HvStatus::HvStatus_t)(kStatusNearOK|HvStatus::kSM1OK);
00049
00050 kStatusFarOK = HvStatus::kOK;
00051 kStatusFarOK = (HvStatus::HvStatus_t)(kStatusFarOK|HvStatus::kSM1OK);
00052 kStatusFarOK = (HvStatus::HvStatus_t)(kStatusFarOK|HvStatus::kSM2OK);
00053
00054 this->Reset();
00055 }
00056
00057 HvStatusFinder::~HvStatusFinder()
00058 {
00059 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::~HvStatusFinder() *** " << endl;
00060
00061 }
00062
00063 HvStatus::HvStatus_t HvStatusFinder::GetHvStatus(const VldContext& context, Int_t window, Int_t task)
00064 {
00065 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::GetHvStatus(...) *** " << endl;
00066
00067 MSG("HvStatus", Msg::kDebug) << " time: " << context.GetTimeStamp().GetSec() << endl;
00068
00069
00070 if( context.GetSimFlag() != SimFlag::kData ){
00071 if( context.GetDetector()==Detector::kNear ) return kStatusNearOK;
00072 if( context.GetDetector()==Detector::kFar ) return kStatusFarOK;
00073 return HvStatus::kOK;
00074 }
00075
00076
00077 Bool_t reset = 0;
00078
00079 Int_t new_window = window;
00080 if( new_window<1 ) new_window = 1;
00081 if( new_window!=fWindow ){ fWindow = new_window; reset = 1; }
00082
00083 Int_t new_task = task;
00084 if( !(new_task==0||new_task==1) ) new_task = 1;
00085 if( new_task!=fTask ){ fTask = new_task; reset = 1; }
00086
00087 if( reset ) this->Reset();
00088
00089
00090 if( fMinTimeExt<0
00091 || fMaxTimeExt<0
00092 || context.GetTimeStamp().GetSec()<fMinTimeExt
00093 || context.GetTimeStamp().GetSec()>fMaxTimeExt ){
00094 MSG("HvStatus", Msg::kDebug) << " new extended query... " << endl;
00095 this->ExtendedQuery(context);
00096 }
00097 else{
00098 MSG("HvStatus", Msg::kVerbose) << " use current extended query [" << fMinTimeExt << "->" << fMaxTimeExt << "]" << endl;
00099 }
00100
00101
00102 if( fMinTime<0
00103 || fMaxTime<0
00104 || context.GetTimeStamp().GetSec()<fMinTime
00105 || context.GetTimeStamp().GetSec()>fMaxTime ){
00106 MSG("HvStatus", Msg::kDebug) << " new local query... " << endl;
00107 this->LocalQuery(context);
00108 }
00109 else{
00110 MSG("HvStatus", Msg::kVerbose) << " use current local query [" << fMinTime << "->" << fMaxTime << "]" << endl;
00111 }
00112
00113 MSG("HvStatus", Msg::kDebug) << " status: " << fStatus << endl;
00114
00115 return fStatus;
00116 }
00117
00118 void HvStatusFinder::ExtendedQuery(const VldContext& context)
00119 {
00120 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::ExtendedQuery(...) *** " << endl;
00121
00122
00123 VldTimeStamp minTime = context.GetTimeStamp();
00124 VldTimeStamp maxTime = context.GetTimeStamp();
00125 minTime.Add(-fWindow-3600); maxTime.Add(+fWindow+3600);
00126
00127 MSG("HvStatus", Msg::kDebug) << " query: time=" << context.GetTimeStamp().GetSec() << endl;
00128 MSG("HvStatus", Msg::kDebug) << " query: range=" << minTime.GetSec() << "->" << maxTime.GetSec() << " (window=" << fWindow << "+3600" << ")" << endl;
00129
00130 DbiSqlContext econtext(DbiSqlContext::kOverlaps,
00131 minTime,
00132 maxTime,
00133 context.GetDetector(),
00134 context.GetSimFlag() );
00135
00136 fHvTable.NewQuery(econtext,fTask);
00137
00138 const DbiValidityRec* vldRec = fHvTable.GetValidityRec();
00139 const VldRange& vldRange = vldRec->GetVldRange();
00140 VldTimeStamp vldStart = vldRange.GetTimeStart();
00141 VldTimeStamp vldEnd = vldRange.GetTimeEnd();
00142
00143 MSG("HvStatus", Msg::kDebug) << " result: rows=" << fHvTable.GetNumRows() << endl;
00144 MSG("HvStatus", Msg::kDebug) << " result: range=" << vldStart.GetSec() << "->" << vldEnd.GetSec() << endl;
00145
00146 if( vldRec->IsGap() ){
00147 MSG("HvStatus", Msg::kVerbose) << " result: no data is available " << endl;
00148 }
00149
00150 fMinTimeExt = minTime.GetSec();
00151 fMaxTimeExt = maxTime.GetSec();
00152
00153 if( fHvTable.GetNumRows()>0 ){
00154 for( UInt_t irow = 0; irow < fHvTable.GetNumRows(); irow++ ){
00155 const DbuHvFromSingles* hvState = fHvTable.GetRow(irow);
00156 const DbiValidityRec* hvRec = fHvTable.GetValidityRec(hvState);
00157 const VldRange& hvRange = hvRec->GetVldRange();
00158
00159 MSG("HvStatus", Msg::kVerbose) << " row=" << irow << " SM=" << hvState->GetSupermodule() << " status=" << hvState->GetStatus() << ", coldchips=" << hvState->GetColdChips() << " range=" << hvRange.GetTimeStart().GetSec() << "->" << hvRange.GetTimeEnd().GetSec() << endl;
00160
00161 if( hvRange.GetTimeStart().GetSec()<fMinTimeExt ) fMinTimeExt = hvRange.GetTimeStart().GetSec();
00162 if( hvRange.GetTimeEnd().GetSec()>fMaxTimeExt ) fMaxTimeExt = hvRange.GetTimeEnd().GetSec();
00163 }
00164 }
00165
00166 fMinTimeExt += fWindow;
00167 fMaxTimeExt -= fWindow;
00168
00169 MSG("HvStatus", Msg::kDebug) << " validity: " << fMinTimeExt << "->" << fMaxTimeExt << endl;
00170
00171 return;
00172 }
00173
00174 void HvStatusFinder::LocalQuery(const VldContext& context)
00175 {
00176 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::LocalQuery(...) *** " << endl;
00177
00178 fStatus = HvStatus::kUnknown;
00179 fMinTime = fMinTimeExt;
00180 fMaxTime = fMaxTimeExt;
00181
00182 Int_t hvstatus = -1;
00183 Int_t hvstatusSM1 = -1;
00184 Int_t hvstatusSM2 = -1;
00185
00186
00187 if( fHvTable.GetNumRows()>0 ){
00188 for( UInt_t irow = 0; irow < fHvTable.GetNumRows(); irow++ ){
00189 const DbuHvFromSingles* hvState = fHvTable.GetRow(irow);
00190 const DbiValidityRec* hvRec = fHvTable.GetValidityRec(hvState);
00191 const VldRange& hvRange = hvRec->GetVldRange();
00192
00193
00194 if( context.GetTimeStamp().GetSec()>hvRange.GetTimeStart().GetSec()-fWindow
00195 && context.GetTimeStamp().GetSec()<hvRange.GetTimeEnd().GetSec()+fWindow ){
00196
00197 MSG("HvStatus", Msg::kVerbose) << " row=" << irow << " SM=" << hvState->GetSupermodule() << " status=" << hvState->GetStatus() << ", coldchips=" << hvState->GetColdChips() << " range=" << hvRange.GetTimeStart().GetSec() << "->" << hvRange.GetTimeEnd().GetSec() << endl;
00198
00199 if( ( hvState->GetStatus()==0 )
00200 || ( hvState->GetStatus()==1 && hvstatus==-1 ) ){
00201 hvstatus = hvState->GetStatus();
00202 }
00203
00204 if( hvState->GetSupermodule()==1 ){
00205 if( ( hvState->GetStatus()==0 )
00206 || ( hvState->GetStatus()==1 && hvstatusSM1==-1 ) ){
00207 hvstatusSM1 = hvState->GetStatus();
00208 }
00209 }
00210
00211 if( hvState->GetSupermodule()==2 ){
00212 if( ( hvState->GetStatus()==0 )
00213 || ( hvState->GetStatus()==1 && hvstatusSM2==-1 ) ){
00214 hvstatusSM2 = hvState->GetStatus();
00215 }
00216 }
00217 }
00218
00219
00220 if( hvRange.GetTimeStart().GetSec()-fWindow>fMinTime
00221 && hvRange.GetTimeStart().GetSec()-fWindow<context.GetTimeStamp().GetSec() ){
00222 fMinTime = hvRange.GetTimeStart().GetSec()-fWindow;
00223 }
00224
00225 if( hvRange.GetTimeStart().GetSec()+fWindow>fMinTime
00226 && hvRange.GetTimeStart().GetSec()+fWindow<context.GetTimeStamp().GetSec() ){
00227 fMinTime = hvRange.GetTimeStart().GetSec()+fWindow;
00228 }
00229
00230 if( hvRange.GetTimeEnd().GetSec()-fWindow>fMinTime
00231 && hvRange.GetTimeEnd().GetSec()-fWindow<context.GetTimeStamp().GetSec() ){
00232 fMinTime = hvRange.GetTimeEnd().GetSec()-fWindow;
00233 }
00234
00235 if( hvRange.GetTimeEnd().GetSec()+fWindow>fMinTime
00236 && hvRange.GetTimeEnd().GetSec()+fWindow<context.GetTimeStamp().GetSec() ){
00237 fMinTime = hvRange.GetTimeEnd().GetSec()+fWindow;
00238 }
00239
00240
00241 if( hvRange.GetTimeStart().GetSec()-fWindow<fMaxTime
00242 && hvRange.GetTimeStart().GetSec()-fWindow>context.GetTimeStamp().GetSec() ){
00243 fMaxTime = hvRange.GetTimeStart().GetSec()-fWindow;
00244 }
00245
00246 if( hvRange.GetTimeStart().GetSec()+fWindow<fMaxTime
00247 && hvRange.GetTimeStart().GetSec()+fWindow>context.GetTimeStamp().GetSec() ){
00248 fMaxTime = hvRange.GetTimeStart().GetSec()+fWindow;
00249 }
00250
00251 if( hvRange.GetTimeEnd().GetSec()-fWindow<fMaxTime
00252 && hvRange.GetTimeEnd().GetSec()-fWindow>context.GetTimeStamp().GetSec() ){
00253 fMaxTime = hvRange.GetTimeEnd().GetSec()-fWindow;
00254 }
00255
00256 if( hvRange.GetTimeEnd().GetSec()+fWindow<fMaxTime
00257 && hvRange.GetTimeEnd().GetSec()+fWindow>context.GetTimeStamp().GetSec() ){
00258 fMaxTime = hvRange.GetTimeEnd().GetSec()+fWindow;
00259 }
00260
00261 }
00262 }
00263
00264 MSG("HvStatus", Msg::kDebug) << " result: status=" << hvstatus << " (SM1=" << hvstatusSM1 << ",SM2=" << hvstatusSM2 << ")" << endl;
00265
00266
00267 if( context.GetDetector() == Detector::kFar ){
00268 if( hvstatus==0 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kBad);
00269 else if( hvstatus==1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kOK);
00270
00271 if( hvstatusSM1==-1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1Unknown);
00272 else if( hvstatusSM1==0 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1Bad);
00273 else if( hvstatusSM1==1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1OK);
00274
00275 if( hvstatusSM2==-1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM2Unknown);
00276 else if( hvstatusSM2==0 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM2Bad);
00277 else if( hvstatusSM2==1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM2OK);
00278 }
00279
00280
00281 if( context.GetDetector() == Detector::kNear ){
00282 if( hvstatus==0 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kBad);
00283 else if( hvstatus==1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kOK);
00284
00285 if( hvstatusSM1==-1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1Unknown);
00286 else if( hvstatusSM1==0 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1Bad);
00287 else if( hvstatusSM1==1 ) fStatus = (HvStatus::HvStatus_t)(fStatus|HvStatus::kSM1OK);
00288 }
00289
00290 MSG("HvStatus", Msg::kDebug) << " result: hvstatus=" << fStatus << endl;
00291 MSG("HvStatus", Msg::kDebug) << " validity: " << fMinTime << "->" << fMaxTime << endl;
00292
00293 return;
00294 }
00295
00296 void HvStatusFinder::Reset()
00297 {
00298 MSG("HvStatus", Msg::kVerbose) << " *** HvStatusFinder::Reset() *** " << endl;
00299
00300 fMinTime = -1;
00301 fMaxTime = -1;
00302 fMinTimeExt = -1;
00303 fMaxTimeExt = -1;
00304
00305 fStatus = HvStatus::kUnknown;
00306 }