- Timestamp:
- Feb 22, 2011, 5:41:33 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
allpix/src/AllPixFEI3StandardDigitizer.cc
r39 r69 28 28 29 29 30 30 //G4UnitDefinition ( name, symbol, category, value ) 31 31 32 32 //// Unit for charge in FEI3 … … 38 38 AllPixGeoDsc * gD = GetDetectorGeoDscPtr(); 39 39 40 m_digitIn.thl = 0; 40 41 42 m_digitIn.thl = 3500*elec; 41 43 42 44 /////////////////////////////////////////////////////// … … 47 49 //detectorThickness = 285*um; 48 50 49 electricField = biasVoltage/detectorThickness; // V/um 50 diffusionCoeff = 36.0*cm2/s; // [cm2/s] 51 chargeSharingConstant = 0.05; 51 electricFieldY = biasVoltage/detectorThickness; // V/um 52 electricFieldX = 0; // V/um 53 electricFieldZ = 0; // V/um 54 55 56 chargeSharingConstant = 0.02; 52 57 fluence = 1e1/cm2; 53 58 Beta_electrons = 5e-16*cm2/ns; … … 57 62 // Geometry Related constants 58 63 pitchX = gD->GetPixelX(); 59 60 61 64 pitchY = gD->GetPixelY(); 65 nPixX= gD->GetNPixelsX(); 66 nPixY= gD->GetNPixelsY(); 62 67 63 68 // pitchX = gD->GetSensorX(); 64 69 // pitchY = gD->GetSensorY(); 65 70 // nPixX= 18; 66 71 //nPixY= 164; 67 72 /////////////////////////////////////////////////////// 73 74 // Silicon electron and hole transport constants 75 76 Temperature = 300.; 77 78 79 Default_Electron_Mobility=1400.0*cm2/s; // Electron mobility (cm2/Vs) 80 Default_Hole_Mobility=450.0*cm2/s;// Hole mobility (cm2/Vs 81 82 Default_Electron_D=36*cm2/s; // Electron mobility (cm2/s) 83 Default_Hole_D=12*cm2/s;// Hole mobility (cm2/s 84 85 //mobility dependence on electric field 86 Electron_AlphaField = 2.4e7*cm/s ; //[um/ns] 87 Electron_ThetaField = 0.8; 88 Electron_TempNominal = 600.0 ; // [K] 89 90 Electron_Beta = 2.0; 91 Electron_Saturation_Velocity = Electron_AlphaField*TMath::Power(1.0+Electron_ThetaField*TMath::Exp(Temperature/Electron_TempNominal),-1.0); 92 93 Hole_AlphaField = 2.4e7*cm/s ; //[um/ns] 94 Hole_ThetaField = 0.8; 95 Hole_TempNominal = 600.0 ; // [K] 96 97 Hole_Beta = 1.0 ; 98 Hole_Saturation_Velocity = Hole_AlphaField*TMath::Power(1.0+Hole_ThetaField*TMath::Exp(Temperature/Hole_TempNominal),-1.0); 99 100 68 101 // physics switches 69 102 doTrapping =false; 103 104 //Numerical integration accuray 105 Target = 1e-4 ; 106 tlow = 0.001*ns; 107 tup= 0.1*ns; 108 dtIni = 0.01*ns; 70 109 71 110 … … 90 129 } 91 130 131 132 vector<G4double> AllPixFEI3StandardDigitizer::ComputeDriftTimeFullField(G4double x, G4double y, G4double z) 133 { 134 G4double driftTime=0; 135 G4double dt=dtIni; 136 G4double xtemp=x; 137 G4double ytemp=y; 138 G4double ztemp=z; 139 140 vector<G4double> step; 141 142 while(z>0 && z<detectorThickness){ 143 144 driftTime+=dt; 145 step=RKF5Integration(x,y,z,dt); 146 xtemp+=step[0]; 147 ytemp+=step[1]; 148 ztemp+=step[2]; 149 SetDt(dt,step[3]); 150 } 151 152 vector<G4double> output; 153 output[0]=xtemp; 154 output[1]=ytemp; 155 output[2]=ztemp; 156 output[3]=driftTime; 157 return output; 158 159 } 160 161 162 void AllPixFEI3StandardDigitizer::ComputeElectricField(G4double x, G4double y, G4double z){} 163 164 165 G4double AllPixFEI3StandardDigitizer::GetElectricFieldNorm(G4double x, G4double y, G4double z){ 166 167 return TMath::Sqrt(electricFieldX*electricFieldX +electricFieldY*electricFieldY +electricFieldZ*electricFieldZ ); 168 } 169 170 G4double AllPixFEI3StandardDigitizer::MobilityElectron(G4double x, G4double y, G4double z){ 171 172 ComputeElectricField(x,y,z); 173 G4double parElectricField = GetElectricFieldNorm(x,y,z); 174 G4double mobilite = Default_Electron_Mobility* 175 TMath::Power((1.0/(1.+ TMath::Power((Default_Electron_Mobility*parElectricField)/ 176 Electron_Saturation_Velocity,Electron_Beta))),1.0/Electron_Beta); 177 return mobilite; 178 //cout << mobilite << " " << parElectricField << endl; 179 180 } 181 182 183 G4double AllPixFEI3StandardDigitizer::MobilityHole(G4double x, G4double y, G4double z){ 184 185 ComputeElectricField(x,y,z); 186 G4double parElectricField = GetElectricFieldNorm(x,y,z); 187 G4double mobilite = Default_Hole_Mobility* 188 TMath::Power((1.0/(1.+ TMath::Power((Default_Hole_Mobility*parElectricField)/ 189 Hole_Saturation_Velocity,Hole_Beta))),1.0/Hole_Beta); 190 return mobilite; 191 192 193 } 194 195 92 196 G4double AllPixFEI3StandardDigitizer::ComputeDriftTimeUniformField(AllPixTrackerHit *a_hit) 93 197 { … … 95 199 //G4cout << "Hit position with respect to pixel (um) "<< (a_hit->GetPosWithRespectToPixel().z() + detectorThickness/2.0)/um <<endl; 96 200 //return (a_hit->GetPosWithRespectToPixel().z() + detectorThickness/2.0 ) /(mobility*electricField); 97 return ( detectorThickness) /(mobility*electricField );201 return ( detectorThickness) /(mobility*electricFieldY); 98 202 99 203 } … … 101 205 G4double AllPixFEI3StandardDigitizer::ComputeDiffusionRMS(G4double tDrift) 102 206 { 103 return TMath::Sqrt(2.* diffusionCoeff*tDrift);207 return TMath::Sqrt(2.*Default_Electron_D*tDrift); 104 208 105 209 } … … 155 259 tempPixel.second = (*hitsCollection)[itr]->GetPixelNbY(); 156 260 261 /* 157 262 //G4cout << "[Digitizer] New Hit" << endl; 158 263 // post position of the hit … … 160 265 //double postPosY = (*hitsCollection)[itr]->GetPostPixelNbY(); 161 266 //Fix FANO Factor !! 162 G4double eHitTruth=(*hitsCollection)[itr]->GetEdep(); 267 //G4double eHitTruth=(*hitsCollection)[itr]->GetEdep(); 268 */ 269 270 163 271 G4double eHit = elec*CLHEP::RandGauss::shoot((*hitsCollection)[itr]->GetEdep()/elec,TMath::Sqrt((*hitsCollection)[itr]->GetEdep()/elec)*0.118); 164 165 //pixelsContent[tempPixel] += eHit;166 167 ///168 169 G4double driftTime = ComputeDriftTimeUniformField((*hitsCollection)[itr]);170 G4double sigma = ComputeDiffusionRMS(driftTime);171 //G4cout << "Sigma : " << sigma/um << G4endl;172 //G4cout << "Tdrift : " << driftTime/s << G4endl;173 //G4cout << TString::Format("Sigma = %f, Drift time = %f",sigma/um,driftTime/ns) << endl;174 // Let's visit all neighbours175 //int x = tempPixel.first;176 //int y = tempPixel.second;177 178 272 G4double xpos = (*hitsCollection)[itr]->GetPosWithRespectToPixel().x(); 179 273 G4double ypos = (*hitsCollection)[itr]->GetPosWithRespectToPixel().y(); 274 G4double zpos = (*hitsCollection)[itr]->GetPosWithRespectToPixel().z(); 275 G4double sigma; 276 G4double driftTime; 277 if(doFullField==false){ 278 driftTime = ComputeDriftTimeUniformField((*hitsCollection)[itr]); 279 sigma = ComputeDiffusionRMS(driftTime); 280 } 281 else{ 282 vector<G4double> data = ComputeDriftTimeFullField(xpos,ypos,zpos); 283 driftTime = data[3]; 284 sigma = ComputeDiffusionRMS(driftTime); 285 xpos=data[0]; 286 ypos=data[1]; 287 288 } 180 289 181 290 // see if need more energy in neighbor … … 184 293 185 294 //loop over all hit pixel neighbors 186 G4cout << TString::Format("[MC Truth] Hit Energy=%f, x=%f, y=%f pixel(%i,%i)",eHitTruth/elec,xpos/um,ypos/um,tempPixel.first,tempPixel.second) << endl;295 //G4cout << TString::Format("[MC Truth] Hit Energy=%f, x=%f, y=%f pixel(%i,%i)",eHitTruth/elec,xpos/um,ypos/um,tempPixel.first,tempPixel.second) << endl; 187 296 //if(fabs(xpos)>=pitchX/2.-10*sigma && fabs(ypos)>pitchY/2.0-10*sigma){ 188 if(fabs(ypos) >=pitchY/2.- 3*sigma){189 if( (fabs(xpos) >= pitchX/2.- 3*sigma || fabs(ypos) >=pitchY/2.-3*sigma) ){297 if(fabs(ypos) >=pitchY/2.-2*sigma){ 298 if( (fabs(xpos) >= pitchX/2.-2*sigma || fabs(ypos) >=pitchY/2.-2*sigma) ){ 190 299 // G4cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*****!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" <<endl ; 191 300 for(int i=-1;i<=1;i++){ … … 197 306 { 198 307 //We compute contribution of the hit to each pixels 199 double Etemp = IntegrateGaussian(xpos/nm,ypos/nm,sigma/nm,(-pitchX/2.0 + i*pitchX)/nm,(-pitchX/2.+(i+1)*pitchX)/nm,(-pitchY/2 + j*pitchY)/nm,(-pitchY/2 + (j+1)*pitchY)/nm, eHit ); 308 309 double Etemp = IntegrateGaussian(xpos/nm,ypos/nm,sigma/nm,(-pitchX/2.0 + i*pitchX)/nm,(-pitchX/2.+(i+1)*pitchX)/nm,(-pitchY/2 + j*pitchY)/nm,(-pitchY/2 + (j+1)*pitchY)/nm, eHit ); 200 310 if(doTrapping==true) pixelsContent[extraPixel]+=ApplyTrapping(driftTime,Etemp); 201 311 else pixelsContent[extraPixel] +=Etemp; 202 312 203 G4cout << TString::Format("[Digitizer] Pixel %i %i Energy=%f, Energy after Trapping=%f",extraPixel.first,extraPixel.second,pixelsContent[extraPixel]/elec,ApplyTrapping(driftTime,pixelsContent[extraPixel])/elec) << endl;204 //cout << TString::Format("Pixel %i %i, Energy collected = %f",extraPixel.first,extraPixel.second,Etemp) << endl;313 //G4cout << TString::Format("[Digitizer] Pixel %i %i Energy=%f, Energy after Trapping=%f",extraPixel.first,extraPixel.second,pixelsContent[extraPixel]/elec,ApplyTrapping(driftTime,pixelsContent[extraPixel])/elec) << endl; 314 cout << TString::Format("Pixel %i %i, Energy collected = %f",extraPixel.first,extraPixel.second,Etemp/keV) << endl; 205 315 206 316 }; … … 212 322 if(doTrapping==true)pixelsContent[extraPixel] +=ApplyTrapping(driftTime,pixelsContent[tempPixel]); 213 323 else pixelsContent[extraPixel] +=eHit; 214 G4cout << TString::Format("[Digitizer] Pixel %i %i Energy=%f, Energy after Trapping=%f",extraPixel.first,extraPixel.second,pixelsContent[extraPixel]/elec,ApplyTrapping(driftTime,pixelsContent[extraPixel])/elec) << endl;324 //G4cout << TString::Format("[Digitizer] Pixel %i %i Energy=%f, Energy after Trapping=%f",extraPixel.first,extraPixel.second,pixelsContent[extraPixel]/elec,ApplyTrapping(driftTime,pixelsContent[extraPixel])/elec) << endl; 215 325 216 326 }; … … 296 406 // If the charge in a given pixel is over the threshold 297 407 double threshold =CLHEP::RandGauss::shoot(m_digitIn.thl,chipNoise); 408 cout << TString::Format("Threshold= %f", threshold/keV) << endl; 409 //if((*pCItr).second > m_digitIn.thl) 298 410 if((*pCItr).second > threshold) 299 411 { … … 328 440 329 441 } 442 443 444 445 446 447 vector<G4double> AllPixFEI3StandardDigitizer::RKF5Integration(G4double x, G4double y, G4double z,G4double dt) 448 { 449 // This function transport using Euler integration, for field (Ex,Ey,Ez), 450 // considered constant over time dt. The movement equation are those 451 // of charges in semi-conductors, sx= mu*E*dt;; 452 double k1x,k2x,k3x,k4x,k5x,k6x; 453 double k1y,k2y,k3y,k4y,k5y,k6y; 454 double k1z,k2z,k3z,k4z,k5z,k6z; 455 double dx,dy,dz; 456 457 ComputeElectricField(x,y,z); 458 459 k1x=-MobilityElectron(x,y,z)*electricFieldX*dt; 460 k1y=-MobilityElectron(x,y,z)*electricFieldY*dt; 461 k1z=-MobilityElectron(x,y,z)*electricFieldZ*dt; 462 463 ComputeElectricField(x+k1x/4,y+k1y/4,z+k1z/4); 464 465 k2x=-MobilityElectron(x+k1x/4,y+k1y/4,z+k1z/4)*electricFieldX*dt; 466 k2y=-MobilityElectron(x+k1x/4,y+k1y/4,z+k1z/4)*electricFieldY*dt; 467 k2z=-MobilityElectron(x+k1x/4,y+k1y/4,z+k1z/4)*electricFieldZ*dt; 468 469 ComputeElectricField(x+(9./32)*k2x+(3./32)*k1x,y+(9./32)*k2y+(3./32)*k1y,z+(9./32)*k2z+(3./32)*k1z); 470 471 k3x=-MobilityElectron(x+(9./32)*k2x+(3./32)*k1x,y+(9./32)*k2y+(3./32)*k1y,z+(9./32)*k2z+(3./32)*k1z)*electricFieldX*dt; 472 k3y=-MobilityElectron(x+(9./32)*k2x+(3./32)*k1x,y+(9./32)*k2y+(3./32)*k1y,z+(9./32)*k2z+(3./32)*k1z)*electricFieldY*dt; 473 k3z=-MobilityElectron(x+(9./32)*k2x+(3./32)*k1x,y+(9./32)*k2y+(3./32)*k1y,z+(9./32)*k2z+(3./32)*k1z)*electricFieldZ*dt; 474 475 ComputeElectricField(x-(7200./2197)*k2x+(1932./2197)*k1x+(7296./2197)*k3x,y-(7200./2197)*k2y+(1932./2197)*k1y+(7296./2197)*k3y,z-(7200./2197)*k2z+(1932./2197)*k1z+(7296./2197)*k3z); 476 477 k4x=-MobilityElectron(x-(7200./2197)*k2x+(1932./2197)*k1x+(7296./2197)*k3x,y-(7200./2197)*k2y+(1932./2197)*k1y+(7296./2197)*k3y,z-(7200./2197)*k2z+(1932./2197)*k1z+(7296./2197)*k3z)*electricFieldX*dt; 478 k4y=-MobilityElectron(x-(7200./2197)*k2x+(1932./2197)*k1x+(7296./2197)*k3x,y-(7200./2197)*k2y+(1932./2197)*k1y+(7296./2197)*k3y,z-(7200./2197)*k2z+(1932./2197)*k1z+(7296./2197)*k3z)*electricFieldY*dt; 479 k4z=-MobilityElectron(x-(7200./2197)*k2x+(1932./2197)*k1x+(7296./2197)*k3x,y-(7200./2197)*k2y+(1932./2197)*k1y+(7296./2197)*k3y,z-(7200./2197)*k2z+(1932./2197)*k1z+(7296./2197)*k3z)*electricFieldZ*dt; 480 481 ComputeElectricField(x-(8)*k2x+(439./216)*k1x+(3680./513)*k3x-(845./4104)*k4x,y-(8)*k2y+(439./216)*k1y+(3680./513)*k3y-(845./4104)*k4y,z-(8)*k2z+(439./216)*k1z+(3680./513)*k3z-(845./4104)*k4z); 482 483 k5x=-MobilityElectron(x-(8)*k2x+(439./216)*k1x+(3680./513)*k3x-(845./4104)*k4x,y-(8)*k2y+(439./216)*k1y+(3680./513)*k3y-(845./4104)*k4y,z-(8)*k2z+(439./216)*k1z+(3680./513)*k3z-(845./4104)*k4z)*electricFieldX*dt; 484 k5y=-MobilityElectron(x-(8)*k2x+(439./216)*k1x+(3680./513)*k3x-(845./4104)*k4x,y-(8)*k2y+(439./216)*k1y+(3680./513)*k3y-(845./4104)*k4y,z-(8)*k2z+(439./216)*k1z+(3680./513)*k3z-(845./4104)*k4z)*electricFieldY*dt; 485 k5z=-MobilityElectron(x-(8)*k2x+(439./216)*k1x+(3680./513)*k3x-(845./4104)*k4x,y-(8)*k2y+(439./216)*k1y+(3680./513)*k3y-(845./4104)*k4y,z-(8)*k2z+(439./216)*k1z+(3680./513)*k3z-(845./4104)*k4z)*electricFieldZ*dt; 486 487 ComputeElectricField(x+(2)*k2x-(8./27)*k1x-(3544./2565)*k3x-(1859./4104)*k4x-(11./40)*k5x, 488 y+(2)*k2y-(8./27)*k1y-(3544./2565)*k3y-(1859./4104)*k4y-(11./40)*k5y, 489 z+(2)*k2z-(8./27)*k1z-(3544./2565)*k3z-(1859./4104)*k4z-(11./40)*k5z); 490 491 k6x=-MobilityElectron(x+(2)*k2x-(8./27)*k1x-(3544./2565)*k3x-(1859./4104)*k4x-(11./40)*k5x, 492 y+(2)*k2y-(8./27)*k1y-(3544./2565)*k3y-(1859./4104)*k4y-(11./40)*k5y, 493 z+(2)*k2z-(8./27)*k1z-(3544./2565)*k3z-(1859./4104)*k4z-(11./40)*k5z)*electricFieldX*dt; 494 k6y=-MobilityElectron(x+(2)*k2x-(8./27)*k1x-(3544./2565)*k3x-(1859./4104)*k4x-(11./40)*k5x, 495 y+(2)*k2y-(8./27)*k1y-(3544./2565)*k3y-(1859./4104)*k4y-(11./40)*k5y, 496 z+(2)*k2z-(8./27)*k1z-(3544./2565)*k3z-(1859./4104)*k4z-(11./40)*k5z)*electricFieldY*dt; 497 k6z=-MobilityElectron(x+(2)*k2x-(8./27)*k1x-(3544./2565)*k3x-(1859./4104)*k4x-(11./40)*k5x, 498 y+(2)*k2y-(8./27)*k1y-(3544./2565)*k3y-(1859./4104)*k4y-(11./40)*k5y, 499 z+(2)*k2z-(8./27)*k1z-(3544./2565)*k3z-(1859./4104)*k4z-(11./40)*k5z)*electricFieldZ*dt; 500 501 dx=((16./135)*k1x+(6656./12825)*k3x+(28561./56430)*k4x-(9./50)*k5x+(2./55)*k6x); 502 dy=((16./135)*k1y+(6656./12825)*k3y+(28561./56430)*k4y-(9./50)*k5y+(2./55)*k6y); 503 dz=((16./135)*k1z+(6656./12825)*k3z+(28561./56430)*k4z-(9./50)*k5z+(2./55)*k6z); 504 505 double Ex,Ey,Ez,Erreur; 506 Ex=((1./360)*k1x-(128./4275)*k3x-(2197./75240)*k4x-(1./50)*k5x+(2./55)*k6x); 507 Ey=((1./360)*k1y-(128./4275)*k3y-(2197./75240)*k4y-(1./50)*k5y+(2./55)*k6y); 508 Ez=((1./360)*k1z-(128./4275)*k3z-(2197./75240)*k4z-(1./50)*k5z+(2./55)*k6z); 509 Erreur=sqrt(Ex*Ex+Ey*Ey+Ez*Ez); 510 511 vector<G4double> newpoint; 512 newpoint[0]=(dx); 513 newpoint[1]=(dy); 514 newpoint[2]=(dz); 515 newpoint[3]=(Erreur); 516 517 return newpoint; 518 519 } 520 521 522 523 524 //______________________________________________________________________________ 525 G4double AllPixFEI3StandardDigitizer::SetDt(G4double Dt, G4double ErreurMoy) 526 { 527 528 if(isnan(ErreurMoy)){Dt=tup;} 529 else if(ErreurMoy > Target){ Dt*=0.9;} 530 else if(ErreurMoy < Target){ Dt*=1.1;}; 531 532 533 if(Dt<tlow) Dt=tlow; 534 if(Dt>tup) Dt=tup; 535 536 return Dt; 537 538 } 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
Note: See TracChangeset
for help on using the changeset viewer.