#include "hmdcgetcontainers.h"
#include "hkicktask.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdclayergeompar.h"
#include "hmdcgeompar.h"
#include "hmdcdetector.h"
#include "hspecgeompar.h"
#include "hmdcgeomstruct.h"
#include "hmdcrawstruct.h"
#include "hmdclookupgeom.h"
#include "hkickplane2.h"
#include "hgeomcompositevolume.h"
#include "hdetgeompar.h"
#include "hgeomtransform.h"
#include "hgeomvolume.h"
#include "hparset.h"
#include "heventheader.h"

//*-- AUTHOR : Pechenov Vladimir
//*-- Modified : 07/05/2002 by V.Pechenov
//*-- Modified : 08/05/2001
//*-- Modified : 29/09/2000

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
// HMdcGetContainers
//
// The table for geting of pointers to param.&data containers
// Using:
//    HMdcGetContainers* fGetCont=HMdcGetContainers::getObject();
// If the cont. HMdcGetContainers not exist it will automaticaly 
// created and added to RuntimeDb
//
//    HMdcGeomPar* fgeomPar=fGetCont->getMdcGeomPar(Bool_t init=kFALSE);
// If cont. HMdcGeomPar don't exist & init=kTURUE it will created and initialized
//    ...
//
// Transformations:
// lab <--> sector
//    const HGeomTransform& getLabTransSec(Int_t sec, Bool_t init=kFALSE);
//    Bool_t getLabTransSec(HGeomTransform& trans, Int_t sec, 
//        Bool_t init=kFALSE);
// lab <--> module
//    const HGeomTransform& getLabTransMod(Int_t sec,Int_t mod,
//        Bool_t init=kFALSE);
//    Bool_t getLabTransMod(HGeomTransform& trans, Int_t sec, Int_t mod,
//        Bool_t init=kFALSE);
// lab <--> layer
//    Bool_t getLabTransLayer(HGeomTransform& trans, Int_t sec,Int_t mod,
//        Int_t lay, Bool_t init=kFALSE);
// sector <--> module
//    Bool_t getSecTransMod(HGeomTransform& trans, Int_t sec, Int_t mod,
//        Bool_t init=kFALSE);
// sector <--> layer
//    Bool_t getSecTransLayer(HGeomTransform& trans, Int_t sec,Int_t mod,
//        Int_t lay, Bool_t init=kFALSE);
// module <--> layer
//    const HGeomTransform& getModTransLayer(Int_t mod, Int_t lay,
//        Bool_t init=kFALSE);
//    Bool_t getModTransLayer(HGeomTransform& trans, Int_t mod, Int_t lay,
//        Bool_t init=kFALSE);
//
//  Next finctions do shift of the transfomation
//  vector to real position of the sens. wires plane.
//    Bool_t getModTransLayerZ0(HGeomTransform& trans, Int_t mod, Int_t lay,
//        Bool_t init=kFALSE);
//    Bool_t getLabTransLayerZ0(HGeomTransform& trans, Int_t sec,Int_t mod,
//        Int_t lay, Bool_t init=kFALSE);
//    Bool_t getSecTransLayerZ0(HGeomTransform& trans, Int_t sec,Int_t mod,
//        Int_t lay, Bool_t init=kFALSE);
//
//////////////////////////////////////////////////////////////////

ClassImp(HMdcGetContainers)


