CMS 3D CMS Logo

RPixPlaneCombinatoryTracking.cc
Go to the documentation of this file.
3 
4 #include <algorithm>
5 
8 #include "TMath.h"
9 #include <cmath>
10 #include <algorithm>
11 
12 //------------------------------------------------------------------------------------------------//
13 
15  RPixDetTrackFinder(parameterSet){
16 
17  trackMinNumberOfPoints_ = parameterSet.getParameter<uint>("trackMinNumberOfPoints");
18  verbosity_ = parameterSet.getUntrackedParameter<int> ("verbosity");
19  maximumChi2OverNDF_ = parameterSet.getParameter<double>("maximumChi2OverNDF");
20  maximumXLocalDistanceFromTrack_= parameterSet.getParameter<double>("maximumXLocalDistanceFromTrack");
21  maximumYLocalDistanceFromTrack_= parameterSet.getParameter<double>("maximumYLocalDistanceFromTrack");
22  numberOfPlanesPerPot_ = parameterSet.getParameter<int> ("numberOfPlanesPerPot" );
23 
25  throw cms::Exception("RPixPlaneCombinatoryTracking") << "Minimum number of planes required for tracking is 3, "
26  << "tracking is not possible with "
27  << trackMinNumberOfPoints_ << " hits";
28  }
29 
30 
31 }
32 
33 //------------------------------------------------------------------------------------------------//
34 
37 }
38 
39 //------------------------------------------------------------------------------------------------//
40 
42 
43  uint32_t numberOfCombinations = factorial(numberOfPlanesPerPot_)/
46  if(verbosity_>=2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Number of combinations = "<<numberOfCombinations;
47  possiblePlaneCombinations_.reserve(numberOfCombinations);
48 
50 
51  if(verbosity_>=2) {
52  for( const auto & vec : possiblePlaneCombinations_){
53  for( const auto & num : vec){
54  edm::LogInfo("RPixPlaneCombinatoryTracking")<<num<<" - ";
55  }
56  edm::LogInfo("RPixPlaneCombinatoryTracking");
57  }
58  }
59 
60 }
61 
62 //------------------------------------------------------------------------------------------------//
63 
64 //This function produces all the possible plane combinations extracting numberToExtract planes over numberOfPlanes planes
65 void RPixPlaneCombinatoryTracking::getPlaneCombinations(const std::vector<uint32_t> &inputPlaneList, uint32_t numberToExtract, PlaneCombinations &planeCombinations) const
66 {
67  uint32_t numberOfPlanes = inputPlaneList.size();
68  std::string bitmask(numberToExtract, 1); // numberToExtract leading 1's
69  bitmask.resize(numberOfPlanes, 0); // numberOfPlanes-numberToExtract trailing 0's
70  planeCombinations.clear();
71 
72  // store the combination and permute bitmask
73  do {
74  planeCombinations.push_back(std::vector<uint32_t>());
75  for (uint32_t i = 0; i < numberOfPlanes; ++i) { // [0..numberOfPlanes-1] integers
76  if (bitmask[i]) planeCombinations.back().push_back(inputPlaneList.at(i));
77  }
78  } while (std::prev_permutation(bitmask.begin(), bitmask.end()));
79 
80  return;
81 }
82 
83 
84 //------------------------------------------------------------------------------------------------//
85 
86 //This function calls it self in order to get all the possible combinations of hits having a certain selected number of planes
87 //This function avoids to write for loops in cascade which will not allow to define arbitrarily the minimum number of planes to use
88 //The output is stored in a map containing the vector of points and as a key the map of the point forming this vector.
89 //This allows to erase the points already used for the track fit
91  const std::map<CTPPSPixelDetId, PointInPlaneList > &mapOfAllHits,
92  std::map<CTPPSPixelDetId, PointInPlaneList >::iterator mapIterator,
93  HitReferences tmpHitPlaneMap,
94  const PointInPlaneList &tmpHitVector,
95  PointAndReferenceMap &outputMap)
96 {
97  //At this point I selected one hit per plane
98  if (mapIterator == mapOfAllHits.end())
99  {
100  outputMap[tmpHitPlaneMap] = tmpHitVector;
101  return;
102  }
103  for (size_t i=0; i<mapIterator->second.size(); i++){
104  HitReferences newHitPlaneMap = tmpHitPlaneMap;
105  newHitPlaneMap[mapIterator->first] = i;
106  PointInPlaneList newVector = tmpHitVector;
107  newVector.push_back(mapIterator->second[i]);
108  std::map<CTPPSPixelDetId, PointInPlaneList >::iterator tmpMapIterator = mapIterator;
109  getHitCombinations(mapOfAllHits, ++tmpMapIterator, newHitPlaneMap, newVector, outputMap);
110  }
111 }
112 
113 //------------------------------------------------------------------------------------------------//
114 
117 
118  PointAndReferenceMap mapOfAllPoints;
119  CTPPSPixelDetId tmpRpId = romanPotId_; //in order to avoid to modify the data member
120 
121  if(verbosity_>2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Searching for all combinations...";
122  //Loop on all the plane combinations
123  for( const auto & planeCombination : inputPlaneCombination){
124 
125  std::map<CTPPSPixelDetId, PointInPlaneList > selectedCombinationHitOnPlane;
126  bool allPlaneAsHits = true;
127 
128  //Loop on all the possible combinations
129  //In this loop the selectedCombinationHitOnPlane is filled
130  //and cases in which one of the selected plane is empty are skipped
131  for( const auto & plane : planeCombination){
132  tmpRpId.setPlane(plane);
133  CTPPSPixelDetId planeDetId = tmpRpId;
134  if(hitMap_->find(planeDetId) == hitMap_->end()){
135  if(verbosity_>2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"No data on arm "<<planeDetId.arm()<<" station "<<planeDetId.station()
136  <<" rp " <<planeDetId.rp()<<" plane "<<planeDetId.plane();
137  allPlaneAsHits = false;
138  break;
139  }
140  if(selectedCombinationHitOnPlane.find(planeDetId)!=selectedCombinationHitOnPlane.end()){
141  throw cms::Exception("RPixPlaneCombinatoryTracking")
142  <<"selectedCombinationHitOnPlane contains already detId "<<planeDetId
143  <<"Error in the algorithm which created all the possible plane combinations";
144  }
145  selectedCombinationHitOnPlane[planeDetId] = (*hitMap_)[planeDetId];
146  }
147  if(!allPlaneAsHits) continue;
148 
149  //I add the all the hit combinations to the full list of plane combinations
150  auto mapIterator=selectedCombinationHitOnPlane.begin();
151  HitReferences tmpHitPlaneMap; //empty map of plane id and hit number needed the getHitCombinations algorithm
152  PointInPlaneList tmpHitVector; //empty vector of hits needed for the getHitCombinations algorithm
153  getHitCombinations(selectedCombinationHitOnPlane,mapIterator,tmpHitPlaneMap,tmpHitVector,mapOfAllPoints);
154  if(verbosity_>2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Number of possible tracks "<<mapOfAllPoints.size();
155 
156  } //end of loops on all the combinations
157 
158  return mapOfAllPoints;
159 
160 }
161 
162 //------------------------------------------------------------------------------------------------//
163 
165 
166  //The loop search for all the possible tracks starting from the one with the smallest chiSquare/NDF
167  //The loop stops when the number of planes with recorded hits is less than the minimum number of planes required
168  //or if the track with minimum chiSquare found has a chiSquare higher than the maximum required
169 
170  while(hitMap_->size()>=trackMinNumberOfPoints_){
171 
172  if(verbosity_>=1) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Number of plane with hits "<<hitMap_->size();
173  if(verbosity_>=2) for(const auto & plane : *hitMap_) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"\tarm "<<plane.first.arm()
174  <<" station "<<plane.first.station()
175  <<" rp " <<plane.first.rp()
176  <<" plane "<<plane.first.plane()
177  <<" : "<<plane.second.size();
178 
179  //I create the map of all the possible combinations of a group of trackMinNumberOfPoints_ points
180  //and the key keeps the reference of which planes and which hit numbers form the combination
181  PointAndReferenceMap mapOfAllMinRequiredPoint;
182  //I produce the map for all cominations of all hits with all trackMinNumberOfPoints_ plane combinations
183  mapOfAllMinRequiredPoint =produceAllHitCombination(possiblePlaneCombinations_);
184 
185  //Fit all the possible combinations with minimum number of planes required and find the track with minimum chi2
186  double theMinChiSquaredOverNDF = maximumChi2OverNDF_+1.; //in order to break the loop in case no track is found;
187  HitReferences pointMapWithMinChiSquared;
188  PointInPlaneList pointsWithMinChiSquared;
189  CTPPSPixelLocalTrack bestTrack;
190 
191  if(verbosity_>2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Number of combinations of trackMinNumberOfPoints_ planes "
192  <<mapOfAllMinRequiredPoint.size();
193  for(const auto & pointsAndRef : mapOfAllMinRequiredPoint){
194  CTPPSPixelLocalTrack tmpTrack = fitTrack(pointsAndRef.second);
195  double tmpChiSquaredOverNDF = tmpTrack.getChiSquaredOverNDF();
196  if(verbosity_>=2) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"ChiSquare of the present track "<<tmpChiSquaredOverNDF;
197  if(!tmpTrack.isValid() || tmpChiSquaredOverNDF>maximumChi2OverNDF_ || tmpChiSquaredOverNDF==0.) continue; //validity check
198  if(tmpChiSquaredOverNDF<theMinChiSquaredOverNDF){
199  theMinChiSquaredOverNDF = tmpChiSquaredOverNDF;
200  pointMapWithMinChiSquared = pointsAndRef.first;
201  pointsWithMinChiSquared = pointsAndRef.second;
202  bestTrack = tmpTrack;
203  }
204  }
205 
206  //The loop on the fit of all tracks is done, the track with minimum chiSquared is found
207  // and it is verified that it complies with the maximumChi2OverNDF_ requirement
208  if(theMinChiSquaredOverNDF > maximumChi2OverNDF_) break;
209 
210  //The list of planes not included in the minimum chiSquare track is produced.
211  std::vector<uint32_t> listOfExcludedPlanes;
212  for(const auto & plane : listOfAllPlanes_){
213  CTPPSPixelDetId tmpRpId = romanPotId_; //in order to avoid to modify the data member
214  tmpRpId.setPlane(plane);
215  CTPPSPixelDetId planeDetId = tmpRpId;
216  if(pointMapWithMinChiSquared.find(planeDetId)==pointMapWithMinChiSquared.end())
217  listOfExcludedPlanes.push_back(plane);
218  }
219 
220  //I produce all the possible combinations of planes to be added to the track,
221  //excluding the case of no other plane added since it has been already fitted.
222  PlaneCombinations planePointedHitListCombination;
223  for(uint32_t i=1; i<=listOfExcludedPlanes.size(); ++i){
224  PlaneCombinations tmpPlaneCombination;
225  getPlaneCombinations(listOfExcludedPlanes,i,tmpPlaneCombination);
226  for(const auto & combination : tmpPlaneCombination) planePointedHitListCombination.push_back(combination);
227  }
228 
229  //I produce all the possible combinations of points to be added to the track
230  PointAndReferenceMap mapOfAllPointWithAtLeastBestFitSelected;
231  PointAndReferenceMap mapOfPointCombinationToBeAdded;
232  mapOfPointCombinationToBeAdded = produceAllHitCombination(planePointedHitListCombination);
233  //The found hit combination is added to the hits selected by the best fit;
234  for(const auto & element : mapOfPointCombinationToBeAdded){
235  HitReferences newPointMap = pointMapWithMinChiSquared;
236  PointInPlaneList newPoints = pointsWithMinChiSquared;
237  for(const auto & pointRef : element.first ) newPointMap[pointRef.first] = pointRef.second; //add the new point reference
238  for(const auto & point : element.second) newPoints.push_back(point);
239  mapOfAllPointWithAtLeastBestFitSelected[newPointMap]=newPoints;
240  }
241 
242  //I fit all the possible combination of the minimum plane best fit hits plus hits from the other planes
243  if(verbosity_>=1) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Minimum chiSquare over NDF for all the tracks "<<theMinChiSquaredOverNDF;
244 
245  // I look for the tracks with maximum number of points with a chiSquare over NDF smaller than maximumChi2OverNDF_
246  // If more than one track fulfill the chiSquare requirement with the same number of points I choose the one with smaller chiSquare
247  std::vector<PointAndReferencePair > orderedVectorOfAllPointWithAtLeastBestFitSelected =
248  orderCombinationsPerNumberOrPoints(mapOfAllPointWithAtLeastBestFitSelected);
249  int currentNumberOfPlanes = 0;
250  theMinChiSquaredOverNDF = maximumChi2OverNDF_+1.; //in order to break the loop in case no track is found;
251  bool foundTrackWithCurrentNumberOfPlanes = false;
252  for(const auto & pointsAndRef : orderedVectorOfAllPointWithAtLeastBestFitSelected){
253  int tmpNumberOfPlanes = pointsAndRef.second.size();
254  // If a valid track has been already found with an higher number of planes the loop stops.
255  if(foundTrackWithCurrentNumberOfPlanes && tmpNumberOfPlanes<currentNumberOfPlanes) break;
256  CTPPSPixelLocalTrack tmpTrack = fitTrack(pointsAndRef.second);
257  double tmpChiSquaredOverNDF = tmpTrack.getChiSquaredOverNDF();
258  if(!tmpTrack.isValid() || tmpChiSquaredOverNDF>maximumChi2OverNDF_ || tmpChiSquaredOverNDF==0.) continue; //validity check
259  if(tmpChiSquaredOverNDF<theMinChiSquaredOverNDF){
260  theMinChiSquaredOverNDF = tmpChiSquaredOverNDF;
261  pointMapWithMinChiSquared = pointsAndRef.first;
262  bestTrack = tmpTrack;
263  currentNumberOfPlanes = tmpNumberOfPlanes;
264  foundTrackWithCurrentNumberOfPlanes = true;
265  }
266  }
267 
268  if(verbosity_>=1) edm::LogInfo("RPixPlaneCombinatoryTracking")<<"The best track has " << bestTrack.getNDF()/2 + 2 ;
269 
270  std::vector<uint32_t> listOfPlaneNotUsedForFit = listOfAllPlanes_;
271  //remove the hits belonging to the tracks from the full list of hits
272  for(const auto & hitToErase : pointMapWithMinChiSquared){
273  std::map<CTPPSPixelDetId, PointInPlaneList >::iterator hitMapElement = hitMap_->find(hitToErase.first);
274  if(hitMapElement==hitMap_->end()){
275  throw cms::Exception("RPixPlaneCombinatoryTracking")
276  <<"The found tracks has hit belonging to a plane which does not have hits";
277  }
278  std::vector<uint32_t>::iterator planeIt;
279  planeIt = std::find (listOfPlaneNotUsedForFit.begin(), listOfPlaneNotUsedForFit.end(), hitToErase.first.plane());
280  listOfPlaneNotUsedForFit.erase(planeIt);
281  hitMapElement->second.erase(hitMapElement->second.begin()+hitToErase.second);
282  //if the plane at which the hit was erased is empty it is removed from the hit map
283  if(hitMapElement->second.empty()) hitMap_->erase(hitMapElement);
284  }
285 
286  //search for hit on the other planes which may belong to the same track
287  //even if they did not contributed to the track
288  // in case of multiple hit, the closest one to the track will be considered
289  //If an hit is found these will not be erased from the list of all hits
290  //If not hit is found, the point on the plane intersecting the track will be saved by a CTPPSPixelFittedRecHit
291  //with the isRealHit_ flag set to false
292  for(const auto & plane : listOfPlaneNotUsedForFit){
293  CTPPSPixelDetId tmpPlaneId = romanPotId_; //in order to avoid to modify the data member
294  tmpPlaneId.setPlane(plane);
295  std::unique_ptr<CTPPSPixelFittedRecHit>
296  fittedRecHit(new CTPPSPixelFittedRecHit());
297  GlobalPoint pointOnDet;
298  calculatePointOnDetector(&bestTrack, tmpPlaneId, pointOnDet);
299 
300 
301  if(hitMap_->find(tmpPlaneId) != hitMap_->end()){
302  //I convert the hit search window defined in local coordinated into global
303  //This avoids to convert the global plane-line intersection in order not to call the the geometry
305 
306  DDRotationMatrix theRotationMatrix = geometry_->getSensor(tmpPlaneId)->rotation();
307  AlgebraicMatrix33 tmpPlaneRotationMatrixMap;
308  theRotationMatrix.GetComponents(tmpPlaneRotationMatrixMap(0, 0), tmpPlaneRotationMatrixMap(0, 1), tmpPlaneRotationMatrixMap(0, 2),
309  tmpPlaneRotationMatrixMap(1, 0), tmpPlaneRotationMatrixMap(1, 1), tmpPlaneRotationMatrixMap(1, 2),
310  tmpPlaneRotationMatrixMap(2, 0), tmpPlaneRotationMatrixMap(2, 1), tmpPlaneRotationMatrixMap(2, 2));
311 
312  maxGlobalPointDistance = tmpPlaneRotationMatrixMap * maxGlobalPointDistance;
313  //I avoid the Sqrt since it will not be saved
314  double maximumXdistance = maxGlobalPointDistance[0]*maxGlobalPointDistance[0];
315  double maximumYdistance = maxGlobalPointDistance[1]*maxGlobalPointDistance[1];
316  double minimumDistance = 1. + maximumXdistance + maximumYdistance; // to be sure that the first min distance is from a real point
317  for(const auto & hit : (*hitMap_)[tmpPlaneId]){
318  double xResidual = hit.globalPoint.x() - pointOnDet.x();
319  double yResidual = hit.globalPoint.y() - pointOnDet.y();
320  double xDistance = xResidual*xResidual;
321  double yDistance = yResidual*yResidual;
322  double distance = xDistance + yDistance;
323  if(xDistance < maximumXdistance && yDistance < maximumYdistance && distance < minimumDistance){
324  LocalPoint residuals(xResidual,yResidual,0.);
325  math::Error<3>::type globalError = hit.globalError;
326  LocalPoint pulls(xResidual/std::sqrt(globalError[0][0]),yResidual/std::sqrt(globalError[1][1]),0.);
327  fittedRecHit.reset(new CTPPSPixelFittedRecHit(hit.recHit, pointOnDet, residuals, pulls));
328  fittedRecHit->setIsRealHit(true);
329  }
330  }
331  }
332  else{
333  LocalPoint fakePoint;
334  LocalError fakeError;
335  CTPPSPixelRecHit fakeRecHit(fakePoint,fakeError);
336  fittedRecHit.reset(new CTPPSPixelFittedRecHit(fakeRecHit, pointOnDet, fakePoint, fakePoint));
337  }
338 
339  bestTrack.addHit(tmpPlaneId, *fittedRecHit);
340 
341  }
342 
343  localTrackVector_.push_back(bestTrack);
344 
345  int pointForTracking = 0;
346  int pointOnTrack = 0;
347 
348  if(verbosity_>=1){
349  for(const auto & planeHits : bestTrack.getHits()){
350  for(const auto & fittedhit : planeHits){
351  if(fittedhit.getIsUsedForFit()) ++pointForTracking;
352  if(fittedhit.getIsRealHit()) ++pointOnTrack;
353  }
354  }
355  edm::LogInfo("RPixPlaneCombinatoryTracking")<<"Best track has "<<pointForTracking<<" points used for the fit and "
356  << pointOnTrack<<" points belonging to the track\n";
357  }
358 
359  } //close of the while loop on all the hits
360 
361  return;
362 
363 }
364 
365 //------------------------------------------------------------------------------------------------//
366 
368 
369  uint32_t const numberOfPlanes = 6;
373 
374  //The matrices and vector xyCoordinates, varianceMatrix and varianceMatrix are built from the points
375  for(uint32_t iHit = 0; iHit < numberOfPlanes; iHit++) {
376  if (iHit < pointList.size()) {
377  CLHEP::Hep3Vector globalPoint = pointList[iHit].globalPoint;
378  xyCoordinates[2*iHit] = globalPoint.x() ;
379  xyCoordinates[2*iHit + 1] = globalPoint.y() ;
380  zMatrix (2*iHit, 0) = 1. ;
381  zMatrix (2*iHit, 2) = globalPoint.z()-z0_;
382  zMatrix (2*iHit + 1, 1) = 1. ;
383  zMatrix (2*iHit+ 1 , 3) = globalPoint.z()-z0_;
384 
385  AlgebraicMatrix33 globalError = pointList[iHit].globalError;
386  varianceMatrix(2*iHit, 2*iHit) = globalError(0, 0);
387  varianceMatrix(2*iHit, 2*iHit + 1) = globalError(0, 1);
388  varianceMatrix(2*iHit + 1, 2*iHit) = globalError(1, 0);
389  varianceMatrix(2*iHit + 1, 2*iHit + 1) = globalError(1, 1);
390  } else {
391  varianceMatrix(2*iHit, 2*iHit) = 1.;
392  varianceMatrix(2*iHit + 1, 2*iHit + 1) = 1.;
393  }
394  }
395 
396  //Get real point variance matrix
397  if (!varianceMatrix.Invert()) {
398  edm::LogError("RPixPlaneCombinatoryTracking") << "Error in RPixPlaneCombinatoryTracking::fitTrack -> "
399  << "Point variance matrix is singular, skipping.";
400  CTPPSPixelLocalTrack badTrack;
401  badTrack.setValid(false);
402  return badTrack;
403  }
404 
405  math::Error<4>::type covarianceMatrix = ROOT::Math::SimilarityT(zMatrix, varianceMatrix);
406 
407  //To have the real parameter covariance matrix, covarianceMatrix needs to be inverted
408  if (!covarianceMatrix.Invert()) {
409  edm::LogError("RPixPlaneCombinatoryTracking") << "Error in RPixPlaneCombinatoryTracking::fitTrack -> "
410  << "Parameter covariance matrix is singular, skipping.";
411  CTPPSPixelLocalTrack badTrack;
412  badTrack.setValid(false);
413  return badTrack;
414  }
415 
416  // track parameters: (x0, y0, tx, ty); x = x0 + tx*(z-z0)
417  math::Vector<4>::type zMatrixTransposeTimesVarianceMatrixTimesXyCoordinates =
418  ROOT::Math::Transpose(zMatrix) * varianceMatrix * xyCoordinates;
419  math::Vector<4>::type parameterVector =
420  covarianceMatrix * zMatrixTransposeTimesVarianceMatrixTimesXyCoordinates;
421  math::Vector<2*numberOfPlanes>::type xyCoordinatesMinusZmatrixTimesParameters =
422  xyCoordinates - (zMatrix * parameterVector);
423 
424  double chiSquare =
425  ROOT::Math::Dot(xyCoordinatesMinusZmatrixTimesParameters, (varianceMatrix * xyCoordinatesMinusZmatrixTimesParameters));
426 
427  CTPPSPixelLocalTrack goodTrack(z0_, parameterVector, covarianceMatrix, chiSquare);
428  goodTrack.setValid(true);
429 
430  for(const auto & hit : pointList){
431  CLHEP::Hep3Vector globalPoint = hit.globalPoint;
432  GlobalPoint pointOnDet;
433  bool foundPoint = calculatePointOnDetector(&goodTrack, hit.detId, pointOnDet);
434  if(!foundPoint){
435  CTPPSPixelLocalTrack badTrack;
436  badTrack.setValid(false);
437  return badTrack;
438  }
439  double xResidual = globalPoint.x() - pointOnDet.x();
440  double yResidual = globalPoint.y() - pointOnDet.y();
441  LocalPoint residuals(xResidual,yResidual);
442 
443  math::Error<3>::type globalError(hit.globalError);
444  LocalPoint pulls(xResidual/std::sqrt(globalError(0, 0)),yResidual/std::sqrt(globalError(0, 0)));
445 
446  CTPPSPixelFittedRecHit fittedRecHit(hit.recHit, pointOnDet, residuals, pulls);
447  fittedRecHit.setIsUsedForFit(true);
448  goodTrack.addHit(hit.detId, fittedRecHit);
449  }
450 
451  return goodTrack;
452 
453 }
454 
455 //------------------------------------------------------------------------------------------------//
456 
457 //The method calculates the hit pointed by the track on the detector plane
459  GlobalPoint &planeLineIntercept){
460  double z0 = track->getZ0();
462 
463  math::Vector<3>::type pointOnLine(parameters[0], parameters[1], z0);
464  GlobalVector tmpLineUnitVector = track->getDirectionVector();
465  math::Vector<3>::type lineUnitVector(tmpLineUnitVector.x(),tmpLineUnitVector.y(),tmpLineUnitVector.z());
466 
467  CLHEP::Hep3Vector tmpPointLocal(0.,0.,0.);
468  CLHEP::Hep3Vector tmpPointOnPlane = geometry_->localToGlobal(planeId,tmpPointLocal);
469 
470  math::Vector<3>::type pointOnPlane(tmpPointOnPlane.x(), tmpPointOnPlane.y(), tmpPointOnPlane.z());
471  math::Vector<3>::type planeUnitVector(0.,0.,1.);
472 
473  DDRotationMatrix theRotationMatrix = geometry_->getSensor(planeId)->rotation();
474  AlgebraicMatrix33 tmpPlaneRotationMatrixMap;
475  theRotationMatrix.GetComponents(tmpPlaneRotationMatrixMap(0, 0), tmpPlaneRotationMatrixMap(0, 1), tmpPlaneRotationMatrixMap(0, 2),
476  tmpPlaneRotationMatrixMap(1, 0), tmpPlaneRotationMatrixMap(1, 1), tmpPlaneRotationMatrixMap(1, 2),
477  tmpPlaneRotationMatrixMap(2, 0), tmpPlaneRotationMatrixMap(2, 1), tmpPlaneRotationMatrixMap(2, 2));
478 
479  planeUnitVector = tmpPlaneRotationMatrixMap * planeUnitVector;
480 
481  double denominator = ROOT::Math::Dot(lineUnitVector, planeUnitVector);
482  if(denominator==0){
483  edm::LogError("RPixPlaneCombinatoryTracking")
484  << "Error in RPixPlaneCombinatoryTracking::calculatePointOnDetector -> "
485  << "Fitted line and plane are parallel. Removing this track";
486  return false;
487  }
488 
489  double distanceFromLinePoint = ROOT::Math::Dot((pointOnPlane - pointOnLine), planeUnitVector) / denominator;
490 
491  math::Vector<3>::type tmpPlaneLineIntercept = distanceFromLinePoint*lineUnitVector + pointOnLine;
492  planeLineIntercept = GlobalPoint(tmpPlaneLineIntercept[0], tmpPlaneLineIntercept[1], tmpPlaneLineIntercept[2]);
493 
494  return true;
495 
496 }
497 //------------------------------------------------------------------------------------------------//
498 
499 // The method sorts the possible point combinations in order to process before fits on the highest possible number of points
500 std::vector<RPixPlaneCombinatoryTracking::PointAndReferencePair >
502  PointAndReferenceMap inputMap){
503 
504  std::vector<PointAndReferencePair > sortedVector(inputMap.begin(),inputMap.end());
505  std::sort(sortedVector.begin(),sortedVector.end(),functionForPlaneOrdering);
506 
507  return sortedVector;
508 
509 }
510 
511 
512 
uint32_t station() const
Definition: CTPPSDetId.h:63
T getParameter(std::string const &) const
std::map< HitReferences, PointInPlaneList > PointAndReferenceMap
T getUntrackedParameter(std::string const &, T const &) const
uint32_t plane() const
DDRotationMatrix rotation() const
geometry information
Definition: DetGeomDesc.h:83
ROOT::Math::SMatrix< double, N, M > type
Definition: Matrix.h:10
RPixPlaneCombinatoryTracking(edm::ParameterSet const &parameterSet)
std::map< CTPPSPixelDetId, size_t > HitReferences
bool calculatePointOnDetector(CTPPSPixelLocalTrack *track, CTPPSPixelDetId planeId, GlobalPoint &planeLineIntercept)
std::vector< PointAndReferencePair > orderCombinationsPerNumberOrPoints(PointAndReferenceMap inputMap)
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
uint32_t factorial(uint32_t x) const
ErrorD< N >::type type
Definition: Error.h:33
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
std::vector< CTPPSPixelLocalTrack > localTrackVector_
void getHitCombinations(const std::map< CTPPSPixelDetId, PointInPlaneList > &mapOfAllHits, std::map< CTPPSPixelDetId, PointInPlaneList >::iterator mapIterator, HitReferences tmpHitPlaneMap, const PointInPlaneList &tmpHitVector, PointAndReferenceMap &outputMap)
const DetGeomDesc * getSensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
CTPPSPixelLocalTrack fitTrack(PointInPlaneList pointList)
fixed size vector
Definition: Vector.h:25
bool goodTrack(const reco::Track *pTrack, math::XYZPoint leadPV, trackSelectionParameters parameters, bool debug=false)
T sqrt(T t)
Definition: SSEVec.h:18
std::vector< RPixDetPatternFinder::PointInPlane > PointInPlaneList
float getChiSquaredOverNDF() const
T z() const
Definition: PV3DBase.h:64
std::map< CTPPSPixelDetId, std::vector< RPixDetPatternFinder::PointInPlane > > * hitMap_
void setIsUsedForFit(bool usedForFit)
uint32_t arm() const
Definition: CTPPSDetId.h:52
CLHEP::Hep3Vector localToGlobal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
void addHit(unsigned int detId, const CTPPSPixelFittedRecHit &hit)
std::vector< uint32_t > listOfAllPlanes_
void setPlane(uint32_t pl)
const edm::DetSetVector< CTPPSPixelFittedRecHit > & getHits() const
def uint(string)
const CTPPSGeometry * geometry_
math::Vector< dimension >::type ParameterVector
covariance matrix size
PointAndReferenceMap produceAllHitCombination(PlaneCombinations inputPlaneCombination)
GlobalVector getDirectionVector() const
const ParameterVector & getParameterVector() const
CTPPSPixelDetId romanPotId_
static bool functionForPlaneOrdering(PointAndReferencePair a, PointAndReferencePair b)
T x() const
Definition: PV3DBase.h:62
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
std::vector< std::vector< uint32_t > > PlaneCombinations
ParameterSet const & parameterSet(Provenance const &provenance)
Definition: Provenance.cc:11
*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
Definition: invegas.h:5
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepStd< double, 3, 3 > > AlgebraicMatrix33
void getPlaneCombinations(const std::vector< uint32_t > &inputPlaneList, uint32_t numberToExtract, PlaneCombinations &planeCombinations) const
uint32_t rp() const
Definition: CTPPSDetId.h:74