00001
00002
00003
00004 #include <cmath>
00005 #include <cassert>
00006 #include <iomanip>
00007 #include <iostream>
00008 #include <sstream>
00009
00010
00011 #include "TFile.h"
00012
00013
00014 #include "PhysicsNtuple/Record.h"
00015 #include "PhysicsNtuple/DataBlock.h"
00016
00017 ClassImp(DataBlock)
00018
00019 using namespace std;
00020
00021
00022 DataBlock::DataBlock()
00023 :nSnarlIn(0),
00024 nEventIn(0),
00025 nSnarlOut(0),
00026 nEventOut(0),
00027 ProtonsIn(0.0),
00028 ProtonsOut(0.0)
00029 {
00030 }
00031
00032
00033 DataBlock::~DataBlock()
00034 {
00035 }
00036
00037
00038 void DataBlock::Add(const DataBlock &block)
00039 {
00040 nSnarlIn += block.nSnarlIn;
00041 nEventIn += block.nEventIn;
00042 nSnarlOut += block.nSnarlOut;
00043 nEventOut += block.nEventOut;
00044 ProtonsIn += block.ProtonsIn;
00045 ProtonsOut += block.ProtonsOut;
00046 }
00047
00048
00049 void DataBlock::SetInput(const DataBlock &block)
00050 {
00051 nSnarlIn = block.nSnarlOut;
00052 nEventIn = block.nEventOut;
00053 ProtonsIn = block.ProtonsOut;
00054 }
00055
00056
00057 void DataBlock::SetProtons(double protons)
00058 {
00059 ProtonsOut = protons;
00060 }
00061
00062
00063 void DataBlock::ScaleOut(const double factor)
00064 {
00065 if(factor > 0.0)
00066 {
00067 nSnarlOut = static_cast<UInt_t>(factor*nSnarlOut);
00068 nEventOut = static_cast<UInt_t>(factor*nEventOut);
00069 ProtonsOut *= factor;
00070 }
00071 else
00072 {
00073 cerr << "DataBlock::ScaleOut - scale factor "<< factor << " is not positive" << endl;
00074 }
00075 }
00076
00077
00078 void DataBlock::Add(const Anp::Record &record)
00079 {
00080 ++nSnarlOut;
00081
00082 nEventOut += record.GetNEvents();
00083
00084 if (record.GetHeader().TorTgt() > 0.01) ProtonsOut += record.GetHeader().TorTgt();
00085 else if(record.GetHeader().TrTgtD() > 0.01) ProtonsOut += record.GetHeader().TrTgtD();
00086 else if(record.GetHeader().Tr101D() > 0.01) ProtonsOut += record.GetHeader().Tr101D();
00087 else if(record.GetHeader().Tor101() > 0.01) ProtonsOut += record.GetHeader().Tor101();
00088 }
00089
00090
00091 Double_t DataBlock::GetProtonsPerSnarl() const
00092 {
00093 if(nSnarlOut > 0 && ProtonsOut > 0.0)
00094 {
00095 return ProtonsOut/double(nSnarlOut);
00096 }
00097
00098 return 0.0;
00099 }
00100
00101
00102 Float_t DataBlock::Ratio(const Float_t nom, const Float_t den) const
00103 {
00104 if(den > 0.0) return nom/den;
00105
00106 return 0.0;
00107 }
00108
00109
00110 Double_t DataBlock::Ratio(const Double_t nom, const Double_t den) const
00111 {
00112 if(den > 0.0) return nom/den;
00113
00114 return 0.0;
00115 }
00116
00117
00118 Float_t DataBlock::Ratio(const UInt_t nom, const UInt_t den) const
00119 {
00120 if(den > 0) return float(nom)/float(den);
00121
00122 return 0.0;
00123 }
00124
00125
00126 void DataBlock::print(ostream& o) const
00127 {
00128 stringstream os;
00129
00130 os << "Printing DataBlock" << endl
00131 << " nSnarl: " << nSnarlOut << " / " << nSnarlIn << " = " << Ratio(nSnarlOut, nSnarlIn) << endl
00132 << " nEvent: " << nEventOut << " / " << nEventIn << " = " << Ratio(nEventOut, nEventIn) << endl
00133 << " Protons: " << scientific << setprecision(5) << ProtonsOut << " / "
00134 << scientific << setprecision(5) << ProtonsIn << " = " << Ratio(ProtonsOut, ProtonsIn) << endl
00135 << " Protons per record = " << fixed << setprecision(5) << GetProtonsPerSnarl() << endl;
00136
00137 o << os.str();
00138 }
00139
00140
00141 ostream& operator<<(ostream& o, const DataBlock& self)
00142 {
00143 self.print(o);
00144 return o;
00145 }
00146
00147
00148 const DataBlock FindDataBlock(const std::string &path, const std::string &name)
00149 {
00150 TFile *file_ptr = new TFile(path.c_str(), "READ");
00151 if(!file_ptr || !file_ptr -> IsOpen())
00152 {
00153 cerr << "Failed to open root file " << path << endl;
00154 return DataBlock();
00155 }
00156
00157 DataBlock *block_ptr = dynamic_cast<DataBlock *>(file_ptr -> Get(name.c_str()));
00158 if(!block_ptr)
00159 {
00160 cout << "Failed to find DataBlock" << endl;
00161 return DataBlock();
00162 }
00163
00164 const DataBlock block = *block_ptr;
00165
00166 file_ptr -> Close();
00167
00168 return block;
00169 }