function addTQACF() {
	var title = "TaqMan<sup>&reg;</sup>&nbsp;Array Cards - Fixed Panels";
	var productUrl = "";
	productUrl = "http://www.invitrogen.com/site/us/en/home/Products-and-Services/Applications/PCR/real-time-pcr/real-time-pcr-assays/taqman-gene-expression/taqman-expression-arrays.html"
	if (getExperimentInfo('nooftargets') > 380) return false;
	var formatObj = findApproximateOpenTaqcf(getExperimentInfo('nooftargets') - 1);
	//var format = "Multiple";
	var format = title;
	var partNo = formatObj.get('partnumber');
	
	var noofgenes = formatObj.get('formatno');
	var reqnoofunits = (getExperimentInfo('noofsamples') * getExperimentInfo('noofreplicates'))/formatObj.get('numberofsamples');
	//console.log(partNo + " " + noofgenes + " " + reqnoofunits + " " + formatObj.get('numberofsamples'));
	var noofunits = reqnoofunits < formatObj.get('min') ? formatObj.get('min')
			: Math.ceil(reqnoofunits);
	var min = formatObj.get('min');
	var isMin = (min == 1 ? 1 : (Math.ceil(reqnoofunits) < min ? 0 : 1));

	var noofreactions = noofgenes * getExperimentInfo('noofsamples');
	var masterperc = (Ext.get('masterperc').dom.value).split('%')[0];
	var accessperc = (Ext.get('accessoriesperc').dom.value).split('%')[0];

	var volumeDiscount = 0;
	var partNopricelist = pricelist.findRecord('partnumber', partNo);
	var pricePerUnit 	= 0;
	var price			= 0;
	
	if(partNopricelist){
		pricePerUnit = pricelist.findRecord('partnumber', partNo).regions().findRecord('region', region + "-" + currency).get('price');
		price = pricePerUnit* noofunits;
		//console.log("Price list found for part number: "  + partNo)
	}else{
		console.log("Price list not found for part number: "  + partNo);		
	}

	var formatObj1 = findApproximateRecord('nooftargets',
			getExperimentInfo('nooftargets') - 1);
	var description = formatObj1.get('tacname');

	var mvolume = cardsMMixPerRxn
			* platesCardsModel.findRecord('description', description)
					.get('rxn') / 1000 * noofunits;

	var mastermix = "";
	if (mvolume < 5) {
		if (getExperimentInfo('method') == 'Fast')
			mastermix = masterMixModel.getAt(4).get('product');
		else
			mastermix = masterMixModel.getAt(0).get('product');
	} else if (mvolume < 10) {
		if (getExperimentInfo('method') == 'Fast')
			mastermix = masterMixModel.getAt(5).get('product');
		else
			mastermix = masterMixModel.getAt(1).get('product');
	} else if (mvolume < 25) {
		if (getExperimentInfo('method') == 'Fast')
			mastermix = masterMixModel.getAt(6).get('product');
		else
			mastermix = masterMixModel.getAt(2).get('product');
	} else {
		if (getExperimentInfo('method') == 'Fast')
			mastermix = masterMixModel.getAt(7).get('product');
		else
			mastermix = masterMixModel.getAt(3).get('product');
	}
	var mnoofunits = Math.ceil(mvolume
			/ masterMixModel.findRecord('product', mastermix).get('volume'));
	var assayCostPerUnit = pricePerUnit;
	
	var discountno = 0;
	if (noofunits < 20) {
		discountno = 10;
	} else if (noofunits < 50) {
		discountno = 20;
	} else if (noofunits < 100) {
		discountno = 50;
	} else {
		discountno = 100;
	}
	var volumeDiscount = platesCardsModel
			.findRecord('description', description).regions().findRecord(
					'region', region).discounts().findRecord('volume',
					discountno, 0, false, false, true).get('value');

	var costWithVolDisc = noofunits * assayCostPerUnit
			* (1 - (volumeDiscount / 100));
	var plateperc = (Ext.get('plateperc').dom.value).split('%')[0];
	var totalAssayCost = costWithVolDisc * (1 - (plateperc / 100));
	var mmxPartNumber = masterMixModel.findRecord('product', mastermix).get(
	'partnumber');

	var masterMixCostPerUnit = pricelist.findRecord('partnumber', mmxPartNumber)
	.regions().findRecord('region', region + "-" + currency).get('price');
	var masterperc = (Ext.get('masterperc').dom.value).split('%')[0];
	var totalMasterMixCost = masterMixCostPerUnit * mnoofunits
			* (1 - (masterperc / 100));
	var hours = Math.ceil((10 / 60) * noofunits);
	var totalCost = totalAssayCost + totalMasterMixCost;

	var totalReactions = getExperimentInfo('noofsamples') * getExperimentInfo('noofreplicates')*noofgenes;
	var assayCostPerReaction = totalAssayCost / totalReactions;
	var masterMixCostPerReaction = totalMasterMixCost/totalReactions;
	//console.log("MM" + masterMixCostPerReaction);
	//console.log(mmxPartNumber + " " + mnoofunits + " " + totalMasterMixCost + " " + totalAssayCost); 
	//console.log("Assay" + assayCostPerReaction);
	
	var optimizationCostPerReaction = 0;
	var totalCostPerReaction = assayCostPerReaction + masterMixCostPerReaction
			+ optimizationCostPerReaction;
	
	var mmixCostPerSample = totalMasterMixCost
			/ getExperimentInfo('noofsamples');
	var assayCostPerSample = costWithVolDisc / getExperimentInfo('noofsamples');
	var totalCostPerSample = assayCostPerSample + mmixCostPerSample;

	var totalCostPreDisc = costWithVolDisc
			+ (masterMixCostPerUnit * mnoofunits);
	var totalDiscount = 100 - (totalCost * 100 / totalCostPreDisc);
	
	var noOfHours = 0;
	noOfHours = Math.ceil(Math.ceil(reqnoofunits) * (formatObj.get('totalreactions')/formatObj.get('numberofreactions'))* 130 /60);
	
	var partNo = "Multiple";

	outputList.add({
		pno : 12,
		title : title,
		partnumber : partNo,
		format : format.replace(/�/gi, '<sup>&reg;</sup>&nbsp;'),
		noofunits : noofunits,
		noofreactions : noofreactions,
		mastermix : mastermix.replace(/�/gi, '<sup>&reg;</sup>&nbsp;'),
		mnoofunits : mnoofunits,
		totalcost : roundNumber(totalCost, 2),
		volumediscount : volumeDiscount,
		mvolumediscount : masterperc,
		assayscost : costWithVolDisc,
		assayscostperunit : assayCostPerUnit,
		assayscostwithvoldisc : totalAssayCost,
		mastermixvol : roundNumber(mvolume, 2),
		mastermixcostperunit : masterMixCostPerUnit,
		mastermixdisc : masterperc,
		mastermixcostwithdisc : totalMasterMixCost,
		mastermixcostpredisc : (masterMixCostPerUnit * mnoofunits),
		mastermixcost : roundNumber(masterMixCostPerUnit * mnoofunits, 2),
		mmxcostpersample : roundNumber(mmixCostPerSample, 2),
		assaycostpersample : roundNumber(assayCostPerSample, 2),
		totalcostpersample : roundNumber(totalCostPerSample, 2),
		totalcostpredisc : roundNumber(totalCostPreDisc, 2),
		totaldiscount : roundNumber(totalDiscount, 2),
		noofhours : noOfHours,
		mastermixpartnumber : mmxPartNumber,
		assaycostperreaction : roundNumber(assayCostPerReaction, 2),
		mastermixcostperreaction : roundNumber(masterMixCostPerReaction, 2),
		optimizationcostperreaction : roundNumber(optimizationCostPerReaction,
				2),
		totalcostperreaction : roundNumber(totalCostPerReaction, 2),
		totalcostpersample : roundNumber(totalCostPerSample, 2),
		producturl : productUrl,
		reqnoofunits : reqnoofunits,
		type : 'card-fixed',
		min : min,
		fnName:'addTQACF',
		ismin : isMin
	});

}

function findApproximateOpenTaqcf(value) {
	var record = openArrayFixed.getAt(0);
	var name1 = "SYBR";
	var name2 = "TQMN OA";
	var specie = getExperimentInfo('species');
	openArrayFixed.each(function(e) {
		if (e.get('concatenate').indexOf(name1) == -1
				&& e.get('concatenate').indexOf(name2) == -1
				&& e.get('Species') == specie
				&& e.get('formatno') >= value)
						{
			record = e;
			return false;
		}
	});
	return record;
}