ROOT logo
//*-- AUTHOR : Vladimir Pechenov
//*-- Modified : 08/02/2007 by V.Pechenov
//*-- Modified : 05/06/2002 by V.Pechenov
//*-- Modified : 30/05/2001 by V.Pechenov
//*-- Modified : 7/11/2000 by V.Pechenov


//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
// HMdcClusSim
//
// Data object for Mdc cluster.
//
//  Int_t getTrackIndex(Int_t tr) - return geant track "tr" index
//      in listTr[5] array or -1 if there no track "tr" in the array.
//
// Int_t getNTracks() - num. of tracks which have hits in cluster
//      (5 tracks maximum) (noise don't increase tracks counter)
//
// Int_t getTrack(Int_t indx) - return track number.
//      indx= 0, ..., (getNTracks()-1).
//      List of tracks is sorted: first track (indx=0) 
//      have most number of hits, ...
//      Track_number==-9 - wires produced due to geant bug
//      Track_number==gHades->getEmbeddingRealTrackId() -
//          real track embeded in simulation.
//
// Int_t getNoiseIndex(void) - return index of noise wires inf.
//      if index < 0 - no noise in cluster.
//      Track number for noise wires =-99
//      Example:
//      Int_t ind = clus->getNoiseIndex();
//      if(ind>0) {
//        clus->getTrack(ind);         // will return -99
//        clus->getNTimesInTrack(ind); // number of noise wires
//        ...
//      }
//
// Short_t getNTimesInTrack(Int_t indx) - num. of hits
//      in cluster from track getTrack(indx)
//
// Int_t getNLayersInTrack(Int_t indx, Int_t m=-1) num. layers 
//      with hits from track getTrack(indx):
//      m=0 - in first module of segment,
//      m=1 - in second module of segment,
//      m!=0 && m!=1 - in segment
//
// Track num.=-99 - noise wires
// Track num.=-9  - GEANT bug
//
//
// Meaning of trackStatus[tr] bits:
// ------------------------------------
//  Bit 8: =0 - GEANT bug was found in this track
//  Bit 7: =0 - track don't reach META
//  Bit 6: =0 - not reconstructable track. It can be if
//              track not present in mdc,
//              track cross more then one sector,
//              numder of segments <1 or >2,
//              upstream direction of at list one segment,
//              track doesn't cross inner or outer segment,
//              num. of segments with digi.wires <1 or >2,
//              num.digi.wires in track < 5*num.segments,
//              at list one seg. has <3 layers or <5 wires
//  Bit 5: =0 - segment has <3 layers or <5 digi.wires
//  Bit 4: =0 - at list one mdc in segment has
//              <3 fired layers or <5 wires
//  Bit 3: =0 - segment can't be found due to high level
//              of cluster finder
//  Bit 2: =0 - fake contribution in cluster
//  Bit 1: =0 - fake inner-outer segments matching
//              (for outer segment only!)
//
////////////////////////////////////////////////////////////////
using namespace std;
#include "hmdcclussim.h"
#include "hades.h"
#include "hmdctrackddef.h"
#include "hmdccal1sim.h"
#include "hevent.h"
#include "hmatrixcategory.h"
#include "hmdclistcells.h"
#include <iostream> 
#include <iomanip>

ClassImp(HMdcClusSim)


void HMdcClusSim::setDef(void) {
  nTracks        = 0;
  nTracksM[0]    = 0;
  nTracksM[1]    = 0;
  nNotFakeTracks = -1;
  ioSMatchStatus = -1;
}

void HMdcClusSim::cleanRest(void) {
  for(Int_t n=nTracks;n<5;n++) {
    listTr[n]      = 0;
    nTimes[n]      = 0;
    nLayers[n][0]  = 0;
    nLayers[n][1]  = 0;
    nDigiTimes[n]  = 0;
    trackStatus[n] = 0;
    xGeant[n]      = 0.;
    yGeant[n]      = 0.;
  }
}

Bool_t HMdcClusSim::resetTrack(Int_t ind, Int_t tr, Short_t nTm, UChar_t lM1, UChar_t lM2) {
  // reset geant track;
  if(indOk(ind)) {
    listTr[ind]     = tr;    
    nTimes[ind]     = nTm;    
    nLayers[ind][0] = lM1;
    nLayers[ind][1] = lM2;
    if(nTracks <= ind) nTracks = ind+1;
    return kTRUE;
  }
  return kFALSE;
}

