AliITSPreprocessorSPD.cxx: Algorithm changed. Read from database before update. Unpac...
[u/mrichter/AliRoot.git] / ITS / AliITSPreprocessorSPD.cxx
index 618b494..e482dcc 100644 (file)
@@ -1,36 +1,22 @@
-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- *                                                                        *
- * Author: The ALICE Off-line Project.                                    *
- * Contributors are mentioned in the code where appropriate.              *
- *                                                                        *
- * Permission to use, copy, modify and distribute this software and its   *
- * documentation strictly for non-commercial purposes is hereby granted   *
- * without fee, provided that the above copyright notice appears in all   *
- * copies and that both the copyright notice and this permission notice   *
- * appear in the supporting documentation. The authors make no claims     *
- * about the suitability of this software for any purpose. It is          *
- * provided "as is" without express or implied warranty.                  *
- **************************************************************************/
-
-/* $Id$ */
-
 ///////////////////////////////////////////////
 //  Author: Henrik Tydesjo                   //
 //  Preprocessor Class for the SPD           //
 //                                           //
 ///////////////////////////////////////////////
 
-#include <TList.h>
-#include <TObjString.h>
-#include <TTimeStamp.h>
-
 #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"
 #include "AliLog.h"
+#include <TTimeStamp.h>
+#include <TObjString.h>
+#include <TSystem.h>
 
 ClassImp(AliITSPreprocessorSPD)
 
@@ -64,41 +50,11 @@ UInt_t AliITSPreprocessorSPD::Process(TMap* dcsAliasMap)
 {
   // Do the actual preprocessing
 
-  // DEAD/NOISY DATA
-  // Create the cdb entry, at first filled with empty cal objects (one for each module)
-  TObjArray *spdEntry = new TObjArray(240);
-  for(Int_t module=0;module<240;module++){
-    AliITSCalibrationSPD* cal = new AliITSCalibrationSPD();
-    spdEntry->Add(cal);
-  }
-  spdEntry->SetOwner(kTRUE);
-  // Get all the files corresponding to the different modules and fill the dead/noisy lists
-  AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler();
-  for (Int_t module=0; module<240; module++) {
-    Char_t id[20];
-    sprintf(id,"SPD_%d",module);
-    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());
-      handler->SetModuleNr(module);
-      handler->ReadFromFile(fileName);
-      ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetNrDead( handler->GetNrDead() );
-      ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetDeadList( handler->GetDeadArray() );
-      ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetNrNoisy( handler->GetNrNoisy() );
-      ((AliITSCalibrationSPD*) spdEntry->At(module)) -> SetNoisyList( handler->GetNoisyArray() );
-    }
-  }
-  delete handler;
-  // Store the cdb entry
-  AliCDBMetaData metaData;
-  metaData.SetBeamPeriod(0);
-  metaData.SetResponsible("Henrik Tydesjo");
-  metaData.SetComment("Preprocessor test for SPD.");  
-  UInt_t result = Store("SHUTTLE", "Calib", spdEntry, &metaData, 0, 0);
-  delete spdEntry;
-  
-//  // REFERENCE DATA
+  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];
@@ -115,6 +71,86 @@ UInt_t AliITSPreprocessorSPD::Process(TMap* dcsAliasMap)
 //    }
 //  }
 
+
+
+  // *** 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);
+  }
+
+
+  TString pwd = gSystem->pwd();  // remember the working directory, to cd back later
+  TString tempDir = Form("%s",AliShuttleInterface::GetShuttleTempDir());
+
+  // 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++;
+    }
+  }
+
+  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++;
+    }
+  }
+  delete handler;
+
+  if (nrUpdatedMods>0) {
+    Log(Form("Noisy lists for %d modules updated.",nrUpdatedMods));
+
+    // Store the cdb entry
+    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;
+    Log("Database updated.");
+  }
+
   return result;
+
+
+
 }