//____________________________________________________________________
//
// Hfor Splitting Task for A++ analyses
// 
//
//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlHforSplittingTask.cxx,v 1.3 2015/08/19 13:29:58 mergelm Exp $
// Copyright: 2013 (C) Soeren Stamm
//
#ifndef ATLAS_AtlHforSplittingTask
#include <AtlHforSplittingTask.h>
#endif
#include <TROOT.h>
#include <TBrowser.h>
#include <TMath.h>
#include <TString.h>
#include <TObjString.h>
#include <TObjArray.h>
#include <TSystem.h>
#include <fstream>
#include <iostream>
#include <TClass.h>
#include <TTree.h>
#include <TFile.h>
#include <TChain.h>
#include <TH1D.h>

using namespace std;

#ifndef __CINT__
ClassImp(AtlHforSplittingTask);
#endif

//____________________________________________________________________

AtlHforSplittingTask::AtlHforSplittingTask(const char* name,
					   const char* title) :
    AtlTask(name, title) {
    //
    // Default constructor
    //
    fInputTreeName  = new TString("physics");
    fListOfUserEnvs = new TList;

    // AddUserEnv("LIBHEPEVENT");
    // AddUserEnv("LIBATLASRUN");
    // AddUserEnv("LIBATLASEVENT");
    AddUserEnv("LIBATLASANALYSIS");
}

//____________________________________________________________________

AtlHforSplittingTask::~AtlHforSplittingTask() {
    //
    // Default destructor
    //
    delete fInputTreeName;
    fListOfUserEnvs->Delete(); delete fListOfUserEnvs;
}

//____________________________________________________________________

void AtlHforSplittingTask::SetInputTreeName(const char* TreeName) {
    //
    // Set input tree name
    //
    delete fInputTreeName;
    fInputTreeName = new TString(TreeName);  
}

//____________________________________________________________________

void AtlHforSplittingTask::ExecInteractiveJob(Option_t *option) {
    //
    // Interactive execution
    //

    TString opt = option;
    
    // Start HFOR splitting
    CreateRootScript(opt.Data());
//    gROOT->Macro(Form("%s/hfor_run.C", fJobHome->Data()));
}

//____________________________________________________________________

void AtlHforSplittingTask::CreateRunScript(Option_t*) {
    //
    // Create Run Script
    //
    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++ HFOR 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);
    }
    
    // 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;

    if (  fTempOutputFileName != 0 ) {
	out << "if [ ! -d " << gSystem->DirName( fTempOutputFileName->Data() ) << " ]; then " << endl
	    << "   mkdir -p " << gSystem->DirName( fTempOutputFileName->Data() ) << endl
	    << "fi" << endl;
    }
    
    if ( fTempOutputPath != 0 && fTempLogFilePath != 0 ) {
	out << "mkdir -p " << fTempOutputPath->Data() << endl
	    << "cp " << fJobHome->Data() << "/hfor_run.C " << fTempOutputPath->Data() << endl
	    << "cd " << fTempOutputPath->Data() << endl
	    << "root -q -l -b hfor_run.C > " << fTempLogFilePath->Data()
	    << " 2>&1" << endl
	    << "mv " << fTempLogFilePath->Data() << " " << fLogFilePath->Data() << endl;
    } else {
	out << "JOBHOME=" << fJobHome->Data() << endl
	    << "cd $JOBHOME" << endl	
	    << "root -q -l -b hfor_run.C > " << fLogFilePath->Data()
	    << " 2>&1" << endl;
    }
    
    if (  fTempOutputFileName != 0 )
	out << "mv " << fTempOutputFileName->Data() << " " << fOutputFileName->Data() << endl;
    
    out.close();    
}

//____________________________________________________________________

