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; }