00001
00008
00009
00010 #include "FastSimDataFormats/External/interface/FastTrackerCluster.h"
00011
00012
00013 #include "FastSimulation/TrackingRecHitProducer/interface/SiTrackerGaussianSmearingRecHitConverter.h"
00014
00015
00016 #include "FastSimulation/TrackingRecHitProducer/interface/SiPixelGaussianSmearingRecHitConverterAlgorithm.h"
00017
00018
00019 #include "FastSimulation/TrackingRecHitProducer/interface/SiStripGaussianSmearingRecHitConverterAlgorithm.h"
00020
00021
00022 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00023 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00024 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00025 #include "Geometry/TrackerGeometryBuilder/interface/GluedGeomDet.h"
00026 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00027 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00028 #include "MagneticField/Engine/interface/MagneticField.h"
00029
00030
00031 #include "DataFormats/Common/interface/Handle.h"
00032 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
00033
00034
00035 #include "FWCore/Framework/interface/ESHandle.h"
00036 #include "FWCore/Framework/interface/Event.h"
00037 #include "FWCore/Framework/interface/EventSetup.h"
00038 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00039 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00040 #include "FWCore/ServiceRegistry/interface/Service.h"
00041 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00042 #include "FWCore/Utilities/interface/Exception.h"
00043
00044
00045 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00046 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00047 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00048 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00049 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00050 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00051 #include "DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h"
00052 #include "DataFormats/TrackingRecHit/interface/AlignmentPositionError.h"
00053
00054
00055 #include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h"
00056
00057
00058 #include "FastSimulation/Utilities/interface/RandomEngine.h"
00059
00060
00061
00062
00063 #include "FastSimulation/TrackingRecHitProducer/interface/GSRecHitMatcher.h"
00064
00065
00066 #include <memory>
00067
00068
00069 #include <TFile.h>
00070 #include <TH1F.h>
00071
00072
00073
00074
00075 SiTrackerGaussianSmearingRecHitConverter::SiTrackerGaussianSmearingRecHitConverter(
00076 edm::ParameterSet const& conf)
00077 : pset_(conf)
00078 {
00079 thePixelDataFile = 0;
00080 thePixelBarrelResolutionFile = 0;
00081 thePixelForwardResolutionFile = 0;
00082 thePixelBarrelParametrization = 0;
00083 thePixelEndcapParametrization = 0;
00084 theSiStripErrorParametrization = 0;
00085 numberOfDisabledModules = 0;
00086
00087 random = 0;
00088
00089
00090 #ifdef FAMOS_DEBUG
00091 std::cout << "SiTrackerGaussianSmearingRecHitConverter instantiated" << std::endl;
00092 #endif
00093
00094
00095 edm::Service<edm::RandomNumberGenerator> rng;
00096 if ( ! rng.isAvailable() ) {
00097 throw cms::Exception("Configuration")
00098 << "SiTrackerGaussianSmearingRecHitConverter requires the RandomGeneratorService\n"
00099 "which is not present in the configuration file.\n"
00100 "You must add the service in the configuration file\n"
00101 "or remove the module that requires it";
00102 }
00103
00104 random = new RandomEngine(&(*rng));
00105
00106 produces<FastTrackerClusterCollection>("TrackerClusters");
00107
00108 produces<SiTrackerGSRecHit2DCollection>("TrackerGSRecHits");
00109 produces<SiTrackerGSMatchedRecHit2DCollection>("TrackerGSMatchedRecHits");
00110
00111
00112 trackerContainers.clear();
00113 trackerContainers = conf.getParameter<std::vector<edm::InputTag> >("ROUList");
00114
00115 deltaRaysPCut = conf.getParameter<double>("DeltaRaysMomentumCut");
00116
00117
00118 trackingPSimHits = conf.getParameter<bool>("trackingPSimHits");
00119 if(trackingPSimHits) std::cout << "### trackingPSimHits chosen " << trackingPSimHits << std::endl;
00120
00121
00122 doMatching = conf.getParameter<bool>("doRecHitMatching");
00123
00124
00125 doDisableChannels = conf.getParameter<bool>("killDeadChannels");
00126
00127
00128 useCMSSWPixelParameterization = conf.getParameter<bool>("UseCMSSWPixelParametrization");
00129 #ifdef FAMOS_DEBUG
00130 std::cout << (useCMSSWPixelParameterization? "CMSSW" : "ORCA") << " pixel parametrization chosen in config file." << std::endl;
00131 #endif
00132
00133
00134 GevPerElectron = conf.getParameter<double>("GevPerElectron");
00135 ElectronsPerADC = conf.getParameter<double>("ElectronsPerADC");
00136
00137
00138
00139 localPositionResolution_TIB1x = conf.getParameter<double>("TIB1x");
00140 localPositionResolution_TIB1y = conf.getParameter<double>("TIB1y");
00141 localPositionResolution_TIB2x = conf.getParameter<double>("TIB2x");
00142 localPositionResolution_TIB2y = conf.getParameter<double>("TIB2y");
00143 localPositionResolution_TIB3x = conf.getParameter<double>("TIB3x");
00144 localPositionResolution_TIB3y = conf.getParameter<double>("TIB3y");
00145 localPositionResolution_TIB4x = conf.getParameter<double>("TIB4x");
00146 localPositionResolution_TIB4y = conf.getParameter<double>("TIB4y");
00147
00148
00149 localPositionResolution_TID1x = conf.getParameter<double>("TID1x");
00150 localPositionResolution_TID1y = conf.getParameter<double>("TID1y");
00151 localPositionResolution_TID2x = conf.getParameter<double>("TID2x");
00152 localPositionResolution_TID2y = conf.getParameter<double>("TID2y");
00153 localPositionResolution_TID3x = conf.getParameter<double>("TID3x");
00154 localPositionResolution_TID3y = conf.getParameter<double>("TID3y");
00155
00156
00157 localPositionResolution_TOB1x = conf.getParameter<double>("TOB1x");
00158 localPositionResolution_TOB1y = conf.getParameter<double>("TOB1y");
00159 localPositionResolution_TOB2x = conf.getParameter<double>("TOB2x");
00160 localPositionResolution_TOB2y = conf.getParameter<double>("TOB2y");
00161 localPositionResolution_TOB3x = conf.getParameter<double>("TOB3x");
00162 localPositionResolution_TOB3y = conf.getParameter<double>("TOB3y");
00163 localPositionResolution_TOB4x = conf.getParameter<double>("TOB4x");
00164 localPositionResolution_TOB4y = conf.getParameter<double>("TOB4y");
00165 localPositionResolution_TOB5x = conf.getParameter<double>("TOB5x");
00166 localPositionResolution_TOB5y = conf.getParameter<double>("TOB5y");
00167 localPositionResolution_TOB6x = conf.getParameter<double>("TOB6x");
00168 localPositionResolution_TOB6y = conf.getParameter<double>("TOB6y");
00169
00170
00171 localPositionResolution_TEC1x = conf.getParameter<double>("TEC1x");
00172 localPositionResolution_TEC1y = conf.getParameter<double>("TEC1y");
00173 localPositionResolution_TEC2x = conf.getParameter<double>("TEC2x");
00174 localPositionResolution_TEC2y = conf.getParameter<double>("TEC2y");
00175 localPositionResolution_TEC3x = conf.getParameter<double>("TEC3x");
00176 localPositionResolution_TEC3y = conf.getParameter<double>("TEC3y");
00177 localPositionResolution_TEC4x = conf.getParameter<double>("TEC4x");
00178 localPositionResolution_TEC4y = conf.getParameter<double>("TEC4y");
00179 localPositionResolution_TEC5x = conf.getParameter<double>("TEC5x");
00180 localPositionResolution_TEC5y = conf.getParameter<double>("TEC5y");
00181 localPositionResolution_TEC6x = conf.getParameter<double>("TEC6x");
00182 localPositionResolution_TEC6y = conf.getParameter<double>("TEC6y");
00183 localPositionResolution_TEC7x = conf.getParameter<double>("TEC7x");
00184 localPositionResolution_TEC7y = conf.getParameter<double>("TEC7y");
00185
00186 localPositionResolution_z = 0.0001;
00187
00188 #ifdef FAMOS_DEBUG
00189 std::cout << "RecHit local position error set to" << "\n"
00190 << "\tTIB1\tx = " << localPositionResolution_TIB1x
00191 << " cm\ty = " << localPositionResolution_TIB1y << " cm" << "\n"
00192 << "\tTIB2\tx = " << localPositionResolution_TIB2x
00193 << " cm\ty = " << localPositionResolution_TIB2y << " cm" << "\n"
00194 << "\tTIB3\tx = " << localPositionResolution_TIB3x
00195 << " cm\ty = " << localPositionResolution_TIB3y << " cm" << "\n"
00196 << "\tTIB4\tx = " << localPositionResolution_TIB4x
00197 << " cm\ty = " << localPositionResolution_TIB4y << " cm" << "\n"
00198 << "\tTID1\tx = " << localPositionResolution_TID1x
00199 << " cm\ty = " << localPositionResolution_TID1y << " cm" << "\n"
00200 << "\tTID2\tx = " << localPositionResolution_TID2x
00201 << " cm\ty = " << localPositionResolution_TID2y << " cm" << "\n"
00202 << "\tTID3\tx = " << localPositionResolution_TID3x
00203 << " cm\ty = " << localPositionResolution_TID3y << " cm" << "\n"
00204 << "\tTOB1\tx = " << localPositionResolution_TOB1x
00205 << " cm\ty = " << localPositionResolution_TOB1y << " cm" << "\n"
00206 << "\tTOB2\tx = " << localPositionResolution_TOB2x
00207 << " cm\ty = " << localPositionResolution_TOB2y << " cm" << "\n"
00208 << "\tTOB3\tx = " << localPositionResolution_TOB3x
00209 << " cm\ty = " << localPositionResolution_TOB3y << " cm" << "\n"
00210 << "\tTOB4\tx = " << localPositionResolution_TOB4x
00211 << " cm\ty = " << localPositionResolution_TOB4y << " cm" << "\n"
00212 << "\tTOB5\tx = " << localPositionResolution_TOB5x
00213 << " cm\ty = " << localPositionResolution_TOB5y << " cm" << "\n"
00214 << "\tTOB6\tx = " << localPositionResolution_TOB6x
00215 << " cm\ty = " << localPositionResolution_TOB6y << " cm" << "\n"
00216 << "\tTEC1\tx = " << localPositionResolution_TEC1x
00217 << " cm\ty = " << localPositionResolution_TEC1y << " cm" << "\n"
00218 << "\tTEC2\tx = " << localPositionResolution_TEC2x
00219 << " cm\ty = " << localPositionResolution_TEC2y << " cm" << "\n"
00220 << "\tTEC3\tx = " << localPositionResolution_TEC3x
00221 << " cm\ty = " << localPositionResolution_TEC3y << " cm" << "\n"
00222 << "\tTEC4\tx = " << localPositionResolution_TEC4x
00223 << " cm\ty = " << localPositionResolution_TEC4y << " cm" << "\n"
00224 << "\tTEC5\tx = " << localPositionResolution_TEC5x
00225 << " cm\ty = " << localPositionResolution_TEC5y << " cm" << "\n"
00226 << "\tTEC6\tx = " << localPositionResolution_TEC6x
00227 << " cm\ty = " << localPositionResolution_TEC6y << " cm" << "\n"
00228 << "\tTEC7\tx = " << localPositionResolution_TEC7x
00229 << " cm\ty = " << localPositionResolution_TEC7y << " cm" << "\n"
00230 << "\tAll:\tz = " << localPositionResolution_z << " cm"
00231 << std::endl;
00232 #endif
00233
00234
00235 if(useCMSSWPixelParameterization) {
00236 nAlphaBarrel = conf.getParameter<int>("AlphaBarrelMultiplicityNew");
00237 nBetaBarrel = conf.getParameter<int>("BetaBarrelMultiplicityNew");
00238 nAlphaForward = conf.getParameter<int>("AlphaForwardMultiplicityNew");
00239 nBetaForward = conf.getParameter<int>("BetaForwardMultiplicityNew");
00240 } else {
00241 nAlphaBarrel = conf.getParameter<int>("AlphaBarrelMultiplicity");
00242 nBetaBarrel = conf.getParameter<int>("BetaBarrelMultiplicity");
00243 nAlphaForward = conf.getParameter<int>("AlphaForwardMultiplicity");
00244 nBetaForward = conf.getParameter<int>("BetaForwardMultiplicity");
00245 }
00246 #ifdef FAMOS_DEBUG
00247 std::cout << "Pixel maximum multiplicity set to "
00248 << "\nBarrel" << "\talpha " << nAlphaBarrel
00249 << "\tbeta " << nBetaBarrel
00250 << "\nForward" << "\talpha " << nAlphaForward
00251 << "\tbeta " << nBetaForward
00252 << std::endl;
00253 #endif
00254
00255
00256 if(useCMSSWPixelParameterization) {
00257 resAlphaBarrel_binMin = conf.getParameter<double>("AlphaBarrel_BinMinNew" );
00258 resAlphaBarrel_binWidth = conf.getParameter<double>("AlphaBarrel_BinWidthNew");
00259 resAlphaBarrel_binN = conf.getParameter<int>( "AlphaBarrel_BinNNew" );
00260 resBetaBarrel_binMin = conf.getParameter<double>("BetaBarrel_BinMinNew" );
00261 resBetaBarrel_binWidth = conf.getParameter<double>("BetaBarrel_BinWidthNew" );
00262 resBetaBarrel_binN = conf.getParameter<int>( "BetaBarrel_BinNNew" );
00263 } else {
00264 resAlphaBarrel_binMin = conf.getParameter<double>("AlphaBarrel_BinMin" );
00265 resAlphaBarrel_binWidth = conf.getParameter<double>("AlphaBarrel_BinWidth");
00266 resAlphaBarrel_binN = conf.getParameter<int>( "AlphaBarrel_BinN" );
00267 resBetaBarrel_binMin = conf.getParameter<double>("BetaBarrel_BinMin" );
00268 resBetaBarrel_binWidth = conf.getParameter<double>("BetaBarrel_BinWidth" );
00269 resBetaBarrel_binN = conf.getParameter<int>( "BetaBarrel_BinN" );
00270 }
00271
00272
00273 if(useCMSSWPixelParameterization) {
00274 resAlphaForward_binMin = conf.getParameter<double>("AlphaForward_BinMinNew" );
00275 resAlphaForward_binWidth = conf.getParameter<double>("AlphaForward_BinWidthNew" );
00276 resAlphaForward_binN = conf.getParameter<int>( "AlphaForward_BinNNew" );
00277 resBetaForward_binMin = conf.getParameter<double>("BetaForward_BinMinNew" );
00278 resBetaForward_binWidth = conf.getParameter<double>("BetaForward_BinWidthNew" );
00279 resBetaForward_binN = conf.getParameter<int>( "BetaForward_BinNNew" );
00280 } else {
00281 resAlphaForward_binMin = conf.getParameter<double>("AlphaForward_BinMin" );
00282 resAlphaForward_binWidth = conf.getParameter<double>("AlphaForward_BinWidth" );
00283 resAlphaForward_binN = conf.getParameter<int>( "AlphaForward_BinN" );
00284 resBetaForward_binMin = conf.getParameter<double>("BetaForward_BinMin" );
00285 resBetaForward_binWidth = conf.getParameter<double>("BetaForward_BinWidth" );
00286 resBetaForward_binN = conf.getParameter<int>( "BetaForward_BinN" );
00287 }
00288
00289
00290 theHitFindingProbability_PXB = conf.getParameter<double>("HitFindingProbability_PXB" );
00291 theHitFindingProbability_PXF = conf.getParameter<double>("HitFindingProbability_PXF" );
00292 theHitFindingProbability_TIB1 = conf.getParameter<double>("HitFindingProbability_TIB1");
00293 theHitFindingProbability_TIB2 = conf.getParameter<double>("HitFindingProbability_TIB2");
00294 theHitFindingProbability_TIB3 = conf.getParameter<double>("HitFindingProbability_TIB3");
00295 theHitFindingProbability_TIB4 = conf.getParameter<double>("HitFindingProbability_TIB4");
00296 theHitFindingProbability_TID1 = conf.getParameter<double>("HitFindingProbability_TID1");
00297 theHitFindingProbability_TID2 = conf.getParameter<double>("HitFindingProbability_TID2");
00298 theHitFindingProbability_TID3 = conf.getParameter<double>("HitFindingProbability_TID3");
00299 theHitFindingProbability_TOB1 = conf.getParameter<double>("HitFindingProbability_TOB1");
00300 theHitFindingProbability_TOB2 = conf.getParameter<double>("HitFindingProbability_TOB2");
00301 theHitFindingProbability_TOB3 = conf.getParameter<double>("HitFindingProbability_TOB3");
00302 theHitFindingProbability_TOB4 = conf.getParameter<double>("HitFindingProbability_TOB4");
00303 theHitFindingProbability_TOB5 = conf.getParameter<double>("HitFindingProbability_TOB5");
00304 theHitFindingProbability_TOB6 = conf.getParameter<double>("HitFindingProbability_TOB6");
00305 theHitFindingProbability_TEC1 = conf.getParameter<double>("HitFindingProbability_TEC1");
00306 theHitFindingProbability_TEC2 = conf.getParameter<double>("HitFindingProbability_TEC2");
00307 theHitFindingProbability_TEC3 = conf.getParameter<double>("HitFindingProbability_TEC3");
00308 theHitFindingProbability_TEC4 = conf.getParameter<double>("HitFindingProbability_TEC4");
00309 theHitFindingProbability_TEC5 = conf.getParameter<double>("HitFindingProbability_TEC5");
00310 theHitFindingProbability_TEC6 = conf.getParameter<double>("HitFindingProbability_TEC6");
00311 theHitFindingProbability_TEC7 = conf.getParameter<double>("HitFindingProbability_TEC7");
00312
00313 #ifdef FAMOS_DEBUG
00314 std::cout << "RecHit finding probability set to" << "\n"
00315 << "\tPXB = " << theHitFindingProbability_PXB << "\n"
00316 << "\tPXF = " << theHitFindingProbability_PXF << "\n"
00317 << "\tTIB1 = " << theHitFindingProbability_TIB1 << "\n"
00318 << "\tTIB2 = " << theHitFindingProbability_TIB2 << "\n"
00319 << "\tTIB3 = " << theHitFindingProbability_TIB3 << "\n"
00320 << "\tTIB4 = " << theHitFindingProbability_TIB4 << "\n"
00321 << "\tTID1 = " << theHitFindingProbability_TID1 << "\n"
00322 << "\tTID2 = " << theHitFindingProbability_TID2 << "\n"
00323 << "\tTID3 = " << theHitFindingProbability_TID3 << "\n"
00324 << "\tTOB1 = " << theHitFindingProbability_TOB1 << "\n"
00325 << "\tTOB2 = " << theHitFindingProbability_TOB2 << "\n"
00326 << "\tTOB3 = " << theHitFindingProbability_TOB3 << "\n"
00327 << "\tTOB4 = " << theHitFindingProbability_TOB4 << "\n"
00328 << "\tTOB5 = " << theHitFindingProbability_TOB5 << "\n"
00329 << "\tTOB6 = " << theHitFindingProbability_TOB6 << "\n"
00330 << "\tTEC1 = " << theHitFindingProbability_TEC1 << "\n"
00331 << "\tTEC2 = " << theHitFindingProbability_TEC2 << "\n"
00332 << "\tTEC3 = " << theHitFindingProbability_TEC3 << "\n"
00333 << "\tTEC4 = " << theHitFindingProbability_TEC4 << "\n"
00334 << "\tTEC5 = " << theHitFindingProbability_TEC5 << "\n"
00335 << "\tTEC6 = " << theHitFindingProbability_TEC6 << "\n"
00336 << "\tTEC7 = " << theHitFindingProbability_TEC7 << "\n"
00337 << std::endl;
00338 #endif
00339
00340
00341 theSiStripErrorParametrization =
00342 new SiStripGaussianSmearingRecHitConverterAlgorithm(random);
00343
00344
00345
00346 }
00347
00348
00349 void SiTrackerGaussianSmearingRecHitConverter::loadPixelData() {
00350
00351
00352 thePixelDataFile = new TFile ( edm::FileInPath( thePixelMultiplicityFileName ).fullPath().c_str() , "READ" );
00353 thePixelBarrelResolutionFile = new TFile ( edm::FileInPath( thePixelBarrelResolutionFileName ).fullPath().c_str() , "READ" );
00354 thePixelForwardResolutionFile = new TFile ( edm::FileInPath( thePixelForwardResolutionFileName ).fullPath().c_str() , "READ" );
00355
00356
00357
00358 loadPixelData( thePixelDataFile,
00359 nAlphaBarrel ,
00360 std::string("hist_alpha_barrel") ,
00361 theBarrelMultiplicityAlphaCumulativeProbabilities );
00362
00363
00364 loadPixelData( thePixelDataFile,
00365 nBetaBarrel ,
00366 std::string("hist_beta_barrel") ,
00367 theBarrelMultiplicityBetaCumulativeProbabilities );
00368
00369
00370 loadPixelData( thePixelDataFile,
00371 nAlphaForward ,
00372 std::string("hist_alpha_forward") ,
00373 theForwardMultiplicityAlphaCumulativeProbabilities );
00374
00375
00376 loadPixelData( thePixelDataFile,
00377 nBetaForward ,
00378 std::string("hist_beta_forward") ,
00379 theForwardMultiplicityBetaCumulativeProbabilities );
00380
00381
00382
00383
00384
00385 if(useCMSSWPixelParameterization) {
00386
00387 loadPixelData( thePixelDataFile,
00388 nAlphaBarrel ,
00389 std::string("hist_alpha_barrel_big") ,
00390 theBarrelMultiplicityAlphaCumulativeProbabilities,
00391 true );
00392
00393
00394 loadPixelData( thePixelDataFile,
00395 nBetaBarrel ,
00396 std::string("hist_beta_barrel_big") ,
00397 theBarrelMultiplicityBetaCumulativeProbabilities,
00398 true );
00399
00400
00401 loadPixelData( thePixelDataFile,
00402 nAlphaForward ,
00403 std::string("hist_alpha_forward_big") ,
00404 theForwardMultiplicityAlphaCumulativeProbabilities,
00405 true );
00406
00407
00408 loadPixelData( thePixelDataFile,
00409 nBetaForward ,
00410 std::string("hist_beta_forward_big") ,
00411 theForwardMultiplicityBetaCumulativeProbabilities,
00412 true );
00413 }
00414
00415 }
00416
00417 void SiTrackerGaussianSmearingRecHitConverter::loadPixelData(
00418 TFile* pixelDataFile,
00419 unsigned int nMultiplicity,
00420 std::string histName,
00421 std::vector<TH1F*>& theMultiplicityCumulativeProbabilities,
00422 bool bigPixels)
00423 {
00424
00425 std::string histName_i = histName + "_%u";
00426 if(!bigPixels)
00427 theMultiplicityCumulativeProbabilities.clear();
00428
00429
00430
00431 for(unsigned int i = 0; i<nMultiplicity; ++i) {
00432 TH1F addHist = *((TH1F*) pixelDataFile->Get( Form( histName_i.c_str() ,i+1 )));
00433 if(i==0) {
00434 theMultiplicityCumulativeProbabilities.push_back( new TH1F(addHist) );
00435 } else {
00436 TH1F sumHist;
00437 if(bigPixels)
00438 sumHist = *(theMultiplicityCumulativeProbabilities[nMultiplicity+i-1]);
00439 else
00440 sumHist = *(theMultiplicityCumulativeProbabilities[i-1]);
00441 sumHist.Add(&addHist);
00442 theMultiplicityCumulativeProbabilities.push_back( new TH1F(sumHist) );
00443 }
00444 }
00445
00446
00447 #ifdef FAMOS_DEBUG
00448 const unsigned int maxMult = theMultiplicityCumulativeProbabilities.size();
00449 unsigned int iMult, multSize;
00450 if(useCMSSWPixelParameterization) {
00451 if(bigPixels) {
00452 iMult = maxMult / 2;
00453 multSize = maxMult ;
00454 } else {
00455 iMult = 0;
00456 multSize = maxMult;
00457 }
00458 } else {
00459 iMult = 0;
00460 multSize = maxMult ;
00461 }
00462 std::cout << " Multiplicity cumulated probability " << histName << std::endl;
00463 for(; iMult<multSize; ++iMult) {
00464 for(int iBin = 1; iBin<=theMultiplicityCumulativeProbabilities[iMult]->GetNbinsX(); ++iBin) {
00465 std::cout
00466 << " Multiplicity " << iMult+1
00467 << " bin " << iBin
00468 << " low edge = "
00469 << theMultiplicityCumulativeProbabilities[iMult]->GetBinLowEdge(iBin)
00470 << " prob = "
00471 << (theMultiplicityCumulativeProbabilities[iMult])->GetBinContent(iBin)
00472
00473 << std::endl;
00474 }
00475 }
00476 #endif
00477
00478 }
00479
00480
00481 SiTrackerGaussianSmearingRecHitConverter::~SiTrackerGaussianSmearingRecHitConverter() {
00482 theBarrelMultiplicityAlphaCumulativeProbabilities.clear();
00483 theBarrelMultiplicityBetaCumulativeProbabilities.clear();
00484 theForwardMultiplicityAlphaCumulativeProbabilities.clear();
00485 theForwardMultiplicityBetaCumulativeProbabilities.clear();
00486
00487 if(thePixelDataFile) delete thePixelDataFile;
00488 if(thePixelBarrelResolutionFile) delete thePixelBarrelResolutionFile;
00489 if(thePixelForwardResolutionFile) delete thePixelForwardResolutionFile;
00490 if(thePixelBarrelParametrization) delete thePixelBarrelParametrization;
00491 if(thePixelEndcapParametrization) delete thePixelEndcapParametrization;
00492 if(theSiStripErrorParametrization) delete theSiStripErrorParametrization;
00493
00494 if (numberOfDisabledModules>0) delete disabledModules;
00495
00496 if(random) delete random;
00497
00498 }
00499
00500 void
00501 SiTrackerGaussianSmearingRecHitConverter::beginRun(edm::Run & run, const edm::EventSetup & es)
00502 {
00503
00504
00505 edm::ESHandle<TrackerGeometry> theGeometry;
00506 es.get<TrackerDigiGeometryRecord> ().get (theGeometry);
00507 geometry = &(*theGeometry);
00508
00509 edm::ESHandle<TrackerGeometry> theMisAlignedGeometry;
00510 es.get<TrackerDigiGeometryRecord>().get("MisAligned",theMisAlignedGeometry);
00511 misAlignedGeometry = &(*theMisAlignedGeometry);
00512
00513 const MagneticField* magfield;
00514 edm::ESHandle<MagneticField> magField;
00515 es.get<IdealMagneticFieldRecord>().get(magField);
00516 magfield=&(*magField);
00517 GlobalPoint center(0.0, 0.0, 0.0);
00518 double magFieldAtCenter = magfield->inTesla(center).mag();
00519
00520
00521 if(useCMSSWPixelParameterization) {
00522 if(magFieldAtCenter > 3.9) {
00523 thePixelMultiplicityFileName = pset_.getParameter<std::string>( "PixelMultiplicityFile40T");
00524 thePixelBarrelResolutionFileName = pset_.getParameter<std::string>( "PixelBarrelResolutionFile40T");
00525 thePixelForwardResolutionFileName = pset_.getParameter<std::string>( "PixelForwardResolutionFile40T");
00526 } else {
00527 thePixelMultiplicityFileName = pset_.getParameter<std::string>( "PixelMultiplicityFile38T");
00528 thePixelBarrelResolutionFileName = pset_.getParameter<std::string>( "PixelBarrelResolutionFile38T");
00529 thePixelForwardResolutionFileName = pset_.getParameter<std::string>( "PixelForwardResolutionFile38T");
00530 }
00531 } else {
00532 thePixelMultiplicityFileName = pset_.getParameter<std::string>( "PixelMultiplicityFile" );
00533 thePixelBarrelResolutionFileName = pset_.getParameter<std::string>( "PixelBarrelResolutionFile");
00534 thePixelForwardResolutionFileName = pset_.getParameter<std::string>( "PixelForwardResolutionFile");
00535 }
00536
00537
00538
00539 edm::ESHandle<SiPixelQuality> siPixelBadModule;
00540 es.get<SiPixelQualityRcd>().get(siPixelBadModule);
00541 numberOfDisabledModules = 0;
00542 if (doDisableChannels) {
00543 disabledModules = new std::vector<SiPixelQuality::disabledModuleType> ( siPixelBadModule->getBadComponentList() );
00544 numberOfDisabledModules = disabledModules->size();
00545 size_t numberOfRecoverableModules = 0;
00546 for (size_t id=0;id<numberOfDisabledModules;id++) {
00548
00549
00550
00551
00553 if ( (*disabledModules)[id-numberOfRecoverableModules].errorType != 0 ){
00554
00555 disabledModules->erase(disabledModules->begin()+id-numberOfRecoverableModules);
00556 numberOfRecoverableModules++;
00557 }
00558 }
00559 numberOfDisabledModules = disabledModules->size();
00560 }
00561
00562
00563
00564 #ifdef FAMOS_DEBUG
00565 std::cout << "Pixel multiplicity data are taken from file " << thePixelMultiplicityFileName << std::endl;
00566
00567 std::cout << "Pixel maximum multiplicity set to "
00568 << "\nBarrel" << "\talpha " << nAlphaBarrel
00569 << "\tbeta " << nBetaBarrel
00570 << "\nForward" << "\talpha " << nAlphaForward
00571 << "\tbeta " << nBetaForward
00572 << std::endl;
00573
00574 std::cout << "Barrel Pixel resolution data are taken from file "
00575 << thePixelBarrelResolutionFileName << "\n"
00576 << "Alpha bin min = " << resAlphaBarrel_binMin
00577 << "\twidth = " << resAlphaBarrel_binWidth
00578 << "\tbins = " << resAlphaBarrel_binN
00579 << "\n"
00580 << " Beta bin min = " << resBetaBarrel_binMin
00581 << "\twidth = " << resBetaBarrel_binWidth
00582 << "\tbins = " << resBetaBarrel_binN
00583 << std::endl;
00584
00585 std::cout << "Forward Pixel resolution data are taken from file "
00586 << thePixelForwardResolutionFileName << "\n"
00587 << "Alpha bin min = " << resAlphaForward_binMin
00588 << "\twidth = " << resAlphaForward_binWidth
00589 << "\tbins = " << resAlphaForward_binN
00590 << "\n"
00591 << " Beta bin min = " << resBetaForward_binMin
00592 << "\twidth = " << resBetaForward_binWidth
00593 << "\tbins = " << resBetaForward_binN
00594 << std::endl;
00595 #endif
00596
00597
00598
00599
00600 loadPixelData();
00601
00602
00603
00604 thePixelBarrelParametrization =
00605 new SiPixelGaussianSmearingRecHitConverterAlgorithm(
00606 pset_,
00607 GeomDetEnumerators::PixelBarrel,
00608 random);
00609
00610 thePixelEndcapParametrization =
00611 new SiPixelGaussianSmearingRecHitConverterAlgorithm(
00612 pset_,
00613 GeomDetEnumerators::PixelEndcap,
00614 random);
00615 }
00616
00617 void SiTrackerGaussianSmearingRecHitConverter::produce(edm::Event& e, const edm::EventSetup& es)
00618 {
00619
00620
00621
00622 FastTrackerClusterRefProd = e.getRefBeforePut<FastTrackerClusterCollection>("TrackerClusters");
00623
00624
00625 edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
00626 std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec;
00627 for(uint32_t i=0; i<trackerContainers.size(); i++){
00628 e.getByLabel(trackerContainers[i], cf_simhit);
00629 cf_simhitvec.push_back(cf_simhit.product());
00630 }
00631 std::auto_ptr<MixCollection<PSimHit> > allTrackerHits(new MixCollection<PSimHit>(cf_simhitvec));
00632
00633
00634
00635
00636 std::map<unsigned, edm::OwnVector<SiTrackerGSRecHit2D> > temporaryRecHits;
00637 std::map<unsigned, edm::OwnVector<FastTrackerCluster> > theClusters ;
00638
00639 smearHits( *allTrackerHits, temporaryRecHits, theClusters);
00640
00641
00642 std::map<unsigned, edm::OwnVector<SiTrackerGSMatchedRecHit2D> > temporaryMatchedRecHits ;
00643 if(doMatching) matchHits( temporaryRecHits, temporaryMatchedRecHits, *allTrackerHits);
00644
00645
00646 std::auto_ptr<SiTrackerGSRecHit2DCollection> recHitCollection(new SiTrackerGSRecHit2DCollection);
00647 std::auto_ptr<SiTrackerGSMatchedRecHit2DCollection> recHitCollectionMatched(new SiTrackerGSMatchedRecHit2DCollection);
00648 if(doMatching){
00649 loadMatchedRecHits(temporaryMatchedRecHits, *recHitCollectionMatched);
00650 loadRecHits(temporaryRecHits, *recHitCollection);
00651 }
00652 else {
00653
00654 loadRecHits(temporaryRecHits, *recHitCollection);
00655 }
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665 e.put(recHitCollection,"TrackerGSRecHits");
00666 e.put(recHitCollectionMatched,"TrackerGSMatchedRecHits");
00667
00668
00669 std::auto_ptr<FastTrackerClusterCollection> clusterCollection(new FastTrackerClusterCollection);
00670 loadClusters(theClusters, *clusterCollection);
00671 e.put(clusterCollection,"TrackerClusters");
00672 }
00673
00674
00675
00676 void SiTrackerGaussianSmearingRecHitConverter::smearHits(MixCollection<PSimHit>& input,
00677 std::map<unsigned, edm::OwnVector<SiTrackerGSRecHit2D> >& temporaryRecHits,
00678 std::map<unsigned, edm::OwnVector<FastTrackerCluster> >& theClusters)
00679 {
00680
00681 int numberOfPSimHits = 0;
00682
00683
00684 MixCollection<PSimHit>::iterator isim = input.begin();
00685 MixCollection<PSimHit>::iterator lastSimHit = input.end();
00686 correspondingSimHit.resize(input.size());
00687 Local3DPoint position;
00688 LocalError error;
00689 LocalError inflatedError;
00690
00691 int simHitCounter = -1;
00692 int recHitCounter = 0;
00693
00694
00695
00696 for ( ; isim != lastSimHit; ++isim ) {
00697 ++simHitCounter;
00698
00699 DetId det((*isim).detUnitId());
00700 unsigned trackID = (*isim).trackId();
00701 uint32_t eeID = (*isim).eventId().rawId();
00702
00703
00704
00705
00707
00708
00709
00710
00711
00712
00713
00714
00715 bool isBad = false;
00716 unsigned int geoId = det.rawId();
00717 for (size_t id=0;id<numberOfDisabledModules;id++) {
00718 if(geoId==(*disabledModules)[id].DetID){
00719
00720
00721 isBad = true;
00722 break;
00723 }
00724 }
00725 if(isBad) continue;
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741 ++numberOfPSimHits;
00742
00743 unsigned int alphaMult = 0;
00744 unsigned int betaMult = 0;
00745 bool isCreated = gaussianSmearing(*isim, position, error, alphaMult, betaMult);
00746
00747
00748 unsigned int subdet = det.subdetId();
00749
00750
00751 if(isCreated) {
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789 if(doMatching && (subdet>2)){
00790 StripSubdetector specDetId=StripSubdetector(det);
00791 if( !specDetId.glued() ){
00792 position = Local3DPoint(position.x(),0.,0.);
00793 }
00794 }
00795 else{ if(subdet>2) position = Local3DPoint(position.x(),0.,0.); }
00796
00797
00798 const GeomDet* theMADet = misAlignedGeometry->idToDet(det);
00799 if ( theMADet->alignmentPositionError() != 0 ) {
00800 LocalError lape =
00801 ErrorFrameTransformer().transform ( theMADet->alignmentPositionError()->globalError(),
00802 theMADet->surface() );
00803 error = LocalError ( error.xx()+lape.xx(),
00804 error.xy()+lape.xy(),
00805 error.yy()+lape.yy() );
00806 }
00807
00808 float chargeADC = (*isim).energyLoss()/(GevPerElectron * ElectronsPerADC);
00809
00810
00811 if(subdet > 2) theClusters[trackID].push_back(
00812 new FastTrackerCluster(LocalPoint(position.x(), 0.0, 0.0), error, det,
00813 simHitCounter, trackID,
00814 eeID,
00815
00816 chargeADC)
00817 );
00818 else theClusters[trackID].push_back(
00819 new FastTrackerCluster(position, error, det,
00820 simHitCounter, trackID,
00821 eeID,
00822
00823 chargeADC)
00824 );
00825
00826
00827
00828
00829
00830
00831 temporaryRecHits[trackID].push_back(
00832 new SiTrackerGSRecHit2D(position, error, det,
00833 simHitCounter, trackID,
00834 eeID,
00835 ClusterRef(FastTrackerClusterRefProd, simHitCounter),
00836 alphaMult, betaMult)
00837 );
00838
00839
00840
00841 correspondingSimHit[recHitCounter++] = isim;
00842
00843
00844 }
00845
00846 }
00847
00848 }
00849
00850 bool SiTrackerGaussianSmearingRecHitConverter::gaussianSmearing(const PSimHit& simHit,
00851 Local3DPoint& position ,
00852 LocalError& error,
00853 unsigned& alphaMult,
00854 unsigned& betaMult)
00855 {
00856
00857
00858 unsigned int subdet = DetId(simHit.detUnitId()).subdetId();
00859 unsigned int detid = DetId(simHit.detUnitId()).rawId();
00860 const GeomDetUnit* theDetUnit = geometry->idToDetUnit((DetId)simHit.detUnitId());
00861 const BoundPlane& theDetPlane = theDetUnit->surface();
00862 const Bounds& theBounds = theDetPlane.bounds();
00863 double boundX = theBounds.width()/2.;
00864 double boundY = theBounds.length()/2.;
00865
00866 #ifdef FAMOS_DEBUG
00867 std::cout << "\tSubdetector " << subdet
00868 << " rawid " << detid
00869 << std::endl;
00870 #endif
00871 if(trackingPSimHits) {
00872
00873
00874 error = LocalError( localPositionResolution_z * localPositionResolution_z ,
00875 0.0 ,
00876 localPositionResolution_z * localPositionResolution_z );
00877
00878
00879 position = simHit.localPosition();
00880 #ifdef FAMOS_DEBUG
00881 std::cout << " Tracking PSimHit position set to " << position;
00882 #endif
00883 return true;
00884 }
00885
00886
00887
00888 double hitFindingProbability = random->flatShoot();
00889 #ifdef FAMOS_DEBUG
00890 std::cout << " Hit finding probability draw: " << hitFindingProbability << std::endl;;
00891 #endif
00892
00893 switch (subdet) {
00894
00895 case 1:
00896 {
00897 #ifdef FAMOS_DEBUG
00898 PXBDetId module(detid);
00899 unsigned int theLayer = module.layer();
00900 std::cout << "\tPixel Barrel Layer " << theLayer << std::endl;
00901 #endif
00902 if( hitFindingProbability > theHitFindingProbability_PXB ) return false;
00903
00904 const PixelGeomDetUnit* pixelDetUnit = dynamic_cast<const PixelGeomDetUnit*>(theDetUnit);
00905 thePixelBarrelParametrization->smearHit(simHit, pixelDetUnit, boundX, boundY);
00906 position = thePixelBarrelParametrization->getPosition();
00907 error = thePixelBarrelParametrization->getError();
00908 alphaMult = thePixelBarrelParametrization->getPixelMultiplicityAlpha();
00909 betaMult = thePixelBarrelParametrization->getPixelMultiplicityBeta();
00910 return true;
00911 break;
00912 }
00913
00914 case 2:
00915 {
00916 #ifdef FAMOS_DEBUG
00917 PXFDetId module(detid);
00918 unsigned int theDisk = module.disk();
00919 std::cout << "\tPixel Forward Disk " << theDisk << std::endl;
00920 #endif
00921 if( hitFindingProbability > theHitFindingProbability_PXF ) return false;
00922
00923 const PixelGeomDetUnit* pixelDetUnit = dynamic_cast<const PixelGeomDetUnit*>(theDetUnit);
00924 thePixelEndcapParametrization->smearHit(simHit, pixelDetUnit, boundX, boundY);
00925 position = thePixelEndcapParametrization->getPosition();
00926 error = thePixelEndcapParametrization->getError();
00927 alphaMult = thePixelEndcapParametrization->getPixelMultiplicityAlpha();
00928 betaMult = thePixelEndcapParametrization->getPixelMultiplicityBeta();
00929 return true;
00930 break;
00931 }
00932
00933 case 3:
00934 {
00935 TIBDetId module(detid);
00936 unsigned int theLayer = module.layer();
00937 #ifdef FAMOS_DEBUG
00938 std::cout << "\tTIB Layer " << theLayer << std::endl;
00939 #endif
00940
00941 double resolutionX, resolutionY, resolutionZ;
00942 resolutionZ = localPositionResolution_z;
00943
00944 switch (theLayer) {
00945 case 1:
00946 {
00947 resolutionX = localPositionResolution_TIB1x;
00948 resolutionY = localPositionResolution_TIB1y;
00949 if( hitFindingProbability > theHitFindingProbability_TIB1 ) return false;
00950 break;
00951 }
00952 case 2:
00953 {
00954 resolutionX = localPositionResolution_TIB2x;
00955 resolutionY = localPositionResolution_TIB2y;
00956 if( hitFindingProbability > theHitFindingProbability_TIB2 ) return false;
00957 break;
00958 }
00959 case 3:
00960 {
00961 resolutionX = localPositionResolution_TIB3x;
00962 resolutionY = localPositionResolution_TIB3y;
00963 if( hitFindingProbability > theHitFindingProbability_TIB3 ) return false;
00964 break;
00965 }
00966 case 4:
00967 {
00968 resolutionX = localPositionResolution_TIB4x;
00969 resolutionY = localPositionResolution_TIB4y;
00970 if( hitFindingProbability > theHitFindingProbability_TIB4 ) return false;
00971 break;
00972 }
00973 default:
00974 {
00975 edm::LogError ("SiTrackerGaussianSmearingRecHits")
00976 << "\tTIB Layer not valid " << theLayer << std::endl;
00977 return false;
00978 break;
00979 }
00980 }
00981
00982
00983 theSiStripErrorParametrization->smearHit(simHit, resolutionX, resolutionY, resolutionZ, boundX, boundY);
00984 position = theSiStripErrorParametrization->getPosition();
00985 error = theSiStripErrorParametrization->getError();
00986 alphaMult = 0;
00987 betaMult = 0;
00988 return true;
00989 break;
00990 }
00991
00992
00993 case 4:
00994 {
00995 TIDDetId module(detid);
00996 unsigned int theRing = module.ring();
00997 double resolutionFactorY =
00998 1. - simHit.localPosition().y() / theDetPlane.position().perp();
00999
01000 #ifdef FAMOS_DEBUG
01001 std::cout << "\tTID Ring " << theRing << std::endl;
01002 #endif
01003 double resolutionX, resolutionY, resolutionZ;
01004 resolutionZ = localPositionResolution_z;
01005
01006 switch (theRing) {
01007 case 1:
01008 {
01009 resolutionX = localPositionResolution_TID1x * resolutionFactorY;
01010 resolutionY = localPositionResolution_TID1y;
01011 if( hitFindingProbability > theHitFindingProbability_TID1 ) return false;
01012 break;
01013 }
01014 case 2:
01015 {
01016 resolutionX = localPositionResolution_TID2x * resolutionFactorY;
01017 resolutionY = localPositionResolution_TID2y;
01018 if( hitFindingProbability > theHitFindingProbability_TID2 ) return false;
01019 break;
01020 }
01021 case 3:
01022 {
01023 resolutionX = localPositionResolution_TID3x * resolutionFactorY;
01024 resolutionY = localPositionResolution_TID3y;
01025 if( hitFindingProbability > theHitFindingProbability_TID3 ) return false;
01026 break;
01027 }
01028 default:
01029 {
01030 edm::LogError ("SiTrackerGaussianSmearingRecHits")
01031 << "\tTID Ring not valid " << theRing << std::endl;
01032 return false;
01033 break;
01034 }
01035 }
01036
01037 boundX *= resolutionFactorY;
01038
01039 theSiStripErrorParametrization->smearHit(simHit, resolutionX, resolutionY, resolutionZ, boundX, boundY);
01040 position = theSiStripErrorParametrization->getPosition();
01041 error = theSiStripErrorParametrization->getError();
01042 alphaMult = 0;
01043 betaMult = 0;
01044 return true;
01045 break;
01046 }
01047
01048
01049 case 5:
01050 {
01051 TOBDetId module(detid);
01052 unsigned int theLayer = module.layer();
01053 #ifdef FAMOS_DEBUG
01054 std::cout << "\tTOB Layer " << theLayer << std::endl;
01055 #endif
01056 double resolutionX, resolutionY, resolutionZ;
01057 resolutionZ = localPositionResolution_z;
01058
01059 switch (theLayer) {
01060 case 1:
01061 {
01062 resolutionX = localPositionResolution_TOB1x;
01063 resolutionY = localPositionResolution_TOB1y;
01064 if( hitFindingProbability > theHitFindingProbability_TOB1 ) return false;
01065 break;
01066 }
01067 case 2:
01068 {
01069 resolutionX = localPositionResolution_TOB2x;
01070 resolutionY = localPositionResolution_TOB2y;
01071 if( hitFindingProbability > theHitFindingProbability_TOB2 ) return false;
01072 break;
01073 }
01074 case 3:
01075 {
01076 resolutionX = localPositionResolution_TOB3x;
01077 resolutionY = localPositionResolution_TOB3y;
01078 if( hitFindingProbability > theHitFindingProbability_TOB3 ) return false;
01079 break;
01080 }
01081 case 4:
01082 {
01083 resolutionX = localPositionResolution_TOB4x;
01084 resolutionY = localPositionResolution_TOB4y;
01085 if( hitFindingProbability > theHitFindingProbability_TOB4 ) return false;
01086 break;
01087 }
01088 case 5:
01089 {
01090 resolutionX = localPositionResolution_TOB5x;
01091 resolutionY = localPositionResolution_TOB5y;
01092 if( hitFindingProbability > theHitFindingProbability_TOB5 ) return false;
01093 break;
01094 }
01095 case 6:
01096 {
01097 resolutionX = localPositionResolution_TOB6x;
01098 resolutionY = localPositionResolution_TOB6y;
01099 if( hitFindingProbability > theHitFindingProbability_TOB6 ) return false;
01100 break;
01101 }
01102 default:
01103 {
01104 edm::LogError ("SiTrackerGaussianSmearingRecHits")
01105 << "\tTOB Layer not valid " << theLayer << std::endl;
01106 return false;
01107 break;
01108 }
01109 }
01110 theSiStripErrorParametrization->smearHit(simHit, resolutionX, resolutionY, resolutionZ, boundX, boundY);
01111 position = theSiStripErrorParametrization->getPosition();
01112 error = theSiStripErrorParametrization->getError();
01113 alphaMult = 0;
01114 betaMult = 0;
01115 return true;
01116 break;
01117 }
01118
01119
01120 case 6:
01121 {
01122 TECDetId module(detid);
01123 unsigned int theRing = module.ring();
01124 double resolutionFactorY =
01125 1. - simHit.localPosition().y() / theDetPlane.position().perp();
01126
01127 #ifdef FAMOS_DEBUG
01128 std::cout << "\tTEC Ring " << theRing << std::endl;
01129 #endif
01130 double resolutionX, resolutionY, resolutionZ;
01131 resolutionZ = localPositionResolution_z * localPositionResolution_z;
01132
01133 switch (theRing) {
01134 case 1:
01135 {
01136 resolutionX = localPositionResolution_TEC1x * resolutionFactorY;
01137 resolutionY = localPositionResolution_TEC1y;
01138 if( hitFindingProbability > theHitFindingProbability_TEC1 ) return false;
01139 break;
01140 }
01141 case 2:
01142 {
01143 resolutionX = localPositionResolution_TEC2x * resolutionFactorY;
01144 resolutionY = localPositionResolution_TEC2y;
01145 if( hitFindingProbability > theHitFindingProbability_TEC2 ) return false;
01146 break;
01147 }
01148 case 3:
01149 {
01150 resolutionX = localPositionResolution_TEC3x * resolutionFactorY;
01151 resolutionY = localPositionResolution_TEC3y;
01152 if( hitFindingProbability > theHitFindingProbability_TEC3 ) return false;
01153 break;
01154 }
01155 case 4:
01156 {
01157 resolutionX = localPositionResolution_TEC4x * resolutionFactorY;
01158 resolutionY = localPositionResolution_TEC4y;
01159 if( hitFindingProbability > theHitFindingProbability_TEC4 ) return false;
01160 break;
01161 }
01162 case 5:
01163 {
01164 resolutionX = localPositionResolution_TEC5x * resolutionFactorY;
01165 resolutionY = localPositionResolution_TEC5y;
01166 if( hitFindingProbability > theHitFindingProbability_TEC5 ) return false;
01167 break;
01168 }
01169 case 6:
01170 {
01171 resolutionX = localPositionResolution_TEC6x * resolutionFactorY;
01172 resolutionY = localPositionResolution_TEC6y;
01173 if( hitFindingProbability > theHitFindingProbability_TEC6 ) return false;
01174 break;
01175 }
01176 case 7:
01177 {
01178 resolutionX = localPositionResolution_TEC7x * resolutionFactorY;
01179 resolutionY = localPositionResolution_TEC7y;
01180 if( hitFindingProbability > theHitFindingProbability_TEC7 ) return false;
01181 break;
01182 }
01183 default:
01184 {
01185 edm::LogError ("SiTrackerGaussianSmearingRecHits")
01186 << "\tTEC Ring not valid " << theRing << std::endl;
01187 return false;
01188 break;
01189 }
01190 }
01191
01192 boundX *= resolutionFactorY;
01193 theSiStripErrorParametrization->smearHit(simHit, resolutionX, resolutionY, resolutionZ, boundX, boundY);
01194 position = theSiStripErrorParametrization->getPosition();
01195 error = theSiStripErrorParametrization->getError();
01196 alphaMult = 0;
01197 betaMult = 0;
01198 return true;
01199 break;
01200 }
01201
01202 default:
01203 {
01204 edm::LogError ("SiTrackerGaussianSmearingRecHits") << "\tTracker subdetector not valid " << subdet << std::endl;
01205 return false;
01206 break;
01207 }
01208
01209 }
01210
01211 }
01212
01213
01214
01215 void
01216 SiTrackerGaussianSmearingRecHitConverter::loadClusters(
01217 std::map<unsigned,edm::OwnVector<FastTrackerCluster> >& theClusterMap,
01218 FastTrackerClusterCollection& theClusterCollection) const
01219 {
01220 std::map<unsigned,edm::OwnVector<FastTrackerCluster> >::const_iterator
01221 it = theClusterMap.begin();
01222 std::map<unsigned,edm::OwnVector<FastTrackerCluster> >::const_iterator
01223 lastCluster = theClusterMap.end();
01224
01225 for( ; it != lastCluster ; ++it ) {
01226 theClusterCollection.put(it->first,(it->second).begin(),(it->second).end());
01227 }
01228 }
01229
01230
01231
01232 void
01233 SiTrackerGaussianSmearingRecHitConverter::loadRecHits(
01234 std::map<unsigned,edm::OwnVector<SiTrackerGSRecHit2D> >& theRecHits,
01235 SiTrackerGSRecHit2DCollection& theRecHitCollection) const
01236 {
01237 std::map<unsigned,edm::OwnVector<SiTrackerGSRecHit2D> >::const_iterator
01238 it = theRecHits.begin();
01239 std::map<unsigned,edm::OwnVector<SiTrackerGSRecHit2D> >::const_iterator
01240 lastRecHit = theRecHits.end();
01241
01242 for( ; it != lastRecHit ; ++it ) {
01243 theRecHitCollection.put(it->first,(it->second).begin(),(it->second).end());
01244 }
01245
01246 }
01247
01248 void
01249 SiTrackerGaussianSmearingRecHitConverter::loadMatchedRecHits(
01250 std::map<unsigned,edm::OwnVector<SiTrackerGSMatchedRecHit2D> >& theRecHits,
01251 SiTrackerGSMatchedRecHit2DCollection& theRecHitCollection) const
01252 {
01253 std::map<unsigned,edm::OwnVector<SiTrackerGSMatchedRecHit2D> >::const_iterator
01254 it = theRecHits.begin();
01255 std::map<unsigned,edm::OwnVector<SiTrackerGSMatchedRecHit2D> >::const_iterator
01256 lastRecHit = theRecHits.end();
01257
01258 for( ; it != lastRecHit ; ++it ) {
01259 theRecHitCollection.put(it->first,(it->second).begin(),(it->second).end());
01260 }
01261
01262 }
01263
01264
01265 void
01266 SiTrackerGaussianSmearingRecHitConverter::matchHits(
01267 std::map<unsigned, edm::OwnVector<SiTrackerGSRecHit2D> >& theRecHits,
01268 std::map<unsigned, edm::OwnVector<SiTrackerGSMatchedRecHit2D> >& matchedMap,
01269 MixCollection<PSimHit>& simhits ) {
01270
01271 std::map<unsigned, edm::OwnVector<SiTrackerGSRecHit2D> >::iterator it = theRecHits.begin();
01272 std::map<unsigned, edm::OwnVector<SiTrackerGSRecHit2D> >::iterator lastTrack = theRecHits.end();
01273
01274
01275 int recHitCounter = 0;
01276
01277
01278 for( ; it != lastTrack; ++it ) {
01279
01280 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator rit = it->second.begin();
01281 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator firstRecHit = it->second.begin();
01282 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator lastRecHit = it->second.end();
01283
01284
01285 for ( ; rit != lastRecHit; ++rit,++recHitCounter){
01286
01287 DetId detid = rit->geographicalId();
01288 unsigned int subdet = detid.subdetId();
01289
01290 if(subdet>2){
01291
01292 StripSubdetector specDetId=StripSubdetector(detid);
01293
01294
01295 if(specDetId.glued()){
01296
01297
01298 LocalVector simtrackdir = correspondingSimHit[recHitCounter]->localDirection();
01299
01300 const GluedGeomDet* gluedDet = (const GluedGeomDet*)geometry->idToDet(DetId(specDetId.glued()));
01301 const StripGeomDetUnit* stripdet =(StripGeomDetUnit*) gluedDet->stereoDet();
01302
01303
01304 GlobalVector globaldir= stripdet->surface().toGlobal(simtrackdir);
01305 LocalVector gluedsimtrackdir=gluedDet->surface().toLocal(globaldir);
01306
01307
01308 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator partner = rit;
01309 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator partnerNext = rit;
01310 edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator partnerPrev = rit;
01311 partnerNext++; partnerPrev--;
01312
01313
01314 if( specDetId.stereo() ) {
01315
01316 int partnersFound = 0;
01317
01318
01319 if(partnerNext != it->second.end() )
01320 if( StripSubdetector( partnerNext->geographicalId() ).partnerDetId() == detid.rawId() ) {
01321 partner= partnerNext;
01322 partnersFound++;
01323 }
01324
01325 if( rit != it->second.begin())
01326 if( StripSubdetector( partnerPrev->geographicalId() ).partnerDetId() == detid.rawId() ) {
01327 partnersFound++;
01328 partner= partnerPrev;
01329 }
01330
01331
01332
01333
01334 if(partnersFound==0){
01335 for(edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator iter = firstRecHit; iter != lastRecHit; ++iter ){
01336 if( StripSubdetector( iter->geographicalId() ).partnerDetId() == detid.rawId()){
01337 partnersFound++;
01338 partner = iter;
01339 }
01340 }
01341 }
01342
01343 if(partnersFound == 1) {
01344 SiTrackerGSMatchedRecHit2D * theMatchedHit =GSRecHitMatcher().match( &(*partner), &(*rit), gluedDet , gluedsimtrackdir );
01345
01346
01347
01348
01349
01350 matchedMap[it->first].push_back( theMatchedHit );
01351 }
01352 else{
01353
01354 SiTrackerGSMatchedRecHit2D * theProjectedHit = GSRecHitMatcher().projectOnly( &(*rit), geometry->idToDet(detid),gluedDet, gluedsimtrackdir );
01355 matchedMap[it->first].push_back( theProjectedHit );
01356
01357 }
01358 }
01359 else {
01360
01361
01362 int partnersFound = 0;
01363
01364
01365 if(partnerNext != it->second.end() )
01366 if( StripSubdetector( partnerNext->geographicalId() ).partnerDetId() == detid.rawId() ) {
01367 partnersFound++;
01368 }
01369
01370 if( rit != it->second.begin())
01371 if( StripSubdetector( partnerPrev->geographicalId() ).partnerDetId() == detid.rawId() ) {
01372 partnersFound++;
01373 }
01374
01375 if(partnersFound==0){
01376 for(edm::OwnVector<SiTrackerGSRecHit2D>::const_iterator iter = firstRecHit; iter != lastRecHit; ++iter ){
01377 if( StripSubdetector( iter->geographicalId() ).partnerDetId() == detid.rawId()){
01378 partnersFound++;
01379 }
01380 }
01381 }
01382
01383
01384 if(partnersFound==0){
01385
01386 SiTrackerGSMatchedRecHit2D * theProjectedHit =
01387 GSRecHitMatcher().projectOnly( &(*rit), geometry->idToDet(detid),gluedDet, gluedsimtrackdir );
01388
01389
01390
01391
01392 matchedMap[it->first].push_back( theProjectedHit );
01393 }
01394 }
01395 }
01396
01397 else{
01398
01399 SiTrackerGSMatchedRecHit2D* rit_copy = new SiTrackerGSMatchedRecHit2D(rit->localPosition(), rit->localPositionError(),
01400 rit->geographicalId(),
01401 rit->simhitId(), rit->simtrackId(), rit->eeId(),
01402 rit->cluster(),
01403 rit->simMultX(), rit->simMultY());
01404
01405
01406
01407 matchedMap[it->first].push_back( rit_copy );
01408 }
01409
01410 }
01411
01412 else {
01413
01414 SiTrackerGSMatchedRecHit2D* rit_copy = new SiTrackerGSMatchedRecHit2D(rit->localPosition(), rit->localPositionError(),
01415 rit->geographicalId(),
01416 rit->simhitId(), rit->simtrackId(), rit->eeId(),
01417 rit->cluster(),
01418 rit->simMultX(), rit->simMultY());
01419
01420
01421
01422 matchedMap[it->first].push_back( rit_copy );
01423 }
01424
01425 }
01426
01427 }
01428
01429
01430 }