ROOT logo
//*-- AUTHOR : Vladimir Pechenov
//*-- Modified : 05/06/2002 by V.Pechenov
//*-- Modified : 17/01/2002 by V.Pechenov
//*-- Modified : 05/06/2001 by V.Pechenov
//*-- Modified : 21/08/2000 by V.Pechenov
//*-- Modified : 20/05/2000 by V.Pechenov
//*-- Modified : 26/10/99 by V.Pechenov
//*-- Modified : 25/02/99


//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
// HMdcClust
//
//  Container class keep cluster information:
//   x,y - position of cluster on the project plane HMdcPlane
//   xTag,yTag,zTarg - target, or point on the kick plane
//   indexPar - index of parent in catMdcClus for Seg.1 = -1)
//   indCh1,indCh2 - region of indexes of childs (for Seg.2 = -1,-2)
//
//  Int_t getIndexParent(void) {return indexPar;}
//  void  getIndexRegChilds(Int_t& first, Int_t& last)
//  Int_t getNextIndexChild(Int_t ind)
//    Example:
//      Int_t ind=-1;
//      while(ind=getNextIndexChild(ind)>0) {
//        ...
//      }
//
////////////////////////////////////////////////////////////////
using namespace std;
#include "hmdcclus.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include <iostream> 
#include <iomanip>
#include <stdlib.h>

ClassImp(HMdcClus)

void HMdcClus::clear(void) {
  HMdcList12GroupCells::clear();
  setDefValues();
}

void HMdcClus::setDefValues(void) {
  status       = 1;
  indexPar     = -1;
  indCh1       = -1;
  indCh2       = -2;
  typeClFinder = 0;
  mod          = -1;
  nMergedClus  = 1;
  nMergClusM1  = 1;
  nMergClusM2  = 1;
  nDrTimesM1   = 0;
  nDrTimesM2   = 0;
  clusSizeM1   = 0;
  clusSizeM2   = 0;
  segIndex     = -1;
  fakeFlag     = 0;
}


void HMdcClus::print(Bool_t fl) const {
  printPos();
  printCont(fl);
}

void HMdcClus::printPos(void) const {
  Int_t modp = mod>=0 ? mod+1:mod;
  printf("Cluster: Sec.%i Seg.%i Mod.%i Clust.type=%i %sLevel Index=%i.",
      sec+1,seg+1,modp,getTypeClFinder(),isFixedLevel() ? "Fixed":"Float",index);
  if(indexPar>=0) printf("  Index of parent=%i\n",indexPar);
  else if(indCh1>=0 && indCh2>=0) printf("  Indexes of childs = %i - %i\n",indCh1,indCh2);
  else printf("\n");
  if(fakeFlag!=0) printf("FAKE!   FakeFlag = %i\n",fakeFlag);
  printf("  Initial level:");
  if( !isSegmentAmpCut() && (seg==0 || (typeClFinder&127)!=2) ) printf(" %i:%i,",minCl1,minCl2);
  else printf(" %i,",minCl1+minCl2);
  printf("  Real level: %i,",realLevel);
  printf(" %i bins/cluster, %i hits/cluster, nMergedClus=%i\n",nBins,getNCells(),nMergedClus);
  printf("  <x>=%g+/-%g <y>=%g+/-%g <z>=%g\n",x,errX,y,errY,getZ());
  printf("  xTarg=%g+/-%g yTarg=%g+/-%g zTarg=%g+/-%g\n",
      xTarg,errXTarg,yTarg,errYTarg,zTarg,errZTarg);
  printf("  Project plane equation: %g*x%+g*y+z=%g\n",parA,parB,parD);
  if(!isSegmentAmpCut()) {
    if(clusSizeM1>0) printf("  Mod%i: level=%i, %3i bins, %2i wires, nMergedClus=%i\n",
                            seg*2+1,clFnLevelM1,clusSizeM1,nDrTimesM1,nMergClusM1);
    if(clusSizeM2>0) printf("  Mod%i: level=%i, %3i bins, %2i wires, nMergedClus=%i\n",
                            seg*2+2,clFnLevelM2,clusSizeM2,nDrTimesM2,nMergClusM2);
  }
}

void HMdcClus::printCont(Bool_t fl) const {
  if(!fl) return;
  for(Int_t lay=0; lay<12; lay++) {
    Int_t modw   = seg*2+lay/6;
    Int_t nCells = getNCells(lay);
    if(!nCells) continue;
    printf("M.%i L.%i  %i cells:",modw+1,lay%6+1,nCells);
    Int_t cell = -1;
    while((cell=next(lay,cell)) >= 0) {
      printf(" %i(%i)",cell+1,HMdcBArray::getNSet(getTime(lay,cell)));
    }
    printf("\n");
  }
}

