Newer
Older
//************************************************************************//
// //
// Copyright 2014 Bertram Kopf (bertram@ep1.rub.de) //
// Julian Pychy (julian@ep1.rub.de) //
// - Ruhr-Universität Bochum //
// //
// This file is part of Pawian. //
// //
// Pawian is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// Pawian is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with Pawian. If not, see <http://www.gnu.org/licenses/>. //
// //
//************************************************************************//
// AbsLSDecAmps class definition file. -*- C++ -*-
// Copyright 2014 Bertram Kopf
#include <getopt.h>
#include <fstream>
#include <string>
#include "PwaUtils/AbsLSDecAmps.hh"
#include "qft++/relativistic-quantum-mechanics/Utils.hh"
#include "PwaUtils/DataUtils.hh"
Julian Pychy
committed
#include "PwaUtils/GlobalEnv.hh"
#include "PwaUtils/IsobarLSDecay.hh"
#include "PwaDynamics/BarrierFactor.hh"
#include "Utils/FunctionUtils.hh"
Julian Pychy
committed
#include "ErrLogger/ErrLogger.hh"
AbsLSDecAmps::AbsLSDecAmps(std::shared_ptr<IsobarLSDecay> theDec, ChannelID channelID) :
Julian Pychy
committed
AbsXdecAmp(theDec, channelID)
Bertram Kopf
committed
,_LSs(theDec->LSAmps())
,_lam1Min(-_Jdaughter1)
,_lam1Max(_Jdaughter1)
,_lam2Min(-_Jdaughter2)
,_lam2Max(_Jdaughter2)
Bertram Kopf
committed
if(_LSs.size()>0) _factorMag=1./sqrt(_LSs.size());
Particle* daughter1=_decay->daughter1Part();
Particle* daughter2=_decay->daughter2Part();
_parityFactor=daughter1->theParity()*daughter2->theParity()*pow(-1,_JPCPtr->J-daughter1->J()-daughter2->J());
Info << "_parityFactor=\t" << _parityFactor << endmsg;
Julian Pychy
committed
fillCgPreFactor();
AbsLSDecAmps::AbsLSDecAmps(std::shared_ptr<AbsDecay> theDec, ChannelID channelID) :
Julian Pychy
committed
AbsXdecAmp(theDec, channelID)
,_lam1Min(-_Jdaughter1)
,_lam1Max(_Jdaughter1)
,_lam2Min(-_Jdaughter2)
,_lam2Max(_Jdaughter2)
Particle* daughter1=_decay->daughter1Part();
Particle* daughter2=_decay->daughter2Part();
Julian Pychy
committed
_parityFactor=daughter1->theParity()*daughter2->theParity()*pow(-1,_JPCPtr->J-daughter1->J()-daughter2->J());
Info << "_parityFactor=\t" << _parityFactor << endmsg;
Julian Pychy
committed
fillCgPreFactor();
AbsLSDecAmps::~AbsLSDecAmps()
void AbsLSDecAmps::getDefaultParams(fitParams& fitVal, fitParams& fitErr){
Bertram Kopf
committed
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess > currentMagValMap;
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess > currentPhiValMap;
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess > currentMagErrMap;
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess > currentPhiErrMap;
Bertram Kopf
committed
std::vector< std::shared_ptr<const LScomb> >::const_iterator itLS;
for(itLS=_LSs.begin(); itLS!=_LSs.end(); ++itLS){
currentMagValMap[*itLS]=_factorMag;
currentMagErrMap[*itLS]=_factorMag;
Bertram Kopf
committed
fitVal.MagsLS[_key]=currentMagValMap;
fitVal.PhisLS[_key]=currentPhiValMap;
fitErr.MagsLS[_key]=currentMagErrMap;
fitErr.PhisLS[_key]=currentPhiErrMap;
_absDyn->getDefaultParams(fitVal, fitErr);
if(!_daughter1IsStable) _decAmpDaughter1->getDefaultParams(fitVal, fitErr);
Julian Pychy
committed
if(!_daughter2IsStable) _decAmpDaughter2->getDefaultParams(fitVal, fitErr);
void AbsLSDecAmps::print(std::ostream& os) const{
bool AbsLSDecAmps::checkRecalculation(fitParams& theParamVal){
Julian Pychy
committed
if(_absDyn->checkRecalculation(theParamVal)) _recalculate=true;
if(!_daughter1IsStable) {
if(_decAmpDaughter1->checkRecalculation(theParamVal)) _recalculate=true;
}
if(!_daughter2IsStable){
if(_decAmpDaughter2->checkRecalculation(theParamVal)) _recalculate=true;
}
Bertram Kopf
committed
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess >& magMap=theParamVal.MagsLS[_key];
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess >& phiMap=theParamVal.PhisLS[_key];
Julian Pychy
committed
Bertram Kopf
committed
std::vector< std::shared_ptr<const LScomb> >::iterator it;
for (it=_LSs.begin(); it!=_LSs.end(); ++it){
double theMag=magMap[*it];
double thePhi=phiMap[*it];
Julian Pychy
committed
if(!CheckDoubleEquality(theMag, _currentParamMags[*it])){
_recalculate=true;
return _recalculate;
}
if(!CheckDoubleEquality(thePhi, _currentParamPhis[*it])){
_recalculate=true;
return _recalculate;
}
}
}
Julian Pychy
committed
void AbsLSDecAmps::updateFitParams(fitParams& theParamVal){
Bertram Kopf
committed
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess >& magMap=theParamVal.MagsLS[_key];
std::map< std::shared_ptr<const LScomb>, double, pawian::Collection::SharedPtrLess >& phiMap=theParamVal.PhisLS[_key];
Bertram Kopf
committed
std::vector< std::shared_ptr<const LScomb> >::iterator it;
for (it=_LSs.begin(); it!=_LSs.end(); ++it){
double theMag=magMap[*it];
double thePhi=phiMap[*it];
_currentParamMags[*it]=theMag;
_currentParamPhis[*it]=thePhi;
complex<double> expi(cos(thePhi), sin(thePhi));
_currentParamMagExpi[*it]=theMag*expi;
if(!_daughter1IsStable) _decAmpDaughter1->updateFitParams(theParamVal);
if(!_daughter2IsStable) _decAmpDaughter2->updateFitParams(theParamVal);
}
void AbsLSDecAmps::fillCgPreFactor(){
Bertram Kopf
committed
std::vector< std::shared_ptr<const LScomb> >::iterator it;
for (it=_LSs.begin(); it!=_LSs.end(); ++it){
for(Spin lambda1=-_Jdaughter1; lambda1<=_Jdaughter1; ++lambda1){
for(Spin lambda2=-_Jdaughter2; lambda2<=_Jdaughter2; ++lambda2){
Spin lambda = lambda1-lambda2;
Bertram Kopf
committed
if( fabs(lambda)>_JPCPtr->J || fabs(lambda)>(*it)->S) continue;
_cgPreFactor[*it][lambda1][lambda2]=sqrt(2.*(*it)->L+1)
Bertram Kopf
committed
*Clebsch((*it)->L, 0, (*it)->S, lambda, _JPCPtr->J, lambda)
*Clebsch(_Jdaughter1, lambda1, _Jdaughter2, -lambda2, (*it)->S, lambda );
_cgPreFactor_LamLamLSMap[lambda1][lambda2][*it]=sqrt(2.*(*it)->L+1)
*Clebsch((*it)->L, 0, (*it)->S, lambda, _JPCPtr->J, lambda)
*Clebsch(_Jdaughter1, lambda1, _Jdaughter2, -lambda2, (*it)->S, lambda );