Implement New Fragmentation
 
 
In case you want to append or replace any of the Pythia fragmentation 
models with your own, it is possible using some experimental features, 
but is not trivial (just as for the parton showers). In general, 
fragmentation models are expected to take a colour subsystem in an 
event, and convert the partons of this system into colourless bound 
hadrons. By default, Pythia runs a sequence of three fragmentation 
models in the following order: a model for Hidden Valley (HV) 
scenarios, a model for R-hadron scenarios, and the string 
fragmentation coupled with the mini-string fragmentation. These models 
can be switched on or off, via various settings; neither the HV nor 
R-hadron model is run unless the corresponding processes have been 
switched on. Typically, the string fragmentation is always run, 
unless explicitly turned off. 
 
 
The FragmentationModel interface
 
 
The  pythia.setFragmentationPtr( 
fragmentationPtr),  
pythia.addFragmentationPtr( fragmentationPtr), and 
 pythia.insertFragmentationPtr(index, 
fragmentationPtr) methods allow the fragmentation model 
sequence to be completely replaced, appended, or modified with an 
inserted model, respectively. If the default Pythia string 
fragmentation models is removed from the fragmentation model sequence, 
this model will not be used for the standard fragmentation. However, 
an independent version of this model will still be used elsewhere in 
Pythia, e.g. for low energy processes. At no point will any of the 
user provided hadronization models replace this internal model. Each 
FragmentationModel in the sequence is initialized by 
Pythia during the main Pythia initialization call. Consequently, every 
time the fragmentation pointer sequence is modified, Pythia must be 
re-initialized. 
 virtual bool FragmentationModel::init(StringFlav* flavSelPtr, StringPT* pTSelPtr, StringZ* zSelPtr, FragModPtr fragModPtr)   
This method sets the flavor selection, pT selection, 
z selection, and fragmentation modification pointers. None of 
these pointers needs be used by the fragmentation model, but in many 
cases they may be useful. The default constructor for 
FragmentationModel will set the internal 
flavSelPtr, pTSelPtr, and 
zSelPtr pointers for the base class. 
   
 
The only other method that needs to be implemented is the main 
fragmentation method. 
 virtual bool FragmentationModel::fragment(int iSub, ColConfig& colConfig, Event& event, bool isDiff = false, bool systemRecoil = true)   
This method fragments the colour subsystem with index 
iSub with a colour configuration given by 
colConfig[iSub]. The special index iSub == 
-1 indicates that the method is expected to fragment the entire 
event, rather than the specified subsystem. Consequently, it is 
important that models check the validity of iSub, i.e. it 
is not -1 befor passing it as an index to 
colConfig. The event record should be modified so that 
the fragmented partons are no longer final particles, and any 
particles produced from the fragmentation should be appended to the 
event record passed by the argument event. Some 
fragmentation models require knowledge whether the event was 
diffractive, which is specified by the isDiff 
flag. Additionally, for the case of mini-string-like fragmentation, it 
may be necessary to recoil against a single hadron, rather than the 
entire system. This is specified by the systemRecoil 
flag.