CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

HitDigitizerFP420 Class Reference

#include <HitDigitizerFP420.h>

List of all members.

Public Types

typedef std::map< int, float,
std::less< int > > 
hit_map_type

Public Member Functions

 HitDigitizerFP420 (float in, float ild, float ildx, float ildy, float in0, float in2, float in3, int verbosity)
hit_map_type processHit (const PSimHit &, G4ThreeVector, int, int, double, int, double, double, int)
void setChargeCollectionDrifter (CDrifterFP420 *cd)
void setChargeDivider (CDividerFP420 *cd)
void setInduceChargeOnElectrods (IChargeFP420 *cd)
 ~HitDigitizerFP420 ()

Private Member Functions

G4ThreeVector DriftDirection (G4ThreeVector, int, int)

Private Attributes

double appliedVoltage
double chargeDistributionRMS
double chargeMobility
double depletionVoltage
double gevperelectron
double moduleThickness
bool noDiffusion
float tanLorentzAnglePerTesla
double temperature
CDividerFP420theCDividerFP420
CDrifterFP420theCDrifterFP420
IChargeFP420theIChargeFP420

Detailed Description

Definition at line 17 of file HitDigitizerFP420.h.


Member Typedef Documentation

typedef std::map<int, float, std::less<int> > HitDigitizerFP420::hit_map_type

Definition at line 20 of file HitDigitizerFP420.h.


Constructor & Destructor Documentation

HitDigitizerFP420::HitDigitizerFP420 ( float  in,
float  ild,
float  ildx,
float  ildy,
float  in0,
float  in2,
float  in3,
int  verbosity 
)

Definition at line 28 of file HitDigitizerFP420.cc.

References CBOLTZ, gather_cfg::cout, e_SI, recoMuon::in, and funct::pow().

                                                                                                                        {
  moduleThickness =in; 
  double bz420 = in0; 
  double bzD2 =  in2; 
  double bzD3 =  in3;
  //  double pitch =inp; 
  //  double pitchX =inpx; 
  //  double pitchY =inpy; 
  double ldrift =ild; 
  double ldriftX =ildx; 
  double ldriftY =ildy; 
  //
  // Construct default classes
  //
  
  //theCDividerFP420 = new ChargeDividerFP420(pitch);
  theCDividerFP420 = new ChargeDividerFP420(moduleThickness, bz420, bzD2, bzD3, verbosity);
  
  depletionVoltage=20.0; //
  appliedVoltage=25.0;  //  a bit bigger than depletionVoltage to have positive value A for logA, A=1-2*Tfract.*Vd/(Vd+Vb)
  
  //  chargeMobility=480.0;//  = 480.0  !holes    mobility [cm**2/V/sec] p-side;   = 1350.0 !electron mobility - n-side
  chargeMobility=1350.0;//  = 480.0  !holes    mobility [cm**2/V/sec] p-side;   = 1350.0 !electron mobility - n-side
  //temperature=297.; // 24 C degree +273 = 297 ---->diffusion const for electrons= (1.38E-23/1.6E-19)*1350.0*297=34.6
  //  diffusion const for holes  =   12.3   [cm**2/sec]
  temperature=263.; // -10  C degree +273 = 263 ---->diffusion const for electrons= (1.38E-23/1.6E-19)*1350.0*263=30.6
  double diffusionConstant = CBOLTZ/e_SI * chargeMobility * temperature;
  // noDiffusion=true; // true if no Diffusion
  noDiffusion=false; // false if Diffusion
  if (noDiffusion) diffusionConstant *= 1.0e-3;
  
  chargeDistributionRMS=6.5e-10;
  
  // arbitrary:
  tanLorentzAnglePerTesla = 0. ;       //  try =0.106 if B field exist
  
  //    double timeNormalisation = pow(moduleThickness,2)/(2.*depletionVoltage*chargeMobility);
  //    double timeNormalisation = pow(pitch,2)/(2.*depletionVoltage*chargeMobility);
  
  double timeNormalisation = pow(ldrift,2)/(2.*depletionVoltage*chargeMobility);// 
  // double timeNormalisation = pow(ldrift,2)/(2.*depletionVoltage*chargeMobility);// 
  timeNormalisation = timeNormalisation*0.01; // because ldrift in [mm] but mu_e in [cm2/V/sec 
  
  //      double timeNormalisation = pow(pitch/2.,2)/(2.*depletionVoltage*chargeMobility);// i entered pitch as a distance between 2 read-out strips, not real distance between any (p or n) electrods which will be in 2 times less. But in expression for timeNormalisation the real distance of charge collection must be, so use pitch/2.   !
  
  
  double clusterWidth=5.;// was = 3
  gevperelectron= 3.61e-09; //     double GevPerElectron = 3.61e-09
  
  // GevPerElectron AZ:average deposited energy per e-h pair [keV]??? =0.0036
  if(verbosity>0) {
    std::cout << "HitDigitizerFP420: constructor ldrift= " << ldrift << std::endl;
    std::cout << "ldriftY= " <<ldriftY  << "ldriftX= " <<ldriftX  << std::endl;
    std::cout << "depletionVoltage" <<  depletionVoltage    << "appliedVoltage" <<  appliedVoltage    << "chargeMobility" <<  chargeMobility    << "temperature" <<  temperature    << "diffusionConstant" <<  diffusionConstant    << "chargeDistributionRMS" <<   chargeDistributionRMS   << "moduleThickness" <<   moduleThickness   << "timeNormalisation" <<  timeNormalisation    << "gevperelectron" <<  gevperelectron    << std::endl;
  }
  //ndif
  
  theCDrifterFP420 = 
    new ChargeDrifterFP420(moduleThickness,
                           timeNormalisation,
                           diffusionConstant,
                           temperature,
                           chargeDistributionRMS,
                           depletionVoltage,
                           appliedVoltage,
                           ldriftX,
                           ldriftY, verbosity);
  //                                    pitchX,
  //                                    pitchY);
  
  theIChargeFP420 = new InduceChargeFP420(clusterWidth,gevperelectron);
}
HitDigitizerFP420::~HitDigitizerFP420 ( )

