#include "TpcDigiMapper.h" #include "TpcPad.h" #include "TpcAbsPadShape.h" #include "TpcDigiPar.h" #include "TpcFrontend.h" #include #include #include #ifdef TESTCHAMBER #include "Calib.h" #endif TpcDigiMapper* TpcDigiMapper::finstance = NULL; TpcDigiMapper::~TpcDigiMapper() { // do not delete the members! they might not belong to you!!! } TpcDigiMapper::TpcDigiMapper() : fgas(NULL), fpadShapes(NULL), fpadPlane(NULL), fForceDrift(false), fInit(false), fFieldCorrection(false), fManDrift(false) { ; } double TpcDigiMapper::z_from_tick(double t,double vdr) const{ if(!fInit) { std::string msg("Trying to use TpcDigiMapper::z_from_tick, but TpcDigiMapper was not initialized!"); std::runtime_error err(msg); throw err; } double v=vdr; if(v<=0.){ if(fForceDrift) v=fManDrift; else v=fgas->VDrift(); } // std::cout<<" t: "<VDrift(); } return ( ( (z/v)-ft0)/ftbin ); } double TpcDigiMapper::t_from_tick(double samples) const { if(!fInit) { std::string msg("Trying to use TpcDigiMapper::t_from_tick, but TpcDigiMapper was not initialized!"); std::runtime_error err(msg); throw err; } return (samples*ftbin+ft0); } double TpcDigiMapper::t_to_ticks(double t) const { if(!fInit) { std::string msg("Trying to use TpcDigiMapper::t_to_ticks, but TpcDigiMapper was not initialized!"); std::runtime_error err(msg); throw err; } return t/ftbin; } void TpcDigiMapper::map(const TpcDigi* const fdig, TVector3& fvec) { if(!fInit) { std::string msg("Trying to use TpcDigiMapper::map, but TpcDigiMapper was not initialized!"); std::runtime_error err(msg); throw err; } double x,y,z; #ifndef TESTCHAMBER z=z_from_tick(fdig->t()); #else z =z_from_tick(fdig->t(),Calib::getInstance()->get_vdr()); #endif fpadPlane->GetPadXY(fdig->padId(),x,y); fvec.SetXYZ(x,y,z); } void TpcDigiMapper::map(const TpcSample* const fsamp, TVector3& fvec) { if(!fInit) { std::string msg("Trying to use TpcDigiMapper::map, but TpcDigiMapper was not initialized!"); std::runtime_error err(msg); throw err; } double x,y,z; #ifndef TESTCHAMBER z=z_from_tick(fsamp->t()); #else z =z_from_tick(fsamp->t(),Calib::getInstance()->get_vdr()); #endif fpadPlane->GetPadXY(fsamp->padId(),x,y); fvec.SetXYZ(x,y,z); } //TODO: The DigiMapper should not be responsible for supplying the padplane! //We have the parameter handling for that! //(F.B.) void TpcDigiMapper::padsize(const unsigned int id, double& dx, double& dy) { double angle=fpadPlane->GetPad(id)->angle(); fpadPlane->GetPad(id)->shape()->EvalBoundingRect(dx, dy,angle); } TpcPad* TpcDigiMapper::getPad(unsigned int id){return fpadPlane->GetPad(id);} void TpcDigiMapper::init(TpcDigiPar* dp) { if(fInit) { //Protection against re-initialization std::string msg("TpcDigiMapper has already been initialized!"); std::cerr<<"TpcDigiMapper has already been initialized!"<getGem(); //fzGem=dp->getZGem(); fgas=dp->getGas(); fpadPlane=dp->getPadPlane(); fpadShapes=dp->getPadShapes(); ft0=dp->getFrontend()->t0(); ftbin=1./dp->getFrontend()->samplingFrequency()*1000; // 1/MHz -> ns fManDrift=dp->getManDriftVel(); if(fManDrift>0){ fForceDrift=true; } fmaxSamples=dp->getFrontend()->maxSamples(); fzDrift=dp->getZMax(); fInit = true; } void TpcDigiMapper::init(TpcPadPlane* plane, const TpcGem* gem, const TpcGas* gas, const TpcPadShapePool*padShapes, double t0, double sampleFreq, unsigned int maxSamples, double zDrift, double driftvel) { if(fInit) { //Protection against re-initialization std::string msg("TpcDigiMapper has already been initialized!"); std::runtime_error err(msg); throw err; } fgem=gem; fgas=gas; fpadPlane=plane; fpadShapes=padShapes; ft0=t0; ftbin=1./sampleFreq*1000; // 1/MHz -> ns fInit=true; if (driftvel>=0) { fManDrift=driftvel; fForceDrift=true; } fmaxSamples=maxSamples; fzDrift=zDrift; }