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>
20 ///////////////////////////////////////////////////////////////////
22 // Implementation of the class used for SDD injector analysis //
23 // Origin: F.Prino, Torino, prino@to.infn.it //
25 ///////////////////////////////////////////////////////////////////
27 ClassImp(AliITSOnlineSDDInjectors)
29 const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.;
30 const Float_t AliITSOnlineSDDInjectors::fgkJitterTB = 8.;
32 //______________________________________________________________________
33 AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
35 // default constructor
45 //______________________________________________________________________
46 AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
48 // standard constructor
58 //______________________________________________________________________
59 AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
61 if(fHisto) delete fHisto;
62 if(fParam) delete [] fParam;
64 //______________________________________________________________________
65 void AliITSOnlineSDDInjectors::SetPositions(){
67 Float_t kLinFromCenterUm[3]={31860.,17460.,660.};
68 Float_t kAnodeFromCenterUm=35085;
69 for(Int_t i=0;i<3;i++){
70 fPosition[i]=kAnodeFromCenterUm-kLinFromCenterUm[i];
71 fPosition[i]/=10000.; // from microns to cm
74 //______________________________________________________________________
75 void AliITSOnlineSDDInjectors::Reset(){
77 for(Int_t i=0;i<kNInjectors;i++){
81 for(Int_t i=0;i<kNInjectors;i++){
82 for(Int_t j=0;j<3;j++){
85 fRMSCentroid[i][j]=0.;
89 //______________________________________________________________________
90 void AliITSOnlineSDDInjectors::AnalyzeEvent(TH2F* his){
97 for(Int_t j=0;j<kNInjectors;j++) CalcDriftVelocity(j);
98 FitDriftVelocityVsAnode();
100 //______________________________________________________________________
101 TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin){
103 Float_t x[4],y[4],ex[4],ey[4];
108 for(Int_t i=0;i<3;i++){
111 y[i+1]=fCentroid[jlin][i];
112 ey[i+1]=fRMSCentroid[jlin][i];
114 TGraphErrors *g=new TGraphErrors(4,x,y,ex,ey);
117 //______________________________________________________________________
118 Float_t AliITSOnlineSDDInjectors::GetDriftCoordinate(Float_t cAnode, Float_t cTimeBin){
121 for(Int_t i=0;i<=fPolOrder;i++) vel+=fParam[i]*TMath::Power(cAnode,(Float_t)i);
122 return vel*(cTimeBin-(fTbZero-fgkJitterTB))*25/1000.;
124 //______________________________________________________________________
125 TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph() const{
128 TGraphErrors *g=new TGraphErrors(0);
129 for(Int_t i=0;i<kNInjectors;i++){
131 g->SetPoint(ipt,GetAnodeNumber(i),fDriftVel[i]);
132 g->SetPointError(ipt,0,fSigmaDriftVel[i]);
138 //______________________________________________________________________
139 void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
141 Float_t tzero=0.,intCont=0.;
142 for(Int_t ian=0;ian<fgkNAnodes;ian++){
143 for(Int_t itb=1;itb<fTbMin[0];itb++){
144 Float_t cont=fHisto->GetBinContent(itb,ian+1);
146 tzero+=cont*float(itb);
151 if(intCont>0) fTbZero=tzero/intCont;
153 //______________________________________________________________________
154 void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
155 const Int_t nn=fPolOrder+1;
156 Float_t **mat = new Float_t*[nn];
157 for(Int_t i=0; i < nn; i++) mat[i] = new Float_t[nn];
158 Float_t *vect = new Float_t[nn];
159 for(Int_t k1=0;k1<nn;k1++){
161 for(Int_t k2=0;k2<nn;k2++){
163 for(Int_t n=0; n<kNInjectors;n++){
164 Float_t x=(Float_t)GetAnodeNumber(n);
165 if(fDriftVel[n]>0) mat[k1][k2]+=TMath::Power(x,k1+k2)/TMath::Power(fSigmaDriftVel[n],2);
169 for(Int_t k1=0;k1<nn;k1++){
170 for(Int_t n=0; n<kNInjectors;n++){
171 Float_t x=(Float_t)GetAnodeNumber(n);
172 if(fDriftVel[n]>0) vect[k1]+=fDriftVel[n]*TMath::Power(x,k1)/TMath::Power(fSigmaDriftVel[n],2);
175 Int_t *iPivot = new Int_t[nn];
176 Int_t *indxR = new Int_t[nn];
177 Int_t *indxC = new Int_t[nn];
178 for(Int_t i=0;i<nn;i++) iPivot[i]=0;
179 Int_t iCol=-1,iRow=-1;
180 for(Int_t i=0;i<nn;i++){
182 for(Int_t j=0;j<nn;j++){
184 for(Int_t k=0;k<nn;k++){
186 if(TMath::Abs(mat[j][k])>=big){
187 big=TMath::Abs(mat[j][k]);
198 for(Int_t l=0;l<nn;l++){
200 mat[iRow][l]=mat[iCol][l];
204 vect[iRow]=vect[iCol];
209 if(mat[iCol][iCol]==0) break;
210 Float_t pivinv=1./mat[iCol][iCol];
212 for(Int_t l=0;l<nn;l++) mat[iCol][l]*=pivinv;
214 for(Int_t m=0;m<nn;m++){
218 for(Int_t n=0;n<nn;n++) mat[m][n]-=mat[iCol][n]*aux;
219 vect[m]-=vect[iCol]*aux;
227 if(fParam) delete [] fParam;
228 fParam=new Float_t[nn];
229 for(Int_t i=0; i<nn;i++)fParam[i]=vect[i];
231 for(Int_t i=0; i < nn; i++) delete [] mat[i];
235 //______________________________________________________________________
236 void AliITSOnlineSDDInjectors::CalcDriftVelocity(Int_t jlin){
238 Float_t sumY=0,sumX=0,sumXX=0,sumYY=0.,sumXY=0,sumWEI=0.;
241 Float_t tzero=0,erry=0;
242 for(Int_t i=0;i<3;i++){
243 y[i]=fCentroid[jlin][i];
244 ey[i]=fRMSCentroid[jlin][i];
246 for(Int_t i=0;i<3;i++){
247 if(fGoodInj[jlin][i]){
248 sumY+=y[i]/ey[i]/ey[i];
249 sumX+=fPosition[i]/ey[i]/ey[i];
250 sumXX+=fPosition[i]*fPosition[i]/ey[i]/ey[i];
251 sumYY+=y[i]*y[i]/ey[i]/ey[i];
252 sumXY+=fPosition[i]*y[i]/ey[i]/ey[i];
253 sumWEI+=1./ey[i]/ey[i];
254 tzero=fTbZero/ey[i]/ey[i];
259 Float_t vel=0,evel=0;
261 Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
262 Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
263 vel=1./slope*10000./25.;// micron/ns
264 evel=eslope/slope/slope*10000./25.;// micron/ns
267 Float_t slope=(sumY-tzero)/sumX;
268 Float_t eslope=erry/sumX;
269 vel=1./slope*10000./25.;// micron/ns
270 evel=eslope/slope/slope*10000./25.;// micron/ns
272 if(vel>fMaxDriftVel||vel<fMinDriftVel){
277 fSigmaDriftVel[jlin]=evel;
279 //______________________________________________________________________
280 Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine) const{
283 if(iInjLine>32) return ian;
286 if(iInjLine==32) ian--;
289 if(iInjLine==0) ian=0;
294 //______________________________________________________________________
295 void AliITSOnlineSDDInjectors::FindGoodInjectors(){
297 for(Int_t iii=0;iii<kNInjectors;iii++){
298 Int_t ian=GetAnodeNumber(iii);
299 for(Int_t ninj=0;ninj<3;ninj++){
300 for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
301 Float_t c1=fHisto->GetBinContent(jjj,ian+1);
302 Float_t c2=fHisto->GetBinContent(jjj+1,ian+1);
303 Float_t c3=fHisto->GetBinContent(jjj+2,ian+1);
304 if(c1>fThreshold && c2>fThreshold && c3>fThreshold){
305 fGoodInj[iii][ninj]=1;
309 // for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
310 // Float_t c1=fHisto->GetBinContent(jjj,ian+1);
311 // if(c1>=fgkSaturation){
312 // fGoodInj[iii][ninj]=0;
319 //______________________________________________________________________
320 void AliITSOnlineSDDInjectors::FindCentroids(){
322 for(Int_t iii=0;iii<kNInjectors;iii++){
323 Int_t ian=GetAnodeNumber(iii);
324 for(Int_t ninj=0;ninj<3;ninj++){
325 if(!fGoodInj[iii][ninj]) continue;
328 for(Int_t jjj=fTbMin[ninj];jjj<fTbMax[ninj];jjj++){
329 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
338 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
339 if(cont<fThreshold) break;
340 if(cont<fgkSaturation){
341 fCentroid[iii][ninj]+=cont*(Float_t)jjj;
342 fRMSCentroid[iii][ninj]+=cont*TMath::Power((Float_t)jjj,2);
349 Float_t cont=fHisto->GetBinContent(jjj,ian+1);
350 if(cont<fThreshold) break;
351 if(cont<fgkSaturation){
352 fCentroid[iii][ninj]+=cont*float(jjj);
353 fRMSCentroid[iii][ninj]+=cont*TMath::Power((Float_t)jjj,2);
359 fCentroid[iii][ninj]/=intCont;
360 fRMSCentroid[iii][ninj]=TMath::Sqrt(fRMSCentroid[iii][ninj]/intCont-fCentroid[iii][ninj]*fCentroid[iii][ninj]);
363 fCentroid[iii][ninj]=0.;
364 fRMSCentroid[iii][ninj]=0.;
365 fGoodInj[iii][ninj]=0;
370 //______________________________________________________________________
371 void AliITSOnlineSDDInjectors::PrintInjMap(){
373 for(Int_t iii=0;iii<kNInjectors;iii++){
374 printf("Line%d-Anode%d: %d %d %d\n",iii,GetAnodeNumber(iii),fGoodInj[iii][0],fGoodInj[iii][1],fGoodInj[iii][2]);
377 //______________________________________________________________________
378 void AliITSOnlineSDDInjectors::PrintCentroids(){
380 for(Int_t iii=0;iii<kNInjectors;iii++){
381 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]);
384 //______________________________________________________________________
385 void AliITSOnlineSDDInjectors::WriteToFXS(){
387 Char_t outfilnam[100];
388 sprintf(outfilnam,"SDDinj_mod%03d_sid%d.data",fModuleId,fSide);
389 FILE* outf=fopen(outfilnam,"w");
390 for(Int_t ic=0;ic<fPolOrder+1;ic++){
391 fprintf(outf,"%G ",fParam[ic]);