ROOT logo
#include <Riostream.h>

// ROOT includes
#include "TFile.h"
#include "TString.h"
#include "TLine.h"
#include "TBrowser.h"
#include "TH2.h"
#include "TCanvas.h"
#include "TColor.h"
#include "TMath.h"
#include "TTree.h"

/////////////////////////////////////////////////////////////////////////////////
//                                                                             //
// Simplified QA of PhysicsSelection (based on the previously Existing code).  //
// Please note that the event_stat.root files must be first downloaded locally //
// using the script CopyFilesToLocal.sh. This ensures the proper naming of the //
// files, namely RUNNUMBER_event_stat.root.                                    //
//                                                                             //
/////////////////////////////////////////////////////////////////////////////////

void      SimpleQA();
void      MakeQAperPeriod(const Char_t * inputList = "inputListLHC13b.txt", const Char_t * outputFileName = "./Plots/2013/13bPass3.pdf", const Char_t * label = "LHC13bPass3");
Float_t   GetFraction(const Char_t * inputFile = "event_stat.root", const  Char_t * columnLabel = "Accepted",  UInt_t triggerBit = 2, Bool_t returnError = kFALSE);
TList   * InitializeHistograms(const Char_t * label);
TTree   * InitializeTree();
TString * GetTriggerBitName(Int_t bitNumber = 0);
UInt_t    GetFillFromRunNumber(UInt_t runNumber);
void      AddFillSeparationLines(TH1D * hist);
//
void      DumpFileInfoToTree(TTree * tree, const Char_t * inputFile = "event_stat.root", UInt_t runNumber = 0);

//
// global tree variables
//
UInt_t  runNumberTree, fillNumberTree, triggerBitTree;
Float_t acceptedFractionTree, hardwareTrigger, v0Abackgr, v0Cbackgr, tpcDip, tpcLaserNoise, t0Backgr, t0PileUp, zdcTimeCut, zdcAbackgr, zdcCbackgr;


//______________________________________________________________________________
void SimpleQA() {
  //
  // execution part -- make the QA for all periods
  //
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2010/inputList10bPass3.txt", "./Plots/2010/LHC10b/10bPass3.pdf", "LHC10bPass3");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2010/inputList10cPass2.txt", "./Plots/2010/LHC10c/10cPass2.pdf", "LHC10cPass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2010/inputList10dPass2.txt", "./Plots/2010/LHC10d/10dPass2.pdf", "LHC10dPass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2010/inputList10ePass2.txt", "./Plots/2010/LHC10e/10ePass2.pdf", "LHC10ePass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2010/inputList10hPass2.txt", "./Plots/2010/LHC10h/10hPass2.pdf", "LHC10hPass2");
  //
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11aPass4withSDD.txt", "./Plots/2011/LHC11a/11aPass4withSDD.pdf", "LHC11aPass4withSDD");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11bPass1.txt", "./Plots/2011/LHC11b/11bPass1.pdf", "LHC11bPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11cPass1.txt", "./Plots/2011/LHC11c/11cPass1.pdf", "LHC11cPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11dPass1.txt", "./Plots/2011/LHC11d/11dPass1.pdf", "LHC11dPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11fPass1.txt", "./Plots/2011/LHC11e/11fPass1.pdf", "LHC11fPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2011/inputList11hPass2.txt", "./Plots/2011/LHC11h/11hPass2.pdf", "LHC11hPass2");
  //
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12aPass1.txt", "./Plots/2012/LHC12a/12aPass1.pdf", "LHC12aPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12bPass1.txt", "./Plots/2012/LHC12b/12bPass1.pdf", "LHC12bPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12cPass1.txt", "./Plots/2012/LHC12c/12cPass1.pdf", "LHC12cPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12dPass1.txt", "./Plots/2012/LHC12d/12dPass1.pdf", "LHC12dPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12ePass1.txt", "./Plots/2012/LHC12e/12ePass1.pdf", "LHC12ePass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12fPass1.txt", "./Plots/2012/LHC12f/12fPass1.pdf", "LHC12fPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12gPass1.txt", "./Plots/2012/LHC12g/12gPass1.pdf", "LHC12gPass1");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2012/inputListLHC12iPass1.txt", "./Plots/2012/LHC12i/12iPass1.pdf", "LHC12iPass1");
  //
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13bPass3.txt", "./Plots/2013/LHC12b/13bPass3.pdf", "LHC13bPass3");  
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13cPass2.txt", "./Plots/2013/LHC13c/13cPass2.pdf", "LHC13cPass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13dPass2.txt", "./Plots/2013/LHC13d/13dPass2.pdf", "LHC13dPass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13ePass2.txt", "./Plots/2013/LHC13e/13ePass2.pdf", "LHC13ePass2");
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13fPass2.txt", "./Plots/2013/LHC13f/13fPass2.pdf", "LHC13fPass2");  
  MakeQAperPeriod("./InputFilesFromGridPerPeriod/2013/inputListLHC13gVPass1.txt", "./Plots/2013/LHC13g/13gVPass1.pdf", "LHC13gVPass1");
  //
  
}


