6 #include <EVENT/LCCollection.h>
7 #include <IMPL/LCCollectionVec.h>
9 #include <IMPL/TrackerHitImpl.h>
12 #include <gsl/gsl_randist.h>
17 using namespace lcio ;
18 using namespace marlin ;
27 _description =
"VTXNoiseHits should create VTX TrackerHits from SimTrackerHits" ;
32 FloatVec densityDefault(5) ;
33 for(
int i=0 ;i<5; i++ )
34 densityDefault[i] = 0.0 ;
37 registerProcessorParameter(
"HitDensityPerLayer_VTX" ,
38 "hit densities (hits/cm^2) per VXD layer" ,
44 registerInputCollection( LCIO::TRACKERHIT,
46 "Name of the VTX TrackerHit collection" ,
48 std::string(
"VTXTrackerHits") ) ;
51 registerProcessorParameter(
"PointResolutionRPhi_VTX" ,
52 "R-Phi Resolution in VTX" ,
57 registerProcessorParameter(
"PointResolutionZ_VTX" ,
58 "Z Resolution in VTX" ,
75 r = gsl_rng_alloc(gsl_rng_ranlxs2) ;
87 LCCollection* col = 0 ;
94 catch(DataNotAvailableException &
e){
97 streamlog_out( WARNING ) <<
" VTX collection " <<
_colNameVTX
98 <<
" not found - do nothing ! " << std::endl ;
106 const gear::VXDParameters& gearVXD = Global::GEAR->getVXDParameters() ;
107 const gear::VXDLayerLayout& layerVXD = gearVXD.getVXDLayerLayout();
111 if( (
unsigned) layerVXD.getNLayers() !=
_densities.size() ){
114 streamlog_out( ERROR ) <<
" *************************************************** " << std::endl
115 <<
" wrong number of hit densities: " <<
_densities.size()
116 <<
" for " << layerVXD.getNLayers() <<
" VXD layers "
117 <<
" - do nothing ! " << std::endl
118 <<
" *************************************************** " << std::endl ;
126 for(
int i=0 ; i < layerVXD.getNLayers() ; i++ ) {
128 double phi0 = layerVXD.getPhi0 (i) ;
129 double dist = layerVXD.getSensitiveDistance (i) ;
131 double thick = layerVXD.getSensitiveThickness (i) ;
132 double offs = layerVXD.getSensitiveOffset (i) ;
133 double width = layerVXD.getSensitiveWidth (i) ;
136 double len = 2 * layerVXD.getSensitiveLength (i) ;
139 int nLad = layerVXD.getNLadders(i) ;
141 for(
int j=0 ; j < nLad ; j++ ) {
143 double phi = phi0 + j * ( 2 * M_PI ) / nLad ;
146 gear::Vector3D p0( dist + thick / 2. , phi , - len / 2. , gear::Vector3D::cylindrical ) ;
149 gear::Vector3D v0( - (width / 2. - offs ) , phi + M_PI / 2. , 0. , gear::Vector3D::cylindrical ) ;
155 gear::Vector3D v1( width , phi + M_PI / 2. , 0. , gear::Vector3D::cylindrical ) ;
161 double area = len * width / 100. ;
164 int nHit = gsl_ran_poisson(
r,
_densities[ i ] * area ) ;
166 streamlog_out( DEBUG ) <<
" layer: " << i <<
" - ladder: " << j
169 <<
" #hits: " << nHit
175 for(
int k=0 ;
k< nHit ;
k++){
177 double l1 = gsl_rng_uniform(
r ) ;
178 double l2 = gsl_rng_uniform(
r ) ;
182 if( ! gearVXD.isPointInSensitive( ph ) ){
184 streamlog_out( WARNING ) <<
" created hit outside sensitve volume " << ph << std::endl ;
187 TrackerHitImpl *hit =
new TrackerHitImpl() ;
189 double pos[3] = { ph[0] , ph[1] , ph[2] } ;
191 hit->setPosition( pos ) ;
195 hit->setType( 101 + i ) ;
202 hit->setCovMatrix(covMat);
210 col->addElement( hit ) ;
228 std::cout <<
"VTXNoiseHits::end() " << name()
229 <<
" processed " <<
_nEvt <<
" events in " <<
_nRun <<
" runs "
VTXNoiseHits aVTXNoiseHits
CLHEP::Hep3Vector Vector3D
virtual void init()
Called at the begin of the job before anything is read.
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.
virtual void check(LCEvent *evt)
virtual void end()
Called after data processing for clean up.