ROOT logo
#include <fstream>
#include <iostream>
#include <string>

TString g_aliroot_version;
TString g_root_version;
TString g_sample;
TString g_plugin_mode;
TString g_train_dir;
TArrayI g_runlist;

AliAnalysisAlien *CreateGridHandler(){
        //
        // Setup main settings of the Alien plugin
        //
        AliAnalysisAlien *plugin = new AliAnalysisAlien();
        plugin->SetRunMode(g_plugin_mode.Data());
        if(!g_plugin_mode.CompareTo("Terminate"))
                plugin->SetMergeViaJDL(kFALSE);
        else
                plugin->SetMergeViaJDL(kTRUE);
        plugin->SetOverwriteMode();
        plugin->SetNtestFiles(1);

        plugin->SetAPIVersion("V1.1x");
        plugin->SetROOTVersion(g_root_version.Data());
        plugin->SetAliROOTVersion(g_aliroot_version.Data());

        plugin->SetOutputToRunNo();
        plugin->AddIncludePath("-I. .I$ALIEN_ROOT/api/lib -I$ROOTSYS/lib -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/PWGHF/ -I$ALICE_ROOT/PWGHF/hfe/macros -I$ALICE_ROOT/PWGHF/hfe -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/ANALYSIS/Tender -I$ALICE_ROOT/ANALYSIS/TenderSupplies -I$ALICE_ROOT/PWG/ -I$ALICE_ROOT/PWG/FLOW -I$ALICE_ROOT/PWG/Base -I$ALICE_ROOT/PWG/Tasks");
        plugin->SetAdditionalLibs("libGui.so  libXMLParser.so libSTEERBase.so libESD.so libAOD.so libCDB.so libANALYSIS.so libANALYSISalice.so libCORRFW.so  libPWGflowBase.so libPWGflowTasks.so libPWGHFhfe.so libTENDER.so libProof.so libRAWDatabase.so libSTEER.so libTOFbase.so libPWGTRD.so");
   
        plugin->SetDefaultOutputs(kFALSE);
        plugin->SetOutputFiles("AnalysisResults.root"); 
        plugin->SetExecutableCommand("aliroot -b -q");
        plugin->SetTTL(30000);
        plugin->SetInputFormat("xml-single");
        plugin->SetPrice(1);      
        plugin->SetSplitMode("se");
        return plugin;
}

void SplitConfigEntry(const std::string &input, TString &key, TString &value){
        //
        // Decode key and value of a config entry
        //
        std::istringstream stream(input, istringstream::in);
        std::string tmp;
        stream >> tmp;
        key = tmp.c_str();
        stream >> tmp;
        value = tmp.c_str();
}

void DecodeRunlist(const TString &val){
        //
        // Tokenize run list
        //
        TObjArray *runstrings = val.Tokenize(",");
        TObjString *os;
        TString runstr;
        TIter runIter(runstrings);
        g_runlist.Set(runstrings->GetEntries());
        int nruns(0);
        while((os = dynamic_cast<TObjString *>(runIter()))){
                runstr = os->String();
                g_runlist[nruns++] = runstr.Atoi();
        }
        delete runstrings;
}

bool IsMC(const TString &val){
        // 
        // Determine whether sample is MC or Data
        //
        if(!val.CompareTo("MC")) return true;
        return false;
}

bool FindDataSample(const TMap &lookup, TObjArray &sampleinfis){
        //
        // Find Data sample in the list of samples
        //
        TObjArray *entry = dynamic_cast<TObjArray *>(lookup.GetValue(g_sample.Data()));
        if(!entry){
                printf("Sample %s not found in the list of samples", g_sample.Data());
                return false;
        }
        // Copy to output container
        sampleinfis.SetOwner(kFALSE);
        for(int ival = 0; ival < 4; ival++) sampleinfis.AddAt(entry->At(ival), ival);
        return true;
}

bool GetData(TObjArray &in, TString &out, int pos){
        //
        // Helper function reading data string
        //
        TObjString *entry = dynamic_cast<TObjString *>(in.At(pos));
        if(!entry){
                printf("Entry at pos %d not a string\n", pos);
                return false;
        }
        out = entry->String();
        return true;
}

