ROOT logo
#include <TFile.h>
#include <TList.h>
#include <TParameter.h>
#include <TError.h>
#include "AliCorrectionManagerBase.h"

/**
 * Extract corrections from result file 
 * 
 */
struct CorrExtractor 
{
  /** 
   * Constructor 
   * 
   * @param manager Correction manager
   */
  CorrExtractor(AliCorrectionManagerBase* manager)
    : fFile(0), 
      fTop(0), 
      fOut(""),
      fRunNo(0), 
      fSys(0), 
      fSNN(0), 
      fField(999), 
      fMC(false), 
      fSatellite(false),
      fManager(manager)
  {}
  TCollection* GetCollection(TCollection* p, 
			     const TString& name)
  {
    TObject* o = 0;
    if (p == 0) { 
      o = fFile->Get(name);
      if (!o) { 
	Warning("CorrExtractor", "Object %s not found in file", name.Data());
	return 0;
      }
    }
    else {
      o = p->FindObject(name);
      if (!o) { 
	Warning("CorrExtractor", "Object %s not found in %s", 
		name.Data(), p->GetName());
	return 0;
      }
    }      
    if (!o->IsA()->InheritsFrom(TCollection::Class())) {
      Warning("CorrExtractor", "%s in %s is not a collection, but a %s", 
	      name.Data(), (p ? p->GetName() : "file"), o->ClassName());
      return 0;
    }
    return static_cast<TCollection*>(o);
  }
  /** 
   * Find a collection in a file 
   * 
   * @param path Path to collection
   * 
   * @return Found collection or null
   */
  TCollection* FindCollection(const TString& path)
  {
    if (path.IsNull()) return 0;
    TObjArray*   tokens = path.Tokenize("/");
    TIter        next(tokens);
    TObjString*  token = 0;
    TCollection* p     = 0;
    while ((token = static_cast<TObjString*>(next()))) {
      const TString& t = token->String();
      if (t.IsNull()) continue;
      p = GetCollection(p, t);
      if (!p) break;
    }
    tokens->Delete();
    return p;
    
  }
  /** 
   * Find an object 
   * 
   * @param path Path to object 
   * @param name Name of object
   * 
   * @return Found object or null
   */  
  TObject* FindObject(const TString& path, 
		      const TString& name) 
  {
    if (path.IsNull()) { 
      TObject* o = fFile->Get(name);
      if (!o) { 
	Warning("CorrExtractor", "Object %s not found in file", 
		name.Data());
	return 0;
      }
      return o;
    }
    TCollection* p     = FindCollection(path);
    if (!p) { 
      Warning("CorrExtractor", "Path %s invalid", path.Data());
      return 0;
    }
    return p->FindObject(name);
  }
  /** 
   * Initialize this extactor
   * 
   * @param fileName  File to extract from 
   * @param sumFolder The summed folder 
   * @param out       The result folder
   * 
   * @return true on success
   */
  Bool_t Init(const TString&        fileName, 
	      const TString&        sumFolder, 
	      const TString&        out)
  {
    fOut  = out;
    Clear();

    fFile = TFile::Open(fileName, "READ");
    if (!fFile) {
      Error("CorrExtractor", "Failed to open \"%s\"", fileName.Data());
      Clear();
      return false;
    }
    TCollection* c = FindCollection(Form("%s/fmdEventInspector", 
					 sumFolder.Data()));
    if (!c) { 
      Error("CorrExtractor", "Couldn't get event inspector list from %s",
	    fileName.Data());
      Clear();
      return false;
    }
    TObject* oSys        = c->FindObject("sys");
    TObject* oSNN        = c->FindObject("sNN");
    TObject* oFld        = c->FindObject("field");
    TObject* oRun        = c->FindObject("runNo");
    TObject* oSat        = c->FindObject("satellite");
    if (oSys && fSys   <= 0)   fSys       = oSys->GetUniqueID();
    if (oSNN && fSNN   <= 0)   fSNN       = oSNN->GetUniqueID();
    if (oFld && fField >= 999) fField     = oFld->GetUniqueID();
    if (oRun && fRunNo <= 0)   fRunNo     = oRun->GetUniqueID();
    if (oSat)                  fSatellite = oSat->GetUniqueID();

    if (fSys <= 0 || fSys > 3 || fSNN <= 0 || fField >= 999 || fRunNo <= 0 ){
      Error("CorrExtractor", "Failed to get settings");
      Clear();
      return false;
    } 
    return true;
  }
  /** 
   * Set whether this is MC or not
   * 
   * @param mc If true, consider this MC 
   */
  void SetMC(Bool_t mc=true) { fMC = mc; }
  /** 
   * Extract the stuff 
   * 
   * @param cls    Class of object
   * @param parent Parent folder 
   * 
   * @return 
   */
  Bool_t Extract(const TClass* cls, const TString& parent)
  {
    return Extract(cls->GetName(), parent);
  }
  /** 
   * Extract the stuff
   * 
   * @param objName  Object name 
   * @param parent   Parent folder 
   * 
   * @return 
   */
  Bool_t Extract(const TString& objName, 
		 const TString& parent="") 
  {
    if (!fFile) { 
      Warning("Extract", "No file opened");
      return false;
    }   
    TObject* o = FindObject(parent, objName);
    if (!o) { 
      Warning("Extract", "Object %s not found in collection %s", 
	      objName.Data(), parent.Data());
      return false;
    }
    return fManager->Store(o, 
			   fRunNo, 
			   fSys, 
			   fSNN, 
			   fField, 
			   fMC, 
			   fSatellite, 
			   fOut.Data());
  }
  /** 
   * Clear this extractor 
   * 
   */
  void Clear()
  {
    if (!fFile) return;
    fFile->Close();
    fFile      = 0;
    fTop       = 0;
    fRunNo     = 0;
    fSys       = 0;
    fSNN       = 0;
    fField     = 999;
    fMC        = false;
    fSatellite = false;
  }
  TFile*                    fFile;          // Our file
  TList*                    fTop;           // Top list
  TString                   fOut;           // Output 
  ULong_t                   fRunNo;         // Run number
  UShort_t                  fSys;           // System
  UShort_t                  fSNN;           // Collision energy in GeV
  Short_t                   fField;         // L3 field in kG
  Bool_t                    fMC;            // Simulation flag
  Bool_t                    fSatellite;     // Satellite interaction flag
  AliCorrectionManagerBase* fManager;       // Correction manager to use 
};

