# ### 2. Add a Marker at the Origin (coordinates 0,0) for help with visualization
#
# Creating a "markers" for the geometry is useful to orient one-self when doing sanity-checks (for example, marke where 0,0 is, or where 5,0 coordinate is).
#
# <div class="alert alert-warning">
# Note that if you analyze the module that intersects with the marker, some of the sensors will be wrong. To perform valid analysis, do so without markers, as they are 'real' objects on your scene.
# </div>
#

# In[8]:

# NOTE: offsetting translation by 0.1 so the center of the marker (with sides of 0.2) is at the desired coordinate.
name = 'Post1'
text = '! genbox black originMarker 0.2 0.2 1 | xform -t -0.1 -0.1 0'
customObject = demo.makeCustomObject(name, text)
demo.appendtoScene(sceneObj1.radfiles, customObject, '!xform -rz 0')

# <a id='step3'></a>

# ### 3. Combine all scene Objects into one OCT file & Visualize
# Marking this as its own steps because this is the step that joins our Scene Objects 1, 2 and the appended Post.
# Run makeOCT to make the scene with both scene objects AND the marker in it, the ground and the skies.

# In[9]:

octfile = demo.makeOct(demo.getfilelist())

# At this point you should be able to go into a command window (cmd.exe) and check the geometry. Example:
#
# ##### rvu -vf views\front.vp -e .01 -pe 0.3 -vp 1 -7.5 12 MultipleObj.oct
#
Example #2
0
def simulate_single(idx=None,
                    wavelength=None,
                    test_folder_fmt=None,
                    best_data_file=None,
                    data_folder=None):

    # Verify test_folder exists before creating radiance obj
    test_folder = test_folder_fmt.format(f'{idx:04}', f'{wavelength:04}')
    if not os.path.exists(test_folder):
        os.makedirs(test_folder)

    ### NEW FOR SPECTRA

    # Create radiance obj
    radiance_name = 'BEST'
    rad_obj = RadianceObj(radiance_name, str(test_folder))

    # Set ground
    rad_obj.readWeatherFile(best_data_file, label='center')

    # Check to see if file exists
    foo = rad_obj.metdata.datetime[idx]

    # If a wavelength was specified, assume this is a spectral simulation and
    # try to load spectra files.
    # Determine file suffix
    suffix = f'_{idx}.txt'

    # Generate/Load albedo
    alb_file = os.path.join(data_folder, "alb" + suffix)
    spectral_alb = spectral_property.load_file(alb_file)

    # Generate/Load dni and dhi
    dni_file = os.path.join(data_folder, "dni" + suffix)
    dhi_file = os.path.join(data_folder, "dhi" + suffix)
    ghi_file = os.path.join(data_folder, "ghi" + suffix)
    spectral_dni = spectral_property.load_file(dni_file)
    spectral_dhi = spectral_property.load_file(dhi_file)
    spectral_ghi = spectral_property.load_file(ghi_file)

    weighted_albedo = False
    if wavelength:
        alb = spectral_alb[wavelength]
        dni = spectral_dni[wavelength]
        dhi = spectral_dhi[wavelength]
    elif weighted_albedo:
        _alb = np.array(spectral_alb[range(300, 2501, 10)])
        _dni = np.array(spectral_dni[range(300, 2501, 10)])
        _dhi = np.array(spectral_dhi[range(300, 2501, 10)])
        _ghi = np.array(spectral_ghi[range(300, 2501, 10)])

        alb_scale = np.sum(_alb * (_ghi)) / np.sum(alb * (_ghi))
        alb *= alb_scale
        print(f'For IDX {idx}, albedo scaled by {alb_scale}')

    res_name = "irr_Hydra_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute) + '.csv'

    rad_obj.setGround(alb)
    # Set sky
    solpos = rad_obj.metdata.solpos.iloc[idx]
    zen = float(solpos.zenith)
    azm = float(solpos.azimuth) - 180
    rad_obj.gendaylit2manual(dni, dhi, 90 - zen, azm)

    lat = 39.742  # NREL SSRL location
    lon = -105.179  # NREL SSRL location
    elev = 1829
    timezone = -7
    axis_tilt = 0
    axis_azimuth = 180
    limit_angle = 60
    backtrack = True  # Set to false since it's only 1 row, no shading.
    gcr = 0.35
    angledelta = 0  # rounding to ints
    numpanels = 1
    torquetube = False  # We are going to add it separately
    diameter = 0.130175  # 5 1/8 in
    torqueTubeMaterial = 'Metal_Grey'
    tubetype = 'Round'
    axisofrotationTorqueTube = True
    azimuth = 90
    material = 'Metal_Grey'
    hub_height = 1.5  #0.927
    postdiamy = 0.1016  # N-S measurement, 4 "
    postdiamx = 0.1524  # E-W measurement, 6 "
    ttedgeoffset = -1.07  # south edge 42 in. negative because that's how I coded the trnaslation.
    ttedgeoffsetNorth = 0.10795  # North edge $ 4 1/4 inches
    length = 21.64 - ttedgeoffset + ttedgeoffsetNorth  # map goes from beginning of south post, but there is a bit more post to hold the sensor
    decimate = True
    zgap = 0.05 + diameter / 2  # 1 inch of arm, + 1 3/16 of panel width on average ~ 0.055 m
    decimateinterval = '15Min'
    pitch = 5.7  # distance between rows
    ypostlist = [0, 4.199, 10.414, 16.63, 21.64]
    ymods = [
        0.589, 1.596, 2.603, 3.610, 4.788, 5.795, 6.803, 7.810, 8.818, 9.825,
        11.003, 12.011, 13.018, 14.026, 15.034, 16.041, 17.220, 18.230, 19.240,
        20.250
    ]

    numcellsx = 6
    numcellsy = 12
    xcell = 0.142
    ycell = 0.142
    xcellgap = 0.02
    ycellgap = 0.02
    module_type = 'Bi60'

    xgap = 0.046
    ygap = 0
    glass = False

    # Set tracker information
    try:
        tilt = round(
            rad_obj.getSingleTimestampTrackerAngle(rad_obj.metdata,
                                                   idx,
                                                   gcr,
                                                   limit_angle=65), 1)
    except:
        print("Night time !!!!!!!!!")
        print("")
        print("")
        return None

    if math.isnan(tilt):
        return None

    sazm = 90

    cellLevelModuleParams = {
        'numcellsx': numcellsx,
        'numcellsy': numcellsy,
        'xcell': xcell,
        'ycell': ycell,
        'xcellgap': xcellgap,
        'ycellgap': ycellgap
    }

    # Running make module on HPC can cause issues if too many works try to
    # write to the module file at the same time. If something goes wrong,
    # assume the module has already been created.
    '''
    try:
    
        mymodule = rad_obj.makeModule(name=module_type, torquetube=torquetube, diameter=diameter, tubetype=tubetype, material=material, 
                                          xgap=xgap, ygap=ygap, zgap=zgap, numpanels=numpanels,# x=0.952, y=1.924,
                                          cellLevelModuleParams=cellLevelModuleParams, 
                                          axisofrotationTorqueTube=axisofrotationTorqueTube, glass=glass, z=0.0002)
        rad_obj.makeModule(name='sensor', x=0.15, y=0.15, z=0.04)

    except:
        print('Failed to make module.')
    '''
    radname = "Bi60_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute) + "_"

    sceneDict1 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 0,
        'originy': ymods[0]
    }
    sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict1,
                                  radname=radname)

    sceneDict2 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 1,
        'originy': ymods[0]
    }
    sceneObj2 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict2,
                                  radname=radname)

    sceneDict3 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 2,
        'originy': ymods[0]
    }
    sceneObj3 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict3,
                                  radname=radname)

    sceneDict4 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 3,
        'originy': ymods[0]
    }
    sceneObj4 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict4,
                                  radname=radname)

    sceneDict5 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 4,
        'originy': ymods[0]
    }
    sceneObj5 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict5,
                                  radname=radname)

    sceneDict6 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 5,
        'originy': ymods[0]
    }
    sceneObj6 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict6,
                                  radname=radname)

    sceneDict7 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 6,
        'originy': ymods[0]
    }
    sceneObj7 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict7,
                                  radname=radname)

    sceneDict8 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 7,
        'originy': ymods[0]
    }
    sceneObj8 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict8,
                                  radname=radname)

    sceneDict9 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 8,
        'originy': ymods[0]
    }
    sceneObj9 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict9,
                                  radname=radname)

    sceneDict10 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 9,
        'originy': ymods[0]
    }
    sceneObj10 = rad_obj.makeScene(moduletype=module_type,
                                   sceneDict=sceneDict10,
                                   radname=radname)

    #sceneObjects[tilt] = {'Obj1': sceneObj1, 'Obj2': sceneObj2, 'Obj3': sceneObj3, 'Obj4': sceneObj4, 'Obj5': sceneObj5, 'Obj6': sceneObj6, 'Obj7': sceneObj7, 'Obj8': sceneObj8, 'Obj9': sceneObj9, 'Obj10': sceneObj10}

    modulesArray = []
    fieldArray = []

    modulesArray.append(sceneObj1)
    modulesArray.append(sceneObj2)
    modulesArray.append(sceneObj3)
    modulesArray.append(sceneObj4)
    modulesArray.append(sceneObj5)
    modulesArray.append(sceneObj6)
    modulesArray.append(sceneObj7)
    modulesArray.append(sceneObj8)
    modulesArray.append(sceneObj9)
    modulesArray.append(sceneObj10)
    fieldArray.append(modulesArray)

    textrow1 = ''
    textrow2 = sceneObj2.text + '\r\n'
    textrow3 = sceneObj3.text + '\r\n'
    textrow4 = sceneObj4.text + '\r\n'
    textrow5 = sceneObj5.text + '\r\n'
    textrow6 = sceneObj6.text + '\r\n'
    textrow7 = sceneObj7.text + '\r\n'
    textrow8 = sceneObj8.text + '\r\n'
    textrow9 = sceneObj9.text + '\r\n'
    textrow10 = sceneObj10.text + '\r\n'

    # Row 1
    for i in range(1, 20):
        modulesArray = []

        sceneDict1 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 0,
            'originy': ymods[i]
        }
        sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict1,
                                      radname=radname)

        sceneDict2 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 1,
            'originy': ymods[i]
        }
        sceneObj2 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict2,
                                      radname=radname)

        sceneDict3 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 2,
            'originy': ymods[i]
        }
        sceneObj3 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict3,
                                      radname=radname)

        sceneDict4 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 3,
            'originy': ymods[i]
        }
        sceneObj4 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict4,
                                      radname=radname)

        sceneDict5 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 4,
            'originy': ymods[i]
        }
        sceneObj5 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict5,
                                      radname=radname)

        sceneDict6 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 5,
            'originy': ymods[i]
        }
        sceneObj6 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict6,
                                      radname=radname)

        sceneDict7 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 6,
            'originy': ymods[i]
        }
        sceneObj7 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict7,
                                      radname=radname)

        sceneDict8 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 7,
            'originy': ymods[i]
        }
        sceneObj8 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict8,
                                      radname=radname)

        sceneDict9 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 8,
            'originy': ymods[i]
        }
        sceneObj9 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict9,
                                      radname=radname)

        sceneDict10 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 9,
            'originy': ymods[i]
        }
        sceneObj10 = rad_obj.makeScene(moduletype=module_type,
                                       sceneDict=sceneDict10,
                                       radname=radname)

        textrow1 += sceneObj1.text + '\r\n'
        textrow2 += sceneObj2.text + '\r\n'
        textrow3 += sceneObj3.text + '\r\n'
        textrow4 += sceneObj4.text + '\r\n'
        textrow5 += sceneObj5.text + '\r\n'
        textrow6 += sceneObj6.text + '\r\n'
        textrow7 += sceneObj7.text + '\r\n'
        textrow8 += sceneObj8.text + '\r\n'
        textrow9 += sceneObj9.text + '\r\n'
        textrow10 += sceneObj10.text + '\r\n'

        modulesArray.append(sceneObj1)
        modulesArray.append(sceneObj2)
        modulesArray.append(sceneObj3)
        modulesArray.append(sceneObj4)
        modulesArray.append(sceneObj5)
        modulesArray.append(sceneObj6)
        modulesArray.append(sceneObj7)
        modulesArray.append(sceneObj8)
        modulesArray.append(sceneObj9)
        modulesArray.append(sceneObj10)

        fieldArray.append(modulesArray)

    # Redoing the first module to append everything to it.
    sceneDict1 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 0,
        'originy': ymods[0]
    }
    sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict1,
                                  radname=radname)

    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow1)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow2)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow3)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow4)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow5)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow6)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow7)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow8)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow9)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow10)

    # Custom BSA Geometry
    # Bottom posttubes and torquetube:
    for i in range(0, 10):
        xpost = i * pitch

        # adding torquetube
        torquetube = '\n\r! genrev Metal_Grey torquetube{} t*{} {} 32 | xform -rx -90 -t {} {} {}'.format(
            i, length, diameter / 2.0, xpost, ttedgeoffset, hub_height - zgap)
        rad_obj.appendtoScene(sceneObj1.radfiles, '', torquetube)

        for j in range(0, 5):
            ypost = ypostlist[j]

            post1 = '! genbox Metal_Grey pile{} {} {} {} | xform -t {} {} 0 '.format(
                (str(i) + "," + str(j)), postdiamx, postdiamy, hub_height,
                -postdiamx / 2.0 + xpost, -postdiamy + ypost)
            rad_obj.appendtoScene(sceneObj1.radfiles, '', post1)

    ###########################
    # Create sensor objects   #
    ###########################

    # West Sensors
    shhw = 1.5 + (1 - 0.226 / 2) * sin(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * cos(radians(tilt))
    sxw = pitch * 2 - (1 - 0.226 / 2) * cos(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * sin(radians(tilt))
    syw = ymods[9] + 0.5 + 0.226 / 2
    sensorw_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhw,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxw,
        'originy': syw,
        'appendRadfile': True
    }
    res_name = "SensorW_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    sensorw_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                         sceneDict=sensorw_scene,
                                         radname=res_name)

    syw = ymods[15] + 0.5 + 0.226 / 2
    sensorIMTw_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhw,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxw,
        'originy': syw,
        'appendRadfile': True
    }
    res_name = "SensorIMTW_" + str(foo.year) + "_" + str(
        foo.month) + "_" + str(foo.day) + "_" + str(foo.hour) + "_" + str(
            foo.minute)
    sensorIMTw_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                            sceneDict=sensorIMTw_scene,
                                            radname=res_name)

    # East Sensors
    shhe = 1.5 - (1 - 0.226 / 2) * sin(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * cos(radians(tilt))
    sxe = pitch * 2 + (1 - 0.226 / 2) * cos(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * sin(radians(tilt))
    sye = ymods[9] + 0.5 + 0.226 / 2
    sensore_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhe,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxe,
        'originy': sye,
        'appendRadfile': True
    }
    res_name = "SensorE_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    sensore_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                         sceneDict=sensore_scene,
                                         radname=res_name)

    sye = ymods[15] + 0.5 + 0.226 / 2
    sensorIMTe_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhe,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxe,
        'originy': sye,
        'appendRadfile': True
    }
    res_name = "SensorIMTE_" + str(foo.year) + "_" + str(
        foo.month) + "_" + str(foo.day) + "_" + str(foo.hour) + "_" + str(
            foo.minute)
    sensorIMTe_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                            sceneDict=sensorIMTe_scene,
                                            radname=res_name)

    # Build oct file
    sim_name = "BEST_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    octfile = rad_obj.makeOct(rad_obj.getfilelist(), octname=sim_name)

    #################
    # Run analysis  #
    #################

    #Row 3 Module 10 sensors
    analysis = AnalysisObj(octfile, rad_obj.basename)

    frontscan, backscan = analysis.moduleAnalysis(
        sensorw_sceneObj,
        sensorsy=1)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorW_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)

    frontscan, backscan = analysis.moduleAnalysis(
        sensore_sceneObj,
        sensorsy=1)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorE_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)

    #IMT Sensors Row 3 Module 5
    '''
    frontscan, backscan = analysis.moduleAnalysis(sensorIMTw_sceneObj, sensorsy=1)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorIMTW_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)

    frontscan, backscan = analysis.moduleAnalysis(sensorIMTe_sceneObj, sensorsy=1)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorIMTE_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)
    
    #fieldARray[module][row]

    #HYDRA
    modmod = 16
    rowrow = 1
    frontscan, backscan = analysis.moduleAnalysis(fieldArray[modmod][rowrow], sensorsy=12)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)        
    res_name = "Hydra_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)

    '''

    #LOCATION_APOGEES
    modmod = 9
    rowrow = 2
    frontscan, backscan = analysis.moduleAnalysis(
        fieldArray[modmod][rowrow],
        sensorsy=4)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    frontscan['ystart'] = frontscan['ystart'] + 0.45
    backscan['ystart'] = backscan['ystart'] + 0.45
    res_name = "Apogee_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)
    '''
    # SCAN FULL ROWS
    for rowrow in range(5, 7):
        for modmod in range(0, 20):
            frontscan, backscan = analysis.moduleAnalysis(fieldArray[modmod][rowrow], sensorsy=12)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)        
            res_name = "Row_"+str(rowrow)+"_Mod_"+str(modmod)+"_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
            frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)
    '''
    # Read in results
    #results_file = os.path.join('results', f'irr_sensor_{sim_name}.csv')
    #results = load.read1Result(results_file)
    results = 1

    # Format output
    #tracker_theta = tilt
    #front = ','.join([ str(f) for f in results['Wm2Front'] ])
    #back = ','.join([ str(r) for r in results['Wm2Back'] ])
    print("***** Finished simulation for " + str(foo))
    #time_str = metdata.datetime[idx]
    #    print(f"sim_results,{idx},{time_str},{wavelength},{dni},{dhi},{alb}," \
    #          f"{tracker_theta},{front},{back}")
    return results