

// THIS FUNCTION RETURNS A 3-ELEMENT ARRAY OF MIPS SCAN SENSITIVITIES:

function MIPS_scan_sensitivity(scanrate, Nrepeat, background_index) 
{

   // 11.15.2004: this module updated with S11 numbers (GKS).
   //
   // Define sensitivities in MIPS passbands:
   //    Entries are for (low, med, high) backgrounds.
   //    Values for 24 microns come from Bill Latter's 
   //         "MIPS_sens[low,med,hi]_4nov04"
   //         excel spreadsheets; also in the ost cvs repository.
   //

   MIPS_scan_sens_24_slow  = new Array(57.87, 68.94, 112.89);
   MIPS_scan_sens_70_slow  = new Array(3249.0, 3833.0, 6335.0);
   MIPS_scan_sens_160_slow = new Array(42872.0, 51018.0, 88745.0);

   MIPS_scan_sens_24_medium  = new Array(113.21, 130.60, 199.86);
   MIPS_scan_sens_70_medium  = new Array(5137.0, 5908.0, 9298.0);
   MIPS_scan_sens_160_medium = new Array(67786.0, 89478.0, 176244.0);

   MIPS_scan_sens_24_fast  = new Array(211.53, 240.60, 358.22);
   MIPS_scan_sens_70_fast  = new Array(8388.0, 9479.0, 14475.0);
   MIPS_scan_sens_160_fast = new Array(78273.0, 108017.0, 221513.0);

   // Define exposure depth per pixel in MIPS passbands:
   // Source: SOM v4.0, Table 8.7, pg. 249.
 
   MIPS_scan_texp_per_pass_24   = new Array(100.0, 40.0, 15.0);
   MIPS_scan_texp_per_pass_70   = new Array(100.0, 40.0, 15.0);
   MIPS_scan_texp_per_pass_160  = new Array(10.0, 4.0, 3.0);

   mytmp = new Array(3);

   switch (scanrate){
	  case "Slow": 
	       mytmp[0] = MIPS_scan_sens_24_slow[background_index];
	       mytmp[1] = MIPS_scan_sens_70_slow[background_index];
	       mytmp[2] = MIPS_scan_sens_160_slow[background_index];
	       t_exp[5] = MIPS_scan_texp_per_pass_24[0] * Nrepeat;
	       t_exp[6] = MIPS_scan_texp_per_pass_70[0] * Nrepeat;
	       t_exp[7] = MIPS_scan_texp_per_pass_160[0]* Nrepeat;
          break;
	  case "Medium":
	       mytmp[0] = MIPS_scan_sens_24_medium[background_index];
	       mytmp[1] = MIPS_scan_sens_70_medium[background_index];
	       mytmp[2] = MIPS_scan_sens_160_medium[background_index];
	       t_exp[5] = MIPS_scan_texp_per_pass_24[1] * Nrepeat;
	       t_exp[6] = MIPS_scan_texp_per_pass_70[1] * Nrepeat;
	       t_exp[7] = MIPS_scan_texp_per_pass_160[1]* Nrepeat;
	  break;
	  case "Fast":
	       mytmp[0] = MIPS_scan_sens_24_fast[background_index];
	       mytmp[1] = MIPS_scan_sens_70_fast[background_index];
	       mytmp[2] = MIPS_scan_sens_160_fast[background_index];
	       t_exp[5] = MIPS_scan_texp_per_pass_24[2] * Nrepeat;
	       t_exp[6] = MIPS_scan_texp_per_pass_70[2] * Nrepeat;
	       t_exp[7] = MIPS_scan_texp_per_pass_160[2]* Nrepeat;
          break;
	  default: 
	       alert("Scan rate out of range in MIPS Scan Map. The SENS-PET is confused! Please reload the webpage, or clear the form.");
          break;
   }

   if( Nrepeat <= 0.0)
   {
      alert("The SENS-PET is confused! Please clear the form, and/or reload the webpage.");
   }

   mytmp[0] = mytmp[0] / Math.sqrt( Nrepeat );
   mytmp[1] = mytmp[1] / Math.sqrt( Nrepeat );
   mytmp[2] = mytmp[2] / Math.sqrt( Nrepeat );
   
  // CALCULATE EXTENDED SOURCE SENSITIVITIES:
  // Conversion is on MIPS sensitivity webpage:
  //    http://ssc.spitzer.caltech.edu/mips/sens.html

  extended_source_sens[5] = 1.04e-3 * mytmp[0];      // 24 micron array
  extended_source_sens[7] = 2.52e-5 * mytmp[2];      // 160 micron array
  extended_source_sens[6] = 8.81e-5 * mytmp[1];      // 70 micron array
						     //   - default scale

   return mytmp;
}

