lcfiplus / LCFIPlus

Flavor tagging code for ILC detectors
https://confluence.slac.stanford.edu/display/ilc/LCFIPlus
GNU General Public License v3.0
6 stars 19 forks source link

Wrong MCParticle link inside LCIOStorer #64

Open dudarboh opened 1 year ago

dudarboh commented 1 year ago

Taking first element from the getRelatedToObjects() is not ok and wrong here:

https://github.com/lcfiplus/LCFIPlus/blob/8a4629883c1e1b8baef1feb2b6871859ecdda735/src/LCIOStorer.cc#L397

MCParticles from getRelatedToObjects are not sorted in any way.

Here is an example of a random event, where I print MCParticle relations for each PFO explicitly with corresponding weights:

Code:

void Tester::processEvent(LCEvent* event){
    LCCollection* pfos = event->getCollection("PandoraPFOs");
    LCRelationNavigator nav( event->getCollection("RecoMCTruthLink") );

    for(int i=0; i < pfos->getNumberOfElements(); ++i){
        ReconstructedParticle* pfo = static_cast <ReconstructedParticle*> ( pfos->getElementAt(i) );
        const std::vector<LCObject*>& mcs = nav.getRelatedToObjects(pfo);
        const std::vector<float>& weights = nav.getRelatedToWeights(pfo);

        std::cout<<"For pfo # "<<i+1<<":"<<std::endl;
        for(size_t j=0; j < mcs.size(); ++j){
            std::cout<<"MC # "<<j+1<<": track weight: "<< (int(weights[j])%10000)/1000.<<" calo weight: "<<(int(weights[j])/10000)/1000.<<std::endl;
        }
    }
}

Output:

[ VERBOSE "MyTester"] For pfo # 1:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 0
[ VERBOSE "MyTester"] For pfo # 2:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 0.994
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.001
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.005
[ VERBOSE "MyTester"] For pfo # 3:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.01
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.203
[ VERBOSE "MyTester"] MC # 3: track weight: 1 calo weight: 0.784
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.003
[ VERBOSE "MyTester"] For pfo # 4:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.034
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.003
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.027
[ VERBOSE "MyTester"] MC # 4: track weight: 1 calo weight: 0.935
[ VERBOSE "MyTester"] For pfo # 5:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 0
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 6:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 0.259
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.657
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.083
[ VERBOSE "MyTester"] For pfo # 7:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.158
[ VERBOSE "MyTester"] MC # 2: track weight: 1 calo weight: 0.781
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.061
[ VERBOSE "MyTester"] For pfo # 8:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 9:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.046
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.171
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.014
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.003
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.403
[ VERBOSE "MyTester"] MC # 6: track weight: 1 calo weight: 0.206
[ VERBOSE "MyTester"] MC # 7: track weight: 0 calo weight: 0.041
[ VERBOSE "MyTester"] MC # 8: track weight: 0 calo weight: 0.117
[ VERBOSE "MyTester"] For pfo # 10:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.072
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.025
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.199
[ VERBOSE "MyTester"] MC # 4: track weight: 1 calo weight: 0.704
[ VERBOSE "MyTester"] For pfo # 11:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.002
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.025
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.002
[ VERBOSE "MyTester"] MC # 4: track weight: 1 calo weight: 0.7
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.005
[ VERBOSE "MyTester"] MC # 6: track weight: 0 calo weight: 0.068
[ VERBOSE "MyTester"] MC # 7: track weight: 0 calo weight: 0.198
[ VERBOSE "MyTester"] For pfo # 12:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.021
[ VERBOSE "MyTester"] MC # 2: track weight: 1 calo weight: 0
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.979
[ VERBOSE "MyTester"] For pfo # 13:
[ VERBOSE "MyTester"] MC # 1: track weight: 1 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 14:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.101
[ VERBOSE "MyTester"] MC # 2: track weight: 1 calo weight: 0.745
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.129
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.013
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.011
[ VERBOSE "MyTester"] For pfo # 15:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.958
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.027
[ VERBOSE "MyTester"] MC # 3: track weight: 1 calo weight: 0
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.015
[ VERBOSE "MyTester"] For pfo # 16:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.974
[ VERBOSE "MyTester"] For pfo # 17:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.019
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.945
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.036
[ VERBOSE "MyTester"] For pfo # 18:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.491
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.509
[ VERBOSE "MyTester"] For pfo # 19:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.954
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.001
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.044
[ VERBOSE "MyTester"] For pfo # 20:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.209
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.779
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.012
[ VERBOSE "MyTester"] For pfo # 21:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 22:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 23:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 24:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.99
[ VERBOSE "MyTester"] For pfo # 25:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.99
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.01
[ VERBOSE "MyTester"] For pfo # 26:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.972
[ VERBOSE "MyTester"] For pfo # 27:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 28:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.069
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.897
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.025
[ VERBOSE "MyTester"] For pfo # 29:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.385
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.004
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.022
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.555
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.035
[ VERBOSE "MyTester"] For pfo # 30:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.261
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.607
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.012
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.051
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.053
[ VERBOSE "MyTester"] MC # 6: track weight: 0 calo weight: 0.016
[ VERBOSE "MyTester"] For pfo # 31:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.003
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.035
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.006
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.954
[ VERBOSE "MyTester"] MC # 6: track weight: 0 calo weight: 0.001
[ VERBOSE "MyTester"] For pfo # 32:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 1
[ VERBOSE "MyTester"] For pfo # 33:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.002
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.518
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.3
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.114
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.038
[ VERBOSE "MyTester"] MC # 6: track weight: 0 calo weight: 0.005
[ VERBOSE "MyTester"] MC # 7: track weight: 0 calo weight: 0.004
[ VERBOSE "MyTester"] MC # 8: track weight: 0 calo weight: 0.015
[ VERBOSE "MyTester"] MC # 9: track weight: 0 calo weight: 0.003
[ VERBOSE "MyTester"] For pfo # 34:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.002
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.993
[ VERBOSE "MyTester"] For pfo # 35:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.86
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.013
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.127
[ VERBOSE "MyTester"] For pfo # 36:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.011
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.165
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.01
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0
[ VERBOSE "MyTester"] MC # 5: track weight: 0 calo weight: 0.814
[ VERBOSE "MyTester"] For pfo # 37:
[ VERBOSE "MyTester"] MC # 1: track weight: 0 calo weight: 0.07
[ VERBOSE "MyTester"] MC # 2: track weight: 0 calo weight: 0.904
[ VERBOSE "MyTester"] MC # 3: track weight: 0 calo weight: 0.005
[ VERBOSE "MyTester"] MC # 4: track weight: 0 calo weight: 0.022

You can see that for ( more than half ! ) pfos: 3, 4, 7, 9, 10, 11, 12, 14, 17, 18, 20, 27, 28, 29, 30, 31, 33, 34, 36, 37 it leads to the linking to the wrong MCParticle, which does not have maximum contribution either track or calorimeter -wise.

I think the best behaviour would be to choose a MCParticle with a highest track weight. If the maximum track weight is 0, then get the highest calorimeter weight.

Weights encoding "documentation" here:

https://github.com/iLCSoft/MarlinReco/blob/541d61d96f6cb923042900f9284ccf0067d8fb10/Analysis/RecoMCTruthLink/include/RecoMCTruthLinker.h#L32-L50

suehara commented 1 year ago

Thanks. It's good to fix it. MCParticle is not as a part of production procedure so it is less debuged and also easier to modify without any effect on performance on existing analysis.