Skip to content
Snippets Groups Projects
Commit 18a0b64a authored by Frank Gaede's avatar Frank Gaede Committed by Marko Petric
Browse files

add test utility test_cellid_position_converter.cpp

parent a169d0e5
No related branches found
No related tags found
No related merge requests found
......@@ -39,9 +39,9 @@ dd4hep_add_executable(test_surfaces
USES DDRec DDTest
OPTIONAL [LCIO REQUIRED SOURCES src/test_surfaces.cpp])
#-----------------------------------------------------------------------------------
dd4hep_add_executable(test_iddecoder
dd4hep_add_executable(test_cellid_position_converter
USES DDRec DDTest
OPTIONAL [LCIO REQUIRED SOURCES src/test_iddecoder.cpp])
OPTIONAL [LCIO REQUIRED SOURCES src/test_cellid_position_converter.cpp])
#-----------------------------------------------------------------------------------
dd4hep_add_dictionary( G__eve
SOURCES src/EvNavHandler.h
......
//==========================================================================
// AIDA Detector description implementation for LCD
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// @author F.Gaede, DESY
// @date May, 2017
//==========================================================================
// Framework include files
#include "DD4hep/LCDD.h"
#include "DD4hep/DDTest.h"
#include "DD4hep/DD4hepUnits.h"
#include "DD4hep/BitField64.h"
#include "DDRec/CellIDPositionConverter.h"
#include "lcio.h"
#include "IO/LCReader.h"
#include "EVENT/LCEvent.h"
#include "EVENT/LCCollection.h"
#include "EVENT/SimCalorimeterHit.h"
#include <sstream>
using namespace std ;
using namespace DD4hep ;
using namespace DD4hep::Geometry;
using namespace DD4hep::DDRec ;
using namespace lcio;
static DDTest test( "cellid_position_converter" ) ;
//=============================================================================
const double epsilon = dd4hep::micrometer ;
double dist( const Position& p0, const Position& p1 ){
Position p2 = p1 - p0 ;
return p2.r() ;
}
int main_wrapper(int argc, char** argv ){
if( argc < 3 ) {
std::cout << " usage: test_cellid_position_converter compact.xml lcio_file.slcio" << std::endl ;
exit(1) ;
}
std::string inFile = argv[1] ;
LCDD& lcdd = LCDD::getInstance();
lcdd.fromCompact( inFile );
CellIDPositionConverter idposConv( lcdd ) ;
//---------------------------------------------------------------------
// open lcio file with SimCalorimeterHits
//---------------------------------------------------------------------
std::string lcioFileName = argv[2] ;
LCReader* rdr = LCFactory::getInstance()->createLCReader() ;
rdr->open( lcioFileName ) ;
LCEvent* evt = 0 ;
// use only hits from these collections
std::set< std::string > subset = {} ;
//{"BeamCalCollection" } ; //EcalBarrelCollection" } ; //"HcalBarrelRegCollection"} ;
// ignore all hits from these collections
std::set< std::string > subsetIgnore = {} ;
//{"HCalBarrelRPCHits","HCalECRingRPCHits","HCalEndcapRPCHits" } ;
while( ( evt = rdr->readNextEvent() ) != 0 ){
const std::vector< std::string >& colNames = *evt->getCollectionNames() ;
for(unsigned icol=0, ncol = colNames.size() ; icol < ncol ; ++icol ){
LCCollection* col = evt->getCollection( colNames[ icol ] ) ;
std::string typeName = col->getTypeName() ;
if( typeName != lcio::LCIO::SIMCALORIMETERHIT )
continue ;
if( !subset.empty() && subset.find( colNames[icol] ) == subset.end() )
continue ;
if( !subsetIgnore.empty() && subsetIgnore.find( colNames[icol] ) != subsetIgnore.end() )
continue ;
std::cout << " -- testing collection : " << colNames[ icol ] << std::endl ;
std::string cellIDEcoding = col->getParameters().getStringVal("CellIDEncoding") ;
DD4hep::BitField64 idDecoder( cellIDEcoding ) ;
int nHit = col->getNumberOfElements() ;
for(int i=0 ; i< nHit ; ++i){
SimCalorimeterHit* sHit = (SimCalorimeterHit*) col->getElementAt(i) ;
DD4hep::long64 id0 = sHit->getCellID0() ;
DD4hep::long64 id1 = sHit->getCellID1() ;
DD4hep::long64 id = ( id1 << 32 | id0 ) ;
idDecoder.setValue( id ) ;
Position point( sHit->getPosition()[0]* dd4hep::mm , sHit->getPosition()[1]* dd4hep::mm , sHit->getPosition()[2]* dd4hep::mm ) ;
// ====== test cellID to position and positio to cellID conversion ================================
// CellID idFromDecoder = idposConv.cellID( point ) ;
Position pointFromDecoder = idposConv.position( id ) ;
// test( idFromDecoder , id , " compare ids: " ) ;
double d = dist(pointFromDecoder, point) ;
std::stringstream sst ;
sst << " dist " << d << " ( " << pointFromDecoder << " ) - ( " << point << " )" ;
test( d < epsilon , true , sst.str() ) ;
}
}
}
return 0;
}
//=============================================================================
#include "main.h"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment