1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15 #include "AliITSOnlineSDDInjectors.h"
17 #include <TGraphErrors.h>
22 ///////////////////////////////////////////////////////////////////
24 // Implementation of the class used for SDD injector analysis //
25 // Origin: F.Prino, Torino, prino@to.infn.it //
27 ///////////////////////////////////////////////////////////////////
29 ClassImp(AliITSOnlineSDDInjectors)
31 const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.;
33 //______________________________________________________________________
34 AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.),fTimeDiffTB()
36 // default constructor
47 //______________________________________________________________________
48 AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.),fTimeDiffTB()
50 // standard constructor
61 //______________________________________________________________________
62 AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
64 // fHisto should not be deleted here because it points to an histo created
65 // by the external code which calls the method AnalyzeEvent
66 // if(fHisto) delete fHisto;
67 if(fParam) delete [] fParam;
69 //______________________________________________________________________
70 void AliITSOnlineSDDInjectors::SetPositions(){
72 Float_t kLinFromCenterUm[3]={31860.,17460.,660.};
73 Float_t kAnodeFromCenterUm=35085;
74 for(Int_t i=0;i<3;i++){
75 fPosition[i]=kAnodeFromCenterUm-kLinFromCenterUm[i];
76 fPosition[i]/=10000.; // from microns to cm
79 //______________________________________________________________________
80 void AliITSOnlineSDDInjectors::Reset(){
82 for(Int_t i=0;i<kNInjectors;i++){
86 for(Int_t i=0;i<kNInjectors;i++){
87 for(Int_t j=0;j<3;j++){
90 fRMSCentroid[i][j]=0.;
94 //______________________________________________________________________
95 void AliITSOnlineSDDInjectors::AnalyzeEvent(TH2F* his){
102 for(Int_t j=0;j<kNInjectors;j++) CalcDriftVelocity(j);
103 FitDriftVelocityVsAnode();
105 //______________________________________________________________________
106 TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin) const{
108 Float_t x[4],y[4],ex[4],ey[4];
113 for(Int_t i=0;i<3;i++){
116 y[i+1]=fCentroid[jlin][i];
117 ey[i+1]=fRMSCentroid[jlin][i];
119 TGraphErrors *g=new TGraphErrors(4,x,y,ex,ey);
122 //______________________________________________________________________
123 Float_t AliITSOnlineSDDInjectors::GetDriftCoordinate(Float_t cAnode, Float_t cTimeBin){
126 for(Int_t i=0;i<=fPolOrder;i++) vel+=fParam[i]*TMath::Power(cAnode,(Float_t)i);
127 return vel*(cTimeBin-(fTbZero-fTimeDiffTB))*25/1000.;
129 //______________________________________________________________________
130 TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph() const{
133 TGraphErrors *g=new TGraphErrors(0);
134 for(Int_t i=0;i<kNInjectors;i++){
136 g->SetPoint(ipt,GetAnodeNumber(i),fDriftVel[i]);
137 g->SetPointError(ipt,0,fSigmaDriftVel[i]);
143 //______________________________________________________________________
144 void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
146 Float_t tzero=0.,intCont=0.;
147 for(Int_t ian=0;ian<fgkNAnodes;ian++){
148 for(Int_t itb=1;itb<fTbMin[0];itb++){
149 Float_t cont=fHisto->GetBinContent(itb,ian+1);
151 tzero+=cont*float(itb);
156 if(intCont>0) fTbZero=tzero/intCont;
158 //______________________________________________________________________
159 void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
160 // fits the anode dependence of drift velocity with a polynomial
161 const Int_t kNn=fPolOrder+1;
162 Float_t **mat = new Float_t*[kNn];
163 for(Int_t i=0; i < kNn; i++) mat[i] = new Float_t[kNn];
164 Float_t *vect = new Float_t[kNn];
165 for(Int_t k1=0;k1<kNn;k1++){
167 for(Int_t k2=0;k2<kNn;k2++){
169 for(Int_t n=0; n<kNInjectors;n++){
170 Float_t x=(Float_t)GetAnodeNumber(n);
171 if(fDriftVel[n]>0) mat[k1][k2]+=TMath::Power(x,k1+k2)/TMath::Power(fSigmaDriftVel[n],2);
175 for(Int_t k1=0;k1<kNn;k1++){
176 for(Int_t n=0; n<kNInjectors;n++){
177 Float_t x=(Float_t)GetAnodeNumber(n);
178 if(fDriftVel[n]>0) vect[k1]+=fDriftVel[n]*TMath::Power(x,k1)/TMath::Power(fSigmaDriftVel[n],2);
181 Int_t *iPivot = new Int_t[kNn];
182 Int_t *indxR = new Int_t[kNn];
183 Int_t *indxC = new Int_t[kNn];
184 for(Int_t i=0;i<kNn;i++) iPivot[i]=0;
185 Int_t iCol=-1,iRow=-1;
186 for(Int_t i=0;i<kNn;i++){
188 for(Int_t j=0;j<kNn;j++){
190 for(Int_t k=0;k<kNn;k++){
192 if(TMath::Abs(mat[j][k])>=big){
193 big=TMath::Abs(mat[j][k]);
204 for(Int_t l=0;l<kNn;l++){
206 mat[iRow][l]=mat[iCol][l];
210 vect[iRow]=vect[iCol];
215 if(mat[iCol][iCol]==0) break;
216 Float_t pivinv=1./mat[iCol][iCol];
218 for(Int_t l=0;l<kNn;l++) mat[iCol][l]*=pivinv;
220 for(Int_t m=0;m<kNn;m++){
224 for(Int_t n=0;n<kNn;n++) mat[m][n]-=mat[iCol][n]*aux;
225 vect[m]-=vect[iCol]*aux;
233 if(fParam) delete [] fParam;
234 fParam=new Float_t[kNn];
235 for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
237 for(Int_t i=0; i < kNn; i++) delete [] mat[i];
241 //______________________________________________________________________
242 void AliITSOnlineSDDInjectors::CalcDriftVelocity(Int_t jlin){
244 Float_t sumY=0,sumX=0,sumXX=0,sumYY=0.,sumXY=0,sumWEI=0.;
247 Float_t tzero=0,erry=0;
248 for(Int_t i=0;i<3;i++){
249 y[i]=fCentroid[jlin][i];
250 ey[i]=fRMSCentroid[jlin][i];
252 for(Int_t i=0;i<3;i++){
253 if(fGoodInj[jlin][i] && ey[i]!=0){
254 sumY+=y[i]/ey[i]/ey[i];
255 sumX+=fPosition[i]/ey[i]/ey[i];
256 sumXX+=fPosition[i]*fPosition[i]/ey[i]/ey[i];
257 sumYY+=y[i]*y[i]/ey[i]/ey[i];
258 sumXY+=fPosition[i]*y[i]/ey[i]/ey[i];
259 sumWEI+=1./ey[i]/ey[i];
260 tzero=fTbZero/ey[i]/ey[i];
265 Float_t vel=0,evel=0;
267 Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
268 Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
270 vel=1./slope*10000./25.;// micron/ns
271 evel=eslope/slope/slope*10000./25.;// micron/ns
275 Float_t slope=(sumY-tzero)/sumX;
276 Float_t eslope=erry/sumX;
278 vel=1./slope*10000./25.;// micron/ns
279 evel=eslope/slope/slope*10000./25.;// micron/ns
282 if(vel>fMaxDriftVel||vel<fMinDriftVel){
287 fSigmaDriftVel[jlin]=evel;
289 //______________________________________________________________________
290 Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine) const{
293 if(iInjLine>32) return ian;
296 if(iInjLine==32) ian--;
299 if(iInjLine==0) ian=0;
303 //______________________________________________________________________
304 Int_t AliITSOnlineSDDInjectors::GetLineNumberFromAnode(Int_t nAnode) const{
308 if(nAnode%8==0) iLine=nAnode/8;
309 if(nAnode==255) iLine=32;
311 if(nAnode%8==7) iLine=1+nAnode/8;
312 if(nAnode==0) iLine=0;
314 if(nAnode>=256) iLine=-1;
317 //______________________________________________________________________
318 Int_t AliITSOnlineSDDInjectors::GetAnodeStatus(Int_t nAnode) const{
320 Int_t iii=GetLineNumberFromAnode(nAnode);
323 for(Int_t ninj=0;ninj<3;ninj++) istatus+=fGoodInj[iii][ninj]<<ninj;
327 //______________________________________________________________________
328 void AliITSOnlineSDDInjectors::FindGoodInjectors(){
330 for(Int_t iii=0;iii<kNInjectors;iii++){
331 Int_t ian=GetAnodeNumber(iii);
332 for(Int_t ninj=0;ninj<3;ninj++){
333 for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
334 Float_t c1=fHisto->GetBinContent(jjj,ian+1);
335 Float_t c2=fHisto->GetBinContent(jjj+1,ian+1);
336 Float_t c3=fHisto->GetBinContent(jjj+2,ian+1);
337 if(c1>fThreshold && c2>fThreshold && c3>fThreshold){
338 fGoodInj[iii][ninj]=1;
342 // for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
343 // Float_t c1=fHisto->GetBinContent(jjj,ian+1);
344 // if(c1>=fgkSaturation){
345 // fGoodInj[iii][ninj]=0;
352 //______________________________________________________________________
353 void AliITSOnlineSDDInjectors::FindCentroids(){
355 for(Int_t iii=0;iii<kNInjectors;iii++){
356 Int_t ian=GetAnodeNumber(iii);
357 for(Int_t ninj=0;ninj<3;ninj++){
358 if(!fGoodInj[iii][ninj]) continue;
361 for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
362 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
371 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
372 if(cont<fThreshold) break;
373 if(cont<fgkSaturation){
374 fCentroid[iii][ninj]+=cont*(Float_t)jjj;
375 fRMSCentroid[iii][ninj]+=cont*TMath::Power((Float_t)jjj,2);
382 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
383 if(cont<fThreshold) break;
384 if(cont<fgkSaturation){
385 fCentroid[iii][ninj]+=cont*float(jjj);
386 fRMSCentroid[iii][ninj]+=cont*TMath::Power((Float_t)jjj,2);
392 fCentroid[iii][ninj]/=intCont;
393 fRMSCentroid[iii][ninj]=TMath::Sqrt(fRMSCentroid[iii][ninj]/intCont-fCentroid[iii][ninj]*fCentroid[iii][ninj]);
396 fCentroid[iii][ninj]=0.;
397 fRMSCentroid[iii][ninj]=0.;
398 fGoodInj[iii][ninj]=0;
400 if(fRMSCentroid[iii][ninj]==0) fGoodInj[iii][ninj]=0;
404 //______________________________________________________________________
405 void AliITSOnlineSDDInjectors::PrintInjMap(){
407 for(Int_t iii=0;iii<kNInjectors;iii++){
408 printf("Line%d-Anode%d: %d %d %d\n",iii,GetAnodeNumber(iii),fGoodInj[iii][0],fGoodInj[iii][1],fGoodInj[iii][2]);
411 //______________________________________________________________________
412 void AliITSOnlineSDDInjectors::PrintCentroids(){
414 for(Int_t iii=0;iii<kNInjectors;iii++){
415 printf("Line%d-Anode%d: %f+-%f %f+-%f %f+-%f\n",iii,GetAnodeNumber(iii),fCentroid[iii][0],fRMSCentroid[iii][0],fCentroid[iii][1],fRMSCentroid[iii][1],fCentroid[iii][2],fRMSCentroid[iii][2]);
418 //______________________________________________________________________
419 void AliITSOnlineSDDInjectors::WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend){
421 Char_t outfilnam[100];
422 sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
425 outf=fopen(outfilnam,"w");
426 fprintf(outf,"%d\n",fPolOrder);
428 else outf=fopen(outfilnam,"a");
429 fprintf(outf,"%d %d ",evNumb,timeStamp);
430 for(Int_t ic=0;ic<fPolOrder+1;ic++){
431 fprintf(outf,"%G ",fParam[ic]);