#include <TF1.h>
#include <TGraphErrors.h>
#include <TMath.h>
+#include <TString.h>
/* $Id$ */
ClassImp(AliITSOnlineSDDInjectors)
const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.;
-const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold = 5.;
-const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 25.;
+const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold1 = 8.;
+const Float_t AliITSOnlineSDDInjectors::fgkDefaultLThreshold = 15.;
+const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold1 =15.;
+const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 30.;
const Float_t AliITSOnlineSDDInjectors::fgkDefaultMinSpeed = 5.5;
const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxSpeed = 9.0;
const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxErr = 1.5;
const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {20,70,120};
//______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolDegree(0),fActualPolDegree(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():
+ AliITSOnlineSDD(),
+ fHisto(),
+ fTbZero(0.),
+ fRMSTbZero(0.),
+ fNEvents(0),
+ fParam(),
+ fPolDegree(0),
+ fActualPolDegree(0),
+ fMinDriftSpeed(0.),
+ fMaxDriftSpeed(0.),
+ fMaxDriftSpeedErr(0.),
+ fFirstPadForFit(0),
+ fLastPadForFit(0),
+ fPadStatusCutForFit(0),
+ fTimeStep(0.),
+ fUseTimeZeroSignal(kFALSE),
+ fMaxCellsAboveThreshold(40)
{
// default constructor
SetPositions();
SetDefaults();
SetTimeStep(fgkDefaultTimeStep);
+ for(Int_t i=0;i<kInjPads;i++){
+ fSumDriftSpeed[i]=0.;
+ fSumSqDriftSpeed[i]=0.;
+ fSumPadStatus[i]=0;
+ fSumPadStatusCut[i]=0;
+ fNEventsInPad[i]=0;
+ }
+ Reset();
}
//______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolDegree(0),fActualPolDegree(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):
+ AliITSOnlineSDD(nddl,ncarlos,sid),
+ fHisto(),
+ fTbZero(0.),
+ fRMSTbZero(0.),
+ fNEvents(0),
+ fParam(),
+ fPolDegree(0),
+ fActualPolDegree(0),
+ fMinDriftSpeed(0.),
+ fMaxDriftSpeed(0.),
+ fMaxDriftSpeedErr(0.),
+ fFirstPadForFit(0),
+ fLastPadForFit(0),
+ fPadStatusCutForFit(0),
+ fTimeStep(0.),
+ fUseTimeZeroSignal(kFALSE),
+ fMaxCellsAboveThreshold(40)
{
// standard constructor
SetPositions();
SetDefaults();
SetTimeStep(fgkDefaultTimeStep);
+ for(Int_t i=0;i<kInjPads;i++){
+ fSumDriftSpeed[i]=0.;
+ fSumSqDriftSpeed[i]=0.;
+ fSumPadStatus[i]=0;
+ fSumPadStatusCut[i]=0;
+ fNEventsInPad[i]=0;
+ }
+ Reset();
}
//______________________________________________________________________
AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::SetDefaults(){
+ // Sets default values for parameters
for(Int_t i=0;i<kInjLines;i++) {
SetInjLineRange(i,fgkDefaultTbMin[i],fgkDefaultTbMax[i]);
SetUseLine(i,kTRUE);
+ SetThresholds(i,fgkDefaultLThreshold,fgkDefaultHThreshold);
}
- SetThresholds(fgkDefaultLThreshold,fgkDefaultHThreshold);
+ SetThresholds(0,fgkDefaultLThreshold1,fgkDefaultHThreshold1);
SetPolDegree(fgkDefaultPolDegree);
SetMinDriftSpeed(fgkDefaultMinSpeed);
SetMaxDriftSpeed(fgkDefaultMaxSpeed);
SetPadStatusCutForFit();
}
//______________________________________________________________________
+void AliITSOnlineSDDInjectors::Set20MHzConfig(){
+ // Sets specific parameters for 20 MHz running
+ SetInjLineRange(0,10,20);
+ SetInjLineRange(1,50,70);
+ SetInjLineRange(2,100,120);
+ SetTimeStep(50.);
+ SetMaxNumberOfCellsPerAnode(40);
+}
+//______________________________________________________________________
+void AliITSOnlineSDDInjectors::Set40MHzConfig(){
+ // Sets specific parameters for 20 MHz running
+ SetInjLineRange(0,20,50);
+ SetInjLineRange(1,90,160);
+ SetInjLineRange(2,170,240);
+ SetTimeStep(25.);
+ SetMaxNumberOfCellsPerAnode(80);
+}
+//______________________________________________________________________
void AliITSOnlineSDDInjectors::SetPositions(){
- //
+ // Sets drift distances for the 3 injector lines
Double_t xLinFromCenterUm[kInjLines]={31860.,17460.,660.};
Double_t xAnodeFromCenterUm=35085;
for(Int_t i=0;i<kInjLines;i++){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::Reset(){
- //
+ // Resets all counters
for(Int_t i=0;i<kInjPads;i++){
fDriftSpeed[i]=0.;
fDriftSpeedErr[i]=0.;
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::AnalyzeEvent(TH2F* his){
- //
+ // Analyze the current event
AddEvent(his);
FitDriftSpeedVsAnode();
}
for(Int_t i=0;i<kInjPads;i++){
fSumDriftSpeed[i]=0.;
fSumSqDriftSpeed[i]=0.;
+ fSumPadStatus[i]=0;
+ fSumPadStatusCut[i]=0;
+ fNEventsInPad[i]=0;
}
}
Reset();
CalcTimeBinZero();
for(Int_t j=0;j<kInjPads;j++){
CalcDriftSpeed(j);
- fSumDriftSpeed[j]+=fDriftSpeed[j];
- fSumSqDriftSpeed[j]+=fDriftSpeed[j]*fDriftSpeed[j];
+ Int_t padStatus=GetInjPadStatus(j);
+ fSumPadStatus[j]+=padStatus;
+ if(padStatus>fPadStatusCutForFit){
+ fSumDriftSpeed[j]+=fDriftSpeed[j];
+ fSumSqDriftSpeed[j]+=fDriftSpeed[j]*fDriftSpeed[j];
+ fSumPadStatusCut[j]+=padStatus;
+ fNEventsInPad[j]++;
+ }
}
++fNEvents;
}
//______________________________________________________________________
Double_t AliITSOnlineSDDInjectors::GetRMSDriftSpeed(Int_t ipad) const {
- //
- if(fNEvents<=1) return 0.;
- Double_t mean=fSumDriftSpeed[ipad]/(Double_t)fNEvents;
- Double_t diff=fSumSqDriftSpeed[ipad]/(Double_t)fNEvents-mean*mean;
+ // Compute RMS of drift speed distribution on one anode
+ if(fNEventsInPad[ipad]<=1) return 0.;
+ Double_t mean=fSumDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad];
+ Double_t diff=fSumSqDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad]-mean*mean;
if(diff<0.) diff=0.;
return TMath::Sqrt(diff);
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FitMeanDriftSpeedVsAnode(){
- // Calculates
+ // Fits the average drift speed vs.anode number
if(fNEvents==0) return;
for(Int_t i=0;i<kInjPads;i++){
fDriftSpeed[i]=GetMeanDriftSpeed(i);
- if(fNEvents>1){
+ Int_t padStatusCut=(Int_t)(GetMeanPadStatusCut(i)+0.5);
+ for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=(padStatusCut&1<<ilin)>>ilin;
+ if(fNEventsInPad[i]>1){
Double_t rms=GetRMSDriftSpeed(i);
- if(rms>0.) fDriftSpeedErr[i]=rms/TMath::Sqrt(fNEvents);
+ if(rms>0.) fDriftSpeedErr[i]=rms/TMath::Sqrt(fNEventsInPad[i]);
+ }else{
+ for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=0;
}
}
FitDriftSpeedVsAnode();
+ for(Int_t i=0;i<kInjPads;i++){
+ Int_t padStatus=(Int_t)(GetMeanPadStatusCut(i)+0.5);
+ for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=(padStatus&1<<ilin)>>ilin;
+ }
}
//______________________________________________________________________
TGraphErrors* AliITSOnlineSDDInjectors::GetTimeVsDistGraph(Int_t jpad) const{
- //
+ // Builds the graph of drift time vs. drift distance
const Int_t kPts=kInjLines+1;
Float_t x[kPts],y[kPts],ex[kPts],ey[kPts];
x[0]=0.;
//______________________________________________________________________
TGraphErrors* AliITSOnlineSDDInjectors::GetDriftSpeedGraph() const{
- //
+ // Builds the graph of drift speed vs. anode number
Int_t ipt=0;
TGraphErrors *g=new TGraphErrors(0);
for(Int_t i=0;i<kInjPads;i++){
Double_t cont=fHisto->GetBinContent(itb,ian+1);
Double_t contm1=fHisto->GetBinContent(itb+1,ian+1);
Double_t contp1=fHisto->GetBinContent(itb-1,ian+1);
- if(cont>fLowThreshold){
- if(contm1>fHighThreshold || cont>fHighThreshold || contp1>fHighThreshold){
+ if(cont>fLowThreshold[0]){
+ if(cont>fHighThreshold[0] &&(contm1>fLowThreshold[0] || contp1>fLowThreshold[0])){
tzero+=cont*float(itb);
rmsPeak+=cont*float(itb)*float(itb);
intCont+=cont;
for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
Double_t x=(Double_t)GetAnodeNumber(jpad);
if(fDriftSpeed[jpad]>0 && 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<kNn;k2++){
- mat[k1][k2]+=TMath::Power(x,k1+k2)/TMath::Power(fDriftSpeedErr[jpad],2);
- }
+ vect[k1]+=fDriftSpeed[jpad]*TMath::Power(x,k1)/TMath::Power(fDriftSpeedErr[jpad],2);
+ if(k1==0) npts++;
+ for(Int_t k2=0;k2<kNn;k2++){
+ mat[k1][k2]+=TMath::Power(x,k1+k2)/TMath::Power(fDriftSpeedErr[jpad],2);
+ }
}
}
}
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::CalcDriftSpeed(Int_t jpad){
- //
+ // Computes the drift speed from the fit to the 3 injector lines for each anode
Double_t sumY=0,sumX=0,sumXX=0,sumYY=0.,sumXY=0,sumWEI=0.;
Int_t npt=0;
Double_t y[kInjLines],ey[kInjLines];
}
//______________________________________________________________________
Int_t AliITSOnlineSDDInjectors::GetInjPadNumberFromAnode(Int_t nAnode) const{
- //
+ // Converts anode number into injector pad index
Int_t iInjPad=-1;
if(fSide==1){ // right side
if(nAnode%8==0) iInjPad=nAnode/8;
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FindGoodInjectors(){
- //
+ // Mark good injector pads
+ // good = 1 cell above high threshold + 1 neighbour above low threshold
for(Int_t jpad=0;jpad<kInjPads;jpad++){
Int_t ian=GetAnodeNumber(jpad);
- for(Int_t jlin=0;jlin<kInjLines;jlin++){
- for(Int_t jjj=fTbMin[jlin];jjj<fTbMax[jlin];jjj++){
- Float_t c1=fHisto->GetBinContent(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;
+ Int_t countAbove=0;
+ for(Int_t jjj=0; jjj<fHisto->GetNbinsX(); jjj++){
+ Float_t c=fHisto->GetBinContent(jjj+1,ian+1);
+ if(c>0.5) countAbove++;
+ }
+ if(countAbove>fMaxCellsAboveThreshold){
+ for(Int_t jlin=0;jlin<kInjLines;jlin++) fGoodInj[jpad][jlin]=0;
+ }else{
+ for(Int_t jlin=0;jlin<kInjLines;jlin++){
+ for(Int_t jjj=fTbMin[jlin];jjj<fTbMax[jlin];jjj++){
+ Float_t c1=fHisto->GetBinContent(jjj,ian+1);
+ Float_t c2=fHisto->GetBinContent(jjj+1,ian+1);
+ // Float_t c3=fHisto->GetBinContent(jjj+2,ian+1);
+ if(c1>fLowThreshold[jlin] && c2>fLowThreshold[jlin]){
+ if(c1>fHighThreshold[jlin] || c2>fHighThreshold[jlin]){
+ fGoodInj[jpad][jlin]=1;
+ break;
+ }
}
}
}
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FindCentroids(){
- //
+ // Computes the centroids (weighted mean) of teh injector pads
for(Int_t jpad=0;jpad<kInjPads;jpad++){
Int_t ian=GetAnodeNumber(jpad);
for(Int_t jlin=0;jlin<kInjLines;jlin++){
Int_t jjj=ilmax;
while(1){
Double_t cont=fHisto->GetBinContent(jjj,ian+1);
- if(cont<fLowThreshold) break;
+ if(cont<fLowThreshold[jlin]) break;
if(cont<fgkSaturation){
fCentroid[jpad][jlin]+=cont*(Double_t)jjj;
fRMSCentroid[jpad][jlin]+=cont*(Double_t)jjj*(Double_t)jjj;
jjj=ilmax+1;
while(1){
Double_t cont=fHisto->GetBinContent(jjj,ian+1);
- if(cont<fLowThreshold) break;
+ if(cont<fLowThreshold[jlin]) break;
if(cont<fgkSaturation){
fCentroid[jpad][jlin]+=cont*float(jjj);
fRMSCentroid[jpad][jlin]+=cont*(Double_t)jjj*(Double_t)jjj;
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::PrintInjectorStatus(){
- //
+ // Dumps the status bit of injector pads
for(Int_t jpad=0;jpad<kInjPads;jpad++){
printf("Line%d-Anode%d: %d %d %d\n",jpad,GetAnodeNumber(jpad),fGoodInj[jpad][0],fGoodInj[jpad][1],fGoodInj[jpad][2]);
}
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::PrintCentroids(){
- //
+ // Dumps the drift time centroids of injector pads
for(Int_t jpad=0;jpad<kInjPads;jpad++){
printf("Line%d-Anode%d: %f+-%f %f+-%f %f+-%f\n",jpad,GetAnodeNumber(jpad),fCentroid[jpad][0],fRMSCentroid[jpad][0],fCentroid[jpad][1],fRMSCentroid[jpad][1],fCentroid[jpad][2],fRMSCentroid[jpad][2]);
}
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend){
- //
- Char_t outfilnam[100];
- sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
+ // writes drift speed vs. anode fit parameters into an ASCII file
+ // to be sent to FXS by the DA and processed by the SHUTTLE
+
+ TString outfilnam;
+ outfilnam.Form("SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
FILE* outf;
if(optAppend==0){
- outf=fopen(outfilnam,"w");
+ outf=fopen(outfilnam.Data(),"w");
fprintf(outf,"%d\n",fActualPolDegree);
}
- else outf=fopen(outfilnam,"a");
+ else outf=fopen(outfilnam.Data(),"a");
fprintf(outf,"%d %d ",evNumb,timeStamp);
for(Int_t ic=0;ic<fPolDegree+1;ic++){
fprintf(outf,"%G ",fParam[ic]);
}
//______________________________________________________________________
TH1F* AliITSOnlineSDDInjectors::GetMeanDriftSpeedVsPadHisto() const{
- Char_t hisnam[20];
- sprintf(hisnam,"hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
- TH1F* h=new TH1F(hisnam,"",kInjPads,-0.5,kInjPads-0.5);
+ // Builds histogram of average drift speed vs. pad number
+ TString hisnam;
+ hisnam.Form("hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
+ TH1F* h=new TH1F(hisnam.Data(),"",kInjPads,-0.5,kInjPads-0.5);
if(fNEvents>0){
for(Int_t i=0;i<kInjPads;i++){
h->SetBinContent(i+1,GetMeanDriftSpeed(i));
Double_t rms=GetRMSDriftSpeed(i);
Double_t err=0.;
- if(rms>0.) err=rms/TMath::Sqrt(fNEvents);
+ if(rms>0.) err=rms/TMath::Sqrt(fNEventsInPad[i]);
h->SetBinError(i+1,err);
}
}
}
//______________________________________________________________________
Bool_t AliITSOnlineSDDInjectors::WriteToROOT(TFile *fil) const {
- //
+ // Writes the output histograms into a root file
if(fil==0){
AliWarning("Invalid pointer to ROOT file");
return kFALSE;
}
- Char_t hisnam[20];
+ TString hisnam;
fil->cd();
- sprintf(hisnam,"hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
- TH1F hdsp(hisnam,"",kInjPads,-0.5,kInjPads-0.5);
+ hisnam.Form("hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
+ TH1F hdsp(hisnam.Data(),"",kInjPads,-0.5,kInjPads-0.5);
if(fNEvents==0){
AliWarning("Zero analyzed events");
return kFALSE;
hdsp.SetBinContent(i+1,GetMeanDriftSpeed(i));
Double_t rms=GetRMSDriftSpeed(i);
Double_t err=0.;
- if(rms>0.) err=rms/TMath::Sqrt(fNEvents);
+ if(rms>0.) err=rms/TMath::Sqrt(fNEventsInPad[i]);
hdsp.SetBinError(i+1,err);
}
hdsp.Write();
void AliITSOnlineSDDInjectors::WriteInjectorStatusToASCII(){
// dump status of injectors encoded into UInt_t
// 5 bits (value 0-31) to store number of pads with given status
- Char_t outfilnam[100];
- sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
- FILE* outf=fopen(outfilnam,"a");
+ TString outfilnam;
+ outfilnam.Form("SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
+ FILE* outf=fopen(outfilnam.Data(),"a");
Int_t n[8]={0,0,0,0,0,0,0,0};
for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
Int_t statusPad=GetInjPadStatus(jpad);