/************************************************************************** * 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 "AliITSOnlineSDDInjectors.h" #include #include #include /* $Id$ */ /////////////////////////////////////////////////////////////////// // // // Implementation of the class used for SDD injector analysis // // Origin: F.Prino, Torino, prino@to.infn.it // // // /////////////////////////////////////////////////////////////////// ClassImp(AliITSOnlineSDDInjectors) const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.; const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold = 5.; const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 25.; 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 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.),fRMSTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE) { // default constructor SetPositions(); SetDefaults(); SetTimeStep(fgkDefaultTimeStep); } //______________________________________________________________________ AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fRMSTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE) { // standard constructor SetPositions(); SetDefaults(); SetTimeStep(fgkDefaultTimeStep); } //______________________________________________________________________ AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){ // Destructor // fHisto should not be deleted here because it points to an histo created // by the external code which calls the method AnalyzeEvent // if(fHisto) delete fHisto; if(fParam) delete [] fParam; } //______________________________________________________________________ void AliITSOnlineSDDInjectors::SetDefaults(){ for(Int_t i=0;i0){ g->SetPoint(ipt,GetAnodeNumber(i),fDriftSpeed[i]); g->SetPointError(ipt,0,fDriftSpeedErr[i]); ipt++; } } return g; } //______________________________________________________________________ TGraphErrors* AliITSOnlineSDDInjectors::GetSelectedDriftSpeedGraph(Int_t minAcceptStatus) const{ // TGraphErrors with only pads with status of injector >= minAcceptStatus Int_t ipt=0; TGraphErrors *g=new TGraphErrors(0); for(Int_t i=0;i0 && padStatus >= minAcceptStatus ){ g->SetPoint(ipt,GetAnodeNumber(i),fDriftSpeed[i]); g->SetPointError(ipt,0,fDriftSpeedErr[i]); ipt++; } } return g; } //______________________________________________________________________ void AliITSOnlineSDDInjectors::CalcTimeBinZero(){ // Get time zero from trigger signal Float_t tzero=0.,intCont=0.,rmsPeak=0.; Bool_t isTbUsed[256]; Int_t nTbUsed=0; for(Int_t i=0;i<256;i++) isTbUsed[i]=0; for(Int_t ian=0;ianGetBinContent(itb,ian+1); Float_t contm1=fHisto->GetBinContent(itb+1,ian+1); Float_t contp1=fHisto->GetBinContent(itb-1,ian+1); if(cont>fLowThreshold){ if(contm1>fHighThreshold || cont>fHighThreshold || contp1>fHighThreshold){ 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; fRMSTbZero=TMath::Sqrt(rmsPeak/intCont-fTbZero*fTbZero); } if(nTbUsed==1) fRMSTbZero=0.5; } //______________________________________________________________________ void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){ // fits the anode dependence of drift speed with a polynomial function const Int_t kNn=fPolOrder+1; Float_t **mat = new Float_t*[kNn]; for(Int_t i=0; i < kNn; i++) mat[i] = new Float_t[kNn]; Float_t *vect = new Float_t[kNn]; for(Int_t k1=0;k10 && 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;k2=big){ big=TMath::Abs(mat[j][k]); iRow=j; iCol=k; } } } } } iPivot[iCol]++; Float_t aux; if(iRow!=iCol){ for(Int_t l=0;l1){ 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)); } Float_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.; evel=0.; } fDriftSpeed[jpad]=vel; fDriftSpeedErr[jpad]=evel; } //______________________________________________________________________ Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjPad) const{ // Injectors location along anodes: // Side left (UP) - channel 0: injectors on anodes 0,7,15,...,247,255 // Side right (DOWN) - channel 1: injectors on anodes 0,8,16,...,248,255 Int_t ian=-1; if(iInjPad>=kInjPads) return ian; if(fSide==1){ // right side ian=iInjPad*8; if(iInjPad==32) ian--; }else{ // left side ian=iInjPad*8-1; if(iInjPad==0) ian=0; } return ian; } //______________________________________________________________________ Int_t AliITSOnlineSDDInjectors::GetInjPadNumberFromAnode(Int_t nAnode) const{ // Int_t iInjPad=-1; if(fSide==1){ // right side if(nAnode%8==0) iInjPad=nAnode/8; if(nAnode==255) iInjPad=32; }else{ // left side if(nAnode%8==7) iInjPad=1+nAnode/8; if(nAnode==0) iInjPad=0; } if(nAnode>=256) iInjPad=-1; return iInjPad; } //______________________________________________________________________ Int_t AliITSOnlineSDDInjectors::GetInjPadStatus(Int_t jpad) const{ // returns an integer value with status of injector lines for given pad/anode // status=7 --> 111 all injector are good // status=6 --> 110 1st line (close to anodes) is bad, other two are good // .... // status=1 --> 001 only 1st line (close to anodes) good // status=0 --> 000 all lines are bad Int_t istatus=0; if(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>fLowThreshold){ if(c1>fHighThreshold || c2>fHighThreshold){ fGoodInj[jpad][jlin]=1; break; } } } } } } //______________________________________________________________________ void AliITSOnlineSDDInjectors::FindCentroids(){ // for(Int_t jpad=0;jpadGetBinContent(jjj,ian+1); if(cont>maxcont){ maxcont=cont; ilmax=jjj; } } Float_t intCont=0; Int_t jjj=ilmax; while(1){ Float_t cont=fHisto->GetBinContent(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]); } else{ fCentroid[jpad][jlin]=0.; fRMSCentroid[jpad][jlin]=0.; fGoodInj[jpad][jlin]=0; } if(fRMSCentroid[jpad][jlin]==0) fGoodInj[jpad][jlin]=0; } } } //______________________________________________________________________ void AliITSOnlineSDDInjectors::PrintInjectorStatus(){ // for(Int_t jpad=0;jpad