X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDBaseDA.cxx;h=82debd4040703f2b38f6590dd09bab6f8a543d09;hb=f7d63a57c61a64a0f6d86e2c0624b2b5cd5ff71f;hp=997036195f0208a6b15ebef01d1a3312cd03ada0;hpb=82d718282436a0e51ce884648fabf5cb2a6ff7ca;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDBaseDA.cxx b/FMD/AliFMDBaseDA.cxx index 997036195f0..82debd40407 100644 --- a/FMD/AliFMDBaseDA.cxx +++ b/FMD/AliFMDBaseDA.cxx @@ -19,170 +19,239 @@ @brief Base class for detector algorithms. */ // -//This is the implementation of the (virtual) base class for the FMD detector -//algorithms(DA). It implements the creation of the relevant containers and handles the -//loop over the raw data. The derived classes can control the parameters and action -//to be taken making this the base class for the Pedestal, Gain and Physics DA. +// This is the implementation of the (virtual) base class for the FMD +// detector algorithms(DA). It implements the creation of the relevant +// containers and handles the loop over the raw data. The derived +// classes can control the parameters and action to be taken making +// this the base class for the Pedestal, Gain and Physics DA. // #include "AliFMDBaseDA.h" #include "iostream" - #include "AliFMDRawReader.h" +#include "AliFMDCalibSampleRate.h" +#include "AliFMDCalibStripRange.h" #include "AliLog.h" +#include "AliRawEventHeaderBase.h" + //_____________________________________________________________________ ClassImp(AliFMDBaseDA) +#if 0 +; // Do not delete - to let Emacs for mat the code +#endif + +//_____________________________________________________________________ +const char* +AliFMDBaseDA::GetStripPath(UShort_t det, + Char_t ring, + UShort_t sec, + UShort_t str, + Bool_t full) const +{ + return Form("%s%sFMD%d%c[%02d,%03d]", + (full ? GetSectorPath(det, ring, sec, full) : ""), + (full ? "/" : ""), det, ring, sec, str); +} +//_____________________________________________________________________ +const char* +AliFMDBaseDA::GetSectorPath(UShort_t det, + Char_t ring, + UShort_t sec, + Bool_t full) const +{ + return Form("%s%sFMD%d%c[%02d]", + (full ? GetRingPath(det, ring, full) : ""), + (full ? "/" : ""), det, ring, sec); +} +//_____________________________________________________________________ +const char* +AliFMDBaseDA::GetRingPath(UShort_t det, + Char_t ring, + Bool_t full) const +{ + return Form("%s%sFMD%d%c", + (full ? GetDetectorPath(det, full) : ""), + (full ? "/" : ""), det, ring); +} +//_____________________________________________________________________ +const char* +AliFMDBaseDA::GetDetectorPath(UShort_t det, + Bool_t full) const +{ + return Form("%s%sFMD%d", + (full ? fDiagnosticsFilename.Data() : ""), + (full ? ":/" : ""), det); +} //_____________________________________________________________________ -AliFMDBaseDA::AliFMDBaseDA() : TNamed(), +AliFMDBaseDA::AliFMDBaseDA() : + TNamed(), fDiagnosticsFilename("diagnosticsHistograms.root"), fOutputFile(), fConditionsFile(), fSaveHistograms(kFALSE), fDetectorArray(), + fPulseSize(10), + fPulseLength(10), fRequiredEvents(0), fCurrentEvent(0) -{ + { + fSeenDetectors[0] = fSeenDetectors[1] = fSeenDetectors[2] = kFALSE; fDetectorArray.SetOwner(); fConditionsFile.open("conditions.csv"); } //_____________________________________________________________________ AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) : TNamed(baseDA), - fDiagnosticsFilename(baseDA.fDiagnosticsFilename), + fDiagnosticsFilename(baseDA.fDiagnosticsFilename.Data()), fOutputFile(), fConditionsFile(), fSaveHistograms(baseDA.fSaveHistograms), fDetectorArray(baseDA.fDetectorArray), + fPulseSize(baseDA.fPulseSize), + fPulseLength(baseDA.fPulseLength), fRequiredEvents(baseDA.fRequiredEvents), fCurrentEvent(baseDA.fCurrentEvent) { + fSeenDetectors[0] = baseDA.fSeenDetectors[0]; + fSeenDetectors[1] = baseDA.fSeenDetectors[1]; + fSeenDetectors[2] = baseDA.fSeenDetectors[2]; + fDetectorArray.SetOwner(); } //_____________________________________________________________________ -AliFMDBaseDA::~AliFMDBaseDA() { - +AliFMDBaseDA::~AliFMDBaseDA() +{ //destructor - } //_____________________________________________________________________ -void AliFMDBaseDA::Run(AliRawReader* reader) { +void AliFMDBaseDA::Run(AliRawReader* reader) +{ + TFile* diagFile = 0; + if (fSaveHistograms) + diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE"); + + - InitContainer(); - - Init(); - - TFile* diagFile = 0; - if(fSaveHistograms) - { - diagFile = TFile::Open(fDiagnosticsFilename,"RECREATE"); - for(UShort_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); - UShort_t nstr = (ir == 0 ? 256 : 512); - - gDirectory->cd(Form("%s:/",fDiagnosticsFilename)); - gDirectory->mkdir(Form("FMD%d%c",det,ring),Form("FMD%d%c",det,ring)); - for(UShort_t sec =0; sec < nsec; sec++) { - gDirectory->cd(Form("%s:/FMD%d%c",fDiagnosticsFilename,det,ring)); - gDirectory->mkdir(Form("sector_%d",sec)); - for(UShort_t strip = 0; strip < nstr; strip++) { - gDirectory->cd(Form("%s:/FMD%d%c/sector_%d",fDiagnosticsFilename,det,ring,sec)); - gDirectory->mkdir(Form("strip_%d",strip)); - - } - } - } - } - - } - reader->Reset(); + AliFMDRawReader* fmdReader = new AliFMDRawReader(reader,0); + TClonesArray* digitArray = new TClonesArray("AliFMDDigit",0); + Bool_t SOD_read = kFALSE; - AliFMDRawReader* fmdReader = new AliFMDRawReader(reader,0); - TClonesArray* digitArray = new TClonesArray("AliFMDDigit",0); + for(Int_t i=0;i<3;i++) { + reader->NextEvent(); // Read Start-of-Run / Start-of-Files event + + UInt_t eventType = reader->GetType(); + if(eventType == AliRawEventHeaderBase::kStartOfData || + eventType == AliRawEventHeaderBase::kFormatError) { + + WriteConditionsData(fmdReader); + Init(); + SOD_read = kTRUE; + break; + } + } - WriteConditionsData(); + InitContainer(diagFile); - reader->NextEvent(); - reader->NextEvent(); + if(!SOD_read) + AliWarning("No SOD event detected!"); + int lastProgress = 0; - for(Int_t n =1;n <= GetRequiredEvents(); n++) - { - if(!reader->NextEvent()) - continue; - - SetCurrentEvent(*(reader->GetEventId())); - - digitArray->Clear(); - fmdReader->ReadAdcs(digitArray); - - - //std::cout<<"In event # "<< *(reader->GetEventId()) << " with " <GetEntries()<<" digits \r"<GetEntries();i++) { - AliFMDDigit* digit = static_cast(digitArray->At(i)); - FillChannels(digit); - } - - FinishEvent(); - + + + for(Int_t n =1;n <= GetRequiredEvents(); n++) { + if(!reader->NextEvent()) continue; + SetCurrentEvent(n); + digitArray->Clear(); + fmdReader->ReadAdcs(digitArray); + + 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++) { Char_t ring = (ir == 0 ? 'O' : 'I'); UShort_t nsec = (ir == 0 ? 40 : 20); UShort_t nstr = (ir == 0 ? 256 : 512); + std::cout << " Ring " << ring << ": " << std::flush; for(UShort_t sec =0; sec < nsec; sec++) { for(UShort_t strip = 0; strip < nstr; strip++) { Analyse(det,ring,sec,strip); - } + std::cout << '.' << std::flush; } + if(fSaveHistograms) + diagFile->Flush(); + std::cout << "done" << std::endl; } } - + if(fOutputFile.is_open()) { - fOutputFile.write("# EOF\n",6); fOutputFile.close(); - } + Terminate(diagFile); + if(fSaveHistograms ) { - AliInfo("Closing diagnostics file...please wait"); + + AliInfo("Closing diagnostics file - please wait ..."); + // diagFile->Write(); diagFile->Close(); + AliInfo("done"); + } } //_____________________________________________________________________ -void AliFMDBaseDA::InitContainer(){ - +void AliFMDBaseDA::InitContainer(TDirectory* diagFile) +{ TObjArray* detArray; TObjArray* ringArray; TObjArray* sectorArray; + TDirectory* savDir = gDirectory; + for(UShort_t det=1;det<=3;det++) { detArray = new TObjArray(); detArray->SetOwner(); fDetectorArray.AddAtAndExpand(detArray,det); + + TDirectory* detDir = 0; + if (diagFile) { + diagFile->cd(); + detDir = diagFile->mkdir(GetDetectorPath(det, kFALSE)); + } + UShort_t FirstRing = (det == 1 ? 1 : 0); for (UShort_t ir = FirstRing; ir < 2; ir++) { Char_t ring = (ir == 0 ? 'O' : 'I'); @@ -191,37 +260,122 @@ void AliFMDBaseDA::InitContainer(){ ringArray = new TObjArray(); ringArray->SetOwner(); detArray->AddAtAndExpand(ringArray,ir); + + + TDirectory* ringDir = 0; + if (detDir) { + detDir->cd(); + ringDir = detDir->mkdir(GetRingPath(det,ring, kFALSE)); + } + + for(UShort_t sec =0; sec < nsec; sec++) { sectorArray = new TObjArray(); sectorArray->SetOwner(); ringArray->AddAtAndExpand(sectorArray,sec); + + + TDirectory* secDir = 0; + if (ringDir) { + ringDir->cd(); + secDir = ringDir->mkdir(GetSectorPath(det, ring, sec, kFALSE)); + } + for(UShort_t strip = 0; strip < nstr; strip++) { + if (secDir) { + secDir->cd(); + secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE)); + } AddChannelContainer(sectorArray, det, ring, sec, strip); } } } } + savDir->cd(); } //_____________________________________________________________________ -void AliFMDBaseDA::WriteConditionsData() { - +void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader) +{ AliFMDParameters* pars = AliFMDParameters::Instance(); fConditionsFile.write(Form("# %s \n",pars->GetConditionsShuttleID()),14); - fConditionsFile.write("# Sample Rate, timebins \n",25); - - UInt_t sampleRate = 4; - UInt_t timebins = 544; - fConditionsFile << sampleRate << ',' - << timebins <<"\n"; - //if(fConditionsFile.is_open()) { - // - // fConditionsFile.write("# EOF\n",6); - // fConditionsFile.close(); + + AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate(); + AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange(); + + fmdReader->ReadSODevent(sampleRate,stripRange,fPulseSize,fPulseLength, + fSeenDetectors); + + sampleRate->WriteToFile(fConditionsFile, fSeenDetectors); + stripRange->WriteToFile(fConditionsFile, fSeenDetectors); + + + // Zero Suppresion + + // Strip Range + + fConditionsFile.write("# Gain Events \n",15); + + 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.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"; + + } + } + } + if(fConditionsFile.is_open()) { + + fConditionsFile.write("# EOF\n",6); + fConditionsFile.close(); - //} + } } +//_____________________________________________________________________ +Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) { + + UShort_t iring = (ring == 'I' ? 1 : 0); + + Int_t index = (((det-1) << 2) | (iring << 1) | (board << 0)); + + return index-2; + +} + //_____________________________________________________________________ //