ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

////////////////////////////////////////////////////////////////////////////////
//
//  This class contains all code which is used to compute any of the values
//  which can be of interest within a resonance analysis. Besides the obvious
//  invariant mass, it allows to compute other utility values on all possible
//  targets, in order to allow a wide spectrum of binning and checks.
//  When needed, this object can also define a binning in the variable which
//  it is required to compute, which is used for initializing axes of output
//  histograms (see AliRsnFunction).
//  The value computation requires this object to be passed the object whose
//  informations will be used. This object can be of any allowed input type
//  (track, pair, event), then this class must inherit from AliRsnTarget.
//  Then, when value computation is attempted, a check on target type is done
//  and computation is successful only if expected target matches that of the
//  passed object.
//  In some cases, the value computation can require a support external object,
//  which must then be passed to this class. It can be of any type inheriting
//  from TObject.
//
//  authors: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
//           M. Vala (martin.vala@cern.ch)
//
////////////////////////////////////////////////////////////////////////////////

#include "Riostream.h"

#include "AliLog.h"

#include "AliRsnMiniPair.h"
#include "AliRsnMiniEvent.h"
#include "AliRsnMiniParticle.h"

#include "AliRsnMiniValue.h"

ClassImp(AliRsnMiniValue)

//_____________________________________________________________________________
AliRsnMiniValue::AliRsnMiniValue(EType type, Bool_t useMC) :
   TNamed(ValueName(type, useMC), ""),
   fType(type),
   fUseMCInfo(useMC)
{
//
// Constructor
//
}

//_____________________________________________________________________________
AliRsnMiniValue::AliRsnMiniValue(const AliRsnMiniValue &copy) :
   TNamed(copy),
   fType(copy.fType),
   fUseMCInfo(copy.fUseMCInfo)
{
//
// Copy constructor
//
}

//_____________________________________________________________________________
AliRsnMiniValue &AliRsnMiniValue::operator=(const AliRsnMiniValue &copy)
{
//
// Assignment operator.
// Works like copy constructor.
//
   TNamed::operator=(copy);
   if (this == &copy)
      return *this;
   fType = copy.fType;
   fUseMCInfo = copy.fUseMCInfo;

   return (*this);
}

//_____________________________________________________________________________
const char *AliRsnMiniValue::TypeName(EType type)
{
//
// This method returns a string to give a name to each possible
// computation value.
//

   switch (type) {
      case kVz:           return "EventVz";
      case kMult:         return "EventMult";
      case kTracklets:    return "EventTracklets";
      case kPlaneAngle:   return "EventPlane";
      case kLeadingPt:    return "EventLeadingPt";
      case kPt:           return "Pt";
      case kPz:           return "Pz";
      case kInvMass:      return "InvMass";
      case kInvMassRes:   return "InvMassResolution";
      case kInvMassDiff:  return "InvMassDifference";
      case kEta:          return "Eta";
      case kMt:           return "Mt";
      case kY:            return "Y";
      case kPtRatio:      return "PtRatio";
      case kDipAngle:     return "DipAngle";
      case kCosThetaStar: return "CosThetaStar";
      case kAngleLeading: return "AngleToLeading";
      case kFirstDaughterPt: return "FirstDaughterPt";
      case kSecondDaughterPt: return "SecondDaughterPt";
      case kFirstDaughterP: return "FirstDaughterP";
      case kSecondDaughterP: return "SecondDaughterP";
      case kDCAproduct:   return "DaughterDCAproduct";
      case kFirstDaughterDCA: return "FirstDaughterDCA";
      case kSecondDaughterDCA: return "SecondDaughterDCA";
      case kNSisters:     return "NumberOfSisters";
      default:            return "Undefined";
   }
}

