Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7879003
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Subscribers
None
View Options
diff --git a/Hadronization/SpinHadronizer.cc b/Hadronization/SpinHadronizer.cc
--- a/Hadronization/SpinHadronizer.cc
+++ b/Hadronization/SpinHadronizer.cc
@@ -1,306 +1,301 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the SpinHadronizer class.
//
#include "SpinHadronizer.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/PDT/StandardMatchers.h"
#include "Herwig/Utilities/EnumParticles.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/RSSpinorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h"
#include "Cluster.h"
using namespace Herwig;
// choose only baryons
void SpinHadronizer::
handle(EventHandler &, const tPVector & tagged,const Hint & ) {
for(const tPPtr & hadron : tagged) {
// mesons
if(MesonMatcher::Check(hadron->data())) {
mesonSpin(hadron);
}
// baryons
else if(BaryonMatcher::Check(hadron->data())) {
baryonSpin(hadron);
}
else
continue;
}
}
void SpinHadronizer::baryonSpin(tPPtr baryon) {
// check only one parent
if(baryon->parents().size()!=1) return;
tPPtr parent = baryon->parents()[0];
// and its a cluster
if(parent->id()!=ParticleID::Cluster) return;
tClusterPtr cluster = dynamic_ptr_cast<tClusterPtr>(parent);
unsigned int prim_quark = (abs(baryon->id())/1000)%10;
int sign_quark = baryon->id()>0 ? prim_quark : -prim_quark;
// only strange, charm and bottom for the moment
if(prim_quark<minFlav_ || prim_quark>maxFlav_ ) return;
tPPtr quark;
for(unsigned int ix=0;ix<cluster->numComponents();++ix) {
if(cluster->particle(ix)->id()==sign_quark) {
quark = cluster->particle(ix);
}
}
if(!quark) return;
if(!quark->spinInfo()) return;
tcFermionSpinPtr sp(dynamic_ptr_cast<tcFermionSpinPtr>(quark->spinInfo()));
// decay it
sp->decay();
// create the spin info
if(baryon->dataPtr()->iSpin()==PDT::Spin1Half) {
vector<SpinorWaveFunction> waves;
RhoDMatrix rho;
SpinorWaveFunction::calculateWaveFunctions(waves,rho,baryon,baryon->id() >0 ? incoming : outgoing);
SpinorWaveFunction::constructSpinInfo(waves,baryon,outgoing,true);
}
else if(baryon->dataPtr()->iSpin()==PDT::Spin3Half) {
vector<RSSpinorWaveFunction> waves;
RhoDMatrix rho;
RSSpinorWaveFunction::calculateWaveFunctions(waves,rho,baryon,baryon->id() >0 ? incoming : outgoing);
RSSpinorWaveFunction::constructSpinInfo(waves,baryon,outgoing,true);
}
// can't handle spin > 3/2
else {
return;
}
// extract the polarization of the quark
double pol = 2.*sp->rhoMatrix()(1,1).real()-1.;
if(sign_quark<0) {
qPol_[prim_quark-3].first += pol;
qPol_[prim_quark-3].second += 1.;
}
else {
qPol_[prim_quark].first += pol;
qPol_[prim_quark].second += 1.;
}
// the different options for different spin types
const int mult = prim_quark*1000;
int bid = abs(baryon->id());
// lambda and Xi spin 1/2 (spin0 diquark)
if(bid== mult+122|| bid== mult+132|| bid== mult+232) {
baryon->spinInfo()->rhoMatrix()(0,0) = 0.5*(1.-pol);
baryon->spinInfo()->rhoMatrix()(1,1) = 0.5*(1.+pol);
}
// sigma_b, xi' and omega_b spin 1/2 (spin1 diquark)
else if(bid== mult+112|| bid== mult+212|| bid== mult+222||
bid== mult+312|| bid== mult+322|| bid== mult+332) {
baryon->spinInfo()->rhoMatrix()(0,0) = 0.5*(1.-pol) +pol*omegaHalf_;
baryon->spinInfo()->rhoMatrix()(1,1) = 0.5*(1.+pol) -pol*omegaHalf_;
}
// sigma*, xi* and omegab* spin 3/2 (spin1 diquark)
else if(bid== mult+114|| bid== mult+214|| bid== mult+224|| bid== mult+334) {
baryon->spinInfo()->rhoMatrix()(0,0) = 0.375*(1.-pol)*omegaHalf_;
baryon->spinInfo()->rhoMatrix()(1,1) = 0.5*(1.-pol)-omegaHalf_/8.*(3.-5.*pol);
baryon->spinInfo()->rhoMatrix()(2,2) = 0.5*(1.+pol)-omegaHalf_/8.*(3.+5.*pol);
baryon->spinInfo()->rhoMatrix()(3,3) = 0.375*(1.+pol)*omegaHalf_;
}
else
return;
// generator()->log() << "Baryon: " << *baryon << "\n";
// generator()->log() << "Parent: " << *cluster << "\n";
// generator()->log() << "Quark: " << *quark << "\n";
// generator()->log() << "Rho\n" << sp->rhoMatrix() << "\n";
// generator()->log() << "testing is decayed " << sp->decayed() <<" \n";
// generator()->log() << baryon->spinInfo()->rhoMatrix() << "\n";
}
void SpinHadronizer::mesonSpin(tPPtr meson) {
// check only one parent
if(meson->parents().size()!=1) return;
tPPtr parent = meson->parents()[0];
// and its a cluster
if(parent->id()!=ParticleID::Cluster) return;
tClusterPtr cluster = dynamic_ptr_cast<tClusterPtr>(parent);
unsigned int prim_quark = (abs(meson->id())/100)%10;
// find the quark id
int sign_quark = meson->id()>0 ? prim_quark : -prim_quark;
// B and K mesons have antiquarks bbar,sbar in mesons and quarks, b,s, in antimesons
if(prim_quark%2==1) sign_quark *= -1.;
// only strange, charm and bottom for the moment
if(prim_quark<minFlav_ || prim_quark>maxFlav_ ) return;
tPPtr quark;
for(unsigned int ix=0;ix<cluster->numComponents();++ix) {
if(cluster->particle(ix)->id()==sign_quark) {
quark = cluster->particle(ix);
}
}
if(!quark) return;
if(!quark->spinInfo()) return;
tcFermionSpinPtr sp(dynamic_ptr_cast<tcFermionSpinPtr>(quark->spinInfo()));
// decay it
sp->decay();
// create the spin info
if(meson->dataPtr()->iSpin()==PDT::Spin0) {
RhoDMatrix rho;
ScalarWaveFunction::calculateWaveFunctions(rho,meson,meson->id() > 0 ? incoming : outgoing);
ScalarWaveFunction::constructSpinInfo(meson,outgoing,true);
}
else if(meson->dataPtr()->iSpin()==PDT::Spin1) {
vector<VectorWaveFunction> waves;
RhoDMatrix rho;
- VectorWaveFunction::calculateWaveFunctions(waves,rho,meson,meson->id() > 0 ? incoming : outgoing,true);
- VectorWaveFunction::constructSpinInfo(waves,meson,outgoing,true,true);
+ VectorWaveFunction::calculateWaveFunctions(waves,rho,meson,meson->id() > 0 ? incoming : outgoing,false);
+ VectorWaveFunction::constructSpinInfo(waves,meson,outgoing,true,false);
}
else if(meson->dataPtr()->iSpin()==PDT::Spin2) {
vector<TensorWaveFunction> waves;
RhoDMatrix rho;
- TensorWaveFunction::calculateWaveFunctions(waves,rho,meson,meson->id() > 0 ? incoming : outgoing,true);
- TensorWaveFunction::constructSpinInfo(waves,meson,outgoing,true,true);
+ TensorWaveFunction::calculateWaveFunctions(waves,rho,meson,meson->id() > 0 ? incoming : outgoing,false);
+ TensorWaveFunction::constructSpinInfo(waves,meson,outgoing,true,false);
}
else {
return;
}
// extract the polarization of the quark
double pol = 2.*sp->rhoMatrix()(1,1).real()-1.;
if(sign_quark<0) {
qPol_[prim_quark-3].first += pol;
qPol_[prim_quark-3].second += 1.;
}
else {
qPol_[prim_quark].first += pol;
qPol_[prim_quark].second += 1.;
}
// the different options for different spin types
- int bid = abs(meson->id())%1000;
+ int bid = abs(meson->id());
// light-quark spin 1/2+ -> spin 0 heavy meson
- if(bid==311 || bid==321 || bid==331 || bid==411 || bid==421 || bid==431
- || bid==511 || bid==521 || bid==531) {
- return;
- }
- // light-quark spin 1/2+
- else if(bid==313 || bid==323 || bid==333 || bid==413 || bid==423 || bid==433
- || bid==513 || bid==523 || bid==533) {
+ if(bid==10313 || bid==10323 || bid==10333 || bid==10413 || bid==10423 || bid==10433
+ || bid==10513 || bid==10523 || bid==10533) {
// Falk-Peskin "no-win" theorem for non-excited heavy mesons:
// no polarization information would be find in the non-excited meson
// for the excted mesons
meson->spinInfo()->rhoMatrix()(0,0) = (1.-pol)/16. + (omegaThreeHalf_/16.)*(3.-5.*pol);
meson->spinInfo()->rhoMatrix()(1,1) = 0.25*(1.-omegaThreeHalf_);
meson->spinInfo()->rhoMatrix()(2,2) = (1.+pol)/16. + (omegaThreeHalf_/16.)*(3.+5.*pol);
}
// light-quark spin 3/2+ -> exited spin 2 meson
else if(bid==315 || bid==325 || bid==335 || bid==415 || bid==425 || bid==435
|| bid==515 || bid==525 || bid==535) {
meson->spinInfo()->rhoMatrix()(0,0) = 0.25*(1.-pol)*omegaThreeHalf_;
meson->spinInfo()->rhoMatrix()(1,1) = 0.1875*(1.-pol)-0.125*(1.-pol)*omegaThreeHalf_;
meson->spinInfo()->rhoMatrix()(2,2) = 0.25*(1.-omegaThreeHalf_);
meson->spinInfo()->rhoMatrix()(3,3) = 0.1875*(1.+pol)-0.125*(1.+pol)*omegaThreeHalf_;
meson->spinInfo()->rhoMatrix()(4,4) = 0.25*(1.+pol)*omegaThreeHalf_;
}
else {
return;
}
}
IBPtr SpinHadronizer::clone() const {
return new_ptr(*this);
}
IBPtr SpinHadronizer::fullclone() const {
return new_ptr(*this);
}
void SpinHadronizer::persistentOutput(PersistentOStream & os) const {
os << omegaHalf_ << omegaThreeHalf_;
}
void SpinHadronizer::persistentInput(PersistentIStream & is, int) {
is >> omegaHalf_ >> omegaThreeHalf_;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<SpinHadronizer,StepHandler>
describeHerwigSpinHadronizer("Herwig::SpinHadronizer", "Herwig.so");
void SpinHadronizer::Init() {
static ClassDocumentation<SpinHadronizer> documentation
("The SpinHadronizer class implements a simple mode for"
" the transfer of spin from quarks to hadrons");
static Parameter<SpinHadronizer,double> interfaceOmegaHalf
("OmegaHalf",
"The omega_1/2 Falk-Peskin parameter",
&SpinHadronizer::omegaHalf_, 2./3., 0.0, 1.0,
false, false, Interface::limited);
static Parameter<SpinHadronizer,double> interfaceOmegaThreeHalf
("OmegaThreeHalf",
"The omega_3/2 Falk-Peskin parameter",
&SpinHadronizer::omegaThreeHalf_, 0.2, 0.0, 1.0,
false, false, Interface::limited);
static Parameter<SpinHadronizer,unsigned int> interfaceMinimumFlavour
("MinimumFlavour",
"The minimum flavour of quark for which to transfer the polarization",
&SpinHadronizer::minFlav_, 3, 3, 5,
false, false, Interface::limited);
static Parameter<SpinHadronizer,unsigned int> interfaceMaximumFlavour
("MaximumFlavour",
"The maximum flavour of quark for which to transfer the polarization",
&SpinHadronizer::maxFlav_, 5, 3, 5,
false, false, Interface::limited);
static Switch<SpinHadronizer,bool> interfaceDebug
("Debug",
"Output info on polarizations each for debugging",
&SpinHadronizer::debug_, false, false, false);
static SwitchOption interfaceDebugYes
(interfaceDebug,
"Yes",
"Debug",
true);
static SwitchOption interfaceDebugNo
(interfaceDebug,
"No",
"No info",
false);
}
void SpinHadronizer::doinit() {
StepHandler::doinit();
if(minFlav_>maxFlav_)
throw InitException() << "The minimum flavour " << minFlav_
<< "must be lower the than maximum flavour " << maxFlav_
<< " in SpinHadronizer::doinit() "
<< Exception::runerror;
}
void SpinHadronizer::dofinish() {
StepHandler::dofinish();
if(debug_) {
for(unsigned int ix=0;ix<3;++ix) {
if(qPol_[ix].second!=0)
generator()->log() << "Average polarization of " << getParticleData(long(3+ix))->PDGName() << " antiquarks "
<< qPol_[ix].first/qPol_[ix].second << "\n";
if(qPol_[ix+3].second!=0)
generator()->log() << "Average polarization of " << getParticleData(long(3+ix))->PDGName() << " quarks "
<< qPol_[ix+3].first/qPol_[ix+3].second << "\n";
}
}
}
void SpinHadronizer::doinitrun() {
StepHandler::doinitrun();
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:14 PM (1 d, 12 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805786
Default Alt Text
(12 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment