test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GoldenPattern.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <cmath>
4 
6 
10 
14  unsigned int iLayer,
15  const int phiRefHit,
16  const OMTFinput::vector1D & layerHits){
17 
19 
20  int phiMean = meanDistPhi[iLayer][iRefLayer];
21  int phiDist = exp2(myOmtfConfig->nPdfAddrBits());
24  for(auto itHit: layerHits){
25  if(itHit>=(int)myOmtfConfig->nPhiBins()) continue;
26  if(abs(itHit-phiMean-phiRefHit)<abs(phiDist)) phiDist = itHit-phiMean-phiRefHit;
27  }
28 
30  phiDist+=exp2(myOmtfConfig->nPdfAddrBits()-1);
34  if(phiDist<0 ||
35  phiDist>exp2(myOmtfConfig->nPdfAddrBits())-1){
36  return aResult;
37  }
38 
39  int pdfVal = pdfAllRef[iLayer][iRefLayer][phiDist];
40  return GoldenPattern::layerResult(pdfVal,pdfVal>0);
41 }
44 int GoldenPattern::propagateRefPhi(int phiRef, int etaRef, unsigned int iRefLayer){
45 
46  unsigned int iLayer = 2; //MB2
47  //if(etaRef>101) iLayer = 7;//RE2
48  return phiRef + meanDistPhi[iLayer][iRefLayer];
49 
50 }
53 void GoldenPattern::addCount(unsigned int iRefLayer,
54  unsigned int iLayer,
55  const int phiRefHit,
56  const OMTFinput::vector1D & layerHits){
57 
58  int nHitsInLayer = 0;
59  int phiDist = exp2(myOmtfConfig->nPdfAddrBits());
60  for(auto itHit: layerHits){
61  if(itHit>=(int)myOmtfConfig->nPhiBins()) continue;
62  if(abs(itHit-phiRefHit)<phiDist) phiDist = itHit-phiRefHit;
63  ++nHitsInLayer;
64  }
66  if(nHitsInLayer>1 || nHitsInLayer==0) return;
67 
69  if(phiDist>=(int)myOmtfConfig->nPhiBins()/2) phiDist-=(int)myOmtfConfig->nPhiBins();
70  if(phiDist<=-(int)myOmtfConfig->nPhiBins()/2) phiDist+=(int)myOmtfConfig->nPhiBins();
71 
73  int phiDistShift=phiDist+exp2(myOmtfConfig->nPdfAddrBits()-1);
74 
78  if(phiDistShift<0 ||
79  phiDistShift>exp2(myOmtfConfig->nPdfAddrBits())-1){
80  return;
81  }
82 
83  if((int)iLayer==myOmtfConfig->getRefToLogicNumber()[iRefLayer]) ++meanDistPhiCounts[iLayer][iRefLayer];
84  ++pdfAllRef[iLayer][iRefLayer][phiDistShift];
85 }
88 std::ostream & operator << (std::ostream &out, const GoldenPattern & aPattern){
89 
90  out <<"GoldenPattern "<< aPattern.theKey <<std::endl;
91  out <<"Number of reference layers: "<<aPattern.meanDistPhi[0].size()
92  <<", number of measurement layers: "<<aPattern.pdfAllRef.size()
93  <<std::endl;
94 
95  if(!aPattern.meanDistPhi.size()) return out;
96  if(!aPattern.pdfAllRef.size()) return out;
97 
98  out<<"Mean dist phi per layer:"<<std::endl;
99  for (unsigned int iRefLayer=0;iRefLayer<aPattern.meanDistPhi[0].size();++iRefLayer){
100  out<<"Ref layer: "<<iRefLayer<<" (";
101  for (unsigned int iLayer=0;iLayer<aPattern.meanDistPhi.size();++iLayer){
102  out<<std::setw(3)<<aPattern.meanDistPhi[iLayer][iRefLayer]<<"\t";
103  }
104  out<<")"<<std::endl;
105  }
106 
107  if(aPattern.meanDistPhiCounts.size()){
108  out<<"Counts number per layer:"<<std::endl;
109  for (unsigned int iRefLayer=0;iRefLayer<aPattern.meanDistPhi[0].size();++iRefLayer){
110  out<<"Ref layer: "<<iRefLayer<<" (";
111  for (unsigned int iLayer=0;iLayer<aPattern.meanDistPhi.size();++iLayer){
112  out<<aPattern.meanDistPhiCounts[iLayer][iRefLayer]<<"\t";
113  }
114  out<<")"<<std::endl;
115  }
116  }
117 /*
118  out<<"PDF per layer:"<<std::endl;
119  for (unsigned int iRefLayer=0;iRefLayer<aPattern.pdfAllRef[0].size();++iRefLayer){
120  out<<"Ref layer: "<<iRefLayer;
121  for (unsigned int iLayer=0;iLayer<aPattern.pdfAllRef.size();++iLayer){
122  out<<", measurement layer: "<<iLayer<<std::endl;
123  for (unsigned int iPdf=0;iPdf<exp2(myOmtfConfig->nPdfAddrBits());++iPdf){
124  out<<std::setw(2)<<aPattern.pdfAllRef[iLayer][iRefLayer][iPdf]<<" ";
125  }
126  out<<std::endl;
127  }
128  }
129 */
130  return out;
131 }
135 
137  GoldenPattern::vector2D meanDistPhi2D(myOmtfConfig->nLayers());
138  meanDistPhi2D.assign(myOmtfConfig->nLayers(), meanDistPhi1D);
139  meanDistPhi = meanDistPhi2D;
140  meanDistPhiCounts = meanDistPhi2D;
141 
145 
146  pdf2D.assign(myOmtfConfig->nRefLayers(),pdf1D);
147  pdfAllRef.assign(myOmtfConfig->nLayers(),pdf2D);
148 }
152 
153  for (unsigned int iRefLayer=0;iRefLayer<pdfAllRef[0].size();++iRefLayer){
154  for (unsigned int iLayer=0;iLayer<pdfAllRef.size();++iLayer){
155  for (unsigned int iPdf=0;iPdf<pdfAllRef[iLayer][iRefLayer].size();++iPdf){
156  float pVal = log((float)pdfAllRef[iLayer][iRefLayer][iPdf]/meanDistPhiCounts[myOmtfConfig->getRefToLogicNumber()[iRefLayer]][iRefLayer]);
157  if(pVal<log(myOmtfConfig->minPdfVal())) continue;
158  meanDistPhi[iLayer][iRefLayer]+=(iPdf - exp2(myOmtfConfig->nPdfAddrBits()-1))*pdfAllRef[iLayer][iRefLayer][iPdf];
159  if((int)iLayer!=myOmtfConfig->getRefToLogicNumber()[iRefLayer]) meanDistPhiCounts[iLayer][iRefLayer]+=pdfAllRef[iLayer][iRefLayer][iPdf];
160  }
161  }
162  }
163 
165  for (unsigned int iRefLayer=0;iRefLayer<meanDistPhi[0].size();++iRefLayer){
166  for (unsigned int iLayer=0;iLayer<meanDistPhi.size();++iLayer){
167  if(meanDistPhiCounts.size() && meanDistPhiCounts[iLayer][iRefLayer]){
168  if(meanDistPhiCounts[iLayer][iRefLayer]<1000) meanDistPhi[iLayer][iRefLayer] = 0;
169  else meanDistPhi[iLayer][iRefLayer] = rint((float)meanDistPhi[iLayer][iRefLayer]/meanDistPhiCounts[iLayer][iRefLayer]);
170  }
171  }
172  }
173  const float minPlog = log(myOmtfConfig->minPdfVal());
174  const unsigned int nPdfValBits = myOmtfConfig->nPdfValBits();
176  float pVal;
177  int digitisedVal, truncatedValue;
178  for (unsigned int iRefLayer=0;iRefLayer<pdfAllRef[0].size();++iRefLayer){
179  for (unsigned int iLayer=0;iLayer<pdfAllRef.size();++iLayer){
180  for (unsigned int iPdf=0;iPdf<pdfAllRef[iLayer][iRefLayer].size();++iPdf){
181  if(!meanDistPhiCounts[myOmtfConfig->getRefToLogicNumber()[iRefLayer]][iRefLayer] ||
182  !pdfAllRef[iLayer][iRefLayer][iPdf]) continue;
183  pVal = log((float)pdfAllRef[iLayer][iRefLayer][iPdf]/meanDistPhiCounts[myOmtfConfig->getRefToLogicNumber()[iRefLayer]][iRefLayer]);
185  if(pVal<minPlog || meanDistPhiCounts[iLayer][iRefLayer]<1000){
186  pdfAllRef[iLayer][iRefLayer][iPdf] = 0;
187  continue;
188  }
192  digitisedVal = rint((std::pow(2,nPdfValBits)-1) - (pVal/minPlog)*(std::pow(2,nPdfValBits)-1));
194  truncatedValue = 0 | (digitisedVal & ((int)pow(2,nPdfValBits)-1));
195  pdfAllRef[iLayer][iRefLayer][iPdf] = truncatedValue;
196  }
197  }
198  }
199 
200 
201  vector3D pdfAllRefTmp = pdfAllRef;
202 
203  const unsigned int nPdfAddrBits = 7;
204  for (unsigned int iRefLayer=0;iRefLayer<pdfAllRef[0].size();++iRefLayer){
205  for (unsigned int iLayer=0;iLayer<pdfAllRef.size();++iLayer){
206  for (unsigned int iPdf=0;iPdf<pdfAllRef[iLayer][iRefLayer].size();++iPdf){
207  pdfAllRef[iLayer][iRefLayer][iPdf] = 0;
209  int index = iPdf - exp2(myOmtfConfig->nPdfAddrBits()-1) - meanDistPhi[iLayer][iRefLayer] + exp2(nPdfAddrBits-1);
210  if(index<0 || index>exp2(nPdfAddrBits)-1) continue;
211  pdfAllRef[iLayer][iRefLayer][index] = pdfAllRefTmp[iLayer][iRefLayer][iPdf];
212  }
213  }
214  }
215 }
219 
220  for (unsigned int iRefLayer=0;iRefLayer<meanDistPhi[0].size();++iRefLayer){
221  for (unsigned int iLayer=0;iLayer<meanDistPhi.size();++iLayer){
222  if(meanDistPhiCounts.size() && meanDistPhiCounts[iLayer][iRefLayer]) return true;
223  }
224  }
225  return false;
226 }
unsigned int nRefLayers() const
vector2D meanDistPhiCounts
std::vector< int > vector1D
Definition: GoldenPattern.h:50
unsigned int nLayers() const
unsigned int nPhiBins() const
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:188
std::vector< int > vector1D
Definition: OMTFinput.h:15
const OMTFConfiguration * myOmtfConfig
vector2D meanDistPhi
bool hasCounts()
Check if the GP has any counts in any of referecne layers;.
GoldenPattern::layerResult process1Layer1RefLayer(unsigned int iRefLayer, unsigned int iLayer, const int refPhi, const OMTFinput::vector1D &layerHits)
std::vector< vector1D > vector2D
Definition: GoldenPattern.h:51
std::vector< vector2D > vector3D
Definition: GoldenPattern.h:52
Key theKey
Pattern kinematical identification (iEta,iPt,iCharge)
unsigned int nPdfAddrBits() const
vector3D pdfAllRef
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< int, bool > layerResult
Definition: GoldenPattern.h:53
float minPdfVal() const
void reset()
Reset contents of all data vectors, keeping the vectors size.
int propagateRefPhi(int phiRef, int etaRef, unsigned int iRefLayer)
const std::vector< int > & getRefToLogicNumber() const
void addCount(unsigned int iRefLayer, unsigned int iLayer, const int refPhi, const OMTFinput::vector1D &layerHits)
Add a single count to the relevant pdf bin in three dimensions.
unsigned int nPdfValBits() const
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40