00001
00002
00003
00004
00005
00006
00007
00009 #include <fstream>
00010 #include <iostream>
00011 #include <iomanip>
00012 #include <sstream>
00013 #include <math.h>
00014
00015 #include "TFile.h"
00016 #include "TString.h"
00017 #include "TTimeStamp.h"
00018
00019 #include "JobControl/JobCModuleRegistry.h"
00020 #include "MessageService/MsgService.h"
00021 #include "MinosObjectMap/MomNavigator.h"
00022 #include "OnlineUtil/mdTriggerCodes.h"
00023 #include "Plex/PlexSEIdAltL.h"
00024 #include "Plex/PlexHandle.h"
00025
00026 #include "RawData/RawRecord.h"
00027 #include "RawData/RawDaqSnarlHeader.h"
00028 #include "RawData/RawDigit.h"
00029 #include "RawData/RawDigitDataBlock.h"
00030 #include "RawData/RawDaqHeaderBlock.h"
00031 #include "RawData/RawRunConfigBlock.h"
00032
00033 #include "FarmListModule.h"
00034 #include "RSM.h"
00035 #include "UtilRSM.h"
00036
00037 using namespace std;
00038
00039 ClassImp(FarmListModule)
00040
00041 CVSID("$Id: FarmListModule.cxx,v 1.8 2008/01/17 20:34:22 bspeak Exp $");
00042 JOBMODULE(FarmListModule, "FarmListModule",
00043 "Module to generate batch farm lists");
00044
00045 FarmListModule::FarmListModule()
00046 {
00047 RSMSyn << "FarmListModule::FarmListModule" << endl;
00048 fRun = 0;
00049 fSubRun = 0;
00050
00051 fNTrigPlane = 0;
00052 fNTrigActivity = 0;
00053 fNTrigE4 = 0;
00054 fNTrigSpill = 0;
00055 fNTrigSpillIP = 0;
00056
00057 fNSnarl = 0;
00058 fMaxPlane[0] = 0;
00059 fMaxPlane[1] = 0;
00060 fMaxPlane[2] = 0;
00061
00062 fStartTime=VldTimeStamp((time_t) 0, 0);
00063 fEndTime=VldTimeStamp((time_t) 0, 0);
00064
00065 fRunOUT = false;
00066
00067 fMFileOutMode = ios::out | ios::app;
00068 fSFileOutMode = ios::out | ios::app;
00069 }
00070
00071 FarmListModule::~FarmListModule()
00072 {
00073 RSMSyn << "FarmListModule::~FarmListModule" << endl;
00074 }
00075
00076 void FarmListModule::FarmFileOUT()
00077 {
00078 RSMDeb << "FarmListModule::FarmFileOUT" << endl;
00079
00080 if (fRunOUT) {
00081 RSMErr << "Multiple output attempt for: " <<
00082 fRun << "-" << fSubRun << endl;
00083 return;
00084 }
00085
00086 if (fRun==0 && fSubRun==0) {
00087 RSMDeb << "Output attempt for: " <<
00088 fRun << "-" << fSubRun << endl;
00089 return;
00090 }
00091
00092 Bool_t Passed = true;
00093
00094 UInt_t SecondsPassed = fEndTime.GetSec() - fStartTime.GetSec();
00095 Passed = Passed && (SecondsPassed>=fMinSecond);
00096 Passed = Passed && (fNSnarl>=fMinSnarl);
00097 Passed = Passed && (fNTrigPlane>=fMinTrigPlane);
00098 Passed = Passed && (fNTrigActivity>=fMinTrigActivity);
00099 Passed = Passed && (fNTrigE4>=fMinTrigE4);
00100 Passed = Passed && (fNTrigSpill>=fMinTrigSpill);
00101 Passed = Passed && (fNTrigSpillIP>=fMinTrigSpillIP);
00102
00103 Int_t Year = fEndTime.GetDate()/10000;
00104 Int_t Month = fEndTime.GetDate()/100 - 100*Year;
00105
00106 if (fMFileName != "") {
00107 string fdir = fMFileDir;
00108 if(fMonthlyMFileDir) fdir += Form("/%04d_%02d/", Year, Month);
00109 if(!UtilRSM::CheckDir(fdir.c_str())) exit(0);
00110
00111 string fname = fMFileName;
00112 if(!Passed) fname += ".sup";
00113
00114 ofstream fout((fdir+fname).c_str(), fMFileOutMode);
00115
00116 RSMInf << "Writing to " << fname << " in " << fdir << endl;
00117
00118 ostringstream ThisLine;
00119 if (fDet==Detector::kFar) {
00120 fout << Form("F%08d_%04d", fRun, fSubRun) << " "
00121 << Form("% 4d-%02d", Year, Month)
00122 << Form("% 8d", fNSnarl)
00123 << Form("% 5d", fMaxPlane[0]) << endl;
00124 }
00125 else if(fDet==Detector::kNear) {
00126 fout << Form("N%08d_%04d", fRun, fSubRun) << " "
00127 << Form("% 4d-%02d", Year, Month)
00128 << Form("% 8d", fNSnarl) << endl;
00129 }
00130 else {
00131 RSMWar << "Can't use this detector: "
00132 << Detector::AsString(fDet) << endl;
00133 return;
00134 }
00135
00136 if (SecondsPassed < fMinSecond) {
00137 fout << " Failed MinSeconds >= " << fMinSecond
00138 << " with " << SecondsPassed << endl;
00139 }
00140 if (fNSnarl < fMinSnarl) {
00141 fout << " Failed MinSnarl >= " << fMinSnarl
00142 << " with " << fNSnarl << endl;
00143 }
00144 if (fNTrigPlane < fMinTrigPlane) {
00145 fout << " Failed MinTrigPlane >= " << fMinTrigPlane
00146 << " with " << fNTrigPlane << endl;
00147 }
00148 if (fNTrigActivity < fMinTrigActivity) {
00149 fout << " Failed MinTrigActivity >= " << fMinTrigActivity
00150 << " with " << fNTrigActivity << endl;
00151 }
00152 if (fNTrigE4 < fMinTrigE4) {
00153 fout << " Failed MinTrigE4 >= " << fMinTrigE4
00154 << " with " << fNTrigE4 << endl;
00155 }
00156 if (fNTrigSpill < fMinTrigSpill) {
00157 fout << " Failed MinTrigSpill >= " << fMinTrigSpill
00158 << " with " << fNTrigSpill << endl;
00159 }
00160 if (fNTrigSpillIP < fMinTrigSpillIP) {
00161 fout << " Failed MinTrigSpillIP >= " << fMinTrigSpillIP
00162 << " with " << fNTrigSpillIP << endl;
00163 }
00164
00165 fout.close();
00166 }
00167
00168 if (fSFileName != "") {
00169 string fdir = fSFileDir;
00170 if(fMonthlySFileDir) fdir += Form("/%04d_%02d/", Year, Month);
00171 if(!UtilRSM::CheckDir(fdir.c_str())) exit(0);
00172
00173 string fname = fSFileName;
00174 if(!Passed) fname += ".sup";
00175
00176 ofstream fout((fdir+fname).c_str(), fSFileOutMode);
00177
00178 RSMInf << "Writing to " << fname << " in " << fdir << endl;
00179
00180 ostringstream ThisLine;
00181 if (fDet==Detector::kFar) {
00182 fout << Form("F%08d_%04d", fRun, fSubRun) << endl;
00183 }
00184 else if(fDet==Detector::kNear) {
00185 fout << Form("N%08d_%04d", fRun, fSubRun) << endl;
00186 }
00187 else {
00188 RSMWar << "Can't use this detector: "
00189 << Detector::AsString(fDet) << endl;
00190 return;
00191 }
00192
00193 fout.close();
00194 }
00195
00196 RSMDeb << "--Counters-- (" << SecondsPassed << " seconds)" << endl
00197 << " NSnarl: " << fNSnarl << endl
00198 << " NTrigPlane: " << fNTrigPlane << endl
00199 << " NTrigActivity: " << fNTrigActivity << endl
00200 << " NTrigE4: " << fNTrigE4 << endl
00201 << " NTrigSpill: " << fNTrigSpill << endl
00202 << " NTrigSpillIP: " << fNTrigSpillIP << endl;
00203
00204 fNTrigPlane = 0;
00205 fNTrigActivity = 0;
00206 fNTrigE4 = 0;
00207 fNTrigSpill = 0;
00208 fNTrigSpillIP = 0;
00209
00210 fNSnarl = 0;
00211 fMaxPlane[0] = 0;
00212 fMaxPlane[1] = 0;
00213 fMaxPlane[2] = 0;
00214
00215 fRunOUT = true;
00216 return;
00217 }
00218
00219 JobCResult FarmListModule::Ana(const MomNavigator *mom)
00220 {
00221 RSMVer << "FarmListModule::Ana" << endl;
00222
00223 const char* rcInStr = 0;
00224 RawRecord* rawrec = 0;
00225 RawDigitDataBlock* dblock = 0;
00226 RawDigit* digit = 0;
00227
00228
00229 TIter momitr = const_cast<MomNavigator*>(mom)->FragmentIter();
00230 TObject* momobj = 0;
00231 while ((momobj=momitr())) {
00232 rawrec=dynamic_cast<RawRecord*>(momobj);
00233 if(! rawrec) continue;
00234 const RawDaqHeader* dhdr =
00235 dynamic_cast<const RawDaqHeader*>(rawrec->GetRawHeader());
00236
00237 VldContext vldc = dhdr->GetVldContext();
00238 if (fRun!=dhdr->GetRun() || fSubRun!=dhdr->GetSubRun()) {
00239 RSMDeb << "Run change: " <<
00240 fRun << "-" << fSubRun << " -> " <<
00241 dhdr->GetRun() << "-" << dhdr->GetSubRun() << endl;
00242 FarmFileOUT();
00243
00244 fRunOUT = false;
00245 fRun = dhdr->GetRun();
00246 fSubRun = dhdr->GetSubRun();
00247 fDet = dhdr->GetVldContext().GetDetector();
00248 fStartTime = dhdr->GetVldContext().GetTimeStamp();
00249 fEndTime = dhdr->GetVldContext().GetTimeStamp();
00250 }
00251
00252 if(!rawrec->GetTempTags().Get("stream",rcInStr)) continue;
00253
00254 if(fEndTime<vldc.GetTimeStamp() &&
00255 vldc.GetTimeStamp()>fStartTime) {
00256 fEndTime = vldc.GetTimeStamp();
00257 }
00258
00259 PlexHandle ph(vldc);
00260 TIter rawitr = rawrec->GetRawBlockIter(); rawitr.Reset();
00261 TObject *rawobj = 0;
00262 while ((rawobj=rawitr())) {
00263 if ((dblock = dynamic_cast<RawDigitDataBlock*>(rawobj))) {
00264 fNSnarl++;
00265
00266 const RawSnarlHeaderBlock* hdrblk =
00267 dynamic_cast<const RawSnarlHeaderBlock*>
00268 (rawrec->FindRawBlock("RawSnarlHeaderBlock"));
00269 int TrigSrc = hdrblk->GetTriggerSource();
00270
00271 if(TrigSrc&TRIGGER_BIT_PLANE) fNTrigPlane++;
00272 if(TrigSrc&TRIGGER_BIT_ACTIVITY) fNTrigActivity++;
00273 if(TrigSrc&TRIGGER_BIT_E4) fNTrigE4++;
00274 if(TrigSrc&TRIGGER_BIT_SPILL) fNTrigSpill++;
00275 if(TrigSrc&TRIGGER_BIT_SPILL_IP) fNTrigSpillIP++;
00276
00277
00278 if (fDet==Detector::kNear) continue;
00279
00280 VldTimeStamp trigger_time = hdrblk->GetTriggerTime();
00281 TIter digitr = dblock->GetDatumIter();
00282 TObject *digobj = 0;
00283 while ((digobj=digitr())) {
00284 digit=dynamic_cast<RawDigit*>(digobj);
00285 if(!digit) continue;
00286 RawChannelId rawid = digit->GetChannel();
00287
00288 VldTimeStamp vt_T0 = digit->GetCrateT0();
00289 vt_T0.Add(VldTimeStamp(0,(Int_t)(1.5625*digit->GetTDC())));
00290 if(vt_T0 < trigger_time) continue;
00291
00292 PlexSEIdAltL seidl = ph.GetSEIdAltL(rawid);
00293 if (!(seidl.IsVetoShield()) && seidl.IsValid()) {
00294
00295 Int_t planenum = seidl.GetPlane();
00296
00297 Int_t view_index = ((Int_t)seidl.GetEnd()) - 1;
00298 if (view_index<0 || view_index>1) {
00299 RSMWar << "Bad View Index " << view_index << endl;
00300 continue;
00301 }
00302
00303 if (planenum<=MAXSMPLANE) {
00304 if (planenum>fMaxPlane[view_index+1]) {
00305 fMaxPlane[view_index+1] = planenum;
00306 }
00307 if (planenum>fMaxPlane[0]) {
00308 fMaxPlane[0] = planenum;
00309 }
00310 }
00311 else {
00312 cout << "Weird Plane" << endl;
00313 cout << seidl << endl;
00314 cout << rawid.AsString("e") << endl;
00315 }
00316 }
00317 }
00318 }
00319 }
00320 }
00321 return JobCResult::kPassed;
00322 }
00323
00324 void FarmListModule::BeginJob()
00325 {
00326 RSMSyn << "FarmListModule::BeginJob" << endl;
00327 fRun = 0;
00328 fSubRun = 0;
00329
00330 fNSnarl = 0;
00331 fMaxPlane[0] = 0;
00332 fMaxPlane[1] = 0;
00333 fMaxPlane[2] = 0;
00334
00335 fNTrigPlane = 0;
00336 fNTrigActivity = 0;
00337 fNTrigE4 = 0;
00338 fNTrigSpill = 0;
00339 fNTrigSpillIP = 0;
00340
00341 fStartTime=VldTimeStamp( static_cast<time_t>(0), 0);
00342 fEndTime=VldTimeStamp( static_cast<time_t>(0), 0);
00343
00344 fRunOUT = false;
00345
00346
00347 fMFileOutMode = ios::out | ios::app;
00348 if(!fAppendMFile) fMFileOutMode = ios::out;
00349 }
00350
00351 void FarmListModule::EndJob()
00352 {
00353 RSMSyn << "FarmListModule::EndJob" << endl;
00354
00355 RSMDeb << "Final output in EndJob: " << fRun
00356 << "-" << fSubRun << endl;
00357 FarmFileOUT();
00358 }
00359
00360 const Registry& FarmListModule::DefaultConfig() const
00361 {
00362 RSMSyn << "FarmListModule::DefaultConfig" << endl;
00363
00364 static Registry r;
00365
00366 string name = this->JobCModule::GetName();
00367 r.SetName((name+".config.default").c_str());
00368 r.UnLockValues();
00369
00370 r.Set("MinSecond",10);
00371
00372 r.Set("MinSnarl",0);
00373 r.Set("MinTrigPlane",0);
00374 r.Set("MinTrigE4",0);
00375 r.Set("MinTrigActivity",0);
00376 r.Set("MinTrigSpill",0);
00377 r.Set("MinTrigSpillIP",0);
00378
00379 r.Set("MFileName","summary.mail");
00380 r.Set("MFileDir","./");
00381 r.Set("MonthlyMFileDir",0);
00382 r.Set("AppendMFile",1);
00383
00384 r.Set("SFileName","summary.simple");
00385 r.Set("SFileDir","./");
00386 r.Set("MonthlySFileDir",0);
00387 r.Set("AppendSFile",1);
00388
00389 r.Set("MonthlyDir",0);
00390 r.Set("AppendFiles",1);
00391
00392 r.LockValues();
00393
00394 return r;
00395 }
00396
00397 void FarmListModule::Config(const Registry& r)
00398 {
00399 RSMSyn << "FarmListModule::Config" << endl;
00400 int tmpi = 0;
00401 const char* tmps = 0;
00402
00403 if(r.Get("MinSecond",tmpi)) fMinSecond=tmpi;
00404 if(r.Get("MinSnarl",tmpi)) fMinSnarl=tmpi;
00405 if(r.Get("MinTrigPlane",tmpi)) fMinTrigPlane=tmpi;
00406 if(r.Get("MinTrigE4",tmpi)) fMinTrigE4=tmpi;
00407 if(r.Get("MinTrigActivity",tmpi)) fMinTrigActivity=tmpi;
00408 if(r.Get("MinTrigSpill",tmpi)) fMinTrigSpill=tmpi;
00409 if(r.Get("MinTrigSpillIP",tmpi)) fMinTrigSpillIP=tmpi;
00410
00411 if(r.Get("MFileName",tmps)) fMFileName=tmps;
00412 if(r.Get("MFileDir",tmps)) fMFileDir=tmps;
00413 if(r.Get("MonthlyMFileDir",tmpi)) fMonthlyMFileDir=static_cast<bool>(tmpi);
00414 if(r.Get("AppendMFile",tmpi)) fAppendMFile=static_cast<bool>(tmpi);
00415
00416 if(r.Get("SFileName",tmps)) fSFileName=tmps;
00417 if(r.Get("SFileDir",tmps)) fSFileDir=tmps;
00418 if(r.Get("MonthlySFileDir",tmpi)) fMonthlySFileDir=static_cast<bool>(tmpi);
00419 if(r.Get("AppendSFile",tmpi)) fAppendSFile=static_cast<bool>(tmpi);
00420
00421 if (r.Get("MonthlyDir",tmpi)) {
00422 fMonthlyMFileDir=static_cast<bool>(tmpi);
00423 fMonthlySFileDir=static_cast<bool>(tmpi);
00424 }
00425
00426 if (r.Get("AppendFiles",tmpi)) {
00427 fAppendMFile=static_cast<bool>(tmpi);
00428 fAppendSFile=static_cast<bool>(tmpi);
00429 }
00430
00431 if(!fAppendMFile) fMFileOutMode = ios::out;
00432 else fMFileOutMode = ios::out | ios::app;
00433
00434 if(!fAppendSFile) fSFileOutMode = ios::out;
00435 else fSFileOutMode = ios::out | ios::app;
00436 }