void HMdcClus::calcIntersection(const HGeomVector &r, const HGeomVector &dir,
                                HGeomVector &out) const {
  // Calculating of a cross of line r,dir (point and direction)
  // with project plane parA*x+parB*y+z=parD
  Double_t x1=r(0);
  Double_t y1=r(1);
  Double_t z1=r(2);
  Double_t dX=dir(0);
  Double_t dY=dir(1);
  Double_t dZ=dir(2);
  Double_t del=1./(parA*dX+parB*dY+dZ);
  Double_t x=(dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  Double_t y=(dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
  out.setXYZ(x,y,-parA*x-parB*y+parD);
}

void HMdcClus::calcIntersection(const HGeomVector &p1, const HGeomVector &p2,
                                   Float_t& x, Float_t& y) const {
  // Calculating of a cross of line p1 -> p2 (two points on the line)
  // with project plane parA*x+parB*y+z=parD
  Double_t x1=p1(0);
  Double_t y1=p1(1);
  Double_t z1=p1(2);
  Double_t dX=p2(0)-x1;
  Double_t dY=p2(1)-y1;
  Double_t dZ=p2(2)-z1;
  Double_t del=1./(parA*dX+parB*dY+dZ);
  x=(dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  y=(dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
}

void HMdcClus::calcIntersection(const HGeomVector &p, Float_t& x, Float_t& y) const {
  // Calculating of a cross of line target -> p (two points on the line)
  // with project plane parA*x+parB*y+z=parD
  Double_t dX=p(0)-xTarg;
  Double_t dY=p(1)-yTarg;
  Double_t dZ=p(2)-zTarg;
  Double_t del=1./(parA*dX+parB*dY+dZ);
  x=(dX*(parD-zTarg-parB*yTarg)+xTarg*(parB*dY+dZ))*del;
  y=(dY*(parD-zTarg-parA*xTarg)+yTarg*(parA*dX+dZ))*del;
}


void HMdcClus::fillErrMatClus(Bool_t isCoilOff, HSymMat4& errMatClus) {
  errMatClus.Clear();
  errMatClus.setErr(2,errX);
  errMatClus.setErr(3,errY);
  if(seg==0 || isCoilOff) {  // errXTarg+errYTarg==0. ???
    errMatClus.setErr(0,errZTarg);
  } else {
    errMatClus.setErr(0,errXTarg);
    errMatClus.setErr(1,errYTarg);
  }
}

Bool_t HMdcClus::getNextWire(Int_t& mod, Int_t& lay, Int_t& cell) const {
  if(mod<seg*2) {
    mod  = seg*2;
    lay  = 0;
    cell = -1;
  } else if(lay<0) {
    lay  = 0;
    cell = -1;
  }
  lay += (mod - seg*2) * 6;
  if(!HMdcList12GroupCells::getNextCell(lay,cell)) return kFALSE;
  mod = lay/6 + seg*2;
  lay = lay%6;
  return kTRUE;
}

Bool_t HMdcClus::getNextWire(HLocation& loc) const {
  if(loc[0] != sec) {
    loc[0] = sec;
    loc[1] = -1;
  }
  return getNextWire(loc[1],loc[2],loc[3]);
}
 hmdcclus.cc:1
 hmdcclus.cc:2
 hmdcclus.cc:3
 hmdcclus.cc:4
 hmdcclus.cc:5
 hmdcclus.cc:6
 hmdcclus.cc:7
 hmdcclus.cc:8
 hmdcclus.cc:9
 hmdcclus.cc:10
 hmdcclus.cc:11
 hmdcclus.cc:12
 hmdcclus.cc:13
 hmdcclus.cc:14
 hmdcclus.cc:15
 hmdcclus.cc:16
 hmdcclus.cc:17
 hmdcclus.cc:18
 hmdcclus.cc:19
 hmdcclus.cc:20
 hmdcclus.cc:21
 hmdcclus.cc:22
 hmdcclus.cc:23
 hmdcclus.cc:24
 hmdcclus.cc:25
 hmdcclus.cc:26
 hmdcclus.cc:27
 hmdcclus.cc:28
 hmdcclus.cc:29
 hmdcclus.cc:30
 hmdcclus.cc:31
 hmdcclus.cc:32
 hmdcclus.cc:33
 hmdcclus.cc:34
 hmdcclus.cc:35
 hmdcclus.cc:36
 hmdcclus.cc:37
 hmdcclus.cc:38
 hmdcclus.cc:39
 hmdcclus.cc:40
 hmdcclus.cc:41
 hmdcclus.cc:42
 hmdcclus.cc:43
 hmdcclus.cc:44
 hmdcclus.cc:45
 hmdcclus.cc:46
 hmdcclus.cc:47
 hmdcclus.cc:48
 hmdcclus.cc:49
 hmdcclus.cc:50
 hmdcclus.cc:51
 hmdcclus.cc:52
 hmdcclus.cc:53
 hmdcclus.cc:54
 hmdcclus.cc:55
 hmdcclus.cc:56
 hmdcclus.cc:57
 hmdcclus.cc:58
 hmdcclus.cc:59
 hmdcclus.cc:60
 hmdcclus.cc:61
 hmdcclus.cc:62
 hmdcclus.cc:63
 hmdcclus.cc:64
 hmdcclus.cc:65
 hmdcclus.cc:66
 hmdcclus.cc:67
 hmdcclus.cc:68
 hmdcclus.cc:69
 hmdcclus.cc:70
 hmdcclus.cc:71
 hmdcclus.cc:72
 hmdcclus.cc:73
 hmdcclus.cc:74
 hmdcclus.cc:75
 hmdcclus.cc:76
 hmdcclus.cc:77
 hmdcclus.cc:78
 hmdcclus.cc:79
 hmdcclus.cc:80
 hmdcclus.cc:81
 hmdcclus.cc:82
 hmdcclus.cc:83
 hmdcclus.cc:84
 hmdcclus.cc:85
 hmdcclus.cc:86
 hmdcclus.cc:87
 hmdcclus.cc:88
 hmdcclus.cc:89
 hmdcclus.cc:90
 hmdcclus.cc:91
 hmdcclus.cc:92
 hmdcclus.cc:93
 hmdcclus.cc:94
 hmdcclus.cc:95
 hmdcclus.cc:96
 hmdcclus.cc:97
 hmdcclus.cc:98
 hmdcclus.cc:99
 hmdcclus.cc:100
 hmdcclus.cc:101
 hmdcclus.cc:102
 hmdcclus.cc:103
 hmdcclus.cc:104
 hmdcclus.cc:105
 hmdcclus.cc:106
 hmdcclus.cc:107
 hmdcclus.cc:108
 hmdcclus.cc:109
 hmdcclus.cc:110
 hmdcclus.cc:111
 hmdcclus.cc:112
 hmdcclus.cc:113
 hmdcclus.cc:114
 hmdcclus.cc:115
 hmdcclus.cc:116
 hmdcclus.cc:117
 hmdcclus.cc:118
 hmdcclus.cc:119
 hmdcclus.cc:120
 hmdcclus.cc:121
 hmdcclus.cc:122
 hmdcclus.cc:123
 hmdcclus.cc:124
 hmdcclus.cc:125
 hmdcclus.cc:126
 hmdcclus.cc:127
 hmdcclus.cc:128
 hmdcclus.cc:129
 hmdcclus.cc:130
 hmdcclus.cc:131
 hmdcclus.cc:132
 hmdcclus.cc:133
 hmdcclus.cc:134
 hmdcclus.cc:135
 hmdcclus.cc:136
 hmdcclus.cc:137
 hmdcclus.cc:138
 hmdcclus.cc:139
 hmdcclus.cc:140
 hmdcclus.cc:141
 hmdcclus.cc:142
 hmdcclus.cc:143
 hmdcclus.cc:144
 hmdcclus.cc:145
 hmdcclus.cc:146
 hmdcclus.cc:147
 hmdcclus.cc:148
 hmdcclus.cc:149
 hmdcclus.cc:150
 hmdcclus.cc:151
 hmdcclus.cc:152
 hmdcclus.cc:153
 hmdcclus.cc:154
 hmdcclus.cc:155
 hmdcclus.cc:156
 hmdcclus.cc:157
 hmdcclus.cc:158
 hmdcclus.cc:159
 hmdcclus.cc:160
 hmdcclus.cc:161
 hmdcclus.cc:162
 hmdcclus.cc:163
 hmdcclus.cc:164
 hmdcclus.cc:165
 hmdcclus.cc:166
 hmdcclus.cc:167
 hmdcclus.cc:168
 hmdcclus.cc:169
 hmdcclus.cc:170
 hmdcclus.cc:171
 hmdcclus.cc:172
 hmdcclus.cc:173
 hmdcclus.cc:174
 hmdcclus.cc:175
 hmdcclus.cc:176
 hmdcclus.cc:177
 hmdcclus.cc:178
 hmdcclus.cc:179
 hmdcclus.cc:180
 hmdcclus.cc:181
 hmdcclus.cc:182
 hmdcclus.cc:183
 hmdcclus.cc:184
 hmdcclus.cc:185
 hmdcclus.cc:186
 hmdcclus.cc:187
 hmdcclus.cc:188
 hmdcclus.cc:189
 hmdcclus.cc:190
 hmdcclus.cc:191