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

DataBlock.cxx

Go to the documentation of this file.
00001 // $Id: DataBlock.cxx,v 1.17 2009/10/15 18:30:13 jyuko Exp $
00002 
00003 // C/C++
00004 #include <cmath>
00005 #include <cassert>
00006 #include <iomanip>
00007 #include <iostream>
00008 #include <sstream>
00009 
00010 // ROOT
00011 #include "TFile.h"
00012 
00013 // Local
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 }

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