void AddSample(TMap &lookup,
                const char *key, const char* datadir, const char * pattern, const char *sampletype, const char *dataformat){
        //
        // Add sample entry to the lookup table
        //
        TObjArray *infos = new TObjArray(); 
        infos->AddAt(new TObjString(datadir), 0);
        infos->AddAt(new TObjString(pattern), 1);
        infos->AddAt(new TObjString(sampletype), 2);
        infos->AddAt(new TObjString(dataformat), 3);
        lookup.Add(new TObjString(key), infos);
}

void Generate_Sample_Lookup(TMap &lookup){
        // 
        // Create Lookup table for each period
        // Vector contains 
        //   - path
        //   - pattern
        //   - MC/Data 
        //   - ESD/AOD
        //
        AddSample(lookup, "LHC13b.pass2", "/alice/data/2013/LHC13b", "pass2/*/AliESDs.root", "Data", "ESD");
        AddSample(lookup, "LHC13b.pass3", "/alice/data/2013/LHC13b", "pass3/*/AliESDs.root", "Data", "ESD");
        AddSample(lookup, "LHC13b.pass2.AOD", "/alice/data/2013/LHC13b", "pass2/AOD/*/AliAOD.root", "Data", "AOD"); 
        AddSample(lookup, "LHC13b.pass3.AOD", "/alice/data/2013/LHC13b", "pass3/AOD/*/AliAOD.root", "Data", "AOD"); 
        AddSample(lookup, "LHC13b.pass2.AOD126", "/alice/data/2013/LHC13b", "*/pass2/AOD126/*/AliAOD.root", "Data", "AOD"); 
        AddSample(lookup, "LHC13c.pass1", "/alice/data/2013/LHC13c/", "pass1/*/AliESDs.root", "Data", "ESD");
        AddSample(lookup, "LHC13c.pass2", "/alice/data/2013/LHC13c/", "pass2/*/AliESDs.root", "Data", "ESD");
        AddSample(lookup, "LHC13c.pass1.AOD", "/alice/data/2013/LHC13c/", "*/pass1/AOD/*/AliAOD.root", "Data", "AOD");
        AddSample(lookup, "LHC13c.pass2.AOD", "/alice/data/2013/LHC13c/", "*/pass2/AOD/*/AliAOD.root", "Data", "AOD");
        AddSample(lookup, "LHC13c.pass1.AOD126", "/alice/data/2013/LHC13c/", "*/pass1/AOD126/*/AliAOD.root", "Data", "AOD");
        AddSample(lookup, "LHC13b2", "/alice/sim/2013/LHC13b2", "*/*/AliESDs.root", "MC", "ESD");
        AddSample(lookup, "LHC13b2.AOD", "/alice/sim/2013/LHC13b2", "*/AliAOD.root", "MC", "AOD");
        AddSample(lookup, "LHC13b2plus", "/alice/sim/2013/LHC13b2_plus", "*/*/AliESDs.root", "MC", "ESD");
        AddSample(lookup, "LHC13b2plus.AOD", "/alice/sim/2013/LHC13b2_plus", "*/AliAOD.root", "MC", "AOD");
        AddSample(lookup, "LHC13b3", "/alice/sim/2013/LHC13b3", "*/*/AliESDs.root", "MC", "ESD");
	      AddSample(lookup, "LHC13b3.AOD", "/alice/sim/2013/LHC13b3", "*/AliAOD.root", "MC", "AOD");
	      AddSample(lookup, "LHC13d.pass1", "/alice/data/2013/LHC13d/", "pass1/*/AliESDs.root", "Data", "ESD");
	      AddSample(lookup, "LHC13e.pass1", "/alice/data/2013/LHC13e/", "pass1/*/AliESDs.root", "Data", "ESD");
	      AddSample(lookup, "LHC13f.pass1", "/alice/data/2013/LHC13f/", "pass1/*/AliESDs.root", "Data", "ESD");
        printf("Lookup table with sample information generated\n");
}

