//____________________________________________________________________
//
// Atl Task for MemTk Analysis
// 
//  
// Author: stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlMemTkAnalysisTask.cxx,v 1.13 2015/08/26 12:40:46 mergelm Exp $
// Copyright: 2013 (C) stamm
//
#ifndef ATL_AtlMemTkAnalysisTask
#include <AtlMemTkAnalysisTask.h>
#endif
#include <TChain.h>
#include <TString.h>
#include <TObjString.h>
#include <TNamed.h>
#include <TSystem.h>
#include <iostream>
#include <fstream>
#include <TDatime.h>

using namespace std;

#ifndef __CINT__
ClassImp(AtlMemTkAnalysisTask);
#endif

//____________________________________________________________________

AtlMemTkAnalysisTask::AtlMemTkAnalysisTask(const char* name, const char* title) :
    AtlTask(name, title) {
    //
    // Default constructor
    //
    
    SetBatchJob(kTRUE);
    SetBatchNodeAutomatic(kFALSE);
    fRootScript = 0;
    fListOfUserEnvs = new TList;

    fNSubjobs = 1;
    fJobid = 1;

    fMemTkRunScript = 0;
    
    // Set environment variables for common libraries
    AddUserEnv("LIBATLASANALYSIS");
    AddUserEnv("LIBMEMTK");
}

//____________________________________________________________________