Int_t HMdcClusSim::addTrack(Int_t tr, Short_t nTm, UChar_t lM1, UChar_t lM2) {
  // add geant track. Return index of track in array
  if(nTracks>=5) return -1;
  listTr[nTracks]     = tr;    
  nTimes[nTracks]     = nTm;    
  nLayers[nTracks][0] = lM1;
  nLayers[nTracks][1] = lM2;
  xGeant[nTracks]     = -10000.;
  yGeant[nTracks]     = -10000.;
  nTracks++;
  return nTracks-1;
}

void HMdcClusSim::setNDigiTimes(Int_t ind,Int_t nt) {
  if(indOk(ind)) {
    if(nt<0)        nDigiTimes[ind] = 0;
    else if(nt>255) nDigiTimes[ind] = 255;
    else            nDigiTimes[ind] = nt;
  }
}

void HMdcClusSim::setXYGeant(Int_t ind,Float_t xg,Float_t yg) {
  if(indOk(ind)) {
    xGeant[ind] = xg;
    yGeant[ind] = yg;
  }
}

void HMdcClusSim::setTrackStatus(Int_t ind,UChar_t status) {
  if(indOk(ind)) trackStatus[ind] = status;
}

UChar_t HMdcClusSim::getTrackStatus(Int_t ind) const {
  return indOk(ind) ? trackStatus[ind] : 0;
}

void HMdcClusSim::setNTracksM(Int_t modi, Int_t nTrs) {
  if(modi<0 || modi>1) return;
  nTracksM[modi] = nTrs;
}

void HMdcClusSim::setTrackM(Int_t modi, Int_t ind, Int_t tr, Short_t nTm) {
  if(modi<0 || modi>1) return;
  if(ind<0 || ind>4) return;
  listTrM[modi][ind] = tr;
  nTimesM[modi][ind] = nTm;
}


Int_t HMdcClusSim::getNoiseIndex(void) const {
  for(Int_t i=0;i<nTracks;i++) if(listTr[i] == -99) return i;
  return -1;
}
    
Int_t HMdcClusSim::getTrackIndex(Int_t tr) const {
  for(Int_t i=0;i<nTracks;i++) if(listTr[i]==tr) return i;
  return -1;
}

Int_t HMdcClusSim::getTrackMod(Int_t m,Int_t indx) const {
  return (indx>=0 && indx<nTracksM[m&1]) ? listTrM[m&1][indx] : -1;
}

Short_t HMdcClusSim::getNTimesInMod(Int_t m,Int_t indx) const {
  return (indx<0 || indx>=nTracksM[m&1]) ? 0:nTimesM[m&1][indx];
}


Int_t   HMdcClusSim::getTrack(Int_t indx) const {
  return (indx>=0&&indx<nTracks) ? listTr[indx] : 0;
}

Short_t HMdcClusSim::getNTimesInTrack(Int_t indx) const {
  return (indx<0||indx>=nTracks) ? 0:nTimes[indx];
}

