45#include "DataInfoSvc/IDataInfoSvc.h"
46#include "EventModel/EventHeader.h"
47#include "GaudiKernel/SmartDataPtr.h"
48#include "HepMC/GenEvent.h"
49#include "HepMC/GenParticle.h"
50#include "HepMC/GenVertex.h"
53#include "GaudiKernel/DataSvc.h"
54#include "GaudiKernel/IPartPropSvc.h"
55#include "GaudiKernel/ISvcLocator.h"
56#include "GaudiKernel/MsgStream.h"
57#include "GaudiKernel/SmartDataPtr.h"
59#include "BesRndmGenSvc/IBesRndmGenSvc.h"
60#include "CLHEP/Random/RandFlat.h"
61#include "CLHEP/Random/Ranlux64Engine.h"
63#include "GeneratorObject/McGenEvent.h"
68static string mydecayrec;
69static double _amps_max;
79int EvtDecay::m_runNo = 0;
91 : Algorithm( name, pSvcLocator ) {
96 declareProperty(
"DecayDecDir", m_DecayDec =
"" );
97 declareProperty(
"PdtTableDir", m_PdtTable =
"" );
98 declareProperty(
"userDecayTableName", userDecFileName =
"NONE" );
99 declareProperty(
"DecayTopology",
101 declareProperty(
"DecayRecord",
104 declareProperty(
"ParentParticle",
105 m_ParentPart =
"NONE" );
107 declareProperty(
"Multiplicity", m_Ncharge =
false );
108 declareProperty(
"NutupleFile", m_NtupleFile =
false );
109 declareProperty(
"mDIY", _mDIY =
false );
110 declareProperty(
"FDPdata",
112 declareProperty(
"FDPHisT", m_SB3HT =
"" );
113 declareProperty(
"FDPpart",
114 m_FDPparticle =
"" );
115 declareProperty(
"TruthFile", m_truthFile =
"" );
116 declareProperty(
"TruthPart", m_truthPart =
"" );
117 declareProperty(
"Psi3SopenCharm", m_Psi4040OpenCharm =
false );
118 declareProperty(
"Psi2openCharm", m_Psi2openCharm =
false );
119 declareProperty(
"SetMthrForConExc", m_SetMthr = 0.0 );
120 declareProperty(
"statDecays", m_statDecays =
false );
121 declareProperty(
"TagLundCharmModel", m_tagLundModel =
false );
123 declareProperty(
"FileForTrackGen", m_mystring );
125 m_polarization.clear();
126 declareProperty(
"polarization", m_polarization );
127 declareProperty(
"eBeamPolarization", m_eBeamPolarization = -1 );
134 declareProperty(
"cluster0", m_cluster0 );
135 declareProperty(
"cluster1", m_cluster1 );
136 declareProperty(
"cluster2", m_cluster2 );
137 declareProperty(
"masswin0", m_wind0 );
138 declareProperty(
"masswin1", m_wind1 );
139 declareProperty(
"masswin2", m_wind2 );
140 declareProperty(
"OutputP4", m_outputp4 =
"" );
141 declareProperty(
"ReadMeasuredEcms", m_RdMeasuredEcms =
false );
142 declareProperty(
"beamEnergySpread", m_beamEnergySpread = 0 );
144 declareProperty(
"ReadTruthAtCM", _truthAtCM =
false );
145 declareProperty(
"ReadTruth", m_ReadTruth );
149 declareProperty(
"RvalueTag", _RvalueTag =
false );
150 declareProperty(
"PrintFSFor", m_printfs =
"" );
155 MsgStream log(
msgSvc(), name() );
158 system(
"cat $BESEVTGENROOT/share/phokhara_10.0.fferr>phokhara_10.0.fferr" );
161 system(
"cat $BESEVTGENROOT/share/phokhara_10.0.ffwarn>phokhara_10.0.ffwarn" );
166 if ( m_truthFile !=
"" ) { truth.open( m_truthFile.c_str() ); }
167 log << MSG::INFO <<
"EvtDecay initialize" << endmsg;
168 static const bool CREATEIFNOTTHERE(
true );
169 StatusCode RndmStatus = service(
"BesRndmGenSvc", p_BesRndmGenSvc, CREATEIFNOTTHERE );
170 if ( !RndmStatus.isSuccess() || 0 == p_BesRndmGenSvc )
172 log << MSG::ERROR <<
" Could not initialize Random Number Service" << endmsg;
177 for (
int i = 0; i < m_mystring.size(); i++ )
182 std::vector<std::vector<int>> myivv;
183 std::vector<std::vector<double>> mydvv;
187 myivv.push_back( m_cluster0 );
188 myivv.push_back( m_cluster1 );
189 myivv.push_back( m_cluster2 );
191 mydvv.push_back( m_wind0 );
192 mydvv.push_back( m_wind1 );
193 mydvv.push_back( m_wind2 );
195 for (
int i = 0; i < myivv.size(); i++ )
197 std::vector<int> theivv;
198 for (
int j = 0; j < myivv[i].size(); j++ ) { theivv.push_back( myivv[i][j] ); }
202 for (
int i = 0; i < mydvv.size(); i++ )
204 std::vector<double> thedvv;
205 for (
int j = 0; j < mydvv[i].size(); j++ ) { thedvv.push_back( mydvv[i][j] ); }
209 if ( m_eBeamPolarization > 1 )
211 std::cout <<
"The e-beam polaziation should be in 0 to 1" << std::endl;
216 m_ampscalflag =
true;
218 CLHEP::HepRandomEngine* engine = p_BesRndmGenSvc->GetEngine(
"EVTGEN" );
219 const long s = engine->getSeed();
220 p_BesRndmGenSvc->setGenseed(
s + 1 );
223 m_seeds.push_back(
s );
228 if ( m_DecayDec ==
"" )
230 m_DecayDec = getenv(
"BESEVTGENROOT" );
231 m_DecayDec +=
"/share/DECAY.DEC";
234 if ( m_PdtTable ==
"" )
236 m_PdtTable = getenv(
"BESEVTGENROOT" );
237 m_PdtTable +=
"/share/pdt.table";
241 std::cout <<
"===================== user decay card ========================" << std::endl;
242 strcpy( catcmd,
"cat " );
243 strcat( catcmd, userDecFileName.c_str() );
251 if ( status.isSuccess() )
253 log << MSG::INFO <<
"got the DataInfoSvc" << endmsg;
258 log << MSG::ERROR <<
"could not get the DataInfoSvc" << endmsg;
259 return StatusCode::FAILURE;
263 m_Gen =
new EvtGen( m_DecayDec.c_str(), m_PdtTable.c_str(), m_RandomEngine );
265 if ( userDecFileName ==
"NONE" )
266 log << MSG::INFO <<
"EvtDecay User did not define his Decay table EvtGen will use standart"
268 if ( !( userDecFileName ==
"NONE" ) ) m_Gen->readUDecay( userDecFileName.c_str() );
270 if ( !( m_DecayTop ==
" " ) ) { outfile.open( m_DecayTop.c_str() ); }
276 NTuplePtr nt1(
ntupleSvc(),
"MYROOTFILE/Trk" );
277 if ( nt1 ) { m_tuple = nt1; }
281 ntupleSvc()->book(
"MYROOTFILE/Trk", CLID_ColumnWiseTuple,
"Generator-trk-Ntuple" );
284 status = m_tuple->addItem(
"TotNumTrk", TotNumTrk, 0, 100 );
285 status = m_tuple->addIndexedItem(
"Trk_index", TotNumTrk, m_Trk_index );
286 status = m_tuple->addIndexedItem(
"m_px_trk", TotNumTrk, m_px_trk );
287 status = m_tuple->addIndexedItem(
"m_py_trk", TotNumTrk, m_py_trk );
288 status = m_tuple->addIndexedItem(
"m_pz_trk", TotNumTrk, m_pz_trk );
289 status = m_tuple->addIndexedItem(
"m_en_trk", TotNumTrk, m_en_trk );
290 status = m_tuple->addIndexedItem(
"FST", TotNumTrk, m_fst );
292 status = m_tuple->addItem(
"nchr", m_nchr );
293 status = m_tuple->addItem(
"nchr_e", m_nchr_e );
294 status = m_tuple->addItem(
"nchr_mu", m_nchr_mu );
295 status = m_tuple->addItem(
"nchr_pi", m_nchr_pi );
296 status = m_tuple->addItem(
"nchr_k", m_nchr_k );
297 status = m_tuple->addItem(
"nchr_p", m_nchr_p );
298 status = m_tuple->addItem(
"N_gamma", m_gamma );
299 status = m_tuple->addItem(
"N_gammaFSR", m_gammaFSR );
300 status = m_tuple->addItem(
"Flag1", m_flag1 );
304 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple ) << endmsg;
305 return StatusCode::FAILURE;
309 NTuplePtr nt2(
ntupleSvc(),
"MYROOTFILE/mass" );
310 if ( nt2 ) { mass_tuple = nt2; }
313 mass_tuple =
ntupleSvc()->book(
"MYROOTFILE/mass", CLID_ColumnWiseTuple,
314 "Generator-mass-Ntuple" );
317 status = mass_tuple->addItem(
"m12", m_m12 );
318 status = mass_tuple->addItem(
"m13", m_m13 );
319 status = mass_tuple->addItem(
"m23", m_m23 );
320 status = mass_tuple->addItem(
"m1", m_m1 );
321 status = mass_tuple->addItem(
"m2", m_m2 );
322 status = mass_tuple->addItem(
"m3", m_m3 );
323 status = mass_tuple->addItem(
"costheta1", m_cos1 );
324 status = mass_tuple->addItem(
"costheta2", m_cos2 );
325 status = mass_tuple->addItem(
"costheta3", m_cos3 );
326 status = mass_tuple->addItem(
"ichannel", m_ich );
330 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple ) << endmsg;
331 return StatusCode::FAILURE;
335 NTuplePtr nt3(
ntupleSvc(),
"MYROOTFILE/massGen" );
336 if ( nt3 ) { massgen_tuple = nt3; }
339 massgen_tuple =
ntupleSvc()->book(
"MYROOTFILE/massGen", CLID_ColumnWiseTuple,
340 "Generator-mass-Ntuple" );
343 status = massgen_tuple->addItem(
"m12", _m12 );
344 status = massgen_tuple->addItem(
"m13", _m13 );
345 status = massgen_tuple->addItem(
"m23", _m23 );
346 status = massgen_tuple->addItem(
"m1", _m1 );
347 status = massgen_tuple->addItem(
"m2", _m2 );
348 status = massgen_tuple->addItem(
"m3", _m3 );
349 status = massgen_tuple->addItem(
"costheta1", _cos1 );
350 status = massgen_tuple->addItem(
"costheta2", _cos2 );
351 status = massgen_tuple->addItem(
"costheta3", _cos3 );
352 status = massgen_tuple->addItem(
"ichannel", _ich );
356 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple ) << endmsg;
357 return StatusCode::FAILURE;
361 for (
int i = 0; i < 500; i++ ) { br[i] = 0; }
362 if ( !( m_SB3File ==
"" && m_SB3HT ==
"" ) )
364 const char *filename, *histitle;
365 filename = (
char*)m_SB3File.c_str();
366 histitle = (
char*)m_SB3HT.c_str();
367 SuperBody3decay.setFile( filename );
368 SuperBody3decay.setHTitle( histitle );
369 SuperBody3decay.init();
372 return StatusCode::SUCCESS;
379 MsgStream log(
msgSvc(), name() );
382 string key =
"GEN_EVENT";
384 SmartDataPtr<McGenEventCol> McEvtColl( eventSvc(),
"/Event/Gen" );
388 if ( McEvtColl == 0 )
391 HepMC::GenEvent* evt =
new GenEvent();
392 evt->set_event_number( m_numberEvent );
395 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
396 int runNo = eventHeader->runNumber();
397 int event = eventHeader->eventNumber();
404 else { newRunFlag =
false; }
405 if ( m_RdMeasuredEcms && newRunFlag )
412 std::cout <<
"Read Ecms= " << dbEcms << std::endl;
413 if ( dbEcms != 0 ) { std::cout <<
"INFO: Read the MeasuredEcms" << std::endl; }
416 std::cout <<
"ERROR: Can not read the MeasuredEcms, try to turn off the ReadEcmsDB"
418 return StatusCode::FAILURE;
424 callBesEvtGen( evt );
425 if ( !( m_DecayTop ==
"" ) ) evt->print( outfile );
430 mcColl->push_back( mcEvent );
431 StatusCode sc = eventSvc()->registerObject(
"/Event/Gen", mcColl );
432 if ( sc != StatusCode::SUCCESS )
return StatusCode::FAILURE;
438 McGenEventCol::iterator mcItr;
439 for ( mcItr = McEvtColl->begin(); mcItr != McEvtColl->end(); mcItr++ )
441 HepMC::GenEvent* hEvt = ( *mcItr )->getGenEvt();
446 if ( !( m_DecayTop ==
"" ) ) hEvt->print( outfile );
449 if ( !( m_DecayRec ==
"" ) ) std::cout << std::endl;
452 if ( m_NtupleFile ) { m_tuple->write(); }
456 std::cout <<
"helangs ";
457 for (
int i = 0; i < m_vangs.size(); i++ ) std::cout << m_vangs[i] <<
" ";
458 std::cout << std::endl;
460 return StatusCode::SUCCESS;
468StatusCode EvtDecay::callEvtGen( HepMC::GenEvent* hepMCevt ) {
469 MsgStream log(
msgSvc(), name() );
478 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
480 for (
int i = 0; i < 13; i++ )
fst[i] = 0;
481 HepMC::GenEvent::particle_const_iterator itp;
484 for ( itp = hepMCevt->particles_begin(); itp != hepMCevt->particles_end(); itp++ )
509 HepMC::GenParticle* hepMCpart = *itp;
510 int stat = hepMCpart->status();
512 if ( stat != 1 )
continue;
514 loop_to_select_eventsB:
515 int id = hepMCpart->pdg_id();
517 hepMCpart->set_status( 899 );
521 double en = ( hepMCpart->momentum() ).e();
522 double pex = ( hepMCpart->momentum() ).px();
523 double pey = ( hepMCpart->momentum() ).py();
524 double pez = ( hepMCpart->momentum() ).pz();
527 parentMass = p_init.mass();
533 bool parentFlag =
false;
536 if ( m_polarization.size() > 0 )
541 else if ( m_eBeamPolarization > 0 )
549 int id = hepMCpart->pdg_id();
556 if (
id == 11 ) {
fst[1]++; }
557 else if (
id == -11 ) {
fst[2]++; }
558 else if (
id == 13 ) {
fst[3]++; }
559 else if (
id == -13 ) {
fst[4]++; }
560 else if (
id == 211 ) {
fst[5]++; }
561 else if (
id == -211 ) {
fst[6]++; }
562 else if (
id == 321 ) {
fst[7]++; }
563 else if (
id == -321 ) {
fst[8]++; }
564 else if (
id == 2212 ) {
fst[9]++; }
565 else if (
id == -2212 ) {
fst[10]++; }
566 else if (
id == 2112 ) {
fst[11]++; }
567 else if (
id == -2112 ) {
fst[12]++; }
568 if ( fabs(
id ) == 11 ) {
nchr_e++; }
569 if ( fabs(
id ) == 13 ) {
nchr_mu++; }
570 if ( fabs(
id ) == 211 ) {
nchr_pi++; }
571 if ( fabs(
id ) == 321 ) {
nchr_k++; }
572 if ( fabs(
id ) == 2212 ) {
nchr_p++; }
575 if ( m_NtupleFile ==
true )
577 m_Trk_index[AllTrk_index] = id;
578 m_px_trk[AllTrk_index] = pex;
579 m_py_trk[AllTrk_index] = pey;
580 m_pz_trk[AllTrk_index] = pez;
581 m_en_trk[AllTrk_index] = en;
584 Trk_index[AllTrk_index] = 0;
590 EvtVector4R fdp_init;
592 if ( m_FDPparticle !=
"" )
604 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && parentFlag && first )
605 { SuperBody3decay_make( fdp_ppid, fdp_init ); }
607 loop_to_select_eventsA:
608 m_Gen->generateDecay( part );
609 if ( m_truthFile !=
"" && m_truthPart !=
"" )
614 for (
int id = 0;
id < ndaug;
id++ )
616 EvtParticle* sonp = part->
getDaug(
id );
617 EvtVector4R son = sonp->
getP4();
618 truth << son.
get( 0 ) <<
" " << son.get( 1 ) <<
" " << son.get( 2 ) <<
" "
619 << son.get( 3 ) << std::endl;
624 if ( _mDIY && parentFlag && m_ampscalflag ) _amps_max = CalAmpsMax( part );
625 if ( _mDIY && parentFlag )
628 double amps = CalAmpsMDIY( part );
629 ratio = amps / _amps_max;
631 if ( _mDIY && parentFlag && ratio <= rdm ) {
goto loop_to_select_eventsA; }
636 if ( m_FDPparticle ==
"" ) { FDP_part = part; }
637 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && parentFlag )
638 { accept = SuperBody3decay_judge( FDP_part ); }
639 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && parentFlag && !accept )
643 goto loop_to_select_eventsB;
645 else if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && parentFlag && accept )
646 { countChannel( FDP_part ); }
648 if ( ( m_Psi2openCharm || m_Psi4040OpenCharm ) && parentFlag )
650 if ( getModel( part ) ==
"OPENCHARM" )
653 <<
"OPENCHARM model need to set Psi2openCharm and Psi3SopenCharm to be false!"
657 EvtPsi3Sdecay opencharm( en, part );
658 bool theDecay = opencharm.choseDecay();
663 goto loop_to_select_eventsB;
672 EvtDecayTag theTag( part );
673 unsigned int modeTag, multiplicityTag;
674 modeTag = theTag.getModeTag();
675 if ( getModel( part ) ==
"OPENCHARM" ||
676 getModel( part ) ==
"LUNDCHARM" && m_tagLundModel )
678 multiplicityTag = decayType( part );
682 else { multiplicityTag = theTag.getMultTag() + decayType( part ); }
687 if ( eventHeader == 0 ) std::cout <<
"event header unavailable: " << std::endl;
688 if ( eventHeader != 0 )
690 eventHeader->setFlag1( modeTag );
691 eventHeader->setFlag2( multiplicityTag );
696 if ( !( m_DecayRec ==
"" ) ) mydecayrec = part->
writeTreeRec( m_DecayRec );
698 if ( m_statDecays && parentFlag ) countChannel( part );
701 if ( log.level() <= MSG::DEBUG ) part->
printTree();
702 log << MSG::DEBUG <<
"Converting particles to HepMC" << endmsg;
704 makeHepMC( part, hepMCevt, hepMCpart );
705 if ( part->
getNDaug() != 0 ) hepMCpart->set_status( 999 );
712 for (
int i = 0; i < nds; i++ )
716 std::cout <<
"vvpp " << vp1.
get( 0 ) <<
" " << vp1.
get( 1 ) <<
" " << vp1.
get( 2 )
717 <<
" " << vp1.
get( 3 ) << std::endl;
721 if ( m_ReadTruth.size() ) ReadTruth( part, m_ReadTruth );
727 for ( itp = hepMCevt->particles_begin(); itp != hepMCevt->particles_end(); ++itp )
729 if ( !( *itp )->end_vertex() &&
730 ( ( *itp )->status() == 899 || ( *itp )->status() == 999 ) )
731 ( *itp )->set_status( 1 );
735 if ( m_Ncharge ==
true )
737 std::cout <<
"Multiplicity: TotoalCharge_e_mu_pi_K_p_gamma_gammaFSR: " <<
nchr <<
" "
741 if ( m_Ncharge ==
true )
743 std::cout <<
"FinalStates: " <<
fst[0] <<
" " <<
fst[1] <<
" " <<
fst[2] <<
" " <<
fst[3]
744 <<
" " <<
fst[4] <<
" " <<
fst[5] <<
" " <<
fst[6] <<
" " <<
fst[7] <<
" "
745 <<
fst[8] <<
" " <<
fst[9] <<
" " <<
fst[10] <<
" " <<
fst[11] <<
" " <<
fst[12]
759 TotNumTrk = AllTrk_index;
763 return StatusCode::SUCCESS;
769StatusCode EvtDecay::callBesEvtGen( HepMC::GenEvent* hepMCevt ) {
770 MsgStream log(
msgSvc(), name() );
780 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
781 for (
int i = 0; i < 13; i++ )
fst[i] = 0;
782 HepMC::GenEvent::particle_const_iterator itp;
806loop_to_select_eventsB:
809 if ( m_RdMeasuredEcms && m_beamEnergySpread == 0 )
814 else if ( m_RdMeasuredEcms && m_beamEnergySpread != 0 )
816 double cmssig = sqrt( 2. ) * m_beamEnergySpread;
821 else if ( ( !m_RdMeasuredEcms ) && m_beamEnergySpread != 0 )
824 double cmssig = sqrt( 2. ) * m_beamEnergySpread;
829 else if ( ( !m_RdMeasuredEcms ) && m_beamEnergySpread == 0 )
835 std::cout <<
"EvtDecay::callBesEvtGen:: bad option" << std::endl;
845 EvtVector4R p_init( ppmass, 0.0, 0.0, 0.0 );
848 HepMC::GenParticle* hepMCpart =
849 new GenParticle( HepLorentzVector( 0, 0, 0, ppmass ), pid, 3 );
851 bool parentFlag =
false;
855 if ( m_polarization.size() > 0 )
859 else if ( m_eBeamPolarization > 0 )
867 EvtVector4R fdp_init;
869 if ( m_FDPparticle !=
"" )
881 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && first )
882 { SuperBody3decay_make( fdp_ppid, fdp_init ); }
885loop_to_select_events:
886 m_Gen->generateDecay( part );
887 if ( m_numberEvent <= 1 )
889 std::cout <<
"after m_Gen->decay " << std::endl;
894 if ( _mDIY && m_ampscalflag ) _amps_max = CalAmpsMax( part );
898 for (
int myloop = 0; myloop < 100; myloop++ )
900 m_Gen->generateDecay( part );
901 double amps = CalAmpsMDIY( part );
902 ratio = amps / _amps_max;
904 if ( !isNumber( amps ) || !isNumber( _amps_max ) || ratio <= 0 )
910 else if ( rdm <= ratio ) {
break; }
914 if ( m_truthFile !=
"" && m_truthPart !=
"" )
919 for (
int id = 0;
id < ndaug;
id++ )
921 EvtParticle* sonp = part->
getDaug(
id );
922 EvtVector4R son = sonp->
getP4();
923 truth << son.
get( 0 ) <<
" " << son.get( 1 ) <<
" " << son.get( 2 ) <<
" "
924 << son.get( 3 ) << std::endl;
930 if ( m_FDPparticle ==
"" ) { FDP_part = part; }
931 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) ) { accept = SuperBody3decay_judge( FDP_part ); }
932 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && !accept )
936 goto loop_to_select_eventsB;
938 else if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) && parentFlag && accept )
939 { countChannel( FDP_part ); }
943 if ( m_statDecays && parentFlag ) countChannel( part );
950 EvtDecayTag theTag( part );
951 unsigned int modeTag, multiplicityTag;
952 modeTag = theTag.getModeTag();
953 if ( getModel( part ) ==
"OPENCHARM" || getModel( part ) ==
"LUNDCHARM" && m_tagLundModel )
955 multiplicityTag = decayType( part );
959 else if ( _RvalueTag ) { multiplicityTag = decayType( part ); }
960 else { multiplicityTag = theTag.getMultTag() + decayType( part ); }
961 if ( eventHeader == 0 ) std::cout <<
"event header unavailable: " << std::endl;
962 if ( eventHeader != 0 )
964 eventHeader->setFlag1( modeTag );
965 eventHeader->setFlag2( multiplicityTag );
969 if ( m_NtupleFile ) m_flag1 = modeTag;
973 if ( !( m_DecayRec ==
"" ) )
976 std::cout << std::endl;
980 if ( log.level() <= MSG::DEBUG ) part->
printTree();
981 log << MSG::DEBUG <<
"Converting particles to HepMC" << endmsg;
983 makeHepMC( part, hepMCevt, hepMCpart );
985 if ( part->
getNDaug() != 0 ) hepMCpart->set_status( 999 );
991 std::cout <<
"_FinalState " << myd;
992 for (
int ii = 0; ii < myd; ii++ )
994 std::cout << std::endl;
998 for ( itp = hepMCevt->particles_begin(); itp != hepMCevt->particles_end(); ++itp )
1000 if ( !( *itp )->end_vertex() &&
1001 ( ( *itp )->status() == 899 || ( *itp )->status() == 999 ) )
1002 ( *itp )->set_status( 1 );
1004 HepMC::GenParticle* hepMCpart = *itp;
1005 int stat = hepMCpart->status();
1006 int id = hepMCpart->pdg_id();
1007 if (
abs(
id ) == 411 ||
abs(
id ) == 413 )
1009 ( *itp )->set_status( 999 );
1013 if ( stat != 1 )
continue;
1020 if (
id == 11 ) {
fst[1]++; }
1021 else if (
id == -11 ) {
fst[2]++; }
1022 else if (
id == 13 ) {
fst[3]++; }
1023 else if (
id == -13 ) {
fst[4]++; }
1024 else if (
id == 211 ) {
fst[5]++; }
1025 else if (
id == -211 ) {
fst[6]++; }
1026 else if (
id == 321 ) {
fst[7]++; }
1027 else if (
id == -321 ) {
fst[8]++; }
1028 else if (
id == 2212 ) {
fst[9]++; }
1029 else if (
id == -2212 ) {
fst[10]++; }
1030 else if (
id == 2112 ) {
fst[11]++; }
1031 else if (
id == -2112 ) {
fst[12]++; }
1032 if ( fabs(
id ) == 11 ) {
nchr_e++; }
1033 if ( fabs(
id ) == 13 ) {
nchr_mu++; }
1034 if ( fabs(
id ) == 211 ) {
nchr_pi++; }
1035 if ( fabs(
id ) == 321 ) {
nchr_k++; }
1036 if ( fabs(
id ) == 2212 ) {
nchr_p++; }
1039 double en = ( hepMCpart->momentum() ).e();
1040 double pex = ( hepMCpart->momentum() ).px();
1041 double pey = ( hepMCpart->momentum() ).py();
1042 double pez = ( hepMCpart->momentum() ).pz();
1044 if ( m_NtupleFile ==
true &&
id != 0 )
1046 m_Trk_index[AllTrk_index] = id;
1047 m_px_trk[AllTrk_index] = pex;
1048 m_py_trk[AllTrk_index] = pey;
1049 m_pz_trk[AllTrk_index] = pez;
1050 m_en_trk[AllTrk_index] = en;
1061 itp = hepMCevt->particles_begin();
1062 ( *itp )->set_status( 2 );
1066 if ( m_Ncharge ==
true )
1068 std::cout <<
"Multiplicity: TotoalCharge_e_mu_pi_K_p_gamma_gammaFSR: " <<
nchr <<
" "
1072 if ( m_Ncharge ==
true )
1074 std::cout <<
"FinalStates: " <<
fst[0] <<
" " <<
fst[1] <<
" " <<
fst[2] <<
" " <<
fst[3]
1075 <<
" " <<
fst[4] <<
" " <<
fst[5] <<
" " <<
fst[6] <<
" " <<
fst[7] <<
" "
1076 <<
fst[8] <<
" " <<
fst[9] <<
" " <<
fst[10] <<
" " <<
fst[11] <<
" " <<
fst[12]
1091 TotNumTrk = AllTrk_index;
1095 if ( m_ReadTruth.size() ) ReadTruth( part, m_ReadTruth );
1101 return StatusCode::SUCCESS;
1116 std::cout <<
"Calculated helicity amplitude sqaured are:" << std::endl;
1117 std::cout <<
"|H_{2}|^2=|H_{-2}|^2= " << H2 / nd <<
" +/- " << sqrt( H2err / nd ) << endl;
1118 std::cout <<
"|H_{1}|^2=|H_{-1}|^2= " << H1 / nd <<
" +/- " << sqrt( H1err / nd ) << endl;
1121 MsgStream log(
msgSvc(), name() );
1123 log << MSG::INFO <<
"EvtDecay finalized" << endmsg;
1125 Forfile.open(
"fort.16", ios::in );
1127 strcpy( delcmd,
"rm -f " );
1128 strcat( delcmd,
"fort.16" );
1132 Forfile2.open(
"fort.22", ios::in );
1133 strcpy( delcmd,
"rm -f " );
1134 strcat( delcmd,
"fort.22" );
1144 if ( !( m_SB3File ==
"" || m_SB3HT ==
"" ) )
1146 for (
int i = 0; i < 500; i++ ) { totalEvt = totalEvt + br[i]; }
1147 for (
int i = 0; i < 500; i++ )
1149 double bi = 1.0 * br[i] / totalEvt;
1150 std::cout <<
"Branching fraction of channel " << i <<
" is: " << bi << std::endl;
1151 if ( br[i] == 0 )
break;
1158 for (
int i = 0; i <= totalChannels; i++ ) { totalEvt = totalEvt + br[i]; }
1160 <<
"==================Statistical first chain decay ==============================="
1163 <<
"i-th channel Events Generated Branching fraction generated "
1165 for (
int i = 0; i <= totalChannels; i++ )
1167 std::cout <<
"| " << i <<
" " << br[i] <<
" "
1168 << br[i] * 1.0 / totalEvt << std::endl;
1171 <<
"--------------------------------------------------------------------------------"
1173 std::cout <<
" sum: " << totalEvt <<
" "
1174 <<
"1" << std::endl;
1176 <<
"================== End of statistical first chain decay ========================"
1180 return StatusCode::SUCCESS;
1183StatusCode EvtDecay::makeHepMC(
EvtParticle* part, HepMC::GenEvent* hEvt,
1184 HepMC::GenParticle* hPart ) {
1185 MsgStream log(
msgSvc(), name() );
1189 double ct = ( part->
getDaug( 0 )->get4Pos() ).get( 0 );
1190 double x = ( part->
getDaug( 0 )->get4Pos() ).get( 1 );
1191 double y = ( part->
getDaug( 0 )->get4Pos() ).get( 2 );
1192 double z = ( part->
getDaug( 0 )->get4Pos() ).get( 3 );
1194 HepMC::GenVertex* end_vtx =
new HepMC::GenVertex( HepLorentzVector( x, y, z, ct ) );
1195 hEvt->add_vertex( end_vtx );
1196 end_vtx->add_particle_in( hPart );
1200 for (
int it = 0; it < ndaug; it++ )
1203 double e = ( part->
getDaug( it )->getP4Lab() ).get( 0 );
1204 double px = ( part->
getDaug( it )->getP4Lab() ).get( 1 );
1205 double py = ( part->
getDaug( it )->getP4Lab() ).get( 2 );
1206 double pz = ( part->
getDaug( it )->getP4Lab() ).get( 3 );
1212 std::cout <<
"EvtDecay::makeHepMC: id=0, skip this particle" << std::endl;
1218 HepMC::GenParticle* prod_part =
1219 new HepMC::GenParticle( HepLorentzVector( px, py, pz, e ),
id, status );
1220 end_vtx->add_particle_out( prod_part );
1221 makeHepMC( part->
getDaug( it ), hEvt, prod_part );
1223 if ( log.level() < MSG::INFO ) prod_part->print();
1227 return StatusCode::SUCCESS;
1230void EvtDecay::MeVToGeV( HepMC::GenEvent* evt ) {
1231 for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin();
1232 p != evt->particles_end(); ++p )
1237 HepMC::FourVector tmpfv( ( *p )->momentum().x() / 1000., ( *p )->momentum().y() / 1000.,
1238 ( *p )->momentum().z() / 1000., ( *p )->momentum().t() / 1000. );
1240 ( *p )->set_momentum( tmpfv );
1244void EvtDecay::GeVToMeV( HepMC::GenEvent* evt ) {
1245 for ( HepMC::GenEvent::particle_iterator p = evt->particles_begin();
1246 p != evt->particles_end(); ++p )
1250 HepMC::FourVector tmpfv( ( *p )->momentum().x() * 1000., ( *p )->momentum().y() * 1000.,
1251 ( *p )->momentum().z() * 1000., ( *p )->momentum().t() * 1000. );
1253 ( *p )->set_momentum( tmpfv );
1258 double amps_max = 0;
1259 for (
int i = 0; i < 100000; i++ )
1261 m_Gen->generateDecay( part );
1262 double amps = CalAmpsMDIY( part );
1263 if ( amps > amps_max ) amps_max = amps;
1265 amps_max = amps_max * 1.05;
1266 m_ampscalflag =
false;
1274 m_engine->showStatus();
1281 double rdm = RandFlat::shoot( m_engine );
1288 double xmass2, ymass2;
1293 FinalState_make( ppid, p_init );
1296 for (
int i = 0; i < 100000; i++ )
1300 HepMC::GenParticle* hepMCpart =
1301 new GenParticle( HepLorentzVector( 0, 0, 0, parentMass ), parentPDGcode,
1305 m_Gen->generateDecay( part );
1307 FinalState_sort( part );
1315 xmass2 = ( pd1 + pd2 ).mass2();
1316 ymass2 = ( pd1 + pd3 ).mass2();
1317 double xlow = SuperBody3decay.getXlow();
1318 double xup = SuperBody3decay.getXup();
1319 double ylow = SuperBody3decay.getYlow();
1320 double yup = SuperBody3decay.getYup();
1321 if ( xmass2 < xlow || xmass2 >
xup || ymass2 < ylow || ymass2 > yup )
1326 SuperBody3decay.HFill( xmass2, ymass2 );
1334 m_m12 = ( pd1 + pd2 ).
mass();
1335 m_m23 = ( pd2 + pd3 ).
mass();
1336 m_m13 = ( pd1 + pd3 ).
mass();
1337 m_cos1 = pd1.
get( 3 ) / pd1.
d3mag();
1338 m_cos2 = pd2.
get( 3 ) / pd2.
d3mag();
1339 m_cos3 = pd3.
get( 3 ) / pd3.
d3mag();
1340 mass_tuple->write();
1344 double m3 = pd3.
mass();
1345 double mj = ( pd2 + pd3 ).
mass();
1350 SuperBody3decay.HReweight();
1351 SuperBody3decay.setZmax();
1355bool EvtDecay::SuperBody3decay_judge(
EvtParticle* part ) {
1356 double xmass2, ymass2;
1358 EvtVector4R pd1, pd2, pd3;
1360 FinalState_sort( part );
1366 xmass2 = ( pd1 + pd2 ).mass2();
1367 ymass2 = ( pd1 + pd3 ).mass2();
1368 accept = SuperBody3decay.AR( xmass2, ymass2 );
1371 if ( accept && m_NtupleFile )
1377 _m12 = ( pd1 + pd2 ).
mass();
1378 _m23 = ( pd2 + pd3 ).
mass();
1379 _m13 = ( pd1 + pd3 ).
mass();
1380 _cos1 = pd1.
get( 3 ) / pd1.
d3mag();
1381 _cos2 = pd2.
get( 3 ) / pd2.
d3mag();
1382 _cos3 = pd3.
get( 3 ) / pd3.
d3mag();
1383 massgen_tuple->write();
1393 identical_flag =
true;
1395 for (
int i = 1; i < 10000; i++ )
1398 HepMC::GenParticle* hepMCpart =
1399 new GenParticle( HepLorentzVector( 0, 0, 0, parentMass ), parentPDGcode, 3 );
1401 m_Gen->generateDecay( part );
1404 if ( nson == 2 ) {
continue; }
1405 else if ( nson == 3 )
1407 EvtId xid0, xid1, xid2;
1417 if ( pdg0 == pdg1 && pdg1 == pdg2 ) { multi = 3; }
1418 else if ( pdg0 == pdg1 ) { multi = 2; }
1419 else if ( pdg0 == pdg2 )
1426 else if ( pdg1 == pdg2 )
1439 std::cout <<
"No direct three body decay channel found in decay card, I stop run"
1448void EvtDecay::FinalState_sort(
EvtParticle* part ) {
1450 EvtVector4R pd0, pd1, pd2;
1451 EvtId xid0, xid1, xid2;
1465 else if ( nson == 3 )
1484 assign_momentum( id0, pd0 );
1485 assign_momentum( id1, pd1 );
1486 assign_momentum( id2, pd2 );
1488 else if ( multi == 2 )
1490 assign_momentum2( id0, pd0 );
1491 assign_momentum2( id1, pd1 );
1492 assign_momentum2( id2, pd2 );
1493 if ( son0.get( 0 ) > son1.get( 0 ) )
1500 else if ( multi == 3 )
1502 double En0 = pd0.
get( 0 );
1503 double En1 = pd1.
get( 0 );
1504 double En2 = pd2.
get( 0 );
1505 if ( En0 < En1 && En1 < En2 )
1511 if ( En0 < En2 && En2 < En1 )
1517 if ( En1 < En0 && En0 < En2 )
1523 if ( En1 < En2 && En2 < En0 )
1529 if ( En2 < En0 && En0 < En1 )
1535 if ( En2 < En1 && En1 < En0 )
1544void EvtDecay::assign_momentum(
int id0,
EvtVector4R pd0 ) {
1545 if ( id0 == pdg0 ) { son0 = pd0; }
1546 else if ( id0 == pdg1 ) { son1 = pd0; }
1547 else if ( id0 == pdg2 ) { son2 = pd0; }
1550 std::cout <<
"PID= " << id0 <<
" not machted, I stop" << std::endl;
1555void EvtDecay::assign_momentum2(
int id0,
1557 if ( id0 == pdg0 && identical_flag )
1560 identical_flag =
false;
1562 else if ( id0 == pdg1 )
1565 identical_flag =
true;
1567 else if ( id0 == pdg2 ) { son2 = pd0; }
1570 std::cout <<
"PID not machted, I stop" << std::endl;
1579 m_Gen->generateDecay( part );
1584 for (
int i = 0; i < dn; i++ )
1586 EvtParticle* part1 = part->
getDaug( i );
1587 EvtId sonid = part1->
getId();
1589 if ( son_pdg == FDP_pdg )
1595 else { findPart( part1 ); }
1608 if ( ich > totalChannels ) totalChannels = ich;
1612bool EvtDecay::isCharmonium(
EvtId xid ) {
1613 EvtId psi4415 =
EvtPDL::getId( std::string(
"psi(4415)" ) );
1614 EvtId psi4160 =
EvtPDL::getId( std::string(
"psi(4160)" ) );
1615 EvtId psi4040 =
EvtPDL::getId( std::string(
"psi(4040)" ) );
1616 EvtId psi3770 =
EvtPDL::getId( std::string(
"psi(3770)" ) );
1628 std::vector<EvtId> Vid;
1630 Vid.push_back( psi4415 );
1631 Vid.push_back( psi4160 );
1632 Vid.push_back( psi4040 );
1633 Vid.push_back( psi3770 );
1634 Vid.push_back( psiprim );
1635 Vid.push_back( jpsi );
1636 Vid.push_back( etac );
1637 Vid.push_back( etac2s );
1638 Vid.push_back( hc );
1639 Vid.push_back( chic0 );
1640 Vid.push_back( chic1 );
1641 Vid.push_back( chic2 );
1642 Vid.push_back( chic0p );
1643 Vid.push_back( chic1p );
1644 Vid.push_back( chic2p );
1647 for (
int i = 0; i < Vid.size(); i++ )
1649 if ( xid == Vid[i] )
return flag;
1654bool EvtDecay::isCharm(
EvtId xid ) {
1672 std::vector<EvtId> Vid;
1674 Vid.push_back( d0 );
1675 Vid.push_back( d0bar );
1676 Vid.push_back( dp );
1677 Vid.push_back( dm );
1678 Vid.push_back( d0h );
1679 Vid.push_back( d0l );
1680 Vid.push_back( dstp );
1681 Vid.push_back( dstm );
1682 Vid.push_back( ds0 );
1683 Vid.push_back( ds0bar );
1684 Vid.push_back( dsp );
1685 Vid.push_back( dsm );
1686 Vid.push_back( dsstp );
1687 Vid.push_back( dsstm );
1688 Vid.push_back( ds0stp );
1689 Vid.push_back( ds0stm );
1692 for (
int i = 0; i < Vid.size(); i++ )
1694 if ( xid == Vid[i] )
return flag;
1701 for (
int i = 0; i < ndg; i++ )
1721 if ( _RvalueTag ) {
return Nchannel; }
1724 std::string model = getModel( par, Nchannel );
1725 if ( model ==
"OPENCHARM" || model ==
"LUNDCHARM" && m_tagLundModel )
1733 for (
int i = 0; i < ndg; i++ )
1739 if ( isRadecay( par ) )
1741 for (
int i = 0; i < ndg; i++ )
1744 if ( isCharmonium( xid ) )
return 1;
1750 if ( ndg - nfsr == 2 )
1755 if ( isCharm( xd1 ) && isCharm( xd2 ) ) {
return 2; }
1756 else if ( !isCharmonium( xd1 ) && !isCharmonium( xd2 ) && !isCharm( xd1 ) &&
1764 for (
int i = 0; i < ndg; i++ )
1767 if ( isCharmonium( xid ) )
1772 if ( isCharm( xid ) )
1778 if ( !
flag ) {
return 3; }
1784std::string EvtDecay::getModel(
EvtParticle* par,
int mode ) {
1789std::string EvtDecay::getModel(
EvtParticle* par ) {
1795void EvtDecay::ReadTruth(
EvtParticle* part, std::vector<std::vector<string>> mylist ) {
1796 if ( mylist.size() < 2 )
1798 std::cout <<
" Empty list" << std::endl;
1802 for (
int k = 0; k < mylist[0].size(); k++ )
1816 for (
int i = 1; i < mylist.size(); i++ )
1818 EvtParticle* mypart = part;
1819 for (
int j = 0; j < mylist[i].size(); j++ )
1821 mypart = mypart->
getDaug( atoi( mylist[i][j].
c_str() ) );
1826 if ( _truthAtCM ) { vp1 = mypart->
getP4(); }
1828 if ( !isNumber( vp1.
get( 0 ) ) )
1835 printf(
"truth %.12lf %.12lf %.12lf %.12lf \n", vp1.
get( 0 ), vp1.
get( 1 ),
1836 vp1.
get( 2 ), vp1.
get( 3 ) );
1842int EvtDecay::isNumber(
double d ) {
1852 for (
int i = 0; i <
n; i++ )
1857 double eta = sqrt(
n * 12.0 ) * ( ri / 12 - 0.5 );
1858 double xsig = sigma * eta + mu;
1861 if ( xsig < mx0 || xsig > mx1 )
goto rloop;
1865#include "../user/Lenu.inc"
DECLARE_COMPONENT(BesBdkRc)
ObjectVector< McGenEvent > McGenEventCol
DOUBLE_PRECISION xlow[20]
*************DOUBLE PRECISION m_pi *DOUBLE PRECISION m_HvecTau2 DOUBLE PRECISION m_HvClone2 DOUBLE PRECISION m_gamma1 DOUBLE PRECISION m_gamma2 DOUBLE PRECISION m_thet1 DOUBLE PRECISION m_thet2 INTEGER m_IFPHOT *COMMON c_Taupair $ !Spin Polarimeter vector first Tau $ !Spin Polarimeter vector second Tau $ !Clone Spin Polarimeter vector first Tau $ !Clone Spin Polarimeter vector second Tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !phi of HvecTau1 $ !theta of HvecTau1 $ !phi of HvecTau2 $ !theta of HvecTau2 $ !super key
EvtBesRandom(HepRandomEngine *engine)
std::string getModelName()
static EvtDecayBase * gettheDecay(EvtId parent, int imode)
EvtDecay(const string &name, ISvcLocator *pSvcLocator)
IDataInfoSvc * dataInfoSvc
double energySpread(double mu, double sigma)
static std::vector< std::string > SV
static std::vector< std::vector< double > > dVV
static std::vector< std::vector< int > > iVV
static int getStdHep(EvtId id)
static void reSetMass(EvtId i, double mass)
static EvtId evtIdFromStdHep(int stdhep)
static std::string name(EvtId i)
static double getMass(EvtId i)
static EvtId getId(const std::string &name)
static EvtParticle * particleFactory(EvtSpinType::spintype spinType)
void setVectorSpinDensity()
static int _NextLevelDauNum
void setPolarizedSpinDensity(double r00, double r11, double r22)
EvtSpinType::spintype getSpinType() const
const EvtVector4R & getP4() const
EvtParticle * getDaug(int i)
std::string writeTreeRec(std::string) const