00001 #include "DQM/SiStripCommissioningClients/interface/CommissioningHistograms.h"
00002 #include "CondFormats/SiStripObjects/interface/CommissioningAnalysis.h"
00003 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
00004 #include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
00005 #include "DataFormats/SiStripCommon/interface/SiStripDetKey.h"
00006 #include "DQM/SiStripCommissioningSummary/interface/SummaryGenerator.h"
00007 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include <iomanip>
00010
00011 using namespace std;
00012 using namespace sistrip;
00013
00014
00015
00017 CommissioningHistograms::CommissioningHistograms( const edm::ParameterSet& pset,
00018 DQMStore* bei,
00019 const sistrip::RunType& task )
00020 : factory_(0),
00021 task_(task),
00022 bei_(bei),
00023 data_(),
00024 histos_(),
00025 pset_(pset)
00026 {
00027 LogTrace(mlDqmClient_)
00028 << "[" << __PRETTY_FUNCTION__ << "]"
00029 << " Constructing object...";
00030
00031
00032 if ( !bei_ ) {
00033 edm::LogError(mlDqmClient_)
00034 << "[CommissioningHistograms::" << __func__ << "]"
00035 << " NULL pointer to DQMStore!";
00036 }
00037
00038 clearHistosMap();
00039 }
00040
00041
00043 CommissioningHistograms::CommissioningHistograms()
00044 : factory_(0),
00045 task_(sistrip::UNDEFINED_RUN_TYPE),
00046 bei_(0),
00047 data_(),
00048 histos_()
00049 {
00050 LogTrace(mlDqmClient_)
00051 << "[" << __PRETTY_FUNCTION__ << "]"
00052 << " Constructing object...";
00053 }
00054
00055
00057 CommissioningHistograms::~CommissioningHistograms() {
00058 LogTrace(mlDqmClient_)
00059 << "[" << __PRETTY_FUNCTION__ << "]"
00060 << " Destructing object...";
00061 clearHistosMap();
00062
00063 }
00064
00065
00067 void CommissioningHistograms::Histo::print( std::stringstream& ss ) const {
00068 ss << " [Histo::" << __func__ << "]" << std::endl
00069 << " Histogram title : " << title_ << std::endl
00070 << " MonitorElement* : 0x"
00071 << std::hex
00072 << std::setw(8) << std::setfill('0') << me_ << std::endl
00073 << std::dec
00074 << " CollateME* : 0x"
00075 << std::hex
00076 << std::setw(8) << std::setfill('0') << cme_ << std::endl
00077 << std::dec;
00078 }
00079
00080
00081
00082 uint32_t CommissioningHistograms::runNumber( DQMStore* const bei,
00083 const std::vector<std::string>& contents ) {
00084
00085
00086 if ( contents.empty() ) {
00087 edm::LogError(mlDqmClient_)
00088 << "[CommissioningHistograms::" << __func__ << "]"
00089 << " Found no histograms!";
00090 return 0;
00091 }
00092
00093
00094 std::vector<std::string>::const_iterator istr = contents.begin();
00095 while ( istr != contents.end() ) {
00096
00097
00098 std::string source_dir = istr->substr( 0, istr->find(":") );
00099
00100
00101 SiStripFecKey path( source_dir );
00102 std::string client_dir = path.path();
00103 std::string slash = client_dir.substr( client_dir.size()-1, 1 );
00104 if ( slash == sistrip::dir_ ) { client_dir = client_dir.substr( 0, client_dir.size()-1 ); }
00105 client_dir = std::string(sistrip::collate_) + sistrip::dir_ + client_dir;
00106
00107
00108 std::vector<MonitorElement*> me_list = bei->getContents( source_dir );
00109 std::vector<MonitorElement*>::iterator ime = me_list.begin();
00110 for ( ; ime != me_list.end(); ime++ ) {
00111
00112 if ( !(*ime) ) {
00113 edm::LogError(mlDqmClient_)
00114 << "[CommissioningHistograms::" << __func__ << "]"
00115 << " NULL pointer to MonitorElement!";
00116 continue;
00117 }
00118
00119
00120 std::string title = (*ime)->getName();
00121 std::string::size_type pos = title.find( sistrip::runNumber_ );
00122
00123
00124 if ( pos != std::string::npos ) {
00125 std::string value = title.substr( pos+sizeof(sistrip::runNumber_) , std::string::npos );
00126 if ( !value.empty() ) {
00127 LogTrace(mlDqmClient_)
00128 << "[CommissioningHistograms::" << __func__ << "]"
00129 << " Found string \"" << title.substr(pos,std::string::npos)
00130 << "\" with value \"" << value << "\"";
00131 if ( !(bei->get(client_dir+"/"+title.substr(pos,std::string::npos))) ) {
00132 bei->setCurrentFolder(client_dir);
00133 bei->bookString( title.substr(pos,std::string::npos), value );
00134 LogTrace(mlDqmClient_)
00135 << "[CommissioningHistograms::" << __func__ << "]"
00136 << " Booked string \"" << title.substr(pos,std::string::npos)
00137 << "\" in directory \"" << client_dir << "\"";
00138 }
00139 uint32_t run;
00140 std::stringstream ss;
00141 ss << value;
00142 ss >> std::dec >> run;
00143 return run;
00144 }
00145 }
00146
00147 }
00148
00149 istr++;
00150
00151 }
00152 return 0;
00153 }
00154
00155
00157 sistrip::RunType CommissioningHistograms::runType( DQMStore* const bei,
00158 const std::vector<std::string>& contents ) {
00159
00160
00161 if ( contents.empty() ) {
00162 edm::LogError(mlDqmClient_)
00163 << "[CommissioningHistograms::" << __func__ << "]"
00164 << " Found no histograms!";
00165 return sistrip::UNKNOWN_RUN_TYPE;
00166 }
00167
00168
00169 std::vector<std::string>::const_iterator istr = contents.begin();
00170 while ( istr != contents.end() ) {
00171
00172
00173 std::string source_dir = istr->substr( 0, istr->find(":") );
00174
00175
00176 SiStripFecKey path( source_dir );
00177 std::string client_dir = path.path();
00178 std::string slash = client_dir.substr( client_dir.size()-1, 1 );
00179 if ( slash == sistrip::dir_ ) { client_dir = client_dir.substr( 0, client_dir.size()-1 ); }
00180 client_dir = std::string(sistrip::collate_) + sistrip::dir_ + client_dir;
00181
00182
00183 std::vector<MonitorElement*> me_list = bei->getContents( source_dir );
00184
00185 if ( me_list.empty() ) {
00186 edm::LogError(mlDqmClient_)
00187 << "[CommissioningHistograms::" << __func__ << "]"
00188 << " No MonitorElements found in dir " << source_dir;
00189 return sistrip::UNKNOWN_RUN_TYPE;
00190 }
00191
00192 std::vector<MonitorElement*>::iterator ime = me_list.begin();
00193 for ( ; ime != me_list.end(); ime++ ) {
00194
00195 if ( !(*ime) ) {
00196 edm::LogError(mlDqmClient_)
00197 << "[CommissioningHistograms::" << __func__ << "]"
00198 << " NULL pointer to MonitorElement!";
00199 continue;
00200 }
00201
00202
00203 std::string title = (*ime)->getName();
00204 std::string::size_type pos = title.find( sistrip::taskId_ );
00205
00206
00207 if ( pos != std::string::npos ) {
00208 std::string value = title.substr( pos+sizeof(sistrip::taskId_) , std::string::npos );
00209 if ( !value.empty() ) {
00210 LogTrace(mlDqmClient_)
00211 << "[CommissioningHistograms::" << __func__ << "]"
00212 << " Found string \"" << title.substr(pos,std::string::npos)
00213 << "\" with value \"" << value << "\"";
00214 if ( !(bei->get(client_dir+sistrip::dir_+title.substr(pos,std::string::npos))) ) {
00215 bei->setCurrentFolder(client_dir);
00216 bei->bookString( title.substr(pos,std::string::npos), value );
00217 LogTrace(mlDqmClient_)
00218 << "[CommissioningHistograms::" << __func__ << "]"
00219 << " Booked string \"" << title.substr(pos,std::string::npos)
00220 << "\" in directory \"" << client_dir << "\"";
00221 }
00222 return SiStripEnumsAndStrings::runType( value );
00223 }
00224 }
00225
00226 }
00227
00228 istr++;
00229
00230 }
00231
00232 edm::LogError(mlDqmClient_)
00233 << "[CommissioningHistograms::" << __func__ << "]"
00234 << " Unable to extract RunType!";
00235 return sistrip::UNKNOWN_RUN_TYPE;
00236
00237 }
00238
00239
00240
00241 void CommissioningHistograms::getContents( DQMStore* const bei,
00242 std::vector<std::string>& contents ) {
00243 }
00244
00245
00246
00247 void CommissioningHistograms::copyCustomInformation( DQMStore* const bei,
00248 const std::vector<std::string>& contents ) {
00249
00250
00251 if ( contents.empty() ) {
00252 edm::LogWarning(mlDqmClient_)
00253 << "[CommissioningHistograms::" << __func__ << "]"
00254 << " Found no histograms!";
00255 return;
00256 }
00257
00258
00259 std::vector<std::string>::const_iterator istr = contents.begin();
00260 while ( istr != contents.end() ) {
00261
00262
00263 std::string source_dir = istr->substr( 0, istr->find(":") );
00264
00265
00266 SiStripFecKey path( source_dir );
00267 std::string client_dir = path.path();
00268 std::string slash = client_dir.substr( client_dir.size()-1, 1 );
00269 if ( slash == sistrip::dir_ ) { client_dir = client_dir.substr( 0, client_dir.size()-1 ); }
00270
00271
00272 std::vector<MonitorElement*> me_list = bei->getContents( source_dir );
00273 std::vector<MonitorElement*>::iterator ime = me_list.begin();
00274 for ( ; ime != me_list.end(); ime++ ) {
00275
00276 if ( !(*ime) ) {
00277 edm::LogWarning(mlDqmClient_)
00278 << "[CommissioningHistograms::" << __func__ << "]"
00279 << " NULL pointer to MonitorElement!";
00280 continue;
00281 }
00282
00283 if((*ime)->kind()==MonitorElement::DQM_KIND_INT) {
00284 std::string title = (*ime)->getName();
00285 std::string::size_type pos = title.find("calchan");
00286 if( pos == std::string::npos ) pos = title.find("isha");
00287 if( pos == std::string::npos ) pos = title.find("vfs");
00288 if( pos != std::string::npos ) {
00289 int value = (*ime)->getIntValue();
00290 if ( value>=0 ) {
00291 edm::LogVerbatim(mlDqmClient_)
00292 << "[CommissioningHistograms::" << __func__ << "]"
00293 << " Found \"" << title.substr(pos,std::string::npos)
00294 << "\" with value \"" << value << "\"";
00295 if ( !(bei->get(client_dir+"/"+title.substr(pos,std::string::npos))) ) {
00296 bei->setCurrentFolder(client_dir);
00297 bei->bookInt( title.substr(pos,std::string::npos))->Fill(value);
00298 edm::LogVerbatim(mlDqmClient_)
00299 << "[CommissioningHistograms::" << __func__ << "]"
00300 << " Booked \"" << title.substr(pos,std::string::npos)
00301 << "\" in directory \"" << client_dir << "\"";
00302 }
00303 }
00304 }
00305 }
00306 }
00307 istr++;
00308 }
00309 }
00310
00311
00312
00314 void CommissioningHistograms::extractHistograms( const std::vector<std::string>& contents ) {
00315 LogTrace(mlDqmClient_)
00316 << "[CommissioningHistograms::" << __func__ << "]"
00317 << " Extracting available histograms...";
00318
00319
00320 if ( !bei_ ) {
00321 edm::LogError(mlDqmClient_)
00322 << "[CommissioningHistograms::" << __func__ << "]"
00323 << " NULL pointer to DQMStore!";
00324 return;
00325 }
00326
00327
00328 if ( contents.empty() ) {
00329 edm::LogError(mlDqmClient_)
00330 << "[CommissioningHistograms::" << __func__ << "]"
00331 << " Empty contents vector!";
00332 return;
00333 }
00334
00335
00336 std::vector<std::string>::const_iterator idir;
00337 for ( idir = contents.begin(); idir != contents.end(); idir++ ) {
00338
00339
00340 if ( idir->find(sistrip::collate_) == std::string::npos ) { continue; }
00341
00342
00343 std::string source_dir = idir->substr( 0, idir->find(":") );
00344
00345
00346 sistrip::View view = SiStripEnumsAndStrings::view( source_dir );
00347 SiStripKey path;
00348 if ( view == sistrip::CONTROL_VIEW ) { path = SiStripFecKey( source_dir ); }
00349 else if ( view == sistrip::READOUT_VIEW ) { path = SiStripFedKey( source_dir ); }
00350 else if ( view == sistrip::DETECTOR_VIEW ) { path = SiStripDetKey( source_dir ); }
00351 else { path = SiStripKey(); }
00352
00353
00354 if ( path.granularity() == sistrip::UNKNOWN_GRAN ||
00355 path.granularity() == sistrip::UNDEFINED_GRAN ) {
00356 continue;
00357 }
00358
00359
00360 std::string client_dir(sistrip::undefinedView_);
00361 if ( view == sistrip::CONTROL_VIEW ) { client_dir = SiStripFecKey( path.key() ).path(); }
00362 else if ( view == sistrip::READOUT_VIEW ) { client_dir = SiStripFedKey( path.key() ).path(); }
00363 else if ( view == sistrip::DETECTOR_VIEW ) { client_dir = SiStripDetKey( path.key() ).path(); }
00364 else { client_dir = SiStripKey( path.key() ).path(); }
00365 std::string slash = client_dir.substr( client_dir.size()-1, 1 );
00366 if ( slash == sistrip::dir_ ) { client_dir = client_dir.substr( 0, client_dir.size()-1 ); }
00367 client_dir = std::string(sistrip::collate_) + sistrip::dir_ + client_dir;
00368
00369
00370 std::vector<MonitorElement*> me_list = bei_->getContents( source_dir );
00371
00372
00373 std::vector<MonitorElement*>::iterator ime = me_list.begin();
00374 for ( ; ime != me_list.end(); ime++ ) {
00375
00376
00377 SiStripHistoTitle title( (*ime)->getName() );
00378
00379
00380
00381
00382
00383 uint16_t channel = sistrip::invalid_;
00384 if ( title.granularity() == sistrip::APV ) {
00385 channel = SiStripFecKey::lldChan( title.channel() );
00386 } else if ( title.granularity() == sistrip::UNKNOWN_GRAN ||
00387 title.granularity() == sistrip::UNDEFINED_GRAN ) {
00388 std::stringstream ss;
00389 ss << "[CommissioningHistograms::" << __func__ << "]"
00390 << " Unexpected granularity for histogram title: "
00391 << std::endl << title
00392 << " found in path "
00393 << std::endl << path;
00394 edm::LogError(mlDqmClient_) << ss.str();
00395 } else {
00396 channel = title.channel();
00397 }
00398
00399
00400 uint32_t key = sistrip::invalid32_;
00401
00402 if ( view == sistrip::CONTROL_VIEW ) {
00403
00404
00405 SiStripFecKey temp( path.key() );
00406 key = SiStripFecKey( temp.fecCrate(),
00407 temp.fecSlot(),
00408 temp.fecRing(),
00409 temp.ccuAddr(),
00410 temp.ccuChan(),
00411 channel ).key();
00412 mapping_[title.keyValue()] = key;
00413
00414 } else if ( view == sistrip::READOUT_VIEW ) {
00415
00416
00417 key = SiStripFedKey( path.key() ).key();
00418 uint32_t temp = SiStripFecKey( sistrip::invalid_,
00419 sistrip::invalid_,
00420 sistrip::invalid_,
00421 sistrip::invalid_,
00422 sistrip::invalid_,
00423 channel ).key();
00424 mapping_[title.keyValue()] = temp;
00425
00426 } else if ( view == sistrip::DETECTOR_VIEW ) {
00427
00428 SiStripDetKey temp( path.key() );
00429 key = SiStripDetKey( temp.partition() ).key();
00430 mapping_[title.keyValue()] = key;
00431
00432 } else { key = SiStripKey( path.key() ).key(); }
00433
00434
00435 Histo* histo = 0;
00436 HistosMap::iterator ihistos = histos_.find( key );
00437 if ( ihistos != histos_.end() ) {
00438 Histos::iterator ihis = ihistos->second.begin();
00439 while ( !histo && ihis < ihistos->second.end() ) {
00440 if ( (*ime)->getName() == (*ihis)->title_ ) { histo = *ihis; }
00441 ihis++;
00442 }
00443 }
00444
00445
00446 if ( !histo ) {
00447
00448 histos_[key].push_back( new Histo() );
00449 histo = histos_[key].back();
00450 histo->title_ = (*ime)->getName();
00451
00452
00453 if ( source_dir.find(sistrip::collate_) != std::string::npos ) {
00454 histo->me_ = bei_->get( client_dir +"/"+(*ime)->getName() );
00455 if ( !histo->me_ ) {
00456 edm::LogError(mlDqmClient_)
00457 << "[CommissioningHistograms::" << __func__ << "]"
00458 << " NULL pointer to MonitorElement!";
00459 }
00460 }
00461
00462 }
00463
00464 }
00465
00466 }
00467
00468
00469
00470 edm::LogVerbatim(mlDqmClient_)
00471 << "[CommissioningHistograms::" << __func__ << "]"
00472 << " Found histograms for " << histos_.size()
00473 << " structures in cached histogram map!";
00474
00475 }
00476
00477
00478
00480 void CommissioningHistograms::histoAnalysis( bool debug ) {
00481 LogTrace(mlDqmClient_)
00482 << "[CommissioningHistograms::" << __func__ << "]"
00483 << " (Derived) implementation to come...";
00484 }
00485
00486
00488 void CommissioningHistograms::printAnalyses() {
00489 Analyses::iterator ianal = data().begin();
00490 Analyses::iterator janal = data().end();
00491 for ( ; ianal != janal; ++ianal ) {
00492 if ( ianal->second ) {
00493 std::stringstream ss;
00494 ianal->second->print( ss );
00495 if ( ianal->second->isValid() ) { LogTrace(mlDqmClient_) << ss.str();
00496 } else { edm::LogWarning(mlDqmClient_) << ss.str(); }
00497 }
00498 }
00499 }
00500
00501
00503 void CommissioningHistograms::printSummary() {
00504
00505 std::stringstream good;
00506 std::stringstream bad;
00507
00508 Analyses::iterator ianal = data().begin();
00509 Analyses::iterator janal = data().end();
00510 for ( ; ianal != janal; ++ianal ) {
00511 if ( ianal->second ) {
00512 if ( ianal->second->isValid() ) { ianal->second->summary( good ); }
00513 else { ianal->second->summary( bad ); }
00514 }
00515 }
00516
00517 if ( good.str().empty() ) { good << "None found!"; }
00518 LogTrace(mlDqmClient_)
00519 << "[CommissioningHistograms::" << __func__ << "]"
00520 << " Printing summary of good analyses:" << "\n"
00521 << good.str();
00522
00523 if ( bad.str().empty() ) { return; }
00524 LogTrace(mlDqmClient_)
00525 << "[CommissioningHistograms::" << __func__ << "]"
00526 << " Printing summary of bad analyses:" << "\n"
00527 << bad.str();
00528
00529 }
00530
00531
00533 void CommissioningHistograms::printHistosMap() {
00534 LogTrace(mlDqmClient_)
00535 << "[CommissioningHistograms::" << __func__ << "]"
00536 << " Printing histogram map, which has "
00537 << histos_.size() << " entries...";
00538 HistosMap::const_iterator ihistos = histos_.begin();
00539 for ( ; ihistos != histos_.end(); ihistos++ ) {
00540 std::stringstream ss;
00541 ss << " Found " << ihistos->second.size()
00542 << " histogram(s) for key: " << std::endl
00543 << SiStripFedKey(ihistos->first) << std::endl;
00544 Histos::const_iterator ihisto = ihistos->second.begin();
00545 for ( ; ihisto != ihistos->second.end(); ihisto++ ) {
00546 if ( *ihisto ) { (*ihisto)->print(ss); }
00547 else { ss << " NULL pointer to Histo object!"; }
00548 }
00549 LogTrace(mlDqmClient_) << ss.str();
00550 }
00551 }
00552
00553
00555 void CommissioningHistograms::clearHistosMap() {
00556 LogTrace(mlDqmClient_)
00557 << "[CommissioningHistograms::" << __func__ << "]"
00558 << " Clearing histogram map...";
00559 HistosMap::iterator ihistos = histos_.begin();
00560 for ( ; ihistos != histos_.end(); ihistos++ ) {
00561 Histos::iterator ihisto = ihistos->second.begin();
00562 for ( ; ihisto != ihistos->second.end(); ihisto++ ) {
00563 if ( *ihisto ) { delete *ihisto; }
00564 }
00565 ihistos->second.clear();
00566 }
00567 histos_.clear();
00568 }
00569
00570
00572 void CommissioningHistograms::createSummaryHisto( const sistrip::Monitorable& mon,
00573 const sistrip::Presentation& pres,
00574 const std::string& dir,
00575 const sistrip::Granularity& gran ) {
00576 LogTrace(mlDqmClient_)
00577 << "[CommissioningHistograms::" << __func__ << "]";
00578
00579
00580 sistrip::View view = SiStripEnumsAndStrings::view(dir);
00581 if ( view == sistrip::UNKNOWN_VIEW ) { return; }
00582
00583
00584 if ( data().empty() ) { histoAnalysis( false ); }
00585
00586
00587 if ( data().empty() ) {
00588 edm::LogError(mlDqmClient_)
00589 << "[CommissioningHistograms::" << __func__ << "]"
00590 << " No analyses generated!";
00591 return;
00592 }
00593
00594
00595 uint32_t xbins = factory()->init( mon, pres, view, dir, gran, data() );
00596
00597
00598 if ( !xbins ) { return; }
00599
00600
00601 TH1* summary = 0;
00602 if ( pres != sistrip::HISTO_1D ) { summary = histogram( mon, pres, view, dir, xbins ); }
00603 else { summary = histogram( mon, pres, view, dir, sistrip::FED_ADC_RANGE, 0., sistrip::FED_ADC_RANGE*1. ); }
00604
00605
00606 factory()->fill( *summary );
00607
00608 }
00609
00610
00612 void CommissioningHistograms::remove( std::string pattern ) {
00613
00614 if ( !bei_ ) {
00615 edm::LogError(mlDqmClient_)
00616 << "[CommissioningHistograms::" << __func__ << "]"
00617 << " NULL pointer to DQMStore!";
00618 return;
00619 }
00620
00621 bei_->setVerbose(0);
00622
00623 LogTrace(mlDqmClient_)
00624 << "[CommissioningHistograms::" << __func__ << "]"
00625 << " Removing histograms...";
00626
00627 if ( !pattern.empty() ) {
00628
00629 if ( bei_->dirExists(pattern) ) {
00630 bei_->rmdir(pattern);
00631 }
00632
00633 LogTrace(mlDqmClient_)
00634 << "[CommissioningHistograms::" << __func__ << "]"
00635 << " Removing directories (and MonitorElements"
00636 << " therein) that match the pattern \""
00637 << pattern << "\"";
00638
00639 } else {
00640
00641 bei_->cd();
00642 bei_->removeContents();
00643
00644 if( bei_->dirExists("Collector") ) {
00645 bei_->rmdir("Collector");
00646 }
00647 if( bei_->dirExists("EvF") ) {
00648 bei_->rmdir("EvF");
00649 }
00650 if( bei_->dirExists("SiStrip") ) {
00651 bei_->rmdir("SiStrip");
00652 }
00653
00654 LogTrace(mlDqmClient_)
00655 << "[CommissioningHistograms::" << __func__ << "]"
00656 << " Removing \"DQM source\" directories (and MonitorElements therein)";
00657
00658 }
00659
00660 LogTrace(mlDqmClient_)
00661 << "[CommissioningHistograms::" << __func__ << "]"
00662 << " Removed histograms!";
00663
00664 bei_->setVerbose(1);
00665
00666 }
00667
00668
00670 void CommissioningHistograms::save( std::string& path,
00671 uint32_t run_number ) {
00672
00673
00674 std::stringstream ss;
00675
00676 if ( !path.empty() ) {
00677
00678 ss << path;
00679 if ( ss.str().find(".root") == std::string::npos ) { ss << ".root"; }
00680
00681 } else {
00682
00683
00684 std::string scratch = "SCRATCH";
00685 std::string dir = "";
00686 if ( getenv(scratch.c_str()) != NULL ) {
00687 dir = getenv(scratch.c_str());
00688 }
00689
00690
00691 if ( !dir.empty() ) { ss << dir << "/"; }
00692 else { ss << "/tmp/"; }
00693
00694
00695 ss << sistrip::dqmClientFileName_ << "_"
00696 << std::setfill('0') << std::setw(8) << run_number
00697 << ".root";
00698
00699 }
00700
00701
00702 LogTrace(mlDqmClient_)
00703 << "[CommissioningHistograms::" << __func__ << "]"
00704 << " Saving histograms to root file"
00705 << " (This may take some time!)";
00706 path = ss.str();
00707 bei_->save( path, sistrip::collate_ );
00708 edm::LogVerbatim(mlDqmClient_)
00709 << "[CommissioningHistograms::" << __func__ << "]"
00710 << " Saved histograms to root file \""
00711 << ss.str() << "\"!";
00712
00713 }
00714
00715
00716
00717 TH1* CommissioningHistograms::histogram( const sistrip::Monitorable& mon,
00718 const sistrip::Presentation& pres,
00719 const sistrip::View& view,
00720 const std::string& directory,
00721 const uint32_t& xbins,
00722 const float& xlow,
00723 const float& xhigh ) {
00724
00725
00726 std::string pwd = bei_->pwd();
00727 bei_->setCurrentFolder( std::string(sistrip::collate_) + sistrip::dir_ + directory );
00728
00729
00730 std::string name = SummaryGenerator::name( task_, mon, pres, view, directory );
00731
00732
00733 MonitorElement* me = bei_->get( bei_->pwd() + "/" + name );
00734 if ( me ) {
00735 bei_->removeElement( name );
00736 me = 0;
00737 }
00738
00739
00740 float high = static_cast<float>( xbins );
00741 if ( pres == sistrip::HISTO_1D ) {
00742 if ( xlow < 1. * sistrip::valid_ &&
00743 xhigh < 1. * sistrip::valid_ ) {
00744 me = bei_->book1D( name, name, xbins, xlow, xhigh );
00745 } else {
00746 me = bei_->book1D( name, name, xbins, 0., high );
00747 }
00748 } else if ( pres == sistrip::HISTO_2D_SUM ) {
00749 me = bei_->book1D( name, name,
00750 xbins, 0., high );
00751 } else if ( pres == sistrip::HISTO_2D_SCATTER ) {
00752 me = bei_->book2D( name, name, xbins, 0., high,
00753 sistrip::FED_ADC_RANGE+1,
00754 0.,
00755 sistrip::FED_ADC_RANGE*1. );
00756 } else if ( pres == sistrip::PROFILE_1D ) {
00757 me = bei_->bookProfile( name, name, xbins, 0., high,
00758 sistrip::FED_ADC_RANGE+1,
00759 0.,
00760 sistrip::FED_ADC_RANGE*1. );
00761 } else {
00762 me = 0;
00763 edm::LogWarning(mlDqmClient_)
00764 << "[CommissioningHistograms::" << __func__ << "]"
00765 << " Unexpected presentation \""
00766 << SiStripEnumsAndStrings::presentation( pres )
00767 << "\" Unable to create summary plot!";
00768 }
00769
00770
00771 if ( me ) {
00772 LogTrace(mlDqmClient_)
00773 << "[CommissioningHistograms::" << __func__ << "]"
00774 << " Created summary plot with name \"" << me->getName()
00775 << "\" in directory \""
00776 << bei_->pwd() << "\"!";
00777 } else {
00778 edm::LogWarning(mlDqmClient_)
00779 << "[CommissioningHistograms::" << __func__ << "]"
00780 << " NULL pointer to MonitorElement!"
00781 << " Unable to create summary plot!";
00782 }
00783
00784
00785 TH1* summary = ExtractTObject<TH1>().extract( me );
00786 if ( !summary ) {
00787 edm::LogWarning(mlDqmClient_)
00788 << "[CommissioningHistograms::" << __func__ << "]"
00789 << " Unable to extract root object!"
00790 << " Returning NULL pointer!";
00791 }
00792
00793
00794 bei_->setCurrentFolder( pwd );
00795
00796 return summary;
00797
00798 }
00799