/*******************************************************************************
 *  Copyright 2017-2018 Centre for Development of Advanced Computing(C-DAC), Pune
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *   http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package cdac.medinfo.sdk.dcm30_04.dicommodel.modules;



import cdac.medinfo.sdk.dcm30_04.baselibs.BasicPixelSpacingCalibrationMacro;
import cdac.medinfo.sdk.dcm30_04.baselibs.Tag;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataSet;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITag;
import cdac.medinfo.sdk.dcm30_04.enums.EnumFieldOfViewShape;
import cdac.medinfo.sdk.dcm30_04.enums.EnumGrid;
import cdac.medinfo.sdk.dcm30_04.enums.EnumRadiationMode;
import cdac.medinfo.sdk.dcm30_04.enums.EnumRadiationSetting;

import cdac.medinfo.sdk.dcm30_04.exceptions.ConditionFailedException;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidModuleException;
import cdac.medinfo.sdk.dcm30_04.exceptions.MandatoryMissingException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConfig;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConstants;
import cdac.medinfo.sdk.dcm30_04.utils.DicomLogger;
import cdac.medinfo.sdk.dcm30_04.utils.ISingleCollection;
import cdac.medinfo.sdk.dcm30_04.utils.SingleCollection;

// TODO: Auto-generated Javadoc
/**
 \* This module specifies attributes related to XRay Acquisition.
 * 
 * 
 */
public class XRayAcquisitionModule extends Module  
{


	/**
	 * The obj single collection.
	 */
	public static ISingleCollection<ITag> objSingleCollection = null;


	/**
	 * Instantiates a new x ray acquisition module.
	 * 
	 * @param objIDataSet the obj i data set
	 */
	BasicPixelSpacingCalibrationMacro objBasicPixelSpacingCalibrationMacro=null;
	public XRayAcquisitionModule(IDataSet objIDataSet)
	{
		super(objIDataSet);
	}

	static
	{
		objSingleCollection = new SingleCollection<ITag>();
		objSingleCollection.add(new Tag(0x0018,0x0060));
		objSingleCollection.add(new Tag(0x0018,0x1147));
		objSingleCollection.add(new Tag(0x0018,0x1149));
		objSingleCollection.add(new Tag(0x0018,0x1150));
		objSingleCollection.add(new Tag(0x0018,0x1151));
		objSingleCollection.add(new Tag(0x0018,0x1152));
		objSingleCollection.add(new Tag(0x0018,0x1153));
		objSingleCollection.add(new Tag(0x0018,0x1154));
		objSingleCollection.add(new Tag(0x0018,0x1155));
		objSingleCollection.add(new Tag(0x0018,0x115A));
		objSingleCollection.add(new Tag(0x0018,0x115E));
		objSingleCollection.add(new Tag(0x0018,0x1161));
		objSingleCollection.add(new Tag(0x0018,0x1162));
		objSingleCollection.add(new Tag(0x0018,0x1164));
		objSingleCollection.add(new Tag(0x0018,0x1166));
		objSingleCollection.add(new Tag(0x0018,0x1190));
		objSingleCollection.add(new Tag(0x0018,0x8150));
		objSingleCollection.add(new Tag(0x0018,0x8151));
	}

