00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00003 #include "CondFormats/Common/interface/TimeConversions.h"
00004 #include "CondTools/RunInfo/interface/FillInfoPopConSourceHandler.h"
00005 #include "CondCore/DBCommon/interface/DbConnection.h"
00006 #include "CondCore/DBCommon/interface/DbConnectionConfiguration.h"
00007 #include "CondCore/DBCommon/interface/DbTransaction.h"
00008 #include "RelationalAccess/ISchema.h"
00009 #include "RelationalAccess/IQuery.h"
00010 #include "RelationalAccess/ICursor.h"
00011 #include "CoralBase/AttributeList.h"
00012 #include "CoralBase/Attribute.h"
00013 #include "CoralBase/AttributeSpecification.h"
00014 #include "CoralBase/TimeStamp.h"
00015 #include <iostream>
00016 #include <memory>
00017 #include <sstream>
00018 #include <utility>
00019 #include <vector>
00020
00021 FillInfoPopConSourceHandler::FillInfoPopConSourceHandler( edm::ParameterSet const & pset ):
00022 m_debug( pset.getUntrackedParameter<bool>( "debug", false ) )
00023 ,m_firstFill( (unsigned short)pset.getUntrackedParameter<unsigned int>( "firstFill", 1 ) )
00024 ,m_lastFill( (unsigned short)pset.getUntrackedParameter<unsigned int>( "lastFill", m_firstFill ) )
00025 ,m_name( pset.getUntrackedParameter<std::string>( "name", "FillInfoPopConSourceHandler" ) )
00026 ,m_connectionString(pset.getUntrackedParameter<std::string>("connectionString",""))
00027 ,m_dipSchema(pset.getUntrackedParameter<std::string>("DIPSchema",""))
00028 ,m_authpath(pset.getUntrackedParameter<std::string>("authenticationPath","")) {}
00029
00030 FillInfoPopConSourceHandler::~FillInfoPopConSourceHandler() {}
00031
00032 void FillInfoPopConSourceHandler::getNewObjects() {
00033
00034 Ref previousFill;
00035
00036
00037 if ( tagInfo().size == 0 ) {
00038 edm::LogInfo( m_name ) << "New tag "<< tagInfo().name << "; from " << m_name << "::getNewObjects";
00039 } else {
00040
00041 edm::LogInfo( m_name ) << "got info for tag " << tagInfo().name
00042 << ", IOVSequence token " << tagInfo().token
00043 << ": size " << tagInfo().size
00044 << ", last object valid since " << tagInfo().lastInterval.first
00045 << " ( "<< boost::posix_time::to_iso_extended_string( cond::time::to_boost( tagInfo().lastInterval.first ) )
00046 << " ); from " << m_name << "::getNewObjects";
00047
00048 previousFill = this->lastPayload();
00049
00050 edm::LogInfo( m_name ) << "The last payload in tag " << tagInfo().name
00051 << " valid since " << tagInfo().lastInterval.first
00052 << " has token " << tagInfo().lastPayloadToken
00053 << " and values:\n" << *previousFill
00054 << "from " << m_name << "::getNewObjects";
00055 if( m_firstFill <= previousFill->fillNumber() ) {
00056
00057
00058 std::ostringstream es;
00059 es << "Trying to insert fill number " << m_firstFill
00060 << ( ( m_firstFill < previousFill->fillNumber() ) ? ", which is an older fill than " : ", which is the same fill as " )
00061 << "the last one in the destination tag " << previousFill->fillNumber()
00062 << ": the first fill to be looked for will become " << previousFill->fillNumber() + 1;
00063 edm::LogWarning( m_name ) << es.str() << "; from " << m_name << "::getNewObjects";
00064 m_firstFill = previousFill->fillNumber() + 1;
00065 }
00066 }
00067
00068
00069
00070 if( m_firstFill > m_lastFill ) {
00071 edm::LogError( m_name ) << "WRONG CONFIGURATION! The first fill " << m_firstFill
00072 << " cannot be larger than the last one " << m_lastFill
00073 << " EXITING. from " << m_name << "::getNewObjects";
00074 return;
00075 }
00076
00077
00078 cond::DbConnection dbConnection;
00079
00080 if( m_debug ) {
00081 dbConnection.configuration().setMessageLevel( coral::Debug );
00082 } else {
00083 dbConnection.configuration().setMessageLevel( coral::Error );
00084 }
00085 dbConnection.configuration().setPoolAutomaticCleanUp( false );
00086 dbConnection.configuration().setConnectionTimeOut( 0 );
00087 dbConnection.configuration().setAuthenticationPath( m_authpath );
00088 dbConnection.configure();
00089
00090 cond::DbSession session = dbConnection.createSession();
00091 session.open( m_connectionString, true );
00092
00093 coral::ISchema& runTimeLoggerSchema = session.nominalSchema();
00094
00095 session.transaction().start(true);
00096
00097 std::unique_ptr<coral::IQuery> fillDataQuery( runTimeLoggerSchema.newQuery() );
00098
00099 fillDataQuery->addToTableList( std::string( "RUNTIME_SUMMARY" ) );
00100
00101 fillDataQuery->addToOutputList( std::string( "LHCFILL" ) );
00102 fillDataQuery->addToOutputList( std::string( "NBUNCHESBEAM1" ) );
00103 fillDataQuery->addToOutputList( std::string( "NBUNCHESBEAM2" ) );
00104 fillDataQuery->addToOutputList( std::string( "NCOLLIDINGBUNCHES" ) );
00105 fillDataQuery->addToOutputList( std::string( "NTARGETBUNCHES" ) );
00106 fillDataQuery->addToOutputList( std::string( "RUNTIME_TYPE_ID" ) );
00107 fillDataQuery->addToOutputList( std::string( "PARTY1" ) );
00108 fillDataQuery->addToOutputList( std::string( "PARTY2" ) );
00109 fillDataQuery->addToOutputList( std::string( "CROSSINGANGLE" ) );
00110 fillDataQuery->addToOutputList( std::string( "BETASTAR" ) );
00111 fillDataQuery->addToOutputList( std::string( "INTENSITYBEAM1" ) );
00112 fillDataQuery->addToOutputList( std::string( "INTENSITYBEAM2" ) );
00113 fillDataQuery->addToOutputList( std::string( "ENERGY" ) );
00114 fillDataQuery->addToOutputList( std::string( "CREATETIME" ) );
00115 fillDataQuery->addToOutputList( std::string( "BEGINTIME" ) );
00116 fillDataQuery->addToOutputList( std::string( "ENDTIME" ) );
00117 fillDataQuery->addToOutputList( std::string( "INJECTIONSCHEME" ) );
00118
00119 coral::AttributeList fillDataBindVariables;
00120 fillDataBindVariables.extend( std::string( "firstFillNumber" ), typeid( unsigned short ) );
00121 fillDataBindVariables[ std::string( "firstFillNumber" ) ].data<unsigned short>() = m_firstFill;
00122 fillDataBindVariables.extend( std::string( "lastFillNumber" ), typeid( unsigned short ) );
00123 fillDataBindVariables[ std::string( "lastFillNumber" ) ].data<unsigned short>() = m_lastFill;
00124
00125
00126 std::string conditionStr( "BEGINTIME IS NOT NULL AND LHCFILL BETWEEN :firstFillNumber AND :lastFillNumber" );
00127 fillDataQuery->setCondition( conditionStr, fillDataBindVariables );
00128
00129 fillDataQuery->addToOrderList( std::string( "LHCFILL" ) );
00130
00131 coral::AttributeList fillDataOutput;
00132 fillDataOutput.extend<unsigned short>( std::string( "LHCFILL" ) );
00133 fillDataOutput.extend<unsigned short>( std::string( "NBUNCHESBEAM1" ) );
00134 fillDataOutput.extend<unsigned short>( std::string( "NBUNCHESBEAM2" ) );
00135 fillDataOutput.extend<unsigned short>( std::string( "NCOLLIDINGBUNCHES" ) );
00136 fillDataOutput.extend<unsigned short>( std::string( "NTARGETBUNCHES" ) );
00137 fillDataOutput.extend<int>( std::string( "RUNTIME_TYPE_ID" ) );
00138 fillDataOutput.extend<int>( std::string( "PARTY1" ) );
00139 fillDataOutput.extend<int>( std::string( "PARTY2" ) );
00140 fillDataOutput.extend<float>( std::string( "CROSSINGANGLE" ) );
00141 fillDataOutput.extend<float>( std::string( "BETASTAR" ) );
00142 fillDataOutput.extend<float>( std::string( "INTENSITYBEAM1" ) );
00143 fillDataOutput.extend<float>( std::string( "INTENSITYBEAM2" ) );
00144 fillDataOutput.extend<float>( std::string( "ENERGY" ) );
00145 fillDataOutput.extend<coral::TimeStamp>( std::string( "CREATETIME" ) );
00146 fillDataOutput.extend<coral::TimeStamp>( std::string( "BEGINTIME" ) );
00147 fillDataOutput.extend<coral::TimeStamp>( std::string( "ENDTIME" ) );
00148 fillDataOutput.extend<std::string>( std::string( "INJECTIONSCHEME" ) );
00149 fillDataQuery->defineOutput( fillDataOutput );
00150
00151 coral::ICursor& fillDataCursor = fillDataQuery->execute();
00152
00153 unsigned short previousFillNumber = 1, currentFill = m_firstFill;
00154 cond::Time_t previousFillEndTime = 0ULL, afterPreviousFillEndTime = 0ULL, beforeStableBeamStartTime = 0ULL;
00155 if( tagInfo().size > 0 ) {
00156 previousFillNumber = previousFill->fillNumber();
00157 previousFillEndTime = previousFill->endTime();
00158 }
00159 unsigned short bunches1 = 0, bunches2 = 0, collidingBunches = 0, targetBunches = 0;
00160 FillInfo::FillTypeId fillType = FillInfo::UNKNOWN;
00161 FillInfo::ParticleTypeId particleType1 = FillInfo::NONE, particleType2 = FillInfo::NONE;
00162 float crossingAngle = 0., betastar = 0., intensityBeam1 = 0., intensityBeam2 = 0., energy = 0.;
00163 coral::TimeStamp stableBeamStartTimeStamp, beamDumpTimeStamp;
00164 cond::Time_t creationTime = 0ULL, stableBeamStartTime = 0ULL, beamDumpTime = 0ULL;
00165 std::string injectionScheme( "None" );
00166 std::ostringstream ss;
00167
00168 while( fillDataCursor.next() ) {
00169 if( m_debug ) {
00170 std::ostringstream qs;
00171 fillDataCursor.currentRow().toOutputStream( qs );
00172 edm::LogInfo( m_name ) << qs.str() << "\nfrom " << m_name << "::getNewObjects";
00173 }
00174 currentFill = fillDataCursor.currentRow()[ std::string( "LHCFILL" ) ].data<unsigned short>();
00175 coral::Attribute const & bunches1Attribute = fillDataCursor.currentRow()[ std::string( "NBUNCHESBEAM1" ) ];
00176 if( bunches1Attribute.isNull() ) {
00177 bunches1 = 0;
00178 } else {
00179 bunches1 = bunches1Attribute.data<unsigned short>();
00180 }
00181 coral::Attribute const & bunches2Attribute = fillDataCursor.currentRow()[ std::string( "NBUNCHESBEAM2" ) ];
00182 if( bunches2Attribute.isNull() ) {
00183 bunches2 = 0;
00184 } else {
00185 bunches2 = bunches2Attribute.data<unsigned short>();
00186 }
00187 coral::Attribute const & collidingBunchesAttribute = fillDataCursor.currentRow()[ std::string( "NCOLLIDINGBUNCHES" ) ];
00188 if( collidingBunchesAttribute.isNull() ) {
00189 collidingBunches = 0;
00190 } else {
00191 collidingBunches = collidingBunchesAttribute.data<unsigned short>();
00192 }
00193 coral::Attribute const & targetBunchesAttribute = fillDataCursor.currentRow()[ std::string( "NTARGETBUNCHES" ) ];
00194 if( targetBunchesAttribute.isNull() ) {
00195 targetBunches = 0;
00196 } else {
00197 targetBunches = targetBunchesAttribute.data<unsigned short>();
00198 }
00199
00200 fillType = static_cast<FillInfo::FillTypeId>( fillDataCursor.currentRow()[ std::string( "RUNTIME_TYPE_ID" ) ].data<int>() );
00201 coral::Attribute const & particleType1Attribute = fillDataCursor.currentRow()[ std::string( "PARTY1" ) ];
00202 if( particleType1Attribute.isNull() ) {
00203 particleType1 = FillInfo::NONE;
00204 } else {
00205 particleType1 = static_cast<FillInfo::ParticleTypeId>( particleType1Attribute.data<int>() );
00206 }
00207 coral::Attribute const & particleType2Attribute = fillDataCursor.currentRow()[ std::string( "PARTY2" ) ];
00208 if( particleType2Attribute.isNull() ) {
00209 particleType2 = FillInfo::NONE;
00210 } else {
00211 particleType2 = static_cast<FillInfo::ParticleTypeId>( particleType2Attribute.data<int>() );
00212 }
00213 coral::Attribute const & crossingAngleAttribute = fillDataCursor.currentRow()[ std::string( "CROSSINGANGLE" ) ];
00214 if( crossingAngleAttribute.isNull() ) {
00215 crossingAngle = 0.;
00216 } else {
00217 crossingAngle = crossingAngleAttribute.data<float>();
00218 }
00219 coral::Attribute const & betastarAttribute = fillDataCursor.currentRow()[ std::string( "BETASTAR" ) ];
00220 if( betastarAttribute.isNull() ) {
00221 betastar = 0.;
00222 } else {
00223 betastar = betastarAttribute.data<float>();
00224 }
00225 coral::Attribute const & intensityBeam1Attribute = fillDataCursor.currentRow()[ std::string( "INTENSITYBEAM1" ) ];
00226 if( intensityBeam1Attribute.isNull() ) {
00227 intensityBeam1 = 0.;
00228 } else {
00229 intensityBeam1 = intensityBeam1Attribute.data<float>();
00230 }
00231 coral::Attribute const & intensityBeam2Attribute = fillDataCursor.currentRow()[ std::string( "INTENSITYBEAM2" ) ];
00232 if( intensityBeam2Attribute.isNull() ) {
00233 intensityBeam2 = 0.;
00234 } else {
00235 intensityBeam2 = intensityBeam2Attribute.data<float>();
00236 }
00237 coral::Attribute const & energyAttribute = fillDataCursor.currentRow()[ std::string( "ENERGY" ) ];
00238 if( energyAttribute.isNull() ){
00239 energy = 0.;
00240 } else {
00241 energy = energyAttribute.data<float>();
00242 }
00243
00244 creationTime = cond::time::from_boost( fillDataCursor.currentRow()[ std::string( "CREATETIME" ) ].data<coral::TimeStamp>().time() );
00245
00246 stableBeamStartTimeStamp = fillDataCursor.currentRow()[ std::string( "BEGINTIME" ) ].data<coral::TimeStamp>();
00247 stableBeamStartTime = cond::time::from_boost( stableBeamStartTimeStamp.time() );
00248 coral::Attribute const & beamDumpTimeAttribute = fillDataCursor.currentRow()[ std::string( "ENDTIME" ) ];
00249 if( beamDumpTimeAttribute.isNull() ) {
00250 beamDumpTime = 0;
00251 } else {
00252 beamDumpTimeStamp = beamDumpTimeAttribute.data<coral::TimeStamp>();
00253 beamDumpTime = cond::time::from_boost( beamDumpTimeStamp.time() );
00254 }
00255 coral::Attribute const & injectionSchemeAttribute = fillDataCursor.currentRow()[ std::string( "INJECTIONSCHEME" ) ];
00256 if( injectionSchemeAttribute.isNull() ) {
00257 injectionScheme = std::string( "None" );
00258 } else {
00259 injectionScheme = injectionSchemeAttribute.data<std::string>();
00260 }
00261
00262 if( fillType != FillInfo::UNKNOWN && ( particleType1 == FillInfo::NONE || particleType2 == FillInfo::NONE ) ) {
00263 switch( fillType ) {
00264 case FillInfo::PROTONS :
00265 particleType1 = FillInfo::PROTON;
00266 particleType2 = FillInfo::PROTON;
00267 break;
00268 case FillInfo::IONS :
00269 particleType1 = FillInfo::PB82;
00270 particleType2 = FillInfo::PB82;
00271 break;
00272 case FillInfo::UNKNOWN :
00273 case FillInfo::COSMICS :
00274 case FillInfo::GAP :
00275 break;
00276 }
00277 }
00278
00279 if( beamDumpTime == 0 ) {
00280 edm::LogWarning( m_name ) << "NO TRANSFER NEEDED: the fill number " << currentFill
00281 << " is still ongoing"
00282 << "; from " << m_name << "::getNewObjects";
00283 continue;
00284 }
00285
00286 coral::ISchema& beamCondSchema = session.schema( m_dipSchema );
00287
00288 session.transaction().start( true );
00289
00290 coral::AttributeList bunchConfBindVariables;
00291 bunchConfBindVariables.extend<coral::TimeStamp>( std::string( "stableBeamStartTimeStamp" ) );
00292 bunchConfBindVariables[ std::string( "stableBeamStartTimeStamp" ) ].data<coral::TimeStamp>() = stableBeamStartTimeStamp;
00293 conditionStr = std::string( "DIPTIME <= :stableBeamStartTimeStamp" );
00294
00295 coral::AttributeList bunchConfOutput;
00296 bunchConfOutput.extend<coral::TimeStamp>( std::string( "DIPTIME" ) );
00297 bunchConfOutput.extend<unsigned short>( std::string( "BUCKET" ) );
00298
00299 std::unique_ptr<coral::IQuery> bunchConf1Query(beamCondSchema.newQuery());
00300 bunchConf1Query->addToTableList( std::string( "LHC_CIRCBUNCHCONFIG_BEAM1" ), std::string( "BEAMCONF\", TABLE( BEAMCONF.VALUE ) \"BUCKETS" ) );
00301 bunchConf1Query->addToOutputList( std::string( "BEAMCONF.DIPTIME" ), std::string( "DIPTIME" ) );
00302 bunchConf1Query->addToOutputList( std::string( "BUCKETS.COLUMN_VALUE" ), std::string( "BUCKET" ) );
00303 bunchConf1Query->setCondition( conditionStr, bunchConfBindVariables );
00304 bunchConf1Query->addToOrderList( std::string( "DIPTIME DESC" ) );
00305 bunchConf1Query->limitReturnedRows( FillInfo::availableBunchSlots );
00306 bunchConf1Query->defineOutput( bunchConfOutput );
00307 coral::ICursor& bunchConf1Cursor = bunchConf1Query->execute();
00308 std::bitset<FillInfo::bunchSlots+1> bunchConfiguration1( 0ULL );
00309 while( bunchConf1Cursor.next() ) {
00310 if( m_debug ) {
00311 std::ostringstream b1s;
00312 fillDataCursor.currentRow().toOutputStream( b1s );
00313 edm::LogInfo( m_name ) << b1s.str() << "\nfrom " << m_name << "::getNewObjects";
00314 }
00315
00316 if( bunchConf1Cursor.currentRow()[ std::string( "BUCKET" ) ].data<unsigned short>() != 0 ) {
00317 unsigned short slot = ( bunchConf1Cursor.currentRow()[ std::string( "BUCKET" ) ].data<unsigned short>() - 1 ) / 10 + 1;
00318 bunchConfiguration1[ slot ] = true;
00319 }
00320 }
00321
00322 std::unique_ptr<coral::IQuery> bunchConf2Query(beamCondSchema.newQuery());
00323 bunchConf2Query->addToTableList( std::string( "LHC_CIRCBUNCHCONFIG_BEAM2" ), std::string( "BEAMCONF\", TABLE( BEAMCONF.VALUE ) \"BUCKETS" ) );
00324 bunchConf2Query->addToOutputList( std::string( "BEAMCONF.DIPTIME" ), std::string( "DIPTIME" ) );
00325 bunchConf2Query->addToOutputList( std::string( "BUCKETS.COLUMN_VALUE" ), std::string( "BUCKET" ) );
00326 bunchConf2Query->setCondition( conditionStr, bunchConfBindVariables );
00327 bunchConf2Query->addToOrderList( std::string( "DIPTIME DESC" ) );
00328 bunchConf2Query->limitReturnedRows( FillInfo::availableBunchSlots );
00329 bunchConf2Query->defineOutput( bunchConfOutput );
00330 coral::ICursor& bunchConf2Cursor = bunchConf2Query->execute();
00331 std::bitset<FillInfo::bunchSlots+1> bunchConfiguration2( 0ULL );
00332 while( bunchConf2Cursor.next() ) {
00333 if( m_debug ) {
00334 std::ostringstream b2s;
00335 fillDataCursor.currentRow().toOutputStream( b2s );
00336 edm::LogInfo( m_name ) << b2s.str() << "\nfrom " << m_name << "::getNewObjects";
00337 }
00338 if( bunchConf2Cursor.currentRow()[ std::string( "BUCKET" ) ].data<unsigned short>() != 0 ) {
00339 unsigned short slot = ( bunchConf2Cursor.currentRow()[ std::string( "BUCKET" ) ].data<unsigned short>() - 1 ) / 10 + 1;
00340 bunchConfiguration2[ slot ] = true;
00341 }
00342 }
00343
00344 session.transaction().commit();
00345
00346
00347 afterPreviousFillEndTime = cond::time::pack( std::make_pair( cond::time::unpack( previousFillEndTime ).first, cond::time::unpack( previousFillEndTime ).second + 1 ) );
00348 beforeStableBeamStartTime = cond::time::pack( std::make_pair( cond::time::unpack( stableBeamStartTime ).first, cond::time::unpack( stableBeamStartTime ).second - 1 ) );
00349 if( afterPreviousFillEndTime < stableBeamStartTime ) {
00350 edm::LogInfo( m_name ) << "Entering fake fill between fill number " << previousFillNumber
00351 << " and current fill number " << currentFill
00352 << ", from " << afterPreviousFillEndTime
00353 << " ( " << boost::posix_time::to_iso_extended_string( cond::time::to_boost( afterPreviousFillEndTime ) )
00354 << " ) to " << beforeStableBeamStartTime
00355 << " ( " << boost::posix_time::to_iso_extended_string( cond::time::to_boost( beforeStableBeamStartTime ) )
00356 << " ); from " << m_name << "::getNewObjects";
00357 m_to_transfer.push_back( std::make_pair( new FillInfo(), afterPreviousFillEndTime ) );
00358 } else {
00359
00360 edm::LogError( m_name ) << "WRONG DATA! In the previous fill number " << previousFillNumber
00361 << " beams were dumped at timestamp " << boost::posix_time::to_iso_extended_string( cond::time::to_boost( previousFillEndTime ) )
00362 << ", which is not before the timestamp " << boost::posix_time::to_iso_extended_string( cond::time::to_boost( stableBeamStartTime ) )
00363 << " when current fill number " << currentFill
00364 << " entered stable beams. EXITING. from " << m_name << "::getNewObjects";
00365 return;
00366 }
00367
00368 FillInfo* fillInfo = new FillInfo( currentFill );
00369 fillInfo->setBeamInfo( const_cast<unsigned short const &>( bunches1 )
00370 , const_cast<unsigned short const &>( bunches2 )
00371 , const_cast<unsigned short const &>( collidingBunches )
00372 , const_cast<unsigned short const &>( targetBunches )
00373 , const_cast<FillInfo::FillTypeId const &>( fillType )
00374 , const_cast<FillInfo::ParticleTypeId const &>( particleType1 )
00375 , const_cast<FillInfo::ParticleTypeId const &>( particleType2 )
00376 , const_cast<float const &>( crossingAngle )
00377 , const_cast<float const &>( betastar )
00378 , const_cast<float const &>( intensityBeam1 )
00379 , const_cast<float const &>( intensityBeam2 )
00380 , const_cast<float const &>( energy )
00381 , const_cast<cond::Time_t const &>( creationTime )
00382 , const_cast<cond::Time_t const &>( stableBeamStartTime )
00383 , const_cast<cond::Time_t const &>( beamDumpTime )
00384 , const_cast<std::string const &>( injectionScheme )
00385 , const_cast<std::bitset<FillInfo::bunchSlots+1> const &>( bunchConfiguration1 )
00386 , const_cast<std::bitset<FillInfo::bunchSlots+1> const &>( bunchConfiguration2 )
00387 );
00388
00389 m_to_transfer.push_back( std::make_pair( (FillInfo*)fillInfo, stableBeamStartTime ) );
00390 edm::LogInfo( m_name ) << "The new payload to be inserted into tag " << tagInfo().name
00391 << " with validity " << stableBeamStartTime
00392 << " ( " << boost::posix_time::to_iso_extended_string( cond::time::to_boost( stableBeamStartTime ) )
00393 << " ) has values:\n" << *fillInfo
00394 << "from " << m_name << "::getNewObjects";
00395
00396 ss << " fill = " << currentFill
00397 << ";\tinjection scheme: " << injectionScheme
00398 << ";\tstart time: "
00399 << boost::posix_time::to_iso_extended_string( stableBeamStartTimeStamp.time() )
00400 << ";\tend time: "
00401 << boost::posix_time::to_iso_extended_string( beamDumpTimeStamp.time() )
00402 << "." << std::endl;
00403
00404 previousFillNumber = currentFill;
00405 previousFillEndTime = beamDumpTime;
00406 }
00407
00408 session.transaction().commit();
00409
00410 session.close();
00411
00412 dbConnection.close();
00413
00414 m_userTextLog = ss.str();
00415 edm::LogInfo( m_name ) << "Transferring " << m_to_transfer.size() << " payload(s); from " << m_name << "::getNewObjects";
00416 }
00417
00418 std::string FillInfoPopConSourceHandler::id() const {
00419 return m_name;
00420 }