ROOT logo
#include "AliMFTCluster.h"
#include "TFile.h"
#include "AliMFTCluster.h"
#include "TObjArray.h"
#include "TClonesArray.h"
#include "TTree.h"
#include "AliMFTConstants.h"
#include "TBranch.h"
#include "TRandom.h"
#include "TMath.h"

TFile *fileInPileUp=0, *fileInSignal, *fileInUnderlying, *fileOutPileUp=0, *fileOutTotal;

enum {kMergePileUpClusters_pp, kMergePileUpClusters_PbPb, kMergeAllClusters_pp, kMergeAllClusters_PbPb};
enum {k_pp, k_PbPb};

const Char_t *fPileUpDir[2] = {"$UnderlyingDirPP/spreadVtx",      // local directory with pile-up event p-p
			       "$UnderlyingDirPbPb/spreadVtx"};   // local directory with pile-up event Pb-Pb

const Int_t fNRunsPileUp_pp   = 100;
const Int_t fNRunsPileUp_PbPb =   3;

const Int_t fNRunsPileUpAvailable[2] = {500, 500};    // pp, PbPb

TClonesArray *fRecPointsPerPlaneIn[AliMFTConstants::fNMaxPlanes] = {0};
TClonesArray *fRecPointsPerPlaneOut[AliMFTConstants::fNMaxPlanes] = {0};

void MergePileUpClusters(Int_t *runs, Int_t nRunsPileUp, const Char_t *pileUpDir, Int_t nEvents);
void MergeAllClusters();
			       
//====================================================================================================================================================

void MergeClustersMFT(Int_t seed = 12345,
		      Int_t option = 9999,
		      Int_t nEvents = 9999,
		      Int_t maxPileUp = 9999) {
  
  gRandom->SetSeed(seed);

  if (option==kMergePileUpClusters_pp) {

    Int_t runs_pp[fNRunsPileUp_pp] = {0};
    Int_t nFiles_pp = 0;
    while (nFiles_pp<TMath::Min(fNRunsPileUp_pp,maxPileUp)) {
      Int_t run = gRandom->Integer(fNRunsPileUpAvailable[k_pp]);
      fileInPileUp = new TFile(Form("%s/run_%d/MFT.RecPoints.MCShifted.root",fPileUpDir[k_pp],run));
      if (!fileInPileUp->IsOpen() || !fileInPileUp->cd("Event0")) {
	delete fileInPileUp;
	continue;
      }
      Bool_t runAlreadyLoaded=kFALSE;
      for (Int_t iAddedRun=0; iAddedRun<nFiles_pp; iAddedRun++) {
	if (run==runs_pp[iAddedRun]) {
	  runAlreadyLoaded=kTRUE;
	  break;
	}
      }
      if (!runAlreadyLoaded) runs_pp[nFiles_pp++] = run;
      delete fileInPileUp;
    }
    MergePileUpClusters(runs_pp, TMath::Min(fNRunsPileUp_pp,maxPileUp), fPileUpDir[k_pp], nEvents);
  }
    
  else if (option==kMergePileUpClusters_PbPb) {
    Int_t runs_PbPb[fNRunsPileUp_PbPb] = {0};
    Int_t nFiles_PbPb = 0;
    while (nFiles_PbPb<TMath::Min(fNRunsPileUp_PbPb,maxPileUp)) {
      Int_t run = gRandom->Integer(fNRunsPileUpAvailable[k_PbPb]);
      fileInPileUp = new TFile(Form("%s/run_%d/MFT.RecPoints.MCShifted.root",fPileUpDir[k_PbPb],run));
      if (!fileInPileUp->IsOpen() || !fileInPileUp->cd("Event0")) {
	delete fileInPileUp;
	continue;
      }
      Bool_t runAlreadyLoaded=kFALSE;
      for (Int_t iAddedRun=0; iAddedRun<nFiles_PbPb; iAddedRun++) {
	if (run==runs_PbPb[iAddedRun]) {
	  runAlreadyLoaded=kTRUE;
	  break;
	}
      }
      if (!runAlreadyLoaded) runs_PbPb[nFiles_PbPb++] = run;
      delete fileInPileUp;
    }
    MergePileUpClusters(runs_PbPb, TMath::Min(fNRunsPileUp_PbPb,maxPileUp), fPileUpDir[k_PbPb], nEvents);
  }

  if (option>=kMergeAllClusters_pp) MergeAllClusters();

}

//====================================================================================================================================================

