Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F19300939
D36.1759167899.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
14 KB
Referenced Files
None
Subscribers
None
D36.1759167899.diff
View Options
diff --git a/EvtGenBase/EvtGenKine.hh b/EvtGenBase/EvtGenKine.hh
--- a/EvtGenBase/EvtGenKine.hh
+++ b/EvtGenBase/EvtGenKine.hh
@@ -22,6 +22,7 @@
#define EVTGENKINE_HH
class EvtVector4R;
+class EvtParticle;
class EvtGenKine {
public:
@@ -30,6 +31,14 @@
static double PhaseSpacePole( double M, double m1, double m2, double m3,
double a, EvtVector4R p4[10] );
+
+ /*
+ * Function which takes two invariant masses squared in 3-body decay and
+ * parent after makeDaughters() and generateMassTree() and
+ * calculates/generates momenta of daughters and sets those.
+ */
+ static void ThreeBodyKine( const double m12Sq, const double m23Sq,
+ EvtParticle* p );
};
#endif
diff --git a/EvtGenModels/EvtFlatSqDalitz.hh b/EvtGenModels/EvtFlatSqDalitz.hh
--- a/EvtGenModels/EvtFlatSqDalitz.hh
+++ b/EvtGenModels/EvtFlatSqDalitz.hh
@@ -40,6 +40,12 @@
void initProbMax() override;
void decay( EvtParticle* p ) override;
+
+ private:
+ double m_mPrimeMin{ 0. };
+ double m_mPrimeMax{ 1. };
+ double m_thetaPrimeMin{ 0. };
+ double m_thetaPrimeMax{ 1. };
};
#endif
diff --git a/src/EvtGenBase/EvtGenKine.cpp b/src/EvtGenBase/EvtGenKine.cpp
--- a/src/EvtGenBase/EvtGenKine.cpp
+++ b/src/EvtGenBase/EvtGenKine.cpp
@@ -25,6 +25,7 @@
#include "EvtGenBase/EvtRandom.hh"
#include "EvtGenBase/EvtReport.hh"
#include "EvtGenBase/EvtVector4R.hh"
+#include "EvtGenBase/EvtParticle.hh"
#include <iostream>
#include <math.h>
@@ -340,3 +341,58 @@
return 1.0 + a / ( m12sq * m12sq );
}
+
+/*
+ * Function which takes two invariant masses squared in 3-body decay and
+ * parent after makeDaughters() and generateMassTree() and
+ * calculates/generates momenta of daughters and sets those.
+ */
+void EvtGenKine::ThreeBodyKine( const double m12Sq, const double m23Sq,
+ EvtParticle* p )
+{
+ const double mParent = p->mass();
+ EvtParticle* daug1 = p->getDaug( 0 );
+ EvtParticle* daug2 = p->getDaug( 1 );
+ EvtParticle* daug3 = p->getDaug( 2 );
+ const double mDaug1 = daug1->mass();
+ const double mDaug2 = daug2->mass();
+ const double mDaug3 = daug3->mass();
+
+ const double En1 = 0.5 * ( mParent * mParent + mDaug1 * mDaug1 - m23Sq ) /
+ mParent;
+ const double En3 = 0.5 * ( mParent * mParent + mDaug3 * mDaug3 - m12Sq ) /
+ mParent;
+ const double En2 = mParent - En1 - En3;
+ const double p1mag = std::sqrt( En1 * En1 - mDaug1 * mDaug1 );
+ const double p2mag = std::sqrt( En2 * En2 - mDaug2 * mDaug2 );
+ double cosPhi = 0.5 *
+ ( mDaug1 * mDaug1 + mDaug2 * mDaug2 + 2 * En1 * En2 - m12Sq ) /
+ p1mag / p2mag;
+
+ double sinPhi = std::sqrt( 1 - cosPhi * cosPhi );
+ if ( EvtRandom::Flat( 0., 1. ) > 0.5 ) {
+ sinPhi *= -1;
+ }
+ const double p2x = p2mag * cosPhi;
+ const double p2y = p2mag * sinPhi;
+ const double p3x = -p1mag - p2x;
+ const double p3y = -p2y;
+
+ // Construct 4-momenta and rotate them randomly in space
+ EvtVector4R p1( En1, p1mag, 0., 0. );
+ EvtVector4R p2( En2, p2x, p2y, 0. );
+ EvtVector4R p3( En3, p3x, p3y, 0. );
+ const double euler1 = EvtRandom::Flat( 0., EvtConst::twoPi );
+ const double euler2 = std::acos( EvtRandom::Flat( -1.0, 1.0 ) );
+ const double euler3 = EvtRandom::Flat( 0., EvtConst::twoPi );
+ p1.applyRotateEuler( euler1, euler2, euler3 );
+ p2.applyRotateEuler( euler1, euler2, euler3 );
+ p3.applyRotateEuler( euler1, euler2, euler3 );
+
+ // set momenta for daughters
+ daug1->init( daug1->getId(), p1 );
+ daug2->init( daug2->getId(), p2 );
+ daug3->init( daug3->getId(), p3 );
+
+ return;
+}
diff --git a/src/EvtGenModels/EvtFlatSqDalitz.cpp b/src/EvtGenModels/EvtFlatSqDalitz.cpp
--- a/src/EvtGenModels/EvtFlatSqDalitz.cpp
+++ b/src/EvtGenModels/EvtFlatSqDalitz.cpp
@@ -20,14 +20,13 @@
#include "EvtGenModels/EvtFlatSqDalitz.hh"
-#include "EvtGenBase/EvtDiracSpinor.hh"
#include "EvtGenBase/EvtGenKine.hh"
#include "EvtGenBase/EvtPDL.hh"
#include "EvtGenBase/EvtParticle.hh"
#include "EvtGenBase/EvtPatches.hh"
#include "EvtGenBase/EvtReport.hh"
-#include "EvtGenBase/EvtTensor4C.hh"
-#include "EvtGenBase/EvtVector4C.hh"
+#include "EvtGenBase/EvtConst.hh"
+#include "EvtGenBase/EvtRandom.hh"
#include <fstream>
#include <stdio.h>
@@ -51,72 +50,65 @@
void EvtFlatSqDalitz::initProbMax()
{
- setProbMax( 1. );
+ noProbMax();
}
void EvtFlatSqDalitz::init()
{
- // check that there are 0 arguments
- checkNArg( 0 );
-
//check there are 3 daughters
checkNDaug( 3 );
+
+ // check that there are 0 arguments
+ checkNArg( 0, 2, 4 );
+
+ if ( getNArg() > 0 ) {
+ m_mPrimeMin = getArg( 0 );
+ m_mPrimeMax = getArg( 1 );
+ }
+ if ( getNArg() > 2 ) {
+ m_thetaPrimeMin = getArg( 2 );
+ m_thetaPrimeMax = getArg( 3 );
+ }
}
void EvtFlatSqDalitz::decay( EvtParticle* p )
{
- p->initializePhaseSpace( getNDaug(), getDaugs() );
-
- double mB = p->mass();
- double m1 = p->getDaug( 0 )->mass();
- double m2 = p->getDaug( 1 )->mass();
- double m3 = p->getDaug( 2 )->mass();
-
- EvtVector4R p4_1 = p->getDaug( 0 )->getP4();
- EvtVector4R p4_2 = p->getDaug( 1 )->getP4();
- EvtVector4R p4_3 = p->getDaug( 2 )->getP4();
-
- EvtVector4R p4_12 = p4_1 + p4_2;
- EvtVector4R p4_13 = p4_1 + p4_3;
- // do not compute p4_23 to avoid breaking p4 conservation ???
- EvtVector4R p4_23 = p4_2 + p4_3;
-
- double m12 = p4_12.mass();
- double m13 = p4_13.mass();
- double m23 = p4_23.mass();
-
- double m12norm = 2 * ( ( m12 - ( m1 + m2 ) ) / ( mB - ( m1 + m2 + m3 ) ) ) -
- 1;
- double mPrime = acos( m12norm ) / EvtConst::pi;
- double thPrime = acos( ( m12 * m12 * ( m23 * m23 - m13 * m13 ) -
- ( m2 * m2 - m1 * m1 ) * ( mB * mB - m3 * m3 ) ) /
- ( sqrt( pow( m12 * m12 + m1 * m1 - m2 * m2, 2 ) -
- 4 * m12 * m12 * m1 * m1 ) *
- sqrt( pow( -m12 * m12 + mB * mB - m3 * m3, 2 ) -
- 4 * m12 * m12 * m3 * m3 ) ) ) /
- EvtConst::pi;
-
- double p3st = sqrt( pow( mB * mB - m3 * m3 - m12 * m12, 2 ) -
- pow( 2 * m12 * m3, 2 ) ) /
- ( 2 * m12 );
- double p1st = sqrt( pow( m2 * m2 - m1 * m1 - m12 * m12, 2 ) -
- pow( 2 * m12 * m1, 2 ) ) /
- ( 2 * m12 );
-
- double jacobian = 2 * pow( EvtConst::pi, 2 ) * sin( EvtConst::pi * mPrime ) *
- sin( EvtConst::pi * thPrime ) * p1st * p3st * m12 *
- ( mB - ( m1 + m2 + m3 ) );
-
- double prob = 1. / jacobian; //pow(1./(jacobian),2);
-
- // std::cout << mB << " " << mPrime << " " << thPrime << " " << prob << std::endl;
-
- setProb( prob );
-
- if ( prob < 1 )
- setProb( prob );
- else
- setProb( 1. );
+ p->makeDaughters( getNDaug(), getDaugs() );
+ p->generateMassTree();
+ const double mParent = p->mass();
+ EvtParticle* daug1 = p->getDaug( 0 );
+ EvtParticle* daug2 = p->getDaug( 1 );
+ EvtParticle* daug3 = p->getDaug( 2 );
+ const double mDaug1 = daug1->mass();
+ const double mDaug2 = daug2->mass();
+ const double mDaug3 = daug3->mass();
+
+ // Generate m' and theta'
+ const double mPrime = EvtRandom::Flat( m_mPrimeMin, m_mPrimeMax );
+ const double thetaPrime = EvtRandom::Flat( m_thetaPrimeMin, m_thetaPrimeMax );
+
+ // calculate m12 and m23
+ const double m12 = 0.5 * ( std::cos( mPrime * EvtConst::pi ) + 1 ) *
+ ( mParent - ( mDaug1 + mDaug2 + mDaug3 ) ) +
+ mDaug1 + mDaug2;
+ const double m12Sq = m12 * m12;
+
+ const double part1 = std::sqrt(
+ -4 * mDaug1 * mDaug1 * m12Sq +
+ std::pow( mDaug1 * mDaug1 + m12Sq - mDaug2 * mDaug2, 2 ) );
+ const double part2 = std::sqrt(
+ -4 * mDaug3 * mDaug3 * m12Sq +
+ std::pow( -mDaug3 * mDaug3 - m12Sq + mParent * mParent, 2 ) );
+ const double m23Sq =
+ 0.5 * ( ( ( mDaug2 * mDaug2 - mDaug1 * mDaug1 ) *
+ ( mParent * mParent - mDaug3 * mDaug3 ) +
+ part1 * part2 * std::cos( EvtConst::pi * thetaPrime ) ) /
+ m12Sq +
+ mParent * mParent + mDaug1 * mDaug1 + mDaug2 * mDaug2 +
+ mDaug3 * mDaug3 - m12Sq );
+
+ // Turn m12 and m23 into momenta
+ EvtGenKine::ThreeBodyKine(m12Sq, m23Sq, p);
return;
}
diff --git a/src/EvtGenModels/EvtThreeBodyPhsp.cpp b/src/EvtGenModels/EvtThreeBodyPhsp.cpp
--- a/src/EvtGenModels/EvtThreeBodyPhsp.cpp
+++ b/src/EvtGenModels/EvtThreeBodyPhsp.cpp
@@ -24,6 +24,7 @@
#include "EvtGenBase/EvtReport.hh"
#include "EvtGenBase/EvtConst.hh"
#include "EvtGenBase/EvtRandom.hh"
+#include "EvtGenBase/EvtGenKine.hh"
#include <iostream>
#include <algorithm>
@@ -115,42 +116,7 @@
}
// At this moment we have valid invariant masses squared
- const double En1 = 0.5 * ( mParent * mParent + mDaug1 * mDaug1 - m23Sq ) / mParent;
- const double En3 = 0.5 * ( mParent * mParent + mDaug3 * mDaug3 - m12Sq ) / mParent;
- const double En2 = mParent - En1 - En3;
- const double p1mag = std::sqrt( En1 * En1 - mDaug1 * mDaug1 );
- const double p2mag = std::sqrt( En2 * En2 - mDaug2 * mDaug2 );
- double cosPhi = 0.5 * ( mDaug1 * mDaug1 + mDaug2 * mDaug2 +
- 2 * En1 * En2 - m12Sq )/p1mag/p2mag;
- if ( cosPhi > 1.0 ) {
- EvtGenReport( EVTGEN_WARNING, "EvtThreeBodyPhsp" )
- << " Model: cosine larger than one: " << cosPhi << std::endl;
- cosPhi = 1.0;
- }
- double sinPhi = std::sqrt( 1 - cosPhi * cosPhi );
- if ( EvtRandom::Flat( 0., 1. ) > 0.5 ) {
- sinPhi *= -1;
- }
- const double p2x = p2mag * cosPhi;
- const double p2y = p2mag * sinPhi;
- const double p3x = -p1mag - p2x;
- const double p3y = -p2y;
-
- // Construct 4-momenta and rotate them randomly in space
- EvtVector4R p1( En1, p1mag, 0., 0. );
- EvtVector4R p2( En2, p2x, p2y, 0. );
- EvtVector4R p3( En3, p3x, p3y, 0. );
- const double euler1 = EvtRandom::Flat( 0., EvtConst::twoPi );
- const double euler2 = std::acos( EvtRandom::Flat( -1.0, 1.0 ) );
- const double euler3 = EvtRandom::Flat( 0., EvtConst::twoPi );
- p1.applyRotateEuler(euler1, euler2, euler3);
- p2.applyRotateEuler(euler1, euler2, euler3);
- p3.applyRotateEuler(euler1, euler2, euler3);
-
- // set momenta for daughters
- daug1->init( getDaug( 0 ), p1 );
- daug2->init( getDaug( 1 ), p2 );
- daug3->init( getDaug( 2 ), p3 );
+ EvtGenKine::ThreeBodyKine(m12Sq, m23Sq, p);
return;
}
diff --git a/test/do_tests b/test/do_tests
--- a/test/do_tests
+++ b/test/do_tests
@@ -98,3 +98,4 @@
time ./evtgenlhc_test1 baryonic 1000
time ./evtgenlhc_test1 phspdecaytimecut 10000
time ./evtgenlhc_test1 3bodyPhsp 1000000
+time ./evtgenlhc_test1 flatSqDalitz 1000000
diff --git a/test/evtgenlhc_test1.cc b/test/evtgenlhc_test1.cc
--- a/test/evtgenlhc_test1.cc
+++ b/test/evtgenlhc_test1.cc
@@ -157,6 +157,7 @@
TH1F* mom = 0 );
void runBaryonic( int nEvent, EvtGen& myGenerator );
void run3BPhspRegion( int nEvent, EvtGen& myGenerator );
+void runFlatSqDalitz( int nEvent, EvtGen& myGenerator );
int main( int argc, char* argv[] )
{
@@ -534,6 +535,12 @@
run3BPhspRegion( nevent, myGenerator);
}
+ if ( !strcmp( argv[1], "flatSqDalitz" ) ) {
+ int nevent = atoi( argv[2] );
+ EvtRadCorr::setNeverRadCorr();
+ runFlatSqDalitz( nevent, myGenerator);
+ }
+
//*******************************************************
//test of the rotations and boosts performed in EvtGen.
// Added by Lange and Ryd Jan 5,2000.
@@ -5753,3 +5760,58 @@
file->Close();
EvtGenReport( EVTGEN_INFO, "EvtGen" ) << "SUCCESS\n";
}
+
+void runFlatSqDalitz( int nevent, EvtGen& myGenerator )
+{
+ TFile* file = new TFile( "flatSqDalitz.root", "RECREATE" );
+
+ TH2F* dalitz = new TH2F( "h4", "Dalitz", 50, 0.0, 1.0, 50, 0.0, 1.0 );
+
+ int count = 1;
+
+ char udecay_name[100];
+ strcpy( udecay_name, "exampleFiles/flatSqDalitz.dec" );
+ myGenerator.readUDecay( udecay_name );
+
+ static EvtId B = EvtPDL::getId( std::string( "Lambda_b0" ) );
+
+ do {
+ EvtVector4R pinit( EvtPDL::getMass( B ), 0.0, 0.0, 0.0 );
+
+ EvtParticle* root_part = EvtParticleFactory::particleFactory( B, pinit );
+
+ myGenerator.generateDecay( root_part );
+
+ double mB = root_part->mass();
+ double m1 = root_part->getDaug( 0 )->mass();
+ double m2 = root_part->getDaug( 1 )->mass();
+ double m3 = root_part->getDaug( 2 )->mass();
+
+ EvtParticle* daug1 = root_part->getDaug( 0 );
+ EvtParticle* daug2 = root_part->getDaug( 1 );
+ EvtParticle* daug3 = root_part->getDaug( 2 );
+ double m12 = ( daug1->getP4() + daug2->getP4() ).mass();
+ double m13 = ( daug1->getP4() + daug3->getP4() ).mass();
+ double m23 = ( daug2->getP4() + daug3->getP4() ).mass();
+
+ double m12norm = 2 * ( ( m12 - ( m1 + m2 ) ) / ( mB - ( m1 + m2 + m3 ) ) ) -
+ 1;
+ double mPrime = acos( m12norm ) / EvtConst::pi;
+ double thPrime = acos( ( m12 * m12 * ( m23 * m23 - m13 * m13 ) -
+ ( m2 * m2 - m1 * m1 ) * ( mB * mB - m3 * m3 ) ) /
+ ( sqrt( pow( m12 * m12 + m1 * m1 - m2 * m2, 2 ) -
+ 4 * m12 * m12 * m1 * m1 ) *
+ sqrt( pow( -m12 * m12 + mB * mB - m3 * m3, 2 ) -
+ 4 * m12 * m12 * m3 * m3 ) ) ) /
+ EvtConst::pi;
+
+ dalitz->Fill( mPrime, thPrime );
+
+ root_part->deleteTree();
+
+ } while ( count++ < nevent );
+
+ file->Write();
+ file->Close();
+ EvtGenReport( EVTGEN_INFO, "EvtGen" ) << "SUCCESS\n";
+}
diff --git a/test/exampleFiles/flatSqDalitz.dec b/test/exampleFiles/flatSqDalitz.dec
new file mode 100644
--- /dev/null
+++ b/test/exampleFiles/flatSqDalitz.dec
@@ -0,0 +1,17 @@
+Alias MyLambda Lambda0
+Alias MyantiLambda anti-Lambda0
+ChargeConj MyLambda MyantiLambda
+#
+Decay Lambda_b0
+ 1.000 K+ K- MyLambda FLATSQDALITZ;
+Enddecay
+CDecay anti-Lambda_b0
+#
+Decay MyLambda
+ 1.000 p+ pi- PHSP;
+Enddecay
+CDecay MyantiLambda
+#
+End
+
+
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Sep 29, 6:45 PM (19 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
6566793
Default Alt Text
D36.1759167899.diff (14 KB)
Attached To
Mode
D36: Rewrite EvtFlatSqDalitz model to be more efficient and to avoid cut-off around the edges
Attached
Detach File
Event Timeline
Log In to Comment