Go to the documentation of this file.00001
00008 #include "Calibration/EcalCalibAlgos/interface/IMACalibBlock.h"
00009 #include "Calibration/EcalCalibAlgos/interface/BlockSolver.h"
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "TH1F.h"
00012 #include "TFile.h"
00013 #include <cassert>
00014
00015
00016
00017
00018 IMACalibBlock::IMACalibBlock (const int numberOfElements):
00019 VEcalCalibBlock (numberOfElements) ,
00020 m_kaliVector (m_numberOfElements) ,
00021 m_kaliMatrix (evalX2Size ())
00022 {
00023 reset () ;
00024 }
00025
00026
00027
00028
00029
00030 IMACalibBlock::~IMACalibBlock()
00031 {
00032 }
00033
00034
00035
00036
00037
00038 void
00039 IMACalibBlock::Fill (std::map<int,double>::const_iterator MapBegin,
00040 std::map<int,double>::const_iterator MapEnd ,
00041 double pTk,
00042 double pSubtract,
00043 double sigma)
00044 {
00045
00046 double inverror = 1./sigma ;
00047
00048 for (std::map<int,double>::const_iterator itMap1 =MapBegin ;
00049 itMap1 !=MapEnd ;
00050 ++itMap1)
00051 {
00052
00053 for (std::map<int,double>::const_iterator itMap2 = itMap1 ;
00054 itMap2 !=MapEnd ;
00055 ++itMap2)
00056 {
00057
00058 double dummy = itMap1->second * itMap2->second;
00059 dummy *= inverror ;
00060
00061 m_kaliMatrix.at(itMap1->first*m_numberOfElements +itMap2->first) += dummy ;
00062 }
00063
00064
00065 double dummy = pTk ;
00066 dummy -= pSubtract ;
00067 dummy *= itMap1->second ;
00068 dummy *= inverror ;
00069
00070 m_kaliVector.at(itMap1->first) += dummy ;
00071 }
00072 return ;
00073 }
00074
00075
00076
00077
00078
00079 void
00080 IMACalibBlock::complete ()
00081 {
00082 int bef;
00083 int aft;
00084 for (unsigned int i=0; i<m_numberOfElements;++i)
00085 {
00086 for (unsigned int j=i+1; j< m_numberOfElements; ++j)
00087 {
00088 bef = (i*m_numberOfElements+j);
00089 aft = (j*m_numberOfElements +i);
00090 m_kaliMatrix.at(aft) = m_kaliMatrix.at(bef) ;
00091 }
00092 }
00093
00094 return ;
00095 }
00096
00097
00098
00099
00100
00101 int
00102 IMACalibBlock::solve (int usingBlockSolver, double min, double max)
00103 {
00104 complete () ;
00105
00106
00107 CLHEP::HepMatrix kaliMatrix (m_numberOfElements,m_numberOfElements) ;
00108
00109
00110
00111 riempiMtr (m_kaliMatrix , kaliMatrix) ;
00112
00113
00114
00115
00116
00117
00118 CLHEP::HepVector kaliVector (m_numberOfElements) ;
00119 riempiVtr (m_kaliVector , kaliVector) ;
00120
00121 CLHEP::HepVector result = CLHEP::solve (kaliMatrix,kaliVector) ;
00122 for (int i = 0 ; i < kaliVector.num_row () ; ++i)
00123 if (result.normsq () < min * kaliVector.num_row () ||
00124 result.normsq () > max * kaliVector.num_row ())
00125 {
00126 if (usingBlockSolver)
00127 {
00128 edm::LogWarning ("IML") << "using blocSlover " << std::endl ;
00129 BlockSolver() (kaliMatrix,kaliVector,result) ;
00130 }
00131 else
00132 {
00133 edm::LogWarning ("IML") <<"coeff out of range " <<std::endl;
00134 for (int i = 0 ; i < kaliVector.num_row () ; ++i)
00135 result[i] = 1. ;
00136 }
00137 }
00138 fillMap(result);
00139 return 0;
00140 }
00141
00142
00143
00144
00145
00146 inline int
00147 IMACalibBlock::evalX2Size ()
00148 {
00149
00150 return m_numberOfElements* m_numberOfElements;
00151 }
00152
00153
00154
00155
00156
00157 void
00158 IMACalibBlock::riempiMtr (const std::vector<double> & piena,
00159 CLHEP::HepMatrix & vuota)
00160 {
00161 unsigned int max = m_numberOfElements ;
00162
00163 assert (piena.size () == max * max) ;
00164 assert (vuota.num_row () == int(max)) ;
00165 assert (vuota.num_col () == int(max)) ;
00166 for (unsigned int i = 0 ; i < max ; ++i)
00167 for (unsigned int j = 0 ; j < max ; ++j)
00168 if (std::isnan (piena[i*max + j])) vuota[i][j] = 0. ;
00169 else vuota[i][j] = piena[i*max + j] ;
00170
00171 return ;
00172 }
00173
00174
00175
00176
00177 void
00178 IMACalibBlock::riempiVtr (const std::vector<double> & pieno,
00179 CLHEP::HepVector & vuoto)
00180 {
00181
00182 int max = m_numberOfElements ;
00183 assert (vuoto.num_row () == max) ;
00184 for (int i = 0 ; i < max ; ++i)
00185 if (std::isnan (pieno[i])) vuoto[i] = 0. ;
00186 else vuoto[i] = pieno[i] ;
00187
00188 return ;
00189 }
00190
00191
00192
00193
00194
00195 void
00196 IMACalibBlock::reset ()
00197 {
00198
00199 for (std::vector<double>::iterator vecIt = m_kaliVector.begin () ;
00200 vecIt != m_kaliVector.end ();
00201 ++vecIt)
00202 {
00203 *vecIt = 0. ;
00204 }
00205
00206 for (std::vector<double>::iterator vecIt = m_kaliMatrix.begin () ;
00207 vecIt != m_kaliMatrix.end ();
00208 ++vecIt)
00209 {
00210 *vecIt = 0. ;
00211 }
00212
00213 }
00214
00215
00216
00217
00218
00219
00220 void
00221 IMACalibBlock::fillMap (const CLHEP::HepVector & result)
00222 {
00223
00224 for (unsigned int i=0; i < m_numberOfElements; ++i)
00225 {
00226 m_coefficients[i] = result[i] ;
00227 }
00228
00229 return ;
00230 }
00231