//_____________________________________________________________________________
Float_t AliRsnMiniValue::Eval(AliRsnMiniPair *pair, AliRsnMiniEvent *event)
{
//
// Evaluation of the required value.
// In this implementation, fills the member 4-vectors with data
// coming from the object passed as argument, and then returns the value
//

   if (!pair && fType > kEventCuts) {
      AliError("Null pair passed!");
      return 1E20;
   }

   // compute value depending on types in the enumeration
   // if the type does not match any available choice, or if
   // the computation is not doable due to any problem
   // (not initialized support object, wrong values, risk of floating point errors)
   // the method returng kFALSE and sets the computed value to a meaningless number
   Double_t p3[3]= {0.,0.,0.};
   AliRsnMiniParticle *l;
   TLorentzVector v;
   switch (fType) {
         // ---- event values -------------------------------------------------------------------------
      case kVz:
         return event->Vz();
      case kMult:
         return event->Mult();
      case kTracklets:
         return event->Tracklets();	 
      case kPlaneAngle:
         return event->Angle();
      case kLeadingPt:
         l = event->LeadingParticle();
         if (l) {
            l->Set4Vector(v,-1.0,fUseMCInfo);
            return v.Pt();
         }
         return 0.0;
      case kPt:
         return pair->Pt(fUseMCInfo);
      case kInvMass:
         return pair->InvMass(fUseMCInfo);
      case kEta:
         return pair->Eta(fUseMCInfo);
      case kInvMassRes:
         return pair->InvMassRes();
      case kInvMassDiff:
         return pair->InvMassDiff();
      case kMt:
         return pair->Mt(fUseMCInfo);
      case kY:
         return pair->Y(fUseMCInfo);
      case kPtRatio:
         return pair->PtRatio(fUseMCInfo);
      case kDipAngle:
         return pair->DipAngle(fUseMCInfo);
      case kCosThetaStar:
         return pair->CosThetaStar(fUseMCInfo);
      case kAngleLeading:
         l = event->LeadingParticle();
         if (l) {
            l->Set4Vector(v,-1.0,fUseMCInfo);
            Double_t angle = v.Phi() - pair->Sum(fUseMCInfo).Phi();

            //return angle w.r.t. leading particle in the range -pi/2, 3/2pi
            while (angle >= 1.5 * TMath::Pi()) angle -= 2 * TMath::Pi();
            while (angle < -0.5 * TMath::Pi()) angle += 2 * TMath::Pi();
            return angle;
         }
//         AliWarning("This method is not yet implemented");
         return 1E20;
      case kFirstDaughterPt:
         return pair->DaughterPt(0,fUseMCInfo);
      case kSecondDaughterPt:
         return pair->DaughterPt(1,fUseMCInfo);
      case kFirstDaughterP:
         pair->DaughterPxPyPz(0,fUseMCInfo, p3);
         return TMath::Sqrt(p3[0]*p3[0]+p3[1]*p3[1]+p3[2]*p3[2]);
      case kSecondDaughterP:
         pair->DaughterPxPyPz(1,fUseMCInfo, p3);
         return TMath::Sqrt(p3[0]*p3[0]+p3[1]*p3[1]+p3[2]*p3[2]);
      case kDCAproduct:
         return pair->DCAProduct();
      case kFirstDaughterDCA:
         return pair->DaughterDCA(0);
      case kSecondDaughterDCA:
         return pair->DaughterDCA(1);
      case kNSisters:
         return pair->NSisters();
      default:
         AliError("Invalid value type");
         return 1E20;
   }
}
 AliRsnMiniValue.cxx:1
 AliRsnMiniValue.cxx:2
 AliRsnMiniValue.cxx:3
 AliRsnMiniValue.cxx:4
 AliRsnMiniValue.cxx:5
 AliRsnMiniValue.cxx:6
 AliRsnMiniValue.cxx:7
 AliRsnMiniValue.cxx:8
 AliRsnMiniValue.cxx:9
 AliRsnMiniValue.cxx:10
 AliRsnMiniValue.cxx:11
 AliRsnMiniValue.cxx:12
 AliRsnMiniValue.cxx:13
 AliRsnMiniValue.cxx:14
 AliRsnMiniValue.cxx:15
 AliRsnMiniValue.cxx:16
 AliRsnMiniValue.cxx:17
 AliRsnMiniValue.cxx:18
 AliRsnMiniValue.cxx:19
 AliRsnMiniValue.cxx:20
 AliRsnMiniValue.cxx:21
 AliRsnMiniValue.cxx:22
 AliRsnMiniValue.cxx:23
 AliRsnMiniValue.cxx:24
 AliRsnMiniValue.cxx:25
 AliRsnMiniValue.cxx:26
 AliRsnMiniValue.cxx:27
 AliRsnMiniValue.cxx:28
 AliRsnMiniValue.cxx:29
 AliRsnMiniValue.cxx:30
 AliRsnMiniValue.cxx:31
 AliRsnMiniValue.cxx:32
 AliRsnMiniValue.cxx:33
 AliRsnMiniValue.cxx:34
 AliRsnMiniValue.cxx:35
 AliRsnMiniValue.cxx:36
 AliRsnMiniValue.cxx:37
 AliRsnMiniValue.cxx:38
 AliRsnMiniValue.cxx:39
 AliRsnMiniValue.cxx:40
 AliRsnMiniValue.cxx:41
 AliRsnMiniValue.cxx:42
 AliRsnMiniValue.cxx:43
 AliRsnMiniValue.cxx:44
 AliRsnMiniValue.cxx:45
 AliRsnMiniValue.cxx:46
 AliRsnMiniValue.cxx:47
 AliRsnMiniValue.cxx:48
 AliRsnMiniValue.cxx:49
 AliRsnMiniValue.cxx:50
 AliRsnMiniValue.cxx:51
 AliRsnMiniValue.cxx:52
 AliRsnMiniValue.cxx:53
 AliRsnMiniValue.cxx:54
 AliRsnMiniValue.cxx:55
 AliRsnMiniValue.cxx:56
 AliRsnMiniValue.cxx:57
 AliRsnMiniValue.cxx:58
 AliRsnMiniValue.cxx:59
 AliRsnMiniValue.cxx:60
 AliRsnMiniValue.cxx:61
 AliRsnMiniValue.cxx:62
 AliRsnMiniValue.cxx:63
 AliRsnMiniValue.cxx:64
 AliRsnMiniValue.cxx:65
 AliRsnMiniValue.cxx:66
 AliRsnMiniValue.cxx:67
 AliRsnMiniValue.cxx:68
 AliRsnMiniValue.cxx:69
 AliRsnMiniValue.cxx:70
 AliRsnMiniValue.cxx:71
 AliRsnMiniValue.cxx:72
 AliRsnMiniValue.cxx:73
 AliRsnMiniValue.cxx:74
 AliRsnMiniValue.cxx:75
 AliRsnMiniValue.cxx:76
 AliRsnMiniValue.cxx:77
 AliRsnMiniValue.cxx:78
 AliRsnMiniValue.cxx:79
 AliRsnMiniValue.cxx:80
 AliRsnMiniValue.cxx:81
 AliRsnMiniValue.cxx:82
 AliRsnMiniValue.cxx:83
 AliRsnMiniValue.cxx:84
 AliRsnMiniValue.cxx:85
 AliRsnMiniValue.cxx:86
 AliRsnMiniValue.cxx:87
 AliRsnMiniValue.cxx:88
 AliRsnMiniValue.cxx:89
 AliRsnMiniValue.cxx:90
 AliRsnMiniValue.cxx:91
 AliRsnMiniValue.cxx:92
 AliRsnMiniValue.cxx:93
 AliRsnMiniValue.cxx:94
 AliRsnMiniValue.cxx:95
 AliRsnMiniValue.cxx:96
 AliRsnMiniValue.cxx:97
 AliRsnMiniValue.cxx:98
 AliRsnMiniValue.cxx:99
 AliRsnMiniValue.cxx:100
 AliRsnMiniValue.cxx:101
 AliRsnMiniValue.cxx:102
 AliRsnMiniValue.cxx:103
 AliRsnMiniValue.cxx:104
 AliRsnMiniValue.cxx:105
 AliRsnMiniValue.cxx:106
 AliRsnMiniValue.cxx:107
 AliRsnMiniValue.cxx:108
 AliRsnMiniValue.cxx:109
 AliRsnMiniValue.cxx:110
 AliRsnMiniValue.cxx:111
 AliRsnMiniValue.cxx:112
 AliRsnMiniValue.cxx:113
 AliRsnMiniValue.cxx:114
 AliRsnMiniValue.cxx:115
 AliRsnMiniValue.cxx:116
 AliRsnMiniValue.cxx:117
 AliRsnMiniValue.cxx:118
 AliRsnMiniValue.cxx:119
 AliRsnMiniValue.cxx:120
 AliRsnMiniValue.cxx:121
 AliRsnMiniValue.cxx:122
 AliRsnMiniValue.cxx:123
 AliRsnMiniValue.cxx:124
 AliRsnMiniValue.cxx:125
 AliRsnMiniValue.cxx:126
 AliRsnMiniValue.cxx:127
 AliRsnMiniValue.cxx:128
 AliRsnMiniValue.cxx:129
 AliRsnMiniValue.cxx:130
 AliRsnMiniValue.cxx:131
 AliRsnMiniValue.cxx:132
 AliRsnMiniValue.cxx:133
 AliRsnMiniValue.cxx:134
 AliRsnMiniValue.cxx:135
 AliRsnMiniValue.cxx:136
 AliRsnMiniValue.cxx:137
 AliRsnMiniValue.cxx:138
 AliRsnMiniValue.cxx:139
 AliRsnMiniValue.cxx:140
 AliRsnMiniValue.cxx:141
 AliRsnMiniValue.cxx:142
 AliRsnMiniValue.cxx:143
 AliRsnMiniValue.cxx:144
 AliRsnMiniValue.cxx:145
 AliRsnMiniValue.cxx:146
 AliRsnMiniValue.cxx:147
 AliRsnMiniValue.cxx:148
 AliRsnMiniValue.cxx:149
 AliRsnMiniValue.cxx:150
 AliRsnMiniValue.cxx:151
 AliRsnMiniValue.cxx:152
 AliRsnMiniValue.cxx:153
 AliRsnMiniValue.cxx:154
 AliRsnMiniValue.cxx:155
 AliRsnMiniValue.cxx:156
 AliRsnMiniValue.cxx:157
 AliRsnMiniValue.cxx:158
 AliRsnMiniValue.cxx:159
 AliRsnMiniValue.cxx:160
 AliRsnMiniValue.cxx:161
 AliRsnMiniValue.cxx:162
 AliRsnMiniValue.cxx:163
 AliRsnMiniValue.cxx:164
 AliRsnMiniValue.cxx:165
 AliRsnMiniValue.cxx:166
 AliRsnMiniValue.cxx:167
 AliRsnMiniValue.cxx:168
 AliRsnMiniValue.cxx:169
 AliRsnMiniValue.cxx:170
 AliRsnMiniValue.cxx:171
 AliRsnMiniValue.cxx:172
 AliRsnMiniValue.cxx:173
 AliRsnMiniValue.cxx:174
 AliRsnMiniValue.cxx:175
 AliRsnMiniValue.cxx:176
 AliRsnMiniValue.cxx:177
 AliRsnMiniValue.cxx:178
 AliRsnMiniValue.cxx:179
 AliRsnMiniValue.cxx:180
 AliRsnMiniValue.cxx:181
 AliRsnMiniValue.cxx:182
 AliRsnMiniValue.cxx:183
 AliRsnMiniValue.cxx:184
 AliRsnMiniValue.cxx:185
 AliRsnMiniValue.cxx:186
 AliRsnMiniValue.cxx:187
 AliRsnMiniValue.cxx:188
 AliRsnMiniValue.cxx:189
 AliRsnMiniValue.cxx:190
 AliRsnMiniValue.cxx:191
 AliRsnMiniValue.cxx:192
 AliRsnMiniValue.cxx:193
 AliRsnMiniValue.cxx:194
 AliRsnMiniValue.cxx:195
 AliRsnMiniValue.cxx:196
 AliRsnMiniValue.cxx:197
 AliRsnMiniValue.cxx:198
 AliRsnMiniValue.cxx:199
 AliRsnMiniValue.cxx:200
 AliRsnMiniValue.cxx:201
 AliRsnMiniValue.cxx:202
 AliRsnMiniValue.cxx:203
 AliRsnMiniValue.cxx:204
 AliRsnMiniValue.cxx:205
 AliRsnMiniValue.cxx:206
 AliRsnMiniValue.cxx:207
 AliRsnMiniValue.cxx:208
 AliRsnMiniValue.cxx:209
 AliRsnMiniValue.cxx:210
 AliRsnMiniValue.cxx:211
 AliRsnMiniValue.cxx:212
 AliRsnMiniValue.cxx:213
 AliRsnMiniValue.cxx:214
 AliRsnMiniValue.cxx:215
 AliRsnMiniValue.cxx:216
 AliRsnMiniValue.cxx:217
 AliRsnMiniValue.cxx:218
 AliRsnMiniValue.cxx:219
 AliRsnMiniValue.cxx:220
 AliRsnMiniValue.cxx:221
 AliRsnMiniValue.cxx:222