ROOT logo
#include "htofclusterf.h"
#include "htofcluster.h"
#include "hades.h"
#include "htofhit.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hdebug.h"
#include "tofdef.h"
#include "hevent.h"
#include "heventheader.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hgeomtransform.h"
#include "htofgeompar.h"
#include "hdetgeompar.h"
#include "hgeomvector.h"
#include "hspecgeompar.h"
#include "htofclusterfpar.h"
#include "TMath.h"
#include <cstring>

//*-- Author :  1/12/2001 D.Zovinec
//*-- Modified: 06/03/2002 D.Zovinec
//*-- Modified: 23/09/2002 D.Zovinec

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////////////
// HTofClusterF Tof cluster finder
//
// Iterates over the hit level of Tof data and finds a cluster-candidates.
// The cluster-candidate is constructed from set of hits when the following
// binary conditions are satisfied for each pair of hits consecutively
// read from HTofHit based category:
//
// 1.) the hits are close to each other (same sector, adjacent rod)
// 2.) time difference of two hits is less than value taken from HTofClusterFPar
// 3.) xposition difference (in module coordinate system) of two hits is
//     less than value taken from HTofClusterFPar
//
// Above binary conditions construct the chain of clustered hits
// from which the output information stored in the HTofCluster category
// is calculated.
//
// The data members inherited from HTofHit class, i.e. tof, xpos, xposAdc,
// lAmp, rAmp, xlab, ylab, zlab is calculated for the cluster here as a weighted
// mean of values appropriate to individual hits participating on cluster-candidate.
// The weight is energy deposited in the rod, i.e. edep.
// The edep of the cluster is sum of the edep's of hits.
// The flagAdc is 2 when all flagAdc flags of appropriate hits
// participating on cluster are = 2. In opposite case flagAdc = 0.
//
// !!! Important: Since the tof rod coordinate systems are shifted each
//                other the weighted mean results concerning xpos data member
//                would be wrong as it is evaluated in HTofHit relative to this
//                reference system. Therefore the appropriate HTofCluster data
//                member is evaluated from the position of individual hits
//                relative to module reference system. The result stored in
//                the HTofCluster is thus given also in module reference system.
//                Therefore do not combine the xpos from HTofHit and HTofCluster
//                objects without appropriate transformation.
//
// Additional data member is evaluated, i.e. cluster-candidate size
// (clustSize see HTofCluster)  that is defined as the number of the hits
// participating on cluster-candidate.
//
// "Simple" hits are also included in the output as the cluster-candidates
// with clustSize = 1.
//
// The probability function for the cluster-candidates of clustSize = 2 with
// tof < tLimit is calculated by using energy deposited of the cluster-candidate.
// Two probability numbers are thus provided, i.e. clustProbAll for
// cluster-candidates related to all ToF hits and clustProbLep for those
// cluster-candidates related to ToF-RICH correlated hits (leptons).
// Both the probability numbers depend on the parameters stored in
// parameter container HTofClusterFPar.
//
//////////////////////////////////////////////////////////////////////////////////////

HTofClusterF::HTofClusterF(void) {
  fHitCat = fClusterCat = NULL;
  fLoc.set(3,0,0,0);
  fpLoc.set(3,0,0,0);
  fCLoc.set(3,0,0,0);
  iterh = NULL;
  iterc = NULL;
}

HTofClusterF::HTofClusterF(const Text_t *name,const Text_t *title) : HReconstructor (name,title) {
  fHitCat = fClusterCat = NULL;
  fLoc.set(3,0,0,0);
  fpLoc.set(3,0,0,0);
  fCLoc.set(3,0,0,0);
  iterh = NULL;
  iterc = NULL;
}

HTofClusterF::~HTofClusterF(void) {
  if(iterh) delete iterh;
  if(iterc) delete iterc;
}

