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