#include "TEveCaloData.h"
#include "TAxis.h"
#include "THStack.h"
#include "TH2.h"
#include "TMath.h"
ClassImp(TEveCaloData);
TEveCaloData::TEveCaloData():TEveRefCnt(),
fThreshold(0.001f)
{
}
void TEveCaloData::CellData_t::Configure(Float_t v, Float_t e1, Float_t e2, Float_t p1, Float_t p2)
{
fValue = v;
fEtaMin = e1;
fEtaMax = e2;
fThetaMax = 2*TMath::ATan(TMath::Exp(-(TMath::Abs(e1))));
fThetaMin = 2*TMath::ATan(TMath::Exp(-(TMath::Abs(e2))));
fPhiMin = p1;
fPhiMax = p2;
fZSideSign = (e1 > 0) ? 1:-1;
}
Float_t TEveCaloData::CellData_t::ThetaMin(Bool_t sig) const
{
if (sig && fZSideSign == -1) return TMath::Pi() - fThetaMin;
return fThetaMin;
}
Float_t TEveCaloData::CellData_t::ThetaMax(Bool_t sig) const
{
if (sig && fZSideSign == -1 ) return TMath::Pi() - fThetaMax;
return fThetaMax;
}
void TEveCaloData::CellData_t::Dump() const
{
printf(">> theta %2.1f phi %2.1f val %2.2f \n",
Theta(kTRUE)*TMath::RadToDeg(),
Phi()*TMath::RadToDeg(), Value());
}
ClassImp(TEveCaloDataHist);
TEveCaloDataHist::TEveCaloDataHist(): fHStack(0)
{
fHStack = new THStack();
}
TEveCaloDataHist::~TEveCaloDataHist()
{
delete fHStack;
}
Int_t TEveCaloDataHist::GetCellList(Float_t minVal, Float_t maxVal,
Float_t eta, Float_t etaD,
Float_t phi, Float_t phiD,
TEveCaloData::vCellId_t &out)
{
using namespace TMath;
etaD *= 1.01f;
phiD *= 1.01f;
Float_t etaMin = eta - etaD*0.5f;
Float_t etaMax = eta + etaD*0.5f;
Float_t pr[4];
Float_t phi1 = phi - phiD;
Float_t phi2 = phi + phiD;
if (phi2 >TMath::Pi() && phi1>-Pi()) {
pr[0] = phi1;
pr[1] = Pi();
pr[2] = -Pi();
pr[3] = -TwoPi()+phi2;
}
else if (phi1<-TMath::Pi() && phi2<=Pi()) {
pr[0] = -Pi();
pr[1] = phi2;
pr[2] = TwoPi()+phi1;
pr[3] = Pi();
}
else {
pr[0] = pr[2] = phi1;
pr[1] = pr[3] = phi2;
}
TH2F *hist0 = (TH2F*)fHStack->GetStack()->At(0);
TAxis *ax = hist0->GetXaxis();
TAxis *ay = hist0->GetYaxis();
TH2F *hist;
Int_t bin = 0;
Float_t val = 0;
for (Int_t ieta=0; ieta<ax->GetNbins(); ieta++) {
for (Int_t iphi=0; iphi<ay->GetNbins(); iphi++) {
if ( ax->GetBinLowEdge(ieta) >= etaMin
&& ax->GetBinUpEdge(ieta) < etaMax
&& ((ay->GetBinLowEdge(iphi)>=pr[0] && ay->GetBinUpEdge(iphi)<pr[1])
|| (ay->GetBinLowEdge(iphi)>=pr[2] && ay->GetBinUpEdge(iphi)<pr[3])))
{
TIter next(fHStack->GetStack());
Int_t slice = 0;
bin = hist0->GetBin(ieta, iphi);
while ((hist = (TH2F*) next()) != 0) {
val = hist->GetBinContent(bin);
if (val>fThreshold && val>minVal && val<=maxVal)
{
out.push_back(TEveCaloData::CellId_t(bin, slice));
slice++;
}
}
}
}
}
return out.size();
}
void TEveCaloDataHist::GetCellData(const TEveCaloData::CellId_t &id, TEveCaloData::CellData_t& cellData)
{
TH2F* hist = (TH2F*) (fHStack->GetStack()->At(id.fSlice));
Int_t x, y, z;
hist->GetBinXYZ(id.fTower, x, y, z);
cellData.Configure(hist->GetBinContent(id.fTower),
hist->GetXaxis()->GetBinLowEdge(x),
hist->GetXaxis()->GetBinUpEdge(x),
hist->GetYaxis()->GetBinLowEdge(y),
hist->GetYaxis()->GetBinUpEdge(y));
}
void TEveCaloDataHist::AddHistogram(TH2F* h)
{
fHStack->Add(h);
}
Int_t TEveCaloDataHist::GetNSlices() const
{
return fHStack->GetStack()->GetEntriesFast();
}
Float_t TEveCaloDataHist::GetMaxVal() const
{
return fHStack->GetMaximum();
}
const TAxis* TEveCaloDataHist::GetEtaBins()
{
TH2F* hist = (TH2F*) (fHStack->GetStack()->At(0));
return hist->GetXaxis();
}
const TAxis* TEveCaloDataHist::GetPhiBins()
{
TH2F* hist = (TH2F*) (fHStack->GetStack()->At(0));
return hist->GetYaxis();
}
const TH2F* TEveCaloDataHist::GetHistogram(Int_t slice)
{
if (slice > GetNSlices())
return 0;
return (TH2F*)fHStack->GetStack()->At(slice);
}
Last change: Tue May 13 17:08:30 2008
Last generated: 2008-05-13 17:08
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.