// THIS FUNCTION RETURNS A 3-ELEMENT ARRAY OF MIPS PHOTO/SUPER-RES SENSITIVITIES:

function MIPS_photo_sensitivity(mips_24_fieldsize, 
	   mips_24_frametime_index, mips_24_Nrepeat,
	   mips_70_pixelscale, mips_70_fieldsize, mips_70_frametime_index, 
	   mips_70_Nrepeat, mips_160_fieldsize, 
	   mips_160_frametime_index, mips_160_Nrepeat, background_index)
{

   // Define exposure depth per pixel (SOM v5.0, Table 8.11, pg. 304):

   MIPS_photo_24_small_texp = new Array(42.0, 140.0, 420.0);
   MIPS_photo_24_large_texp = new Array(30.0, 100.0, 300.0);

   MIPS_photo_160_small_texp = new Array(6.0, 20.0);
   MIPS_photo_160_large_texp = new Array(3.0, 10.0);

   MIPS_photo_70_large_default_texp = new Array(18.0, 60.0);
   MIPS_photo_70_large_fine_texp = new Array(24.0, 80.0);

   MIPS_photo_70_small_default_texp = new Array(30.0, 100.0);
   MIPS_photo_70_small_fine_texp = new Array(24.0, 80.0);

   // FILL IN 24 MICRON EXPOSURE DEPTH PER PIXEL:

   if (mips_24_fieldsize == "small")
   {
      t_exp[5] = MIPS_photo_24_small_texp[mips_24_frametime_index] * mips_24_Nrepeat;
   }		  
   else if (mips_24_fieldsize == "large")
      {
     t_exp[5] = MIPS_photo_24_large_texp[mips_24_frametime_index] * mips_24_Nrepeat;
   }
  else
     alert("0. Field size index out of range for MIPS P/SR 24 microns");

   // FILL IN 70 MICRON EXPOSURE DEPTH PER PIXEL:

   if (mips_70_fieldsize == "small")
   {
      if( mips_70_pixelscale == "default")      
         t_exp[6] = MIPS_photo_70_small_default_texp[mips_70_frametime_index] * mips_70_Nrepeat;
      else if ( mips_70_pixelscale == "fine")
         t_exp[6] = MIPS_photo_70_small_fine_texp[mips_70_frametime_index] * mips_70_Nrepeat;         else
	 alert("-1. Pixel scale out of range in P/SR. PET is confused! Please clear the form and/or reload the webpage.");      
   }		  
   else if (mips_70_fieldsize == "large")
   {
      if( mips_70_pixelscale == "default")      
         t_exp[6] = MIPS_photo_70_large_default_texp[mips_70_frametime_index] * mips_70_Nrepeat;
      else if ( mips_70_pixelscale == "fine")
         t_exp[6] = MIPS_photo_70_large_fine_texp[mips_70_frametime_index] * mips_70_Nrepeat;         else
	 alert("-1. Pixel scale out of range in P/SR. PET is confused! Please clear the form and/or reload the webpage.");      
   }
  else
     alert("0. Field size index out of range for MIPS P/SR 24 microns");

   // FILL IN 160 MICRON EXPOSURE DEPTH PER PIXEL:

   if (mips_160_fieldsize == "small")
   {
      t_exp[7] = MIPS_photo_160_small_texp[mips_160_frametime_index] * mips_160_Nrepeat;
   }		  
   else if (mips_160_fieldsize == "large")
   {
     t_exp[7] = MIPS_photo_160_large_texp[mips_160_frametime_index] * mips_160_Nrepeat;
   }
   else if (mips_160_fieldsize == "enhanced")
   {
      t_exp[7] = MIPS_photo_160_small_texp[mips_160_frametime_index] * mips_160_Nrepeat;
   }
  else
     alert("0. Field size out of range in P/SR. PET is confused! Please clear the form and/or reload the webpage."); 


   // DEFINE SENSITIVITIES IN 24 MICRON BAND:
   //    Values come from Bill Latter's "MIPS_sens[low,med,hi]_5nov04"
   //         excel spreadsheets; also in the ost cvs repository.
   // Notation:
   //    ... ... ...  FOV_BKGD(frametimes)

   // 24 microns:

   MIPS_photo_sens_24_small_lo = new Array(126.41, 48.91, 28.06);
   MIPS_photo_sens_24_large_lo = new Array(149.58, 57.87, 33.20);

   MIPS_photo_sens_24_small_medium = new Array(143.79, 58.26, 34.74);
   MIPS_photo_sens_24_large_medium = new Array(170.13, 68.94, 41.11);

   MIPS_photo_sens_24_small_high = new Array(214.08, 95.41, 71.89995);   // n.b. spreadsheet has 0 for 3rd entry (420s exp)
   MIPS_photo_sens_24_large_high = new Array(253.30, 112.89, 83.08087); // n.b. spreadsheet has 0 for 3rd entry (300s exp) 


   // 70 microns:  

   MIPS_photo_sens_70_small_default_lo = new Array(5931, 3249);
   MIPS_photo_sens_70_small_fine_lo    = new Array(13818, 7991);
 
   MIPS_photo_sens_70_small_default_medium = new Array(6702.4, 3833.3);
   MIPS_photo_sens_70_small_fine_medium    = new Array(16485.8, 9428.6);

   MIPS_photo_sens_70_small_default_high = new Array(10320.7, 6334.7);
   MIPS_photo_sens_70_small_fine_high    = new Array(25385.5, 15581.1);

   MIPS_photo_sens_70_large_default_lo = new Array(7658, 4194);
   MIPS_photo_sens_70_large_fine_lo    = new Array(13818, 7991);

   MIPS_photo_sens_70_large_default_medium = new Array(8652.8, 4948.8);
   MIPS_photo_sens_70_large_fine_medium    = new Array(16485.8,9428.6);

   MIPS_photo_sens_70_large_default_high = new Array(13324.0, 8178.0);
   MIPS_photo_sens_70_large_fine_high    = new Array(25385.5, 15581.1);

   // DEFINE SENSITIVITIES IN 160 MICRON BAND:
 
   MIPS_photo_sens_160_small_lo = new Array(55347.0, 30315.08);
   MIPS_photo_sens_160_large_lo = new Array(78273.0, 42872.0);

   MIPS_photo_sens_160_small_medium = new Array(76379.0, 36075.5);
   MIPS_photo_sens_160_large_medium = new Array(108017.0, 51018.0);

   MIPS_photo_sens_160_small_high = new Array(156633.3, 62752.2); 
   MIPS_photo_sens_160_large_high = new Array(221513, 88745); 

   MIPS_photo_sens_160_enhanced_lo = new Array(55347.0 * 1.22, 30315.08 * 1.22);
   MIPS_photo_sens_160_enhanced_medium = new Array(55347.0 * 1.22, 30315.08 * 1.22);
   MIPS_photo_sens_160_enhanced_high = new Array(55347.0 * 1.22, 30315.08 * 1.22);

   mytmp = new Array(3);	 

   switch (background_index){
	  case 0: 

	     // 24 microns:
	       if (mips_24_fieldsize == "small")
	       {
	          mytmp[0] = MIPS_photo_sens_24_small_lo[mips_24_frametime_index];
	       }		  
	       else if (mips_24_fieldsize == "large")
	          mytmp[0] = MIPS_photo_sens_24_large_lo[mips_24_frametime_index];
	       else
		  alert("1. Field size index out of range for MIPS P/SR 24 microns");

	     // 70 microns:
	       if (mips_70_fieldsize == "small")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_small_default_lo[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_small_fine_lo[mips_70_frametime_index];
		 else
		    alert("1. Pixel scale index out of range for MIPS P/HR 70 microns");
	       }	          
	       else if (mips_70_fieldsize == "large")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_large_default_lo[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_large_fine_lo[mips_70_frametime_index];
		 else
		    alert("2. Pixel scale index out of range for MIPS P/SR 70 microns");
	       }
	       else
		    alert("1. Field size index out of range for MIPS P/SR 70 microns");

	     // 160 microns:
	       if (mips_160_fieldsize == "small")
	          mytmp[2] = MIPS_photo_sens_160_small_lo[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "large")
	          mytmp[2] = MIPS_photo_sens_160_large_lo[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "enhanced")
	          mytmp[2] = MIPS_photo_sens_160_enhanced_lo[mips_160_frametime_index];
	       else
		  alert("1. Field size index out of range for MIPS P/SR 160 microns");

	       break;
	  case 1:

	     // 24 microns:
	       if (mips_24_fieldsize == "small")
	          mytmp[0] = MIPS_photo_sens_24_small_medium[mips_24_frametime_index];
	       else if (mips_24_fieldsize == "large")
	          mytmp[0] = MIPS_photo_sens_24_large_medium[mips_24_frametime_index]; 
	       else
		  alert("2. Field size index out of range for MIPS P/SR 24 microns");

	     // 70 microns:
	       if (mips_70_fieldsize == "small")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_small_default_medium[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_small_fine_medium[mips_70_frametime_index];
		 else
		    alert("3. Pixel scale index out of range for MIPS P/HR 70 microns");
	       }	          
	       else if (mips_70_fieldsize == "large")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_large_default_medium[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_large_fine_medium[mips_70_frametime_index];
		 else
		    alert("4. Pixel scale index out of range for MIPS P/SR 70 microns");
	       }
	       else
		    alert("2. Field size index out of range for MIPS P/SR 70 microns");

	     // 160 microns:
	       if (mips_160_fieldsize == "small")
	          mytmp[2] = MIPS_photo_sens_160_small_medium[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "large")
	          mytmp[2] = MIPS_photo_sens_160_large_medium[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "enhanced")
	          mytmp[2] = MIPS_photo_sens_160_enhanced_medium[mips_160_frametime_index];
	       else
		  alert("2. Field size index out of range for MIPS P/SR 160 microns");

	       break;
	  case 2: 
	     // 24 microns:
	       if (mips_24_fieldsize == "small")
	          mytmp[0] = MIPS_photo_sens_24_small_high[mips_24_frametime_index];
	       else if (mips_24_fieldsize == "large")
	          mytmp[0] = MIPS_photo_sens_24_large_high[mips_24_frametime_index];
	       else
		  alert("3. Field size index out of range for MIPS P/SR 24 microns");	

	     // 70 microns:
	       if (mips_70_fieldsize == "small")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_small_default_high[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_small_fine_high[mips_70_frametime_index];
		 else
		    alert("5. Pixel scale index out of range for MIPS P/HR 70 microns");
	       }	          
	       else if (mips_70_fieldsize == "large")
	       {
	         if (mips_70_pixelscale == "default")
		    mytmp[1] = MIPS_photo_sens_70_large_default_high[mips_70_frametime_index];
		 else if (mips_70_pixelscale == "fine")
		    mytmp[1] = MIPS_photo_sens_70_large_fine_high[mips_70_frametime_index];
		 else
		    alert("6. Pixel scale index out of range for MIPS P/SR 70 microns");
	       }
	       else
		    alert("7. Field size index out of range for MIPS P/SR 70 microns");

	     // 160 microns:
	       if (mips_160_fieldsize == "small")
	          mytmp[2] = MIPS_photo_sens_160_small_high[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "large")
	          mytmp[2] = MIPS_photo_sens_160_large_high[mips_160_frametime_index];
	       else if (mips_160_fieldsize == "enhanced")
	          mytmp[2] = MIPS_photo_sens_160_enhanced_high[mips_160_frametime_index];
	       else
		  alert("3. Field size index out of range for MIPS P/SR 160 microns");

          break;
	  default : 
	       alert("Background index out of range in MIPS P/SR");
   }

  if(mips_24_Nrepeat != 0.0)
     mytmp[0] = mytmp[0] / Math.sqrt(mips_24_Nrepeat);
  if(mips_70_Nrepeat != 0.0)
     mytmp[1] = mytmp[1] / Math.sqrt(mips_70_Nrepeat);
  if(mips_160_Nrepeat != 0.0)
     mytmp[2] = mytmp[2] / Math.sqrt(mips_160_Nrepeat);

  // CALCULATE EXTENDED SOURCE SENSITIVITIES: 
  // Source: Conversion is on MIPS sensitivity webpage:
  //	        http://ssc.spitzer.caltech.edu/mips/sens.html

  extended_source_sens[5] = 1.04e-3 * mytmp[0];      // 24 micron array
  extended_source_sens[7] = 2.52e-5 * mytmp[2];      // 160 micron array

  if (mips_70_pixelscale == "default")
     extended_source_sens[6] = 8.81e-5 * mytmp[1];
  else if (mips_70_pixelscale == "fine")
     extended_source_sens[6] = 1.77e-4 * mytmp[1];
  else
  {
     alert("8. Field size index out of range for MIPS P/SR 70 microns. The SENS-PET is confused! Please reset the form and/or reload the webpage.");     
  }

 return mytmp;

}

