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

DataQualityInterface.cxx

Go to the documentation of this file.
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 // $Log $
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     // USE BEAM DATABASE TABLES
00140     // ========================
00141     if( useDB ){
00142 
00143       // Check NearDet Spill Times
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       // Check Beam Monitoring
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     // USE BEAM LOOKUP TABLES
00188     // ======================
00189     else{
00190 
00191     }
00192 
00193     // APPLY BEAM QUALITY CUTS
00194     // =======================
00195     // check the beam monitoring
00196     //    1 = beam monitoring is good
00197     //    0 = beam monitoring is bad
00198     //   -1 = no beam monitoring information 
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     // USE DETECTOR DATABASE TABLES
00225     // ============================
00226     if( useDB ){
00227 
00228       // Check Coil Current
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       // Check High Voltage
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       // Check GPS Error
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     // USE DETECTOR LOOKUP TABLES
00262     // ==========================
00263     else{
00264       if(!fDataQualityLookup) fDataQualityLookup = new DataQualityLookup();
00265   
00266       // Check Coil Current
00267       fCoilStatus=fDataQualityLookup->GetCoilStatus(vldc);
00268       MSG("DataQualityFilter",Msg::kVerbose) << " CoilCurrent [lookup=1, status=" << fCoilStatus << "]" << endl;
00269 
00270       // Check High Voltage
00271       fHvStatus=fDataQualityLookup->GetHvStatus(vldc);
00272       MSG("DataQualityFilter",Msg::kVerbose) << " HighVoltage [lookup=1, status=" << fHvStatus << "]" << endl;
00273 
00274       // Check GPS Error;
00275       fGpsStatus=1;
00276       MSG("DataQualityFilter",Msg::kVerbose) << " GpsError [lookup=1, status=" << fGpsStatus << "]" << endl;
00277 
00278     }
00279 
00280     // APPLY DETECTOR QUALITY CUTS
00281     // ===========================
00282     //  1 = coil and HV are good
00283     //  0 = coil or HV are bad or unknown
00284     // -1 = no detector information
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 }

Generated on Mon Feb 15 11:06:33 2010 for loon by  doxygen 1.3.9.1