CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/RecoTracker/TkSeedingLayers/src/SeedingLayerSetsBuilder.cc

Go to the documentation of this file.
00001 #include "RecoTracker/TkSeedingLayers/interface/SeedingLayerSetsBuilder.h"
00002 
00003 #include "FWCore/Framework/interface/EventSetup.h"
00004 #include "FWCore/Framework/interface/ESHandle.h"
00005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00006 
00007 #include "RecoTracker/TkDetLayers/interface/GeometricSearchTracker.h"
00008 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00009 
00010 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00011 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00012 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
00013 
00014 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
00015 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.h"
00016 #include "RecoTracker/TkDetLayers/interface/PixelForwardLayer.h"
00017 #include "RecoTracker/TkDetLayers/interface/TOBLayer.h"
00018 #include "RecoTracker/TkDetLayers/interface/TIBLayer.h"
00019 
00020 #include "HitExtractorPIX.h"
00021 #include "HitExtractorSTRP.h"
00022 
00023 #include <iostream>
00024 #include <sstream>
00025 #include <ostream>
00026 #include <fstream>
00027 #include <map>
00028 
00029 
00030 using namespace ctfseeding;
00031 using namespace std;
00032 
00033 
00034 std::string SeedingLayerSetsBuilder::LayerSpec::print() const
00035 {
00036   std::ostringstream str;
00037   str << "Layer="<<name<<", hitBldr: "<<hitBuilder<<", useErrorsFromParam: ";
00038   if (useErrorsFromParam) {
00039      str <<"true,"<<" errRPhi: "<<hitErrorRPhi<<", errRZ: "<<hitErrorRZ; 
00040   }
00041   else str<<"false";
00042 
00043   str << ", useRingSelector: ";
00044   if (useRingSelector) {
00045     str <<"true,"<<" Rings: ("<<minRing<<","<<maxRing<<")"; 
00046   } else  str<<"false";
00047 
00048   return str.str();
00049 }
00050 
00051 SeedingLayerSetsBuilder::SeedingLayerSetsBuilder(const edm::ParameterSet & cfg)
00052 {
00053   std::vector<std::string> namesPset = cfg.getParameter<std::vector<std::string> >("layerList");
00054   std::vector<std::vector<std::string> > layerNamesInSets = this->layerNamesInSets(namesPset);
00055 
00056   // debug printout of layers
00057   typedef std::vector<std::string>::const_iterator IS;
00058   typedef std::vector<std::vector<std::string> >::const_iterator IT;
00059   std::ostringstream str;
00060   // The following should not be set to cout
00061 //  for (IT it = layerNamesInSets.begin(); it != layerNamesInSets.end(); it++) {
00062 //    str << "SET: ";
00063 //    for (IS is = it->begin(); is != it->end(); is++)  str << *is <<" ";  
00064 //    str << std::endl;
00065 //  }
00066 //  std::cout << str.str() << std::endl;
00067 
00068   map<string,LayerSpec> mapConfig; // for debug printout only!
00069 
00070   for (IT it = layerNamesInSets.begin(); it != layerNamesInSets.end(); it++) {
00071     vector<LayerSpec> layersInSet;
00072     for (IS is = it->begin(); is != it->end(); is++) {
00073       LayerSpec layer;
00074 
00075       layer.name = *is;
00076       //std::cout << "layer name in config: " << *is << std::endl;
00077       edm::ParameterSet cfgLayer = layerConfig(layer.name, cfg);
00078 
00079       layer.usePixelHitProducer = true;
00080       layer.useMatchedRecHits = true; 
00081       layer.useRPhiRecHits = true;
00082       layer.useStereoRecHits = true;
00083       if (cfgLayer.exists("HitProducer")) {
00084           layer.pixelHitProducer = cfgLayer.getParameter<string>("HitProducer"); 
00085       }else{
00086           layer.usePixelHitProducer = false;
00087       }
00088       if (cfgLayer.exists("matchedRecHits")) {
00089           layer.matchedRecHits = cfgLayer.getParameter<edm::InputTag>("matchedRecHits"); 
00090       }else{
00091           layer.useMatchedRecHits = false;
00092       }
00093       if (cfgLayer.exists("rphiRecHits")) {
00094           layer.rphiRecHits = cfgLayer.getParameter<edm::InputTag>("rphiRecHits"); 
00095       }else{
00096           layer.useRPhiRecHits = false;
00097       }
00098       if (cfgLayer.exists("stereoRecHits")) {
00099           layer.stereoRecHits= cfgLayer.getParameter<edm::InputTag>("stereoRecHits"); 
00100       }else{
00101           layer.useStereoRecHits = false;
00102       }
00103 
00104       layer.hitBuilder  = cfgLayer.getParameter<string>("TTRHBuilder");
00105 
00106       layer.useErrorsFromParam = cfgLayer.exists("useErrorsFromParam") ? cfgLayer.getParameter<bool>("useErrorsFromParam") : false; 
00107       if(layer.useErrorsFromParam) {
00108         layer.hitErrorRPhi = cfgLayer.getParameter<double>("hitErrorRPhi");
00109         layer.hitErrorRZ   = cfgLayer.getParameter<double>("hitErrorRZ");
00110       }
00111 
00112       layer.useRingSelector = cfgLayer.exists("useRingSlector") ? cfgLayer.getParameter<bool>("useRingSlector") : false;
00113       if (layer.useRingSelector) {
00114         layer.minRing = cfgLayer.getParameter<int>("minRing");
00115         layer.maxRing = cfgLayer.getParameter<int>("maxRing");
00116       }
00117 
00118       layer.useSimpleRphiHitsCleaner = cfgLayer.exists("useSimpleRphiHitsCleaner") ? cfgLayer.getParameter<bool>("useSimpleRphiHitsCleaner") : true; 
00119 
00120       layersInSet.push_back(layer);
00121       mapConfig[layer.name]=layer;
00122     }
00123     theLayersInSets.push_back(layersInSet);
00124   }
00125 
00126   // debug printout
00127   // The following should not be set to cout
00128 //  for (map<string,LayerSpec>::const_iterator im = mapConfig.begin(); im != mapConfig.end(); im++) {
00129 //    std::cout << (*im).second.print() << std::endl; 
00130 //  }
00131 }
00132 
00133 edm::ParameterSet SeedingLayerSetsBuilder::layerConfig(const std::string & nameLayer,const edm::ParameterSet& cfg) const
00134 {
00135   edm::ParameterSet result;
00136    
00137   for (string::size_type iEnd=nameLayer.size(); iEnd > 0; --iEnd) {
00138     string name = nameLayer.substr(0,iEnd);
00139     if (cfg.exists(name)) return cfg.getParameter<edm::ParameterSet>(name);
00140   } 
00141   cout <<"configuration for layer: "<<nameLayer<<" not found, job will probably crash!"<<endl;
00142   return result;
00143 }
00144 
00145 vector<vector<string> > SeedingLayerSetsBuilder::layerNamesInSets( const vector<string> & namesPSet)
00146 {
00147   std::vector<std::vector<std::string> > result; 
00148   for (std::vector<std::string>::const_iterator is=namesPSet.begin(); is < namesPSet.end(); ++is) {
00149     vector<std::string> layersInSet;
00150     string line = *is;
00151     string::size_type pos=0;
00152     while (pos != string::npos ) {
00153       pos=line.find("+");
00154       string layer = line.substr(0,pos);
00155       layersInSet.push_back(layer);
00156       line=line.substr(pos+1,string::npos); 
00157     }
00158     result.push_back(layersInSet);
00159   }
00160   return result;
00161 }
00162 
00163 SeedingLayerSets SeedingLayerSetsBuilder::layers(const edm::EventSetup& es) const
00164 {
00165   typedef std::vector<SeedingLayer> Set;
00166   SeedingLayerSets  result;
00167 
00168   edm::ESHandle<GeometricSearchTracker> tracker;
00169   es.get<TrackerRecoGeometryRecord>().get( tracker );
00170 
00171   std::vector<BarrelDetLayer*>  bpx  = tracker->barrelLayers();
00172   std::vector<BarrelDetLayer*>  tib  = tracker->tibLayers();
00173   std::vector<BarrelDetLayer*>  tob  = tracker->tobLayers();
00174 
00175   std::vector<ForwardDetLayer*> fpx_pos = tracker->posForwardLayers();
00176   std::vector<ForwardDetLayer*> tid_pos = tracker->posTidLayers();
00177   std::vector<ForwardDetLayer*> tec_pos = tracker->posTecLayers();
00178 
00179   std::vector<ForwardDetLayer*> fpx_neg = tracker->negForwardLayers();
00180   std::vector<ForwardDetLayer*> tid_neg = tracker->negTidLayers();
00181   std::vector<ForwardDetLayer*> tec_neg = tracker->negTecLayers();
00182   
00183   typedef std::vector<std::vector<LayerSpec> >::const_iterator IT;
00184   typedef std::vector<LayerSpec>::const_iterator IS;
00185 
00186   for (IT it = theLayersInSets.begin(); it != theLayersInSets.end(); it++) {
00187     Set set;
00188     bool setOK = true;
00189     for (IS is = it->begin(), isEnd = it->end(); is < isEnd; ++is) {
00190       const LayerSpec & layer = (*is);
00191       std::string name = layer.name;
00192       const DetLayer * detLayer =0;
00193       SeedingLayer::Side side=SeedingLayer::Barrel;
00194       int idLayer = 0;
00195       bool nameOK = true;
00196       HitExtractor * extractor = 0; 
00197       
00198       //
00199       // BPIX
00200       //
00201       if (name.substr(0,4) == "BPix") {
00202         idLayer = atoi(name.substr(4,1).c_str());
00203         side=SeedingLayer::Barrel;
00204         detLayer=bpx[idLayer-1]; 
00205       }
00206       //
00207       // FPIX
00208       //
00209       else if (name.substr(0,4) == "FPix") {
00210         idLayer = atoi(name.substr(4,1).c_str());
00211         if ( name.find("pos") != string::npos ) {
00212           side = SeedingLayer::PosEndcap;
00213           detLayer = fpx_pos[idLayer-1];
00214         } else {
00215           side = SeedingLayer::NegEndcap;
00216           detLayer = fpx_neg[idLayer-1];
00217         }
00218       }
00219       //
00220       // TIB
00221       //
00222       else if (name.substr(0,3) == "TIB") {
00223         idLayer = atoi(name.substr(3,1).c_str());
00224         side=SeedingLayer::Barrel;
00225         detLayer=tib[idLayer-1];
00226       }
00227       //
00228       // TID
00229       //
00230       else if (name.substr(0,3) == "TID") {
00231         idLayer = atoi(name.substr(3,1).c_str());
00232         if ( name.find("pos") != string::npos ) {
00233           side = SeedingLayer::PosEndcap;
00234           detLayer = tid_pos[idLayer-1];
00235         } else {
00236           side = SeedingLayer::NegEndcap;
00237           detLayer = tid_neg[idLayer-1];
00238         }
00239       }
00240       //
00241       // TOB
00242       //
00243       else if (name.substr(0,3) == "TOB") {
00244         idLayer = atoi(name.substr(3,1).c_str());
00245         side=SeedingLayer::Barrel;
00246         detLayer=tob[idLayer-1];
00247       }
00248       //
00249       // TEC
00250       //
00251       else if (name.substr(0,3) == "TEC") {
00252         idLayer = atoi(name.substr(3,1).c_str());
00253         if ( name.find("pos") != string::npos ) {
00254           side = SeedingLayer::PosEndcap;
00255           detLayer = tec_pos[idLayer-1];
00256         } else {
00257           side = SeedingLayer::NegEndcap;
00258           detLayer = tec_neg[idLayer-1];
00259         }
00260       }
00261       else {
00262         nameOK = false;
00263         setOK = false;
00264       }
00265 
00266       if(nameOK) {
00267         if ( detLayer->subDetector() == GeomDetEnumerators::PixelBarrel ||
00268              detLayer->subDetector() == GeomDetEnumerators::PixelEndcap) {
00269           extractor = new HitExtractorPIX(side,idLayer,layer.pixelHitProducer);
00270         } else {
00271           HitExtractorSTRP extSTRP(detLayer,side,idLayer);
00272           if (layer.useMatchedRecHits) extSTRP.useMatchedHits(layer.matchedRecHits);
00273           if (layer.useRPhiRecHits)    extSTRP.useRPhiHits(layer.rphiRecHits);
00274           if (layer.useStereoRecHits)  extSTRP.useStereoHits(layer.stereoRecHits);
00275           if (layer.useRingSelector)   extSTRP.useRingSelector(layer.minRing,layer.maxRing);
00276           extSTRP.useSimpleRphiHitsCleaner(layer.useSimpleRphiHitsCleaner);
00277           extractor = extSTRP.clone();
00278         }
00279 
00280         edm::ESHandle<TransientTrackingRecHitBuilder> builder;
00281         es.get<TransientRecHitRecord>().get(layer.hitBuilder, builder);
00282 
00283         if (layer.useErrorsFromParam) {
00284           set.push_back( SeedingLayer( name, detLayer, builder.product(), 
00285                                        extractor, true, layer.hitErrorRPhi,layer.hitErrorRZ));
00286         } else {
00287           set.push_back( SeedingLayer( name, detLayer, builder.product(), extractor));
00288         }
00289       }
00290     
00291     }
00292     if(setOK) result.push_back(set);
00293   }
00294   return result;
00295 }