// THIS FUNCTION RETURNS IRS PUI sensitivity:

function IRSsensFull(IRS_frameTimeIndex, Nrepeat_IRS, bgindex, IRS_frametime, IRS_mode)
{

   var ess_conv_factor;

   // Set sensitivities for each exposure time, filter and background combination
   // Source: SOM v7.0, Table 7.6, pg 185)


   // X 1E-12/(13/4.254517E10) 

   if ( IRS_mode == "Red PUI" )
   {
      sens_pui_low = new Array(75.0, 115.0, 180.0);
      sens_pui_med = new Array(95.0, 140.0, 220.0);
      sens_pui_high = new Array(120.0, 180.0, 280.0);
      ess_conv_factor = 29.0 * 23.5;
   }
   else if ( IRS_mode == "Blue PUI" )
   {
      sens_pui_low = new Array(50.0, 75.0, 115.0);     
      sens_pui_med = new Array(65.0, 95.0, 145.0);
      sens_pui_high = new Array(80.0, 120.0, 190.0);
      ess_conv_factor = 13.0 * 23.5 ;    
   } 
   else
   {
      alert("Unknown IRS PUI mode. SENS-PET is confused! Please reset the form and/or reload the webpage");
      return -1;
   }

   if (bgindex == 0)
   { 
        sens_pui = sens_pui_low;
   }
   else if (bgindex == 1)
   { 
        sens_pui = sens_pui_med;
   }
   else if (bgindex == 2)
   { 
        sens_pui = sens_pui_high;
   }
   else
   {
      alert("Unknown IRS PUI + background. SENS-PET is confused! Please reset the form and/or reload the webpage");
      return -1;
   }

 result = sens_pui[IRS_frameTimeIndex] / Math.sqrt(Nrepeat_IRS);

 t_exp[4] = IRS_frametime * Nrepeat_IRS;
 extended_source_sens[4] = result / ess_conv_factor;

 return result;

}

