X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDGainDA.cxx;h=10f5e0f4be2fed9c716ed825a4e8a7cc73aa6a83;hb=40f7300754976d88c65508560454d6450c77ddfd;hp=d92b32f2e588bd45f1765eb26632a40d3182668b;hpb=f7f0b643e1c26479fdcc7b201e9031de3d4e4c72;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDGainDA.cxx b/FMD/AliFMDGainDA.cxx index d92b32f2e58..10f5e0f4be2 100644 --- a/FMD/AliFMDGainDA.cxx +++ b/FMD/AliFMDGainDA.cxx @@ -29,14 +29,17 @@ // 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 "AliFMDAltroMapping.h" #include "AliFMDParameters.h" +#include "AliFMDCalibGain.h" +#include "AliFMDDigit.h" +#include "AliLog.h" +#include +#include +#include +#include +#include +#include //_____________________________________________________________________ ClassImp(AliFMDGainDA) @@ -48,14 +51,28 @@ ClassImp(AliFMDGainDA) AliFMDGainDA::AliFMDGainDA() : AliFMDBaseDA(), fGainArray(), - //fPulseSize(32), fHighPulse(256), - //fPulseLength(100), - fEventsPerChannel(16), - fCurrentPulse(16), - fCurrentChannel(16), - fNumberOfStripsPerChip(128) + fEventsPerChannel(10), + fCurrentPulse(10), + fCurrentChannel(10), + fNumberOfStripsPerChip(128), + fSummaryGains("GainsSummary","Summary of gains",51200,0,51200), + 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"); @@ -64,16 +81,30 @@ AliFMDGainDA::AliFMDGainDA() //_____________________________________________________________________ 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) + : 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); } @@ -81,27 +112,33 @@ AliFMDGainDA::AliFMDGainDA(const AliFMDGainDA & gainDA) //_____________________________________________________________________ AliFMDGainDA::~AliFMDGainDA() { + // Destructor + // + // Parameters: + // None } //_____________________________________________________________________ void AliFMDGainDA::Init() { - - + // Initialize + // + // Parameters: + // None Int_t nEventsRequired = 0; - for(Int_t i=0;inEventsRequired) nEventsRequired = nEvents * fNumberOfStripsPerChip; - - } - - std::cout<nEventsRequired) + nEventsRequired = nEvents * fNumberOfStripsPerChip; + + } SetRequiredEvents(nEventsRequired); + TObjArray* detArray; TObjArray* ringArray; TObjArray* sectorArray; @@ -140,6 +177,14 @@ void AliFMDGainDA::AddChannelContainer(TObjArray* sectorArray, 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", @@ -148,49 +193,142 @@ void AliFMDGainDA::AddChannelContainer(TObjArray* sectorArray, } //_____________________________________________________________________ -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(); 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); hChannel->Fill(digit->Counts()); 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", - // det, ring , sec, strip)); + AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d", + det, ring , sec, strip)); return; } TF1 fitFunc("fitFunc","pol1",-10,280); fitFunc.SetParameters(100,3); grChannel->Fit("fitFunc","Q0+","",0,fHighPulse); - Float_t chi2ndf = 0; - if(fitFunc.GetNDF()) - chi2ndf = fitFunc.GetChisquare() / fitFunc.GetNDF(); - + 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 << det << ',' << ring << ',' << sec << ',' << strip << ',' - << fitFunc.GetParameter(1) << ',' - << fitFunc.GetParError(1) << ',' + << 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++; + + 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)); @@ -215,11 +353,31 @@ void AliFMDGainDA::Analyse(UShort_t det, } } +//_____________________________________________________________________ +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, " @@ -236,14 +394,21 @@ TH1S* AliFMDGainDA::GetChannelHistogram(UShort_t det, 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(fGainArray.At(det)); - TObjArray* ringArray = static_cast(detArray->At(Ring)); + TObjArray* ringArray = static_cast(detArray->At(lRing)); TObjArray* secArray = static_cast(ringArray->At(sec)); TH1S* hChannel = static_cast(secArray->At(strip)); @@ -256,6 +421,13 @@ TGraphErrors* AliFMDGainDA::GetChannel(UShort_t det, 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(fDetectorArray.At(det)); TObjArray* ringArray = static_cast(detArray->At(iring)); @@ -271,15 +443,30 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, 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; - pars->Detector2Hardware(det,ring,sec,strip,ddl,board,chip,ch); - Int_t halfring = GetHalfringIndex(det,ring,board%16); + // 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(strip % fNumberOfStripsPerChip) return; - if(((GetCurrentEvent()) % fPulseLength.At(halfring)) && GetCurrentEvent() > 0) return; + 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); @@ -291,7 +478,8 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, } Double_t mean = hChannel->GetMean(); Double_t rms = hChannel->GetRMS(); - Double_t pulse = Double_t(fCurrentPulse.At(halfring)) * fPulseSize.At(halfring); + 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); @@ -301,7 +489,15 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, hChannel->GetXaxis()->SetRange(firstBin,lastBin); - Int_t channelNumber = strip + (GetCurrentEvent()-1)/((fPulseLength.At(halfring)*fHighPulse)/fPulseSize.At(halfring)); + 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); @@ -313,10 +509,7 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, hChannel->Write(Form("%s_pulse_%03d",hChannel->GetName(),(Int_t)pulse)); } - - - - + hChannel->Reset(); } @@ -324,19 +517,38 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, //_____________________________________________________________________ void AliFMDGainDA::ResetPulseAndUpdateChannel() { - //for(Int_t i=0; i0 && (GetCurrentEvent() % fPulseLength.At(i) == 0)) - fCurrentPulse.AddAt(fCurrentPulse.At(i)+1,i); - - if(GetCurrentEvent()>0 && (GetCurrentEvent()) % fEventsPerChannel.At(i) == 0) - fCurrentPulse.AddAt(0,i); + // 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++) { + 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); + } + } } } //_____________________________________________________________________