//______________________________________________________________________________
void MakeQAperPeriod(const Char_t * inputList, const Char_t * outputFileName,const Char_t * periodLabel) {
  //
  // main function: read in list of input files and process them
  //
  ifstream in;
  in.open(inputList);
  // Read the input list of files 
  TString objfile;
  Int_t counter = 0;
  //
  // Initialize histograms and tree
  //
  TList * list = InitializeHistograms(periodLabel); // one histogram per trigger type
  TTree *  tree = InitializeTree();
  //
  while(in.good()) {
    in >> objfile;
    //
    // check if file is okay and protect
    //
    if (!objfile.Contains("root")) continue; 
    TFile inFile(objfile.Data());
    if (inFile.IsZombie() || !inFile.Get("fHistStatistics")) {
      Printf("*** WARNING: File %s corrupted! ***", objfile.Data());
      inFile.Close();
      continue;
    }
    //
    // get run number from file-name
    //
    Ssiz_t finish1 = objfile.Last('_');
    Ssiz_t start1  = objfile.Last('/');
    TString runNumber( objfile(start1 + 1, finish1 - 7 - start1) );
    //
    // fill relevant histograms
    //
    for(Int_t iTrig = 0; iTrig < 29; iTrig++) { // loop over trigger types
      TH1D * histTrig = (TH1D*) list->FindObject(Form("histAccepted_%s_&%i",periodLabel, iTrig));
      Float_t acceptedFraction = GetFraction((Char_t *) objfile.Data(), "Accepted", 1<<iTrig); 
      Float_t acceptedFractionErr = GetFraction((Char_t *) objfile.Data(), "Accepted", 1<<iTrig, kTRUE);
      if (acceptedFraction > -0.5) {
	histTrig->Fill(runNumber.Data(), acceptedFraction);
	if (acceptedFraction < 1e-9) histTrig->SetBinContent(histTrig->GetXaxis()->FindBin(runNumber.Data()), 0.0001);
	histTrig->SetBinError(histTrig->GetXaxis()->FindBin(runNumber.Data()), acceptedFractionErr);
      }
    }
    //
    // fill the tree
    //
    DumpFileInfoToTree(tree, objfile.Data(), runNumber.Atoi());
    //
    counter++;
  }
  //
  // Draw histograms
  //  
  TCanvas * canvAcc = new TCanvas(Form("canvAcc_%s", periodLabel),"fraction of accepted events", 2400, 800);
  canvAcc->SetRightMargin(0.01);
  canvAcc->SetBottomMargin(0.15);
  //
  canvAcc->Print(Form("%s%s",outputFileName,"["));
  Int_t countFilledHists = 0;
  for(Int_t iTrig = 0; iTrig < 29; iTrig++) {
    TH1D * histTrig = (TH1D*) list->FindObject(Form("histAccepted_%s_&%i",periodLabel, iTrig));
    //
    canvAcc->cd();
    if (histTrig->GetEntries() > 0) {
      histTrig->LabelsDeflate();
      histTrig->LabelsOption("v","X");
      //
      histTrig->DrawCopy("Ep");
      AddFillSeparationLines(histTrig);
      //
      TString * triggerBitName = GetTriggerBitName(iTrig); 
      canvAcc->Print(outputFileName, Form("Title:%s", triggerBitName->Data()));
      delete triggerBitName;
      countFilledHists = iTrig;
    }
  }
  TString * triggerBitName = GetTriggerBitName(countFilledHists); 
  canvAcc->Print(Form("%s%s",outputFileName,"]"), Form("Title:%s", triggerBitName->Data()));
  delete triggerBitName;
  //
  //
  TString  treeFileName(outputFileName);
  tree->SaveAs(treeFileName.ReplaceAll(".pdf",".root"));
  //
  //
  in.close();
}


