From aebba72103acc1b3d23ef57cf16b98c097005d1a Mon Sep 17 00:00:00 2001 From: prino Date: Fri, 5 Dec 2008 17:34:52 +0000 Subject: [PATCH] ADC scale for SDD in simulation calibrated on real cosmic data (F. Prino) --- ITS/AliITSClusterFinderV2SDD.cxx | 1 + ITS/AliITSSimuParam.cxx | 2 +- ITS/AliITSresponseSDD.cxx | 2 +- ITS/AliITSsimulationSDD.cxx | 83 ++++++++------------ ITS/Calib/RespSDD/Run0_999999999_v0_s0.root | Bin 2456 -> 2501 bytes 5 files changed, 34 insertions(+), 54 deletions(-) diff --git a/ITS/AliITSClusterFinderV2SDD.cxx b/ITS/AliITSClusterFinderV2SDD.cxx index 2aa8e9ed935..84fcb9635cc 100644 --- a/ITS/AliITSClusterFinderV2SDD.cxx +++ b/ITS/AliITSClusterFinderV2SDD.cxx @@ -241,6 +241,7 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, z=trk[2]; q/=rsdd->GetADC2keV(); //to have MPV 1 MIP = 86.4 KeV + if(cal-> IsAMAt20MHz()) q*=2.; // account for 1/2 sampling freq. Float_t hit[5] = {y, z, 0.0030*0.0030, 0.0020*0.0020, q}; Int_t info[3] = {maxj-minj+1, maxi-mini+1, fNlayer[fModule]}; if (digits) { diff --git a/ITS/AliITSSimuParam.cxx b/ITS/AliITSSimuParam.cxx index ac63cdfaca4..91b72f431c1 100644 --- a/ITS/AliITSSimuParam.cxx +++ b/ITS/AliITSSimuParam.cxx @@ -36,7 +36,7 @@ const Float_t AliITSSimuParam::fgkSPDEccDiffDefault = 0.85; const Float_t AliITSSimuParam::fgkSDDDiffCoeffDefault = 3.23; const Float_t AliITSSimuParam::fgkSDDDiffCoeff1Default = 30.; const Float_t AliITSSimuParam::fgkSDDJitterErrorDefault = 20.; // 20 um from beam test 2001 -const Float_t AliITSSimuParam::fgkSDDDynamicRangeDefault = 132.; +const Float_t AliITSSimuParam::fgkSDDDynamicRangeDefault = 1400./2.5; // mV/MOhm = nA const Int_t AliITSSimuParam::fgkSDDMaxAdcDefault = 1024; const Float_t AliITSSimuParam::fgkSDDChargeLossDefault = 0.; const Double_t AliITSSimuParam::fgkSSDCouplingPRDefault = 0.01; diff --git a/ITS/AliITSresponseSDD.cxx b/ITS/AliITSresponseSDD.cxx index 883b5e37572..bf0b41c6f8a 100644 --- a/ITS/AliITSresponseSDD.cxx +++ b/ITS/AliITSresponseSDD.cxx @@ -30,7 +30,7 @@ #include const Float_t AliITSresponseSDD::fgkTimeOffsetDefault = 54.30; -const Float_t AliITSresponseSDD::fgkADC2keVDefault = 5.243; +const Float_t AliITSresponseSDD::fgkADC2keVDefault = 3.25; const Float_t AliITSresponseSDD::fgkCarlosRXClockPeriod = 25.; ClassImp(AliITSresponseSDD) diff --git a/ITS/AliITSsimulationSDD.cxx b/ITS/AliITSsimulationSDD.cxx index 469fb983105..7063792464c 100644 --- a/ITS/AliITSsimulationSDD.cxx +++ b/ITS/AliITSsimulationSDD.cxx @@ -384,7 +384,6 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) { AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1); AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule); AliITSSimuParam* simpar = fDetType->GetSimuParam(); - TObjArray *hits = mod->GetHits(); Int_t nhits = hits->GetEntriesFast(); @@ -395,7 +394,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) { Double_t anodePitch = seg->Dpz(0); Double_t timeStep = seg->Dpx(0); Double_t driftSpeed ; // drift velocity (anode dependent) - Double_t norm = simpar->GetSDDMaxAdc()/simpar->GetSDDDynamicRange(); // maxadc/topValue; + Double_t nanoampToADC = simpar->GetSDDMaxAdc()/simpar->GetSDDDynamicRange(); // maxadc/topValue; Double_t cHloss = simpar->GetSDDChargeLoss(); Float_t dfCoeff, s1; simpar->GetSDDDiffCoeff(dfCoeff,s1); // Signal 2d Shape @@ -420,15 +419,14 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) { Int_t timeWindow; // time direction charge integration width Int_t jamin,jamax; // anode charge integration window Int_t jtmin,jtmax; // time charge integration window - Int_t ndiv; // Anode window division factor. - Int_t nsplit; // the number of splits in anode and time windows==1. + Int_t nsplitAn; // the number of splits in anode and time windows + Int_t nsplitTb; // the number of splits in anode and time windows Int_t nOfSplits; // number of times track length is split into Float_t nOfSplitsF; // Floating point version of nOfSplits. Float_t kkF; // Floating point version of loop index kk. Double_t pathInSDD; // Track length in SDD. Double_t drPath; // average position of track in detector. in microns Double_t drTime; // Drift time - Double_t nmul; // drift time window multiplication factor. Double_t avDrft; // x position of path length segment in cm. Double_t avAnode; // Anode for path length segment in Anode number (float) Double_t zAnode; // Floating point anode number. @@ -537,80 +535,57 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) { sigT = sigA/driftSpeed; // Peak amplitude in nanoAmpere amplitude = fScaleSize*160.*depEnergy/ - (timeStep*eVpairs*2.*acos(-1.)*sigT*sigA); - //amplitude *= timeStep/25.; // WARNING!!!!! Amplitude scaling to - // account for clock variations - // (reference value: 40 MHz) + (timeStep*eVpairs*2.*acos(-1.)); chargeloss = 1.-cHloss*driftPath/1000.; amplitude *= chargeloss; width = 2.*nsigma/(nlookups-1); // Spread the charge - // Pixel index - ndiv = 2; - nmul = 3.; - if(drTime > 1200.) { - ndiv = 4; - nmul = 1.5; - } // end if drTime > 1200. - // Sub-pixel index - nsplit = 4; // hard-wired //nsplit=4;nsplit = (nsplit+1)/2*2; - // Sub-pixel size see computation of aExpo and tExpo. - aStep = anodePitch/(nsplit*fScaleSize*sigA); + nsplitAn = 4; + nsplitTb=4; + aStep = anodePitch/(nsplitAn*sigA); aConst = zAnode*anodePitch/sigA; - tStep = timeStep/(nsplit*fScaleSize*sigT); + tStep = timeStep/(nsplitTb*fScaleSize*sigT); tConst = drTime/sigT; // Define SDD window corresponding to the hit - anodeWindow = (Int_t)(fScaleSize*nsigma*sigA/anodePitch+1); + anodeWindow = (Int_t)(nsigma*sigA/anodePitch+1); timeWindow = (Int_t) (fScaleSize*nsigma*sigT/timeStep+1.); - jamin = (iAnode - anodeWindow/ndiv - 2)*fScaleSize*nsplit +1; - jamax = (iAnode + anodeWindow/ndiv + 1)*fScaleSize*nsplit; + jamin = (iAnode - anodeWindow - 2)*nsplitAn+1; + jamax = (iAnode + anodeWindow + 2)*nsplitAn; if(jamin <= 0) jamin = 1; - if(jamax > fScaleSize*nofAnodes*nsplit) - jamax = fScaleSize*nofAnodes*nsplit; + if(jamax > nofAnodes*nsplitAn) + jamax = nofAnodes*nsplitAn; // jtmin and jtmax are Hard-wired - jtmin = (Int_t)(timeSample-timeWindow*nmul-1)*nsplit+1; - jtmax = (Int_t)(timeSample+timeWindow*nmul)*nsplit; + jtmin = (Int_t)(timeSample-timeWindow-2)*nsplitTb+1; + jtmax = (Int_t)(timeSample+timeWindow+2)*nsplitTb; if(jtmin <= 0) jtmin = 1; - if(jtmax > fScaleSize*fMaxNofSamples*nsplit) - jtmax = fScaleSize*fMaxNofSamples*nsplit; + if(jtmax > fScaleSize*fMaxNofSamples*nsplitTb) + jtmax = fScaleSize*fMaxNofSamples*nsplitTb; // Spread the charge in the anode-time window - for(ka=jamin; ka <=jamax; ka++) { - ia = (ka-1)/(fScaleSize*nsplit) + 1; - if(ia <= 0) { - Warning("HitsToAnalogDigits","ia < 1: "); - continue; - } // end if + for(ka=jamin; ka <=jamax; ka++) { + ia = (ka-1)/nsplitAn + 1; + if(ia <= 0) ia=1; if(ia > nofAnodes) ia = nofAnodes; aExpo = (aStep*(ka-0.5)-aConst); if(TMath::Abs(aExpo) > nsigma) anodeAmplitude = 0.; else { Int_t theBin = (Int_t) ((aExpo+nsigma)/width+0.5); anodeAmplitude = amplitude*simpar->GetGausLookUp(theBin); - } // end if TMath::Abs(aEspo) > nsigma + } // index starts from 0 index = iWing*nofAnodes+ia-1; if(anodeAmplitude){ for(kt=jtmin; kt<=jtmax; kt++) { - it = (kt-1)/nsplit+1; // it starts from 1 - if(it<=0){ - Warning("HitsToAnalogDigits","it < 1:"); - continue; - } // end if + it = (kt-1)/nsplitTb+1; // it starts from 1 + if(it<=0) it=1; if(it>fScaleSize*fMaxNofSamples) it = fScaleSize*fMaxNofSamples; tExpo = (tStep*(kt-0.5)-tConst); if(TMath::Abs(tExpo) > nsigma) timeAmplitude = 0.; else { Int_t theBin = (Int_t) ((tExpo+nsigma)/width+0.5); - timeAmplitude = anodeAmplitude*simpar->GetGausLookUp(theBin); - } // end if TMath::Abs(tExpo) > nsigma - // build the list of Sdigits for this module - // arg[0] = index; - // arg[1] = it; - // arg[2] = itrack; // track number - // arg[3] = ii-1; // hit number. - timeAmplitude *= norm; - timeAmplitude *= 10; + timeAmplitude = anodeAmplitude*simpar->GetGausLookUp(theBin)*aStep*tStep; + } + timeAmplitude *= nanoampToADC; // ListOfFiredCells(arg,timeAmplitude,alst,padr); Double_t charge = timeAmplitude; charge += fHitMap2->GetSignal(index,it-1); @@ -682,6 +657,10 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd Int_t i,k,kk; AliITSSimuParam* simpar = fDetType->GetSimuParam(); Float_t maxadc = simpar->GetSDDMaxAdc(); + Int_t nGroup=fScaleSize; + if(res->IsAMAt20MHz()){ + nGroup=fScaleSize/2; + } for (i=0;i maxcont1) maxcont1 = newcont1; } // end for kk diff --git a/ITS/Calib/RespSDD/Run0_999999999_v0_s0.root b/ITS/Calib/RespSDD/Run0_999999999_v0_s0.root index bd71133761ac73f8675055e55f8cea8b26d9ce64..397d96f0d046149a6f6fd802906b3ba004d49483 100644 GIT binary patch delta 664 zcmbOsd{o%JC_lf1f#Gy30|P?}0|Vz#AhrgwyMUMxh##;(7)+fE46MHy7#Gez>2>IV z;N1pBMn;DEeeWkas`>#{$}oV`%`xX@J#1MPkQ#9&7-FmSYB zIvgmA1Qo*2@fU#k69isx{*~#-6UF%sIyad`zt_Zarqzzg%^3m-=e%{x6B14|PYXS#=eKXA zYNuYOYNx{5hX!jGGFsRH_(Go z>M_HW69-gyOxQVQIHol*GECTSF9(hZpmPOk!OnF6IhUz(a~IPKR`2cLh%g6BfFlCv rcVIY>84;Gk*uzB@80Www0(1id7s4uV!XeixV@{wiIFFW_PGJB5)fT}s delta 621 zcmX>qJVV&NC_lf1f#Gy30|P?}0|Vy_AeI8M>wuUMh)=LU7)(G#tiKr;|0ix%+nO$T zw}H{x>FmLM?TMt*LpenC-YUcP=} zPG)kdez1#+zB7=SRFqhfnV&bglha6vC}qZhtRPFk7BMia2HJ4~h{2XIFmU8!IuPUx z1YqO=Ih0i&tlt>qP{xeOa-6a(Q9c|OCU0kSt=F;NcBrvYk$0<0qJh&hZl=?swa<^t zIivDdA>kvFPSlJ>r8NnHWh*$8H*851aJeeNIrMUD-Y`djY+wem-WS?;#@ zxon!sE|qC2O