HMdcGetContainers* HMdcGetContainers::fMdcGetContainers=0;
    
 HMdcGetContainers::HMdcGetContainers() {
//  fName="MdcGetContainers";
//  fTitle="The table for geting of pointers to param.&data containers";
//  strcpy(detName,"Mdc");
  rtdb=0;
  spectr=0;
  isRtdb=kFALSE;
  if(gHades) {
    rtdb=gHades->getRuntimeDb();
//    rtdb->addContainer(this);
    isRtdb=kTRUE;
    spectr=gHades->getSetup(); 
  } else Warning("HMdcGetContainers","gHades=%i",0);
  
  fMdcLayerGeomPar=0;
  isMdcLayerGeomPar=kFALSE;
  fMdcGeomPar=0;
  isMdcGeomPar=kFALSE;
  fMdcDetector=0;
  isMdcDetector=kFALSE;
  fSpecGeomPar=0;
  isSpecGeomPar=kFALSE;
  fMdcGeomStruct=0;
  isMdcGeomStruct=kFALSE;
  fMdcRawStruct=0;
  isMdcRawStruct=kFALSE;
  fMdcLookupGeom=0;
  isMdcLookupGeom=kFALSE;
  fKickPlane=0;
  isKickPlane=kFALSE;
}

 void HMdcGetContainers::deleteCont() {
  if(fMdcGetContainers) {
    delete fMdcGetContainers;
    fMdcGetContainers=0;
  }
}

 HMdcGetContainers* HMdcGetContainers::getObject() {
  if(!fMdcGetContainers) fMdcGetContainers=new HMdcGetContainers();
  return fMdcGetContainers;
}

 Bool_t HMdcGetContainers::initCont(HParSet *par) {
  if( !par ) return kFALSE;
  if( !isInited(par) || !par->isStatic() ) return kTRUE;
  return par->init();
}

 Bool_t HMdcGetContainers::isInited(HParSet *par) {
 if( !par ) return kFALSE;
 return (par->getInputVersion(1)>=0 || par->getInputVersion(2)>=0)
            ? kTRUE:kFALSE;
}

 HMdcLayerGeomPar* HMdcGetContainers::getMdcLayerGeomPar(Bool_t init) {
  if( !fMdcLayerGeomPar && isRtdb )
    fMdcLayerGeomPar=(HMdcLayerGeomPar*)rtdb->getContainer("MdcLayerGeomPar");
  if( init && !isMdcLayerGeomPar ) isMdcLayerGeomPar=initCont(fMdcLayerGeomPar);
  return fMdcLayerGeomPar;
}

 HMdcGeomPar* HMdcGetContainers::getMdcGeomPar(Bool_t init) {
  if( !fMdcGeomPar && isRtdb )
    fMdcGeomPar=(HMdcGeomPar*)rtdb->getContainer("MdcGeomPar");
  if( init && !isMdcGeomPar ) isMdcGeomPar=initCont(fMdcGeomPar);
  return fMdcGeomPar;
}
    
 HMdcDetector* HMdcGetContainers::getMdcDetector() {
  if( !fMdcDetector )
    fMdcDetector=(HMdcDetector*)gHades->getSetup()->getDetector("Mdc");
  return fMdcDetector;
}

 HSpecGeomPar* HMdcGetContainers::getSpecGeomPar(Bool_t init) {
  if( !fSpecGeomPar && isRtdb )
    fSpecGeomPar=(HSpecGeomPar*)rtdb->getContainer("SpecGeomPar");
  if( init&& !isSpecGeomPar ) isSpecGeomPar=initCont(fSpecGeomPar);
  return fSpecGeomPar;
}


 HMdcGeomStruct* HMdcGetContainers::getMdcGeomStruct(Bool_t init) {
  if( !fMdcGeomStruct && isRtdb )
    fMdcGeomStruct=(HMdcGeomStruct*)rtdb->getContainer("MdcGeomStruct");
  if( init && !isMdcGeomStruct ) isMdcGeomStruct=initCont(fMdcGeomStruct);
  return fMdcGeomStruct;
}


 HMdcRawStruct* HMdcGetContainers::getMdcRawStruct(Bool_t init) {
  if( !fMdcRawStruct && isRtdb )
    fMdcRawStruct=(HMdcRawStruct*)rtdb->getContainer("MdcRawStruct");
  if( init && !isMdcRawStruct ) isMdcRawStruct=initCont(fMdcRawStruct);
  return fMdcRawStruct;
}

 HMdcLookupGeom* HMdcGetContainers::getMdcLookupGeom(Bool_t init) {
  if( !fMdcLookupGeom && isRtdb )
    fMdcLookupGeom=(HMdcLookupGeom*)rtdb->getContainer("MdcLookupGeom");
  if( init && !isMdcLookupGeom ) isMdcLookupGeom=initCont(fMdcLookupGeom);
  return fMdcLookupGeom;
}

 HKickPlane2* HMdcGetContainers::getKickPlane(Bool_t init) {
  if( !fKickPlane ) fKickPlane = HKickPlane2::getMDC3();
  if( init && !isKickPlane ) isKickPlane=initCont(fKickPlane);
  return fKickPlane;
}

