ROOT logo
/**
 * @file   RunFinalQA.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Fri Jan  6 11:46:30 2012
 * 
 * @brief  
 * 
 * @ingroup pwglf_forward_qa_scripts
 */
//____________________________________________________________________
/** 
 * Scan directory (and possibly sub-directories) for trending files
 * 
 * @param dir        Start directory
 * @param list       List to add file names to
 * @param recursive  Whether to scan recursively
 * @param pattern    Pattern filenames must match
 * 
 * @return true on success
 * 
 * @ingroup pwglf_forward_qa_scripts
 */
Bool_t ScanDirectory(TSystemDirectory* dir, 
		     TList* list, 
		     const char* pattern, 
		     bool recursive=false)
{
  TString fnPattern = pattern;

  // Assume failure 
  Bool_t ret = false;

  // Get list of files, and go back to old working directory
  TString oldDir(gSystem->WorkingDirectory());
  TList*  files = dir->GetListOfFiles();
  if (!gSystem->ChangeDirectory(oldDir)) { 
    Error("ScanDirectory", "Failed to go back to %s", oldDir.Data());
    return false;
  }
  if (!files) {
    Warning("ScanDirectory", "No files found in %s", dir->GetName());
    return false;
  }
  // files->ls();

  TList toAdd;
    
  // Sort list of files and check if we should add it 
  // files->Sort();
  TIter next(files);
  TSystemFile* file = 0;
  while ((file = static_cast<TSystemFile*>(next()))) {
    TString name(file->GetName());
    TString title(file->GetTitle());
    TString full(gSystem->ConcatFileName(file->GetTitle(), name.Data()));
    if (file->IsA() == TSystemDirectory::Class()) full = title;
    if (name == "." || name == "..") { 
      continue;
    }

    FileStat_t fs;
    if (gSystem->GetPathInfo(full.Data(), fs)) {
      Warning("ScanDirectory", "Cannot stat %s (%s)", full.Data(),
	      gSystem->WorkingDirectory());
      continue;
    }
    // Check if this is a directory 
    if (file->IsDirectory(full)) { 
      if (recursive) {
	TSystemDirectory* d = new TSystemDirectory(file->GetName(),
						   full.Data());
	if (ScanDirectory(d,list,pattern,recursive))
	  ret = true;
	delete d;
      }
      continue;
    }
    
    // If this is not a root file, ignore 
    if (!name.EndsWith(".root")) {
      continue;
    }

    // If this file does not contain AliESDs, ignore 
    if (!name.Contains(fnPattern)) { 
      continue;
    }
    
    // Add 
    toAdd.Add(new TObjString(full));
  }

  TIter nextAdd(&toAdd);
  TObjString* s = 0;
  while ((s = static_cast<TObjString*>(nextAdd()))) {
    list->Add(s);
  }
  if (toAdd.GetEntries() > 0) ret = true;

  gSystem->ChangeDirectory(oldDir);
  return ret;
}
//____________________________________________________________________
/** 
 * Get the list of trending files
 * 
 * @param input Start directory 
 * 
 * @return List of files 
 * 
 * @ingroup pwglf_forward_qa_scripts
 */
TList*
GetListOfFiles(const char* input=".")
{
  TList* ret = new TList;
  TString dir(input);
  // if (dir == ".") dir = "";

  TString savdir(gSystem->WorkingDirectory());
  TSystemDirectory d(gSystem->BaseName(dir.Data()), dir.Data());
  if (!ScanDirectory(&d, ret, "tree_", false)) { 
    delete ret;
    ret = 0;
  }
  gSystem->ChangeDirectory(savdir);  
  if (ret) ret->Sort();
  return ret;
}

//____________________________________________________________________
/** 
 * 
 * 
 * @param dir        Input directory
 * @param prodYear   Production year 
 * @param prodLetter Production letter
 * @param useVar     Use variance for errors (rather than min/max)
 * 
 * @ingroup pwglf_forward_qa_scripts
 */
