AmpTools
AmpToolsInterfaceMPI.cc
Go to the documentation of this file.
1 #include <mpi.h>
2 #include <pthread.h>
3 
11 #include "IUAmpTools/FitResults.h"
12 
17 
19 
20 
21  MPI_Comm_rank( MPI_COMM_WORLD, &m_rank );
22  MPI_Comm_size( MPI_COMM_WORLD, &m_numProc );
23 
24 
26 
27 
28  // ************************
29  // create a MinuitMinimizationManager
30  // ************************
31 
34 
35 
36  // ************************
37  // create an AmplitudeManager for each reaction
38  // ************************
39 
40  for (unsigned int irct = 0; irct < m_configurationInfo->reactionList().size(); irct++){
41 
42  ReactionInfo* reaction = m_configurationInfo->reactionList()[irct];
43  string reactionName(reaction->reactionName());
44 
45  AmplitudeManager* ampMan = new AmplitudeManager(reaction->particleList(),reactionName);
46  for (unsigned int i = 0; i < m_userAmplitudes.size(); i++){
48  }
49  ampMan->setupFromConfigurationInfo( m_configurationInfo );
50  m_intensityManagers.push_back(ampMan);
51 
52  }
53 
54  // ************************
55  // create a ParameterManager
56  // ************************
57 
58  ParameterManagerMPI* parameterManagerMPI = NULL;
59  if (m_rank != 0){
60  parameterManagerMPI = new ParameterManagerMPI( m_intensityManagers );
61  }
62  else{
63  parameterManagerMPI = new ParameterManagerMPI( m_minuitMinimizationManager,
65  }
66  parameterManagerMPI->setupFromConfigurationInfo( m_configurationInfo );
67  m_parameterManager = parameterManagerMPI;
68 
69 
70 
71 
72  // ************************
73  // loop over reactions
74  // ************************
75 
76  for (unsigned int irct = 0; irct < m_configurationInfo->reactionList().size(); irct++){
77 
78  ReactionInfo* reaction = m_configurationInfo->reactionList()[irct];
79  string reactionName(reaction->reactionName());
80  IntensityManager* intenMan = intensityManager(reactionName);
81 
82 
83  // ************************
84  // create DataReaders
85  // ************************
86 
87  for (unsigned int i = 0; i < m_userDataReaders.size(); i++){
88  if (reaction->data().first == m_userDataReaders[i]->name())
89  m_dataReaderMap[reactionName]
90  = m_userDataReaders[i]->newDataReader(reaction->data().second);
91  if (reaction->bkgnd().first == m_userDataReaders[i]->name())
92  m_bkgndReaderMap[reactionName]
93  = m_userDataReaders[i]->newDataReader(reaction->bkgnd().second);
94  if (reaction->genMC().first == m_userDataReaders[i]->name())
95  m_genMCReaderMap[reactionName]
96  = m_userDataReaders[i]->newDataReader(reaction->genMC().second);
97  if (reaction->accMC().first == m_userDataReaders[i]->name())
98  m_accMCReaderMap[reactionName]
99  = m_userDataReaders[i]->newDataReader(reaction->accMC().second);
100  }
101  DataReader* dataRdr = dataReader(reactionName);
102  DataReader* bkgndRdr = bkgndReader(reactionName);
103  DataReader* genMCRdr = genMCReader(reactionName);
104  DataReader* accMCRdr = accMCReader(reactionName);
105 
106  // ************************
107  // create a NormIntInterface
108  // ************************
109 
110  NormIntInterface* normInt = NULL;
111  if (genMCRdr && accMCRdr && intenMan && !(reaction->normIntFileInput())){
112  normInt = new NormIntInterfaceMPI(genMCRdr, accMCRdr, *intenMan);
113  m_normIntMap[reactionName] = normInt;
114  if (reaction->normIntFile() == "")
115  cout << "AmpToolsInterface WARNING: no name given to NormInt file for reaction "
116  << reactionName << endl;
117  }
118  else if (reaction->normIntFileInput()){
119  normInt = new NormIntInterfaceMPI(reaction->normIntFile());
120  m_normIntMap[reactionName] = normInt;
121  }
122  else{
123  cout << "AmpToolsInterface WARNING: not creating a NormIntInterface for reaction "
124  << reactionName << endl;
125  }
126 
127  // ************************
128  // create a LikelihoodCalculator
129  // ************************
130 
131  LikelihoodCalculatorMPI* likCalc = NULL;
132  if (intenMan && normInt && dataRdr && m_parameterManager){
133  likCalc = new LikelihoodCalculatorMPI(*intenMan, *normInt, dataRdr, bkgndRdr, *parameterManagerMPI);
134  m_likCalcMap[reactionName] = likCalc;
135  }
136  else{
137  cout << "AmpToolsInterface ERROR: not creating a LikelihoodCalculator for reaction "
138  << reactionName << endl;
139  exit(1);
140  }
141  }
142 
143  // ************************
144  // create FitResults
145  // ************************
146 
149  m_likCalcMap,
150  m_normIntMap,
153 
154 
155  if (m_rank != 0) LikelihoodManagerMPI::deliverLikelihood();
156 
157 }
158 
159 
160 
161 
162 
163 void
165 
166  if (m_rank != 0){
167 
168  // this forceCacheUpdate on the workers executes simultaneously with the
169  // same call in FitResults::writeResults on the master
170 
171  for (unsigned int irct = 0; irct < m_configurationInfo->reactionList().size(); irct++){
172  ReactionInfo* reaction = m_configurationInfo->reactionList()[irct];
173  string reactionName(reaction->reactionName());
174  NormIntInterface* normInt = normIntInterface(reactionName);
175  if (normInt->hasAccessToMC()) normInt->forceCacheUpdate();
176  }
177  }
178 
179  if (m_rank == 0){
180 
181  // ************************
182  // save fit parameters
183  // ************************
184 
185  string outputFile(m_configurationInfo->fitOutputFileName());
186  ofstream outFile(outputFile.c_str());
188 
189  // after saving the results destroy the LikelihoodCalculatorMPI
190  // class on the master -- this will break the worker nodes out
191  // of their deliverLikelihood loop and let them enter this routine
192 
193  for (unsigned int irct = 0;
194  irct < m_configurationInfo->reactionList().size(); irct++){
195  ReactionInfo* reaction = m_configurationInfo->reactionList()[irct];
196  string reactionName(reaction->reactionName());
197  if (m_likCalcMap.find(reactionName) != m_likCalcMap.end())
198  delete m_likCalcMap[reactionName];
199  m_likCalcMap.erase(reactionName);
200  }
201 
202  m_fitResults->writeResults( outputFile );
203  }
204 
205  // ************************
206  // save normalization integrals
207  // ************************
208 
209  // this runs on both the workers and the masters simultaneously
210 
211  for (unsigned int irct = 0; irct < m_configurationInfo->reactionList().size(); irct++){
212 
213  ReactionInfo* reaction = m_configurationInfo->reactionList()[irct];
214  string reactionName(reaction->reactionName());
215  NormIntInterface* normInt = normIntInterface(reactionName);
216  // the call to FitResults::writeResults will force a cache update
217  // there is no need to do it twice
218  // if (normInt->hasAccessToMC()) normInt->forceCacheUpdate();
219  if( m_rank == 0 ) normInt->exportNormIntCache( reaction->normIntFile() );
220  }
221 }
222 
static vector< Amplitude * > m_userAmplitudes
vector< IntensityManager * > m_intensityManagers
static vector< DataReader * > m_userDataReaders
const pair< string, vector< string > > & accMC() const
void setupFromConfigurationInfo(ConfigurationInfo *cfgInfo)
map< string, NormIntInterface * > m_normIntMap
void registerAmplitudeFactor(const Amplitude &defaultAmplitude)
const vector< string > & particleList() const
DataReader * dataReader(const string &reactionName) const
map< string, DataReader * > m_dataReaderMap
map< string, DataReader * > m_accMCReaderMap
void writeResults(const string &fileName) const
Definition: FitResults.cc:622
ParameterManager * m_parameterManager
map< string, DataReader * > m_genMCReaderMap
ConfigurationInfo * m_configurationInfo
#define NULL
Definition: URtypes.h:72
const pair< string, vector< string > > & genMC() const
map< string, DataReader * > m_bkgndReaderMap
ConfigurationInfo * configurationInfo() const
map< string, LikelihoodCalculator * > m_likCalcMap
const pair< string, vector< string > > & data() const
FitResults * m_fitResults
DataReader * bkgndReader(const string &reactionName) const
bool normIntFileInput() const
IntensityManager * intensityManager(const string &reactionName) const
string fitOutputFileName() const
void saveResults()
Definition: FitResults.cc:610
vector< ReactionInfo * > reactionList(const string &reactionName="") const
DataReader * accMCReader(const string &reactionName) const
AmpToolsInterfaceMPI(ConfigurationInfo *cfgInfo)
string reactionName() const
NormIntInterface * normIntInterface(const string &reactionName) const
const pair< string, vector< string > > & bkgnd() const
string normIntFile() const
MinuitMinimizationManager * m_minuitMinimizationManager
DataReader * genMCReader(const string &reactionName) const