00001 #include "FastShowerUtils/Showerer.h"
00002 #include "FastShowerUtils/ParticleParameters.h"
00003 #include "FastShowerUtils/Deposits.h"
00004 #include "FastShowerUtils/IFnOfParticleParameters.h"
00005 #include "FastShowerUtils/Gridlet.h"
00006 #include "FastShowerUtils/IDepositor.h"
00007 #include "FastShowerUtils/CloneVector.h"
00008 #include "FastShowerUtils/IConfigurer.h"
00009 #include "FastShowerUtils/INormaliser.h"
00010 #include "FastShowerUtils/Normalisations.h"
00011 #include "FastShowerUtils/EnergyLimiter.h"
00012
00013 #include <vector>
00014
00015 namespace FastShower{
00016
00017 using std::vector;
00018
00020 Showerer::Showerer(const IConfigurer* configurer, const std::string& s):
00021 IShowerer(), DebugBase(s), m_eDepositors(), m_hDepositors(),
00022 m_eNormaliser(0), m_hNormaliser(0), m_eLimiter(0){
00023
00024 configurer->eDepositors(m_eDepositors);
00025 configurer->hDepositors(m_hDepositors);
00026 m_eNormaliser = configurer->findNormaliser("EcalNormaliser");
00027 m_hNormaliser = configurer->findNormaliser("HcalNormaliser");
00028 m_eLimiter = configurer->energyLimiter();
00029
00030 }
00032
00033 Showerer::Showerer(vector<IDepositor*> e, vector<IDepositor*> h,
00034 INormaliser* eN, INormaliser* hN):
00035 IShowerer(), DebugBase("Showerer"),
00036 m_eDepositors(e), m_hDepositors(h),
00037 m_eNormaliser(eN), m_hNormaliser(hN),
00038 m_eLimiter(new EnergyLimiter(10., 100.)){}
00040
00041 Showerer::Showerer(const Showerer& s): IShowerer(), DebugBase(s){
00042
00043 std::vector<IDepositor*>::const_iterator iter;
00044 std::vector<IDepositor*>::const_iterator end;
00045
00046 iter =s.m_eDepositors.begin();
00047 end =s.m_eDepositors.end();
00048 for(;iter!=end;++iter){m_eDepositors.push_back((*iter)->clone());}
00049
00050 iter =s.m_hDepositors.begin();
00051 end =s.m_hDepositors.end();
00052 for(;iter!=end;++iter){m_hDepositors.push_back((*iter)->clone());}
00053
00054 m_eNormaliser = s.m_eNormaliser;
00055 m_hNormaliser = s.m_hNormaliser;
00056
00057 m_eLimiter = s.m_eLimiter;
00058 }
00059
00060 Showerer& Showerer::operator=(const Showerer& s){
00061
00062
00063 if (&s != this){
00064
00065 DebugBase::operator=(s);
00066
00067 m_eDepositors.clear();
00068 m_hDepositors.clear();
00069
00070 std::vector<IDepositor*>::const_iterator iter, end;
00071
00072
00073 iter =s.m_eDepositors.begin();
00074 end =s.m_eDepositors.end();
00075 for(;iter!=end;++iter){m_eDepositors.push_back((*iter)->clone());}
00076
00077 iter =s.m_hDepositors.begin();
00078 end =s.m_hDepositors.end();
00079 for(;iter!=end;++iter){m_hDepositors.push_back((*iter)->clone());}
00080
00081 m_eNormaliser = s.m_eNormaliser->clone();
00082 m_hNormaliser = s.m_hNormaliser->clone();
00083 }
00084
00085 return *this;
00086 }
00087
00088 Showerer::~Showerer(){
00089
00090 vector<IDepositor*>::iterator it;
00091 vector<IDepositor*>::iterator end;
00092
00093 it = m_eDepositors.begin();
00094 end = m_eDepositors.end();
00095 for(; it!= end; ++it){delete (*it);}
00096
00097 it = m_hDepositors.begin();
00098 end = m_hDepositors.end();
00099 for(; it!= end; ++it){delete (*it);}
00100
00101 delete m_eNormaliser;
00102 delete m_hNormaliser;
00103 }
00104
00105 void Showerer::shower(ParticleParameters& pp,
00106 Gridlet* g,
00107 Normalisations& eNorms,
00108 Normalisations& hNorms) const {
00111 pp.setEnergyLimiter(m_eLimiter);
00112
00114 this->normalise(pp, eNorms, hNorms);
00115
00116 vector<IDepositor*>::const_iterator it;
00117
00118
00119 it = m_eDepositors.begin();
00120 for(; it!= m_eDepositors.end(); ++it){
00121 (*it)->deposit(pp, eNorms, g->emDeposits());
00122 }
00123
00124
00125 it = m_hDepositors.begin();
00126 for(; it!= m_hDepositors.end(); ++it){
00127 (*it)->deposit(pp, hNorms, g->hadDeposits());
00128 }
00129 }
00130
00131 void Showerer::normalise(const ParticleParameters& pp,
00132 Normalisations& eNorms,
00133 Normalisations& hNorms) const{
00134
00135
00136 m_eNormaliser->scale(eNorms,pp);
00137 m_hNormaliser->scale(hNorms,pp);
00138 }
00139
00140 void Showerer::components(IDebug::Cpts& c) const{
00141 c.push_back(m_eNormaliser);
00142 c.push_back(m_hNormaliser);
00143 std::copy(m_eDepositors.begin(), m_eDepositors.end(), back_inserter(c));
00144 std::copy(m_hDepositors.begin(), m_hDepositors.end(), back_inserter(c));
00145 }
00146 }
00147
00148
00149