//______________________________________________________________________________
Float_t GetFraction(const Char_t * inputFile, const Char_t * columnLabel, UInt_t triggerBit, Bool_t returnError) {
  //
  // fraction of offline trigger (or accepted) w.r.t. to all input triggers
  // -1 in case of file problems, -2 in case of histogram problems
  //
  TFile * inFile = TFile::Open(inputFile);
  if (!inFile) {
    return -1;
  }
  //
  TH2D * hist = (TH2D*) inFile->Get("fHistStatistics");
  if (!hist)   {
    inFile->Close();
    delete inFile;
    return -2;
  }
  //
  // locate relevant cell
  //
  Int_t binAllX = 1;
  Int_t binColumnLabelX  = -1;
  Int_t binTriggerBitY   = -1;
  //
  // find x-axis bin
  //
  for(Int_t iX =0; iX < hist->GetNbinsX() + 1; iX++) {
    TString label = hist->GetXaxis()->GetBinLabel(iX);
    if (label.CompareTo(columnLabel) == 0) binColumnLabelX = iX;
  }
  //
  // find y-axis bins
  //
  Float_t fraction = 0.; 
  Float_t all = 0.;
  Float_t accepted = 0.;
  //
  for(Int_t iY =0; iY < hist->GetNbinsY() + 1; iY++) {
    TString label = hist->GetYaxis()->GetBinLabel(iY);
    Ssiz_t start  = label.First('&');
    Ssiz_t finish = label.Length();
    if (label.Contains("*")) finish = label.First('*'); // works for 2011 and later data
    TString maskLabel( label( start+1, finish - start - 1 ) ); // returns the substring between the & and *
    //    cout << maskLabel.Data() << "" << label.Data() << endl;
    UInt_t   maskInt = maskLabel.Atoi(); // Convert string to int (the int is in decimal form)
    //    if (maskInt == triggerBit && label.Contains("-B-")) binTriggerBitY = iY; // works only for 2011 and later data
    if (maskInt == triggerBit) {
      if (label.Contains("-B-")) {
	binTriggerBitY = iY; // works only for 2011 and later data
	all += hist->GetBinContent(binAllX, binTriggerBitY);
	accepted += hist->GetBinContent(binColumnLabelX,binTriggerBitY);
      }
      if (label.Contains("-ABCE-") && label.Contains("1B-")) {
	binTriggerBitY = iY; // works only for 2010 data also
	all += hist->GetBinContent(binAllX, binTriggerBitY);
	accepted += hist->GetBinContent(binColumnLabelX,binTriggerBitY);
      }
    }
  }
  //
  if (all > 0 &&binColumnLabelX != -1 && binTriggerBitY != -1) {
    fraction = accepted/all;
  } else {
    inFile->Close();
    delete inFile;
    return -1;
  }
  //
  inFile->Close();
  delete inFile;
  //
  if (returnError) return TMath::Sqrt(fraction*(1-fraction)/all);
  return fraction;

}


//______________________________________________________________________________
TList * InitializeHistograms(const Char_t * label) {
  //
  // Initialize all the relevant histograms and store them in a TList...
  // Cosmetic improvements to be put here...
  //
  TList * listOfHists = new TList();
  //
  //
  TH1F *histAccepted[29]; // one hisogram for each trigger type
  for(Int_t iTrig = 0; iTrig < 29; iTrig++) {
    TString * triggerBitName = GetTriggerBitName(iTrig);
    histAccepted[iTrig] = new TH1F(Form("histAccepted_%s_&%i",label,iTrig), 
				   Form("accepted events %s of trigger &%i: %s; ; accepted fraction", label, iTrig, triggerBitName->Data()),
				   1, 0, 1);
    delete triggerBitName;
    //
    listOfHists->Add(histAccepted[iTrig]);
    //
    histAccepted[iTrig]->SetBit(TH1::kCanRebin);
    histAccepted[iTrig]->GetYaxis()->SetRangeUser(0.,1.2);
    histAccepted[iTrig]->SetStats(0);
    histAccepted[iTrig]->SetMarkerStyle(20);
    histAccepted[iTrig]->SetMarkerColor(TColor::GetColor("#268bd2"));
    histAccepted[iTrig]->SetLineColor(TColor::GetColor("#268bd2"));
    histAccepted[iTrig]->SetMarkerSize(2.0);
  }
  //
  return listOfHists;

}



