ColorMap* getAggregatedARMap(const ColorMap* map, Real cleaningFactor, Real aggregationFactor, const string& projection) { // We convert the factors from arcsec to pixels cleaningFactor /= sqrt(map->PixelArea()); aggregationFactor /= sqrt(map->PixelArea()); ColorMap* aggregated = new ColorMap(map); #if defined DEBUG aggregated->writeFits(filenamePrefix + "pure.fits"); #endif if(projection == "exact") { /*! Clean the color map to remove very small components (like protons)*/ aggregated->erodeCircularProjected(cleaningFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "eroded.fits"); #endif /*! Aggregate the blobs together */ aggregated->dilateCircularProjected(cleaningFactor + aggregationFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "dilated.fits"); #endif /*! Give back the original size */ aggregated->erodeCircularProjected(aggregationFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "closed.fits"); #endif } else { /*! Apply the projection */ if(projection == "equirectangular") { aggregated->equirectangular_projection(map, false); #if defined DEBUG aggregated->writeFits(filenamePrefix + "equirectangular_projection.fits"); #endif // We adjust the factors because in the projection the pixel size changes cleaningFactor *= (2./3.); aggregationFactor *= (2./3.); } else if(projection == "lambert") { aggregated->Lambert_cylindrical_projection(map, false); #if defined DEBUG aggregated->writeFits(filenamePrefix + "Lambert_cylindrical_projection.fits"); #endif // We adjust the factors because in the projection the pixel size changes cleaningFactor *= (2./3.); aggregationFactor *= (2./3.); } else if(projection == "sinusoidal") { aggregated->sinusoidal_projection(map, false); #if defined DEBUG aggregated->writeFits(filenamePrefix + "sinusoidal_projection.fits"); #endif // We adjust the factors because in the projection the pixel size changes cleaningFactor *= (2./3.); aggregationFactor *= (2./3.); } else if(projection != "none") { cerr<<"Unknown projection type "<<projection<<endl; exit(EXIT_FAILURE); } /*! Clean the color map to remove very small components (like protons)*/ aggregated->erodeCircular(cleaningFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "eroded.fits"); #endif /*! Aggregate the blobs together */ aggregated->dilateCircular(cleaningFactor + aggregationFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "dilated.fits"); #endif /*! Give back the original size */ aggregated->erodeCircular(aggregationFactor, 0); #if defined DEBUG aggregated->writeFits(filenamePrefix + "closed.fits"); #endif /* Apply the deprojection */ if(projection == "equirectangular") { ColorMap* projeted = new ColorMap(aggregated); aggregated->equirectangular_deprojection(projeted, false); delete projeted; #if defined DEBUG aggregated->writeFits(filenamePrefix + "equirectangular_deprojection.fits"); #endif } else if(projection == "lambert") { ColorMap* projeted = new ColorMap(aggregated); aggregated->Lambert_cylindrical_deprojection(projeted, false); delete projeted; #if defined DEBUG aggregated->writeFits(filenamePrefix + "Lambert_cylindrical_deprojection.fits"); #endif } else if(projection == "sinusoidal") { ColorMap* projeted = new ColorMap(aggregated); aggregated->sinusoidal_deprojection(projeted, false); delete projeted; #if defined DEBUG aggregated->writeFits(filenamePrefix + "sinusoidal_deprojection.fits"); #endif } else if(projection != "none") { cerr<<"Unknown projection type "<<projection<<endl; exit(EXIT_FAILURE); } } /*! Remove the parts off limb and colorize */ aggregated->nullifyAboveRadius(1.); aggregated->colorizeConnectedComponents(1); #if defined DEBUG aggregated->writeFits(filenamePrefix + "aggregated.fits"); #endif return aggregated; }