StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StEtaPhiGrid.cxx
1 // -*- mode: c++;-*-
2 // $Id: StEtaPhiGrid.cxx,v 1.8 2010/07/02 21:47:56 pibero Exp $
3 #include "StEtaPhiGrid.h"
4 
5 #include "StConePars.h"
6 #include "StJetEtCellFactory.h"
7 
8 #include <iostream>
9 
10 using namespace std;
11 
12 namespace StSpinJet {
13 
14 StEtaPhiGrid::~StEtaPhiGrid()
15 {
16  for (CellList::iterator cell = _EtCellList.begin(); cell != _EtCellList.end(); ++cell)
17  delete *cell;
18 }
19 
20 void StEtaPhiGrid::buildGrid(StJetEtCellFactory* cellFactory)
21 {
22  for(int i = 0; i < _pars.Neta(); ++i){
23 
24  double etaMin = _pars.EtaMin() + static_cast<double>(i)*_pars.etaWidth();
25  double etaMax = etaMin + _pars.etaWidth();
26 
27  for(int j = 0; j < _pars.Nphi(); ++j){
28 
29  double phiMin = _pars.PhiMin() + static_cast<double>(j)*_pars.phiWidth();
30  double phiMax = phiMin + _pars.phiWidth();
31 
32  StEtaPhiCell* cell = cellFactory->create(etaMin, etaMax, phiMin, phiMax);
33 
34  _EtCellList.push_back(cell);
35 
36  _EtCellMap.insert(CellMapValType(findKey(cell->eta(), cell->phi()), cell));
37  }
38  }
39 
40 }
41 
42 void StEtaPhiGrid::fillGridWith(JetList& protoJetList)
43 {
44  for(CellList::iterator etCell = _EtCellList.begin(); etCell != _EtCellList.end(); ++etCell) {
45  (*etCell)->clear();
46  }
47 
48  for (JetList::iterator protoJet = protoJetList.begin(); protoJet != protoJetList.end(); ++protoJet) {
49  CellMap::iterator where = _EtCellMap.find(findKey((*protoJet).eta(), (*protoJet).phi()));
50  if (where != _EtCellMap.end())
51  (*where).second->addProtoJet(*protoJet);
52  // else
53  // cout << "StEtaPhiGrid::fillGrid(). ERROR:\t" <<"Could not fill jet in grid."<< endl << *protoJet << endl;
54  }
55 
56  for(CellList::iterator etCell = _EtCellList.begin(); etCell != _EtCellList.end(); ++etCell) {
57  (*etCell)->update();
58  }
59 }
60 
61 StEtaPhiGrid::CellList StEtaPhiGrid::EtSortedCellList()
62 {
63  _EtCellList.sort(StJetEtCellEtGreaterThan());
64  return _EtCellList;
65 }
66 
67 StEtaPhiGrid::CellList StEtaPhiGrid::WithinTheConeRadiusCellList(const StEtaPhiCell& theCell) const
68 {
69  CellList ret;
70 
71  StEtGridKey centerKey = findKey(theCell.eta(), theCell.phi());
72 
73  int iEtaMin = centerKey.eta() - _pars.deltaEta();
74  if (iEtaMin < 0) iEtaMin = 0 ;
75 
76  for(int iEta = iEtaMin; (iEta <= centerKey.eta() + _pars.deltaEta()) && (iEta < _pars.Neta()); ++iEta) {
77  for (int iPhi = centerKey.phi() - _pars.deltaPhi(); iPhi <= centerKey.phi() + _pars.deltaPhi(); ++iPhi) {
78 
79  int iModPhi = iPhi;
80  if (iModPhi < 0) iModPhi = iModPhi + _pars.Nphi();
81  if (iModPhi >= _pars.Nphi()) iModPhi = iModPhi - _pars.Nphi();
82 
83  StEtaPhiCell* otherCell = CellI(iEta, iModPhi);
84 
85  if(theCell.distance(*otherCell) >= _pars.coneRadius()) continue;
86 
87  ret.push_back(otherCell);
88 
89  }
90  }
91 
92  return ret;
93 }
94 
95 StEtaPhiCell* StEtaPhiGrid::Cell(double eta, double phi)
96 {
97  CellMap::iterator it = _EtCellMap.find(findKey(eta, phi));
98  return (it != _EtCellMap.end()) ? (*it).second : 0;
99 }
100 
101 StEtaPhiCell* StEtaPhiGrid::CellI(int iEta, int iPhi) const
102 {
103  CellMap::const_iterator it = _EtCellMap.find(StEtGridKey(iEta, iPhi));
104  return (it != _EtCellMap.end()) ? (*it).second : 0;
105 }
106 
107 StEtGridKey StEtaPhiGrid::findKey(double eta, double phi) const
108 {
109  int iEta = findEtaKey(eta);
110  int iPhi = findPhiKey(phi);
111  if (iEta < 0 || iPhi < 0) {
112  // cout << "StEtGridKey::findKey(double, double). ERROR:\t"
113  // << "eta:\t" << eta << "\tphi:\t" << phi << "\t"
114  // << "iEta<0|| iPhi<0\tabort()" << endl;
115  }
116  return StEtGridKey(iEta, iPhi);
117 }
118 
119 
120 int StEtaPhiGrid::findEtaKey(double eta) const
121 {
122  return int((_pars.Neta()/(_pars.EtaMax() - _pars.EtaMin()))*(eta - _pars.EtaMin()));
123 }
124 
125 int StEtaPhiGrid::findPhiKey(double phi) const
126 {
127  while(phi > M_PI) phi -= 2*M_PI;
128  while(phi < -M_PI) phi += 2*M_PI;
129  return int( _pars.Nphi()*((phi - _pars.PhiMin())/(_pars.PhiMax() - _pars.PhiMin())));
130 }
131 
132 double StEtaPhiGrid::midpoint(double v1, double v2)
133 {
134  double high, low;
135  if (v1 > v2) {
136  high =v1;
137  low=v2;
138  }
139  else {
140  high = v2;
141  low=v1;
142  }
143  return (high - low)/2. + low;
144 }
145 
146 StEtaPhiCell* StEtaPhiGrid::findMidpointCell(const StEtaPhiCell& cell1, const StEtaPhiCell& cell2)
147 {
148  // return Cell((cell1.eta() + cell2.eta())/2.0, (cell1.phi() + cell2.phi())/2.0);
149  return Cell(midpoint(cell1.eta(), cell2.eta()), midpoint(cell1.phi(), cell2.phi()));
150 }
151 
152 
153 }