ROOT logo
//*-- Author : Manuel Sanchez
//*-- Modified : 08/10/2003 by Romain Holzmann
//*-- Modified : 24/02/2003 by Ilse Koenig
//*-- Modified : 23/05/2002 by Manuel Sanchez
//*-- Modified : 01/03/2000 by Manuel Sanchez
//*-- Modified : 5/05/98 by Manuel Sanchez
//*-- Copyright : GENP (Univ. Santiago de Compostela)

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////
// HGeantMergeSource
//
// This data source can read data from a ROOT file generated by
// HGEANT. N root files can be read in parallel and the content
// of HGeantKine + geant detector hit categories will be merged
// into one event. If only 1 input file is used the source behaves
// like a standard HRootSource.
//
// Methods :
// I.   addFile()
//      + n file addAdditionalInput()
// II.  addMultFiles(TString comma_separated_List)
//
// The first input file will create the event struture
// and the content of the other inputs will be merged into
// this event. Take the file with largest content first!
////////////////////////////////////////////////////////////////////////////
#include "hgeantmergesource.h"
#include "hades.h"
#include "hrecevent.h"
#include "heventheader.h"
#include "hgeantheader.h"
#include "hpartialevent.h"
#include "hcategory.h"
#include "hlinearcategory.h"
#include "hmatrixcategory.h"

#include "hgeantmaxtrk.h"
#include "hgeantdef.h"

#include <iostream>
#include <iomanip>
#include <limits.h>
#include <unistd.h>
#include "TKey.h"

using namespace std;

ClassImp(HGeantMergeSource)

    HGeantMergeSource::HGeantMergeSource(Bool_t fPers, Bool_t fMerg)
{
    // for fPers==kFALSE, input cats are suppressed in output
    // for fMerg==kTRUE, partial events in input tree are merged into current
    // event, if it exists already at init().
    fInput           = 0;
    fEventInFile     = 0;
    fCursor          = 0;
    fCurrentRunId    = INT_MIN;
    fCurrentRefId    = -1;
    fGlobalRefId     = -1;
    fDirectory       = "./";
    fPersistency     = fPers;
    fMerge           = fMerg;
    fEventList       = 0;
    fLastRunId       = -1;
    overwriteVersion = kFALSE;
    replaceVersion   = 0;


}

HGeantMergeSource::~HGeantMergeSource(void)
{
    //Class destructor, it clears the data source.
    Clear();
}


Bool_t HGeantMergeSource::createGeantEvent(HRecEvent* fCurrentEvent){



    HPartialEvent* geantEvt = fCurrentEvent->getPartialEvent(catSimul);
    if(!geantEvt){

	fCurrentEvent->addPartialEvent(catSimul,"Simul","Simulated event");

	HPartialEvent* pKine = fCurrentEvent->getPartialEvent(catSimul);
	pKine->setSubHeader(new HGeantHeader);
	pKine->addCategory(catGeantKine,new HLinearCategory("HGeantKine",MAXTRKKINE) );

	Int_t iniMdc[4]={6,4,7,MAXTRKMDC};
	pKine->addCategory(catMdcGeantRaw,new HMatrixCategory("HGeantMdc",4,iniMdc,0.1) );

	Int_t iniRich[2]={6,MAXCKOVRICH};
	pKine->addCategory(catRichGeantRaw,new HMatrixCategory("HGeantRichPhoton",2,iniRich,0.1) );
	Int_t ini1Rich[2]={6,MAXPARTRICH};
	pKine->addCategory(catRichGeantRaw+1,new HMatrixCategory("HGeantRichDirect",2,ini1Rich,0.1) );
	Int_t ini2Rich[2]={6,MAXMIRRRICH};
	pKine->addCategory(catRichGeantRaw+2,new HMatrixCategory("HGeantRichMirror",2,ini2Rich,0.1) );

	Int_t iniRpc[2]={6,MAXTRKRPC};
	pKine->addCategory(catRpcGeantRaw,new HMatrixCategory("HGeantRpc",2,iniRpc,0.5) );

	Int_t iniTof[2]={6,MAXTRKTOF};
	pKine->addCategory(catTofGeantRaw,new HMatrixCategory("HGeantTof",2,iniTof,0.1) );

	Int_t iniShower[2]={6,MAXTRKSHOW};
	pKine->addCategory(catShowerGeantRaw,new HMatrixCategory("HGeantShower",2,iniShower,0.1) );

	pKine->addCategory(catWallGeantRaw,new HLinearCategory("HGeantWall",MAXTRKWALL) );

	Int_t iniStart=MAXTRKSTART*0.1;
	pKine->addCategory(catStartGeantRaw,new HLinearCategory("HGeantStart",iniStart) );

	Int_t iniEmc[2]={6,MAXTRKEMC};
	pKine->addCategory(catEmcGeantRaw,new HMatrixCategory("HGeantEmc",2,iniEmc,0.1) );

        return kTRUE;
    }
    return kFALSE;
}