void ConfigParser(const char *configname){
        //
        // Parse configuration
        //
        std::ifstream in(configname);
        std::string config;
        TString key, value;
        while(getline(in, config)){
                SplitConfigEntry(config, key, value);
                key.ToLower();
                if(!key.CompareTo("aliroot")){
                        // Aliroot version
                        g_aliroot_version = value;
                        continue;
                }
                if(!key.CompareTo("root")){
                        // root version
                        g_root_version = value;
                        continue;
                }
                if(!key.CompareTo("sample")){
                        // sample name
                        g_sample = value; 
                        continue;
                }
                if(!key.CompareTo("runlist")){
                        // Runlist
                        DecodeRunlist(value); 
                        continue;
                }
                if(!key.CompareTo("mode")){
                        g_plugin_mode = value;
                        continue;
                }
                if(!key.CompareTo("traindir")){
                        g_train_dir = value;
                        continue;
                }
                printf("Unknown key: %s\n", key.Data());
        }
}

bool MakeSample(AliAnalysisAlien *plugin, TMap &lookup){
        //
        // Fill Sample information (Data dir, pattern, run list) to the Alien plugin
        //
        TObjArray infos;
        bool found = FindDataSample(lookup, infos);
        if(!found){
                printf("sample %s not found\n", g_sample.Data());
                return false;
        }
        TString datadir, pattern, type;
        GetData(infos, datadir, 0);
        GetData(infos, pattern, 1);
        GetData(infos, type, 2);
        plugin->SetGridDataDir(datadir.Data());
        plugin->SetDataPattern(pattern.Data());
        if(!IsMC(type)) plugin->SetRunPrefix("000");
        // Add runs to the sample
        for(int irun = 0; irun < g_runlist.GetSize(); irun++){
                plugin->AddRunNumber(g_runlist[irun]);
        }
        return true;
}

bool CreateTrainDir(AliAnalysisAlien *plugin, const TMap &lookup){
        //
        // Make train data dir name and JDL, C and sh file names
        //
        TObjArray infos;
        bool found = FindDataSample(lookup, infos);
        if(!found){
                printf("sample %s not found\n", g_sample.Data());
                return false;
        }
        TString type; GetData(infos, type, 2);

        // check whether the train dir is already provided or needs to be specified
        if(!g_train_dir.Length()){
                // Query number of train runs before
                const char *gridhome = gGrid->GetHomeDirectory();
                const char gridoutdir[256];
                sprintf(gridoutdir, "%sAnalysis_pPb/%s", gridhome, type.Data());
                TGridResult *trainruns = gGrid->Ls(gridoutdir);
                int nruns = trainruns->GetEntries();
                // Get Date and time
                TDatime time;
                g_train_dir = Form("%d_%d%02d%02d_%02d%02d", nruns, time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute());
        }
        
        plugin->SetGridWorkingDir(Form("Analysis_pPb/%s/%s", type.Data(), g_train_dir.Data()));
        plugin->SetJDLName(Form("TPCTOFanalysispPb_%s_%s.jdl", type.Data(), g_train_dir.Data()));
        plugin->SetExecutable(Form("TPCTOFanalysispPb_%s_%s.sh", type.Data(), g_train_dir.Data()));
        plugin->SetAnalysisMacro(Form("TPCTOFanalysispPb_%s_%s.C", type.Data(), g_train_dir.Data()));
        return true;
}

void SetupUtil(bool isMC, bool isAOD){
        //
        // Setup utility packages
        //
        // 1. Physics Selection (ESD only)
        // 2. Tender (ESD only)
        // 3. PID Response (always)
        // 4. Centrality Task (ESD only)
        //

        //===== ADD PID RESPONSE: ===
        gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C");
        AddTaskPIDResponse(isMC);

        //==== Add tender ====
        if(!isAOD){
                gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/TenderSupplies/AddTaskTender.C");
                //AddTaskTender();
        }

        //==== Physics Selection ====
        if(!isAOD){
                gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
                AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(isMC);
        }

        //===== ADD CENTRALITY: ===
        if(!isAOD){
                gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
                AddTaskCentrality();
        }
}

