X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliQADataMakerSteer.cxx;h=2b78a24cf07053c0851e0a1db5a0ebb8986f2797;hb=126f4d0c047ea157ec2b09a69f98e2976e1865d3;hp=1f7bb69c25eb6ac78e3a81e138568eb5cd979292;hpb=dfe289e906d8f211c8046f7dd25fd2ae9acacfbc;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliQADataMakerSteer.cxx b/STEER/AliQADataMakerSteer.cxx index 1f7bb69c25e..2b78a24cf07 100644 --- a/STEER/AliQADataMakerSteer.cxx +++ b/STEER/AliQADataMakerSteer.cxx @@ -41,6 +41,7 @@ #include "AliCDBId.h" #include "AliCDBMetaData.h" #include "AliCodeTimer.h" +#include "AliCorrQADataMakerRec.h" #include "AliDetectorRecoParam.h" #include "AliESDEvent.h" #include "AliGeomManager.h" @@ -79,7 +80,7 @@ AliQADataMakerSteer::AliQADataMakerSteer(char * mode, const char* gAliceFilename fRawReader(NULL), fRawReaderDelete(kTRUE), fRunLoader(NULL), - fTasks("") + fTasks("") { // default ctor fMaxEvents = fNumberOfEvents ; @@ -88,6 +89,7 @@ AliQADataMakerSteer::AliQADataMakerSteer(char * mode, const char* gAliceFilename fLoader[iDet] = NULL ; fQADataMaker[iDet] = NULL ; fQACycles[iDet] = 999999 ; + fQAWriteExpert[iDet] = kFALSE ; } } } @@ -111,13 +113,14 @@ AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) : fRawReader(NULL), fRawReaderDelete(kTRUE), fRunLoader(NULL), - fTasks(qas.fTasks) + fTasks(qas.fTasks) { // cpy ctor for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { - fLoader[iDet] = qas.fLoader[iDet] ; - fQADataMaker[iDet] = qas.fQADataMaker[iDet] ; - fQACycles[iDet] = qas.fQACycles[iDet] ; + fLoader[iDet] = qas.fLoader[iDet] ; + fQADataMaker[iDet] = qas.fQADataMaker[iDet] ; + fQACycles[iDet] = qas.fQACycles[iDet] ; + fQAWriteExpert[iDet] = qas.fQAWriteExpert[iDet] ; } } @@ -176,11 +179,11 @@ Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX_t taskIndex) for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { if (IsSelected(AliQA::GetDetName(iDet))) { AliQADataMaker * qadm = GetQADataMaker(iDet) ; + if (!qadm) continue; // This detector doesn't have any QA (for example, HLT) if ( qadm->IsCycleDone() ) { - qadm->EndOfCycle(AliQA::kRAWS) ; - qadm->StartOfCycle(AliQA::kRAWS) ; + qadm->EndOfCycle(taskIndex) ; } - TTree * data ; + TTree * data = NULL ; AliLoader* loader = GetLoader(qadm->GetUniqueID()); switch (taskIndex) { case AliQA::kNULLTASKINDEX : @@ -189,41 +192,49 @@ Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX_t taskIndex) qadm->Exec(taskIndex, fRawReader) ; break ; case AliQA::kHITS : - loader->LoadHits() ; - data = loader->TreeH() ; - if ( ! data ) { - AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ; - } else { - qadm->Exec(taskIndex, data) ; - } + if( loader ) { + loader->LoadHits() ; + data = loader->TreeH() ; + if ( ! data ) { + AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ; + break ; + } + } + qadm->Exec(taskIndex, data) ; break ; case AliQA::kSDIGITS : - loader->LoadSDigits() ; - data = loader->TreeS() ; - if ( ! data ) { - AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ; - } else { - qadm->Exec(taskIndex, data) ; - } + if( loader ) { + loader->LoadSDigits() ; + data = loader->TreeS() ; + if ( ! data ) { + AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ; + break ; + } + } + qadm->Exec(taskIndex, data) ; break; case AliQA::kDIGITS : - loader->LoadDigits() ; - data = loader->TreeD() ; - if ( ! data ) { - AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ; - } else { - qadm->Exec(taskIndex, data) ; - } + if( loader ) { + loader->LoadDigits() ; + data = loader->TreeD() ; + if ( ! data ) { + AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ; + break ; + } + } + qadm->Exec(taskIndex, data) ; break; case AliQA::kRECPOINTS : - loader->LoadRecPoints() ; - data = loader->TreeR() ; - if (!data) { - AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ; - } else { - qadm->Exec(taskIndex, data) ; - } - break; + if( loader ) { + loader->LoadRecPoints() ; + data = loader->TreeR() ; + if (!data) { + AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ; + break ; + } + } + qadm->Exec(taskIndex, data) ; + break; case AliQA::kTRACKSEGMENTS : break; case AliQA::kRECPARTICLES : @@ -236,6 +247,7 @@ Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX_t taskIndex) } //task switch } } // detector loop + Increment() ; } // event loop // Save QA data for all detectors rv = Finish(taskIndex) ; @@ -253,7 +265,7 @@ Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX_t taskIndex) for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { if (IsSelected(AliQA::GetDetName(iDet))) { AliQADataMaker * qadm = GetQADataMaker(iDet) ; - qadm->EndOfCycle(taskIndex) ; + if (qadm) qadm->EndOfCycle(taskIndex) ; } } return kTRUE ; @@ -290,7 +302,7 @@ AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet) { // get the loader for a detector - if ( !fRunLoader ) + if ( !fRunLoader || iDet == AliQA::kCORR) return NULL ; TString detName = AliQA::GetDetName(iDet) ; @@ -336,10 +348,20 @@ AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(const Int_t iDet) if (iDet == AliQA::kGLOBAL) { //Global QA qadm = new AliGlobalQADataMaker(); + qadm->SetName(AliQA::GetDetName(iDet)); + qadm->SetUniqueID(iDet); fQADataMaker[iDet] = qadm; return qadm; } + if (iDet == AliQA::kCORR) { //the data maker for correlations among detectors + qadm = new AliCorrQADataMakerRec(fQADataMaker) ; + qadm->SetName(AliQA::GetDetName(iDet)); + qadm->SetUniqueID(iDet); + fQADataMaker[iDet] = qadm; + return qadm; + } + // load the QA data maker object TPluginManager* pluginManager = gROOT->GetPluginManager() ; TString detName = AliQA::GetDetName(iDet) ; @@ -368,9 +390,9 @@ AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(const Int_t iDet) qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ; } if (qadm) { - fQADataMaker[iDet] = qadm ; qadm->SetName(AliQA::GetDetName(iDet)); qadm->SetUniqueID(iDet); + fQADataMaker[iDet] = qadm ; } return qadm ; @@ -401,6 +423,19 @@ void AliQADataMakerSteer::EndOfCycle(TObjArray * detArray) } } +//_____________________________________________________________________________ +void AliQADataMakerSteer::Increment() +{ + // Increments the cycle counter for all QA Data Makers + for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { + if (IsSelected(AliQA::GetDetName(iDet))) { + AliQADataMaker * qadm = GetQADataMaker(iDet) ; + if (qadm) + qadm->Increment() ; + } + } +} + //_____________________________________________________________________________ Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX_t taskIndex, const char * input ) { @@ -466,18 +501,20 @@ Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX_t taskIndex, const char if ( ! AliGeomManager::GetGeometry() ) AliGeomManager::LoadGeometry() ; - InitQADataMaker(fRunNumber, fRecoParam, fCycleSame, kTRUE, detArray) ; + InitQADataMaker(fRunNumber, fRecoParam, detArray) ; //, fCycleSame, kTRUE, detArray) ; return kTRUE ; } //_____________________________________________________________________________ -void AliQADataMakerSteer::InitQADataMaker(UInt_t run, const AliRecoParam & par, Bool_t sameCycle, Bool_t startOption, TObjArray * detArray) +void AliQADataMakerSteer::InitQADataMaker(UInt_t run, const AliRecoParam & par, TObjArray * detArray) { // Initializes The QADataMaker for all active detectors and for all active tasks for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { if (IsSelected(AliQA::GetDetName(iDet))) { AliQADataMaker * qadm = GetQADataMaker(iDet) ; + if (fQAWriteExpert[iDet]) + qadm->SetWriteExpert() ; if (!qadm) { AliError(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ; fDetectorsW.ReplaceAll(AliQA::GetDetName(iDet), "") ; @@ -491,13 +528,12 @@ void AliQADataMakerSteer::InitQADataMaker(UInt_t run, const AliRecoParam & par, } // Set default reco params qadm->SetRecoParam(par.GetDetRecoParam(iDet)); + Bool_t sameCycle = kFALSE ; for (UInt_t taskIndex = 0; taskIndex < AliQA::kNTASKINDEX; taskIndex++) { if ( fTasks.Contains(Form("%d", taskIndex)) ) { - qadm->Init(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), run, GetQACycles(qadm->GetUniqueID())) ; - if (startOption) { - qadm->StartOfCycle(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), sameCycle) ; - sameCycle = kTRUE ; - } + qadm->StartOfCycle(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), run, sameCycle) ; + qadm->Init(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), GetQACycles(qadm->GetUniqueID())) ; + sameCycle = kTRUE ; } } } @@ -505,6 +541,7 @@ void AliQADataMakerSteer::InitQADataMaker(UInt_t run, const AliRecoParam & par, } } + //_____________________________________________________________________________ Bool_t AliQADataMakerSteer::InitRunLoader() { @@ -561,34 +598,48 @@ Bool_t AliQADataMakerSteer::IsSelected(const char * det) Bool_t rv = kFALSE; const TString detName(det) ; - // check if all detectors are selected - if (fDetectors.Contains("ALL")) { - fDetectors = "ALL"; - rv = kTRUE; - } else if ((fDetectors.CompareTo(detName) == 0) || - fDetectors.BeginsWith(detName+" ") || - fDetectors.EndsWith(" "+detName) || - fDetectors.Contains(" "+detName+" ")) { - rv = kTRUE; - } - + // always activates Correlation + if ( detName.Contains(AliQA::GetDetName(AliQA::kCORR))) { + rv = kTRUE ; + } else { + // check if all detectors are selected + if (fDetectors.Contains("ALL")) { + fDetectors = "ALL"; + rv = kTRUE; + } else if ((fDetectors.CompareTo(detName) == 0) || + fDetectors.BeginsWith(detName+" ") || + fDetectors.EndsWith(" "+detName) || + fDetectors.Contains(" "+detName+" ")) { + rv = kTRUE; + } + } return rv ; } //_____________________________________________________________________________ Bool_t AliQADataMakerSteer::Merge(const Int_t runNumber) const +{ + // Merge data from all the cycles from all detectors in one single file per run + // Merge the QA results from all the data chunks in one run + Bool_t rv = MergeData(runNumber) ; + rv *= MergeResults(runNumber) ; + return rv ; +} + + +//_____________________________________________________________________________ +Bool_t AliQADataMakerSteer::MergeData(const Int_t runNumber) const { // Merge all the cycles from all detectors in one single file per run TString cmd ; - if ( runNumber == -1 ) - cmd = Form(".! ls *%s*.*.*.root > tempo.txt", AliQA::GetQADataFileName()) ; + if (runNumber == -1) + cmd = Form(".! ls *%s*.%d.root > tempo.txt", AliQA::GetQADataFileName(), runNumber) ; else - cmd = Form(".! ls *%s*.%d.*.root > tempo.txt", AliQA::GetQADataFileName(), runNumber) ; + cmd = Form(".! ls *%s*.*.root > tempo.txt", AliQA::GetQADataFileName()) ; gROOT->ProcessLine(cmd.Data()) ; ifstream in("tempo.txt") ; const Int_t runMax = 10 ; TString file[AliQA::kNDET*runMax] ; - Int_t run[AliQA::kNDET*runMax] = {-1} ; Int_t index = 0 ; while ( 1 ) { @@ -603,41 +654,55 @@ Bool_t AliQADataMakerSteer::Merge(const Int_t runNumber) const AliError(Form("run number %d not found", runNumber)) ; return kFALSE ; } + + TFileMerger merger ; + TString outFileName(Form("Merged.%s.Data.%d.root",AliQA::GetQADataFileName(),runNumber)); + merger.OutputFile(outFileName.Data()) ; + for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) { + TString pattern(Form("%s.%d.", AliQA::GetQADataFileName(), runNumber)); + TString tmp(file[ifile]) ; + if (tmp.Contains(pattern)) { + merger.AddFile(tmp) ; + } + } + merger.Merge() ; + return kTRUE ; +} + +//_____________________________________________________________________________ +Bool_t AliQADataMakerSteer::MergeResults(const Int_t runNumber) const +{ + // Merge the QA result from all the data chunks in a run + TString cmd ; + cmd = Form(".! ls %s*.root > tempo.txt", AliQA::GetQADataFileName()) ; + gROOT->ProcessLine(cmd.Data()) ; + ifstream in("tempo.txt") ; + const Int_t chunkMax = 100 ; + TString fileList[chunkMax] ; + + Int_t index = 0 ; + while ( 1 ) { + TString file ; + in >> fileList[index] ; + if ( !in.good() ) + break ; + AliInfo(Form("index = %d file = %s", index, (fileList[index].Data()))) ; + index++ ; + } + + if ( index == 0 ) { + AliError("No QA Result File found") ; + return kFALSE ; + } - Int_t runIndex = 0 ; - Int_t runIndexMax = 0 ; - TString stmp(Form(".%s.", AliQA::GetQADataFileName())) ; + TFileMerger merger ; + TString outFileName(Form("Merged.%s.Result.%d.root", AliQA::GetQADataFileName(), runNumber)); + merger.OutputFile(outFileName.Data()) ; for (Int_t ifile = 0 ; ifile < index ; ifile++) { - TString tmp(file[ifile]) ; - tmp.ReplaceAll(".root", "") ; - TString det = tmp(0, tmp.Index(".")) ; - tmp.Remove(0, tmp.Index(stmp)+4) ; - TString ttmp = tmp(0, tmp.Index(".")) ; - Int_t newRun = ttmp.Atoi() ; - for (Int_t irun = 0; irun <= runIndexMax; irun++) { - if (newRun == run[irun]) - break ; - run[runIndex] = newRun ; - runIndex++ ; - } - runIndexMax = runIndex ; - ttmp = tmp(tmp.Index(".")+1, tmp.Length()) ; - Int_t cycle = ttmp.Atoi() ; - AliDebug(1, Form("%s : det = %s run = %d cycle = %d \n", file[ifile].Data(), det.Data(), newRun, cycle)) ; - } - for (Int_t irun = 0 ; irun < runIndexMax ; irun++) { - TFileMerger merger ; - TString outFileName(Form("Merged.%s.%d.root",AliQA::GetQADataFileName(),run[irun])); - merger.OutputFile(outFileName.Data()) ; - for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) { - TString pattern(Form("%s.%d.", AliQA::GetQADataFileName(), run[irun])) ; - TString tmp(file[ifile]) ; - if (tmp.Contains(pattern)) { - merger.AddFile(tmp) ; - } - } - merger.Merge() ; + TString file = fileList[ifile] ; + merger.AddFile(file) ; } + merger.Merge() ; return kTRUE ; } @@ -650,7 +715,7 @@ void AliQADataMakerSteer::Reset(const Bool_t sameCycle) for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { if (IsSelected(AliQA::GetDetName(iDet))) { AliQADataMaker * qadm = GetQADataMaker(iDet); - qadm->Reset(sameCycle); + qadm->Reset(); } } if (fRawReaderDelete) { @@ -773,20 +838,24 @@ TString AliQADataMakerSteer::Run(const char * detectors, const AliQA::TASKINDEX_ void AliQADataMakerSteer::RunOneEvent(AliRawReader * rawReader) { //Runs all the QA data Maker for Raws only and on one event only (event loop done by calling method) - + if ( ! rawReader ) + return ; AliCodeTimerAuto("") ; - for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { - if (!IsSelected(AliQA::GetDetName(iDet))) - continue; - AliQADataMaker *qadm = GetQADataMaker(iDet); - if (!qadm) - continue; - if (fTasks.Contains(Form("%d", AliQA::kRAWS))){ - AliCodeTimerStart(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet))); + if (fTasks.Contains(Form("%d", AliQA::kRAWS))){ + for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(AliQA::GetDetName(iDet))) + continue; + AliQADataMaker *qadm = GetQADataMaker(iDet); + if (!qadm) + continue; + if ( qadm->IsCycleDone() ) { + qadm->EndOfCycle() ; + } + AliCodeTimerStart(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet))); qadm->Exec(AliQA::kRAWS, rawReader) ; - AliCodeTimerStop(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet))); + AliCodeTimerStop(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet))); } - } + } } //_____________________________________________________________________________ @@ -795,16 +864,19 @@ void AliQADataMakerSteer::RunOneEvent(AliESDEvent *& esd) //Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method) AliCodeTimerAuto("") ; - for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { - if (!IsSelected(AliQA::GetDetName(iDet))) - continue; - AliQADataMaker *qadm = GetQADataMaker(iDet); - if (!qadm) - continue; - if (fTasks.Contains(Form("%d", AliQA::kESDS))) { - AliCodeTimerStart(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet))); + if (fTasks.Contains(Form("%d", AliQA::kESDS))) { + for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { + if (!IsSelected(AliQA::GetDetName(iDet))) + continue; + AliQADataMaker *qadm = GetQADataMaker(iDet); + if (!qadm) + continue; + if ( qadm->IsCycleDone() ) { + qadm->EndOfCycle() ; + } + AliCodeTimerStart(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet))); qadm->Exec(AliQA::kESDS, esd) ; - AliCodeTimerStop(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet))); + AliCodeTimerStop(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet))); } } } @@ -814,20 +886,23 @@ void AliQADataMakerSteer::RunOneEventInOneDetector(Int_t det, TTree * tree) { // Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method) AliCodeTimerAuto("") ; - if (!IsSelected(AliQA::GetDetName(det))) { - AliQADataMaker *qadm = GetQADataMaker(det); - if (qadm) { - if (fTasks.Contains(Form("%d", AliQA::kRECPOINTS))) { - AliCodeTimerStart(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det))); - qadm->Exec(AliQA::kRECPOINTS, tree) ; - AliCodeTimerStop(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det))); - } - } - } + if (fTasks.Contains(Form("%d", AliQA::kRECPOINTS))) { + if (IsSelected(AliQA::GetDetName(det))) { + AliQADataMaker *qadm = GetQADataMaker(det); + if (qadm) { + if ( qadm->IsCycleDone() ) { + qadm->EndOfCycle() ; + } + AliCodeTimerStart(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det))); + qadm->Exec(AliQA::kRECPOINTS, tree) ; + AliCodeTimerStop(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det))); + } + } + } } //_____________________________________________________________________________ -Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const char * year, const Int_t cycleNumber, const char * detectors) const +Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const char * year, const char * detectors) const { // take the locasl QA data merge into a single file and save in OCDB Bool_t rv = kTRUE ; @@ -847,13 +922,13 @@ Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const char * year, rv = Merge(runNumber) ; if ( ! rv ) return kFALSE ; - TString inputFileName(Form("Merged.%s.%d.root", AliQA::GetQADataFileName(), runNumber)) ; + TString inputFileName(Form("Merged.%s.Data.%d.root", AliQA::GetQADataFileName(), runNumber)) ; inputFile = TFile::Open(inputFileName.Data()) ; rv = SaveIt2OCDB(runNumber, inputFile, year) ; } else { for (Int_t index = 0; index < AliQA::kNDET; index++) { if (sdet.Contains(AliQA::GetDetName(index))) { - TString inputFileName(Form("%s.%s.%d.%d.root", AliQA::GetDetName(index), AliQA::GetQADataFileName(), runNumber, cycleNumber)) ; + TString inputFileName(Form("%s.%s.%d.root", AliQA::GetDetName(index), AliQA::GetQADataFileName(), runNumber)) ; inputFile = TFile::Open(inputFileName.Data()) ; rv *= SaveIt2OCDB(runNumber, inputFile, year) ; } @@ -892,6 +967,7 @@ Bool_t AliQADataMakerSteer::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile if ( detDir ) { AliInfo(Form("Entering %s", detDir->GetName())) ; TString detOCDBDir(Form("%s/%s/%s", AliQA::GetDetName(detIndex), AliQA::GetRefOCDBDirName(), AliQA::GetRefDataDirName())) ; + printf("SSSSSSSSSSSSSSSSSSSSS %s\n", detOCDBDir.Data()) ; AliCDBId idr(detOCDBDir.Data(), runNumber, AliCDBRunRange::Infinity()) ; TList * listDetQAD = new TList() ; TString listName(Form("%s QA data Reference", AliQA::GetDetName(detIndex))) ;