// THIS FUNCTION RETURNS A 4-ELEMENT ARRAY OF IRAC sensitivities:

function IRACsensFull(frameTimeIndex, Nrepeat, bgindex, frametime, mode)
{
   // SET IRAC "NOISE PIXELS" (SOM v7.0, Table 6.1, pg. 74):

   IRAC_noise_pix = new Array(7.0, 7.2, 10.8, 13.4);

   // SET IRAC throughput corrections (SOM v7.0, Table 6.5, pg. 100):

   IRAC_throughput_corr_ptsource = new Array(1.06, 0.84, 0.45, 0.61);

   IRAC_throughput_corr_bkgd = new Array(1.0, 1.0, 0.72 , 0.88 );

 // Source: SOM v7.0, Figures 6.20, 6.21, and 6.22 (or Tables 6.9-11)
 if ( mode == "Full" )
 {
     sensOneLow1 = new Array(360,180,32,3.3,1.4,0.60);
     sensOneLow2 = new Array(430,210,38,4.8,2.4,1.2);
     sensOneLow3 = new Array(1260,630,150,27,16,8.0);
     sensOneLow4 = new Array(450,250,92,29,18,9.8);

     sensOneMed1 = new Array(360,180,32,3.6,1.6,0.73);
     sensOneMed2 = new Array(430,210,38,5.3,2.8,1.4);
     sensOneMed3 = new Array(1260,640,150,31,18,9.3);
     sensOneMed4 = new Array(460,260,110,34,21,12);

     sensOneHigh1 = new Array(360,180,34,4.8,2.5,1.3);
     sensOneHigh2 = new Array(430,220,41,7.1,4.1,2.1);
     sensOneHigh3 = new Array(1280,660,180,44,27,14);
     sensOneHigh4 = new Array(540,330,156,52,32,18);
  }
  else if ( mode == "Subarray" )
  {
     sensOneLow1 = new Array(7300.00, 485.00, 84.00);
     sensOneLow2 = new Array(8600.00, 550.00, 89.00);
     sensOneLow3 = new Array(25000.00, 2010.0, 609.00);
     sensOneLow4 = new Array(8100.00, 690.00, 225.00);

     sensOneMed1 = new Array(7300.00, 490.00, 82.00);
     sensOneMed2 = new Array(8600.00, 550.00, 89.00);
     sensOneMed3 = new Array(25000.00, 2020.0, 610.00);
     sensOneMed4 = new Array(8100.00, 720.00, 250.00);

     sensOneHigh1 = new Array(7300.00, 490.00, 84.00);
     sensOneHigh2 = new Array(8600.00, 560.00, 93.00);
     sensOneHigh3 = new Array(25000.00, 2100.0, 650.00);
     sensOneHigh4 = new Array(8200.00, 860.00, 340.00);

     Nrepeat = 64 * Nrepeat;
  }
  else
  {
     alert("Unknown IRAC readout mode. SENS-PET is confused! Please reset the form and/or reload the webpage");
     return -1;
  }

 if (bgindex == 0)
 { 
    sensOne1 = sensOneLow1;
    sensOne2 = sensOneLow2;
    sensOne3 = sensOneLow3;
    sensOne4 = sensOneLow4;
 } 
 else if (bgindex == 1)
 {
    sensOne1 = sensOneMed1;
    sensOne2 = sensOneMed2;
    sensOne3 = sensOneMed3;
    sensOne4 = sensOneMed4;
 }
 else if (bgindex == 2)
 {
    sensOne1 = sensOneHigh1;
    sensOne2 = sensOneHigh2;
    sensOne3 = sensOneHigh3;
    sensOne4 = sensOneHigh4;
 }
 else
 {
    alert("Unknown background level for IRAC observations. The SENS-PET is confused! Please reset the form and/or reload the PET webpage.");
    return(-1);
 }

 // Fill in the exposure depth info:

 t_exp[0] = Nrepeat * frametime;
 t_exp[1] = Nrepeat * frametime;
 t_exp[2] = Nrepeat * frametime;
 t_exp[3] = Nrepeat * frametime;

 result = new Array(4);

 result[0] = sensOne1[frameTimeIndex] / Math.sqrt(Nrepeat);
 result[1] = sensOne2[frameTimeIndex] / Math.sqrt(Nrepeat);
 result[2] = sensOne3[frameTimeIndex] / Math.sqrt(Nrepeat);
 result[3] = sensOne4[frameTimeIndex] / Math.sqrt(Nrepeat); 

 // Convert point to extended source sensitivity:
 // Source: SOM v7.0, Section 6.2.1, pg 107:
 for (var i = 0; i < 4; i++ )
    extended_source_sens[i] = (0.030 * IRAC_throughput_corr_ptsource[i] / (Math.sqrt(IRAC_noise_pix[i]) * IRAC_throughput_corr_bkgd[i]) ) * result[i];

 return result;

}

