12#include "HepMC/GenEvent.h"
14#include "HepMC/GenEvent.h"
15#include "HepMC/HEPEVT_Wrapper.h"
16#include "HepMC/IO_HEPEVT.h"
18#include "BesRndmGenSvc/IBesRndmGenSvc.h"
19#include "GaudiKernel/ISvcLocator.h"
20#include "GaudiKernel/MsgStream.h"
21#include "GaudiKernel/SmartDataPtr.h"
23#include "GeneratorObject/McGenEvent.h"
24#include "cfortran/cfortran.h"
31#define INPUT COMMON_BLOCK( INPUT_DEF, input )
37#define PCONST COMMON_BLOCK( PCONST_DEF, pconst )
43#define FINCUT COMMON_BLOCK( FINCUT_DEF, fincut )
51#define LOCALC COMMON_BLOCK( LOCALC_DEF, localc )
58#define COLCHC COMMON_BLOCK( COLCHC_DEF, colchc )
64#define DELPHC COMMON_BLOCK( DELPHC_DEF, delphc )
72#define XSECTC COMMON_BLOCK( XSECTC_DEF, xsectc )
78#define FLAGS COMMON_BLOCK( FLAGS_DEF, flags )
84 float P[5][4000],
V[5][4000];
86#define LUJETS COMMON_BLOCK( LUJETS_DEF, lujets )
90#define LUHEPC( ICONV ) CCALLSFSUB1( LUHEPC, luhepc, INT, ICONV )
93#define LULIST( ICONV ) CCALLSFSUB1( LULIST, lulist, INT, ICONV )
96#define HEPEVT_CLEAN() CCALLSFSUB0( HEPEVT_CLEAN, hepevt_clean )
99#define HEPEVT_PRINT() CCALLSFSUB0( HEPEVT_PRINT, hepevt_print )
102#define BDKRC( IDUMP ) CCALLSFSUB1( BDKRC, bdkrc, INT, IDUMP )
105#define FINISH( IN, SIGT, ER ) \
106 CCALLSFSUB3( FINISH, finish, PINT, PDOUBLE, PDOUBLE, IN, SIGT, ER )
108PROTOCCALLSFSUB4(
RLUXGO, rluxgo, INT, INT, INT, INT )
109#define RLUXGO( lux, ISEED, K1, K2 ) \
110 CCALLSFSUB4( RLUXGO, rluxgo, INT, INT, INT, INT, lux, ISEED, K1, K2 )
113#define GEN_INIT() CCALLSFSUB0( GEN_INIT, gen_init )
116#define GEN1EVT() CCALLSFSUB0( GEN1EVT, gen1evt )
127 : Algorithm( name, pSvcLocator ) {
129 declareProperty(
"CMEnergy", m_CMEnergy = 3.097 );
130 declareProperty(
"W2min", m_w2min = 0.02 );
131 declareProperty(
"EstimatedMaxWeight", m_ewe = 2.5 );
132 declareProperty(
"SoftPhotonMaxEnergy", m_kzero = 0.002 );
139 declareProperty(
"MaxNTry", m_maxNTry );
140 declareProperty(
"FinalState", m_ifinal );
141 declareProperty(
"MinTheta", m_tcmin );
142 declareProperty(
"MinMomentum", m_pcmin );
145 toRad =
M_PI / 180.0;
146 toDeg = 180.0 /
M_PI;
150 MsgStream log(
msgSvc(), name() );
151 log << MSG::WARNING <<
"BesBdkRc initialize" << endmsg;
153 static const bool CREATEIFNOTTHERE(
true );
154 StatusCode RndmStatus = service(
"BesRndmGenSvc", p_BesRndmGenSvc, CREATEIFNOTTHERE );
155 if ( !RndmStatus.isSuccess() || 0 == p_BesRndmGenSvc )
157 log << MSG::ERROR <<
" Could not initialize Random Number Service" << endmsg;
160 CLHEP::HepRandomEngine* engine = p_BesRndmGenSvc->GetEngine(
"BesBdkRc" );
161 engine->showStatus();
167 FINCUT.TCHMIN = m_tcmin * toRad;
171 DELPHC.MAXNTRY = m_maxNTry;
175 INPUT.EB = 0.5 * m_CMEnergy;
178 LOCALC.EBEAM = 0.5 * m_CMEnergy;
182 for (
int i = 0; i < 6; i++ )
LOCALC.QMASS[i] = qmass[i];
186 return StatusCode::SUCCESS;
190 MsgStream log(
msgSvc(), name() );
191 log << MSG::INFO <<
"BesBdkRc executing" << endmsg;
192 HepMC::HEPEVT_Wrapper::set_max_number_entries( 2000 );
193 HepMC::HEPEVT_Wrapper::set_sizeof_real( 8 );
194 HepMC::IO_HEPEVT HepEvtIO;
199 if (
FLAGS.GOODEVT != 1 )
201 log << MSG::ERROR <<
" BesBdkRc: fail to generate good event" << endl;
202 return StatusCode::FAILURE;
206 if ( log.level() < MSG::INFO )
LULIST( 1 );
209 HepMC::GenEvent* evt = HepEvtIO.read_next_event();
210 evt->set_event_number( m_numberEvent );
211 evt->set_signal_process_id( 1 );
214 SmartDataPtr<McGenEventCol> anMcCol( eventSvc(),
"/Event/Gen" );
218 MsgStream log(
msgSvc(), name() );
219 log << MSG::INFO <<
"Add McGenEvent to existing collection" << endmsg;
221 anMcCol->push_back( mcEvent );
228 mcColl->push_back( mcEvent );
229 StatusCode sc = eventSvc()->registerObject(
"/Event/Gen", mcColl );
230 if ( sc != StatusCode::SUCCESS )
232 log << MSG::ERROR <<
"Could not register McGenEvent" << endmsg;
236 return StatusCode::FAILURE;
242 return StatusCode::SUCCESS;
246 MsgStream log(
msgSvc(), name() );
247 log << MSG::INFO <<
"BesBdkRc finalized" << endmsg;
252 FINISH( itot, cstot, cserr );
259 effcut = float(
DELPHC.NEVCUT ) / float(
XSECTC.NEVUNW );
260 cscut = effcut * cstot;
261 efferr = sqrt( effcut * ( 1.0 - effcut ) /
float(
XSECTC.NEVUNW ) );
262 cscuterr = sqrt( cstot * efferr * cstot * efferr + effcut * effcut * cserr * cserr );
264 printf(
"BDKRC SUMMARY: Cross section after user cuts= %G +- %G nb\n", cscut, cscuterr );
265 printf(
" Cut acceptance = %G +- %G \n", effcut, efferr );
266 return StatusCode::SUCCESS;
#define RLUXGO(lux, ISEED, K1, K2)
COMMON_BLOCK_DEF(INPUT_DEF, INPUT)
#define FINISH(IN, SIGT, ER)
DECLARE_COMPONENT(BesBdkRc)
ObjectVector< McGenEvent > McGenEventCol
static void setRandomEngine(CLHEP::HepRandomEngine *randomEngine)
BesBdkRc(const std::string &name, ISvcLocator *pSvcLocator)
PROTOCCALLSFSUB3(INPUT, input, PLONG, PINT, PSTRING)
PROTOCCALLSFSUB1(RLXDRESETF, rlxdresetf, INTV)
PROTOCCALLSFSUB0(INITHISTO, inithisto)