ROOT logo
#include "hparallelevent.h"
#include "hades.h"
#include "hrecevent.h"
#include "hpartialevent.h"
#include "hcategory.h"
#include "hlinearcategory.h"
#include "hmatrixcategory.h"
#include "hcategorymanager.h"

//-----------------------
#include "haddef.h"
#include "hgeantdef.h"


//-----------------------

#include "hgeantkine.h"
#include "hgeantrich.h"
#include "hgeantmdc.h"
#include "hgeanttof.h"
#include "hgeantrpc.h"
#include "hgeantshower.h"
#include "hgeantwall.h"
#include "hgeantstart.h"
#include "hgeantemc.h"

//-----------------------
#include "TBranch.h"
#include "TSystem.h"
#include "TObjArray.h"

//-----------------------
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;

// ROOT's IO and RTTI stuff is added here
ClassImp(HParallelEvent)

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HParallelEvent
//
// This class holds an full event structure connected
// to an root input file and the corresponding tree.
// It provides the function to merge 2 geant events.
// The events have to have the same structure.
// The class is used by HGeantMergeSource.
//
////////////////////////////////////////////////////////////////////////////////




HParallelEvent::HParallelEvent(const Text_t *name,const Text_t *title)
: TNamed(name,title)
{
    fCurrentEvent      = 0;
    fTree              = 0;
    fFile              = 0;
}

HParallelEvent::~HParallelEvent()
{
    if(fCurrentEvent) delete fCurrentEvent;
}

void HParallelEvent::activateTree(TTree *tree)
{
    // Sets the right branch address and branch status (=1) for all the branches
    // in tree which correspond to the branches which would eventually be
    // generated for the output Root tree of events if the function makeTree() is
    // called.
    //
    // This mechanism allows to only read those branches in "tree" which are
    // neccesary to fill an event as defined in setEventLayout()
    Int_t splitLevel = 2;
    TBranch *brEvent = 0;

    Char_t sl = *(strchr(tree->GetTitle(),'.') + 1);
    switch (sl) {
    case '0' : splitLevel = 0;
    break;
    case '1' : splitLevel = 1;
    break;
    case '2' : splitLevel = 2;
    break;
    default : splitLevel  = 2;
    }
    if (fCurrentEvent)
    {
	tree->SetBranchStatus("*",1);   // needed since Root 303-04 because of
	// change in TBranchElement::SetAddress()
	if (splitLevel == 0)
	{
	    tree->SetBranchAddress("Event",&fCurrentEvent);
	    tree->SetBranchStatus("Event",1);
	} else {
	    brEvent = tree->GetBranch("Event.");
	    if (brEvent) { //Post ROOT3 splitting
		brEvent->SetAddress(&fCurrentEvent);
		tree->SetBranchStatus("Event.",1);
		tree->SetBranchStatus("Event.*",1);
	    } else { //Pre ROOT3 splitting
		brEvent = tree->GetBranch("Event");
		if (brEvent) {
		    tree->SetBranchAddress("Event",&fCurrentEvent);
		    tree->SetBranchStatus("Event",1);
		    tree->SetBranchStatus("Event.*",1);
		} else {
		    Warning("activateBranch","Event branch not found in tree");
		}
	    }
	    fCurrentEvent->activateBranch(tree,splitLevel);
	}
    }
}

Bool_t   HParallelEvent::setInputFile(TString name,Bool_t print)
{
    // set the input file, reads the eventstructure and
    // activates the tree

    if(gSystem->AccessPathName(name.Data()) == 0) {
	fFile = new TFile(name.Data(),"READ");
	if(fFile){
	    fTree = (HTree*)fFile->Get("T");
	    if(!fTree){
		Error("setInputFile()","File = %s contains no Tree \"T\"!",name.Data());
                return kFALSE;
	    }
	    fCurrentEvent = (HRecEvent*) fFile->Get("Event");
	    if(!fCurrentEvent){
		Error("setInputFile()","File = %s contains no EventStructure !",name.Data());
                return kFALSE;
	    }
	} else return kFALSE;

	SetName(name.Data());


	activateTree(fTree);
        if(print)Info("setInputFile()","Open %s",name.Data());
	return kTRUE;
    } else {
        Error("setInputFile()","File = %s not found!",name.Data());
        return kFALSE;
    }
}

void     HParallelEvent::closeInputFile()
{
    if(fFile) {
        Info("closeInputFile()","Close %s",GetName());
	fFile->Close();
	fFile = 0;
	fTree = 0;

    }
}


