Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

FillEnergy.cxx

Go to the documentation of this file.
00001 // $Id: FillEnergy.cxx,v 1.1 2008/01/11 19:09:26 rustem Exp $
00002 
00003 // MINOS
00004 #include "DataUtil/EnergyCorrections.h"
00005 #include "RecoBase/CandShowerHandle.h"
00006 #include "Registry/Registry.h"
00007 #include "Validity/VldContext.h"
00008 
00009 // Local
00010 #include "PhysicsNtuple/Factory.h"
00011 
00012 // Local
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    // Make VldContext
00036    //
00037    const VldContext vldc = GetVldc(record.GetHeader());
00038 
00039    //
00040    // Correct shower energy using latest energy correction function
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    // Apply latest energy corrections to event's hadronic energy
00052    //
00053    for(EventIterator ievent = record.EventBegIterator(); ievent != record.EventEndIterator(); ++ievent)
00054    {
00055       //
00056       // Event has no showers
00057       //
00058       if(ievent -> GetNShowers() < 1) continue;
00059 
00060       //
00061       // Find longest track
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          // !!!hard coded constants!!!
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       // Set corrected hadronic energy
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    // Convert header to VldContext, should make it a global utility function...
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 }

Generated on Mon Feb 15 11:06:41 2010 for loon by  doxygen 1.3.9.1