00001 #include "SimTracker/SiStripDigitizer/interface/SiTrivialInduceChargeOnStrips.h"
00002 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00003 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00004 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
00005 #include <Math/ProbFuncMathCore.h>
00006 #include<iostream>
00007
00008 SiTrivialInduceChargeOnStrips::SiTrivialInduceChargeOnStrips(const edm::ParameterSet& conf,double g):conf_(conf)
00009 {
00010 peak = conf_.getParameter<bool>("APVpeakmode");
00011
00012
00013 signalCoupling_TIB.clear();
00014 signalCoupling_TID.clear();
00015 signalCoupling_TOB.clear();
00016 signalCoupling_TEC.clear();
00017 if(peak){
00018
00019 signalCoupling_TIB = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTIB");
00020
00021 signalCoupling_TID = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTID");
00022
00023 signalCoupling_TOB = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTOB");
00024
00025 signalCoupling_TEC = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTEC");
00026
00027 }else{
00028
00029 signalCoupling_TIB = conf_.getParameter<std::vector<double> >("CouplingCostantDecTIB");
00030
00031 signalCoupling_TID = conf_.getParameter<std::vector<double> >("CouplingCostantDecTID");
00032
00033 signalCoupling_TOB = conf_.getParameter<std::vector<double> >("CouplingCostantDecTOB");
00034
00035 signalCoupling_TEC = conf_.getParameter<std::vector<double> >("CouplingCostantDecTEC");
00036
00037 }
00038 clusterWidth = 3.;
00039 geVperElectron = g;
00040 }
00041 void SiTrivialInduceChargeOnStrips::induce(SiChargeCollectionDrifter::collection_type _collection_points, const StripGeomDetUnit& det,
00042 std::vector<double>& locAmpl, unsigned int& minCha, unsigned int& maxCha){
00043
00044 const StripTopology& t = dynamic_cast<const StripTopology&>(det.specificTopology());
00045
00046 int numStrips = t.nstrips();
00047 int stripLeft, stripRight;
00048 double upperBound, lowerBound;
00049
00050
00051
00052
00053
00054
00055 minCha=locAmpl.size();
00056 maxCha=0;
00057 for (SiChargeCollectionDrifter::collection_type::const_iterator sp=_collection_points.begin(); sp != _collection_points.end(); sp++ ){
00058 float chargePosition = t.strip((*sp).position());
00059 float localPitch = t.localPitch((*sp).position());
00060 float chargeSpread = (*sp).sigma()/localPitch ;
00061
00062
00063
00064 stripLeft = int( chargePosition-clusterWidth*chargeSpread);
00065 stripRight = int( chargePosition+clusterWidth*chargeSpread);
00066 stripLeft = (0<stripLeft ? stripLeft : 0);
00067 stripRight = (numStrips >stripRight ? stripRight : numStrips-1);
00068
00069
00070 for (int i=stripLeft; i<=stripRight; i++){
00071
00072 if (i == 0) lowerBound = 0. ;
00073 else {
00074 lowerBound = 1. - ROOT::Math::normal_cdf_c(i,chargeSpread,chargePosition);
00075 }
00076 if (i == numStrips-1) upperBound = 1.;
00077 else {
00078 upperBound = 1. - ROOT::Math::normal_cdf_c(i+1,chargeSpread,chargePosition);
00079 }
00080
00081 double totalIntegrationRange = upperBound - lowerBound;
00082
00083
00084
00085
00086 std::vector<double>* signalCoupling = 0;
00087 int subDet_enum=det.specificType().subDetector();
00088 switch (subDet_enum) {
00089 case GeomDetEnumerators::TIB:
00090 {
00091 signalCoupling = &(signalCoupling_TIB);
00092 break;
00093 }
00094 case GeomDetEnumerators::TOB:
00095 {
00096 signalCoupling = &(signalCoupling_TOB);
00097 break;
00098 }
00099 case GeomDetEnumerators::TID:
00100 {
00101 signalCoupling = &(signalCoupling_TID);
00102 break;
00103 }
00104 case GeomDetEnumerators::TEC:
00105 {
00106 signalCoupling = &(signalCoupling_TEC);
00107 break;
00108 }
00109 default:
00110 {
00111 std::cout << "SiTrivialInduceChargeOnStrips ERROR - Not a Tracker Subdetector " << subDet_enum << std::endl;
00112 break;
00113 }
00114 }
00115
00116 int nSignalCoupling = (*signalCoupling).size();
00117
00118
00119
00120
00121
00122
00123
00124 int low = std::max(0,i-nSignalCoupling+1);
00125 int high = std::min(numStrips-1,i+nSignalCoupling-1);
00126 if((int)minCha>low) minCha=low;
00127 if((int)maxCha<high) maxCha=high;
00128 double fact = (totalIntegrationRange/geVperElectron)*
00129 (*sp).amplitude();
00130 for (int j = low ; j<=high ; j++)
00131 locAmpl[j] += (*signalCoupling)[abs(j-i)]*fact;
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 }
00149 }
00150
00151 }