#include "hmetaalignerutil.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hmdcdef.h"
#include "hevent.h"
#include "tofdef.h"
#include "showerdef.h"

Float_t g_fSqrt_12_1 = (Float_t)(1.0 / sqrt(12.0));

HMetaAlignerKickShowerTransform::HMetaAlignerKickShowerTransform(void) {
}

HMetaAlignerKickShowerTransform::HMetaAlignerKickShowerTransform(Float_t showerDX, Float_t showerDY,
                       Float_t showerDZ) {
    fShowerDX = showerDX;
    fShowerDY = showerDY;
    fShowerDZ = showerDZ;
}

HMetaAlignerKickShowerTransform::~HMetaAlignerKickShowerTransform(void) {
}

void HMetaAlignerKickShowerTransform::setGeometry(HShowerGeometry *geom) {
}

void HMetaAlignerKickShowerTransform::transform(HShowerHit *hit, HGeomVector &r) const
{
  Float_t x=0,y=0;

  HGeomVector local;

  const HGeomTransform &trans = getTransform(hit->getSector());
  hit->getXY(&x, &y);

  local.setXYZ(x,y,0);
  r = trans.transFrom(local);
}

void HMetaAlignerKickShowerTransform::getSigmas(HShowerHit *hit,
            Float_t &fSigmaX, Float_t &fSigmaY) const
{
HShowerPad *pPad;

    pPad = fGeometry->getPadParam(0)->getPad(hit->getRow(), hit->getCol());

    // height
    fSigmaY = (pPad->getYlu_mm() - pPad->getYld_mm()) * g_fSqrt_12_1;
    // length of upper side
    fSigmaX = (pPad->getXru_mm() - pPad->getXlu_mm()) * g_fSqrt_12_1;
/*
    printf("%2d %2d -> %6.2f %6.2f\n", hit->getRow(), hit->getCol(),
                        pPad->getXru_mm() - pPad->getXlu_mm(),
                        pPad->getYlu_mm() - pPad->getYld_mm());
*/
}

Bool_t HMetaAlignerKickShowerTransform::init(void) {
  HRuntimeDb *rtdb = 0;
  Bool_t r = kTRUE;

  if (gHades) {
    if ( (rtdb = gHades->getRuntimeDb()) != 0) {
      HSpectrometer *spec = gHades->getSetup();

      if (spec)
        fGeometry = (HShowerGeometry *)rtdb->getContainer("ShowerGeometry");

    } else { r = kFALSE;}
  }
  return r;
}

void HMetaAlignerKickShowerTransform::toLocal(HGeomVector &r,Int_t sector,
                   HGeomVector &out) const {

  const HGeomTransform &trans = getTransform(sector);
  out = trans.transTo(r);
}

HGeomTransform g_showerTransform;

const HGeomTransform &HMetaAlignerKickShowerTransform::getTransform(Int_t sector) const {
  HGeomRotation alig;

  alig.setEulerAngles(0,0,0);
  HGeomVector desp(fShowerDX, fShowerDY, fShowerDZ);

  const HGeomTransform &modTrans = fGeometry->getTransform(sector,0);

  g_showerTransform.setRotMatrix(modTrans.getRotMatrix()*alig);
  g_showerTransform.setTransVector(desp + modTrans.getTransVector());
  return g_showerTransform;
}

HMetaAlignerKickTofTransform::HMetaAlignerKickTofTransform(void) {
  fGeometry = 0;
}

HMetaAlignerKickTofTransform::~HMetaAlignerKickTofTransform(void) {
  fGeometry = 0;
}

void HMetaAlignerKickTofTransform::setGeometry(HTofGeomPar *geom) {
  fGeometry = geom;
}

void HMetaAlignerKickTofTransform::transform(HTofHit *data,
                  HGeomVector &r) const {
  HGeomVector rLocal;

  HModGeomPar *module=fGeometry->getModule(data->getSector(), //Sector
                       data->getModule());
  HGeomTransform &modTrans = getTransform(data->getSector(),
                      data->getModule());
  HGeomVolume *rodVol=module->getRefVolume()->getComponent(data->getCell());
  HGeomTransform &rodTrans=rodVol->getTransform();

  r.setX(data->getXpos());
  r.setY(0.);
  r.setZ(0.);

  rLocal=rodTrans.transFrom(r); //Rod to modue system

  r=modTrans.transFrom(rLocal); //Module to LAB system
}

HGeomTransform tofTransform;

