Back to home page

EIC code displayed by LXR

 
 

    


Warning, /firebird/packages/firebird-ng/workers/geometry/src/lib/root-geometry.processor.spec.ts is written in an unsupported language. File is not indexed.

0001 /**
0002  * The worker-side TGeo edits: a detector pattern that matches several
0003  * top-level nodes (two copies of one detector) edits each of them instead of
0004  * failing the load, and cut lists remove top-level detectors by name prefix.
0005  */
0006 import { EditActions } from '@dexvis/root-geo-tree-editor';
0007 import { applyDetectorEditRules, pruneTopLevelDetectors } from './root-geometry.processor';
0008 
0009 /** A TGeo node with daughters, wired the way jsroot reads them (daughters know their mother volume). */
0010 function geoNode(name: string, daughters: any[] = []): any {
0011   const node = { fName: name, fGeoAtt: 0, fVolume: { fNodes: { arr: daughters }, fGeoAtt: 0 } };
0012   for (const daughter of daughters) daughter.fMother = node.fVolume;
0013   return node;
0014 }
0015 
0016 function geoManager(topNodes: any[]): any {
0017   const master = { fNodes: { arr: topNodes }, fGeoAtt: 0 };
0018   for (const node of topNodes) node.fMother = master;
0019   return { fName: 'Default', fMasterVolume: master };
0020 }
0021 
0022 const daughterNames = (node: any) => node.fVolume.fNodes.arr.map((daughter: any) => daughter.fName);
0023 
0024 describe('applyDetectorEditRules', () => {
0025   it('edits every top-level node that matches a pattern', () => {
0026     const trackerA = geoNode('Tracker_14', [geoNode('Envelope_lens_vol_0'), geoNode('Envelope_box_0')]);
0027     const trackerB = geoNode('Tracker_15', [geoNode('Envelope_lens_vol_0'), geoNode('Envelope_box_0')]);
0028     const other = geoNode('Calorimeter_24', [geoNode('Envelope_lens_vol_0')]);
0029     const manager = geoManager([trackerA, trackerB, other]);
0030 
0031     applyDetectorEditRules(manager, [
0032       { namePattern: '*/Tracker*', editRules: [{ pattern: '*/Envelope_lens_vol*', action: EditActions.Remove }] },
0033       { namePattern: '*/NotInThisGeometry*', editRules: [{ pattern: '*', action: EditActions.RemoveChildren }] },
0034     ]);
0035 
0036     expect(daughterNames(trackerA)).toEqual(['Envelope_box_0']);
0037     expect(daughterNames(trackerB)).toEqual(['Envelope_box_0']);
0038     expect(daughterNames(other)).toEqual(['Envelope_lens_vol_0']);
0039   });
0040 });
0041 
0042 describe('pruneTopLevelDetectors', () => {
0043   it('removes the top-level detectors whose names start with a listed prefix', () => {
0044     const manager = geoManager([geoNode('BeamMagnet_32'), geoNode('Tracker_14'), geoNode('FarCalorimeter_40')]);
0045     const result = pruneTopLevelDetectors(manager, ['Beam', 'Far']);
0046     expect(result.removedNodes.map((node: any) => node.fName)).toEqual(['BeamMagnet_32', 'FarCalorimeter_40']);
0047     expect(manager.fMasterVolume.fNodes.arr.map((node: any) => node.fName)).toEqual(['Tracker_14']);
0048   });
0049 });