00001 #ifndef RecoTracker_TkTrackingRegions_HITrackingRegionProducer_H
00002 #define RecoTracker_TkTrackingRegions_HITrackingRegionProducer_H
00003
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005
00006 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h"
00007 #include "RecoTracker/TkTrackingRegions/interface/GlobalTrackingRegion.h"
00008 #include "RecoTracker/TkTrackingRegions/interface/RectangularEtaPhiTrackingRegion.h"
00009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00010 #include "FWCore/Framework/interface/Event.h"
00011
00012 #include "DataFormats/Common/interface/DetSetVector.h"
00013 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
00014 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00015
00016 #include "TMath.h"
00017
00018 class HITrackingRegionProducer : public TrackingRegionProducer {
00019
00020 public:
00021
00022 HITrackingRegionProducer(const edm::ParameterSet& cfg) {
00023
00024 edm::ParameterSet regionPSet = cfg.getParameter<edm::ParameterSet>("RegionPSet");
00025
00026 thePtMin = regionPSet.getParameter<double>("ptMin");
00027 theOriginRadius = regionPSet.getParameter<double>("originRadius");
00028 theOriginHalfLength = regionPSet.getParameter<double>("originHalfLength");
00029 double xPos = regionPSet.getParameter<double>("originXPos");
00030 double yPos = regionPSet.getParameter<double>("originYPos");
00031 double zPos = regionPSet.getParameter<double>("originZPos");
00032 double xDir = regionPSet.getParameter<double>("directionXCoord");
00033 double yDir = regionPSet.getParameter<double>("directionYCoord");
00034 double zDir = regionPSet.getParameter<double>("directionZCoord");
00035 thePrecise = regionPSet.getParameter<bool>("precise");
00036 theSiPixelRecHits = regionPSet.getParameter<std::string>("siPixelRecHits");
00037 theOrigin = GlobalPoint(xPos,yPos,zPos);
00038 theDirection = GlobalVector(xDir, yDir, zDir);
00039 }
00040
00041 virtual ~HITrackingRegionProducer(){}
00042
00043 int estimateMultiplicity
00044 (const edm::Event& ev, const edm::EventSetup& es) const
00045 {
00046
00047 edm::Handle<SiPixelRecHitCollection> recHitColl;
00048 ev.getByLabel(theSiPixelRecHits, recHitColl);
00049
00050 SiPixelRecHitCollection::id_iterator recHitIdIterator;
00051 SiPixelRecHitCollection::id_iterator recHitIdIteratorBegin = (recHitColl.product())->id_begin();
00052 SiPixelRecHitCollection::id_iterator recHitIdIteratorEnd = (recHitColl.product())->id_end();
00053
00054 int numRecHits = 0;
00055 for(recHitIdIterator = recHitIdIteratorBegin;
00056 recHitIdIterator != recHitIdIteratorEnd; recHitIdIterator++) {
00057
00058 DetId detId = DetId((*recHitIdIterator).rawId());
00059 unsigned int detType=detId.det();
00060 unsigned int subid=detId.subdetId();
00061 PXBDetId pdetId = PXBDetId(detId);
00062 unsigned int layer=0;
00063 layer=pdetId.layer();
00064 if(detType==1 && subid==1 && layer==1) {
00065 SiPixelRecHitCollection::range pixelrechitRange = (recHitColl.product())->get(*recHitIdIterator);
00066 SiPixelRecHitCollection::const_iterator pixelrechitRangeIteratorBegin = pixelrechitRange.first;
00067 SiPixelRecHitCollection::const_iterator pixelrechitRangeIteratorEnd = pixelrechitRange.second;
00068 SiPixelRecHitCollection::const_iterator pixeliter;
00069 for (pixeliter = pixelrechitRangeIteratorBegin ;
00070 pixeliter != pixelrechitRangeIteratorEnd; ++pixeliter) {
00071 numRecHits++;
00072 }
00073 }
00074 }
00075 return numRecHits;
00076 }
00077
00078 virtual std::vector<TrackingRegion* > regions(const edm::Event& ev, const edm::EventSetup& es) const {
00079
00080 int estMult = estimateMultiplicity(ev, es);
00081
00082
00083 float aa = 1.90935e-04;
00084 float bb = -2.90167e-01;
00085 float cc = 3.86125e+02;
00086
00087 float estTracks = aa*estMult*estMult+bb*estMult+cc;
00088
00089 LogTrace("heavyIonHLTVertexing")<<"[HIVertexing]";
00090 LogTrace("heavyIonHLTVertexing")<<" [HIVertexing: hits in the 1. layer:" << estMult << "]";
00091 LogTrace("heavyIonHLTVertexing")<<" [HIVertexing: estimated number of tracks:" << estTracks << "]";
00092
00093 float regTracking = 400.;
00094 float etaB = 10.;
00095 float phiB = TMath::Pi()/2.;
00096
00097 float decEta = estTracks/600.;
00098 etaB = 2.5/decEta;
00099
00100 if(estTracks>regTracking) {
00101 LogTrace("heavyIonHLTVertexing")<<" [HIVertexing: Regional Tracking]";
00102 LogTrace("heavyIonHLTVertexing")<<" [Regional Tracking: eta range: -" << etaB << ", "<< etaB <<"]";
00103 LogTrace("heavyIonHLTVertexing")<<" [Regional Tracking: phi range: -" << phiB << ", "<< phiB <<"]";
00104 LogTrace("heavyIonHLTVertexing")<<" [Regional Tracking: factor of decrease: " << decEta*2. << "]";
00105 }
00106
00107
00108 std::vector<TrackingRegion* > result;
00109 if(estTracks>regTracking) {
00110 result.push_back(
00111 new RectangularEtaPhiTrackingRegion(theDirection, theOrigin, thePtMin, theOriginRadius, theOriginHalfLength, etaB, phiB, thePrecise) );
00112 }
00113 else {
00114 LogTrace("heavyIonHLTVertexing")<<" [HIVertexing: Global Tracking]";
00115 result.push_back(
00116 new GlobalTrackingRegion(thePtMin, theOrigin, theOriginRadius, theOriginHalfLength, thePrecise) );
00117 }
00118 return
00119 result;
00120 }
00121
00122 private:
00123 std::string theSiPixelRecHits;
00124 double thePtMin;
00125 GlobalPoint theOrigin;
00126 double theOriginRadius;
00127 double theOriginHalfLength;
00128 bool thePrecise;
00129 GlobalVector theDirection;
00130 };
00131
00132 #endif