void SetupHandlers(bool isMC, bool isAOD){
        //
        // Setup Handlers
        //
        TString macrobase = "$ALICE_ROOT/ANALYSIS/macros/train/";
        TString macroname = macrobase;
        if(isAOD)
                macroname += "AddAODHandler.C";
        else
                macroname += "AddESDHandler.C";
        gROOT->Macro(macroname.Data());

        if(isMC && !isAOD){
                // Add MC truth event handler, only in case of ESDs
                gROOT->LoadMacro(Form("%s/AddMCHandler.C", macrobase.Data()));
                AddMCHandler();
        }
}

void SetupHFEtask(bool isMC, bool isAOD){
        gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEpPb.C");
        AddTaskHFEpPb(isMC, isAOD);
        gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/AddTaskHFEnpepPb.C");
        AddTaskHFEnpepPb(isMC, isAOD);
}

void SetupTrain(const TMap &lookup){
        //
        // Setup train:
        //   Determine whether the trains run on MC or Data 
        //   and ESDs or AODs and Configure Handlers, utils
        //   and HFE task according to this
        //
        bool isMC(false), isAOD(false);
        TObjArray infos;
        bool found = FindDataSample(lookup, infos);
        if(!found) return;
        TString type, mode;
        GetData(infos, type, 2);
        GetData(infos, mode, 3);
        isMC = IsMC(type);
        if(!mode.CompareTo("AOD")) isAOD = true;
      
        SetupHandlers(isMC, isAOD);
        SetupUtil(isMC, isAOD);
        SetupHFEtask(isMC, isAOD);
}

void GenerateMergeConfigs(){
        //
        // Generate configurations for merging 
        // (MergeViaJDL and Terminate)
        //

        // Write config for MergeViaJDL
        std::ofstream outMerge("configMerge.txt");
        outMerge << "aliroot " << g_aliroot_version.Data() << std::endl;
        outMerge << "root " << g_root_version.Data() << std::endl;
        outMerge << "sample " << g_sample.Data() << std::endl;
        outMerge << "mode MergeViaJDL\n";
        outMerge << "traindir " << g_train_dir.Data() << std::endl; 
        outMerge << "runlist ";
        for(int irun = 0; irun < g_runlist.GetSize()-1; irun++) outMerge << g_runlist[irun] << ",";
        outMerge << g_runlist[g_runlist.GetSize()-1] << std::endl;
        outMerge.close();
        // Write config for Terminate
        std::ofstream outTerminate("configTerminate.txt");
        outTerminate << "aliroot " << g_aliroot_version.Data() << std::endl;
        outTerminate << "root " << g_root_version.Data() << std::endl;
        outTerminate << "sample " << g_sample.Data() << std::endl;
        outTerminate << "mode Terminate\n";
        outTerminate << "traindir " << g_train_dir.Data() << std::endl; 
        outTerminate << "runlist ";
        for(int irun = 0; irun < g_runlist.GetSize()-1; irun++) outTerminate << g_runlist[irun] << ",";
        outTerminate << g_runlist[g_runlist.GetSize()-1] << std::endl;
        outTerminate.close();

        printf("Configurations for MergeViaJDL and terminate generated\n");
}