//------------------------------------------------------------------------

 HGeomCompositeVolume* HMdcGetContainers::getGeomCompositeVolume(
    Int_t mod, Bool_t init) {
  if(!fMdcGeomPar && isMdcGeomPar ) getMdcGeomPar(init);
  return (fMdcGeomPar) ? fMdcGeomPar->getRefVolume(mod) : 0;
}

 HMdcLayerGeomParLay* HMdcGetContainers::getMdcLayerGeomParLay(
    Int_t sec,Int_t mod,Int_t lay, Bool_t init) {
  getMdcLayerGeomPar(init);
  if( !fMdcLayerGeomPar ) return 0;
  HMdcLayerGeomParSec* fsec=&((*fMdcLayerGeomPar)[sec]);
  if( !fsec ) return 0;
  HMdcLayerGeomParMod* fmod=&((*fsec)[mod]);
  if( !fmod ) return 0;
  return &((*fmod)[lay]);
}

 HModGeomPar* HMdcGetContainers::getModGeomPar(Int_t sec,Int_t mod,Bool_t init) {
  getMdcGeomPar(init);
  return (fMdcGeomPar) ? fMdcGeomPar->getModule(sec,mod) : 0;
}

 const HGeomTransform& HMdcGetContainers::getLabTransSec(Int_t sec,Bool_t init) {
  // return transformation sector<-->lab.
  HSpecGeomPar* fSpecGeomPar=getSpecGeomPar(init);
  if(fSpecGeomPar) {
    HGeomVolume* fVol=fSpecGeomPar->getSector(sec);
    if(fVol) return fVol->getTransform();
  }
  Error("getLabTransSec","can't get the transformation lab.<-->sec. (S%i)",
      sec+1);
  return *((HGeomTransform*)0);
}

 Bool_t HMdcGetContainers::getLabTransSec(HGeomTransform& trans, Int_t sec,
    Bool_t init) {
  const HGeomTransform& tr=getLabTransSec(sec,init);
  if( !&tr ) return kFALSE;
  trans=tr;
  return kTRUE;
}

 const HGeomTransform& HMdcGetContainers::getLabTransMod(Int_t sec, Int_t mod,
    Bool_t init) {
  //return transformation module<-->lab.
  HModGeomPar* fMod=getModGeomPar(sec,mod,init);
  if(fMod) return fMod->getLabTransform();
  Error("getLabTransMod","can't get the transformation lab.<-->mod. (S%iM%i)",
      sec+1,mod+1);
  return *((HGeomTransform*)0);
}

 Bool_t HMdcGetContainers::getLabTransMod(HGeomTransform& trans, Int_t sec,
    Int_t mod, Bool_t init) {
  const HGeomTransform& tr=getLabTransMod(sec,mod,init);
  if( !&tr ) return kFALSE;
  trans=tr;
  return kTRUE;
}

 Bool_t HMdcGetContainers::getSecTransMod(HGeomTransform& trans, Int_t sec, 
    Int_t mod, Bool_t init) {
  //return transformation module<-->sector.
  const HGeomTransform& tr=getLabTransMod(sec,mod,init);
  if( !&tr ) return kFALSE;
  const HGeomTransform& fSec=getLabTransSec(sec,init);
  if( &fSec==0 ) return kFALSE;
  trans=tr;
  trans.transTo(fSec);
  return kTRUE;
}

 const HGeomTransform& HMdcGetContainers::getModTransLayer( Int_t mod, Int_t lay, 
    Bool_t init) {
  //return transformation layer<-->module.
  HGeomCompositeVolume* fMod=getGeomCompositeVolume(mod,init);
  if(fMod) {
    HGeomVolume* fVol=fMod->getComponent(lay);
    if(fVol) {
      const HGeomTransform& trans=fVol->getTransform();
      if(&trans) return trans;
    }
  }
  Error("getModTransLayer",
    "can't get the transformation mod.<-->lay. (M%iL%i)",mod+1,lay+1);
  return *((HGeomTransform*)0);
}

 Bool_t HMdcGetContainers::getModTransLayer(HGeomTransform& trans, Int_t mod, 
    Int_t lay, Bool_t init) {
  const HGeomTransform& tr=getModTransLayer(mod,lay,init);
  if( !&tr ) return kFALSE;
  trans=tr;
  return kTRUE;
}

 Bool_t HMdcGetContainers::getLabTransLayer(HGeomTransform& trans, 
    Int_t sec,Int_t mod, Int_t lay, Bool_t init) {
  //return transformation layer<-->lab.
  const HGeomTransform& tr=getModTransLayer(mod,lay,init);
  if( !&tr ) return kFALSE;
  const HGeomTransform& fLabMod=getLabTransMod(sec,mod,init);
  if( !&fLabMod ) return kFALSE;
  trans=tr;
  trans.transFrom(fLabMod);
  return kTRUE;
}

 Bool_t HMdcGetContainers::getSecTransLayer(HGeomTransform& trans, 
    Int_t sec,Int_t mod, Int_t lay, Bool_t init) {
  //return transformation layer<-->sector.
  if( !getLabTransLayer(trans,sec,mod,lay,init) )return kFALSE;
  const HGeomTransform& fSec=getLabTransSec(sec,init);
  if(&fSec==0) return kFALSE;
  trans.transTo(fSec); 
  return kTRUE;
}

 Bool_t HMdcGetContainers::getModTransLayerZ0(HGeomTransform& trans, 
    Int_t mod, Int_t lay, Bool_t init) {
  //return transformation layer<-->module (do shift of the transfomation
  // vector along Z to real position of the sens. wires plane).
  HGeomCompositeVolume* fMod=getGeomCompositeVolume(mod,init);
  if(fMod) {
    HGeomVolume* fVol=fMod->getComponent(lay);
    if(fVol) {
      Double_t zShift=
          (fVol->getPoint(0)->getZ()+fVol->getPoint(4)->getZ())*0.5;
      const HGeomTransform& tr=fVol->getTransform();
      if( !&tr ) return kFALSE;
      trans=tr;
      HGeomVector trVec(trans.getTransVector());
      trVec.setZ(trVec.getZ() + zShift);
      trans.setTransVector(trVec);
      return kTRUE;
    }
  }
  Error("getModTransLayerZ0",
    "can't get the transformation mod.<-->lay. (M%iL%i)",mod+1,lay+1);
  return kFALSE;
}

 Bool_t HMdcGetContainers::getLabTransLayerZ0(HGeomTransform& trans, 
    Int_t sec,Int_t mod, Int_t lay, Bool_t init) {
  //return transformation layer<-->lab. (do shift of the transfomation
  // vector along Z to real position of the sens. wires plane).
  const HGeomTransform& fLabMod=getLabTransMod(sec,mod,init);
  if( !&fLabMod ) return kFALSE;
  if( !getModTransLayerZ0(trans, mod,lay,init) ) return kFALSE;
  trans.transFrom(fLabMod); 
  return kTRUE;
}


 Bool_t HMdcGetContainers::getSecTransLayerZ0(HGeomTransform& trans, 
    Int_t sec,Int_t mod, Int_t lay, Bool_t init) {
  //return transformation layer<-->sector (do shift of the transfomation
  // vector along Z to real position of the sens. wires plane).
  const HGeomTransform& fSec=getLabTransSec(sec,init);
  if( !&fSec ) return kFALSE;
  if( !getLabTransLayerZ0(trans,sec,mod,lay,init) )return kFALSE;
  trans.transTo(fSec); 
  return kTRUE;
}

 Bool_t HMdcGetContainers::getSecTransCathLayerZ0(HGeomTransform& trans1, 
    HGeomTransform& trans2, Int_t sec,Int_t mod, Int_t lay, Bool_t init) {
  //return transformations of two cathode layers<-->sector (do shift of the transfomation
  // vector along Z to real position of the sens. wires plane).
  const HGeomTransform& fSec=getLabTransSec(sec,init);
  if( !&fSec ) return kFALSE;
  const HGeomTransform& fLabMod=getLabTransMod(sec,mod,init);
  if( !&fLabMod ) return kFALSE;
  HMdcLayerGeomPar* fLayerGeomPar = getMdcLayerGeomPar(init);
  if(!fLayerGeomPar) return kFALSE;
  HMdcLayerGeomParLay& fLayerGeomParLay = (*fLayerGeomPar)[sec][mod][lay];
  if(!&fLayerGeomParLay) {
    Error("getSecTransCathLayerZ0",
        "can't get MdcLayerGeomParLay cont. (%iS %iM %iL)",sec+1,mod+1,lay+1);
    return kFALSE;
  }
  Double_t halfCatDist=fLayerGeomParLay.getCatDist()*0.5;
  HGeomCompositeVolume* fMod=getGeomCompositeVolume(mod,init);
  if(!fMod) {
    Error("getSecTransCathLayerZ0",
        "can't get the transformation mod.<-->lay. (M%iL%i)",mod+1,lay+1);
  }
  HGeomVolume* fVol=fMod->getComponent(lay);
  if(!fVol) return kFALSE;
  Double_t zShift=(fVol->getPoint(0)->getZ()+fVol->getPoint(4)->getZ())*0.5;
  const HGeomTransform& tr=fVol->getTransform();
  if( !&tr ) return kFALSE;
  trans1=tr;
  trans2=tr;
  HGeomVector trVec1(tr.getTransVector());
  trVec1.setZ(trVec1.getZ() + zShift);
  HGeomVector trVec2(trVec1);
  trVec1.setZ(trVec1.getZ() - halfCatDist);
  trVec2.setZ(trVec2.getZ() + halfCatDist);
  trans1.setTransVector(trVec1);
  trans2.setTransVector(trVec2);
  
  trans1.transFrom(fLabMod);
  trans2.transFrom(fLabMod);
  
  trans1.transTo(fSec);
  trans2.transTo(fSec);
  return kTRUE;
}