Bool_t HGeantMergeSource::init(void)
{
    // Initializes the data source connecting the parts of the input tree in
    // the input ROOT file to the event structure used for the analysis. If
    // no event structure has been set by the user, HGeantMergeSource::init() will
    // set one read from the input file. If it exists, it will be used as such
    // (fMerge==kFALSE) or merged with the one in the input file (fMerge==kTRUE).
    Bool_t r = kTRUE;

    if (fEventInFile != 0)
    {
	//If there is an active event structure
	HRecEvent* fCurrentEvent = (HRecEvent*)gHades->getCurrentEvent();
	if (fCurrentEvent != 0) {
	    if (fMerge) {  // merge the 2 event structures

		Warning("init","Merging with predefined event structure");
		((HRecEvent*)fEventInFile)->merge(fCurrentEvent);

	    } else {
		Warning("init","Using predefined event structure");
	    }

	} else  {
	    gHades->setEvent(fEventInFile);
	}

	if ( fInput!=0)
	{
	    Char_t sl=*(strchr(fInput->GetTitle(),'.')+1);
	    switch (sl) {
	    case '0' : fSplitLevel = 0;
	    break;
	    case '1' : fSplitLevel = 1;
	    break;
	    case '2' : fSplitLevel = 2;
	    break;
	    default : fSplitLevel  = 0;
	    }
	    fInput->SetBranchStatus("*",kFALSE);
	    gHades->activateTree(fInput);
	    if (fEventList) {
		fEntries = fEventList->GetN();
	    } else {
		fEntries=fInput->GetEntries();
	    }
	    if (fCursor >= fEntries) {
		Error("init","Entry not existing %i",fCursor);
		return kFALSE; //Entry not existing
	    }
	    if (fEventList) {
		fInput->GetEvent(fEventList->GetEntry(fCursor));
	    } else {
		fInput->GetEvent(fCursor);
	    }
	    fCurrentRunId = gHades->getCurrentEvent()->getHeader()->getEventRunNumber();
	    fLastRunId = fCurrentRunId;

	    if(overwriteVersion)
	    { // fix not set version in simulation
		gHades->getCurrentEvent()->getHeader()->setVersion(replaceVersion);
	    }

	    if (fRefIds.find(fCurrentRunId) != fRefIds.end()) {
		fCurrentRefId = fRefIds[fCurrentRunId];
	    } else {
		fCurrentRefId = fGlobalRefId;
	    }
	    if (fPersistency == kFALSE) { // set all input categories non-persistent

		for(Int_t i = 0; i < 16; i ++) { // loop over partial events
		    HPartialEvent* fPar = ((HRecEvent*)fEventInFile)->getPartialEvent(i<<kBitCategorySize);
		    if (fPar) { fPar->setPersistency(kFALSE); }
		}
	    }
	    setCursorToPreviousEvent();
	    r = kTRUE;
	} else {
	    Warning("init","Not input");
	    Clear();
	    r = kFALSE;
	}
    } else {
	r = kFALSE;
    }
    return r;
}

EDsState HGeantMergeSource::getNextEvent(Bool_t doUnpack)
{
    //Retrieves next event in the input file.
    Int_t bread = 0;
    if (fInput)
    {
	if (fSplitLevel < 2) (*fEventAddr)->clearAll(fSplitLevel);
	if (fCursor < fEntries)
	{
	    Int_t entry = fCursor;
	    if (fEventList) {
		entry = fEventList->GetEntry(fCursor) ;
		bread = fInput->GetEvent(entry);

	    } else {
		bread = fInput->GetEvent(fCursor);
	    }
	    if(bread > 0)
	    {
		//------------------------------------------------
		// read other inputs to merge GEANT events
		Bool_t status = kTRUE;
		for(UInt_t i=0;i<fAdditionalInputs.size();i++){
		    HParallelEvent* evt = fAdditionalInputs[i];
		    if(evt->getEntry(entry) < 0 ) {
			status = kFALSE;
			break;
		    }
		    evt->mergeGeantEvent((HRecEvent*)gHades->getCurrentEvent());
		}
		if(status == kFALSE) bread = 0;
	    }
	    if (bread == 0) { return kDsEndData; }
	    fCursor ++;
	    fCurrentRunId = gHades->getCurrentEvent()->getHeader()->getEventRunNumber();
	    if(overwriteVersion)
	    {  // fix not set version in simulation
		gHades->getCurrentEvent()->getHeader()->setVersion(replaceVersion);
	    }
	    if (fCurrentRunId != fLastRunId)
	    {
		if (fRefIds.find(fCurrentRunId) != fRefIds.end()) {
		    fCurrentRefId = fRefIds[fCurrentRunId];
		} else {
		    fCurrentRefId = fGlobalRefId;
		}
		fLastRunId = fCurrentRunId;
		return kDsEndFile;
	    }
	} else { return kDsEndData; }
    } else { return kDsError; }
    return kDsOk;
}

