// pulse and the response of the detector.
//
#include "AliFMDGainDA.h"
-#include "iostream"
-#include "fstream"
-#include "AliLog.h"
-#include "TF1.h"
-#include "TH1.h"
-#include "TMath.h"
-#include "TGraphErrors.h"
-#include "AliFMDParameters.h"
#include "AliFMDAltroMapping.h"
+#include "AliFMDParameters.h"
+#include "AliFMDCalibGain.h"
+#include "AliFMDDigit.h"
+#include "AliLog.h"
+#include <TFile.h>
+#include <TF1.h>
+#include <TH1S.h>
+#include <TGraphErrors.h>
+#include <TDatime.h>
+#include <TH2.h>
//_____________________________________________________________________
ClassImp(AliFMDGainDA)
fCurrentChannel(10),
fNumberOfStripsPerChip(128),
fSummaryGains("GainsSummary","Summary of gains",51200,0,51200),
- fCurrentSummaryStrip(1)
+ fCurrentSummaryStrip(1),
+ fGainFMD1i(0),
+ fGainFMD2i(0),
+ fGainFMD2o(0),
+ fGainFMD3i(0),
+ fGainFMD3o(0),
+ fChi2FMD1i(0),
+ fChi2FMD2i(0),
+ fChi2FMD2o(0),
+ fChi2FMD3i(0),
+ fChi2FMD3o(0)
{
+ // Constructor
+ //
+ // Parameters:
+ // None
fCurrentPulse.Reset(0);
fCurrentChannel.Reset(0);
fOutputFile.open("gains.csv");
//_____________________________________________________________________
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)
+ : 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),
+ fGainFMD1i(gainDA.fGainFMD1i),
+ fGainFMD2i(gainDA.fGainFMD2i),
+ fGainFMD2o(gainDA.fGainFMD2o),
+ fGainFMD3i(gainDA.fGainFMD3i),
+ fGainFMD3o(gainDA.fGainFMD3o),
+ fChi2FMD1i(gainDA.fChi2FMD1i),
+ fChi2FMD2i(gainDA.fChi2FMD2i),
+ fChi2FMD2o(gainDA.fChi2FMD2o),
+ fChi2FMD3i(gainDA.fChi2FMD3i),
+ fChi2FMD3o(gainDA.fChi2FMD3o)
{
+ // Copy Constructor
+ //
+ // Parameters:
+ // gainDA Object to copy from
fCurrentPulse.Reset(0);
fCurrentChannel.Reset(0);
}
//_____________________________________________________________________
AliFMDGainDA::~AliFMDGainDA()
{
+ // Destructor
+ //
+ // Parameters:
+ // None
}
//_____________________________________________________________________
void AliFMDGainDA::Init()
{
-
-
+ // Initialize
+ //
+ // Parameters:
+ // None
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
-
+ 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;
+
+ }
SetRequiredEvents(nEventsRequired);
UShort_t sec,
UShort_t strip)
{
+ // Make a channel container
+ //
+ // Parameters:
+ // sectorArray Sectors
+ // det Detector number
+ // ring Ring identifier
+ // sec Sector number
+ // strip Strip number
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",
}
//_____________________________________________________________________
-void AliFMDGainDA::FillChannels(AliFMDDigit* digit) {
+void AliFMDGainDA::FillChannels(AliFMDDigit* digit)
+{
+ // Fill data into histogram
+ //
+ // Parameters:
+ // digit Digit to get the data from
UShort_t det = digit->Detector();
Char_t ring = digit->Ring();
UpdatePulseAndADC(det,ring,sec,strip);
}
+//_____________________________________________________________________
+void AliFMDGainDA::MakeSummary(UShort_t det, Char_t ring)
+{
+ //
+ // Create summary hists for FMD gains and chi2 of the fits
+ //
+ switch (det) {
+ case 1:
+ fGainFMD1i = MakeSummaryHistogram("gain", "Gains", det, ring);
+ fChi2FMD1i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+ break;
+ case 2:
+ switch (ring) {
+ case 'I': case 'i':
+ fGainFMD2i = MakeSummaryHistogram("gain", "Gains", det, ring);
+ fChi2FMD2i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+ break;
+ case 'O': case 'o':
+ fGainFMD2o = MakeSummaryHistogram("gain", "Gains", det, ring);
+ fChi2FMD2o = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+ break;
+ }
+ break;
+ case 3:
+ switch (ring) {
+ case 'I': case 'i':
+ fGainFMD3i = MakeSummaryHistogram("gain", "Gains", det, ring);
+ fChi2FMD3i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+ break;
+ case 'O': case 'o':
+ fGainFMD3o = MakeSummaryHistogram("gain", "Gains", det, ring);
+ fChi2FMD3o = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+ break;
+ }
+ break;
+ }
+}
+
//_____________________________________________________________________
void AliFMDGainDA::Analyse(UShort_t det,
Char_t ring,
UShort_t sec,
- UShort_t strip) {
+ UShort_t strip)
+{
+ // Analyse result of a single strip
+ //
+ // Parameters:
+ // det Detector number
+ // ring Ring identifier
+ // sec Sector number
+ // strip Strip number
TGraphErrors* grChannel = GetChannel(det,ring,sec,strip);
if(!grChannel->GetN()) {
AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
fSummaryGains.SetBinError(fCurrentSummaryStrip,fitFunc.GetParError(1));
fCurrentSummaryStrip++;
+
+ TH2* hGain = 0;
+ TH2* hChi2 = 0;
+ switch (det) {
+ case 1: hGain = fGainFMD1i; hChi2 = fChi2FMD1i; break;
+ case 2:
+ switch (ring) {
+ case 'I': hGain = fGainFMD2i; hChi2 = fChi2FMD2i; break;
+ case 'O': hGain = fGainFMD2o; hChi2 = fChi2FMD2o; break;
+ }
+ break;
+ case 3:
+ switch (ring) {
+ case 'I': hGain = fGainFMD3i; hChi2 = fChi2FMD3i; break;
+ case 'O': hGain = fGainFMD3o; hChi2 = fChi2FMD3o; break;
+ }
+ break;
+ }
+ if (hGain && hChi2) {
+ Int_t bin = hGain->FindBin(sec, strip);
+ hGain->SetBinContent(bin, gain);
+ hGain->SetBinError(bin, error);
+ hChi2->SetBinContent(bin, chi2ndf);
+ }
+
// }
if(fSaveHistograms) {
gDirectory->cd(GetSectorPath(det,ring, sec, kTRUE));
//_____________________________________________________________________
void AliFMDGainDA::Terminate(TFile* diagFile)
{
+ // End of file
+ //
+ // Parameters:
+ // None
if(diagFile) {
diagFile->cd();
fSummaryGains.Write();
//_____________________________________________________________________
void AliFMDGainDA::WriteHeaderToFile()
{
+ // Write header to the output file
+ //
+ // Parameters:
+ // None
AliFMDParameters* pars = AliFMDParameters::Instance();
fOutputFile.write(Form("# %s \n",pars->GetGainShuttleID()),9);
+ TDatime now;
+ fOutputFile << "# This file created from run # " << fRunno
+ << " @ " << now.AsString() << std::endl;
fOutputFile.write("# Detector, "
"Ring, "
"Sector, "
UShort_t sec,
UShort_t strip)
{
+ // Get the current histogram of a single strip
+ //
+ // Parameters:
+ // det Detector number
+ // ring Ring identifier
+ // sec Sector number
+ // strip Strip number
- UShort_t Ring = 1;
+ UShort_t lRing = 1;
if(ring == 'O')
- Ring = 0;
+ lRing = 0;
TObjArray* detArray = static_cast<TObjArray*>(fGainArray.At(det));
- TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(Ring));
+ TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(lRing));
TObjArray* secArray = static_cast<TObjArray*>(ringArray->At(sec));
TH1S* hChannel = static_cast<TH1S*>(secArray->At(strip));
UShort_t sec,
UShort_t strip)
{
+ // Get the graph of a single strip
+ //
+ // Parameters:
+ // det Detector number
+ // ring Ring identifier
+ // sec Sector number
+ // strip Strip number
UShort_t iring = (ring == 'O' ? 0 : 1);
TObjArray* detArray = static_cast<TObjArray*>(fDetectorArray.At(det));
TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(iring));
UShort_t sec,
UShort_t strip)
{
+ // Go to next pulse size
+ //
+ // Parameters:
+ // det Detector number
+ // ring Ring identifier
+ // sec Sector number
+ // strip Strip number
AliFMDParameters* pars = AliFMDParameters::Instance();
// UInt_t ddl, board,chip,ch;
//_____________________________________________________________________
void AliFMDGainDA::ResetPulseAndUpdateChannel()
{
+ // Reset all
+ //
+ // Parameters:
+ // None
fCurrentPulse.Reset(0);
}
//_____________________________________________________________________
void AliFMDGainDA::FinishEvent()
{
+ // End of event
+ //
+ // Parameters:
+ // None
for(UShort_t det=1; det<=3;det++) {
UShort_t firstring = (det == 1 ? 1 : 0);
for(UShort_t iring = firstring; iring <=1;iring++) {
for(UShort_t board =0 ; board <=1; board++) {
Int_t idx = GetHalfringIndex(det,ring,board);
- if( !fPulseLength.At(idx) || !fEventsPerChannel.At(idx))
+ if(!fPulseLength.At(idx) || !fEventsPerChannel.At(idx))
continue;
- if(GetCurrentEvent()>0 && ((GetCurrentEvent() % fPulseLength.At(idx)) == 0))
+ if(GetCurrentEvent()>0 &&
+ ((GetCurrentEvent() % fPulseLength.At(idx)) == 0))
fCurrentPulse.AddAt(fCurrentPulse.At(idx)+1,idx);
- if(GetCurrentEvent()>0 && ((GetCurrentEvent()) % fEventsPerChannel.At(idx)) == 0)
+ if(GetCurrentEvent()>0 &&
+ ((GetCurrentEvent()) % fEventsPerChannel.At(idx)) == 0)
fCurrentPulse.AddAt(0,idx);
}
}