HGeomTransform &HMetaAlignerKickTofTransform::getTransform(Int_t sector,Int_t module) const
{
/*
  //Float_t ymis[] = {3,2,1,0,0,-3,-6,-9}; //FIXME>: Not for DST
  HGeomRotation alig;

  alig.setEulerAngles(0,0,0);
  //HGeomVector desp(0, 2, 2);      // <-- params like for shower
  HGeomVector desp(0, 0, 0);        // <-- params like for shower

  HModGeomPar *mod=fGeometry->getModule(sector,module);
  HGeomTransform &modTrans = mod->getLabTransform();

  tofTransform.setRotMatrix(modTrans.getRotMatrix()*alig);
  tofTransform.setTransVector(desp + modTrans.getTransVector());
  return tofTransform;
*/

HModGeomPar    *mod      = fGeometry->getModule(sector, module);
HGeomTransform &modTrans = mod->getLabTransform();

    tofTransform.setRotMatrix(modTrans.getRotMatrix());
    tofTransform.setTransVector(modTrans.getTransVector());

    return tofTransform;
}


void HMetaAlignerKickTofTransform::toLocal(HGeomVector &r, HTofHit *data,
                HGeomVector &out) const {
  HGeomVector rLocal;
  HGeomTransform &modTrans = getTransform(data->getSector(),
                      data->getModule());
  //HGeomVolume *rodVol=module->getRefVolume()->getComponent(data->getCell());
  //HGeomTransform &rodTrans=rodVol->getTransform();

  out = modTrans.transTo(r);
}

void HMetaAlignerKickTofTransform::getLocal(HTofHit *data,
                  HGeomVector &r) const {
  HGeomVector rRod;

  HModGeomPar *module=fGeometry->getModule(data->getSector(), //Sector
                       data->getModule());
//HGeomTransform &modTrans = getTransform(data->getSector(), data->getModule());
  HGeomVolume *rodVol=module->getRefVolume()->getComponent(data->getCell());
  HGeomTransform &rodTrans=rodVol->getTransform();

  rRod.setX(data->getXpos());
  rRod.setY(0.);
  rRod.setZ(0.);

  r = rodTrans.transFrom(rRod); //Rod to modue system
}


void HMetaAlignerKickTofTransform::getSigmas(HTofHit *hit,
            Float_t &fSigmaX, Float_t &fSigmaY) const
{
HModGeomPar *module=fGeometry->getModule(hit->getSector(),
                       hit->getModule());
HGeomVolume *rodVol=module->getRefVolume()->getComponent(hit->getCell());
Double_t     dMin = 0.0, dMax = 0.0;
HGeomVector *pPoint = NULL;

    for(Int_t i = 0; i < rodVol->getNumPoints(); i++)
    {
        pPoint = rodVol->getPoint(i);
        if(i == 0)
        {
            dMax = dMin = pPoint->getY();
            continue;
        }

        if(dMin > pPoint->getY())
            dMin = pPoint->getY();
        else
            if(dMax < pPoint->getY())
                dMax = pPoint->getY();
    }

    fSigmaY = (dMax - dMin) * g_fSqrt_12_1; // rod height
    fSigmaX = 25.0f; // TOF resolution
}


Bool_t HMetaAlignerKickTofTransform::init(void) {
    HRuntimeDb *rtdb = 0;
    Bool_t r = kTRUE;

    if (gHades) {
	if ( (rtdb = gHades->getRuntimeDb()) != 0) {
	    HSpectrometer *spec = gHades->getSetup();

	    if (spec) {
		fGeometry = (HTofGeomPar *)rtdb->getContainer("TofGeomPar");

		fSpecGeometry = (HSpecGeomPar *)rtdb->getContainer("SpecGeomPar");

	    } else r = kFALSE;
	} else { r = kFALSE; }
    }
    return r;
}

HMetaAlignerKickMdcTransform::HMetaAlignerKickMdcTransform(void) {
  fGeometry = 0;
}

HMetaAlignerKickMdcTransform::~HMetaAlignerKickMdcTransform(void) {
  fGeometry = 0;
}

void HMetaAlignerKickMdcTransform::setGeometry(HMdcGeomPar *geom) {
  fGeometry = geom;
}