void MergePileUpClusters(Int_t *runs, Int_t nRunsPileUp, const Char_t *pileUpDir, Int_t nEvents) {

  fileOutPileUp = new TFile("./MFT.RecPoints.PileUp.root", "recreate");
    
  Bool_t eventExist = kTRUE;
  Int_t iEv=0;

  while (eventExist && iEv<nEvents) {

    for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) {
      fRecPointsPerPlaneOut[iPlane] = new TClonesArray("AliMFTCluster");
    }

    if (iEv) fileOutPileUp = new TFile("./MFT.RecPoints.PileUp.root", "update");

    printf("Merging Event %d\n",iEv);
    
    fileOutPileUp-> cd();
    TTree *treeOutPileUp = new TTree("TreeR_OutPileUp", "Reconstructed Points Container");

    Int_t nFilesAdded = 0;
    while (nFilesAdded<nRunsPileUp) {
      fileInPileUp = new TFile(Form("%s/run_%d/MFT.RecPoints.MCShifted.root",pileUpDir,runs[nFilesAdded++]));
      printf("Merging file %s\n", fileInPileUp->GetName());
      if (!fileInPileUp->cd(Form("Event%d",iEv))) {
	eventExist = kFALSE;
	break;
      }
      for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) {
	fRecPointsPerPlaneIn[iPlane] = new TClonesArray("AliMFTCluster");
      }
      TTree *treeInPileUp = (TTree*) gDirectory->Get("TreeR");
      treeInPileUp -> SetName("TreeR_InPileUp");
      Int_t iPlane=0;
      while (treeInPileUp->GetBranch(Form("Plane_%02d",iPlane))) {
	//	printf("Plane %02d\n",iPlane);
	treeInPileUp ->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneIn[iPlane]));
	TBranch *branch = treeOutPileUp->GetBranch(Form("Plane_%02d",iPlane));
	if (!branch) treeOutPileUp->Branch(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane])); 
	iPlane++;
      }
      iPlane=0;
      treeInPileUp -> GetEntry(0);
      while (treeInPileUp->GetBranch(Form("Plane_%02d",iPlane))) {
	Int_t nClusters = fRecPointsPerPlaneIn[iPlane]->GetEntries();
	for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	  //	  printf("Cluster %4d\n",iCluster);
	  AliMFTCluster *newCluster = (AliMFTCluster*) fRecPointsPerPlaneIn[iPlane]->At(iCluster);
	  new ((*fRecPointsPerPlaneOut[iPlane])[fRecPointsPerPlaneOut[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
	}
	iPlane++;
      }
      for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
	delete fRecPointsPerPlaneIn[jPlane];
      }
      delete treeInPileUp;
      fileInPileUp -> Close();
      delete fileInPileUp;
    }
    if (eventExist) {
      treeOutPileUp -> Fill();
      fileOutPileUp -> mkdir(Form("Event%d",iEv));
      fileOutPileUp -> cd(Form("Event%d",iEv));
      treeOutPileUp -> SetName("TreeR");
      treeOutPileUp -> Write();
      delete treeOutPileUp;
      fileOutPileUp -> Close();
      delete fileOutPileUp;
      for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) {
	delete fRecPointsPerPlaneOut[iPlane];
      }
      iEv++;
    }
  }  

}

//====================================================================================================================================================

