How to create empty Result table after run("Analyze particles...") imageJ - imagej

I'm trying to create an empty Result table table in ImageJ.
I'd like to be able to use the analyze particles:
run("Analyze Particles...", "size=8-100 circularity=0.00-1.00 show=Nothing display clear include record");
but then, if the count of detected particles is zero, I'd like to get a Result table with all the columns that I'd usually get such as Label, Area, Mean etc.. (and just fill them out with zeros).
The reason is, that I'd like to include results from images without any counts as 'zero particles'. I'm running in batch mode to analyze particles on multiple images and extract some simple statistics in another, custom table that I write to a file.
I've tried to use
setResult()
, but it doesn't seem to work when no particles are counted. The reason I want to use the Result table is that I use
getResult()
to retrieve the values that I put into my custom output table...
I have looked through the documentation and different forums, but cannot find a solution.
I'll be looking forward to any help or suggestions.

When running Analyze Particles... with the Summarize option checked, you get a summary table that contains a line even if no particles were found.
If you want to record a new line to the main Results table, you should use setResult("Label", row, string) like follows to add a new line with the label set to the image title, and all columns set to 0:
currentNResults = nResults;
run("Analyze Particles...", "display summarize");
if (nResults == currentNResults) { // if Analyze Particles did not find any particles
setResult("Label", nResults, getTitle());
}
If you want to use a customized results table different from the standard ImageJ results table (the one saying Results in the window title), you should better resort to using JavaScript scripting, where you have direct access to the ij.measure.ResultsTable class, e.g.:
rt = new ResultsTable();
rt.incrementCounter();
rt.addLabel("My Label");
rt.addValue("My parameter", 1.234);
rt.show("My own results table");
Hope that helps.

Related

Extract Last Value as Metric from Table Calculation in Tableau?

