X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDBaseDA.cxx;h=ad9febb98cb6245d65ea2fe00b0a7ee94e8f2f02;hb=f3d2feeb9359c6f3b0a64b55de87c936e24b4834;hp=ebb9020df9e19fbd38d275adbcb039c4a54634fb;hpb=433a88bd33351de270b61cb5f2bea8fe4249166c;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDBaseDA.cxx b/FMD/AliFMDBaseDA.cxx index ebb9020df9e..ad9febb98cb 100644 --- a/FMD/AliFMDBaseDA.cxx +++ b/FMD/AliFMDBaseDA.cxx @@ -27,12 +27,22 @@ // #include "AliFMDBaseDA.h" -#include "iostream" - +#include "AliRawReader.h" +#include "AliFMDDigit.h" +#include "AliFMDParameters.h" #include "AliFMDRawReader.h" #include "AliFMDCalibSampleRate.h" #include "AliFMDCalibStripRange.h" #include "AliLog.h" +#include "AliRawEventHeaderBase.h" +#include "AliFMDDigit.h" +#include +#include +#include +#include +#include +#include +#include //_____________________________________________________________________ ClassImp(AliFMDBaseDA) #if 0 @@ -47,6 +57,17 @@ AliFMDBaseDA::GetStripPath(UShort_t det, UShort_t str, Bool_t full) const { + // Get the strip path + // + // Parameters + // det Detector number + // ring Ring identifier + // sec Sector number + // str Strip number + // full If true, return full path + // + // Return + // The path return Form("%s%sFMD%d%c[%02d,%03d]", (full ? GetSectorPath(det, ring, sec, full) : ""), (full ? "/" : ""), det, ring, sec, str); @@ -58,6 +79,17 @@ AliFMDBaseDA::GetSectorPath(UShort_t det, UShort_t sec, Bool_t full) const { + // Get the strip path + // + // Parameters + // det Detector number + // ring Ring identifier + // sec Sector number + // str Strip number + // full If true, return full path + // + // Return + // The path return Form("%s%sFMD%d%c[%02d]", (full ? GetRingPath(det, ring, full) : ""), (full ? "/" : ""), det, ring, sec); @@ -68,6 +100,17 @@ AliFMDBaseDA::GetRingPath(UShort_t det, Char_t ring, Bool_t full) const { + // Get the strip path + // + // Parameters + // det Detector number + // ring Ring identifier + // sec Sector number + // str Strip number + // full If true, return full path + // + // Return + // The path return Form("%s%sFMD%d%c", (full ? GetDetectorPath(det, full) : ""), (full ? "/" : ""), det, ring); @@ -77,6 +120,17 @@ const char* AliFMDBaseDA::GetDetectorPath(UShort_t det, Bool_t full) const { + // Get the strip path + // + // Parameters + // det Detector number + // ring Ring identifier + // sec Sector number + // str Strip number + // full If true, return full path + // + // Return + // The path return Form("%s%sFMD%d", (full ? fDiagnosticsFilename.Data() : ""), (full ? ":/" : ""), det); @@ -89,13 +143,19 @@ AliFMDBaseDA::AliFMDBaseDA() : fOutputFile(), fConditionsFile(), fSaveHistograms(kFALSE), + fMakeSummaries(kFALSE), fDetectorArray(), - fPulseSize(16), - fPulseLength(16), + fPulseSize(10), + fPulseLength(10), fRequiredEvents(0), - fCurrentEvent(0) - { + fCurrentEvent(0), + fRunno(0), + fSummaries(0) +{ + //Constructor + fSeenDetectors[0] = fSeenDetectors[1] = fSeenDetectors[2] = kFALSE; fDetectorArray.SetOwner(); + Rotate("conditions.csv", 3); fConditionsFile.open("conditions.csv"); } //_____________________________________________________________________ @@ -105,12 +165,20 @@ AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) : fOutputFile(), fConditionsFile(), fSaveHistograms(baseDA.fSaveHistograms), + fMakeSummaries(baseDA.fMakeSummaries), fDetectorArray(baseDA.fDetectorArray), fPulseSize(baseDA.fPulseSize), fPulseLength(baseDA.fPulseLength), fRequiredEvents(baseDA.fRequiredEvents), - fCurrentEvent(baseDA.fCurrentEvent) + fCurrentEvent(baseDA.fCurrentEvent), + fRunno(baseDA.fRunno), + fSummaries(0) { + //Copy constructor + fSeenDetectors[0] = baseDA.fSeenDetectors[0]; + fSeenDetectors[1] = baseDA.fSeenDetectors[1]; + fSeenDetectors[2] = baseDA.fSeenDetectors[2]; + fDetectorArray.SetOwner(); } @@ -125,59 +193,87 @@ AliFMDBaseDA::~AliFMDBaseDA() //_____________________________________________________________________ void AliFMDBaseDA::Run(AliRawReader* reader) { + //Run the FMD DA TFile* diagFile = 0; if (fSaveHistograms) diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE"); - WriteConditionsData(); - InitContainer(diagFile); - Init(); - - - reader->Reset(); + + reader->Reset(); + fRunno = reader->GetRunNumber(); + AliFMDRawReader* fmdReader = new AliFMDRawReader(reader,0); TClonesArray* digitArray = new TClonesArray("AliFMDDigit",0); + + Bool_t sodread = kFALSE; + + for(Int_t i=0;i<3;i++) { + if (!reader->NextEvent()) { + // Read Start-of-Run / Start-of-Files event + AliWarning(Form("Failed to read the %d%s event", + i+1, (i == 0 ? "st" : (i == 1 ? "nd" : "rd")))); + break; + } - reader->NextEvent(); // Read Start-of-Run event - reader->NextEvent(); // Read Start-of-Files event + UInt_t eventType = reader->GetType(); + if(eventType == AliRawEventHeaderBase::kStartOfData || + eventType == AliRawEventHeaderBase::kFormatError) { + + WriteConditionsData(fmdReader); + Init(); + sodread = kTRUE; + break; + } + } + + InitContainer(diagFile); + + if(!sodread) + AliWarning("No SOD event detected!"); + int lastProgress = 0; + + for(Int_t n =1;n <= GetRequiredEvents(); n++) { if(!reader->NextEvent()) continue; - - SetCurrentEvent(*(reader->GetEventId())); - + SetCurrentEvent(n); digitArray->Clear(); fmdReader->ReadAdcs(digitArray); - AliDebug(5, Form("In event # %d with %d entries", - *(reader->GetEventId()), digitArray->GetEntriesFast())); - for(Int_t i = 0; iGetEntriesFast();i++) { AliFMDDigit* digit = static_cast(digitArray->At(i)); + fSeenDetectors[digit->Detector()-1] = kTRUE; FillChannels(digit); } + FinishEvent(); + int progress = int((n *100)/ GetRequiredEvents()) ; if (progress <= lastProgress) continue; lastProgress = progress; std::cout << "Progress: " << lastProgress << " / 100 " << std::endl; + } - + AliInfo(Form("Looped over %d events",GetCurrentEvent())); WriteHeaderToFile(); for(UShort_t det=1;det<=3;det++) { + if (!fSeenDetectors[det-1]) continue; std::cout << "FMD" << det << std::endl; - UShort_t FirstRing = (det == 1 ? 1 : 0); - for (UShort_t ir = FirstRing; ir < 2; ir++) { + UShort_t firstRing = (det == 1 ? 1 : 0); + for (UShort_t ir = firstRing; ir < 2; ir++) { Char_t ring = (ir == 0 ? 'O' : 'I'); UShort_t nsec = (ir == 0 ? 40 : 20); UShort_t nstr = (ir == 0 ? 256 : 512); + + if (fMakeSummaries) MakeSummary(det, ring); + std::cout << " Ring " << ring << ": " << std::flush; for(UShort_t sec =0; sec < nsec; sec++) { for(UShort_t strip = 0; strip < nstr; strip++) { @@ -186,30 +282,32 @@ void AliFMDBaseDA::Run(AliRawReader* reader) std::cout << '.' << std::flush; } if(fSaveHistograms) - diagFile->Flush(); + diagFile->Flush(); std::cout << "done" << std::endl; } } - + if(fOutputFile.is_open()) { fOutputFile.write("# EOF\n",6); fOutputFile.close(); } + Terminate(diagFile); + if(fSaveHistograms ) { - Terminate(diagFile); - AliInfo("Closing diagnostics file - please wait ..."); // diagFile->Write(); diagFile->Close(); AliInfo("done"); + } } //_____________________________________________________________________ void AliFMDBaseDA::InitContainer(TDirectory* diagFile) { + //Prepare container for diagnostics TObjArray* detArray; TObjArray* ringArray; TObjArray* sectorArray; @@ -270,80 +368,75 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile) } //_____________________________________________________________________ -void AliFMDBaseDA::WriteConditionsData() +void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader) { + //Write the conditions data to file AliFMDParameters* pars = AliFMDParameters::Instance(); fConditionsFile.write(Form("# %s \n",pars->GetConditionsShuttleID()),14); + TDatime now; + fConditionsFile << "# This file created from run number " << fRunno + << " at " << now.AsString() << std::endl; - // fConditionsFile.write("# Sample Rate, timebins \n",25); - - // Sample Rate - - UShort_t defSampleRate = 4; - UShort_t sampleRateFromSOD; - //UInt_t timebins = 544; AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate(); - - UShort_t firstStrip = 0; - UShort_t lastStrip = 127; - UShort_t firstStripSOD; - UShort_t lastStripSOD; AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange(); - for(Int_t det=1;det<=3;det++) { - UShort_t FirstRing = (det == 1 ? 1 : 0); - for (UShort_t ir = FirstRing; ir < 2; ir++) { - Char_t ring = (ir == 0 ? 'O' : 'I'); - UShort_t nsec = (ir == 0 ? 40 : 20); - for(UShort_t sec =0; sec < nsec; sec++) { - sampleRateFromSOD = defSampleRate; - sampleRate->Set(det,ring,sec,0,sampleRateFromSOD); - firstStripSOD = firstStrip; - lastStripSOD = lastStrip; - stripRange->Set(det,ring,sec,0,firstStripSOD,lastStripSOD); - - } - } - } - - sampleRate->WriteToFile(fConditionsFile); - stripRange->WriteToFile(fConditionsFile); - pars->SetSampleRate(sampleRate); - pars->SetStripRange(stripRange); + fmdReader->ReadSODevent(sampleRate,stripRange,fPulseSize,fPulseLength, + fSeenDetectors); + + sampleRate->WriteToFile(fConditionsFile, fSeenDetectors); + stripRange->WriteToFile(fConditionsFile, fSeenDetectors); // Zero Suppresion // Strip Range - - - - - // Gain Relevant stuff - - UShort_t defPulseSize = 32 ; - UShort_t defPulseLength = 100 ; - UShort_t pulseSizeFromSOD; - UShort_t pulseLengthFromSOD; + fConditionsFile.write("# Gain Events \n",15); - fPulseSize.Reset(defPulseSize); - fPulseLength.Reset(defPulseLength); - - for(UShort_t det=1;det<=3;det++) - for(UShort_t iring=0;iring<=1;iring++) - for(UShort_t board=0;board<=1;board++) { - pulseSizeFromSOD = defPulseSize; - pulseLengthFromSOD = defPulseLength; - - fPulseSize.AddAt(pulseSizeFromSOD,GetHalfringIndex(det,iring,board)); - fPulseLength.AddAt(pulseLengthFromSOD,GetHalfringIndex(det,iring,board)); + for(UShort_t det=1; det<=3;det++) { + if (!fSeenDetectors[det-1]) { + continue; + } + 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); + + fConditionsFile << det << ',' + << ring << ',' + << board << ',' + << fPulseLength.At(idx) << "\n"; + } - + } + } - // fConditionsFile << defSampleRate << ',' - // << timebins <<"\n"; + fConditionsFile.write("# Gain Pulse \n",14); + for(UShort_t det=1; det<=3;det++) { + if (!fSeenDetectors[det-1]) { + continue; + } + 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); + + fConditionsFile << det << ',' + << ring << ',' + << board << ',' + << fPulseSize.At(idx) << "\n"; + + } + } + } + // sampleRate->WriteToFile(std::cout, fSeenDetectors); + // stripRange->WriteToFile(std::cout, fSeenDetectors); + if(fConditionsFile.is_open()) { fConditionsFile.write("# EOF\n",6); @@ -353,16 +446,91 @@ void AliFMDBaseDA::WriteConditionsData() } //_____________________________________________________________________ -Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) { - +Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, + UShort_t board) const +{ + // Get the index corresponding to a half-ring + // + // Parameters: + // det Detector number + // ring Ring identifier + // board Board number + // + // Return + // Internal index of the board UShort_t iring = (ring == 'I' ? 1 : 0); Int_t index = (((det-1) << 2) | (iring << 1) | (board << 0)); - return index; + return index-2; } +//_____________________________________________________________________ +void AliFMDBaseDA::Rotate(const char* base, int max) const +{ + // + // Rotate a set of files. base is the basic name of the files. + // If the file base.max exists it is removed. + // If the file base.n exists (where n < max) it is renamed to + // base.(n-1). + // If the file base exists, it is renamed to base.1 + // + // Parameters: + // base Base name of the files + // max Maximum number to keep (minus one for the current). + + // Note: TSystem::AccessPathName returns false if the condition is + // fulfilled! + + // Check if we have base.max, and if so, remove it. + TString testName(Form("%s.%d", base, max)); + if (!gSystem->AccessPathName(testName.Data())) + gSystem->Unlink(testName.Data()); + + // Loop down from max-1 to 1 and move files + for (int i = max-1; i >= 1; i--) { + testName = Form("%s.%d", base, i); + if (!gSystem->AccessPathName(testName.Data())) { + TString newName(Form("%s.%d", base, i+1)); + gSystem->Rename(testName.Data(), newName.Data()); + } + } + + // If we have the file base, rename it to base.1 + testName = Form("%s", base); + if (!gSystem->AccessPathName(testName.Data())){ + TString newName(Form("%s.%d", base, 1)); + gSystem->Rename(testName.Data(), newName.Data()); + } +} +//_____________________________________________________________________ +TH2* +AliFMDBaseDA::MakeSummaryHistogram(const char* prefix, const char* title, + UShort_t d, Char_t r) +{ + // + // Utility function for defining summary histograms + // + // Parameters: + // det Detector + // ring Ring identifier + // prefix Histogram prefix + // title Histogram title + // + Int_t nX = ((d == 1 || r == 'I' || r == 'i') ? 20 : 40); + Int_t nY = ((d == 1 || r == 'I' || r == 'i') ? 512 : 256); + + TH2* ret = new TH2F(Form("%sFMD%d%c", prefix, d, r), + Form("%s for FMD%d%c", title, d, r), + nX, -0.5, nX-0.5, nY, -0.5, nY-0.5); + ret->SetXTitle("Sector #"); + ret->SetYTitle("Strip #"); + + // if (!fSummaries) fSummaries = new TObjArray; + fSummaries.Add(ret); + return ret; +} //_____________________________________________________________________ //