6 #include "RelationalAccess/ISessionProxy.h" 7 #include "RelationalAccess/ISchema.h" 8 #include "RelationalAccess/IQuery.h" 9 #include "RelationalAccess/ICursor.h" 10 #include "CoralBase/AttributeList.h" 11 #include "CoralBase/Attribute.h" 12 #include "CoralBase/AttributeSpecification.h" 13 #include "CoralBase/TimeStamp.h" 21 m_debug( pset.getUntrackedParameter<
bool>(
"debug",
false ) )
22 ,m_firstFill( (unsigned short)pset.getUntrackedParameter<unsigned
int>(
"firstFill", 1 ) )
23 ,m_lastFill( (unsigned short)pset.getUntrackedParameter<unsigned
int>(
"lastFill", m_firstFill ) )
24 ,m_name( pset.getUntrackedParameter<
std::
string>(
"name",
"FillInfoPopConSourceHandler" ) )
25 ,m_connectionString(pset.getUntrackedParameter<
std::
string>(
"connectionString",
""))
26 ,m_dipSchema(pset.getUntrackedParameter<
std::
string>(
"DIPSchema",
""))
27 ,m_authpath(pset.getUntrackedParameter<
std::
string>(
"authenticationPath",
"")) {}
45 <<
" ); from " <<
m_name <<
"::getNewObjects";
52 <<
" and values:\n" << *previousFill
53 <<
"from " <<
m_name <<
"::getNewObjects";
54 if( m_firstFill <= previousFill->fillNumber() ) {
57 std::ostringstream es;
58 es <<
"Trying to insert fill number " <<
m_firstFill 59 << ( (
m_firstFill < previousFill->fillNumber() ) ?
", which is an older fill than " :
", which is the same fill as " )
60 <<
"the last one in the destination tag " << previousFill->fillNumber()
61 <<
": the first fill to be looked for will become " << previousFill->fillNumber() + 1;
62 edm::LogWarning( m_name ) << es.str() <<
"; from " << m_name <<
"::getNewObjects";
71 <<
" cannot be larger than the last one " <<
m_lastFill 72 <<
" EXITING. from " <<
m_name <<
"::getNewObjects";
89 coral::ISchema& runTimeLoggerSchema = session.
nominalSchema();
93 std::unique_ptr<coral::IQuery> fillDataQuery( runTimeLoggerSchema.newQuery() );
95 fillDataQuery->addToTableList(
std::string(
"RUNTIME_SUMMARY" ) );
97 fillDataQuery->addToOutputList(
std::string(
"LHCFILL" ) );
98 fillDataQuery->addToOutputList(
std::string(
"NBUNCHESBEAM1" ) );
99 fillDataQuery->addToOutputList(
std::string(
"NBUNCHESBEAM2" ) );
100 fillDataQuery->addToOutputList(
std::string(
"NCOLLIDINGBUNCHES" ) );
101 fillDataQuery->addToOutputList(
std::string(
"NTARGETBUNCHES" ) );
102 fillDataQuery->addToOutputList(
std::string(
"RUNTIME_TYPE_ID" ) );
103 fillDataQuery->addToOutputList(
std::string(
"PARTY1" ) );
104 fillDataQuery->addToOutputList(
std::string(
"PARTY2" ) );
105 fillDataQuery->addToOutputList(
std::string(
"CROSSINGANGLE" ) );
106 fillDataQuery->addToOutputList(
std::string(
"BETASTAR" ) );
107 fillDataQuery->addToOutputList(
std::string(
"INTENSITYBEAM1" ) );
108 fillDataQuery->addToOutputList(
std::string(
"INTENSITYBEAM2" ) );
109 fillDataQuery->addToOutputList(
std::string(
"ENERGY" ) );
110 fillDataQuery->addToOutputList(
std::string(
"CREATETIME" ) );
111 fillDataQuery->addToOutputList(
std::string(
"BEGINTIME" ) );
112 fillDataQuery->addToOutputList(
std::string(
"ENDTIME" ) );
113 fillDataQuery->addToOutputList(
std::string(
"INJECTIONSCHEME" ) );
115 coral::AttributeList fillDataBindVariables;
116 fillDataBindVariables.extend(
std::string(
"firstFillNumber" ),
typeid(
unsigned short ) );
118 fillDataBindVariables.extend(
std::string(
"lastFillNumber" ),
typeid(
unsigned short ) );
122 std::string conditionStr(
"BEGINTIME IS NOT NULL AND LHCFILL BETWEEN :firstFillNumber AND :lastFillNumber" );
123 fillDataQuery->setCondition( conditionStr, fillDataBindVariables );
125 fillDataQuery->addToOrderList(
std::string(
"LHCFILL" ) );
127 coral::AttributeList fillDataOutput;
128 fillDataOutput.extend<
unsigned short>(
std::string(
"LHCFILL" ) );
129 fillDataOutput.extend<
unsigned short>(
std::string(
"NBUNCHESBEAM1" ) );
130 fillDataOutput.extend<
unsigned short>(
std::string(
"NBUNCHESBEAM2" ) );
131 fillDataOutput.extend<
unsigned short>(
std::string(
"NCOLLIDINGBUNCHES" ) );
132 fillDataOutput.extend<
unsigned short>(
std::string(
"NTARGETBUNCHES" ) );
133 fillDataOutput.extend<
int>(
std::string(
"RUNTIME_TYPE_ID" ) );
134 fillDataOutput.extend<
int>(
std::string(
"PARTY1" ) );
135 fillDataOutput.extend<
int>(
std::string(
"PARTY2" ) );
136 fillDataOutput.extend<
float>(
std::string(
"CROSSINGANGLE" ) );
137 fillDataOutput.extend<
float>(
std::string(
"BETASTAR" ) );
138 fillDataOutput.extend<
float>(
std::string(
"INTENSITYBEAM1" ) );
139 fillDataOutput.extend<
float>(
std::string(
"INTENSITYBEAM2" ) );
140 fillDataOutput.extend<
float>(
std::string(
"ENERGY" ) );
141 fillDataOutput.extend<coral::TimeStamp>(
std::string(
"CREATETIME" ) );
142 fillDataOutput.extend<coral::TimeStamp>(
std::string(
"BEGINTIME" ) );
143 fillDataOutput.extend<coral::TimeStamp>(
std::string(
"ENDTIME" ) );
145 fillDataQuery->defineOutput( fillDataOutput );
147 coral::ICursor& fillDataCursor = fillDataQuery->execute();
149 unsigned short previousFillNumber = 1, currentFill =
m_firstFill;
150 cond::Time_t previousFillEndTime = 0ULL, afterPreviousFillEndTime = 0ULL, beforeStableBeamStartTime = 0ULL;
152 previousFillNumber = previousFill->fillNumber();
153 previousFillEndTime = previousFill->endTime();
155 unsigned short bunches1 = 0, bunches2 = 0, collidingBunches = 0, targetBunches = 0;
158 float crossingAngle = 0., betastar = 0., intensityBeam1 = 0., intensityBeam2 = 0., energy = 0.;
159 coral::TimeStamp stableBeamStartTimeStamp, beamDumpTimeStamp;
160 cond::Time_t creationTime = 0ULL, stableBeamStartTime = 0ULL, beamDumpTime = 0ULL;
162 std::ostringstream ss;
164 while( fillDataCursor.next() ) {
166 std::ostringstream qs;
167 fillDataCursor.currentRow().toOutputStream( qs );
170 currentFill = fillDataCursor.currentRow()[
std::string(
"LHCFILL" ) ].data<
unsigned short>();
171 coral::Attribute
const & bunches1Attribute = fillDataCursor.currentRow()[
std::string(
"NBUNCHESBEAM1" ) ];
172 if( bunches1Attribute.isNull() ) {
175 bunches1 = bunches1Attribute.data<
unsigned short>();
177 coral::Attribute
const & bunches2Attribute = fillDataCursor.currentRow()[
std::string(
"NBUNCHESBEAM2" ) ];
178 if( bunches2Attribute.isNull() ) {
181 bunches2 = bunches2Attribute.data<
unsigned short>();
183 coral::Attribute
const & collidingBunchesAttribute = fillDataCursor.currentRow()[
std::string(
"NCOLLIDINGBUNCHES" ) ];
184 if( collidingBunchesAttribute.isNull() ) {
185 collidingBunches = 0;
187 collidingBunches = collidingBunchesAttribute.data<
unsigned short>();
189 coral::Attribute
const & targetBunchesAttribute = fillDataCursor.currentRow()[
std::string(
"NTARGETBUNCHES" ) ];
190 if( targetBunchesAttribute.isNull() ) {
193 targetBunches = targetBunchesAttribute.data<
unsigned short>();
197 coral::Attribute
const & particleType1Attribute = fillDataCursor.currentRow()[
std::string(
"PARTY1" ) ];
198 if( particleType1Attribute.isNull() ) {
203 coral::Attribute
const & particleType2Attribute = fillDataCursor.currentRow()[
std::string(
"PARTY2" ) ];
204 if( particleType2Attribute.isNull() ) {
209 coral::Attribute
const & crossingAngleAttribute = fillDataCursor.currentRow()[
std::string(
"CROSSINGANGLE" ) ];
210 if( crossingAngleAttribute.isNull() ) {
213 crossingAngle = crossingAngleAttribute.data<
float>();
215 coral::Attribute
const & betastarAttribute = fillDataCursor.currentRow()[
std::string(
"BETASTAR" ) ];
216 if( betastarAttribute.isNull() ) {
219 betastar = betastarAttribute.data<
float>();
221 coral::Attribute
const & intensityBeam1Attribute = fillDataCursor.currentRow()[
std::string(
"INTENSITYBEAM1" ) ];
222 if( intensityBeam1Attribute.isNull() ) {
225 intensityBeam1 = intensityBeam1Attribute.data<
float>();
227 coral::Attribute
const & intensityBeam2Attribute = fillDataCursor.currentRow()[
std::string(
"INTENSITYBEAM2" ) ];
228 if( intensityBeam2Attribute.isNull() ) {
231 intensityBeam2 = intensityBeam2Attribute.data<
float>();
233 coral::Attribute
const & energyAttribute = fillDataCursor.currentRow()[
std::string(
"ENERGY" ) ];
234 if( energyAttribute.isNull() ){
237 energy = energyAttribute.data<
float>();
242 stableBeamStartTimeStamp = fillDataCursor.currentRow()[
std::string(
"BEGINTIME" ) ].data<coral::TimeStamp>();
244 coral::Attribute
const & beamDumpTimeAttribute = fillDataCursor.currentRow()[
std::string(
"ENDTIME" ) ];
245 if( beamDumpTimeAttribute.isNull() ) {
248 beamDumpTimeStamp = beamDumpTimeAttribute.data<coral::TimeStamp>();
251 coral::Attribute
const & injectionSchemeAttribute = fillDataCursor.currentRow()[
std::string(
"INJECTIONSCHEME" ) ];
252 if( injectionSchemeAttribute.isNull() ) {
255 injectionScheme = injectionSchemeAttribute.data<
std::string>();
275 if( beamDumpTime == 0 ) {
277 <<
" is still ongoing" 278 <<
"; from " <<
m_name <<
"::getNewObjects";
286 coral::AttributeList bunchConfBindVariables;
287 bunchConfBindVariables.extend<coral::TimeStamp>(
std::string(
"stableBeamStartTimeStamp" ) );
288 bunchConfBindVariables[
std::string(
"stableBeamStartTimeStamp" ) ].data<coral::TimeStamp>() = stableBeamStartTimeStamp;
289 conditionStr =
std::string(
"DIPTIME <= :stableBeamStartTimeStamp" );
291 coral::AttributeList bunchConfOutput;
292 bunchConfOutput.extend<coral::TimeStamp>(
std::string(
"DIPTIME" ) );
293 bunchConfOutput.extend<
unsigned short>(
std::string(
"BUCKET" ) );
295 std::unique_ptr<coral::IQuery> bunchConf1Query(beamCondSchema.newQuery());
296 bunchConf1Query->addToTableList(
std::string(
"LHC_CIRCBUNCHCONFIG_BEAM1" ),
std::string(
"BEAMCONF\", TABLE( BEAMCONF.VALUE ) \"BUCKETS" ) );
299 bunchConf1Query->setCondition( conditionStr, bunchConfBindVariables );
300 bunchConf1Query->addToOrderList(
std::string(
"DIPTIME DESC" ) );
302 bunchConf1Query->defineOutput( bunchConfOutput );
303 coral::ICursor& bunchConf1Cursor = bunchConf1Query->execute();
304 std::bitset<FillInfo::bunchSlots+1> bunchConfiguration1( 0ULL );
305 while( bunchConf1Cursor.next() ) {
307 std::ostringstream b1s;
308 fillDataCursor.currentRow().toOutputStream( b1s );
312 if( bunchConf1Cursor.currentRow()[
std::string(
"BUCKET" ) ].data<
unsigned short>() != 0 ) {
313 unsigned short slot = ( bunchConf1Cursor.currentRow()[
std::string(
"BUCKET" ) ].data<
unsigned short>() - 1 ) / 10 + 1;
314 bunchConfiguration1[ slot ] =
true;
318 std::unique_ptr<coral::IQuery> bunchConf2Query(beamCondSchema.newQuery());
319 bunchConf2Query->addToTableList(
std::string(
"LHC_CIRCBUNCHCONFIG_BEAM2" ),
std::string(
"BEAMCONF\", TABLE( BEAMCONF.VALUE ) \"BUCKETS" ) );
322 bunchConf2Query->setCondition( conditionStr, bunchConfBindVariables );
323 bunchConf2Query->addToOrderList(
std::string(
"DIPTIME DESC" ) );
325 bunchConf2Query->defineOutput( bunchConfOutput );
326 coral::ICursor& bunchConf2Cursor = bunchConf2Query->execute();
327 std::bitset<FillInfo::bunchSlots+1> bunchConfiguration2( 0ULL );
328 while( bunchConf2Cursor.next() ) {
330 std::ostringstream b2s;
331 fillDataCursor.currentRow().toOutputStream( b2s );
334 if( bunchConf2Cursor.currentRow()[
std::string(
"BUCKET" ) ].data<
unsigned short>() != 0 ) {
335 unsigned short slot = ( bunchConf2Cursor.currentRow()[
std::string(
"BUCKET" ) ].data<
unsigned short>() - 1 ) / 10 + 1;
336 bunchConfiguration2[ slot ] =
true;
345 if( afterPreviousFillEndTime < stableBeamStartTime ) {
346 edm::LogInfo(
m_name ) <<
"Entering fake fill between fill number " << previousFillNumber
347 <<
" and current fill number " << currentFill
348 <<
", from " << afterPreviousFillEndTime
349 <<
" ( " << boost::posix_time::to_iso_extended_string(
cond::time::to_boost( afterPreviousFillEndTime ) )
350 <<
" ) to " << beforeStableBeamStartTime
351 <<
" ( " << boost::posix_time::to_iso_extended_string(
cond::time::to_boost( beforeStableBeamStartTime ) )
352 <<
" ); from " <<
m_name <<
"::getNewObjects";
356 edm::LogError(
m_name ) <<
"WRONG DATA! In the previous fill number " << previousFillNumber
357 <<
" beams were dumped at timestamp " << boost::posix_time::to_iso_extended_string(
cond::time::to_boost( previousFillEndTime ) )
358 <<
", which is not before the timestamp " << boost::posix_time::to_iso_extended_string(
cond::time::to_boost( stableBeamStartTime ) )
359 <<
" when current fill number " << currentFill
360 <<
" entered stable beams. EXITING. from " <<
m_name <<
"::getNewObjects";
365 fillInfo->
setBeamInfo( const_cast<unsigned short const &>( bunches1 )
366 , const_cast<unsigned short const &>( bunches2 )
367 , const_cast<unsigned short const &>( collidingBunches )
368 , const_cast<unsigned short const &>( targetBunches )
369 , const_cast<FillInfo::FillTypeId const &>( fillType )
370 , const_cast<FillInfo::ParticleTypeId const &>( particleType1 )
371 , const_cast<FillInfo::ParticleTypeId const &>( particleType2 )
372 , const_cast<float const &>( crossingAngle )
373 , const_cast<float const &>( betastar )
374 , const_cast<float const &>( intensityBeam1 )
375 , const_cast<float const &>( intensityBeam2 )
376 , const_cast<float const &>( energy )
377 , const_cast<cond::Time_t const &>( creationTime )
378 , const_cast<cond::Time_t const &>( stableBeamStartTime )
379 , const_cast<cond::Time_t const &>( beamDumpTime )
380 , const_cast<std::string const &>( injectionScheme )
381 ,
const_cast<std::bitset<FillInfo::bunchSlots+1>
const &
>( bunchConfiguration1 )
382 ,
const_cast<std::bitset<FillInfo::bunchSlots+1>
const &
>( bunchConfiguration2 )
387 <<
" with validity " << stableBeamStartTime
388 <<
" ( " << boost::posix_time::to_iso_extended_string(
cond::time::to_boost( stableBeamStartTime ) )
389 <<
" ) has values:\n" << *fillInfo
390 <<
"from " <<
m_name <<
"::getNewObjects";
392 ss <<
" fill = " << currentFill
393 <<
";\tinjection scheme: " << injectionScheme
395 << boost::posix_time::to_iso_extended_string( stableBeamStartTimeStamp.time() )
397 << boost::posix_time::to_iso_extended_string( beamDumpTimeStamp.time() )
400 previousFillNumber = currentFill;
401 previousFillEndTime = beamDumpTime;
edm::ErrorSummaryEntry Error
std::string m_userTextLog
edm::Ref< Container > Ref
FillInfoPopConSourceHandler(const edm::ParameterSet &pset)
void setBeamInfo(unsigned short const &bunches1, unsigned short const &bunches2, unsigned short const &collidingBunches, unsigned short const &targetBunches, FillTypeId const &fillType, ParticleTypeId const &particleType1, ParticleTypeId const &particleType2, float const &angle, float const &beta, float const &intensity1, float const &intensity2, float const &energy, cond::Time_t const &createTime, cond::Time_t const &beginTime, cond::Time_t const &endTime, std::string const &scheme, std::bitset< bunchSlots+1 > const &bunchConf1, std::bitset< bunchSlots+1 > const &bunchConf2)
~FillInfoPopConSourceHandler() override
void start(bool readOnly=true)
cond::Time_t pack(cond::UnpackedTime iValue)
static size_t const availableBunchSlots
Transaction & transaction()
OldContainer m_to_transfer
U second(std::pair< T, U > const &p)
cond::ValidityInterval lastInterval
void getNewObjects() override
unsigned long long Time_t
coral::ISchema & nominalSchema()
Session createSession(const std::string &connectionString, bool writeCapable=false)
void setMessageVerbosity(coral::MsgLevel level)
Time_t from_boost(boost::posix_time::ptime bt)
unsigned short m_lastFill
std::string lastPayloadToken
std::string m_connectionString
coral::ISessionProxy & coralSession()
unsigned short m_firstFill
std::string id() const override
void setAuthenticationPath(const std::string &p)
boost::posix_time::ptime to_boost(Time_t iValue)
cond::TagInfo_t const & tagInfo() const
cond::UnpackedTime unpack(cond::Time_t iValue)