114 #include <CLHEP/Vector/LorentzVector.h> 146 #include "HepPDT/defs.h" 147 #include "HepPDT/TableBuilder.hh" 148 #include "HepPDT/ParticleDataTable.hh" 150 #include "HepMC/GenParticle.h" 151 #include "HepMC/GenEvent.h" 171 #include "valgrind/callgrind.h" 199 void beginOfJobInConstructor();
202 void endOfJob()
override;
204 void startingNewLoop(
unsigned int iLoop )
override;
207 virtual void endOfFastLoop(
const unsigned int iLoop );
214 virtual void duringFastLoop();
217 std::vector<MuScleFitMuon> fillMuonCollection(
const std::vector<T>&
tracks );
236 void takeSelectedMuonType(
const T &
muon, std::vector<reco::Track> & tracks);
238 bool selGlobalMuon(
const pat::Muon* aMuon);
239 bool selTrackerMuon(
const pat::Muon* aMuon);
255 void checkParameters();
271 double minResMass_hwindow[6];
272 double maxResMass_hwindow[6];
318 std::vector<MuScleFitMuon>
muons;
319 typename std::vector<T>::const_iterator
track;
320 for( track = tracks.begin(); track != tracks.end(); ++
track ) {
329 <<
": initial value Pt = " << mu.Pt() << std::endl;
332 applyBias(mu, track->charge());
333 if (debug_>0)
std::cout<<
"track charge: "<<track->charge()<<std::endl;
335 Double_t hitsTk = track->innerTrack()->hitPattern().numberOfValidTrackerHits();
336 Double_t hitsMuon = track->innerTrack()->hitPattern().numberOfValidMuonHits();
337 Double_t ptError = track->innerTrack()->ptError();
340 std::cout<<
"[MuScleFit::fillMuonCollection]"<<std::endl;
346 muons.push_back (
muon);
358 if(muon->isGlobalMuon() && theMuonType_==1)
359 tracks.push_back(*(muon->globalTrack()));
360 else if(muon->isStandAloneMuon() && theMuonType_==2)
361 tracks.push_back(*(muon->outerTrack()));
362 else if(muon->isTrackerMuon() && theMuonType_==3)
363 tracks.push_back(*(muon->innerTrack()));
365 else if( theMuonType_ == 10 && !(muon->isStandAloneMuon()) )
366 tracks.push_back(*(muon->innerTrack()));
367 else if( theMuonType_ == 11 && muon->isGlobalMuon() )
368 tracks.push_back(*(muon->innerTrack()));
369 else if( theMuonType_ == 13 && muon->isTrackerMuon() )
370 tracks.push_back(*(muon->innerTrack()));
383 if ((theMuonType_<-4 || theMuonType_>5) &&
theMuonType_<10) {
384 std::cout <<
"[MuScleFit]: Unknown muon type! Aborting." << std::endl;
428 int resolFitType = pset.
getParameter<
int>(
"ResolFitType");
514 if (MuScleFitUtils::SmearType>0) {
515 std::cout <<
"[MuScleFit-Constructor]: Generating random values for smearing" << std::endl;
516 TF1
G(
"G",
"[0]*exp(-0.5*pow(x,2))", -5., 5.);
518 G.SetParameter (0,norm);
519 for (
int i=0;
i<10000;
i++) {
520 for (
int j=0; j<7; j++) {
542 MuScleFitUtils::rapidityBinsForZ_ =
false;
567 MuScleFitUtils::resfind,
568 MuScleFitUtils::speedup, genParticlesName_,
569 compareToSimTracks_, simTracksCollection_,
570 MuScleFitUtils::sherpa_,
debug_));
573 pset.
getParameter<std::vector<double> >(
"LeftWindowBorder"),
574 pset.
getParameter<std::vector<double> >(
"RightWindowBorder"),
606 std::cout <<
"Saving muon pairs to root tree" << std::endl;
611 std::vector<MuonPair>::const_iterator it =
muonPairs_.begin();
612 std::cout<<
"[MuScleFit::~MuScleFit] (Destructor)"<<std::endl;
614 std::cout<<
" Debugging pairs that are going to be written to file"<<std::endl;
615 std::cout<<
" muon1 = "<<it->mu1<<std::endl;
616 std::cout<<
" muon2 = "<<it->mu2<<std::endl;
649 std::stringstream ss;
652 theFiles_.push_back (
new TFile(rootFileName.c_str(),
"RECREATE"));
654 if (
debug_>0)
std::cout <<
"[MuScleFit]: Root file created" << std::endl;
656 std::cout <<
"creating plotter" << std::endl;
671 if (
debug_>0)
std::cout <<
"[MuScleFit]: Starting loop # " << iLoop << std::endl;
698 unsigned int iFastLoop = 1;
715 std::cout <<
"Starting fast loop number " << iFastLoop << std::endl;
725 if(
iev%50000 == 0 ) {
726 std::cout <<
"Fast looping on event number " <<
iev << std::endl;
731 std::cout <<
"End of fast loop number " << iFastLoop <<
". Ran on " <<
iev <<
" events" << std::endl;
753 std::cout <<
"Ending loop # " << iLoop << std::endl;
763 TDirectory * likelihoodDir =
theFiles_[iLoop]->mkdir(
"likelihood");
784 bool isFired =
false;
789 isFired =triggerResults->
accept();
791 std::cout<<
"Trigger "<<isFired<<std::endl;
801 for (
unsigned i=0;
i<triggerNames.
size();
i++) {
805 for (
unsigned int ipath=0; ipath<
triggerPath_.size(); ipath++ ) {
806 if ( hltName.find(
triggerPath_[ipath]) != std::string::npos ) {
807 unsigned int triggerIndex( hltConfig.
triggerIndex(hltName) );
810 if (triggerIndex < triggerResults->
size()) {
811 isFired = triggerResults->
accept(triggerIndex);
825 CALLGRIND_START_INSTRUMENTATION;
830 <<
" Run: " <<
event.id().run() <<
" Event: " <<
event.id().event() << std::endl;
851 CALLGRIND_STOP_INSTRUMENTATION;
852 CALLGRIND_DUMP_STATS;
861 std::vector<MuScleFitMuon>
muons;
866 std::cout<<
"[MuScleFit::selectMuons] Debugging muons collections after call to muonSelector_->selectMuons"<<std::endl;
868 for (std::vector<MuScleFitMuon>::const_iterator it = muons.begin(); it < muons.end(); ++it) {
869 std::cout<<
" - muon n. "<<iMu<<
" = "<<(*it)<<std::endl;
876 std::pair<MuScleFitMuon, MuScleFitMuon> recMuFromBestRes =
881 std::cout <<std::setprecision(9)<<
"Pt after findbestrecores: " << (recMuFromBestRes.first).
Pt() <<
" " 882 << (recMuFromBestRes.second).
Pt() << std::endl;
886 recMu1 = recMuFromBestRes.first.p4();
887 recMu2 = recMuFromBestRes.second.p4();
911 Int_t the_numPUvtx(0);
912 Float_t the_TrueNumInteractions(0);
919 std::vector<PileupSummaryInfo>::const_iterator PVI;
920 for(PVI = puInfo->begin(); PVI != puInfo->end(); ++PVI) {
921 int BX = PVI->getBunchCrossing();
923 the_TrueNumInteractions = PVI->getTrueNumInteractions();
924 the_numPUvtx = PVI->getPU_NumInteractions();
932 std::vector<reco::Vertex>::const_iterator itv;
934 for (itv = vertices->begin(); itv != vertices->end(); ++itv) {
936 if(itv->ndof()<5)
continue;
937 if(fabs(itv->z())>50.0)
continue;
938 if(fabs(itv->position().rho())>2.0)
continue;
945 event.getByLabel(
"generator", genEvtInfo);
946 double the_genEvtweight = 1.;
948 the_genEvtweight = genEvtInfo->
weight();
952 MuScleFitEvent(event.
run(),
event.id().event(), the_genEvtweight, the_numPUvtx, the_TrueNumInteractions, the_NVtx)
962 std::cout <<
"Reading muon pairs from Root Tree in " << treeFileName << std::endl;
964 std::vector<std::pair<unsigned int, unsigned long long> > evtRun;
972 std::vector<std::pair<unsigned int, unsigned long long> >::iterator evtRunIt = evtRun.begin();
974 std::vector<std::pair<MuScleFitMuon, MuScleFitMuon> >::iterator genIt;
981 double pt1 = it->first.pt();
983 double pt2 = it->second.pt();
985 double eta1 = it->first.eta();
987 double eta2 = it->second.eta();
990 bool dontPass =
false;
991 bool eta1InFirstRange;
992 bool eta2InFirstRange;
993 bool eta1InSecondRange;
994 bool eta2InSecondRange;
996 int ch1 = it->first.charge();
997 int ch2 = it->second.charge();
1010 ((eta1InFirstRange && eta2InSecondRange && ch1>=ch2)||(eta1InSecondRange && eta2InFirstRange && ch1<ch2))
1024 ((eta1InFirstRange && !eta2InFirstRange) && (eta2InSecondRange && !eta1InSecondRange) && ch1>=ch2) ||
1025 ((eta2InFirstRange && !eta1InFirstRange) && (eta1InSecondRange && !eta2InSecondRange) && ch1<ch2)
1058 MuScleFitEvent((*evtRunIt).first, (*evtRunIt).second, 0, 0, 0, 0))
1090 if(
debug_>0 )
std::cout <<
"About to start lik par correction and histo filling; ResFound is " 1103 <<
recMu1.Pt() <<
" Pt2 = " <<
recMu2.Pt() << std::endl;
1115 <<
recMu1.Pt() <<
" Pt2 = " <<
recMu2.Pt() << std::endl;
1129 mapHisto_[
"hRecBestRes"]->Fill(bestRecRes,+1, weight);
1130 mapHisto_[
"hRecBestResAllEvents"]->Fill(bestRecRes,+1, 1.);
1152 mapHisto_[
"hRecBestResVSRes"]->Fill (bestRecRes, bestRecRes, +1, weight);
1159 std::vector<double> * parval;
1160 std::vector<double> initpar;
1208 if(
debug_ > 0 )
std::cout <<
"mass = " << bestRecRes.mass() << std::endl;
1214 std::vector<double> initpar;
1242 if(
debug_ > 0 )
std::cout <<
"inside weight: mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1244 if(
debug_ > 0 )
std::cout <<
"inside prob: mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1253 if( recoMass != 0 ) {
1257 mapHisto_[
"hFunctionResolMassVSMu"]->Fill(
recMu1, massResol/recoMass, -1);
1258 mapHisto_[
"hFunctionResolMassVSMu"]->Fill(
recMu2, massResol/recoMass, +1);
1273 if( genMass != 0 ) {
1276 double diffMass = (recoMass - genMass)/genMass;
1280 double eta1 =
recMu1.eta();
1282 double eta2 =
recMu2.eta();
1284 if( diffMass == diffMass ) {
1286 mapHisto_[
"hDeltaMassOverGenMassVsPt"]->Fill(pt1, diffMass);
1287 mapHisto_[
"hDeltaMassOverGenMassVsPt"]->Fill(pt2, diffMass);
1288 mapHisto_[
"hDeltaMassOverGenMassVsEta"]->Fill(eta1, diffMass);
1289 mapHisto_[
"hDeltaMassOverGenMassVsEta"]->Fill(eta2, diffMass);
1291 mapHisto_[
"hMassResolutionVsPtEta"]->Fill(pt1, eta1, diffMass, diffMass);
1292 mapHisto_[
"hMassResolutionVsPtEta"]->Fill(pt2, eta2, diffMass, diffMass);
1295 std::cout <<
"Error, there is a nan: recoMass = " << recoMass <<
", genMass = " << genMass << std::endl;
1305 if(
debug_ > 0 )
std::cout <<
"mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1308 mapHisto_[
"hMassProbVsRes"]->Fill(bestRecRes, bestRecRes, +1, prob);
1311 mapHisto_[
"hMassProbVsRes_fine"]->Fill(bestRecRes, bestRecRes, +1, prob);
1321 if (
debug_>0)
std::cout <<
"[MuScleFit]: filling the pair" << std::endl;
1334 ((recMu.Eta()-genMu.Eta()) * (recMu.Eta()-genMu.Eta())));
1338 std::cout<<
"Reco muon "<<recMu<<
" with eta "<<recMu.Eta()<<
" and phi "<<recMu.Phi()<<std::endl
1339 <<
" DOES NOT MATCH with generated muon from resonance: "<<std::endl
1340 <<genMu<<
" with eta "<<genMu.Eta()<<
" and phi "<<genMu.Phi()<<std::endl;
1350 mapHisto_[
"hResolTheta"+
name]->Fill(recMu, (-genMu.Theta()+recMu.Theta()), charge);
1353 mapHisto_[
"hResolEta"+
name]->Fill(recMu, (-genMu.Eta()+recMu.Eta()),charge);
1357 if( (genMu.Pt() != 0) && (recMu.Pt() != 0) ) {
1358 mapHisto_[
"hPtRecoVsPt"+inputName]->Fill(genMu.Pt(), recMu.Pt());
1367 <<
": after smearing Pt = " << mu.Pt() << std::endl;
1376 <<
": after bias Pt = " << mu.Pt() << std::endl;
1387 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1392 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1397 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1402 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1421 MuScleFitUtils::BiasType<0 || MuScleFitUtils::BiasType>13) {
1422 std::cout <<
"[MuScleFit-Constructor]: Wrong bias type or number of parameters: aborting!" << std::endl;
1434 MuScleFitUtils::SmearType<0 || MuScleFitUtils::SmearType>7) {
1435 std::cout <<
"[MuScleFit-Constructor]: Wrong smear type or number of parameters: aborting!" << std::endl;
1442 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Resol: aborting!" << std::endl;
1447 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Scale: aborting!" << std::endl;
1452 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Bgr: aborting!" << std::endl;
1457 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Bgr: aborting!" << std::endl;
1464 std::cout <<
"[MuScleFit-Constructor]: resfind must have 6 elements (1 Z, 3 Y, 2 Psi): aborting!" << std::endl;
1478 iTrack->found() > 11 &&
1479 gTrack->chi2()/gTrack->ndof() < 20.0 &&
1481 iTrack->chi2()/iTrack->ndof() < 4.0 &&
1482 aMuon->
muonID(
"TrackerMuonArbitrated") &&
1483 aMuon->
muonID(
"TMLastStationAngTight") &&
1485 fabs(iTrack->dxy()) < 3.0 &&
1486 fabs(iTrack->dz()) < 15.0 );
1496 iTrack->found() > 11 &&
1497 iTrack->chi2()/iTrack->ndof() < 4.0 &&
1498 aMuon->
muonID(
"TrackerMuonArbitrated") &&
1499 aMuon->
muonID(
"TMLastStationAngTight") &&
1501 fabs(iTrack->dxy()) < 3.0 &&
1502 fabs(iTrack->dz()) < 15.0 );
static double deltaPhiNoFabs(const double &phi1, const double &phi2)
Without fabs at the end, used to have a symmetric distribution for the resolution fits and variance c...
static std::vector< std::pair< lorentzVector, lorentzVector > > simPair
static std::vector< int > doScaleFit
static std::vector< int > doResolFit
T getParameter(std::string const &) const
scaleFunctionBase< double * > * scaleFunctionService(const int identifier)
Service to build the scale functor corresponding to the passed identifier.
T getUntrackedParameter(std::string const &, T const &) const
static std::vector< double > parBias
void selectMuons(const edm::Event &event)
static std::vector< int > parCrossSectionOrder
std::vector< GenMuonPair > genMuonPairs_
Stores the genMuon pairs and the motherId prior to the creation of the internal tree.
static smearFunctionBase * smearFunction
static std::vector< int > parScaleOrder
edm::InputTag theMuonLabel_
static std::vector< int > doCrossSectionFit
static void minimizeLikelihood()
static double maxMuonEtaSecondRange_
std::vector< MuScleFitMuon > fillMuonCollection(const std::vector< T > &tracks)
static std::vector< int > parBgrOrder
bool selGlobalMuon(const pat::Muon *aMuon)
Function for onia selections.
static unsigned int loopCounter
static double deltaPhiMaxCut_
static std::vector< double > parResolMax
static std::vector< std::pair< MuScleFitMuon, MuScleFitMuon > > SavedPairMuScleFitMuons
static std::vector< std::pair< MuScleFitMuon, MuScleFitMuon > > genMuscleFitPair
static bool startWithSimplex_
std::string triggerResultsProcess_
static std::vector< int > doBackgroundFit
static std::vector< double > parResol
static bool debugMassResol_
virtual void duringFastLoop()
Sin< T >::type sin(const T &t)
bool accept() const
Has at least one path accepted the event?
static BackgroundHandler * backgroundHandler
static double x[7][10000]
static double massWindowHalfWidth[3][6]
#define DEFINE_FWK_LOOPER(type)
bool muonID(const std::string &name) const
Run const & getRun() const
std::map< std::string, Histograms * > mapHisto_
The map of histograms.
void readTree(const int maxEvents, const TString &fileName, MuonPairVector *savedPair, const int muonType, std::vector< std::pair< unsigned int, unsigned long long > > *evtRun, MuonPairVector *genPair=nullptr)
void fillTreeRec(const std::vector< std::pair< reco::Particle::LorentzVector, reco::Particle::LorentzVector > > &savedPairs)
Used when running on the root tree containing preselected muon pairs.
static scaleFunctionBase< std::vector< double > > * biasFunction
bool selTrackerMuon(const pat::Muon *aMuon)
void startingNewLoop(unsigned int iLoop) override
Strings::size_type size() const
static std::vector< int > parBgrFix
static std::vector< double > parResolMin
static bool minimumShapePlots_
int pixelLayersWithMeasurement() const
edm::InputTag simTracksCollection_
static int MuonTypeForCheckMassWindow
static double minMuonEtaFirstRange_
static double massProb(const double &mass, const double &rapidity, const int ires, const double &massResol)
void fillComparisonHistograms(const reco::Particle::LorentzVector &genMu, const reco::Particle::LorentzVector &recoMu, const std::string &inputName, const int charge)
Fill the reco vs gen and reco vs sim comparison histograms.
static struct MuScleFitUtils::massResolComponentsStruct massResolComponents
Strings const & triggerNames() const
std::vector< std::string > triggerPath_
static std::vector< int > parScaleFix
MuScleFitMuon recMuScleMu1
static bool computeMinosErrors_
reco::Particle::LorentzVector lorentzVector
static scaleFunctionBase< std::vector< double > > * scaleFunctionForVec
static std::vector< std::vector< double > > parvalue
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
U second(std::pair< T, U > const &p)
void writeTree(const TString &fileName, const std::vector< MuonPair > *savedPair, const int muonType=0, const std::vector< GenMuonPair > *genPair=nullptr, const bool saveAll=false)
static std::pair< MuScleFitMuon, MuScleFitMuon > findBestRecoRes(const std::vector< MuScleFitMuon > &muons)
static std::vector< std::pair< lorentzVector, lorentzVector > > genPair
std::string outputRootTreeFileName_
std::string theGenInfoRootFileName_
reco::TrackRef innerTrack() const override
reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
resolutionFunctionBase< std::vector< double > > * resolutionFunctionVecService(const int identifier)
Service to build the resolution functor corresponding to the passed identifier when receiving a std::...
static double massResolution(const lorentzVector &mu1, const lorentzVector &mu2)
reco::Particle::LorentzVector recMu2
static std::vector< double > parScaleMin
std::vector< double > vec1
reco::Particle::LorentzVector recMu1
static lorentzVector applyBias(const lorentzVector &muon, const int charge)
static std::vector< double > parBgr
unsigned int maxLoopNumber
MuonServiceProxy * theService
std::string genParticlesName_
Cos< T >::type cos(const T &t)
void clearHistoMap()
Clean the histograms map.
MuScleFitMuon recMuScleMu2
static double computeWeight(const double &mass, const int iev, const bool doUseBkgrWindow=false)
static std::vector< double > parScaleStep
static std::vector< std::pair< lorentzVector, lorentzVector > > SavedPair
MuScleFit(const edm::ParameterSet &pset)
static std::string const triggerResults
static lorentzVector applyScale(const lorentzVector &muon, const std::vector< double > &parval, const int charge)
static std::vector< int > parResolFix
static std::vector< double > parSmear
void beginOfJobInConstructor()
smearFunctionBase * smearFunctionService(const int identifier)
Service to build the smearing functor corresponding to the passed identifier.
static std::vector< int > parResolOrder
edm::EDLooper::Status duringLoop(const edm::Event &event, const edm::EventSetup &eventSetup) override
double deltaR(double eta1, double eta2, double phi1, double phi2)
static std::vector< double > parScaleMax
scaleFunctionBase< std::vector< double > > * scaleFunctionVecService(const int identifier)
Service to build the scale functor corresponding to the passed identifier when receiving a std::vecto...
void writeHistoMap(const unsigned int iLoop)
Save the histograms map to file.
static std::vector< double > parScale
static double oldNormalization_
void applySmearing(reco::Particle::LorentzVector &mu)
Apply the smearing if needed using the function in MuScleFitUtils.
reco::TrackRef globalTrack() const override
reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon) ...
std::string const & triggerName(unsigned int index) const
std::string theRootFileName_
void fillTreeGen(const std::vector< std::pair< reco::Particle::LorentzVector, reco::Particle::LorentzVector > > &genPairs)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d'tor
static double deltaPhiMinCut_
std::string triggerResultsLabel_
static bool rapidityBinsForZ_
MuScleFitPlotter * plotter
void fillHistoMap(TFile *outputFile, unsigned int iLoop)
Create the histograms map.
std::vector< TFile * > theFiles_
The files were the histograms are saved.
double minResMass_hwindow[6]
static bool separateRanges_
static double minMuonEtaSecondRange_
static std::vector< double > parCrossSection
static lorentzVector applySmearing(const lorentzVector &muon)
static bool normalizeLikelihoodByEventNumber_
std::string inputRootTreeFileName_
bool checkDeltaR(reco::Particle::LorentzVector &genMu, reco::Particle::LorentzVector &recMu)
Check if two lorentzVector are near in deltaR.
resolutionFunctionBase< double * > * resolutionFunctionService(const int identifier)
Service to build the resolution functor corresponding to the passed identifier.
int maxEventsFromRootTree_
double maxResMass_hwindow[6]
std::vector< MuonPair > muonPairs_
Used to store the muon pairs plus run and event number prior to the creation of the internal tree...
static double deltaPhi(const double &phi1, const double &phi2)
static scaleFunctionBase< double * > * scaleFunction
int numberOfValidMuonHits() const
static bool useProbsFile_
static std::vector< int > resfind
void readProbabilityDistributionsFromFile()
Read probability distributions from a local root file.
void takeSelectedMuonType(const T &muon, std::vector< reco::Track > &tracks)
Template method used to fill the track collection starting from reco::muons or pat::muons.
static int counter_resprob
static resolutionFunctionBase< std::vector< double > > * resolutionFunctionForVec
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Analysis-level muon class.
static double maxMuonEtaFirstRange_
std::unique_ptr< MuScleFitMuonSelector > muonSelector_
Power< A, B >::type pow(const A &a, const B &b)
void applyBias(reco::Particle::LorentzVector &mu, const int charge)
Apply the bias if needed using the function in MuScleFitUtils.
static CrossSectionHandler * crossSectionHandler
edm::EDLooper::Status endOfLoop(const edm::EventSetup &eventSetup, unsigned int iLoop) override
static std::vector< double > parResolStep
static std::vector< int > parCrossSectionFix
static resolutionFunctionBase< double * > * resolutionFunction
void addParameters(std::vector< double > &initpar)
Inputs the vars in a vector.
virtual void endOfFastLoop(const unsigned int iLoop)