/************************************************************************** * 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 UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMin[kInjLines] = {20,90,170}; const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {50,160,240}; //______________________________________________________________________ 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) { // default constructor SetPositions(); SetDefaults(); } //______________________________________________________________________ AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0) { // standard constructor SetPositions(); SetDefaults(); } //______________________________________________________________________ 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(){ // Float_t tzero=0.,intCont=0.; for(Int_t ian=0;ianGetBinContent(itb,ian+1); if(cont>fLowThreshold){ tzero+=cont*float(itb); intCont+=cont; } } } if(intCont>0) fTbZero=tzero/intCont; } //______________________________________________________________________ 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); 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){ 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(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 } } if(vel>fMaxDriftSpeed||velfMaxDriftSpeedErr){ vel=0.; evel=0.; } fDriftSpeed[jpad]=vel; fDriftSpeedErr[jpad]=evel; } //______________________________________________________________________ Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjPad) const{ // Int_t ian=-1; if(iInjPad>=kInjPads) return ian; if(!fSide){ ian=iInjPad*8; if(iInjPad==32) ian--; }else{ 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){ if(nAnode%8==0) iInjPad=nAnode/8; if(nAnode==255) iInjPad=32; }else{ 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>fHighThreshold && c3>fLowThreshold){ 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