void     HParallelEvent::mergeGeantEvent(HRecEvent*  targetEvent)
{
    // merge in internal event into target event. the content is appended
    // track numbers and indices are takes care of.

    HCategory* kineCat             = targetEvent->getCategory(catGeantKine);
    HMatrixCategory* richCatCerenk = (HMatrixCategory*)targetEvent->getCategory(catRichGeantRaw);
    HMatrixCategory* richCatDirect = (HMatrixCategory*)targetEvent->getCategory(catRichGeantRaw+1);
    HMatrixCategory* richCatMirror = (HMatrixCategory*)targetEvent->getCategory(catRichGeantRaw+2);
    HMatrixCategory* mdcCat        = (HMatrixCategory*)targetEvent->getCategory(catMdcGeantRaw);
    HMatrixCategory* tofCat        = (HMatrixCategory*)targetEvent->getCategory(catTofGeantRaw);
    HMatrixCategory* rpcCat        = (HMatrixCategory*)targetEvent->getCategory(catRpcGeantRaw);
    HMatrixCategory* shrCat        = (HMatrixCategory*)targetEvent->getCategory(catShowerGeantRaw);
    HCategory* startCat            = targetEvent->getCategory(catStartGeantRaw);
    HCategory* wallCat             = targetEvent->getCategory(catWallGeantRaw);
    HMatrixCategory* emcCat        = (HMatrixCategory*)targetEvent->getCategory(catEmcGeantRaw);



    HCategory* kineCatLoc             = fCurrentEvent->getCategory(catGeantKine);
    HMatrixCategory* richCatCerenkLoc = (HMatrixCategory*)fCurrentEvent->getCategory(catRichGeantRaw);
    HMatrixCategory* richCatDirectLoc = (HMatrixCategory*)fCurrentEvent->getCategory(catRichGeantRaw+1);
    HMatrixCategory* richCatMirrorLoc = (HMatrixCategory*)fCurrentEvent->getCategory(catRichGeantRaw+2);
    HMatrixCategory* mdcCatLoc        = (HMatrixCategory*)fCurrentEvent->getCategory(catMdcGeantRaw);
    HMatrixCategory* tofCatLoc        = (HMatrixCategory*)fCurrentEvent->getCategory(catTofGeantRaw);
    HMatrixCategory* rpcCatLoc        = (HMatrixCategory*)fCurrentEvent->getCategory(catRpcGeantRaw);
    HMatrixCategory* shrCatLoc        = (HMatrixCategory*)fCurrentEvent->getCategory(catShowerGeantRaw);
    HCategory* startCatLoc            = fCurrentEvent->getCategory(catStartGeantRaw);
    HCategory* wallCatLoc             = fCurrentEvent->getCategory(catWallGeantRaw);
    HMatrixCategory* emcCatLoc        = (HMatrixCategory*)fCurrentEvent->getCategory(catEmcGeantRaw);




    if(!kineCat||!kineCatLoc)   { Error("mergeGeantEvent()","catKine or catKineLoc missing!"); cout<<kineCat<<" "<<kineCatLoc<<endl;return; }
    if( (!richCatCerenk&&richCatCerenkLoc)|| (richCatCerenk&&!richCatCerenkLoc))  { Error("mergeGeantEvent()","catRich Cerenkov has different setting!"); return; }
    if( (!richCatDirect&&richCatDirectLoc)|| (richCatDirect&&!richCatDirectLoc))  { Error("mergeGeantEvent()","catRich Direct has different setting!");   return; }
    if( (!richCatMirror&&richCatMirrorLoc)|| (richCatMirror&&!richCatMirrorLoc))  { Error("mergeGeantEvent()","catRich Mirror has different setting!");   return; }
    if( (!mdcCat       &&mdcCatLoc       )|| (mdcCat       &&!mdcCatLoc       ))  { Error("mergeGeantEvent()","catMdc has different setting!");           return; }
    if( (!tofCat       &&tofCatLoc       )|| (tofCat       &&!tofCatLoc       ))  { Error("mergeGeantEvent()","catTof has different setting!");           return; }
    if( (!rpcCat       &&rpcCatLoc       )|| (rpcCat       &&!rpcCatLoc       ))  { Error("mergeGeantEvent()","catRpc has different setting!");           return; }
    if( (!shrCat       &&shrCatLoc       )|| (shrCat       &&!shrCatLoc       ))  { Error("mergeGeantEvent()","catShower has different setting!");        return; }
    if( (!startCat     &&startCatLoc     )|| (startCat     &&!startCatLoc     ))  { Error("mergeGeantEvent()","catStart has different setting!");         return; }
    if( (!wallCat      &&wallCatLoc      )|| (wallCat      &&!wallCatLoc      ))  { Error("mergeGeantEvent()","catWall has different setting!");          return; }
    if( (!emcCat       &&emcCatLoc       )|| (emcCat       &&!emcCatLoc       ))  { Error("mergeGeantEvent()","catEmc has different setting!");           return; }

    HLocation loc;//dummy
    Int_t index ;

    HGeantKine* kine            = 0;
    HGeantRichDirect* grichdir  = 0;
    HGeantRichPhoton* grichphot = 0;
    HGeantRichMirror* grichmir  = 0;
    HGeantMdc*        gmdc      = 0;
    HGeantTof*        gtof      = 0;
    HGeantShower*     gshr      = 0;
    HGeantRpc*        grpc      = 0;
    HGeantWall*       gwall     = 0;
    HGeantEmc*        gemc      = 0;
    HGeantStart*      gstart    = 0;

    Int_t lastRichCer = (richCatCerenk)? richCatCerenk->getEntries()-1 : -1;
    Int_t lastRichDir = (richCatDirect)? richCatDirect->getEntries()-1 : -1;
    Int_t lastRichMir = (richCatMirror)? richCatMirror->getEntries()-1 : -1;
    Int_t lastMdc     = (mdcCat)       ? mdcCat       ->getEntries()-1 : -1;
    Int_t lastTof     = (tofCat)       ? tofCat       ->getEntries()-1 : -1;
    Int_t lastShr     = (shrCat)       ? shrCat       ->getEntries()-1 : -1;
    Int_t lastRpc     = (rpcCat)       ? rpcCat       ->getEntries()-1 : -1;
    Int_t lastWall    = (wallCat)      ? wallCat      ->getEntries()-1 : -1;
    Int_t lastEmc     = (emcCat)       ? emcCat       ->getEntries()-1 : -1;
    Int_t lastStart   = (startCat)     ? startCat     ->getEntries()-1 : -1;


    Int_t kineLastTr  = 0;

    if(kineCat && kineCat->getEntries()>0){
	kine       = (HGeantKine* )kineCat->getObject(kineCat->getEntries()-1);
	kineLastTr  = kine->getTrack();
    }

    if(kineCatLoc && kineCatLoc->getEntries()>0){
        loc.set(0);

	for(Int_t i=0;i<kineCatLoc->getEntries();i++){
	    HGeantKine* kineLoc = (HGeantKine* )kineCatLoc->getObject(i);
            Int_t track          = kineLoc->getTrack();
            Int_t parentTrack    = kineLoc->getParentTrack();
	    Int_t firstRichLoc   = kineLoc->getFirstRichHit();
	    Int_t firstMdcLoc    = kineLoc->getFirstMdcHit();
	    Int_t firstTofLoc    = kineLoc->getFirstTofHit();
	    Int_t firstRpcLoc    = kineLoc->getFirstRpcHit();
	    Int_t firstShrLoc    = kineLoc->getFirstShowerHit();
	    Int_t firstWallLoc   = kineLoc->getFirstWallHit();
	    Int_t firstEmcLoc    = kineLoc->getFirstEmcHit();
	    Int_t firstStartLoc  = kineLoc->getFirstStartHit();


	    kine = (HGeantKine*) kineCat->getNewSlot(loc,&index); // new slot in target cat
            kine = new (kine) HGeantKine(*kineLoc);               // copy local object to target cat




            //--------------------------------------------------
            // shifting tracknumbers and indices
	    kine->setTrack         (track  + kineLastTr);
	    kine->setParentTrack   ((parentTrack  > 0)? parentTrack  + kineLastTr     :  0);
	    kine->setFirstRichHit  ((firstRichLoc >-1)? firstRichLoc + lastRichCer + 1: -1);
	    kine->setFirstMdcHit   ((firstMdcLoc  >-1)? firstMdcLoc  + lastMdc     + 1: -1);
	    kine->setFirstTofHit   ((firstTofLoc  >-1)? firstTofLoc  + lastTof     + 1: -1);
	    kine->setFirstRpcHit   ((firstRpcLoc  >-1)? firstRpcLoc  + lastRpc     + 1: -1);
	    kine->setFirstShowerHit((firstShrLoc  >-1)? firstShrLoc  + lastShr     + 1: -1);
	    kine->setFirstWallHit  ((firstWallLoc >-1)? firstWallLoc + lastWall    + 1: -1);
	    kine->setFirstEmcHit   ((firstEmcLoc  >-1)? firstEmcLoc  + lastEmc     + 1: -1);
	    kine->setFirstStartHit ((firstStartLoc>-1)? firstStartLoc+ lastStart   + 1: -1);

	    kine->setRichCategory(0);
	    kine->setMdcCategory(0) ;
            kine->setTofCategory(0) ;
            kine->setRpcCategory(0) ;
            kine->setShowerCategory(0) ;
            kine->setWallCategory(0) ;
            kine->setEmcCategory(0) ;
            kine->setStartCategory(0) ;
            kine->resetRichIter();
            kine->resetMdcIter();
            kine->resetTofIter();
            kine->resetRpcIter();
            kine->resetShowerIter();
            kine->resetWallIter();
            kine->resetEmcIter();
            kine->resetStartIter();
	    //--------------------------------------------------

	}
    }

    if(richCatCerenkLoc && richCatCerenkLoc->getEntries()>0){
	loc.set(2,0,0); // 6,4000
	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ ind[s]=0; }
	for(Int_t i=0;i<richCatCerenk->getEntries();i++){
	    HGeantRichPhoton* grichphotLoc = (HGeantRichPhoton* ) richCatCerenk->getObject(i);
            ind[grichphotLoc->getSector()]++;
	}

	for(Int_t i=0;i<richCatCerenkLoc->getEntries();i++){
	    HGeantRichPhoton* grichphotLoc = (HGeantRichPhoton* ) richCatCerenkLoc->getObject(i);
	    Int_t track  = grichphotLoc->getTrack();
	    Int_t nexhit = grichphotLoc->getNextHitIndex();
	    loc[0]       = grichphotLoc->getSector();
            loc[1]       = ind[loc[0]];
	    grichphot    = (HGeantRichPhoton*) richCatCerenk->getSlot(loc,&index); // new slot in target cat
	    grichphot    = new (grichphot) HGeantRichPhoton(*grichphotLoc);           // copy local object to target cat
            ind[loc[0]]++;
	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    grichphot->setTrack         (track        +kineLastTr);
	    grichphot->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastRichCer + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(richCatDirectLoc && richCatDirectLoc->getEntries()>0){
	loc.set(2,0,0); // 6,4000
	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ ind[s]=0; }
	for(Int_t i=0;i<richCatDirect->getEntries();i++){
	    HGeantRichDirect* grichdirLoc = (HGeantRichDirect* ) richCatDirect->getObject(i);
	    ind[grichdirLoc->getSector()]++;
	}
	for(Int_t i=0;i<richCatDirectLoc->getEntries();i++){
	    HGeantRichDirect* grichdirLoc = (HGeantRichDirect* ) richCatDirectLoc->getObject(i);
	    Int_t track  = grichdirLoc->getTrack();
	    Int_t nexhit = grichdirLoc->getNextHitIndex();
	    loc[0]       = grichdirLoc->getSector();
            loc[1]       = ind[loc[0]];
	    grichdir     = (HGeantRichDirect*) richCatDirect->getSlot(loc,&index); // new slot in target cat
	    grichdir     = new (grichdir) HGeantRichDirect(*grichdirLoc);             // copy local object to target cat
            ind[loc[0]]++;

	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    grichdir->setTrack         (track        +kineLastTr);
	    grichdir->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastRichDir + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(richCatMirrorLoc && richCatMirrorLoc->getEntries()>0){
       loc.set(2,0,0); // 6,4000
       Int_t ind[6] ;
       for(Int_t s=0;s<6;s++){ ind[s]=0; }
       for(Int_t i=0;i<richCatMirror->getEntries();i++){
	   HGeantRichMirror* grichmirLoc = (HGeantRichMirror* ) richCatMirror->getObject(i);
	   ind[grichmirLoc->getSector()]++;
       }
       for(Int_t i=0;i<richCatMirrorLoc->getEntries();i++){
	   HGeantRichMirror* grichmirLoc = (HGeantRichMirror* ) richCatMirrorLoc->getObject(i);
	   Int_t track  = grichmirLoc->getTrack();
	   Int_t nexhit = grichmirLoc->getNextHitIndex();
	   loc[0]       = grichmirLoc->getSector();
	   loc[1]       = ind[loc[0]];
	   grichmir     = (HGeantRichMirror*) richCatMirror->getSlot(loc,&index); // new slot in target cat
	   grichmir     = new (grichmir) HGeantRichMirror(*grichmirLoc);             // copy local object to target cat
	   ind[loc[0]]++;

	   //--------------------------------------------------
	   // shifting tracknumbers and indices
	   grichmir->setTrack         (track        +kineLastTr);
	   grichmir->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastRichMir + 1   : -1);
	   //--------------------------------------------------
       }
    }

    if(mdcCatLoc && mdcCatLoc->getEntries()>0){
	loc.set(4,0,0,0,0);
	Int_t ind[6][4][7] ;
	for(Int_t s=0;s<6;s++){
	    for(Int_t m=0;m<4;m++){
		for(Int_t l=0;l<7;l++){
		    ind[s][m][l]=0;
		}
	    }
	}
	for(Int_t i=0;i<mdcCat->getEntries();i++){
	    HGeantMdc* gmdcLoc = (HGeantMdc* ) mdcCat->getObject(i);
            loc[0] = gmdcLoc->getSector();
            loc[1] = gmdcLoc->getModule();
            loc[2] = gmdcLoc->getLayer();
	    ind[loc[0]][loc[1]][loc[2]]++;
	}

	for(Int_t i=0;i<mdcCatLoc->getEntries();i++){
	    HGeantMdc* gmdcLoc = (HGeantMdc* ) mdcCatLoc->getObject(i);
	    Int_t track   = gmdcLoc->getTrack();
	    Int_t nexhit  = gmdcLoc->getNextHitIndex();
            loc[0] = gmdcLoc->getSector();
            loc[1] = gmdcLoc->getModule();
            loc[2] = gmdcLoc->getLayer();
            loc[3] = ind[loc[0]][loc[1]][loc[2]];
	    gmdc          = (HGeantMdc*) mdcCat->getSlot(loc,&index); // new slot in target cat
	    gmdc          = new (gmdc) HGeantMdc(*gmdcLoc);           // copy local object to target cat
            ind[loc[0]][loc[1]][loc[2]]++;
	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    gmdc->setTrack         (track        +kineLastTr);
	    gmdc->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastMdc + 1   : -1);
	    //--------------------------------------------------
	}
    }



    if(tofCatLoc && tofCatLoc->getEntries()>0){
	loc.set(2,0,0); // 6,200
	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ind[s]=0;}
	for(Int_t i=0;i<tofCat->getEntries();i++){
	    HGeantTof* gtofLoc = (HGeantTof* ) tofCat->getObject(i);
            ind[(Int_t)gtofLoc->getSector()]++;
	}

	for(Int_t i=0;i<tofCatLoc->getEntries();i++){
	    HGeantTof* gtofLoc = (HGeantTof* ) tofCatLoc->getObject(i);
	    Int_t track  = gtofLoc->getTrack();
	    Int_t nexhit = gtofLoc->getNextHitIndex();
            loc[0]       = gtofLoc->getSector();
            loc[1]       = ind[loc[0]];
	    gtof         = (HGeantTof*) tofCat->getSlot(loc,&index); // new slot in target cat
	    gtof         = new (gtof) HGeantTof(*gtofLoc);           // copy local object to target cat
            ind[loc[0]]++;
	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    gtof->setTrack         (track        +kineLastTr);
	    gtof->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastTof + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(shrCatLoc && shrCatLoc->getEntries()>0){
	loc.set(2,0,0); // 6,600
	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ ind[s]=0; }
	for(Int_t i=0;i<shrCat->getEntries();i++){
	    HGeantShower* gshrLoc = (HGeantShower* ) shrCat->getObject(i);
	    ind[(Int_t)gshrLoc->getSector()]++;
	}

	for(Int_t i=0;i<shrCatLoc->getEntries();i++){
	    HGeantShower* gshrLoc = (HGeantShower* ) shrCatLoc->getObject(i);
	    Int_t track  = gshrLoc->getTrack();
	    Int_t nexhit = gshrLoc->getNextHitIndex();
            loc[0]       = gshrLoc->getSector();
            loc[1]       = ind[loc[0]];
	    gshr         = (HGeantShower*) shrCat->getSlot(loc,&index); // new slot in target cat
	    gshr         = new (gshr) HGeantShower(*gshrLoc);           // copy local object to target cat
            ind[loc[0]]++;
	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    gshr->setTrack         (track        +kineLastTr);
	    gshr->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastShr + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(rpcCatLoc && rpcCatLoc->getEntries()>0){
	loc.set(2,0,0); // 6,2500

	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ind[s]=0;}
	for(Int_t i=0;i<rpcCat->getEntries();i++){
	    HGeantRpc* grpcLoc = (HGeantRpc* ) rpcCat->getObject(i);
            ind[grpcLoc->getSector()]++;
	}
	for(Int_t i=0;i<rpcCatLoc->getEntries();i++){
	    HGeantRpc* grpcLoc = (HGeantRpc* ) rpcCatLoc->getObject(i);
	    Int_t track  = grpcLoc->getTrack();
	    Int_t nexhit = grpcLoc->getNextHitIndex();
            loc[0]       = grpcLoc->getSector();
            loc[1]       = ind[loc[0]];
	    grpc         = (HGeantRpc*) rpcCat->getSlot(loc,&index); // new slot in target cat
	    grpc         = new (grpc) HGeantRpc(*grpcLoc);           // copy local object to target cat
	    ind[loc[0]]++;

	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    grpc->setTrack         (track        +kineLastTr);
	    grpc->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastRpc + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(wallCatLoc && wallCatLoc->getEntries()>0){
        loc.set(0);
	for(Int_t i=0;i<wallCatLoc->getEntries();i++){
	    HGeantWall* gwallLoc = (HGeantWall* ) wallCatLoc->getObject(i);
	    Int_t track  = gwallLoc->getTrack();
	    Int_t nexhit = gwallLoc->getNextHitIndex();
	    gwall        = (HGeantWall*) wallCat->getNewSlot(loc,&index); // new slot in target cat
	    gwall        = new (gwall) HGeantWall(*gwallLoc);             // copy local object to target cat

	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    gwall->setTrack         (track        +kineLastTr);
	    gwall->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastWall + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(startCatLoc && startCatLoc->getEntries()>0){
	loc.set(0);
	for(Int_t i=0;i<startCatLoc->getEntries();i++){
	    HGeantStart* gstartLoc = (HGeantStart* ) startCatLoc->getObject(i);
	    Int_t track  = gstartLoc->getTrack();
	    Int_t nexhit = gstartLoc->getNextHitIndex();
	    gstart       = (HGeantStart*) startCat->getNewSlot(loc,&index); // new slot in target cat
	    gstart       = new (gstart) HGeantStart(*gstartLoc);            // copy local object to target cat

	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    gstart->setTrack         (track        +kineLastTr);
	    gstart->setNextHitIndex  ((nexhit>-1)  ? nexhit  + lastStart + 1   : -1);
	    //--------------------------------------------------
	}
    }
    if(emcCatLoc && emcCatLoc->getEntries()>0){
	loc.set(2,0,0); // 6,2500
	Int_t ind[6] ;
	for(Int_t s=0;s<6;s++){ind[s]=0;}
	for(Int_t i=0;i<emcCat->getEntries();i++){
	    HGeantEmc* gemcLoc = (HGeantEmc* ) emcCat->getObject(i);
	    ind[gemcLoc->getSector()]++;
	}

	for(Int_t i=0;i<emcCatLoc->getEntries();i++){
	    HGeantEmc* gemcLoc = (HGeantEmc* ) emcCatLoc->getObject(i);
	    Int_t track  = gemcLoc->getTrack();
	    Int_t nexhit = gemcLoc->getNextHitIndex();
            loc[0]       = gemcLoc->getSector();
            loc[1]       = ind[loc[0]];
	    gemc         = (HGeantEmc*) emcCat->getNewSlot(loc,&index); // new slot in target cat
	    gemc         = new (gemc) HGeantEmc(*gemcLoc);              // copy local object to target cat
	    ind[loc[0]]++;

	    //--------------------------------------------------
	    // shifting tracknumbers and indices
	    if(track>0) gemc->setTrack (track        +kineLastTr);  // special track Num -777 in Ecal shold not be shifted
	    gemc->setNextHitIndex      ((nexhit>-1)  ? nexhit  + lastEmc + 1   : -1);
	    //--------------------------------------------------
	}
    }

}



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