Nice work capturing neutrophils with decent expression! Combat is a reasonable way to proceed, but I would initially actually try to co-analyze the two donors in AltAnalyze by merging the ExpressionInput/exp.* files (CPTT normalized). If you still see batch effects (after you get the ICGS-NMF heatmap you can include a groups file with the expression file to see which cells correspond to which groups), then the combat normalized analyses are better to proceed with. You can also you Seurat clusters for cellHarmony analysis using scripts we have on our website (happy to clarify these).
As you note, we have seen that ICGS2 errors out with negative values. This can be addressed in an update to the software but what I have done manually when encountering this issue (and what we would do automatically), is subtract each value in each row by the minimum value in that row, which then proceeds to effectively run the analysis. I think cellHarmony will work with negative values, but can't recall offhand. The combat analysis is not run in an intelligent way in AltAnalyze right now and has really only been tested with bulk samples. The intelligent way is to have the common cell populations (post-cellHarmony alignment or joint analysis) denoted as "groups" for combat with the different batches specified, but I have not been successful using the python implementation of combat for this purpose (I have seen examples in paper but not reproduced their methods.
Let me know if I can help further with these. Happy to!