ClassImp(AliITSOnlineSDD)
//______________________________________________________________________
- AliITSOnlineSDD::AliITSOnlineSDD():TObject(),fModuleId(0),fSide(0)
+ AliITSOnlineSDD::AliITSOnlineSDD():TObject(),fModuleId(0),fSide(0),fFirstGoodTB(0),fLastGoodTB(0)
{
// default constructor
+ SetFirstGoodTB();
+ SetLastGoodTB();
}
//______________________________________________________________________
- AliITSOnlineSDD::AliITSOnlineSDD(Int_t mod, Int_t sid):TObject(),fModuleId(0),fSide(0)
+ AliITSOnlineSDD::AliITSOnlineSDD(Int_t mod, Int_t sid):TObject(),fModuleId(0),fSide(0),fFirstGoodTB(0),fLastGoodTB(0)
{
// standard constructor
SetModule(mod);
SetDetectorSide(sid);
+ SetFirstGoodTB();
+ SetLastGoodTB();
}
void SetModule(Int_t mod){fModuleId=mod;}
void SetDetectorSide(Int_t sid){fSide=sid;}
+ void SetFirstGoodTB(Int_t itb=1){fFirstGoodTB=itb;}
+ void SetLastGoodTB(Int_t itb=254){fLastGoodTB=itb;}
Int_t GetModuleId() const {return fModuleId;}
Int_t GetDetectorSide() const {return fSide;}
+ Int_t GetFirstGoodTB() const {return fFirstGoodTB;}
+ Int_t GetLastGoodTB() const {return fLastGoodTB;}
protected:
static const Int_t fgkNAnodes = 256; // number of anodes in each half-module
- Int_t fModuleId; // module number from 0 to 255
- Int_t fSide; // detector side (0-1)
+ Int_t fModuleId; // module number from 0 to 255
+ Int_t fSide; // detector side (0-1)
+ Int_t fFirstGoodTB; // first good time bin (to exclude time bin 0)
+ Int_t fLastGoodTB; // last good time bin (to exclude time bin 255)
- ClassDef(AliITSOnlineSDD,1);
+ ClassDef(AliITSOnlineSDD,2);
};
#endif
void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
//
fNEvents++;
- Float_t tbmax=(Float_t)hrawd->GetNbinsX();
+ const Int_t nTimeBins=fLastGoodTB-fFirstGoodTB+1;
Float_t sum[fgkNAnodes];
for(Int_t ian=0;ian<fgkNAnodes;ian++){
Float_t sumQ=0.;
sum[ian]=0.;
- for(Int_t itb=0;itb<tbmax;itb++){
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);
}
- sum[ian]/=tbmax;
- sumQ/=tbmax;
+ sum[ian]/=(Float_t)nTimeBins;
+ sumQ/=(Float_t)nTimeBins;
fSumBaseline[ian]+=sum[ian];
fSumRawNoise[ian]+=sumQ;
if(fNEvents==1) ValidateAnodes();
}
- const Int_t kTbmax=int(tbmax);
- Float_t *cmnEven = new Float_t[kTbmax];
- Float_t *cmnOdd = new Float_t[kTbmax];
- for(Int_t itb=0;itb<tbmax;itb++){
+ Float_t *cmnEven = new Float_t[nTimeBins];
+ Float_t *cmnOdd = new Float_t[nTimeBins];
+ 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;ian<fgkNAnodes;ian+=2){
sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
countOdd++;
}
- cmnEven[itb]=sumEven/countEven;
- cmnOdd[itb]=sumOdd/countOdd;
+ if(countEven>0) cmnEven[itb]=sumEven/countEven;
+ if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
}
for(Int_t ian=0;ian<fgkNAnodes;ian++){
Float_t num=0.,den=0.;
if(!fGoodAnode[ian]) continue;
- for(Int_t itb=0;itb<tbmax;itb++){
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
Float_t cmnCoef=cmnOdd[itb];
if(ian%2==0) cmnCoef=cmnEven[itb];
num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
void AliITSOnlineSDDCMN::AddEvent(TH2F* hrawd){
//
fNEvents++;
- Float_t tbmax=(Float_t)hrawd->GetNbinsX();
+ const Int_t nTimeBins=fLastGoodTB-fFirstGoodTB+1;
TH2F* hcorrd=new TH2F("hcorrd","",hrawd->GetNbinsX(),hrawd->GetXaxis()->GetXmin(),hrawd->GetXaxis()->GetXmax(),hrawd->GetNbinsY(),hrawd->GetYaxis()->GetXmin(),hrawd->GetYaxis()->GetXmax());
- for(Int_t itb=0;itb<tbmax;itb++){
+ 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;ian<fgkNAnodes;ian+=2){
for(Int_t ian=0;ian<fgkNAnodes;ian++){
if(!fGoodAnode[ian]) continue;
Float_t sumQ=0.;
- for(Int_t itb=0;itb<tbmax;itb++){
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
sumQ+=TMath::Power(hcorrd->GetBinContent(itb+1,ian+1)-fBaseline[ian],2);
}
- fSumCorrNoise[ian]+=TMath::Sqrt(sumQ/tbmax);
+ fSumCorrNoise[ian]+=TMath::Sqrt(sumQ/(Float_t)nTimeBins);
}
delete hcorrd;
}
ClassImp(AliITSOnlineSDDTP)
//______________________________________________________________________
-AliITSOnlineSDDTP::AliITSOnlineSDDTP():AliITSOnlineSDD(),fNEvents(0),fDAC(0.),fNSigmaGain(0.)
+AliITSOnlineSDDTP::AliITSOnlineSDDTP():AliITSOnlineSDD(),fDAC(0.),fNSigmaGain(0.),fNSigmaNoise(0.)
{
// default constructor
Reset();
SetNSigmaGain();
+ SetNSigmaNoise();
}
//______________________________________________________________________
-AliITSOnlineSDDTP::AliITSOnlineSDDTP(Int_t mod, Int_t sid, Float_t xDAC):AliITSOnlineSDD(mod,sid),fNEvents(0),fDAC(xDAC),fNSigmaGain(0.)
+AliITSOnlineSDDTP::AliITSOnlineSDDTP(Int_t mod, Int_t sid, Float_t xDAC):AliITSOnlineSDD(mod,sid),fDAC(xDAC),fNSigmaGain(0.),fNSigmaNoise(0.)
{
// standard constructor
Reset();
SetNSigmaGain();
+ SetNSigmaNoise();
}
//______________________________________________________________________
AliITSOnlineSDDTP::~AliITSOnlineSDDTP(){
//______________________________________________________________________
void AliITSOnlineSDDTP::Reset(){
//
- fNEvents=0;
for(Int_t i=0;i<fgkNAnodes;i++){
+ fNEvents[i]=0;
fGoodAnode[i]=1;
fBaseline[i]=0.;
fCMN[i]=0.;
//______________________________________________________________________
void AliITSOnlineSDDTP::AddEvent(TH2F* hrawd){
//
- fNEvents++;
- Double_t tbmax=(Double_t)hrawd->GetNbinsX();
for(Int_t ian=0;ian<fgkNAnodes;ian++){
Float_t auxmax=0.;
Int_t auxtb=0;
if(!fGoodAnode[ian]) continue;
- for(Int_t itb=0;itb<tbmax;itb++){
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
Float_t cnt=hrawd->GetBinContent(itb+1,ian+1);
if(cnt>auxmax){
auxmax=cnt;
auxtb=itb;
}
}
- fSumTPPeak[ian]+=auxmax-fBaseline[ian];
- fTPPos[ian]+=auxtb;
+ if(auxmax>fBaseline[ian]+fNSigmaNoise*fRawNoise[ian]){
+ fSumTPPeak[ian]+=auxmax-fBaseline[ian];
+ fTPPos[ian]+=auxtb;
+ fNEvents[ian]++;
+ }
}
}
//______________________________________________________________________
Int_t cnt=0;
for(Int_t ian=0;ian<fgkNAnodes;ian++){
if(!fGoodAnode[ian]) continue;
+ if(fNEvents[ian]==0) continue;
sum+=GetChannelGain(ian);
sumq+=TMath::Power(GetChannelGain(ian),2);
cnt++;
void ReadBaselines();
void SetNSigmaGain(Float_t sig=3.){fNSigmaGain=sig;}
+ void SetNSigmaNoise(Float_t sig=10.){fNSigmaNoise=sig;}
Bool_t IsModuleGood()const;
Bool_t IsAnodeGood(Int_t iAnode)const{ return fGoodAnode[iAnode];}
Float_t GetAnodeBaseline(Int_t iAnode) const{ return fBaseline[iAnode];}
Float_t GetAnodeRawNoise(Int_t iAnode) const{ return fRawNoise[iAnode];}
Float_t GetAnodeCommonMode(Int_t iAnode) const{ return fCMN[iAnode];}
Float_t GetAnodeCorrNoise(Int_t iAnode) const{return fCorrNoise[iAnode];}
- Int_t GetNEvents() const {return fNEvents;}
+ Float_t GetTimeBinTPPeak(Int_t iAnode) const{
+ if(fNEvents[iAnode]>0) return fTPPos[iAnode]/fNEvents[iAnode];
+ else return 0;
+ }
+ Int_t GetNEvents(Int_t iAnode) const {return fNEvents[iAnode];}
Float_t GetChannelGain(Int_t iAnode)const{
- if(fNEvents>0) return fSumTPPeak[iAnode]/fNEvents/fDAC;
+ if(fNEvents[iAnode]>0) return fSumTPPeak[iAnode]/fNEvents[iAnode]/fDAC;
else return 0;
}
void StatGain(Float_t &mean, Float_t &rms);
protected:
private:
- Int_t fNEvents; // number of events
+ Int_t fNEvents[fgkNAnodes]; // number of TP events for given anode
Float_t fDAC; // Pascal Test Pulse amplitude (DAC units)
Bool_t fGoodAnode[fgkNAnodes]; // array of anode quality (1 good, 0 bad)
Float_t fBaseline[fgkNAnodes]; // array of anode baselines
Float_t fSumTPPeak[fgkNAnodes]; // test pulse amplitude summed over events
Float_t fTPPos[fgkNAnodes]; // test pulse position
Float_t fNSigmaGain; // Cut value for gain (n*sigma)
-
- ClassDef(AliITSOnlineSDDTP,2);
+ Float_t fNSigmaNoise; // Threshold for TP signal identification
+ ClassDef(AliITSOnlineSDDTP,3);
};
#endif