[Rivet] Extension of mcplots/Rivet for Heavy Ion Analyses

Leif Lönnblad leif.lonnblad at thep.lu.se
Mon Aug 15 08:32:57 BST 2016


Hi Benedict,

I was also planning to do some Heavy Ion developments for rivet, and I'm 
very interested in your suggestions. I have not quite made up my mind 
about 1, 2, or 3 yet, but I agree with Andy that your option 3 may be 
combined with the planned facility for re-running finalize() on multiple 
yoda files.

However, one thing that was not clear from your description is how to 
handle centrality, which is essential in any R_AA measurement. Do you 
have any ideas on that?

Cheers,
Leif




On 2016-08-12 18:39, Benedikt Volkel wrote:
> Hej Andy, hej Frank,
>
> thanks for your replies! It is great that you are interested in a
> discussion.
>
> Basically, the proposed solution #2 would be a very easy solution
> because it is both fast and simple to implement and there is no need to
> extend Rivet. However, there are major drawbacks arising from further
> desired capabilities which affects also proper resource management such
> that #1 or #3 should be preferred over #2.
>
> Especially in the case of R_AA analysis it is interesting to combine the
> output of different AA generators with different pp generators. If only
> a direct read-in from HepMC files is possible, there are two ways of
> doing that. Firstly, one can save the entire HepMC files of single runs
> in order to pass the desired combinations to Rivet afterwards. This
> method requires a lot of disk space and deleting the files means a
> complete new MC run in case it is needed again. The other way is the one
> Frank suggested. In this approach the problem is the large amount of
> time because for every combination, two complete MC runs are required.
>
> To overcome the drawbacks it would be nice to be able to recycle
> generated YODA files and to put them together afterwards in any desired
> combination. This saves both computing power/time and disk space.
>
> More generally, the fact that #2 means not a full integration in Rivet
> leads to the question of how certain pre/post-processes are handled in a
> standardized manner and how the right ones are matched to certain
> analyses. It might be difficult to ensure that something like
>
> $ rivet -a EXPERIMENT_YEAR_INSPIRE fifo.hepmc
>
> still works. Consequently, there might be some actual paper-based
> analyses which cannot be handled by non-Rivet-experts.
>
>
> Finally, a solution according to #3 might be preferred over #2 and #1
> because
>
> -> everything, including general post-processing steps, can be handled
> only by Rivet,
>
> -> resources are saved (in a more general way, not only regarding R_AA
> analyses),
>
> -> there are other scenarios like those Andy mentioned which could be
> also handled in this approach.
>
> What do you think about that? Again, we are glad about getting your
> feedback and additional ideas.
>
> Cheers,
>
> Benedikt
>
> On 11.08.2016 22:10, Andy Buckley wrote:
>> Hi Benedikt,
>>
>> Thanks for getting in touch -- sounds like a productive project.
>>
>> Actually, version 3 sounds a lot like what we have had in mind for
>> some time, as part of the development branch for handling events with
>> complex generator weightings: we planned to be able to initialise
>> Rivet analyses with pre-existing YODA files, populating the
>> "temporary" data objects and re-running the finalize() function.
>>
>> We intended this mainly so that YODA files from homogeneous,
>> statistically independent parallel runs could be merged into one
>> mega-run, and then the finalize() steps re-run to guarantee that
>> arbitrarily complicated end-of-run manipulations would be correctly
>> computed. But it sounds like it would be similarly useful for you...
>>
>> Thanks for the pointer to your code. Can I ask how long you will be
>> working on this project for? I look forward to the discussion and
>> hopefully some of us will be able to meet in person at CERN, too...
>> but if you would still be available at the end of September you would
>> be very welcome (and we can pay) for you to attend our 3-day developer
>> workshop.
>>
>> Cheers,
>> Andy
>
> On 11.08.2016 09:41, Frank Siegert wrote:
>> Dear Benedikt,
>>
>> thanks for your mail and for describing your problem and solutions
>> very clearly.
>>
>> I want to throw into the discussion a 4th alternative, which is
>> somewhat similar to your #2 but doesn't need any modifications of
>> Rivet itself. I have used this approach with a Bachelor student when
>> we were trying to determine non-perturbative corrections with
>> iterative unfolding, i.e. we needed both hadronised and non-hadronised
>> events in the analysis at the same time to fill the response matrix.
>> Thus, for us it was important to preserve the correlation between
>> hadronised and non-hadronised event, which for you is not an issue, so
>> maybe this method is not necessary or more complicated for you, but I
>> thought I'd mention it nonetheless.
>>
>> We are running a standalone pre-processor script which combines the
>> HepMC files from the two generator runs, and by using appropriate
>> particle status codes embeds the non-hadronised event into the
>> hadronised one. We then wrote an analysis plugin including a custom
>> projection, which can extract separately (based on the particle
>> status) the non-hadronised event and the hadronised event from the
>> same HepMC file. This allowed us not just to fill the two sets of
>> histograms in the same run (and divide them in finalize), as you would
>> want to do it, but also fill a response matrix with correlated events,
>> which you probably don't care about.
>>
>> So basically all you would need is a pre-processing script to combine
>> the HepMC files, which could possibly be included in your HI generator
>> interface and thus not disrupt the workflow. But maybe this is too
>> complicated, and given that you don't need the correlations you might
>> be better off with your approach #1.
>>
>> Cheers,
>> Frank
>
>>
>>
>> On 10/08/16 21:55, Benedikt Volkel wrote:
>>> Dear Rivet developers,
>>>
>>> my name is Benedikt Volkel and I'm working on a summer student
>>> project in ALICE with Jan Fiete Grosse-Oetringhaus and Jochen Klein.
>>> The goal is to extend the mcplots project to cover specific needs
>>> arising from heavy-ion analyses. In particular, we want to implement
>>> a post-processing step, which is frequently required for heavy-ion
>>> analyses. This step must take place after the production of certain
>>> analysis output, e.g. to combine results from different generator
>>> runs. As mcplots is based on the standard Rivet work flow, the
>>> questions do not apply just to mcplots but more general to Rivet. To
>>> sketch the problem in more detail and start a discussion on a
>>> possible implementation of a standardized post-processing step we
>>> use the example of an R_AA analysis as a starting point.
>>>
>>> The conceptual problem of an R_AA analysis is the combination, here
>>> a division, of heavy ion (AA) data and pp data. The two types of data
>>> are provided by different generator runs. We will always assume that
>>> Rivet can figure out whether it gets events from an AA generator or
>>> a pp generator. This differentiation could be done by evaluating the
>>> heavy ion block 'H' in a given HepMC file and/or by reading the beam
>>> types. We have investigated the following 3 approaches and would
>>> like to ask for comments and feedback:
>>>
>>> 1) External script: In this approach we don't modify the Rivet
>>>    framework at all. The analysis is run independently for the two
>>>    generators (pp and AA), in each case only one type of histograms
>>>    is filled while the other stays empty. In the end, we use an
>>>    external program/script to process the YODA output of both runs
>>>    and perform the division. This can be done by using the YODA
>>>    library and hence easily in Python or C++.
>>>
>>>    Comments: So far there is no standard way to distribute or
>>>    execute such a post-processing executable. A standard work flow
>>>    to include a post-processing step would be desirable. A
>>>    standardized hook to execute an arbitrary external script might
>>>    provide more flexibility because those external scripts could be
>>>    written in Python or C++ and could have an almost arbitrary level
>>>    of complexity.
>>>
>>> 2) Specific executable, Rivet as library: In this case I wrote an
>>>    executable which takes care of creating one instance of
>>>    Rivet::AnalysisHandler and manages the read-in of two HepMC
>>>    files. I based the code on the source code of the executable
>>>    $MCPLOTS/scripts/mcprod/rivetvm/rivetvm.cc implemented in
>>>    mcplots. My modifications are sketched in [1]. In this way, both
>>>    data sets are available in the same analysis and the division can
>>>    simply be done in the finalize step.
>>>
>>>    Comments: It is also already possible on the commandline to pass
>>>    two or more HepMC files to Rivet for sequential processing.
>>>
>>> 3) The goal of my last approach was to enable Rivet to produce
>>>    reasonable analysis output without external dependences.
>>>    Furthermore, it should be possible to have asynchronous
>>>    production of pp and heavy ion YODA files independent from each
>>>    other, bringing those together using only Rivet. Therefore, Rivet
>>>    was modified to allow reading back the YODA output. This
>>>    allows us to implement also the post-processing in the analysis
>>>    class.
>>>
>>>    Comments: You can find the code on
>>> https://gitlab.cern.ch/bvolkel/rivet-for-heavy-ion/tree/working.
>>>    The basic steps can be found in [2] and more comments can be
>>>    found directly in the source code.
>>>
>>>    For the R_AA analysis, Rivet can be first run with a pp generator.
>>>    In the resulting YODA file only the pp objects are filled. In a
>>>    second run, with the AA generator, Rivet can be started passing
>>>    the first YODA file as additional input. In the Rivet analysis
>>>    itself the heavy ion objects are filled. However, after
>>>    finalize(), a method Analysis::replaceByData is called. The
>>>    objects normally produced by the analysis are replaced by those
>>>    from the provided YODA file if they have a finite number of
>>>    entries. Hence, after the replacement there are filled and finalized
>>>    pp objects coming from the first run and AA objects from the second
>>>    run. Those can now be used in an newly introduced post() method
>>>    which manages e.g. the division of histograms in case of the R_AA
>>>    analysis. It is also possible to provide a YODA file where both
>>>    the pp and the AA objects are filled and the R_AA objects have to
>>>    be calculated. No actual analysis is done (0 events from an MC), but
>>>    init(), analyze(...), finalize() and the post() method are called.
>>> The
>>>    histograms are booked, nothing happens in analyze(..) and
>>>    finalize(), the corresponding histograms are replaced after
>>> finalize()
>>>    and post() handles the division. Basically, this is a similar
>>> approach as
>>>    the one in scenario 1) but no external dependences are involved.
>>> Also,
>>>    scenario 2) remains possible if the YODA input is avoided.
>>>
>>> All methods work and lead to the desired output. The first two do
>>> not need an extension of the Rivet source code. While first one allows
>>> for the largest amount of flexibility, the second one is the one
>>> which can be implemented most quickly and where all steps can be
>>> encapsulated in one analysis class in Rivet. However, always two MC
>>> generators runs are required at the same time. Finally, there is one
>>> thing all approaches have in common, though, namely the extension of
>>> the rivet executable and related ones, in order to account for these
>>> analyses types in the command line: 1) linking to the external
>>> post-processing script in a consistent way, 2) parallel processing
>>> of at least two HepMC files, 3) read-in of a YODA file.
>>>
>>> I hope that I could explain the issues in a reasonable manner. Jan,
>>> Jochen and me are looking forward to a fruitful discussion of how to
>>> implement analyses like the one mentioned above in a reasonable way.
>>> Please give us critical feedback concerning the approaches and let us
>>> know if there are more appropriate ways of solving our problems which I
>>> haven't accounted for yet. A consistent and straightforward way of
>>> implementing those analyses in Rivet would be extremely helpful.
>>>
>>> Best regards and many thanks,
>>>
>>> Benedikt
>>>
>>>
>>>
>>> ---------------------Appendix---------------------
>>>
>>>
>>> [1] Sketch of the modification of
>>> $MCPLOTS/scripts/mcprod/rivetvm/rivetvm.cc
>>>
>>> ---------------------------------
>>> ...
>>>
>>> ifstream is1( file1 );
>>> ifstream is2( file2 );
>>>
>>> ...
>>>
>>> AnalysisHandler rivet;
>>>
>>> HepMC::evt1;
>>> HepMC::evt2;
>>>
>>> rivet.addAnalyses( RAA_analysis );
>>>
>>>    while( !is1 || !is2 ) {
>>>
>>> ...
>>>    evt1.read(is1);
>>>    evt2.read(is2);
>>>
>>>
>>>    analyze(evt1);
>>>    analyze(evt2);
>>>    ...
>>>
>>> }
>>>
>>> ...
>>> ---------------------------------
>>>
>>> [2] Basics of the small extension of Rivet
>>>
>>> Rivet::Analysis:
>>> Introducing member: bool _haveReadData
>>> Introducing: void post()
>>> Introducing: void Analysis::replaceByData( std::map< std::string,
>>> AnalysisObjectPtr > readObjects )
>>>
>>> Rivet::AnalysisHandler:
>>> Introducing members: std::map< std::string, AnalysisObjectPtr >
>>> _readObjects and bool _haveReadData
>>> Introducing: void AnalysisHandler::readData(const std::string& filename)
>>> _______________________________________________
>>> Rivet mailing list
>>> Rivet at projects.hepforge.org
>>> https://www.hepforge.org/lists/listinfo/rivet
>>
>>
>
> _______________________________________________
> Rivet mailing list
> Rivet at projects.hepforge.org
> https://www.hepforge.org/lists/listinfo/rivet




More information about the Rivet mailing list