00001
00002
00004 #include "Demo/DemoDataReject.h"
00005 #include <cstdio>
00006
00007 #include "TObject.h"
00008 #include "TCollection.h"
00009 #include "TObjectTable.h"
00010
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
00042
00043
00044
00045 bool reject_it(Short_t setting, Short_t n, Short_t m) {
00046
00047
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
00063
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
00103
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
00113
00114 return result;
00115 }
00116
00117
00118
00119 const Registry& DemoDataReject::DefaultConfig() const
00120 {
00121
00122
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
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
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
00235 TIter itr = rawrec->GetRawBlockIter();
00236 RawDataBlock* rdb = 0;
00237
00238
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