#include "hgeantmdc.h"
#include "hgeantkine.h"
#include "hmdcdigitizer.h"
#include "hmdcdef.h"
#include "hdebug.h"
#include "hades.h"
#include "hmdcgeantcell.h"
#include "hmdccal1sim.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hevent.h"
#include "hcategory.h"
#include "hlocation.h"
#include "hmdclayergeompar.h"
#include "hmdcdigitpar.h"
#include "hmdccal2parsim.h"
#include "hmdccelleff.h"
#include "hmdcwirestat.h"
#include "hmessagemgr.h"
#include "hmdcsizescells.h"
#include "hmdcdedx2.h"
#include "hmdctimecut.h"
#include "hmdcgeomstruct.h"
#include "TMath.h"
#include "TFile.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
Float_t HMdcDigitizer::dTime [15] = {0.};
Float_t HMdcDigitizer::dTime2[15] = {0.};
Float_t HMdcDigitizer::dTimeErr [15] = {0.};
Float_t HMdcDigitizer::dTime2Err[15] = {0.};
Float_t HMdcDigitizer::minimumdist[15] = {0.};
Int_t HMdcDigitizer::track[15] = {-99};
Float_t HMdcDigitizer::timeOfFlight[15] = {0.};
Float_t HMdcDigitizer::angle[15] = {0.};
Int_t HMdcDigitizer::statusflag[15] = {0};
Float_t HMdcDigitizer::fractionOfmaxCharge[15] = {0};
Bool_t HMdcDigitizer::cutEdge[15] = {kFALSE};
Float_t HMdcDigitizer::wireOffset[15] = {0.};
HMdcDigitizer::HMdcDigitizer(void)
{
initVariables();
}
HMdcDigitizer::HMdcDigitizer(const Text_t *name,const Text_t *title):
HReconstructor(name,title)
{
initVariables();
}
HMdcDigitizer::HMdcDigitizer(const Text_t *name,const Text_t *title,Int_t TDCMODE,Bool_t NTUPLE) :
HReconstructor(name,title)
{
initVariables();
setTdcMode(TDCMODE);
setNTuple(NTUPLE);
}
HMdcDigitizer::~HMdcDigitizer(void) {
if(iterin) delete iterin;
if(itercell) delete itercell;
if(itercal1) delete itercal1;
}
void HMdcDigitizer::setOffsets(Float_t off0,Float_t off1,Float_t off2,Float_t off3,Int_t on_off)
{
if(on_off == 1)
{
useOffsets = kTRUE;
}
else
{
useOffsets = kFALSE;
}
offsets[0] = off0;
offsets[1] = off1;
offsets[2] = off2;
offsets[3] = off3;
}
void HMdcDigitizer::setEffLevel(Float_t eff0,Float_t eff1,Float_t eff2,Float_t eff3,Int_t on_off)
{
if(on_off == 1)
{
useCellEff = kTRUE;
}
else
{
useCellEff = kFALSE;
}
effLevel[0] = eff0;
effLevel[1] = eff1;
effLevel[2] = eff2;
effLevel[3] = eff3;
}
void HMdcDigitizer::setNoiseLevel(Float_t noise0,Float_t noise1,Float_t noise2,Float_t noise3,Int_t on_off)
{
if(on_off == 1)
{
useNoise = kTRUE;
}
else
{
useNoise = kFALSE;
}
noiseLevel[0] = noise0 * 0.01;
noiseLevel[1] = noise1 * 0.01;
noiseLevel[2] = noise2 * 0.01;
noiseLevel[3] = noise3 * 0.01;
}
void HMdcDigitizer::setNoiseRange(Int_t rangeLo0,Int_t rangeLo1,Int_t rangeLo2,Int_t rangeLo3,
Int_t rangeHi0,Int_t rangeHi1,Int_t rangeHi2,Int_t rangeHi3)
{
noiseRangeLo[0] = rangeLo0;
noiseRangeLo[1] = rangeLo1;
noiseRangeLo[2] = rangeLo2;
noiseRangeLo[3] = rangeLo3;
noiseRangeHi[0] = rangeHi0;
noiseRangeHi[1] = rangeHi1;
noiseRangeHi[2] = rangeHi2;
noiseRangeHi[3] = rangeHi3;
}
void HMdcDigitizer::setScalerTime1Err(Float_t m0,Float_t m1,Float_t m2,Float_t m3)
{
scaleError[0] = m0;
scaleError[1] = m1;
scaleError[2] = m2;
scaleError[3] = m3;
}
void HMdcDigitizer::initVariables()
{
fGeantCellCat = 0;
fCalCat = 0;
fDigitGeomPar = 0;
fDigitPar = 0;
fCal2ParSim = 0;
fCellEff = 0;
fWireStat = 0;
fTimeCut = 0;
fsizescells = 0;
fdEdX = 0;
fCal = 0;
fCalnoise = 0;
fCell = 0;
iterin = 0;
itercell = 0;
itercal1 = 0;
fEventId = 0;
pi = acos(-1.)/180;
time1 = 0;
time1Error = 0;
time2 = 0;
time2Error = 0;
setTdcMode(2);
setEffLevel (90 ,90 ,90 ,90);
setNoiseLevel(5. ,5. ,5. ,5.);
setOffsets (1.5,2.5,4.5,5.5);
setOffsetsUse (kFALSE);
setCellEffUse (kTRUE);
setWireStatUse (kFALSE);
setWireStatEffUse(kTRUE);
setWireStatOffsetUse(kTRUE);
setNoiseUse (kFALSE);
setTofUse (kTRUE);
setErrorUse (kTRUE);
setWireOffsetUse(kTRUE);
setDeDxUse (kTRUE);
setTimeCutUse (kFALSE);
setNTuple (kFALSE);
hasPrinted = kFALSE;
setTime1Noise(0.);
setTime2Noise(0.);
resetListVariables();
setNoiseMode(1);
for(Int_t i = 0; i < 5; i ++)
{
arrayNoise[i] = 0;
}
setNoiseRange(-500,-500,-500,-500,
1500,1500,1500,1500);
setNoiseBandWidth(20.);
setNoiseWhiteWidth(500.);
setNoiseWhiteRatio(0.1);
setEmbeddingMode(1);
setSignalSpeed(0.004);
for(Int_t i = 0; i < 4; i ++)
{
scaleError[i] = 1.;
}
for(Int_t s = 0; s < 6; s ++){
for(Int_t m = 0; m < 4; m ++){
for(Int_t l = 0; l < 6; l ++){
for(Int_t c = 0; c < 220; c ++){
rndmoffsets[s][m][l][c] = 0.0;
}
}
}
}
setCreateOffsets(kFALSE);
offsetsCreated = kFALSE;
setSigmaOffsets(2.0);
setScaleTime(1.0);
}
void HMdcDigitizer::setParContainers() {
fDigitGeomPar = (HMdcLayerGeomPar*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcLayerGeomPar"));
if(!fDigitGeomPar)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCLAYERGEOMPAR RECIEVED!");
exit(1);
}
fDigitPar = (HMdcDigitPar*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcDigitPar"));
if(!fDigitPar)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCDIGITPAR RECIEVED!");
exit(1);
}
fCal2ParSim = (HMdcCal2ParSim*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcCal2ParSim"));
if(!fCal2ParSim)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCCAL2PARSIM RECIEVED!");
exit(1);
}
geomstruct = (HMdcGeomStruct*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcGeomStruct"));
if(!geomstruct)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCGEOMSTRUCT RECIEVED!");
exit(1);
}
if(getCellEffUse())
{
fCellEff = (HMdcCellEff*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcCellEff"));
if(!fCellEff)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCCELLEFF RECIEVED!");
exit(1);
}
}
if(getWireStatUse())
{
fWireStat = (HMdcWireStat*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcWireStat"));
if(!fWireStat)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCWIRESTAT RECIEVED!");
exit(1);
}
}
if(getWireOffsetUse() || getDeDxUse())
{
fsizescells = (HMdcSizesCells*)HMdcSizesCells::getObject();
if(!fsizescells)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCSIZESCELLS RECIEVED!");
exit(1);
}
}
if(getDeDxUse())
{
fdEdX = (HMdcDeDx2*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcDeDx2"));
if(!fdEdX)
{
Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCDEDX2 RECIEVED!");
exit(1);
}
}
if(getTimeCutUse())
{
fTimeCut = new HMdcTimeCut("MdcTimeCut_MdcTimeCutProductionSim",
"sim/embedding cut on time1, time2 & time2-time1",
"MdcTimeCutProductionSim");
((HRuntimeDb*)(gHades->getRuntimeDb()))->addContainer(fTimeCut);
}
}
void HMdcDigitizer::setNTuples(void) {
myoutput->cd();
distance_time = new TNtuple("cal2sim", "cal2sim", "sec:mod:lay:cell:dist:angle:time1:time1Err:time2:time2Err:tof:cutEdge:status:track:eff");
}
Bool_t HMdcDigitizer::init(void) {
setParContainers();
getMdcSetup();
fGeantMdcCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcGeantRaw));
if(!fGeantMdcCat) {
Error("HMdcDigitizer::init()","HGeant MDC input missing");
return kFALSE;
}
iterin = (HIterator*)((HCategory*)fGeantMdcCat)->MakeIterator("native");
fGeantKineCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catGeantKine));
if(!fGeantKineCat) {
Error("HMdcDigitizer::init()","HGeant Kine input missing");
return kFALSE;
}
fGeantCellCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcGeantCell));
if (!fGeantCellCat) {
fGeantCellCat = (HCategory*)((HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"))->buildCategory(catMdcGeantCell));
if (!fGeantCellCat) return kFALSE;
else ((HEvent*)(gHades->getCurrentEvent()))->addCategory(catMdcGeantCell,fGeantCellCat,"Mdc");
}
fGeantCellCat->setPersistency(kFALSE);
itercell = (HIterator*)((HCategory*)fGeantCellCat)->MakeIterator("native");
fCalCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcCal1));
if (!fCalCat) {
HMdcDetector* mdc = (HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
fCalCat = (HCategory*)(((HMdcDetector*)mdc)->buildMatrixCategory("HMdcCal1Sim",0.5F));
if (!fCalCat) return kFALSE;
else ((HEvent*)(gHades->getCurrentEvent()))->addCategory(catMdcCal1,fCalCat,"Mdc");
itercal1 = (HIterator*)fCalCat->MakeIterator("native");
} else {
itercal1 = (HIterator*)fCalCat->MakeIterator("native");
if (fCalCat->getClass() != HMdcCal1Sim::Class()) {
Error("HMdcDigitizer::init()","Misconfigured output category");
return kFALSE;
}
}
if(getNTuple())
{
myoutput = new TFile("digitizer.root","RECREATE");
myoutput->cd();
setNTuples();
}
if(!hasPrinted)printStatus();
return kTRUE;
}
Bool_t HMdcDigitizer::reinit(void)
{
if(fWireStat && useWireStatOffset && !offsetsCreated) {
memset(&rndmoffsets[0][0][0][0],0, sizeof(Float_t) * 6 * 4 * 6 * 220);
for(Int_t s = 0;s < 6; s ++){
for(Int_t m = 0; m < 4; m ++){
for(Int_t l = 0; l < 6; l ++){
for(Int_t c = 0; c < 220; c ++){
rndmoffsets[s][m][l][c] = fWireStat->getOffset(s,m,l,c);
}
}
}
}
} else {
if(!offsetsCreated) memset(&rndmoffsets[0][0][0][0],0, sizeof(Float_t) * 6 * 4 * 6 * 220);
}
if(getWireOffsetUse() || getDeDxUse())
{
setSignalSpeed(fDigitPar->getSignalSpeed());
return fsizescells->initContainer();
}
else return kTRUE;
}
void HMdcDigitizer::printStatus()
{
SEPERATOR_msg("*",60);
INFO_msg(10,HMessageMgr::DET_MDC,"DEFAULT SETTINGS");
SEPERATOR_msg("-",60);
INFO_msg(10,HMessageMgr::DET_MDC,"Options input 1 (default) two leading edges");
INFO_msg(10,HMessageMgr::DET_MDC," 2 leading and trailing edge");
INFO_msg(10,HMessageMgr::DET_MDC,"NTuple kFALSE (default) no NTuple filled");
INFO_msg(10,HMessageMgr::DET_MDC," kTRUE NTuple in digitizer.root filled");
INFO_msg(10,HMessageMgr::DET_MDC,"Use Offsets kFALSE (default)");
INFO_msg(10,HMessageMgr::DET_MDC,"Use Tof kTRUE (default) cal1sim = drift time + tof");
INFO_msg(10,HMessageMgr::DET_MDC,"Use Cell Eff kFALSE (default)");
INFO_msg(10,HMessageMgr::DET_MDC,"Use Noise kFALSE (default)");
INFO_msg(10,HMessageMgr::DET_MDC,"Noise mode 1 (default) GEANT hits will be replaced by noise");
SEPERATOR_msg("-",60);
INFO_msg(10,HMessageMgr::DET_MDC,"ACTUAL CONFIGURATION");
SEPERATOR_msg("*",60);
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),"HMdcDigiSetup:");
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"tdcModeDigi = %i : 1 = two leading edges, 2 = leading and trailing edge",getTdcMode());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"NtupleDigi = %i : 0 = noNtuple, 1 = digitizer.root",(Int_t)getNTuple());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useTofDigi = %i : 0 = NoTof in cal1, 1 = Tof in cal1 \n",(Int_t)getTofUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useErrorDigi = %i : 0 = NoErr in cal1, 1 = Err in cal1 \n",(Int_t)getErrorUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useWireOffsetDigi = %i : 1 = add wireOffset to drift time, 0 = don't add wireOffsets"
, getWireOffsetUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useWireStatDigi = %i : 1 = use wirestat container, 0 = don't use wirestat container"
, getWireStatUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useWireStatEff = %i : 1 = use eff from wirestat container"
, getWireStatEffUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useWireStatOffset= %i : 1 = use offsets from wirestat container"
, getWireStatOffsetUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"useTimeCut = %i : 1 = use time cut container, 0 = don't use time cut container"
, (Int_t)getTimeCutUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"offsetsOnDigi = %i : 0 = global offsets off, 1 = global offsets on",(Int_t)getOffsetsUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"offsetsDigi = %4.1f %4.1f %4.1f %4.1f ns offset per plane (substracted from (drift time + tof))\n"
,getOffset(0),getOffset(1),getOffset(2),getOffset(3));
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseModeDigi = %i : 1 = override geant by noise, 2 = keep geant cells",getNoiseMode());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseOnDigi = %i : 0 = noise off, 1 = noise on",(Int_t)getNoiseUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseLevelDigi = %4.1f%% %4.1f%% %4.1f%% %4.1f%% noise level per plane"
,100*getNoiseLevel(0),100*getNoiseLevel(1),100*getNoiseLevel(2),100*getNoiseLevel(3));
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseRangeDigi =%5i %5i %5i %5i %5i %5i %5i %5i ns lower/upper limit of noise"
,getNoiseRangeLo(0),getNoiseRangeLo(1),getNoiseRangeLo(2),getNoiseRangeLo(3)
,getNoiseRangeHi(0),getNoiseRangeHi(1),getNoiseRangeHi(2),getNoiseRangeHi(3));
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseBandWidth = %5.1f ns : width of the t2-t1 noise band",getNoiseBandWidth());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseWhiteWidth = %5.1f ns : width of the t2-t1 white noise region",getNoiseWhiteWidth());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"noiseWhiteRatio = %5.1f : ratio between t2-t1 band/white noise\n",getNoiseWhiteRatio());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"cellEffOnDigi = %i : 0 = cellEff off, 1 = cellEff",(Int_t)getCellEffUse());
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
,"cellEffDigi = %4.1f%% %4.1f%% %4.1f%% %4.1f%% level of cellEff per plane"
,getCellEffLevel(0),getCellEffLevel(1),getCellEffLevel(2),getCellEffLevel(3));
hasPrinted=kTRUE;
}
Bool_t HMdcDigitizer::finalize(void)
{
if(getNTuple())
{
myoutput->cd();
distance_time->Write();
myoutput->Save();
myoutput->Close();
}
return kTRUE;
}
Int_t HMdcDigitizer::execute(void) {
Float_t xcoord, ycoord, tof, theta, phi, ptot;
Int_t trkNum;
myalpha = 0;
HGeantMdc* fGeant;
loc.set(4,0,0,0,0);
if(getEmbeddingMode() > 0)
{
itercal1->Reset();
while ((fCal = (HMdcCal1Sim *)itercal1->Next()) != NULL)
{
fCal->setNTrack1(gHades->getEmbeddingRealTrackId());
fCal->setNTrack2(gHades->getEmbeddingRealTrackId());
fCal->setStatus1(3);
fCal->setStatus2(3);
fCal->resetTrackList(-99);
fCal->setTrackList(0,gHades->getEmbeddingRealTrackId());
fCal->resetStatusList(0);
fCal->setStatusList(0,3);
}
}
iterin->Reset();
while((fGeant = (HGeantMdc*)iterin->Next()) != NULL) {
loc[0] = (Int_t)(fGeant->getSector());
loc[1] = (Int_t)(fGeant->getModule());
if(!testMdcSetup(loc[0],loc[1]) ) continue;
loc[2] = (Int_t)(fGeant->getLayer());
fGeant->getHit(xcoord, ycoord, tof, ptot);
fGeant->getIncidence(theta, phi);
trkNum = fGeant->getTrack();
if(loc[2] < 6) transform(xcoord,ycoord,theta,phi,tof,trkNum);
}
fCell = 0;
fCal = 0;
initArrays();
itercell->Reset();
setLoopVariables(0,0,0,0);
while ((fCell=(HMdcGeantCell *)itercell->Next()) != NULL)
{
initArrays();
loc[0] = fCell->getSector();
loc[1] = fCell->getModule();
loc[2] = fCell->getLayer();
loc[3] = fCell->getCell();
fCal = 0;
fCal = (HMdcCal1Sim*)fCalCat->getObject(loc);
resetCal1Real();
if (fCal)
{
getCal1Real();
if((getNHitsReal() == 2 && getTdcMode() == 1) ||
(getNHitsReal() < 0 && getTdcMode() == 2) )
{
Warning("HMdcDigitizer:execute()","HMdcCalibater1 and HMdcDigitizer running in different tdc modes!");
}
}
Int_t nHits = fCell->getNumHits();
for(Int_t ihit = 0; ihit < nHits; ihit ++)
{
fillArrays (ihit,loc[0],loc[1],fCell);
setEfficiencyFlags(ihit,loc[0],loc[1],loc[2]);
setTimeCutFlags (ihit,loc[0],loc[1],loc[2]);
}
if(getEmbeddingMode() == 1 && getTime1Real() != -999)
{
fillArraysReal(nHits);
if(getTdcMode() == 2) nHits = nHits + 1;
else if(getTdcMode() == 1)nHits = nHits + 2;
}
if (nHits > 1) select(nHits);
resetListVariables();
if(getNTuple())
{
for(Int_t hit = 0; hit < 15; hit ++)
{
if(getStatus(hit) == 0)continue;
fillNTuple(loc[0],loc[1],loc[2],loc[3],hit,
fCell,distance_time);
}
}
findFirstValidHit();
if(!fCal)
{
fCal = (HMdcCal1Sim*)fCalCat->getSlot(loc);
if (fCal)
{
fCal = new(fCal) HMdcCal1Sim;
fCal->setAddress(loc[0],loc[1],loc[2],loc[3]);
}
else
{
Warning("HMdcDigitizer:execute()","CAL1SIM:getSlot(loc) failed!");
}
}
if(fCal)
{
if(getTdcMode() == 1 || getTdcMode() == 2)
{
if(getFirstHit() != -999)
{
fCal->setTime1(
getDTime1(getFirstHit())
+ ( ((Int_t)getTofUse() - 1) * getTof(getFirstHit()) )
+ ( ((Int_t)getErrorUse() - 1) * getDTime1Err(getFirstHit()) )
- ( ((Int_t)getOffsetsUse()) * getOffset(loc[1]) )
+ ( ((Int_t)getWireOffsetUse() - 1) * getWireOffset(getFirstHit()) ) );
fCal->setNTrack1(getTrackN(getFirstHit()));
fCal->setStatus1(getStatus(getFirstHit()));
fCal->setAngle1(getAngle(getFirstHit()));
fCal->setMinDist1(getMinimumDist(getFirstHit()));
fCal->setError1(getDTime1Err(getFirstHit()));
fCal->setTof1(getTof(getFirstHit()));
fCal->setWireOffset1(getWireOffset(getFirstHit()));
}
else
{
fCal->setStatus1(findNonValidHit());
}
}
if(getTdcMode() == 2)
{
if(getFirstHit() != -999)
{
fCal->setTime2(
getDTime2(getFirstHit())
+ ( ((Int_t)getTofUse() - 1) * getTof(getFirstHit()) )
+ ( ((Int_t)getErrorUse() - 1) * getDTime2Err(getFirstHit()) )
- ( ((Int_t)getOffsetsUse()) * getOffset(loc[1]) )
+ ( ((Int_t)getWireOffsetUse() - 1)* getWireOffset(getFirstHit()) ) );
fCal->setNTrack2(getTrackN(getFirstHit()));
fCal->setNHits(2);
fCal->setStatus2(getStatus(getFirstHit()));
fCal->setAngle2(getAngle(getFirstHit()));
fCal->setMinDist2(getMinimumDist(getFirstHit()));
fCal->setError2(getDTime2Err(getFirstHit()));
fCal->setTof2(getTof(getFirstHit()));
fCal->setWireOffset2(getWireOffset(getFirstHit()));
}
else
{
fCal->setStatus2(findNonValidHit());
}
}
if (nHits == 1 && getTdcMode() == 1) fCal->setNHits(-1);
else
{
if(nHits > 1 && getTdcMode() == 1 && getFirstHit() != -999)
{
findSecondValidHit();
if (getSecondHit() == -999 )
{
fCal->setNHits(-1);
}
else
{
fCal->setTime2(
getDTime1(getSecondHit())
+ ( ((Int_t)getTofUse() - 1) * getTof(getSecondHit()) )
+ ( ((Int_t)getErrorUse() - 1) * getDTime1Err(getSecondHit()) )
- ( ((Int_t)getOffsetsUse()) * getOffset(loc[1]) )
+ ( ((Int_t)getWireOffsetUse() -1) * getWireOffset(getSecondHit()) ) );
fCal->setNTrack2(getTrackN(getSecondHit()));
fCal->setNHits(-2);
fCal->setStatus2(getStatus(getSecondHit()));
fCal->setAngle2(getAngle(getSecondHit()));
fCal->setMinDist2(getMinimumDist(getSecondHit()));
fCal->setError2(getDTime1Err(getSecondHit()));
fCal->setTof2(getTof(getSecondHit()));
fCal->setWireOffset2(getWireOffset(getSecondHit()));
}
}
else if(nHits > 1 && getTdcMode() == 1)
{
fCal->setStatus2(findNonValidHit());
}
}
fillTrackList(fCal);
}
}
if(getNoiseUse())
{
setLoopVariables(0,0,0,0);
itercal1->Reset();
Int_t sec,mod,lay,cell;
while ((fCal = (HMdcCal1Sim *)itercal1->Next()) != NULL)
{
fCal->getAddress(sec,mod,lay,cell);
if(getNoiseMode() == 1 && ( gRandom->Rndm()<getNoiseLevel(mod)) )
{
fillNoiseToGeantCells(mod,fCal);
}
fillNoise(firstsec,firstmod,firstlay,firstcell,sec,mod,lay,cell);
setLoopVariables(sec,mod,lay,cell + 1,kTRUE);
}
fillNoise(firstsec,firstmod,firstlay,firstcell,5,3,5,999);
}
return 0;
}
void HMdcDigitizer::fillArrays(Int_t ihit,Int_t sec,Int_t mod,HMdcGeantCell* fCell)
{
Int_t l = fCell->getLayer();
Int_t c = fCell->getCell();
setMinimumDist(ihit,fCell->getMinDist (ihit));
setAngle (ihit,fCell->getImpactAngle(ihit));
setTrackN (ihit,fCell->getNTrack (ihit));
setTof (ihit,fCell->getTimeFlight (ihit));
setWireOffset (ihit,fCell->getWireOffset (ihit));
setCutEdge (ihit,fCell->getFlagCutEdge(ihit));
fCal2ParSim->calcTimeDigitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time1,&time1Error);
time1Error = time1Error * scaleError[mod];
setDTime1 (ihit,(Float_t)time1 * getScaleTime() + time1Error + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
setDTime1Err(ihit,time1Error);
if(getDeDxUse())
{
fCal2ParSim->calcTime2Digitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time2,&time2Error);
HGeantKine* kine = (HGeantKine*)fGeantKineCat->getObject(getTrackN(ihit) - 1);
if(kine){
kine->resetMdcIter();
HGeantMdc* gMdc = 0;
while((gMdc = (HGeantMdc*)kine->nextMdcHit()) != 0)
{
if(gMdc->getModule() == mod &&
gMdc->getLayer() == l) {
break;
}
}
Float_t p = 0;
if(gMdc){
Float_t x,y,tof;
gMdc->getHit(x, y, tof, p);
}else{
p = kine->getTotalMomentum();
Warning("fillArrays()","HGeantMdc object not found, take kine momentum instead!");
}
Float_t t2;
t2 = fdEdX->scaledTimeAboveThreshold(kine,p,time1,time2,&time2Error,
sec,mod,getAngle(ihit),getMinimumDist(ihit));
if(TMath::Finite(t2) && t2 > 0){
time2 = t2;
}
}else {
Error("fillArrays()","ZERO POINTER for kine object retrieved!");
}
}else{
fCal2ParSim->calcTime2Digitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time2,&time2Error);
}
Float_t mytime2 = time2*getScaleTime() + time2Error + getTof(ihit) + rndmoffsets[sec][mod][l][c];
if(mytime2 < getDTime1(ihit))
{
setDTime2(ihit,time1 * getScaleTime() + time1Error + 20 + (10 * gRandom->Gaus(0,1)) + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
}
else
{
setDTime2(ihit,time2 * getScaleTime() + time2Error + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
}
setDTime2Err(ihit,time2Error);
}
void HMdcDigitizer::fillArraysReal(Int_t i)
{
Float_t def_val = -99;
if(getTdcMode() == 2 && i < 14)
{
setMinimumDist(i,def_val);
setAngle (i,def_val);
setTrackN (i,gHades->getEmbeddingRealTrackId());
setTof (i,def_val);
setDTime1 (i,getTime1Real());
setDTime1Err (i,def_val);
if(getTime2Real() > -998)
{
setDTime2(i,getTime2Real());
}
else
{
setDTime2(i,getTime1Real() + 80);
}
setDTime2Err(i,def_val);
setCutEdge(i,kFALSE);
setWireOffset(i,0.);
setStatus(i,3);
setFractionOfmaxCharge(i,0);
}
else if(getTdcMode() == 1 && i < 13)
{
setMinimumDist(i,def_val);
setAngle (i,def_val);
setTrackN (i,gHades->getEmbeddingRealTrackId());
setTof (i,def_val);
setDTime1 (i,getTime1Real());
setDTime1Err (i,def_val);
setDTime2 (i,-999);
setDTime2Err (i,def_val);
setCutEdge (i,kFALSE);
setWireOffset (i,0.);
setStatus (i,3);
setFractionOfmaxCharge(i,0);
setMinimumDist(i + 1,def_val);
setAngle (i + 1,def_val);
setTrackN (i + 1,gHades->getEmbeddingRealTrackId());
setTof (i + 1,def_val);
if(getTime2Real() > -998)
{
setDTime1(i + 1,getTime2Real());
}
else
{
setDTime1(i + 1,1000);
}
setDTime1Err (i + 1,def_val);
setDTime2 (i + 1,-999);
setDTime2Err (i + 1,def_val);
setCutEdge (i + 1,kFALSE);
setWireOffset(i + 1,0.);
setStatus (i + 1,3);
setFractionOfmaxCharge(i + 1,0);
}
else
{
Warning("HMdcDigitizer:fillArraysReal()","real hit could not be stored to array,\n because the maximum has been exceeded!");
}
}
void HMdcDigitizer::setEfficiencyFlags(Int_t ihit,Int_t sec,Int_t mod,Int_t lay)
{
if(getTrackN(ihit) != gHades->getEmbeddingRealTrackId())
{
if(evalWireStat(sec,mod,lay,loc[3]))
{
if(getCellEffUse())
{
setStatus (ihit,fCellEff->calcEfficiency(mod,getMinimumDist(ihit),getAngle(ihit),100.-getCellEffLevel(mod)));
setFractionOfmaxCharge(ihit,fCellEff->calcEffval(mod,getMinimumDist(ihit) ,getAngle(ihit),100.-getCellEffLevel(mod)));
}
else
{
setStatus(ihit,1);
setFractionOfmaxCharge(ihit,100);
}
Float_t eff = fDigitPar->getLayerEfficiency(sec,mod,lay);
if(fWireStat && useWireStatEff){ eff *= fWireStat->getEfficiency(sec,mod,lay,loc[3]);}
if(gRandom->Rndm() > eff)
{
switch (getStatus(ihit))
{
case 1: setStatus(ihit,-2);
break;
case -1: setStatus(ihit,-1);
break;
default : setStatus(ihit,-7);
break;
}
}
}
else
{
setStatus(ihit,-3);
setFractionOfmaxCharge(ihit,0);
}
}
else
{
setStatus(ihit,3);
setFractionOfmaxCharge(ihit,0);
}
}
void HMdcDigitizer::setTimeCutFlags(Int_t ihit,Int_t sec,Int_t mod,Int_t lay)
{
if(getTimeCutUse())
{
if(getTrackN(ihit) != gHades->getEmbeddingRealTrackId())
{
if( getStatus(ihit) > 0 &&
(
!fTimeCut->cutTime1 (sec,mod,getDTime1(ihit)) ||
!fTimeCut->cutTime2 (sec,mod,getDTime2(ihit)) ||
!fTimeCut->cutTimesDif(sec,mod,getDTime1(ihit),getDTime2(ihit))
)
)
{
setStatus(ihit,-5);
}
}
}
}
Bool_t HMdcDigitizer::evalWireStat(Int_t sec,Int_t mod,Int_t lay,Int_t cell)
{
Bool_t result = kTRUE;
Int_t stat = -99;
if(getWireStatUse())
{
stat = fWireStat->getStatus(sec,mod,lay,cell);
(stat > 0)? result = kTRUE : result = kFALSE;
}
return result;
}
void HMdcDigitizer::initArrays()
{
for(Int_t i = 0; i < 15; i ++)
{
dTime [i] = 0.;
dTime2 [i] = 0.;
dTimeErr [i] = 0.;
dTime2Err [i] = 0.;
minimumdist [i] = 0.;
track [i] = -99;
timeOfFlight [i] = 0.;
angle [i] = 0.;
statusflag [i] = 0;
fractionOfmaxCharge[i] = 0.;
cutEdge [i] = kFALSE;
wireOffset [i] = 0.;
}
}
void HMdcDigitizer::resetListVariables()
{
setFirstHit (-999);
setSecondHit (-999);
setFirstTime2(-999);
setEndList1 (-999);
};
void HMdcDigitizer::resetCal1Real()
{
setTime1Real(-999);
setTime2Real(-999);
setNHitsReal(0);
};
void HMdcDigitizer::getCal1Real()
{
setTime1Real(fCal->getTime1());
setTime2Real(fCal->getTime2());
setNHitsReal(fCal->getNHits());
}
void HMdcDigitizer::fillNTuple(Int_t sec,Int_t mod,Int_t lay,Int_t cell,Int_t ihit,
HMdcGeantCell* fCell, TNtuple* distance_time)
{
distance_time->Fill(sec,mod,lay,cell,
getMinimumDist(ihit),
getAngle(ihit),
getDTime1(ihit),
getDTime1Err(ihit),
getDTime2(ihit),
getDTime2Err(ihit),
getTof(ihit),
getCutEdge(ihit),
getStatus(ihit),
getTrackN(ihit),
getFractionOfmaxCharge(ihit)
);
}
void HMdcDigitizer::fillNTuple(Int_t sec,Int_t mod,Int_t lay,Int_t cell,
Float_t time, Float_t time2,
Int_t status)
{
distance_time->Fill(sec,mod,lay,cell,
-1,
-1,
time ,0,
time2,0,
0,
0,
status,
-99,
100);
}
Float_t HMdcDigitizer::fillTime1Noise(Int_t mod)
{
Float_t time1Noise = -999;
time1Noise = (gRandom->Rndm() * (getNoiseRangeHi(mod)-getNoiseRangeLo(mod))) + getNoiseRangeLo(mod);
return time1Noise;
}
Float_t HMdcDigitizer::fillTime2Noise(Int_t mod)
{
Float_t time2Noise = -999;
if(gRandom->Rndm() < getNoiseWhiteRatio())
{
time2Noise = getTime1Noise() + gRandom->Rndm() * getNoiseWhiteWidth();
}
else {
time2Noise = getTime1Noise() + gRandom->Rndm() * getNoiseBandWidth();
}
return time2Noise;
}
void HMdcDigitizer::fillNoiseLists(HMdcCal1Sim* cal1,Int_t statval,Int_t geant)
{
if(geant == 0)
{
Int_t dummystat [5] = { 0, 0, 0, 0, 0};
Int_t dummytrack[5] = {-99,-99,-99,-99,-99};
dummystat[0] =statval;
cal1->setStatusList(dummystat);
cal1->setTrackList(dummytrack);
}
else
{
Int_t* mylist = cal1->getStatusList();
mylist[0] = statval;
}
}
void HMdcDigitizer::fillNoiseToGeantCells(Int_t mod,HMdcCal1Sim* cal1)
{
setTime1Noise(fillTime1Noise(mod));
setTime2Noise(fillTime2Noise(mod));
if(getTime1Noise() < cal1->getTime1())
{
cal1->setStatus1(2);
cal1->setTime1(getTime1Noise());
cal1->setTime2(getTime2Noise());
cal1->setError1(-99);
cal1->setError2(-99);
cal1->setTof1(-99);
cal1->setTof2(-99);
cal1->setWireOffset1(-99);
cal1->setWireOffset2(-99);
cal1->setStatus1(2);
cal1->setStatus2(2);
cal1->setAngle1(-99);
cal1->setAngle2(-99);
cal1->setMinDist1(-99);
cal1->setMinDist2(-99);
cal1->setNTrack1(-99);
cal1->setNTrack2(-99);
fillNoiseLists(cal1,-4,1);
}
}
void HMdcDigitizer::setLoopVariables(Int_t s,Int_t m,Int_t l,Int_t c,Bool_t check)
{
if(check)handleOverFlow(s,m,l,c);
else {
firstsec = s;
firstmod = m;
firstlay = l;
firstcell = c;
}
}
void HMdcDigitizer::handleOverFlow(Int_t firsts, Int_t firstm, Int_t firstl, Int_t firstc)
{
if(firstc>(*geomstruct)[firsts][firstm][firstl])
{
if(firstl < 5)
{
setLoopVariables(firsts,firstm,firstl + 1,0);
}
else
{
Int_t found = 0;
for(Int_t i = firsts; i < 6; i ++)
{
for(Int_t j = firstm; j < 4; j ++)
{
if(testMdcSetup(i,j))
{
found ++;
if(found == 1) setLoopVariables(i,j,0,0);
}
}
}
if(found == 0) setLoopVariables(firsts,firstm,firstl,500);
}
} else setLoopVariables(firsts,firstm,firstl,firstc);
}
void HMdcDigitizer::fillNoise(Int_t firsts, Int_t firstm, Int_t firstl, Int_t firstc,
Int_t lastsec, Int_t lastmod, Int_t lastlay, Int_t lastcell)
{
fCalnoise = 0;
locnoise.set(4,0,0,0,0);
if(lastcell != 999) handleOverFlow(firsts,firstm,firstl,firstc);
for (Int_t sec = firstsec; sec <= lastsec; sec ++)
{
if(sec > 5) continue;
for (Int_t mod = firstmod; mod <= lastmod; mod ++)
{
if(mod > 3) continue;
if(!testMdcSetup(sec,mod) )continue;
for (Int_t lay = firstlay; lay <= lastlay; lay ++)
{
if(lay > 5) continue;
if(lastcell != 999)
{
for (Int_t cell = firstcell; cell < lastcell; cell ++)
{
if(cell > (*geomstruct)[sec][mod][lay]) continue;
if(evalWireStat(sec,mod,lay,cell))
{
if(gRandom->Rndm()<getNoiseLevel(mod))
{
locnoise[0] = sec;
locnoise[1] = mod;
locnoise[2] = lay;
locnoise[3] = cell;
fCalnoise = (HMdcCal1Sim*)fCalCat->getSlot(locnoise);
if (fCalnoise)
{
fCalnoise = new(fCalnoise) HMdcCal1Sim;
fCalnoise->setAddress(sec,mod,lay,cell);
if (getTdcMode() == 1)
{
fCalnoise->setNHits(-1);
fCalnoise->setStatus1(2);
fCalnoise->setStatus2(-3);
setTime1Noise(fillTime1Noise(locnoise[1]));
setTime2Noise(-999);
fCalnoise->setTime1(getTime1Noise());
if(getNTuple())
{
fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
getTime1Noise(),getTime2Noise(),2);
}
}
else if(getTdcMode() == 2)
{
fCalnoise->setNHits(2);
fCalnoise->setStatus1(2);
fCalnoise->setStatus2(2);
setTime1Noise(fillTime1Noise(locnoise[1]));
setTime2Noise(fillTime2Noise(locnoise[1]));
fCalnoise->setTime1(getTime1Noise());
fCalnoise->setTime2(getTime2Noise());
if(getNTuple())
{
fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
getTime1Noise(),getTime2Noise(),2);
}
}
fillNoiseLists(fCalnoise,2,0);
}
}
}
}
}
if(lastcell == 999)
{
HMdcLayerGeomParLay& layernoise = (*fDigitGeomPar)[sec][mod][lay];
Int_t nWires = layernoise.getNumWires();
for (Int_t cell = firstc; cell < nWires; cell ++)
{
if(evalWireStat(sec,mod,lay,cell))
{
if(gRandom->Rndm() < getNoiseLevel(mod))
{
locnoise[0] = sec;
locnoise[1] = mod;
locnoise[2] = lay;
locnoise[3] = cell;
fCalnoise = (HMdcCal1Sim*)fCalCat->getSlot(locnoise);
if(fCalnoise)
{
fCalnoise = new(fCalnoise) HMdcCal1Sim;
fCalnoise->setAddress(sec,mod,lay,cell);
if(getTdcMode() == 1)
{
fCalnoise->setNHits(-1);
fCalnoise->setStatus1(2);
fCalnoise->setStatus2(-3);
setTime1Noise(fillTime1Noise(locnoise[1]));
setTime2Noise(-999);
fCalnoise->setTime1(getTime1Noise());
if(getNTuple())
{
fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
getTime1Noise(),getTime2Noise(),2);
}
}
else if(getTdcMode() == 2)
{
fCalnoise->setNHits(2);
fCalnoise->setStatus1(2);
fCalnoise->setStatus2(2);
setTime1Noise(fillTime1Noise(locnoise[1]));
setTime2Noise(fillTime2Noise(locnoise[1]));
fCalnoise->setTime1(getTime1Noise());
fCalnoise->setTime2(getTime2Noise());
if(getNTuple())
{
fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
getTime1Noise(),getTime2Noise(),2);
}
}
fillNoiseLists(fCalnoise,2,0);
}
}
}
}
}
}
}
}
}
void HMdcDigitizer::fillTrackList( HMdcCal1Sim* fCal)
{
Int_t array [5];
Int_t array1[5];
for(Int_t i = 0; i < 5; i ++)
{
array [i] = getTrackN(i);
array1[i] = getStatus(i);
}
fCal->setTrackList (array);
fCal->setStatusList(array1);
}
void HMdcDigitizer::findFirstValidHit()
{
Int_t hit = 0;
Int_t lasthit = 0;
while(getStatus(hit) <= 0)
{
lasthit ++;
hit ++;
if(hit == 15)
{
resetListVariables();
break;
}
}
if(hit < 15)
{
while(lasthit < 15 && getDTime1(lasthit) <= getDTime2(hit))
{
lasthit ++;
}
setFirstHit(hit);
setFirstTime2(getDTime2(hit));
if(lasthit < 15)
{
setEndList1(lasthit);
}
else
{
setEndList1(-999);
}
}
}
void HMdcDigitizer::findSecondValidHit()
{
Int_t hit = getEndList1() + 1;
if(hit < 15 && getEndList1() != -999)
{
while(getStatus(hit) <= 0)
{
hit ++;
if(hit == 15)
{
setSecondHit(-999);
break;
}
}
if(hit < 15)
{
setSecondHit(hit);
}
}
else
{
setSecondHit(-999);
}
}
Int_t HMdcDigitizer::findNonValidHit()
{
Int_t hit = 0;
Int_t foundTimeCut = 0;
while(getStatus(hit) <= 0)
{
if(getStatus(hit) == -5 ) foundTimeCut ++;
hit ++;
if(hit == 15)
{
break;
}
}
if(hit == 15)
{
return foundTimeCut > 0 ? -5 : -3;
} else { return -7; }
}
void HMdcDigitizer::select(Int_t nHits)
{
register Int_t a,b,c;
Int_t exchange;
Float_t t;
Float_t t2;
Float_t tErr;
Float_t t2Err;
Float_t flight;
Float_t angleLocal;
Int_t statlocal;
Int_t tracklocal;
Float_t mindistlocal;
Bool_t cutEdgelocal;
Float_t fractionlocal;
Float_t wireOffsetlocal;
if(nHits <= 15)
{
for(a = 0; a < nHits - 1; ++ a)
{
exchange = 0;
c = a;
t = dTime[a];
tErr = dTimeErr[a];
t2 = dTime2[a];
t2Err = dTime2Err[a];
tracklocal = track[a];
flight = timeOfFlight[a];
angleLocal = angle[a];
statlocal = statusflag[a];
mindistlocal = minimumdist[a];
cutEdgelocal = cutEdge[a];
fractionlocal = fractionOfmaxCharge[a];
wireOffsetlocal = wireOffset[a];
for(b=a+1;b<nHits;++b)
{
if(dTime[b]<t)
{
c = b;
t = dTime[b];
tErr = dTimeErr[b];
t2 = dTime2[b];
t2Err = dTime2Err[b];
tracklocal = track[b];
flight = timeOfFlight[b];
angleLocal = angle[b];
statlocal = statusflag[b];
mindistlocal = minimumdist[b];
cutEdgelocal = cutEdge[b];
fractionlocal = fractionOfmaxCharge[b];
wireOffsetlocal = wireOffset[b];
exchange = 1;
}
}
if(exchange)
{
dTime[c] = dTime[a];
dTime[a] = t;
dTimeErr[c] = dTimeErr[a];
dTimeErr[a] = tErr;
dTime2[c] = dTime2[a];
dTime2[a] = t2;
dTime2Err[c] = dTime2Err[a];
dTime2Err[a] = t2Err;
track[c] = track[a];
track[a] = tracklocal;
timeOfFlight[c] = timeOfFlight[a];
timeOfFlight[a] = flight;
angle[c] = angle[a];
angle[a] = angleLocal;
statusflag[c] = statusflag[a];
statusflag[a] = statlocal;
minimumdist[c] = minimumdist[a];
minimumdist[a] = mindistlocal;
cutEdge[c] = cutEdge[a];
cutEdge[a] = cutEdgelocal;
fractionOfmaxCharge[c] = fractionOfmaxCharge[a];
fractionOfmaxCharge[a] = fractionlocal;
wireOffset[c] = wireOffset[a];
wireOffset[a] = wireOffsetlocal;
}
}
}
else
{
Warning("HMdcDigitizer:select(nHits)","nHits > 15! Entries >15 skipped! ");
}
}
void HMdcDigitizer::getMdcSetup()
{
HMdcDetector* mdcDet=(HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
if (!mdcDet)
{
Error("HMdcDigitizer::getMdcSetup()","Mdc-Detector setup (gHades->getSetup()->getDetector(\"Mdc\")) missing.");
}
for(Int_t s = 0; s < 6; s ++) {
for(Int_t m = 0; m < 4; m ++) {
if (!mdcDet->getModule(s, m)) setup[s][m] = 0;
if ( mdcDet->getModule(s, m)) setup[s][m] = 1;
}
}
}
Bool_t HMdcDigitizer::testMdcSetup(Int_t s, Int_t m)
{
Bool_t result=kFALSE;
if(setup[s][m] == 0) result = kFALSE;
if(setup[s][m] == 1) result = kTRUE;
return result;
}
Bool_t HMdcDigitizer::transform(Float_t xcoor,Float_t ycoor,Float_t theta,
Float_t phi ,Float_t tof ,Int_t trkNum) {
HMdcLayerGeomParLay& layer = (*fDigitGeomPar)[loc[0]][loc[1]][loc[2]];
Float_t pitch = layer.getPitch();
Float_t halfPitch = 0.5*pitch;
Float_t halfCatDist = 0.5*layer.getCatDist();
Int_t nWires = layer.getNumWires();
Float_t wOrient = layer.getWireOrient() * pi;
Float_t centWire = layer.getCentralWireNr() -1.;
Float_t dXY=-(*fsizescells)[loc[0]][loc[1]][loc[2]].getZGeantHits() * tan(theta * pi);
ycoor += dXY * sin(phi * pi);
xcoor += dXY * cos(phi * pi);
Float_t y_wire = ycoor * cos(wOrient) - xcoor * sin(wOrient);
Float_t ctanalpha = tan(theta * pi) * sin(phi * pi - wOrient);
myalpha = 90 - fabs(atan(ctanalpha) * TMath::RadToDeg());
Float_t dY = halfCatDist * ctanalpha;
dY < 0.0 ? dY = -dY : dY;
Float_t tmp = (centWire * pitch + y_wire + dY + halfPitch) / pitch;
if(tmp < 0.0) return kFALSE;
Int_t nCmax = (Int_t)tmp;
tmp = (centWire * pitch + y_wire - dY + halfPitch) / pitch;
Int_t nCmin;
tmp < 0.0 ? nCmin = 0 : nCmin = (Int_t)tmp;
if(nCmin >= nWires) return kFALSE;
nCmax >= nWires ? nCmax = nWires - 1 : nCmax;
for (loc[3] = nCmin; loc[3] <= nCmax; loc[3] ++) {
Float_t yDist = y_wire - (loc[3] * pitch - centWire * pitch);
Float_t sinAlpha = sqrt(1. / (1. + ctanalpha * ctanalpha));
Float_t cosAlpha = sqrt(1. - sinAlpha * sinAlpha);
Float_t per = fabs(yDist * sinAlpha);
Bool_t flagCutEdge = kFALSE;
if(per * sinAlpha > halfPitch) {
flagCutEdge = kTRUE;
} else if(per * cosAlpha > halfCatDist) {
flagCutEdge = kTRUE;
}
Float_t wireOffset = 0;
if(getWireOffsetUse())wireOffset = calcWireOffset(xcoor,ycoor,wOrient);
storeCell(per,tof,myalpha,trkNum,flagCutEdge,wireOffset);
}
return kTRUE;
}
Float_t HMdcDigitizer::calcWireOffset(Float_t xcoor,Float_t ycoor,Float_t wOrient)
{
Float_t x_wire = xcoor * cos(wOrient) +ycoor * sin(wOrient);
Float_t pathwire = 0;
HMdcSizesCellsCell& mycell = (*fsizescells)[loc[0]][loc[1]][loc[2]][loc[3]];
if(! &mycell || mycell.getReadoutSide() == '0')
{
if(loc[3] > 3 && loc[3] < (((*geomstruct)[loc[0]][loc[1]][loc[2]]) - 4))
{
Warning("HMdcDigitizer:transform()","Not connected wire detected s %i m %i l %i c %i !",loc[0],loc[1],loc[2],loc[3]);
}
}
else
{
pathwire = mycell.getSignPath(x_wire);
}
return getSignalSpeed() * pathwire;
}
void HMdcDigitizer::storeCell(Float_t per,Float_t tof,Float_t myangle,Int_t trkNum
,Bool_t flagCutEdge,Float_t wireOffset)
{
hit = (HMdcGeantCell*)fGeantCellCat->getObject(loc);
if (!hit) {
hit = (HMdcGeantCell*)fGeantCellCat->getSlot(loc);
hit = new(hit) HMdcGeantCell;
}
Int_t nHit;
nHit = hit->getNumHits();
if (nHit < 15 ) {
hit->setSector(loc[0]);
hit->setModule(loc[1]);
hit->setLayer(loc[2]);
hit->setCell(loc[3]);
hit->setNumHits(nHit + 1);
hit->setMinDist(per,nHit);
hit->setTimeFlight(tof,nHit);
hit->setImpactAngle(myangle,nHit);
hit->setNTrack(trkNum,nHit);
hit->setFlagCutEdge(flagCutEdge,nHit);
hit->setWireOffset(wireOffset,nHit);
}
else
{
Warning("HMdcDigitizer:storeCell()","hit could not be stored in HMdcGeantCell ,\n because number of hits exceeded the maximum!");
}
}
void HMdcDigitizer::initOffsets(TString filename)
{
if(createoffsets)
{
for(Int_t s = 0;s < 6; s ++){
for(Int_t m = 0; m < 4; m ++){
for(Int_t l = 0; l < 6; l ++){
for(Int_t c = 0; c < 220; c ++){
rndmoffsets[s][m][l][c] = gRandom->Gaus(0.,getSigmaOffsets());
}
}
}
}
if(filename.CompareTo("") == 0)
{
Warning("HMdcDigitizer:initOffsets()","No file name specified, offsets will not be written to file!");
}
else
{
FILE* ascii=fopen(filename,"w");
for(Int_t s = 0; s < 6; s ++){
for(Int_t m = 0; m < 4; m ++){
for(Int_t l = 0; l < 6; l ++){
for(Int_t c = 0; c <220; c ++){
fprintf(ascii,"%i %i %i %3i %7.3f \n",s,m,l,c,rndmoffsets[s][m][l][c]);
}
}
}
}
fclose(ascii);
}
}
else
{
FILE* ascii = fopen(filename,"r");
if(!ascii)
{
Warning("HMdcDigitizer:initOffsets()","Specified file %s does not exist, offsets will be 0.0.!",filename.Data());
}
else
{
cout<<"HMdcDigitizer:initOffsets() Reading offset table from file "<<filename.Data()<<endl;
Char_t line[400];
while(1)
{
Int_t s,m,l,c;
Float_t off;
if(feof(ascii)) break;
fgets(line, sizeof(line), ascii);
sscanf(line,"%i %i %i %i %f",&s,&m,&l,&c,&off);
rndmoffsets[s][m][l][c] = off;
}
fclose(ascii);
}
}
offsetsCreated = kTRUE;
}
ClassImp(HMdcDigitizer)
Last change: Sat May 22 13:01:31 2010
Last generated: 2010-05-22 13:01
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.