ROOT logo
//#include "UserTreeAnalysis.H"   // remove if copied to user working directory
#include <stdio.h>
#include <assert.h>
#include <math.h>
#include "MC4Vector.H"
#include "HEPParticle.H"
#include "TH1.h"
#include "Setup.H"
#include "TObjArray.h"
#include "TMath.h"
#define PI 3.141592653

inline bool ifSofty(int Id,int nparams, double *params){
  if (nparams<5 && Id==22) return true;   // to remove photons only
  for (int i=nparams-1; i>3; i--)
    if (Id==params[i]) return true;       // to remove all what is in params from nparams down to 4
  return false;
}

// very similar to  MC_FillUserHistogram from Generate.cxx
inline void fillUserHisto(char *name,double val, double weight=1.0, 
                          double min=Setup::bin_min[0][0], 
                          double max=Setup::bin_max[0][0]){

    TH1D *h=(TH1D*)(Setup::user_histograms->FindObject(name));
    if(!h){
      h=new TH1D(name,name,Setup::nbins[0][0],min,max);
      if(!h) return;
      Setup::user_histograms->Add(h);
      //      printf("user histogram created %s\n", name);
}
    h->Fill(val,weight);

}
double angle(double X, double Y){

 
    double  an=0.0; 
    double R=sqrt(X*X+Y*Y); 
    //    if(R<pow(10,-20)) printf(" angle this time X %f\n", 10000*X);
    if(R<pow(10,-20)) return an;

    if(TMath::Abs(X)/R<0.8) 
    { 
        an=acos(X/R);
	if(Y<0 && an>0) an=-an;
        if(Y>0 && an<0) an=-an; 
    }
    else 
    { 
      an=asin(Y/R);
      if(X<0 && an>=0.)  an=PI-an; 
      else if(X<0.)      an=-PI-an; 
       
    } 
  return an;
}

int counter=0;

int ZeeAnalysis(HEPParticle *mother,HEPParticleList *stableDaughters, int nparams, double *params)
{
  // THIS IS EXAMPLE of userTreeAnalysis. It acts on list of particle X (under our MC-test) final
  // daughters. Of course in real life many options may need to be introduced by the user.
    // PARAMETERS:
    // params[0] threshold on Energy (or p_T) of particle expressed as a fraction of mother's 
    //		 Energy (or p_T) in mother's frame. If not specified - default is 0.05 
    //           Note that setting it to zero is possible.
    // params[1] maximum number of left soft-suspected particles. 
    //           0: (default) all listed particles are removed, even if hard
    //           1: 2:  one two etc  removable particles are kept (at most)
    //          -1: this option is off, all hard particles stay.
    // params[2] control tag on discriminating particles, 
    //           0: (default) Energy in decaying particle rest frame
    //           1: Energy in lab frame
    //           2: p_T with respect to beam direction in lab frame.
    // params[3] type of action to be applied on removed daughters 
    //           0: (default) nothing is done, they are lost
    //           1:  algorithm as in studies on PHOTOS is used, see papers P. Golonka and Z. Was.
    // params[4] from this paramter on PDG id-s of particles to be removed can be added. 
    //           Default is that only photons are removed.
    // To get to origin of our particle (mother) one need to go after UserEventAnalysis,
    // instructive example will be given later. 
    assert(mother!=0);
    assert(stableDaughters!=0);


    double threshold=0.05, leftmax=0.0, selector=0.0, actLost=0.0; 
    if (nparams>0 && params==0)  return -1;
    if (nparams>0) threshold=params[0]; 
    if (nparams>1) leftmax  =params[1]; 
    if (nparams>2) selector =params[2]; 
    if (nparams>3) actLost  =params[3]; 

    
    HEPParticleList *lostDaughters=new HEPParticleList;    
    double pt_limit=threshold*mother->GetM();

    HEPParticleListIterator daughters (*stableDaughters);
    int nphot=0;
    double ephot=pow(10,22);
    bool redo=false;
    for (HEPParticle *part=daughters.first(); part!=0; (redo)? part=part:part=daughters.next() ) {
      if(redo) redo=false;
	MC4Vector d4(part->GetE(),part->GetPx(),part->GetPy(),part->GetPz(),part->GetM());
	// boost to mother's frame:
	d4.Boost(mother->GetPx(),mother->GetPy(),mother->GetPz(),mother->GetE(),mother->GetM());



	double p_t=d4.GetX0();  // default
	switch ((int) selector)
        {
	case 1: p_t=part->GetE(); break;
	case 2: p_t=d4.Xt(); break;
	}


        if(ifSofty(part->GetPDGId(),nparams,params)) nphot++;
	if ( ifSofty(part->GetPDGId(),nparams,params) && p_t < pt_limit) {
	  //	  printf("Odrzucamy! %i\n",count++);
          nphot=0;
            lostDaughters->push_back(part);
	    stableDaughters->remove(part);
	    part=daughters.first();
            redo=true;
            continue;
	}
        if( ifSofty(part->GetPDGId(),nparams,params) && ephot>p_t) ephot=p_t;
    }
    while(nphot>(int) leftmax)
    {
      double ephot1=pow(10,22);
      redo=false;
      for (HEPParticle *part=daughters.first(); part!=0; (redo)? part=part:part=daughters.next() ) {
        if(redo) redo=false;
	MC4Vector d4(part->GetE(),part->GetPx(),part->GetPy(),part->GetPz(),part->GetM());
	// boost to mother's frame:
	d4.Boost(mother->GetPx(),mother->GetPy(),mother->GetPz(),mother->GetE(),mother->GetM());


	double p_t=d4.GetX0();  // default
	switch ((int) selector)
        {
	case 1: p_t=part->GetE(); break;
	case 2: p_t=d4.Xt(); break;
	}


	if ( ifSofty(part->GetPDGId(),nparams,params) && p_t == ephot) {

	  nphot--;
            lostDaughters->push_back(part);
	    stableDaughters->remove(part);
            ephot1=pow(10,22);
	     part=daughters.first();
             redo=true;
             continue;
	}
        if( ifSofty(part->GetPDGId(),nparams,params) && ephot1>p_t) ephot1=p_t;
      }
      ephot=ephot1;

    }

    // ##############################################################
    // here functionality of removig some daughters is finished
    // now we reconsider what to do with them
    // ##############################################################
    // delete lostDaughters;
    // return 1; 


    // ##############################################################
    // Now: What to do with lost daughters?
    // ##############################################################
    //    lostDaughters->ls();
    int version=(int) actLost;
        
    switch(version)
      {
      case 1:  // add lost to charged
	{
          HEPParticleListIterator lost (*lostDaughters);
	  for (HEPParticle *lostpart=lost.first(); lostpart!=0; lostpart=lost.next() ) {
            HEPParticle* Best=0;
	    double searchvirt=pow(10.0,22);
            MC4Vector VV;
	    for( HEPParticle *part=daughters.first(); part!=0; part=daughters.next() ){
	      if(part->GetCharge()==0) continue;
              VV=lostpart->GetP4()+part->GetP4();
	      VV.AdjustM();
	      if (VV.GetM()<searchvirt) {searchvirt=VV.GetM(); Best=part;}
	    }
	    if(Best) {
              Best->SetPx(Best->GetPx()+lostpart->GetPx());
              Best->SetPy(Best->GetPy()+lostpart->GetPy());
              Best->SetPz(Best->GetPz()+lostpart->GetPz());
              Best->SetE (Best->GetE ()+lostpart->GetE ());
	    }
	  }
	break;
	}
      default: break; // do nothing
      }

    delete lostDaughters;


	/*
		Create e+e- inv. mass histogram
	*/
	double px=0,py=0,pz=0,e=0;

	//loop over all daughters
	for(HEPParticle *part=daughters.first();part!=0;part=daughters.next())
	{
		if(abs(part->GetPDGId())!=11) continue;
		//Sum e+ e- 4-vectors
		px+=part->GetPx();
		py+=part->GetPy();
		pz+=part->GetPz();
		e+=part->GetE();
	}
	double mass=sqrt(e*e-px*px-py*py-pz*pz);
	char mm[] = "e+e-mass_distribution";
	fillUserHisto(mm,mass,1.0,40.0,140.0);

	//For ZeeAnalysis - other histograms are not needed
    bool activateUserHist=false;
    if(!activateUserHist) return 1;

    // segmet of user defined histograms

    double X=mother->GetPx(), Y=mother->GetPy(), Z=mother->GetPz(); 
    // double E=mother->GetE(),  MM=mother->GetM();


    double pt=sqrt(X*X+Y*Y);
    double eta=log((sqrt(pt*pt+Z*Z)+TMath::Abs(Z))/pt);
    if(Z<0 && eta>0) eta=-eta;
    if(Z>0 && eta<0) eta=-eta;
    double phi=angle(X,Y);
    char hist1[] = "mother-PT";
    char hist2[] = "mother-eta";
    char hist3[] = "mother-phi";
    fillUserHisto(hist1,pt,1.0,0.0,100.0);
    fillUserHisto(hist2,eta,1.0,-8.0,8.0);
    fillUserHisto(hist3,phi,1.0,-PI,PI);
    return 1;
}
 ZeeAnalysis.C:1
 ZeeAnalysis.C:2
 ZeeAnalysis.C:3
 ZeeAnalysis.C:4
 ZeeAnalysis.C:5
 ZeeAnalysis.C:6
 ZeeAnalysis.C:7
 ZeeAnalysis.C:8
 ZeeAnalysis.C:9
 ZeeAnalysis.C:10
 ZeeAnalysis.C:11
 ZeeAnalysis.C:12
 ZeeAnalysis.C:13
 ZeeAnalysis.C:14
 ZeeAnalysis.C:15
 ZeeAnalysis.C:16
 ZeeAnalysis.C:17
 ZeeAnalysis.C:18
 ZeeAnalysis.C:19
 ZeeAnalysis.C:20
 ZeeAnalysis.C:21
 ZeeAnalysis.C:22
 ZeeAnalysis.C:23
 ZeeAnalysis.C:24
 ZeeAnalysis.C:25
 ZeeAnalysis.C:26
 ZeeAnalysis.C:27
 ZeeAnalysis.C:28
 ZeeAnalysis.C:29
 ZeeAnalysis.C:30
 ZeeAnalysis.C:31
 ZeeAnalysis.C:32
 ZeeAnalysis.C:33
 ZeeAnalysis.C:34
 ZeeAnalysis.C:35
 ZeeAnalysis.C:36
 ZeeAnalysis.C:37
 ZeeAnalysis.C:38
 ZeeAnalysis.C:39
 ZeeAnalysis.C:40
 ZeeAnalysis.C:41
 ZeeAnalysis.C:42
 ZeeAnalysis.C:43
 ZeeAnalysis.C:44
 ZeeAnalysis.C:45
 ZeeAnalysis.C:46
 ZeeAnalysis.C:47
 ZeeAnalysis.C:48
 ZeeAnalysis.C:49
 ZeeAnalysis.C:50
 ZeeAnalysis.C:51
 ZeeAnalysis.C:52
 ZeeAnalysis.C:53
 ZeeAnalysis.C:54
 ZeeAnalysis.C:55
 ZeeAnalysis.C:56
 ZeeAnalysis.C:57
 ZeeAnalysis.C:58
 ZeeAnalysis.C:59
 ZeeAnalysis.C:60
 ZeeAnalysis.C:61
 ZeeAnalysis.C:62
 ZeeAnalysis.C:63
 ZeeAnalysis.C:64
 ZeeAnalysis.C:65
 ZeeAnalysis.C:66
 ZeeAnalysis.C:67
 ZeeAnalysis.C:68
 ZeeAnalysis.C:69
 ZeeAnalysis.C:70
 ZeeAnalysis.C:71
 ZeeAnalysis.C:72
 ZeeAnalysis.C:73
 ZeeAnalysis.C:74
 ZeeAnalysis.C:75
 ZeeAnalysis.C:76
 ZeeAnalysis.C:77
 ZeeAnalysis.C:78
 ZeeAnalysis.C:79
 ZeeAnalysis.C:80
 ZeeAnalysis.C:81
 ZeeAnalysis.C:82
 ZeeAnalysis.C:83
 ZeeAnalysis.C:84
 ZeeAnalysis.C:85
 ZeeAnalysis.C:86
 ZeeAnalysis.C:87
 ZeeAnalysis.C:88
 ZeeAnalysis.C:89
 ZeeAnalysis.C:90
 ZeeAnalysis.C:91
 ZeeAnalysis.C:92
 ZeeAnalysis.C:93
 ZeeAnalysis.C:94
 ZeeAnalysis.C:95
 ZeeAnalysis.C:96
 ZeeAnalysis.C:97
 ZeeAnalysis.C:98
 ZeeAnalysis.C:99
 ZeeAnalysis.C:100
 ZeeAnalysis.C:101
 ZeeAnalysis.C:102
 ZeeAnalysis.C:103
 ZeeAnalysis.C:104
 ZeeAnalysis.C:105
 ZeeAnalysis.C:106
 ZeeAnalysis.C:107
 ZeeAnalysis.C:108
 ZeeAnalysis.C:109
 ZeeAnalysis.C:110
 ZeeAnalysis.C:111
 ZeeAnalysis.C:112
 ZeeAnalysis.C:113
 ZeeAnalysis.C:114
 ZeeAnalysis.C:115
 ZeeAnalysis.C:116
 ZeeAnalysis.C:117
 ZeeAnalysis.C:118
 ZeeAnalysis.C:119
 ZeeAnalysis.C:120
 ZeeAnalysis.C:121
 ZeeAnalysis.C:122
 ZeeAnalysis.C:123
 ZeeAnalysis.C:124
 ZeeAnalysis.C:125
 ZeeAnalysis.C:126
 ZeeAnalysis.C:127
 ZeeAnalysis.C:128
 ZeeAnalysis.C:129
 ZeeAnalysis.C:130
 ZeeAnalysis.C:131
 ZeeAnalysis.C:132
 ZeeAnalysis.C:133
 ZeeAnalysis.C:134
 ZeeAnalysis.C:135
 ZeeAnalysis.C:136
 ZeeAnalysis.C:137
 ZeeAnalysis.C:138
 ZeeAnalysis.C:139
 ZeeAnalysis.C:140
 ZeeAnalysis.C:141
 ZeeAnalysis.C:142
 ZeeAnalysis.C:143
 ZeeAnalysis.C:144
 ZeeAnalysis.C:145
 ZeeAnalysis.C:146
 ZeeAnalysis.C:147
 ZeeAnalysis.C:148
 ZeeAnalysis.C:149
 ZeeAnalysis.C:150
 ZeeAnalysis.C:151
 ZeeAnalysis.C:152
 ZeeAnalysis.C:153
 ZeeAnalysis.C:154
 ZeeAnalysis.C:155
 ZeeAnalysis.C:156
 ZeeAnalysis.C:157
 ZeeAnalysis.C:158
 ZeeAnalysis.C:159
 ZeeAnalysis.C:160
 ZeeAnalysis.C:161
 ZeeAnalysis.C:162
 ZeeAnalysis.C:163
 ZeeAnalysis.C:164
 ZeeAnalysis.C:165
 ZeeAnalysis.C:166
 ZeeAnalysis.C:167
 ZeeAnalysis.C:168
 ZeeAnalysis.C:169
 ZeeAnalysis.C:170
 ZeeAnalysis.C:171
 ZeeAnalysis.C:172
 ZeeAnalysis.C:173
 ZeeAnalysis.C:174
 ZeeAnalysis.C:175
 ZeeAnalysis.C:176
 ZeeAnalysis.C:177
 ZeeAnalysis.C:178
 ZeeAnalysis.C:179
 ZeeAnalysis.C:180
 ZeeAnalysis.C:181
 ZeeAnalysis.C:182
 ZeeAnalysis.C:183
 ZeeAnalysis.C:184
 ZeeAnalysis.C:185
 ZeeAnalysis.C:186
 ZeeAnalysis.C:187
 ZeeAnalysis.C:188
 ZeeAnalysis.C:189
 ZeeAnalysis.C:190
 ZeeAnalysis.C:191
 ZeeAnalysis.C:192
 ZeeAnalysis.C:193
 ZeeAnalysis.C:194
 ZeeAnalysis.C:195
 ZeeAnalysis.C:196
 ZeeAnalysis.C:197
 ZeeAnalysis.C:198
 ZeeAnalysis.C:199
 ZeeAnalysis.C:200
 ZeeAnalysis.C:201
 ZeeAnalysis.C:202
 ZeeAnalysis.C:203
 ZeeAnalysis.C:204
 ZeeAnalysis.C:205
 ZeeAnalysis.C:206
 ZeeAnalysis.C:207
 ZeeAnalysis.C:208
 ZeeAnalysis.C:209
 ZeeAnalysis.C:210
 ZeeAnalysis.C:211
 ZeeAnalysis.C:212
 ZeeAnalysis.C:213
 ZeeAnalysis.C:214
 ZeeAnalysis.C:215
 ZeeAnalysis.C:216
 ZeeAnalysis.C:217
 ZeeAnalysis.C:218
 ZeeAnalysis.C:219
 ZeeAnalysis.C:220
 ZeeAnalysis.C:221
 ZeeAnalysis.C:222
 ZeeAnalysis.C:223
 ZeeAnalysis.C:224
 ZeeAnalysis.C:225
 ZeeAnalysis.C:226
 ZeeAnalysis.C:227
 ZeeAnalysis.C:228
 ZeeAnalysis.C:229
 ZeeAnalysis.C:230
 ZeeAnalysis.C:231
 ZeeAnalysis.C:232
 ZeeAnalysis.C:233
 ZeeAnalysis.C:234
 ZeeAnalysis.C:235
 ZeeAnalysis.C:236
 ZeeAnalysis.C:237
 ZeeAnalysis.C:238
 ZeeAnalysis.C:239
 ZeeAnalysis.C:240
 ZeeAnalysis.C:241
 ZeeAnalysis.C:242
 ZeeAnalysis.C:243
 ZeeAnalysis.C:244
 ZeeAnalysis.C:245
 ZeeAnalysis.C:246
 ZeeAnalysis.C:247
 ZeeAnalysis.C:248
 ZeeAnalysis.C:249
 ZeeAnalysis.C:250
 ZeeAnalysis.C:251
 ZeeAnalysis.C:252