	/**
	 * This method validates each Attribute in the Module according to the Type
	 * of the Attribute.Attributes are of 5 types.
	 * Type 1,Type 2 are Mandatory:
	 * Mandatory Attributes have to present in the Module.
	 * Type 1C,2C are Conditional:
	 * Conditional Attributes' presence depend on a condition.
	 * If the condition is satisfied the Attribute has to be present.
	 * Type 3 are Optional
	 * Optional Attributes can be added as and when required.
	 * 
	 * @return boolean - returns validation status as success or failure
	 * 
	 * @throws InvalidModuleException - If validation of Module fails
	 */
	public  boolean validateModule() throws InvalidModuleException
	{

		try
		{	
			if(!isPresent(0x0018,0x0060))
				throw new MandatoryMissingException("0018,0060");
			if(!isPresent(0x0018,0x1155))
				throw new MandatoryMissingException("0018,1155");
			if(isPresent(0x0018,0x1150) && isPresent(0x0018,0x1152))
				throw new ConditionFailedException("0018,1152 should not present for Element 0018,1150");
			if(isPresent(0x0018,0x1151) && isPresent(0x0018,0x1152))
				throw new ConditionFailedException("0018,1152 should not present for Element 0018,1151");
			if(isPresent(0x0018,0x1152) && isPresent(0x0018,0x1151))
				throw new ConditionFailedException("0018,1151 should not present for Element 0018,1152");
			if(isPresent(0x0018,0x1152) && isPresent(0x0018,0x1150))
				throw new ConditionFailedException("0018,1150 should not present for Element 0018,1152");	
		}
		catch(MandatoryMissingException mme)
		{
			if(DicomConfig.createInstance().isLoggingOn())
				DicomLogger.getLogger().log(mme.getMessage());

			
				throw new InvalidModuleException(this.getClass().getSimpleName(),mme);

		}
		catch(ConditionFailedException cfe)
		{
			if(DicomConfig.createInstance().isLoggingOn())
				DicomLogger.getLogger().log(cfe.getMessage());

			
				throw new InvalidModuleException(this.getClass().getSimpleName(),cfe);

		}
		return true;
	}