Bool_t AtlHforSplittingTask::ExecBatchJob(Option_t *option) {
    //
    // Exec Batch Job
    //

    TString opt = option;
    
    // Create submit scripts
    CreateRootScript(opt.Data());

    // Submit batch job
    return SubmitBatchJob();
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlHforSplittingTask::HforSplit(const char* InputFile,
				     const char* TreeName ) {
    //
    // HFOR splitting for given input file.
    //
    // Splitted files will be written to same directory as
    // the input file.
    //
    // The scale factor for bookkeeping is set to one, since the
    // x-section for each individuell hfor-type is not known

    cout << Form( "HforSplit: Processing file %s ...", InputFile) << endl;
   
    // Open input file for reading
    TFile *f_in = new TFile(InputFile, "read");
    TTree *t_in = (TTree*)f_in->Get( TreeName );

    // Loop over all valid HFOR types (0-3)
    for ( Int_t hfor = 0; hfor <= 3; hfor++ ) {
	
	// Open output file
	TString *fname_out = new TString( InputFile );
	fname_out->ReplaceAll(".root", Form("_hfor%d.root", hfor));

	cout << Form("HforSplit: Creating hfor file: %s ...", fname_out->Data() ) << endl;
	
	TFile *f_out = new TFile(fname_out->Data(), "recreate");
	
	// Copy tree
	TTree *t_out = t_in->CopyTree(Form("top_hfor_type==%d", hfor));
	t_out->SetDirectory(f_out);

	Double_t sf = 1.; // see above
	
	// Copy histograms
	CopyFolder(f_in, f_out, sf); 
	
	f_out->Write();
	delete f_out;
	delete fname_out;
    }
}

//____________________________________________________________________

void AtlHforSplittingTask::CreateRootScript(Option_t *option) {
    //
    // Create Root script for A++ analysis job execution
    //
    TString opt = option;

    // =============
    // Create script
    // =============
    if ( fRootScript != 0 ) delete fRootScript;
    fRootScript = new TString(fJobHome->Data());
    fRootScript->Append("/hfor_run.C");
    
    ofstream out;
    out.open(fRootScript->Data());
    
    // Header
    out << "{" << endl
	<< "// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "// !!! This is an automatically generated file !!!" << endl
	<< "// !!! D O   N O T   E D I T                   !!!" << endl
	<< "// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "//" << endl;
    if ( fGridJob ) {
	out << "// Root script for A++ HFOR grid job execution" << endl;
    } else {
	out << "// Root script for A++ HFOR batch job execution" << endl;
    }
    out << "//" << endl;
    
    // Add input files to script
    // (This is a hack in order to use wildcards...)
    TChain *ch = new TChain( fInputTreeName->Data() );
    
    TIter next(fInputFiles);
    TObjString *item = 0;
    while ( (item = (TObjString*)next()) )
	ch->Add( item->GetString().Data() );
    
    TIter next_file( ch->GetListOfFiles() );
    TObject *obj = 0;
    while ( ( obj = next_file() ) ) {
	out << "AtlHforSplittingTask::HforSplit(\"" 
	    << obj->GetTitle() 
	    << "\", \""
	    << fInputTreeName->Data()
	    << "\");" << endl;
    }
    out << "}" << endl;

    out.close();
}

//____________________________________________________________________

void AtlHforSplittingTask::ExecGridJob(const Option_t*) {
    //
    // Exec grid job
    //
    Error("ExecGridJob", "Not supported! Abort!");
    gSystem->Abort(0);
}

//____________________________________________________________________

void AtlHforSplittingTask::ExecNAFBatchJob(const Option_t*) {
    //
    // Exec NAF batch job
    //
    Error("ExecNAFBatchJob", "Not supported! Abort!");
    gSystem->Abort(0);
}

//____________________________________________________________________

void AtlHforSplittingTask::CreateNAFBatchRunScript() {
    //
    // Create NAF Batch Run Script
    //
    Error("ExecNAFBatchRunScript", "Not supported! Abort!");
    gSystem->Abort(0);
}

//____________________________________________________________________

void AtlHforSplittingTask::CreateGridRunScript() {
    //
    // Create Grid Run Script
    //
    Error("ExecGridRunScript", "Not supported! Abort!");
    gSystem->Abort(0);
}
 AtlHforSplittingTask.cxx:1
 AtlHforSplittingTask.cxx:2
 AtlHforSplittingTask.cxx:3
 AtlHforSplittingTask.cxx:4
 AtlHforSplittingTask.cxx:5
 AtlHforSplittingTask.cxx:6
 AtlHforSplittingTask.cxx:7
 AtlHforSplittingTask.cxx:8
 AtlHforSplittingTask.cxx:9
 AtlHforSplittingTask.cxx:10
 AtlHforSplittingTask.cxx:11
 AtlHforSplittingTask.cxx:12
 AtlHforSplittingTask.cxx:13
 AtlHforSplittingTask.cxx:14
 AtlHforSplittingTask.cxx:15
 AtlHforSplittingTask.cxx:16
 AtlHforSplittingTask.cxx:17
 AtlHforSplittingTask.cxx:18
 AtlHforSplittingTask.cxx:19
 AtlHforSplittingTask.cxx:20
 AtlHforSplittingTask.cxx:21
 AtlHforSplittingTask.cxx:22
 AtlHforSplittingTask.cxx:23
 AtlHforSplittingTask.cxx:24
 AtlHforSplittingTask.cxx:25
 AtlHforSplittingTask.cxx:26
 AtlHforSplittingTask.cxx:27
 AtlHforSplittingTask.cxx:28
 AtlHforSplittingTask.cxx:29
 AtlHforSplittingTask.cxx:30
 AtlHforSplittingTask.cxx:31
 AtlHforSplittingTask.cxx:32
 AtlHforSplittingTask.cxx:33
 AtlHforSplittingTask.cxx:34
 AtlHforSplittingTask.cxx:35
 AtlHforSplittingTask.cxx:36
 AtlHforSplittingTask.cxx:37
 AtlHforSplittingTask.cxx:38
 AtlHforSplittingTask.cxx:39
 AtlHforSplittingTask.cxx:40
 AtlHforSplittingTask.cxx:41
 AtlHforSplittingTask.cxx:42
 AtlHforSplittingTask.cxx:43
 AtlHforSplittingTask.cxx:44
 AtlHforSplittingTask.cxx:45
 AtlHforSplittingTask.cxx:46
 AtlHforSplittingTask.cxx:47
 AtlHforSplittingTask.cxx:48
 AtlHforSplittingTask.cxx:49
 AtlHforSplittingTask.cxx:50
 AtlHforSplittingTask.cxx:51
 AtlHforSplittingTask.cxx:52
 AtlHforSplittingTask.cxx:53
 AtlHforSplittingTask.cxx:54
 AtlHforSplittingTask.cxx:55
 AtlHforSplittingTask.cxx:56
 AtlHforSplittingTask.cxx:57
 AtlHforSplittingTask.cxx:58
 AtlHforSplittingTask.cxx:59
 AtlHforSplittingTask.cxx:60
 AtlHforSplittingTask.cxx:61
 AtlHforSplittingTask.cxx:62
 AtlHforSplittingTask.cxx:63
 AtlHforSplittingTask.cxx:64
 AtlHforSplittingTask.cxx:65
 AtlHforSplittingTask.cxx:66
 AtlHforSplittingTask.cxx:67
 AtlHforSplittingTask.cxx:68
 AtlHforSplittingTask.cxx:69
 AtlHforSplittingTask.cxx:70
 AtlHforSplittingTask.cxx:71
 AtlHforSplittingTask.cxx:72
 AtlHforSplittingTask.cxx:73
 AtlHforSplittingTask.cxx:74
 AtlHforSplittingTask.cxx:75
 AtlHforSplittingTask.cxx:76
 AtlHforSplittingTask.cxx:77
 AtlHforSplittingTask.cxx:78
 AtlHforSplittingTask.cxx:79
 AtlHforSplittingTask.cxx:80
 AtlHforSplittingTask.cxx:81
 AtlHforSplittingTask.cxx:82
 AtlHforSplittingTask.cxx:83
 AtlHforSplittingTask.cxx:84
 AtlHforSplittingTask.cxx:85
 AtlHforSplittingTask.cxx:86
 AtlHforSplittingTask.cxx:87
 AtlHforSplittingTask.cxx:88
 AtlHforSplittingTask.cxx:89
 AtlHforSplittingTask.cxx:90
 AtlHforSplittingTask.cxx:91
 AtlHforSplittingTask.cxx:92
 AtlHforSplittingTask.cxx:93
 AtlHforSplittingTask.cxx:94
 AtlHforSplittingTask.cxx:95
 AtlHforSplittingTask.cxx:96
 AtlHforSplittingTask.cxx:97
 AtlHforSplittingTask.cxx:98
 AtlHforSplittingTask.cxx:99
 AtlHforSplittingTask.cxx:100
 AtlHforSplittingTask.cxx:101
 AtlHforSplittingTask.cxx:102
 AtlHforSplittingTask.cxx:103
 AtlHforSplittingTask.cxx:104
 AtlHforSplittingTask.cxx:105
 AtlHforSplittingTask.cxx:106
 AtlHforSplittingTask.cxx:107
 AtlHforSplittingTask.cxx:108
 AtlHforSplittingTask.cxx:109
 AtlHforSplittingTask.cxx:110
 AtlHforSplittingTask.cxx:111
 AtlHforSplittingTask.cxx:112
 AtlHforSplittingTask.cxx:113
 AtlHforSplittingTask.cxx:114
 AtlHforSplittingTask.cxx:115
 AtlHforSplittingTask.cxx:116
 AtlHforSplittingTask.cxx:117
 AtlHforSplittingTask.cxx:118
 AtlHforSplittingTask.cxx:119
 AtlHforSplittingTask.cxx:120
 AtlHforSplittingTask.cxx:121
 AtlHforSplittingTask.cxx:122
 AtlHforSplittingTask.cxx:123
 AtlHforSplittingTask.cxx:124
 AtlHforSplittingTask.cxx:125
 AtlHforSplittingTask.cxx:126
 AtlHforSplittingTask.cxx:127
 AtlHforSplittingTask.cxx:128
 AtlHforSplittingTask.cxx:129
 AtlHforSplittingTask.cxx:130
 AtlHforSplittingTask.cxx:131
 AtlHforSplittingTask.cxx:132
 AtlHforSplittingTask.cxx:133
 AtlHforSplittingTask.cxx:134
 AtlHforSplittingTask.cxx:135
 AtlHforSplittingTask.cxx:136
 AtlHforSplittingTask.cxx:137
 AtlHforSplittingTask.cxx:138
 AtlHforSplittingTask.cxx:139
 AtlHforSplittingTask.cxx:140
 AtlHforSplittingTask.cxx:141
 AtlHforSplittingTask.cxx:142
 AtlHforSplittingTask.cxx:143
 AtlHforSplittingTask.cxx:144
 AtlHforSplittingTask.cxx:145
 AtlHforSplittingTask.cxx:146
 AtlHforSplittingTask.cxx:147
 AtlHforSplittingTask.cxx:148
 AtlHforSplittingTask.cxx:149
 AtlHforSplittingTask.cxx:150
 AtlHforSplittingTask.cxx:151
 AtlHforSplittingTask.cxx:152
 AtlHforSplittingTask.cxx:153
 AtlHforSplittingTask.cxx:154
 AtlHforSplittingTask.cxx:155
 AtlHforSplittingTask.cxx:156
 AtlHforSplittingTask.cxx:157
 AtlHforSplittingTask.cxx:158
 AtlHforSplittingTask.cxx:159
 AtlHforSplittingTask.cxx:160
 AtlHforSplittingTask.cxx:161
 AtlHforSplittingTask.cxx:162
 AtlHforSplittingTask.cxx:163
 AtlHforSplittingTask.cxx:164
 AtlHforSplittingTask.cxx:165
 AtlHforSplittingTask.cxx:166
 AtlHforSplittingTask.cxx:167
 AtlHforSplittingTask.cxx:168
 AtlHforSplittingTask.cxx:169
 AtlHforSplittingTask.cxx:170
 AtlHforSplittingTask.cxx:171
 AtlHforSplittingTask.cxx:172
 AtlHforSplittingTask.cxx:173
 AtlHforSplittingTask.cxx:174
 AtlHforSplittingTask.cxx:175
 AtlHforSplittingTask.cxx:176
 AtlHforSplittingTask.cxx:177
 AtlHforSplittingTask.cxx:178
 AtlHforSplittingTask.cxx:179
 AtlHforSplittingTask.cxx:180
 AtlHforSplittingTask.cxx:181
 AtlHforSplittingTask.cxx:182
 AtlHforSplittingTask.cxx:183
 AtlHforSplittingTask.cxx:184
 AtlHforSplittingTask.cxx:185
 AtlHforSplittingTask.cxx:186
 AtlHforSplittingTask.cxx:187
 AtlHforSplittingTask.cxx:188
 AtlHforSplittingTask.cxx:189
 AtlHforSplittingTask.cxx:190
 AtlHforSplittingTask.cxx:191
 AtlHforSplittingTask.cxx:192
 AtlHforSplittingTask.cxx:193
 AtlHforSplittingTask.cxx:194
 AtlHforSplittingTask.cxx:195
 AtlHforSplittingTask.cxx:196
 AtlHforSplittingTask.cxx:197
 AtlHforSplittingTask.cxx:198
 AtlHforSplittingTask.cxx:199
 AtlHforSplittingTask.cxx:200
 AtlHforSplittingTask.cxx:201
 AtlHforSplittingTask.cxx:202
 AtlHforSplittingTask.cxx:203
 AtlHforSplittingTask.cxx:204
 AtlHforSplittingTask.cxx:205
 AtlHforSplittingTask.cxx:206
 AtlHforSplittingTask.cxx:207
 AtlHforSplittingTask.cxx:208
 AtlHforSplittingTask.cxx:209
 AtlHforSplittingTask.cxx:210
 AtlHforSplittingTask.cxx:211
 AtlHforSplittingTask.cxx:212
 AtlHforSplittingTask.cxx:213
 AtlHforSplittingTask.cxx:214
 AtlHforSplittingTask.cxx:215
 AtlHforSplittingTask.cxx:216
 AtlHforSplittingTask.cxx:217
 AtlHforSplittingTask.cxx:218
 AtlHforSplittingTask.cxx:219
 AtlHforSplittingTask.cxx:220
 AtlHforSplittingTask.cxx:221
 AtlHforSplittingTask.cxx:222
 AtlHforSplittingTask.cxx:223
 AtlHforSplittingTask.cxx:224
 AtlHforSplittingTask.cxx:225
 AtlHforSplittingTask.cxx:226
 AtlHforSplittingTask.cxx:227
 AtlHforSplittingTask.cxx:228
 AtlHforSplittingTask.cxx:229
 AtlHforSplittingTask.cxx:230
 AtlHforSplittingTask.cxx:231
 AtlHforSplittingTask.cxx:232
 AtlHforSplittingTask.cxx:233
 AtlHforSplittingTask.cxx:234
 AtlHforSplittingTask.cxx:235
 AtlHforSplittingTask.cxx:236
 AtlHforSplittingTask.cxx:237
 AtlHforSplittingTask.cxx:238
 AtlHforSplittingTask.cxx:239
 AtlHforSplittingTask.cxx:240
 AtlHforSplittingTask.cxx:241
 AtlHforSplittingTask.cxx:242
 AtlHforSplittingTask.cxx:243
 AtlHforSplittingTask.cxx:244
 AtlHforSplittingTask.cxx:245
 AtlHforSplittingTask.cxx:246
 AtlHforSplittingTask.cxx:247
 AtlHforSplittingTask.cxx:248
 AtlHforSplittingTask.cxx:249
 AtlHforSplittingTask.cxx:250
 AtlHforSplittingTask.cxx:251
 AtlHforSplittingTask.cxx:252
 AtlHforSplittingTask.cxx:253
 AtlHforSplittingTask.cxx:254
 AtlHforSplittingTask.cxx:255
 AtlHforSplittingTask.cxx:256
 AtlHforSplittingTask.cxx:257
 AtlHforSplittingTask.cxx:258
 AtlHforSplittingTask.cxx:259
 AtlHforSplittingTask.cxx:260
 AtlHforSplittingTask.cxx:261
 AtlHforSplittingTask.cxx:262
 AtlHforSplittingTask.cxx:263
 AtlHforSplittingTask.cxx:264
 AtlHforSplittingTask.cxx:265
 AtlHforSplittingTask.cxx:266
 AtlHforSplittingTask.cxx:267
 AtlHforSplittingTask.cxx:268
 AtlHforSplittingTask.cxx:269
 AtlHforSplittingTask.cxx:270
 AtlHforSplittingTask.cxx:271
 AtlHforSplittingTask.cxx:272
 AtlHforSplittingTask.cxx:273
 AtlHforSplittingTask.cxx:274
 AtlHforSplittingTask.cxx:275
 AtlHforSplittingTask.cxx:276
 AtlHforSplittingTask.cxx:277
 AtlHforSplittingTask.cxx:278
 AtlHforSplittingTask.cxx:279
 AtlHforSplittingTask.cxx:280
 AtlHforSplittingTask.cxx:281
 AtlHforSplittingTask.cxx:282
 AtlHforSplittingTask.cxx:283
 AtlHforSplittingTask.cxx:284
 AtlHforSplittingTask.cxx:285
 AtlHforSplittingTask.cxx:286
 AtlHforSplittingTask.cxx:287
 AtlHforSplittingTask.cxx:288
 AtlHforSplittingTask.cxx:289
 AtlHforSplittingTask.cxx:290
 AtlHforSplittingTask.cxx:291
 AtlHforSplittingTask.cxx:292
 AtlHforSplittingTask.cxx:293
 AtlHforSplittingTask.cxx:294
 AtlHforSplittingTask.cxx:295
 AtlHforSplittingTask.cxx:296
 AtlHforSplittingTask.cxx:297
 AtlHforSplittingTask.cxx:298
 AtlHforSplittingTask.cxx:299
 AtlHforSplittingTask.cxx:300
 AtlHforSplittingTask.cxx:301
 AtlHforSplittingTask.cxx:302
 AtlHforSplittingTask.cxx:303
 AtlHforSplittingTask.cxx:304
 AtlHforSplittingTask.cxx:305
 AtlHforSplittingTask.cxx:306
 AtlHforSplittingTask.cxx:307
 AtlHforSplittingTask.cxx:308
 AtlHforSplittingTask.cxx:309
 AtlHforSplittingTask.cxx:310
 AtlHforSplittingTask.cxx:311
 AtlHforSplittingTask.cxx:312
 AtlHforSplittingTask.cxx:313
 AtlHforSplittingTask.cxx:314
 AtlHforSplittingTask.cxx:315
 AtlHforSplittingTask.cxx:316
 AtlHforSplittingTask.cxx:317
 AtlHforSplittingTask.cxx:318
 AtlHforSplittingTask.cxx:319
 AtlHforSplittingTask.cxx:320
 AtlHforSplittingTask.cxx:321
 AtlHforSplittingTask.cxx:322
 AtlHforSplittingTask.cxx:323
 AtlHforSplittingTask.cxx:324
 AtlHforSplittingTask.cxx:325