void 
RunFinalQA(const char* dir, Int_t prodYear=0, const char* prodLetter="",
	   Bool_t useVar=false)
{
   int ret = 0;
   gROOT->SetMacroPath(Form(".:%s",gROOT->GetMacroPath()));
   gSystem->Load("libGpad");
   gSystem->Load("libTree");

   gROOT->LoadMacro("QABase.h+g");
   gROOT->LoadMacro("QAPlotter.C+g");

   Info("RunFinalQA", "Final QA: %d%c (variance: %s)", 
	prodYear, prodLetter[0], (useVar ? "true" : "false"));
   QAPlotter p(prodYear, prodLetter[0], useVar);
  
   TList* l = GetListOfFiles(dir);
   TIter next(l);
   TObject* o = 0;
   while ((o = next())) {
     p.AddFile(o->GetName());
   }

   p.Run();
}
//
// EOF
//
 RunFinalQA.C:1
 RunFinalQA.C:2
 RunFinalQA.C:3
 RunFinalQA.C:4
 RunFinalQA.C:5
 RunFinalQA.C:6
 RunFinalQA.C:7
 RunFinalQA.C:8
 RunFinalQA.C:9
 RunFinalQA.C:10
 RunFinalQA.C:11
 RunFinalQA.C:12
 RunFinalQA.C:13
 RunFinalQA.C:14
 RunFinalQA.C:15
 RunFinalQA.C:16
 RunFinalQA.C:17
 RunFinalQA.C:18
 RunFinalQA.C:19
 RunFinalQA.C:20
 RunFinalQA.C:21
 RunFinalQA.C:22
 RunFinalQA.C:23
 RunFinalQA.C:24
 RunFinalQA.C:25
 RunFinalQA.C:26
 RunFinalQA.C:27
 RunFinalQA.C:28
 RunFinalQA.C:29
 RunFinalQA.C:30
 RunFinalQA.C:31
 RunFinalQA.C:32
 RunFinalQA.C:33
 RunFinalQA.C:34
 RunFinalQA.C:35
 RunFinalQA.C:36
 RunFinalQA.C:37
 RunFinalQA.C:38
 RunFinalQA.C:39
 RunFinalQA.C:40
 RunFinalQA.C:41
 RunFinalQA.C:42
 RunFinalQA.C:43
 RunFinalQA.C:44
 RunFinalQA.C:45
 RunFinalQA.C:46
 RunFinalQA.C:47
 RunFinalQA.C:48
 RunFinalQA.C:49
 RunFinalQA.C:50
 RunFinalQA.C:51
 RunFinalQA.C:52
 RunFinalQA.C:53
 RunFinalQA.C:54
 RunFinalQA.C:55
 RunFinalQA.C:56
 RunFinalQA.C:57
 RunFinalQA.C:58
 RunFinalQA.C:59
 RunFinalQA.C:60
 RunFinalQA.C:61
 RunFinalQA.C:62
 RunFinalQA.C:63
 RunFinalQA.C:64
 RunFinalQA.C:65
 RunFinalQA.C:66
 RunFinalQA.C:67
 RunFinalQA.C:68
 RunFinalQA.C:69
 RunFinalQA.C:70
 RunFinalQA.C:71
 RunFinalQA.C:72
 RunFinalQA.C:73
 RunFinalQA.C:74
 RunFinalQA.C:75
 RunFinalQA.C:76
 RunFinalQA.C:77
 RunFinalQA.C:78
 RunFinalQA.C:79
 RunFinalQA.C:80
 RunFinalQA.C:81
 RunFinalQA.C:82
 RunFinalQA.C:83
 RunFinalQA.C:84
 RunFinalQA.C:85
 RunFinalQA.C:86
 RunFinalQA.C:87
 RunFinalQA.C:88
 RunFinalQA.C:89
 RunFinalQA.C:90
 RunFinalQA.C:91
 RunFinalQA.C:92
 RunFinalQA.C:93
 RunFinalQA.C:94
 RunFinalQA.C:95
 RunFinalQA.C:96
 RunFinalQA.C:97
 RunFinalQA.C:98
 RunFinalQA.C:99
 RunFinalQA.C:100
 RunFinalQA.C:101
 RunFinalQA.C:102
 RunFinalQA.C:103
 RunFinalQA.C:104
 RunFinalQA.C:105
 RunFinalQA.C:106
 RunFinalQA.C:107
 RunFinalQA.C:108
 RunFinalQA.C:109
 RunFinalQA.C:110
 RunFinalQA.C:111
 RunFinalQA.C:112
 RunFinalQA.C:113
 RunFinalQA.C:114
 RunFinalQA.C:115
 RunFinalQA.C:116
 RunFinalQA.C:117
 RunFinalQA.C:118
 RunFinalQA.C:119
 RunFinalQA.C:120
 RunFinalQA.C:121
 RunFinalQA.C:122
 RunFinalQA.C:123
 RunFinalQA.C:124
 RunFinalQA.C:125
 RunFinalQA.C:126
 RunFinalQA.C:127
 RunFinalQA.C:128
 RunFinalQA.C:129
 RunFinalQA.C:130
 RunFinalQA.C:131
 RunFinalQA.C:132
 RunFinalQA.C:133
 RunFinalQA.C:134
 RunFinalQA.C:135
 RunFinalQA.C:136
 RunFinalQA.C:137
 RunFinalQA.C:138
 RunFinalQA.C:139
 RunFinalQA.C:140
 RunFinalQA.C:141
 RunFinalQA.C:142
 RunFinalQA.C:143
 RunFinalQA.C:144
 RunFinalQA.C:145
 RunFinalQA.C:146
 RunFinalQA.C:147
 RunFinalQA.C:148
 RunFinalQA.C:149
 RunFinalQA.C:150
 RunFinalQA.C:151
 RunFinalQA.C:152
 RunFinalQA.C:153
 RunFinalQA.C:154
 RunFinalQA.C:155
 RunFinalQA.C:156
 RunFinalQA.C:157
 RunFinalQA.C:158
 RunFinalQA.C:159
 RunFinalQA.C:160
 RunFinalQA.C:161
 RunFinalQA.C:162
 RunFinalQA.C:163
 RunFinalQA.C:164
 RunFinalQA.C:165
 RunFinalQA.C:166
 RunFinalQA.C:167
 RunFinalQA.C:168
 RunFinalQA.C:169
 RunFinalQA.C:170