Go to the documentation of this file.00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019 #include <memory>
00020 #include "DataFormats/Common/interface/ValueMap.h"
00021
00022 #include "RecoTracker/DeDx/interface/DeDxEstimatorProducerPixelTripplet.h"
00023
00024 #include "DataFormats/TrackReco/interface/DeDxData.h"
00025 #include "DataFormats/TrackReco/interface/TrackDeDxHits.h"
00026 #include "DataFormats/TrackReco/interface/DeDxHit.h"
00027 #include "DataFormats/TrackReco/interface/Track.h"
00028 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00029
00030 #include "RecoTracker/DeDx/interface/GenericAverageDeDxEstimator.h"
00031 #include "RecoTracker/DeDx/interface/TruncatedAverageDeDxEstimator.h"
00032 #include "RecoTracker/DeDx/interface/MedianDeDxEstimator.h"
00033 #include "RecoTracker/DeDx/interface/UnbinnedFitDeDxEstimator.h"
00034
00035 #include "FWCore/Framework/interface/ESHandle.h"
00036 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00037 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00038
00039 #include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
00040 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
00041
00042
00043 using namespace reco;
00044 using namespace std;
00045 using namespace edm;
00046
00047 DeDxEstimatorProducerPixelTripplet::DeDxEstimatorProducerPixelTripplet(const edm::ParameterSet& iConfig)
00048 {
00049
00050 produces<ValueMap<DeDxData> >();
00051
00052
00053 string estimatorName = iConfig.getParameter<string>("estimator");
00054 if(estimatorName == "median") m_estimator = new MedianDeDxEstimator(-2.);
00055 if(estimatorName == "generic") m_estimator = new GenericAverageDeDxEstimator (iConfig.getParameter<double>("exponent"));
00056 if(estimatorName == "truncated") m_estimator = new TruncatedAverageDeDxEstimator(iConfig.getParameter<double>("fraction"));
00057 if(estimatorName == "unbinnedFit") m_estimator = new UnbinnedFitDeDxEstimator();
00058
00059 MaxNrStrips = iConfig.getUntrackedParameter<unsigned>("maxNrStrips" , 255);
00060 MinTrackHits = iConfig.getUntrackedParameter<unsigned>("MinTrackHits" , 4);
00061
00062 m_tracksTag = iConfig.getParameter<edm::InputTag>("tracks");
00063 m_trajTrackAssociationTag = iConfig.getParameter<edm::InputTag>("trajectoryTrackAssociation");
00064
00065 usePixel = iConfig.getParameter<bool>("UsePixel");
00066 useStrip = iConfig.getParameter<bool>("UseStrip");
00067 MeVperADCPixel = iConfig.getParameter<double>("MeVperADCPixel");
00068 MeVperADCStrip = iConfig.getParameter<double>("MeVperADCStrip");
00069
00070 shapetest = iConfig.getParameter<bool>("ShapeTest");
00071 useCalibration = iConfig.getParameter<bool>("UseCalibration");
00072 m_calibrationPath = iConfig.getParameter<string>("calibrationPath");
00073
00074 if(!usePixel && !useStrip)
00075 edm::LogWarning("DeDxHitsProducer") << "Pixel Hits AND Strip Hits will not be used to estimate dEdx --> BUG, Please Update the config file";
00076 }
00077
00078
00079 DeDxEstimatorProducerPixelTripplet::~DeDxEstimatorProducerPixelTripplet()
00080 {
00081 delete m_estimator;
00082 }
00083
00084
00085
00086
00087 void DeDxEstimatorProducerPixelTripplet::beginRun(edm::Run & run, const edm::EventSetup& iSetup)
00088 {
00089 if(MODsColl.size()!=0)return;
00090
00091
00092 edm::ESHandle<TrackerGeometry> tkGeom;
00093 iSetup.get<TrackerDigiGeometryRecord>().get( tkGeom );
00094
00095 vector<GeomDet*> Det = tkGeom->dets();
00096 for(unsigned int i=0;i<Det.size();i++){
00097 DetId Detid = Det[i]->geographicalId();
00098
00099 StripGeomDetUnit* StripDetUnit = dynamic_cast<StripGeomDetUnit*> (Det[i]);
00100 PixelGeomDetUnit* PixelDetUnit = dynamic_cast<PixelGeomDetUnit*> (Det[i]);
00101
00102 stModInfo* MOD = new stModInfo;
00103 double Thick=-1, Dist=-1, Norma=-1;
00104 if(StripDetUnit){
00105 Dist = StripDetUnit->position().mag();
00106 Thick = StripDetUnit->surface().bounds().thickness();
00107 Norma = MeVperADCStrip/Thick;
00108 MOD->Normal = StripDetUnit->surface().normalVector();
00109 }else if(PixelDetUnit){
00110 Dist = PixelDetUnit->position().mag();
00111 Thick = PixelDetUnit->surface().bounds().thickness();
00112 Norma = MeVperADCPixel/Thick;
00113 MOD->Normal = PixelDetUnit->surface().normalVector();
00114 }
00115
00116 MOD->DetId = Detid.rawId();
00117 MOD->Thickness = Thick;
00118 MOD->Distance = Dist;
00119 MOD->Normalization = Norma;
00120 MOD->Gain = 1;
00121 MODsColl[MOD->DetId] = MOD;
00122 }
00123
00124 MakeCalibrationMap();
00125 }
00126
00127
00128 void DeDxEstimatorProducerPixelTripplet::endJob(){
00129 MODsColl.clear();
00130 }
00131
00132
00133
00134
00135 void DeDxEstimatorProducerPixelTripplet::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00136 {
00137 auto_ptr<ValueMap<DeDxData> > trackDeDxEstimateAssociation(new ValueMap<DeDxData> );
00138 ValueMap<DeDxData>::Filler filler(*trackDeDxEstimateAssociation);
00139
00140 Handle<TrackCollection> trackCollHandle;
00141 iEvent.getByLabel(m_trajTrackAssociationTag, trackCollHandle);
00142 const TrackCollection trackColl = *trackCollHandle.product();
00143
00144 size_t n = trackColl.size();
00145 std::vector<DeDxData> dedxEstimate(n);
00146
00147
00148 for(unsigned int j=0;j<trackColl.size();j++){
00149 const reco::TrackRef track = reco::TrackRef( trackCollHandle.product(), j );
00150
00151 DeDxHitCollection dedxHits;
00152 vector<DeDxTools::RawHits> hits;
00153
00154
00155
00156 int NClusterSaturating = 0;
00157 for(unsigned int h=0;h<track->recHitsSize();h++){
00158
00159
00160
00161 TrackingRecHit* recHit= (track->recHit(h))->clone();
00162
00163 if(const SiPixelRecHit* pixelHit=dynamic_cast<const SiPixelRecHit*>(recHit)){
00164 if(!usePixel) continue;
00165
00166 unsigned int detid = pixelHit->geographicalId();
00167 stModInfo* MOD = MODsColl[detid];
00168
00169 double cosine = (track->px()*MOD->Normal.x()+track->py()*MOD->Normal.y()+track->pz()*MOD->Normal.z())/track->p();
00170 float pathLen = MOD->Thickness/std::abs(cosine);
00171 float charge = MOD->Normalization*pixelHit->cluster()->charge()*std::abs(cosine);
00172 dedxHits.push_back( DeDxHit( charge, MOD->Distance, pathLen, detid) );
00173
00174 }
00175 delete recHit;
00176 }
00178
00179
00180 sort(dedxHits.begin(),dedxHits.end(),less<DeDxHit>());
00181 std::pair<float,float> val_and_error = m_estimator->dedx(dedxHits);
00182
00183
00184
00185 val_and_error.second = NClusterSaturating;
00186
00187 dedxEstimate[j] = DeDxData(val_and_error.first, val_and_error.second, dedxHits.size() );
00188 }
00189 filler.insert(trackCollHandle, dedxEstimate.begin(), dedxEstimate.end());
00190
00191
00192 filler.fill();
00193
00194 iEvent.put(trackDeDxEstimateAssociation);
00195 }
00196
00197
00198
00199 void DeDxEstimatorProducerPixelTripplet::MakeCalibrationMap()
00200 {
00201 if(!useCalibration)return;
00202
00203 TChain* t1 = new TChain("SiStripCalib/APVGain");
00204 t1->Add(m_calibrationPath.c_str());
00205
00206 unsigned int tree_DetId;
00207 unsigned char tree_APVId;
00208 double tree_Gain;
00209
00210 t1->SetBranchAddress("DetId" ,&tree_DetId );
00211 t1->SetBranchAddress("APVId" ,&tree_APVId );
00212 t1->SetBranchAddress("Gain" ,&tree_Gain );
00213
00214
00215
00216 for (unsigned int ientry = 0; ientry < t1->GetEntries(); ientry++) {
00217 t1->GetEntry(ientry);
00218 stModInfo* MOD = MODsColl[tree_DetId];
00219 MOD->Gain = tree_Gain;
00220 }
00221
00222 delete t1;
00223
00224 }
00225
00226
00227
00228 DEFINE_FWK_MODULE(DeDxEstimatorProducerPixelTripplet);