diff --git a/doc/ReleaseNotes.md b/doc/ReleaseNotes.md --- a/doc/ReleaseNotes.md +++ b/doc/ReleaseNotes.md @@ -1,6 +1,10 @@ # Laura++ release notes -4th February 2020 Dan Johnson +5th March 2021 Dan Johnson +* Alterations to allow Blatt-Weisskopf factor for parent to be created in a model with only a K-matrix + - see https://phab.hepforge.org/D52 + +4th February 2021 Dan Johnson * Extend the K-matrix implementation to handle non-zero spin - see https://phab.hepforge.org/T135 diff --git a/inc/LauBlattWeisskopfFactor.hh b/inc/LauBlattWeisskopfFactor.hh --- a/inc/LauBlattWeisskopfFactor.hh +++ b/inc/LauBlattWeisskopfFactor.hh @@ -36,15 +36,16 @@ #define LAU_BLATTWEISSKOPFFACTOR #include "Rtypes.h" +#include "TString.h" class LauParameter; class LauResonanceInfo; -class LauBlattWeisskopfFactor { +class LauBlattWeisskopfFactor final { public: - //! Define the allowed types of barrier factors + //! Define the allowed types of barrier factors enum BarrierType { BWBarrier, /*!< Blatt-Weisskopf barrier factor (for use when momentum terms not used in angular term) */ BWPrimeBarrier, /*!< Blatt-Weisskopf barrier factor (for use when momentum terms are used in angular term) - the default */ @@ -83,8 +84,8 @@ //! Constructor LauBlattWeisskopfFactor( const LauResonanceInfo& resInfo, const Double_t resRadius, const BarrierType barrierType, const RestFrame restFrame, const BlattWeisskopfCategory category ); - //! Destructor - virtual ~LauBlattWeisskopfFactor(); + //! Constructor + LauBlattWeisskopfFactor( const Int_t spin, const Double_t resRadius, const BarrierType barrierType, const RestFrame restFrame, const BlattWeisskopfCategory category ); //! Method to create a new factor with cloned radius parameter /*! @@ -110,10 +111,6 @@ */ Double_t calcFormFactor( const Double_t p ) const; - protected: - //! Set the name of the radius parameter - TString setRadiusName( const LauResonanceInfo& resInfo, const BlattWeisskopfCategory category ); - private: //! Copy constructor LauBlattWeisskopfFactor( const LauBlattWeisskopfFactor& other, const UInt_t newSpin, const BarrierType newBarrierType ); @@ -121,6 +118,15 @@ //! Copy assignment operator (not implemented) LauBlattWeisskopfFactor& operator=( const LauBlattWeisskopfFactor& other ); + //! Set the name of the radius parameter + TString setRadiusName( const LauResonanceInfo& resInfo, const BlattWeisskopfCategory category ); + + //! Set the name of the radius parameter + TString setRadiusName( const BlattWeisskopfCategory category ); + + //! Set the name of the radius parameter + TString setRadiusName( const TString& categoryName ); + //! Resonance spin const UInt_t spin_; diff --git a/src/LauBlattWeisskopfFactor.cc b/src/LauBlattWeisskopfFactor.cc --- a/src/LauBlattWeisskopfFactor.cc +++ b/src/LauBlattWeisskopfFactor.cc @@ -58,8 +58,14 @@ std::cout << "INFO in LauBlattWeisskopfFactor constructor : creating radius parameter for category \"" << categoryName << "\", with initial value " << resRadius << std::endl; } -LauBlattWeisskopfFactor::~LauBlattWeisskopfFactor() +LauBlattWeisskopfFactor::LauBlattWeisskopfFactor( const Int_t spin, const Double_t resRadius, const BarrierType barrierType, const RestFrame restFrame, const BlattWeisskopfCategory category ) : + spin_(spin), + radius_(new LauParameter("NEED_A_GOOD_NAME",resRadius,0.0,10.0,kTRUE)), + barrierType_(barrierType), + restFrame_(restFrame) { + TString categoryName = this->setRadiusName( category ); + std::cout << "INFO in LauBlattWeisskopfFactor constructor : creating radius parameter for category \"" << categoryName << "\", with initial value " << resRadius << std::endl; } LauBlattWeisskopfFactor::LauBlattWeisskopfFactor( const LauBlattWeisskopfFactor& other, const UInt_t newSpin, const BarrierType newBarrierType ) : @@ -72,61 +78,61 @@ TString LauBlattWeisskopfFactor::setRadiusName( const LauResonanceInfo& resInfo, const BlattWeisskopfCategory category ) { - TString name = "BarrierRadius_"; - TString categoryName; + switch (category) { + case Indep : + return this->setRadiusName( resInfo.getSanitisedName() ); + default : + return this->setRadiusName( category ); + } +} +TString LauBlattWeisskopfFactor::setRadiusName( const BlattWeisskopfCategory category ) +{ switch (category) { - case Parent : - categoryName = "Parent"; - break; + case Default : + return this->setRadiusName("Unknown"); case Indep : - categoryName = resInfo.getSanitisedName(); - break; + // We shouldn't ever end up here + return this->setRadiusName("Unknown"); + case Parent : + return this->setRadiusName("Parent"); case Light : - categoryName = "Light"; - break; + return this->setRadiusName("Light"); case Kstar : - categoryName = "Kstar"; - break; + return this->setRadiusName("Kstar"); case Charm : - categoryName = "Charm"; - break; + return this->setRadiusName("Charm"); case StrangeCharm : - categoryName = "StrangeCharm"; - break; + return this->setRadiusName("StrangeCharm"); case Charmonium : - categoryName = "Charmonium"; - break; + return this->setRadiusName("Charmonium"); case Beauty : - categoryName = "Beauty"; - break; + return this->setRadiusName("Beauty"); case StrangeBeauty : - categoryName = "StrangeBeauty"; - break; + return this->setRadiusName("StrangeBeauty"); case CharmBeauty : - categoryName = "CharmBeauty"; - break; + return this->setRadiusName("CharmBeauty"); case Custom1 : - categoryName = "Custom1"; - break; + return this->setRadiusName("Custom1"); case Custom2 : - categoryName = "Custom2"; - break; + return this->setRadiusName("Custom2"); case Custom3 : - categoryName = "Custom3"; - break; + return this->setRadiusName("Custom3"); case Custom4 : - categoryName = "Custom4"; - break; - default : - categoryName = "Unknown"; - break; + return this->setRadiusName("Custom4"); } + // We should never get here but gcc seems to think we can + return this->setRadiusName("Unknown"); +} + +TString LauBlattWeisskopfFactor::setRadiusName( const TString& categoryName ) +{ + TString name = "BarrierRadius_"; + name.Append(categoryName); - name.Append(categoryName); - radius_->name(name); + radius_->name(name); - return categoryName; + return categoryName; } LauBlattWeisskopfFactor* LauBlattWeisskopfFactor::createClone( const UInt_t newSpin, const BarrierType newBarrierType ) diff --git a/src/LauResonanceMaker.cc b/src/LauResonanceMaker.cc --- a/src/LauResonanceMaker.cc +++ b/src/LauResonanceMaker.cc @@ -632,19 +632,38 @@ // Look up the category in the category information map BWFactorCategoryMap::iterator factor_iter = bwFactors_.find( LauBlattWeisskopfFactor::Parent ); - if ( factor_iter != bwFactors_.end() ) { + if ( factor_iter == bwFactors_.end() ) { + // If the category is currently undefined we need to create it + bwFactor = new LauBlattWeisskopfFactor( resSpin, 4.0, bwBarrierType_, bwRestFrame_, LauBlattWeisskopfFactor::Parent ); + std::cerr<<"WARNING in LauResonanceMaker::getParentBWFactor : Default radius 4.0 set for Blatt-Weisskopf factor category: Parent"<getRadiusParameter()->value(); + categoryInfo.radiusFixed_ = kTRUE; + } else { // If it exists, we can check if the factor object has been created BlattWeisskopfCategoryInfo& categoryInfo = factor_iter->second; if ( categoryInfo.bwFactor_ != 0 ) { // If so, simply clone it bwFactor = categoryInfo.bwFactor_->createClone( resSpin, barrierType ); + } else { + // Otherwise we need to create it, using the default value if it has been set + if ( categoryInfo.defaultRadius_ >= 0.0 ) { + bwFactor = new LauBlattWeisskopfFactor( resSpin, categoryInfo.defaultRadius_, bwBarrierType_, bwRestFrame_, LauBlattWeisskopfFactor::Parent ); + } else { + bwFactor = new LauBlattWeisskopfFactor( resSpin, 4.0, bwBarrierType_, bwRestFrame_, LauBlattWeisskopfFactor::Parent ); + std::cerr<<"WARNING in LauResonanceMaker::getParentBWFactor : Default radius 4.0 set for Blatt-Weisskopf factor category: Parent"<getRadiusParameter(); + radius->fixed( categoryInfo.radiusFixed_ ); } } - if ( bwFactor==0 ) { - std::cerr<<"ERROR in LauResonanceMaker::getParentBWFactor : No parent Blatt-Weisskopf factor found to be cloned for K-matrix."<