00001 #include "RecoParticleFlow/PFClusterTools/interface/ParticleDeposit.h"
00002 #include <cassert>
00003 #include <iostream>
00004 #include <cmath>
00005 #include "RecoParticleFlow/PFClusterTools/interface/DetectorElementType.h"
00006 using namespace pftools;
00007
00008 unsigned ParticleDeposit::count = 0;
00009
00010 ParticleDeposit::ParticleDeposit(double truthEnergy, double eta, double phi) :
00011 myId(count), myTruthEnergy(truthEnergy), myEta(eta), myPhi(phi) {
00012 ++count;
00013 }
00014
00015 ParticleDeposit::~ParticleDeposit() {
00016 }
00017
00018 void ParticleDeposit::addRecDeposition(Deposition rec) {
00019 myRecDepositions.push_back(rec);
00020 }
00021
00022 void ParticleDeposit::addTruthDeposition(Deposition truth) {
00023 myTruthDepositions.push_back(truth);
00024 }
00025
00026 std::vector<Deposition> ParticleDeposit::getTruthDepositions() const {
00027 return myTruthDepositions;
00028 }
00029
00030 const std::vector<Deposition>& ParticleDeposit::getRecDepositions() const {
00031 return myRecDepositions;
00032 }
00033
00034 double ParticleDeposit::getRecEnergy(const DetectorElementPtr de) const {
00035 double energy(0);
00036 for (std::vector<Deposition>::const_iterator cit = myRecDepositions.begin(); cit
00037 != myRecDepositions.end(); ++cit) {
00038 Deposition d = *cit;
00039
00040 if (d.getDetectorElement()->getType() == de->getType()) {
00041 energy += de->getCalib(d.getEta(), d.getPhi()) * d.getEnergy();
00042 }
00043
00044 }
00045 return energy;
00046 }
00047
00048 void ParticleDeposit::setRecEnergy(const DetectorElementPtr de, double energy) {
00049 for (std::vector<Deposition>::const_iterator cit = myRecDepositions.begin(); cit
00050 != myRecDepositions.end(); ++cit) {
00051 Deposition d = *cit;
00052
00053 if (d.getDetectorElement()->getType() == de->getType()) {
00054 d.setEnergy(energy);
00055 }
00056
00057 }
00058 }
00059
00060 double ParticleDeposit::getTruthEnergy(const DetectorElementPtr de) const {
00061 double energy(0);
00062 for (std::vector<Deposition>::const_iterator
00063 cit = myTruthDepositions.begin(); cit!= myTruthDepositions.end(); ++cit) {
00064 Deposition d = *cit;
00065 if (d.getDetectorElement() == de) {
00066 energy += d.getEnergy();
00067 }
00068 }
00069 assert(!(energy > 0));
00070 return energy;
00071
00072 }
00073
00074 double ParticleDeposit::getRecEnergy() const {
00075 double energy(0);
00076 for (std::vector<Deposition>::const_iterator cit = myRecDepositions.begin(); cit
00077 != myRecDepositions.end(); ++cit) {
00078 Deposition d = *cit;
00079
00080
00081
00082 energy += d.getDetectorElement()->getCalib(d.getEta(), d.getPhi()) * d.getEnergy();
00083
00084 }
00085
00086
00087 return energy;
00088
00089 }
00090
00091 double ParticleDeposit::getEnergyResolution() const {
00092
00093 return fabs((getRecEnergy() - myTruthEnergy) / sqrt(myTruthEnergy));
00094 }
00095
00096 double ParticleDeposit::getTargetFunctionContrib() const {
00097
00098 return pow((getRecEnergy() - myTruthEnergy), 2);
00099 }
00100
00101 std::ostream& pftools::operator<<(std::ostream& s, const pftools::ParticleDeposit& p) {
00102 s << "Particle id:\t" << p.getId() << ", \t trueEnergy: " << p.getTruthEnergy() << "\n";
00103 s.width(3);
00104 s << "\tEta:\t" << p.getEta() << ",\tphi:\t" << p.getPhi() << "\n";
00105 for (std::vector<Deposition>::const_iterator cit = p.getRecDepositions().begin(); cit
00106 != p.getRecDepositions().end(); ++cit) {
00107 Deposition d = *cit;
00108 DetectorElementPtr de(d.getDetectorElement());
00109 s << "\t" << *de << ": \t=> E_contrib = ";
00110 s << de->getCalib(d.getEta(), d.getPhi()) * d.getEnergy() << "\n";
00111 }
00112 s << "\tTotalRecEnergy: " << p.getRecEnergy() << ",\t res: " << p.getEnergyResolution() * 100 << "%\n";
00113 return s;
00114 }