/************************************************************************** * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ #include "AliITSOnlineSDDBase.h" #include #include /////////////////////////////////////////////////////////////////// // // // Implementation of the class used for SDD baselines // // and noise analysis // // Origin: F.Prino, Torino, prino@to.infn.it // // // /////////////////////////////////////////////////////////////////// /* $Id$ */ const Int_t AliITSOnlineSDDBase::fgkMaxCorr=63; // 6 but correction ClassImp(AliITSOnlineSDDBase) //______________________________________________________________________ AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.) { // default constructor Reset(); SetMinBaseline(); SetMaxBaseline(); SetMinRawNoise(); SetMaxRawNoise(); SetNSigmaNoise(); SetGoldenBaselineValue(); SetZeroSuppThresholds(); } //______________________________________________________________________ AliITSOnlineSDDBase::AliITSOnlineSDDBase(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.) { // default constructor Reset(); SetMinBaseline(); SetMaxBaseline(); SetMinRawNoise(); SetMaxRawNoise(); SetNSigmaNoise(); SetGoldenBaselineValue(); SetZeroSuppThresholds(); } //______________________________________________________________________ AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){ // Destructor } //______________________________________________________________________ void AliITSOnlineSDDBase::Reset(){ // fNEvents=0; for(Int_t i=0;ifMaxBaseline || GetAnodeBaseline(ian)fMaxRawNoise || GetAnodeRawNoise(ian)fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0; } } //______________________________________________________________________ void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){ // fNEvents++; const Int_t kTimeBins=fLastGoodTB+1; Float_t sum[fgkNAnodes]; for(Int_t ian=0;ianGetBinContent(itb+1,ian+1); sum[ian]+=cbin; sumQ+=cbin*cbin; cnt++; } sum[ian]/=(Float_t)cnt; sumQ/=(Float_t)cnt; fSumBaseline[ian]+=sum[ian]; fSumRawNoise[ian]+=sumQ; } if(fNEvents==1) ValidateAnodes(); Float_t *cmnEven = new Float_t[kTimeBins]; Float_t *cmnOdd = new Float_t[kTimeBins]; for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){ Float_t sumEven=0., sumOdd=0.; Int_t countEven=0,countOdd=0; for(Int_t ian=0;ianGetBinContent(itb+1,ian+1)-sum[ian]; countEven++; } for(Int_t ian=1;ianGetBinContent(itb+1,ian+1)-sum[ian]; countOdd++; } if(countEven>0) cmnEven[itb]=sumEven/countEven; if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd; } for(Int_t ian=0;ianGetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef; den+=cmnCoef*cmnCoef; } if(den!=0) fSumCMN[ian]+=num/den; } delete [] cmnEven; delete [] cmnOdd; } //______________________________________________________________________ void AliITSOnlineSDDBase::GetMinAndMaxBaseline(Float_t &basMin, Float_t &basMax) const { // fills mininum and maximum baseline values basMin=1008.; basMax=0.; for(Int_t ian=0;ian0 && bas < basMin) basMin=bas; if(bas>0 && bas > basMax) basMax=bas; } } //______________________________________________________________________ Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const { // returns anode with minum baseline value in hybrid Float_t basMin=1008.; for(Int_t ian=0;ian0 && bas < basMin) basMin=bas; } return basMin; } //______________________________________________________________________ Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{ // Float_t meanns=0.; Int_t cnt=0; for(Int_t ian=0;ian0) meanns/=(Float_t)cnt; return meanns; } //______________________________________________________________________ void AliITSOnlineSDDBase::WriteToASCII(){ // Char_t outfilnam[100]; Float_t basMin,basMax; GetMinAndMaxBaseline(basMin,basMax); Float_t finalVal=basMin; if(basMin>fGoldenBaseline && basMaxfGoldenBaseline+fgkMaxCorr) finalVal=basMax-fgkMaxCorr; Float_t avNoise=CalcMeanRawNoise(); Int_t thrL=(Int_t)(finalVal+fLowThrFact*avNoise+0.5); Int_t thrH=(Int_t)(finalVal+fHighThrFact*avNoise+0.5); if(CountGoodAnodes()==0) thrH=255; sprintf(outfilnam,"SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide); FILE* outf=fopen(outfilnam,"w"); fprintf(outf,"%d\n",thrH); fprintf(outf,"%d\n",thrL); Float_t corrnoise=2.; for(Int_t ian=0;ianfgkMaxCorr) corr=fgkMaxCorr; // only 6 bits in jtag for correction if(corr<0) corr=0; // avoid negative numbers fprintf(outf,"%d %d %11.6f %d %d %11.6f %11.6f %11.6f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),(Int_t)finalVal,corr,GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),corrnoise); } fclose(outf); }