Definition at line 102 of file HitDigitizerFP420.cc.

                                     {
  delete theCDividerFP420;
  delete theCDrifterFP420;
  delete theIChargeFP420;
}

Member Function Documentation

G4ThreeVector HitDigitizerFP420::DriftDirection ( G4ThreeVector  _bfield,
int  xytype,
int  verbosity 
) [private]

Definition at line 192 of file HitDigitizerFP420.cc.

References gather_cfg::cout.

                                                                                               {
  
  // LOCAL hit: exchange xytype:  1 <-> 2
  
  //  Frame detFrame(_detp->surface().position(),_detp->surface().rotation());
  //  G4ThreeVector Bfield=detFrame.toLocal(_bfield);
  G4ThreeVector Bfield=_bfield;
  float dir_x, dir_y, dir_z; 
  // this lines with dir_... have to be specified(sign?) in dependence of field direction: 
  /*
    float dir_x = tanLorentzAnglePerTesla * Bfield.y();
    float dir_y = -tanLorentzAnglePerTesla * Bfield.x();
    float dir_z = 1.; // if E field is in z direction
  */
  // for electrons:
  // E field is either in X or Y direction with change vector to opposite
  
  // global Y or localX
  // E field is in Xlocal direction with change vector to opposite
  if(xytype == 2) {
    dir_x = 1.; // E field in Xlocal direction
    dir_y = +tanLorentzAnglePerTesla * Bfield.z();
    dir_z = -tanLorentzAnglePerTesla * Bfield.y();
  }
  // global X
  // E field is in Ylocal direction with change vector to opposite
  else if(xytype == 1) {
    dir_x = +tanLorentzAnglePerTesla * Bfield.z();
    dir_y = 1.; // E field in Ylocal direction
    dir_z = -tanLorentzAnglePerTesla * Bfield.x();
  }
  else{
    dir_x = 0.;
    dir_y = 0.;
    dir_z = 0.;
    std::cout << "HitDigitizerFP420: ERROR - wrong xytype=" <<  xytype   << std::endl;
  }
  
  
  //  G4ThreeVector theDriftDirection = LocalVector(dir_x,dir_y,dir_z);
  G4ThreeVector theDriftDirection(dir_x,dir_y,dir_z);
  // Local3DPoint EntryPo(aHit->getEntry().x(),aHit->getEntry().y(),aHit->getEntry().z());
  if(verbosity>0) {
    std::cout << "HitDigitizerFP420:DriftDirection tanLorentzAnglePerTesla= " << tanLorentzAnglePerTesla    << std::endl;
    std::cout << "HitDigitizerFP420:DriftDirection The drift direction in local coordinate is " <<  theDriftDirection    << std::endl;
  }
  
  return theDriftDirection;
  
}
HitDigitizerFP420::hit_map_type HitDigitizerFP420::processHit ( const PSimHit hit,
G4ThreeVector  bfield,
int  xytype,
int  numStrips,
double  pitch,
int  numStripsW,
double  pitchW,
double  moduleThickness,
int  verbosity 
)

Definition at line 110 of file HitDigitizerFP420.cc.

