Go to the documentation of this file.00001 #ifndef _TRACKER_SiHitDigitizer_H_
00002 #define _TRACKER_SiHitDigitizer_H_
00003
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005
00006 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00007 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00008 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00009 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00010 #include "SiChargeCollectionDrifter.h"
00011 #include "SiChargeDivider.h"
00012 #include "SiInduceChargeOnStrips.h"
00013 #include "SiPileUpSignals.h"
00014
00015 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
00016
00017 #include <map>
00018 #include <memory>
00019
00020 namespace CLHEP {
00021 class HepRandomEngine;
00022 }
00023
00024 class SiStripDetType;
00028 class SiHitDigitizer {
00029 public:
00030
00031 SiHitDigitizer(const edm::ParameterSet& conf,CLHEP::HepRandomEngine&);
00032
00033 ~SiHitDigitizer();
00034
00035 void setChargeDivider(SiChargeDivider* cd) {
00036 theSiChargeDivider.reset(cd);
00037 }
00038
00039 void setChargeCollectionDrifter(SiChargeCollectionDrifter* cd) {
00040 theSiChargeCollectionDrifter.reset(cd);
00041 }
00042
00043 void setInduceChargeOnStrips(SiInduceChargeOnStrips* cd) {
00044 theSiInduceChargeOnStrips.reset(cd);
00045 }
00046
00047 void setParticleDataTable(const ParticleDataTable * pdt) {
00048 theSiChargeDivider->setParticleDataTable(pdt);
00049 }
00050
00051 void processHit(const PSimHit*, const StripGeomDetUnit&, GlobalVector,float,
00052 std::vector<double>&, size_t&, size_t&);
00053
00054 private:
00055 const double depletionVoltage;
00056 const double chargeMobility;
00057 std::unique_ptr<SiChargeDivider> theSiChargeDivider;
00058 std::unique_ptr<SiChargeCollectionDrifter> theSiChargeCollectionDrifter;
00059 std::unique_ptr<const SiInduceChargeOnStrips> theSiInduceChargeOnStrips;
00060
00061 typedef GloballyPositioned<double> Frame;
00062
00063 LocalVector DriftDirection(const StripGeomDetUnit* _detp, GlobalVector _bfield, float langle) {
00064 LocalVector Bfield=Frame(_detp->surface().position(),_detp->surface().rotation()).toLocal(_bfield);
00065 return LocalVector(-langle * Bfield.y(),langle * Bfield.x(),1.);
00066 }
00067
00068 };
00069
00070 #endif