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
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
00061
00062
00063
00064
00065
00066
00067
00068 map<string,LayerSpec> mapConfig;
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
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
00127
00128
00129
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
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
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
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
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
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
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 }