33from typing import Optional , Tuple , List
44from pydeepskylog .config import ContrastReserveConfig
55from pydeepskylog .exceptions import InvalidParameterError
6+ from pydeepskylog .validation import (
7+ validate_number , validate_positive , validate_sequence
8+ )
69
710def surface_brightness (magnitude : float , object_diameter1 : float , object_diameter2 : float ) -> float :
811 """
@@ -16,24 +19,10 @@ def surface_brightness(magnitude: float, object_diameter1: float, object_diamete
1619 # Validate inputs
1720 logger : logging = logging .getLogger (__name__ )
1821
19- if not isinstance (magnitude , (int , float )):
20- logger .error (f"The magnitude parameter is not a number" )
21- raise InvalidParameterError ("Magnitude must be a number" )
22- if not isinstance (object_diameter1 , (int , float )):
23- logger .error (f"The object diameter 1 parameter is not a number" )
24- raise InvalidParameterError ("Object diameter 1 must be a number" )
25- if not isinstance (object_diameter2 , (int , float )):
26- logger .error (f"The object diameter 2 parameter is not a number" )
27- raise InvalidParameterError ("Object diameter 2 must be a number" )
28-
29- # Check for positive diameters
30- if object_diameter1 <= 0 :
31- logger .error (f"The object diameter 1 parameter is not positive: { object_diameter1 } " )
32- raise InvalidParameterError ("Object diameter 1 must be positive" )
33- if object_diameter2 <= 0 :
34- logger .error (f"The object diameter 2 parameter is not positive: { object_diameter2 } " )
35- raise InvalidParameterError ("Object diameter 2 must be positive" )
36-
22+ validate_number (magnitude , "Magnitude" )
23+ validate_positive (object_diameter1 , "Object diameter 1" )
24+ validate_positive (object_diameter2 , "Object diameter 2" )
25+
3726 return magnitude + (2.5 * math .log10 (2827.0 * (object_diameter1 / 60 ) * (object_diameter2 / 60 )))
3827
3928
@@ -57,50 +46,13 @@ def validate_contrast_reserve_inputs(
5746 # Validate required numeric inputs
5847 logger : logging = logging .getLogger (__name__ )
5948
60- if not isinstance (sqm , (int , float )):
61- logger .error (f"The sqm parameter is not a number" )
62- raise InvalidParameterError ("SQM must be a number" )
63- if not isinstance (telescope_diameter , (int , float )):
64- logger .error (f"The telescope diameter parameter is not a number" )
65- raise InvalidParameterError ("Telescope diameter must be a number" )
66- if not isinstance (magnification , (int , float )):
67- logger .error (f"The magnification parameter is not a number" )
68- raise InvalidParameterError ("Magnification must be a number" )
69-
70- # Check for positive values
71- if telescope_diameter <= 0 :
72- logger .error (f"The telescope diameter parameter is not positive: { telescope_diameter } " )
73- raise InvalidParameterError ("Telescope diameter must be positive" )
74- if magnification <= 0 :
75- logger .error (f"The magnification parameter is not positive: { magnification } " )
76- raise InvalidParameterError ("Magnification must be positive" )
77-
78- # Validate surf_brightness if provided
79- if surf_brightness is not None and not isinstance (surf_brightness , (int , float )):
80- logger .error (f"The surface brightness parameter is not a number: { surf_brightness } " )
81- raise InvalidParameterError ("Surface brightness must be a number or None" )
82-
83- # Validate magnitude if provided and needed
84- if surf_brightness is None and magnitude is not None :
85- if not isinstance (magnitude , (int , float )):
86- logger .error (f"The magnitude parameter is not a number: { magnitude } " )
87- raise InvalidParameterError ("Magnitude must be a number or None" )
88-
89- # Validate object diameters if provided
90- if object_diameter1 is not None and not isinstance (object_diameter1 , (int , float )):
91- logger .error (f"The object diameter parameter is not a number: { object_diameter1 } " )
92- raise InvalidParameterError ("Object diameter 1 must be a number or None" )
93- if object_diameter2 is not None and not isinstance (object_diameter2 , (int , float )):
94- logger .error (f"The object diameter parameter is not a number: { object_diameter2 } " )
95- raise InvalidParameterError ("Object diameter 2 must be a number or None" )
96-
97- # Check for positive diameters if provided
98- if object_diameter1 is not None and object_diameter1 <= 0 :
99- logger .error (f"The object diameter 1 parameter is not positive: { object_diameter1 } " )
100- raise InvalidParameterError ("Object diameter 1 must be positive" )
101- if object_diameter2 is not None and object_diameter2 <= 0 :
102- logger .error (f"The object diameter 2 parameter is not positive: { object_diameter2 } " )
103- raise InvalidParameterError ("Object diameter 2 must be positive" )
49+ validate_number (sqm , "SQM" )
50+ validate_positive (telescope_diameter , "Telescope diameter" )
51+ validate_positive (magnification , "Magnification" )
52+ validate_number (surf_brightness , "Surface brightness" , allow_none = True )
53+ validate_number (magnitude , "Magnitude" , allow_none = True )
54+ validate_positive (object_diameter1 , "Object diameter 1" , allow_none = True )
55+ validate_positive (object_diameter2 , "Object diameter 2" , allow_none = True )
10456
10557
10658def calculate_initial_parameters (
@@ -122,7 +74,7 @@ def calculate_initial_parameters(
12274
12375 # Minimum useful magnification
12476 sbb1 = sqm - (5 * math .log10 (2.833 * aperture_in_inches ))
125-
77+ # Validate objectdiameters
12678 if object_diameter1 is None or object_diameter2 is None :
12779 # If the object diameters are not given, we cannot calculate the contrast reserve
12880 logger .error ("Cannot calculate contrast reserve, missing object diameters" )
@@ -339,59 +291,32 @@ def optimal_detection_magnification(
339291 # Validate required numeric inputs
340292 logger : logging = logging .getLogger (__name__ )
341293
342- if not isinstance (sqm , (int , float )):
343- logger .error (f"The sqm parameter is not a number: { sqm } " )
344- raise InvalidParameterError ("SQM must be a number" )
345- if not isinstance (telescope_diameter , (int , float )):
346- logger .error (f"The telescope diameter parameter is not a number: { telescope_diameter } " )
347- raise InvalidParameterError ("Telescope diameter must be a number" )
348-
349- # Check for positive telescope diameter
350- if telescope_diameter <= 0 :
351- logger .error (f"The telescope diameter parameter is not positive: { telescope_diameter } " )
352- raise InvalidParameterError ("Telescope diameter must be positive" )
353-
294+ validate_number (sqm , "SQM" )
295+ validate_positive (telescope_diameter , "Telescope diameter" )
296+
354297 # Validate surf_brightness if provided
355- if surf_brightness is not None and not isinstance (surf_brightness , (int , float )):
356- logger .error (f"The surface brightness parameter is not a number: { surf_brightness } " )
357- raise InvalidParameterError ("Surface brightness must be a number or None" )
358-
298+ if surf_brightness is not None :
299+ validate_number (surf_brightness , "Surface brightness" )
300+
359301 # Validate magnitude if provided and needed
360302 if surf_brightness is None and magnitude is not None :
361- if not isinstance (magnitude , (int , float )):
362- logger .error (f"The magnitude parameter is not a number: { magnitude } " )
363- raise InvalidParameterError ("Magnitude must be a number or None" )
364-
303+ validate_number (magnitude , "Magnitude" )
304+
365305 # Validate object diameters if provided
366306 if object_diameter1 is not None and not isinstance (object_diameter1 , (int , float )):
367- logger .error (f"The object diameter 1 parameter is not a number: { object_diameter1 } " )
368- raise InvalidParameterError ("Object diameter 1 must be a number or None" )
307+ validate_positive (object_diameter1 , "Object diameter 1" )
369308 if object_diameter2 is not None and not isinstance (object_diameter2 , (int , float )):
370- logger .error (f"The object diameter 2 parameter is not a number: { object_diameter2 } " )
371- raise InvalidParameterError ("Object diameter 2 must be a number or None" )
372-
373- # Check for positive diameters if provided
374- if object_diameter1 is not None and object_diameter1 <= 0 :
375- logger .error (f"The object diameter 1 parameter is not positive: { object_diameter1 } " )
376- raise InvalidParameterError ("Object diameter 1 must be positive" )
377- if object_diameter2 is not None and object_diameter2 <= 0 :
378- logger .error (f"The object diameter 2 parameter is not positive: { object_diameter2 } " )
379- raise InvalidParameterError ("Object diameter 2 must be positive" )
380-
309+ validate_positive (object_diameter2 , "Object diameter 2" )
310+
381311 # Validate magnifications list
382312 if not isinstance (magnifications , list ):
383313 logger .error ("Magnifications parameter is not a list" )
384314 raise InvalidParameterError ("Magnifications must be a list" )
385315
386316 # Validate each magnification in the list
387317 for mag in magnifications :
388- if not isinstance (mag , (int , float )):
389- logger .error (f"Each magnification must be a number: { mag } " )
390- raise InvalidParameterError ("Each magnification must be a number" )
391- if mag <= 0 :
392- logger .error (f"Each magnification must be positive: { mag } " )
393- raise InvalidParameterError ("Each magnification must be positive" )
394-
318+ validate_positive (mag , "Each magnification" )
319+
395320 best_contrast = - 999
396321 best_x = 0
397322
0 commit comments