CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoTracker/DeDx/src/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/interface/DeDxEstimatorProducerPixelTripplet.h"
00023 //#include "RecoTracker/DeDx/interface/DeDxTools.h"
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 // ------------ method called once each job just before starting event loop  ------------
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 // ------------ method called once each job just after ending the event loop  ------------
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   //assume trajectory collection size is equal to track collection size and that order is kept
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 //     DeDxTools::trajectoryRawHits(traj, hits, usePixel, useStrip);
00154 
00155 
00156      int NClusterSaturating = 0;
00157      for(unsigned int h=0;h<track->recHitsSize();h++){
00158          //SiStripDetId detid = SiStripDetId((track->recHit(h))->geographicalId());
00159          //TrackingRecHit* recHit = (track->recHit(h))->clone();
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      //WARNING: Since the dEdX Error is not properly computed for the moment
00184      //It was decided to store the number of saturating cluster in that dataformat
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   // really fill the association map
00192   filler.fill();
00193    // put into the event 
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 //define this as a plug-in
00228 DEFINE_FWK_MODULE(DeDxEstimatorProducerPixelTripplet);