Changeset 69 in Idarraga for allpix


Ignore:
Timestamp:
Feb 22, 2011, 5:41:33 PM (13 years ago)
Author:
benoit
Message:

Fixed Threshold value in FEI3 Digitizer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • allpix/src/AllPixFEI3StandardDigitizer.cc

    r39 r69  
    2828
    2929
    30     //G4UnitDefinition ( name, symbol, category, value )
     30        //G4UnitDefinition ( name, symbol, category, value )
    3131
    3232        //// Unit for charge in FEI3
     
    3838        AllPixGeoDsc * gD = GetDetectorGeoDscPtr();
    3939
    40         m_digitIn.thl = 0;
     40
     41
     42        m_digitIn.thl = 3500*elec;
    4143
    4244        ///////////////////////////////////////////////////////
     
    4749        //detectorThickness = 285*um;
    4850
    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;
    5257        fluence = 1e1/cm2;
    5358        Beta_electrons = 5e-16*cm2/ns;
     
    5762        // Geometry Related constants
    5863        pitchX = gD->GetPixelX();
    59         pitchY = gD->GetPixelY();
    60         nPixX= gD->GetNPixelsX();
    61         nPixY= gD->GetNPixelsY();
     64        pitchY = gD->GetPixelY();
     65        nPixX= gD->GetNPixelsX();
     66        nPixY= gD->GetNPixelsY();
    6267
    6368        //      pitchX = gD->GetSensorX();
    6469        //      pitchY = gD->GetSensorY();
    6570        //      nPixX= 18;
    66         //nPixY= 164;
     71        //nPixY= 164;
    6772        ///////////////////////////////////////////////////////
     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
    68101        // physics switches
    69102        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;
    70109
    71110
     
    90129}
    91130
     131
     132vector<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
     162void AllPixFEI3StandardDigitizer::ComputeElectricField(G4double x, G4double y, G4double z){}
     163
     164
     165G4double AllPixFEI3StandardDigitizer::GetElectricFieldNorm(G4double x, G4double y, G4double z){
     166
     167        return TMath::Sqrt(electricFieldX*electricFieldX +electricFieldY*electricFieldY +electricFieldZ*electricFieldZ );
     168}
     169
     170G4double  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
     183G4double 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
    92196G4double AllPixFEI3StandardDigitizer::ComputeDriftTimeUniformField(AllPixTrackerHit *a_hit)
    93197{
     
    95199        //G4cout << "Hit position with respect to pixel (um) "<< (a_hit->GetPosWithRespectToPixel().z() + detectorThickness/2.0)/um  <<endl;
    96200        //return (a_hit->GetPosWithRespectToPixel().z() + detectorThickness/2.0 ) /(mobility*electricField);
    97         return ( detectorThickness) /(mobility*electricField);
     201        return ( detectorThickness) /(mobility*electricFieldY);
    98202
    99203}
     
    101205G4double AllPixFEI3StandardDigitizer::ComputeDiffusionRMS(G4double tDrift)
    102206{
    103         return TMath::Sqrt(2.*diffusionCoeff*tDrift);
     207        return TMath::Sqrt(2.*Default_Electron_D*tDrift);
    104208
    105209}
     
    155259                tempPixel.second = (*hitsCollection)[itr]->GetPixelNbY();
    156260
     261/*
    157262                //G4cout << "[Digitizer] New Hit" << endl;
    158263                // post position of the hit
     
    160265                //double postPosY = (*hitsCollection)[itr]->GetPostPixelNbY();
    161266                //Fix FANO Factor !!
    162                 G4double eHitTruth=(*hitsCollection)[itr]->GetEdep();
     267                //G4double eHitTruth=(*hitsCollection)[itr]->GetEdep();
     268*/
     269
     270
    163271                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 neighbours
    175                 //int x = tempPixel.first;
    176                 //int y = tempPixel.second;
    177 
    178272                G4double xpos = (*hitsCollection)[itr]->GetPosWithRespectToPixel().x();
    179273                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                }
    180289
    181290                // see if need more energy in neighbor
     
    184293
    185294                //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;
    187296                //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) ){
    190299                  // G4cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*****!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" <<endl ;
    191300                  for(int i=-1;i<=1;i++){
     
    197306                                        {
    198307                                        //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 );
    200310                                        if(doTrapping==true) pixelsContent[extraPixel]+=ApplyTrapping(driftTime,Etemp);
    201311                                        else pixelsContent[extraPixel] +=Etemp;
    202312
    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;
    205315
    206316                                        };
     
    212322                  if(doTrapping==true)pixelsContent[extraPixel] +=ApplyTrapping(driftTime,pixelsContent[tempPixel]);
    213323                  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;
    215325
    216326                };
     
    296406                // If the charge in a given pixel is over the threshold
    297407                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)
    298410                if((*pCItr).second > threshold)
    299411                {
     
    328440
    329441}
     442
     443
     444
     445
     446
     447vector<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//______________________________________________________________________________
     525G4double  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.