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

DemoDataReject.cxx

Go to the documentation of this file.
00001 
00002 // $Id: DemoDataReject.cxx,v 1.5 2004/10/19 23:55:45 rhatcher Exp $
00004 #include "Demo/DemoDataReject.h"
00005 #include <cstdio>
00006 // ROOT include files
00007 #include "TObject.h"
00008 #include "TCollection.h"
00009 #include "TObjectTable.h"
00010 // MINOS include files
00011 #include "CandData/CandRecord.h"
00012 #include "CandDigit/CandDigitHandle.h"
00013 #include "CandDigit/CandDigitListHandle.h"
00014 #include "RawData/RawRecord.h"
00015 #include "RawData/RawDaqHeader.h"
00016 #include "RawData/RawDigitDataBlock.h"
00017 #include "RawData/RawDigit.h"
00018 #include "Plex/PlexHandle.h"
00019 #include "JobControl/JobCommand.h"
00020 #include "JobControl/JobCModuleRegistry.h"
00021 #include "MinosObjectMap/MomNavigator.h"
00022 #include "MessageService/MsgService.h"
00023 #include "Util/UtilString.h"
00024 
00025 CVSID("$Id: DemoDataReject.cxx,v 1.5 2004/10/19 23:55:45 rhatcher Exp $");
00026 JOBMODULE(DemoDataReject, 
00027           "DataReject", "Filter out data records.");
00028 
00029 //......................................................................
00030 
00031 enum {
00032    kRejectIfAllOff = -2,
00033    kRejectIfAnyOff = -1,
00034    kIgnoreTest     =  0,
00035    kRejectIfAnyOn  =  1,
00036    kRejectIfAllOn  =  2
00037 };
00038 
00039 namespace RejectHelper {
00040 //======================================================================
00041 // Utility functions 
00042 // put it in a namespace to avoid potential conflict
00043 //======================================================================
00044 
00045    bool reject_it(Short_t setting, Short_t n, Short_t m) {
00046      //
00047      // make selection based on user setting and "n of m"
00048      //
00049       switch (setting) {
00050       case kRejectIfAllOff: return (n==0);
00051       case kRejectIfAnyOff: return (n<m);
00052       case kIgnoreTest:     return false;
00053       case kRejectIfAnyOn:  return (n>0);
00054       case kRejectIfAllOn:  return (n==m);
00055       default:              return false;
00056       }
00057    }
00058 
00059   bool reject_veto(Short_t setting, RawDigitDataBlock* rddb) {
00060 
00061     //
00062     // loop over digits, count number that come from veto shield
00063     // use user criteria for whether to reject
00064     //
00065 
00066     PlexHandle ph(rddb->GetVldContext());
00067     TIter rdit = rddb->GetDatumIter();
00068     RawDigit *rd;
00069 
00070     int ndigit=0, nveto=0;
00071     while ( ( rd = (RawDigit*)rdit() ) ) {
00072       ++ndigit;
00073       RawChannelId rcid = rd->GetChannel();
00074       PlexSEIdAltL altl = ph.GetSEIdAltL(rcid);
00075       if (altl.IsVetoShield()) ++nveto;
00076     }
00077 
00078     return reject_it(setting,nveto,ndigit);
00079 
00080   }
00081 
00082 }
00083 //......................................................................
00084 
00085 DemoDataReject::DemoDataReject() : 
00086   fPedReject(kIgnoreTest), 
00087   fSparsReject(kIgnoreTest), 
00088   fCommonReject(kIgnoreTest),
00089   fVetoShieldReject(kIgnoreTest)
00090 {}
00091 
00092 //......................................................................
00093 
00094 DemoDataReject::~DemoDataReject() {}
00095 
00096 //......................................................................
00097   
00098 JobCResult DemoDataReject::Ana(const MomNavigator* mom)
00099 {
00100    JobCResult result = JobCResult::kPassed;
00101    
00102    // Get any and all raw records attached to the data record pointed 
00103    // to by "mom".  The dynamic cast from TObject is ugly but necessary
00104    TObject   *tobj   = 0;
00105    TIter reciter = const_cast<MomNavigator*>(mom)->FragmentIter();
00106    while ( (tobj = reciter() ) ) {
00107       RawRecord *rawrec = dynamic_cast<RawRecord *>(tobj);
00108       result = FilterRawRecord(rawrec);
00109       if (result.Failed()) return result;
00110    }
00111 
00112    // other potential tests
00113 
00114    return result;
00115 }
00116 
00117 //......................................................................
00118 
00119 const Registry& DemoDataReject::DefaultConfig() const 
00120 {
00121 //======================================================================
00122 // The default configuration for this module
00123 //======================================================================
00124   static Registry r;
00125   
00126   std::string name = this->GetName();
00127   name += ".config.default";
00128   r.SetName(name.c_str());
00129   
00130   r.UnLockValues();
00131   r.Set("PedReject",        kIgnoreTest);
00132   r.Set("SparseReject",     kIgnoreTest);
00133   r.Set("CommonReject",     kIgnoreTest);
00134   r.Set("VetoShieldReject", kIgnoreTest);
00135   r.LockValues();
00136 
00137   return r;
00138 }
00139 
00140 //......................................................................
00141 
00142 void DemoDataReject::Config(const Registry& r) 
00143 {
00144 //======================================================================
00145 // Configure the module using the registry r
00146 //======================================================================
00147   int  tmpi;
00148 
00149   if (r.Get("PedReject",tmpi))        fPedReject = tmpi;
00150   if (r.Get("SparsReject",tmpi))      fSparsReject = tmpi;
00151   if (r.Get("CommonReject",tmpi))     fCommonReject = tmpi;
00152   if (r.Get("VetoShieldReject",tmpi)) fVetoShieldReject = tmpi;
00153 
00154 }
00155 
00156 //......................................................................
00157 void DemoDataReject::HandleCommand(JobCommand* cmd) 
00158 {
00159 
00160    using namespace RejectHelper;
00161    const char* c = cmd->PopCmd();
00162    if (c) {
00163       string sc(c);
00164       if (sc == "RunType") {
00165          while (cmd->HaveOpt()) fRunTypeReject.insert(cmd->PopIntOpt());
00166       }
00167       else  if (sc == "Mode") {
00168          const char* opt = cmd->PopOpt();
00169          string sopt(opt);
00170          Short_t *which = 0;
00171          if      (sopt.find("Ped")   !=string::npos) which = &fPedReject;
00172          else if (sopt.find("Ped")   !=string::npos) which = &fPedReject;
00173          else if (sopt.find("Spars") !=string::npos) which = &fSparsReject;
00174          else if (sopt.find("spars") !=string::npos) which = &fSparsReject;
00175          else if (sopt.find("Common")!=string::npos) which = &fCommonReject;
00176          else if (sopt.find("common")!=string::npos) which = &fCommonReject;
00177          else if (sopt.find("Veto")  !=string::npos) which = &fVetoShieldReject;
00178          else if (sopt.find("veto")  !=string::npos) which = &fVetoShieldReject;
00179          else {
00180             which = 0;
00181             MSG("Demo",Msg::kWarning) 
00182                << "No DataReject/Mode available for mode '" << opt << "'." 
00183                << "  Try one of Ped, Spars, Common, VetoShield." << endl
00184                << endl;
00185          }
00186          if (which) {
00187             const char* tst = cmd->PopOpt();
00188             string stst(tst);
00189             using namespace UtilString;
00190             if      (!cmp_nocase(stst,"ignore")) *which = kIgnoreTest;
00191             else if (!cmp_nocase(stst,"alloff")) *which = kRejectIfAllOff;
00192             else if (!cmp_nocase(stst,"anyoff")) *which = kRejectIfAnyOff;
00193             else if (!cmp_nocase(stst,"off"))    *which = kRejectIfAnyOff;
00194             else if (!cmp_nocase(stst,"on"))     *which = kRejectIfAnyOn;
00195             else if (!cmp_nocase(stst,"anyon"))  *which = kRejectIfAnyOn;
00196             else if (!cmp_nocase(stst,"allon"))  *which = kRejectIfAllOn;
00197             else {
00198                MSG("Demo",Msg::kWarning) 
00199                   << "No DataReject/Mode setting \"" << stst
00200                   << "\", should be one of on, off, ignore." << endl;
00201                *which = kIgnoreTest;
00202             }
00203          }
00204       }
00205    }
00206    else {
00207       MSG("Demo",Msg::kInfo) 
00208          << "Valid DataReject commands are RunType, Mode" << endl;
00209    }
00210 }
00211 
00212 //......................................................................
00213 
00214 JobCResult DemoDataReject::FilterRawRecord(const RawRecord* rawrec) const
00215 {
00216 
00217    JobCResult result = JobCResult::kPassed;
00218 
00219    // test if the run type is in the disallowed set
00220    const RawDaqHeader* header = 
00221       dynamic_cast<const RawDaqHeader*>(rawrec->GetRawHeader());
00222    if (header) {
00223       Short_t rt = header->GetRunType();
00224       if (fRunTypeReject.end() != fRunTypeReject.find(rt))
00225          return JobCResult::kFailed;
00226    }
00227    else {
00228       MSG("Demo",Msg::kInfo)
00229          << "RawRecord lacked RawDaqHeader: "
00230          << *(rawrec->GetRawHeader())
00231          << endl;
00232    }
00233 
00234    // test if the wrong modes were in play in RawDigitDataBlock
00235    TIter itr = rawrec->GetRawBlockIter();
00236    RawDataBlock* rdb = 0;
00237    // The dynamic cast from TObject is ugly but necessary
00238    // Careful! the itr() advances the iterator as a side effect!
00239    while ((rdb = dynamic_cast<RawDataBlock*>(itr()))) {
00240       RawDigitDataBlock *rddb = dynamic_cast<RawDigitDataBlock*>(rdb);
00241       if (rddb) {
00242          Short_t ncrates = rddb->GetNumberOfCrates();
00243          Short_t nped    = rddb->GetNPedModeCrates();
00244          Short_t nspars  = rddb->GetNSparsModeCrates();
00245          Short_t ncommon = rddb->GetNCommonModeCrates();
00246 
00247          using namespace RejectHelper;
00248          if (reject_it(fPedReject,nped,ncrates)) 
00249             return JobCResult::kFailed;
00250          if (reject_it(fSparsReject,nspars,ncrates)) 
00251             return JobCResult::kFailed;
00252          if (reject_it(fCommonReject,ncommon,ncrates)) 
00253             return JobCResult::kFailed;
00254 
00255          if ( fVetoShieldReject != kIgnoreTest &&
00256               reject_veto(fVetoShieldReject,rddb) ) return JobCResult::kFailed;
00257       }
00258   }
00259 
00260   return result;
00261 }
00262 
00263 //......................................................................
00264 
00265 void DemoDataReject::Help()
00266 {
00267   const char* n = this->GetName();
00268 
00269   MSG("Demo",Msg::kInfo)
00270      << "Help for module " << n << endl
00271      << endl
00272      << "  A filter to remove undesired data configurations" << endl
00273      << "  commands:" << endl
00274      << endl
00275      << "  /" << n << "/RunType [ival [ival ...]]" << endl
00276      << endl
00277      << "  /" << n << "/Mode <mode> <toggle> ..." << endl
00278      << "     where <mode> is one of Ped, Spars, Common " <<endl
00279      << "     and   <toggle> is: " << endl
00280      << "                AllOff, [Any]Off, [Any]On, AllOn " << endl
00281      << "                or Ignore (which skips the test) " << endl
00282      << endl
00283      << endl;
00284 
00285 }
00286 

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