00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017 #include <iostream>
00018 #include <map>
00019
00020 #include "TDatime.h"
00021 #include "TFile.h"
00022 #include "TH1.h"
00023 #include "TH2.h"
00024 #include "TProfile.h"
00025 #include "TROOT.h"
00026
00027 #include "JobControl/JobCModuleRegistry.h"
00028 #include "JobControl/JobCommand.h"
00029 #include "MessageService/MsgService.h"
00030 #include "MinosObjectMap/MomNavigator.h"
00031 #include "PulserCalibration/PulserSummaryList.h"
00032 #include "PulserCalibration/PulserFromRawSummaryList.h"
00033 #include "PulserCalibration/PulserSummary.h"
00034 #include "RawData/RawLIAdcSummary.h"
00035 #include "RawData/RawDaqHeader.h"
00036 #include "RawData/RawLIAdcSummaryBlock.h"
00037 #include "RawData/RawRunCommentBlock.h"
00038 #include "RawData/RawLIHeader.h"
00039
00040 #include "LISummary/LISummaryModule.h"
00041
00042 #include <cassert>
00043
00044 JOBMODULE(LISummaryModule,"LISummaryModule","A module to collect raw LI summary blocks or pulser summaries from the data stream");
00045
00046 CVSID("$Id: LISummaryModule.cxx,v 1.5 2007/11/11 08:00:53 rhatcher Exp $");
00047
00048 ClassImp(LISummaryModule)
00049
00050
00051
00052 LISummaryModule::LISummaryModule()
00053 {
00054 MSG("LISummaryModule", Msg::kDebug)
00055 <<"Running LISummaryModule constructor..."<<endl;
00056
00057
00058 calibPoint=-1;
00059 calibType=-1;
00060 fDataReconstructed=false;
00061 led=-1;
00062 fLedLast=-1;
00063
00064
00065
00066 mean=-1;
00067 numEntries=-1;
00068 period=-1;
00069 pulseHeight=-1;
00070 pulserBox=-1;
00071 pulses=-1;
00072 pulseWidth=-1;
00073 rms=-1;
00074 timeNanoSec=-1;
00075 timeSec=-1;
00076
00077 MSG("LISummaryModule", Msg::kDebug)
00078 <<"Finished constructor"<<endl;
00079 }
00080
00081
00082
00083 LISummaryModule::~LISummaryModule()
00084 {
00085 MSG("LISummaryModule", Msg::kDebug)
00086 <<"Running destructor..."<<endl;
00087
00088 MSG("LISummaryModule", Msg::kDebug)
00089 <<"Finished destructor"<<endl;
00090 }
00091
00092
00093
00094 JobCResult LISummaryModule::Reco(MomNavigator *mom)
00095 {
00096 JobCResult result(JobCResult::kPassed);
00097
00098
00099 assert(mom);
00100
00101
00102 RawRecord *rawrec = dynamic_cast<RawRecord *>
00103 (mom->GetFragment("RawRecord"));
00104
00105 if (!rawrec) {
00106 result.SetError().SetFailed();
00107 MSG("LISummaryModule",Msg::kError)
00108 <<"No raw record in mom"<<endl;
00109 return result;
00110 }
00111
00112
00113 const RawDaqHeader *rawDaqHdr=
00114 dynamic_cast<const RawDaqHeader*>(rawrec->GetRawHeader());
00115 if (rawDaqHdr){
00116 summarySorter.SetRunNumber(rawDaqHdr->GetRun());
00117 summarySorter.SetRunNumberSub(rawDaqHdr->GetSubRun());
00118 summarySorter.SetRunType(rawDaqHdr->GetRunType());
00119 summarySorter.SetDetector(rawDaqHdr->GetVldContext());
00120 VldContext v=rawDaqHdr->GetVldContext();
00121 summarySorter.SetRawDaqVldCtx(v);
00122 MSG("LISummaryModule", Msg::kVerbose)
00123 <<"Time in raw daq header is: "<<v.GetTimeStamp()<<endl;
00124 }
00125
00126 Bool_t fUseSummaryBlocks=true;
00127 Bool_t fUsePulserBlocks=false;
00128
00129 if (fUseSummaryBlocks){
00130 result=GetSummaryBlocks(rawrec);
00131 return result;
00132 }
00133 else if (fUsePulserBlocks){
00134 result=GetPulserBlocks(rawrec,mom);
00135 return result;
00136 }
00137 else{
00138 result.SetError().SetFailed();
00139 MSG("LISummaryModule",Msg::kError)
00140 <<"Summary or Pulser Block not specified"<<endl;
00141 return result;
00142 }
00143 }
00144
00145
00146
00147 JobCResult LISummaryModule::GetPulserBlocks(RawRecord* rawrec,
00148 MomNavigator *mom)
00149 {
00150 JobCResult result(JobCResult::kPassed);
00151
00152 PulserFromRawSummaryList *psl = dynamic_cast
00153 <PulserFromRawSummaryList *>
00154 (mom->GetFragment("PulserFromRawSummaryList"));
00155
00156 if (!psl) {
00157 MSG("LISummaryModule",Msg::kInfo)
00158 <<"No pulser summary list here\n";
00159 return JobCResult::kFailed;
00160 }
00161
00162 MSG("LISummaryModule",Msg::kInfo)
00163 <<"Got pulser summary "<<psl->GetPointIndex()
00164 <<" of "<<psl->GetExpectedPoints()<<endl;
00165
00166
00167
00168
00169 const RawRunCommentBlock* rrcb=dynamic_cast<const RawRunCommentBlock*>
00170 (rawrec->FindRawBlock("RawRunCommentBlock"));
00171
00172
00173
00174
00175
00176
00177
00178
00179 if(rrcb){
00180
00181 MSG("LISummaryModule",Msg::kInfo)
00182 << "------------------------------------------------" << endl
00183 << "COMMENT:" << endl
00184 << rrcb->GetRunComment() << endl
00185 << "------------------------------------------------" << endl;
00186 }
00187 else {
00188 MSG("LISummaryModule",Msg::kInfo)
00189 <<"No raw run comment block in mom"<<endl;
00190 }
00191
00192 VldContext vDaqHdr;
00193
00194 const RawDaqHeader *rawDaqHdr=
00195 dynamic_cast<const RawDaqHeader*>(rawrec->GetRawHeader());
00196 if (rawDaqHdr){
00197 summarySorter.SetRunNumber(rawDaqHdr->GetRun());
00198 summarySorter.SetRunNumberSub(rawDaqHdr->GetSubRun());
00199 summarySorter.SetRunType(rawDaqHdr->GetRunType());
00200 summarySorter.SetDetector(rawDaqHdr->GetVldContext());
00201 vDaqHdr=rawDaqHdr->GetVldContext();
00202 MSG("LISummaryModule", Msg::kVerbose)
00203 <<"Time in raw daq header is: "<<vDaqHdr.GetTimeStamp()<<endl;
00204 }
00205
00206
00207 timeStamp=vDaqHdr.GetTimeStamp();
00208 timeSec=timeStamp.GetSec();
00209 timeNanoSec=timeStamp.GetNanoSec();
00210 calibPoint=psl->GetPointIndex();
00211 calibType=psl->GetExpectedPoints();
00212 pulserBox=psl->GetPulserBox();
00213 led=psl->GetLed();
00214 pulseHeight=psl->GetHeight();
00215 pulseWidth=psl->GetWidth();
00216 pulses=psl->GetNumPulses();
00217 period=10;
00218
00219
00220 summarySorter.SetPlexHandle(psl->GetVldContext());
00221 summarySorter.Update(led,pulseHeight,pulseWidth,pulserBox,calibPoint,
00222 timeStamp,calibType,pulses,period);
00223
00224 map<Int_t,PulserSummary>::const_iterator ps=psl->GetNearBegin();
00225
00226 while (ps!=psl->GetNearEnd()){
00227
00228 mean=(*ps).second.GetMean();
00229 rms=(*ps).second.GetRMS();
00230 numEntries=(*ps).second.GetEntries();
00231
00232 UInt_t rawchannel=(*ps).second.GetChannel();
00233
00234 summarySorter.AddEntry(rawchannel,mean,rms,numEntries);
00235
00236 ps++;
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 return result;
00256 }
00257
00258
00259
00260 JobCResult LISummaryModule::GetSummaryBlocks(RawRecord* rawrec)
00261 {
00262 JobCResult result(JobCResult::kPassed);
00263
00264
00265 const RawLIAdcSummaryBlock *rawliadcsummaryblock =
00266 dynamic_cast<const RawLIAdcSummaryBlock*>
00267 (rawrec->FindRawBlock("RawLIAdcSummaryBlock"));
00268
00269
00270 if(!rawliadcsummaryblock){
00271 result.SetError().SetFailed();
00272 MSG("LISummaryModule",Msg::kError)
00273 <<"No Raw LI Adc Summary Block in raw record"<<endl;
00274 return result;
00275 }
00276
00277
00278 timeStamp=rawliadcsummaryblock->GetTimeStamp();
00279 timeSec=timeStamp.GetSec();
00280 timeNanoSec=timeStamp.GetNanoSec();
00281 calibPoint=rawliadcsummaryblock->GetCalibPoint();
00282 calibType=rawliadcsummaryblock->GetCalibType();
00283 pulserBox=rawliadcsummaryblock->GetPulserBox();
00284 led=rawliadcsummaryblock->GetLed();
00285 pulseHeight=rawliadcsummaryblock->GetPulseHeight();
00286 pulseWidth=rawliadcsummaryblock->GetPulseWidth();
00287 pulses=rawliadcsummaryblock->GetPulses();
00288 period=rawliadcsummaryblock->GetPeriod();
00289
00290
00291 if (MsgService::Instance()->IsActive("LISummaryModule",
00292 Msg::kDebug)){
00293 this->PrintBlockInfo("LICollector: New Block ");
00294 }
00295
00296
00298
00300
00301
00302 if (fWriteOnlyGainCurves){
00303 MAXMSG("LISummaryModule",Msg::kInfo,1)
00304 <<"Only points with calibType>1 (i.e. GCs) will be written out"<<endl;
00305 if (calibType==1){
00306
00307
00308 Int_t ledIndex=pulserBox*fLookup.NUMLEDS+led;
00309 static Int_t lastLedIndex=-1;
00310 if (ledIndex!=lastLedIndex){
00311 MSG("LISummaryModule",Msg::kInfo)
00312 <<"Only writing GCs, skipping drift point with settings:"<<endl;
00313
00314
00315 this->PrintBlockInfo(" ");
00316 }
00317 lastLedIndex=ledIndex;
00318 return JobCResult::kFailed;
00319 }
00320 else{
00321
00322 }
00323 }
00324 else {
00325 MAXMSG("LISummaryModule",Msg::kInfo,1)
00326 <<"All calibTypes will be written out"<<endl;
00327 }
00328
00329 if (led>=fLookup.FIRSTLED && led<=fLookup.LASTLED &&
00330 pulserBox>=fLookup.FIRSTPULSERBOX &&
00331 pulserBox<=fLookup.LASTPULSERBOX){
00332
00333
00334 Int_t ledIndex=pulserBox*fLookup.NUMLEDS+led;
00335 static Int_t lastLedIndex=-1;
00336 MSG("LISummaryModule",Msg::kVerbose)
00337 <<"lastLedIndex="<<lastLedIndex<<endl;
00338 if (ledIndex!=lastLedIndex){
00339 fLIRunSeqCurrent[ledIndex]++;
00340 }
00341
00342
00343
00344 if (fLIRunSeqCurrent[ledIndex]!=fLIRunSeqReq && fLIRunSeqReq!=-1){
00345
00346
00347 if (ledIndex!=lastLedIndex){
00348 MSG("LISummaryModule",Msg::kInfo)
00349 <<endl
00350 <<" ** Skipping point in this run, fLIRunSeqReq="
00351 <<fLIRunSeqReq
00352 <<", fLIRunSeqCurrent["<<ledIndex<<"]="
00353 <<fLIRunSeqCurrent[ledIndex]<<" **"
00354 <<endl;
00355
00356
00357 this->PrintBlockInfo("Point had settings: ");
00358 }
00359 lastLedIndex=ledIndex;
00360
00361 return JobCResult::kFailed;
00362 }
00363 lastLedIndex=ledIndex;
00364 }
00365 else{
00366 static Int_t numberMsg=0;
00367 if (numberMsg<10){
00368 MSG("LISummaryModule",Msg::kWarning)
00369 <<endl<<"Skipping summary block with strange values:"<<endl;
00370 this->PrintBlockInfo("");
00371 if (numberMsg==9){
00372 MSG("LISummarySorter",Msg::kWarning)
00373 <<endl
00374 <<"This is the last message of this type to be printed"
00375 <<endl;
00376 }
00377 }
00378 numberMsg++;
00379 return JobCResult::kFailed;
00380 }
00382
00384
00385 static Int_t firstTimeSec=timeSec;
00386 MAXMSG("LISummaryModule",Msg::kInfo,1)
00387 <<endl<<"First timestamp to be written out = "<<firstTimeSec<<endl;
00388
00389
00390 summarySorter.SetPlexHandle(rawliadcsummaryblock->GetVldContext());
00391
00392
00393 summarySorter.Update(led,pulseHeight,pulseWidth,pulserBox,calibPoint,
00394 timeStamp,calibType,pulses,period);
00395
00396 summarySorter.CountNumSummaries(rawliadcsummaryblock->
00397 GetNumberOfSummaries());
00398
00399 for(Int_t n=0;n<rawliadcsummaryblock->GetNumberOfSummaries();n++){
00400 const RawLIAdcSummary *rawliadcsummary=
00401 rawliadcsummaryblock->At(n);
00402
00403 mean=rawliadcsummary->GetMean();
00404 rms=rawliadcsummary->GetRms();
00405 numEntries=rawliadcsummary->GetEntries();
00406
00407 summarySorter.AddEntry(rawliadcsummary->GetChannel(),
00408 mean,rms,numEntries);
00409
00410
00411 static Bool_t fillProfiles=false;
00412 if (fillProfiles) {
00413 MAXMSG("LISummaryModule",Msg::kInfo,500)
00414 <<"entries="<<numEntries<<", mean="<<mean<<", rms="<<rms<<endl;
00415
00416 MAXMSG("LISummaryModule",Msg::kInfo,1)
00417 <<endl<<"Creating TProfile to look at entries in each summary"<<endl;
00418 static TProfile* pSummarySizeVsTF=new TProfile
00419 ("pSummarySizeVsTF","pSummarySizeVsTF",10000,0,10000);
00420 static TProfile* pSummarySizeVsTFAll=new TProfile
00421 ("pSummarySizeVsTFAll","pSummarySizeVsTFAll",10000,0,10000);
00422 static TProfile* pSummarySizeVsTF90=new TProfile
00423 ("pSummarySizeVsTF90","pSummarySizeVsTF90",10000,0,10000);
00424 static TH1F* hSummarySize=new TH1F
00425 ("hSummarySize","hSummarySize",1000,0,1000);
00426
00427 static vector<TProfile*> vProf50;
00428 static vector<TProfile*> vProf90;
00429 if (vProf50.size()==0){
00430 cout<<"Creating vector of TProfiles..."<<endl;
00431 for (Int_t i=0;i<=150;i++){
00432 string s="pSummaryEntVsTF50Pl";
00433 s+=Form("%d",i);
00434 cout<<"Creating TProfile with name="<<s<<endl;
00435 TProfile* p=new TProfile(s.c_str(),s.c_str(),10000,0,10000);
00436 vProf50.push_back(p);
00437
00438 s="pSummaryEntVsTF90Pl";
00439 s+=Form("%d",i);
00440 cout<<"Creating TProfile with name="<<s<<endl;
00441 p=new TProfile(s.c_str(),s.c_str(),10000,0,10000);
00442 vProf90.push_back(p);
00443 }
00444 }
00445
00446 PlexHandle ph(rawliadcsummaryblock->GetVldContext());
00447 Int_t plane=ph.GetSEIdAltL(rawliadcsummary->GetChannel()).GetPlane();
00448 MAXMSG("LISummaryModule",Msg::kInfo,500)
00449 <<endl<<"Filling TProfiles, plane="<<plane<<endl;
00450 if (plane>-1 && plane<150 && numEntries>90) vProf90[plane]->
00451 Fill(timeSec-firstTimeSec,numEntries);
00452 if (plane>-1 && plane<150 && numEntries>50) vProf50[plane]->
00453 Fill(timeSec-firstTimeSec,numEntries);
00454
00455
00456 if (numEntries>50) pSummarySizeVsTF->Fill(timeSec-firstTimeSec,numEntries);
00457 if (numEntries>90) pSummarySizeVsTF90->Fill(timeSec-firstTimeSec,numEntries);
00458 pSummarySizeVsTFAll->Fill(timeSec-firstTimeSec,numEntries);
00459 hSummarySize->Fill(numEntries);
00460 }
00461 }
00462
00463 fDataReconstructed=true;
00464 return result;
00465 }
00466
00467
00468
00469 void LISummaryModule::PrintBlockInfo(string preString)
00470 {
00471 MSG("LISummaryModule",Msg::kVerbose)<<"PrintBlockInfo..."<<endl;
00472
00473 TDatime datime;
00474 datime.Set(timeStamp.GetSec());
00475
00476
00477 string sHour=Form("%d",datime.GetHour());
00478 string sMinute=Form("%d",datime.GetMinute());
00479 string sSecond=Form("%d",datime.GetSecond());
00480 string sMonth=Form("%d",datime.GetMonth());
00481 string sDay=Form("%d",datime.GetDay());
00482 if (datime.GetHour()<10) sHour="0"+sHour;
00483 if (datime.GetMinute()<10) sMinute="0"+sMinute;
00484 if (datime.GetSecond()<10) sSecond="0"+sSecond;
00485 if (datime.GetMonth()<10) sMonth="0"+sMonth;
00486 if (datime.GetDay()<10) sDay="0"+sDay;
00487
00488
00489 Double_t pulseFreq=-1;
00490 if (period!=0) pulseFreq=ceil(1.0/(period*1.0e-5));
00491 string sPulseFreq=Form("%d",static_cast<Int_t>(pulseFreq));
00492 string sPeriod=Form("%d",static_cast<Int_t>(period));
00493 if (pulseFreq<0) sPulseFreq="??? (period="+sPeriod+")";
00494
00495 MSG("LISummaryModule",Msg::kInfo)
00496 <<preString
00497 <<"PB="<<pulserBox
00498 <<" Led="<<led
00499 <<" CP="<<calibPoint
00500 <<"/"<<calibType
00501 <<" PH="<<pulseHeight
00502 <<" PW="<<pulseWidth
00503 <<" PF="<<sPulseFreq
00504 <<" PN="<<pulses
00505 <<" at "<<sHour
00506 <<":"<<sMinute
00507 <<":"<<sSecond
00508 <<" on "<<datime.GetYear()
00509 <<"/"<<sMonth
00510 <<"/"<<sDay
00511 <<endl;
00512
00513 MSG("LISummaryModule",Msg::kVerbose)
00514 <<"PrintBlockInfo method finished"<<endl;
00515 }
00516
00517
00518
00519 void LISummaryModule::BeginJob()
00520 {
00521 MSG("LISummaryModule",Msg::kInfo)
00522 <<endl
00523 <<"**********************************************************"<<endl
00524 <<"This code has a new feature. It can pluck out a particular"<<endl
00525 <<"LI run, e.g. when there are multiple drift points it only"<<endl
00526 <<"returns the one defined by fLIRunSeqReq"<<endl
00527 <<"Setting fLIRunSeqReq to be -1 writes out everything"<<endl
00528 <<"This variable is set in LIReco.C using LIRunSeqRequired"<<endl
00529 <<"Currently fLIRunSeqReq="<<fLIRunSeqReq<<endl
00530 <<"**********************************************************"
00531 <<endl<<endl;
00532 }
00533
00534
00535
00536 void LISummaryModule::EndJob()
00537 {
00538 if (fDataReconstructed){
00539
00540
00541 TObject* o=gROOT->FindObject("pSummarySizeVsTFAll");
00542 if (o) o->Write();
00543 o=gROOT->FindObject("pSummarySizeVsTF90");
00544 if (o) o->Write();
00545 o=gROOT->FindObject("pSummarySizeVsTF");
00546 if (o) o->Write();
00547 o=gROOT->FindObject("hSummarySize");
00548 if (o) o->Write();
00549
00550 for (Int_t i=0;i<=150;i++){
00551 string s="pSummaryEntVsTF50Pl";
00552 s+=Form("%d",i);
00553 o=gROOT->FindObject(s.c_str());
00554 if (o) o->Write();
00555
00556 s="pSummaryEntVsTF90Pl";
00557 s+=Form("%d",i);
00558 o=gROOT->FindObject(s.c_str());
00559 if (o) o->Write();
00560
00561 }
00562
00563
00564
00565 summarySorter.Update(led+10000,pulseHeight,pulseWidth,pulserBox,
00566 calibPoint,timeStamp,calibType,pulses,period);
00567 summarySorter.PrintRecoSummary();
00568
00569 summarySorter.OutputData();
00570 }
00571 else {
00572
00573 summarySorter.PrintRecoSummary();
00574 }
00575 }
00576
00577
00578
00579 const Registry& LISummaryModule::DefaultConfig() const
00580 {
00582
00583 MSG("LISummaryModule", Msg::kDebug)
00584 << "Running LISummaryModule::DefaultConfig..." << endl;
00585
00586 static Registry r;
00587
00588 string name=this->JobCModule::GetName();
00589 name+=".config.default";
00590 r.SetName(name.c_str());
00591 r.UnLockValues();
00592
00593 r.Set("LIRunSeqRequired",-1);
00594 r.Set("WriteOnlyGainCurves",0);
00595
00596 r.LockValues();
00597
00598 return r;
00599 }
00600
00601
00602
00603 void LISummaryModule::Config(const Registry &r)
00604 {
00606
00607 MSG("LISummaryModule", Msg::kDebug)<<"LISummaryModule::Config"<<endl;
00608
00609 Int_t runSeqReq=-1;
00610 if (r.Get("LIRunSeqRequired",runSeqReq)) fLIRunSeqReq=runSeqReq;
00611
00612 Int_t writeOnlyGainCurves=0;
00613 if (r.Get("WriteOnlyGainCurves",writeOnlyGainCurves)) fWriteOnlyGainCurves=
00614 writeOnlyGainCurves;
00615 }
00616
00617
00618