Int_t HTofClusterF::execute(void) {

#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HTofClusterF::execute");
#endif

  Float_t maxTd, maxXd;

  cluster=NULL;
  hit=NULL;
  fpLoc[0] = -1;
  fpLoc[1] = -1;
  fpLoc[2] = -1;
  size_c=1;
  indexHit1=-1;
  indexHit2=-1;

  tof_ph     =0; // in first loop this value has to have default value!
  xposMod_ph =0; // in first loop this value has to have default value!
  iterh->Reset();
  while ( (hit=(HTofHit *)iterh->Next())!=NULL) {
    readHit();
    maxTd=fClusterFPar->getMaxTDiff();
    maxXd=fClusterFPar->getMaxXDiff();
    absTd_h=TMath::Abs(tof_h-tof_ph);
    absXd_h=TMath::Abs(xposMod_h-xposMod_ph);

    if((fLoc[0] == fpLoc[0])&&
       (((fLoc[1]*8)+fLoc[2])==((fpLoc[1]*8)+fpLoc[2]+1))&&
       (absTd_h < maxTd)&&
       (absXd_h < maxXd)){
      if(size_c==1){  // If cluster has been found its location is identical with 1st hit in cluster.
        fCLoc[0]=fpLoc[0];
        fCLoc[1]=fpLoc[1];
	fCLoc[2]=fpLoc[2];

	indexHit1 = fHitCat->getIndex(fpLoc);
        indexHit2 = fHitCat->getIndex(fLoc);


      }
      calcWeightedMean();
      size_c++;
    } else {
      if(size_c > 1){
        writeCluster(1);
      }
      writeCluster(0);
      size_c=1;
      fillClusterData();
    }
    fillPreviousData();
  }
  // if the last hit sentence was cluster than store it
  if(size_c>1){
    writeCluster(1);
  }
  writeProb();

#if DEBUG_LEVEL>2
  gDebuger->leaveFunc("HTofClusterF::execute");
#endif
  return 0;
}

void HTofClusterF::writeProb(void){
// Call the function
// Float_t HTofClusterF::calcProb(Float_t edep, Char_t* aset)
// that calculates probability to be a cluster for cluster-candidates
// of size = 2 and tof < mipLimit stored in HTofClusterFPar.
// Default probabilitites are delivered in this version for
// cluster-candidates of size = 2 that are not in MIP region.
//   clustProbAll = 0.896
//   clustProbLep = 0.948
// The numbers have been evaluated from the simulation.
// Probability is 1 when cluster-candidate size = 1.
// Probability is -1 when cluster-candidate size > 2.
// Probability is -1 when (cluster-candidate size = 2) & (flagAdc != 2)
//

  Float_t probAll_c, probLep_c, dist_c, tofcorr_c, tlimit;

  tlimit=fClusterFPar->getMIPLimit();
  iterc->Reset();
  while ((cluster=(HTofCluster *)iterc->Next())!=NULL) {
    probAll_c=-1.0;
    probLep_c=-1.0;
    size_c=cluster->getClusterSize();
    flagAdc_c=cluster->getAdcFlag();
    if(size_c==1){
      probAll_c=1.0;
      probLep_c=1.0;
    }
    if((size_c==2)&&(flagAdc_c==2)){
      tof_c=cluster->getTof();
      cluster->getDistance(dist_c);
      tofcorr_c = tof_c - (dist_c-2098.5472)/299.792458; // correction on different distances.
      if(tofcorr_c<tlimit){
        edep_c=cluster->getEdep();
        probAll_c=calcProb(edep_c,"all");
        probLep_c=calcProb(edep_c,"lep");
      } else {
        probAll_c=0.896; // hardwired default number from sim
        probLep_c=0.948; // hardwired default number from sim
      }
    }
    cluster->setClusterProbAll(probAll_c);
    cluster->setClusterProbLep(probLep_c);
  }
}

Float_t HTofClusterF::calcProb(Float_t edep,const  Char_t* aset) {
// Calculates the probability for the cluster-candidates of clustSize = 2
// with tof < mipLimit parameter of HTofClusterFPar.
// The probability is evaluated from the energy deposited in the
// cluster-candidate. Evaluation is based on idea that two hits
// caused by two MIP will deposit energy = 2 in ADC calibrated
// spectrum while in case of one incident MIP causing two hits
// the energy deposited is = 1.
// Two probability numbers are stored in the HTofCluster,
// i.e. clustProbAll (evaluated for all hits in ToF)
// and clustProbLep (evaluated for ToF-RICH correlated hits).
// Both the probability numbers depend on the parameters stored
// in HTofClusterFPar that is used here as input.
//

  Float_t sL1=0.0, mL1=0.0, sL2=0.0, mL2=0.0, ratC=0.0, prob;

  if(strncmp(aset,"all",strlen(aset)) == 0){
    sL1=fClusterFPar->getSigma1("all");
    mL1=fClusterFPar->getMPV1("all");
    sL2=fClusterFPar->getSigma2("all");
    mL2=fClusterFPar->getMPV2("all");
    ratC=fClusterFPar->getConstRatio("all");
  }
  if(strncmp(aset,"lep",strlen(aset)) == 0){
    sL1=fClusterFPar->getSigma1("lep");
    mL1=fClusterFPar->getMPV1("lep");
    sL2=fClusterFPar->getSigma2("lep");
    mL2=fClusterFPar->getMPV2("lep");
    ratC=fClusterFPar->getConstRatio("lep");
  }

  if((TMath::Landau(edep,mL1,sL1))!=0.0){
    prob=(1.0/(1.0+ratC*((TMath::Landau(edep,mL2,sL2))/(TMath::Landau(edep,mL1,sL1)))));
  } else {
    prob=0.0;
  }

  return prob;
}

