Example #1
0
void writeARMap(ColorMap*& map, const string& filename, const vector<EUVImage*>& images, ParameterSection& parameters, bool compressed)
{
	/*! Clean everything above the radius */
	map->nullifyAboveRadius(1.);
	
	/*! We get the map of aggregated AR */
	ColorMap* aggregatedMap = parameters["projection"].is_set() ? getAggregatedARMap(map, parameters["cleaning"], parameters["aggregation"], parameters["projection"]) : getAggregatedARMap(map, parameters["cleaning"], parameters["aggregation"], "none");
	
	if(parameters["aggregated"])
	{
		delete map;
		map = aggregatedMap;
	}
	else
	{
		/*! Color the pixels using the aggregated map */
		for (unsigned j = 0; j < aggregatedMap->NumberPixels(); ++j)
		{
			if(map->pixel(j) == 1)
			{
				map->pixel(j) = aggregatedMap->pixel(j);
			}
		}
	}
	
	#if defined DEBUG
	map->writeFits(filenamePrefix + "all.fits");
	#endif
	
	/*! Erase the small regions */
	if(parameters["useRawArea"])
		map->thresholdRegionsByRawArea(parameters["minimalSize"]);
	else
		map->thresholdRegionsByRealArea(parameters["minimalSize"]);

	#if defined DEBUG
	map->writeFits(filenamePrefix + "large.fits");
	#endif
	
	/*! We write the map of AR to the fits file */
	FitsFile file(filename, FitsFile::overwrite);
	map->writeFits(file, compressed ? FitsFile::compress : 0, "ActiveRegionMap");
	
	/*! We write some info about the map creation */
	Header header = map->getHeader();
	fillHeaderAR(header, parameters);
	file.writeHeader(header);
	
	/*! We get the regions */
	vector<Region*> regions = getRegions(map);
	
	/*! We write the regions to the fits file */
	file.writeTable("Regions");
	writeRegions(file, regions);
	
	/*! We get the chaincode and write them to the fits file */
	if(parameters["chaincodeMaxPoints"].as<int>() > 0)
	{
		#if defined DEBUG
		ColorMap chaincode_map(map);
		#endif
		
		file.writeTable("ChainCodes");
		for (unsigned r = 0; r < regions.size(); ++r)
		{
			vector<PixLoc> chaincode = regions[r]->chainCode(aggregatedMap, parameters["chaincodeMinPoints"], parameters["chaincodeMaxPoints"], parameters["chaincodeMaxDeviation"]);
			file.writeColumn(toString(regions[r]->Id(),7), chaincode);
		
			#if defined DEBUG
			for (unsigned c = 0; c < chaincode.size(); ++c)
			{
				chaincode_map.drawCircle(chaincode[c], 3, r+10);
			}
			#endif
		}
		#if defined DEBUG
		chaincode_map.writeFits(filenamePrefix + "chaincodes.fits");
		#endif
	}
	
	/*! We write intensities statistics relative to image */
	for(unsigned i = 0; i < images.size(); ++i)
	{
		EUVImage* image = images[i];
		/*! We get the stats of the AR */
		vector<RegionStats*> regions_stats =  getRegionStats(map, image, regions);
	
		/*! We write the AR Stats into the fits */
		file.writeTable(image->Channel()+"_ActiveRegionStats");
		writeRegions(file, regions_stats);
		
		/*! We write some info about the image in the header of the table */
		Header tableHeader;
		tableHeader.set("CHANNEL", image->Channel(), "Channel of the intensity image.");
		tableHeader.set("WAVELNTH", image->Wavelength(), "Wavelength of the intensity image.");
		tableHeader.set("DATE-OBS", image->ObservationDate(), "Observation Date of the intensity image.");
		tableHeader.set("INSTRUME", image->Instrument(), "Instrument of the intensity image.");
		const Header& imageHeader = image->getHeader();
		if(imageHeader.has("LVL_NUM"))
			tableHeader.set("LVL_NUM", imageHeader.get<float>("LVL_NUM"), "Level number of the intensity image.");
		if(imageHeader.has("DATE"))
			tableHeader.set("DATE", imageHeader.get<string>("DATE"), "Creation date of the intensity image.");
		if(imageHeader.has("QUALITY"))
			tableHeader.set("QUALITY", imageHeader.get<unsigned>("QUALITY"), "Quality level of the intensity image.");
		
		file.writeHeader(tableHeader);
		
		#if defined VERBOSE
		cout<<"ActiveRegionStats Table"<<endl;
		if(regions_stats.size() > 0)
			cout<<regions_stats[0]->toString("|", true)<<endl;
		else
			cout<<"Empty"<<endl;
		for (unsigned r = 0; r < regions_stats.size(); ++r)
		{
			cout<<regions_stats[r]->toString("|")<<endl;
		}
		#endif
		for (unsigned r = 0; r < regions_stats.size(); ++r)
		{
			delete regions_stats[r];
		}
	}
	
	/*! We cleanup */
	for (unsigned r = 0; r < regions.size(); ++r)
	{
		delete regions[r];
	}
	
	if(map != aggregatedMap)
		delete aggregatedMap;
}