X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDBaseDA.cxx;h=83fb7b4527fc69a79db8d60da97b7a77660656ac;hb=a8bc5b77738b51d4dbe85dffd7962805b3f7bcc8;hp=71fbc91766ad1605be29e711622a3ef979c3b01f;hpb=6cf6e7a0c468b412eb91e254349922f68bb74241;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDBaseDA.cxx b/FMD/AliFMDBaseDA.cxx index 71fbc91766a..83fb7b4527f 100644 --- a/FMD/AliFMDBaseDA.cxx +++ b/FMD/AliFMDBaseDA.cxx @@ -27,14 +27,25 @@ // #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 +#include +#include +#include //_____________________________________________________________________ ClassImp(AliFMDBaseDA) @@ -136,12 +147,14 @@ AliFMDBaseDA::AliFMDBaseDA() : fOutputFile(), fConditionsFile(), fSaveHistograms(kFALSE), + fMakeSummaries(kFALSE), fDetectorArray(), fPulseSize(10), fPulseLength(10), fRequiredEvents(0), fCurrentEvent(0), - fRunno(0) + fRunno(0), + fSummaries(0) { //Constructor fSeenDetectors[0] = fSeenDetectors[1] = fSeenDetectors[2] = kFALSE; @@ -156,12 +169,14 @@ 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), - fRunno(baseDA.fRunno) + fRunno(baseDA.fRunno), + fSummaries(0) { //Copy constructor fSeenDetectors[0] = baseDA.fSeenDetectors[0]; @@ -179,17 +194,24 @@ AliFMDBaseDA::~AliFMDBaseDA() //destructor } +//_____________________________________________________________________ +Bool_t AliFMDBaseDA::HaveEnough(Int_t nEvents) const +{ + return nEvents > GetRequiredEvents(); +} +//_____________________________________________________________________ +UShort_t AliFMDBaseDA::GetProgress(Int_t nEvents) const +{ + return UShort_t((nEvents *100)/ GetRequiredEvents()); +} + //_____________________________________________________________________ void AliFMDBaseDA::Run(AliRawReader* reader) { //Run the FMD DA TFile* diagFile = 0; - if (fSaveHistograms) - diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE"); - - - - + // if (fSaveHistograms) + // diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE"); reader->Reset(); fRunno = reader->GetRunNumber(); @@ -200,7 +222,12 @@ void AliFMDBaseDA::Run(AliRawReader* reader) Bool_t sodread = kFALSE; for(Int_t i=0;i<3;i++) { - reader->NextEvent(); // Read Start-of-Run / Start-of-Files event + 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; + } UInt_t eventType = reader->GetType(); if(eventType == AliRawEventHeaderBase::kStartOfData || @@ -214,37 +241,48 @@ void AliFMDBaseDA::Run(AliRawReader* reader) } InitContainer(diagFile); + if (AliLog::GetDebugLevel("FMD","") >= 3) { + fDetectorArray.ls(); + } if(!sodread) AliWarning("No SOD event detected!"); int lastProgress = 0; - - - for(Int_t n =1;n <= GetRequiredEvents(); n++) { - if(!reader->NextEvent()) continue; + for(Int_t i = 0; i< 3;i++) fNEventsPerDetector[i] = 0; + + for(Int_t n = 1; !HaveEnough(n); n++) { + if(!reader->NextEvent()) { n--; continue; } SetCurrentEvent(n); digitArray->Clear(); fmdReader->ReadAdcs(digitArray); + Bool_t seen[] = { false, false, false }; for(Int_t i = 0; iGetEntriesFast();i++) { AliFMDDigit* digit = static_cast(digitArray->At(i)); - fSeenDetectors[digit->Detector()-1] = kTRUE; + UShort_t det = digit->Detector(); + fSeenDetectors[det-1] = true; + seen[det-1] = true; FillChannels(digit); } - + for(Int_t i = 0; i< 3;i++) + if (seen[i]) (fNEventsPerDetector[i])++; + FinishEvent(); - int progress = int((n *100)/ GetRequiredEvents()) ; + int progress = GetProgress(n); if (progress <= lastProgress) continue; lastProgress = progress; std::cout << "Progress: " << lastProgress << " / 100 " << std::endl; } - AliInfo(Form("Looped over %d events",GetCurrentEvent())); + AliInfoF("Looped over %d events (%d,%d,%d)",GetCurrentEvent(), + fNEventsPerDetector[0], + fNEventsPerDetector[1], + fNEventsPerDetector[2]); WriteHeaderToFile(); for(UShort_t det=1;det<=3;det++) { @@ -255,6 +293,9 @@ void AliFMDBaseDA::Run(AliRawReader* reader) 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++) { @@ -262,8 +303,8 @@ void AliFMDBaseDA::Run(AliRawReader* reader) } std::cout << '.' << std::flush; } - if(fSaveHistograms) - diagFile->Flush(); + // if(fSaveHistograms) + // diagFile->Flush(); std::cout << "done" << std::endl; } } @@ -276,7 +317,9 @@ void AliFMDBaseDA::Run(AliRawReader* reader) Terminate(diagFile); if(fSaveHistograms ) { - + diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE"); + fDetectorArray.Write("FMD", TObject::kSingleKey); + fSummaries.Write(); AliInfo("Closing diagnostics file - please wait ..."); // diagFile->Write(); diagFile->Close(); @@ -288,16 +331,13 @@ void AliFMDBaseDA::Run(AliRawReader* reader) void AliFMDBaseDA::InitContainer(TDirectory* diagFile) { - //Prepare container for diagnostics - TObjArray* detArray; - TObjArray* ringArray; - TObjArray* sectorArray; - + //Prepare container for diagnostics TDirectory* savDir = gDirectory; for(UShort_t det=1;det<=3;det++) { - detArray = new TObjArray(); + TObjArray* detArray = new TObjArray(det == 1 ? 1 : 2); detArray->SetOwner(); + detArray->SetName(GetDetectorPath(det, false)); fDetectorArray.AddAtAndExpand(detArray,det); TDirectory* detDir = 0; @@ -311,8 +351,9 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile) Char_t ring = (ir == 0 ? 'O' : 'I'); UShort_t nsec = (ir == 0 ? 40 : 20); UShort_t nstr = (ir == 0 ? 256 : 512); - ringArray = new TObjArray(); + TObjArray* ringArray = new TObjArray(nsec); ringArray->SetOwner(); + ringArray->SetName(GetRingPath(det, ring, false)); detArray->AddAtAndExpand(ringArray,ir); @@ -324,8 +365,9 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile) for(UShort_t sec =0; sec < nsec; sec++) { - sectorArray = new TObjArray(); + TObjArray* sectorArray = new TObjArray(nstr); sectorArray->SetOwner(); + sectorArray->SetName(GetSectorPath(det, ring, sec, false)); ringArray->AddAtAndExpand(sectorArray,sec); @@ -340,8 +382,13 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile) secDir->cd(); secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE)); } - AddChannelContainer(sectorArray, det, ring, sec, strip); + TObjArray* stripArray = new TObjArray(0); + stripArray->SetOwner(true); + stripArray->SetName(GetStripPath(det, ring, sec, strip, false)); + sectorArray->AddAtAndExpand(stripArray, strip); + AddChannelContainer(stripArray, det, ring, sec, strip); } + AddSectorSummary(sectorArray, det, ring, sec, nstr); } } } @@ -415,6 +462,9 @@ void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader) } } } + // sampleRate->WriteToFile(std::cout, fSeenDetectors); + // stripRange->WriteToFile(std::cout, fSeenDetectors); + if(fConditionsFile.is_open()) { fConditionsFile.write("# EOF\n",6); @@ -482,6 +532,301 @@ void AliFMDBaseDA::Rotate(const char* base, int max) const } } +//_____________________________________________________________________ +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 #"); + ret->SetDirectory(0); + // if (!fSummaries) fSummaries = new TObjArray; + fSummaries.Add(ret); + return ret; +} + +//_____________________________________________________________________ +TObjArray* +AliFMDBaseDA::GetDetectorArray(UShort_t det) +{ + if (det < 1 || det > 3) { + AliErrorF("Detector index %d out of bounds", det); + return 0; + } + return static_cast(fDetectorArray.At(det)); +} +//_____________________________________________________________________ +TObjArray* +AliFMDBaseDA::GetRingArray(UShort_t det, Char_t ring) +{ + Int_t idx = (ring == 'O' || ring == 'o' ? 0 : 1); + TObjArray* array = GetDetectorArray(det); + if (!array) return 0; + array = static_cast(array->At(idx)); + if (!array) AliErrorF("No ring array for FMD%d%c (%d)", det, ring, idx); + return array; +} +//_____________________________________________________________________ +TObjArray* +AliFMDBaseDA::GetSectorArray(UShort_t det, Char_t ring, UShort_t sector) +{ + TObjArray* array = GetRingArray(det,ring); + if (!array) return 0; + array = static_cast(array->At(sector)); + if (!array) AliErrorF("No sector array for FMD%d%c[%02d]", det, ring, sector); + return array; +} +//_____________________________________________________________________ +TObjArray* +AliFMDBaseDA::GetStripArray(UShort_t det, Char_t ring, + UShort_t sector, UShort_t strip) +{ + TObjArray* array = GetSectorArray(det,ring,sector); + if (!array) return 0; + array = static_cast(array->At(strip)); + if (!array) AliErrorF("No strip array for FMD%d%c[%02d,%03d]", + det, ring, sector, strip); + return array; +} + +//===================================================================== +AliFMDBaseDA::Runner::Runner() + : fReader(0), + fDiagFile(""), + fDiag(false) +{} + +//_____________________________________________________________________ +void +AliFMDBaseDA::Runner::AddHandlers() +{ + gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", + "*", + "TStreamerInfo", + "RIO", + "TStreamerInfo()"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", "Minuit", + "TMinuitMinimizer", + "Minuit", + "TMinuitMinimizer(const char *)"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", + "GSLMultiMin", + "ROOT::Math::GSLMinimizer", + "MathMore", + "GSLMinimizer(const char *)"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", + "GSLMultiFit", + "ROOT::Math::GSLNLSMinimizer", + "MathMore", "GSLNLSMinimizer(int)"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", + "GSLSimAn", + "ROOT::Math::GSLSimAnMinimizer", + "MathMore", + "GSLSimAnMinimizer(int)"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", + "Linear", + "TLinearMinimizer", + "Minuit", + "TLinearMinimizer(const char *)"); + gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", + "Fumili", + "TFumiliMinimizer", + "Fumili", + "TFumiliMinimizer(int)"); +} +//_____________________________________________________________________ +void +AliFMDBaseDA::Runner::ShowUsage(std::ostream& o, const char* progname) +{ + o << "Usage: " << progname << " SOURCE [OPTIONS]\n\n" + << "Options:\n" + << " -h,--help Show this help\n" + << " -d,--diagnostics[=FILE] Write diagnostics to file\n" + << " -D,--debug=LEVEL Set the debug level\n\n" + << "SOURCE is one of\n" + << " * FILE.raw Raw data file\n" + << " * FILE.root ROOT'ified raw data file\n" + << " * collection://FILE.root Event list in a ROOT file\n" + << " * collection://FILE File containing list of ROOT files\n" + << " * ^FMD Monitor source\n" + << "There are other options too. Check the AliRawReader docs\n" + << std::endl; +} + +//_____________________________________________________________________ +namespace { + Bool_t ExtractValue(const TString& arg, TString& val) + { + val = ""; + Int_t eq = arg.Index("="); + if (eq == kNPOS) return false; + + val = arg(eq+1, arg.Length()-eq-1); + return true; + } +} + +//_____________________________________________________________________ +Int_t +AliFMDBaseDA::Runner::Init(int argc, char** argv) +{ + AddHandlers(); + + // --- Process the command line ------------------------------------ + TString source; + Int_t debugLevel = 0; + Bool_t help = false; + + for (int i = 1; i < argc; i++) { + TString arg(argv[i]); + Bool_t badOption = false; + + if (arg[0] == '-') { // It's an option + if (arg[1] == '-') { // It's a long option + TString val; + if (arg.EqualTo("--help")) help = true; + else if (arg.BeginsWith("--debug")) { + if (ExtractValue(arg, val)) + debugLevel = val.Atoi(); + } + else if (arg.BeginsWith("--diagnostics")) { + fDiag = true; + if (ExtractValue(arg, val)) + fDiagFile = val; + } + else badOption = true; + } + else { // Short option + TString next(i < argc-1 ? argv[i+1] : ""); + switch (arg[1]) { + case 'h': help = true; break; + case 'd': fDiag = true; + if (!next.IsNull() && next[0] != '-') { + fDiagFile = next; + i++; + } + break; + case 'D': + if (!next.IsNull() && next[0] != '-') { + debugLevel = next.Atoi(); + i++; + } + break; + default: badOption = true; + } + } // End of options + if (badOption) { + std::cerr << argv[0] << ": Unknown option " << argv[i] + << std::endl; + return -1; + } + } + else { // source or compatibility debug level + if (source.IsNull()) source = arg; + else debugLevel = arg.Atoi(); + } + } + + // --- Check if help was requested --------------------------------- + if (help) { + ShowUsage(std::cout, argv[0]); + return 1; + } + + // --- Check if we have a source ----------------------------------- + if (source.IsNull()) { + std::cerr << "No source given" << std::endl; + return -2; + } + + // --- Initialize various things ----------------------------------- + AliFMDParameters::Instance()->Init(kFALSE,0); + + //This will only work for FDR 1 data. When newer data becomes + //available the ! must be removed! + Bool_t old = kTRUE; + AliFMDParameters::Instance()->UseCompleteHeader(old); + + AliLog::EnableDebug(debugLevel > 0); + AliLog::SetModuleDebugLevel("FMD", debugLevel); + + // --- Make our reader --------------------------------------------- + fReader = AliRawReader::Create(source); + if (!fReader) { + std::cerr << "Failed to make raw reader for source \"" << source + << "\"" << std::endl; + return -3; + } + return 0; +} + +//_____________________________________________________________________ +Int_t +AliFMDBaseDA::Runner::RunNumber() const +{ + if (!fReader) return -1; + return fReader->GetRunNumber(); +} + +//_____________________________________________________________________ +void +AliFMDBaseDA::Runner::Exec(AliFMDBaseDA& da) +{ + TStopwatch timer; + timer.Start(); + + da.SetSaveDiagnostics(fDiag || !fDiagFile.IsNull()); + if (!fDiagFile.IsNull()) da.SetDiagnosticsFilename(fDiagFile); + + da.Run(fReader); + + timer.Stop(); + timer.Print(); + +#ifdef ALI_AMORE + try { + amore::da::AmoreDA myAmore(amore::da::AmoreDA::kSender); + + for (UShort_t det = 1; det <= 3; det++) { + if (!da.HasSeenDetector(det)) continue; + TObject* runNo = new TObject; + runNo->SetUniqueID(fReader->GetRunNumber()); + myAmore.Send(Form("gainRunNoFMD%d", det), runNo); + } + + TIter next(&da.GetSummaries()); + TObject* obj = 0; + while ((obj = next())) + myAmore.Send(obj->GetName(), obj); + + } + catch (exception& e) { + cerr << "Failed to make AMORE instance: " << e.what() << endl; + } + +#endif +} + + + + + +//_____________________________________________________________________ //_____________________________________________________________________ //