	/**
	 * Sets Peak kilo voltage output of the X-Ray generator used.
	 * 
	 * @param strKVP : String value of KVP
	 */
	public void setKVP(String strKVP)
	{
		/* Accept Peak kilo voltage output of the x-ray generator used.
		 * in String format of type DS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x0060, DicomConstants.DCM_DT_DS, strKVP);
	}

	/**
	 * Return Peak kilo voltage output of the X-Ray generator used.
	 * 
	 * @return  String - String value of KVP
	 */
	public String getKVP()
	{
		Object objectValue = getValue(0x0018, 0x0060);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets Identify the general level of X-Ray dose exposure.
	 * 
	 * @param enumRadiationSetting Enum value of Radiation Setting .
	 */
	public void setRadiationSetting(EnumRadiationSetting enumRadiationSetting)
	{
		/* Accept Radiation Setting in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		String strRadiationSetting = enumRadiationSetting.getValue();
		addDataElement(0x0018, 0x1155, DicomConstants.DCM_DT_CS, strRadiationSetting);
	}

	/**
	 * Return Identify the general level of X-Ray dose exposure.
	 * 
	 * @return  String -String value of Radiation Setting .
	 */
	public String getRadiationSetting()
	{
		Object objectValue = getValue(0x0018, 0x1155);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets X-Ray Tube Current in mA.
	 * 
	 * @param strXRayTubeCurrentInuA String value of X-Ray Tube Current in mA
	 */
	public void setXRayTubeCurrentInuA(String strXRayTubeCurrentInuA)
	{
		/* Accept X-Ray Tube Current In Micro A in String format of type DS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1151, DicomConstants.DCM_DT_IS, strXRayTubeCurrentInuA);
	}

	/**
	 * Return X-Ray Tube Current in mA.
	 * 
	 * @return  String - String value of X-Ray Tube Current in mA
	 */
	public String getXRayTubeCurrentInuA()
	{
		Object objectValue = getValue(0x0018, 0x1151);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets X-Ray Tube Current in MicroA.
	 * 
	 * @param strXRayTubeCurrentInMicroA String value of X-Ray Tube Current in MicroA
	 */
	public void setXRayTubeCurrentInMicroA(String strXRayTubeCurrentInMicroA)
	{
		/* Accept X-Ray Tube Current In Micro A in String format of type DS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x8151, DicomConstants.DCM_DT_DS, strXRayTubeCurrentInMicroA);
	}

	/**
	 * Return X-Ray Tube Current in MicroA.
	 * 
	 * @return  String - String value of X-Ray Tube Current in MicroA
	 */
	public String getXRayTubeCurrentInMicroA()
	{
		Object objectValue = getValue(0x0018, 0x8151);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets duration of X-Ray exposure in msec.
	 * 
	 * @param strExposureTime String value of Exposure Time
	 */
	public void setExposureTime(String strExposureTime)
	{
		/* Accept Exposure Time in String format of type IS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1150, DicomConstants.DCM_DT_IS, strExposureTime);
	}

	/**
	 * Return duration of X-Ray exposure in msec.
	 * 
	 * @return  String - String value of Exposure Time
	 */
	public String getExposureTime()
	{
		Object objectValue = getValue(0x0018, 0x1150);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets duration of X-Ray exposure in msec.
	 * 
	 * @param strExposureTimeInuS String value of Exposure Time in  Micro Seconds
	 */
	public void setExposureTimeInuS(String strExposureTimeInuS)
	{
		/* Accept Exposure Time in Micro Seconds in String format of type DS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x8150, DicomConstants.DCM_DT_DS, strExposureTimeInuS);
	}

	/**
	 * Return duration of X-Ray exposure in Micro seconds.
	 * 
	 * @return  String - String value of Exposure Time in Micro seconds
	 */
	public String getExposureTimeInuS()
	{
		Object objectValue = getValue(0x0018, 0x8150);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets the exposure expressed in mAs, for example calculated from Exposure Time
	 * and X-ray Tube Current.
	 * 
	 * @param strExposure : String value of The exposure expressed in mAs
	 */
	public void setExposure(String strExposure)
	{
		/*Accept The exposure expressed in mAs in String format of type IS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1152, DicomConstants.DCM_DT_IS, strExposure);
	}

	/**
	 * Returns exposure expressed in mAs, for example calculated from Exposure Time.
	 * 
	 * @return String - String value of Exposure
	 */
	public String getExposure()
	{
		Object objectValue = getValue(0x0018, 0x1152);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets the exposure expressed in Micro As, for example calculated from Exposure Time
	 * and X-ray Tube Current.
	 * 
	 * @param strExposureInuAs : String value of The exposure expressed in mAs
	 */
	public void setExposureInuAs(String strExposureInuAs)
	{
		/*Accept The exposure expressed in MicroAs in String format of type IS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1153, DicomConstants.DCM_DT_IS, strExposureInuAs);
	}

	/**
	 * Returns the exposure expressed in Micro As.
	 * 
	 * @return String - String value of Exposure in Micro As
	 */
	public String getExposureInuAs()
	{
		Object objectValue = getValue(0x0018, 0x1153);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets the value that identifies the grid. Only a single value shall be present. Defined Terms are:
	 * IN = A Grid is positioned;NONE = No Grid is used.
	 * 
	 * @param enumGrid the enum grid
	 */
	public void setGrid(EnumGrid[] enumGrid)
	{
		/*Accept Grid in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		String[] arrStrGrid = new String[enumGrid.length];
		for(int i=0;i < enumGrid.length ; i++)
		{
			arrStrGrid[i] = enumGrid[i].getValue();
		}
		addDataElement(0x0018,0x1166, DicomConstants.DCM_DT_CS, arrStrGrid);
	}

	/**
	 * Returns the value that identifies the grid.
	 * 
	 * @return String[] - String array of Grid
	 */
	public String[] getGrid()
	{
		Object objectValue = getValue(0x0018, 0x1166);
		if(objectValue!=null)
			return (String[])objectValue;
		return null;
	}

	/**
	 * Sets Average width of X-Ray pulse in msec.
	 * 
	 * @param strAveragePulseWidth  String value of Average Pulse Width
	 */
	public void setAveragePulseWidth(String strAveragePulseWidth)
	{
		/*Accept Average Pulse Width in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x1154, DicomConstants.DCM_DT_DS, strAveragePulseWidth);
	}

	/**
	 * Returns Average width of X-Ray pulse in msec.
	 * 
	 * @return String - String value of Average Pulse Width
	 */
	public String getAveragePulseWidth()
	{
		Object objectValue = getValue(0x0018, 0x1154);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets X-Ray radiation mode. Defined Terms: CONTINUOUS, PULSED
	 * 
	 * @param enumRadiationMode the enum radiation mode
	 */
	public void setRadiationMode(EnumRadiationMode enumRadiationMode)
	{
		/*Accept Radiation Mode in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x115A, DicomConstants.DCM_DT_CS, enumRadiationMode.getValue());
	}

	/**
	 * Returns  X-Ray radiation mode.
	 * 
	 * @return String - String value of Radiation Mode
	 */
	public String getRadiationMode()
	{
		 Object objValue = getValue(0x0018,0x115A);
   if(objValue!=null)
      return objValue.toString();
   return null;

	}

	/**
	 * Sets type of filter(s) inserted into the X-Ray beam.
	 * 
	 * @param arrStrTypeOfFilters String array of Type of Filters
	 */
	public void setTypeOfFilters(String[] arrStrTypeOfFilters)
	{
		/*Accept Type of Filters in String format of type LO.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x1161, DicomConstants.DCM_DT_LO, arrStrTypeOfFilters);
	}

	/**
	 * Returns type of filter(s) inserted into the X-Ray beam.
	 * 
	 * @return String - String value of Type Of Filters
	 */
	public String[] getTypeOfFilters()
	{
		Object objectValue = getValue(0x0018, 0x1161);
		if(objectValue!=null)
			return (String[])objectValue;
		return null;
	}

	/**
	 * Sets diameter of X-Ray intensifier in mm.
	 * 
	 * @param strIntensifierSize String value of Intensifier Size
	 */
	public void setIntensifierSize(String strIntensifierSize)
	{
		/*Accept Intensifier Size in String format of type DS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x1162, DicomConstants.DCM_DT_DS, strIntensifierSize);
	}

	/**
	 * Returns diameter of X-Ray intensifier in mm.
	 * 
	 * @return String - String value of Intensifier Size
	 */
	public String getIntensifierSize()
	{
		Object objectValue = getValue(0x0018, 0x1162);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets shape of the Image Intensifier Field of View.Defined Terms are: ROUND, RECTANGLE
	 * 
	 * @param enumFieldOfViewShape Enum value of Field of View Shape
	 */
	public void setFieldOfViewShape(EnumFieldOfViewShape enumFieldOfViewShape)
	{
		/* Accept Field of View Shape in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1147, DicomConstants.DCM_DT_CS, enumFieldOfViewShape.getValue());
	}

	/**
	 * Returns shape of the Image Intensifier Field of View.
	 * 
	 * @return String - String value of Intensifier Size
	 */
	public String getFieldOfViewShape()
	{
		Object objectValue = getValue(0x0018, 0x1147);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}

	/**
	 * Sets Dimensions of the Image Intensifier Field of View in mm. If Rectangle, row
	 * dimension followed by column; if Round, diameter.
	 * 
	 * @param arrStrFieldOfViewDimensions the arr str field of view dimensions
	 */
	public void setFieldOfViewDimensions(String[] arrStrFieldOfViewDimensions)
	{
		/*Accept Field of View Dimensions in String format of type IS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x1149, DicomConstants.DCM_DT_IS, arrStrFieldOfViewDimensions);
	}

	/**
	 * Returns type of filter(s) inserted into the X-Ray beam.
	 * 
	 * @return String[] - String Array of Field Of View Dimensions
	 */
	public String[] getFieldOfViewDimensions()
	{
		Object objectValue = getValue(0x0018, 0x1149);
		if(objectValue!=null)
			return (String[])objectValue;
		return null;
	}

	/**
	 * Sets the Physical distance measured at the front plane of the Image Receptor housing
	 * between the center of each pixel. Specified by a numeric pair - row spacing value
	 * (delimiter) column spacing value - in mm. In the case of CR, the front plane is defined
	 * to be the external surface of the CR plate closest to the patient and radiation source.
	 * 
	 * @param arrStrImagerPixelSpacing the arr str imager pixel spacing
	 */
	public void setImagerPixelSpacing(String[] arrStrImagerPixelSpacing)
	{
		/*Accept Imager Pixel Spacing in String Array format of type DS.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1164, DicomConstants.DCM_DT_DS, arrStrImagerPixelSpacing);
	}

	/**
	 * Return Physical distance measured at the front plane of the Image Receptor housing
	 * between the center of each pixel.
	 * 
	 * @return String - String value of Imager Pixel Spacing.
	 */
	public String[] getImagerPixelSpacing()
	{
		Object objectValue = getValue(0x0018, 0x1164);
		if(objectValue!=null)
			return (String[])objectValue;
		return null;
	}
	/**
	 * Returns instance of Basic Pixel Spacing Calibration Macro.
	 * 
	 * @return Instance of Basic Pixel Spacing Calibration Macro
	 */
	public BasicPixelSpacingCalibrationMacro getBasicPixelSpacingCalibrationMacro()
	{
		if(objBasicPixelSpacingCalibrationMacro == null)
		{
			objBasicPixelSpacingCalibrationMacro = new BasicPixelSpacingCalibrationMacro(objIDataSet,objIDictionaryReader);
		}
		return objBasicPixelSpacingCalibrationMacro;
	}
	/**
	 * Sets Size of the focal spot in mm. For devices with variable focal spot or multiple focal
	 * spots, small dimension followed by large dimension.
	 * 
	 * @param arrStrFocalSpots String array of focal spots.
	 */
	public void setFocalSpots(String[] arrStrFocalSpots)
	{
		/*Accept the Focal Spot(s) in String Array format of type PN.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018, 0x1190, DicomConstants.DCM_DT_DS, arrStrFocalSpots);
	}

	/**
	 * Return Size of the focal spot in mm.
	 * 
	 * @return String[] - String array of Focal Spots.
	 */
	public String[] getFocalSpots()
	{
		Object objectValue = getValue(0x0018, 0x1190);
		if(objectValue!=null)
			return (String[])objectValue;
		return null;
	}

	/**
	 * Sets X-Ray dose, measured in dGy*cm*cm, to which the patient was exposed for the
	 * acquisition of this image plus any nondigitally recorded fluoroscopy which may
	 * have been performed to prepare for the acquisition of this image.
	 * 
	 * @param strImageAndFluoroscopyAreaDoseProduct the str image area dose product
	 */
	public void setImageAndFluoroscopyAreaDoseProduct(String strImageAndFluoroscopyAreaDoseProduct)
	{
		/*Accept Image identification characteristics in String format of type CS.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0018,0x115E, DicomConstants.DCM_DT_DS, strImageAndFluoroscopyAreaDoseProduct);
	}

	/**
	 * Returns shape of the Image Intensifier Field of View.
	 * 
	 * @return String - String value of ImageAndFluoroscopyAreaDoseProduct
	 */
	public String getImageAndFluoroscopyAreaDoseProduct()
	{
		 Object objValue = getValue(0x0018,0x115E);
   if(objValue!=null)
      return objValue.toString();
   return null;

	}

	/* This method is used by the Module Iterator to iterate through the DataSet and return only
	 * those elements that belong to the respective Module class whose getVectorOfKeys is called.
	 */
	/**
	 * This method returns the vector of keys representing the DataElements
	 * that belong to this module.
	 * 
	 * @return vector of Tags - returns the vector containing the collection of tags
	 */
	public ISingleCollection<ITag> getVectorOfKeys()
	{
		return objSingleCollection;
	}


}