I have raw data in Tableau that looks like:
Month,Total
2021-08,17
2021-09,34
2021-10,41
2021-11,26
2021-12,6
And by using the following calculation
RUNNING_SUM(
COUNTD(IF [Inserted At]>=[Parameters].[Start Date]
AND [Inserted At]<=[End Date]
THEN [Id] ELSE NULL END
))
/
LOOKUP(RUNNING_SUM(
COUNTD(IF [Inserted At]>=[Parameters].[Start Date]
AND [Inserted At]<=[End Date]
THEN [Id] ELSE NULL END
)),-1)*100-100
I get
Month,My_Calc
2021-08,NULL
2021-09,200
2021-10,80.4
2021-11,28.3
2021-12,5.1
And all I really want is 5.1 (last monthly value) as one big metric (% Month-Over-Month Growth).
How can I accomplish this?
I'm relatively new to Tableau and don't know how to use calculated fields in conjunction with the date groupings aspect to express I want to calculate month-over-month growth. I've tried the native year-over-year growth running total table calculation but that didn't end with the same result since I think my calculation method is different.
First a brief table calc intro, and then the answer at the end.
Most calculations in Tableau are actually performed by the data source (e.g. database server), and the results are then returned to Tableau (i.e. the client) for presentation. This separation of responsibilities allows high performance, even when facing very large data sets.
By contrast, table calculations operate on the table of query results that were returned from the server. They are executed late in the order of operations pipeline. That is why table calcs operate on aggregated data -- i.e. you have to ask for WINDOW_SUM(SUM([Sales)) and not WINDOW_SUM([Sales])
Table calcs give you an opportunity to make final passes of calculations over the query results returned from the data source before presentation to the user. You can for instance calculate a running total or make the visualization layout dynamically depend in part on the contents of the query results. This flexibility comes at a cost, the calculation is only one part of defining a table calc. You also have to specify how to apply the calculation to the table of summary results, known as partitioning and addressing. The Tableau on-line help has a useful definition of partitioning and addressing.
Essentially, table calcs are applied to blocks of summary data at a time, aka vectors or windows. Partitioning is how you tell Tableau how you wish to break up the summary query results into windows for purposes of applying your table calc. Addressing is how you specify the order in which you wish to traverse those partitions. Addressing is important for some table calcs, such as RUNNING_SUM, and unimportant for others, such as WINDOW_SUM.
Besides understanding partitioning and addressing very well, it is also helpful to learn about the functions INDEX(), SIZE(), FIRST(), LAST(), WINDOW_SUM(), LOOKUP() and (eventually) PREVIOUS_VALUE() to really understand table calcs. If you really understand them, you'll be able to implement all of these functions using just two of them as the fundamental ones.
Finally, to partially address your question:
You can use the boolean formula LAST() = 0 to tell if you are at the last value of your partition. If you use that formula as a filter, you can hide all the other values. You'll have to get partitioning and addressing specified correctly. You would essentially be fetching a batch of data from your server, using it in calculations on the client side, but only displaying part of it. This can be a bit brittle depending on which fields are on which shelves, but it can work.
Normally, it is more efficient to use a calculation that can be performed server-side, such as LOD calc, if that allows you to avoid fetching data only for client side calculations. But if the data is already fetched for another purpose, or if the calculation requires table calc features, such as the ability to depend on the order of the values, then table calcs are a good tool.
However you do it, the % month-to-month change from 2021.11 (a value of 26) to the value for 2021.12 (a value of 6) is not 5.1%.
It's (( 6 - 26 ) / 26) * 100 = -76.9 %
OK, starting from scratch, this works for me: ( I don't know how to get exactly the table format I want without using ShowMe and Flip, but it works. Anyone else? )
drag Date to rows, change it to combined Month(Date)
drag sales to column shelf
in showme select TEXT-TABLES
flip rows for columns using tool bar
that gets a table like the one you show above
Drag Sales to color (This is a trick to simply hold it for a minute ),
click the down-arrow on the new SALES pill in the mark card,
select "Add a table calculation",
select Running Total, of SUM, compute using Table(down), but don't close this popup window yet.
click Add Secondary Calculation checkbox at the bottom
select Percent Different From
compute using table down
relative to Previous
Accept your work by closing the popup (x).
NOW, change the new pill in the mark card from color to text
you can see the 5.1% at the bottom. Almost done.
Reformat again by clicking table in ShowMe
and flipping axes.
click the sales column header and hide it
create a new calculated field
label 'rows-from-bottom'
formula = last()
close the popup
drag the new pill rows-from-bottom to the filters shelf
select range 0 to 0
close the popup.
Done.
For the next two weeks you can see the finished workbook here
https://public.tableau.com/app/profile/wade.schuette/viz/month-to-month/hiderows?publish=yes

How to count NUMBERS from google sheets when there is also a word there which doesn't need counting

Can't find a function which allows me to count the numbers, add them up and then paste it onto the first row. As there are also words there, for description of what is being counted then I've not yet found a way to count numbers without the words becoming a source of error.
Already tried the use of different functions
Fix my table so i can start counting how many things i do in a day/year
How it should look like
Finished code in the sheet, big thanks to pnuts
Try something like:
=sum(ArrayFormula(iferror(1*REGEXEXTRACT(A1:A4,"\d+"),0)))
and if you have cells in the selected range that are Number format and want those included in the addition, add those as well as a separate clause (ie append +sum(A1:A4)).

Empty Row Labels in PivotTable after adding descriptions as a measure

I'm trying to use Powerpivot to help me summarize Actual and Committed Costs from a project. After some manipulations in Power query I managed to get the right structure, but getting it in a powerpivottable is still a disaster.
As I also want to include Descriptions but keep the nice indented powerpivot Layout, I used a formula to convert the description to a measure using DAX. I found a formula online and tweeked it a bit so it would also work when there was more than 1 hit:
=IF(COUNTROWS(VALUES('Table1'[Description]))>1,FIRSTNONBLANK('Table1'[Description],0),VALUES('Table1'[Description]))
This gave a more satisfying result
However there were two set-backs:
There are a lot of copies of the same descriptions creating empty Row labels (I don't want any Empty Row Labels)
When taking the description from the source table it doesn't take the result from the first match for the row label in my table.
How can I solve this problem?

Quickly find the information on the GridView?

See attached image file:
Assuming the data is loaded from SQL Server, GridView includes 5 columns as shown above, cells Search of textbox where you find out quickly (due to its use on the image for illustration), in his cell this search textbox enter any value in the column that has (according to this column 5), the GridView grid lines present value of the lookup value, usually looking to have a value equal to 1 column with which to look.
If you use fast search method does not need to specify one column before it, how to write this quickly find how to load into the GridView ?
I'm not entirely sure I understand your question but if your looking for a fast way to search the contents of a datagridview you can bind the SQL result to a bindingsource, use the bindingsource as the datagridviews data source and then set the binding sources filter to "dataproperty LIKE '%" + textBox1.Text + "%';"
Refer to: https://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource(v=vs.110).aspx
Sorry if this isn't what you're asking for!

Automatically updating Data Validation lists based on user input

I have a very large data set (about 16k rows). I have 10 higher level blocks and within each block I have 4 categories (10 rows for each) which use Data Validation lists to show items available in each category. The lists should automatically update based on user input. What I need your help with is that I want to use the same data set for each block and preferably a least calculation/size intensive approach. I have put together a sample file that outlines the issue with examples.
Sample File
Thank you for your help in advance.
Okay, I've found something, but it can be quite time consuming to do.
Select each range of cells. For instance, for the first one, select B3:B18 and right click on the selection. Find 'Name a Range..." and give it the name "_FIN_CNY". Repeat for all the other ranges, changing the name where necessary.
Select the first range of cells to get the data validation, and click on "Data validation", pick the option "Allow: List" (you already have it) and then in the source, put the formula:
=INDIRECT($G$4&"_CNY")
$G$4 is where the user will input. This changes as you change blocks.
_CNY is the category. Change it to _CNY2 for the second category.
Click "OK" and this should be it. Repeat for the other categories.
I have put an updated file on dropbox where you can see I already did it for the data of _FIN for categories CNY, CNY2 and INT and did the one for _GER as well. You'll notice the category of INT for _GER doesn't work, that's because the Named Range _GER_INT doesn't exist yet.

Resources