void HMdcClusSim::calcTrList(void) {
  HCategory *fCalCat=gHades->getCurrentEvent()->getCategory(catMdcCal1);
  if( !fCalCat ) return;

  HLocation loc;
  loc.set(4,sec,0,0,0);
  Int_t nTr = 0;
  Int_t lsTr[100];
  Int_t ind[100];
  UChar_t  nLay[100][2];
  UChar_t nHt[100];
  for(Int_t lay=0; lay<12; lay++) {
    Int_t modInd=lay/6;
    Int_t cell=-1;
    Short_t add=1<<(lay%6);
    loc[1] = modInd+seg*2;
    loc[2] = lay%6;
    while((cell=next(lay,cell)) >= 0) {
      UChar_t nTms = getTime(lay,cell);
      loc[3] = cell;
      HMdcCal1Sim *sim=(HMdcCal1Sim*)fCalCat->getObject(loc);
      if(!sim) {
        Error("getNTracks()"," Can't get object HMdcCal1Sim for address [%i][%i][%i][ %i ]",
            loc[0]+1,loc[1]+1,loc[2]+1,loc[3]+1);
        continue;
      }
      Int_t track=0;
      for(Int_t t=0; t<2; t++) {
        if(t==0 && (nTms&1)) track=sim->getNTrack1();
        else if(t==1 && (nTms&2)) track=sim->getNTrack2();
        else continue;
        if(track == 0) continue;
        Int_t indx = nTr;
        if(track<0 && track!=gHades->getEmbeddingRealTrackId()) track = -99; // noise
        for(Int_t n=0; n<nTr; n++) {
          if(lsTr[n]==track) {
            indx = n;
            break;
          }
        }
        if(indx==nTr) {
          lsTr[indx]    = track;
          nLay[indx][0] = 0;
          nLay[indx][1] = 0;
          nHt[indx]     = 0;
          ind[indx]     = indx;
          nTr++;
        }
        nLay[indx][modInd] |= add;
        nHt[indx]++;
        
      }
    }
  }
  //Sorting:
  if(nTr>1) {
    Bool_t sort=kTRUE;
    while(sort) {
      sort=kFALSE;
      for(Int_t n=0; n<nTr-1; n++) if(nHt[ind[n]]<nHt[ind[n+1]]) {
        sort     = kTRUE;
        Int_t i  = ind[n];
        ind[n]   = ind[n+1];
        ind[n+1] = i;
      }
    }
  }
  nTracks = nTr>5 ? 5:nTr;
  for(Int_t n=0; n<nTracks; n++) {
    listTr[n]      = lsTr[ind[n]];
    nTimes[n]      = nHt[ind[n]];
    nLayers[n][0]  = nLay[ind[n]][0];
    nLayers[n][1]  = nLay[ind[n]][1];
    nDigiTimes[n]  = 0;
    trackStatus[n] = 255;
    xGeant[n]      = -10000.;
    yGeant[n]      = -10000.;
  }
  cleanRest();
}

void HMdcClusSim::calcTrListMod(HMdcList12GroupCells& list,Int_t m) {
  HCategory *fCalCat=gHades->getCurrentEvent()->getCategory(catMdcCal1);
  if( !fCalCat ) {
    nTracksM[0]=nTracksM[1]=0;
    return;
  }
  Int_t mod=m&1;
  
  HLocation loc;
  loc.set(4,sec,0,0,0);
  Int_t nTr=0;
  Int_t lsTr[100];
  Int_t ind[100];
  UChar_t nHt[100];
  for(Int_t lay=mod*6; lay<(mod+1)*6; lay++) {
    Int_t modInd=lay/6;
    Int_t cell=-1;
    loc[1]=modInd+seg*2;
    loc[2]=lay%6;
    while((cell=list.next(lay,cell)) >= 0) {
      UChar_t nTms=list.getTime(lay,cell);
      loc[3]=cell;
      HMdcCal1Sim *sim=(HMdcCal1Sim*)fCalCat->getObject(loc);
      if(!sim) {
        Error("getNTracks()"," Can't get object HMdcCal1Sim for address [%i][%i][%i][ %i ]",
            loc[0]+1,loc[1]+1,loc[2]+1,loc[3]+1);
        continue;
      }
      Int_t track=0;
      for(Int_t t=0; t<2; t++) {
        if(t==0 && (nTms&1)) track=sim->getNTrack1();
        else if(t==1 && (nTms&2)) track=sim->getNTrack2();
        else continue;
        Int_t indx=nTr;
        for(Int_t n=0; n<nTr; n++) {
          if(lsTr[n]==track) {
            indx=n;
            break;
          }
        }
        if(indx==nTr) {
          lsTr[indx]=track;
          nHt[indx]=0;
          ind[indx]=indx;
          nTr++;
        }
        nHt[indx]++;
      }
    }
  }
  //Sorting:
  if(nTr>1) {
    Bool_t sort=kTRUE;
    while(sort) {
      sort=kFALSE;
      for(Int_t n=0; n<nTr-1; n++) {
        if(nHt[ind[n]]<nHt[ind[n+1]]) {
          sort=kTRUE;
          Int_t i=ind[n];
          ind[n]=ind[n+1];
          ind[n+1]=i;
        }
      }
    }
  }
  nTracksM[mod]=(nTr>5) ? 5:nTr;
  for(Int_t n=0; n<nTracksM[mod]; n++) {
    listTrM[mod][n]=lsTr[ind[n]];
    nTimesM[mod][n]=nHt[ind[n]];
  }
}