void HMetaAlignerKickMdcTransform::transform(HMdcSeg *hit,
                  HGeomVector &r,HGeomVector &alpha) const {
  HGeomTransform &transSec = fSpecGeometry->getSector(hit->getSec())
    ->getTransform();
  Float_t theta,phi;
  Double_t pi2=TMath::Pi()/2.;
  HGeomVector rLocal,alphaLocal;

  theta=hit->getTheta();
  phi=hit->getPhi();

  rLocal.setZ(hit->getZ());
  rLocal.setX(hit->getR()*TMath::Cos(phi+pi2));
  rLocal.setY(hit->getR()*TMath::Sin(phi+pi2));
  r = transSec.transFrom(rLocal);

  alphaLocal.setZ(TMath::Cos(theta));
  alphaLocal.setY(TMath::Sin(theta)*TMath::Sin(phi));
  alphaLocal.setX(TMath::Sin(theta)*TMath::Cos(phi));
  alpha = transSec.getRotMatrix() * alphaLocal;
}

Bool_t HMetaAlignerKickMdcTransform::init(void) {
    HRuntimeDb *rtdb = 0;
    Bool_t r = kTRUE;

    if (gHades) {
	if ( (rtdb = gHades->getRuntimeDb()) != 0) {
	    HSpectrometer *spec = gHades->getSetup();

	    if (spec) {
		fGeometry = (HMdcGeomPar *)rtdb->getContainer("MdcGeomPar");
		fSpecGeometry = (HSpecGeomPar *)rtdb->getContainer("SpecGeomPar");
	    } else { r = kFALSE;}
	} else { r = kFALSE;}
    }
    return r;
}

HMetaAlignerTask::HMetaAlignerTask(void) : HReconstructor("align","align"),
               fShowerGeom(0.,0.,0.) {
  fMdcHits = 0;
  fShowerHits = 0;
  fTofHits = 0;
  fMdcIter = 0;
  fShowerIter = 0;
  fTofIter = 0;
}

HMetaAlignerTask::HMetaAlignerTask(Float_t fShowerDX, Float_t fShowerDY, Float_t fShowerDZ)
  : HReconstructor("align","align"), fShowerGeom(fShowerDX, fShowerDY,
                         fShowerDZ)
{
    fMdcHits = 0;
    fShowerHits = 0;
    fTofHits = 0;
    fMdcIter = 0;
    fShowerIter = 0;
    fTofIter = 0;
}

HMetaAlignerTask::~HMetaAlignerTask(void) {
}

Float_t HMetaAlignerTask::distance(HGeomVector &r, HGeomVector &a, HGeomVector &p) {
  //Distance from line (r,a) to p
  return ((r-p).vectorProduct(a)).length();
}

void HMetaAlignerTask::calcClosestPoint(HGeomVector &r, HGeomVector &a,
                HGeomVector &r2,HGeomVector &p) {
  // sets p as the closest point in line (r,a) to the point r2.
  HGeomVector delta = a;
  delta *= (r - r2).scalarProduct(a);
  p = r - delta;
  //p.setZ( r2.getZ() );
  //p.setX( r.getX() + (a.getX() / a.getZ()) * (r2.getZ() - r.getZ()) );
  //p.setY( r.getY() + (a.getY() / a.getZ()) * (r2.getZ() - r.getZ()) );
}

Float_t HMetaAlignerTask::calcSign(HGeomVector &r,HGeomVector &alpha,HGeomVector &rOut)
{
  Float_t test = (r.getZ() - rOut.getZ()) * alpha.getY() -
    (r.getY() - rOut.getY()) * alpha.getZ();
  return (test>0)?1:-1;
}

