26 :nPhi_(nPhi),nEta_(nEta),
27 lookupMap_(nPhi_*nEta_,
std::pair<unsigned
int, unsigned
int>(0,0)),
28 theMapIsValid_(
false),etaBinSize_(etaBinSize)
30 if (
nEta_ <= 0 ||
nPhi_ <= 0)
throw cms::Exception(
"FatalError") <<
"incorrect look-up map size. Cannot initialize such a map.";
44 const unsigned int iNEtaPlus,
45 const unsigned int iNEtaMinus,
46 const unsigned int iNPhiPlus,
47 const unsigned int iNPhiMinus)
const 52 LogTrace(
"TrackAssociator") <<
"(iNEtaPlus, iNEtaMinus, iNPhiPlus, iNPhiMinus): " <<
53 iNEtaPlus <<
", " << iNEtaMinus <<
", " << iNPhiPlus <<
", " << iNPhiMinus;
54 LogTrace(
"TrackAssociator") <<
"point (eta,phi): " << direction.
eta() <<
"," << direction.
phi();
55 int ieta =
iEta(direction);
56 int iphi =
iPhi(direction);
57 LogTrace(
"TrackAssociator") <<
"(ieta,iphi): " << ieta <<
"," << iphi <<
"\n";
58 if (ieta>=0 && ieta<nEta_ && iphi>=0 && iphi<
nPhi_){
62 if (iNEtaPlus + iNEtaMinus + iNPhiPlus + iNPhiMinus >0 ){
63 LogTrace(
"TrackAssociator") <<
"Add neighbors (ieta,iphi): " << ieta <<
"," << iphi;
65 int maxIEta = ieta+iNEtaPlus;
66 int minIEta = ieta-iNEtaMinus;
68 if (minIEta<0) minIEta = 0;
70 int maxIPhi = iphi+iNPhiPlus;
71 int minIPhi = iphi-iNPhiMinus;
72 if (maxIPhi-minIPhi>=
nPhi_){
80 LogTrace(
"TrackAssociator") <<
"\tieta (min,max): " << minIEta <<
"," << maxIEta;
81 LogTrace(
"TrackAssociator") <<
"\tiphi (min,max): " << minIPhi <<
"," << maxIPhi<<
"\n";
83 for (
int i=minIEta;
i<=maxIEta;
i++)
84 for (
int j=minIPhi;j<=maxIPhi;j++) {
85 if(
i==ieta && j==iphi)
continue;
101 const double dThetaPlus,
102 const double dThetaMinus,
103 const double dPhiPlus,
104 const double dPhiMinus)
const 106 LogTrace(
"TrackAssociator") <<
"(dThetaPlus,dThetaMinus,dPhiPlus,dPhiMinus): " <<
107 dThetaPlus <<
", " << dThetaMinus <<
", " << dPhiPlus <<
", " << dPhiMinus;
109 if ( dThetaPlus<0 || dThetaMinus<0 || dPhiPlus<0 || dPhiMinus<0)
114 double minTheta = point.
theta()-dThetaMinus;
115 if (minTheta < minTheta_) minTheta =
minTheta_;
116 if ( maxTheta < minTheta_ || minTheta >
M_PI-minTheta_)
return std::set<DetId>();
124 unsigned int iNPhiPlus =
abs(
int( dPhiPlus/(2*
M_PI)*
nPhi_ ));
125 unsigned int iNPhiMinus =
abs(
int( dPhiMinus/(2*
M_PI)*nPhi_ ));
148 LogTrace(
"TrackAssociator")<<
"building map for " <<
name() <<
"\n";
150 if (
nEta_ <= 0 ||
nPhi_ <= 0)
throw cms::Exception(
"FatalError") <<
"incorrect look-up map size. Cannot build such a map.";
151 std::vector<GlobalPoint> pointBuffer;
152 std::vector<DetId> detIdBuffer;
154 unsigned totalNumberOfElementsInTheContainer(0);
156 unsigned int numberOfDetIdsOutsideEtaRange = 0;
157 unsigned int numberOfDetIdsActive = 0;
159 for (
unsigned int subDetectorIndex = 0; subDetectorIndex < numberOfSubDetectors; ++subDetectorIndex ){
162 std::vector<DetId>
const& validIds =
std::move(detIdBuffer);
163 LogTrace(
"TrackAssociator")<<
"Number of valid DetIds for subdetector: " << subDetectorIndex <<
" is " << validIds.size();
164 for (std::vector<DetId>::const_iterator id_itr = validIds.begin(); id_itr!=validIds.end(); id_itr++) {
166 LogTrace(
"TrackAssociatorVerbose")<<
"Found " << points.second-points.first <<
" global points to describe geometry of DetId: " 173 for(std::vector<GlobalPoint>::const_iterator iter = points.first; iter != points.second; iter++)
175 LogTrace(
"TrackAssociatorVerbose")<<
"\tpoint (rho,phi,z): " << iter->perp() <<
", " <<
176 iter->phi() <<
", " << iter->z();
179 edm::LogWarning(
"TrackAssociator") <<
"Critical error! Bad detector unit geometry:\n\tDetId:" 180 << id_itr->rawId() <<
"\t mag(): " << iter->mag() <<
"\n" <<
DetIdInfo::info( *id_itr,
nullptr )
181 <<
"\nSkipped the element";
185 int ieta =
iEta(*iter);
186 int iphi =
iPhi(*iter);
187 if (ieta<0 || ieta>=
nEta_) {
188 LogTrace(
"TrackAssociator")<<
"Out of range: DetId:" << id_itr->rawId() <<
"\t (ieta,iphi): " 189 << ieta <<
"," << iphi <<
"\n" <<
"Point: " << *iter <<
"\t(eta,phi): " << (*iter).eta()
190 <<
"," << (*iter).phi() <<
"\n center: " <<
getPosition(*id_itr);
201 int deltaMin =
abs(phiMin -iphi);
202 int deltaMax =
abs(phiMax -iphi);
205 if ( deltaMax >
nPhi_/2 ) {
206 if (phiMax <
nPhi_/2 )
212 if ( etaMin > ieta) etaMin = ieta;
213 if ( etaMax < ieta) etaMax = ieta;
214 if ( phiMin > iphi) phiMin = iphi;
215 if ( phiMax < iphi) phiMax = iphi;
218 if (etaMax<0||phiMax<0||etaMin>=
nEta_||phiMin>=
nPhi_) {
219 LogTrace(
"TrackAssociatorVerbose")<<
"Out of range or no geometry: DetId:" << id_itr->rawId() <<
220 "\n\teta (min,max): " << etaMin <<
"," << etaMax <<
221 "\n\tphi (min,max): " << phiMin <<
"," << phiMax <<
222 "\nTower id: " << id_itr->rawId() <<
"\n";
223 numberOfDetIdsOutsideEtaRange++;
226 numberOfDetIdsActive++;
228 LogTrace(
"TrackAssociatorVerbose") <<
"DetId (ieta_min,ieta_max,iphi_min,iphi_max): " << id_itr->rawId() <<
229 ", " << etaMin <<
", " << etaMax <<
", " << phiMin <<
", " <<
phiMax;
230 for(
int ieta = etaMin; ieta <=
etaMax; ieta++)
231 for(
int iphi = phiMin; iphi <=
phiMax; iphi++)
234 totalNumberOfElementsInTheContainer++;
238 totalNumberOfElementsInTheContainer--;
242 LogTrace(
"TrackAssociator") <<
"Number of elements outside the allowed range ( |eta|>"<<
244 LogTrace(
"TrackAssociator") <<
"Number of active DetId's mapped: " <<
245 numberOfDetIdsActive <<
"\n";
248 container_.resize(totalNumberOfElementsInTheContainer);
250 unsigned int index(0);
251 for ( std::vector<std::pair<unsigned int,unsigned int> >::iterator
bin =
lookupMap_.begin();
254 if (
bin->second==0)
continue;
255 index +=
bin->second;
256 bin->first = index-1;
260 if ( totalNumberOfElementsInTheContainer != 0 )
261 throw cms::Exception(
"FatalError") <<
"Look-up map filled incorrectly. Structural problem. Get in touch with the developer.";
263 edm::LogVerbatim(
"TrackAssociator") <<
"Fiducial volume for " <<
name() <<
" (minR, maxR, minZ, maxZ): " <<
269 const std::vector<GlobalPoint>& trajectory,
270 const double dR)
const 274 std::set<DetId> outset;
275 for(std::set<DetId>::const_iterator id_iter = inset.begin(); id_iter != inset.end(); id_iter++)
276 for(std::vector<GlobalPoint>::const_iterator point_iter = trajectory.begin(); point_iter != trajectory.end(); point_iter++)
278 outset.insert(*id_iter);
285 const std::vector<GlobalPoint>& trajectory)
const 288 std::vector<DetId>
output;
289 std::set<DetId> ids(inset);
290 for (
unsigned int i=0;
i+1 < trajectory.size(); ++
i ) {
291 std::set<DetId>::const_iterator id_iter = ids.begin();
292 while ( id_iter != ids.end() ) {
294 output.push_back(*id_iter);
295 ids.erase(id_iter++);
304 const std::vector<SteppingHelixStateInfo>& trajectory,
308 std::vector<DetId>
output;
309 std::set<DetId> ids(inset);
310 for (
unsigned int i=0;
i+1 < trajectory.size(); ++
i ) {
311 std::set<DetId>::const_iterator id_iter = ids.begin();
312 while ( id_iter != ids.end() ) {
314 output.push_back(*id_iter);
315 ids.erase(id_iter++);
326 if (! (ieta>=0 && ieta<nEta_ && iphi>=0) )
328 edm::LogWarning(
"TrackAssociator") <<
"ieta or iphi is out of range. Skipped.";
332 std::vector<GlobalPoint> pointBuffer;
335 LogTrace(
"TrackAssociator") <<
"Map content for cell (ieta,iphi): " << ieta <<
", " << iphi%
nPhi_;
336 for(std::set<DetId>::const_iterator itr =
set.
begin(); itr!=
set.end(); itr++)
338 LogTrace(
"TrackAssociator") <<
"\tDetId " << itr->rawId() <<
", geometry (x,y,z,rho,eta,phi):";
340 for(std::vector<GlobalPoint>::const_iterator
point = points.first;
point != points.second;
point++)
348 for(
int i=ieta_min;
i<=ieta_max;
i++)
349 for(
int j=iphi_min;j<=iphi_max;j++)
373 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
374 return (point.
eta()-center.
eta())*(point.
eta()-center.
eta()) + deltaPhi*deltaPhi < distance*distance;
387 unsigned int i =
index(iEta,iPhi);
390 for ( i = i0; i < i0+
size; ++
i )
virtual std::set< DetId > getDetIdsInACone(const std::set< DetId > &, const std::vector< GlobalPoint > &trajectory, const double dR) const
void determinInnerDimensions()
virtual void getValidDetIds(unsigned int subDetectorIndex, std::vector< DetId > &) const =0
virtual bool crossedElement(const GlobalPoint &, const GlobalPoint &, const DetId &, const double toleranceInSigmas=-1, const SteppingHelixStateInfo *=0) const
constexpr bool isNotFinite(T x)
virtual bool selectAllInACone(const double dR) const
helper to see if getDetIdsInACone is useful
double maxZ(bool withTolerance=true) const
Geom::Phi< T > phi() const
virtual bool nearElement(const GlobalPoint &point, const DetId &id, const double distance) const
unsigned int index(unsigned int iEta, unsigned int iPhi) const
virtual int iEta(const GlobalPoint &) const
look-up map eta index
virtual std::vector< DetId > getCrossedDetIds(const std::set< DetId > &, const std::vector< GlobalPoint > &trajectory) const
std::vector< std::pair< unsigned int, unsigned int > > lookupMap_
virtual std::pair< const_iterator, const_iterator > getDetIdPoints(const DetId &, std::vector< GlobalPoint > &) const =0
double minZ(bool withTolerance=true) const
std::vector< DetId > container_
virtual void dumpMapContent(int, int) const
virtual const char * name() const =0
Geom::Theta< T > theta() const
virtual int iPhi(const GlobalPoint &) const
look-up map phi index
void fillSet(std::set< DetId > &set, unsigned int iEta, unsigned int iPhi) const
void addActivePoint(const GlobalPoint &point)
add a point that belongs to the active volume
virtual const unsigned int getNumberOfSubdetectors() const
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
virtual void check_setup() const
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
bin
set the eta bin as selection string.
#define TYPELOOKUP_DATA_REG(_dataclass_)
double minR(bool withTolerance=true) const
static std::string info(const DetId &, const TrackerTopology *tTopo)
DetIdAssociator(const int nPhi, const int nEta, const double etaBinSize)
virtual void buildMap()
make the look-up map
static int position[264][3]
const FiducialVolume & volume() const
get active detector volume
virtual GlobalPoint getPosition(const DetId &) const =0
virtual std::set< DetId > getDetIdsCloseToAPoint(const GlobalPoint &, const int iN=0) const
double maxR(bool withTolerance=true) const
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point