54 m_minuitManager( minuitManager ),
57 m_minuitManager->
attach(
this );
58 m_intenManagers.push_back(intenManager);
64 const vector<IntensityManager*>& intenManagers ) :
66 m_minuitManager( minuitManager ),
67 m_intenManagers( intenManagers )
69 m_minuitManager->
attach(
this );
82 m_minuitManager(
NULL ),
85 m_intenManagers.push_back(ampManager);
90 ParameterManager(
const vector<IntensityManager*>& intenManagers ) :
91 m_minuitManager(
NULL ),
92 m_intenManagers( intenManagers )
99 for( vector< ComplexParameter* >::iterator parItr = m_prodPtrCache.begin();
100 parItr != m_prodPtrCache.end();
106 for( vector< MinuitParameter* >::iterator parItr = m_ampPtrCache.begin();
107 parItr != m_ampPtrCache.end();
113 for( vector< GaussianBound* >::iterator boundItr = m_boundPtrCache.begin();
114 boundItr != m_boundPtrCache.end();
132 for( vector< AmplitudeInfo* >::iterator ampItr = amps.begin();
133 ampItr != amps.end();
139 for( vector< AmplitudeInfo* >::iterator ampItr = amps.begin();
140 ampItr != amps.end();
143 vector< ParameterInfo* > pars = (**ampItr).parameters();
145 for( vector< ParameterInfo* >::const_iterator parItr = pars.begin();
146 parItr != pars.end();
158 const string& parName = parInfo->
parName();
162 map< string, MinuitParameter* >::iterator mapItr = m_ampParams.find( parName );
165 if( mapItr == m_ampParams.end() ){
175 if( parInfo->
fixed() ){
191 m_boundPtrCache.push_back( boundPtr );
195 m_ampPtrCache.push_back( parPtr );
196 m_ampParams[parName] = parPtr;
200 parPtr = mapItr->second;
204 bool foundOne =
false;
205 vector< IntensityManager* >::iterator intenManPtr = m_intenManagers.begin();
206 for( ; intenManPtr != m_intenManagers.end(); ++intenManPtr ){
208 if( !(*intenManPtr)->hasTerm( termName ) )
continue;
212 if( parInfo->
fixed() ){
218 (**intenManPtr).setParValue( termName, parName, parInfo->
value() );
222 (**intenManPtr).setParPtr( termName, parName, parPtr->
constValuePtr() );
228 cout <<
"WARNING: could not find amplitude named " << termName
229 <<
" while trying to set parameter " << parName << endl;
239 vector< IntensityManager* >::iterator intenManPtr = m_intenManagers.begin();
240 for( ; intenManPtr != m_intenManagers.end(); ++intenManPtr ){
241 if( (*intenManPtr)->hasTerm( termName ) )
break;
243 if( intenManPtr == m_intenManagers.end() ){
244 cout <<
"ParameterManager ERROR: Could not find production amplitude for " 253 complex< double > initialValue = (**intenManPtr).productionFactor( termName ) /
254 (double)(**intenManPtr).getScale( termName );
266 par =
new ComplexParameter( termName, *m_minuitManager, initialValue, real );
267 m_prodPtrCache.push_back( par );
270 if( fixed ) par->
fix();
274 (**intenManPtr).setExternalProductionFactor( termName,
279 m_prodParams[termName] = par;
286 map< string, ComplexParameter* >::iterator mapItr
287 = m_prodParams.find( termName );
290 assert( mapItr != m_prodParams.end() );
292 return mapItr->second->valuePtr();
298 map< string, MinuitParameter* >::iterator mapItr = m_ampParams.find( parName );
301 assert( mapItr != m_ampParams.end() );
303 return mapItr->second->valuePtr();
308 map<string, vector<string> >::const_iterator
309 mapItr = m_constraintMap.find(termName);
310 return (mapItr != m_constraintMap.end()) ?
true :
false;
315 map<string, ComplexParameter* >::const_iterator
316 mapItr = m_prodParams.find(termName);
317 return (mapItr != m_prodParams.end()) ?
true :
false;
321 ParameterManager::findParameter(
const string& termName)
const{
325 map<string, ComplexParameter*>::const_iterator pItr = m_prodParams.find(termName);
326 if (pItr != m_prodParams.end())
return pItr->second;
331 map<
string, vector<string> >::const_iterator cItr = m_constraintMap.find(termName);
332 if (cItr == m_constraintMap.end())
return NULL;
334 vector<string> constraints = cItr->second;
335 for (
unsigned int i = 0; i < constraints.size(); i++){
336 pItr = m_prodParams.find(constraints[i]);
337 if (pItr != m_prodParams.end())
return pItr->second;
353 for( map< string, MinuitParameter* >::const_iterator mapItr = m_ampParams.begin();
354 mapItr != m_ampParams.end();
357 if( mapItr->second == parPtr ){
366 updateParCovariance();
374 for( vector< IntensityManager* >::const_iterator intenMan = m_intenManagers.begin();
375 intenMan != m_intenManagers.end();
378 (**intenMan).updatePar( parName );
383 ParameterManager::updateParCovariance(){
389 vector< int > prodParMinuitIndex( 0 );
390 int numMinuitPars = 0;
391 for( vector< ComplexParameter* >::const_iterator par = m_prodPtrCache.begin();
392 par != m_prodPtrCache.end();
395 if( (**par).isFixed() ){
406 prodParMinuitIndex.push_back( numMinuitPars );
407 numMinuitPars += ( (**par).isPurelyReal() ? 1 : 2 );
411 vector< int > minuitParIndex( 0 );
421 for( vector< IntensityManager* >::const_iterator intenMan = m_intenManagers.begin();
422 intenMan != m_intenManagers.end();
425 const vector< string >& termNames = (**intenMan).getTermNames();
426 for( vector< string >::const_iterator name = termNames.begin();
427 name != termNames.end();
436 vector< ComplexParameter* >::const_iterator parItr =
437 find( m_prodPtrCache.begin(), m_prodPtrCache.end(), prodPar );
438 assert( parItr != m_prodPtrCache.end() );
439 int cacheIndex = parItr - m_prodPtrCache.begin();
447 minuitParIndex.push_back( prodPar->
isFixed() ?
451 m_parList.push_back( (*name) +
"_re" );
452 m_parValues.push_back( real( prodPar->
value() ) );
453 m_parIndex[m_parList.back()] = index++;
459 kFixedIndex : prodParMinuitIndex[cacheIndex] + 1 );
462 m_parList.push_back( (*name) +
"_im" );
463 m_parValues.push_back( imag( prodPar->
value() ) );
464 m_parIndex[m_parList.back()] = index++;
470 for( vector< MinuitParameter* >::const_iterator ampPar = m_ampPtrCache.begin();
471 ampPar != m_ampPtrCache.end();
476 if( (**ampPar).floating() ){
481 minuitParIndex.push_back( numMinuitPars );
489 m_parList.push_back( (**ampPar).name() );
490 m_parValues.push_back( (**ampPar).value() );
491 m_parIndex[m_parList.back()] = index++;
497 int nPar = m_parList.size();
499 const vector< vector< double > >& minCovMtx =
503 for(
int i = 0; i < nPar; ++i ){
506 m_covMatrix.push_back( vector< double >( nPar ) );
508 for(
int j = 0; j < nPar; ++j ){
510 int iIndex = minuitParIndex[i];
511 int jIndex = minuitParIndex[j];
518 m_covMatrix[i][j] = 0;
527 assert( iIndex < minCovMtx.size() );
528 assert( jIndex < minCovMtx.size() );
530 m_covMatrix[i][j] = minCovMtx[iIndex][jIndex];
double * getAmpParPtr(const string &parName)
double gaussianError() const
bool gaussianBounded() const
void setupFromConfigurationInfo(ConfigurationInfo *cfgInfo)
bool hasConstraints(const string &Name) const
map< string, vector< string > > constraintMap() const
double upperBound() const
ParameterManager(MinuitMinimizationManager *minuitManager, IntensityManager *intenManager)
virtual void addAmplitudeParameter(const string &Name, const ParameterInfo *parInfo)
void bound(double lowerBound, double upperBound)
const double * constValuePtr() const
void update(const MISubject *parPtr)
virtual void addProductionParameter(const string &Name, bool real=false, bool fixed=false)
void attach(MIObserver *)
double lowerBound() const
complex< double > * getProdParPtr(const string &Name)
vector< AmplitudeInfo * > amplitudeList(const string &reactionName="", const string &sumName="", const string &Name="") const
vector< vector< double > > covarianceMatrix()
MinuitParameterManager & parameterManager()
double centralValue() const
bool isPurelyReal() const
bool hasParameter(const string &Name) const
const complex< double > * constValuePtr() const
complex< double > value() const