Int_t HMetaAlignerTask::execute(void) {
  HMdcSeg *seg = 0;
  HTofHit *tofHit = 0;
  HShowerHit *shoHit = 0;
  Int_t id=0,sys=2;
  HGeomVector r,alpha,rOut,rTemp,rClosest;
  HGeomVector rLocal,rOutLocal,alphaLocal;
  Float_t dist=5000,temp=5000,sig=0,beta;

  //Float_t distMax = 1000.;
  Float_t distMax = 300.;

  for (Int_t sector=0; sector<6; sector++) {
    fInnerOuterLoc[0] = sector;
    fMdcIter->Reset();
    fMdcIter->gotoLocation(fInnerOuterLoc);
    while ( (seg = (HMdcSeg *)fMdcIter->Next()) != 0) {
      id = 0;
      fMdcGeom.transform(seg,r,alpha);

      fTofIter->Reset();
      while ( (tofHit = (HTofHit *)fTofIter->Next()) != 0) {
    if (tofHit->getSector() == sector) {
      fTofGeom.transform(tofHit,rTemp);
      temp = distance(r,alpha,rTemp);
      if ( temp < distMax ) {
        HGeomTransform &t=fTofGeom.getTransform(sector,tofHit->getModule());
        rOut = rTemp;
        calcClosestPoint(r,alpha,rOut,rClosest);
        sig = calcSign(rClosest,alpha,rOut);
        dist = temp;
        id++;
        sys = 1;
        fTofGeom.toLocal(rClosest,tofHit,rLocal);
        fTofGeom.toLocal(rOut,tofHit,rOutLocal);
        alphaLocal = t.getRotMatrix() * alpha;
        // Calculate intersection with detector plane
        beta = alphaLocal.getX() / alphaLocal.getZ();
        rLocal.setX(rLocal.getX() +
            beta * (rOutLocal.getZ() - rLocal.getZ()));
        beta = alphaLocal.getY() / alphaLocal.getZ();
        rLocal.setY(rLocal.getY() +
            beta * (rOutLocal.getZ() - rLocal.getZ()));
        rLocal.setZ(rOutLocal.getZ());
      }
    }
      }

      fShowerIter->Reset();
      while ( (shoHit = (HShowerHit *)fShowerIter->Next()) != 0) {
    if (shoHit->getSector() == sector && shoHit->getModule() == 0) {
      //fShowerGeom.transform(shoHit,rTemp);
      fShowerGeom.transform(shoHit, rTemp);
      temp = distance(r,alpha,rTemp);
      if ( temp < distMax ) {
        const HGeomTransform &t=fShowerGeom.getTransform(sector);
        rOut = rTemp;
        dist = temp;
        calcClosestPoint(r,alpha,rOut,rClosest);
        fShowerGeom.toLocal(rClosest,sector,rLocal);
        fShowerGeom.toLocal(rOut,sector,rOutLocal);
        alphaLocal = t.getRotMatrix() * alpha;
        sig = calcSign(rClosest,alpha,rOut);
        id++;
        sys = 0;
        // Calculate intersection with detector plane
        beta = alphaLocal.getX() / alphaLocal.getZ();
        rLocal.setX(rLocal.getX() +
            beta * (rOutLocal.getZ() - rLocal.getZ()));
        beta = alphaLocal.getY() / alphaLocal.getZ();
        rLocal.setY(rLocal.getY() +
            beta * (rOutLocal.getZ() - rLocal.getZ()));
        rLocal.setZ(rOutLocal.getZ());
      }
    }
      }
      if (id == 1) {
    fData->Fill(dist,rClosest.getX(),rClosest.getY(),rClosest.getZ(),
            rOut.getX(),rOut.getY(),rOut.getZ(),id,
            sector,sys,sig);
    fDataLocal->Fill(rLocal.getX(),rLocal.getY(),rLocal.getZ(),
             rOutLocal.getX(),rOutLocal.getY(),rOutLocal.getZ(),
             sector,sys);
      }
    }
  }

  return 0;
}

Bool_t HMetaAlignerTask::init(void) {
  Bool_t r = kFALSE;
  HEvent *ev = 0;

  if (!gHades) return kFALSE;
  ev = gHades->getCurrentEvent();

  r = fMdcGeom.init() && fTofGeom.init() && fShowerGeom.init();

  fData = new TNtuple("metaAlign","Meta Alignment","d:xc:yc:zc:xo:yo:zo:n:s:sys:sig");
  fDataLocal = new TNtuple("metaAlignLoc","Meta Alignment Local",
               "xc:yc:zc:xo:yo:zo:s:sys");

  fMdcHits = ev->getCategory(catMdcSeg);
  fShowerHits = ev->getCategory(catShowerHit);
  fTofHits = ev->getCategory(catTofHit);

  if (!(fMdcHits && fShowerHits && fTofHits)) return kFALSE;

  fMdcIter = (HIterator *)fMdcHits->MakeIterator();
  fShowerIter = (HIterator *)fShowerHits->MakeIterator();
  fTofIter = (HIterator *)fTofHits->MakeIterator();

  fInnerOuterLoc.set(2,0,0);
  return r;
}

Bool_t HMetaAlignerTask::reinit(void) {
  Bool_t r = kTRUE;

  return r;
}

Bool_t HMetaAlignerTask::finalize(void) {
  Bool_t r = kTRUE;

  gHades->getOutputFile()->cd();
  fData->Write();
  fDataLocal->Write();

  return r;
}


ClassImp(HMetaAlignerKickShowerTransform)
ClassImp(HMetaAlignerKickTofTransform)
ClassImp(HMetaAlignerKickMdcTransform)
ClassImp(HMetaAlignerTask)

Last change: Sat May 22 13:04:35 2010
Last generated: 2010-05-22 13:04

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.