Bool_t HGeantMergeSource::getEvent(Int_t eventN) {
    //Retrieves event in position eventN in the input file, copying the
    //information to the event structure.
    if (fInput) {
	Bool_t status = kFALSE;
	Int_t entry   = eventN ;
	if (fEventList) {
            entry = fEventList->GetEntry(eventN) ;
	}

	if(fInput->GetEvent(entry) > 0)
	{
	    status = kTRUE;
	    for(UInt_t i=0;i<fAdditionalInputs.size();i++){
		HParallelEvent* evt = fAdditionalInputs[i];
		if(evt->getEntry(entry) < 0 ) {
		    status = kFALSE;
		    break;
		}
		evt->mergeGeantEvent((HRecEvent*)gHades->getCurrentEvent());
	    }
	}
        return status;
    }
    return kFALSE;
}

void HGeantMergeSource::Clear(void)
{
    //Closes the input file.
    if (fInput) {
	delete fInput;
	fInput = 0;

	for(UInt_t i=0;i<fAdditionalInputs.size();i++){
	    HParallelEvent* evt = fAdditionalInputs[i];
	    evt->closeInputFile();
            delete evt;
	}

    }
}


Bool_t HGeantMergeSource::addFile(const Text_t *file,Bool_t print)
{
    Text_t treeName[] = "T";
    TString fname = getFileName(file);

    if (fileExists(fname))
    {
	if (!fInput)
	{ //If chain doesn't already exist
	    TFile *fileTemp;
	    TKey *key = 0;
	    TString title;
	    if(print)Info("addFile()","Add file %s",fname.Data());

	    fileTemp = getFile(fname.Data()); //Obtain tree title
	    //new TFile(fname.Data());
	    key               = fileTemp->GetKey(treeName);  //No need to delete this pointer
	    fEventInFile      = (HEvent *)fileTemp->Get("Event");
	    fCurrentRunId     = fEventInFile->getHeader()->getEventRunNumber();
	    if (fRefIds.find(fCurrentRunId) != fRefIds.end()) {
		fCurrentRefId = fRefIds[fCurrentRunId];
	    } else {
		fCurrentRefId = fGlobalRefId;
	    }
	    title = key->GetTitle();
	    fileTemp->Close();
	    delete fileTemp;
	    fInput = new TChain(treeName,title.Data());
	}
	fInput->Add(fname.Data());

    } else {
	Warning("addFile","File %s not found",fname.Data());
	return kFALSE;
    }
    return kTRUE;
}

Bool_t   HGeantMergeSource::addMultFiles(TString commaSeparatedList)
{
    // set multiple paralellel input files format :
    // "file1_with_path,file2_with_path,file3_with_path"
    // the first file will be set a standard input. the content
    // of the other files will copied into the event of file1.
    // for performance reasons the file with the biggest event
    // should be set as first file.


    commaSeparatedList.ReplaceAll(" ","");
    if(commaSeparatedList==""){
	Error("addMultFiles()","No input file specified!");
        return kFALSE;
    }
    TObjArray* ar = commaSeparatedList.Tokenize(",");
    if(ar){
        Bool_t ok = kFALSE;
	TString infile;
	if(ar->GetEntries()>0) {
	    infile = ((TObjString*)ar->At(0))->GetString();
	    Info("addMultFiles()","Add file %s",infile.Data());
	    ok = addFile((const Text_t*) infile.Data(),kFALSE);
	}
	if(ok){
	    for(Int_t i = 1; i < ar->GetEntries();i++){
		infile = ((TObjString*)ar->At(i))->GetString();
		Info("addMultFiles()","Add file %s",infile.Data());
		ok = addAdditionalInput(infile,kFALSE);
                if(!ok) break;
	    }
	}
	delete ar;

	return ok;
    }

    return kFALSE;

}


Bool_t  HGeantMergeSource::addAdditionalInput(TString filename,Bool_t print)
{
       HParallelEvent* evt = new HParallelEvent(filename,filename);
       Bool_t ok =   evt->setInputFile(filename,print);

       if(!ok) {
	   delete evt;
	   return kFALSE;
       }

       fAdditionalInputs.push_back(evt);
       return kTRUE;
}

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