CMS 3D CMS Logo

SiTrivialInduceChargeOnStrips.cc

Go to the documentation of this file.
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   // Coupling Constant
00012   //  signalCoupling.clear();
00013   signalCoupling_TIB.clear();
00014   signalCoupling_TID.clear();
00015   signalCoupling_TOB.clear();
00016   signalCoupling_TEC.clear();
00017   if(peak){
00018     // TIB
00019     signalCoupling_TIB = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTIB");
00020     // TID
00021     signalCoupling_TID = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTID");
00022     // TOB
00023     signalCoupling_TOB = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTOB");
00024     // TEC
00025     signalCoupling_TEC = conf_.getParameter<std::vector<double> >("CouplingCostantPeakTEC");
00026     //
00027   }else{
00028     // TIB
00029     signalCoupling_TIB = conf_.getParameter<std::vector<double> >("CouplingCostantDecTIB");
00030     // TID
00031     signalCoupling_TID = conf_.getParameter<std::vector<double> >("CouplingCostantDecTID");
00032     // TOB
00033     signalCoupling_TOB = conf_.getParameter<std::vector<double> >("CouplingCostantDecTOB");
00034     // TEC
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   //  const StripTopology& t = dynamic_cast<const StripTopology&>(det.topology());
00044   const StripTopology& t = dynamic_cast<const StripTopology&>(det.specificTopology()); // AG
00045   
00046   int numStrips = t.nstrips();
00047   int stripLeft, stripRight;
00048   double upperBound, lowerBound;
00049   
00050   // fill local Amplitudes with zeroes
00051   // it is done also in SiStripDigitizerAlgorithm 'ma non si sa mai'
00052   //  std::fill(locAmpl.begin(),locAmpl.end(),0.);
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()); // charge in strip coord
00059     float localPitch = t.localPitch((*sp).position()); // local strip pitch 
00060     float chargeSpread = (*sp).sigma()/localPitch ;  // sigma in strip coord
00061     
00062     // Define strips intervals along x: check edge condition
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       /* Definition of the integration borns */
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       //calculate signal on strips including capacitive coupling
00084       
00085       // Choice of the subdtector charge coupling
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       } // switch
00115       
00116       int nSignalCoupling = (*signalCoupling).size();
00117       
00118       /* debug
00119       std::cout << "SiTrivialInduceChargeOnStrips ChargeCoupling for subdetector " << subDet_enum << std::endl;
00120       for(unsigned int iCC=0; iCC!=nSignalCoupling ; iCC++)
00121         std::cout << "\t Strip " << iCC << " value " << (*signalCoupling)[iCC] << std::endl;
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         for (int j = -nSignalCoupling+1 ; j<=nSignalCoupling-1 ; j++) {
00135         if (i+j >= 0 && i+j < numStrips ) {
00136         locAmpl[i+j] += signalCoupling[abs(j)]* 
00137         (totalIntegrationRange/geVperElectron)*
00138         (*sp).amplitude();
00139         // update counters edges
00140         if((int)minCha>(i+j))
00141         minCha=(i+j);
00142         if((int)maxCha<(i+j))
00143         maxCha=(i+j);
00144         //
00145         }
00146         }
00147        */
00148     } //loop on i
00149   } //loop on sp
00150   
00151 }

Generated on Tue Jun 9 17:47:53 2009 for CMSSW by  doxygen 1.5.4