References gather_cfg::cout, PSimHit::entryPoint(), PSimHit::exitPoint(), verbosity, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by FP420DigiMain::run().

                                                                                                                                                                                                                 {
  
  // use chargePosition just for cross-check in "induce" method
  // hit center in 3D-detector r.f.
  
  float middlex = (hit.exitPoint().x() + hit.entryPoint().x() )/2.;
  float middley = (hit.exitPoint().y() + hit.entryPoint().y() )/2.;
  
  
  float chargePosition= -100.;
  // Y: 
  if(xytype == 1) {
    //     chargePosition  = fabs(-numStrips/2. - ( int(middle.x()/pitch) +1.) );
    //chargePosition  = fabs(int(middle.x()/pitch+0.5*(numStrips+1)) + 1.);
    //      chargePosition  = fabs(int(middle.y()/pitch+0.5*(numStrips+1)) + 1.);
    // local and global reference frames are rotated in 90 degree, so global X and local Y are collinear
    //     chargePosition  = int(fabs(middle.x()/pitch + 0.5*numStrips + 1.));// charge in strip coord 
    chargePosition = 0.5*(numStrips) + middlex/pitch ;// charge in strip coord 0 - numStrips-1
    
    
  }
  // X:
  else if(xytype == 2) {
    //     chargePosition  = fabs(-numStrips/2. - ( int(middle.y()/pitch) +1.) );
    //chargePosition  = fabs(int(middle.y()/pitch+0.5*(numStrips+1)) + 1.);
    //      chargePosition  = fabs(int(middle.x()/pitch+0.5*(numStrips+1)) + 1.);
    // local and global reference frames are rotated in 90 degree, so global X and local Y are collinear
    //     chargePosition  = int(fabs(middle.y()/pitch + 0.5*numStrips + 1.));
    chargePosition = 0.5*(numStrips) + middley/pitch ;// charge in strip coord 0 - numStrips-1
    
    //  std::cout << " chargePosition    SiHitDi... = " << chargePosition                       << std::endl;
  }
  else {
    std::cout <<"================================================================"<<std::endl;
    std::cout << "****   HitDigitizerFP420:  !!!  ERROR: you have not to be here !!!  xytype=" << xytype << std::endl;
    // std::cout << "****   HitDigitizerFP420:  !!!  ERROR: you have not to be here !!!  xytype=" << xytype << std::endl;
    
    
    //     break;
  }
  //   if(chargePosition > numStrips || chargePosition<1) {
  if(chargePosition > numStrips || chargePosition < 0) {
    std::cout << "****   HitDigitizerFP420:  !!!  ERROR: check correspondence of XY detector dimensions in XML and here !!! chargePosition = " << chargePosition << std::endl;
    //     break;
  }
  
  if(verbosity>0) {
    std::cout << " ======   ****   HitDigitizerFP420:  !!!  processHit  !!!  : input: xytype=" << xytype << " numStrips=  " << numStrips << " pitch=  " << pitch << " Calculated chargePosition=  " << chargePosition << std::endl;
    std::cout << "The middle of hit point on input was: middlex =  " << middlex << std::endl;
    std::cout << "The middle of hit point on input was: middley =  " << middley << std::endl;
    //  std::cout << "For checks: hit point Entry =  " << hit.getEntry() << std::endl;
    std::cout << " ======   ****   HitDigitizerFP420:processHit:   start  CDrifterFP420 divide" << std::endl;
  }
  //
  // Fully process one SimHit
  //
  
  //   CDrifterFP420::ionization_type ion = theCDividerFP420->divide(hit,pitch);
  CDrifterFP420::ionization_type ion = theCDividerFP420->divide(hit,moduleThickness);
  //
  // Compute the drift direction for this det
  //
  
  //  G4ThreeVector driftDir = DriftDirection(&det,bfield);
  G4ThreeVector driftDir = DriftDirection(bfield,xytype,verbosity);
  if(verbosity>0) {
    std::cout << " ======   ****   HitDigitizerFP420:processHit: driftDir= " << driftDir << std::endl;
    std::cout << " ======   ****   HitDigitizerFP420:processHit:  start   induce , CDrifterFP420   drift   " << std::endl;
  }
  
  //  if(driftDir.z() ==0.) {
  //    std::cout << " pxlx: drift in z is zero " << std::endl; 
  //  }  else  
  //

  return theIChargeFP420->induce(theCDrifterFP420->drift(ion,driftDir,xytype), numStrips, pitch, numStripsW, pitchW, xytype, verbosity);
  
  //
}
void HitDigitizerFP420::setChargeCollectionDrifter ( CDrifterFP420 cd) [inline]

Definition at line 33 of file HitDigitizerFP420.h.

References theCDrifterFP420.

void HitDigitizerFP420::setChargeDivider ( CDividerFP420 cd) [inline]

Definition at line 29 of file HitDigitizerFP420.h.

References theCDividerFP420.

void HitDigitizerFP420::setInduceChargeOnElectrods ( IChargeFP420 cd) [inline]

Definition at line 37 of file HitDigitizerFP420.h.

References theIChargeFP420.


Member Data Documentation

Definition at line 59 of file HitDigitizerFP420.h.

Definition at line 63 of file HitDigitizerFP420.h.

Definition at line 60 of file HitDigitizerFP420.h.

Definition at line 58 of file HitDigitizerFP420.h.

Definition at line 64 of file HitDigitizerFP420.h.

Definition at line 54 of file HitDigitizerFP420.h.

Definition at line 62 of file HitDigitizerFP420.h.

Definition at line 70 of file HitDigitizerFP420.h.

Definition at line 61 of file HitDigitizerFP420.h.

Definition at line 50 of file HitDigitizerFP420.h.

Referenced by setChargeDivider().

Definition at line 51 of file HitDigitizerFP420.h.

Referenced by setChargeCollectionDrifter().

Definition at line 52 of file HitDigitizerFP420.h.

Referenced by setInduceChargeOnElectrods().