// THIS FUNCTION RETURNS A 2-ELEMENT ARRAY OF WARM IRAC sensitivities:

function IRACsensFull_warm(frameTimeIndex, Nrepeat, bgindex, frametime, mode)
{
   // SET IRAC "NOISE PIXELS" (SOM v9.0, Table 6.1, pg. 77):

   IRAC_noise_pix = new Array(7.0, 7.2);

   // SET IRAC throughput corrections (SOM v9.0, Table 6.6, pg. 100):

   IRAC_throughput_corr_ptsource = new Array(1.06, 0.84);

   IRAC_throughput_corr_bkgd = new Array(1.0, 1.0);

 // Source: SOM v9.0, Figures 6.20, 6.21, and 6.22 (or Tables 6.9-11)
 if ( mode == "Full" )
 {
     sensOneLow1 = new Array(419.836,210.017,37.2183,8.46456,3.83069,1.71646,0.685030);
     sensOneLow2 = new Array(443.099,221.950,39.1775,9.792,5.00465,2.52865,1.24939);

     sensOneMed1 = new Array(419.956,210.137,37.4422,8.72968,4.07466,1.94836,0.826776);
     sensOneMed2 = new Array(443.388,222.238,39.7188,10.3697,5.4789,2.88209,1.44583);


     sensOneHigh1 = new Array(420.712,210.892,38.8318,10.2525,5.36956,3.03073,1.42912);
     sensOneHigh2 = new Array(444.798,223.643,42.2656,12.8248,7.35299,4.20186,2.16306);

  }
  else if ( mode == "Subarray" )
  {
     sensOneLow1 = new Array(8392.95,553.025,101.100,18.9070);
     sensOneLow2 = new Array(8846.72,566.105,102.248,20.2937);


     sensOneMed1 = new Array(8393.07,553.252,101.383,19.1827);
     sensOneMed2 = new Array(8847.01,566.671,102.962,20.9444);


     sensOneHigh1 = new Array(8393.83,554.686,103.159,20.8462);
     sensOneHigh2 = new Array(8848.43,569.428,106.382,23.8715);


     Nrepeat = 64 * Nrepeat;
  }
  else
  {
     alert("Unknown Warm IRAC readout mode. SENS-PET is confused! Please reset the form and/or reload the webpage");
     return -1;
  }

 if (bgindex == 0)
 { 
    sensOne1 = sensOneLow1;
    sensOne2 = sensOneLow2;
 } 
 else if (bgindex == 1)
 {
    sensOne1 = sensOneMed1;
    sensOne2 = sensOneMed2;
 }
 else if (bgindex == 2)
 {
    sensOne1 = sensOneHigh1;
    sensOne2 = sensOneHigh2;
 }
 else
 {
    alert("Unknown background level for Warm IRAC observations. The SENS-PET is confused! Please reset the form and/or reload the PET webpage.");
    return(-1);
 }

 // Fill in the exposure depth info:

 t_exp[8] = Nrepeat * frametime;
 t_exp[9] = Nrepeat * frametime;

 result = new Array(4);

 result[0] = sensOne1[frameTimeIndex] / Math.sqrt(Nrepeat);
 result[1] = sensOne2[frameTimeIndex] / Math.sqrt(Nrepeat);

 // Convert point to extended source sensitivity:
 // Source: SOM v7.0, Section 6.2.1, pg 107:
 for (var i = 0; i < 2; i++ )
    extended_source_sens[i+8] = (0.030 * IRAC_throughput_corr_ptsource[i] / (Math.sqrt(IRAC_noise_pix[i]) * IRAC_throughput_corr_bkgd[i]) ) * result[i];

 return result;

}


