@date Mon Mar 13 13:46:05 2008
@brief Derived class for the pulse gain detector algorithm.
*/
-// This class contains the implementation of the gain detector algorithms (DA) for the FMD.
-// The data is collected in histograms that are reset for each pulse length after the
-// mean and standard deviation are put into a TGraphErrors object. After a certain number of pulses
-// (usually 8) the graph is fitted to a straight line. The gain is then slope of this line as
-// it combines the known pulse and the response of the detector.
-
-
+//____________________________________________________________________
+//
+// This class contains the implementation of the gain detector
+// algorithms (DA) for the FMD. The data is collected in histograms
+// that are reset for each pulse length after the mean and standard
+// deviation are put into a TGraphErrors object. After a certain
+// number of pulses (usually 8) the graph is fitted to a straight
+// line. The gain is then slope of this line as it combines the known
+// pulse and the response of the detector.
+//
#include "AliFMDGainDA.h"
#include "iostream"
#include "fstream"
#include "TMath.h"
#include "TGraphErrors.h"
#include "AliFMDParameters.h"
+#include "AliFMDAltroMapping.h"
//_____________________________________________________________________
ClassImp(AliFMDGainDA)
+#if 0 // Do not delete - here to let Emacs indent properly
+;
+#endif
//_____________________________________________________________________
-AliFMDGainDA::AliFMDGainDA() : AliFMDBaseDA(),
- fGainArray(),
- fPulseSize(32),
- fHighPulse(256),
- fPulseLength(100),
- fEventsPerChannel(0),
- fCurrentPulse(0),
- fCurrentChannel(0),
- fNumberOfStripsPerChip(128)
+AliFMDGainDA::AliFMDGainDA()
+ : AliFMDBaseDA(),
+ fGainArray(),
+ fHighPulse(256),
+ fEventsPerChannel(10),
+ fCurrentPulse(10),
+ fCurrentChannel(10),
+ fNumberOfStripsPerChip(128),
+ fSummaryGains("GainsSummary","Summary of gains",51200,0,51200),
+ fCurrentSummaryStrip(1)
{
+ fCurrentPulse.Reset(0);
+ fCurrentChannel.Reset(0);
fOutputFile.open("gains.csv");
- fGainArray.SetOwner();
-
+ fGainArray.SetOwner();
}
//_____________________________________________________________________
-AliFMDGainDA::AliFMDGainDA(const AliFMDGainDA & gainDA) :
- AliFMDBaseDA(gainDA),
- fGainArray(gainDA.fGainArray),
- fPulseSize(gainDA.fPulseSize),
- fHighPulse(gainDA.fHighPulse),
- fPulseLength(gainDA.fPulseLength),
- fEventsPerChannel(gainDA.fEventsPerChannel),
- fCurrentPulse(gainDA.fCurrentPulse),
- fCurrentChannel(gainDA.fCurrentChannel),
- fNumberOfStripsPerChip(gainDA.fNumberOfStripsPerChip)
-{
-
+AliFMDGainDA::AliFMDGainDA(const AliFMDGainDA & gainDA)
+ : AliFMDBaseDA(gainDA),
+ fGainArray(gainDA.fGainArray),
+ fHighPulse(gainDA.fHighPulse),
+ fEventsPerChannel(gainDA.fEventsPerChannel),
+ fCurrentPulse(gainDA.fCurrentPulse),
+ fCurrentChannel(gainDA.fCurrentChannel),
+ fNumberOfStripsPerChip(gainDA.fNumberOfStripsPerChip),
+ fSummaryGains(gainDA.fSummaryGains),
+ fCurrentSummaryStrip(gainDA.fCurrentSummaryStrip)
+{
+ fCurrentPulse.Reset(0);
+ fCurrentChannel.Reset(0);
}
//_____________________________________________________________________
-AliFMDGainDA::~AliFMDGainDA() {
-
-
-
+AliFMDGainDA::~AliFMDGainDA()
+{
}
//_____________________________________________________________________
-void AliFMDGainDA::Init() {
- std::cout<<"FMD Gain DA Init"<<std::endl;
-
- fEventsPerChannel = (fPulseLength*fHighPulse) / fPulseSize ;
+void AliFMDGainDA::Init()
+{
+
+
+ Int_t nEventsRequired = 0;
+
+ //for(UShort_t det=1; det<=3;det++) {
+ // UShort_t firstring = (det == 1 ? 1 : 0);
+ // for(UShort_t iring = firstring; iring <=1;iring++) {
+ // Char_t ring = (iring == 1 ? 'I' : 'O');
+ // for(UShort_t board =0 ; board <=1; board++) {
+ // Int_t idx = GetHalfringIndex(det,ring,board);
+ for(Int_t idx = 0;idx<fEventsPerChannel.GetSize();idx++)
+ {
+
+ Int_t nEvents = 0;
+ if(fPulseSize.At(idx))
+ nEvents = (fPulseLength.At(idx)*fHighPulse) / fPulseSize.At(idx);
+ fEventsPerChannel.AddAt(nEvents,idx);
+ if(nEvents>nEventsRequired) nEventsRequired = nEvents * fNumberOfStripsPerChip;
+
+ }
+ //}
+ // }
+
+ //8 pulser values * 128 strips * 100 samples
+
+
+ SetRequiredEvents(nEventsRequired);
- SetRequiredEvents(fEventsPerChannel*fNumberOfStripsPerChip); //8 pulser values * 128 strips * 100 samples
TObjArray* detArray;
TObjArray* ringArray;
TObjArray* sectorArray;
sectorArray->SetOwner();
ringArray->AddAtAndExpand(sectorArray,sec);
for(UShort_t strip = 0; strip < nstr; strip++) {
- TH1S* hChannel = new TH1S(Form("hFMD%d%c_%d_%d",det,ring,sec,strip),Form("hFMD%d%c_%d_%d",det,ring,sec,strip),1024,0,1023);
+ TH1S* hChannel = new TH1S(Form("hFMD%d%c_%d_%d",det,ring,sec,strip),
+ Form("hFMD%d%c_%d_%d",det,ring,sec,strip),
+ 1024,0,1023);
hChannel->SetDirectory(0);
sectorArray->AddAtAndExpand(hChannel,strip);
}
//_____________________________________________________________________
void AliFMDGainDA::AddChannelContainer(TObjArray* sectorArray,
- UShort_t det,
- Char_t ring,
+ UShort_t det ,
+ Char_t ring,
UShort_t sec,
- UShort_t strip) {
-
+ UShort_t strip)
+{
TGraphErrors* hChannel = new TGraphErrors();
+ hChannel->SetName(Form("FMD%d%c[%02d,%03d]", det, ring, sec, strip));
+ hChannel->SetTitle(Form("FMD%d%c[%02d,%03d] ADC vs DAC",
+ det, ring, sec, strip));
sectorArray->AddAtAndExpand(hChannel,strip);
}
UShort_t sec = digit->Sector();
UShort_t strip = digit->Strip();
+ //Strip is always seen as the first in a VA chip. All other strips are junk.
+ //Strips are counted from zero on even sectors and from 511 on odd sectors...
+
+ if((sec%2) && ((strip+1) % fNumberOfStripsPerChip)) return;
+ if(((sec+1)%2) && (strip % fNumberOfStripsPerChip)) return;
- if(strip%fNumberOfStripsPerChip) return;
- Int_t VAchip = strip / fNumberOfStripsPerChip;
- TH1S* hChannel = GetChannelHistogram(det,ring,sec,VAchip);
+ Int_t vaChip = strip / fNumberOfStripsPerChip;
+ TH1S* hChannel = GetChannelHistogram(det, ring, sec, vaChip);
hChannel->Fill(digit->Counts());
UpdatePulseAndADC(det,ring,sec,strip);
}
//_____________________________________________________________________
void AliFMDGainDA::Analyse(UShort_t det,
- Char_t ring,
+ Char_t ring,
UShort_t sec,
UShort_t strip) {
TGraphErrors* grChannel = GetChannel(det,ring,sec,strip);
if(!grChannel->GetN()) {
- AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",det, ring , sec, strip));
+ AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
+ det, ring , sec, strip));
return;
}
- TF1* fitFunc = new TF1("fitFunc","pol1",-10,280);
- fitFunc->SetParameters(100,3);
- grChannel->Fit("fitFunc","Q","Q",0,fHighPulse);
- AliFMDParameters* pars = AliFMDParameters::Instance();
- UInt_t ddl, board,chip,channel;
- pars->Detector2Hardware(det,ring,sec,strip,ddl,board,chip,channel);
-
- Float_t chi2ndf = 0;
- if(fitFunc->GetNDF())
- chi2ndf = fitFunc->GetChisquare() / fitFunc->GetNDF();
- ddl = ddl + kBaseDDL;
-
- Int_t relStrip = strip%fNumberOfStripsPerChip;
+ TF1 fitFunc("fitFunc","pol1",-10,280);
+ fitFunc.SetParameters(100,3);
+ grChannel->Fit("fitFunc","Q0+","",0,fHighPulse);
+
+ Float_t gain = -1;
+ Float_t error = -1;
+ Float_t chi2ndf = -1;
+ if((fitFunc.GetParameter(1)) == (fitFunc.GetParameter(1))) {
+ gain = fitFunc.GetParameter(1);
+ error = fitFunc.GetParError(1);
+ if(fitFunc.GetNDF())
+ chi2ndf = fitFunc.GetChisquare() / fitFunc.GetNDF();
+ }
- fOutputFile << ddl << ','
- << board << ','
- << chip << ','
- << channel << ','
- << relStrip << ','
- << fitFunc->GetParameter(1) << ','
- << fitFunc->GetParError(1) << ','
+ fOutputFile << det << ','
+ << ring << ','
+ << sec << ','
+ << strip << ','
+ << gain << ','
+ << error << ','
<< chi2ndf <<"\n";
-
+ //due to RCU trouble, first strips on VAs are excluded
+ if(strip%128 != 0) {
+
+ fSummaryGains.SetBinContent(fCurrentSummaryStrip,fitFunc.GetParameter(1));
+ fSummaryGains.SetBinError(fCurrentSummaryStrip,fitFunc.GetParError(1));
+
+ fCurrentSummaryStrip++;
+ }
if(fSaveHistograms) {
+ gDirectory->cd(GetSectorPath(det,ring, sec, kTRUE));
+
+ TH1F* summary = dynamic_cast<TH1F*>(gDirectory->Get("Summary"));
+ if (!summary) {
+ Int_t nStr = (ring == 'I' ? 512 : 256);
+ summary = new TH1F("Summary", Form("Summary of gains in FMD%d%c[%02d]",
+ det, ring, sec),
+ nStr, -.5, nStr-.5);
+ summary->SetXTitle("Strip");
+ summary->SetYTitle("Gain [ADC/DAC]");
+ summary->SetDirectory(gDirectory);
+ }
+ summary->SetBinContent(strip+1, fitFunc.GetParameter(1));
+ summary->SetBinError(strip+1, fitFunc.GetParError(1));
- gDirectory->cd(Form("%s:FMD%d%c/sector_%d/strip_%d",fDiagnosticsFilename,det,ring,sec,strip));
- grChannel->Write(Form("grFMD%d%c_%d_%d",det,ring,sec,strip));
+ gDirectory->cd(GetStripPath(det,ring,sec,strip, kTRUE));
+ grChannel->SetName(Form("FMD%d%c[%02d,%03d]",det,ring,sec,strip));
+ // grChannel->SetDirectory(gDirectory);
+ grChannel->Write();
+ // grChannel->Write(Form("grFMD%d%c_%d_%d",det,ring,sec,strip));
+ }
+}
+
+//_____________________________________________________________________
+void AliFMDGainDA::Terminate(TFile* diagFile)
+{
+ if(diagFile) {
+ diagFile->cd();
+ fSummaryGains.Write();
}
-
- delete fitFunc;
- delete grChannel;
}
//_____________________________________________________________________
-void AliFMDGainDA::WriteHeaderToFile() {
- fOutputFile.write("# Gains \n",9);
- fOutputFile.write("# Rcu, Board, Chip, Channel, Strip, Gain, Error, Chi2/NDF \n",59);
+void AliFMDGainDA::WriteHeaderToFile()
+{
+ AliFMDParameters* pars = AliFMDParameters::Instance();
+ fOutputFile.write(Form("# %s \n",pars->GetGainShuttleID()),9);
+ fOutputFile.write("# Detector, "
+ "Ring, "
+ "Sector, "
+ "Strip, "
+ "Gain, "
+ "Error, "
+ "Chi2/NDF \n",56);
}
//_____________________________________________________________________
TH1S* AliFMDGainDA::GetChannelHistogram(UShort_t det,
- Char_t ring,
+ Char_t ring,
UShort_t sec,
- UShort_t strip) {
+ UShort_t strip)
+{
UShort_t Ring = 1;
if(ring == 'O')
}
//_____________________________________________________________________
-TGraphErrors* AliFMDGainDA::GetChannel(UShort_t det, Char_t ring, UShort_t sec, UShort_t strip) {
-
- UShort_t Ring = 1;
- if(ring == 'O')
- Ring = 0;
-
-
- TObjArray* detArray = static_cast<TObjArray*>(fDetectorArray.At(det));
- TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(Ring));
- TObjArray* secArray = static_cast<TObjArray*>(ringArray->At(sec));
- TGraphErrors* hChannel = static_cast<TGraphErrors*>(secArray->At(strip));
+TGraphErrors* AliFMDGainDA::GetChannel(UShort_t det,
+ Char_t ring,
+ UShort_t sec,
+ UShort_t strip)
+{
+ UShort_t iring = (ring == 'O' ? 0 : 1);
+ TObjArray* detArray = static_cast<TObjArray*>(fDetectorArray.At(det));
+ TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(iring));
+ TObjArray* secArray = static_cast<TObjArray*>(ringArray->At(sec));
+ TGraphErrors* hChannel = static_cast<TGraphErrors*>(secArray->At(strip));
return hChannel;
}
//_____________________________________________________________________
-void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, Char_t ring, UShort_t sec, UShort_t strip) {
+void AliFMDGainDA::UpdatePulseAndADC(UShort_t det,
+ Char_t ring,
+ UShort_t sec,
+ UShort_t strip)
+{
- if(strip%fNumberOfStripsPerChip) return;
- if(((GetCurrentEvent())%fPulseLength) && GetCurrentEvent()>0) return;
-
- Int_t VAchip = strip/fNumberOfStripsPerChip;
- TH1S* hChannel = GetChannelHistogram(det,ring,sec,VAchip);
+ AliFMDParameters* pars = AliFMDParameters::Instance();
+ // UInt_t ddl, board,chip,ch;
+ UShort_t board = pars->GetAltroMap()->Sector2Board(ring, sec);
+ // pars->Detector2Hardware(det,ring,sec,strip,ddl,board,chip,ch);
+ /// pars->GetAltroMap()->Strip2Channel(
+ Int_t halfring = GetHalfringIndex(det,ring,board/16);
+
+ if(GetCurrentEvent()> (fNumberOfStripsPerChip*fEventsPerChannel.At(halfring)))
+ return;
+
+ if((sec%2) && ((strip+1) % fNumberOfStripsPerChip)) return;
+
+ if(((sec+1)%2) && (strip % fNumberOfStripsPerChip)) return;
+
+ if(((GetCurrentEvent()) % fPulseLength.At(halfring))
+ && GetCurrentEvent() > 0) return;
+
+ Int_t vaChip = strip/fNumberOfStripsPerChip;
+ TH1S* hChannel = GetChannelHistogram(det,ring,sec,vaChip);
if(!hChannel->GetEntries()) {
- AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",det, ring , sec, strip));
+ AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
+ det, ring , sec, strip));
return;
}
Double_t mean = hChannel->GetMean();
Double_t rms = hChannel->GetRMS();
- Double_t pulse = (Double_t)fCurrentPulse*fPulseSize;
-
- for(Int_t i=1;i<hChannel->GetNbinsX();i++)
- if(hChannel->GetBinCenter(i)>mean+5*rms || hChannel->GetBinCenter(i)<mean-5*rms)
- hChannel->SetBinContent(i,0);
-
- mean = hChannel->GetMean();
- rms = hChannel->GetRMS();
-
- Int_t channelNumber = strip + (GetCurrentEvent()-1)/800;
+ Double_t pulse = (Double_t(fCurrentPulse.At(halfring))
+ * fPulseSize.At(halfring));
+ Int_t firstBin = hChannel->GetXaxis()->GetFirst();
+ Int_t lastBin = hChannel->GetXaxis()->GetLast();
+ hChannel->GetXaxis()->SetRangeUser(mean-4*rms,mean+4*rms);
+
+ mean = hChannel->GetMean();
+ rms = hChannel->GetRMS();
+
+ hChannel->GetXaxis()->SetRange(firstBin,lastBin);
+
+ Int_t channelNumber = (strip +
+ (GetCurrentEvent()-1)
+ / ((fPulseLength.At(halfring)*fHighPulse)
+ / fPulseSize.At(halfring)));
+ if(sec%2)
+ channelNumber = (strip -
+ (GetCurrentEvent()-1)
+ / ((fPulseLength.At(halfring)*fHighPulse)
+ / fPulseSize.At(halfring)));
TGraphErrors* channel = GetChannel(det,ring,sec,channelNumber);
- channel->SetPoint(fCurrentPulse,pulse,mean);
- channel->SetPointError(fCurrentPulse,0,rms);
+ channel->SetPoint(fCurrentPulse.At(halfring),pulse,mean);
+ channel->SetPointError(fCurrentPulse.At(halfring),0,rms);
if(fSaveHistograms) {
- gDirectory->cd(Form("%s:FMD%d%c/sector_%d/strip_%d",fDiagnosticsFilename,det,ring,sec,channelNumber));
- hChannel->Write(Form("hFMD%d%c_%d_%d_pulse_%d",det,ring,sec,channelNumber,fCurrentPulse));
+ gDirectory->cd(GetStripPath(det,ring,sec,channelNumber));
+ hChannel->Write(Form("%s_pulse_%03d",hChannel->GetName(),(Int_t)pulse));
+
}
-
+
hChannel->Reset();
}
//_____________________________________________________________________
-void AliFMDGainDA::ResetPulseAndUpdateChannel() {
-
- fCurrentPulse = 0;
-
+void AliFMDGainDA::ResetPulseAndUpdateChannel()
+{
+ fCurrentPulse.Reset(0);
}
//_____________________________________________________________________
-void AliFMDGainDA::FinishEvent() {
-
- if(GetCurrentEvent()>0 && (GetCurrentEvent()%fPulseLength==0))
- fCurrentPulse++;
-
- if(GetCurrentEvent()>0 && (GetCurrentEvent())%fEventsPerChannel==0)
- fCurrentPulse = 0;
-
-
+void AliFMDGainDA::FinishEvent()
+{
+ for(UShort_t det=1; det<=3;det++) {
+ UShort_t firstring = (det == 1 ? 1 : 0);
+ for(UShort_t iring = firstring; iring <=1;iring++) {
+ Char_t ring = (iring == 1 ? 'I' : 'O');
+ for(UShort_t board =0 ; board <=1; board++) {
+ Int_t idx = GetHalfringIndex(det,ring,board);
+
+ if( !fPulseLength.At(idx) || !fEventsPerChannel.At(idx))
+ continue;
+ if(GetCurrentEvent()>0 && ((GetCurrentEvent() % fPulseLength.At(idx)) == 0))
+ fCurrentPulse.AddAt(fCurrentPulse.At(idx)+1,idx);
+
+ if(GetCurrentEvent()>0 && ((GetCurrentEvent()) % fEventsPerChannel.At(idx)) == 0)
+ fCurrentPulse.AddAt(0,idx);
+ }
+ }
+ }
}
//_____________________________________________________________________
//