ROOT logo
#include "TCanvas.h"
#include "TH2D.h"
#include "TFile.h"
#include "TPRegexp.h"
#include "TString.h"
#include "TSystem.h"

#include "AliOADBContainer.h"

#include <iostream>

//#define TEST

Int_t addMapToFile(TString filePathNameMapToAdd, TString normalisation, TString period, Int_t pass, Bool_t isMC, Bool_t isSigma, 
                   TString pathMapPackage = "etaMaps", TString fileNameMapPackage = "TPCetaMaps.root")
{
  //normalisation = "NoNormalisation", "SmallEtaNormalisation", "LargeEtaNormalisation"
  
  TString mapNameInFile = "";
  TString par0StringName = "";
  TString mapName = "";
  TString mapTitle = "";
  
  Int_t* runLow = 0x0;
  Int_t* runUp = 0x0;
  Int_t nRunRanges = 1;
  
  TString dataType = "DATA";
  if (isMC)
    dataType = "MC";
  
  if (isSigma) {
    mapName = "sigmaPar1Map";
    //mapNameInFile = "hThetaMapSigmaPar1";
    mapNameInFile = Form("hSigmaPar1_%s_extrapolated", normalisation.Data());
    par0StringName = "c0";
  }
  else {
    mapName = Form("TPCetaMaps_%s_pass%d", dataType.Data(), pass);
    //mapNameInFile = Form("hRefined%s", normalisation.Data());
    mapNameInFile = Form("hRes3DprimeFit_%s_extrapolated", normalisation.Data());
  }
  
  
  
  
  //TPRegexp reg(".*(LHC1[1-2][a-z]+[0-9]+[a-z_]*)/.*");
  
  
  // Find the run range from the period
  period.ToUpper();
  
  Bool_t addDefault = kFALSE;
  TString defaultObj = Form("Default_%s_pass%d", dataType.Data(), pass);
  
  if (period.Contains("LHC10B") == 1 && !isMC) {
    mapTitle = Form("LHC10b.pass%d", pass);
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 114650;
    runUp[0] = 117630;
  }
  else if (period.Contains("LHC10C") == 1 && !isMC) {
    mapTitle = Form("LHC10c.pass%d", pass);
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 117631;
    runUp[0] = 121526;
  }
  else if (period.Contains("LHC10D") == 1 && !isMC) {
    mapTitle = Form("LHC10d.pass%d", pass);
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 121527;
    runUp[0] = 126460;
  }
  else if (period.Contains("LHC10E") == 1 && !isMC) {
    mapTitle = Form("LHC10e.pass%d", pass);
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 126461;
    runUp[0] = 130930;
  }
  else if (period.Contains("LHC11A_7TEV") == 1 && !isMC) {
    //LHC11a -> 7TeV
    mapTitle = Form("LHC11a_7TeV.pass%d", pass);
  
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 139847;
    runUp[0] = 146631;
  }
  else if (period.Contains("LHC11A_2.76TEV") == 1 && !isMC) {
    //LHC11a -> 2.76TeV
    mapTitle = Form("LHC11a_2.76TeV.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 146632;
    runUp[0] = 146974;
  }
  else if (period.Contains("LHC10H") == 1 && !isMC) {
    //LHC10h -> 2.76 ATeV (PbPb)
    mapTitle = Form("LHC10h.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 136782;
    runUp[0] = 139846;
  }
  else if (period.Contains("LHC11H") == 1 && !isMC) {
    //LHC11h -> 2.76 ATeV (PbPb)
    mapTitle = Form("LHC11h.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 165772;
    runUp[0] = 170718;
  }
  else if (period.Contains("LHC10D1") == 1 && isMC) {
    period = "LHC10D1";
    mapTitle = Form("LHC10d1.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10b - LHC10c
    runLow[0] = 114650;
    runUp[0] = 121526;
  }
  else if (period.Contains("LHC10F6A") == 1 && isMC) {
    period  = "LHC10F6A";
    mapTitle = Form("LHC10f6a.pass%d", pass);
    
    nRunRanges = 3;
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10c - LHC10g
    runLow[0] = 121527;
    runUp[0] = 136781;
    
    // LHC11a_7TeV
    runLow[1] = 139847;
    runUp[1] = 146631;
    
    // NO LHC11a_2.76TeV (-> LHC11b10a)
    
    // LHC11b (146975-150721) + LHC11c (150722-155837) + LHC11d(155838-159649)
    runLow[2] = 146975;
    runUp[2] = 159649;
  }
  else if (period.Contains("LHC11B2") == 1 && isMC) {
    period = "LHC11B2";
    mapTitle = Form("LHC11b2.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10b - LHC10e
    runLow[0] = 114650;
    runUp[0] = 130930;
  }
  else if (period.Contains("LHC11B10A") == 1 && isMC) {
    period = "LHC11B10A";
    mapTitle = Form("LHC11b10a.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC11a, 2.76TeV
    runLow[0] = 146632;
    runUp[0] = 146974;
  }
  else if (period.Contains("LHC12F1") == 1 && isMC) {
    period = "LHC12F1";
    mapTitle = Form("LHC12f1.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC11a, 2.76TeV
    runLow[0] = 146632;
    runUp[0] = 146974;
  }
  //TODO Hope: Same map for 11A10A and 11A10B! Just use LHC11A10
  else if (period.Contains("LHC11A10") == 1 && isMC) {
    //LHC10h -> 2.76 ATeV (PbPb)
    //TODO maybe also valid MC for LHC11h
    period = "LHC11A10";
    mapTitle = Form("LHC11a10.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10h
    runLow[0] = 136782;
    runUp[0] = 139846;
  }
  /*
  else if (period.Contains("LHC11A10A") == 1 && isMC) {
    //LHC10h -> 2.76 ATeV (PbPb)
    period = "LHC11A10A";
    mapTitle = Form("LHC11a10a.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10h
    runLow[0] = 136782;
    runUp[0] = 139846;
  }
  /*
  else if (period.Contains("LHC11A10B") == 1 && isMC) {
    //LHC10h -> 2.76 ATeV (PbPb)
    period = "LHC11A10B";
    mapTitle = Form("LHC11a10b.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    // LHC10h
    runLow[0] = 136782;
    runUp[0] = 139846;
  }*/
  else if (period.Contains("LHC12G") == 1 && isMC) {
    //LHC12g (same map for 12g1, 12g4, ...) -> 5.023 ATeV (pPb)
    period = "LHC12G";
    mapTitle = Form("LHC12g.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    /*TODO look up?!
    runLow[0] = 136782;
    runUp[0] = 139846;*/
  }
  else if (period.Contains("LHC13B2_FIXN1") == 1 && isMC) {
    //LHC13b2_fixn1 -> 5.023 ATeV (pPb)
    period = "LHC13B2_FIXn1";
    mapTitle = Form("LHC13b2_fixn1.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    /*
     * runLow[0] = 194480;
    runUp[0] = 196345;*/
  }
  else if (period.Contains("LHC13B2_FIX") == 1 && isMC) {
    //LHC13b2_fix -> 5.023 ATeV (pPb)
    period = "LHC13B2_FIX";
    mapTitle = Form("LHC13b2_fix.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    /*
     * runLow[0] = 194480;
    runUp[0] = 196345;*/
  }
  else if (period.Contains("LHC13B") == 1 && !isMC) {
    //LHC13a-d (beam only since 13b) periods -> 5.023 ATeV (pPb)
    // -> High luminosity periods (e and following) require
    // at the moment separate treatmeant
    period = "LHC13B";
    mapTitle = Form("LHC13b.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 194480;
    runUp[0] = 195874;
  }
  else if (period.Contains("LHC13F") == 1 && !isMC) {
    //LHC13e-f periods -> 5.023 ATeV (pPb) high luminosity
    period = "LHC13F";
    mapTitle = Form("LHC13f.pass%d", pass);
    
    runLow = new Int_t[nRunRanges];
    runUp = new Int_t[nRunRanges];
    
    runLow[0] = 195875;
    runUp[0] = 197411;
  }
  else if (period.Contains("DEFAULT")) {
    mapTitle = Form("Default_%s_pass%d", dataType.Data(), pass);
    addDefault = kTRUE;
    printf("Request for default object...\n");
#ifdef TEST
  runLow = new Int_t[nRunRanges];
  runUp = new Int_t[nRunRanges];
  runLow[0] = 333333;
  runUp[0] = 333333;
#endif
  }
  else {
    printf("Unknown period!\n");
    return -1;
  }
  

  
  
#ifdef TEST
  // TEST created file
  printf("\n\n***********TEST MODE ENABLED*********\n\n");
  Int_t fRun = (runUp[0] + runLow[0]) / 2.0;
 
  TH2D* etaMap = 0x0;
  TH2D* etaSigmaPar1Map = 0x0;
  
  Double_t sigmaPar0 = -1.0;
  
  // Load the eta correction maps
  AliOADBContainer etaMapsCont2(Form("TPCetaMaps_%s_pass%d", dataType.Data(), pass)); 
    
  Int_t statusCont2 = etaMapsCont2.InitFromFile("etaMaps/TPCetaMaps.root", Form("TPCetaMaps_%s_pass%d", dataType.Data(), pass));
  if (statusCont2) {
    printf("Failed initializing TPC eta correction maps from OADB");
    return -1;
  }
  else {
    if (isMC) {
      TString searchMap = Form("TPCetaMaps_%s_%s_pass%d", dataType.Data(), period.Data(), pass);
      etaMap = dynamic_cast<TH2D *>(etaMapsCont2.GetDefaultObject(searchMap.Data()));
      if (!etaMap) {
        // Try default object
        etaMap = dynamic_cast<TH2D *>(etaMapsCont2.GetDefaultObject(defaultObj.Data()));
        
        if (!etaMap) {
          printf("TPC eta correction map not found for period %s and also no default map found -> Disabled eta correction!!!",
                 period.Data());
          return -1;
        }
      }
    }
    else {
      etaMap = dynamic_cast<TH2D *>(etaMapsCont2.GetObject(fRun, defaultObj.Data()));
      if (!etaMap) {
        printf("TPC eta correction map not found for run %d -> Disabled eta correction!!!", fRun);
        return -1;
      }
    }
  }
  
  // Load the sigma parametrisation (1/dEdx vs tanTheta_local (~eta))
  AliOADBContainer etaSigmaMapsCont2(Form("TPCetaSigmaMaps_%s_pass%d", dataType.Data(), pass)); 
  
  statusCont2 = etaSigmaMapsCont2.InitFromFile("etaMaps/TPCetaMaps.root", Form("TPCetaSigmaMaps_%s_pass%d", dataType.Data(), pass));
  if (statusCont2) {
    printf("Failed initializing TPC eta sigma maps from OADB");
    return -1;
  }
  else {
    TObjArray* etaSigmaPars = 0x0;
    if (isMC) {
      TString searchMap = Form("TPCetaSigmaMaps_%s_%s_pass%d", dataType.Data(), period.Data(), pass);
      etaSigmaPars = dynamic_cast<TObjArray *>(etaSigmaMapsCont2.GetDefaultObject(searchMap.Data()));
      if (!etaSigmaPars) {
        // Try default object
        etaSigmaPars = dynamic_cast<TObjArray *>(etaSigmaMapsCont2.GetDefaultObject(defaultObj.Data()));
        if (!etaSigmaPars) {
          printf("TPC eta sigma parametrisation not found for period %s and also no default parametrisation found -> Using old sigma parametrisation!!!",
                 period.Data());
          return -1;
        }
      }
    }
    else {
      etaSigmaPars = dynamic_cast<TObjArray *>(etaSigmaMapsCont2.GetObject(fRun, defaultObj.Data()));
      if (!etaSigmaPars) {
        printf("TPC eta sigma parametrisation not found for run %d -> Using old sigma parametrisation!!!", fRun);
        return -1;
      }
    }
    
    etaSigmaPar1Map = dynamic_cast<TH2D *>(etaSigmaPars->FindObject("sigmaPar1Map"));
    TNamed* sigmaPar0Info = dynamic_cast<TNamed *>(etaSigmaPars->FindObject("sigmaPar0"));
    
    if (sigmaPar0Info) {
      TString sigmaPar0String = sigmaPar0Info->GetTitle();
      sigmaPar0 = sigmaPar0String.Atof();
    }
    else {
      // Something is weired because the object for parameter 0 could not be loaded -> New sigma parametrisation can not be used!
      etaSigmaPar1Map = 0x0;
      return -1;
    }
  }
  
  printf("\n\nLoaded c0: %.4f\n", sigmaPar0);
  TCanvas* c = new TCanvas();
  c->Divide(2,1);
  c->cd(1);
  etaMap->Draw("colz");
  c->cd(2);
  etaSigmaPar1Map->Draw("colz");
  
  return 0;
#endif
  
  
  
  
  
  
  
  
  // Open the map package and retrieve the OADBContainers. If the map package does not exist,
  // create it. If there is no OADBContainer yet, create a new one
  TString filePathNameMapPackage = gSystem->ExpandPathName(Form("%s/%s", pathMapPackage.Data(), fileNameMapPackage.Data()));
 
  AliOADBContainer* etaMapsCont = 0x0;
  
  if (!isSigma) {
    etaMapsCont = new AliOADBContainer(Form("TPCetaMaps_%s_pass%d", dataType.Data(), pass)); 
    Int_t statusCont = etaMapsCont->InitFromFile(filePathNameMapPackage.Data(), Form("TPCetaMaps_%s_pass%d", dataType.Data(), pass));
    if (statusCont) 
      printf("No OADBContainer for the current settings found - creating a new one...\n");
  }
  else {
    etaMapsCont = new AliOADBContainer(Form("TPCetaSigmaMaps_%s_pass%d", dataType.Data(), pass)); 
    Int_t statusCont = etaMapsCont->InitFromFile(filePathNameMapPackage.Data(), Form("TPCetaSigmaMaps_%s_pass%d", dataType.Data(), pass));
    if (statusCont) 
      printf("No OADBContainer for the current settings found - creating a new one...\n");
  }


  // Open the map that should be added
  filePathNameMapToAdd = gSystem->ExpandPathName(filePathNameMapToAdd.Data());
  
  TFile* fMapToAdd = TFile::Open(filePathNameMapToAdd.Data());
  
  if (!fMapToAdd) {
    std::cout << "Failed to open map file \"" << filePathNameMapToAdd.Data() << "\"!" << std::endl;
    return -1;
  }
    
  TH2D* hMap = dynamic_cast<TH2D*>(fMapToAdd->Get(mapNameInFile.Data()));
  if (!hMap) {
    std::cout << "Failed to load map!" << std::endl;
  
    return -1;
  }
  
  hMap->SetName(mapName.Data());
  hMap->SetTitle(mapTitle.Data());
  
  TNamed* c0Info = 0x0;
  TObjArray* sigmaPars = 0x0;
  
  if (isSigma) {
    c0Info = dynamic_cast<TNamed*>(fMapToAdd->Get(par0StringName.Data()));
    if (!c0Info) {
      std::cout << "Failed to load parameter 0!" << std::endl;
      return -1;
    }
    
    c0Info->SetName("sigmaPar0");
    
    sigmaPars = new TObjArray(2);
    sigmaPars->SetOwner(kTRUE);
    
    if (isMC) {
      sigmaPars->SetName(Form("TPCetaSigmaMaps_%s_%s_pass%d", dataType.Data(), period.Data(), pass));
    }
    else {
      sigmaPars->SetName(Form("TPCetaSigmaMaps_%s_pass%d", dataType.Data(), pass));
    }
    
    sigmaPars->Add(hMap);
    sigmaPars->Add(c0Info);
    
    if (addDefault) {
      sigmaPars->SetName(defaultObj.Data());
      if (isMC) {
        TObjArray* oldObj = (TObjArray*)etaMapsCont->GetDefaultList()->Remove(etaMapsCont->GetDefaultObject(sigmaPars->GetName()));
        if (oldObj)
          oldObj->Delete();
        delete oldObj;
      }
      else {
        etaMapsCont->CleanDefaultList();
      }
      etaMapsCont->AddDefaultObject(sigmaPars);
    }
    else {
      if (isMC) {
        TObjArray* oldObj = (TObjArray*)etaMapsCont->GetDefaultList()->Remove(etaMapsCont->GetDefaultObject(sigmaPars->GetName()));
        if (oldObj) {
          printf("Updating existing object \"%s\"...\n", mapTitle.Data());
          oldObj->Delete();
          delete oldObj;
        }
        else {
          printf("Creating new object \"%s\"...\n", mapTitle.Data());
        }
        etaMapsCont->AddDefaultObject(sigmaPars);
      }
      else {
        // Check, if the object already exists by taking the center of the run range.
        // If there is a conflict for the range, AliOADBContainer will give an AliFatal.
        for (Int_t range = 0; range < nRunRanges; range++) {
          Int_t index = etaMapsCont->GetIndexForRun((runUp[range] + runLow[range]) / 2.0);
          if (index < 0) {
            printf("Creating new object for run range %d - %d...\n", runLow[range], runUp[range]);
            etaMapsCont->AppendObject((range == 0) ? sigmaPars : sigmaPars->Clone(), runLow[range], runUp[range]);
          }
          else {
            printf("Updating existing object for run range %d - %d...\n", runLow[range], runUp[range]);
            etaMapsCont->UpdateObject(index, (range == 0) ? sigmaPars : sigmaPars->Clone(), runLow[range], runUp[range]);
          }
        }
      }
    }
  }
  else {
    
    if (isMC) {
      hMap->SetName(Form("TPCetaMaps_%s_%s_pass%d", dataType.Data(), period.Data(), pass));
    }
    
    if (addDefault) {
      hMap->SetName(defaultObj.Data());
      
      if (isMC) {
        TH2D* oldMap = (TH2D*)etaMapsCont->GetDefaultList()->Remove(etaMapsCont->GetDefaultObject(hMap->GetName()));
        delete oldMap;
      }
      else {
        etaMapsCont->CleanDefaultList();
      }
      etaMapsCont->AddDefaultObject(hMap);
    }
    else {
      if (isMC) {
        TH2D* oldMap = (TH2D*)etaMapsCont->GetDefaultList()->Remove(etaMapsCont->GetDefaultObject(hMap->GetName()));
        if (oldMap) {
          printf("Updating existing object \"%s\"...\n", mapTitle.Data());
          delete oldMap;
        }
        else {
          printf("Creating new object \"%s\"...\n", mapTitle.Data());
        }
        etaMapsCont->AddDefaultObject(hMap);
      }
      else {
        // Check, if the object already exists by taking the center of the run range.
        // If there is a conflict for the range, AliOADBContainer will give an AliFatal.
        for (Int_t range = 0; range < nRunRanges; range++) {
          Int_t index = etaMapsCont->GetIndexForRun((runUp[range] + runLow[range]) / 2.0);
          if (index < 0) {
            printf("Creating new object for run range %d - %d...\n", runLow[range], runUp[range]);
            etaMapsCont->AppendObject((range == 0) ? hMap : hMap->Clone(), runLow[range], runUp[range]);
          }
          else {
            printf("Updating existing object for run range %d - %d...\n", runLow[range], runUp[range]);
            etaMapsCont->UpdateObject(index, (range == 0) ? hMap : hMap->Clone(), runLow[range], runUp[range]);
          }
        }
      }
    }
  }

  //etaMapsCont->WriteToFile(filePathNameMapPackage.Data());
  // Does the same as the WriteToFile function, but allow for using "kOverwrite" to save memory!
  TFile* f = new TFile(filePathNameMapPackage.Data(), "update");
  f->Delete(etaMapsCont->GetName());
  etaMapsCont->Write(0, TObject::kOverwrite);
  f->Purge();
  f->Close();
  
  
  gSystem->Exec(Form("echo \"%s%s:\t\t%s#%s\n\" >> %s/UsedFilesForMap.txt", mapTitle.Data(), isSigma ? " (sigma)" : " (etaCorr)",
                     filePathNameMapToAdd.Data(), mapNameInFile.Data(), pathMapPackage.Data()));
  
  fMapToAdd->Close();
  
  printf("\n****************Successfully added map \"%s\"!\n\n\n\n", mapTitle.Data());
  return 0;
 addMapToFile.C:1
 addMapToFile.C:2
 addMapToFile.C:3
 addMapToFile.C:4
 addMapToFile.C:5
 addMapToFile.C:6
 addMapToFile.C:7
 addMapToFile.C:8
 addMapToFile.C:9
 addMapToFile.C:10
 addMapToFile.C:11
 addMapToFile.C:12
 addMapToFile.C:13
 addMapToFile.C:14
 addMapToFile.C:15
 addMapToFile.C:16
 addMapToFile.C:17
 addMapToFile.C:18
 addMapToFile.C:19
 addMapToFile.C:20
 addMapToFile.C:21
 addMapToFile.C:22
 addMapToFile.C:23
 addMapToFile.C:24
 addMapToFile.C:25
 addMapToFile.C:26
 addMapToFile.C:27
 addMapToFile.C:28
 addMapToFile.C:29
 addMapToFile.C:30
 addMapToFile.C:31
 addMapToFile.C:32
 addMapToFile.C:33
 addMapToFile.C:34
 addMapToFile.C:35
 addMapToFile.C:36
 addMapToFile.C:37
 addMapToFile.C:38
 addMapToFile.C:39
 addMapToFile.C:40
 addMapToFile.C:41
 addMapToFile.C:42
 addMapToFile.C:43
 addMapToFile.C:44
 addMapToFile.C:45
 addMapToFile.C:46
 addMapToFile.C:47
 addMapToFile.C:48
 addMapToFile.C:49
 addMapToFile.C:50
 addMapToFile.C:51
 addMapToFile.C:52
 addMapToFile.C:53
 addMapToFile.C:54
 addMapToFile.C:55
 addMapToFile.C:56
 addMapToFile.C:57
 addMapToFile.C:58
 addMapToFile.C:59
 addMapToFile.C:60
 addMapToFile.C:61
 addMapToFile.C:62
 addMapToFile.C:63
 addMapToFile.C:64
 addMapToFile.C:65
 addMapToFile.C:66
 addMapToFile.C:67
 addMapToFile.C:68
 addMapToFile.C:69
 addMapToFile.C:70
 addMapToFile.C:71
 addMapToFile.C:72
 addMapToFile.C:73
 addMapToFile.C:74
 addMapToFile.C:75
 addMapToFile.C:76
 addMapToFile.C:77
 addMapToFile.C:78
 addMapToFile.C:79
 addMapToFile.C:80
 addMapToFile.C:81
 addMapToFile.C:82
 addMapToFile.C:83
 addMapToFile.C:84
 addMapToFile.C:85
 addMapToFile.C:86
 addMapToFile.C:87
 addMapToFile.C:88
 addMapToFile.C:89
 addMapToFile.C:90
 addMapToFile.C:91
 addMapToFile.C:92
 addMapToFile.C:93
 addMapToFile.C:94
 addMapToFile.C:95
 addMapToFile.C:96
 addMapToFile.C:97
 addMapToFile.C:98
 addMapToFile.C:99
 addMapToFile.C:100
 addMapToFile.C:101
 addMapToFile.C:102
 addMapToFile.C:103
 addMapToFile.C:104
 addMapToFile.C:105
 addMapToFile.C:106
 addMapToFile.C:107
 addMapToFile.C:108
 addMapToFile.C:109
 addMapToFile.C:110
 addMapToFile.C:111
 addMapToFile.C:112
 addMapToFile.C:113
 addMapToFile.C:114
 addMapToFile.C:115
 addMapToFile.C:116
 addMapToFile.C:117
 addMapToFile.C:118
 addMapToFile.C:119
 addMapToFile.C:120
 addMapToFile.C:121
 addMapToFile.C:122
 addMapToFile.C:123
 addMapToFile.C:124
 addMapToFile.C:125
 addMapToFile.C:126
 addMapToFile.C:127
 addMapToFile.C:128
 addMapToFile.C:129
 addMapToFile.C:130
 addMapToFile.C:131
 addMapToFile.C:132
 addMapToFile.C:133
 addMapToFile.C:134
 addMapToFile.C:135
 addMapToFile.C:136
 addMapToFile.C:137
 addMapToFile.C:138
 addMapToFile.C:139
 addMapToFile.C:140
 addMapToFile.C:141
 addMapToFile.C:142
 addMapToFile.C:143
 addMapToFile.C:144
 addMapToFile.C:145
 addMapToFile.C:146
 addMapToFile.C:147
 addMapToFile.C:148
 addMapToFile.C:149
 addMapToFile.C:150
 addMapToFile.C:151
 addMapToFile.C:152
 addMapToFile.C:153
 addMapToFile.C:154
 addMapToFile.C:155
 addMapToFile.C:156
 addMapToFile.C:157
 addMapToFile.C:158
 addMapToFile.C:159
 addMapToFile.C:160
 addMapToFile.C:161
 addMapToFile.C:162
 addMapToFile.C:163
 addMapToFile.C:164
 addMapToFile.C:165
 addMapToFile.C:166
 addMapToFile.C:167
 addMapToFile.C:168
 addMapToFile.C:169
 addMapToFile.C:170
 addMapToFile.C:171
 addMapToFile.C:172
 addMapToFile.C:173
 addMapToFile.C:174
 addMapToFile.C:175
 addMapToFile.C:176
 addMapToFile.C:177
 addMapToFile.C:178
 addMapToFile.C:179
 addMapToFile.C:180
 addMapToFile.C:181
 addMapToFile.C:182
 addMapToFile.C:183
 addMapToFile.C:184
 addMapToFile.C:185
 addMapToFile.C:186
 addMapToFile.C:187
 addMapToFile.C:188
 addMapToFile.C:189
 addMapToFile.C:190
 addMapToFile.C:191
 addMapToFile.C:192
 addMapToFile.C:193
 addMapToFile.C:194
 addMapToFile.C:195
 addMapToFile.C:196
 addMapToFile.C:197
 addMapToFile.C:198
 addMapToFile.C:199
 addMapToFile.C:200
 addMapToFile.C:201
 addMapToFile.C:202
 addMapToFile.C:203
 addMapToFile.C:204
 addMapToFile.C:205
 addMapToFile.C:206
 addMapToFile.C:207
 addMapToFile.C:208
 addMapToFile.C:209
 addMapToFile.C:210
 addMapToFile.C:211
 addMapToFile.C:212
 addMapToFile.C:213
 addMapToFile.C:214
 addMapToFile.C:215
 addMapToFile.C:216
 addMapToFile.C:217
 addMapToFile.C:218
 addMapToFile.C:219
 addMapToFile.C:220
 addMapToFile.C:221
 addMapToFile.C:222
 addMapToFile.C:223
 addMapToFile.C:224
 addMapToFile.C:225
 addMapToFile.C:226
 addMapToFile.C:227
 addMapToFile.C:228
 addMapToFile.C:229
 addMapToFile.C:230
 addMapToFile.C:231
 addMapToFile.C:232
 addMapToFile.C:233
 addMapToFile.C:234
 addMapToFile.C:235
 addMapToFile.C:236
 addMapToFile.C:237
 addMapToFile.C:238
 addMapToFile.C:239
 addMapToFile.C:240
 addMapToFile.C:241
 addMapToFile.C:242
 addMapToFile.C:243
 addMapToFile.C:244
 addMapToFile.C:245
 addMapToFile.C:246
 addMapToFile.C:247
 addMapToFile.C:248
 addMapToFile.C:249
 addMapToFile.C:250
 addMapToFile.C:251
 addMapToFile.C:252
 addMapToFile.C:253
 addMapToFile.C:254
 addMapToFile.C:255
 addMapToFile.C:256
 addMapToFile.C:257
 addMapToFile.C:258
 addMapToFile.C:259
 addMapToFile.C:260
 addMapToFile.C:261
 addMapToFile.C:262
 addMapToFile.C:263
 addMapToFile.C:264
 addMapToFile.C:265
 addMapToFile.C:266
 addMapToFile.C:267
 addMapToFile.C:268
 addMapToFile.C:269
 addMapToFile.C:270
 addMapToFile.C:271
 addMapToFile.C:272
 addMapToFile.C:273
 addMapToFile.C:274
 addMapToFile.C:275
 addMapToFile.C:276
 addMapToFile.C:277
 addMapToFile.C:278
 addMapToFile.C:279
 addMapToFile.C:280
 addMapToFile.C:281
 addMapToFile.C:282
 addMapToFile.C:283
 addMapToFile.C:284
 addMapToFile.C:285
 addMapToFile.C:286
 addMapToFile.C:287
 addMapToFile.C:288
 addMapToFile.C:289
 addMapToFile.C:290
 addMapToFile.C:291
 addMapToFile.C:292
 addMapToFile.C:293
 addMapToFile.C:294
 addMapToFile.C:295
 addMapToFile.C:296
 addMapToFile.C:297
 addMapToFile.C:298
 addMapToFile.C:299
 addMapToFile.C:300
 addMapToFile.C:301
 addMapToFile.C:302
 addMapToFile.C:303
 addMapToFile.C:304
 addMapToFile.C:305
 addMapToFile.C:306
 addMapToFile.C:307
 addMapToFile.C:308
 addMapToFile.C:309
 addMapToFile.C:310
 addMapToFile.C:311
 addMapToFile.C:312
 addMapToFile.C:313
 addMapToFile.C:314
 addMapToFile.C:315
 addMapToFile.C:316
 addMapToFile.C:317
 addMapToFile.C:318
 addMapToFile.C:319
 addMapToFile.C:320
 addMapToFile.C:321
 addMapToFile.C:322
 addMapToFile.C:323
 addMapToFile.C:324
 addMapToFile.C:325
 addMapToFile.C:326
 addMapToFile.C:327
 addMapToFile.C:328
 addMapToFile.C:329
 addMapToFile.C:330
 addMapToFile.C:331
 addMapToFile.C:332
 addMapToFile.C:333
 addMapToFile.C:334
 addMapToFile.C:335
 addMapToFile.C:336
 addMapToFile.C:337
 addMapToFile.C:338
 addMapToFile.C:339
 addMapToFile.C:340
 addMapToFile.C:341
 addMapToFile.C:342
 addMapToFile.C:343
 addMapToFile.C:344
 addMapToFile.C:345
 addMapToFile.C:346
 addMapToFile.C:347
 addMapToFile.C:348
 addMapToFile.C:349
 addMapToFile.C:350
 addMapToFile.C:351
 addMapToFile.C:352
 addMapToFile.C:353
 addMapToFile.C:354
 addMapToFile.C:355
 addMapToFile.C:356
 addMapToFile.C:357
 addMapToFile.C:358
 addMapToFile.C:359
 addMapToFile.C:360
 addMapToFile.C:361
 addMapToFile.C:362
 addMapToFile.C:363
 addMapToFile.C:364
 addMapToFile.C:365
 addMapToFile.C:366
 addMapToFile.C:367
 addMapToFile.C:368
 addMapToFile.C:369
 addMapToFile.C:370
 addMapToFile.C:371
 addMapToFile.C:372
 addMapToFile.C:373
 addMapToFile.C:374
 addMapToFile.C:375
 addMapToFile.C:376
 addMapToFile.C:377
 addMapToFile.C:378
 addMapToFile.C:379
 addMapToFile.C:380
 addMapToFile.C:381
 addMapToFile.C:382
 addMapToFile.C:383
 addMapToFile.C:384
 addMapToFile.C:385
 addMapToFile.C:386
 addMapToFile.C:387
 addMapToFile.C:388
 addMapToFile.C:389
 addMapToFile.C:390
 addMapToFile.C:391
 addMapToFile.C:392
 addMapToFile.C:393
 addMapToFile.C:394
 addMapToFile.C:395
 addMapToFile.C:396
 addMapToFile.C:397
 addMapToFile.C:398
 addMapToFile.C:399
 addMapToFile.C:400
 addMapToFile.C:401
 addMapToFile.C:402
 addMapToFile.C:403
 addMapToFile.C:404
 addMapToFile.C:405
 addMapToFile.C:406
 addMapToFile.C:407
 addMapToFile.C:408
 addMapToFile.C:409
 addMapToFile.C:410
 addMapToFile.C:411
 addMapToFile.C:412
 addMapToFile.C:413
 addMapToFile.C:414
 addMapToFile.C:415
 addMapToFile.C:416
 addMapToFile.C:417
 addMapToFile.C:418
 addMapToFile.C:419
 addMapToFile.C:420
 addMapToFile.C:421
 addMapToFile.C:422
 addMapToFile.C:423
 addMapToFile.C:424
 addMapToFile.C:425
 addMapToFile.C:426
 addMapToFile.C:427
 addMapToFile.C:428
 addMapToFile.C:429
 addMapToFile.C:430
 addMapToFile.C:431
 addMapToFile.C:432
 addMapToFile.C:433
 addMapToFile.C:434
 addMapToFile.C:435
 addMapToFile.C:436
 addMapToFile.C:437
 addMapToFile.C:438
 addMapToFile.C:439
 addMapToFile.C:440
 addMapToFile.C:441
 addMapToFile.C:442
 addMapToFile.C:443
 addMapToFile.C:444
 addMapToFile.C:445
 addMapToFile.C:446
 addMapToFile.C:447
 addMapToFile.C:448
 addMapToFile.C:449
 addMapToFile.C:450
 addMapToFile.C:451
 addMapToFile.C:452
 addMapToFile.C:453
 addMapToFile.C:454
 addMapToFile.C:455
 addMapToFile.C:456
 addMapToFile.C:457
 addMapToFile.C:458
 addMapToFile.C:459
 addMapToFile.C:460
 addMapToFile.C:461
 addMapToFile.C:462
 addMapToFile.C:463
 addMapToFile.C:464
 addMapToFile.C:465
 addMapToFile.C:466
 addMapToFile.C:467
 addMapToFile.C:468
 addMapToFile.C:469
 addMapToFile.C:470
 addMapToFile.C:471
 addMapToFile.C:472
 addMapToFile.C:473
 addMapToFile.C:474
 addMapToFile.C:475
 addMapToFile.C:476
 addMapToFile.C:477
 addMapToFile.C:478
 addMapToFile.C:479
 addMapToFile.C:480
 addMapToFile.C:481
 addMapToFile.C:482
 addMapToFile.C:483
 addMapToFile.C:484
 addMapToFile.C:485
 addMapToFile.C:486
 addMapToFile.C:487
 addMapToFile.C:488
 addMapToFile.C:489
 addMapToFile.C:490
 addMapToFile.C:491
 addMapToFile.C:492
 addMapToFile.C:493
 addMapToFile.C:494
 addMapToFile.C:495
 addMapToFile.C:496
 addMapToFile.C:497
 addMapToFile.C:498
 addMapToFile.C:499
 addMapToFile.C:500
 addMapToFile.C:501
 addMapToFile.C:502
 addMapToFile.C:503
 addMapToFile.C:504
 addMapToFile.C:505
 addMapToFile.C:506
 addMapToFile.C:507
 addMapToFile.C:508
 addMapToFile.C:509
 addMapToFile.C:510
 addMapToFile.C:511
 addMapToFile.C:512
 addMapToFile.C:513
 addMapToFile.C:514
 addMapToFile.C:515
 addMapToFile.C:516
 addMapToFile.C:517
 addMapToFile.C:518
 addMapToFile.C:519
 addMapToFile.C:520
 addMapToFile.C:521
 addMapToFile.C:522
 addMapToFile.C:523
 addMapToFile.C:524
 addMapToFile.C:525
 addMapToFile.C:526
 addMapToFile.C:527
 addMapToFile.C:528
 addMapToFile.C:529
 addMapToFile.C:530
 addMapToFile.C:531
 addMapToFile.C:532
 addMapToFile.C:533
 addMapToFile.C:534
 addMapToFile.C:535
 addMapToFile.C:536
 addMapToFile.C:537
 addMapToFile.C:538
 addMapToFile.C:539
 addMapToFile.C:540
 addMapToFile.C:541
 addMapToFile.C:542
 addMapToFile.C:543
 addMapToFile.C:544
 addMapToFile.C:545
 addMapToFile.C:546
 addMapToFile.C:547
 addMapToFile.C:548
 addMapToFile.C:549
 addMapToFile.C:550
 addMapToFile.C:551
 addMapToFile.C:552
 addMapToFile.C:553
 addMapToFile.C:554
 addMapToFile.C:555
 addMapToFile.C:556
 addMapToFile.C:557
 addMapToFile.C:558
 addMapToFile.C:559
 addMapToFile.C:560
 addMapToFile.C:561
 addMapToFile.C:562
 addMapToFile.C:563
 addMapToFile.C:564
 addMapToFile.C:565
 addMapToFile.C:566
 addMapToFile.C:567
 addMapToFile.C:568
 addMapToFile.C:569
 addMapToFile.C:570
 addMapToFile.C:571
 addMapToFile.C:572
 addMapToFile.C:573
 addMapToFile.C:574
 addMapToFile.C:575
 addMapToFile.C:576
 addMapToFile.C:577
 addMapToFile.C:578
 addMapToFile.C:579
 addMapToFile.C:580
 addMapToFile.C:581
 addMapToFile.C:582
 addMapToFile.C:583
 addMapToFile.C:584
 addMapToFile.C:585
 addMapToFile.C:586
 addMapToFile.C:587