// FUNCTION TO CHECK CONFUSION LIMIT: 

function check_confusion( the_sensitivity )
{

 // Confusion limits, in micro-Jy:
 // Source: MIPS webpage: http://ssc.spitzer.caltech.edu/mips/sens.html
 //         IRAC: SOM v7.0, Figure 6.20.

 // Adopt the 24 micron confusion limit for both IRS RED, BLUE PUI

 confusion = new Array(.6, .6, 0.0, 0.0, 11.2, 11.2, 640.0, 8000.0, 0.6, 0.6); 

 // Flag to see if anything is below confusion limit:

 confFlag  = new Array(0,0,0,0,0,0,0,0,0,0);
 var tmp   = 0;

 // Loop over bands and check:

 for (var i = 0; i < 10; i++)
 {
    if ( the_sensitivity[i] <= confusion[i])
    {
       confFlag[i] = 1;
       tmp        += 1;
    }
 }

 // If confusion flag is set, report message:
 
 // if ( tmp > 0) 
 // {  
   // msgWindow=window.open("","Messages", "height=500,width=600,scrollbars=yes,menubar"); 

   // msgWindow.document.writeln("<HEAD><TITLE>Confusion/Saturation warning</TITLE></HEAD>");
   // msgWindow.document.writeln("<body bgcolor=\"f52887\"><H4>Confusion warning!</H4>");
   // msgWindow.document.writeln("<pre>");
   // if ( confFlag[0] > 0 )
      // {msgWindow.document.writeln("<br>3.6 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/irac/sens.html\">confusion limit</a>.")};
   // if ( confFlag[1] > 0 )
      // {msgWindow.document.writeln("<br>4.5 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/irac/sens.html\">confusion limit</a>.")};
   // if ( confFlag[2] > 0)
      // {msgWindow.document.writeln("<br>5.8 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/irac/sens.html\">confusion limit</a>.")};
   // if ( confFlag[3] > 0)
      // {msgWindow.document.writeln("<br>8.0 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/irac/sens.html\">confusion limit</a>.")};
   // if ( confFlag[4] > 0)
      // {msgWindow.document.writeln("<br>IRS PUI may be below the <a href=\"http://ssc.spitzer.caltech.edu/irs/sens.html\">confusion limit</a>.")};
   // if ( confFlag[5] > 0)
      // {msgWindow.document.writeln("<br>24 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/mips/sens.html#confusionnote\">confusion limit</a>.")};
   // if ( confFlag[6] > 0)
      // {msgWindow.document.writeln("<br>70 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/mips/sens.html#confusionnote\">confusion limit</a>.")};
   // if ( confFlag[7] > 0)
      // {msgWindow.document.writeln("<br>160 micron band may be below the <a href=\"http://ssc.spitzer.caltech.edu/mips/sens.html#confusionnote\">confusion limit</a>.")};
   // msgWindow.document.writeln("<p></p><P><I><FONT COLOR=\"white\">* <B>Note on confusion limits:</FONT></B></I>");

   // msgWindow.document.writeln("<pre>The confusion limits are <b>lower limits</b> to the actual");
  //  msgWindow.document.writeln("position dependent on-sky confusion. The lower limits ");
   // msgWindow.document.writeln("shown on the low background sensitivity charts are for ");
   // msgWindow.document.writeln("regions of lowest expected confusion at high Galactic ");
   // msgWindow.document.writeln("latitudes and on clean sky. The observer should consider ");
   // msgWindow.document.writeln("the local confusion caused by background sources when ");
   // msgWindow.document.writeln("planning observations.");
   // msgWindow.document.writeln("Confusion will likely be more important in higher ");
   // msgWindow.document.writeln("background regions, and can limit the sensitivity that ");
   // msgWindow.document.writeln("can be achieved. Local sources of confusion, such as ");
   // msgWindow.document.writeln("cirrus and the stellar background, are highly variable ");
   // msgWindow.document.writeln("and can be very localized.<br><br>");

   // msgWindow.document.writeln("<P><form><INPUT TYPE='button' VALUE='Close' onClick='self.close()'></form>");
   // msgWindow.document.writeln("</pre>");
   // msgWindow.document.writeln("</body>");
 // }

 return confFlag;
 
}



