#include <TGraphErrors.h>
#include <TMath.h>
+/* $Id$ */
+
///////////////////////////////////////////////////////////////////
// //
// Implementation of the class used for SDD injector analysis //
ClassImp(AliITSOnlineSDDInjectors)
const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.;
-const Float_t AliITSOnlineSDDInjectors::fgkJitterTB = 8.;
//______________________________________________________________________
- AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.),fTimeDiffTB()
{
// default constructor
SetMinDriftVel();
SetPositions();
SetPolOrder();
SetThreshold();
+ SetTimeDiffTB();
}
//______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
-{ // standard constructor
+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()
+{
+// standard constructor
SetMinDriftVel();
SetMaxDriftVel();
SetRangeLine1();
SetPositions();
SetPolOrder();
SetThreshold();
+ SetTimeDiffTB();
}
//______________________________________________________________________
AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::Reset(){
+ //
for(Int_t i=0;i<kNInjectors;i++){
fDriftVel[i]=0.;
fSigmaDriftVel[i]=0.;
FitDriftVelocityVsAnode();
}
//______________________________________________________________________
-TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin){
+TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin) const{
//
Float_t x[4],y[4],ex[4],ey[4];
x[0]=0.;
}
//______________________________________________________________________
Float_t AliITSOnlineSDDInjectors::GetDriftCoordinate(Float_t cAnode, Float_t cTimeBin){
+ //
Float_t vel=0;
for(Int_t i=0;i<=fPolOrder;i++) vel+=fParam[i]*TMath::Power(cAnode,(Float_t)i);
- return vel*(cTimeBin-(fTbZero-fgkJitterTB))*25/1000.;
+ return vel*(cTimeBin-(fTbZero-fTimeDiffTB))*25/1000.;
}
//______________________________________________________________________
-TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph(){
+TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph() const{
//
-
Int_t ipt=0;
TGraphErrors *g=new TGraphErrors(0);
for(Int_t i=0;i<kNInjectors;i++){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
+ //
Float_t tzero=0.,intCont=0.;
for(Int_t ian=0;ian<fgkNAnodes;ian++){
for(Int_t itb=1;itb<fTbMin[0];itb++){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
- const Int_t nn=fPolOrder+1;
- Float_t **mat = new Float_t*[nn];
- for(Int_t i=0; i < nn; i++) mat[i] = new Float_t[nn];
- Float_t *vect = new Float_t[nn];
- for(Int_t k1=0;k1<nn;k1++){
+ // fits the anode dependence of drift velocity with a polynomial
+ 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;k1<kNn;k1++){
vect[k1]=0;
- for(Int_t k2=0;k2<nn;k2++){
+ for(Int_t k2=0;k2<kNn;k2++){
mat[k1][k2]=0;
for(Int_t n=0; n<kNInjectors;n++){
Float_t x=(Float_t)GetAnodeNumber(n);
}
}
}
- for(Int_t k1=0;k1<nn;k1++){
+ for(Int_t k1=0;k1<kNn;k1++){
for(Int_t n=0; n<kNInjectors;n++){
Float_t x=(Float_t)GetAnodeNumber(n);
if(fDriftVel[n]>0) vect[k1]+=fDriftVel[n]*TMath::Power(x,k1)/TMath::Power(fSigmaDriftVel[n],2);
}
}
- Int_t *iPivot = new Int_t[nn];
- Int_t *indxR = new Int_t[nn];
- Int_t *indxC = new Int_t[nn];
- for(Int_t i=0;i<nn;i++) iPivot[i]=0;
+ Int_t *iPivot = new Int_t[kNn];
+ Int_t *indxR = new Int_t[kNn];
+ Int_t *indxC = new Int_t[kNn];
+ for(Int_t i=0;i<kNn;i++) iPivot[i]=0;
Int_t iCol=-1,iRow=-1;
- for(Int_t i=0;i<nn;i++){
+ for(Int_t i=0;i<kNn;i++){
Float_t big=0.;
- for(Int_t j=0;j<nn;j++){
+ for(Int_t j=0;j<kNn;j++){
if(iPivot[j]!=1){
- for(Int_t k=0;k<nn;k++){
+ for(Int_t k=0;k<kNn;k++){
if(iPivot[k]==0){
if(TMath::Abs(mat[j][k])>=big){
big=TMath::Abs(mat[j][k]);
iPivot[iCol]++;
Float_t aux;
if(iRow!=iCol){
- for(Int_t l=0;l<nn;l++){
+ for(Int_t l=0;l<kNn;l++){
aux=mat[iRow][l];
mat[iRow][l]=mat[iCol][l];
mat[iCol][l]=aux;
if(mat[iCol][iCol]==0) break;
Float_t pivinv=1./mat[iCol][iCol];
mat[iCol][iCol]=1;
- for(Int_t l=0;l<nn;l++) mat[iCol][l]*=pivinv;
+ for(Int_t l=0;l<kNn;l++) mat[iCol][l]*=pivinv;
vect[iCol]*=pivinv;
- for(Int_t m=0;m<nn;m++){
+ for(Int_t m=0;m<kNn;m++){
if(m!=iCol){
aux=mat[m][iCol];
mat[m][iCol]=0;
- for(Int_t n=0;n<nn;n++) mat[m][n]-=mat[iCol][n]*aux;
+ for(Int_t n=0;n<kNn;n++) mat[m][n]-=mat[iCol][n]*aux;
vect[m]-=vect[iCol]*aux;
}
}
delete [] indxC;
if(fParam) delete [] fParam;
- fParam=new Float_t[nn];
- for(Int_t i=0; i<nn;i++)fParam[i]=vect[i];
+ fParam=new Float_t[kNn];
+ for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
- for(Int_t i=0; i < nn; i++) delete [] mat[i];
+ for(Int_t i=0; i < kNn; i++) delete [] mat[i];
delete [] mat;
delete [] vect;
}
ey[i]=fRMSCentroid[jlin][i];
}
for(Int_t i=0;i<3;i++){
- if(fGoodInj[jlin][i]){
+ if(fGoodInj[jlin][i] && ey[i]!=0){
sumY+=y[i]/ey[i]/ey[i];
sumX+=fPosition[i]/ey[i]/ey[i];
sumXX+=fPosition[i]*fPosition[i]/ey[i]/ey[i];
if(npt>1){
Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
- vel=1./slope*10000./25.;// micron/ns
- evel=eslope/slope/slope*10000./25.;// micron/ns
+ 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;
- vel=1./slope*10000./25.;// micron/ns
- evel=eslope/slope/slope*10000./25.;// micron/ns
+ if(slope!=0){
+ vel=1./slope*10000./25.;// micron/ns
+ evel=eslope/slope/slope*10000./25.;// micron/ns
+ }
}
if(vel>fMaxDriftVel||vel<fMinDriftVel){
vel=0.;
fSigmaDriftVel[jlin]=evel;
}
//______________________________________________________________________
-Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine){
+Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine) const{
+ //
Int_t ian=-1;
if(iInjLine>32) return ian;
if(!fSide){
}
return ian;
}
-
+//______________________________________________________________________
+Int_t AliITSOnlineSDDInjectors::GetLineNumberFromAnode(Int_t nAnode) const{
+ //
+ Int_t iLine=-1;
+ if(!fSide){
+ if(nAnode%8==0) iLine=nAnode/8;
+ if(nAnode==255) iLine=32;
+ }else{
+ if(nAnode%8==7) iLine=1+nAnode/8;
+ if(nAnode==0) iLine=0;
+ }
+ if(nAnode>=256) iLine=-1;
+ return iLine;
+}
+//______________________________________________________________________
+Int_t AliITSOnlineSDDInjectors::GetAnodeStatus(Int_t nAnode) const{
+ //
+ Int_t iii=GetLineNumberFromAnode(nAnode);
+ Int_t istatus=0;
+ if(iii>=0){
+ for(Int_t ninj=0;ninj<3;ninj++) istatus+=fGoodInj[iii][ninj]<<ninj;
+ }
+ return istatus;
+}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FindGoodInjectors(){
//
fRMSCentroid[iii][ninj]=0.;
fGoodInj[iii][ninj]=0;
}
+ if(fRMSCentroid[iii][ninj]==0) fGoodInj[iii][ninj]=0;
}
}
}
}
}
//______________________________________________________________________
-void AliITSOnlineSDDInjectors::WriteToFXS(){
+void AliITSOnlineSDDInjectors::WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend){
//
Char_t outfilnam[100];
- sprintf(outfilnam,"SDDinj_mod%03d_sid%d.data",fModuleId,fSide);
- FILE* outf=fopen(outfilnam,"w");
+ sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
+ FILE* outf;
+ if(optAppend==0){
+ outf=fopen(outfilnam,"w");
+ fprintf(outf,"%d\n",fPolOrder);
+ }
+ else outf=fopen(outfilnam,"a");
+ fprintf(outf,"%d %d ",evNumb,timeStamp);
for(Int_t ic=0;ic<fPolOrder+1;ic++){
fprintf(outf,"%G ",fParam[ic]);
}