//
// EOF
//


 CorrExtractor.C:1
 CorrExtractor.C:2
 CorrExtractor.C:3
 CorrExtractor.C:4
 CorrExtractor.C:5
 CorrExtractor.C:6
 CorrExtractor.C:7
 CorrExtractor.C:8
 CorrExtractor.C:9
 CorrExtractor.C:10
 CorrExtractor.C:11
 CorrExtractor.C:12
 CorrExtractor.C:13
 CorrExtractor.C:14
 CorrExtractor.C:15
 CorrExtractor.C:16
 CorrExtractor.C:17
 CorrExtractor.C:18
 CorrExtractor.C:19
 CorrExtractor.C:20
 CorrExtractor.C:21
 CorrExtractor.C:22
 CorrExtractor.C:23
 CorrExtractor.C:24
 CorrExtractor.C:25
 CorrExtractor.C:26
 CorrExtractor.C:27
 CorrExtractor.C:28
 CorrExtractor.C:29
 CorrExtractor.C:30
 CorrExtractor.C:31
 CorrExtractor.C:32
 CorrExtractor.C:33
 CorrExtractor.C:34
 CorrExtractor.C:35
 CorrExtractor.C:36
 CorrExtractor.C:37
 CorrExtractor.C:38
 CorrExtractor.C:39
 CorrExtractor.C:40
 CorrExtractor.C:41
 CorrExtractor.C:42
 CorrExtractor.C:43
 CorrExtractor.C:44
 CorrExtractor.C:45
 CorrExtractor.C:46
 CorrExtractor.C:47
 CorrExtractor.C:48
 CorrExtractor.C:49
 CorrExtractor.C:50
 CorrExtractor.C:51
 CorrExtractor.C:52
 CorrExtractor.C:53
 CorrExtractor.C:54
 CorrExtractor.C:55
 CorrExtractor.C:56
 CorrExtractor.C:57
 CorrExtractor.C:58
 CorrExtractor.C:59
 CorrExtractor.C:60
 CorrExtractor.C:61
 CorrExtractor.C:62
 CorrExtractor.C:63
 CorrExtractor.C:64
 CorrExtractor.C:65
 CorrExtractor.C:66
 CorrExtractor.C:67
 CorrExtractor.C:68
 CorrExtractor.C:69
 CorrExtractor.C:70
 CorrExtractor.C:71
 CorrExtractor.C:72
 CorrExtractor.C:73
 CorrExtractor.C:74
 CorrExtractor.C:75
 CorrExtractor.C:76
 CorrExtractor.C:77
 CorrExtractor.C:78
 CorrExtractor.C:79
 CorrExtractor.C:80
 CorrExtractor.C:81
 CorrExtractor.C:82
 CorrExtractor.C:83
 CorrExtractor.C:84
 CorrExtractor.C:85
 CorrExtractor.C:86
 CorrExtractor.C:87
 CorrExtractor.C:88
 CorrExtractor.C:89
 CorrExtractor.C:90
 CorrExtractor.C:91
 CorrExtractor.C:92
 CorrExtractor.C:93
 CorrExtractor.C:94
 CorrExtractor.C:95
 CorrExtractor.C:96
 CorrExtractor.C:97
 CorrExtractor.C:98
 CorrExtractor.C:99
 CorrExtractor.C:100
 CorrExtractor.C:101
 CorrExtractor.C:102
 CorrExtractor.C:103
 CorrExtractor.C:104
 CorrExtractor.C:105
 CorrExtractor.C:106
 CorrExtractor.C:107
 CorrExtractor.C:108
 CorrExtractor.C:109
 CorrExtractor.C:110
 CorrExtractor.C:111
 CorrExtractor.C:112
 CorrExtractor.C:113
 CorrExtractor.C:114
 CorrExtractor.C:115
 CorrExtractor.C:116
 CorrExtractor.C:117
 CorrExtractor.C:118
 CorrExtractor.C:119
 CorrExtractor.C:120
 CorrExtractor.C:121
 CorrExtractor.C:122
 CorrExtractor.C:123
 CorrExtractor.C:124
 CorrExtractor.C:125
 CorrExtractor.C:126
 CorrExtractor.C:127
 CorrExtractor.C:128
 CorrExtractor.C:129
 CorrExtractor.C:130
 CorrExtractor.C:131
 CorrExtractor.C:132
 CorrExtractor.C:133
 CorrExtractor.C:134
 CorrExtractor.C:135
 CorrExtractor.C:136
 CorrExtractor.C:137
 CorrExtractor.C:138
 CorrExtractor.C:139
 CorrExtractor.C:140
 CorrExtractor.C:141
 CorrExtractor.C:142
 CorrExtractor.C:143
 CorrExtractor.C:144
 CorrExtractor.C:145
 CorrExtractor.C:146
 CorrExtractor.C:147
 CorrExtractor.C:148
 CorrExtractor.C:149
 CorrExtractor.C:150
 CorrExtractor.C:151
 CorrExtractor.C:152
 CorrExtractor.C:153
 CorrExtractor.C:154
 CorrExtractor.C:155
 CorrExtractor.C:156
 CorrExtractor.C:157
 CorrExtractor.C:158
 CorrExtractor.C:159
 CorrExtractor.C:160
 CorrExtractor.C:161
 CorrExtractor.C:162
 CorrExtractor.C:163
 CorrExtractor.C:164
 CorrExtractor.C:165
 CorrExtractor.C:166
 CorrExtractor.C:167
 CorrExtractor.C:168
 CorrExtractor.C:169
 CorrExtractor.C:170
 CorrExtractor.C:171
 CorrExtractor.C:172
 CorrExtractor.C:173
 CorrExtractor.C:174
 CorrExtractor.C:175
 CorrExtractor.C:176
 CorrExtractor.C:177
 CorrExtractor.C:178
 CorrExtractor.C:179
 CorrExtractor.C:180
 CorrExtractor.C:181
 CorrExtractor.C:182
 CorrExtractor.C:183
 CorrExtractor.C:184
 CorrExtractor.C:185
 CorrExtractor.C:186
 CorrExtractor.C:187
 CorrExtractor.C:188
 CorrExtractor.C:189
 CorrExtractor.C:190
 CorrExtractor.C:191
 CorrExtractor.C:192
 CorrExtractor.C:193
 CorrExtractor.C:194
 CorrExtractor.C:195
 CorrExtractor.C:196
 CorrExtractor.C:197
 CorrExtractor.C:198
 CorrExtractor.C:199
 CorrExtractor.C:200
 CorrExtractor.C:201
 CorrExtractor.C:202
 CorrExtractor.C:203
 CorrExtractor.C:204
 CorrExtractor.C:205
 CorrExtractor.C:206
 CorrExtractor.C:207
 CorrExtractor.C:208
 CorrExtractor.C:209
 CorrExtractor.C:210
 CorrExtractor.C:211
 CorrExtractor.C:212
 CorrExtractor.C:213
 CorrExtractor.C:214
 CorrExtractor.C:215
 CorrExtractor.C:216
 CorrExtractor.C:217
 CorrExtractor.C:218
 CorrExtractor.C:219
 CorrExtractor.C:220
 CorrExtractor.C:221
 CorrExtractor.C:222
 CorrExtractor.C:223
 CorrExtractor.C:224
 CorrExtractor.C:225
 CorrExtractor.C:226
 CorrExtractor.C:227
 CorrExtractor.C:228
 CorrExtractor.C:229
 CorrExtractor.C:230
 CorrExtractor.C:231
 CorrExtractor.C:232
 CorrExtractor.C:233
 CorrExtractor.C:234
 CorrExtractor.C:235
 CorrExtractor.C:236
 CorrExtractor.C:237