61 auto& dbService = cool::DatabaseSvcFactory::databaseService();
63 uint64_t runStartTime = 0xFFffFFffFFffFFff;
64 uint64_t runEndTime = 0;
65 std::map<uint64_t, uint32_t> lbs;
67 auto databaseName = std::string(
"COOLONL_TRIGGER/CONDBR2" );
68 auto folderName = std::string(
"/TRIGGER/LUMI/LBLB" );
69 auto databasePtr = dbService.openDatabase( databaseName,
true );
70 auto folderPtr = databasePtr->getFolder( folderName );
72 auto since = cool::ValidityKey( run64 << 32 );
73 auto until = cool::ValidityKey( ( run64 + 1 ) << 32 );
74 auto iterPtr = folderPtr->browseObjects( since, until, cool::ChannelSelection::all() );
75 while ( iterPtr->goToNext() ) {
76 auto&
object = iterPtr->currentRef();
77 auto lbStartTime = getStartTime(
object );
78 auto lbEndTime = getEndTime(
object );
79 lbs.emplace( lbStartTime, getLB(
object ) );
80 if ( lbStartTime < runStartTime ) runStartTime = lbStartTime;
81 if ( lbEndTime > runEndTime ) runEndTime = lbEndTime;
83 if ( lbs.empty() )
throw afp::CantReadCool( ERS_HERE, std::move(databaseName), std::move(folderName) );
89 auto databaseName = std::string(
"COOLOFL_DCS/CONDBR2" );
90 auto folderName = std::string(
"/AFP/DCS/STATION" );
91 auto databasePtr = dbService.openDatabase( databaseName,
true );
92 auto folderPtr = databasePtr->getFolder( folderName );
93 auto iterPtr = folderPtr->browseObjects( runStartTime, runEndTime, cool::ChannelSelection( channel ) );
94 uint64_t since = 0, until = 0;
95 iovs.reserve( iterPtr->size() / 2 );
96 while ( iterPtr->goToNext() ) {
97 auto&
object = iterPtr->currentRef();
98 auto inphysics =
object.payload()[
"inphysics" ].data<cool::Bool>();
100 if ( since == 0 ) since =
object.since();
101 until =
object.until();
102 }
else if ( since != 0 ) {
103 uint32_t start = lbs.lower_bound( since )->second;
104 uint32_t end = ( --lbs.upper_bound( until ) )->second;
105 iovs.emplace_back( start, end );
111 if ( iovs.empty() ) {
112 iovs.emplace_back( 0u, 0u );
120 const TObject&
object,
121 const dqm_core::AlgorithmConfig&
config ) {
122 if ( !
object.
IsA()->InheritsFrom(
"TH1" ) ) {
123 throw dqm_core::BadConfig( ERS_HERE, name,
"does not inherit from TH1" );
129 throw dqm_core::BadConfig( ERS_HERE, name,
"histogram has more than 1 dimension" );
145 uint32_t
xmin = range[ 0 ];
146 uint32_t
xmax = range[ 1 ] + 1;
148 std::vector<uint32_t> badbins;
149 uint32_t checkedLBs = 0;
150 for (
auto& iov : iovs ) {
151 auto xstart = std::max<uint32_t>( xaxis->FindFixBin( iov.first ),
xmin );
152 auto xend = std::min<uint32_t>( xaxis->FindFixBin( iov.second ),
xmax );
153 for ( uint32_t ix = xstart; ix < xend; ++ix ) {
154 double binvalue =
histogram->GetBinContent( ix );
155 if ( binvalue == ignoreval )
continue;
157 if ( RANGE_D < binvalue && binvalue < RANGE_U )
continue;
158 badbins.push_back( ix );
164 auto result =
new dqm_core::Result();
167 result->tags_[
"NBadBins" ] = badbins.size();
169 auto npublish = std::min<uint32_t>( Nmaxpublish, badbins.size() );
170 for ( uint32_t i = 0; i < npublish; ++i ) {
171 uint32_t ix = badbins[ i ];
172 uint32_t
lb = std::floor( xaxis->GetBinCenter( ix ) );
173 auto tag = ( std::ostringstream() <<
"LB " <<
lb ).
str();
179 if ( checkedLBs < minLBs )
180 result->status_ = dqm_core::Result::Undefined;
181 else if ( badbins.size() > rthreshold )
182 result->status_ = dqm_core::Result::Red;
183 else if ( badbins.size() > gthreshold )
184 result->status_ = dqm_core::Result::Yellow;
186 result->status_ = dqm_core::Result::Green;