void HTofClusterF::readHit(void) {
// Auxiliary function.
// It reads data from HTofHit based category.
//

  HGeomVector  vecRod, vecMod;

  fLoc[0]=hit->getSector();
  fLoc[1]=hit->getModule();
  fLoc[2]=hit->getCell();

  tof_h=hit->getTof();
  flagAdc_h=hit->getAdcFlag();

  HModGeomPar *module=fTofGeometry->getModule(fLoc[0],fLoc[1]);
  HGeomVolume *rodVol=module->getRefVolume()->getComponent(fLoc[2]);
  HGeomTransform &rodTrans=rodVol->getTransform();
  vecRod.setXYZ((hit->getXpos()),0.0,0.0);
  vecMod=rodTrans.transFrom(vecRod);
  xposMod_h=vecMod.getX();

  if(flagAdc_h==2){
    vecRod.setXYZ((hit->getXposAdc()),0.0,0.0);
    vecMod=rodTrans.transFrom(vecRod);
    xposModAdc_h=vecMod.getX();
  } else {
    xposModAdc_h=0.0;
  }
  hit->getXYZLab(xlab_h, ylab_h, zlab_h);
  edep_h=hit->getEdep();
  lAmp_h=hit->getLeftAmp();
  rAmp_h=hit->getRightAmp();
}

void HTofClusterF::writeCluster(Int_t mode) {
// Auxiliary function.
// It stores the date into the HTofCluster based category.
//

  if(mode==0){
    Float_t phi_h, theta_h, distance_h;
    hit->getPhi(phi_h);
    hit->getTheta(theta_h);
    hit->getDistance(distance_h);
    cluster = (HTofCluster *)fClusterCat->getSlot(fLoc);
    if(cluster){
      cluster = new(cluster) HTofCluster;
      cluster->setSector(fLoc[0]);
      cluster->setModule(fLoc[1]);
      cluster->setCell(fLoc[2]);
      cluster->setTof(tof_h);
      cluster->setXpos(xposMod_h);
      cluster->setXposAdc(xposModAdc_h);
      cluster->setEdep(edep_h);
      cluster->setLeftAmp(lAmp_h);
      cluster->setRightAmp(rAmp_h);
      cluster->setXYZLab(xlab_h, ylab_h, zlab_h);
      cluster->setDistance(distance_h);
      cluster->setTheta(theta_h);
      cluster->setPhi(phi_h);
      cluster->setClusterSize(1);
      cluster->setAdcFlag(flagAdc_h);
      cluster->setIndexHit2(-1);
    }
  }

  if(mode==1){
    HGeomVector r;
    Float_t distance_c, theta_c, phi_c;
    Float_t rad2deg = 180./TMath::Pi();

    r.setX(xlab_c);
    r.setY(ylab_c);
    r.setZ(zlab_c);
    distance_c = r.length();
    theta_c = (distance_c>0.) ? (rad2deg * TMath::ACos(r.getZ() / distance_c)) : 0.;
    phi_c = rad2deg * TMath::ATan2( r.getY(), r.getX());
    if (phi_c < 0.) phi_c += 360.;

    cluster = (HTofCluster *)fClusterCat->getSlot(fCLoc);

    HTofHit* hit1 = (HTofHit*)fHitCat->getObject(indexHit1);
    HTofHit* hit2 = (HTofHit*)fHitCat->getObject(indexHit2);
    if( (hit1 && hit2) &&
       (
	( hit1->getSector()!=hit2->getSector() )
	||
	( hit1->getModule()*8 + hit1->getCell() + 1 !=  hit2->getModule()*8 + hit2->getCell() )
	||
	( hit1->getSector()!= fCLoc[0])
	||
	( hit1->getModule()*8 + hit1->getCell() != fCLoc[1]*8+fCLoc[2])

       )
      )
    {
	cout<<"Error: HTofClusterF::writeCluster() : cluster does not match ! index "<<indexHit1<<" "<<indexHit2
	    <<" sec "<< (Int_t)hit1->getSector() << " "<<(Int_t) hit1->getSector()
	    <<" cell "<< hit1->getModule()*8 + hit1->getCell() << " "<< hit2->getModule()*8 + hit2->getCell()
	    <<" clus "<<fCLoc[0]<<" "<<fCLoc[1]*8+fCLoc[2]
	    <<endl;
    }


    if(cluster){
      cluster = new(cluster) HTofCluster;
      cluster->setSector(fCLoc[0]);
      cluster->setModule(fCLoc[1]);
      cluster->setCell(fCLoc[2]);
      cluster->setTof(tof_c);
      cluster->setXpos(xposMod_c);
      cluster->setXposAdc(xposModAdc_c);
      cluster->setEdep(edep_c);
      cluster->setLeftAmp(lAmp_c);
      cluster->setRightAmp(rAmp_c);
      cluster->setXYZLab(xlab_c, ylab_c, zlab_c);
      cluster->setDistance(distance_c);
      cluster->setTheta(theta_c);
      cluster->setPhi(phi_c);
      cluster->setClusterSize(size_c);
      cluster->setAdcFlag(flagAdc_c);
      cluster->setIndexHit2(indexHit2);
    }
  }
  if((mode!=0) && (mode!=1)){
    Warning("writeCluster","wrong scenario of cluster writing has been chosen !!!\ncluster not written!!!\n");
  }
}