//______________________________________________________________________________
TTree * InitializeTree() {

  TTree * tree = new TTree("tree","basic QA variables of PhysicsSelection");
  tree->Branch("runNumber",&runNumberTree,"runNumber/i");
  tree->Branch("fillNumber",&fillNumberTree,"fillNumber/i");
  tree->Branch("triggerBit",&triggerBitTree,"triggerBit/i");
  //
  //
  tree->Branch("acceptedFraction",&acceptedFractionTree,"acceptedFraction/f"); 
  tree->Branch("hardwareTrigger",&hardwareTrigger,"hardwareTrigger/f"); 
  //
  tree->Branch("v0Abackgr",&v0Abackgr,"v0Abackgr/f"); 
  tree->Branch("v0Cbackgr",&v0Cbackgr,"v0Cbackgr/f"); 
  //
  tree->Branch("t0Backgr",&t0Backgr,"t0Backgr/f"); 
  tree->Branch("t0PileUp",&t0PileUp,"t0PileUp/f");
  //
  tree->Branch("zdcTimeCut", &zdcTimeCut, "zdcTimeCut/f");
  tree->Branch("zdcAbackgr", &zdcAbackgr, "zdcAbackgr/f");
  tree->Branch("zdcCbackgr", &zdcCbackgr, "zdcCbackgr/f");
  //
  tree->Branch("tpcDip",&tpcDip,"tpcDip/f"); 
  tree->Branch("tpcLaserNoise",&tpcLaserNoise,"tpcLaserNoise/f"); 

  return tree;
}



//______________________________________________________________________________
TString * GetTriggerBitName(Int_t bitNumber) {
  //
  // returns the name of a trigger associated to the bit represented by 2**bitNumber
  //
  //  TString def = "NOT YET IMPLEMENTED";
  //if (bitNumber > 29) return def;
  //
  TString names[29] = {"kMB",//           = BIT(0), // Minimum bias trigger, i.e. interaction trigger, offline SPD or V0 selection
		       "kINT7",//         = BIT(1), // V0AND trigger, offline V0 selection
		       "kMUON",//         = BIT(2), // Muon trigger, offline SPD or V0 selection
		       "kHighMult",//     = BIT(3), // High-multiplicity trigger (threshold defined online), offline SPD or V0 selection
		       "kEMC1",//         = BIT(4), // EMCAL trigger
		       "kCINT5",//        = BIT(5), // Minimum bias trigger without SPD. i.e. interaction trigger, offline V0 selection
		       "kCMUS5",//        = BIT(6), // Muon trigger, offline V0 selection
		       //kMUSPB        = BIT(6), // idem for PbPb
		       "kMUSH7",//        = BIT(7), // Muon trigger: high pt, single muon, offline V0 selection, CINT7 suite
		       //kMUSHPB//       = BIT(7), // idem for PbPb
		       "kMUL7",//         = BIT(8), // Muon trigger: like sign dimuon, offline V0 selection, CINT7 suite
		       //kMuonLikePB   = BIT(8), // idem for PbPb
		       "kMUU7",//         = BIT(9), // Muon trigger, unlike sign dimuon, offline V0 selection, CINT7 suite
		       //      kMuonUnlikePB = BIT(9), // idem for PbPb
		       "kEMC7",//         = BIT(10), // EMCAL trigger, CINT7 suite
		       //kEMC8         = BIT(10), // EMCAL trigger, CINT8 suite
		       "kMUS7",//         = BIT(11), // Muon trigger: low pt, single muon, offline V0 selection, CINT7 suite
		       "kPHI1",//         = BIT(12), // PHOS trigger, CINT1 suite
		       "kPHI",//          = BIT(13), // PHOS trigger, CINT7 suite
		       //kPHI8,//         = BIT(13), // PHOS trigger, CINT8 suite
		       //kPHOSPb       = BIT(13), // idem for PbPb
		       "kEMCEJE",//       = BIT(14), // EMCAL jet patch trigger
		       "kEMCEGA",//       = BIT(15), // EMCAL gamma trigger
		       "kCentral",//      = BIT(16), // PbPb central collision trigger
		       "kSemiCentral",//  = BIT(17), // PbPb semicentral collision trigger
		       "kDG5",//          = BIT(18), // Double gap diffractive
		       "kZED",//          = BIT(19), // ZDC electromagnetic dissociation
		       //kSPI7,//         = BIT(20), // Power interaction trigger
		       "kSPI",//          = BIT(20), // Power interaction trigger
		       "kINT8",//                 = BIT(21), // CINT8 trigger: 0TVX (T0 vertex) triger
		       "kMuonSingleLowPt8",//     = BIT(22), // Muon trigger : single muon, low pt, T0 selection, CINT8 suite
		       "kMuonSingleHighPt8",//    = BIT(23), // Muon trigger : single muon, high pt, T0 selection, CINT8 suite
		       "kMuonLikeLowPt8",//       = BIT(24), // Muon trigger : like sign muon, low pt, T0 selection, CINT8 suite
		       "kMuonUnlikeLowPt8",//     = BIT(25), // Muon trigger : unlike sign muon, low pt, T0 selection, CINT8 suite
		       "kMuonUnlikeLowPt0",//     = BIT(26), // Muon trigger : unlike sign muon, low pt, no additional L0 requirement
		       "kUserDefined",//  = BIT(27), // Set when custom trigger classes are set in AliPhysicsSelection, offline SPD or V0 selection
		       "kTRD"//          = BIT(28), // TRD trigger
  };
  //
  return new TString(names[bitNumber]);


}


