X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSPreprocessorSPD.cxx;h=1a54ea5a4b535809461aa88ed06187674d893b14;hb=652489276a37742d7fc84496ede48c172163e2fb;hp=e482dccdd226f7733b468b361945e3c3b627b3d9;hpb=03fc677323659a35b085c8a1599664fdbcbae3b3;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSPreprocessorSPD.cxx b/ITS/AliITSPreprocessorSPD.cxx index e482dccdd22..1a54ea5a4b5 100644 --- a/ITS/AliITSPreprocessorSPD.cxx +++ b/ITS/AliITSPreprocessorSPD.cxx @@ -6,10 +6,7 @@ #include "AliITSPreprocessorSPD.h" #include "AliITSCalibrationSPD.h" -#include "AliITSOnlineCalibrationSPD.h" #include "AliITSOnlineCalibrationSPDhandler.h" -#include "AliCDBManager.h" -#include "AliCDBStorage.h" #include "AliCDBEntry.h" #include "AliCDBMetaData.h" #include "AliShuttleInterface.h" @@ -17,14 +14,27 @@ #include #include #include +#include + +/* $Id$ */ ClassImp(AliITSPreprocessorSPD) //______________________________________________________________________________________________ AliITSPreprocessorSPD::AliITSPreprocessorSPD(AliShuttleInterface* shuttle) : - AliPreprocessor("SPD", shuttle) + AliPreprocessor("SPD", shuttle), fIdList() { // constructor + AddRunType("DAQ_MIN_TH_SCAN"); + AddRunType("DAQ_MEAN_TH_SCAN"); + AddRunType("DAQ_GEN_DAC_SCAN"); + AddRunType("DAQ_UNIFORMITY_SCAN"); + AddRunType("DAQ_NOISY_PIX_SCAN"); + AddRunType("DAQ_PIX_DELAY_SCAN"); + AddRunType("DAQ_FO_UNIF_SCAN"); + AddRunType("PHYSICS"); + + fIdList.SetOwner(kTRUE); } //______________________________________________________________________________________________ @@ -46,111 +56,426 @@ void AliITSPreprocessorSPD::Initialize(Int_t run, UInt_t startTime, } //______________________________________________________________________________________________ -UInt_t AliITSPreprocessorSPD::Process(TMap* dcsAliasMap) +UInt_t AliITSPreprocessorSPD::Process(TMap* /*dcsAliasMap*/) { // Do the actual preprocessing - UInt_t result = 1; - - -// // *** REFERENCE DATA *** - -// // Store the container files as reference data (one for each equipment) -// for (UInt_t eq=0; eq<20; eq++) { -// Char_t id[20]; -// sprintf(id,"SPDref%d",eq); -// TList* list = GetFileSources(kDAQ,id); // (the id is actually unique, so always 1 file) -// if (list) { -// TObjString* fileNameEntry = (TObjString*) list->First(); -// Char_t* fileName = (Char_t*) GetFile(kDAQ, id, fileNameEntry->GetString().Data()); -// AliITSOnlineSPDscan *scan = new AliITSOnlineSPDscan((Char_t*)fileName); -// TObjArray* arr = scan->GetAsTObjArray(); -// Char_t refCAT[10]; -// sprintf(refCAT,"Ref%d",eq); -// StoreReferenceData("SHUTTLE", refCAT, arr, &metaData, 0, 0); -// } -// } - - - - // *** NOISY DATA *** - - // Read old calibration - TString runStr = GetRunParameter("run"); - Int_t run = atoi(runStr); - AliCDBStorage* storage = AliCDBManager::Instance()->GetStorage(AliShuttleInterface::GetMainCDB()); - if(!storage) return 0; - AliCDBEntry* cdbEntry = storage->Get("ITS/Calib/SPDNoisy", run); - TObjArray* spdEntry; - if(cdbEntry) { - spdEntry = (TObjArray*)cdbEntry->GetObject(); - if(!spdEntry) return 0; - } - else { - Log(Form("Old calibration not found in database. A fresh one will be created.")); - // Create fresh calibration - spdEntry = new TObjArray(240); - for(Int_t module=0;module<240;module++){ - AliITSCalibrationSPD* cal = new AliITSCalibrationSPD(); - spdEntry->Add(cal); - } - spdEntry->SetOwner(kTRUE); - } + // *** GET RUN TYPE *** - TString pwd = gSystem->pwd(); // remember the working directory, to cd back later - TString tempDir = Form("%s",AliShuttleInterface::GetShuttleTempDir()); + TString runType = GetRunType(); - // Retrieve and unpack tared calibration files from FXS - TList* list = GetFileSources(kDAQ,"SPD_noisy"); - if (list) { - UInt_t index = 0; - while (list->At(index)!=NULL) { - TObjString* fileNameEntry = (TObjString*) list->At(index); - TString fileName = GetFile(kDAQ, "SPD_noisy", fileNameEntry->GetString().Data()); - gSystem->cd(tempDir.Data()); - Char_t command[100]; - sprintf(command,"tar -xf %s",fileName.Data()); - gSystem->Exec(command); - index++; + + fIdList.Clear(); + + + // ******************************************************************************************** // + // *** GET THE FILE IDs FOR DEBUGGING *** // + if (runType == "DAQ_MIN_TH_SCAN" || + runType == "DAQ_MEAN_TH_SCAN" || + runType == "DAQ_GEN_DAC_SCAN" || + runType == "DAQ_UNIFORMITY_SCAN" || + runType == "DAQ_NOISY_PIX_SCAN" || + runType == "DAQ_PIX_DELAY_SCAN" || + runType == "DAQ_FO_UNIF_SCAN" || + runType == "PHYSICS") { + TString idListId = "SPD_id_list"; + TList* list = GetFileSources(kDAQ,idListId.Data()); + UInt_t nrIdFiles = 0; + if (list) { + TListIter *iter = new TListIter(list); + while (TObjString* fileNameEntry = (TObjString*) iter->Next()) { + TString fileName = GetFile(kDAQ, idListId.Data(), fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return 1; + } + nrIdFiles++; + ifstream idFile; + idFile.open(fileName.Data(), ifstream::in); + if (idFile.fail()) { + Log(Form("Could not open file (%s) for reading.",fileName.Data())); + return 1; + } + else { + while(1) { + Char_t id[50]; + idFile >> id; + if (idFile.eof()) break; + // Add id to the list; + fIdList.AddLast(new TObjString(id)); + } + } + idFile.close(); + } + delete iter; } + if (nrIdFiles==0) { + Log("Failed to retrieve any id list file."); + return 1; + } + } + + + // ******************************************************************************************** // + // *** REFERENCE DATA *** // + + // SCAN runs: + if (runType == "DAQ_MIN_TH_SCAN" || + runType == "DAQ_MEAN_TH_SCAN" || + runType == "DAQ_GEN_DAC_SCAN" || + runType == "DAQ_UNIFORMITY_SCAN" || + runType == "DAQ_NOISY_PIX_SCAN" || + runType == "DAQ_PIX_DELAY_SCAN") { + // Store scan container files for all equipments used - as reference data + // ids from FXS follow ("SPD_ref_scan_%d",eq), while Alien follow ("SPD_ref_scan_eq_%d",eq) + // the first part of the id is passed as argument here: + if (!StoreRefForIdStartingWith("SPD_ref_scan")) return 1; + } + + // FO runs: + else if (runType == "DAQ_FO_UNIF_SCAN") { + // Store fo container files for all equipments used - as reference data + // ids from FXS follow ("SPD_ref_fo_%d",eq), while Alien follow ("SPD_ref_fo_eq_%d",eq) + // the first part of the id is passed as argument here: + if (!StoreRefForIdStartingWith("SPD_ref_fo")) return 1; + } + + // Physics runs (online monitoring): + else if (runType == "PHYSICS") { + // Store the phys "per run" container files - as reference data + if (!StoreRefFromTarForId("SPD_ref_phys")) return 1; + // Store the phys "dead" container files - as reference data + if (!StoreRefFromTarForId("SPD_ref_phys_dead")) return 1; } - gSystem->cd(pwd.Data()); - // Update the database entries - UInt_t nrUpdatedMods = 0; - AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler(); - Char_t fileLoc[100]; - sprintf(fileLoc,"%s",AliShuttleInterface::GetShuttleTempDir()); - handler->SetFileLocation(fileLoc); - for (Int_t module=0; module<240; module++) { - handler->SetModuleNr(module); - if (handler->ReadFromFile()) { - ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetNrNoisy( handler->GetNrNoisy() ); - ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetNoisyList( handler->GetNoisyArray() ); - nrUpdatedMods++; + // ******************************************************************************************** // + // *** NOISY AND DEAD DATA *** // + + // Standalone runs: + if (runType == "DAQ_NOISY_PIX_SCAN") { + // Retrieve and unpack tared calibration files from FXS + TString id = "SPD_scan_noisy"; + TList* list = GetFileSources(kDAQ,id.Data()); + if (list) { + UInt_t index = 0; + while (list->At(index)!=NULL) { + TObjString* fileNameEntry = (TObjString*) list->At(index); + TString fileName = GetFile(kDAQ, id.Data(), fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return 1; + } + if (!RemoveIdFromList("SPD_scan_noisy")) { + Log(Form("Warning: Retrieved file with id %s, that was not in the id list!",id.Data())); + } + TString command = Form("tar -xf %s",fileName.Data()); + gSystem->Exec(command.Data()); + index++; + } + } + // Create new database entries + TObjArray* spdEntryNoisy = new TObjArray(240); + spdEntryNoisy->SetOwner(kTRUE); + for(UInt_t module=0; module<240; module++){ + AliITSCalibrationSPD* calObj = new AliITSCalibrationSPD(); + spdEntryNoisy->Add(calObj); } + // Add noisy from the copied FXS files + AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler(); + TString fileLoc = "."; + handler->SetFileLocation(fileLoc.Data()); + handler->ReadNoisyFromFiles(); + for (Int_t module=0; module<240; module++) { + ((AliITSCalibrationSPD*) spdEntryNoisy->At(module)) -> SetNrBadSingle( handler->GetNrNoisySingle(module) ); + ((AliITSCalibrationSPD*) spdEntryNoisy->At(module)) -> SetBadList( handler->GetNoisyArray(module) ); + } + delete handler; + // Store the new calibration objects in OCDB + Log("Noisy lists (scan) will be stored..."); + AliCDBMetaData metaData; + metaData.SetBeamPeriod(0); + metaData.SetResponsible("Henrik Tydesjo"); + metaData.SetComment("Created by SPD PreProcessor"); + // validity for this run until infinity + if (!Store("Calib", "SPDNoisy", spdEntryNoisy, &metaData, 0, kTRUE)) { + Log("Failed to store calibration data."); + return 1; + } + Log("Database updated."); + delete spdEntryNoisy; } - delete handler; - if (nrUpdatedMods>0) { - Log(Form("Noisy lists for %d modules updated.",nrUpdatedMods)); + // Physics runs (online monitoring): + else if (runType == "PHYSICS") { - // Store the cdb entry + // Noisy pixels: + // Read noisy from previous calibration + AliCDBEntry* cdbEntry = GetFromOCDB("Calib", "SPDNoisy"); + TObjArray* spdEntryNoisy; + if(cdbEntry) { + spdEntryNoisy = (TObjArray*)cdbEntry->GetObject(); + if(!spdEntryNoisy) return 1; + } + else { + Log("Old calibration not found in database. This is required for further processing."); + return 1; + } + AliITSOnlineCalibrationSPDhandler* handOld = new AliITSOnlineCalibrationSPDhandler(); + handOld->ReadNoisyFromCalibObj(spdEntryNoisy); + // Retrieve and unpack tared calibration files from FXS + TString idN = "SPD_phys_noisy"; + TList* listN = GetFileSources(kDAQ,idN.Data()); + if (listN) { + UInt_t index = 0; + while (listN->At(index)!=NULL) { + TObjString* fileNameEntry = (TObjString*) listN->At(index); + TString fileName = GetFile(kDAQ, idN.Data(), fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return 1; + } + if (!RemoveIdFromList(idN.Data())) { + Log(Form("Warning: Retrieved file with id %s, that was not in the id list!",idN.Data())); + } + TString command = Form("tar -xf %s",fileName.Data()); + gSystem->Exec(command.Data()); + index++; + } + } + AliITSOnlineCalibrationSPDhandler* handNew = new AliITSOnlineCalibrationSPDhandler(); + handNew->SetFileLocation("."); + handNew->ReadNoisyFromFiles(); + // add the new list to the old one + UInt_t nrNewNoisy = handOld->AddNoisyFrom(handNew); + // If new noisy pixels were found: Update calibration objects + if (nrNewNoisy>0) { + for (Int_t module=0; module<240; module++) { + ((AliITSCalibrationSPD*) spdEntryNoisy->At(module)) -> SetNrBadSingle( handOld->GetNrNoisySingle(module) ); + ((AliITSCalibrationSPD*) spdEntryNoisy->At(module)) -> SetBadList( handOld->GetNoisyArray(module) ); + } + // Store the new calibration objects in OCDB + Log("Noisy lists (phys) will be stored..."); + AliCDBMetaData metaData; + metaData.SetBeamPeriod(0); + metaData.SetResponsible("Henrik Tydesjo"); + metaData.SetComment("Created by SPD PreProcessor"); + // validity for this run only + if (!Store("Calib", "SPDNoisy", spdEntryNoisy, &metaData, 0, kFALSE)) { + Log("Failed to store calibration data."); + return 1; + } + Log("Database updated."); + } + delete handNew; + + // Dead pixels: + // Retrieve and unpack tared calibration files from FXS + TString idD = "SPD_phys_dead"; + TList* listD = GetFileSources(kDAQ,idD.Data()); + UInt_t nrPhysDeadFiles = 0; + if (listD) { + UInt_t index = 0; + while (listD->At(index)!=NULL) { + TObjString* fileNameEntry = (TObjString*) listD->At(index); + TString fileName = GetFile(kDAQ, idD.Data(), fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return 1; + } + nrPhysDeadFiles++; + if (!RemoveIdFromList("SPD_phys_dead")) { + Log(Form("Warning: Retrieved file with id %s, that was not in the id list!",idD.Data())); + } + TString command = Form("tar -xf %s",fileName.Data()); + gSystem->Exec(command.Data()); + index++; + } + } + if (nrPhysDeadFiles==0) { + Log(Form("Could not find files with id %s. Should be present for each run.",idD.Data())); + return 1; + } + // Create new database entries + TObjArray* spdEntryDead = new TObjArray(240); + spdEntryDead->SetOwner(kTRUE); + for(UInt_t module=0; module<240; module++){ + AliITSCalibrationSPD* calObj = new AliITSCalibrationSPD(); + spdEntryDead->Add(calObj); + } + // Add dead from the copied FXS files + handOld->SetFileLocation("."); + handOld->ReadSilentFromFiles(); + for (UInt_t module=0; module<240; module++) { + AliITSCalibrationSPD* calibSPD = (AliITSCalibrationSPD*) spdEntryDead->At(module); + calibSPD->SetNrBadSingle( handOld->GetNrDeadSingle(module) ); + calibSPD->SetBadList( handOld->GetDeadArray(module) ); + for (UInt_t chipIndex=0; chipIndex<5; chipIndex++) { + UInt_t eq,hs,chip,col,row; + AliITSRawStreamSPD::OfflineToOnline(module, chipIndex*32, 0, eq, hs, chip, col, row); + if (handOld->IsSilentChip(eq,hs,chip)) { + calibSPD->SetChipBad(chipIndex); + } + else { + calibSPD->UnSetChipBad(chipIndex); + } + } + } + delete handOld; + // Store the new calibration objects in OCDB + Log("Dead lists (phys) will be stored..."); AliCDBMetaData metaData; metaData.SetBeamPeriod(0); metaData.SetResponsible("Henrik Tydesjo"); - metaData.SetComment("Preprocessor test for SPD."); - result = Store("Calib", "SPDNoisy", spdEntry, &metaData, 0, kTRUE); - delete spdEntry; + metaData.SetComment("Created by SPD PreProcessor"); + // validity for this run only + if (!Store("Calib", "SPDDead", spdEntryDead, &metaData, 0, kFALSE)) { + Log("Failed to store calibration data."); + return 1; + } Log("Database updated."); + delete spdEntryDead; + } - return result; + // ******************************************************************************************** // + // check that there are no ids left in the list: + if (fIdList.First()!=NULL) { + TString logMessage = ""; + TListIter *iter = new TListIter(&fIdList); + while (TObjString *st = (TObjString*)iter->Next()) { + logMessage.Append(st->GetString()); + logMessage.Append(" "); + } + delete iter; + Log(Form("Files with the following ids were never retrieved: %s.",logMessage.Data())); + return 1; + } + fIdList.Clear(); -} + return 0; // 0 means success + +} +//_________________________________________________________________________________________ +Bool_t AliITSPreprocessorSPD::RemoveIdFromList(const Char_t *id) { + // removes id from the list of ids + Bool_t found = kFALSE; + TListIter *iter = new TListIter(&fIdList); + while (TObjString *st = (TObjString*)iter->Next()) { + if (st->GetString().CompareTo(id)==0) { + fIdList.Remove(st); + found = kTRUE; + break; + } + } + delete iter; + return found; +} +//_________________________________________________________________________________________ +Bool_t AliITSPreprocessorSPD::StoreRefForIdStartingWith(const Char_t *idStart) { + // Store the standalone container files as reference data (0 or 1 file for each equipment) + // idStart is the first part of the id string (which also should contain the actual eq) + for (UInt_t eq=0; eq<20; eq++) { + TString id = Form("%s_%d",idStart,eq); + TList* list = GetFileSources(kDAQ,id.Data()); // (the id should be unique, so always 1 file) + if (list) { + TObjString* fileNameEntry = (TObjString*) list->First(); + if (fileNameEntry!=NULL) { + TString fileName = GetFile(kDAQ, id, fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return kFALSE; + } + if (!RemoveIdFromList(id.Data())) { + Log(Form("Warning: Retrieved file with id %s, that was not in the id list!",id.Data())); + } + TString refCAT = Form("%s_eq_%d",idStart,eq); + if (!StoreReferenceFile(fileName.Data(),refCAT.Data())) { + Log(Form("Failed to store reference file %s.",fileName.Data())); + return kFALSE; + } + } + } + } + return kTRUE; +} +//_________________________________________________________________________________________ +Bool_t AliITSPreprocessorSPD::StoreRefFromTarForId(const Char_t *id) { + // store reference files from tar file for the id given (this is just to not duplicate code) + TList* list = GetFileSources(kDAQ,id); + if (list) { + UInt_t index = 0; + while (list->At(index)!=NULL) { + TObjString* fileNameEntry = (TObjString*) list->At(index); + TString fileName = GetFile(kDAQ, id, fileNameEntry->GetString().Data()); + if (fileName.IsNull()) { + Log(Form("GetFile failed to retrieve file %s.",fileNameEntry->GetString().Data())); + return kFALSE; + } + if (!RemoveIdFromList(id)) { + Log(Form("Warning: Retrieved file with id %s, that was not in the id list!",id)); + } + // get the file names from the tar file + // TString pwd = gSystem->pwd(); + // TString tempFileName = Form("%s/tempTar.txt",pwd.Data()); + TString tempFileName = "tempTar.txt"; + TString command = Form("tar -tf %s > %s",fileName.Data(),tempFileName.Data()); + gSystem->Exec(command.Data()); + TList fList; + ifstream tempFile; + tempFile.open(tempFileName.Data(), ifstream::in); + if (tempFile.fail()) { + Log(Form("Could not open file (%s) for reading.",tempFileName.Data())); + return kFALSE; + } + else { + while(1) { + Char_t fileN[100]; + tempFile >> fileN; + if (tempFile.eof()) break; + fList.AddLast(new TObjString(fileN)); + } + } + // close and remove temp file + tempFile.close(); + command = Form("rm -f %s",tempFileName.Data()); + gSystem->Exec(command.Data()); + // unpack + command = Form("tar -xf %s",fileName.Data()); + gSystem->Exec(command.Data()); + // store each file + UInt_t index2 = 0; + while (fList.At(index2)!=NULL) { + TString eqFileName = ((TObjString*)fList.At(index2))->GetString(); + // get eq id + TString eqStr = eqFileName.Data(); + UInt_t len = eqStr.Length(); + eqStr.Replace(0,len-7,"",0); + eqStr.ReplaceAll("_",1,"",0); + eqStr.ReplaceAll(".root",5,"",0); + Int_t eqId = eqStr.Atoi(); + if (eqId>=0 && eqId<20) { + TString refCAT = Form("%s_eq_%d",id,eqId); + if (!StoreReferenceFile(eqFileName.Data(),refCAT.Data())) { + Log(Form("Failed to store reference file %s.",eqFileName.Data())); + return kFALSE; + } + } + else { + Log(Form("Eq ID %d out of bounds for file %s",eqId,eqFileName.Data())); + fList.Clear(); + return kFALSE; + } + index2++; + } + fList.Clear(); + index++; + } + } + return kTRUE; +}