void MergeAllClusters() {

  fileOutTotal = new TFile("./MFT.RecPoints.root", "recreate");
    
  Bool_t eventExist = kTRUE;
  Int_t iEv=0;

  while (eventExist) {

    for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) {
      fRecPointsPerPlaneOut[iPlane] = new TClonesArray("AliMFTCluster");
    }

    if (iEv) fileOutTotal = new TFile("./MFT.RecPoints.root", "update");

    printf("Merging Event %d\n",iEv);
    
    fileOutTotal-> cd();
    TTree *treeOutTotal = new TTree("TreeR_Out", "Reconstructed Points Container");

    // Adding Pile-Up Clusters

    fileInPileUp = new TFile("./MFT.RecPoints.PileUp.root");
    printf("Merging file %s\n", fileInPileUp->GetName());
    if (!fileInPileUp->cd(Form("Event%d",iEv))) {
      eventExist = kFALSE;
      break;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      fRecPointsPerPlaneIn[jPlane] = new TClonesArray("AliMFTCluster");
    }
    TTree *treeInPileUp = (TTree*) gDirectory->Get("TreeR");
    treeInPileUp -> SetName("TreeR_InPileUp");
    Int_t iPlane=0;
    while (treeInPileUp->GetBranch(Form("Plane_%02d",iPlane))) {
      //	printf("Plane %02d\n",iPlane);
      treeInPileUp ->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneIn[iPlane]));
      TBranch *branch = treeOutTotal->GetBranch(Form("Plane_%02d",iPlane));
      if (!branch) treeOutTotal->Branch(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane])); 
      iPlane++;
    }
    iPlane=0;
    treeInPileUp -> GetEntry(0);
    while (treeInPileUp->GetBranch(Form("Plane_%02d",iPlane))) {
      Int_t nClusters = fRecPointsPerPlaneIn[iPlane]->GetEntries();
      for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	//	  printf("Cluster %4d\n",iCluster);
	AliMFTCluster *newCluster = (AliMFTCluster*) fRecPointsPerPlaneIn[iPlane]->At(iCluster);
	new ((*fRecPointsPerPlaneOut[iPlane])[fRecPointsPerPlaneOut[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
      }
      iPlane++;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      delete fRecPointsPerPlaneIn[jPlane];
    }
    delete treeInPileUp;
    fileInPileUp -> Close();
    delete fileInPileUp;

    // Adding Underlying Event Clusters

    fileInUnderlying = new TFile("./MFT.RecPoints.Underlying.root");
    printf("Merging file %s\n", fileInUnderlying->GetName());
    if (!fileInUnderlying->cd(Form("Event%d",iEv))) {
      eventExist = kFALSE;
      break;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      fRecPointsPerPlaneIn[jPlane] = new TClonesArray("AliMFTCluster");
    }
    TTree *treeInUnderlying = (TTree*) gDirectory->Get("TreeR");
    treeInUnderlying -> SetName("TreeR_InUnderlying");
    iPlane=0;
    while (treeInUnderlying->GetBranch(Form("Plane_%02d",iPlane))) {
      //	printf("Plane %02d\n",iPlane);
      treeInUnderlying ->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneIn[iPlane]));
      TBranch *branch = treeOutTotal->GetBranch(Form("Plane_%02d",iPlane));
      if (!branch) treeOutTotal->Branch(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane])); 
      iPlane++;
    }
    iPlane=0;
    treeInUnderlying -> GetEntry(0);
    while (treeInUnderlying->GetBranch(Form("Plane_%02d",iPlane))) {
      Int_t nClusters = fRecPointsPerPlaneIn[iPlane]->GetEntries();
      for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	//	  printf("Cluster %4d\n",iCluster);
	AliMFTCluster *newCluster = (AliMFTCluster*) fRecPointsPerPlaneIn[iPlane]->At(iCluster);
	new ((*fRecPointsPerPlaneOut[iPlane])[fRecPointsPerPlaneOut[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
      }
      iPlane++;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      delete fRecPointsPerPlaneIn[jPlane];
    }
    delete treeInUnderlying;
    fileInUnderlying -> Close();
    delete fileInUnderlying;

    // Adding Signal Clusters

    fileInSignal = new TFile("./MFT.RecPoints.Signal.root");
    printf("Merging file %s\n", fileInSignal->GetName());
    if (!fileInSignal->cd(Form("Event%d",iEv))) {
      eventExist = kFALSE;
      break;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      fRecPointsPerPlaneIn[jPlane] = new TClonesArray("AliMFTCluster");
    }
    TTree *treeInSignal = (TTree*) gDirectory->Get("TreeR");
    treeInSignal -> SetName("TreeR_InSignal");
    iPlane=0;
    while (treeInSignal->GetBranch(Form("Plane_%02d",iPlane))) {
      //	printf("Plane %02d\n",iPlane);
      treeInSignal ->SetBranchAddress(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneIn[iPlane]));
      TBranch *branch = treeOutTotal->GetBranch(Form("Plane_%02d",iPlane));
      if (!branch) treeOutTotal->Branch(Form("Plane_%02d",iPlane), &(fRecPointsPerPlaneOut[iPlane])); 
      iPlane++;
    }
    iPlane=0;
    treeInSignal -> GetEntry(0);
    while (treeInSignal->GetBranch(Form("Plane_%02d",iPlane))) {
      Int_t nClusters = fRecPointsPerPlaneIn[iPlane]->GetEntries();
      for (Int_t iCluster=0; iCluster<nClusters; iCluster++) {
	//	  printf("Cluster %4d\n",iCluster);
	AliMFTCluster *newCluster = (AliMFTCluster*) fRecPointsPerPlaneIn[iPlane]->At(iCluster);
	new ((*fRecPointsPerPlaneOut[iPlane])[fRecPointsPerPlaneOut[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
      }
      iPlane++;
    }
    for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
      delete fRecPointsPerPlaneIn[jPlane];
    }
    delete treeInSignal;
    fileInSignal -> Close();
    delete fileInSignal;

    if (eventExist) {
      treeOutTotal -> Fill();
      fileOutTotal -> mkdir(Form("Event%d",iEv));
      fileOutTotal -> cd(Form("Event%d",iEv));
      treeOutTotal -> SetName("TreeR");
      treeOutTotal -> Write();
      delete treeOutTotal;
      fileOutTotal -> Close();
      delete fileOutTotal;
      for (Int_t jPlane=0; jPlane<AliMFTConstants::fNMaxPlanes; jPlane++) {
	delete fRecPointsPerPlaneOut[jPlane];
      }
      iEv++;
    }

  }   

}

//====================================================================================================================================================

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