@@ -21,6 +21,7 @@ const { EorReasonRepository } = require('../../database/repositories');
2121const { PhysicalConstant } = require ( '../../domain/enums/PhysicalConstant' ) ;
2222const { BadParameterError } = require ( '../../server/errors/BadParameterError' ) ;
2323const { gaqService } = require ( '../../server/services/qualityControlFlag/GaqService.js' ) ;
24+ const { qcFlagSummaryService } = require ( '../../server/services/qualityControlFlag/QcFlagSummaryService.js' ) ;
2425
2526/**
2627 * GetAllRunsUseCase
@@ -77,6 +78,7 @@ class GetAllRunsUseCase {
7778 inelasticInteractionRateAtMid,
7879 inelasticInteractionRateAtEnd,
7980 gaq,
81+ detectorsQc,
8082 } = filter ;
8183
8284 if ( runNumbers ) {
@@ -368,6 +370,21 @@ class GetAllRunsUseCase {
368370 filteringQueryBuilder . where ( 'runNumber' ) . oneOf ( ...runNumbers ) ;
369371 }
370372
373+ const badEffectiveRunCoverageComparison = ( badEffectiveRunCoverage , operator , value ) => {
374+ switch ( operator ) {
375+ case '<' :
376+ return 1 - badEffectiveRunCoverage < value ;
377+ case '<=' :
378+ return 1 - badEffectiveRunCoverage <= value ;
379+ case '=' :
380+ return 1 - badEffectiveRunCoverage === value ;
381+ case '>' :
382+ return 1 - badEffectiveRunCoverage > value ;
383+ case '>=' :
384+ return 1 - badEffectiveRunCoverage >= value ;
385+ }
386+ } ;
387+
371388 if ( gaq ) {
372389 if ( ( dataPassIds ?? [ ] ) . length !== 1 ) {
373390 throw new BadParameterError ( 'Filtering by GAQ is enabled only when filtering with one dataPassId' ) ;
@@ -379,21 +396,46 @@ class GetAllRunsUseCase {
379396 if ( gaq . notBadFraction ) {
380397 const { operator, limit : value } = gaq . notBadFraction ;
381398 const runNumbers = Object . entries ( gaqSummary )
382- . filter ( ( [ _ , { badEffectiveRunCoverage } ] ) => {
383- switch ( operator ) {
384- case '<' :
385- return 1 - badEffectiveRunCoverage < value ;
386- case '<=' :
387- return 1 - badEffectiveRunCoverage <= value ;
388- case '=' :
389- return 1 - badEffectiveRunCoverage === value ;
390- case '>' :
391- return 1 - badEffectiveRunCoverage > value ;
392- case '>=' :
393- return 1 - badEffectiveRunCoverage >= value ;
394- }
399+ . filter ( ( [ _ , { badEffectiveRunCoverage } ] ) =>
400+ badEffectiveRunCoverageComparison ( badEffectiveRunCoverage , operator , value ) )
401+ . map ( ( [ runNumber ] ) => runNumber ) ;
402+ filteringQueryBuilder . where ( 'runNumber' ) . oneOf ( ...runNumbers ) ;
403+ }
404+ }
405+
406+ if ( detectorsQc ) {
407+ const [ dataPassId ] = dataPassIds ?? [ ] ;
408+ const [ simulationPassId ] = simulationPassIds ?? [ ] ;
409+ const [ lhcPeriodId ] = lhcPeriodIds ?? [ ] ;
410+ const { mcReproducibleAsNotBad } = detectorsQc ;
411+ delete detectorsQc . mcReproducibleAsNotBad ;
412+
413+ const dplDetectorIds = Object . keys ( detectorsQc ) . map ( ( id ) => parseInt ( id . slice ( 1 ) , 10 ) ) ;
414+ if ( dplDetectorIds . length > 0 ) {
415+ const qcSummary = await qcFlagSummaryService . getSummary (
416+ {
417+ dataPassId,
418+ simulationPassId,
419+ lhcPeriodId,
420+ dplDetectorIds,
421+ } ,
422+ { mcReproducibleAsNotBad } ,
423+ ) ;
424+
425+ const runNumbers = Object . entries ( qcSummary )
426+ . filter ( ( [ _ , runSummary ] ) => {
427+ const mask = Object . entries ( detectorsQc ) . map ( ( [ prefixedDetectorId , { notBadFraction : { operator, limit } } ] ) => {
428+ const dplDetectorId = parseInt ( prefixedDetectorId . slice ( 1 ) , 10 ) ;
429+ if ( ! ( dplDetectorId in runSummary ) ) {
430+ return false ;
431+ }
432+ return badEffectiveRunCoverageComparison ( runSummary [ dplDetectorId ] . badEffectiveRunCoverage , operator , limit ) ;
433+ } ) ;
434+
435+ return mask . every ( ( valid ) => valid ) ;
395436 } )
396437 . map ( ( [ runNumber ] ) => runNumber ) ;
438+
397439 filteringQueryBuilder . where ( 'runNumber' ) . oneOf ( ...runNumbers ) ;
398440 }
399441 }
@@ -411,6 +453,19 @@ class GetAllRunsUseCase {
411453 filteringQueryBuilder . where ( 'runNumber' ) . oneOf ( ...runNumbers ) ;
412454 }
413455
456+ if ( lhcPeriodIds ) {
457+ const runNumbers = ( await RunRepository . findAll ( {
458+ attributes : [ 'runNumber' ] ,
459+ raw : true ,
460+ include : {
461+ association : 'lhcPeriods' ,
462+ attributes : [ ] ,
463+ where : { id : { [ Op . in ] : lhcPeriodIds } } ,
464+ } ,
465+ } ) ) . map ( ( { runNumber } ) => runNumber ) ;
466+ filteringQueryBuilder . where ( 'runNumber' ) . oneOf ( ...runNumbers ) ;
467+ }
468+
414469 if ( tags ?. values ?. length ) {
415470 if ( tags . operation === 'and' ) {
416471 const runsWithExpectedTags = await RunRepository . findAll ( {
0 commit comments