//______________________________________________________________________________
UInt_t GetFillFromRunNumber(UInt_t runNumber) {
  //
  // get the fill from the run number in an ugly way based on a .txt file
  // which is extracted from the logbook:
  // https://alice-logbook.cern.ch/logbook/date_online.php?p_cont=sb&p_rsob=l.run&p_rsob_dir=DESC&prsf_rwb=Yes&p_rspn=0&p_output=TXT&p_oh=yes&p_od=2&p_os=1
  //
  UInt_t fillNumber = 0;
  ifstream in;
  in.open("RunFill.list");
  if (!in) {
    //Printf("Cannot display fill, because file RunFill.list is not available in current directory.");
    return 0;
  }
  //
  // Read the input list of files 
  //
  TString objfile;
  //
  while(in.good()) {
    in >> objfile;
    if (!objfile.Contains(";")) continue; // protection
    Ssiz_t delim = objfile.First(';');
    Ssiz_t end   = objfile.Length();
    TString runString(objfile(0, delim  ) );
    Int_t run = runString.Atoi();
    if ((UInt_t) TMath::Abs(run) == runNumber) {
      TString fillString(objfile(delim+1, end - delim  ) );
      return TMath::Abs(fillString.Atoi());
    }
  }
  //
  //
  return fillNumber;

}


//______________________________________________________________________________
void  AddFillSeparationLines(TH1D * hist) {
  //
  // add the fill separation lines
  //
  for(Int_t iBin = 1; iBin < hist->GetXaxis()->GetNbins(); iBin++) {
    UInt_t runNumberOld = atoi(hist->GetXaxis()->GetBinLabel(iBin));    
    UInt_t runNumberNew = atoi(hist->GetXaxis()->GetBinLabel(iBin + 1));    
    if (GetFillFromRunNumber(runNumberOld) != GetFillFromRunNumber(runNumberNew)) {
      TLine * fillSeparationLine = new TLine(iBin,0,iBin,1.2);
      fillSeparationLine->SetLineColor(kRed);
      fillSeparationLine->SetLineWidth(1);
      fillSeparationLine->Draw();
    }
  }

}



//______________________________________________________________________________
void DumpFileInfoToTree(TTree * tree, const Char_t * inputFile, UInt_t runNumber) {
  //
  // store the information of the file in the tree
  //
  runNumberTree  = runNumber;
  fillNumberTree = GetFillFromRunNumber(runNumber);
  //
  //
  for(Int_t iTrig = 0; iTrig < 29; iTrig++) { // loop over trigger types
    triggerBitTree = 1<<iTrig;
    //
    acceptedFractionTree = GetFraction(inputFile, "Accepted", 1<<iTrig); 
    hardwareTrigger  = GetFraction(inputFile, "Hardware trigger", 1<<iTrig); 
    v0Abackgr        = GetFraction(inputFile, "V0A BG", 1<<iTrig); 
    v0Cbackgr        = GetFraction(inputFile, "V0C BG", 1<<iTrig); 
    tpcDip           = GetFraction(inputFile, "TPC HV dip Cut", 1<<iTrig); 
    tpcLaserNoise    = GetFraction(inputFile, "TPC Laser Wup Cut", 1<<iTrig); 
    t0Backgr         = GetFraction(inputFile, "T0BG", 1<<iTrig);
    t0PileUp         = GetFraction(inputFile, "T0 PileUp", 1<<iTrig);
    zdcTimeCut       = GetFraction(inputFile, "ZDC Time Cut", 1<<iTrig);
    zdcAbackgr       = GetFraction(inputFile, "ZNA BG", 1<<iTrig);
    zdcCbackgr       = GetFraction(inputFile, "ZNC BG", 1<<iTrig);
    //
    if (acceptedFractionTree > 0) tree->Fill();      
  }



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