CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoTracker/DeDx/plugins/DeDxEstimatorProducerPixelTripplet.cc

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