00001 #include "DataFormats/ParticleFlowReco/interface/CaloWindow.h"
00002 #include "DataFormats/Math/interface/deltaR.h"
00003 #include <TMath.h>
00004
00005 using namespace pftools;
00006
00007 using namespace std;
00008
00009
00010 CaloRing::CaloRing() :
00011 panes_(1) {
00012 myPanes_.push_back(0);
00013 }
00014
00015 CaloRing::CaloRing(unsigned nPanes) :
00016 panes_(nPanes) {
00017 for (unsigned j(0); j < nPanes; ++j)
00018 myPanes_.push_back(0);
00019 }
00020
00021 double CaloRing::getEnergy(unsigned pane) const {
00022 if (pane < panes_)
00023 return myPanes_[pane];
00024 else
00025 return 0;
00026 }
00027
00028 bool CaloRing::setEnergy(unsigned pane, double energy) {
00029 if (pane < panes_) {
00030 myPanes_[pane] = energy;
00031 return true;
00032 }
00033 return false;
00034 }
00035
00036 bool CaloRing::addEnergy(unsigned pane, double energy) {
00037 if (pane < panes_) {
00038 myPanes_[pane] += energy;
00039 return true;
00040 }
00041 return false;
00042 }
00043
00044 double CaloRing::totalE() const {
00045 double ans(0.0);
00046 for (std::vector<double>::const_iterator cit = myPanes_.begin(); cit
00047 != myPanes_.end(); ++cit) {
00048 ans += *cit;
00049 }
00050 return ans;
00051 }
00052
00053 void CaloRing::reset() {
00054 for (std::vector<double>::iterator cit = myPanes_.begin(); cit
00055 != myPanes_.end(); ++cit)
00056 *cit = 0.0;
00057
00058 }
00059
00060 void CaloRing::printEnergies(std::ostream& s, double range) {
00061 for (std::vector<double>::iterator cit = myPanes_.begin(); cit
00062 != myPanes_.end(); ++cit)
00063 s << (*cit)/range << "\t";
00064 }
00065
00066 std::ostream& pftools::operator<<(std::ostream& s,
00067 const pftools::CaloRing& caloRing) {
00068 for (std::vector<double>::const_iterator it = caloRing.myPanes_.begin(); it
00069 != caloRing.myPanes_.end(); ++it) {
00070 s << *it << "\t";
00071 }
00072 s << " => ring E = " << caloRing.totalE();
00073 return s;
00074 }
00075
00076 std::ostream& pftools::operator<<(std::ostream& s,
00077 const pftools::CaloWindow& caloWindow) {
00078
00079 s << "CaloWindow at (" << caloWindow.baryEta_ << ", "
00080 << caloWindow.baryPhi_ << "):\n";
00081 double totalE(0.0);
00082 for (std::map<unsigned, pftools::CaloRing>::const_iterator cit =
00083 caloWindow.energies_.begin(); cit != caloWindow.energies_.end(); ++cit) {
00084 unsigned ring = (*cit).first;
00085 const CaloRing& cr = (*cit).second;
00086 s << "Ring " << ring << ":\t" << cr << "\n";
00087 totalE += cr.totalE();
00088 }
00089
00090 s << "\tTotal E = " << totalE << std::endl;
00091 return s;
00092
00093 }
00094
00095 vector<double> CaloWindow::stream(double normalisation) const {
00096 vector<double> stream;
00097 for (map<unsigned, pftools::CaloRing>::const_iterator cit =
00098 energies_.begin(); cit != energies_.end(); ++cit) {
00099 CaloRing c = (*cit).second;
00100 std::vector<double> ringE = c.getEnergies();
00101 stream.insert(stream.end(), ringE.begin(), ringE.end());
00102 }
00103 if(normalisation != 1.0){
00104 for(vector<double>::iterator i = stream.begin(); i != stream.end(); ++i) {
00105 double& entry = *i;
00106 entry /= normalisation;
00107 }
00108 }
00109 return stream;
00110
00111 }
00112
00113 void CaloWindow::printEnergies(std::ostream& s, double range) {
00114
00115 for (std::map<unsigned, pftools::CaloRing>::const_iterator cit =
00116 energies_.begin(); cit != energies_.end(); ++cit) {
00117 CaloRing c = (*cit).second;
00118 c.printEnergies(s, range);
00119 s << "\t";
00120 }
00121
00122 }
00123
00124 CaloWindow::CaloWindow() :
00125 baryEta_(0.0), baryPhi_(0.0), nRings_(1), deltaR_(0.1), nPanes_(1), axis_(0.0) {
00126
00127 }
00128
00129 CaloWindow::CaloWindow(double eta, double phi, unsigned nRings, double deltaR, unsigned nPanes, double axis) {
00130
00131 init(eta, phi, nRings, deltaR, nPanes, axis);
00132 }
00133
00134 void CaloWindow::reset() {
00135 energies_.clear();
00136 }
00137
00138 void CaloWindow::init(double eta, double phi, unsigned nRings, double deltaR, unsigned nPanes, double axis) {
00139 baryEta_ = eta;
00140 baryPhi_ = phi;
00141 nRings_ = nRings;
00142 deltaR_ = deltaR;
00143 nPanes_ = nPanes;
00144 axis_ = axis;
00145
00146 energies_.clear();
00147 CaloRing c(1);
00148 energies_[0] = c;
00149 for (unsigned j(1); j < nRings_; ++j) {
00150
00151 CaloRing r(nPanes);
00152 energies_[j] = r;
00153 }
00154 }
00155
00156 CaloWindow::~CaloWindow() {
00157
00158 }
00159
00160 std::pair<unsigned, unsigned> CaloWindow::relativePosition(double eta,
00161 double phi) const {
00162
00163 double dEta = eta - baryEta_;
00164 double dPhi = deltaPhi(phi, baryPhi_);
00165
00166 double dR = deltaR(eta, phi, baryEta_, baryPhi_);
00167
00168 unsigned ring = static_cast<unsigned> (floor(dR / deltaR_));
00169
00170 if (ring == 0) {
00171
00172 return std::pair<unsigned, unsigned>(0, 0);
00173 }
00174
00175 if (ring >= nRings_) {
00176 return std::pair<unsigned, unsigned>(ring, 0);
00177 }
00178
00179 double dTheta = 0;
00180
00181 if (dEta > 0) {
00182 if (dPhi > 0)
00183 dTheta = TMath::ATan(dPhi / dEta);
00184 else
00185 dTheta = 2 * TMath::Pi() + TMath::ATan(dPhi / dEta);
00186 } else {
00187 if (dPhi > 0)
00188 dTheta = TMath::Pi() + TMath::ATan(dPhi / dEta);
00189 else
00190 dTheta = TMath::Pi() + TMath::ATan(dPhi / dEta);
00191 }
00192
00193
00194
00195
00196 double paneOn2 = TMath::Pi() / (*energies_.find(ring)).second.getNPanes();
00197 dTheta = dTheta - axis_ - paneOn2;
00198
00199
00200
00201 if(dTheta > 2 *TMath::Pi()) {
00202
00203 while(dTheta > 2 * TMath::Pi()) {
00204 dTheta -= 2 * TMath::Pi();
00205
00206 }
00207 }
00208 else if (dTheta < 0) {
00209
00210 while(dTheta < 0) {
00211 dTheta += 2 * TMath::Pi();
00212
00213 }
00214 }
00215
00216
00217 unsigned division = static_cast<unsigned> (floor((*energies_.find(ring)).second.getNPanes() * dTheta
00218 / (TMath::Pi() * 2)));
00219
00220
00221
00222 return std::pair<unsigned, unsigned>(ring, division);
00223
00224 }
00225
00226 bool CaloWindow::addHit(double eta, double phi, double energy) {
00227
00228 std::pair<unsigned, unsigned> position = relativePosition(eta, phi);
00229 if (position.first >= nRings_) {
00230
00231
00232
00233
00234
00235
00236 return false;
00237 }
00238
00239
00240
00241 CaloRing& c = energies_[position.first];
00242 c.addEnergy(position.second, energy);
00243
00244 return true;
00245 }
00246 std::map<unsigned, double> CaloWindow::getRingEnergySummations() const {
00247 std::map<unsigned, double> answer;
00248 for (std::map<unsigned, CaloRing>::const_iterator cit = energies_.begin(); cit
00249 != energies_.end(); ++cit) {
00250 std::pair<unsigned, CaloRing> pair = *cit;
00251 answer[pair.first] = pair.second.totalE();
00252 }
00253
00254 return answer;
00255 }
00256
00257 void TestCaloWindow::doTest() {
00258
00259 CaloWindow cw(0.0, 0.0, 3, 0.1, 4);
00260 std::cout << cw << std::endl;
00261 cw.addHit(0, 0.05, 1.0);
00262 cw.addHit(0.22, 0.05, 2.0);
00263 cw.addHit(0, 0.8, 4.0);
00264 cw.addHit(0.2, 0, 1.0);
00265 cw.addHit(0.15, 0.15, 2.0);
00266 cw.addHit(0.0, 0.2, 3.0);
00267 cw.addHit(-0.15, 0.15, 4.0);
00268 cw.addHit(-0.2, 0, 5.0);
00269 cw.addHit(-0.15, -0.15, 6.0);
00270 cw.addHit(-0.0, -0.2, 7.0);
00271 cw.addHit(0.15, -0.15, 8.0);
00272
00273 std::cout << cw << std::endl;
00274 std::cout << "bye bye" << std::endl;
00275
00276 }