diff --git a/graf3d/eve/inc/TEveCalo.h b/graf3d/eve/inc/TEveCalo.h index f7006601b5ea1930bdb7d5d4e1d27e33cc9d2020..b7a1749a09ac803a771c574b177e8577f178e468 100644 --- a/graf3d/eve/inc/TEveCalo.h +++ b/graf3d/eve/inc/TEveCalo.h @@ -74,6 +74,7 @@ public: TEveCaloData* GetData() const { return fData; } virtual void SetData(TEveCaloData* d); + virtual void DataChanged(); Float_t GetDataSliceThreshold(Int_t slice) const; void SetDataSliceThreshold(Int_t slice, Float_t val); diff --git a/graf3d/eve/inc/TEveCaloData.h b/graf3d/eve/inc/TEveCaloData.h index a76b9d73812c757657d81dca43eaf56b930caada..02992a393bd0b20f9ab79a7681bc8f2d15cc31b7 100644 --- a/graf3d/eve/inc/TEveCaloData.h +++ b/graf3d/eve/inc/TEveCaloData.h @@ -122,7 +122,12 @@ public: virtual void GetCellData(const CellId_t &id, CellData_t& data) const = 0; virtual void GetCellData(const CellId_t &id, Float_t phiMin, Float_t phiRng, CellData_t& data) const = 0; - virtual void InvalidateUsersCellIdCache() = 0; + + virtual void SetSliceThreshold(Int_t slice, Float_t threshold); + virtual void SetSliceColor(Int_t slice, Color_t col); + + virtual void InvalidateUsersCellIdCache(); + virtual void DataChanged(); virtual Bool_t SupportsEtaBinning(){ return kFALSE; } virtual Bool_t SupportsPhiBinning(){ return kFALSE; } @@ -160,25 +165,27 @@ public: TEveCaloDataHist(); virtual ~TEveCaloDataHist(); + THStack* GetStack() { return fHStack; } + virtual void DataChanged(); + virtual void GetCellList( Float_t etaMin, Float_t etaMax, Float_t phi, Float_t phiRng, vCellId_t &out) const; virtual void GetCellData(const TEveCaloData::CellId_t &id, TEveCaloData::CellData_t& data) const; virtual void GetCellData(const CellId_t &id, Float_t phiMin, Float_t phiRng, CellData_t& data) const; - virtual void InvalidateUsersCellIdCache(); - virtual Bool_t SupportsEtaBinning(){ return kTRUE; } virtual Bool_t SupportsPhiBinning(){ return kTRUE; } virtual void GetEtaLimits(Double_t &min, Double_t &max) const; virtual void GetPhiLimits(Double_t &min, Double_t &max) const; - Int_t AddHistogram(TH2F* hist); + Int_t AddHistogram(TH2F* hist); virtual Float_t GetMaxVal(Bool_t et) const {return (et)? fMaxValEt:fMaxValE;} virtual Int_t GetNSlices() const; + ClassDef(TEveCaloDataHist, 0); // Manages calorimeter TH2F event data. }; diff --git a/graf3d/eve/src/TEveCalo.cxx b/graf3d/eve/src/TEveCalo.cxx index 04073952ebc41b23ee026f22321911048eb07f41..1a39f90571a947c2993278c687811423b85d98c5 100644 --- a/graf3d/eve/src/TEveCalo.cxx +++ b/graf3d/eve/src/TEveCalo.cxx @@ -47,8 +47,8 @@ TEveCaloViz::TEveCaloViz(const Text_t* n, const Text_t* t) : fData(0), - fEtaMin(-1), - fEtaMax(1), + fEtaMin(-10), + fEtaMax(10), fPhi(0.), fPhiOffset(TMath::Pi()), @@ -79,8 +79,8 @@ TEveCaloViz::TEveCaloViz(TEveCaloData* data, const Text_t* n, const Text_t* t) : fData(0), - fEtaMin(-1), - fEtaMax(1), + fEtaMin(-10), + fEtaMax(10), fPhi(0.), fPhiOffset(TMath::Pi()), @@ -127,8 +127,7 @@ void TEveCaloViz::SetDataSliceThreshold(Int_t slice, Float_t val) { // Set threshold for given slice. - fData->RefSliceInfo(slice).fThreshold = val; - fData->InvalidateUsersCellIdCache(); + fData->SetSliceThreshold(slice, val); } //______________________________________________________________________________ @@ -144,8 +143,7 @@ void TEveCaloViz::SetDataSliceColor(Int_t slice, Color_t col) { // Set slice color in data. - fData->RefSliceInfo(slice).fColor = col; - fData->StampBackPtrElements(kCBObjProps); + fData->SetSliceColor(slice, col); } //______________________________________________________________________________ @@ -214,30 +212,38 @@ void TEveCaloViz::SetData(TEveCaloData* data) fData = data; if (fData) fData->IncRefCount(this); - fData->GetEtaLimits(fEtaMin, fEtaMax); - Double_t min, max; + DataChanged(); +} + +//______________________________________________________________________________ +void TEveCaloViz::DataChanged() +{ + // Update setting and cache on data changed. + // Called from TEvecaloData::BroadcastDataChange() + + Double_t min, max, delta; + + fData->GetEtaLimits(min, max); + if (fEtaMin < min) fEtaMin = min; + if (fEtaMax > max) fEtaMax = max; + fData->GetPhiLimits(min, max); - fPhi = (max+min)*0.5; - fPhiOffset =(max-min)*0.5; + delta = 0.5*(max - min); + if (fPhi < min || fPhi > max) { + fPhi = 0.5*(max + min); + fPhiOffset = delta; + } else { + if (fPhiOffset > delta) fPhiOffset = delta; + } - Float_t hlimit = fScaleAbs ? fMaxValAbs :data->GetMaxVal(fPlotEt); - if (fPalette == 0) + if (fPalette) { - AssertPalette(); - fPalette->SetLimits(0, TMath::CeilNint(hlimit)); - fPalette->SetMax(fPalette->GetHighLimit()); - } - else - { - if (!fScaleAbs) - { - Float_t ratio = Float_t(fPalette->GetMinVal())/fPalette->GetHighLimit(); - - fPalette->SetLimits(0, TMath::CeilNint(data->GetMaxVal(fPlotEt))); - fPalette->SetMin(Int_t(ratio*fPalette->GetHighLimit())); - fPalette->SetMax(fPalette->GetHighLimit()); - } + Int_t hlimit = TMath::CeilNint(fScaleAbs ? fMaxValAbs : fData->GetMaxVal(fPlotEt)); + fPalette->SetLimits(0, hlimit); + fPalette->SetMin(0); + fPalette->SetMax(hlimit); } + InvalidateCellIdCache(); } @@ -252,18 +258,19 @@ void TEveCaloViz::AssignCaloVizParameters(TEveCaloViz* m) fEtaMax = m->fEtaMax; fPhi = m->fPhi; - fPhiOffset = m->fPhiOffset; + fPhiOffset = m->fPhiOffset; + fBarrelRadius = m->fBarrelRadius; fEndCapPos = m->fEndCapPos; - TEveRGBAPalette& mp = * m->fPalette; - TEveRGBAPalette* p = new TEveRGBAPalette(mp.GetMinVal(), mp.GetMaxVal(), - mp.GetInterpolate()); - p->SetDefaultColor(mp.GetDefaultColor()); - SetPalette(p); + if (m->fPalette) + { + TEveRGBAPalette& mp = * m->fPalette; + TEveRGBAPalette* p = new TEveRGBAPalette(mp.GetMinVal(), mp.GetMaxVal(), mp.GetInterpolate()); + p->SetDefaultColor(mp.GetDefaultColor()); + } } - //______________________________________________________________________________ void TEveCaloViz::SetPalette(TEveRGBAPalette* p) { @@ -299,7 +306,13 @@ TEveRGBAPalette* TEveCaloViz::AssertPalette() if (fPalette == 0) { fPalette = new TEveRGBAPalette; - fPalette->SetDefaultColor((Color_t)4); + fPalette->SetDefaultColor((Color_t)4); + + Int_t hlimit = TMath::CeilNint(fScaleAbs ? fMaxValAbs : fData->GetMaxVal(fPlotEt)); + fPalette->SetLimits(0, hlimit); + fPalette->SetMin(0); + fPalette->SetMax(hlimit); + } return fPalette; } diff --git a/graf3d/eve/src/TEveCalo2DGL.cxx b/graf3d/eve/src/TEveCalo2DGL.cxx index 24daaece0874076db8f09015488d61e19773aa1a..b8a707a304840ebba1fca3eeb0d4bf6b0d7dbc34 100644 --- a/graf3d/eve/src/TEveCalo2DGL.cxx +++ b/graf3d/eve/src/TEveCalo2DGL.cxx @@ -275,6 +275,8 @@ void TEveCalo2DGL::DirectDraw(TGLRnrCtx & rnrCtx) const if (fM->fCellIdCacheOK == kFALSE) fM->BuildCellIdCache(); + fM->AssertPalette(); + TEveProjection::EPType_e pt = fM->fManager->GetProjection()->GetType(); if (pt == TEveProjection::kPT_RhoZ) DrawRhoZ(rnrCtx); diff --git a/graf3d/eve/src/TEveCalo3DGL.cxx b/graf3d/eve/src/TEveCalo3DGL.cxx index 3ee61b04ac94f5a3e8576c09faf1c2e468fa2e2b..a2e9d697a66ea7ec373ac2a6e286545c23c4451d 100644 --- a/graf3d/eve/src/TEveCalo3DGL.cxx +++ b/graf3d/eve/src/TEveCalo3DGL.cxx @@ -296,6 +296,8 @@ void TEveCalo3DGL::DirectDraw(TGLRnrCtx &rnrCtx) const glEnable(GL_NORMALIZE); glEnable(GL_LIGHTING); + fM->AssertPalette(); + TEveCaloData::CellData_t cellData; Float_t transEta = fM->GetTransitionEta(); Float_t towerH; diff --git a/graf3d/eve/src/TEveCaloData.cxx b/graf3d/eve/src/TEveCaloData.cxx index a6e86d600529548578259f0e279cbbef9ab0e4a5..8a1a901ad3f3bc01b921a405516da0ce57e3f1af 100644 --- a/graf3d/eve/src/TEveCaloData.cxx +++ b/graf3d/eve/src/TEveCaloData.cxx @@ -31,6 +31,7 @@ ClassImp(TEveCaloData); +//______________________________________________________________________________ TEveCaloData::TEveCaloData(): TEveRefBackPtr(), @@ -40,6 +41,60 @@ TEveCaloData::TEveCaloData(): // Constructor. } +//______________________________________________________________________________ +void TEveCaloData::SetSliceThreshold(Int_t slice, Float_t val) +{ + // Set threshold for given slice. + + fSliceInfos[slice].fThreshold = val; + InvalidateUsersCellIdCache(); +} + +//______________________________________________________________________________ +void TEveCaloData::SetSliceColor(Int_t slice, Color_t col) +{ + // Set color for given slice. + + fSliceInfos[slice].fColor = col; + StampBackPtrElements(TEveElement::kCBObjProps); +} + +//______________________________________________________________________________ +void TEveCaloData::InvalidateUsersCellIdCache() +{ + // Invalidate cell ids cache on back ptr references. + + TEveCaloViz* calo; + std::list<TEveElement*>::iterator i = fBackRefs.begin(); + while (i != fBackRefs.end()) + { + calo = dynamic_cast<TEveCaloViz*>(*i); + calo->InvalidateCellIdCache(); + calo->StampObjProps(); + ++i; + } +} + +//______________________________________________________________________________ +void TEveCaloData::DataChanged() +{ + // Tell users (TEveCaloViz instances using this data) that data + // has changed and they should update the limits/scales etc. + // This is done by calling TEveCaloViz::DataChanged(). + + TEveCaloViz* calo; + std::list<TEveElement*>::iterator i = fBackRefs.begin(); + while (i != fBackRefs.end()) + { + calo = dynamic_cast<TEveCaloViz*>(*i); + calo->DataChanged(); + calo->StampObjProps(); + ++i; + } +} + +/**************************************************************************/ + //______________________________________________________________________________ Float_t TEveCaloData::CellData_t::Value(Bool_t isEt) const { @@ -120,7 +175,48 @@ TEveCaloDataHist::TEveCaloDataHist(): TEveCaloDataHist::~TEveCaloDataHist() { // Destructor. + + delete fHStack; } +//______________________________________________________________________________ +void TEveCaloDataHist::DataChanged() +{ + // Update limits and notify data users. + + using namespace TMath; + + // update max E/Et values + fMaxValE = 0; + fMaxValEt = 0; + + if (fHStack->GetHists()->First()) + { + TH2 *ah = (TH2*)fHStack->GetHists()->First(); + fEtaAxis = ah->GetXaxis(); + fPhiAxis = ah->GetYaxis(); + + Int_t bin; + Double_t value, cos, eta; + TH2 *stack = (TH2*)fHStack->GetStack()->Last(); + for (Int_t ieta=1; ieta<=fEtaAxis->GetNbins(); ieta++) + { + eta = fEtaAxis->GetBinCenter(ieta); // conversion E/Et + for (Int_t iphi=1; iphi<=fPhiAxis->GetNbins(); iphi++) + { + bin = stack->GetBin(ieta, iphi); + value = stack->GetBinContent(bin); + + if (value > fMaxValEt ) fMaxValEt = value; + + cos = Cos(2*ATan(Exp( -Abs(eta)))); + value /= Abs(cos); + if (value > fMaxValE) fMaxValE = value; + } + } + } + + TEveCaloData::DataChanged(); +} //______________________________________________________________________________ void TEveCaloDataHist::GetCellList(Float_t eta, Float_t etaD, @@ -139,7 +235,7 @@ void TEveCaloDataHist::GetCellList(Float_t eta, Float_t etaD, Int_t nEta = fEtaAxis->GetNbins(); Int_t nPhi = fPhiAxis->GetNbins(); - Int_t nSlices = fSliceInfos.size(); + Int_t nSlices = GetNSlices(); TH2* h0 = fSliceInfos[0].fHist; Int_t bin = 0; @@ -221,22 +317,6 @@ void TEveCaloDataHist::GetCellData(const TEveCaloData::CellId_t &id, phi1, phi2); } -//______________________________________________________________________________ -void TEveCaloDataHist::InvalidateUsersCellIdCache() -{ - // Invalidate cell ids cache on back ptr references. - - TEveCaloViz* calo; - std::list<TEveElement*>::iterator i = fBackRefs.begin(); - while (i != fBackRefs.end()) - { - calo = dynamic_cast<TEveCaloViz*>(*i); - calo->InvalidateCellIdCache(); - calo->StampObjProps(); - ++i; - } -} - //______________________________________________________________________________ Int_t TEveCaloDataHist::AddHistogram(TH2F* hist) { @@ -244,46 +324,16 @@ Int_t TEveCaloDataHist::AddHistogram(TH2F* hist) // and fMaxValEt // Return last index in the vector of slice infos. - using namespace TMath; - fHStack->Add(hist); - if (fEtaAxis == 0 || fPhiAxis == 0) - { - fEtaAxis = hist->GetXaxis(); - fPhiAxis = hist->GetYaxis(); - } - - // update max E/Et values - fMaxValE = 0; - fMaxValEt = 0; - TH2 *stack = (TH2*)fHStack->GetStack()->Last(); - - Int_t bin; - Double_t value, cos, eta; - for (Int_t ieta=1; ieta<=fEtaAxis->GetNbins(); ieta++) - { - eta = fEtaAxis->GetBinCenter(ieta); // conversion E/Et - for (Int_t iphi=1; iphi<=fPhiAxis->GetNbins(); iphi++) - { - bin = stack->GetBin(ieta, iphi); - value = stack->GetBinContent(bin); - - if (value > fMaxValEt ) fMaxValEt = value; - - cos = Cos(2*ATan(Exp( -Abs(eta)))); - value /= Abs(cos); - if (value > fMaxValE) fMaxValE = value; - } - } - Int_t id = fSliceInfos.size(); - fSliceInfos.push_back(SliceInfo_t(hist)); fSliceInfos[id].fName = hist->GetName(); fSliceInfos[id].fColor = hist->GetLineColor(); fSliceInfos[id].fID = id; + DataChanged(); + return id; } @@ -292,7 +342,7 @@ Int_t TEveCaloDataHist::GetNSlices() const { // Get number of tower slices. - return fSliceInfos.size(); + return fHStack->GetHists()->GetSize(); } //______________________________________________________________________________ diff --git a/graf3d/eve/src/TEveCaloVizEditor.cxx b/graf3d/eve/src/TEveCaloVizEditor.cxx index 12c3f481fcb5d852645d5ce1447a567e385200a7..3630442a3c296e192867e2fff769e33bfc50b735 100644 --- a/graf3d/eve/src/TEveCaloVizEditor.cxx +++ b/graf3d/eve/src/TEveCaloVizEditor.cxx @@ -241,7 +241,13 @@ void TEveCaloVizEditor::SetModel(TObject* obj) fEtaRng->SetLimits((Float_t)min, (Float_t)max); fEtaRng->SetValues(fM->fEtaMin, fM->fEtaMax); + fM->GetData()->GetPhiLimits(min, max); + min = TMath::Ceil (min*TMath::RadToDeg()); + max = TMath::Floor(max*TMath::RadToDeg()); + fPhi->SetLimits((Int_t)min, (Int_t)max, (Int_t)(max - min + 1)); fPhi->SetValue(fM->fPhi*TMath::RadToDeg()); + Int_t delta = ((Int_t)(max - min + 1))/2; + fPhiOffset->SetLimits(0, delta, delta + 1); fPhiOffset->SetValue(fM->fPhiOffset*TMath::RadToDeg()); MakeSliceInfo();