void HTofClusterF::calcWeightedMean() {
// Auxiliary function.
// Calculates weighted mean.

    Float_t w1, w2;
    if((edep_c != 0.0) && (edep_h != 0.0)) {
      w1=edep_c;
      w2=edep_h;
      edep_c=edep_c+edep_h;
    } else {
      w1=1.0;
      w2=1.0;
    }

    tof_c=((tof_c*w1)+(tof_h*w2))/(w1+w2);
    xposMod_c=((xposMod_c*w1)+(xposMod_h*w2))/(w1+w2);
    xposModAdc_c=((xposModAdc_c*w1)+(xposModAdc_h*w2))/(w1+w2);
    lAmp_c=((lAmp_c*w1)+(lAmp_h*w2))/(w1+w2);
    rAmp_c=((rAmp_c*w1)+(rAmp_h*w2))/(w1+w2);
    xlab_c=((xlab_c*w1)+(xlab_h*w2))/(w1+w2);
    ylab_c=((ylab_c*w1)+(ylab_h*w2))/(w1+w2);
    zlab_c=((zlab_c*w1)+(zlab_h*w2))/(w1+w2);
    if((flagAdc_c==2)&&(flagAdc_h==2)) flagAdc_c=2;
    else flagAdc_c=0;
}

void HTofClusterF::fillPreviousData(void) {
// Auxiliary function.
//

  fpLoc=fLoc;
  tof_ph=tof_h;
  xposMod_ph=xposMod_h;
}

void HTofClusterF::fillClusterData(void) {
// Auxiliary function.
//

  tof_c=tof_h;
  xposMod_c=xposMod_h;
  xposModAdc_c=xposModAdc_h;
  edep_c=edep_h;
  lAmp_c=lAmp_h;
  rAmp_c=rAmp_h;
  xlab_c=xlab_h;
  ylab_c=ylab_h;
  zlab_c=zlab_h;
  flagAdc_c=flagAdc_h;
}

void HTofClusterF::initParContainer(HSpectrometer *spec, HRuntimeDb *rtdb) {
  // Adds to the runtime database "rtdb" the containers needed by the Cluster Finder
  //spec is used to get information of the spectrometer setup.

  fTofGeometry=(HTofGeomPar *)rtdb->getContainer("TofGeomPar");
  fClusterFPar=(HTofClusterFPar *)rtdb->getContainer("TofClusterFPar");
}

Bool_t HTofClusterF::init(void) {
  Bool_t r=kTRUE; // Function's return value
  HSpectrometer *spec = gHades->getSetup();
  HRuntimeDb *rtdb = gHades->getRuntimeDb();
  HEvent *ev = gHades->getCurrentEvent(); // Event structure

  if (spec && rtdb && ev) {
    HDetector *tof = spec->getDetector("Tof");

    if (tof) {
      // Parameter containers initialization.
      initParContainer(spec,rtdb);

      fHitCat = ev->getCategory(catTofHit);
      if (!fHitCat) {
        fHitCat = tof->buildCategory(catTofHit);
        if (!fHitCat) return kFALSE;
        else ev->addCategory(catTofHit,fHitCat,"Tof");
      }
      iterh=(HIterator*)fHitCat->MakeIterator("native");

      fClusterCat = ev->getCategory(catTofCluster);
      if (!fClusterCat) {
        fClusterCat = tof->buildCategory(catTofCluster);
        if (!fClusterCat) return kFALSE;
        else ev->addCategory(catTofCluster,fClusterCat,"Tof");
      }
      iterc=(HIterator*)fClusterCat->MakeIterator("native");
    } else {
      Error("init","TOF setup is not defined");
      r = kFALSE; // Notify error to task manager
    }
  } else {
    Error("init","Setup, RuntimeDb or Event structure not found");
    r = kFALSE; // Notify error to task manager
  }
  return r;
}

ClassImp(HTofClusterF)











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