void runGridpPb(const char *config = "config.txt"){
        //
        // run analysis 
        //

        TGrid::Connect("alien://");

        // Create Lookup with sample information
        TMap sampleinfos;
        Generate_Sample_Lookup(sampleinfos);

        ConfigParser(config);

        // Configure alien plugin
        AliAnalysisAlien *plugin = CreateGridHandler();
        if(!CreateTrainDir(plugin, sampleinfos)){
                printf("Cannot setup output directory\n");
                return;
        }
        if(!MakeSample(plugin, sampleinfos)){
                printf("Cannot create data sample\n");
                return;
        }
        if(!g_plugin_mode.CompareTo("full")){
                // full mode, creating config files for the merging stage
                GenerateMergeConfigs();
        }

        AliAnalysisManager *mgr = new AliAnalysisManager("tpctofanalysis");
        mgr->SetGridHandler(plugin);
        
        SetupTrain(sampleinfos);

        // Run train
        if (!mgr->InitAnalysis()) return;
        mgr->PrintStatus();
        // Start analysis in grid.
        mgr->StartAnalysis("grid");
} 

 runGridpPb.C:1
 runGridpPb.C:2
 runGridpPb.C:3
 runGridpPb.C:4
 runGridpPb.C:5
 runGridpPb.C:6
 runGridpPb.C:7
 runGridpPb.C:8
 runGridpPb.C:9
 runGridpPb.C:10
 runGridpPb.C:11
 runGridpPb.C:12
 runGridpPb.C:13
 runGridpPb.C:14
 runGridpPb.C:15
 runGridpPb.C:16
 runGridpPb.C:17
 runGridpPb.C:18
 runGridpPb.C:19
 runGridpPb.C:20
 runGridpPb.C:21
 runGridpPb.C:22
 runGridpPb.C:23
 runGridpPb.C:24
 runGridpPb.C:25
 runGridpPb.C:26
 runGridpPb.C:27
 runGridpPb.C:28
 runGridpPb.C:29
 runGridpPb.C:30
 runGridpPb.C:31
 runGridpPb.C:32
 runGridpPb.C:33
 runGridpPb.C:34
 runGridpPb.C:35
 runGridpPb.C:36
 runGridpPb.C:37
 runGridpPb.C:38
 runGridpPb.C:39
 runGridpPb.C:40
 runGridpPb.C:41
 runGridpPb.C:42
 runGridpPb.C:43
 runGridpPb.C:44
 runGridpPb.C:45
 runGridpPb.C:46
 runGridpPb.C:47
 runGridpPb.C:48
 runGridpPb.C:49
 runGridpPb.C:50
 runGridpPb.C:51
 runGridpPb.C:52
 runGridpPb.C:53
 runGridpPb.C:54
 runGridpPb.C:55
 runGridpPb.C:56
 runGridpPb.C:57
 runGridpPb.C:58
 runGridpPb.C:59
 runGridpPb.C:60
 runGridpPb.C:61
 runGridpPb.C:62
 runGridpPb.C:63
 runGridpPb.C:64
 runGridpPb.C:65
 runGridpPb.C:66
 runGridpPb.C:67
 runGridpPb.C:68
 runGridpPb.C:69
 runGridpPb.C:70
 runGridpPb.C:71
 runGridpPb.C:72
 runGridpPb.C:73
 runGridpPb.C:74
 runGridpPb.C:75
 runGridpPb.C:76
 runGridpPb.C:77
 runGridpPb.C:78
 runGridpPb.C:79
 runGridpPb.C:80
 runGridpPb.C:81
 runGridpPb.C:82
 runGridpPb.C:83
 runGridpPb.C:84
 runGridpPb.C:85
 runGridpPb.C:86
 runGridpPb.C:87
 runGridpPb.C:88
 runGridpPb.C:89
 runGridpPb.C:90
 runGridpPb.C:91
 runGridpPb.C:92
 runGridpPb.C:93
 runGridpPb.C:94
 runGridpPb.C:95
 runGridpPb.C:96
 runGridpPb.C:97
 runGridpPb.C:98
 runGridpPb.C:99
 runGridpPb.C:100
 runGridpPb.C:101
 runGridpPb.C:102
 runGridpPb.C:103
 runGridpPb.C:104
 runGridpPb.C:105
 runGridpPb.C:106
 runGridpPb.C:107
 runGridpPb.C:108
 runGridpPb.C:109
 runGridpPb.C:110
 runGridpPb.C:111
 runGridpPb.C:112
 runGridpPb.C:113
 runGridpPb.C:114
 runGridpPb.C:115
 runGridpPb.C:116
 runGridpPb.C:117
 runGridpPb.C:118
 runGridpPb.C:119
 runGridpPb.C:120
 runGridpPb.C:121
 runGridpPb.C:122
 runGridpPb.C:123
 runGridpPb.C:124
 runGridpPb.C:125
 runGridpPb.C:126
 runGridpPb.C:127
 runGridpPb.C:128
 runGridpPb.C:129
 runGridpPb.C:130
 runGridpPb.C:131
 runGridpPb.C:132
 runGridpPb.C:133
 runGridpPb.C:134
 runGridpPb.C:135
 runGridpPb.C:136
 runGridpPb.C:137
 runGridpPb.C:138
 runGridpPb.C:139
 runGridpPb.C:140
 runGridpPb.C:141
 runGridpPb.C:142
 runGridpPb.C:143
 runGridpPb.C:144
 runGridpPb.C:145
 runGridpPb.C:146
 runGridpPb.C:147
 runGridpPb.C:148
 runGridpPb.C:149
 runGridpPb.C:150
 runGridpPb.C:151
 runGridpPb.C:152
 runGridpPb.C:153
 runGridpPb.C:154
 runGridpPb.C:155
 runGridpPb.C:156
 runGridpPb.C:157
 runGridpPb.C:158
 runGridpPb.C:159
 runGridpPb.C:160
 runGridpPb.C:161
 runGridpPb.C:162
 runGridpPb.C:163
 runGridpPb.C:164
 runGridpPb.C:165
 runGridpPb.C:166
 runGridpPb.C:167
 runGridpPb.C:168
 runGridpPb.C:169
 runGridpPb.C:170
 runGridpPb.C:171
 runGridpPb.C:172
 runGridpPb.C:173
 runGridpPb.C:174
 runGridpPb.C:175
 runGridpPb.C:176
 runGridpPb.C:177
 runGridpPb.C:178
 runGridpPb.C:179
 runGridpPb.C:180
 runGridpPb.C:181
 runGridpPb.C:182
 runGridpPb.C:183
 runGridpPb.C:184
 runGridpPb.C:185
 runGridpPb.C:186
 runGridpPb.C:187
 runGridpPb.C:188
 runGridpPb.C:189
 runGridpPb.C:190
 runGridpPb.C:191
 runGridpPb.C:192
 runGridpPb.C:193
 runGridpPb.C:194
 runGridpPb.C:195
 runGridpPb.C:196
 runGridpPb.C:197
 runGridpPb.C:198
 runGridpPb.C:199
 runGridpPb.C:200
 runGridpPb.C:201
 runGridpPb.C:202
 runGridpPb.C:203
 runGridpPb.C:204
 runGridpPb.C:205
 runGridpPb.C:206
 runGridpPb.C:207
 runGridpPb.C:208
 runGridpPb.C:209
 runGridpPb.C:210
 runGridpPb.C:211
 runGridpPb.C:212
 runGridpPb.C:213
 runGridpPb.C:214
 runGridpPb.C:215
 runGridpPb.C:216
 runGridpPb.C:217
 runGridpPb.C:218
 runGridpPb.C:219
 runGridpPb.C:220
 runGridpPb.C:221
 runGridpPb.C:222
 runGridpPb.C:223
 runGridpPb.C:224
 runGridpPb.C:225
 runGridpPb.C:226
 runGridpPb.C:227
 runGridpPb.C:228
 runGridpPb.C:229
 runGridpPb.C:230
 runGridpPb.C:231
 runGridpPb.C:232
 runGridpPb.C:233
 runGridpPb.C:234
 runGridpPb.C:235
 runGridpPb.C:236
 runGridpPb.C:237
 runGridpPb.C:238
 runGridpPb.C:239
 runGridpPb.C:240
 runGridpPb.C:241
 runGridpPb.C:242
 runGridpPb.C:243
 runGridpPb.C:244
 runGridpPb.C:245
 runGridpPb.C:246
 runGridpPb.C:247
 runGridpPb.C:248
 runGridpPb.C:249
 runGridpPb.C:250
 runGridpPb.C:251
 runGridpPb.C:252
 runGridpPb.C:253
 runGridpPb.C:254
 runGridpPb.C:255
 runGridpPb.C:256
 runGridpPb.C:257
 runGridpPb.C:258
 runGridpPb.C:259
 runGridpPb.C:260
 runGridpPb.C:261
 runGridpPb.C:262
 runGridpPb.C:263
 runGridpPb.C:264
 runGridpPb.C:265
 runGridpPb.C:266
 runGridpPb.C:267
 runGridpPb.C:268
 runGridpPb.C:269
 runGridpPb.C:270
 runGridpPb.C:271
 runGridpPb.C:272
 runGridpPb.C:273
 runGridpPb.C:274
 runGridpPb.C:275
 runGridpPb.C:276
 runGridpPb.C:277
 runGridpPb.C:278
 runGridpPb.C:279
 runGridpPb.C:280
 runGridpPb.C:281
 runGridpPb.C:282
 runGridpPb.C:283
 runGridpPb.C:284
 runGridpPb.C:285
 runGridpPb.C:286
 runGridpPb.C:287
 runGridpPb.C:288
 runGridpPb.C:289
 runGridpPb.C:290
 runGridpPb.C:291
 runGridpPb.C:292
 runGridpPb.C:293
 runGridpPb.C:294
 runGridpPb.C:295
 runGridpPb.C:296
 runGridpPb.C:297
 runGridpPb.C:298
 runGridpPb.C:299
 runGridpPb.C:300
 runGridpPb.C:301
 runGridpPb.C:302
 runGridpPb.C:303
 runGridpPb.C:304
 runGridpPb.C:305
 runGridpPb.C:306
 runGridpPb.C:307
 runGridpPb.C:308
 runGridpPb.C:309
 runGridpPb.C:310
 runGridpPb.C:311
 runGridpPb.C:312
 runGridpPb.C:313
 runGridpPb.C:314
 runGridpPb.C:315
 runGridpPb.C:316
 runGridpPb.C:317
 runGridpPb.C:318
 runGridpPb.C:319
 runGridpPb.C:320
 runGridpPb.C:321
 runGridpPb.C:322
 runGridpPb.C:323
 runGridpPb.C:324
 runGridpPb.C:325
 runGridpPb.C:326
 runGridpPb.C:327
 runGridpPb.C:328
 runGridpPb.C:329
 runGridpPb.C:330
 runGridpPb.C:331
 runGridpPb.C:332
 runGridpPb.C:333
 runGridpPb.C:334
 runGridpPb.C:335
 runGridpPb.C:336
 runGridpPb.C:337
 runGridpPb.C:338
 runGridpPb.C:339
 runGridpPb.C:340
 runGridpPb.C:341
 runGridpPb.C:342
 runGridpPb.C:343
 runGridpPb.C:344
 runGridpPb.C:345
 runGridpPb.C:346
 runGridpPb.C:347
 runGridpPb.C:348
 runGridpPb.C:349
 runGridpPb.C:350
 runGridpPb.C:351
 runGridpPb.C:352
 runGridpPb.C:353
 runGridpPb.C:354
 runGridpPb.C:355
 runGridpPb.C:356
 runGridpPb.C:357
 runGridpPb.C:358
 runGridpPb.C:359
 runGridpPb.C:360
 runGridpPb.C:361
 runGridpPb.C:362
 runGridpPb.C:363
 runGridpPb.C:364
 runGridpPb.C:365
 runGridpPb.C:366
 runGridpPb.C:367
 runGridpPb.C:368
 runGridpPb.C:369
 runGridpPb.C:370
 runGridpPb.C:371
 runGridpPb.C:372
 runGridpPb.C:373
 runGridpPb.C:374
 runGridpPb.C:375
 runGridpPb.C:376
 runGridpPb.C:377
 runGridpPb.C:378
 runGridpPb.C:379
 runGridpPb.C:380
 runGridpPb.C:381
 runGridpPb.C:382
 runGridpPb.C:383
 runGridpPb.C:384
 runGridpPb.C:385
 runGridpPb.C:386
 runGridpPb.C:387
 runGridpPb.C:388
 runGridpPb.C:389
 runGridpPb.C:390
 runGridpPb.C:391
 runGridpPb.C:392
 runGridpPb.C:393
 runGridpPb.C:394
 runGridpPb.C:395
 runGridpPb.C:396
 runGridpPb.C:397
 runGridpPb.C:398
 runGridpPb.C:399
 runGridpPb.C:400
 runGridpPb.C:401
 runGridpPb.C:402
 runGridpPb.C:403