ROOT logo
#ifndef __CINT__
#include <TSystemDirectory.h>
#include <TFile.h>
#include <TList.h>
#include <AliCDBEntry.h>
#include <AliFMDMap.h>
#include <AliFMDCalibPedestal.h>
#include <AliFMDCalibGain.h>
#include <AliFMDCalibStripRange.h>
#include <AliFMDCalibSampleRate.h>
#include <TString.h>
#include <TSystem.h>
#include <TError.h>
#else
class AliFMDMap;
#endif

Bool_t 
CheckMap(const char* path, const AliFMDMap* map)
{
  if (!map) { 
    Warning("CheckFile", "No map in %s", path);
    return false;
  }
  if (!map->Ptr() || map->MaxIndex() <= 0) { 
    Warning("CheckFile", "Map %p (%d) has no data in %s", 
	    map->Ptr(), map->MaxIndex(), path);
    return false;
  }
  return true;
}

enum {
  kMap, 
  kPedestal, 
  kGain, 
  kRate, 
  kRange
};
  
Bool_t
CheckFile(const char* name, const char* dirName, Int_t which)
{
  TString path(gSystem->ConcatFileName(dirName, name));
  TFile* file = TFile::Open(path, "READ");
  if (!file) { 
    Warning("CheckFile", "Failed to open %s", path.Data());
    return false;
  }
  AliCDBEntry* entry = static_cast<AliCDBEntry*>(file->Get("AliCDBEntry"));
  if (!entry) { 
    Warning("CheckFile", "No entry in %s", path.Data());
    file->Close();
    return false;
  }
  TObject* object = entry->GetObject();
  if (!object) { 
    Warning("CheckFile", "Entry has no object in %s", path.Data());
    file->Close();
    return false;
  }

  const AliFMDMap* map = 0;
  if (which == kMap) map = static_cast<AliFMDMap*>(object);
  else if (which == kPedestal) 
    map = &(static_cast<AliFMDCalibPedestal*>(object)->Values());
  else if (which == kGain) 
    map = &(static_cast<AliFMDCalibGain*>(object)->Values());
  else if (which == kRate) 
    map = &(static_cast<AliFMDCalibSampleRate*>(object)->Rates());
  else if (which == kRange) 
    map = &(static_cast<AliFMDCalibStripRange*>(object)->Ranges()); 
  else {
    Warning("CheckFile", "Don't now how to deal with what=%d", which);
    file->Close();
    return false;
  }
  if (!CheckMap(path.Data(), map)) { 
    file->Close();
    return false;
  }
  Info("CheckFile", "Map OK in %s", path.Data());
  file->Close();
  return true;
}

    
void
CheckCalibData(const char* dirName)
{
  TString dirS(dirName);
  if (dirS.EndsWith("/")) dirS.Remove(dirS.Length()-1);
  dirS = gSystem->BaseName(dirS.Data());
  Int_t what = 0;
  if (dirS == "Dead" || dirS == "ZeroSuppression") what = kMap;
  else if (dirS == "Pedestal") what = kPedestal;
  else if (dirS == "PulseGain") what = kGain;
  else if (dirS == "SampleRate") what = kRate;
  else if (dirS == "StripRange") what = kRange;
  else {
    Error("CheckCalibData", "Don't know how to deal with %s in %s", 
	  dirS.Data(), dirName);
    return;
  }
    
  TSystemDirectory dir(dirName, dirName);
  TList* files(dir.GetListOfFiles());
  TIter next(files);
  TObject* obj = 0;
  
  Int_t nTotal = 0;
  Int_t nOk    = 0;
  while ((obj = next())) { 
    TString name(obj->GetName());
    if (!name.EndsWith(".root")) continue;
    nTotal++;
    if (CheckFile(name, dirName, what)) nOk++;
  }
  Info("CheckCalibData", "Total: %d, OK: %d, Bad: %d in %s ", 
       nTotal, nOk, nTotal - nOk, dirName);
}
 CheckCalibData.C:1
 CheckCalibData.C:2
 CheckCalibData.C:3
 CheckCalibData.C:4
 CheckCalibData.C:5
 CheckCalibData.C:6
 CheckCalibData.C:7
 CheckCalibData.C:8
 CheckCalibData.C:9
 CheckCalibData.C:10
 CheckCalibData.C:11
 CheckCalibData.C:12
 CheckCalibData.C:13
 CheckCalibData.C:14
 CheckCalibData.C:15
 CheckCalibData.C:16
 CheckCalibData.C:17
 CheckCalibData.C:18
 CheckCalibData.C:19
 CheckCalibData.C:20
 CheckCalibData.C:21
 CheckCalibData.C:22
 CheckCalibData.C:23
 CheckCalibData.C:24
 CheckCalibData.C:25
 CheckCalibData.C:26
 CheckCalibData.C:27
 CheckCalibData.C:28
 CheckCalibData.C:29
 CheckCalibData.C:30
 CheckCalibData.C:31
 CheckCalibData.C:32
 CheckCalibData.C:33
 CheckCalibData.C:34
 CheckCalibData.C:35
 CheckCalibData.C:36
 CheckCalibData.C:37
 CheckCalibData.C:38
 CheckCalibData.C:39
 CheckCalibData.C:40
 CheckCalibData.C:41
 CheckCalibData.C:42
 CheckCalibData.C:43
 CheckCalibData.C:44
 CheckCalibData.C:45
 CheckCalibData.C:46
 CheckCalibData.C:47
 CheckCalibData.C:48
 CheckCalibData.C:49
 CheckCalibData.C:50
 CheckCalibData.C:51
 CheckCalibData.C:52
 CheckCalibData.C:53
 CheckCalibData.C:54
 CheckCalibData.C:55
 CheckCalibData.C:56
 CheckCalibData.C:57
 CheckCalibData.C:58
 CheckCalibData.C:59
 CheckCalibData.C:60
 CheckCalibData.C:61
 CheckCalibData.C:62
 CheckCalibData.C:63
 CheckCalibData.C:64
 CheckCalibData.C:65
 CheckCalibData.C:66
 CheckCalibData.C:67
 CheckCalibData.C:68
 CheckCalibData.C:69
 CheckCalibData.C:70
 CheckCalibData.C:71
 CheckCalibData.C:72
 CheckCalibData.C:73
 CheckCalibData.C:74
 CheckCalibData.C:75
 CheckCalibData.C:76
 CheckCalibData.C:77
 CheckCalibData.C:78
 CheckCalibData.C:79
 CheckCalibData.C:80
 CheckCalibData.C:81
 CheckCalibData.C:82
 CheckCalibData.C:83
 CheckCalibData.C:84
 CheckCalibData.C:85
 CheckCalibData.C:86
 CheckCalibData.C:87
 CheckCalibData.C:88
 CheckCalibData.C:89
 CheckCalibData.C:90
 CheckCalibData.C:91
 CheckCalibData.C:92
 CheckCalibData.C:93
 CheckCalibData.C:94
 CheckCalibData.C:95
 CheckCalibData.C:96
 CheckCalibData.C:97
 CheckCalibData.C:98
 CheckCalibData.C:99
 CheckCalibData.C:100
 CheckCalibData.C:101
 CheckCalibData.C:102
 CheckCalibData.C:103
 CheckCalibData.C:104
 CheckCalibData.C:105
 CheckCalibData.C:106
 CheckCalibData.C:107
 CheckCalibData.C:108
 CheckCalibData.C:109
 CheckCalibData.C:110
 CheckCalibData.C:111
 CheckCalibData.C:112
 CheckCalibData.C:113
 CheckCalibData.C:114
 CheckCalibData.C:115
 CheckCalibData.C:116
 CheckCalibData.C:117
 CheckCalibData.C:118
 CheckCalibData.C:119
 CheckCalibData.C:120
 CheckCalibData.C:121
 CheckCalibData.C:122