AtlMemTkAnalysisTask::~AtlMemTkAnalysisTask() {
    //
    // Default destructor
    //
    if ( fRootScript != 0 ) delete fRootScript;
    fListOfUserEnvs->Delete(); delete fListOfUserEnvs;
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::ExecInteractiveJob(Option_t *option) {
    //
    // Interactive execution
    //
    // The interactive execution is done via an intermediate step of
    // an analysis run .C script in the same manner as for batch
    // jobs. Thus only a single way of job execution has to be
    // defined. In particular all selection cuts are set in the same
    // way.
    //
    TString opt = option;
    
    // Start analysis process

    // Check input chain
    // ToDo: CheckInputChain();

    Error("ExecInteractiveJob", "Currently not supported! Abort!\n");
    gSystem->Abort(0);
}    

//____________________________________________________________________

Bool_t AtlMemTkAnalysisTask::ExecBatchJob(Option_t *option) {
    //
    // Batch job submission
    //
    // Returns kFALSE in case of error.
    //
    TString opt = option;
    
    // Create submit scripts
    CreateRunScript();

    // Submit batch job
    return SubmitBatchJob();
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::ExecGridJob(Option_t *option) {
    //
    // Grid job submission
    //
    TString opt = option;

    // Create GRID_HOME directory
    if ( gSystem->Getenv("GRID_HOME") == 0 ) {    
	Error("ExecGridJob", "Env. variable GRID_HOME is not defined, Abort!");
	gSystem->Abort(0);
    }
    if ( gSystem->Exec(Form("mkdir -p %s",
			    gSystem->Getenv("GRID_HOME"))) != 0 ) {
	Error("ExecGridJob", "Failed to create GRID_HOME directory. Abort!");
	gSystem->Abort(0);
    }
    
    // Create submit scripts
    CreateGridRunScript();

    // Submit grid job
    SubmitGridJob();
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::CreateRunScript(Option_t *option) {
    //
    // Create run script for job submission
    //
    ofstream out;
    out.open(fRunScript->Data());
    out << "#!/bin/sh" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "# !!! This is an automatically generated file !!!" << endl
	<< "# !!! D O   N O T   E D I T                   !!!" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "#" << endl
	<< "# Run script for A++ analysis job submission" << endl
	<< "#" << endl << endl
	<< "# Set environment" << endl;

    // Platform
    if ( gSystem->Getenv("ARCH_TYPE") != 0 ) {
	out << "export ARCH_TYPE=" << gSystem->Getenv("ARCH_TYPE") << endl;
    } else {
	Error("CreateRunScript", "Environment variable ARCH_TYPE not set. Abort!");
	gSystem->Abort(0);
    }

    if (!WriteEnvSetup(out)) {

    // ROOT
    out << "export ROOTSYS=" << gSystem->Getenv("ROOTSYS") << endl
	<< "export PATH=${ROOTSYS}/bin:${PATH}" << endl
	<< "export LD_LIBRARY_PATH=${ROOTSYS}/lib:${LD_LIBRARY_PATH}" << endl;

    // A++ and user-defined libraries
    TIter next_lib(fListOfUserEnvs);
    TNamed *env = 0;
    while ( (env = (TNamed*)next_lib()) ) {
	if ( gSystem->Getenv(env->GetName()) != 0 ) {
	    out << "export " << env->GetName() << "="
		<< gSystem->Getenv(env->GetName()) << endl
		<< "export LD_LIBRARY_PATH=${"
		<< env->GetName() << "}/lib/${ARCH_TYPE}:${LD_LIBRARY_PATH}"
		<< endl;
	} else {
	    Error("CreateRunScript", "Environment variable %s not set. Abort!",
		  env->GetName());
	    gSystem->Abort(0);
	}
    }

    }
    out	<< endl << endl
	<< "# Job execution" << endl;

    out << "JOBHOME=" << fJobHome->Data() << endl
	<< "cd $JOBHOME;" << endl	
	<< "# Remove old Logfiles " << endl
	<< "rm " << fLogFilePath->Data() << endl;

    // Create Root-Script from master file
    if ( !(fInputFiles->GetEntries() == 1) ) {
	Error("CreateRunScript",
	      "Number of inputfiles needs to be exactly one! This is not the case (n=%d)! Abort!",
	      fInputFiles->GetEntries());
	gSystem->Abort(0);
    }

    // use "|" for sed since path name contains "/"
    if ( fMemTkRunScript == 0 ) {
	Error("CreateRunScript", "No MemTk run script defined. Abort!");
	gSystem->Abort();
    }
    out << "cp $LIBMEMTK/test/" << fMemTkRunScript->Data() << " analysis_run.C"
	<< endl
	<< "sed -i 's|NSUBJOBS|"
	<< fNSubjobs
	<< "|g' analysis_run.C"
	<< endl
	<< "sed -i 's|INPUTFILE|"
	<< ((TObjString*) fInputFiles->At(0))->GetString().Data()
	<< "|g' analysis_run.C"
	<< endl
	<< "sed -i 's|OUTPUTFILE|"
	<< fOutputFileName->Data()
	<< "|g' analysis_run.C"
	<< endl
	<< "sed -i 's|SUBJOBID|"
	<< fJobid
	<< "|g' analysis_run.C"
	<< endl;
    
    out << "root -q -l -b analysis_run.C > " << fLogFilePath->Data()
	<< " 2>&1" << endl;
    out.close();
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::CreateGridRunScript() {
    //
    // Create run script for job submission
    //
    ofstream out;
    out.open(fRunScript->Data());
    out << "#!/bin/sh" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "# !!! This is an automatically generated file !!!" << endl
	<< "# !!! D O   N O T   E D I T                   !!!" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "#" << endl
	<< "# Run script for A++ analysis job submission" << endl
	<< "#" << endl << endl
	<< "# Set environment" << endl;

    // Platform
    out << "export ARCH_TYPE=`uname -i`-`uname -s`-gcc`gcc -dumpversion`-root`root-config --version | sed 's|/|.|'`" << endl
	<< endl;

    // Cuba
    out << "# Cuba config" << endl
	<< "export CUBACORES=0" << endl
	<< "export CUBALIB=$PWD/Cuba-3.0" << endl
	<< "export LD_LIBRARY_PATH=${CUBALIB}:${LD_LIBRARY_PATH}" << endl
	<< endl;

    // LHAPDF
    out << "# LHAPDF config" << endl
	// << "export LHAPDF=$PWD/lhapdf" << endl
	// the line below has to match with the gcc config...
	<< "export LHAPDF=/cvmfs/atlas.cern.ch/repo/sw/software/x86_64-slc6-gcc47-opt/17.8.0/sw/lcg/external/MCGenerators_lcgcmt65/lhapdf/5.8.8/x86_64-slc6-gcc47-opt/" << endl
	<< "export LD_LIBRARY_PATH=${LHAPDF}/lib/:${LD_LIBRARY_PATH}" << endl
	<< "export LHAPATH=$PWD/" << endl
	<< endl;

    // MemTk
    out << "# MemTk" << endl
	<< "export LIBMEMTK=$PWD/libMEM" << endl
	<< "export LD_LIBRARY_PATH=${LIBMEMTK}/lib/${ARCH_TYPE}:${LD_LIBRARY_PATH}" << endl
	<< endl;
    
    out	<< endl << endl
	<< "# Job execution" << endl;

    // Create Root-Script from master file
    if ( !(fInputFiles->GetEntries() == 1) ) {
	Error("CreateRunScript",
	      "Number of inputfiles needs to be exactly one! This is not the case (n=%d)! Abort!",
	      fInputFiles->GetEntries());
	gSystem->Abort(0);
    }

    // Copy config run_master from MemTk tarball (default file) to current directory
    // Modify it as it is done in CreateRunScript()
    if ( fMemTkRunScript == 0 ) {
	Error("CreateRunScript", "No MemTk run script defined. Abort!");
	gSystem->Abort();
    }
    out << "cp $LIBMEMTK/test/" << fMemTkRunScript->Data() << " analysis_run.C"
	<< endl
	<< "sed -i 's|NSUBJOBS|"
	<< fNSubjobs
	<< "|g' analysis_run.C"
	<< endl
	<< "# Move input file"
	<< endl
	<< "mv " << gSystem->BaseName(((TObjString*) fInputFiles->At(0))->GetString().Data()) << " inputfile.root"
	<< endl
	<< "sed -i 's|INPUTFILE|"
	<< "inputfile.root"
	<< "|g' analysis_run.C"
	<< endl
	<< "sed -i 's|OUTPUTFILE|"
	<< gSystem->BaseName(fOutputFileName->Data())
	<< "|g' analysis_run.C"
	<< endl
	<< "sed -i 's|SUBJOBID|"
	<< fJobid
	<< "|g' analysis_run.C"
	<< endl;
    
    out << "root -q -l -b analysis_run.C" << endl;
    // Logfile is always available on grid machines!
    out.close();

    // Copy run script to GRID_HOME (replacing existing one)
    // Keep it for now (might be useful to check quickly offline
    // what has been produced on the grid)
    gSystem->Exec(Form("cp %s %s",
		       fRunScript->Data(),
		       gSystem->Getenv("GRID_HOME")));
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::AddUserEnv(const char* env) {
    //
    // Add user-defined environment variable for shared library search
    // paths
    //
    fListOfUserEnvs->Add(new TNamed(env, ""));
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::Print(Option_t *option) const {
    //
    // Print config
    //
    cout << "=============================" << endl;
    cout << " Task: " << fName << endl;
    cout << " ----------------------------" << endl;
    cout << " JobHome : " << fJobHome->Data() << endl;
    cout << " OutputFileName: " << fOutputFileName->Data() << endl;
    cout << " " << endl;
    cout << " " << endl;
    cout << " " << endl;
    cout << "=============================" << endl;
}

//____________________________________________________________________

void AtlMemTkAnalysisTask::SubmitGridJob() {
    //
    // Submit MemTk grid job
    //

    // ToDo: Specify the location of...
    // ... lhapdf-tarball
    // ... pdf-set
    // ... cuba tarball
    // ... MemTk tarball
    // and copy them if needed to the GRID_HOME directory
    
    // Check if cteq66.LHgrid and lhapdf-tarball is present
    TString gridhome = gSystem->ExpandPathName("$GRID_HOME");
    gSystem->ChangeDirectory(gridhome.Data());

    gSystem->Exec("pwd");

    // TString lhapdf = "lhapdf-5.8.8.tar.gz";
    // TString lhapdf_tmp = lhapdf;
    // if ( gSystem->FindFile(gridhome.Data(), lhapdf_tmp) == 0) {
    // 	Error("SubmitGridJob", "File not found! %s/%s",
    // 	      gridhome.Data(),
    // 	      lhapdf.Data());
    // 	gSystem->Abort(0);
    // }

    TString cteq66 = "cteq66.LHgrid";
    TString cteq66_tmp = cteq66;
    if ( gSystem->FindFile(gridhome.Data(), cteq66_tmp) == 0) {
	Error("SubmitGridJob", "File not found! %s/%s",
	      gridhome.Data(),
	      cteq66.Data());
	gSystem->Abort(0);
    }

    TString cuba30 = "Cuba-3.0.tar.gz";
    TString cuba30_tmp = cuba30;
    if ( gSystem->FindFile(gridhome.Data(), cuba30_tmp) == 0) {
	Error("SubmitGridJob", "File not found! %s/%s",
	      gridhome.Data(),
	      cuba30.Data());
	gSystem->Abort(0);
    }

    TString libMEM = "libMEM.tgz";
    TString libMEM_tmp = libMEM;
    if ( gSystem->FindFile(gridhome.Data(), libMEM_tmp) == 0) {
	Error("SubmitGridJob", "File not found! %s/%s",
	      gridhome.Data(),
	      libMEM.Data());
	gSystem->Abort(0);
    }

    TString jobsub_cmd("prun ");
    jobsub_cmd.Append("--destSE=DESY-ZN_LOCALGROUPDISK ");
    jobsub_cmd.Append("--long ");
    jobsub_cmd.Append("--maxCpuCount=172800 ");
    jobsub_cmd.Append("--bexec='./bexec.sh' ");
    jobsub_cmd.Append(Form("--exec='./%s' ",
			   gSystem->BaseName(fRunScript->Data())));

    // Use filename for dataset since it contains all information
    TString dsname = gSystem->BaseName(((TObjString*) fInputFiles->At(0))->GetString().Data());
    dsname.ReplaceAll(".root", "");
    TString runscript = gSystem->BaseName(fRunScript->Data());
    runscript.ReplaceAll(".run", "");
    dsname.ReplaceAll(Form("_%s", runscript.Data()), "");
    // create unique outDS
    TDatime time;
    jobsub_cmd.Append(Form("--outDS='user.%s.MemTk.%010d.%s' ",
			   fGridUserName->Data(),
			   time.Get(),
			   fGridSuffix->Data()));
    jobsub_cmd.Append(Form("--rootVer=%s ", fGridRootVersion->Data()));
    jobsub_cmd.Append(Form("--cmtConfig=%s ", fGridCmtVersion->Data()));

    // Has to be synchronised with bexec.sh
    // jobsub_cmd.Append(Form("--extFile=%s,%s,%s,%s ",
    // 			   lhapdf.Data(),
    jobsub_cmd.Append(Form("--extFile=%s,%s,%s ",
			   cteq66.Data(),
			   gSystem->BaseName(
			       ((TObjString*) fInputFiles->At(0))->GetString().Data()),
			   libMEM.Data()));
    jobsub_cmd.Append(Form("--outputs=%s ",
			   gSystem->BaseName(fOutputFileName->Data())));
    
    // Add input file to tarball
    TString fullfilename = ((TObjString*) fInputFiles->At(0))->GetString();
    // TString addfile = Form("tar -f %s -C %s -r %s",
    // 			   tarball.Data(),
    // 			   gSystem->DirName(fullfilename.Data()),
    // 			   gSystem->BaseName(fullfilename.Data()));
    TString addfile = Form("cp %s %s",
     			   fullfilename.Data(),
			   gSystem->Getenv("GRID_HOME"));
    Info("SubmitGridJob", "Add file to grid_home:\n%s", addfile.Data());
    gSystem->Exec(addfile.Data());
    // Submit prun cmd
    Info("SubmitGridJob", "Execute %s", jobsub_cmd.Data());
    gSystem->Exec(jobsub_cmd.Data());

    // Remove input file from tarball
    // TString removefile = Form("tar -f %s --delete %s",
    // 			      tarball.Data(),
    // 			      gSystem->BaseName(fullfilename.Data()));
    TString removefile = Form("rm %s/%s",
			      gSystem->Getenv("GRID_HOME"),
			      gSystem->BaseName(fullfilename.Data()));
    Info("SubmitGridJob", "Remove file from grid_home:\n%s", removefile.Data());
    gSystem->Exec(removefile.Data());
    // Remove runscript from GRID_HOME
    TString removeRunscript = Form("rm %s/%s",
				   gSystem->Getenv("GRID_HOME"),
				   gSystem->BaseName(fRunScript->Data()));
    Info("SubmitGridJob","%s", removeRunscript.Data());
    gSystem->Exec(removeRunscript.Data());


    // Create Logfile
    CreateLogFilePath();
    // Remove old logfile if it exist
    gSystem->Exec(Form("rm -f %s", fLogFilePath->Data()));

    // Add the string that is used in AtlTopLevelAnalysis::GetTaskStatus
    // to check if the job was successful

    // Get some information on the day, month, year.
    TString weekday = "";
    switch ( time.GetDayOfWeek() ) {
	case 1: weekday.Append("Mon."); break;
	case 2: weekday.Append("Tue."); break;
	case 3: weekday.Append("Wed."); break;
	case 4: weekday.Append("Thu."); break;
	case 5: weekday.Append("Fri."); break;
	case 6: weekday.Append("Sat."); break;
	case 7: weekday.Append("Sun."); break;
	default:
	    Error("SubmitGridJob", "Unkown day of week. Abort!");
	    gSystem->Abort();
    }	    
    
    
    ofstream out;
    out.open(fLogFilePath->Data());
    out << "Job Summary" << endl
	<< "Grid job was submitted on "
	<< weekday.Data() << ", "
	<< time.GetDay() << "."
	<< time.GetMonth() << "."
	<< time.GetYear() << " at "
	<< time.GetHour() << ":"
	<< time.GetMinute() << "."
	<< time.GetSecond() << endl;
    out.close();
}

//____________________________________________________________________

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