00001
00002
00003
00004 #include "DataUtil/EnergyCorrections.h"
00005 #include "RecoBase/CandShowerHandle.h"
00006 #include "Registry/Registry.h"
00007 #include "Validity/VldContext.h"
00008
00009
00010 #include "PhysicsNtuple/Factory.h"
00011
00012
00013 #include "FillEnergy.h"
00014
00015 REGISTER_ANP_OBJECT(AlgSnarl,FillEnergy)
00016
00017 namespace EnergyCorrections{}
00018 using namespace EnergyCorrections;
00019 using namespace std;
00020
00021
00022 Anp::FillEnergy::FillEnergy()
00023 {
00024 }
00025
00026
00027 Anp::FillEnergy::~FillEnergy()
00028 {
00029 }
00030
00031
00032 bool Anp::FillEnergy::Run(Record& record)
00033 {
00034
00035
00036
00037 const VldContext vldc = GetVldc(record.GetHeader());
00038
00039
00040
00041
00042 for(ShowerIterator sit = record.ShowerBegIterator(); sit != record.ShowerEndIterator(); ++sit)
00043 {
00044 sit -> SetEnergyCC(FullyCorrectShowerEnergy(sit -> EnergyCC(),
00045 CandShowerHandle::kCC,
00046 vldc,
00047 record.GetHeader().Release()));
00048 }
00049
00050
00051
00052
00053 for(EventIterator ievent = record.EventBegIterator(); ievent != record.EventEndIterator(); ++ievent)
00054 {
00055
00056
00057
00058 if(ievent -> GetNShowers() < 1) continue;
00059
00060
00061
00062
00063 TrackIter itrack = LongestTrack(*ievent, record);
00064
00065 double ehad = 0.0;
00066 for(ShowerIter ishower = record.ShowerBeg(); ishower != record.ShowerEnd(); ++ishower)
00067 {
00068 if(!(ievent -> MatchShower(ishower -> ShowerIndex())))
00069 {
00070 continue;
00071 }
00072
00073 const float deltaz = ishower -> GetVtx().Z() - ievent -> GetVtx().Z();
00074
00075
00076
00077
00078 if(itrack == record.TrackEnd())
00079 {
00080 ehad += ishower -> EnergyCC();
00081 }
00082 else if(std::fabs(deltaz) < 0.5 || ishower -> EnergyCC() > 2.0)
00083 {
00084 ehad += ishower -> EnergyCC();
00085 }
00086 }
00087
00088
00089
00090
00091 RecoNu rnu = ievent -> GetNu();
00092 rnu.SetEHad(ehad);
00093 ievent -> SetNu(rnu);
00094 }
00095
00096 return true;
00097 }
00098
00099
00100 void Anp::FillEnergy::Config(const Registry &)
00101 {
00102 }
00103
00104
00105 const VldContext Anp::FillEnergy::GetVldc(const Header &header) const
00106 {
00107
00108
00109
00110
00111 const VldTimeStamp time(header.Sec(), header.NSec());
00112 if(header.IsData())
00113 {
00114 if(header.IsNear())
00115 {
00116 return VldContext(Detector::kNear, SimFlag::kData, time);
00117 }
00118 else if(header.IsFar())
00119 {
00120 return VldContext(Detector::kFar, SimFlag::kData, time);
00121 }
00122 }
00123 else
00124 {
00125 if(header.IsNear())
00126 {
00127 return VldContext(Detector::kNear, SimFlag::kMC, time);
00128 }
00129 else if(header.IsFar())
00130 {
00131 return VldContext(Detector::kFar, SimFlag::kMC, time);
00132 }
00133 }
00134
00135 return VldContext(Detector::kUnknown, SimFlag::kUnknown, time);
00136 }