//------Categories:-------------------------
 HCategory* HMdcGetContainers::getCatMdcClus(Bool_t create) {
  HCategory *fClusCat = gHades->getCurrentEvent()->getCategory(catMdcClus);
  if(!fClusCat && create) {
    Int_t sizes[3]={6,2,500};   // sec, seg, clust.(maximum 500 clusters in seg)
    if(isGeant()) fClusCat = new HMatrixCategory("HMdcClusSim",3,sizes,0.2);
    else fClusCat = new HMatrixCategory("HMdcClus",3,sizes,0.5);
    gHades->getCurrentEvent()->addCategory(catMdcClus,fClusCat,"Mdc");
  }
  return fClusCat;
}

 HCategory* HMdcGetContainers::getCatMdcTrkCand(Bool_t create) {
  if(gHades==0) return 0; 
  HCategory *fTrkCandCat =gHades->getCurrentEvent()->getCategory(catMdcTrkCand);
  if(!fTrkCandCat && create) {
    HMdcDetector* fMdcDet=
        (HMdcDetector*)(gHades->getSetup()->getDetector("Mdc"));
    if(!fMdcDet) return 0;
    fTrkCandCat=fMdcDet->buildCategory(catMdcTrkCand);
    if (!fTrkCandCat) return 0;
    gHades->getCurrentEvent()->addCategory(catMdcTrkCand,fTrkCandCat,"Mdc");
  }
  return fTrkCandCat;
}

 HCategory* HMdcGetContainers::getCatMdcClusFit(Bool_t create) {
  HCategory *fClFitCat = gHades->getCurrentEvent()->getCategory(catMdcClusFit);
  if(!fClFitCat && create) {  
    if(isGeant()) fClFitCat = new HLinearCategory("HMdcClusFitSim",4000);  
    else fClFitCat = new HLinearCategory("HMdcClusFit",4000);
    gHades->getCurrentEvent()->addCategory(catMdcClusFit,fClFitCat,"Mdc");
  }
  return fClFitCat;
}

 HCategory* HMdcGetContainers::getCatMdcWireFit(Bool_t create) {
  HCategory *fClWireCat = gHades->getCurrentEvent()->getCategory(catMdcWireFit);
  if(!fClWireCat && create) {
    if(isGeant()) fClWireCat = new HLinearCategory("HMdcWireFitSim",40000);  
    else          fClWireCat = new HLinearCategory("HMdcWireFit",   40000);
    gHades->getCurrentEvent()->addCategory(catMdcWireFit,fClWireCat,"Mdc");
  }
  return fClWireCat;
}

 HCategory* HMdcGetContainers::getCatMdcClusInf(Bool_t create) {
  HCategory *fClusInf = gHades->getCurrentEvent()->getCategory(catMdcClusInf);
  if(!fClusInf && create) {    
    if(isGeant()) fClusInf = new HLinearCategory("HMdcClusInfSim",4000);
    else fClusInf = new HLinearCategory("HMdcClusInf",4000);
    gHades->getCurrentEvent()->addCategory(catMdcClusInf,fClusInf,"Mdc");
  }
  return fClusInf;
}

 void HMdcGetContainers::getFileName(TString& fileName) {
  // Return file name without dir.name and extension (.hld, .root, ...)
  getFileNameWInd(fileName);
  Int_t ind=fileName.Index(".");
  if(ind>0) fileName=fileName.Remove(ind);
}

 void HMdcGetContainers::getFileNameWInd(TString& fileName) {
  // Return file name without dir.name
  fileName=gHades->getRuntimeDb()->getCurrentFileName();
  Int_t ind=fileName.Index("/");
  while(ind>=0) {
    fileName=fileName.Remove(0,ind+1);
    ind=fileName.Index("/");
  }
}

 void HMdcGetContainers::getRunId(TString& runId) {
  // Return runId
  HEventHeader* evHeader=gHades->getCurrentEvent()->getHeader();
  if(!evHeader) {
    runId="";
    return;
  }
  UInt_t id=evHeader->getEventRunNumber();
  char buf[20];
  sprintf(buf,"%i",id);
  runId=buf;
}

 void HMdcGetContainers::getEventDate(TString& eventDate) {
  // Return current event date
  HEventHeader* evHeader=gHades->getCurrentEvent()->getHeader();
  if(!evHeader) {
    eventDate="";
    return;
  }
  UInt_t date=evHeader->getDate();
  UChar_t* dt=(UChar_t*)&date;
  char buf[20];
  sprintf(buf,"%02i-%02i-%4i",dt[0],dt[1]+1,1900+dt[2]);
  eventDate=buf;
}

 void HMdcGetContainers::getEventTime(TString& eventTime) {
  // Return current event time
  HEventHeader* evHeader=gHades->getCurrentEvent()->getHeader();
  if(!evHeader) {
    eventTime="";
    return;
  }
  UInt_t time=evHeader->getTime();
  UChar_t* tm=(UChar_t*)&time;
  char buf[20];
  sprintf(buf,"%02i:%02i:%02i",tm[2],tm[1],tm[0]);
  eventTime=buf;
}


ROOT page - Class index - Class Hierarchy - Top of the page

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.