diff --git a/DDCore/include/DD4hep/BitField64.h b/DDCore/include/DD4hep/BitField64.h index 36fb91b70d33cb523fb222bc4fd8cc82f76156cc..7eb0d2a7e4ecec9949e65ebd25230049e1153623 100644 --- a/DDCore/include/DD4hep/BitField64.h +++ b/DDCore/include/DD4hep/BitField64.h @@ -77,9 +77,9 @@ namespace DD4hep { */ long64 getValue() const { return _value ; } - /** Set a new 64bit value + /** Set a new 64bit value - bits not used in description are set to 0. */ - void setValue(long64 value ) { _value = value ; } + void setValue(long64 value ) { _value = ( _joined & value ) ; } /** Reset - same as setValue(0) - useful if the same encoder is used for many objects. */ diff --git a/DDCore/include/DD4hep/IDDescriptor.h b/DDCore/include/DD4hep/IDDescriptor.h index c42d281bd8e1b354e3a83a0ddfd329f34745c46b..62692ee8faaf60dac36ef2680a35f27337fcb2cc 100644 --- a/DDCore/include/DD4hep/IDDescriptor.h +++ b/DDCore/include/DD4hep/IDDescriptor.h @@ -43,13 +43,13 @@ namespace DD4hep { VolumeID mask; VolumeID encode(int value) const { VolumeID v = value; - //FGxx return ( ( v << first ) & mask ) ; - return mask|((v<<(64-second))>>first); + return ( ( v << first ) | mask ) ; + //xx return mask|((v<<(64-second))>>first); } int decode(VolumeID value) const { - //FGxx return ( mask & value ) >> first ; - return (~mask&value)>>(64-second-first); + return ( ~mask & value ) >> first ; + //xx return (~mask&value)>>(64-second-first); } }; typedef std::vector<std::pair<std::string,Field> > FieldMap; diff --git a/DDCore/src/IDDescriptor.cpp b/DDCore/src/IDDescriptor.cpp index 0b738b3b601e7c8349dbc1654a1b4ab549c61b54..c0b65afa01aab0d4533dfa4c20ecf482fe5c5b06 100644 --- a/DDCore/src/IDDescriptor.cpp +++ b/DDCore/src/IDDescriptor.cpp @@ -51,8 +51,8 @@ namespace { field.second = f.size() == 3 ? ::atoi(f[2].c_str()) : ::atoi(f[1].c_str()); field.second = ::abs(field.second); - //FG: field.mask = ( ( 0x0001LL << (field.second) ) - 1 ) << field.first ; - field.mask = ~((~0x0ull<<(64-field.second))>>(64-field.second)<<(64-field.first-field.second)); + field.mask = ~ ( ( ( 0x0001LL << (field.second) ) - 1 ) << field.first ) ; + //field.mask = ~((~0x0ull<<(64-field.second))>>(64-field.second)<<(64-field.first-field.second)); pos = field.first + ::abs(field.second); if ( pos>o->maxBit ) o->maxBit = pos; diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp index 9bb187f1ed7902ff4af75251975cda7ee6ac4a53..f6245fd88f8db6a56c9603aa52ae94df5e148f23 100644 --- a/DDCore/src/VolumeManager.cpp +++ b/DDCore/src/VolumeManager.cpp @@ -108,6 +108,7 @@ namespace { } pair<VolumeID,VolumeID> encoding(const IDDescriptor iddesc, const PlacedVolume::VolIDs& ids ) const { VolumeID volume_id = ~0x0ull, mask = 0; + //fg: default value 0 for volids does not seem to work (!?): VolumeID volume_id = 0, mask = 0; for(PlacedVolume::VolIDs::const_iterator i=ids.begin(); i!=ids.end(); ++i) { const PlacedVolume::VolID& id = (*i); IDDescriptor::Field f = iddesc.field(id.first); diff --git a/DDExamples/ILDExSimu/ILDExSimu.cpp b/DDExamples/ILDExSimu/ILDExSimu.cpp index 17654fce6c88588aa1d74060325c3cc90f0b1616..408539d4385a9b34abc323ed4ababb7d7e5900b0 100644 --- a/DDExamples/ILDExSimu/ILDExSimu.cpp +++ b/DDExamples/ILDExSimu/ILDExSimu.cpp @@ -31,8 +31,8 @@ #include "DD4hep/LCDD.h" // -- lcio -- -#include <UTIL/BitField64.h> -#include <UTIL/ILDConf.h> +// #include <UTIL/BitField64.h> +// #include <UTIL/ILDConf.h> #include "lcio.h" #include "IO/LCWriter.h" diff --git a/DDG4/src/Geant4TrackerSD.cpp b/DDG4/src/Geant4TrackerSD.cpp index cc95dc495e2cb4da3563f6826b934581ed5303ca..87edb610f1a92b5be83879b4b17802724d4a6fa2 100644 --- a/DDG4/src/Geant4TrackerSD.cpp +++ b/DDG4/src/Geant4TrackerSD.cpp @@ -62,10 +62,12 @@ namespace DD4hep { namespace Simulation { Geometry::Readout ro = sd.readout(); Geometry::IDDescriptor iddesc = ro.idSpec(); - //----- use a BitField64 object to store the cellID in the Linear collider convention BitField64 bf( iddesc.toString() ) ; +#define test_cellID 0 +#if test_cellID + for( unsigned i=0, N=bf.size() ;i<N;++i){ BitFieldValue& v = bf[i] ; @@ -82,18 +84,27 @@ namespace DD4hep { namespace Simulation { // b[i] = iddesc.field( b[i].name() ).decode( cell_id ) ; } - // G4cout << "--- IDDescriptor: " << iddesc.toString() - // << " BitField64 : " << bf - // << std::endl ; - - // Geometry::IDDescriptor::Field modFld = iddesc.field("module"); - // int mod_id = modFld.decode( cell_id ); - // int layer = iddesc.field("layer").decode( cell_id ) ; - // G4cout << "--- layer " << layer << " ---- module: " << mod_id << std::endl ; + G4cout << "--- IDDescriptor: " << iddesc.toString() + << std::endl ; + BitField64 testBF( iddesc.toString() ) ; + testBF.setValue( cell_id ) ; + G4cout << "--- testing BitField64 testBF \n " << testBF + << " \n bf from IDDescriptor : " << bf << std::endl ; + + + assert( testBF.getValue() == bf.getValue() ) ; + +#else + + bf.setValue( cell_id ) ; // this sets the unused high bits to 0 ! +#endif + + cellID = bf.lowWord() ; - + + } else { G4cerr << "**ERROR** Geant4GenericSD<Tracker>::buildHits - called for insensitive volume: "