Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
#include "Fireworks/ParticleFlow/interface/FWPFRhoPhiRecHit.h"

//______________________________________________________________________________
FWPFRhoPhiRecHit::FWPFRhoPhiRecHit(FWProxyBuilderBase *pb,
                                   TEveElement *iH,
                                   const FWViewContext *vc,
                                   float E,
                                   float et,
                                   double lPhi,
                                   double rPhi,
                                   std::vector<TEveVector> &bCorners)
    : m_hasChild(false), m_energy(E), m_et(et), m_lPhi(lPhi), m_rPhi(rPhi), m_child(nullptr) {
  buildRecHit(pb, iH, vc, bCorners);
}

//______________________________________________________________________________
FWPFRhoPhiRecHit::~FWPFRhoPhiRecHit() {}

//______________________________________________________________________________
void FWPFRhoPhiRecHit::updateScale(const FWViewContext *vc) {
  FWViewEnergyScale *caloScale = vc->getEnergyScale();
  float value = caloScale->getPlotEt() ? m_et : m_energy;
  Double_t scale = caloScale->getScaleFactor3D() * value;
  unsigned int a = 0;

  if (scale < 0.f)
    scale *= -1.f;

  // Scale centres
  TEveVector sc1 = m_corners[1];
  TEveVector sc2 = m_corners[0];

  // Used to store normalized vectors
  TEveVector v1 = sc1;  // Bottom right corner
  TEveVector v2 = sc2;  // Bottom left corner

  v1.Normalize();
  v2.Normalize();

  v1 *= scale;  // Now at new height
  v2 *= scale;

  // Get line parameters and scale coordinates
  TEveChunkManager::iterator li(m_ls->GetLinePlex());
  while (li.next()) {
    TEveStraightLineSet::Line_t &l = *(TEveStraightLineSet::Line_t *)li();
    switch (a) {
      case 0:
        // Left side of tower first
        l.fV1[0] = sc2.fX;
        l.fV1[1] = sc2.fY;
        l.fV2[0] = sc2.fX + v2.fX;
        l.fV2[1] = sc2.fY + v2.fY;
        break;

      case 1:
        // Top of tower
        l.fV1[0] = sc2.fX + v2.fX;
        l.fV1[1] = sc2.fY + v2.fY;
        l.fV2[0] = sc1.fX + v1.fX;
        l.fV2[1] = sc1.fY + v1.fY;
        break;

      case 2:
        // Right hand side of tower
        l.fV1[0] = sc1.fX + v1.fX;
        l.fV1[1] = sc1.fY + v1.fY;
        l.fV2[0] = sc1.fX;
        l.fV2[1] = sc1.fY;
        break;

      case 3:
        // Bottom of tower
        l.fV1[0] = sc1.fX;
        l.fV1[1] = sc1.fY;
        l.fV2[0] = sc2.fX;
        l.fV2[1] = sc2.fY;
        break;
    }
    a++;
  }
  TEveProjected *proj = *(m_ls)->BeginProjecteds();
  proj->UpdateProjection();

  m_corners[2] = sc2 + v2;  // New top left of tower
  m_corners[3] = sc1 + v1;  // New top right of tower

  if (m_hasChild) {
    m_child->setCorners(0, m_corners[2]);
    m_child->setCorners(1, m_corners[3]);  // Base of child is now top of parent
    m_child->updateScale(vc);
  }
}

//______________________________________________________________________________
void FWPFRhoPhiRecHit::clean() {
  m_corners.clear();
  if (m_hasChild)
    m_child->clean();

  delete this;
}

//______________________________________________________________________________
void FWPFRhoPhiRecHit::addChild(
    FWProxyBuilderBase *pb, TEveElement *itemHolder, const FWViewContext *vc, float E, float et) {
  if (m_hasChild)  // Already has a child stacked on top so move on to child
    m_child->addChild(pb, itemHolder, vc, E, et);
  else {
    std::vector<TEveVector> corners(2);
    corners[0] = m_corners[2];  // Top left of current tower
    corners[1] = m_corners[3];  // Top right of current tower
    m_child = new FWPFRhoPhiRecHit(pb, itemHolder, vc, E, et, m_lPhi, m_rPhi, corners);
    m_hasChild = true;
  }
}

//______________________________________________________________________________
void FWPFRhoPhiRecHit::buildRecHit(FWProxyBuilderBase *pb,
                                   TEveElement *itemHolder,
                                   const FWViewContext *vc,
                                   std::vector<TEveVector> &bCorners) {
  float scale = 0;
  float value = 0;
  TEveVector v1, v2, v3, v4;
  TEveVector vec;

  FWViewEnergyScale *caloScale = vc->getEnergyScale();
  value = caloScale->getPlotEt() ? m_et : m_energy;
  scale = caloScale->getScaleFactor3D() * value;

  v1 = bCorners[0];  // Bottom left
  v2 = bCorners[1];  // Bottom right

  v3 = v1;
  vec = v3;
  vec.Normalize();
  v3 = v3 + (vec * scale);

  v4 = v2;
  vec = v4;
  vec.Normalize();
  v4 = v4 + (vec * scale);

  m_ls = new TEveScalableStraightLineSet("rhophiRecHit");
  m_ls->AddLine(v1.fX, v1.fY, 0, v3.fX, v3.fY, 0);  // Bottom left - Top left
  m_ls->AddLine(v3.fX, v3.fY, 0, v4.fX, v4.fY, 0);  // Top left - Top right
  m_ls->AddLine(v4.fX, v4.fY, 0, v2.fX, v2.fY, 0);  // Top right - Bottom right
  m_ls->AddLine(v2.fX, v2.fY, 0, v1.fX, v1.fY, 0);  // Bottom right - Bottom left

  m_corners.push_back(v1);
  m_corners.push_back(v2);
  m_corners.push_back(v3);
  m_corners.push_back(v4);

  pb->setupAddElement(m_ls, itemHolder);
}