00001 #include "FillHvFromSingles.h"
00002
00003 #include "MessageService/MsgService.h"
00004 #include "MinosObjectMap/MomNavigator.h"
00005 #include "JobControl/JobCommand.h"
00006 #include "JobControl/JobCModuleRegistry.h"
00007
00008 #include "Validity/VldRange.h"
00009 #include "Validity/VldTimeStamp.h"
00010 #include "Validity/VldContext.h"
00011
00012 #include "DatabaseInterface/DbiResultPtr.h"
00013 #include "DatabaseInterface/DbiSqlContext.h"
00014 #include "DatabaseInterface/DbiValidityRec.h"
00015 #include "DatabaseInterface/DbiCascader.h"
00016 #include "DatabaseInterface/DbiTableProxyRegistry.h"
00017 #include "DatabaseInterface/DbiWriter.h"
00018
00019 #include "RawData/RawRecord.h"
00020 #include "RawData/RawHeader.h"
00021 #include "RawData/RawDaqHeader.h"
00022 #include "RawData/RawChannelId.h"
00023
00024 #include "RawData/RawDaqHeaderBlock.h"
00025 #include "RawData/RawTpSinglesSummaryBlock.h"
00026
00027 #include "DcsUser/DbuHvFromSingles.h"
00028
00029
00030
00031
00032
00033 ClassImp(FillHvFromSingles)
00034
00035 CVSID("$Id: FillHvFromSingles.cxx,v 1.9 2008/01/14 21:59:55 bspeak Exp $");
00036
00037 JOBMODULE(FillHvFromSingles,"FillHvFromSingles","FillHvFromSingles");
00038
00039 FillHvFromSingles::FillHvFromSingles() :
00040 fBegTime(-1),
00041 fEndTime(-1),
00042 fRecord(0),
00043 fCounter(0),
00044 fWriteEntries(0),
00045 fReadEntries(0),
00046 fTask(1),
00047 fMinVaRate(50),
00048 fMinQieRate(0),
00049 fMaxColdChips(20),
00050 fWriteToDatabase(0),
00051 fReadFromDatabase(0),
00052 fWriteOutResults(0),
00053 fPruneShortEntries(0),
00054 fPruneMinTime(0),
00055 fPruneMinChips(0),
00056 fHvFile(0),
00057 fHvFileName("hvstatus.root"),
00058 fHvTree(0),
00059 fRawReadout(0)
00060 {
00061 MSG("HvStatus",Msg::kInfo) << " *** FillHvFromSingles::FillHvFromSingles() *** " << endl;
00062
00063 fCurrColdChipsSM1 = -1;
00064 fCurrColdChipsSM2 = -1;
00065
00066 fDetector = Detector::kUnknown;
00067 fRawReadout = new RawReadout();
00068 }
00069
00070 FillHvFromSingles::~FillHvFromSingles()
00071 {
00072 MSG("HvStatus",Msg::kInfo) << " *** FillHvFromSingles::~FillHvFromSingles() *** " << endl;
00073
00074 if( fRawReadout) delete fRawReadout;
00075 }
00076
00077 void FillHvFromSingles::BeginJob()
00078 {
00079 MSG("HvStatus",Msg::kInfo) << " *** FillHvFromSingles::BeginJob() *** " << endl;
00080
00081 }
00082
00083 JobCResult FillHvFromSingles::Get(MomNavigator* mom)
00084 {
00085 MSG("HvStatus",Msg::kInfo) << " *** FillHvFromSingles::Get(...) *** " << endl;
00086
00087 JobCResult result(JobCResult::kPassed);
00088
00089 TObject* momobject = 0;
00090
00091 fRecord=0;
00092
00093 TIter momitr(mom->FragmentIter());
00094 while((momobject = momitr())){
00095 if(momobject->InheritsFrom("RawRecord")){
00096 RawRecord* rawrec = dynamic_cast<RawRecord*>(momobject);
00097 fRecord=1; fCounter++;
00098 MSG("HvStatus",Msg::kInfo) << " *** RAW RECORD [" << fCounter << "] *** " << endl;
00099
00100
00101 if(fDetector==Detector::kUnknown){
00102 fDetector=rawrec->GetHeader()->GetVldContext().GetDetector();
00103 MSG("HvStatus",Msg::kDebug) << " Detector = " << fDetector << endl;
00104 }
00105
00106
00107 TIter rawrecitr = rawrec->GetRawBlockIter();
00108 TObject* tob = 0;
00109 while((tob = rawrecitr())){
00110 MSG("HvStatus",Msg::kDebug) << " " << tob->GetName() << endl;
00111 this->ProcessBlock(tob);
00112 }
00113
00114 }
00115 }
00116
00117 if( !fRecord ){
00118 MSG("HvStatus",Msg::kWarning) << " *** FAILED TO FIND RAW RECORD *** " << endl;
00119 return result.SetFailed();
00120 }
00121
00122 return result;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 const Registry& FillHvFromSingles::DefaultConfig() const
00137 {
00138 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::DefaultConfig() *** " << endl;
00139
00140 static Registry r;
00141 r.SetName("HvStatus.config.default");
00142 r.UnLockValues();
00143 r.Set("HvFileName",fHvFileName.Data());
00144 r.Set("WriteToDatabase",fWriteToDatabase);
00145 r.Set("ReadFromDatabase",fReadFromDatabase);
00146 r.Set("WriteOutResults",fWriteOutResults);
00147 r.Set("PruneShortEntries",fPruneShortEntries);
00148 r.Set("PruneMinTime",fPruneMinTime);
00149 r.Set("PruneMinChips",fPruneMinChips);
00150 r.Set("MinVaRate",fMinVaRate);
00151 r.Set("MinQieRate",fMinQieRate);
00152 r.Set("MaxColdChips",fMaxColdChips);
00153 r.Set("TaskNumber",fTask);
00154 r.LockValues();
00155
00156 return r;
00157 }
00158
00159 void FillHvFromSingles::Config(const Registry& r)
00160 {
00161 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::Config() *** " << endl;
00162
00163 Int_t tmpint; const char* tmpchar = 0;
00164
00165 if(r.Get("HvFileName",tmpchar)) fHvFileName = tmpchar;
00166 if(r.Get("WriteToDatabase",tmpint)) fWriteToDatabase = tmpint;
00167 if(r.Get("WriteToDatabase",tmpint)) fWriteToDatabase = tmpint;
00168 if(r.Get("ReadFromDatabase",tmpint)) fReadFromDatabase = tmpint;
00169 if(r.Get("WriteOutResults",tmpint)) fWriteOutResults = tmpint;
00170 if(r.Get("PruneShortEntries",tmpint)) fPruneShortEntries = tmpint;
00171 if(r.Get("PruneMinTime",tmpint)) fPruneMinTime = tmpint;
00172 if(r.Get("PruneMinChips",tmpint)) fPruneMinChips = tmpint;
00173 if(r.Get("MinVaRate",tmpint)) fMinVaRate = tmpint;
00174 if(r.Get("MinQieRate",tmpint)) fMinQieRate = tmpint;
00175 if(r.Get("MaxColdChips",tmpint)) fMaxColdChips = tmpint;
00176 if(r.Get("TaskNumber",tmpint)) fTask = tmpint;
00177
00178 MSG("HvStatus",Msg::kDebug)
00179 << " configuration: " << endl
00180 << " HvFileName=" << fHvFileName << endl
00181 << " WriteToDatabase=" << fWriteToDatabase << endl
00182 << " ReadFromDatabase=" << fReadFromDatabase << endl
00183 << " WriteOutResults=" << fWriteOutResults << endl
00184 << " PruneShortEntries=" << fPruneShortEntries << endl
00185 << " PruneMinTime=" << fPruneMinTime << endl
00186 << " PruneMinChips=" << fPruneMinChips << endl
00187 << " MinVaRate=" << fMinVaRate << endl
00188 << " MinQieRate=" << fMinQieRate << endl
00189 << " MaxColdChips=" << fMaxColdChips << endl
00190 << " TaskNumber=" << fTask << endl;
00191
00192 return;
00193 }
00194
00195 void FillHvFromSingles::HandleCommand(JobCommand* command)
00196 {
00197 TString cmd = command->PopCmd();
00198 if(cmd=="Set"){
00199 TString opt = command->PopOpt();
00200
00201 }
00202
00203 return;
00204 }
00205
00206 void FillHvFromSingles::EndJob()
00207 {
00208 MSG("HvStatus",Msg::kInfo) << " *** FillHvFromSingles::EndJob() *** " << endl;
00209
00210
00211 if( vecTimeSM1.size()>0 ){
00212 vecTimeSM1.push_back(fEndTime+1);
00213 vecStatusSM1.push_back(-1);
00214 vecColdChipsSM1.push_back(-1);
00215 }
00216
00217
00218 if( vecTimeSM2.size()>0 ){
00219 vecTimeSM2.push_back(fEndTime+1);
00220 vecStatusSM2.push_back(-1);
00221 vecColdChipsSM2.push_back(-1);
00222 }
00223
00224
00225 this->PrintResults();
00226
00227
00228 if( fPruneShortEntries ){
00229 MSG("HvStatus",Msg::kInfo) << " *** pruning short entries *** " << endl;
00230 this->PruneShortEntries(fPruneMinTime,fPruneMinChips);
00231 this->PrintResults();
00232 }
00233
00234
00235 if( fWriteOutResults ){
00236 MSG("HvStatus",Msg::kInfo) << " *** writing to file..." << endl;
00237 this->WriteToFile();
00238 MSG("HvStatus",Msg::kInfo) << " ... finished writing to file *** " << endl;
00239 }
00240
00241
00242 if( fWriteToDatabase ){
00243 MSG("HvStatus",Msg::kInfo) << " *** writing to database..." << endl;
00244 this->WriteToDatabase();
00245 MSG("HvStatus",Msg::kInfo) << " WROTE " << fWriteEntries << " ENTRIES TO DATABASE " << endl;
00246 MSG("HvStatus",Msg::kInfo) << " ... finished writing to database *** " << endl;
00247 }
00248
00249
00250 if( fReadFromDatabase ){
00251 MSG("HvStatus",Msg::kInfo) << " *** reading from database..." << endl;
00252 this->ReadFromDatabase();
00253 MSG("HvStatus",Msg::kInfo) << " READ " << fReadEntries << " ENTRIES FROM DATABASE " << endl;
00254 MSG("HvStatus",Msg::kInfo) << " ... finished reading from database *** " << endl;
00255 }
00256
00257
00258 if(fHvFile){
00259 MSG("HvStatus",Msg::kInfo) << " *** saving info to file ... " << endl;
00260 TDirectory* tmpd = gDirectory;
00261 fHvFile->cd();
00262 fHvTree->Write();
00263 fHvFile->Close();
00264 gDirectory = tmpd;
00265 MSG("HvStatus",Msg::kInfo) << " ... info saved to file *** " << endl;
00266 }
00267 }
00268
00269 void FillHvFromSingles::PrintResults()
00270 {
00271
00272 MSG("HvStatus",Msg::kDebug) << " results for supermodule 1: " << endl;
00273 for( unsigned int i=0; i<vecTimeSM1.size(); i++){
00274 MSG("HvStatus",Msg::kDebug) << " time=" << vecTimeSM1[i] << " coldchips=" << vecColdChipsSM1[i] << " status=" << vecStatusSM1[i] << endl;
00275 }
00276
00277
00278 MSG("HvStatus",Msg::kDebug) << " results for supermodule 2: " << endl;
00279 for( unsigned int i=0; i<vecTimeSM2.size(); i++){
00280 MSG("HvStatus",Msg::kDebug) << " time=" << vecTimeSM2[i] << " coldchips=" << vecColdChipsSM2[i] << " status=" << vecStatusSM2[i] << endl;
00281 }
00282 }
00283
00284 void FillHvFromSingles::ProcessBlock(TObject* obj)
00285 {
00286
00287 if(obj->InheritsFrom("RawTpSinglesSummaryBlock")){
00288 MSG("HvStatus",Msg::kDebug) << " ... found RawTpSinglesSummaryBlock " << endl;
00289 RawTpSinglesSummaryBlock* rdb = (RawTpSinglesSummaryBlock*)(obj);
00290
00291 Int_t Time = rdb->GetStartTimeStamp().GetSec();
00292 Double_t FrameTime = (rdb->GetEndTimeStamp().GetSec()-rdb->GetStartTimeStamp().GetSec())+1.0e-9*(rdb->GetEndTimeStamp().GetNanoSec()-rdb->GetStartTimeStamp().GetNanoSec());
00293 if( fBegTime<0 ) fBegTime=Time;
00294 if( Time>fEndTime ) fEndTime=Time;
00295
00296 Int_t Source = rdb->GetSource();
00297 Int_t SourceCheck = 0;
00298 Int_t AllChipsSM1 = 0;
00299 Int_t AllChipsSM2 = 0;
00300 Int_t ColdChipsSM1 = 0;
00301 Int_t ColdChipsSM2 = 0;
00302 Int_t StatusSM1 = -1;
00303 Int_t StatusSM2 = -1;
00304 Int_t MaxColdChips = 99999;
00305 Int_t MinRate = 0;
00306
00307 Detector::Detector_t Detector = Detector::kUnknown;
00308
00309 switch( Source ){
00310 case 0:
00311 Detector = Detector::kUnknown;
00312 break;
00313 case 1:
00314 Detector = Detector::kFar;
00315 break;
00316 case 2:
00317 Detector = Detector::kFar;
00318 break;
00319 case 3:
00320 Detector = Detector::kFar;
00321 break;
00322 case 4:
00323 Detector = Detector::kUnknown;
00324 break;
00325 case 5:
00326 Detector = Detector::kNear;
00327 break;
00328 case 6:
00329 Detector = Detector::kNear;
00330 break;
00331 case 7:
00332 Detector = Detector::kNear;
00333 break;
00334 default:
00335 break;
00336 }
00337
00338
00339 if( Source==3 && Detector==Detector::kFar ){
00340 MinRate=fMinVaRate;
00341 MaxColdChips=fMaxColdChips;
00342 SourceCheck=1;
00343 }
00344
00345 if( Source==7 && Detector==Detector::kNear ){
00346 MinRate=fMinQieRate;
00347 MaxColdChips=fMaxColdChips;
00348 SourceCheck=1;
00349 }
00350
00351
00352 typedef std::map<RawChannelId,UInt_t> RCIdToRateMap;
00353 const RCIdToRateMap& rates = rdb->GetRates();
00354 RCIdToRateMap::const_iterator rateItr = rates.begin();
00355 RCIdToRateMap::const_iterator rateEnd = rates.end();
00356 while ( rateItr != rateEnd ) {
00357 RawChannelId rawch = rateItr->first;
00358 Int_t rawrate = rateItr->second;
00359 Int_t correctedrate = (Int_t)(rawrate/FrameTime);
00360 Int_t rate = correctedrate;
00361 Int_t crate = rawch.GetCrate();
00362
00363 RawReadout::ReadoutType_t readout = fRawReadout->GetReadoutType(rawch);
00364
00365 if( ( SourceCheck )
00366 && ( readout==RawReadout::kDetector
00367 || readout==RawReadout::kVetoShield ) ){
00368
00369
00370 if( crate>=0 && crate<8 ){
00371 AllChipsSM1++;
00372 if(rate<MinRate){
00373 ColdChipsSM1++;
00374 MSG("HvStatus",Msg::kVerbose) << " cold chip (SM1): crate=" << crate << " corrected rate=" << correctedrate << endl;
00375 }
00376 }
00377
00378
00379 if( crate>=8 && crate<16 ){
00380 AllChipsSM2++;
00381 if(rate<MinRate){
00382 ColdChipsSM2++;
00383 MSG("HvStatus",Msg::kVerbose) << " cold chip (SM2): crate=" << crate << " corrected rate=" << correctedrate << endl;
00384 }
00385 }
00386
00387 }
00388
00389 rateItr++;
00390 }
00391
00392 MSG("HvStatus",Msg::kVerbose) << " Time=" << Time << " FrameTime=" << FrameTime << " Source=" << Source << " Check=" << SourceCheck << endl;
00393 MSG("HvStatus",Msg::kVerbose) << " MinRate=" << MinRate << " MaxColdChips=" << MaxColdChips << endl;
00394 MSG("HvStatus",Msg::kVerbose) << " SM1: AllChips=" << AllChipsSM1 << " ColdChips=" << ColdChipsSM1 << endl;
00395 MSG("HvStatus",Msg::kVerbose) << " SM2: AllChips=" << AllChipsSM2 << " ColdChips=" << ColdChipsSM2 << endl;
00396
00397
00398 if( SourceCheck ){
00399
00400
00401 if( AllChipsSM1>0 ){
00402
00403
00404 if( ColdChipsSM1<fMaxColdChips ) StatusSM1=1;
00405 else StatusSM1=0;
00406
00407
00408 if( ColdChipsSM1!=fCurrColdChipsSM1 ){
00409 MSG("HvStatus",Msg::kDebug) << " new data (SM1): time=" << Time << " status=" << StatusSM1 << " coldchips=" << ColdChipsSM1 << endl;
00410 vecTimeSM1.push_back(Time);
00411 vecStatusSM1.push_back(StatusSM1);
00412 vecColdChipsSM1.push_back(ColdChipsSM1);
00413 fCurrColdChipsSM1=ColdChipsSM1;
00414 }
00415 }
00416
00417
00418 if( AllChipsSM2>0 ){
00419
00420
00421 if( ColdChipsSM2<fMaxColdChips ) StatusSM2=1;
00422 else StatusSM2=0;
00423
00424
00425 if( ColdChipsSM2!=fCurrColdChipsSM2 ){
00426 MSG("HvStatus",Msg::kDebug) << " new data (SM2): time=" << Time << " status=" << StatusSM2 << " coldchips=" << ColdChipsSM2 << endl;
00427 vecTimeSM2.push_back(Time);
00428 vecStatusSM2.push_back(StatusSM2);
00429 vecColdChipsSM2.push_back(ColdChipsSM2);
00430 fCurrColdChipsSM2=ColdChipsSM2;
00431 }
00432 }
00433
00434 }
00435
00436 }
00437
00438 return;
00439 }
00440
00441 void FillHvFromSingles::PruneShortEntries(Int_t nSecs, Int_t nChips)
00442 {
00443 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::PruneShortEntries(...) *** " << endl;
00444
00445 MSG("HvStatus",Msg::kVerbose) << " nSecs=" << nSecs << " nChips=" << nChips << endl;
00446
00447 Int_t delta=3;
00448 Int_t delta_coldchips=10;
00449
00450 Bool_t carryon=1,newentry=0;
00451 Int_t currchips=-1,newchips=0;
00452 Int_t size_old=0,size_new=0;
00453 Int_t dt_pos=-1,dt_neg=-1;
00454 Int_t ctr=0;
00455
00456 vector<int> tempTime;
00457 vector<int> tempStatus;
00458 vector<int> tempColdChips;
00459
00460
00461 MSG("HvStatus",Msg::kVerbose) << " pruning entries for SM1 " << endl;
00462 ctr=0;
00463 carryon=1;
00464 while(carryon){
00465 carryon=0;
00466 size_old=vecTimeSM1.size();
00467
00468 tempTime=vecTimeSM1;
00469 tempStatus=vecStatusSM1;
00470 tempColdChips=vecColdChipsSM1;
00471
00472 for( unsigned int i=0; i+1<vecTimeSM1.size(); i++){
00473
00474 if( 1
00475 && vecTimeSM1[i+1]-vecTimeSM1[i]<nSecs ){
00476
00477 newentry=0;
00478 newchips=vecColdChipsSM1[i];
00479 dt_pos=-1;
00480 dt_neg=-1;
00481
00482 if( i+2<vecTimeSM1.size() ) dt_pos=vecTimeSM1[i+2]-vecTimeSM1[i+1];
00483 if( i>=1 ) dt_neg=vecTimeSM1[i]-vecTimeSM1[i-1];
00484 if( dt_pos>=nSecs || dt_neg>=nSecs ) newchips=-1;
00485
00486 if( i+1<vecTimeSM1.size()
00487 && vecColdChipsSM1[i+1]>newchips ){
00488 if( ( vecColdChipsSM1[i+1]-vecColdChipsSM1[i]>=-delta
00489 && vecColdChipsSM1[i+1]-vecColdChipsSM1[i]<=+delta )
00490 || ( vecColdChipsSM1[i+1]>=fMaxColdChips+delta_coldchips
00491 && vecColdChipsSM1[i]>=fMaxColdChips+delta_coldchips ) ){
00492 if( dt_pos>=nSecs || dt_neg<nSecs ){
00493 newchips=vecColdChipsSM1[i+1];
00494 newentry=1;
00495 }
00496 }
00497 }
00498
00499 if( i>=1
00500 && vecColdChipsSM1[i-1]>newchips ){
00501 if( ( vecColdChipsSM1[i-1]-vecColdChipsSM1[i]>=-delta
00502 && vecColdChipsSM1[i-1]-vecColdChipsSM1[i]<=+delta )
00503 || ( vecColdChipsSM1[i-1]>=fMaxColdChips+delta_coldchips
00504 && vecColdChipsSM1[i]>=fMaxColdChips+delta_coldchips ) ){
00505 if( dt_neg>=nSecs || dt_pos<nSecs ){
00506 newchips=vecColdChipsSM1[i-1];
00507 newentry=1;
00508 }
00509 }
00510 }
00511
00512 if( newentry ){
00513 tempColdChips[i]=newchips;
00514 carryon=1;
00515 }
00516
00517 }
00518 }
00519
00520 vecTimeSM1.clear();
00521 vecStatusSM1.clear();
00522 vecColdChipsSM1.clear();
00523 currchips=-1;
00524
00525 for( unsigned int i=0; i<tempColdChips.size(); i++){
00526 if( tempColdChips[i]!=currchips ){
00527 vecTimeSM1.push_back(tempTime[i]);
00528 vecStatusSM1.push_back(tempStatus[i]);
00529 vecColdChipsSM1.push_back(tempColdChips[i]);
00530 currchips=tempColdChips[i];
00531 }
00532 }
00533
00534 size_new=vecTimeSM1.size();
00535 if( size_new>=size_old ) carryon=0;
00536
00537 ctr++;
00538 }
00539 MSG("HvStatus",Msg::kVerbose) << " ..." << ctr << " iterations " << endl;
00540
00541
00542 MSG("HvStatus",Msg::kVerbose) << " pruning entries for SM2 " << endl;
00543 ctr=0;
00544 carryon=1;
00545 while(carryon){
00546 carryon=0;
00547 size_old=vecTimeSM2.size();
00548
00549 tempTime=vecTimeSM2;
00550 tempStatus=vecStatusSM2;
00551 tempColdChips=vecColdChipsSM2;
00552
00553 for( unsigned int i=0; i+1<vecTimeSM2.size(); i++){
00554
00555 if( 1
00556 && vecTimeSM2[i+1]-vecTimeSM2[i]<nSecs ){
00557
00558 newentry=0;
00559 newchips=vecColdChipsSM2[i];
00560 dt_pos=-1;
00561 dt_neg=-1;
00562
00563 if( i+2<vecTimeSM2.size() ) dt_pos=vecTimeSM2[i+2]-vecTimeSM2[i+1];
00564 if( i>=1 ) dt_neg=vecTimeSM2[i]-vecTimeSM2[i-1];
00565 if( dt_pos>=nSecs || dt_neg>=nSecs ) newchips=-1;
00566
00567 if( i+1<vecTimeSM2.size()
00568 && vecColdChipsSM2[i+1]>newchips ){
00569 if( ( vecColdChipsSM2[i+1]-vecColdChipsSM2[i]>=-delta
00570 && vecColdChipsSM2[i+1]-vecColdChipsSM2[i]<=+delta )
00571 || ( vecColdChipsSM2[i+1]>=fMaxColdChips+delta_coldchips
00572 && vecColdChipsSM2[i]>=fMaxColdChips+delta_coldchips ) ){
00573 if( dt_pos>=nSecs || dt_neg<nSecs ){
00574 newchips=vecColdChipsSM2[i+1];
00575 newentry=1;
00576 }
00577 }
00578 }
00579
00580 if( i>=1
00581 && vecColdChipsSM2[i-1]>newchips ){
00582 if( ( vecColdChipsSM2[i-1]-vecColdChipsSM2[i]>=-delta
00583 && vecColdChipsSM2[i-1]-vecColdChipsSM2[i]<=+delta )
00584 || ( vecColdChipsSM2[i-1]>=fMaxColdChips+delta_coldchips
00585 && vecColdChipsSM2[i]>=fMaxColdChips+delta_coldchips ) ){
00586 if( dt_neg>=nSecs || dt_pos<nSecs ){
00587 newchips=vecColdChipsSM2[i-1];
00588 newentry=1;
00589 }
00590 }
00591 }
00592
00593 if( newentry ){
00594 tempColdChips[i]=newchips;
00595 carryon=1;
00596 }
00597
00598 }
00599 }
00600
00601 vecTimeSM2.clear();
00602 vecStatusSM2.clear();
00603 vecColdChipsSM2.clear();
00604 currchips=-1;
00605
00606 for( unsigned int i=0; i<tempColdChips.size(); i++){
00607 if( tempColdChips[i]!=currchips ){
00608 vecTimeSM2.push_back(tempTime[i]);
00609 vecStatusSM2.push_back(tempStatus[i]);
00610 vecColdChipsSM2.push_back(tempColdChips[i]);
00611 currchips=tempColdChips[i];
00612 }
00613 }
00614
00615 size_new=vecTimeSM2.size();
00616 if( size_new>=size_old ) carryon=0;
00617
00618 ctr++;
00619 }
00620 MSG("HvStatus",Msg::kVerbose) << " ..." << ctr << " iterations " << endl;
00621
00622 return;
00623 }
00624
00625 void FillHvFromSingles::WriteToFile()
00626 {
00627 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::WriteToFile() *** " << endl;
00628
00629 Int_t begtime,endtime,coldchips,hvstatus;
00630
00631
00632 if( vecTimeSM1.size()>0 ){
00633 for( unsigned int i=0; i+1<vecTimeSM1.size(); i++){
00634 begtime=vecTimeSM1[i];
00635 endtime=vecTimeSM1[i+1];
00636 hvstatus=vecStatusSM1[i];
00637 coldchips=vecColdChipsSM1[i];
00638 if( fWriteOutResults ){
00639 this->WriteOutResults(0,begtime,endtime,fDetector,1,hvstatus,coldchips);
00640 }
00641 }
00642 }
00643
00644
00645 if( vecTimeSM2.size()>0 ){
00646 for( unsigned int i=0; i+1<vecTimeSM2.size(); i++){
00647 begtime=vecTimeSM2[i];
00648 endtime=vecTimeSM2[i+1];
00649 hvstatus=vecStatusSM2[i];
00650 coldchips=vecColdChipsSM2[i];
00651 if( fWriteOutResults ){
00652 this->WriteOutResults(0,begtime,endtime,fDetector,2,hvstatus,coldchips);
00653 }
00654 }
00655 }
00656
00657 return;
00658 }
00659
00660 void FillHvFromSingles::WriteToDatabase()
00661 {
00662 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::WriteToDatabase() *** " << endl;
00663
00664 Int_t begtime,endtime,coldchips,hvstatus;
00665
00666
00667 if( vecTimeSM1.size()>0 ){
00668 for( unsigned int i=0; i+1<vecTimeSM1.size(); i++){
00669 begtime=vecTimeSM1[i];
00670 endtime=vecTimeSM1[i+1];
00671 hvstatus=vecStatusSM1[i];
00672 coldchips=vecColdChipsSM1[i];
00673 this->WriteToDatabase(begtime,endtime,fDetector,1,hvstatus,coldchips);
00674 if( fWriteOutResults ){
00675 this->WriteOutResults(1,begtime,endtime,fDetector,1,hvstatus,coldchips);
00676 }
00677 }
00678 }
00679
00680
00681 if( vecTimeSM2.size()>0 ){
00682 for( unsigned int i=0; i+1<vecTimeSM2.size(); i++){
00683 begtime=vecTimeSM2[i];
00684 endtime=vecTimeSM2[i+1];
00685 hvstatus=vecStatusSM2[i];
00686 coldchips=vecColdChipsSM2[i];
00687 this->WriteToDatabase(begtime,endtime,fDetector,2,hvstatus,coldchips);
00688 if( fWriteOutResults ){
00689 this->WriteOutResults(1,begtime,endtime,fDetector,2,hvstatus,coldchips);
00690 }
00691 }
00692 }
00693
00694 return;
00695 }
00696
00697 void FillHvFromSingles::WriteToDatabase(Int_t begtime, Int_t endtime, Detector::Detector_t detector, Int_t supermodule, Int_t hvstatus, Int_t coldchips)
00698 {
00699 MSG("HvStatus",Msg::kVerbose) << " *** FillHvFromSingles::WriteToDatabase(...) *** " << endl;
00700
00701 DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00702
00703 if( !cascader.TableExists("DBUHVFROMSINGLES") ){
00704 MSG("HvStatus",Msg::kDebug) << " Creating temporary DBUHVFROMSINGLES table " << endl;
00705
00706 string tableDescr = "(SEQNO int, HV_STATUS int, HV_SUPERMODULE int, HV_COLDCHIPS int)";
00707 Int_t dbNoTempHvStatus = cascader.CreateTemporaryTable("DBUHVFROMSINGLES",tableDescr);
00708
00709 MSG("HvStatus",Msg::kDebug) << " DbNoTempHvStatus=" << dbNoTempHvStatus << endl;
00710 }
00711
00712 if( cascader.TableExists("DBUHVFROMSINGLES") ){
00713 MSG("HvStatus",Msg::kVerbose) << " Writing to DBUHVFROMSINGLES table... " << endl;
00714
00715 VldTimeStamp start(begtime);
00716 VldTimeStamp finish(endtime);
00717 TString logentry("HV status from singles (");
00718 logentry.Append(start.AsString("s"));
00719 logentry.Append(" to ");
00720 logentry.Append(finish.AsString("s"));
00721 logentry.Append(")");
00722
00723 VldRange range(detector,SimFlag::kData,start,finish,logentry.Data());
00724
00725 DbuHvFromSingles row(hvstatus,supermodule,coldchips);
00726
00727 Int_t aggNo = row.GetAggregateNo();
00728 Dbi::Task task = fTask;
00729 VldTimeStamp creationDate;
00730
00731 DbiWriter<DbuHvFromSingles> writer(range,aggNo,task,creationDate,0,logentry.Data());
00732
00733 writer << row;
00734 writer.Close();
00735
00736 MSG("HvStatus",Msg::kVerbose) << " " << logentry.Data() << endl;
00737 MSG("HvStatus",Msg::kVerbose) << " supermodule=" << supermodule << " hvstatus=" << hvstatus << " coldchips=" << coldchips << endl;
00738
00739 fWriteEntries++;
00740 }
00741
00742 return;
00743 }
00744
00745 void FillHvFromSingles::ReadFromDatabase()
00746 {
00747 MSG("HvStatus",Msg::kDebug) << " *** FillHvFromSingles::ReadFromDatabase() *** " << endl;
00748
00749 Int_t time,hvstatus,coldchips;
00750
00751
00752 if( vecTimeSM1.size()>0 ){
00753 for( unsigned int i=0; i+1<vecTimeSM1.size(); i++){
00754 time=vecTimeSM1[i];
00755 hvstatus=-1;
00756 coldchips=0;
00757 this->ReadFromDatabase(time,fDetector,1,hvstatus,coldchips);
00758 if( fWriteOutResults ){
00759 this->WriteOutResults(2,time,time,fDetector,1,hvstatus,coldchips);
00760 }
00761 }
00762 }
00763
00764
00765 if( vecTimeSM2.size()>0 ){
00766 for( unsigned int i=0; i+1<vecTimeSM2.size(); i++){
00767 time=vecTimeSM2[i];
00768 hvstatus=-1;
00769 coldchips=0;
00770 this->ReadFromDatabase(time,fDetector,2,hvstatus,coldchips);
00771 if( fWriteOutResults ){
00772 this->WriteOutResults(2,time,time,fDetector,2,hvstatus,coldchips);
00773 }
00774 }
00775 }
00776
00777 return;
00778 }
00779
00780 void FillHvFromSingles::ReadFromDatabase(Int_t time, Detector::Detector_t detector, Int_t supermodule, Int_t& hvstatus, Int_t& coldchips)
00781 {
00782 MSG("HvStatus",Msg::kVerbose) << " *** FillHvFromSingles::ReadFromDatabase(...) *** " << endl;
00783
00784 hvstatus=-1; coldchips=0;
00785
00786 DbiCascader& cascader = DbiTableProxyRegistry::Instance().GetCascader();
00787
00788 if( cascader.TableExists("DBUHVFROMSINGLES") ){
00789 MSG("HvStatus",Msg::kVerbose) << " Reading from DBUHVFROMSINGLES table... " << endl;
00790
00791 Int_t tmpsupermodule=-1, tmphvstatus=-1, tmpcoldchips=0;
00792
00793 VldTimeStamp timestamp(time,0);
00794 VldContext vldc(detector,SimFlag::kData,timestamp);
00795 DbiResultPtr<DbuHvFromSingles> resptr("DBUHVFROMSINGLES",vldc,fTask);
00796
00797 MSG("HvStatus",Msg::kVerbose) << " Number Of Rows = " << resptr.GetNumRows() << endl;
00798
00799 if( resptr.GetNumRows()>0 ){
00800 for( unsigned int i=0; i<resptr.GetNumRows(); i++){
00801 const DbuHvFromSingles* rowptr = resptr.GetRow(i);
00802 tmpsupermodule=rowptr->GetSupermodule();
00803 if( tmpsupermodule==supermodule ){
00804 tmphvstatus=rowptr->GetStatus();
00805 tmpcoldchips=rowptr->GetColdChips();
00806 }
00807 }
00808 }
00809
00810 hvstatus=tmphvstatus; coldchips=tmpcoldchips;
00811
00812 MSG("HvStatus",Msg::kVerbose) << " " << timestamp.AsString("s") << " supermodule=" << supermodule << " hvstatus=" << hvstatus << " coldchips=" << coldchips << endl;
00813
00814 fReadEntries++;
00815 }
00816
00817 return;
00818 }
00819
00820 void FillHvFromSingles::WriteOutResults(Int_t source, Int_t begtime, Int_t endtime, Detector::Detector_t detector, Int_t supermodule, Int_t hvstatus, Int_t coldchips)
00821 {
00822 MSG("HvStatus",Msg::kVerbose) << " *** FillHvFromSingles::WriteOutResults() *** " << endl;
00823
00824 Source=source;
00825 BegTime=begtime;
00826 EndTime=endtime;
00827 Detector=detector;
00828 Supermodule=supermodule;
00829 HvStatus=hvstatus;
00830 ColdChips=coldchips;
00831
00832 MSG("HvStatus",Msg::kVerbose) << " Source=" << Source << " BegTime=" << BegTime << " EndTime=" << EndTime << " Detector=" << Detector << " Supermodule=" << Supermodule << " HvStatus=" << HvStatus << " ColdChips=" << ColdChips << endl;
00833
00834 if(!fHvFile){
00835 TDirectory* tmpd = gDirectory;
00836 fHvFile = new TFile(fHvFileName.Data(),"RECREATE");
00837 fHvTree = new TTree("HvStatus","HvStatus");
00838 fHvTree->SetAutoSave(300);
00839 fHvTree->Branch("Source",&Source,"Source/I");
00840 fHvTree->Branch("BegTime",&BegTime,"BegTime/I");
00841 fHvTree->Branch("EndTime",&EndTime,"EndTime/I");
00842 fHvTree->Branch("Detector",&Detector,"Detector/I");
00843 fHvTree->Branch("Supermodule",&Supermodule,"Supermodule/I");
00844 fHvTree->Branch("HvStatus",&HvStatus,"HvStatus/I");
00845 fHvTree->Branch("ColdChips",&ColdChips,"ColdChips/I");
00846 gDirectory = tmpd;
00847 }
00848
00849 if(fHvFile){
00850 TDirectory* tmpd = gDirectory;
00851 fHvFile->cd();
00852 fHvTree->Fill();
00853 gDirectory = tmpd;
00854 }
00855
00856 return;
00857 }