X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSOnlineSDDInjectors.cxx;h=531bad0bf1e1b1498018f387f217ad933d3ae523;hb=1ff86ea91d3353ca2c446a24cbcfc40681f1e64a;hp=135d074733d3089326bdc7284ea4ba472917dcc4;hpb=06bb3583e3e9db7234eddd67146703047a858775;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSOnlineSDDInjectors.cxx b/ITS/AliITSOnlineSDDInjectors.cxx index 135d074733d..531bad0bf1e 100644 --- a/ITS/AliITSOnlineSDDInjectors.cxx +++ b/ITS/AliITSOnlineSDDInjectors.cxx @@ -12,10 +12,14 @@ * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ +#include #include "AliITSOnlineSDDInjectors.h" +#include "AliLog.h" #include +#include #include #include +#include /* $Id$ */ @@ -29,28 +33,83 @@ ClassImp(AliITSOnlineSDDInjectors) const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.; -const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold = 5.; -const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 25.; +const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold1 = 8.; +const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold = 15.; +const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold1 =15.; +const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 30.; const Float_t AliITSOnlineSDDInjectors::fgkDefaultMinSpeed = 5.5; const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxSpeed = 9.0; const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxErr = 1.5; -const Int_t AliITSOnlineSDDInjectors::fgkDefaultPolOrder = 3; -const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMin[kInjLines] = {20,90,170}; -const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {50,160,240}; +const Int_t AliITSOnlineSDDInjectors::fgkDefaultPolDegree = 3; +const Float_t AliITSOnlineSDDInjectors::fgkDefaultTimeStep = 50.; +const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMin[kInjLines] = {10,50,100}; +const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {20,70,120}; //______________________________________________________________________ -AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0) +AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(): + AliITSOnlineSDD(), + fHisto(), + fTbZero(0.), + fRMSTbZero(0.), + fNEvents(0), + fParam(), + fPolDegree(0), + fActualPolDegree(0), + fMinDriftSpeed(0.), + fMaxDriftSpeed(0.), + fMaxDriftSpeedErr(0.), + fFirstPadForFit(0), + fLastPadForFit(0), + fPadStatusCutForFit(0), + fTimeStep(0.), + fUseTimeZeroSignal(kFALSE), + fMaxCellsAboveThreshold(40) { // default constructor SetPositions(); SetDefaults(); + SetTimeStep(fgkDefaultTimeStep); + for(Int_t i=0;ifPadStatusCutForFit){ + fSumDriftSpeed[j]+=fDriftSpeed[j]; + fSumSqDriftSpeed[j]+=fDriftSpeed[j]*fDriftSpeed[j]; + fSumPadStatusCut[j]+=padStatus; + fNEventsInPad[j]++; + } + } + ++fNEvents; +} +//______________________________________________________________________ +Double_t AliITSOnlineSDDInjectors::GetRMSDriftSpeed(Int_t ipad) const { + // Compute RMS of drift speed distribution on one anode + if(fNEventsInPad[ipad]<=1) return 0.; + Double_t mean=fSumDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad]; + Double_t diff=fSumSqDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad]-mean*mean; + if(diff<0.) diff=0.; + return TMath::Sqrt(diff); +} + +//______________________________________________________________________ +void AliITSOnlineSDDInjectors::FitMeanDriftSpeedVsAnode(){ + // Fits the average drift speed vs.anode number + if(fNEvents==0) return; + for(Int_t i=0;i>ilin; + if(fNEventsInPad[i]>1){ + Double_t rms=GetRMSDriftSpeed(i); + if(rms>0.) fDriftSpeedErr[i]=rms/TMath::Sqrt(fNEventsInPad[i]); + }else{ + for(Int_t ilin=0; ilin>ilin; + } } //______________________________________________________________________ TGraphErrors* AliITSOnlineSDDInjectors::GetTimeVsDistGraph(Int_t jpad) const{ - // + // Builds the graph of drift time vs. drift distance const Int_t kPts=kInjLines+1; Float_t x[kPts],y[kPts],ex[kPts],ey[kPts]; x[0]=0.; @@ -129,7 +266,7 @@ TGraphErrors* AliITSOnlineSDDInjectors::GetTimeVsDistGraph(Int_t jpad) const{ //______________________________________________________________________ TGraphErrors* AliITSOnlineSDDInjectors::GetDriftSpeedGraph() const{ - // + // Builds the graph of drift speed vs. anode number Int_t ipt=0; TGraphErrors *g=new TGraphErrors(0); for(Int_t i=0;iGetBinContent(itb,ian+1); - if(cont>fLowThreshold){ - tzero+=cont*float(itb); - intCont+=cont; + Double_t cont=fHisto->GetBinContent(itb,ian+1); + Double_t contm1=fHisto->GetBinContent(itb+1,ian+1); + Double_t contp1=fHisto->GetBinContent(itb-1,ian+1); + if(cont>fLowThreshold[0]){ + if(cont>fHighThreshold[0] &&(contm1>fLowThreshold[0] || contp1>fLowThreshold[0])){ + tzero+=cont*float(itb); + rmsPeak+=cont*float(itb)*float(itb); + intCont+=cont; + if(!isTbUsed[itb]){ + isTbUsed[itb]=1; + ++nTbUsed; + } + } } } } - if(intCont>0) fTbZero=tzero/intCont; + if(intCont>0){ + fTbZero=tzero/intCont; + fRMSTbZero=TMath::Sqrt(rmsPeak/intCont-fTbZero*fTbZero); + } + if(nTbUsed==1) fRMSTbZero=0.5; } + //______________________________________________________________________ void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){ + // fits the anode dependence of drift speed + + Float_t rangeForMax[2]={78.,178.}; + PolyFit(fPolDegree); + fActualPolDegree=fPolDegree; + if(fPolDegree==3){ + Double_t deltasq=fParam[2]*fParam[2]-3*fParam[1]*fParam[3]; + Double_t zero1=-999.; + Double_t zero2=-999.; + if(deltasq>=0. && TMath::Abs(fParam[3])>0.){ + Double_t delta=TMath::Sqrt(deltasq); + zero1=(-fParam[2]+delta)/3./fParam[3]; + zero2=(-fParam[2]-delta)/3./fParam[3]; + } + Bool_t twoZeroes=kFALSE; + Bool_t oneZero=kFALSE; + if(zero1>0. && zero1<256. && zero2>0. && zero2<256.) twoZeroes=kTRUE; + if(zero1>rangeForMax[0] && zero1rangeForMax[0] && zero2rangeForMax[0] && xmax0 && GetInjPadStatus(jpad)>fPadStatusCutForFit){ + Double_t wei=1./fDriftSpeedErr[jpad]/fDriftSpeedErr[jpad]; + averSpeed+=wei*fDriftSpeed[jpad]; + sumWei+=wei; + nUsedPts++; + } + } + if(sumWei>0.) averSpeed/=sumWei; + if(nUsedPts0 && GetInjPadStatus(jpad)>fPadStatusCutForFit){ - vect[k1]+=fDriftSpeed[jpad]*TMath::Power(x,k1)/TMath::Power(fDriftSpeedErr[jpad],2); - if(k1==0) npts++; - for(Int_t k2=0;k21){ - Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX); - Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX)); - if(slope!=0){ - vel=1./slope*10000./25.;// micron/ns - evel=eslope/slope/slope*10000./25.;// micron/ns + if(fUseTimeZeroSignal){ + sumY+=fTbZero/fRMSTbZero/fRMSTbZero; + sumX+=0.; + sumXX+=0.; + sumYY+=fTbZero*fTbZero/fRMSTbZero/fRMSTbZero; + sumXY+=0.; + sumWEI+=1./fRMSTbZero/fRMSTbZero; } + slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX); + eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX)); } - if(npt==1){ - Float_t slope=(sumY-tzero)/sumX; - Float_t eslope=erry/sumX; - if(slope!=0){ - vel=1./slope*10000./25.;// micron/ns - evel=eslope/slope/slope*10000./25.;// micron/ns - } + + Double_t vel=0,evel=0; + if(slope!=0. && fTimeStep>0.){ + vel=1./slope*10000./fTimeStep;// micron/ns + evel=eslope/slope/slope*10000./fTimeStep;// micron/ns } if(vel>fMaxDriftSpeed||velfMaxDriftSpeedErr){ vel=0.; @@ -331,7 +543,7 @@ Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjPad) const{ } //______________________________________________________________________ Int_t AliITSOnlineSDDInjectors::GetInjPadNumberFromAnode(Int_t nAnode) const{ - // + // Converts anode number into injector pad index Int_t iInjPad=-1; if(fSide==1){ // right side if(nAnode%8==0) iInjPad=nAnode/8; @@ -359,17 +571,29 @@ Int_t AliITSOnlineSDDInjectors::GetInjPadStatus(Int_t jpad) const{ } //______________________________________________________________________ void AliITSOnlineSDDInjectors::FindGoodInjectors(){ - // + // Mark good injector pads + // good = 1 cell above high threshold + 1 neighbour above low threshold for(Int_t jpad=0;jpadGetBinContent(jjj,ian+1); - Float_t c2=fHisto->GetBinContent(jjj+1,ian+1); - Float_t c3=fHisto->GetBinContent(jjj+2,ian+1); - if(c1>fLowThreshold && c2>fHighThreshold && c3>fLowThreshold){ - fGoodInj[jpad][jlin]=1; - break; + Int_t countAbove=0; + for(Int_t jjj=0; jjjGetNbinsX(); jjj++){ + Float_t c=fHisto->GetBinContent(jjj+1,ian+1); + if(c>0.5) countAbove++; + } + if(countAbove>fMaxCellsAboveThreshold){ + for(Int_t jlin=0;jlinGetBinContent(jjj,ian+1); + Float_t c2=fHisto->GetBinContent(jjj+1,ian+1); + // Float_t c3=fHisto->GetBinContent(jjj+2,ian+1); + if(c1>fLowThreshold[jlin] && c2>fLowThreshold[jlin]){ + if(c1>fHighThreshold[jlin] || c2>fHighThreshold[jlin]){ + fGoodInj[jpad][jlin]=1; + break; + } + } } } } @@ -377,46 +601,46 @@ void AliITSOnlineSDDInjectors::FindGoodInjectors(){ } //______________________________________________________________________ void AliITSOnlineSDDInjectors::FindCentroids(){ - // + // Computes the centroids (weighted mean) of teh injector pads for(Int_t jpad=0;jpadGetBinContent(jjj,ian+1); + Double_t cont=fHisto->GetBinContent(jjj,ian+1); if(cont>maxcont){ maxcont=cont; ilmax=jjj; } } - Float_t intCont=0; + Double_t intCont=0; Int_t jjj=ilmax; while(1){ - Float_t cont=fHisto->GetBinContent(jjj,ian+1); - if(contGetBinContent(jjj,ian+1); + if(contGetBinContent(jjj,ian+1); - if(contGetBinContent(jjj,ian+1); + if(cont0){ fCentroid[jpad][jlin]/=intCont; - fRMSCentroid[jpad][jlin]=TMath::Sqrt(fRMSCentroid[jpad][jlin]/intCont-fCentroid[jpad][jlin]*fCentroid[jpad][jlin]); + fRMSCentroid[jpad][jlin]=TMath::Sqrt(fRMSCentroid[jpad][jlin]/intCont-fCentroid[jpad][jlin]*fCentroid[jpad][jlin])/TMath::Sqrt(intCont); } else{ fCentroid[jpad][jlin]=0.; @@ -429,33 +653,103 @@ void AliITSOnlineSDDInjectors::FindCentroids(){ } //______________________________________________________________________ void AliITSOnlineSDDInjectors::PrintInjectorStatus(){ - // + // Dumps the status bit of injector pads for(Int_t jpad=0;jpad0){ + for(Int_t i=0;iSetBinContent(i+1,GetMeanDriftSpeed(i)); + Double_t rms=GetRMSDriftSpeed(i); + Double_t err=0.; + if(rms>0.) err=rms/TMath::Sqrt(fNEventsInPad[i]); + h->SetBinError(i+1,err); + } + } + return h; +} +//______________________________________________________________________ +Bool_t AliITSOnlineSDDInjectors::WriteToROOT(TFile *fil) const { + // Writes the output histograms into a root file + if(fil==0){ + AliWarning("Invalid pointer to ROOT file"); + return kFALSE; + } + TString hisnam; + fil->cd(); + hisnam.Form("hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide); + TH1F hdsp(hisnam.Data(),"",kInjPads,-0.5,kInjPads-0.5); + if(fNEvents==0){ + AliWarning("Zero analyzed events"); + return kFALSE; + } + + for(Int_t i=0;i0.) err=rms/TMath::Sqrt(fNEventsInPad[i]); + hdsp.SetBinError(i+1,err); + } + hdsp.Write(); + return kTRUE; +} +//______________________________________________________________________ +void AliITSOnlineSDDInjectors::WriteInjectorStatusToASCII(){ + // dump status of injectors encoded into UInt_t + // 5 bits (value 0-31) to store number of pads with given status + TString outfilnam; + outfilnam.Form("SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide); + FILE* outf=fopen(outfilnam.Data(),"a"); + Int_t n[8]={0,0,0,0,0,0,0,0}; + for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){ + Int_t statusPad=GetInjPadStatus(jpad); + ++n[statusPad]; + } + UInt_t statusInj=0; + statusInj+=(n[7]&0x1F)<<25; // bits 25-29: n. of pads with status 7 + statusInj+=(n[6]&0x1F)<<20; // bits 20-24: n. of pads with status 6 + statusInj+=(n[5]&0x1F)<<15; // bits 15-19: n. of pads with status 5 + statusInj+=(n[4]&0x1F)<<10; // bits 10-14: n. of pads with status 4 + statusInj+=(n[3]&0x1F)<<5; // bits 5- 9: n. of pads with status 3 + statusInj+=(n[2]&0x1F); // bits 0- 4: n. of pads with status 2 + + fprintf(outf,"-99 %u\n",statusInj); // -99 used in preprocessor to find line + // with injector status info + fclose(outf); + +}