From 200ebf4cdd980ee591e524ed78335f3aa1693ad4 Mon Sep 17 00:00:00 2001 From: Jana Schaarschmidt <jana.schaarschmidt@cern.ch> Date: Thu, 19 Apr 2018 20:10:03 +0200 Subject: [PATCH] Updates of FCS energy para and sim Former-commit-id: c79a7ed1b54b8c6125823d5437431afb2c67a0fb --- .../TFCS1DFunctionHistogram.h | 2 +- .../TFCS1DFunctionRegressionTF.h | 2 + .../TFCSPCAEnergyParametrization.h | 6 +- .../src/TFCS1DFunctionHistogram.cxx | 60 ++++++++------ .../src/TFCSPCAEnergyParametrization.cxx | 82 +++++++++++-------- 5 files changed, 87 insertions(+), 65 deletions(-) diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionHistogram.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionHistogram.h index dc052a790fb8..16310ed76c18 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionHistogram.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionHistogram.h @@ -23,6 +23,7 @@ class TFCS1DFunctionHistogram:public TFCS1DFunction TH1* vector_to_histo(); double get_inverse(double rnd); double linear(double x1,double x2,double y1,double y2,double x); + double non_linear(double x1,double x2,double y1,double y2,double x); double get_maxdev(TH1*, TH1D*); void smart_rebin_loop(TH1* hist, double); @@ -40,7 +41,6 @@ class TFCS1DFunctionHistogram:public TFCS1DFunction vector<float> m_HistoBorders; vector<float> m_HistoContents; - ClassDef(TFCS1DFunctionHistogram,1) //TFCS1DFunctionHistogram }; diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionRegressionTF.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionRegressionTF.h index e3d9d2aa0d1f..34e387d83a00 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionRegressionTF.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCS1DFunctionRegressionTF.h @@ -31,9 +31,11 @@ class TFCS1DFunctionRegressionTF:public TFCS1DFunctionRegression ClassDef(TFCS1DFunctionRegressionTF,1) }; + #if defined(__ROOTCLING__) && defined(__FastCaloSimStandAlone__) #pragma link C++ class TFCS1DFunctionRegressionTF+; #endif #endif + diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSPCAEnergyParametrization.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSPCAEnergyParametrization.h index 9b0d01007eae..34d6c1acc620 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSPCAEnergyParametrization.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSPCAEnergyParametrization.h @@ -31,15 +31,15 @@ class TFCSPCAEnergyParametrization:public TFCSEnergyParametrization virtual bool is_match_all_calosample() const {return false;}; void P2X(TVectorD*, TVectorD* , TMatrixD* , int, double* , double* , int); - void loadInputs(TFile* file); - void loadInputs(TFile* file,std::string); + bool loadInputs(TFile* file); + bool loadInputs(TFile* file,std::string); void Print(Option_t *option = "") const; private: std::vector<int> m_RelevantLayers; - std::vector<TMatrixDSym*> m_symCov; + std::vector<TMatrixD*> m_EV; std::vector<TVectorD*> m_MeanValues; std::vector<TVectorD*> m_SigmaValues; std::vector<TVectorD*> m_Gauss_means; diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCS1DFunctionHistogram.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCS1DFunctionHistogram.cxx index 9294c8ccebb2..70846c31a0d9 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCS1DFunctionHistogram.cxx +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCS1DFunctionHistogram.cxx @@ -113,7 +113,7 @@ void TFCS1DFunctionHistogram::smart_rebin_loop(TH1* hist, double cut_maxdev) maxdev=get_maxdev(hist,h_out); maxdev*=100.0; - + if(i%100==0) cout<<"Iteration nr. "<<i<<" -----> change "<<change<<" bins "<<h_out->GetNbinsX()<<" -> maxdev="<<maxdev<<endl; if(maxdev<cut_maxdev && h_out->GetNbinsX()>5 && i<1000) @@ -136,14 +136,14 @@ void TFCS1DFunctionHistogram::smart_rebin_loop(TH1* hist, double cut_maxdev) cout<<"Info: Rebinned histogram has "<<h_output->GetNbinsX()<<" bins."<<endl; //store: - for(int b=1;b<=h_output->GetNbinsX();b++) - m_HistoContents.push_back(h_output->GetBinContent(b)); for(int b=1;b<=h_output->GetNbinsX();b++) m_HistoBorders.push_back((float)h_output->GetBinLowEdge(b)); - m_HistoBorders.push_back((float)h_output->GetXaxis()->GetXmax()); + for(int b=1;b<h_output->GetNbinsX();b++) + m_HistoContents.push_back(h_output->GetBinContent(b)); + m_HistoContents.push_back(1); } @@ -244,6 +244,7 @@ double TFCS1DFunctionHistogram::rnd_to_fct(double rnd) { double value2=get_inverse(rnd); + return value2; } @@ -261,7 +262,21 @@ double TFCS1DFunctionHistogram::linear(double y1,double y2,double x1,double x2,d double n=y1-m*x1; x=(y-n)/m; } + + return x; +} +double TFCS1DFunctionHistogram::non_linear(double y1,double y2,double x1,double x2,double y) +{ + double x=-1; + double eps=0.0000000001; + if((y2-y1)<eps) x=x1; + else + { + double b=(x1-x2)/(sqrt(y1)-sqrt(y2)); + double a=x1-b*sqrt(y1); + x=a+b*sqrt(y); + } return x; } @@ -271,39 +286,34 @@ double TFCS1DFunctionHistogram::get_inverse(double rnd) double value = 0.; - if(rnd<m_HistoContents[0]+(m_HistoContents[1]-m_HistoContents[0])/2.0) + if(rnd<m_HistoContents[0]) { double x1=m_HistoBorders[0]; double x2=m_HistoBorders[1]; double y1=0; - double y2=m_HistoContents[0]+(m_HistoContents[1]-m_HistoContents[0])/2.0; - double x=linear(y1,y2,x1,x2,rnd); + double y2=m_HistoContents[0]; + double x=non_linear(y1,y2,x1,x2,rnd); value=x; } else { - for(unsigned int b=0;b<m_HistoContents.size()-1;b++) + //find the first HistoContent element that is larger than rnd: + vector<float>::iterator larger_element = std::upper_bound(m_HistoContents.begin(), m_HistoContents.end(), rnd); + int index=larger_element-m_HistoContents.begin(); + double y=m_HistoContents[index]; + double x1=m_HistoBorders[index]; + double x2=m_HistoBorders[index+1]; + double y1=m_HistoContents[index-1]; + double y2=y; + if((index+1)==((int)m_HistoContents.size()-1)) { - double y=m_HistoContents[b]+(m_HistoContents[b+1]-m_HistoContents[b])/2.0; - if(y>rnd) - { - double x1=m_HistoBorders[b]; - double x2=m_HistoBorders[b+1]; - double y1=m_HistoContents[b-1]+(m_HistoContents[b]-m_HistoContents[b-1])/2.0; - double y2=y; - if((b+1)==m_HistoContents.size()-1) - { - x2=m_HistoBorders[m_HistoBorders.size()-1]; - y2=1; - } - double x=linear(y1,y2,x1,x2,rnd); - value=x; - break; - } + x2=m_HistoBorders[m_HistoBorders.size()-1]; + y2=m_HistoContents[m_HistoContents.size()-1]; } + double x=non_linear(y1,y2,x1,x2,rnd); + value=x; } return value; } - diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSPCAEnergyParametrization.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSPCAEnergyParametrization.cxx index dc111f5ae897..60d9a85cf526 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSPCAEnergyParametrization.cxx +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSPCAEnergyParametrization.cxx @@ -61,20 +61,15 @@ void TFCSPCAEnergyParametrization::simulate(TFCSSimulationState& simulstate,cons { int pcabin=simulstate.Ebin(); - - TMatrixDSym* symCov =m_symCov[pcabin-1]; - - TMatrixDSymEigen cov_eigen(*symCov); - TMatrixD EV1 = cov_eigen.GetEigenVectors(); - TMatrixD* EV=&EV1; - - TVectorD* MeanValues =m_MeanValues[pcabin-1]; - TVectorD* SigmaValues =m_SigmaValues[pcabin-1]; - TVectorD* Gauss_means =m_Gauss_means[pcabin-1]; - TVectorD* Gauss_rms =m_Gauss_rms[pcabin-1]; - TVectorD* LowerBounds =m_LowerBounds[pcabin-1]; + + TMatrixD* EV =m_EV[pcabin-1]; + TVectorD* MeanValues =m_MeanValues[pcabin-1]; + TVectorD* SigmaValues =m_SigmaValues[pcabin-1]; + TVectorD* Gauss_means =m_Gauss_means[pcabin-1]; + TVectorD* Gauss_rms =m_Gauss_rms[pcabin-1]; + TVectorD* LowerBounds =m_LowerBounds[pcabin-1]; std::vector<TFCS1DFunction*> cumulative=m_cumulative[pcabin-1]; - + TRandom3* Random3=new TRandom3(); Random3->SetSeed(0); std::vector<std::string> layer; @@ -87,7 +82,7 @@ void TFCSPCAEnergyParametrization::simulate(TFCSSimulationState& simulstate,cons layer.push_back(thislayer); } layer.push_back("totalE"); - + double* vals_gauss_means=(double*)Gauss_means->GetMatrixArray(); double* vals_gauss_rms =Gauss_rms->GetMatrixArray(); double* vals_lowerBounds=LowerBounds->GetMatrixArray(); @@ -102,7 +97,7 @@ void TFCSPCAEnergyParametrization::simulate(TFCSSimulationState& simulstate,cons double gauszz=Random3->Gaus(mean,rms); input_data[l]=gauszz; } - + P2X(SigmaValues, MeanValues, EV, layer.size(), input_data, output_data, layer.size()); double *simdata_uniform = new double[layer.size()]; @@ -139,7 +134,8 @@ void TFCSPCAEnergyParametrization::simulate(TFCSSimulationState& simulstate,cons } } - double total_energy=simdata[layer.size()-1]; + double total_energy=simdata[layer.size()-1]*simulstate.E()/Ekin_nominal(); + //double total_energy=simdata[layer.size()-1]; simulstate.set_E(total_energy); ATH_MSG_DEBUG("set E to total_energy="<<total_energy); @@ -181,13 +177,17 @@ void TFCSPCAEnergyParametrization::P2X(TVectorD* SigmaValues, TVectorD* MeanValu } } } -void TFCSPCAEnergyParametrization::loadInputs(TFile* file){ - loadInputs(file, ""); -} -void TFCSPCAEnergyParametrization::loadInputs(TFile* file, std::string folder) +bool TFCSPCAEnergyParametrization::loadInputs(TFile* file) { + return loadInputs(file, ""); +} +bool TFCSPCAEnergyParametrization::loadInputs(TFile* file, std::string folder) +{ + + bool load_ok=1; + int trynext=1; TString x; if(folder=="") x="bin"; @@ -207,13 +207,17 @@ void TFCSPCAEnergyParametrization::loadInputs(TFile* file, std::string folder) file->cd(x+"1/pca"); IntArray* RelevantLayers=(IntArray*)gDirectory->Get("RelevantLayers"); - if(RelevantLayers == NULL) { + if(RelevantLayers == NULL) + { ATH_MSG_ERROR("TFCSPCAEnergyParametrization::m_RelevantLayers in first pcabin is null!"); - } else { - m_RelevantLayers.reserve(RelevantLayers->GetSize()); - for(int i=0;i<RelevantLayers->GetSize();i++) m_RelevantLayers.push_back(RelevantLayers->GetAt(i)); + load_ok=false; } - + + if(!load_ok) return false; + + m_RelevantLayers.reserve(RelevantLayers->GetSize()); + for(int i=0;i<RelevantLayers->GetSize();i++) m_RelevantLayers.push_back(RelevantLayers->GetAt(i)); + for(int bin=1;bin<=m_numberpcabins;bin++) { @@ -225,24 +229,28 @@ void TFCSPCAEnergyParametrization::loadInputs(TFile* file, std::string folder) TVectorD* Gauss_means =(TVectorD*)gDirectory->Get("Gauss_means"); TVectorD* Gauss_rms =(TVectorD*)gDirectory->Get("Gauss_rms"); TVectorD* LowerBounds =(TVectorD*)gDirectory->Get("LowerBounds"); - - if(symCov == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_symCov in pcabin "<<bin<<" is null!"); - if(MeanValues == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_MeanValues in pcabin "<<bin<<" is null!"); - if(SigmaValues == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_SigmaValues in pcabin "<<bin<<" is null!"); - if(Gauss_means == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_Gauss_means in pcabin "<<bin<<" is null!"); - if(Gauss_rms == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_Gause_rms in pcabin "<<bin<<" is null!"); - if(LowerBounds == NULL) ATH_MSG_WARNING("TFCSPCAEnergyParametrization::m_LowerBounds in pcabin "<<bin<<" is null!"); - - m_symCov.push_back(symCov); + + if(symCov == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::symCov in pcabin "<<bin<<" is null!"); load_ok=false;} + if(MeanValues == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::MeanValues in pcabin "<<bin<<" is null!"); load_ok=false;} + if(SigmaValues == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::SigmaValues in pcabin "<<bin<<" is null!"); load_ok=false;} + if(Gauss_means == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::Gauss_means in pcabin "<<bin<<" is null!"); load_ok=false;} + if(Gauss_rms == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::Gause_rms in pcabin "<<bin<<" is null!"); load_ok=false;} + if(LowerBounds == NULL) {ATH_MSG_WARNING("TFCSPCAEnergyParametrization::LowerBounds in pcabin "<<bin<<" is null!"); load_ok=false;} + + if(!load_ok) return false; + + TMatrixDSymEigen cov_eigen(*symCov); + TMatrixD *EV = new TMatrixD(cov_eigen.GetEigenVectors()); + m_EV.push_back(EV); m_MeanValues.push_back(MeanValues); m_SigmaValues.push_back(SigmaValues); m_Gauss_means.push_back(Gauss_means); m_Gauss_rms.push_back(Gauss_rms); m_LowerBounds.push_back(LowerBounds); - + std::vector<std::string> layer; std::vector<int> layerNr; - + for(unsigned int i=0;i<m_RelevantLayers.size();i++) layerNr.push_back(m_RelevantLayers[i]); @@ -273,4 +281,6 @@ void TFCSPCAEnergyParametrization::loadInputs(TFile* file, std::string folder) } + return true; + } -- GitLab