35 void TEveCaloData::CellGeom_t::Dump()
const
37 printf(
"%f, %f %f, %f \n", fEtaMin, fEtaMax, fPhiMin, fPhiMax);
42 void TEveCaloData::CellGeom_t::Configure(Float_t etaMin, Float_t etaMax, Float_t phiMin, Float_t phiMax)
51 if (fPhiMin < - TMath::TwoPi() || fPhiMin > TMath::TwoPi() ||
52 fPhiMax < - TMath::TwoPi() || fPhiMax > TMath::TwoPi())
54 ::Error(
"TEveCaloData::CellGeom_t::Configure",
"phiMin and phiMax should be between -2*pi and 2*pi (min=%f, max=%f). RhoZ projection will be wrong.",
58 fThetaMin = EtaToTheta(fEtaMax);
59 fThetaMax = EtaToTheta(fEtaMin);
71 Float_t TEveCaloData::CellData_t::Value(Bool_t isEt)
const
76 return TMath::Abs(fValue/TMath::Sin(Theta()));
82 void TEveCaloData::CellData_t::Dump()
const
84 printf(
"%f, %f %f, %f \n", fEtaMin, fEtaMax, fPhiMin, fPhiMax);
89 Float_t* TEveCaloData::RebinData_t::GetSliceVals(Int_t bin)
92 if (fBinData[bin] == -1)
94 fBinData[bin] = fSliceData.size();
96 for (Int_t i=0; i<fNSlices; i++)
97 fSliceData.push_back(0.f);
100 return &fSliceData[fBinData[bin]];
109 ClassImp(TEveCaloData);
113 TEveCaloData::TEveCaloData(
const char* n,
const char* t):
134 void TEveCaloData::UnSelected()
136 fCellsSelected.clear();
142 void TEveCaloData::UnHighlighted()
144 fCellsHighlighted.clear();
149 TString TEveCaloData::GetHighlightTooltip()
151 if (fCellsHighlighted.empty())
return "";
155 Bool_t single = fCellsHighlighted.size() == 1;
158 for (vCellId_i i = fCellsHighlighted.begin(); i!=fCellsHighlighted.end(); ++i)
160 GetCellData(*i, cellData);
162 s += TString::Format(
"%s %.2f (%.3f, %.3f)",
163 fSliceInfos[i->fSlice].fName.Data(), cellData.fValue,
164 cellData.Eta(), cellData.Phi());
166 if (single)
return s;
168 sum += cellData.fValue;
170 s += TString::Format(
"Sum = %.2f", sum);
178 void TEveCaloData::FillImpliedSelectedSet(Set_t& impSelSet)
180 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
182 impSelSet.insert(*i);
189 void TEveCaloData::PrintCellsSelected()
191 printf(
"%d Selected selected cells:\n", (Int_t)fCellsSelected.size());
194 for (vCellId_i i = fCellsSelected.begin(); i != fCellsSelected.end(); ++i)
196 GetCellData(*i, cellData);
197 printf(
"Tower [%d] Slice [%d] Value [%.2f] ", i->fTower, i->fSlice, cellData.fValue);
198 printf(
"Eta:(%f, %f) Phi(%f, %f)\n", cellData.fEtaMin, cellData.fEtaMax, cellData.fPhiMin, cellData.fPhiMax);
207 void TEveCaloData::ProcessSelection(vCellId_t& sel_cells, TGLSelectRecord& rec)
209 typedef std::set<CellId_t> sCellId_t;
210 typedef std::set<CellId_t>::iterator sCellId_i;
214 static void fill_cell_set(sCellId_t& cset, vCellId_t& cvec)
216 for (vCellId_i i = cvec.begin(); i != cvec.end(); ++i)
219 static void fill_cell_vec(vCellId_t& cvec, sCellId_t& cset)
221 for (sCellId_i i = cset.begin(); i != cset.end(); ++i)
226 vCellId_t& cells = rec.GetHighlight() ? fCellsHighlighted : fCellsSelected;
230 if (!sel_cells.empty())
232 cells.swap(sel_cells);
233 rec.SetSecSelResult(TGLSelectRecord::kEnteringSelection);
238 if (!sel_cells.empty())
240 if (rec.GetMultiple())
243 helper::fill_cell_set(cs, cells);
244 for (vCellId_i i = sel_cells.begin(); i != sel_cells.end(); ++i)
246 std::set<CellId_t>::iterator csi = cs.find(*i);
255 rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
259 helper::fill_cell_vec(cells, cs);
260 rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
265 Bool_t differ = kFALSE;
266 if (cells.size() == sel_cells.size())
269 helper::fill_cell_set(cs, cells);
270 for (vCellId_i i = sel_cells.begin(); i != sel_cells.end(); ++i)
272 if (cs.find(*i) == cs.end())
285 cells.swap(sel_cells);
286 rec.SetSecSelResult(TGLSelectRecord::kModifyingInternalSelection);
292 if (!rec.GetMultiple())
295 rec.SetSecSelResult(TGLSelectRecord::kLeavingSelection);
300 if (rec.GetSecSelResult() != TGLSelectRecord::kNone)
302 CellSelectionChanged();
309 void TEveCaloData::SetSliceThreshold(Int_t slice, Float_t val)
311 fSliceInfos[slice].fThreshold = val;
312 InvalidateUsersCellIdCache();
318 Float_t TEveCaloData::GetSliceThreshold(Int_t slice)
const
320 return fSliceInfos[slice].fThreshold;
326 void TEveCaloData::SetSliceColor(Int_t slice, Color_t col)
328 fSliceInfos[slice].fColor = col;
329 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
331 (*i)->AddStamp(TEveElement::kCBObjProps);
338 Color_t TEveCaloData::GetSliceColor(Int_t slice)
const
340 return fSliceInfos[slice].fColor;
346 void TEveCaloData::SetSliceTransparency(Int_t slice, Char_t t)
348 fSliceInfos[slice].fTransparency = t;
349 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
351 (*i)->AddStamp(TEveElement::kCBObjProps);
358 Char_t TEveCaloData::GetSliceTransparency(Int_t slice)
const
360 return fSliceInfos[slice].fTransparency;
366 void TEveCaloData::InvalidateUsersCellIdCache()
369 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
371 calo =
dynamic_cast<TEveCaloViz*
>(*i);
372 calo->InvalidateCellIdCache();
373 calo->StampObjProps();
382 void TEveCaloData::DataChanged()
385 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
387 calo =
dynamic_cast<TEveCaloViz*
>(*i);
389 calo->StampObjProps();
398 void TEveCaloData::CellSelectionChanged()
401 for (List_ci i=fChildren.begin(); i!=fChildren.end(); ++i)
403 calo =
dynamic_cast<TEveCaloViz*
>(*i);
404 calo->CellSelectionChanged();
405 calo->StampColorSelection();
411 Float_t TEveCaloData::EtaToTheta(Float_t eta)
413 using namespace TMath;
416 return Pi() - 2*ATan(Exp(- Abs(eta)));
418 return 2*ATan(Exp(- Abs(eta)));
427 ClassImp(TEveCaloDataVec);
431 TEveCaloDataVec::TEveCaloDataVec(Int_t nslices):
442 fSliceInfos.assign(nslices, SliceInfo_t());
444 fSliceVec.assign(nslices, std::vector<Float_t> ());
450 TEveCaloDataVec::~TEveCaloDataVec()
452 if (fEtaAxis)
delete fEtaAxis;
453 if (fPhiAxis)
delete fPhiAxis;
459 Int_t TEveCaloDataVec::AddSlice()
461 fSliceInfos.push_back(SliceInfo_t());
462 fSliceVec.push_back(std::vector<Float_t> ());
463 fSliceVec.back().resize(fGeomVec.size(), 0.f);
465 return fSliceInfos.size() - 1;
471 Int_t TEveCaloDataVec::AddTower(Float_t etaMin, Float_t etaMax, Float_t phiMin, Float_t phiMax)
473 assert (etaMin < etaMax);
474 assert (phiMin < phiMax);
476 fGeomVec.push_back(CellGeom_t(etaMin, etaMax, phiMin, phiMax));
478 for (vvFloat_i it=fSliceVec.begin(); it!=fSliceVec.end(); ++it)
481 if (etaMin < fEtaMin) fEtaMin = etaMin;
482 if (etaMax > fEtaMax) fEtaMax = etaMax;
484 if (phiMin < fPhiMin) fPhiMin = phiMin;
485 if (phiMax > fPhiMax) fPhiMax = phiMax;
487 fTower = fGeomVec.size() - 1;
494 void TEveCaloDataVec::FillSlice(Int_t slice, Float_t val)
496 fSliceVec[slice][fTower] = val;
502 void TEveCaloDataVec::FillSlice(Int_t slice, Int_t tower, Float_t val)
504 fSliceVec[slice][tower] = val;
511 void TEveCaloDataVec::GetCellList(Float_t eta, Float_t etaD,
512 Float_t phi, Float_t phiD,
513 TEveCaloData::vCellId_t &out)
const
515 using namespace TMath;
517 Float_t etaMin = eta - etaD*0.5;
518 Float_t etaMax = eta + etaD*0.5;
520 Float_t phiMin = phi - phiD*0.5;
521 Float_t phiMax = phi + phiD*0.5;
523 Int_t nS = fSliceVec.size();
526 Float_t fracx=0, fracy=0, frac;
529 for(vCellGeom_ci i=fGeomVec.begin(); i!=fGeomVec.end(); i++)
531 const CellGeom_t &cg = *i;
532 fracx = TEveUtil::GetFraction(etaMin, etaMax, cg.fEtaMin, cg.fEtaMax);
542 minQ += TwoPi(); maxQ += TwoPi();
544 else if (minQ > phiMax)
546 minQ -= TwoPi(); maxQ -= TwoPi();
550 if (maxQ >= phiMin && minQ <= phiMax)
552 fracy = TEveUtil::GetFraction(phiMin, phiMax, minQ, maxQ);
556 for (Int_t s=0; s<nS; s++)
558 if (fSliceVec[s][tower] > fSliceInfos[s].fThreshold)
559 out.push_back(CellId_t(tower, s, frac));
571 void TEveCaloDataVec::Rebin(TAxis* ax, TAxis* ay, vCellId_t &ids, Bool_t et, RebinData_t& rdata)
const
573 rdata.fNSlices = GetNSlices();
574 rdata.fBinData.assign((ax->GetNbins()+2)*(ay->GetNbins()+2), -1);
577 for (vCellId_i it = ids.begin(); it != ids.end(); ++it)
579 GetCellData(*it, cd);
580 Int_t iMin = ax->FindBin(cd.EtaMin());
581 Int_t iMax = ax->FindBin(cd.EtaMax());
582 Int_t jMin = ay->FindBin(cd.PhiMin());
583 Int_t jMax = ay->FindBin(cd.PhiMax());
584 for (Int_t i = iMin; i <= iMax; ++i)
586 if (i < 0 || i > ax->GetNbins())
continue;
587 for (Int_t j = jMin; j <= jMax; ++j)
589 if (j < 0 || j > ay->GetNbins())
continue;
591 Double_t ratio = TEveUtil::GetFraction(ax->GetBinLowEdge(i), ax->GetBinUpEdge(i), cd.EtaMin(), cd.EtaMax())
592 * TEveUtil::GetFraction(ay->GetBinLowEdge(j), ay->GetBinUpEdge(j), cd.PhiMin(), cd.PhiMax());
596 Float_t* slices = rdata.GetSliceVals(i + j*(ax->GetNbins()+2));
597 slices[(*it).fSlice] += ratio * cd.Value(et);
607 void TEveCaloDataVec::GetCellData(
const TEveCaloData::CellId_t &
id,
608 TEveCaloData::CellData_t& cellData)
const
610 cellData.CellGeom_t::operator=( fGeomVec[
id.fTower] );
611 cellData.fValue = fSliceVec[
id.fSlice][
id.fTower];
617 void TEveCaloDataVec::DataChanged()
619 using namespace TMath;
628 for (UInt_t tw=0; tw<fGeomVec.size(); tw++)
631 for (vvFloat_i it=fSliceVec.begin(); it!=fSliceVec.end(); ++it)
634 if (sum > fMaxValEt ) fMaxValEt=sum;
636 sum /= Abs(Sin(EtaToTheta(fGeomVec[tw].Eta())));
638 if (sum > fMaxValE) fMaxValE=sum;
641 TEveCaloData::DataChanged();
648 void TEveCaloDataVec::SetAxisFromBins(Double_t epsX, Double_t epsY)
650 std::vector<Double_t> binX;
651 std::vector<Double_t> binY;
653 for(vCellGeom_ci i=fGeomVec.begin(); i!=fGeomVec.end(); i++)
655 const CellGeom_t &ch = *i;
657 binX.push_back(ch.EtaMin());
658 binX.push_back(ch.EtaMax());
659 binY.push_back(ch.PhiMin());
660 binY.push_back(ch.PhiMax());
663 std::sort(binX.begin(), binX.end());
664 std::sort(binY.begin(), binY.end());
671 Double_t dx = binX.back() - binX.front();
673 std::vector<Double_t> newX;
674 newX.push_back(binX.front());
675 Int_t nX = binX.size()-1;
676 for(Int_t i=0; i<nX; i++)
678 val = (sum +binX[i])/(cnt+1);
679 if (binX[i+1] -val > epsX)
691 newX.push_back(binX.back());
696 std::vector<Double_t> newY;
697 Double_t dy = binY.back() - binY.front();
699 newY.push_back(binY.front());
700 Int_t nY = binY.size()-1;
701 for(Int_t i=0 ; i<nY; i++)
703 val = (sum +binY[i])/(cnt+1);
704 if (binY[i+1] -val > epsY )
717 newY.push_back(binY.back());
719 if (fEtaAxis)
delete fEtaAxis;
720 if (fPhiAxis)
delete fPhiAxis;
722 fEtaAxis =
new TAxis(newX.size()-1, &newX[0]);
723 fPhiAxis =
new TAxis(newY.size()-1, &newY[0]);
724 fEtaAxis->SetNdivisions(510);
725 fPhiAxis->SetNdivisions(510);
734 ClassImp(TEveCaloDataHist);
739 TEveCaloDataHist::TEveCaloDataHist():
744 fHStack =
new THStack();
751 TEveCaloDataHist::~TEveCaloDataHist()
759 void TEveCaloDataHist::DataChanged()
761 using namespace TMath;
767 if (GetNSlices() < 1)
return;
769 TH2* hist = GetHist(0);
770 fEtaAxis = hist->GetXaxis();
771 fPhiAxis = hist->GetYaxis();
772 for (Int_t ieta = 1; ieta <= fEtaAxis->GetNbins(); ++ieta)
774 Double_t eta = fEtaAxis->GetBinCenter(ieta);
775 for (Int_t iphi = 1; iphi <= fPhiAxis->GetNbins(); ++iphi)
778 for (Int_t i = 0; i < GetNSlices(); ++i)
781 Int_t bin = hist->GetBin(ieta, iphi);
782 value += hist->GetBinContent(bin);
785 if (value > fMaxValEt ) fMaxValEt = value;
787 value /= Abs(Sin(EtaToTheta(eta)));
789 if (value > fMaxValE) fMaxValE = value;
792 TEveCaloData::DataChanged();
798 void TEveCaloDataHist::GetCellList(Float_t eta, Float_t etaD,
799 Float_t phi, Float_t phiD,
800 TEveCaloData::vCellId_t &out)
const
802 using namespace TMath;
804 Float_t etaMin = eta - etaD*0.5 -fEps;
805 Float_t etaMax = eta + etaD*0.5 +fEps;
807 Float_t phiMin = phi - phiD*0.5 -fEps;
808 Float_t phiMax = phi + phiD*0.5 +fEps;
810 Int_t nEta = fEtaAxis->GetNbins();
811 Int_t nPhi = fPhiAxis->GetNbins();
812 Int_t nSlices = GetNSlices();
817 for (Int_t ieta = 1; ieta <= nEta; ++ieta)
819 if (fEtaAxis->GetBinLowEdge(ieta) >= etaMin && fEtaAxis->GetBinUpEdge(ieta) <= etaMax)
821 for (Int_t iphi = 1; iphi <= nPhi; ++iphi)
825 accept = TEveUtil::IsU1IntervalContainedByMinMax
826 (phiMin, phiMax, fPhiAxis->GetBinLowEdge(iphi), fPhiAxis->GetBinUpEdge(iphi));
830 accept = fPhiAxis->GetBinLowEdge(iphi) >= phiMin && fPhiAxis->GetBinUpEdge(iphi) <= phiMax &&
831 fPhiAxis->GetBinLowEdge(iphi) >= phiMin && fPhiAxis->GetBinUpEdge(iphi) <= phiMax;
836 for (Int_t s = 0; s < nSlices; ++s)
838 TH2F *hist = GetHist(s);
839 bin = hist->GetBin(ieta, iphi);
840 if (hist->GetBinContent(bin) > fSliceInfos[s].fThreshold)
841 out.push_back(TEveCaloData::CellId_t(bin, s));
852 void TEveCaloDataHist::Rebin(TAxis* ax, TAxis* ay, TEveCaloData::vCellId_t &ids, Bool_t et, RebinData_t &rdata)
const
854 rdata.fNSlices = GetNSlices();
855 rdata.fBinData.assign((ax->GetNbins()+2)*(ay->GetNbins()+2), -1);
856 TEveCaloData::CellData_t cd;
862 for (vCellId_i it=ids.begin(); it!=ids.end(); ++it)
864 GetCellData(*it, cd);
865 GetHist(it->fSlice)->GetBinXYZ((*it).fTower, i, j, w);
866 binx = ax->FindBin(fEtaAxis->GetBinCenter(i));
867 biny = ay->FindBin(fPhiAxis->GetBinCenter(j));
868 bin = biny*(ax->GetNbins()+2)+binx;
869 val = rdata.GetSliceVals(bin);
870 Double_t ratio = TEveUtil::GetFraction(ax->GetBinLowEdge(binx), ax->GetBinUpEdge(binx), cd.EtaMin(), cd.EtaMax())
871 * TEveUtil::GetFraction(ay->GetBinLowEdge(biny), ay->GetBinUpEdge(biny), cd.PhiMin(), cd.PhiMax());
873 val[(*it).fSlice] += cd.Value(et)*ratio;
880 void TEveCaloDataHist::GetCellData(
const TEveCaloData::CellId_t &
id,
881 TEveCaloData::CellData_t& cellData)
const
883 TH2F* hist = GetHist(
id.fSlice);
886 hist->GetBinXYZ(
id.fTower, x, y, z);
888 cellData.fValue = hist->GetBinContent(
id.fTower);
889 cellData.Configure(hist->GetXaxis()->GetBinLowEdge(x),
890 hist->GetXaxis()->GetBinUpEdge(x),
891 hist->GetYaxis()->GetBinLowEdge(y),
892 hist->GetYaxis()->GetBinUpEdge(y));
900 Int_t TEveCaloDataHist::AddHistogram(TH2F* hist)
903 fSliceInfos.push_back(SliceInfo_t());
904 fSliceInfos.back().fName = hist->GetName();
905 fSliceInfos.back().fColor = hist->GetLineColor();
909 return fSliceInfos.size() - 1;
915 TH2F* TEveCaloDataHist::GetHist(Int_t slice)
const
917 assert(slice >= 0 && slice < fHStack->GetHists()->GetSize());
918 return (TH2F*) fHStack->GetHists()->At(slice);
924 void TEveCaloDataHist::GetEtaLimits(Double_t &min, Double_t &max)
const
926 min = fEtaAxis->GetXmin();
927 max = fEtaAxis->GetXmax();
933 void TEveCaloDataHist::GetPhiLimits(Double_t &min, Double_t &max)
const
935 min = fPhiAxis->GetXmin();
936 max = fPhiAxis->GetXmax();