Int_t HMdcClusSim::getNLayersInTrack(Int_t indx, Int_t m) const {
  if(indOk(indx)) {
    if(m==0 || m==1) return HMdcBArray::getNSet(nLayers[indx][m]);
    else return HMdcBArray::getNSet(nLayers[indx][0])+
                HMdcBArray::getNSet(nLayers[indx][1]);
  }
  return 0;
}

UChar_t HMdcClusSim::getLayListForMod(Int_t indx,Int_t mi) const {
  if(indOk(indx) && mi>=0 && mi<2) return nLayers[indx][mi];
  return 0;
}

UChar_t HMdcClusSim::getNLayOrientation(Int_t indx,Int_t mi) const {
  if(!indOk(indx)) return 0;
  UChar_t list;
  if(mi>=0 && mi<2) list = nLayers[indx][mi];
  else              list = nLayers[indx][0] | nLayers[indx][1];
  return HMdcBArray::getNLayOrientation(list);
}

Bool_t HMdcClusSim::is40degCross(Int_t indx,Int_t mi) const {
  // return kTRUE if exist at list one wire pair with 
  // 40deg. or more angle between.
  if(!indOk(indx)) return 0;
  UChar_t list;
  if(mi>=0 && mi<2) list = nLayers[indx][mi];
  else              list = nLayers[indx][0] | nLayers[indx][1];
  return  HMdcBArray::is40DegWireCross(list);
}

Bool_t HMdcClusSim::getXYGeant(Int_t i,Float_t& xg, Float_t& yg) const {
  if(indOk(i) && xGeant[i]>-9000.) {
    xg = xGeant[i];
    yg = yGeant[i];
    return kTRUE;
  }
  return kFALSE;
}

void HMdcClusSim::sortTrListByContr(void) {
  // Sorting track list "listTr" by "FakeContribution" flag.
  // After sorting tracks with not FakeContribution status
  // will be placed at the begining of arrais.
  nNotFakeTracks = 0;
  for(Int_t t1=0;t1<nTracks;t1++) {
    if(isFakeContribution(t1)) {
      for(Int_t t2=t1+1;t2<nTracks;t2++) {
        if(isFakeContribution(t2)) continue;
        exchangeTrPos(t1,t2);
        nNotFakeTracks++;
        break;
      }
    } else nNotFakeTracks++;
  }
  for(Int_t t1=0;t1<nNotFakeTracks-1;t1++) if(!isIOSegMatch(t1)) {
    for(Int_t t2=t1+1;t2<nNotFakeTracks;t2++) {
      if(!isIOSegMatch(t2)) continue;
      exchangeTrPos(t1,t2);
      break;
    }
  }
  ioSMatchStatus = 0;
  for(Int_t t=0;t<nNotFakeTracks;t++) if(isIOSegMatch(t)) ioSMatchStatus++;
  cleanRest();
}

Int_t HMdcClusSim::getNMatchedTracks(void) const {
  // Can be used after sortTrListByContr() only!
  Int_t n = 0;
  for(Int_t t=0; t<nNotFakeTracks; t++) {
    if(isFakeContribution(t)) continue;
    if(isIOSegMatch(t)) n++;
  }
  return n;
}

void HMdcClusSim::exchangeTrPos(Int_t t1,Int_t t2) {
  Int_t   v1 = listTr[t1];
  Short_t v2 = nTimes[t1];
  UChar_t v3 = nLayers[t1][0];
  UChar_t v4 = nLayers[t1][1];
  UChar_t v5 = nDigiTimes[t1];
  UChar_t v6 = trackStatus[t1];
  Float_t v7 = xGeant[t1];
  Float_t v8 = yGeant[t1];

  listTr[t1]      = listTr[t2];
  nTimes[t1]      = nTimes[t2];
  nLayers[t1][0]  = nLayers[t2][0];
  nLayers[t1][1]  = nLayers[t2][1];
  nDigiTimes[t1]  = nDigiTimes[t2];
  trackStatus[t1] = trackStatus[t2];
  xGeant[t1]      = xGeant[t2];
  yGeant[t1]      = yGeant[t2];

  listTr[t2]      = v1;
  nTimes[t2]      = v2;
  nLayers[t2][0]  = v3;
  nLayers[t2][1]  = v4;
  nDigiTimes[t2]  = v5;
  trackStatus[t2] = v6;
  xGeant[t2]      = v7;
  yGeant[t2]      = v8;
}

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