This commit was generated by cvs2svn to compensate for changes in r18145,
authorpanos <panos@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 25 Apr 2007 15:38:41 +0000 (15:38 +0000)
committerpanos <panos@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 25 Apr 2007 15:38:41 +0000 (15:38 +0000)
which included commits to RCS files with non-trunk default branches.

106 files changed:
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoBaseAnalysis.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCorrFctn.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCutMonitor.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventWriter.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoHiddenInfo.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoKinkCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoLikeSignCorrFctn.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoPairCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoParticleCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoTrackCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoV0Cut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoXiCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/PhysicalConstants.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Base/SystemOfUnits.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoAnalysisCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCorrFctnCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEnumeration.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEventWriterCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoHelix.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKinkCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLinkDef.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVectorD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticleCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEvent.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEvent.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEventCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEventCollectionVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEventCollectionVectorHideAway.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPicoEventCollectionVectorHideAway.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoString.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoThreeVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoThreeVectorD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoTrack.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoTrack.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoTrackCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoTypes.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoV0.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoV0.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoV0Collection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoXi.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoXi.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoXiCollection.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmHelix.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmHelix.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmHelixD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmLorentzVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmLorentzVectorD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmPhysicalHelix.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmPhysicalHelix.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmPhysicalHelixD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmThreeVector.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmThreeVectorD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFmThreeVectorF.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/TpcLocalTransform.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/TpcLocalTransform.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Infrastructure/phys_constants.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Reader/AliFemtoEventReaderESD.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Reader/AliFemtoEventReaderESD.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Reader/AliFemtoEventReaderESDChain.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemto/Reader/AliFemtoEventReaderESDChain.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/CorrFctn/AliFemtoShareQualityCorrFctn.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/CorrFctn/AliFemtoShareQualityCorrFctn.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoESDTrackCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoESDTrackCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoQPairCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoQPairCut.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoShareQualityPairCut.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/Cut/AliFemtoShareQualityPairCut.h [new file with mode: 0644]

diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.cxx b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.cxx
new file mode 100644 (file)
index 0000000..d9419f5
--- /dev/null
@@ -0,0 +1,514 @@
+/***************************************************************************
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *      This is the Class for Analysis objects.  Each of the simultaneous
+ *      Analyses running should have one of these instantiated.  They link
+ *      into the Manager in an Analysis Collection.
+ *
+ ***************************************************************************
+ *
+ *
+ * Revision 1.23  2002/11/20 00:09:26  renault
+ * fill a new monitor with (hbtEvent,partCollection)
+ *
+ * Revision 1.22  2002/11/03 16:40:31  magestro
+ * Modified ProcessEvent(), added MakePairs() method, and implemented immediate event mixing
+ *
+ * Revision 1.21  2002/06/26 17:27:09  lisa
+ * fixed small bug in AliFemtoAnalysis associated with the new feature to require ParticleCollections to have some minimum number of particles
+ *
+ * Revision 1.20  2002/06/22 17:53:31  lisa
+ * implemented switch to allow user to require minimum number of particles in First and Second ParticleCollections - default value is zero so if user does not Set this value then behaviour is like before
+ *
+ * Revision 1.19  2001/11/06 20:20:53  laue
+ * Order of event-mixing fixed.
+ *
+ * Revision 1.18  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * Revision 1.17  2001/04/05 21:57:45  laue
+ * current pico-event becomes a member of the analysis (fPicoEvent) and gets
+ * an access-function (CurrentPicoEvent)
+ *
+ * Revision 1.15  2000/09/13 18:09:09  laue
+ * Bux fix: Delete track cut only once for identical particle hbt
+ *
+ * Revision 1.14  2000/08/31 22:31:30  laue
+ * AliFemtoAnalysis: output changed (a little bit less)
+ * AliFemtoEvent: new version, members for reference mult added
+ * AliFemtoIOBinary: new IO for new AliFemtoEvent version
+ * AliFemtoTypes: TTree typedef to AliFemtoTTree added
+ * AliFemtoVertexAnalysis: overflow and underflow added
+ *
+ * Revision 1.13  2000/08/11 16:35:40  rcwells
+ * Added number of events processed to each HBT analysis
+ *
+ * Revision 1.12  2000/07/16 22:23:17  laue
+ * I forgot that we moved memberfunctions out of AliFemtoBaseAnalysis.
+ * So my previous check-ins didn't compile with the library.
+ * Now they do.
+ *
+ * Revision 1.11  2000/07/16 21:38:22  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers mTrack,mV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.10  2000/07/06 18:45:51  laue
+ * Copy constructor fixed. It couldn't handle identicle particles.
+ *
+ * Revision 1.9  2000/04/13 20:20:22  laue
+ * Event mixing corrected. Now the first collection of the current event is
+ * mixed with the second collection from the mixing buffer _AND_ vice verse
+ *
+ * Revision 1.8  2000/03/23 23:00:01  laue
+ * AliFemtoAnalysis copy constructor now uses Clone() function of cuts
+ * AliFemtoTypes now has AliFemtoTF1 for fitting purposes
+ *
+ * Revision 1.7  2000/03/17 17:23:05  laue
+ * Roberts new three particle correlations implemented.
+ *
+ * Revision 1.6  2000/03/16 02:07:04  laue
+ * Copy constructor added to AliFemtoAnalysis (only known cuts, corrfctn).
+ *
+ * AliFemtoBinaryReader can now derive filename from StIOMaker and read a list
+ * of files.
+ *
+ * AliFemtoManager now holds a collection of AliFemtoEventWriters (multiple writes
+ * possible now)
+ *
+ * Revision 1.5  2000/02/13 17:17:12  laue
+ * Calls to the EventBegin() and EventEnd() functions implemented
+ * The actual analysis is moved from AliFemtoManager to AliFemtoAnalysis
+ *
+ * Revision 1.4  2000/01/25 17:35:16  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.3  1999/10/04 15:38:53  lisa
+ * include Franks new accessor methods AliFemtoAnalysis::CorrFctn and AliFemtoManager::Analysis as well as McEvent example macro
+ *
+ * Revision 1.2  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Analysis/AliFemtoAnalysis.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Base/AliFemtoKinkCut.h"
+#include <string>
+
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoAnalysis)
+#endif
+
+AliFemtoEventCut*    copyTheCut(AliFemtoEventCut*);
+AliFemtoParticleCut* copyTheCut(AliFemtoParticleCut*);
+AliFemtoPairCut*     copyTheCut(AliFemtoPairCut*);
+AliFemtoCorrFctn*    copyTheCorrFctn(AliFemtoCorrFctn*);
+
+// this little function used to apply ParticleCuts (TrackCuts or V0Cuts) and fill ParticleCollections of picoEvent
+//  it is called from AliFemtoAnalysis::ProcessEvent()
+void FillHbtParticleCollection(AliFemtoParticleCut*         partCut,
+                              AliFemtoEvent*               hbtEvent,
+                              AliFemtoParticleCollection*  partCollection)
+{
+  switch (partCut->Type()) {
+  case hbtTrack:       // cut is cutting on Tracks
+    {
+      AliFemtoTrackCut* pCut = (AliFemtoTrackCut*) partCut;
+      AliFemtoTrack* pParticle;
+      AliFemtoTrackIterator pIter;
+      AliFemtoTrackIterator startLoop = hbtEvent->TrackCollection()->begin();
+      AliFemtoTrackIterator endLoop   = hbtEvent->TrackCollection()->end();
+      for (pIter=startLoop;pIter!=endLoop;pIter++){
+       pParticle = *pIter;
+       bool tmpPassParticle = pCut->Pass(pParticle);
+       pCut->FillCutMonitor(pParticle, tmpPassParticle);
+       if (tmpPassParticle){   
+         AliFemtoParticle* particle = new AliFemtoParticle(pParticle,pCut->Mass());
+         partCollection->push_back(particle);
+       }
+      }
+      break;
+    }
+  case hbtV0:          // cut is cutting on V0s
+    {
+      AliFemtoV0Cut* pCut = (AliFemtoV0Cut*) partCut;
+      AliFemtoV0* pParticle;
+      AliFemtoV0Iterator pIter;
+      AliFemtoV0Iterator startLoop = hbtEvent->V0Collection()->begin();
+      AliFemtoV0Iterator endLoop   = hbtEvent->V0Collection()->end();
+      // this following "for" loop is identical to the one above, but because of scoping, I can's see how to avoid repitition...
+      for (pIter=startLoop;pIter!=endLoop;pIter++){
+       pParticle = *pIter; 
+       bool tmpPassV0 = pCut->Pass(pParticle);
+       pCut->FillCutMonitor(pParticle,tmpPassV0);
+       if (tmpPassV0){
+         AliFemtoParticle* particle = new AliFemtoParticle(pParticle,partCut->Mass());
+         partCollection->push_back(particle);
+       }
+      }
+      pCut->FillCutMonitor(hbtEvent,partCollection);// Gael 19/06/02
+      break;
+    }
+  case hbtKink:          // cut is cutting on Kinks  -- mal 25May2001
+    {
+      AliFemtoKinkCut* pCut = (AliFemtoKinkCut*) partCut;
+      AliFemtoKink* pParticle;
+      AliFemtoKinkIterator pIter;
+      AliFemtoKinkIterator startLoop = hbtEvent->KinkCollection()->begin();
+      AliFemtoKinkIterator endLoop   = hbtEvent->KinkCollection()->end();
+      // this following "for" loop is identical to the one above, but because of scoping, I can's see how to avoid repitition...
+      for (pIter=startLoop;pIter!=endLoop;pIter++){
+       pParticle = *pIter; 
+       bool tmpPass = pCut->Pass(pParticle);
+       pCut->FillCutMonitor(pParticle,tmpPass);
+       if (tmpPass){
+         AliFemtoParticle* particle = new AliFemtoParticle(pParticle,partCut->Mass());
+         partCollection->push_back(particle);
+       }
+      }
+      break;
+    }
+  default:
+    cout << "FillHbtParticleCollection function (in AliFemtoAnalysis.cxx) - undefined Particle Cut type!!! \n";
+  }
+}
+//____________________________
+AliFemtoAnalysis::AliFemtoAnalysis(){
+  //  mControlSwitch     = 0;
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fMixingBuffer = new AliFemtoPicoEventCollection;
+  fNeventsProcessed = 0;
+  fPicoEvent=0;
+
+  fPicoEventCollectionVectorHideAway = 0;
+
+  fMinSizePartCollection=0;  // minimum # particles in ParticleCollection
+
+}
+//____________________________
+
+AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) : AliFemtoBaseAnalysis() {
+  //AliFemtoAnalysis();
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fMixingBuffer = new AliFemtoPicoEventCollection;
+  fNeventsProcessed = 0;
+  fPicoEvent=0;
+
+  // find the right event cut
+  fEventCut = a.fEventCut->Clone();
+  // find the right first particle cut
+  fFirstParticleCut = a.fFirstParticleCut->Clone();
+  // find the right second particle cut
+  if (a.fFirstParticleCut==a.fSecondParticleCut) 
+    SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
+  else
+  fSecondParticleCut = a.fSecondParticleCut->Clone();
+
+  fPairCut = a.fPairCut->Clone();
+  
+  if ( fEventCut ) {
+      SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - event cut set " << endl;
+  }
+  if ( fFirstParticleCut ) {
+      SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - first particle cut set " << endl;
+  }
+  if ( fSecondParticleCut ) {
+      SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - second particle cut set " << endl;
+  }  if ( fPairCut ) {
+      SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - pair cut set " << endl;
+  }
+
+  AliFemtoCorrFctnIterator iter;
+  for (iter=a.fCorrFctnCollection->begin(); iter!=a.fCorrFctnCollection->end();iter++){
+    cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - looking for correlation functions " << endl;
+    AliFemtoCorrFctn* fctn = (*iter)->Clone();
+    if (fctn) AddCorrFctn(fctn);
+    else cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - correlation function not found " << endl;
+  }
+
+  fNumEventsToMix = a.fNumEventsToMix;
+
+  fMinSizePartCollection = a.fMinSizePartCollection;  // minimum # particles in ParticleCollection
+
+  cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - analysis copied " << endl;
+
+}
+//____________________________
+AliFemtoAnalysis::~AliFemtoAnalysis(){
+  cout << " AliFemtoAnalysis::~AliFemtoAnalysis()" << endl;
+  if (fEventCut) delete fEventCut; fEventCut=0;
+  if (fFirstParticleCut == fSecondParticleCut) fSecondParticleCut=0;
+  if (fFirstParticleCut)  delete fFirstParticleCut; fFirstParticleCut=0;
+  if (fSecondParticleCut) delete fSecondParticleCut; fSecondParticleCut=0;
+  if (fPairCut) delete fPairCut; fPairCut=0;
+  // now delete every CorrFunction in the Collection, and then the Collection itself
+  AliFemtoCorrFctnIterator iter;
+  for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
+    delete *iter;
+  }
+  delete fCorrFctnCollection;
+  // now delete every PicoEvent in the EventMixingBuffer and then the Buffer itself
+  if (fMixingBuffer) {
+    AliFemtoPicoEventIterator piter;
+    for (piter=fMixingBuffer->begin();piter!=fMixingBuffer->end();piter++){
+      delete *piter;
+    }
+    delete fMixingBuffer;
+  }
+}
+//______________________
+AliFemtoCorrFctn* AliFemtoAnalysis::CorrFctn(int n){  // return pointer to n-th correlation function
+  if ( n<0 || n > (int)fCorrFctnCollection->size() )
+    return NULL;
+  AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin();
+  for (int i=0; i<n ;i++){
+    iter++;
+  }
+  return *iter;
+}
+//____________________________
+AliFemtoString AliFemtoAnalysis::Report()
+{
+  cout << "AliFemtoAnalysis - constructing Report..."<<endl;
+  string temp = "-----------\nHbt Analysis Report:\n";
+  temp += "\nEvent Cuts:\n";
+  temp += fEventCut->Report();
+  temp += "\nParticle Cuts - First Particle:\n";
+  temp += fFirstParticleCut->Report();
+  temp += "\nParticle Cuts - Second Particle:\n";
+  temp += fSecondParticleCut->Report();
+  temp += "\nPair Cuts:\n";
+  temp += fPairCut->Report();
+  temp += "\nCorrelation Functions:\n";
+  AliFemtoCorrFctnIterator iter;
+  if ( fCorrFctnCollection->size()==0 ) {
+    cout << "AliFemtoAnalysis-Warning : no correlations functions in this analysis " << endl;
+  }
+  for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
+    temp += (*iter)->Report();
+    temp += "\n";
+  }
+  temp += "-------------\n";
+  AliFemtoString returnThis=temp;
+  return returnThis;
+}
+//_________________________
+void AliFemtoAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) {
+  // Add event to processed events
+  fPicoEvent=0; // we will get a new pico event, if not prevent corr. fctn to access old pico event
+  AddEventProcessed();
+  // startup for EbyE 
+  EventBegin(hbtEvent);  
+  // event cut and event cut monitor
+  bool tmpPassEvent = fEventCut->Pass(hbtEvent);
+  fEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
+  if (tmpPassEvent) {
+    cout << "AliFemtoAnalysis::ProcessEvent() - Event has passed cut - build picoEvent from " <<
+      hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
+    // OK, analysis likes the event-- build a pico event from it, using tracks the analysis likes...
+    fPicoEvent = new AliFemtoPicoEvent; // this is what we will make pairs from and put in Mixing Buffer
+    // no memory leak. we will delete picoevents when they come out of the mixing buffer
+    FillHbtParticleCollection(fFirstParticleCut,(AliFemtoEvent*)hbtEvent,fPicoEvent->FirstParticleCollection());
+    if ( !(AnalyzeIdenticalParticles()) )
+      FillHbtParticleCollection(fSecondParticleCut,(AliFemtoEvent*)hbtEvent,fPicoEvent->SecondParticleCollection());
+    cout <<"AliFemtoAnalysis::ProcessEvent - #particles in First, Second Collections: " <<
+      fPicoEvent->FirstParticleCollection()->size() << " " <<
+      fPicoEvent->SecondParticleCollection()->size() << endl;
+    
+    // mal - implement a switch which allows only using events with ParticleCollections containing a minimum
+    // number of entries (jun2002)
+    if ((fPicoEvent->FirstParticleCollection()->size() >= fMinSizePartCollection )
+       && ( AnalyzeIdenticalParticles() || (fPicoEvent->SecondParticleCollection()->size() >= fMinSizePartCollection ))) {
+
+
+//------------------------------------------------------------------------------
+//   Temporary comment:
+//      This whole section rewritten so that all pairs are built using the
+//      same code... easier to read and manage, and MakePairs() can be called by
+//      derived classes.  Also, the requirement of a full mixing buffer before
+//      mixing is removed.
+//                          Dan Magestro, 11/2002
+
+      //------ Make real pairs. If identical, make pairs for one collection ------//
+
+      if (AnalyzeIdenticalParticles()) {
+        MakePairs("real", fPicoEvent->FirstParticleCollection() );
+      }
+      else {
+        MakePairs("real", fPicoEvent->FirstParticleCollection(),
+                          fPicoEvent->SecondParticleCollection() );
+      }
+      cout << "AliFemtoAnalysis::ProcessEvent() - reals done ";
+
+      //---- Make pairs for mixed events, looping over events in mixingBuffer ----//
+
+      AliFemtoPicoEvent* storedEvent;
+      AliFemtoPicoEventIterator fPicoEventIter;
+      for (fPicoEventIter=MixingBuffer()->begin();fPicoEventIter!=MixingBuffer()->end();fPicoEventIter++){
+        storedEvent = *fPicoEventIter;
+        if (AnalyzeIdenticalParticles()) {
+          MakePairs("mixed",fPicoEvent->FirstParticleCollection(),
+                            storedEvent->FirstParticleCollection() );
+        }
+        else {
+          MakePairs("mixed",fPicoEvent->FirstParticleCollection(),
+                            storedEvent->SecondParticleCollection() );
+
+          MakePairs("mixed",storedEvent->FirstParticleCollection(),
+                            fPicoEvent->SecondParticleCollection() );
+        }
+      }
+      cout << " - mixed done   " << endl;
+
+      //--------- If mixing buffer is full, delete oldest event ---------//
+
+      if ( MixingBufferFull() ) {
+        delete MixingBuffer()->back();
+        MixingBuffer()->pop_back();
+      }
+
+      //-------- Add current event (fPicoEvent) to mixing buffer --------//
+
+      MixingBuffer()->push_front(fPicoEvent);
+
+
+// Temporary comment: End of rewritten section... Dan Magestro, 11/2002
+//------------------------------------------------------------------------------
+
+
+    }  // if ParticleCollections are big enough (mal jun2002)
+    else{
+      delete fPicoEvent;
+    }
+  }   // if currentEvent is accepted by currentAnalysis
+  EventEnd(hbtEvent);  // cleanup for EbyE 
+  //cout << "AliFemtoAnalysis::ProcessEvent() - return to caller ... " << endl;
+}
+//_________________________
+void AliFemtoAnalysis::MakePairs(const char* typeIn, AliFemtoParticleCollection *partCollection1,
+                                            AliFemtoParticleCollection *partCollection2){
+// Build pairs, check pair cuts, and call CFs' AddRealPair() or
+// AddMixedPair() methods. If no second particle collection is
+// specfied, make pairs within first particle collection.
+
+  string type = typeIn;
+
+  AliFemtoPair* ThePair = new AliFemtoPair;
+
+  AliFemtoCorrFctnIterator CorrFctnIter;
+
+  AliFemtoParticleIterator PartIter1, PartIter2;
+
+  AliFemtoParticleIterator StartOuterLoop = partCollection1->begin();  // always
+  AliFemtoParticleIterator EndOuterLoop   = partCollection1->end();    // will be one less if identical
+  AliFemtoParticleIterator StartInnerLoop;
+  AliFemtoParticleIterator EndInnerLoop;
+  if (partCollection2) {                        // Two collections:
+    StartInnerLoop = partCollection2->begin();  //   Full inner & outer loops
+    EndInnerLoop   = partCollection2->end();    //
+  }
+  else {                                        // One collection:
+    EndOuterLoop--;                             //   Outer loop goes to next-to-last particle
+    EndInnerLoop = partCollection1->end() ;     //   Inner loop goes to last particle
+  }
+  for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++) {
+    if (!partCollection2){
+      StartInnerLoop = PartIter1;
+      StartInnerLoop++;
+    }
+    ThePair->SetTrack1(*PartIter1);
+    for (PartIter2 = StartInnerLoop; PartIter2!=EndInnerLoop;PartIter2++) {
+      ThePair->SetTrack2(*PartIter2);
+
+      // The following lines have to be uncommented if you want pairCutMonitors
+      // they are not in for speed reasons
+      // bool tmpPassPair = fPairCut->Pass(ThePair);
+      // fPairCut->FillCutMonitor(ThePair, tmpPassPair);
+      // if ( tmpPassPair )
+
+      //---- If pair passes cut, loop over CF's and add pair to real/mixed ----//
+
+      if (fPairCut->Pass(ThePair)){
+        for (CorrFctnIter=fCorrFctnCollection->begin();
+             CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
+          AliFemtoCorrFctn* CorrFctn = *CorrFctnIter;
+          if(type == "real")
+            CorrFctn->AddRealPair(ThePair);
+         else if(type == "mixed")
+            CorrFctn->AddMixedPair(ThePair);
+          else
+            cout << "Problem with pair type, type = " << type.c_str() << endl;
+        }
+      }
+
+    }    // loop over second particle
+
+  }      // loop over first particle
+
+  delete ThePair;
+
+}
+//_________________________
+void AliFemtoAnalysis::EventBegin(const AliFemtoEvent* ev){
+  //cout << " AliFemtoAnalysis::EventBegin(const AliFemtoEvent* ev) " << endl;
+  fFirstParticleCut->EventBegin(ev);
+  fSecondParticleCut->EventBegin(ev);
+  fPairCut->EventBegin(ev);
+  for (AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
+    (*iter)->EventBegin(ev);
+  }
+}
+//_________________________
+void AliFemtoAnalysis::EventEnd(const AliFemtoEvent* ev){
+  fFirstParticleCut->EventEnd(ev);
+  fSecondParticleCut->EventEnd(ev);
+  fPairCut->EventEnd(ev);
+  for (AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
+    (*iter)->EventEnd(ev);
+  }
+}
+//_________________________
+void AliFemtoAnalysis::Finish(){
+  AliFemtoCorrFctnIterator iter;
+  for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
+    (*iter)->Finish();
+  }
+}
+//_________________________
+void AliFemtoAnalysis::AddEventProcessed() {
+  fNeventsProcessed++;
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.h b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoAnalysis.h
new file mode 100644 (file)
index 0000000..f709edf
--- /dev/null
@@ -0,0 +1,120 @@
+/**************************************************************************
+ AliFemtoAnalysis - the most basic analysis there is.
+ Most others (e.g. AliFemtoVertexAnalysis) wrap this one.
+**************************************************************************/
+
+#ifndef AliFemtoAnalysis_hh
+#define AliFemtoAnalysis_hh
+//#ifndef StMaker_H
+//#include "StMaker.h"
+//#endif
+
+#include "Base/AliFemtoBaseAnalysis.h"        // base analysis class
+#include "Base/AliFemtoPairCut.h"     
+#include "Base/AliFemtoEventCut.h"
+#include "Base/AliFemtoParticleCut.h"
+#include "Base/AliFemtoCorrFctn.h"
+#include "Infrastructure/AliFemtoCorrFctnCollection.h"
+#include "Infrastructure/AliFemtoPicoEventCollection.h"
+#include "Infrastructure/AliFemtoParticleCollection.h"
+#include "Infrastructure/AliFemtoPicoEvent.h"
+
+class AliFemtoPicoEventCollectionVectorHideAway;
+
+
+class AliFemtoAnalysis : public AliFemtoBaseAnalysis {
+
+ friend class AliFemtoLikeSignAnalysis;
+
+ public:
+  AliFemtoAnalysis();
+  AliFemtoAnalysis(const AliFemtoAnalysis& OriginalAnalysis);  // copy constructor
+  virtual ~AliFemtoAnalysis();
+
+  // Gets and Sets
+
+  virtual AliFemtoPairCut*       PairCut();
+  virtual AliFemtoEventCut*      EventCut();
+  virtual AliFemtoParticleCut*   FirstParticleCut();
+  virtual AliFemtoParticleCut*   SecondParticleCut();
+
+  AliFemtoCorrFctnCollection* CorrFctnCollection();
+  virtual AliFemtoCorrFctn* CorrFctn(int n);     // Access to CFs within the collection
+  void AddCorrFctn(AliFemtoCorrFctn* AnotherCorrFctn);
+
+  void SetPairCut(AliFemtoPairCut* ThePairCut);
+  void SetEventCut(AliFemtoEventCut* TheEventCut);
+  void SetFirstParticleCut(AliFemtoParticleCut* TheFirstParticleCut);
+  void SetSecondParticleCut(AliFemtoParticleCut* TheSecondParticleCut);
+
+  void SetMinSizePartCollection(unsigned int minSize);
+
+  unsigned int NumEventsToMix();
+  void SetNumEventsToMix(const unsigned int& NumberOfEventsToMix);
+  AliFemtoPicoEvent* CurrentPicoEvent();
+  AliFemtoPicoEventCollection* MixingBuffer();
+  bool MixingBufferFull();
+
+  bool AnalyzeIdenticalParticles();
+  virtual AliFemtoString Report();       //! returns reports of all cuts applied and correlation functions being done
+
+  virtual void EventBegin(const AliFemtoEvent* TheEventToBegin); // startup for EbyE
+  virtual void ProcessEvent(const AliFemtoEvent* EventToProcess);
+  virtual void EventEnd(const AliFemtoEvent* TheEventToWrapUp);   // cleanup for EbyE
+  int GetNeventsProcessed();
+
+  virtual void Finish();
+
+ protected:
+
+  void AddEventProcessed();
+  void MakePairs(const char* type, 
+                AliFemtoParticleCollection* ParticlesPassingCut1,
+                AliFemtoParticleCollection* ParticlesPssingCut2=0);
+
+  AliFemtoPicoEventCollectionVectorHideAway* fPicoEventCollectionVectorHideAway;  /* Mixing Buffer used for Analyses which wrap this one */
+
+  AliFemtoPairCut*             fPairCut;             /* cut applied to pairs */
+  AliFemtoCorrFctnCollection*  fCorrFctnCollection;  /* correlation functions of this analysis */
+  AliFemtoEventCut*            fEventCut;            /* cut to select events */
+  AliFemtoParticleCut*         fFirstParticleCut;    /* select particles of type #1 */
+  AliFemtoParticleCut*         fSecondParticleCut;   /* select particles of type #2 */
+  AliFemtoPicoEventCollection* fMixingBuffer;        /* mixing buffer used in this simplest analysis */
+  AliFemtoPicoEvent*           fPicoEvent;           /* The current event, in the small (pico) form */
+  unsigned int fNumEventsToMix;                      /* How many "previous" events get mixed with this one, to make background */
+  unsigned int fNeventsProcessed;                    /* How many events processed so far */
+
+  unsigned int fMinSizePartCollection;               /* Don't use event if it has fewer than this many particles passing ParticleCuts default 0*/
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoAnalysis, 0)
+#endif
+
+    };
+
+// Get's
+inline AliFemtoPairCut*             AliFemtoAnalysis::PairCut() {return fPairCut;}
+inline AliFemtoEventCut*            AliFemtoAnalysis::EventCut() {return fEventCut;}
+inline AliFemtoParticleCut*         AliFemtoAnalysis::FirstParticleCut() {return fFirstParticleCut;}
+inline AliFemtoParticleCut*         AliFemtoAnalysis::SecondParticleCut() {return fSecondParticleCut;}
+inline AliFemtoCorrFctnCollection*  AliFemtoAnalysis::CorrFctnCollection() {return fCorrFctnCollection;}
+inline unsigned int              AliFemtoAnalysis::NumEventsToMix(){return fNumEventsToMix;}
+inline AliFemtoPicoEvent*           AliFemtoAnalysis::CurrentPicoEvent() {return fPicoEvent;}
+
+inline AliFemtoPicoEventCollection*  AliFemtoAnalysis::MixingBuffer() {return fMixingBuffer;}
+
+// Set's
+inline bool AliFemtoAnalysis::AnalyzeIdenticalParticles(){return (fFirstParticleCut==fSecondParticleCut);}
+inline void AliFemtoAnalysis::SetPairCut(AliFemtoPairCut* x) { fPairCut = x; x->SetAnalysis((AliFemtoBaseAnalysis*)this);}
+inline void AliFemtoAnalysis::AddCorrFctn(AliFemtoCorrFctn* cf) {fCorrFctnCollection->push_back(cf); cf->SetAnalysis((AliFemtoBaseAnalysis*)this);}
+inline void AliFemtoAnalysis::SetEventCut(AliFemtoEventCut* x) {fEventCut = x; x->SetAnalysis((AliFemtoBaseAnalysis*)this);}
+inline void AliFemtoAnalysis::SetFirstParticleCut(AliFemtoParticleCut* x) {fFirstParticleCut = x; x->SetAnalysis((AliFemtoBaseAnalysis*)this);}
+inline void AliFemtoAnalysis::SetSecondParticleCut(AliFemtoParticleCut* x) {fSecondParticleCut = x; x->SetAnalysis((AliFemtoBaseAnalysis*)this);}
+
+inline void AliFemtoAnalysis::SetNumEventsToMix(const unsigned int& nmix){ fNumEventsToMix = nmix;}
+inline bool AliFemtoAnalysis::MixingBufferFull(){return (fMixingBuffer->size() >= fNumEventsToMix);}
+inline int AliFemtoAnalysis::GetNeventsProcessed() {return fNeventsProcessed;}
+
+inline void AliFemtoAnalysis::SetMinSizePartCollection(unsigned int minSize){fMinSizePartCollection = minSize;}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.cxx b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.cxx
new file mode 100644 (file)
index 0000000..1471dfe
--- /dev/null
@@ -0,0 +1,275 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, Ohio State, Laue@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *      This is the Class for Analysis objects.  Each of the simultaneous
+ *      Analyses running should have one of these instantiated.  They link
+ *      into the Manager in an Analysis Collection.
+ *
+ ***************************************************************************/
+
+#include "Analysis/AliFemtoLikeSignAnalysis.h"
+#include "Infrastructure/AliFemtoParticleCollection.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVector.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVectorHideAway.h"
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoLikeSignAnalysis)
+#endif
+
+// this little function used to apply ParticleCuts (TrackCuts or V0Cuts) and fill ParticleCollections of picoEvent
+//  it is called from AliFemtoAnalysis::ProcessEvent()
+
+
+extern void FillHbtParticleCollection(AliFemtoParticleCut*         partCut,
+                                    AliFemtoEvent*               hbtEvent,
+                                    AliFemtoParticleCollection*  partCollection);
+
+//____________________________
+AliFemtoLikeSignAnalysis::AliFemtoLikeSignAnalysis(unsigned int bins, double min, double max) : AliFemtoAnalysis() {
+  fVertexBins = bins;
+  fVertexZ[0] = min;
+  fVertexZ[1] = max;
+  fUnderFlow = 0; 
+  fOverFlow = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexBins,fVertexZ[0],fVertexZ[1]);
+    /* no-op */
+}
+//____________________________
+AliFemtoLikeSignAnalysis::AliFemtoLikeSignAnalysis(const AliFemtoLikeSignAnalysis& a) : AliFemtoAnalysis(a) {
+  fVertexBins = a.fVertexBins; 
+  fVertexZ[0] = a.fVertexZ[0]; 
+  fVertexZ[1] = a.fVertexZ[1];
+  fUnderFlow = 0; 
+  fOverFlow = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexBins,fVertexZ[0],fVertexZ[1]);
+ }
+//____________________________ 
+AliFemtoLikeSignAnalysis::~AliFemtoLikeSignAnalysis(){
+  delete fPicoEventCollectionVectorHideAway; fPicoEventCollectionVectorHideAway=0;
+}
+//____________________________
+AliFemtoString AliFemtoLikeSignAnalysis::Report()
+{  
+  char Ctemp[200];
+  cout << "AliFemtoLikeSignAnalysis - constructing Report..."<<endl;
+  AliFemtoString temp = "-----------\nHbt Analysis Report:\n";
+  sprintf(Ctemp,"Events are mixed in %d bins in the range %E cm to %E cm.\n",fVertexBins,fVertexZ[0],fVertexZ[1]);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events underflowing: %d\n",fUnderFlow);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events overflowing: %d\n",fOverFlow);
+  temp += Ctemp;
+  sprintf(Ctemp,"Now adding AliFemtoAnalysis(base) Report\n");
+  temp += Ctemp; 
+  temp += "Adding AliFemtoAnalysis(base) Report now:\n";
+  temp += AliFemtoAnalysis::Report();
+  temp += "-------------\n";
+  AliFemtoString returnThis=temp;
+  return returnThis;
+}
+//_________________________
+void AliFemtoLikeSignAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) {
+  // get right mixing buffer
+  double vertexZ = hbtEvent->PrimVertPos().z();
+  fMixingBuffer = fPicoEventCollectionVectorHideAway->PicoEventCollection(vertexZ); 
+  if (!fMixingBuffer) {
+    if ( vertexZ < fVertexZ[0] ) fUnderFlow++;
+    if ( vertexZ > fVertexZ[1] ) fOverFlow++;
+    return;
+  }
+
+  // startup for EbyE 
+  EventBegin(hbtEvent);  
+  // event cut and event cut monitor
+  bool tmpPassEvent = fEventCut->Pass(hbtEvent);
+  fEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
+  if (tmpPassEvent) {
+      fNeventsProcessed++;
+      cout << "AliFemtoLikeSignAnalysis::ProcessEvent() - " << hbtEvent->TrackCollection()->size();
+      cout << " #track=" << hbtEvent->TrackCollection()->size();
+      // OK, analysis likes the event-- build a pico event from it, using tracks the analysis likes...
+      AliFemtoPicoEvent* picoEvent = new AliFemtoPicoEvent;       // this is what we will make pairs from and put in Mixing Buffer
+      FillHbtParticleCollection(fFirstParticleCut,(AliFemtoEvent*)hbtEvent,picoEvent->FirstParticleCollection());
+      if ( !(AnalyzeIdenticalParticles()) )
+       FillHbtParticleCollection(fSecondParticleCut,(AliFemtoEvent*)hbtEvent,picoEvent->SecondParticleCollection());
+      cout <<"   #particles in First, Second Collections: " <<
+       picoEvent->FirstParticleCollection()->size() << " " <<
+       picoEvent->SecondParticleCollection()->size() << endl;
+      
+      if (picoEvent->SecondParticleCollection()->size()*picoEvent->FirstParticleCollection()->size()==0) {
+       delete picoEvent;
+       cout << "AliFemtoLikeSignAnalysis - picoEvent deleted due to empty collection " <<endl; 
+       return;
+      }
+      // OK, pico event is built
+      // make real pairs...
+      
+      // Fabrice points out that we do not need to keep creating/deleting pairs all the time
+      // We only ever need ONE pair, and we can just keep changing internal pointers
+      // this should help speed things up
+      AliFemtoPair* ThePair = new AliFemtoPair;
+      
+      AliFemtoParticleIterator PartIter1;
+      AliFemtoParticleIterator PartIter2;
+      AliFemtoCorrFctnIterator CorrFctnIter;
+      AliFemtoParticleIterator StartOuterLoop = picoEvent->FirstParticleCollection()->begin();  // always
+      AliFemtoParticleIterator EndOuterLoop   = picoEvent->FirstParticleCollection()->end();    // will be one less if identical
+      AliFemtoParticleIterator StartInnerLoop;
+      AliFemtoParticleIterator EndInnerLoop;
+      if (AnalyzeIdenticalParticles()) {             // only use First collection
+       EndOuterLoop--;                                               // outer loop goes to next-to-last particle in First collection
+       EndInnerLoop = picoEvent->FirstParticleCollection()->end() ;  // inner loop goes to last particle in First collection
+      }
+      else {                                                          // nonidentical - loop over First and Second collections
+       StartInnerLoop = picoEvent->SecondParticleCollection()->begin(); // inner loop starts at first particle in Second collection
+       EndInnerLoop   = picoEvent->SecondParticleCollection()->end() ;  // inner loop goes to last particle in Second collection
+      }
+      // real pairs
+      for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
+       if (AnalyzeIdenticalParticles()){
+         StartInnerLoop = PartIter1;
+         StartInnerLoop++;
+       }
+       ThePair->SetTrack1(*PartIter1);
+       for (PartIter2 = StartInnerLoop; PartIter2!=EndInnerLoop;PartIter2++){
+         ThePair->SetTrack2(*PartIter2);
+         // The following lines have to be uncommented if you want pairCutMonitors
+         // they are not in for speed reasons
+         // bool tmpPassPair = mPairCut->Pass(ThePair);
+          // mPairCut->FillCutMonitor(ThePair, tmpPassPair);
+         // if ( tmpPassPair ) {
+         if (fPairCut->Pass(ThePair)){
+           for (CorrFctnIter=fCorrFctnCollection->begin();
+                CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
+             AliFemtoLikeSignCorrFctn* CorrFctn = dynamic_cast<AliFemtoLikeSignCorrFctn*>(*CorrFctnIter);
+             if (CorrFctn) CorrFctn->AddRealPair(ThePair);
+           }
+         }  // if passed pair cut
+       }    // loop over second particle
+      }      // loop over first particle
+#ifdef STHBTDEBUG
+      cout << "AliFemtoLikeSignAnalysis::ProcessEvent() - reals done" << endl;
+#endif
+
+      AliFemtoParticleIterator nextIter;
+      AliFemtoParticleIterator prevIter;
+
+      // like sign first partilce collection pairs
+      prevIter = EndOuterLoop;
+      prevIter--;
+      for (PartIter1=StartOuterLoop;PartIter1!=prevIter;PartIter1++){
+       ThePair->SetTrack1(*PartIter1);
+       nextIter = PartIter1;
+       nextIter++;
+       for (PartIter2 = nextIter; PartIter2!=EndOuterLoop;PartIter2++){
+         ThePair->SetTrack2(*PartIter2);
+         // The following lines have to be uncommented if you want pairCutMonitors
+         // they are not in for speed reasons
+         // bool tmpPassPair = mPairCut->Pass(ThePair);
+          // mPairCut->FillCutMonitor(ThePair, tmpPassPair);
+         // if ( tmpPassPair ) {
+         if (fPairCut->Pass(ThePair)){
+           for (CorrFctnIter=fCorrFctnCollection->begin();
+                CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
+             AliFemtoLikeSignCorrFctn* CorrFctn = dynamic_cast<AliFemtoLikeSignCorrFctn*>(*CorrFctnIter);
+             if (CorrFctn) CorrFctn->AddLikeSignPositivePair(ThePair);
+           }
+         }  // if passed pair cut
+       }    // loop over second particle
+      }      // loop over first particle
+#ifdef STHBTDEBUG
+      cout << "AliFemtoLikeSignAnalysis::ProcessEvent() - like sign first collection done" << endl;
+#endif
+      // like sign second partilce collection pairs
+      prevIter = EndInnerLoop;
+      prevIter--;
+      for (PartIter1=StartInnerLoop;PartIter1!=prevIter;PartIter1++){
+       ThePair->SetTrack1(*PartIter1);
+       nextIter = PartIter1;
+       nextIter++;
+       for (PartIter2 = nextIter; PartIter2!=EndInnerLoop;PartIter2++){
+         ThePair->SetTrack2(*PartIter2);
+         // The following lines have to be uncommented if you want pairCutMonitors
+         // they are not in for speed reasons
+         // bool tmpPassPair = mPairCut->Pass(ThePair);
+          // mPairCut->FillCutMonitor(ThePair, tmpPassPair);
+         // if ( tmpPassPair ) {
+         if (fPairCut->Pass(ThePair)){
+           for (CorrFctnIter=fCorrFctnCollection->begin();
+                CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
+             AliFemtoLikeSignCorrFctn* CorrFctn = dynamic_cast<AliFemtoLikeSignCorrFctn*>(*CorrFctnIter);
+             if (CorrFctn) CorrFctn->AddLikeSignNegativePair(ThePair);
+           }
+         }  // if passed pair cut
+       }    // loop over second particle
+      }      // loop over first particle
+#ifdef STHBTDEBUG
+      cout << "AliFemtoLikeSignAnalysis::ProcessEvent() - like sign second collection done" << endl;
+#endif
+      
+      if (MixingBufferFull()){
+#ifdef STHBTDEBUG
+       cout << "Mixing Buffer is full - lets rock and roll" << endl;
+#endif
+      }
+      else {
+       cout << "Mixing Buffer not full -gotta wait " << MixingBuffer()->size() << endl;
+      }
+      if (MixingBufferFull()){
+       StartOuterLoop = picoEvent->FirstParticleCollection()->begin();
+       EndOuterLoop   = picoEvent->FirstParticleCollection()->end();
+       AliFemtoPicoEvent* storedEvent;
+       AliFemtoPicoEventIterator picoEventIter;
+       for (picoEventIter=MixingBuffer()->begin();picoEventIter!=MixingBuffer()->end();picoEventIter++){
+         storedEvent = *picoEventIter;
+         if (AnalyzeIdenticalParticles()){
+           StartInnerLoop = storedEvent->FirstParticleCollection()->begin();
+           EndInnerLoop = storedEvent->FirstParticleCollection()->end();
+         }
+         else{
+           StartInnerLoop = storedEvent->SecondParticleCollection()->begin();
+           EndInnerLoop = storedEvent->SecondParticleCollection()->end();
+         }
+         for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
+           ThePair->SetTrack1(*PartIter1);
+           for (PartIter2=StartInnerLoop;PartIter2!=EndInnerLoop;PartIter2++){
+             ThePair->SetTrack2(*PartIter2);
+             // testing...           cout << "ThePair defined... going to pair cut... ";
+             if (fPairCut->Pass(ThePair)){
+               // testing...           cout << " ThePair passed PairCut... ";
+               for (CorrFctnIter=fCorrFctnCollection->begin();
+                    CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
+                 AliFemtoLikeSignCorrFctn* CorrFctn = dynamic_cast<AliFemtoLikeSignCorrFctn*>(*CorrFctnIter);
+                 if (CorrFctn) { 
+                   CorrFctn->AddMixedPair(ThePair);
+                   //cout << " ThePair has been added to MixedPair method " << endl;
+                 }
+               }
+             }  // if passed pair cut
+           }    // loop over second particle
+         }      // loop over first particle
+       }        // loop over pico-events stored in Mixing buffer
+       // Now get rid of oldest stored pico-event in buffer.
+       // This means (1) delete the event from memory, (2) "pop" the pointer to it from the MixingBuffer
+       delete MixingBuffer()->back();
+       MixingBuffer()->pop_back();
+      }  // if mixing buffer is full
+      delete ThePair;
+      MixingBuffer()->push_front(picoEvent);  // store the current pico-event in buffer
+    }   // if currentEvent is accepted by currentAnalysis
+    EventEnd(hbtEvent);  // cleanup for EbyE 
+    //    cout << "AliFemtoLikeSignAnalysis::ProcessEvent() - return to caller ... " << endl;
+}
+
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.h b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoLikeSignAnalysis.h
new file mode 100644 (file)
index 0000000..34c366c
--- /dev/null
@@ -0,0 +1,50 @@
+/***************************************************************************
+ *      This is an analysis which calculated the background from like sign
+ *      pairs in the same event
+ *      Frank Laue, Ohio State, 2000
+ ***************************************************************************/
+
+
+#ifndef AliFemtoLikeSignAnalysis_hh
+#define AliFemtoLikeSignAnalysis_hh
+//#ifndef StMaker_H
+//#include "StMaker.h"
+//#endif
+
+#include "Base/AliFemtoBaseAnalysis.h"        // base analysis class
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Base/AliFemtoEventCut.h"             // base class 
+#include "Base/AliFemtoParticleCut.h"          // base class
+#include "Base/AliFemtoPairCut.h"              // base class
+#include "Base/AliFemtoLikeSignCorrFctn.h"    // base class
+#include "Analysis/AliFemtoAnalysis.h"
+#include "Infrastructure/AliFemtoCorrFctnCollection.h"
+
+
+class AliFemtoLikeSignAnalysis : public AliFemtoAnalysis {
+
+public: 
+
+  AliFemtoLikeSignAnalysis(unsigned int bins=20, double min=-100., double max=100.);
+  AliFemtoLikeSignAnalysis(const AliFemtoLikeSignAnalysis& OriginalAnalysis);  // copy constructor
+  virtual ~AliFemtoLikeSignAnalysis();
+
+  virtual void ProcessEvent(const AliFemtoEvent* TheEventToBeProcessed);
+  virtual AliFemtoString Report();
+  virtual unsigned int Overflow() { return fOverFlow;}
+  virtual unsigned int Underflow() { return fUnderFlow;}
+
+protected:
+  double fVertexZ[2];           /* min/max z-vertex position allowed to be processed */
+  unsigned int fVertexBins;     /* number of mixing bins in z-vertex in EventMixing Buffer */
+  unsigned int fOverFlow;       /* number of events encountered which had too large z-vertex */
+  unsigned int fUnderFlow;      /* number of events encountered which had too small z-vertex */
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoLikeSignAnalysis, 0)
+#endif
+
+};
+
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.cxx b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.cxx
new file mode 100644 (file)
index 0000000..cd50d69
--- /dev/null
@@ -0,0 +1,166 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, Ohio State, laue@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *      This is the Class for Analysis objects.  Each of the simultaneous
+ *      Analyses running should have one of these instantiated.  They link
+ *      into the Manager in an Analysis Collection.
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.5  2001/05/25 23:24:00  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * Revision 1.4  2000/08/31 22:31:32  laue
+ * AliFemtoAnalysis: output changed (a little bit less)
+ * AliFemtoEvent: new version, members for reference mult added
+ * AliFemtoIOBinary: new IO for new AliFemtoEvent version
+ * AliFemtoTypes: TTree typedef to AliFemtoTTree added
+ * AliFemtoVertexAnalysis: overflow and underflow added
+ *
+ * Revision 1.1  2000/07/16 21:44:11  laue
+ * Collection and analysis for vertex dependent event mixing
+ *
+ *
+ **************************************************************************/
+
+#include "Analysis/AliFemtoVertexAnalysis.h"
+#include "Infrastructure/AliFemtoParticleCollection.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Base/AliFemtoKinkCut.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVector.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVectorHideAway.h"
+
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoVertexAnalysis)
+#endif
+
+extern void FillHbtParticleCollection(AliFemtoParticleCut*         partCut,
+                                    AliFemtoEvent*               hbtEvent,
+                                    AliFemtoParticleCollection*  partCollection);
+
+
+//____________________________
+AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(unsigned int bins, double min, double max){
+  //  mControlSwitch     = 0;
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fVertexBins = bins;
+  fVertexZ[0] = min;
+  fVertexZ[1] = max;
+  fUnderFlow = 0; 
+  fOverFlow = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexBins,fVertexZ[0],fVertexZ[1]);
+};
+//____________________________
+
+AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) : AliFemtoAnalysis() {
+  //AliFemtoVertexAnalysis();
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fVertexBins = a.fVertexBins; 
+  fVertexZ[0] = a.fVertexZ[0]; 
+  fVertexZ[1] = a.fVertexZ[1];
+  fUnderFlow = 0; 
+  fOverFlow = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexBins,fVertexZ[0],fVertexZ[1]);
+
+  // find the right event cut
+  fEventCut = a.fEventCut->Clone();
+  // find the right first particle cut
+  fFirstParticleCut = a.fFirstParticleCut->Clone();
+  // find the right second particle cut
+  if (a.fFirstParticleCut==a.fSecondParticleCut) 
+    SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
+  else
+  fSecondParticleCut = a.fSecondParticleCut->Clone();
+
+  fPairCut = a.fPairCut->Clone();
+  
+  if ( fEventCut ) {
+      SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - event cut set " << endl;
+  }
+  if ( fFirstParticleCut ) {
+      SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - first particle cut set " << endl;
+  }
+  if ( fSecondParticleCut ) {
+      SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - second particle cut set " << endl;
+  }  if ( fPairCut ) {
+      SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - pair cut set " << endl;
+  }
+
+  AliFemtoCorrFctnIterator iter;
+  for (iter=a.fCorrFctnCollection->begin(); iter!=a.fCorrFctnCollection->end();iter++){
+    cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - looking for correlation functions " << endl;
+    AliFemtoCorrFctn* fctn = (*iter)->Clone();
+    if (fctn) AddCorrFctn(fctn);
+    else cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - correlation function not found " << endl;
+  }
+
+  fNumEventsToMix = a.fNumEventsToMix;
+
+  cout << " AliFemtoVertexAnalysis::AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& a) - analysis copied " << endl;
+
+}
+//____________________________
+AliFemtoVertexAnalysis::~AliFemtoVertexAnalysis(){
+  // now delete every PicoEvent in the EventMixingBuffer and then the Buffer itself
+  delete fPicoEventCollectionVectorHideAway;
+}
+
+//____________________________
+AliFemtoString AliFemtoVertexAnalysis::Report()
+{
+  cout << "AliFemtoVertexAnalysis - constructing Report..."<<endl;
+  char Ctemp[200];
+  AliFemtoString temp = "-----------\nHbt AliFemtoVertexAnalysis Report:\n";
+  sprintf(Ctemp,"Events are mixed in %d bins in the range %E cm to %E cm.\n",fVertexBins,fVertexZ[0],fVertexZ[1]);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events underflowing: %d\n",fUnderFlow);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events overflowing: %d\n",fOverFlow);
+  temp += Ctemp;
+  sprintf(Ctemp,"Now adding AliFemtoAnalysis(base) Report\n");
+  temp += Ctemp;
+  temp += AliFemtoAnalysis::Report();
+  AliFemtoString returnThis=temp;
+  return returnThis;
+}
+//_________________________
+void AliFemtoVertexAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) {
+  cout << " AliFemtoVertexAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) " << endl;
+  // get right mixing buffer
+  double vertexZ = hbtEvent->PrimVertPos().z();
+  fMixingBuffer = fPicoEventCollectionVectorHideAway->PicoEventCollection(vertexZ); 
+  if (!fMixingBuffer) {
+    if ( vertexZ < fVertexZ[0] ) fUnderFlow++;
+    if ( vertexZ > fVertexZ[1] ) fOverFlow++;
+    return;
+  }
+  // call ProcessEvent() from AliFemtoAnalysis-base
+  AliFemtoAnalysis::ProcessEvent(hbtEvent);
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.h b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexAnalysis.h
new file mode 100644 (file)
index 0000000..f79a51b
--- /dev/null
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Collection and analysis for vertex dependent event mixing
+ * Frank Laue, Ohio State, 2000
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoVertexAnalysis_hh
+#define AliFemtoVertexAnalysis_hh
+
+#include "Analysis/AliFemtoAnalysis.h"        // base analysis class
+
+class AliFemtoVertexAnalysis : public AliFemtoAnalysis {
+
+public:
+
+  AliFemtoVertexAnalysis(unsigned int =10, double =-100., double=+100.);
+  AliFemtoVertexAnalysis(const AliFemtoVertexAnalysis& OriginalAnalysis);  // copy constructor
+  virtual void ProcessEvent(const AliFemtoEvent* ProcessThisEvent);
+  virtual ~AliFemtoVertexAnalysis();
+  virtual AliFemtoString Report();       //! returns reports of all cuts applied and correlation functions being done
+  virtual unsigned int Overflow() { return fOverFlow;}
+  virtual unsigned int Underflow() { return fUnderFlow;}
+protected:
+  double fVertexZ[2];            /* min/max z-vertex position allowed to be processed */
+  unsigned int fVertexBins;      /* number of mixing bins in z-vertex in EventMixing Buffer */
+  unsigned int fOverFlow;        /* number of events encountered which had too large z-vertex */
+  unsigned int fUnderFlow;       /* number of events encountered which had too small z-vertex */
+  
+#ifdef __ROOT__
+  ClassDef(AliFemtoVertexAnalysis, 0)
+#endif
+    
+};
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.cxx b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.cxx
new file mode 100644 (file)
index 0000000..f6cc2d9
--- /dev/null
@@ -0,0 +1,188 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, Ohio State, laue@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *      This is the Class for Analysis objects.  Each of the simultaneous
+ *      Analyses running should have one of these instantiated.  They link
+ *      into the Manager in an Analysis Collection.
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.2  2005/06/28 23:12:24  chajecki
+ * UncorrectedNumberOfNegativePrimaries() -> UncorrectedNumberOfPrimaries()
+ *
+ * For data taken in Y2 and later the centrality definition bases
+ * on UncorrectedNumberOfPrimaries() while for Y1(AuAu@130)
+ * it based on UncorrectedNumberOfNegativePrimaries().
+ * But in many places of HBT code the number of negative primaries
+ * was used as a multiplicity for all productions.
+ * This has been fixed.
+ *
+ * Revision 1.1  2001/11/11 18:34:14  laue
+ * AliFemtoPicoEventCollectionVectorHideAway: updated for 3d grid
+ * AliFemtoVertexMultAnalysis: new
+ *
+ *
+ **************************************************************************/
+
+#include "Analysis/AliFemtoVertexMultAnalysis.h"
+#include "Infrastructure/AliFemtoParticleCollection.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Base/AliFemtoKinkCut.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVector.h"
+#include "Infrastructure/AliFemtoPicoEventCollectionVectorHideAway.h"
+
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoVertexMultAnalysis)
+#endif
+
+extern void FillHbtParticleCollection(AliFemtoParticleCut*         partCut,
+                                    AliFemtoEvent*               hbtEvent,
+                                    AliFemtoParticleCollection*  partCollection);
+
+
+//____________________________
+AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(unsigned int binsVertex, double minVertex, double maxVertex,
+                                                unsigned int binsMult, double minMult, double maxMult) 
+  : fVertexZBins(binsVertex), fMultBins(binsMult) {
+  //  mControlSwitch     = 0;
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fVertexZ[0] = minVertex;
+  fVertexZ[1] = maxVertex;
+  fUnderFlowVertexZ = 0; 
+  fOverFlowVertexZ = 0; 
+  fMult[0] = minMult;
+  fMult[1] = maxMult;
+  fUnderFlowMult = 0; 
+  fOverFlowMult = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexZBins,fVertexZ[0],fVertexZ[1],
+                                                                                 fMultBins,fMult[0],fMult[1]);
+};
+//____________________________
+
+AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) : AliFemtoAnalysis() {
+  //AliFemtoVertexMultAnalysis();
+  fEventCut          = 0;
+  fFirstParticleCut  = 0;
+  fSecondParticleCut = 0;
+  fPairCut           = 0;
+  fCorrFctnCollection= 0;
+  fCorrFctnCollection = new AliFemtoCorrFctnCollection;
+  fVertexZBins = a.fVertexZBins; 
+  fVertexZ[0] = a.fVertexZ[0]; 
+  fVertexZ[1] = a.fVertexZ[1];
+  fUnderFlowVertexZ = 0; 
+  fOverFlowVertexZ = 0; 
+  fMultBins = a.fMultBins; 
+  fMult[0] = a.fMult[0]; 
+  fMult[1] = a.fMult[1];
+  fUnderFlowMult = 0; 
+  fOverFlowMult = 0; 
+  if (fMixingBuffer) delete fMixingBuffer;
+  fPicoEventCollectionVectorHideAway = new AliFemtoPicoEventCollectionVectorHideAway(fVertexZBins,fVertexZ[0],fVertexZ[1],
+                                                                                 fMultBins,fMult[0],fMult[1]);
+
+  // find the right event cut
+  fEventCut = a.fEventCut->Clone();
+  // find the right first particle cut
+  fFirstParticleCut = a.fFirstParticleCut->Clone();
+  // find the right second particle cut
+  if (a.fFirstParticleCut==a.fSecondParticleCut) 
+    SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
+  else
+  fSecondParticleCut = a.fSecondParticleCut->Clone();
+
+  fPairCut = a.fPairCut->Clone();
+  
+  if ( fEventCut ) {
+      SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - event cut set " << endl;
+  }
+  if ( fFirstParticleCut ) {
+      SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - first particle cut set " << endl;
+  }
+  if ( fSecondParticleCut ) {
+      SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - second particle cut set " << endl;
+  }  if ( fPairCut ) {
+      SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
+      cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - pair cut set " << endl;
+  }
+
+  AliFemtoCorrFctnIterator iter;
+  for (iter=a.fCorrFctnCollection->begin(); iter!=a.fCorrFctnCollection->end();iter++){
+    cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - looking for correlation functions " << endl;
+    AliFemtoCorrFctn* fctn = (*iter)->Clone();
+    if (fctn) AddCorrFctn(fctn);
+    else cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - correlation function not found " << endl;
+  }
+
+  fNumEventsToMix = a.fNumEventsToMix;
+
+  cout << " AliFemtoVertexMultAnalysis::AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& a) - analysis copied " << endl;
+
+}
+//____________________________
+AliFemtoVertexMultAnalysis::~AliFemtoVertexMultAnalysis(){
+  // now delete every PicoEvent in the EventMixingBuffer and then the Buffer itself
+  delete fPicoEventCollectionVectorHideAway;
+}
+
+//____________________________
+AliFemtoString AliFemtoVertexMultAnalysis::Report()
+{
+  cout << "AliFemtoVertexMultAnalysis - constructing Report..."<<endl;
+  char Ctemp[200];
+  AliFemtoString temp = "-----------\nHbt AliFemtoVertexMultAnalysis Report:\n";
+  sprintf(Ctemp,"Events are mixed in %d VertexZ bins in the range %E cm to %E cm.\n",fVertexZBins,fVertexZ[0],fVertexZ[1]);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events underflowing: %d\n",fUnderFlowVertexZ);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events overflowing: %d\n",fOverFlowVertexZ);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events are mixed in %d Mult bins in the range %E cm to %E cm.\n",fMultBins,fMult[0],fMult[1]);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events underflowing: %d\n",fUnderFlowMult);
+  temp += Ctemp;
+  sprintf(Ctemp,"Events overflowing: %d\n",fOverFlowMult);
+  temp += Ctemp;
+  sprintf(Ctemp,"Now adding AliFemtoAnalysis(base) Report\n");
+  temp += Ctemp;
+  temp += AliFemtoAnalysis::Report();
+  AliFemtoString returnThis=temp;
+  return returnThis;
+}
+//_________________________
+void AliFemtoVertexMultAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) {
+  cout << " AliFemtoVertexMultAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) " << endl;
+  // get right mixing buffer
+  double vertexZ = hbtEvent->PrimVertPos().z();
+  double mult = hbtEvent->UncorrectedNumberOfPrimaries();
+  fMixingBuffer = fPicoEventCollectionVectorHideAway->PicoEventCollection(vertexZ,mult); 
+  if (!fMixingBuffer) {
+    if ( vertexZ < fVertexZ[0] ) fUnderFlowVertexZ++;
+    if ( vertexZ > fVertexZ[1] ) fOverFlowVertexZ++;
+    if ( mult < fMult[0] ) fUnderFlowMult++;
+    if ( mult > fMult[1] ) fOverFlowMult++;
+    return;
+  }
+  // call ProcessEvent() from AliFemtoAnalysis-base
+  AliFemtoAnalysis::ProcessEvent(hbtEvent);
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.h b/PWG2/FEMTOSCOPY/AliFemto/Analysis/AliFemtoVertexMultAnalysis.h
new file mode 100644 (file)
index 0000000..bf75f8b
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Frank Laue, Ohio State, 2001
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoVertexMultAnalysis_hh
+#define AliFemtoVertexMultAnalysis_hh
+
+#include "Analysis/AliFemtoAnalysis.h"        // base analysis class
+#include <limits.h>
+
+class AliFemtoVertexMultAnalysis : public AliFemtoAnalysis {
+
+public:
+
+  AliFemtoVertexMultAnalysis(unsigned int=10, double=-100., double=+100., unsigned int b=10, double=-1.e9, double=+1.e9);
+  AliFemtoVertexMultAnalysis(const AliFemtoVertexMultAnalysis& TheOriginalAnalysis);  // copy constructor
+  virtual void ProcessEvent(const AliFemtoEvent* ProcessThisEvent);
+  virtual ~AliFemtoVertexMultAnalysis();
+  virtual AliFemtoString Report();       //! returns reports of all cuts applied and correlation functions being done
+  virtual unsigned int OverflowVertexZ() { return fOverFlowVertexZ;}
+  virtual unsigned int UnderflowVertexZ() { return fUnderFlowVertexZ;}
+  virtual unsigned int OverflowMult() { return fOverFlowMult;}
+  virtual unsigned int UnderflowMult() { return fUnderFlowMult;}
+protected:
+  double fVertexZ[2];                 /* min/max z-vertex position allowed to be processed */
+  unsigned int fVertexZBins;          /* number of VERTEX mixing bins in z-vertex in EventMixing Buffer */
+  unsigned int fOverFlowVertexZ;      /* number of events encountered which had too large z-vertex */
+  unsigned int fUnderFlowVertexZ;     /* number of events encountered which had too small z-vertex */
+  double fMult[2];                    /* min/max multiplicity allowed for event to be processed */
+  unsigned int fMultBins;             /* number of MULTIPLICITY mixing bins in z-vertex in EventMixing Buffer */
+  unsigned int fOverFlowMult;         /* number of events encountered which had too large multiplicity */
+  unsigned int fUnderFlowMult;        /* number of events encountered which had too small multiplicity */
+  
+#ifdef __ROOT__
+  ClassDef(AliFemtoVertexMultAnalysis, 0)
+#endif
+    
+};
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoBaseAnalysis.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoBaseAnalysis.h
new file mode 100644 (file)
index 0000000..5b0c7ee
--- /dev/null
@@ -0,0 +1,31 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoBaseAnalysis - the pure virtual base class for femto analysis    ///
+/// All analysis classes must inherit from this one                          ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoBaseAnalysis_hh
+#define AliFemtoBaseAnalysis_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+
+class AliFemtoEvent;
+
+class AliFemtoBaseAnalysis{
+
+public:
+
+  AliFemtoBaseAnalysis() { /* noop */ };
+  virtual ~AliFemtoBaseAnalysis() { /* noop */ };
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoBaseAnalysis, 0)
+#endif 
+  
+  virtual AliFemtoString Report() = 0;       //! returns reports of all cuts applied and correlation functions being done
+
+  virtual void ProcessEvent(const AliFemtoEvent* aEventToAnalyze) = 0;
+
+  virtual void Finish() = 0;
+
+};
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCorrFctn.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCorrFctn.h
new file mode 100644 (file)
index 0000000..6dfbcf2
--- /dev/null
@@ -0,0 +1,48 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoCorrFctn - the pure virtual base class for correlation function  ///
+/// All correlation function classes must inherit from this one              ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoCorrFctn_hh
+#define AliFemtoCorrFctn_hh
+
+#include "Base/AliFemtoBaseAnalysis.h"
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Infrastructure/AliFemtoPair.h"
+
+class AliFemtoCorrFctn{
+
+  friend class AliFemtoBaseAnalysis;
+
+public:
+  AliFemtoCorrFctn(){/* no-op */};
+  AliFemtoCorrFctn(const AliFemtoCorrFctn& aCorrFctn);
+  virtual ~AliFemtoCorrFctn(){/* no-op */};
+
+  virtual AliFemtoString Report() = 0;
+
+  virtual void AddRealPair(const AliFemtoPair* aPair);
+  virtual void AddMixedPair(const AliFemtoPair* aPir);
+
+  virtual void EventBegin(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void EventEnd(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void Finish() = 0;
+
+  virtual AliFemtoCorrFctn* Clone() { return 0;}
+
+  AliFemtoBaseAnalysis* HbtAnalysis(){return fyAnalysis;};
+  void SetAnalysis(AliFemtoBaseAnalysis* aAnalysis);
+
+protected:
+  AliFemtoBaseAnalysis* fyAnalysis;
+
+private:
+
+};
+
+inline void AliFemtoCorrFctn::AddRealPair(const AliFemtoPair*) { cout << "Not implemented" << endl; }
+inline void AliFemtoCorrFctn::AddMixedPair(const AliFemtoPair*) { cout << "Not implemented" << endl; }
+
+inline AliFemtoCorrFctn::AliFemtoCorrFctn(const AliFemtoCorrFctn& c) { fyAnalysis =0; }
+inline void AliFemtoCorrFctn::SetAnalysis(AliFemtoBaseAnalysis* analysis) { fyAnalysis = analysis; }
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCutMonitor.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoCutMonitor.h
new file mode 100644 (file)
index 0000000..09b98e4
--- /dev/null
@@ -0,0 +1,81 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoCutMonitor - the  base class for cut monitor                     ///
+/// A cut monitor saves the entities that passed and failed the given cut    ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoCutMonitor_hh
+#define AliFemtoCutMonitor_hh
+
+class AliFemtoEvent;
+class AliFemtoTrack;
+class AliFemtoV0;
+class AliFemtoKink;
+class AliFemtoPair; // Gael 12/04/02
+#include "Infrastructure/AliFemtoString.h"
+#include "Infrastructure/AliFemtoParticleCollection.h" // Gael 19/06/02
+
+class AliFemtoCutMonitor{
+  
+private:
+  
+public:
+  AliFemtoCutMonitor(){/* no-op */};
+  virtual ~AliFemtoCutMonitor(){/* no-op */};
+  virtual AliFemtoString Report(){ 
+    string Stemp = "*** no user defined Fill(const AliFemtoEvent*), take from base class"; 
+    AliFemtoString returnThis = Stemp;
+    return returnThis; 
+  }
+  virtual void EventBegin(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void EventEnd(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void Fill(const AliFemtoEvent* aEvent) { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoEvent*), take from base class" << endl;
+#endif
+  }
+  virtual void Fill(const AliFemtoTrack* aTrack) { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoTrack*), take from base class" << endl;
+#endif
+  }
+  virtual void Fill(const AliFemtoV0* aV0) { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoV0Track*), take from base class" << endl;
+#endif
+  }
+  virtual void Fill(const AliFemtoKink* aKink) { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoKink*), take from base class" << endl;
+#endif
+  }
+  //-----------------------------------Gael 12/04/02------------------------------------
+  virtual void Fill(const AliFemtoPair* aPair) { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoPair*), take from base class" << endl;
+#endif
+  }
+  //-----------------------------------Gael 19/06/02------------------------------------
+  virtual void Fill(const AliFemtoParticleCollection* aCollection) {
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoParticleCollection*), take from base class" << endl;
+#endif
+  }
+  //-----------------------------------Gael 19/06/02------------------------------------
+  virtual void Fill(const AliFemtoEvent* aEvent,const AliFemtoParticleCollection* aCollection) {
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Fill(const AliFemtoEvent*,const AliFemtoParticleCollection*), take from base class" << endl;
+#endif
+  }
+  // -------------------------------------------------------------------------------------
+  virtual void Finish() { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Finish(), take from base class" << endl;
+#endif
+  }
+  virtual void Init() { 
+#ifdef STHBTDEBUG
+    cout << " *** no user defined Init(), take from base class" << endl;
+#endif
+  }
+};
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventCut.h
new file mode 100644 (file)
index 0000000..9944b7e
--- /dev/null
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoEventCut - the pure virtual base class for the event cut         ///
+/// All event cuts must inherit from this one                                ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoEventCut_hh
+#define AliFemtoEventCut_hh
+
+class AliFemtoEvent;
+class AliFemtoBaseAnalysis;
+
+#include "Infrastructure/AliFemtoCutMonitorHandler.h"
+#include "Infrastructure/AliFemtoString.h"
+
+class AliFemtoEventCut : public AliFemtoCutMonitorHandler {
+
+  friend class AliFemtoBaseAnalysis;
+
+public:
+
+  AliFemtoEventCut(){/* no-op */};                // default constructor. - Users should write their own
+  AliFemtoEventCut(const AliFemtoEventCut& c); // copy constructor
+  virtual ~AliFemtoEventCut(){/* no-op */};       // destructor
+  
+  virtual bool Pass(const AliFemtoEvent* event) =0;  // true if passes, false if not
+
+  virtual AliFemtoString Report() =0;    // user-written method to return string describing cuts
+  virtual AliFemtoEventCut* Clone() { return 0;}
+
+
+  AliFemtoBaseAnalysis* HbtAnalysis(){return fyAnalysis;};
+  void SetAnalysis(AliFemtoBaseAnalysis* aAnalysis);
+
+protected:
+  AliFemtoBaseAnalysis* fyAnalysis;
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoEventCut, 0)
+#endif
+};
+
+inline AliFemtoEventCut::AliFemtoEventCut(const AliFemtoEventCut& c) : AliFemtoCutMonitorHandler() { fyAnalysis=0;}
+inline void AliFemtoEventCut::SetAnalysis(AliFemtoBaseAnalysis* analysis) { fyAnalysis = analysis; }
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.cxx b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.cxx
new file mode 100644 (file)
index 0000000..fd37b6c
--- /dev/null
@@ -0,0 +1,79 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoEventReader - the pure virtual base class for the event reader   ///
+/// All event readers must inherit from this one                             ///
+////////////////////////////////////////////////////////////////////////////////
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Base/AliFemtoEventCut.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Base/AliFemtoXiCut.h"
+#include "Base/AliFemtoKinkCut.h"
+#include "Base/AliFemtoEventReader.h"
+
+#ifdef __ROOT__
+ClassImp(AliFemtoEventReader)
+#endif
+
+AliFemtoString AliFemtoEventReader::Report(){
+  // Create a simple report from the workings of the reader
+  AliFemtoString temp = "\n This is the base class AliFemtoEventReader reporting";
+  temp += "\n---> EventCuts in Reader: ";
+  if (fEventCut) {
+    temp += fEventCut->Report();
+  }
+  else {
+    temp += "NONE";
+  }
+  temp += "\n---> TrackCuts in Reader: ";
+  if (fTrackCut) {
+    temp += fTrackCut->Report();
+  }
+  else {
+    temp += "NONE";
+  }
+  temp += "\n---> V0Cuts in Reader: ";
+  if (fV0Cut) {
+    temp += fV0Cut->Report();
+  }
+  else {
+    temp += "NONE";
+  }
+  temp += "\n---> XiCuts in Reader: ";
+  if (fXiCut) {
+    temp += fXiCut->Report();
+  }
+  else {
+    temp += "NONE";
+  }
+  temp += "\n---> KinkCuts in Reader: ";
+  if (fKinkCut) {
+    temp += fKinkCut->Report();
+  }
+  else {
+    temp += "NONE";
+  }
+  temp += "\n";
+  return temp;
+}
+//______________________________________
+void AliFemtoEventReader::SetEventCut(AliFemtoEventCut* ecut){fEventCut=ecut;}
+//______________________________________
+void AliFemtoEventReader::SetTrackCut(AliFemtoTrackCut* pcut){cout << pcut << endl; fTrackCut=pcut;}
+//______________________________________
+void AliFemtoEventReader::SetV0Cut(AliFemtoV0Cut* pcut){fV0Cut=pcut;}
+//______________________________________
+void AliFemtoEventReader::SetXiCut(AliFemtoXiCut* pcut){fXiCut=pcut;}
+//______________________________________
+void AliFemtoEventReader::SetKinkCut(AliFemtoKinkCut* pcut){fKinkCut=pcut;}
+//______________________________________
+AliFemtoEventCut* AliFemtoEventReader::EventCut(){return fEventCut;}
+//______________________________________
+AliFemtoTrackCut* AliFemtoEventReader::TrackCut(){return fTrackCut;}
+//______________________________________
+AliFemtoV0Cut*    AliFemtoEventReader::V0Cut(){return fV0Cut;} 
+//______________________________________
+AliFemtoXiCut*    AliFemtoEventReader::XiCut(){return fXiCut;} 
+//______________________________________
+AliFemtoKinkCut*    AliFemtoEventReader::KinkCut(){return fKinkCut;}
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventReader.h
new file mode 100644 (file)
index 0000000..3fa1d16
--- /dev/null
@@ -0,0 +1,79 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoEventReader - the pure virtual base class for the event reader   ///
+/// All event readers must inherit from this one                             ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoEventReader_hh
+#define AliFemtoEventReader_hh
+class AliFemtoEvent;
+class AliFemtoEventCut;
+class AliFemtoTrackCut;
+class AliFemtoV0Cut;
+class AliFemtoXiCut;
+class AliFemtoKinkCut;
+
+#include <iostream>
+#include <fstream>
+#include <stdio.h>
+using namespace std;
+
+#include "Infrastructure/AliFemtoString.h"
+
+class AliFemtoEventReader {
+
+public:
+  // even tho it's only a base class and never constructed, if you don't have an implementation,
+  // you get "AliFemtoEventReader type_info node" upon dynamical loading
+  AliFemtoEventReader() : fEventCut(0), fTrackCut(0), fV0Cut(0), fXiCut(0), fKinkCut(0), fDebug(1) { /* no-op */ }
+  virtual ~AliFemtoEventReader(){/* no-op */}
+  
+  virtual AliFemtoEvent* ReturnHbtEvent() =0;
+
+  virtual AliFemtoString Report();    // user-written method to return string describing reader
+                                      // Including whatever "early" cuts are being done
+
+  // this next method does NOT need to be implemented, in which case the 
+  // "default" method below is executed
+  virtual int WriteHbtEvent(AliFemtoEvent*){cout << "No WriteHbtEvent implemented\n"; return (0);}
+
+  // these next two are optional but would make sense for, e.g., opening and closing a file
+  virtual int Init(const char* ReadWrite, AliFemtoString& Message){cout << "do-nothing AliFemtoEventReader::Init()\n"; return(0);}
+  virtual void Finish(){/*no-op*/};
+
+  int Status(){return fReaderStatus;} // AliFemtoManager looks at this for guidance if it gets null pointer from ReturnHbtEvent
+
+  virtual void SetEventCut(AliFemtoEventCut* ecut);
+  virtual void SetTrackCut(AliFemtoTrackCut* pcut);
+  virtual void SetV0Cut(AliFemtoV0Cut* pcut);
+  virtual void SetXiCut(AliFemtoXiCut* pcut);
+  virtual void SetKinkCut(AliFemtoKinkCut* pcut);
+  virtual AliFemtoEventCut* EventCut();
+  virtual AliFemtoTrackCut* TrackCut();
+  virtual AliFemtoV0Cut*    V0Cut();
+  virtual AliFemtoXiCut*    XiCut();
+  virtual AliFemtoKinkCut*    KinkCut();
+
+  /* control of debug informations print out, my rule is: */
+  /* 0: no output at all                                  */
+  /* 1: once (e.g. in constructor, finsh                  */
+  /* 2: once per event                                    */
+  /* 3: once per track                                    */
+  /* 4: once per pair                                     */
+  int Debug(){return fDebug;} 
+  void SetDebug(int d){fDebug=d;}
+
+protected:
+  AliFemtoEventCut* fEventCut;     //! link to the front-loaded event cut
+  AliFemtoTrackCut* fTrackCut;     //! link to the front-loaded track cut
+  AliFemtoV0Cut* fV0Cut;           //! link to the front-loaded V0 cut
+  AliFemtoXiCut* fXiCut;           //! link to the front-loaded Xi cut
+  AliFemtoKinkCut* fKinkCut;       //! link to the front-loaded Kink cut
+  int fReaderStatus;               // 0="good"
+  int fDebug;                      // Debug information level
+#ifdef __ROOT__
+  ClassDef(AliFemtoEventReader,0)
+#endif
+};
+
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventWriter.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoEventWriter.h
new file mode 100644 (file)
index 0000000..11b9371
--- /dev/null
@@ -0,0 +1,12 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoEventWrite - a wrapper for the base class                        ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoEventWriter_hh
+#define AliFemtoEventWriter_hh
+
+#include "Base/AliFemtoEventReader.h"
+
+typedef AliFemtoEventReader AliFemtoEventWriter;//!  // yes, because our writer are reader-writers
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoHiddenInfo.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoHiddenInfo.h
new file mode 100644 (file)
index 0000000..bc47de9
--- /dev/null
@@ -0,0 +1,30 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoHiddenInfo - pure virtual base class for the hidden info         ///
+/// Hidden info stores additional information, which is not in a standard    ///
+/// track. 
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoHiddenInfo_hh
+#define AliFemtoHiddenInfo_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+
+class AliFemtoHiddenInfo{
+
+public:
+  AliFemtoHiddenInfo(){/* no-op */};
+  virtual ~AliFemtoHiddenInfo(){/* no-op */};
+
+// !!! MANDATORY !!!
+// --- Copy the hidden info from AliFemtoTrack to AliFemtoParticle
+  virtual AliFemtoHiddenInfo* getParticleHiddenInfo() const =0;
+  virtual AliFemtoHiddenInfo* clone() const;
+
+};
+//_______________________________________
+inline AliFemtoHiddenInfo* AliFemtoHiddenInfo::clone() const{
+  // return exact copy of this hidden info
+  return getParticleHiddenInfo();
+}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoKinkCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoKinkCut.h
new file mode 100644 (file)
index 0000000..c310b3d
--- /dev/null
@@ -0,0 +1,33 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoKinkCut - the pure virtual base class for the kink cut           ///
+/// All kink cuts must inherit from this one                                 ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoKinkCut_hh
+#define AliFemtoKinkCut_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoKink.h"
+#include "Base/AliFemtoParticleCut.h"
+
+class AliFemtoKinkCut : public AliFemtoParticleCut {
+
+public:
+
+  AliFemtoKinkCut(){/* no-op */};                       // default constructor. - Users should write their own
+  AliFemtoKinkCut(const AliFemtoKinkCut&);                         // copy constructor
+  virtual ~AliFemtoKinkCut(){/* no-op */};              // destructor
+
+  virtual bool Pass(const AliFemtoKink* aKink)=0;               // true if passes, false if not
+
+  virtual AliFemtoParticleType Type(){return hbtKink;}
+  virtual AliFemtoKinkCut* Clone() { return 0;}
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoKinkCut, 0)
+#endif
+};
+//_____________________________
+inline AliFemtoKinkCut::AliFemtoKinkCut(const AliFemtoKinkCut& c) : AliFemtoParticleCut(c) { /* no-op */ } 
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoLikeSignCorrFctn.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoLikeSignCorrFctn.h
new file mode 100644 (file)
index 0000000..ccf8e57
--- /dev/null
@@ -0,0 +1,31 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoLikeSignCorrFctn - the pure virtual base class for the like sign ///
+/// correlation function. All like sign correlation functions  must inherit  ///
+/// from this one                                                            ///
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoLikeSignCorrFctn_hh
+#define AliFemtoLikeSignCorrFctn_hh
+
+class AliFemtoPair;
+#include "Base/AliFemtoCorrFctn.h"
+
+class AliFemtoLikeSignCorrFctn : public AliFemtoCorrFctn {
+
+  friend class AliFemtoLikeSignAnalysis;
+
+public:
+  AliFemtoLikeSignCorrFctn(){/* no-op */};
+  AliFemtoLikeSignCorrFctn(const AliFemtoLikeSignCorrFctn& aCorrFctn);
+  virtual ~AliFemtoLikeSignCorrFctn(){/* no-op */};
+
+  virtual void AddLikeSignPositivePair(const AliFemtoPair* aPair) = 0;
+  virtual void AddLikeSignNegativePair(const AliFemtoPair* aPair) = 0;
+
+  virtual AliFemtoLikeSignCorrFctn* Clone() { return 0;}
+
+  // the following allows "back-pointing" from the CorrFctn to the "parent" Analysis
+};
+//________________________________________
+inline AliFemtoLikeSignCorrFctn::AliFemtoLikeSignCorrFctn(const AliFemtoLikeSignCorrFctn& c) { fyAnalysis =0; }
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoPairCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoPairCut.h
new file mode 100644 (file)
index 0000000..25ba8ba
--- /dev/null
@@ -0,0 +1,50 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoPairCut - the pure virtual base class for the pair cut           ///
+/// All pair cuts must inherit from this one                                 ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoPairCut_hh
+#define AliFemtoPairCut_hh
+
+#include <string>
+
+class AliFemtoBaseAnalysis;
+
+#include "Infrastructure/AliFemtoString.h"
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Infrastructure/AliFemtoPair.h"
+#include "Infrastructure/AliFemtoCutMonitorHandler.h"
+
+class AliFemtoPairCut : public AliFemtoCutMonitorHandler {
+
+  friend class AliFemtoBaseAnalysis;
+
+public:
+
+  AliFemtoPairCut(){/* no-op */};   // default constructor. - Users should write their own
+  AliFemtoPairCut(const AliFemtoPairCut& c); // copy constructor
+  virtual ~AliFemtoPairCut(){/* no-op */};  // destructor
+
+  virtual bool Pass(const AliFemtoPair* pair) =0;  // true if passes, false if not
+
+  virtual AliFemtoString Report() =0;    // user-written method to return string describing cuts
+  virtual void EventBegin(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void EventEnd(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual AliFemtoPairCut* Clone() { return 0;}
+
+  // the following allows "back-pointing" from the CorrFctn to the "parent" Analysis
+  AliFemtoBaseAnalysis* HbtAnalysis(){return fyAnalysis;};
+  void SetAnalysis(AliFemtoBaseAnalysis* aAnalysis);    // Set Back pointer to Analysis
+
+protected:
+  AliFemtoBaseAnalysis* fyAnalysis; // Link to the base analysis class
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoPairCut, 0)
+#endif
+};
+
+
+inline AliFemtoPairCut::AliFemtoPairCut(const AliFemtoPairCut& c) : AliFemtoCutMonitorHandler() { fyAnalysis = 0; }
+inline void AliFemtoPairCut::SetAnalysis(AliFemtoBaseAnalysis* analysis) { fyAnalysis = analysis; }
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoParticleCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoParticleCut.h
new file mode 100644 (file)
index 0000000..f1a0f23
--- /dev/null
@@ -0,0 +1,54 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoParticleCut - the pure virtual base class for the particle cut   ///
+/// All particle cuts must inherit from this one                             ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoParticleCut_hh
+#define AliFemtoParticleCut_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoCutMonitorHandler.h"
+
+class AliFemtoBaseAnalysis;
+
+class AliFemtoParticleCut : public AliFemtoCutMonitorHandler {
+
+  friend class AliFemtoBaseAnalysis;
+
+public:
+  AliFemtoParticleCut(){/* no-op */};   // default constructor. - Users should write their own
+  AliFemtoParticleCut(const AliFemtoParticleCut&); // copy constructor
+  virtual ~AliFemtoParticleCut(){/* no-op */};  // destructor
+
+  virtual AliFemtoString Report() =0;    // user-written method to return string describing cuts
+
+  double Mass(){return fMass;};       // mass of the particle being selected
+  virtual void SetMass(const double& mass) {fMass = mass;};
+
+  virtual void EventBegin(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual void EventEnd(const AliFemtoEvent* aEvent) { /* no-op */ }
+  virtual AliFemtoParticleCut* Clone() { return 0;}
+
+  virtual AliFemtoParticleType Type()=0;
+
+  // the following allows "back-pointing" from the CorrFctn to the "parent" Analysis
+  AliFemtoBaseAnalysis* HbtAnalysis(){return fyAnalysis;};
+  void SetAnalysis(AliFemtoBaseAnalysis*);
+
+protected:
+  double fMass;
+  AliFemtoBaseAnalysis* fyAnalysis; // Link to the base analysis class
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoParticleCut, 0)
+#endif
+};
+
+inline AliFemtoParticleCut::AliFemtoParticleCut(const AliFemtoParticleCut& c) : AliFemtoCutMonitorHandler() { 
+  fMass = c.fMass; fyAnalysis = 0; 
+#ifdef STHBTDEBUG
+  cout << " AliFemtoParticleCut::AliFemtoParticleCut(const AliFemtoParticleCut& c) - fMass: " << fMass << endl;
+#endif
+}
+inline void AliFemtoParticleCut::SetAnalysis(AliFemtoBaseAnalysis* analysis) { fyAnalysis = analysis; }
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoTrackCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoTrackCut.h
new file mode 100644 (file)
index 0000000..1be1afd
--- /dev/null
@@ -0,0 +1,35 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoTrackCut - the pure virtual base class for the track cut         ///
+/// All track cuts must inherit from this one                                ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoTrackCut_hh
+#define AliFemtoTrackCut_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoTrack.h"
+#include "Base/AliFemtoParticleCut.h"
+
+class AliFemtoTrackCut : public AliFemtoParticleCut {
+
+public:
+
+  AliFemtoTrackCut(){/* no-op */};                       // default constructor. - Users should write their own
+  AliFemtoTrackCut(const AliFemtoTrackCut&);                // copy constructor
+  virtual ~AliFemtoTrackCut(){/* no-op */};              // destructor
+
+  virtual bool Pass(const AliFemtoTrack* track)=0;       // true if passes, false if not
+  virtual AliFemtoParticleType Type(){return hbtTrack;}
+  virtual AliFemtoTrackCut* Clone() { return 0;}
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoTrackCut, 0)
+#endif
+};
+
+inline AliFemtoTrackCut::AliFemtoTrackCut(const AliFemtoTrackCut& c) : AliFemtoParticleCut(c) {
+#ifdef STHBTDEBUG
+  cout << " AliFemtoTrackCut::AliFemtoTrackCut(const AliFemtoTrackCut& c) : AliFemtoParticleCut(c) " << endl;
+#endif
+}
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoV0Cut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoV0Cut.h
new file mode 100644 (file)
index 0000000..d4f63f9
--- /dev/null
@@ -0,0 +1,33 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoV0Cut - the pure virtual base class for the V0 cut           ///
+/// All V0 cuts must inherit from this one                                 ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoV0Cut_hh
+#define AliFemtoV0Cut_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoV0.h"
+#include "Base/AliFemtoParticleCut.h"
+
+class AliFemtoV0Cut : public AliFemtoParticleCut {
+
+public:
+
+  AliFemtoV0Cut(){/* no-op */};                             // default constructor. - Users should write their own
+  AliFemtoV0Cut(const AliFemtoV0Cut& aCut);                 // copy constructor
+  virtual ~AliFemtoV0Cut(){/* no-op */};                    // destructor
+
+  virtual bool Pass(const AliFemtoV0* aV0)=0;               // true if passes, false if not
+
+  virtual AliFemtoParticleType Type(){return hbtV0;}
+  virtual AliFemtoV0Cut* Clone() { return 0;}
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoV0Cut, 0)
+#endif
+};
+
+inline AliFemtoV0Cut::AliFemtoV0Cut(const AliFemtoV0Cut& c) : AliFemtoParticleCut(c) { /* no-op */ } 
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoXiCut.h b/PWG2/FEMTOSCOPY/AliFemto/Base/AliFemtoXiCut.h
new file mode 100644 (file)
index 0000000..bcfbadb
--- /dev/null
@@ -0,0 +1,33 @@
+////////////////////////////////////////////////////////////////////////////////
+/// AliFemtoXiCut - the pure virtual base class for the Xi cut               ///
+/// All Xi cuts must inherit from this one                                   ///
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef AliFemtoXiCut_hh
+#define AliFemtoXiCut_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoXi.h"
+#include "Base/AliFemtoParticleCut.h"
+
+class AliFemtoXiCut : public AliFemtoParticleCut {
+
+public:
+
+  AliFemtoXiCut(){/* no-op */};                          // default constructor. - Users should write their own
+  AliFemtoXiCut(const AliFemtoXiCut& aCut);              // copy constructor
+  virtual ~AliFemtoXiCut(){/* no-op */};                 // destructor
+
+  virtual bool Pass(const AliFemtoXi* aCut)=0;               // true if passes, false if not
+
+  virtual AliFemtoParticleType Type(){return hbtXi;}
+  virtual AliFemtoXiCut* Clone() { return 0;}
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoXiCut, 0)
+#endif
+};
+
+inline AliFemtoXiCut::AliFemtoXiCut(const AliFemtoXiCut& c) : AliFemtoParticleCut(c) { /* no-op */ } 
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/PhysicalConstants.h b/PWG2/FEMTOSCOPY/AliFemto/Base/PhysicalConstants.h
new file mode 100644 (file)
index 0000000..90d96c4
--- /dev/null
@@ -0,0 +1,140 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: CLHEP (see below)
+ ***************************************************************************
+ *
+ * Description:  Taken as-is from CLHEP.
+ *               Modified original CVS-Id to retain version info. 
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.2  1999/02/22 16:52:47  didenko
+ * updates from Gene
+ *
+ * Revision 1.1  1999/01/30 03:58:59  fisyak
+ * Root Version of StarClassLibrary
+ *
+ * Revision 1.1  1999/01/23 00:27:34  ullrich
+ * Initial Revision
+ *
+ **************************************************************************/
+
+#ifndef HEP_PHYSICAL_CONSTANTS_H
+#define HEP_PHYSICAL_CONSTANTS_H
+
+#include "SystemOfUnits.h"
+
+#ifndef ST_NO_NAMESPACES
+using namespace std;
+using namespace units;
+#endif
+
+#include <math.h>
+#include <cmath>
+
+//
+#ifndef M_PI
+#define M_PI 3.14159265358979312
+#endif
+//
+//#ifdef MACOSX
+//extern const double     pi;    // from <math.h>
+//#else
+static const double     pi  = M_PI;    // from <math.h>
+//#endif
+static const double  twopi  = 2*pi;
+static const double halfpi  = pi/2;
+static const double    pi2  = pi*pi;
+
+//
+// 
+//
+static const double Avogadro = 6.0221367e+23/mole;
+
+//
+// c   = 299.792458 mm/ns
+// c^2 = 898.7404 (mm/ns)^2 
+//
+static const double c_light   = 2.99792458e+8 * meter/second;
+static const double c_squared = c_light * c_light;
+
+//
+// h     = 4.13566e-12 MeV*ns
+// hbar  = 6.58212e-13 MeV*ns
+// hbarc = 197.32705e-12 MeV*mm
+//
+static const double h_Planck      = 6.6260755e-34 * joule*second;
+static const double hbar_Planck   = h_Planck/twopi;
+static const double hbarc         = hbar_Planck * c_light;
+static const double hbarc_squared = hbarc * hbarc;
+
+//
+//
+//
+static const double electron_charge = - eplus; // see SystemOfUnits.h
+static const double e_squared = eplus * eplus;
+
+//
+// amu_c2 - atomic equivalent mass unit
+// amu    - atomic mass unit
+//
+static const double electron_mass_c2 = 0.51099906 * MeV;
+static const double   proton_mass_c2 = 938.27231 * MeV;
+static const double  neutron_mass_c2 = 939.56563 * MeV;
+static const double           amu_c2 = 931.49432 * MeV;
+static const double              amu = amu_c2/c_squared;
+
+static const double kaon_0_short_mass_c2 = 497.672  * MeV;
+static const double    pion_plus_mass_c2 = 139.5700 * MeV;
+static const double   pion_minus_mass_c2 = 139.5700 * MeV;
+static const double       lambda_mass_c2 = 1115.684 * MeV;
+static const double   antilambda_mass_c2 = 1115.684 * MeV;
+static const double     xi_minus_mass_c2 = 1321.32  * MeV;
+
+
+//
+// permeability of free space mu0    = 2.01334e-16 Mev*(ns*eplus)^2/mm
+// permittivity of free space epsil0 = 5.52636e+10 eplus^2/(MeV*mm)
+//
+static const double mu0      = 4*pi*1.e-7 * henry/meter;
+static const double epsilon0 = 1./(c_squared*mu0);
+
+//
+// electromagnetic coupling = 1.43996e-12 MeV*mm/(eplus^2)
+//
+static const double elm_coupling           = e_squared/(4*pi*epsilon0);
+static const double fine_structure_const   = elm_coupling/hbarc;
+static const double classic_electr_radius  = elm_coupling/electron_mass_c2;
+static const double electron_Compton_length = hbarc/electron_mass_c2;
+static const double Bohr_radius = electron_Compton_length/fine_structure_const;
+
+static const double alpha_rcl2 = fine_structure_const
+                                   *classic_electr_radius
+                                   *classic_electr_radius;
+
+static const double twopi_mc2_rcl2 = twopi*electron_mass_c2
+                                             *classic_electr_radius
+                                             *classic_electr_radius;
+//
+//
+//
+static const double k_Boltzmann = 8.617385e-11 * MeV/kelvin;
+
+//
+//
+//
+static const double STP_Temperature = 273.15*kelvin;
+static const double STP_Pressure    = 1.*atmosphere;
+static const double kGasThreshold   = 1.e-2*gram/centimeter3;
+
+#endif /* HEP_PHYSICAL_CONSTANTS_H */
+
+
+
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Base/SystemOfUnits.h b/PWG2/FEMTOSCOPY/AliFemto/Base/SystemOfUnits.h
new file mode 100644 (file)
index 0000000..8521f9d
--- /dev/null
@@ -0,0 +1,304 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: blasiuk adapted from CLHEP
+ ***************************************************************************
+ *
+ * Description:  This file is based on the SystemOfUnits provided
+ *               in the CLHEP library v1.2:  The units remain the same.
+ *               It is just the naming conventions that are different:
+ *
+ * 1) No single letter unit:
+ *    : m --> meter
+ *    : s --> second
+ *    : g --> gram
+ *
+ * 2) All prefixes are spelled out explicitly (except electron Volt):
+ *    : ns --> nanosecond
+ *    : mm --> millimeter
+ *
+ * 3) All units with proper names follow the international standard
+ *    of being lower case:
+ *    : farad --> farad
+ *    : volt  --> volt
+ *
+ * The basic units are :
+ *              centimeter              (centimeter)
+ *              second                  (second)
+ *              Giga electron Volt      (GeV)
+ *              positron charge         (eplus)
+ *              degree Kelvin           (kelvin)
+ *              the amount of substance (mole)
+ *              radian                  (radian)
+ *              steradian               (steradian)
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.5  2003/09/02 17:59:35  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.4  1999/03/22 16:21:38  fisyak
+ * Add anti CINT flags
+ *
+ * Revision 1.3  1999/03/11 14:53:07  ullrich
+ * Added definition of inch.
+ *
+ * Revision 1.2  1999/03/02 20:15:08  ullrich
+ * Added millivolt.
+ *
+ * Revision 1.1  1999/01/30 03:59:06  fisyak
+ * Root Version of StarClassLibrary
+ *
+ * Revision 1.1  1999/01/23 00:28:08  ullrich
+ * Initial Revision
+ *
+ **************************************************************************/
+#ifndef HEP_SYSTEM_OF_UNITS_H
+#define HEP_SYSTEM_OF_UNITS_H
+
+
+#ifndef M_PI
+#define M_PI 3.14159265358979312
+#endif
+
+
+namespace units {
+    // new macro for CLHEP SystemOfUnits: at end of file
+    //  ST_ADD_OLD_CLHEP_SYSTEM_OF_UNITS
+    // 
+    // Length [L]
+    //
+    static const double millimeter  = 0.1;
+    static const double millimeter2 = millimeter*millimeter;
+    static const double millimeter3 = millimeter*millimeter*millimeter;
+
+    static const double centimeter  = 10*millimeter;
+    static const double centimeter2 = centimeter*centimeter;
+    static const double centimeter3 = centimeter*centimeter*centimeter;
+
+    static const double meter       = 100.*centimeter;
+    static const double meter2      = meter*meter;
+    static const double meter3      = meter*meter*meter;
+
+    static const double kilometer   = 1000.*meter;
+    static const double kilometer2  = kilometer*kilometer;
+    static const double kilometer3  = kilometer*kilometer*kilometer;
+
+    static const double micrometer  = 1.e-6*meter;
+    static const double nanometer   = 1.e-9*meter;
+    static const double femtometer  = 1.e-15*meter;
+    static const double fermi       = 1*femtometer;
+    
+    static const double      barn   = 1.e-28*meter2;
+    static const double millibarn   = 1.e-3*barn;
+    static const double microbarn   = 1.e-6*barn;
+    static const double  nanobarn   = 1.e-9*barn;
+    static const double      inch   = 2.54*centimeter;
+    
+    //
+    // Angle
+    //
+    static const double      radian = 1.;
+    static const double milliradian = 1.e-3*radian;
+#ifndef __CINT__
+    static const double      degree = (M_PI/180.0)*radian;
+#endif    
+    static const double   steradian = 1.;
+
+    //
+    // Time [T]
+    //
+    static const double      second = 1;
+    static const double millisecond = 1.e-3*second;
+    static const double microsecond = 1.e-3*millisecond;
+    static const double  nanosecond = 1.e-3*microsecond;
+    
+    static const double     hertz   = 1./second;
+    static const double kilohertz   = 1.e+3*hertz;
+    static const double Megahertz   = 1.e+6*hertz;
+    
+    // but these are also unambiguous and unlikely to be used as variable!
+    static const double  Hz         = 1*hertz;
+    static const double kHz         = 1*kilohertz;
+    static const double MHz         = 1*Megahertz;
+
+    //
+    // Electric charge [Q]
+    //
+    static const double eplus   = 1. ;                 // positron charge
+    static const double e_SI    = 1.60217733e-19;      // positron charge in coulomb
+    static const double coulomb = eplus/e_SI;
+    
+    //
+    // Energy [E]
+    //
+    static const double Gigaelectronvolt = 1.;
+    static const double Megaelectronvolt = 1.e-3*Gigaelectronvolt;
+    static const double     electronvolt = 1.e-6*Megaelectronvolt;
+    static const double kiloelectronvolt = 1.e+3*electronvolt;
+    static const double Teraelectronvolt = 1.e+3*Gigaelectronvolt;
+    
+    // but these are also unambiguous and unlikely to be used as variables
+    static const double MeV     = Megaelectronvolt;
+    static const double  eV     =     electronvolt;
+    static const double keV     = kiloelectronvolt;
+    static const double GeV     = Gigaelectronvolt;
+    static const double TeV     = Teraelectronvolt;
+    
+    static const double joule   = electronvolt/e_SI;
+    
+    //
+    // Mass [E][T^2][L^-2]
+    //
+    static const double  kilogram = joule*second*second/(meter*meter);
+    static const double      gram = 1.e-3*kilogram;
+    static const double milligram = 1.e-3*gram;
+
+    //
+    // Power [E][T^-1]
+    //
+    static const double watt    = joule/second;
+    
+    //
+    // Force [E][L^-1]
+    //
+    static const double newton  = joule/meter;
+
+    //
+    // Pressure [E][L^-3]
+    //
+#ifndef __CINT__    
+#define pascal hep_pascal       // a trick to avoid warnings 
+    static const double hep_pascal = newton/meter2;
+#else
+    static const double pascal     = newton/meter2;
+#endif
+    static const double bar        = 100000*pascal;
+    static const double atmosphere = 101325*pascal;
+
+    //
+    // Electric current [Q][T^-1]
+    //
+    static const double ampere   = coulomb/second;
+    
+    //
+    // Electric potential [E][Q^-1]
+    //
+    static const double Megavolt = MeV/eplus;
+    static const double kilovolt = 1.e-3*Megavolt;
+    static const double     volt = 1.e-6*Megavolt;
+    static const double millivolt = 1.e-3*volt;
+    
+    //
+    // Electric resistance [E][T][Q^-2]
+    //
+    static const double ohm = volt/ampere;
+    
+    //
+    // Electric capacitance [Q^2][E^-1]
+    //
+    static const double farad = coulomb/volt;
+    static const double millifarad = 1.e-3*farad;
+    static const double microfarad = 1.e-6*farad;
+    static const double  nanofarad = 1.e-9*farad;
+    static const double  picofarad = 1.e-12*farad;
+    
+    //
+    // Magnetic Flux [T][E][Q^-1]
+    //
+    static const double weber = volt*second;
+    
+    //
+    // Magnetic Field [T][E][Q^-1][L^-2]
+    //
+    static const double tesla     = volt*second/meter2;
+    
+    static const double gauss     = 1.e-4*tesla;
+    static const double kilogauss = 1.e-1*tesla;
+
+    //
+    // Inductance [T^2][E][Q^-2]
+    //
+    static const double henry = weber/ampere;
+
+    //
+    // Temperature
+    //
+    static const double kelvin = 1.;
+
+    //
+    // Amount of substance
+    //
+    static const double mole = 1.;
+    
+    //
+    // Activity [T^-1]
+    //
+    static const double becquerel = 1./second;
+    static const double curie = 3.7e+10 * becquerel;
+    
+    //
+    // Absorbed dose [L^2][T^-2]
+    //
+    static const double gray = joule/kilogram ;
+
+    //
+    // Miscellaneous
+    //
+    static const double perCent     = 0.01 ;
+    static const double perThousand = 0.001;
+    static const double perMillion  = 0.000001;
+
+#ifdef ST_ADD_OLD_CLHEP_SYSTEM_OF_UNITS
+
+    static const double mm  = 0.1;         // millimeter
+    static const double mm2 = mm*mm;
+    static const double mm3 = mm*mm*mm;
+    
+    static const double cm  = 10.*mm;      // centimeter
+    static const double cm2 = cm*cm;
+    static const double cm3 = cm*cm*cm;
+    
+    static const double m  = 1000.*mm;     // meter
+    static const double m2 = m*m;
+    static const double m3 = m*m*m;
+    
+    static const double km = 1000.*m;      // kilometer
+    static const double km2 = km*km;
+    static const double km3 = km*km*km;
+
+    static const double microm = 1.e-6*m;  // micro meter
+    static const double  nanom = 1.e-9*m;
+    //static const double  fermi = 1.e-15*m;
+
+    //
+    // Angle
+    //
+    static const double  rad = 1.;        // radian 
+    static const double mrad = 1.e-3*rad; // milliradian
+    static const double  deg = (M_PI/180.0)*rad;
+
+    static const double   st = 1.;         // steradian
+
+    //
+    // Time [T]
+    //
+    static const double  s = 1;           // second
+    static const double ns = 1.e-9*s;     // nano second
+    static const double ms = 1.e-3*s;     // milli second
+
+    // Mass [E][T^2][L^-2]
+    //
+    static const double kg = joule*second*second/(meter*meter);        // kg = 6.24150 e+24 * MeV*ns*ns/(mm*mm)   
+    static const double  g = 1.e-3*kg;
+    static const double mg = 1.e-3*g;
+
+#endif
+
+};
+using namespace units;
+#endif /* HEP_SYSTEM_OF_UNITS_H */
diff --git a/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.cxx b/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.cxx
new file mode 100644 (file)
index 0000000..30a3122
--- /dev/null
@@ -0,0 +1,321 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   3D Bertsch-Pratt decomposition in the LCMS frame
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.7  2003/01/31 19:20:54  magestro
+ * Cleared up simple compiler warnings on i386_linux24
+ *
+ * Revision 1.6  2002/06/07 22:51:38  lisa
+ * Widely used AliFemtoBPLCMS3DCorrFctn class now accumulates UNcorrected denominator and has a WriteOutHistos method
+ *
+ * Revision 1.5  2001/05/23 00:19:04  lisa
+ * Add in Smearing classes and methods needed for momentum resolution studies and correction
+ *
+ * Revision 1.4  2000/10/26 19:48:49  rcwells
+ * Added functionality for Coulomb correction of <qInv> in 3D correltions
+ *
+ * Revision 1.3  2000/09/14 18:36:53  lisa
+ * Added Qinv and ExitSep pair cuts and AliFemtoBPLCMS3DCorrFctn_SIM CorrFctn
+ *
+ * Revision 1.2  2000/08/23 19:43:43  lisa
+ * added alternate normalization algorithm to 3d CorrFctns in case normal one fails
+ *
+ * Revision 1.1  2000/08/17 20:48:39  lisa
+ * Adding correlationfunction in LCMS frame
+ *
+ *
+ **************************************************************************/
+
+#include "CorrFctn/AliFemtoBPLCMS3DCorrFctn.h"
+//#include "Infrastructure/AliFemtoHisto.h"
+#include <cstdio>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoBPLCMS3DCorrFctn)
+#endif
+
+//____________________________
+AliFemtoBPLCMS3DCorrFctn::AliFemtoBPLCMS3DCorrFctn(char* title, const int& nbins, const float& QLo, const float& QHi){
+
+  // set some stuff...
+  fQinvNormLo = 0.15;
+  fQinvNormHi = 0.18;
+  fNumRealsNorm = 0;
+  fNumMixedNorm = 0;
+  //  fCorrection = 0;  // pointer to Coulomb Correction object
+
+  fPairCut = 0; // added Sept2000 - CorrFctn-specific PairCut
+
+  //  fSmearPair = 0; // no resolution correction unless user sets SmearPair
+
+  // set up numerator
+  char TitNum[100] = "Num";
+  strcat(TitNum,title);
+  fNumerator = new TH3D(TitNum,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  // set up denominator
+  char TitDen[100] = "Den";
+  strcat(TitDen,title);
+  fDenominator = new TH3D(TitDen,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  // set up uncorrected denominator
+  char TitDenUncoul[100] = "DenNoCoul";
+  strcat(TitDenUncoul,title);
+  //  fUncorrectedDenominator = new TH3D(TitDenUncoul,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  // set up ratio
+  char TitRat[100] = "Rat";
+  strcat(TitRat,title);
+  fRatio = new TH3D(TitRat,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  // set up ave qInv
+  char TitQinv[100] = "Qinv";
+  strcat(TitQinv,title);
+  fQinvHisto = new TH3D(TitQinv,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+
+  // to enable error bar calculation...
+  fNumerator->Sumw2();
+  fDenominator->Sumw2();
+  //  fUncorrectedDenominator->Sumw2();
+  fRatio->Sumw2();
+
+  // Following histos are for the momentum resolution correction
+  // they are filled only if a AliFemtoSmear object is plugged in
+  // here comes the "idea" numerator and denominator and ratio...
+  char TitNumID[100] = "IDNum";
+  strcat(TitNumID,title);
+  fIDNumHisto = new TH3D(TitNumID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  char TitDenID[100] = "IDDen";
+  strcat(TitDenID,title);
+  fIDDenHisto = new TH3D(TitDenID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  char TitRatID[100] = "IDRat";
+  strcat(TitRatID,title);
+  fIDRatHisto = new TH3D(TitRatID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+
+  fIDNumHisto->Sumw2();
+  fIDDenHisto->Sumw2();
+  fIDRatHisto->Sumw2();
+
+  //
+  // here comes the "smeared" numerator and denominator...
+  char TitNumSM[100] = "SMNum";
+  strcat(TitNumSM,title);
+  fSMNumHisto = new TH3D(TitNumSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  char TitDenSM[100] = "SMDen";
+  strcat(TitDenSM,title);
+  fSMDenHisto = new TH3D(TitDenSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  char TitRatSM[100] = "SMRat";
+  strcat(TitRatSM,title);
+  fSMRatHisto = new TH3D(TitRatSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  //
+  fSMNumHisto->Sumw2();
+  fSMDenHisto->Sumw2();
+  fSMRatHisto->Sumw2();
+  //
+  // here comes the correction factor (which is just ratio of ideal ratio to smeared ratio)
+  char TitCorrection[100] = "CorrectionFactor";
+  strcat(TitCorrection,title);
+  fCorrectionHisto = new TH3D(TitCorrection,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);  
+  fCorrectionHisto->Sumw2();
+  // here comes the fully corrected correlation function
+  char TitCorrCF[100] = "CorrectedCF";
+  strcat(TitCorrCF,title);
+  fCorrCFHisto = new TH3D(TitCorrCF,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  fCorrCFHisto->Sumw2();
+
+  // user can (and should) override these defaults...
+  fLambda = 0.6;
+  fRout2 = 6.0*6.0;
+  fRside2 = 6.0*6.0;
+  fRlong2 = 7.0*7.0;
+
+}
+
+//____________________________
+AliFemtoBPLCMS3DCorrFctn::~AliFemtoBPLCMS3DCorrFctn(){
+  delete fNumerator;
+  delete fDenominator;
+  delete fRatio;
+  delete fQinvHisto;
+  delete fIDNumHisto;
+  delete fIDDenHisto;
+  delete fIDRatHisto;
+  delete fSMNumHisto;
+  delete fSMDenHisto;
+  delete fSMRatHisto;
+  delete fCorrectionHisto;
+  delete fCorrCFHisto;
+}
+
+//_________________________
+void AliFemtoBPLCMS3DCorrFctn::WriteOutHistos(){
+
+  fNumerator->Write();
+  fDenominator->Write();
+  //  fUncorrectedDenominator->Write();
+  fRatio->Write();
+  fQinvHisto->Write();
+
+  /*
+    if (fSmearPair){
+    fIDNumHisto->Write();
+    fIDDenHisto->Write();
+    fIDRatHisto->Write();
+    //
+    fSMNumHisto->Write();
+    fSMDenHisto->Write();
+    fSMRatHisto->Write();
+    //
+    fCorrectionHisto->Write();
+    fCorrCFHisto->Write();
+    }
+  */
+}
+
+//_________________________
+void AliFemtoBPLCMS3DCorrFctn::Finish(){
+  // here is where we should normalize, fit, etc...
+  double NumFact,DenFact;
+  if ((fNumRealsNorm !=0) && (fNumMixedNorm !=0)){
+    NumFact = double(fNumRealsNorm);
+    DenFact = double(fNumMixedNorm);
+  }
+  // can happen that the fNumRealsNorm and fNumMixedNorm = 0 if you do non-standard
+  //   things like making a new CorrFctn and just setting the Numerator and Denominator
+  //   from OTHER CorrFctns which you read in (like when doing parallel processing) 
+  else{
+    cout << "Warning! - no normalization constants defined - I do the best I can..." << endl;
+    int nbins = fNumerator->GetNbinsX();
+    int half_way = nbins/2;
+    NumFact = fNumerator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
+    DenFact = fDenominator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
+  }
+
+  fRatio->Divide(fNumerator,fDenominator,DenFact,NumFact);
+  //  fQinvHisto->Divide(fUncorrectedDenominator);
+  fQinvHisto->Divide(fDenominator);
+
+  /*
+  // now do all the resolution correction stuff..
+  if (fSmearPair){  // but only do it if we have been working with a SmearPair
+  fIDRatHisto->Divide(fIDNumHisto,fIDDenHisto);
+  fSMRatHisto->Divide(fSMNumHisto,fSMDenHisto);
+  fCorrectionHisto->Divide(fIDRatHisto,fSMRatHisto);
+  fCorrCFHisto->Multiply(fRatio,fCorrectionHisto);
+  }
+  */
+
+}
+
+//____________________________
+AliFemtoString AliFemtoBPLCMS3DCorrFctn::Report(){
+  string stemp = "LCMS Frame Bertsch-Pratt 3D Correlation Function Report:\n";
+  char ctemp[100];
+  sprintf(ctemp,"Number of entries in numerator:\t%E\n",fNumerator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDenominator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in ratio:\t%E\n",fRatio->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Normalization region in Qinv was:\t%E\t%E\n",fQinvNormLo,fQinvNormHi);
+  stemp += ctemp;
+  sprintf(ctemp,"Number of pairs in Normalization region was:\n");
+  stemp += ctemp;
+  sprintf(ctemp,"In numerator:\t%lu\t In denominator:\t%lu\n",fNumRealsNorm,fNumMixedNorm);
+  stemp += ctemp;
+  /*  if (fCorrection)
+      {
+      float radius = fCorrection->GetRadius();
+      sprintf(ctemp,"Coulomb correction used radius of\t%E\n",radius);
+      }
+      else
+      {
+      sprintf(ctemp,"No Coulomb Correction applied to this CorrFctn\n");
+      }
+      stemp += ctemp;
+  */
+
+  if (fPairCut){
+    sprintf(ctemp,"Here is the PairCut specific to this CorrFctn\n");
+    stemp += ctemp;
+    stemp += fPairCut->Report();
+  }
+  else{
+    sprintf(ctemp,"No PairCut specific to this CorrFctn\n");
+    stemp += ctemp;
+  }
+
+  //  
+  AliFemtoString returnThis = stemp;
+  return returnThis;
+}
+//____________________________
+void AliFemtoBPLCMS3DCorrFctn::AddRealPair(const AliFemtoPair* pair){
+
+  if (fPairCut){
+    if (!(fPairCut->Pass(pair))) return;
+  }
+
+  double Qinv = fabs(pair->qInv());   // note - qInv() will be negative for identical pairs...
+  if ((Qinv < fQinvNormHi) && (Qinv > fQinvNormLo)) fNumRealsNorm++;
+  double qOut = fabs(pair->qOutCMS());
+  double qSide = fabs(pair->qSideCMS());
+  double qLong = fabs(pair->qLongCMS());
+
+  fNumerator->Fill(qOut,qSide,qLong);
+}
+//____________________________
+void AliFemtoBPLCMS3DCorrFctn::AddMixedPair(const AliFemtoPair* pair){
+
+  if (fPairCut){
+    if (!(fPairCut->Pass(pair))) return;
+  }
+
+  //  double CoulombWeight = (fCorrection ? fCorrection->CoulombCorrect(pair) : 1.0);
+  double CoulombWeight = 1.0;
+
+  double Qinv = fabs(pair->qInv());   // note - qInv() will be negative for identical pairs...
+  if ((Qinv < fQinvNormHi) && (Qinv > fQinvNormLo)) fNumMixedNorm++;
+  double qOut = fabs(pair->qOutCMS());
+  double qSide = fabs(pair->qSideCMS());
+  double qLong = fabs(pair->qLongCMS());
+
+  fDenominator->Fill(qOut,qSide,qLong,CoulombWeight);
+  //  fUncorrectedDenominator->Fill(qOut,qSide,qLong,1.0);
+  fQinvHisto->Fill(qOut,qSide,qLong,Qinv);
+
+  /*
+  // now for the momentum resolution stuff...
+  if (fSmearPair){
+      double CorrWeight =  1.0 + 
+      fLambda*exp((-qOut*qOut*fRout2 -qSide*qSide*fRside2 -qLong*qLong*fRlong2)/0.038936366329);
+    CorrWeight *= CoulombWeight;  // impt.
+
+    fIDNumHisto->Fill(qOut,qSide,qLong,CorrWeight);
+    fIDDenHisto->Fill(qOut,qSide,qLong,CoulombWeight);
+
+    fSmearPair->SetUnsmearedPair(pair);
+    double qOut_prime = fabs(fSmearPair->SmearedPair().qOutCMS());
+    double qSide_prime = fabs(fSmearPair->SmearedPair().qSideCMS());
+    double qLong_prime = fabs(fSmearPair->SmearedPair().qLongCMS());
+
+    fSMNumHisto->Fill(qOut_prime,qSide_prime,qLong_prime,CorrWeight);
+
+    double SmearedCoulombWeight = ( fCorrection ? 
+                                   fCorrection->CoulombCorrect(&(fSmearPair->SmearedPair())) : 
+                                   1.0);
+
+    fSMDenHisto->Fill(qOut_prime,qSide_prime,qLong_prime,SmearedCoulombWeight);
+  }
+  */
+}
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.h b/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoBPLCMS3DCorrFctn.h
new file mode 100644 (file)
index 0000000..c37919f
--- /dev/null
@@ -0,0 +1,149 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   This one does 3D Bertsch-Pratt decomposition in the LCMS frame
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.5  2002/06/07 22:51:39  lisa
+ * Widely used AliFemtoBPLCMS3DCorrFctn class now accumulates UNcorrected denominator and has a WriteOutHistos method
+ *
+ * Revision 1.4  2001/05/23 00:19:04  lisa
+ * Add in Smearing classes and methods needed for momentum resolution studies and correction
+ *
+ * Revision 1.3  2000/10/26 19:48:50  rcwells
+ * Added functionality for Coulomb correction of <qInv> in 3D correltions
+ *
+ * Revision 1.2  2000/09/14 18:36:53  lisa
+ * Added Qinv and ExitSep pair cuts and AliFemtoBPLCMS3DCorrFctn_SIM CorrFctn
+ *
+ * Revision 1.1  2000/08/17 20:48:39  lisa
+ * Adding correlationfunction in LCMS frame
+ *
+ *
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoBPLCMS3DCorrFctn_hh
+#define AliFemtoBPLCMS3DCorrFctn_hh
+
+#include "Base/AliFemtoCorrFctn.h"
+//#include "Infrastructure/AliFemtoCoulomb.h"
+#include "Base/AliFemtoPairCut.h"
+//#include "Infrastructure/AliFemtoHisto.h"
+#include "TH3D.h"
+//#include "Infrastructure/AliFemtoSmearPair.h"
+
+class AliFemtoBPLCMS3DCorrFctn : public AliFemtoCorrFctn {
+public:
+  AliFemtoBPLCMS3DCorrFctn(char* title, const int& nbins, const float& QLo, const float& QHi);
+  virtual ~AliFemtoBPLCMS3DCorrFctn();
+
+  virtual AliFemtoString Report();
+  virtual void AddRealPair(const AliFemtoPair*);
+  virtual void AddMixedPair(const AliFemtoPair*);
+
+  virtual void Finish();
+
+  TH3D* Numerator();
+  TH3D* Denominator();
+  TH3D* Ratio();
+  TH3D* QinvHisto();
+
+  // here are get and set for the range over which the correlation function 
+  // is normalized (in Qinv).  The range is set to 0.15..0.18 in the constuctor
+  // by default, but the Set's below override this
+  void SetNormRangeLo(float qLo);
+  void SetNormRangeHi(float qHi);
+  float GetNormRangeLo();
+  float GetNormRangeHi();
+
+  void WriteOutHistos();
+
+  //  void SetCoulombCorrection(AliFemtoCoulomb* Correction);
+
+  void SetSpecificPairCut(AliFemtoPairCut*);
+
+  //  void SetSmearPair(AliFemtoSmearPair*);
+  void SetRout(double guess);
+  void SetRside(double guess);
+  void SetRlong(double guess);
+  void SetLambda(double guess);
+
+
+  // here are a whole bunch of histos that get filled if we do resolution correction
+  TH3D* fIDNumHisto;
+  TH3D* fIDDenHisto;
+  TH3D* fIDRatHisto;
+  //
+  TH3D* fSMNumHisto;
+  TH3D* fSMDenHisto;
+  TH3D* fSMRatHisto;
+  //
+  TH3D* fCorrectionHisto;
+  TH3D* fCorrCFHisto;
+
+
+
+
+private:
+  TH3D* fNumerator;
+  TH3D* fDenominator;
+  //  TH3D* fUncorrectedDenominator;
+  TH3D* fRatio;
+  TH3D* fQinvHisto;
+
+  // for resolution correction
+  //  AliFemtoSmearPair* fSmearPair; //!
+  double fLambda;
+  double fRout2;
+  double fRside2;
+  double fRlong2;
+
+  AliFemtoPairCut* fPairCut;    //! this is a PairCut specific to THIS CorrFctn, not the Analysis
+
+  // upper and lower bounds of Qinv region where to do normalization
+  float fQinvNormLo;
+  float fQinvNormHi;
+
+  // and here are the number of pairs in that region...
+  unsigned long int fNumRealsNorm;
+  unsigned long int fNumMixedNorm;
+
+  //  AliFemtoCoulomb* fCorrection; //!
+
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoBPLCMS3DCorrFctn, 1)
+#endif
+};
+
+inline  TH3D* AliFemtoBPLCMS3DCorrFctn::Numerator(){return fNumerator;}
+inline  TH3D* AliFemtoBPLCMS3DCorrFctn::Denominator(){return fDenominator;}
+//inline  TH3D* AliFemtoBPLCMS3DCorrFctn::UncorrectedDenominator(){return fUncorrectedDenominator;}
+inline  TH3D* AliFemtoBPLCMS3DCorrFctn::Ratio(){return fRatio;}
+inline  TH3D* AliFemtoBPLCMS3DCorrFctn::QinvHisto(){return fQinvHisto;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetNormRangeLo(float qLo){fQinvNormLo = qLo;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetNormRangeHi(float qHi){fQinvNormHi = qHi;}
+inline  float AliFemtoBPLCMS3DCorrFctn::GetNormRangeLo(){return fQinvNormLo;}
+inline  float AliFemtoBPLCMS3DCorrFctn::GetNormRangeHi(){return fQinvNormHi;}
+//inline  void AliFemtoBPLCMS3DCorrFctn::SetCoulombCorrection(AliFemtoCoulomb* Correction){fCorrection = Correction;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetSpecificPairCut(AliFemtoPairCut* pc){fPairCut=pc;}
+//inline  void AliFemtoBPLCMS3DCorrFctn::SetSmearPair(AliFemtoSmearPair* sp){fSmearPair = sp;}
+
+inline  void AliFemtoBPLCMS3DCorrFctn::SetRout(double r){fRout2 = r*r;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetRside(double r){fRside2 = r*r;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetRlong(double r){fRlong2 = r*r;}
+inline  void AliFemtoBPLCMS3DCorrFctn::SetLambda(double l){fLambda = l;}
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.cxx b/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.cxx
new file mode 100644 (file)
index 0000000..6b5eaea
--- /dev/null
@@ -0,0 +1,125 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   a simple Q-invariant correlation function           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.4  2000/01/25 17:34:45  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.3  1999/07/29 02:47:09  lisa
+ * 1) add OpeningAngle correlation function 2) add AliFemtoMcEventReader 3) make histos in CorrFctns do errors correctly
+ *
+ * Revision 1.2  1999/07/06 22:33:20  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "CorrFctn/AliFemtoQinvCorrFctn.h"
+//#include "Infrastructure/AliFemtoHisto.h"
+#include <cstdio>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoQinvCorrFctn)
+#endif
+
+//____________________________
+AliFemtoQinvCorrFctn::AliFemtoQinvCorrFctn(char* title, const int& nbins, const float& QinvLo, const float& QinvHi){
+  // set up numerator
+  //  title = "Num Qinv (MeV/c)";
+  char TitNum[100] = "Num";
+  strcat(TitNum,title);
+  fNumerator = new TH1D(TitNum,title,nbins,QinvLo,QinvHi);
+  // set up denominator
+  //title = "Den Qinv (MeV/c)";
+  char TitDen[100] = "Den";
+  strcat(TitDen,title);
+  fDenominator = new TH1D(TitDen,title,nbins,QinvLo,QinvHi);
+  // set up ratio
+  //title = "Ratio Qinv (MeV/c)";
+  char TitRat[100] = "Rat";
+  strcat(TitRat,title);
+  fRatio = new TH1D(TitRat,title,nbins,QinvLo,QinvHi);
+  // this next bit is unfortunately needed so that we can have many histos of same "title"
+  // it is neccessary if we typedef TH1D to TH1d (which we do)
+  //fNumerator->SetDirectory(0);
+  //fDenominator->SetDirectory(0);
+  //fRatio->SetDirectory(0);
+
+  // to enable error bar calculation...
+  fNumerator->Sumw2();
+  fDenominator->Sumw2();
+  fRatio->Sumw2();
+
+}
+
+//____________________________
+AliFemtoQinvCorrFctn::~AliFemtoQinvCorrFctn(){
+  delete fNumerator;
+  delete fDenominator;
+  delete fRatio;
+}
+//_________________________
+void AliFemtoQinvCorrFctn::Finish(){
+  // here is where we should normalize, fit, etc...
+  // we should NOT Draw() the histos (as I had done it below),
+  // since we want to insulate ourselves from root at this level
+  // of the code.  Do it instead at root command line with browser.
+  //  fNumerator->Draw();
+  //fDenominator->Draw();
+  //fRatio->Draw();
+  fRatio->Divide(fNumerator,fDenominator,1.0,1.0);
+
+}
+
+//____________________________
+AliFemtoString AliFemtoQinvCorrFctn::Report(){
+  string stemp = "Qinv Correlation Function Report:\n";
+  char ctemp[100];
+  sprintf(ctemp,"Number of entries in numerator:\t%E\n",fNumerator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDenominator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in ratio:\t%E\n",fRatio->GetEntries());
+  stemp += ctemp;
+  //  stemp += mCoulombWeight->Report();
+  AliFemtoString returnThis = stemp;
+  return returnThis;
+}
+//____________________________
+void AliFemtoQinvCorrFctn::AddRealPair(const AliFemtoPair* pair){
+  double Qinv = fabs(pair->qInv());   // note - qInv() will be negative for identical pairs...
+  fNumerator->Fill(Qinv);
+  //  cout << "AliFemtoQinvCorrFctn::AddRealPair : " << pair->qInv() << " " << Qinv <<
+  //" " << pair->track1().FourMomentum() << " " << pair->track2().FourMomentum() << endl;
+}
+//____________________________
+void AliFemtoQinvCorrFctn::AddMixedPair(const AliFemtoPair* pair){
+  double weight = 1.0;
+  double Qinv = fabs(pair->qInv());   // note - qInv() will be negative for identical pairs...
+  fDenominator->Fill(Qinv,weight);
+}
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.h b/PWG2/FEMTOSCOPY/AliFemto/CorrFctn/AliFemtoQinvCorrFctn.h
new file mode 100644 (file)
index 0000000..34dd0da
--- /dev/null
@@ -0,0 +1,74 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   a simple Q-invariant correlation function           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.3  2000/01/25 17:34:45  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.2  1999/07/06 22:33:20  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoQinvCorrFctn_hh
+#define AliFemtoQinvCorrFctn_hh
+
+#include "TH1D.h"
+#include "Base/AliFemtoCorrFctn.h"
+
+class AliFemtoQinvCorrFctn : public AliFemtoCorrFctn {
+public:
+  AliFemtoQinvCorrFctn(char* title, const int& nbins, const float& QinvLo, const float& QinvHi);
+  virtual ~AliFemtoQinvCorrFctn();
+
+  virtual AliFemtoString Report();
+  virtual void AddRealPair(const AliFemtoPair*);
+  virtual void AddMixedPair(const AliFemtoPair*);
+
+  virtual void Finish();
+
+  TH1D* Numerator();
+  TH1D* Denominator();
+  TH1D* Ratio();
+
+private:
+  TH1D* fNumerator;
+  TH1D* fDenominator;
+  TH1D* fRatio;
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoQinvCorrFctn, 1)
+#endif
+};
+
+inline  TH1D* AliFemtoQinvCorrFctn::Numerator(){return fNumerator;}
+inline  TH1D* AliFemtoQinvCorrFctn::Denominator(){return fDenominator;}
+inline  TH1D* AliFemtoQinvCorrFctn::Ratio(){return fRatio;}
+
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.cxx b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.cxx
new file mode 100644 (file)
index 0000000..0e22b4e
--- /dev/null
@@ -0,0 +1,106 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   A simple event-wise cut that selects on multiplicity and z-position
+ *   of primary vertex           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.7  2000/02/18 21:27:10  laue
+ * franksTrackCut changed. If mCharge is set to '0' there will be no cut
+ * on charge. This is important for front-loaded cuts.
+ *
+ * Revision 1.6  2000/01/25 17:35:02  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.5  1999/10/15 01:57:03  lisa
+ * Important enhancement of AliFemtoMaker - implement Franks CutMonitors
+ * ----------------------------------------------------------
+ * This means 3 new files in Infrastructure area (CutMonitor),
+ * several specific CutMonitor classes in the Cut area
+ * and a new base class in the Base area (AliFemtoCutMonitor).
+ * This means also changing all Cut Base class header files from .h to .h
+ * so we have access to CutMonitor methods from Cint command line.
+ * This last means
+ * 1) files which include these header files are slightly modified
+ * 2) a side benefit: the TrackCuts and V0Cuts no longer need
+ * a SetMass() implementation in each Cut class, which was stupid.
+ * Also:
+ * -----
+ * Include Franks AliFemtoAssociationReader
+ * ** None of these changes should affect any user **
+ *
+ * Revision 1.4  1999/07/24 16:24:20  lisa
+ * adapt AliFemtoMaker to dev version of library - solaris still gives problems with strings
+ *
+ * Revision 1.3  1999/07/19 14:24:04  hardtke
+ * modifications to implement uDST
+ *
+ * Revision 1.2  1999/07/06 22:33:21  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:56  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Cut/AliFemtoBasicEventCut.h"
+#include <cstdio>
+
+#ifdef __ROOT__
+ClassImp(AliFemtoBasicEventCut)
+#endif
+
+AliFemtoBasicEventCut::AliFemtoBasicEventCut(){
+  fNEventsPassed =  fNEventsFailed = 0;
+} 
+//------------------------------
+//AliFemtoBasicEventCut::~AliFemtoBasicEventCut(){
+//  /* noop */
+//}
+//------------------------------
+bool AliFemtoBasicEventCut::Pass(const AliFemtoEvent* event){
+  int mult =  event->NumberOfTracks();
+  double VertexZPos = event->PrimVertPos().z();
+  cout << "AliFemtoBasicEventCut:: mult:       " << fEventMult[0] << " < " << mult << " < " << fEventMult[1] << endl;
+  cout << "AliFemtoBasicEventCut:: VertexZPos: " << fVertZPos[0] << " < " << VertexZPos << " < " << fVertZPos[1] << endl;
+  bool goodEvent =
+    ((mult > fEventMult[0]) && 
+     (mult < fEventMult[1]) && 
+     (VertexZPos > fVertZPos[0]) &&
+     (VertexZPos < fVertZPos[1]));
+  goodEvent ? fNEventsPassed++ : fNEventsFailed++ ;
+  cout << "AliFemtoBasicEventCut:: return : " << goodEvent << endl;
+  return (goodEvent);
+}
+//------------------------------
+AliFemtoString AliFemtoBasicEventCut::Report(){
+  string Stemp;
+  char Ctemp[100];
+  sprintf(Ctemp,"\nMultiplicity:\t %d-%d",fEventMult[0],fEventMult[1]);
+  Stemp = Ctemp;
+  sprintf(Ctemp,"\nVertex Z-position:\t %E-%E",fVertZPos[0],fVertZPos[1]);
+  Stemp += Ctemp;
+  sprintf(Ctemp,"\nNumber of events which passed:\t%ld  Number which failed:\t%ld",fNEventsPassed,fNEventsFailed);
+  Stemp += Ctemp;
+  AliFemtoString returnThis = Stemp;
+  return returnThis;
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.h b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicEventCut.h
new file mode 100644 (file)
index 0000000..3fb25ab
--- /dev/null
@@ -0,0 +1,115 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   A simple event-wise cut that selects on multiplicity and z-position
+ *   of primary vertex           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.5  2000/03/23 22:57:28  laue
+ * Clone() function implemented
+ *
+ * Revision 1.4  2000/01/25 17:35:02  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.3  1999/10/15 01:57:04  lisa
+ * Important enhancement of AliFemtoMaker - implement Franks CutMonitors
+ * ----------------------------------------------------------
+ * This means 3 new files in Infrastructure area (CutMonitor),
+ * several specific CutMonitor classes in the Cut area
+ * and a new base class in the Base area (AliFemtoCutMonitor).
+ * This means also changing all Cut Base class header files from .h to .h
+ * so we have access to CutMonitor methods from Cint command line.
+ * This last means
+ * 1) files which include these header files are slightly modified
+ * 2) a side benefit: the TrackCuts and V0Cuts no longer need
+ * a SetMass() implementation in each Cut class, which was stupid.
+ * Also:
+ * -----
+ * Include Franks AliFemtoAssociationReader
+ * ** None of these changes should affect any user **
+ *
+ * Revision 1.2  1999/07/06 22:33:21  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:56  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoBasicEventCut_hh
+#define AliFemtoBasicEventCut_hh
+
+// do I need these lines ?
+//#ifndef StMaker_H
+//#include "StMaker.h"
+//#endif
+
+#include "Base/AliFemtoEventCut.h"
+
+class AliFemtoBasicEventCut : public AliFemtoEventCut {
+
+public:
+
+  AliFemtoBasicEventCut();
+  AliFemtoBasicEventCut(AliFemtoBasicEventCut&);
+  //~AliFemtoBasicEventCut();
+
+  void SetEventMult(const int& lo,const int& hi);
+  void SetVertZPos(const float& lo, const float& hi);
+  int NEventsPassed();
+  int NEventsFailed();
+
+  virtual AliFemtoString Report();
+  virtual bool Pass(const AliFemtoEvent*);
+
+  AliFemtoBasicEventCut* Clone();
+
+private:   // here are the quantities I want to cut on...
+
+  int fEventMult[2];      // range of multiplicity
+  float fVertZPos[2];     // range of z-position of vertex
+
+  long fNEventsPassed;
+  long fNEventsFailed;
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoBasicEventCut, 1)
+#endif
+
+};
+
+inline void AliFemtoBasicEventCut::SetEventMult(const int& lo, const int& hi){fEventMult[0]=lo; fEventMult[1]=hi;}
+inline void AliFemtoBasicEventCut::SetVertZPos(const float& lo, const float& hi){fVertZPos[0]=lo; fVertZPos[1]=hi;}
+inline int  AliFemtoBasicEventCut::NEventsPassed() {return fNEventsPassed;}
+inline int  AliFemtoBasicEventCut::NEventsFailed() {return fNEventsFailed;}
+inline AliFemtoBasicEventCut* AliFemtoBasicEventCut::Clone() { AliFemtoBasicEventCut* c = new AliFemtoBasicEventCut(*this); return c;}
+inline AliFemtoBasicEventCut::AliFemtoBasicEventCut(AliFemtoBasicEventCut& c) : AliFemtoEventCut(c) {
+  fEventMult[0] = c.fEventMult[0];
+  fEventMult[1] = c.fEventMult[1];
+  fVertZPos[0] = c.fVertZPos[0];
+  fVertZPos[1] = c.fVertZPos[1];
+  fNEventsPassed = 0;
+  fNEventsFailed = 0;
+}
+
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.cxx b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.cxx
new file mode 100644 (file)
index 0000000..c342cd8
--- /dev/null
@@ -0,0 +1,134 @@
+/***************************************************************************
+ *
+ * $Id: 
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    a simple particle cut that selects on phasespace, #hits, DCA, and PID          
+ *
+ ***************************************************************************
+ *
+ * $Log:
+ **************************************************************************/
+
+#include "Cut/AliFemtoBasicTrackCut.h"
+#include <cstdio>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoBasicTrackCut)
+#endif
+
+AliFemtoBasicTrackCut::AliFemtoBasicTrackCut(){
+  fNTracksPassed = fNTracksFailed = 0;
+  fCharge = 1;  // takes both charges 0
+  fNSigmaPion[0] = -100.0;   fNSigmaPion[1] = 100.0;
+  fNSigmaKaon[0] = -100.0;   fNSigmaKaon[1] = 100.0;
+  fNSigmaProton[0] = -100.0; fNSigmaProton[1] = 100.0;
+  fNHits[0] = 10;          fNHits[1] = 180;
+  fPt[0]=0.0;              fPt[1] = 100.0;//100
+  fRapidity[0]=-2;       fRapidity[1]=2;//-2 2
+  fDCA[0] = -1.0;           fDCA[1] = 20.0;
+
+}
+//------------------------------
+//AliFemtoBasicTrackCut::~AliFemtoBasicTrackCut(){
+//  /* noop */
+//}
+//------------------------------
+bool AliFemtoBasicTrackCut::Pass(const AliFemtoTrack* track){
+
+
+  //  return true ;  // THIS CUT IS A STHBTDUMMY!!
+
+  /*
+    cout << endl;
+    cout << "#track " << trackCount++;
+    cout << " * pion " << (track->NSigmaPion() > fNSigmaPion[0]) && (track->NSigmaPion() < fNSigmaPion[1]);
+    cout << " * kaon " << (track->NSigmaKaon() > fNSigmaKaon[0]) && (track->NSigmaKaon() < fNSigmaKaon[1]);
+    cout << " * proton " << (track->NSigmaProton() > fNSigmaProton[0]) && (track->NSigmaProton() < fNSigmaProton[1]);
+    cout << " * charge " << (track->Charge() == fCharge);
+  */
+  bool goodPID = 1;  
+  /* ----- NOT DOING PID CUTS !!!! ------
+  bool goodPID = ((track->NSigmaPion()   > fNSigmaPion[0]) &&
+                  (track->NSigmaPion()   < fNSigmaPion[1]) &&
+                  (track->NSigmaKaon()   > fNSigmaKaon[0]) &&
+                  (track->NSigmaKaon()   < fNSigmaKaon[1]) &&
+                  (track->NSigmaProton() > fNSigmaProton[0]) &&
+                  (track->NSigmaProton() < fNSigmaProton[1]));
+  ----- NOT DOING PID CUTS !!!! ------ */
+  if (fCharge !=0){               // if user requests "charge=0" then that means ignore charge
+    goodPID = (goodPID&&(track->Charge() == fCharge));
+  }
+  if (goodPID){
+    float TEnergy = ::sqrt(track->P().mag2()+fMass*fMass);
+    float TRapidity = 0.5*::log((TEnergy+track->P().z())/
+                           (TEnergy-track->P().z()));
+
+    float Pt = ::sqrt((track->P().x())*(track->P().x())+
+                    (track->P().y())*(track->P().y()));
+
+    
+    /*
+      cout << " * DCAxy " << (track->DCAxy()  > fDCA[0]) && (track->DCAxy()  < fDCA[1]);
+      cout << " * fDCA[0] " << fDCA[0];
+      cout << " * fDCA[1] " << fDCA[1];
+      cout << " * track->DCAxy " << track->DCAxy();
+      cout << " * NHits " <<  (track->NHits() > fNHits[0]) && (track->NHits() < fNHits[1]); 
+      cout << " * Pt " << (Pt > fPt[0]) && (Pt < fPt[1]);
+      cout << " * y " << (TRapidity > fRapidity[0]) && (TRapidity < fRapidity[1]);
+      cout << endl;
+    */
+
+    bool goodTrack=
+      (//(track->DCAxy()  > fDCA[0]) &&
+     //  (track->DCAxy()  < fDCA[1]) &&
+  //     (track->NHits() > fNHits[0]) &&
+    //   (track->NHits() < fNHits[1]) &&
+       (Pt             > fPt[0]) &&
+       (Pt             < fPt[1]) &&
+       (TRapidity      > fRapidity[0]) &&
+       (TRapidity      < fRapidity[1]))&&
+       (track->PidProbPion()>0.5)&&//moje
+       (track->PidProbMuon()<0.47)&&//moje
+       (track->Label()>0);//moje
+
+    //    cout << track->DCAxy() << " " << track->NHits() << " " << Pt << " " << TRapidity << " " << TEnergy << endl;
+
+    goodTrack ? fNTracksPassed++ : fNTracksFailed++;
+    return (goodTrack);
+  }
+  else{
+    fNTracksFailed++;
+    return (goodPID);
+  }
+}
+//------------------------------
+AliFemtoString AliFemtoBasicTrackCut::Report(){
+  string Stemp;
+  char Ctemp[100];
+  sprintf(Ctemp,"Particle mass:\t%E\n",this->Mass());
+  Stemp=Ctemp;
+  sprintf(Ctemp,"Particle charge:\t%d\n",fCharge);
+  Stemp=Ctemp;
+  sprintf(Ctemp,"Particle Nsigma from pion:\t%E - %E\n",fNSigmaPion[0],fNSigmaPion[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle Nsigma from kaon:\t%E - %E\n",fNSigmaKaon[0],fNSigmaKaon[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle Nsigma from proton:\t%E - %E\n",fNSigmaProton[0],fNSigmaProton[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle #hits:\t%d - %d\n",fNHits[0],fNHits[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle pT:\t%E - %E\n",fPt[0],fPt[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle rapidity:\t%E - %E\n",fRapidity[0],fRapidity[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Particle DCA:\t%E - %E\n",fDCA[0],fDCA[1]);
+  Stemp+=Ctemp;
+  sprintf(Ctemp,"Number of tracks which passed:\t%ld  Number which failed:\t%ld\n",fNTracksPassed,fNTracksFailed);
+  Stemp += Ctemp;
+  AliFemtoString returnThis = Stemp;
+  return returnThis;
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.h b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoBasicTrackCut.h
new file mode 100644 (file)
index 0000000..a166626
--- /dev/null
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *
+ * $Id:
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    a simple particle cut that selects on phasespace, #hits, DCA, and PID          
+ *
+ ***************************************************************************
+ *
+ * $Log:
+ **************************************************************************/
+
+#ifndef AliFemtoBasicTrackCut_hh
+#define AliFemtoBasicTrackCut_hh
+
+//#ifndef StMaker_H
+//#include "StMaker.h"
+//#endif
+
+#include "Base/AliFemtoTrackCut.h"
+
+class AliFemtoBasicTrackCut : public AliFemtoTrackCut {
+
+public:
+
+  AliFemtoBasicTrackCut();
+  //~mikesTrackCut();
+
+  virtual bool Pass(const AliFemtoTrack*);
+
+  virtual AliFemtoString Report();
+
+
+  void SetNSigmaPion(const float& lo, const float& hi);
+  void SetNSigmaKaon(const float& lo, const float& hi);
+  void SetNSigmaProton(const float& lo, const float& hi);
+
+  void SetNHits(const int& lo, const int& hi);
+  void SetPt(const float& lo, const float& hi);
+  void SetRapidity(const float& lo, const float& hi);
+  void SetDCA(const float& lo, const float& hi);
+  void SetCharge(const int&);
+
+
+private:   // here are the quantities I want to cut on...
+
+  int               fCharge;
+  float             fNSigmaPion[2];
+  float             fNSigmaKaon[2];
+  float             fNSigmaProton[2];
+  int               fNHits[2];
+  float             fPt[2];
+  float             fRapidity[2];
+  float             fDCA[2];
+
+  long              fNTracksPassed;
+  long              fNTracksFailed;
+
+#ifdef __ROOT__ 
+  ClassDef(AliFemtoBasicTrackCut, 1)
+#endif
+};
+
+
+inline void AliFemtoBasicTrackCut::SetNSigmaPion(const float& lo, const float& hi){fNSigmaPion[0]=lo; fNSigmaPion[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetNSigmaKaon(const float& lo, const float& hi){fNSigmaKaon[0]=lo; fNSigmaKaon[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetNSigmaProton(const float& lo, const float& hi){fNSigmaProton[0]=lo; fNSigmaProton[1]=hi;}
+
+inline void AliFemtoBasicTrackCut::SetNHits(const int& lo, const int& hi){fNHits[0]=lo;fNHits[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetPt(const float& lo, const float& hi){fPt[0]=lo; fPt[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetRapidity(const float& lo,const float& hi){fRapidity[0]=lo; fRapidity[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetDCA(const float& lo,const float& hi){fDCA[0]=lo; fDCA[1]=hi;}
+inline void AliFemtoBasicTrackCut::SetCharge(const int& ch){fCharge = ch;}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.cxx b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.cxx
new file mode 100644 (file)
index 0000000..84a05e0
--- /dev/null
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   a do-nothing pair cut that simply says "true" to every pair           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007-03-07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.3  2000/01/25 17:35:02  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.2  1999/07/06 22:33:21  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:56  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Cut/AliFemtoDummyPairCut.h"
+#include <string>
+#include <cstdio>
+
+#ifdef __ROOT__
+ClassImp(AliFemtoDummyPairCut)
+#endif
+
+//__________________
+AliFemtoDummyPairCut::AliFemtoDummyPairCut(){
+  fNPairsPassed = fNPairsFailed = 0;
+}
+//__________________
+//AliFemtoDummyPairCut::~AliFemtoDummyPairCut(){
+//  /* no-op */
+//}
+//__________________
+bool AliFemtoDummyPairCut::Pass(const AliFemtoPair* pair){
+  bool temp = true;
+  temp ? fNPairsPassed++ : fNPairsFailed++;
+  return true;
+}
+//__________________
+AliFemtoString AliFemtoDummyPairCut::Report(){
+  string Stemp = "AliFemtoDummy Pair Cut - total dummy-- always returns true\n";
+  char Ctemp[100];
+  sprintf(Ctemp,"Number of pairs which passed:\t%ld  Number which failed:\t%ld\n",fNPairsPassed,fNPairsFailed);
+  Stemp += Ctemp;
+  AliFemtoString returnThis = Stemp;
+  return returnThis;
+}
+//__________________
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.h b/PWG2/FEMTOSCOPY/AliFemto/Cut/AliFemtoDummyPairCut.h
new file mode 100644 (file)
index 0000000..bf46847
--- /dev/null
@@ -0,0 +1,95 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   a do-nothing pair cut that simply says "true" to every pair           
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.5  2000/03/23 22:57:28  laue
+ * Clone() function implemented
+ *
+ * Revision 1.4  2000/01/25 17:35:03  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.3  1999/10/15 01:57:05  lisa
+ * Important enhancement of AliFemtoMaker - implement Franks CutMonitors
+ * ----------------------------------------------------------
+ * This means 3 new files in Infrastructure area (CutMonitor),
+ * several specific CutMonitor classes in the Cut area
+ * and a new base class in the Base area (AliFemtoCutMonitor).
+ * This means also changing all Cut Base class header files from .h to .h
+ * so we have access to CutMonitor methods from Cint command line.
+ * This last means
+ * 1) files which include these header files are slightly modified
+ * 2) a side benefit: the TrackCuts and V0Cuts no longer need
+ * a SetMass() implementation in each Cut class, which was stupid.
+ * Also:
+ * -----
+ * Include Franks AliFemtoAssociationReader
+ * ** None of these changes should affect any user **
+ *
+ * Revision 1.2  1999/07/06 22:33:21  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:56  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+
+#ifndef AliFemtoDummyPairCut_hh
+#define AliFemtoDummyPairCut_hh
+
+// do I need these lines ?
+//#ifndef StMaker_H
+//#include "StMaker.h"
+//#endif
+
+#include "Base/AliFemtoPairCut.h"
+
+class AliFemtoDummyPairCut : public AliFemtoPairCut{
+public:
+  AliFemtoDummyPairCut();
+  AliFemtoDummyPairCut(const AliFemtoDummyPairCut&);
+  //~AliFemtoDummyPairCut();
+
+  virtual bool Pass(const AliFemtoPair*);
+  virtual AliFemtoString Report();
+  AliFemtoDummyPairCut* Clone();
+
+
+private:
+  long fNPairsPassed;
+  long fNPairsFailed;
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoDummyPairCut, 1)
+#endif
+};
+
+inline AliFemtoDummyPairCut::AliFemtoDummyPairCut(const AliFemtoDummyPairCut& c) : AliFemtoPairCut(c) {
+  fNPairsPassed = 0;
+  fNPairsFailed = 0;
+
+}
+inline AliFemtoDummyPairCut* AliFemtoDummyPairCut::Clone() { AliFemtoDummyPairCut* c = new AliFemtoDummyPairCut(*this); return c;}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoAnalysisCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoAnalysisCollection.h
new file mode 100644 (file)
index 0000000..f12e44e
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *  The AnalysisCollection is pointed to by the Manager, and holds pointers
+ *  to all Analysis objects currently active
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.3  2000/03/17 17:23:05  laue
+ * Roberts new three particle correlations implemented.
+ *
+ * Revision 1.2  2000/02/01 00:33:31  laue
+ * namespaces changed to run on the new Solaris Compiler CC5
+ * since we can use member templates in franks1Histo.h we are doing it
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoAnalysisCollection_hh
+#define AliFemtoAnalysisCollection_hh
+
+
+#include <list>
+#if !defined(ST_NO_NAMESPACES)
+using std::list;
+#endif
+class AliFemtoBaseAnalysis;
+
+#ifdef ST_NO_TEMPLATE_DEF_ARGS
+typedef list<AliFemtoBaseAnalysis*, allocator<AliFemtoBaseAnalysis*> >            AliFemtoAnalysisCollection;
+typedef list<AliFemtoBaseAnalysis*, allocator<AliFemtoBaseAnalysis*> >::iterator  AliFemtoAnalysisIterator;
+#else
+typedef list<AliFemtoBaseAnalysis*>            AliFemtoAnalysisCollection;
+typedef list<AliFemtoBaseAnalysis*>::iterator  AliFemtoAnalysisIterator;
+#endif
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCorrFctnCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCorrFctnCollection.h
new file mode 100644 (file)
index 0000000..fa0a1e2
--- /dev/null
@@ -0,0 +1,45 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   The CorrFctnCollection contains pointers to all Correlation Functions
+ *   that are associated with a particular Analysis object.
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.2  2000/02/01 00:33:32  laue
+ * namespaces changed to run on the new Solaris Compiler CC5
+ * since we can use member templates in franks1Histo.h we are doing it
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoCorrFctnCollection_hh
+#define AliFemtoCorrFctnCollection_hh
+
+
+#include <list>
+#if !defined(ST_NO_NAMESPACES)
+using std::list;
+#endif
+class AliFemtoCorrFctn;
+
+#ifdef ST_NO_TEMPLATE_DEF_ARGS
+typedef list<AliFemtoCorrFctn*, allocator<AliFemtoCorrFctn*> >            AliFemtoCorrFctnCollection;
+typedef list<AliFemtoCorrFctn*, allocator<AliFemtoCorrFctn*> >::iterator  AliFemtoCorrFctnIterator;
+#else
+typedef list<AliFemtoCorrFctn*>            AliFemtoCorrFctnCollection;
+typedef list<AliFemtoCorrFctn*>::iterator  AliFemtoCorrFctnIterator;
+#endif
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.cxx
new file mode 100644 (file)
index 0000000..9978c3e
--- /dev/null
@@ -0,0 +1,457 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Randy Wells, Ohio State, rcwells@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    This is a Coulomb correction class which
+ *  1. Reads in the dat from a file
+ *  2. Performs a linear interpolation in R and creates any array of interpolations
+ *  3. Interpolates in eta and returns the Coulomb correction to user
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.17  2003/09/02 17:58:32  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.16  2003/02/04 21:10:31  magestro
+ * Cleaned up a couple functions
+ *
+ * Revision 1.15  2003/01/31 19:44:00  magestro
+ * Cleared up simple compiler warnings on i386_linux24
+ *
+ * Revision 1.14  2000/10/26 19:48:54  rcwells
+ * Added functionality for Coulomb correction of <qInv> in 3D correltions
+ *
+ * Revision 1.13  2000/07/16 21:38:22  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers mTrack,mV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.12  2000/05/31 20:12:53  rcwells
+ * Modified AliFemtoCoulomb for Id and Log entries
+ *
+ *
+ **************************************************************************/
+
+#include "AliFemtoCoulomb.h"
+//#include "Stiostream.h"
+#include <stdio.h>
+#include <cassert>
+#include "PhysicalConstants.h"
+
+#ifdef __ROOT__
+ClassImp(AliFemtoCoulomb)
+#endif
+
+AliFemtoCoulomb::AliFemtoCoulomb() {
+  fFile = "/afs/rhic/star/hbt/coul/AliFemtoCorrectionFiles/correctionpp.dat";
+  if (!fFile) {
+    cout << " No file, dummy!" << endl;
+    assert(0);
+  }
+  fRadius = -1.0;
+  fZ1Z2 = 1.0; // Default has been set up to be same sign charges
+  cout << "You have 1 default Coulomb correction!" << endl;
+}
+
+AliFemtoCoulomb::AliFemtoCoulomb(const char* readFile, const double& radius, const double& charge) {
+  fFile = readFile;
+  fRadius = radius;
+  CreateLookupTable(fRadius);
+  fZ1Z2 = charge;
+  cout << "You have 1 Coulomb correction!" << endl;
+}
+
+AliFemtoCoulomb::~AliFemtoCoulomb() {
+
+}
+
+void AliFemtoCoulomb::SetRadius(const double& radius) {
+  cout << " AliFemtoCoulomb::setRadius() " << endl;
+  fRadius = radius;
+  CreateLookupTable(fRadius);
+}
+
+double AliFemtoCoulomb::GetRadius() {
+  return (fRadius);
+}
+
+void AliFemtoCoulomb::SetFile(const char* readFile) {
+  cout << " AliFemtoCoulomb::SetFile() " << endl;
+  fFile = readFile;
+  // Create new lookup table since file has changed
+  if (fRadius>0.0) {
+    CreateLookupTable(fRadius);
+  }
+}
+
+void AliFemtoCoulomb::SetChargeProduct(const double& charge) {
+  cout << " AliFemtoCoulomb::SetChargeProduct() " << endl;
+  if ( fZ1Z2!=charge ) { 
+    fZ1Z2 = charge;
+    if ( fZ1Z2>0 ) {
+      fFile = "/afs/rhic/star/hbt/coul/AliFemtoCorrectionFiles/correctionpp.dat";
+    }
+    else {
+      fFile = "/afs/rhic/star/hbt/coul/AliFemtoCorrectionFiles/correctionpm.dat";
+    }
+    CreateLookupTable(fRadius);
+  }
+}
+
+void AliFemtoCoulomb::CreateLookupTable(const double& radius) {
+  cout << " AliFemtoCoulomb::CreateLookupTable() " << endl;
+  // Read radii from fFile
+  // Create array(pair) of linear interpolation between radii
+
+  if (radius<0.0) {
+    cout << " AliFemtoCoulomb::CreateLookupTable -> NEGATIVE RADIUS " << endl;
+    cout << "  call AliFemtoCoulomb::SetRadius(r) with positive r " << endl;
+    cerr << " AliFemtoCoulomb::CreateLookupTable -> NEGATIVE RADIUS " << endl;
+    cerr << "  call AliFemtoCoulomb::SetRadius(r) with positive r " << endl;
+    assert(0);
+  }
+  ifstream mystream(fFile);
+  if (!mystream) {
+    cout << "Could not open file" << endl;
+    assert(0);
+  }
+  else {
+    cout << "Input correction file opened" << endl;
+  }
+
+  static char tempstring[2001];
+  static float radii[2000];
+  static int NRadii = 0;
+  NRadii = 0;
+  if (!mystream.getline(tempstring,2000)) {
+    cout << "Could not read radii from file" << endl;
+    assert(0);
+  }
+  for (unsigned int ii=0; ii<strlen(tempstring); ii++) {
+    while (tempstring[ii]==' ') ii++;
+    sscanf(&tempstring[ii++],"%f",&radii[++NRadii]);
+    while ( tempstring[ii]!=' ' && (ii)<strlen(tempstring) )ii++;
+  }
+  cout << " Read " << NRadii << " radii from file" << endl;
+
+  static double LowRadius = -1.0;
+  static double HighRadius = -1.0;
+  static int LowIndex = 0;
+  LowRadius = -1.0;
+  HighRadius = -1.0;
+  LowIndex = 0;
+  for(int iii=1; iii<=NRadii-1; iii++) { // Loop to one less than #radii
+    if ( radius >= radii[iii] && radius <= radii[iii+1] ) {
+      LowRadius = radii[iii];
+      HighRadius = radii[iii+1];
+      LowIndex = iii;
+    }
+  }
+  if ( (LowRadius < 0.0) || (HighRadius < 0.0) ) {
+    cout << "AliFemtoCoulomb::CreateLookupTable --> Problem interpolating radius" << endl;
+    cout << "  Check range of radii in lookup file...." << endl;
+    cerr << "AliFemtoCoulomb::CreateLookupTable --> Problem interpolating radius" << endl;
+    cerr << "  Check range of radii in lookup file...." << endl;
+    assert(0);
+  }
+
+  static double corr[100];           // array of corrections ... must be > NRadii
+  fNLines = 0;
+  static double tempEta = 0;
+  tempEta = 0;
+  while (mystream >> tempEta) {
+    for (int i=1; i<=NRadii; i++) {
+      mystream >> corr[i];
+    }
+    static double LowCoulomb = 0;
+    static double HighCoulomb = 0;
+    static double nCorr = 0;
+    LowCoulomb = corr[LowIndex];
+    HighCoulomb = corr[LowIndex+1];
+    nCorr = ( (radius-LowRadius)*HighCoulomb+(HighRadius-radius)*LowCoulomb )/(HighRadius-LowRadius);
+      fEta[fNLines] = tempEta;     // Eta
+      fCoulomb[fNLines] = nCorr;   // Interpolated Coulomb correction for radius
+      fNLines++;
+  }
+  mystream.close();
+  cout << "Lookup Table is created with " << fNLines << " points" << endl;
+}
+
+double AliFemtoCoulomb::CoulombCorrect(const double& eta) {
+  // Interpolates in eta
+  if (fRadius < 0.0) {
+    cout << "AliFemtoCoulomb::CoulombCorrect(eta) --> Trying to correct for negative radius!" << endl;
+    cerr << "AliFemtoCoulomb::CoulombCorrect(eta) --> Trying to correct for negative radius!" << endl;
+    assert(0);
+  }
+  static int middle=0;
+  middle=int( (fNLines-1)/2 );
+  if (eta*fEta[middle]<0.0) {
+    cout << "AliFemtoCoulomb::CoulombCorrect(eta) --> eta: " << eta << " has wrong sign for data file! " << endl;
+    cerr << "AliFemtoCoulomb::CoulombCorrect(eta) --> eta: " << eta << " has wrong sign for data file! " << endl;
+    assert(0);
+  }
+
+  static double Corr = 0;
+  Corr = -1.0;
+  
+  if ( (eta>fEta[0]) && (fEta[0]>0.0) ) {
+    Corr = fCoulomb[0];
+    return (Corr);
+  }
+  if ( (eta<fEta[fNLines-1]) && (fEta[fNLines-1]<0.0) ) {
+    Corr = fCoulomb[fNLines-1];
+    return (Corr);
+  }
+  // This is a binary search for the bracketing pair of data points
+  static int high = 0;
+  static int low = 0;
+  static int width = 0;
+  high = fNLines-1;
+  low = 0;
+  width = high-low;
+  middle = int(width/2.0); // Was instantiated above
+  while (middle > 0) {
+    if (fEta[low+middle] < eta) {
+      // eta is in the 1st half
+      high-=middle;
+      width = high-low;
+      middle = int(width/2.0);
+    }
+    else {
+      // eta is in the 2nd half
+      low+=middle;
+      width = high-low;
+      middle = int(width/2.0);
+    }
+  }
+  // Make sure we found the right one
+  if ( (fEta[low] >= eta) && (eta >= fEta[low+1]) ) {
+    static double LowEta = 0;
+    static double HighEta = 0;    
+    static double LowCoulomb = 0;
+    static double HighCoulomb = 0;
+    LowEta = fEta[low];
+    HighEta = fEta[low+1];    
+    LowCoulomb = fCoulomb[low];
+    HighCoulomb = fCoulomb[low+1];
+    //      cout << LowEta << " *** Eta *** " << HighEta << endl;
+    //      cout << LowCoulomb << " *** Coulomb *** " << HighCoulomb << endl;
+    Corr = ( (eta-LowEta)*HighCoulomb+(HighEta-eta)*LowCoulomb )/(HighEta-LowEta);
+  }
+  if (Corr<0.0) {
+    cout << "AliFemtoCoulomb::CoulombCorrect(eta) --> No correction" << endl;
+    cout << "  Check range of eta in file: Input eta  " << eta << endl;
+    cerr << "AliFemtoCoulomb::CoulombCorrect(eta) --> No correction" << endl;
+    cerr << "  Check range of eta in file: Input eta  " << eta << endl;
+    assert(0);
+  } 
+  return (Corr);
+
+}
+
+double AliFemtoCoulomb::CoulombCorrect(const double& eta,
+                               const double& radius) {
+  // Checks radii ... input radius and fRadius
+  // Calls createLookupTable if neccessary
+  // Interpolate(linear) between etas in the created lookup table
+
+  if (radius < 0.0) {
+    if (fRadius < 0.0) {
+      // Both radii are negative
+      cout << "AliFemtoCoulomb::CoulombCorrect(eta,r) --> input and member radii are negative!" << endl;
+      cerr << "AliFemtoCoulomb::CoulombCorrect(eta,r) --> input and member radii are negative!" << endl;
+      assert(0);
+    }
+  }
+  else {
+    // radius > 0.0
+    if (radius == fRadius) {
+      // Both radii are positive and equal
+      //      cout << "Radii are the same!!!" << endl;
+    }
+    else {
+      // Both radii are positive but not equal
+      fRadius = radius;
+      CreateLookupTable(fRadius);
+    }
+  }
+
+  // Interpolate in eta
+  return ( CoulombCorrect(eta) );
+}
+
+double AliFemtoCoulomb::CoulombCorrect(const AliFemtoPair* pair) {
+  return ( CoulombCorrect( Eta(pair) ) );;
+}
+
+double AliFemtoCoulomb::CoulombCorrect(const AliFemtoPair* pair, const double& radius) {
+  return ( CoulombCorrect( Eta(pair),radius ) );
+}
+
+double AliFemtoCoulomb::Eta(const AliFemtoPair* pair) {
+  static double px1,py1,pz1,px2,py2,pz2;
+  static double px1new,py1new,pz1new;
+  static double px2new,py2new,pz2new;
+  static double vx1cms,vy1cms,vz1cms;
+  static double vx2cms,vy2cms,vz2cms;
+  static double VcmsX,VcmsY,VcmsZ;
+  static double dv = 0.0;
+  static double e1,e2,e1new,e2new;
+  static double psi,theta;
+  static double beta,gamma;
+  static double VcmsXnew;
+
+  px1 = pair->track1()->FourMomentum().px();
+  py1 = pair->track1()->FourMomentum().py();
+  pz1 = pair->track1()->FourMomentum().pz();
+  e1 = pair->track1()->FourMomentum().e();
+  px2 = pair->track2()->FourMomentum().px();
+  py2 = pair->track2()->FourMomentum().py();
+  pz2 = pair->track2()->FourMomentum().pz();
+  e2 = pair->track2()->FourMomentum().e();
+  
+  VcmsX = ( px1+px2 )/( e1+e2 );
+  VcmsY = ( py1+py2 )/( e1+e2 );
+  VcmsZ = ( pz1+pz2 )/( e1+e2 );
+  // Rotate Vcms to x-direction
+  psi = atan(VcmsY/VcmsX);
+  VcmsXnew = VcmsX*cos(psi)+VcmsY*sin(psi);
+  VcmsX = VcmsXnew;
+  theta = atan(VcmsZ/VcmsX);
+  VcmsXnew = VcmsX*cos(theta)+VcmsZ*sin(theta);
+  VcmsX = VcmsXnew;
+  // Gamma and Beta
+  beta = VcmsX;
+  gamma = 1.0/::sqrt( 1.0-beta*beta );
+
+  // Rotate p1 and p2 to new frame
+  px1new = px1*cos(psi)+py1*sin(psi);
+  py1new = -px1*sin(psi)+py1*cos(psi);
+  px1 = px1new;
+  px1new = px1*cos(theta)+pz1*sin(theta);
+  pz1new = -px1*sin(theta)+pz1*cos(theta);
+  px1 = px1new;
+  py1 = py1new;
+  pz1 = pz1new;
+
+  px2new = px2*cos(psi)+py2*sin(psi);
+  py2new = -px2*sin(psi)+py2*cos(psi);
+  px2 = px2new;
+  px2new = px2*cos(theta)+pz2*sin(theta);
+  pz2new = -px2*sin(theta)+pz2*cos(theta);
+  px2 = px2new;
+  py2 = py2new;
+  pz2 = pz2new;
+
+  // Lorentz transform the x component and energy
+  e1new = gamma*e1 - gamma*beta*px1;
+  px1new = -gamma*beta*e1 + gamma*px1;
+  e2new = gamma*e2 - gamma*beta*px2;
+  px2new = -gamma*beta*e2 + gamma*px2;
+  px1 = px1new;
+  px2 = px2new;
+
+  // New velocities
+  vx1cms = px1/e1new;
+  vy1cms = py1/e1new;
+  vz1cms = pz1/e1new;
+  vx2cms = px2/e2new;
+  vy2cms = py2/e2new;
+  vz2cms = pz2/e2new;
+
+  // Velocity difference in CMS frame
+  dv = ::sqrt( (vx1cms-vx2cms)*(vx1cms-vx2cms) +
+            (vy1cms-vy2cms)*(vy1cms-vy2cms) +
+            (vz1cms-vz2cms)*(vz1cms-vz2cms) );
+
+  return ( fZ1Z2*fine_structure_const/(dv) );
+}
+
+TH1D* AliFemtoCoulomb::CorrectionHistogram(const double& mass1, const double& mass2, const int& nBins, 
+                                               const double& low, const double& high) {
+  if ( mass1!=mass2 ) {
+    cout << "Masses not equal ... try again.  No histogram created." << endl;
+    assert(0);
+  }
+  TH1D* correction = new TH1D("correction","Coulomb correction",nBins,low,high);
+  const double reducedMass = mass1*mass2/(mass1+mass2);
+  double qInv = low;
+  //double dQinv = (high-low)/( (double)nBins );
+  double eta;
+  for (int ii=1; ii<=nBins; ii++) 
+    {
+      qInv = correction->GetBinCenter(ii);
+      eta = 2.0*fZ1Z2*reducedMass*fine_structure_const/( qInv );
+      CoulombCorrect( eta );
+      correction->Fill( qInv, CoulombCorrect(eta,fRadius) );
+    }
+
+  return (correction);
+}
+
+#ifdef __ROOT__
+TH1D* AliFemtoCoulomb::CorrectionHistogram(const TH1D* histo, const double mass) {
+
+  TH1D* correction = (TH1D*) ((TH1D*)histo)->Clone();
+  correction->Reset();
+  correction->SetDirectory(0);
+  int    nBins = correction->GetXaxis()->GetNbins();
+  const double reducedMass = 0.5*mass;
+  double qInv;
+  double eta;
+  for (int ii=1; ii<=nBins; ii++) 
+    {
+      qInv = correction->GetBinCenter(ii);
+      eta = 2.0*fZ1Z2*reducedMass*fine_structure_const/( qInv );
+      correction->Fill( qInv, CoulombCorrect(eta,fRadius) );
+    }
+
+  return (correction);
+}
+
+TH3D* AliFemtoCoulomb::CorrectionHistogram(const TH3D* histo, const double mass) {
+
+  TH3D* correction = (TH3D*) ((TH3D*)histo)->Clone();
+  correction->Reset();
+  correction->SetDirectory(0);
+  int    nBinsX = correction->GetXaxis()->GetNbins();
+  int    nBinsY = correction->GetYaxis()->GetNbins();
+  int    nBinsZ = correction->GetZaxis()->GetNbins();
+  const double reducedMass = 0.5*mass;
+  double eta;
+  double qInv;
+  int binNumber;
+  for (int ii=1; ii<=nBinsX; ii++) { 
+    for (int iii=1; iii<=nBinsY; iii++) {
+      for (int iv=1; iv<=nBinsZ; iv++) {
+       binNumber = histo->GetBin(ii,iii,iv);
+       qInv = histo->GetBinContent(binNumber);
+       eta = 2.0*fZ1Z2*reducedMass*fine_structure_const/( qInv );
+       correction->SetBinContent(binNumber, CoulombCorrect(eta,fRadius) );
+      }
+    }
+  }
+  return (correction);
+}
+#endif
+
+double AliFemtoCoulomb::CoulombCorrect(const double& mass, const double& charge,
+                                   const double& radius, const double& qInv) {
+  fRadius = radius;
+  fZ1Z2 = charge;
+  const double reducedMass = 0.5*mass; // must be same mass particles
+  double eta = 2.0*fZ1Z2*reducedMass*fine_structure_const/( qInv );
+  return ( CoulombCorrect(eta,fRadius) );
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCoulomb.h
new file mode 100644 (file)
index 0000000..f23e486
--- /dev/null
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Randy Wells, Ohio State, rcwells@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    This is a Coulomb correction class which
+ *  1. Reads in the dat from a file
+ *  2. Performs a linear interpolation in R and creates any array of interpolations
+ *  3. Interpolates in eta and returns the Coulomb correction to user
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.12  2000/10/26 19:48:54  rcwells
+ * Added functionality for Coulomb correction of <qInv> in 3D correltions
+ *
+ * Revision 1.11  2000/08/02 01:25:12  lisa
+ * Add Coulomb correction capability to 3D Bertsch-Pratt CorrFctn
+ *
+ * Revision 1.10  2000/07/16 21:38:22  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers mTrack,mV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.9  2000/05/31 20:12:53  rcwells
+ * Modified AliFemtoCoulomb for Id and Log entries
+ *
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoCoulomb_HH
+#define AliFemtoCoulomb_HH
+
+#include <stdio.h>
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoPair.h"
+#include "Infrastructure/AliFemtoParticle.h"
+#include "TH1D.h"
+#include "TH3D.h"
+
+class AliFemtoCoulomb {
+
+public:
+  AliFemtoCoulomb();
+  AliFemtoCoulomb(const char *readFile, const double& radius, const double& charge);
+  virtual ~AliFemtoCoulomb();
+
+  void SetRadius(const double& radius);
+  double GetRadius();
+  void SetFile(const char *readFile);
+  void SetChargeProduct(const double& charge);
+
+  // These have different names so eta/Qinv don't confuse the compiler
+  double CoulombCorrect(const double& eta);
+  double CoulombCorrect(const double& eta, const double& radius);
+  double CoulombCorrect(const AliFemtoPair* pair);
+  double CoulombCorrect(const AliFemtoPair* pair, const double& radius);
+  double CoulombCorrect(const double& mass, const double& charge,
+                       const double& radius, const double& qInv);
+  TH1D* CorrectionHistogram(const double& mass1, const double& mass2, const int& nBins, 
+                                   const double& low, const double& high);
+#ifdef __ROOT__
+  TH1D* CorrectionHistogram(const TH1D*, const double);
+  TH3D* CorrectionHistogram(const TH3D*, const double);
+#endif
+private:
+  double Eta(const AliFemtoPair* pair);                // Calculates eta
+  void CreateLookupTable(const double& radius);  // Creates look-up table
+  const char* fFile;                             // File to interpolate corrections from    
+  double fRadius;                                // Radius from previous iteration
+  double fZ1Z2;                                  // Charge product of particles
+  double fEta[1000];                             // interpolated Coulomb correction table
+  double fCoulomb[1000];                         // interpolated Coulomb correction table
+  int fNLines;                                   // Number of Eta's in lookup-table
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoCoulomb, 0)
+#endif
+};
+
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorCollection.h
new file mode 100644 (file)
index 0000000..fd1d947
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef AliFemtoCutMonitorCollection_hh
+#define AliFemtoCutMonitorCollection_hh
+
+
+//#include <list>
+#include <vector>
+#if !defined(ST_NO_NAMESPACES)
+using std::vector;
+#endif
+class AliFemtoCutMonitor;
+
+#ifdef ST_NO_TEMPLATE_DEF_ARGS
+typedef vector<AliFemtoCutMonitor*, allocator<AliFemtoCutMonitor*> >            AliFemtoCutMonitorCollection;
+typedef vector<AliFemtoCutMonitor*, allocator<AliFemtoCutMonitor*> >::iterator  AliFemtoCutMonitorIterator;
+#else
+typedef vector<AliFemtoCutMonitor*>            AliFemtoCutMonitorCollection;
+typedef vector<AliFemtoCutMonitor*>::iterator  AliFemtoCutMonitorIterator;
+#endif
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.cxx
new file mode 100644 (file)
index 0000000..4fb5fb1
--- /dev/null
@@ -0,0 +1,183 @@
+
+#include "Infrastructure/AliFemtoCutMonitorHandler.h"
+#include "Infrastructure/AliFemtoTypes.h"
+
+#ifdef __ROOT__
+ClassImp(AliFemtoCutMonitorHandler)
+#endif
+// ---------------------------------------------------------------------------
+AliFemtoCutMonitorHandler::AliFemtoCutMonitorHandler() {
+  cout << " *** AliFemtoCutMonitorHandler::AliFemtoCutMonitorHandler() " << endl;
+  fCollectionsEmpty = 0;
+  fPassColl = new AliFemtoCutMonitorCollection();
+  fFailColl = new AliFemtoCutMonitorCollection();
+}
+// ---------------------------------------------------------------------------
+AliFemtoCutMonitorHandler::~AliFemtoCutMonitorHandler() { 
+  delete fPassColl;
+  delete fFailColl;
+}   
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoEvent* event, bool pass) { 
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  if ( pass) {
+    for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(event);
+    }
+  } else {
+    for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(event);
+    }
+  }
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoTrack* track, bool pass) { 
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  if ( pass) {
+    for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(track);
+    }
+  } else {
+    for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(track);
+    }
+  }
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoV0* v0, bool pass) { 
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  if ( pass) {
+    for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(v0);
+    }
+  } else {
+    for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(v0);
+    }
+  }
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoKink* kink, bool pass) { 
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  if ( pass) {
+    for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(kink);
+    }
+  } else {
+    for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(kink);
+    }
+  }
+}
+// ---------------------------------Gael/12/04/02-----------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoPair* pair, bool pass) { 
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  if ( pass) {
+    for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(pair);
+    }
+  } else {
+    for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+      CM = *iter;
+      CM->Fill(pair);
+    }
+  }
+}
+// ---------------------------------Gael/19/06/02-----------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoParticleCollection* partColl) {
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  
+  for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+    CM = *iter;
+    CM->Fill(partColl);
+  }
+}
+// ------------------------------------Gael/19/06/02-------------------------
+void AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoEvent* event,const AliFemtoParticleCollection* partColl) {
+  
+  cout<<"In AliFemtoCutMonitorHandler::FillCutMonitor(const AliFemtoEvent* event, AliFemtoPicoEvent* picoEvent)"<<endl;
+  if (fCollectionsEmpty) return;
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* CM;
+  
+  for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+    CM = *iter;
+    CM->Fill(event,partColl);
+  }
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::Finish() { 
+  AliFemtoCutMonitorIterator iter;
+  for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+    (*iter)->Finish();
+  }
+  for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+    (*iter)->Finish();
+  }
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::AddCutMonitor(AliFemtoCutMonitor* cutMoni1, AliFemtoCutMonitor* cutMoni2) { 
+  fPassColl->push_back(cutMoni1);
+  fFailColl->push_back(cutMoni2);
+  fCollectionsEmpty=false;
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::AddCutMonitor(AliFemtoCutMonitor* cutMoni) { 
+  cout << " make a copy of the cutmonitor and push both into the collections " << endl;
+  cout << " not yet implemented" << endl;
+  fPassColl->push_back(cutMoni);
+  cout << " only pass collection pushed" << endl;
+  fCollectionsEmpty=false;
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::AddCutMonitorPass(AliFemtoCutMonitor* cutMoni) { 
+  fPassColl->push_back(cutMoni);
+  fCollectionsEmpty=false;
+}
+// ---------------------------------------------------------------------------
+void AliFemtoCutMonitorHandler::AddCutMonitorFail(AliFemtoCutMonitor* cutMoni) { 
+  fFailColl->push_back(cutMoni);
+  fCollectionsEmpty=false;
+}
+// ---------------------------------------------------------------------------
+AliFemtoCutMonitor* AliFemtoCutMonitorHandler::PassMonitor(int n) { 
+  AliFemtoCutMonitorIterator iter = fPassColl->begin();
+  if ( (int)fPassColl->size() <= n ) return NULL;
+  for ( int i=0; i<n; i++)
+    iter++;
+  return *iter;
+}
+// ---------------------------------------------------------------------------
+AliFemtoCutMonitor* AliFemtoCutMonitorHandler::FailMonitor(int n) { 
+  AliFemtoCutMonitorIterator iter = fFailColl->begin();
+  if ( (int)fFailColl->size() <= n ) return NULL;
+  for ( int i=0; i<n; i++)
+    iter++;
+  return *iter;
+}
+
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoCutMonitorHandler.h
new file mode 100644 (file)
index 0000000..f48a2bf
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef AliFemtoCutMonitorHandler_hh
+#define AliFemtoCutMonitorHandler_hh
+
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Infrastructure/AliFemtoTrack.h"
+#include "Infrastructure/AliFemtoV0.h"
+#include "Infrastructure/AliFemtoKink.h"
+#include "Infrastructure/AliFemtoPair.h" //Gael 12/04/02
+#include "Infrastructure/AliFemtoParticleCollection.h" // Gael 19/06/02
+#include "Infrastructure/AliFemtoCutMonitorCollection.h"
+#include "Base/AliFemtoCutMonitor.h"
+
+class AliFemtoCutMonitorHandler{
+  
+ public:
+  
+  AliFemtoCutMonitorHandler();
+  virtual ~AliFemtoCutMonitorHandler();
+  
+  AliFemtoCutMonitorCollection* PassMonitorColl(); 
+  AliFemtoCutMonitorCollection* FailMonitorColl(); 
+  AliFemtoCutMonitor* PassMonitor(int n); 
+  AliFemtoCutMonitor* FailMonitor(int n); 
+  void AddCutMonitor(AliFemtoCutMonitor* cutMoni1, AliFemtoCutMonitor* cutMoni2); 
+  void AddCutMonitor(AliFemtoCutMonitor* cutMoni); 
+  void AddCutMonitorPass(AliFemtoCutMonitor* cutMoni); 
+  void AddCutMonitorFail(AliFemtoCutMonitor* cutMoni); 
+  void FillCutMonitor(const AliFemtoEvent* event, bool pass); 
+  void FillCutMonitor(const AliFemtoTrack* track, bool pass); 
+  void FillCutMonitor(const AliFemtoV0* v0, bool pass); 
+  void FillCutMonitor(const AliFemtoKink* kink, bool pass);
+  void FillCutMonitor(const AliFemtoPair* pair, bool pass);//Gael 11/04/02
+  void FillCutMonitor(const AliFemtoParticleCollection* partColl);// Gael 19/06/02
+  void FillCutMonitor(const AliFemtoEvent* event, const AliFemtoParticleCollection* partColl);// Gael 19/06/02
+  void Finish();
+  
+ private:
+  bool fCollectionsEmpty;
+  AliFemtoCutMonitorCollection* fPassColl; 
+  AliFemtoCutMonitorCollection* fFailColl; 
+#ifdef __ROOT__  
+  ClassDef(AliFemtoCutMonitorHandler, 0)
+#endif  
+  
+};
+
+inline AliFemtoCutMonitorCollection* AliFemtoCutMonitorHandler::PassMonitorColl() { return fPassColl;}
+inline AliFemtoCutMonitorCollection* AliFemtoCutMonitorHandler::FailMonitorColl() { return fFailColl;}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEnumeration.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEnumeration.h
new file mode 100644 (file)
index 0000000..1464df7
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, BNL, laue@bnl.gov
+ ***************************************************************************
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.3  2003/01/08 19:43:12  perev
+ * CleanUp
+ *
+ * Revision 1.2  2001/09/05 20:41:42  laue
+ * Updates of the hbtMuDstTree microDSTs
+ *
+ * Revision 1.1  2001/06/21 19:15:45  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ *
+ ***************************************************************************/
+#ifndef AliFemtoEnumeration_hh
+#define AliFemtoEnumeration_hh
+
+enum AliFemtoParticleType {hbtUndefined, hbtTrack, hbtV0, hbtKink, hbtXi};
+enum AliFemtoIOMode {hbtRead, hbtWrite};
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.cxx
new file mode 100644 (file)
index 0000000..e5a3461
--- /dev/null
@@ -0,0 +1,292 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   HbtEvent is the "transient microDST"  Objects of this class are
+ *   generated from the input data by a Reader, and then presented to
+ *   the Cuts of the various active Analyses.
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.2  2007-04-03 16:00:08  mchojnacki
+ * Changes to iprove memory managing
+ *
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.23  2005/08/19 21:19:11  chajecki
+ * line 326: the same change as in line 235
+ *
+ * Revision 1.22  2005/08/19 11:33:31  chajecki
+ * fix due to the last changes in MuDst
+ * line 235: TClonesArray* tracks=0; to TObjArray* tracks=0;
+ * see for more details:
+ * http://www.star.bnl.gov/HyperNews-star/protected/get/starsoft/5949.html
+ *
+ * Revision 1.21  2003/09/02 17:58:32  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.20  2003/01/31 19:43:20  magestro
+ * several casts added to remove compiler warnings
+ *
+ * Revision 1.19  2003/01/17 16:46:58  mercedes
+ * StMuEvent::refMult() added
+ *
+ * Revision 1.18  2002/11/19 23:27:37  renault
+ * New event constructor to find V0 daughters informations(helix for average
+ * separation calculation)
+ *
+ * Revision 1.17  2002/03/21 18:49:31  laue
+ * updated for new MuDst reader
+ *
+ * Revision 1.16  2001/12/06 16:47:13  laue
+ * l3 trigger algorithm added
+ *
+ * Revision 1.15  2001/11/14 21:07:21  lisa
+ * Fixed several small things (mostly discarded const) that caused fatal errors with gcc2.95.3
+ *
+ * Revision 1.14  2001/09/05 20:41:42  laue
+ * Updates of the hbtMuDstTree microDSTs
+ *
+ * Revision 1.13  2001/07/20 20:03:53  rcwells
+ * Added pT weighting and moved event angle cal. to event cut
+ *
+ * Revision 1.12  2001/06/23 21:55:17  laue
+ * AliFemtoCheckPdgIdList can take can not check for mother,particle,daughter
+ * Some output turned off
+ *
+ * Revision 1.11  2001/06/21 19:15:45  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ * Revision 1.10  2001/05/15 15:30:16  rcwells
+ * Added magnetic field to AliFemtoEvent
+ *
+ * Revision 1.9  2000/08/31 22:31:31  laue
+ * AliFemtoAnalysis: output changed (a little bit less)
+ * AliFemtoEvent: new version, members for reference mult added
+ * AliFemtoIOBinary: new IO for new AliFemtoEvent version
+ * AliFemtoTypes: TTree typedef to AliFemtoTTree added
+ * AliFemtoVertexAnalysis: overflow and underflow added
+ *
+ * Revision 1.8  2000/07/16 21:38:22  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers mTrack,mV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.7  2000/05/25 21:54:16  laue
+ * RotateZ implemented. Rotates momentum and helix around the z axis
+ *
+ * Revision 1.5  2000/02/18 21:32:23  laue
+ * franksTrackCut changed. If mCharge is set to '0' there will be no cut
+ * on charge. This is important for front-loaded cuts.
+ *
+ * copy constructor implemented for AliFemtoEvent, AliFemtoTrack and AliFemtoV0.
+ *
+ * franks1HistoD.cxx franks1HistoD.h franks2HistoD.cxx franks2HistoD.h
+ * removed. We can now (CC5 on Solaris) use the versions (no D)
+ *
+ * Revision 1.4  1999/09/16 18:47:59  lisa
+ * replace placeholder HbtV0Track stuff with Helens AliFemtoV0 classes
+ *
+ * Revision 1.3  1999/07/27 10:47:04  lisa
+ * now works in dev on linux and solaris - mistake in deleting picoEvents fixed
+ *
+ * Revision 1.2  1999/07/19 14:24:05  hardtke
+ * modifications to implement uDST
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Infrastructure/AliFemtoTrack.h"
+#include "Infrastructure/AliFemtoV0.h"
+#include "Infrastructure/AliFemtoXi.h"
+#include "Infrastructure/AliFemtoKink.h"
+#include "Base/AliFemtoTrackCut.h"
+#include "Base/AliFemtoV0Cut.h"
+#include "Base/AliFemtoXiCut.h"
+#include "Base/AliFemtoKinkCut.h"
+#include "PhysicalConstants.h"
+#include "SystemOfUnits.h"
+
+// Mike removed all of the AliFemtoTTree stuff here 21apr2006 - it was not used for a long time.
+
+
+
+//___________________
+AliFemtoEvent::AliFemtoEvent(){
+  fPrimVertPos[0]=-999.0;
+  fPrimVertPos[1]=-999.0;
+  fPrimVertPos[2]=-999.0;
+  fTrackCollection = new AliFemtoTrackCollection;
+  fV0Collection = new AliFemtoV0Collection;
+  fXiCollection = new AliFemtoXiCollection;
+  fKinkCollection = new AliFemtoKinkCollection;
+  fMagneticField=0.0;
+}
+//___________________
+AliFemtoEvent::AliFemtoEvent(const AliFemtoEvent& ev, AliFemtoTrackCut* tCut, AliFemtoV0Cut* vCut, AliFemtoXiCut* xCut, AliFemtoKinkCut* kCut){ // copy constructor with track and v0 cuts
+  //cout << "AliFemtoEvent::AliFemtoEvent(const AliFemtoEvent& ev, AliFemtoTrackCut* tCut, AliFemtoV0Cut* vCut, AliFemtoV0Cut* kCut)" << endl;
+  fEventNumber = ev.fEventNumber;
+  fRunNumber = ev.fRunNumber;
+  
+  fZDCN1Energy=ev.fZDCN1Energy;     
+  fZDCP1Energy=ev.fZDCP1Energy;      
+  fZDCN2Energy=ev.fZDCN2Energy;      
+  fZDCP2Energy=ev.fZDCP2Energy;      
+  fZDCEMEnergy=ev.fZDCEMEnergy;
+  fZDCParticipants=ev.fZDCParticipants;
+  fNumberOfTracks = ev.fNumberOfTracks;
+  fMagneticField= ev.fMagneticField;
+  
+  fTriggerMask=ev.fTriggerMask;     // Trigger Type (mask)
+  fTriggerCluster=ev.fTriggerCluster;
+  // create collections
+  fTrackCollection = new AliFemtoTrackCollection;
+  fV0Collection = new AliFemtoV0Collection;
+  fXiCollection = new AliFemtoXiCollection;
+  fKinkCollection = new AliFemtoKinkCollection;
+  // copy track collection  
+  for ( AliFemtoTrackIterator tIter=ev.fTrackCollection->begin(); tIter!=ev.fTrackCollection->end(); tIter++) {
+    if ( !tCut || tCut->Pass(*tIter) ) {
+      AliFemtoTrack* trackCopy = new AliFemtoTrack(**tIter);
+      fTrackCollection->push_back(trackCopy);
+    }
+  }
+  // copy v0 collection
+  for ( AliFemtoV0Iterator vIter=ev.fV0Collection->begin(); vIter!=ev.fV0Collection->end(); vIter++) {
+    if ( !vCut || vCut->Pass(*vIter) ) {
+      AliFemtoV0* v0Copy = new AliFemtoV0(**vIter);
+      fV0Collection->push_back(v0Copy);
+    }
+  }
+  // copy xi collection
+  for ( AliFemtoXiIterator xIter=ev.fXiCollection->begin(); xIter!=ev.fXiCollection->end(); xIter++) {
+    if ( !xCut || xCut->Pass(*xIter) ) {
+      AliFemtoXi* xiCopy = new AliFemtoXi(**xIter);
+      fXiCollection->push_back(xiCopy);
+    }
+  }
+  // copy kink collection  
+  for ( AliFemtoKinkIterator kIter=ev.fKinkCollection->begin(); kIter!=ev.fKinkCollection->end(); kIter++) {
+    if ( !kCut || kCut->Pass(*kIter) ) {
+      //cout << " kinkCut passed " << endl;
+      AliFemtoKink* kinkCopy = new AliFemtoKink(**kIter);
+      fKinkCollection->push_back(kinkCopy);
+    }
+  }
+}
+//___________________
+AliFemtoEvent::~AliFemtoEvent(){
+#ifdef STHBTDEBUG
+  cout << " AliFemtoEvent::~AliFemtoEvent() " << endl;
+#endif
+  for (AliFemtoTrackIterator iter=fTrackCollection->begin();iter!=fTrackCollection->end();iter++){
+    delete *iter;
+  }
+  fTrackCollection->clear();
+  delete fTrackCollection;
+  //must do the same for the V0 collection
+  for (AliFemtoV0Iterator V0iter=fV0Collection->begin();V0iter!=fV0Collection->end();V0iter++){
+    delete *V0iter;
+  }//added by M Chojnacki To avodid memory leak 
+  fV0Collection->clear();
+  delete fV0Collection;
+  //must do the same for the Xi collection
+  for (AliFemtoXiIterator XiIter=fXiCollection->begin();XiIter!=fXiCollection->end();XiIter++){
+    delete *XiIter;
+  }
+  fXiCollection->clear();
+  delete fXiCollection;
+  //must do the same for the Kink collection
+  for (AliFemtoKinkIterator kinkIter=fKinkCollection->begin();kinkIter!=fKinkCollection->end();kinkIter++){
+    delete *kinkIter;
+  }
+  fKinkCollection->clear();
+  delete fKinkCollection;
+}
+//___________________
+
+
+
+void AliFemtoEvent::SetEventNumber(const unsigned short& event){fEventNumber = event;}
+void AliFemtoEvent::SetRunNumber(const int& runNum){fRunNumber = runNum;}
+
+
+void AliFemtoEvent::SetZDCN1Energy(const float& ZDCN1Energy){fZDCN1Energy=ZDCN1Energy;}
+void AliFemtoEvent::SetZDCP1Energy(const float& ZDCP1Energy){fZDCP1Energy=ZDCP1Energy;}      
+void AliFemtoEvent::SetZDCN2Energy(const float& ZDCN2Energy){fZDCN2Energy=ZDCN2Energy;}      
+void AliFemtoEvent::SetZDCP2Energy(const float& ZDCP2Energy){fZDCP2Energy=ZDCP2Energy;}      
+void AliFemtoEvent::SetZDCEMEnergy(const float& ZDCEMEnergy){fZDCEMEnergy=ZDCEMEnergy;}    
+void AliFemtoEvent::SetZDCParticipants(const unsigned int& ZDCParticipants){fZDCParticipants=ZDCParticipants;}
+    
+
+void AliFemtoEvent::SetNumberOfTracks(const unsigned short& tracks){fNumberOfTracks = tracks;}
+
+
+
+void AliFemtoEvent::SetPrimVertPos(const AliFemtoThreeVector& vp){fPrimVertPos = vp;}
+void AliFemtoEvent::SetMagneticField(const double& magF){fMagneticField = magF;}
+
+void AliFemtoEvent::SetTriggerMask(const unsigned long int& TriggerMask) {fTriggerMask=TriggerMask;}
+void AliFemtoEvent::SetTriggerCluster(const unsigned char& TriggerCluster) {fTriggerCluster=TriggerCluster;}
+
+
+unsigned short AliFemtoEvent::EventNumber() const {return fEventNumber;}
+int            AliFemtoEvent::RunNumber() const {return fRunNumber;}
+
+
+
+unsigned short AliFemtoEvent::NumberOfTracks() const {return fNumberOfTracks;}
+
+AliFemtoV0Collection* AliFemtoEvent::V0Collection() const {return fV0Collection;}
+AliFemtoXiCollection* AliFemtoEvent::XiCollection() const {return fXiCollection;}
+AliFemtoKinkCollection* AliFemtoEvent::KinkCollection() const {return fKinkCollection;}
+AliFemtoTrackCollection* AliFemtoEvent::TrackCollection() const {return fTrackCollection;}
+AliFemtoThreeVector AliFemtoEvent::PrimVertPos() const {return fPrimVertPos;}
+double AliFemtoEvent::MagneticField() const {return fMagneticField;}
+unsigned long int AliFemtoEvent::TriggerMask() const {return fTriggerMask;}
+unsigned char AliFemtoEvent::TriggerCluster() const {return fTriggerCluster;}
+
+
+float AliFemtoEvent::ZDCN1Energy() const {return fZDCN1Energy;}       
+float AliFemtoEvent::ZDCP1Energy() const {return fZDCP1Energy;}       
+float AliFemtoEvent::ZDCN2Energy() const {return fZDCN2Energy;}       
+float AliFemtoEvent::ZDCP2Energy() const {return fZDCP2Energy;}       
+float AliFemtoEvent::ZDCEMEnergy() const {return fZDCEMEnergy;}   
+unsigned int  AliFemtoEvent::ZDCParticipants() const {return fZDCParticipants;}
+
+//----------------------------- below here is only for star
+
+double AliFemtoEvent::UncorrectedNumberOfNegativePrimaries() const
+{
+  return NumberOfTracks()/2;
+}
+
+double AliFemtoEvent::UncorrectedNumberOfPrimaries() const
+{
+  return NumberOfTracks();
+}
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEvent.h
new file mode 100644 (file)
index 0000000..26b75ab
--- /dev/null
@@ -0,0 +1,198 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   HbtEvent is the "transient microDST"  Objects of this class are
+ *   generated from the input data by a Reader, and then presented to
+ *   the Cuts of the various active Analyses.
+ *
+ ***************************************************************************
+ * Revision 1.21 to use in Alice version 1 Chojnacki  
+ *
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.20  2003/01/17 16:46:22  mercedes
+ * StMuEvent::refMult() added
+ *
+ * Revision 1.19  2002/11/19 23:27:25  renault
+ * New event constructor to find V0 daughters informations(helix for average
+ * separation calculation)
+ *
+ * Revision 1.18  2002/03/21 18:49:31  laue
+ * updated for new MuDst reader
+ *
+ * Revision 1.17  2001/12/06 16:47:13  laue
+ * l3 trigger algorithm added
+ *
+ * Revision 1.14  2001/06/21 19:15:45  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ * Revision 1.13  2001/06/04 19:09:52  rcwells
+ * Adding B-field, run number, and improved reaction plane functionality
+ *
+ * Revision 1.12  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * Revision 1.11  2001/05/15 15:30:16  rcwells
+ * Added magnetic field to AliFemtoEvent
+ *
+ * Revision 1.10  2000/08/31 22:31:31  laue
+ * AliFemtoAnalysis: output changed (a little bit less)
+ * AliFemtoEvent: new version, members for reference mult added
+ * AliFemtoIOBinary: new IO for new AliFemtoEvent version
+ * AliFemtoTypes: TTree typedef to AliFemtoTTree added
+ * AliFemtoVertexAnalysis: overflow and underflow added
+ *
+ * Revision 1.9  2000/05/25 21:54:16  laue
+ * RotateZ implemented. Rotates momentum and helix around the z axis
+ *
+ * Revision 1.7  2000/02/18 21:32:23  laue
+ * franksTrackCut changed. If mCharge is set to '0' there will be no cut
+ * on charge. This is important for front-loaded cuts.
+ *
+ * copy constructor implemented for AliFemtoEvent, AliFemtoTrack and AliFemtoV0.
+ *
+ * franks1HistoD.cxx franks1HistoD.h franks2HistoD.cxx franks2HistoD.h
+ * removed. We can now (CC5 on Solaris) use the versions (no D)
+ *
+ * Revision 1.6  1999/09/16 18:47:59  lisa
+ * replace placeholder HbtV0Track stuff with Helens AliFemtoV0 classes
+ *
+ * Revision 1.5  1999/09/03 22:39:15  lisa
+ * Readers now MUST have Report() methods and MAY have WriteHbtEvent() methods
+ *
+ * Revision 1.4  1999/07/19 14:24:06  hardtke
+ * modifications to implement uDST
+ *
+ * Revision 1.3  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.2  1999/06/29 17:50:27  fisyak
+ * formal changes to account new StEvent, does not complie yet
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoEvent_hh
+#define AliFemtoEvent_hh
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoTrackCollection.h"
+#include "Infrastructure/AliFemtoV0Collection.h"
+#include "Infrastructure/AliFemtoXiCollection.h"
+#include "Infrastructure/AliFemtoKinkCollection.h"
+
+class AliFemtoTrackCut;
+class AliFemtoV0Cut;
+class AliFemtoXiCut;
+class AliFemtoKinkCut;
+
+
+#ifdef __ROOT__
+
+// the following encapsulation by malisa 21apr2006
+#ifndef __NO_STAR_DEPENDENCE_ALLOWED__
+class StMuDst;
+#endif
+
+#endif
+
+class AliFemtoEvent{
+public:
+  AliFemtoEvent();
+#ifdef __ROOT__
+#ifndef __NO_STAR_DEPENDENCE_ALLOWED__
+//
+#endif
+#endif
+  AliFemtoEvent(const AliFemtoEvent&, AliFemtoTrackCut* =0, AliFemtoV0Cut* =0,  AliFemtoXiCut* =0, AliFemtoKinkCut* =0); // copy constructor with track and v0 cuts
+  ~AliFemtoEvent();
+
+  unsigned short EventNumber() const;
+  int RunNumber() const;
+  unsigned short NumberOfTracks() const;
+  AliFemtoThreeVector PrimVertPos() const;
+  AliFemtoV0Collection* V0Collection() const;
+  AliFemtoXiCollection* XiCollection() const;
+  AliFemtoKinkCollection* KinkCollection() const;
+  AliFemtoTrackCollection* TrackCollection() const;
+  double MagneticField() const;
+
+  //functions for alice variables
+  float ZDCN1Energy() const;      
+  float ZDCP1Energy() const;      
+  float ZDCN2Energy() const;      
+  float ZDCP2Energy() const;      
+  float ZDCEMEnergy() const;    
+  unsigned int ZDCParticipants() const; 
+  
+  unsigned long int     TriggerMask() const;     
+  unsigned char      TriggerCluster() const;  
+  
+  void SetEventNumber(const unsigned short&);
+  void SetRunNumber(const int&);
+  void SetNumberOfTracks(const unsigned short&);
+  void SetPrimVertPos(const AliFemtoThreeVector&);
+  void SetMagneticField(const double&);
+  
+   //functions for alice variables
+  void SetZDCN1Energy(const float&);      
+  void SetZDCP1Energy(const float&);      
+  void SetZDCN2Energy(const float&);      
+  void SetZDCP2Energy(const float&);      
+  void SetZDCEMEnergy(const float&);    
+  void SetZDCParticipants(const unsigned int&);
+  
+  void SetTriggerMask(const unsigned long int&);     
+  void SetTriggerCluster(const unsigned char&); 
+  
+  double UncorrectedNumberOfNegativePrimaries() const;
+  double UncorrectedNumberOfPrimaries() const;
+
+private:
+  unsigned short fEventNumber;           //
+  unsigned short fRunNumber;
+  unsigned short fNumberOfTracks;     // total number of TPC tracks
+  double fMagneticField; // magnetic field in Z direction
+
+  AliFemtoThreeVector fPrimVertPos;
+  AliFemtoTrackCollection* fTrackCollection;
+  AliFemtoV0Collection* fV0Collection;
+  AliFemtoXiCollection* fXiCollection;
+  AliFemtoKinkCollection* fKinkCollection;
+
+  //for alice changed by Marek Chojnacki
+  float      fZDCN1Energy;      // reconstructed energy in the neutron ZDC
+  float      fZDCP1Energy;      // reconstructed energy in the proton ZDC
+  float      fZDCN2Energy;      // reconstructed energy in the neutron ZDC
+  float      fZDCP2Energy;      // reconstructed energy in the proton ZDC
+  float      fZDCEMEnergy;     // reconstructed energy in the electromagnetic ZDC
+  unsigned int        fZDCParticipants; // number of participants estimated by the ZDC
+  
+  unsigned long int     fTriggerMask;     // Trigger Type (mask)
+  unsigned char      fTriggerCluster;  // Trigger cluster (mask)
+};
+
+
+
+#endif 
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEventWriterCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoEventWriterCollection.h
new file mode 100644 (file)
index 0000000..0089c2f
--- /dev/null
@@ -0,0 +1,34 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, Ohio State, laue@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *  The EventWriterCollection is pointed to by the Manager, and holds pointers
+ *  to all EventWriter objects currently active
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoEventWriterCollection_hh
+#define AliFemtoEventWriterCollection_hh
+
+#include "Base/AliFemtoEventWriter.h"
+
+#include <list>
+#if !defined(ST_NO_NAMESPACES)
+using std::list;
+#endif
+
+#ifdef ST_NO_TEMPLATE_DEF_ARGS
+typedef list<AliFemtoEventWriter*, allocator<AliFemtoEventWriter*> >            AliFemtoEventWriterCollection;
+typedef list<AliFemtoEventWriter*, allocator<AliFemtoEventWriter*> >::iterator  AliFemtoEventWriterIterator;
+#else
+typedef list<AliFemtoEventWriter*>            AliFemtoEventWriterCollection;
+typedef list<AliFemtoEventWriter*>::iterator  AliFemtoEventWriterIterator;
+#endif
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoHelix.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoHelix.h
new file mode 100644 (file)
index 0000000..0715659
--- /dev/null
@@ -0,0 +1,37 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Frank Laue, BNL, laue@bnl.gov
+ ***************************************************************************
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.1  2001/06/21 19:15:45  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ *
+ ***************************************************************************/
+#ifndef AliFemtoHelix_hh
+#define AliFemtoHelix_hh
+
+#include "AliFmHelix.h"
+typedef AliFmHelix AliFemtoHelix;//!
+#include "AliFmPhysicalHelixD.h"
+typedef AliFmPhysicalHelixD AliFemtoPhysicalHelix;//!
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.cxx
new file mode 100644 (file)
index 0000000..9d50d36
--- /dev/null
@@ -0,0 +1,112 @@
+/***********************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, 23May2001
+ *
+ ***********************************************************************
+ *
+ * Description: Kink class with information gotten from the StKinkVertex
+ *              of Wenshen Deng and Spiros Margetis
+ *
+ ***********************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.4  2001/11/14 21:07:21  lisa
+ * Fixed several small things (mostly discarded const) that caused fatal errors with gcc2.95.3
+ *
+ * Revision 1.3  2001/09/05 21:55:23  laue
+ * typo fixed
+ *
+ * Revision 1.2  2001/06/21 19:15:46  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ * Revision 1.1  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * 
+ *
+ ***********************************************************************/
+
+#include "AliFemtoKink.h"
+#include "phys_constants.h"
+#include "Infrastructure/AliFemtoTrack.h"
+// -----------------------------------------------------------------------
+AliFemtoKink::AliFemtoKink(const AliFemtoKink& k){ // copy constructor
+
+  fDcaParentDaughter          =   k.fDcaParentDaughter;           
+  fDcaDaughterPrimaryVertex   =   k.fDcaDaughterPrimaryVertex;    
+  fDcaParentPrimaryVertex     =   k.fDcaParentPrimaryVertex;      
+  fHitDistanceParentDaughter  =   k.fHitDistanceParentDaughter;   
+  fHitDistanceParentVertex    =   k.fHitDistanceParentVertex;     
+  fDeltaEnergy[0]             =   k.fDeltaEnergy[0];              
+  fDeltaEnergy[1]             =   k.fDeltaEnergy[1];              
+  fDeltaEnergy[2]             =   k.fDeltaEnergy[2];              
+  fDecayAngle                 =   k.fDecayAngle;                  
+  fDecayAngleCM               =   k.fDecayAngleCM;                
+  fDaughter                   =   k.fDaughter;                    
+  mParent                     =   k.mParent;                      
+  mPosition                   =   k.mPosition;                
+
+}
+// -----------------------------------------------------------------------
+
+
+//--------------------- below here is ONLY star ----------------
+#ifndef __NO_STAR_DEPENDENCE_ALLOWED__
+#ifdef __ROOT__
+#include "StEvent/StTrack.h"
+#include "StEvent/StKinkVertex.h"
+AliFemtoKink::AliFemtoKink( const StKinkVertex& SKV, AliFemtoThreeVector PrimaryVertex )
+{ 
+
+  fDcaParentDaughter          = SKV.dcaParentDaughter();
+  fDcaDaughterPrimaryVertex   = SKV.dcaDaughterPrimaryVertex();
+  fDcaParentPrimaryVertex     = SKV.dcaParentPrimaryVertex();
+  fHitDistanceParentDaughter  = SKV.hitDistanceParentDaughter();
+  fHitDistanceParentVertex    = SKV.hitDistanceParentVertex();
+  fDeltaEnergy[0]             = SKV.dE(0);
+  fDeltaEnergy[1]             = SKV.dE(1);
+  fDeltaEnergy[2]             = SKV.dE(2);
+  fDecayAngle                 = SKV.decayAngle();
+  fDecayAngleCM               = SKV.decayAngleCM();
+
+  // now fill member AliFemtoTrack data...
+  const StTrack* StTrk;
+  AliFemtoTrack* HbtTrk;
+  // Daughter
+  StTrk = SKV.daughter(0);
+  HbtTrk = new AliFemtoTrack(StTrk,PrimaryVertex); // generate NEW HbtTrack from StTrack
+  fDaughter = *HbtTrk;                         // invoke copy ctr of AliFemtoTrack
+  delete HbtTrk;                               // get rid of the NEW HbtTrack - we are done with that
+  // Parent
+  StTrk = SKV.parent();
+  HbtTrk = new AliFemtoTrack(StTrk,PrimaryVertex); // generate NEW HbtTrack from StTrack
+  mParent = *HbtTrk;                           // invoke copy ctr of AliFemtoTrack
+  delete HbtTrk;                               // get rid of the NEW HbtTrack - we are done with that
+
+  // finally, the kink position
+  mPosition.setX(SKV.position().x());
+  mPosition.setY(SKV.position().y());
+  mPosition.setZ(SKV.position().z());
+
+}
+
+// mike removed all AliFemtoTTree stuff 21apr2006
+
+#endif // __ROOT__
+#endif  // __NO_STAR_DEPENDENCE_ALLOWED__
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKink.h
new file mode 100644 (file)
index 0000000..8d7f67c
--- /dev/null
@@ -0,0 +1,129 @@
+/***********************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, 23May2001
+ *
+ ***********************************************************************
+ *
+ * Description: Kink class with information gotten from the StKinkVertex
+ *              of Wenshen Deng and Spiros Margetis
+ *
+ ***********************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.4  2003/09/02 17:58:32  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.3  2001/11/14 21:07:21  lisa
+ * Fixed several small things (mostly discarded const) that caused fatal errors with gcc2.95.3
+ *
+ * Revision 1.2  2001/06/21 19:15:46  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ * Revision 1.1  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * 
+ *
+ ***********************************************************************/
+#ifndef AliFemtoKink_hh
+#define AliFemtoKink_hh
+
+class StKinkVertex;
+//#include "StEvent/StKinkVertex.h"  // from StEvent
+#include "Infrastructure/AliFemtoTrack.h"
+
+#include "Infrastructure/AliFemtoTypes.h" //same as in AliFemtoTrack.h
+
+class AliFemtoKink {
+public:
+  AliFemtoKink(){/* no-op */}
+  AliFemtoKink( const AliFemtoKink&); // copy constructor
+#ifndef __NO_STAR_DEPENDENCE_ALLOWED__
+#ifdef __ROOT__
+  AliFemtoKink( const StKinkVertex&, AliFemtoThreeVector PrimaryVertex); // create a AliFemtoKink from a StKinkVertex
+#endif
+#endif
+  ~AliFemtoKink(){/* no-op */}
+
+  // Get's
+  float        DcaParentDaughter() const;
+  float        DcaDaughterPrimaryVertex() const;
+  float        DcaParentPrimaryVertex() const;
+  float        HitDistanceParentDaughter() const;
+  float        HitDistanceParentVertex() const;
+  float        DeltaEnergy(int i=0) const;
+  float        DecayAngle() const;
+  float        DecayAngleCM() const;
+  AliFemtoTrack   Daughter() const;
+  AliFemtoTrack   Parent() const;
+  AliFemtoThreeVector Position() const; 
+
+  
+
+protected:
+
+  float        fDcaParentDaughter;           // from StKinkVertex class directly 
+  float        fDcaDaughterPrimaryVertex;    // from StKinkVertex class directly 
+  float        fDcaParentPrimaryVertex;      // from StKinkVertex class directly 
+  float        fHitDistanceParentDaughter;   // from StKinkVertex class directly 
+  float        fHitDistanceParentVertex;     // from StKinkVertex class directly 
+  float        fDeltaEnergy[3];              // from StKinkVertex class directly 
+  float        fDecayAngle;                  // from StKinkVertex class directly 
+  float        fDecayAngleCM;                // from StKinkVertex class directly 
+  AliFemtoTrack   fDaughter;                    // from StKinkVertex class directly 
+  AliFemtoTrack   mParent;                      // from StVertex class (which StKinkVertex inherits from)
+  AliFemtoThreeVector mPosition;                // from StMeasuredPoint class (which StVertex inherits from)
+
+};
+
+// Get's
+inline float        AliFemtoKink::DcaParentDaughter() const {return fDcaParentDaughter;}
+inline float        AliFemtoKink::DcaDaughterPrimaryVertex() const {return fDcaDaughterPrimaryVertex;}
+inline float        AliFemtoKink::DcaParentPrimaryVertex() const {return fDcaParentPrimaryVertex;}
+inline float        AliFemtoKink::HitDistanceParentDaughter() const {return fHitDistanceParentDaughter;}
+inline float        AliFemtoKink::HitDistanceParentVertex() const {return fHitDistanceParentVertex;}
+inline float        AliFemtoKink::DeltaEnergy(int i) const {return fDeltaEnergy[i];}
+inline float        AliFemtoKink::DecayAngle() const {return fDecayAngle;}
+inline float        AliFemtoKink::DecayAngleCM() const {return fDecayAngleCM;}
+inline AliFemtoTrack   AliFemtoKink::Daughter() const {return fDaughter;}
+inline AliFemtoTrack   AliFemtoKink::Parent() const {return mParent;}
+inline AliFemtoThreeVector AliFemtoKink::Position() const {return mPosition;}
+
+
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKinkCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoKinkCollection.h
new file mode 100644 (file)
index 0000000..135b248
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   The Collection of Kinks is the a component of the HbtEvent,
+ *   which is essentially the transient microDST
+ *
+ ****************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.1  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ *
+ ***************************************************************************/
+
+
+#ifndef AliFemtoKinkCollection_hh
+#define AliFemtoKinkCollection_hh
+#include "Infrastructure/AliFemtoKink.h"
+#include <list>
+
+#if !defined(ST_NO_NAMESPACES)
+using std::list;
+#endif
+
+#ifdef ST_NO_TEMPLATE_DEF_ARGS
+typedef list<AliFemtoKink*, allocator<AliFemtoKink*> >            AliFemtoKinkCollection;
+typedef list<AliFemtoKink*, allocator<AliFemtoKink*> >::iterator  AliFemtoKinkIterator;
+#else
+typedef list<AliFemtoKink*>            AliFemtoKinkCollection;
+typedef list<AliFemtoKink*>::iterator  AliFemtoKinkIterator;
+#endif
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLinkDef.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLinkDef.h
new file mode 100644 (file)
index 0000000..c7fa87d
--- /dev/null
@@ -0,0 +1,30 @@
+// LinkDef.h
+
+#ifdef __CINT__
+// General:
+#pragma link off all globals;
+#pragma link off all classes;
+#pragma link off all functions;
+
+#pragma link C++ class AliFemtoBaseAnalysis;
+#pragma link C++ class AliFemtoEventCut;
+#pragma link C++ class AliFemtoEventReader;
+#pragma link C++ class AliFemtoKinkCut;
+#pragma link C++ class AliFemtoPairCut;
+#pragma link C++ class AliFemtoParticleCut;
+#pragma link C++ class AliFemtoTrackCut;
+#pragma link C++ class AliFemtoV0Cut;
+#pragma link C++ class AliFemtoXiCut;
+#pragma link C++ class AliFemtoAnalysis;
+#pragma link C++ class AliFemtoCutMonitorHandler;
+#pragma link C++ class AliFemtoLikeSignAnalysis;
+#pragma link C++ class AliFemtoManager;
+#pragma link C++ class AliFemtoVertexAnalysis;
+//#pragma link C++ class AliFemtoVertexMultAnalysis;
+
+
+//#pragma link C++ class AliFemtoCoulomb; - leave this out for now
+
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVector.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVector.h
new file mode 100644 (file)
index 0000000..a574e38
--- /dev/null
@@ -0,0 +1,735 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Brian Lasiuk, Thomas Ullrich, April 1998
+ ***************************************************************************
+ *
+ * Description:
+ *
+ * Remarks:   Since not all compilers support member templates
+ *            we have to specialize the templated member on these
+ *            platforms. If member templates are not supported the
+ *            ST_NO_MEMBER_TEMPLATES flag has to be set. tu.
+ *
+ *            In the near future when all compilers can handle member
+ *            templates this class should be cleaned up. A lot of
+ *            redundant code can be removed as soon as the compilers
+ *            are up-to-date. tu
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.11  2005/09/22 20:09:20  fisyak
+ * Make AliFemtoLorentzVector persistent
+ *
+ * Revision 1.10  2005/07/06 18:49:56  fisyak
+ * Replace AliFemtoHelixD, AliFemtoLorentzVectorD,AliFemtoLorentzVectorF,AliFemtoMatrixD,AliFemtoMatrixF,AliFemtoPhysicalHelixD,AliFemtoThreeVectorD,AliFemtoThreeVectorF by templated version
+ *
+ * Revision 1.9  2005/03/28 06:02:45  perev
+ * Defence FPE added
+ *
+ * Revision 1.8  2003/09/02 17:59:35  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.7  2003/05/01 19:24:31  ullrich
+ * Corrected problem in boost().
+ *
+ * Revision 1.6  1999/10/15 15:56:36  ullrich
+ * Changed output format in operator<<, added operator>>
+ *
+ * Revision 1.5  1999/06/04 18:01:36  ullrich
+ * New operators operator() and operator[] which can be used
+ * as lvalues.
+ *
+ * Revision 1.4  1999/04/14 23:12:07  fisyak
+ * Add __CINT__ to handle references
+ *
+ * Revision 1.3  1999/02/17 11:38:36  ullrich
+ * Removed specialization for 'long double'.
+ *
+ * Revision 1.2  1999/02/14 23:11:42  fisyak
+ * Fixes for Rootcint
+ *
+ * Revision 1.1  1999/01/30 03:59:02  fisyak
+ * Root Version of AliFemtoarClassLibrary
+ *
+ * Revision 1.1  1999/01/23 00:27:52  ullrich
+ * Initial Revision
+ *
+ **************************************************************************/
+#ifndef ST_LORENTZ_VECTOR_HH
+#define ST_LORENTZ_VECTOR_HH
+
+#include "AliFemtoThreeVector.h"
+template<class T> class AliFemtoLorentzVector {
+public:
+    AliFemtoLorentzVector(T = 0, T = 0, T = 0, T = 0);
+    virtual ~AliFemtoLorentzVector();
+    
+#ifndef ST_NO_MEMBER_TEMPLATES
+    template<class X> AliFemtoLorentzVector(const AliFemtoThreeVector<X>&, T);
+    template<class X> AliFemtoLorentzVector(T, const AliFemtoThreeVector<X>&);   
+
+    template<class X> AliFemtoLorentzVector(const AliFemtoLorentzVector<X>&);
+    template<class X> AliFemtoLorentzVector<T>& operator=(const AliFemtoLorentzVector<X>&);
+    // AliFemtoLorentzVector(const AliFemtoLorentzVector<T>&);                use default
+    // AliFemtoLorentzVector<T>& operator=(const AliFemtoLorentzVector<T>&);  use default
+#else
+    AliFemtoLorentzVector(const AliFemtoThreeVector<float>&, T);
+    AliFemtoLorentzVector(T, const AliFemtoThreeVector<float>&);   
+    AliFemtoLorentzVector(const AliFemtoLorentzVector<float>&);
+    
+    AliFemtoLorentzVector(const AliFemtoThreeVector<double>&, T);
+    AliFemtoLorentzVector(T, const AliFemtoThreeVector<double>&);   
+    AliFemtoLorentzVector(const AliFemtoLorentzVector<double>&);
+        
+    AliFemtoLorentzVector<T>& operator=(const AliFemtoLorentzVector<float>&);
+    AliFemtoLorentzVector<T>& operator=(const AliFemtoLorentzVector<double>&);
+#endif
+    
+    T x()                     const;
+    T y()                     const;
+    T z()                     const;
+    T t()                     const;
+    T px()                    const;
+    T py()                    const;
+    T pz()                    const;
+    T e()                     const;
+    T operator()  (size_t)    const;
+    T operator[]  (size_t)    const;
+    
+    T& operator()  (size_t);
+    T& operator[]  (size_t);
+
+    const AliFemtoThreeVector<T>& vect() const;    
+    
+    void setX(T);
+    void setY(T);
+    void setZ(T);
+    void setPx(T);
+    void setPy(T);
+    void setPz(T);
+    void setE(T);
+    void setT(T);
+    
+#ifndef ST_NO_MEMBER_TEMPLATES
+    template <class X> void setVect(const AliFemtoThreeVector<X>&);
+#else
+    void setVect(const AliFemtoThreeVector<float>&);
+    void setVect(const AliFemtoThreeVector<double>&);
+#endif   
+
+    T perp()               const;
+    T perp2()              const;
+    T pseudoRapidity()     const;
+    T phi()                const;
+    T theta()              const;
+    T cosTheta()           const;
+    
+    T plus()               const;
+    T minus()              const;
+    
+    T m()                  const; 
+    T m2()                 const; 
+    T mt()                 const;
+    T mt2()                const;
+    T rapidity()           const;
+    
+#ifndef ST_NO_MEMBER_TEMPLATES
+    template<class X> AliFemtoLorentzVector<T> boost(const AliFemtoLorentzVector<X>&) const;
+#else
+    AliFemtoLorentzVector<T> boost(const AliFemtoLorentzVector<float>&) const;
+    AliFemtoLorentzVector<T> boost(const AliFemtoLorentzVector<double>&) const;
+#endif   
+    
+    AliFemtoLorentzVector<T>  operator- ();
+    AliFemtoLorentzVector<T>  operator+ ();
+    AliFemtoLorentzVector<T>& operator*= (double);
+    AliFemtoLorentzVector<T>& operator/= (double);
+
+#ifndef ST_NO_MEMBER_TEMPLATES
+    template<class X> bool operator == (const AliFemtoLorentzVector<X>&) const;
+    template<class X> bool operator != (const AliFemtoLorentzVector<X>&) const;
+    template<class X> AliFemtoLorentzVector<T>& operator+= (const AliFemtoLorentzVector<X>&);
+    template<class X> AliFemtoLorentzVector<T>& operator-= (const AliFemtoLorentzVector<X>&);
+#else    
+    bool operator == (const AliFemtoLorentzVector<float>&) const;
+    bool operator != (const AliFemtoLorentzVector<float>&) const;
+    bool operator == (const AliFemtoLorentzVector<double>&) const;
+    bool operator != (const AliFemtoLorentzVector<double>&) const;
+
+    AliFemtoLorentzVector<T>& operator+= (const AliFemtoLorentzVector<float>&);
+    AliFemtoLorentzVector<T>& operator-= (const AliFemtoLorentzVector<float>&);
+    AliFemtoLorentzVector<T>& operator+= (const AliFemtoLorentzVector<double>&);
+    AliFemtoLorentzVector<T>& operator-= (const AliFemtoLorentzVector<double>&);
+#endif
+
+protected:
+    AliFemtoThreeVector<T> mThreeVector;
+    T               mX4;
+#ifdef __ROOT__
+  ClassDef(AliFemtoLorentzVector,3)
+#endif
+};
+#ifndef __CINT__
+//
+//        Implementation of member functions
+//
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(T x, T y, T z, T t)
+    : mThreeVector(x, y, z), mX4(t) { /* nop */ }
+
+template<class T>
+AliFemtoLorentzVector<T>::~AliFemtoLorentzVector() { /* nopt */ }    
+
+template<class T>
+const AliFemtoThreeVector<T>& AliFemtoLorentzVector<T>::vect() const 
+{
+    return mThreeVector;
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::m2() const
+{
+    return (mX4*mX4 - mThreeVector*mThreeVector);    
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::plus() const { return (e() + pz()); }
+
+template<class T>
+T AliFemtoLorentzVector<T>::minus() const { return (e() - pz()); }
+
+template<class T>
+T AliFemtoLorentzVector<T>::m() const
+{
+    T mass2 = m2();
+    if (mass2 < 0)
+       return -::sqrt(-mass2);
+    else
+       return ::sqrt(mass2);
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::mt2() const
+{
+    return this->perp2() + m2();
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::mt() const
+{
+    //
+    // change to more optimal code ?
+    // return e()*e() - pz()*pz();
+    T massPerp2 = mt2();
+    if (massPerp2 < 0)
+       return -::sqrt(-massPerp2);
+    else
+       return ::sqrt(massPerp2);
+}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setPx(T x) {mThreeVector.setX(x);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setPy(T y) {mThreeVector.setY(y);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setPz(T z) {mThreeVector.setZ(z);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setX(T x) {mThreeVector.setX(x);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setY(T y) {mThreeVector.setY(y);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setZ(T z) {mThreeVector.setZ(z);}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setT(T t) {mX4 = t;}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setE(T e) {mX4 = e;}
+
+template<class T>
+T AliFemtoLorentzVector<T>::x() const {return mThreeVector.x();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::y() const {return mThreeVector.y();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::z() const {return mThreeVector.z();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::px() const {return mThreeVector.x();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::py() const {return mThreeVector.y();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::pz() const {return mThreeVector.z();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::e() const {return mX4;}
+
+template<class T>
+T AliFemtoLorentzVector<T>::t() const {return mX4;}
+
+template<class T>
+T AliFemtoLorentzVector<T>::perp() const {return mThreeVector.perp();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::perp2() const {return mThreeVector.perp2();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::pseudoRapidity() const {return mThreeVector.pseudoRapidity();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::phi() const {return mThreeVector.phi();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::theta() const {return mThreeVector.theta();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::cosTheta() const {return mThreeVector.cosTheta();}
+
+template<class T>
+T AliFemtoLorentzVector<T>::operator() (size_t i) const
+{
+    if (i < 3)
+        return mThreeVector(i);
+    else if (i == 3)
+        return mX4;
+    else {
+#ifndef ST_NO_EXCEPTIONS
+      throw out_of_range("AliFemtoLorentzVector<T>::operator(): bad index");  
+#else
+      cerr << "AliFemtoLorentzVector<T>::operator(): bad index." << endl;
+#endif
+      return 0;
+    }
+}
+
+template<class T>
+T& AliFemtoLorentzVector<T>::operator() (size_t i)
+{
+    if (i < 3)
+        return mThreeVector(i);
+    else if (i == 3)
+        return mX4;
+    else {
+#ifndef ST_NO_EXCEPTIONS
+      throw out_of_range("AliFemtoLorentzVector<T>::operator(): bad index");  
+#else
+      cerr << "AliFemtoLorentzVector<T>::operator(): bad index." << endl;
+#endif
+      return mX4;
+    }
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::operator[] (size_t i) const
+{
+    if (i < 3)
+        return mThreeVector[i];
+    else if (i == 3)
+        return mX4;
+    else {
+#ifndef ST_NO_EXCEPTIONS
+      throw out_of_range("AliFemtoLorentzVector<T>::operator[]: bad index"); 
+#else
+      cerr << "AliFemtoLorentzVector<T>::operator[]: bad index." << endl;
+#endif
+      return 0;
+    }
+}
+
+template<class T>
+T& AliFemtoLorentzVector<T>::operator[] (size_t i)
+{
+    if (i < 3)
+        return mThreeVector[i];
+    else if (i == 3)
+        return mX4;
+    else {
+#ifndef ST_NO_EXCEPTIONS
+      throw out_of_range("AliFemtoLorentzVector<T>::operator[]: bad index"); 
+#else
+      cerr << "AliFemtoLorentzVector<T>::operator[]: bad index." << endl;
+#endif
+      return mX4;
+    }
+}
+
+template<class T>
+T AliFemtoLorentzVector<T>::rapidity() const
+{
+    return 0.5*::log((mX4+mThreeVector.z())/(mX4-mThreeVector.z())+1e-20);
+}
+
+template<class T>
+AliFemtoLorentzVector<T> AliFemtoLorentzVector<T>::operator- ()
+{
+    return AliFemtoLorentzVector<T>(-mX4,-mThreeVector);
+}
+
+template<class T>
+AliFemtoLorentzVector<T> AliFemtoLorentzVector<T>::operator+ ()
+{
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>& AliFemtoLorentzVector<T>::operator*= (double c)
+{
+    mThreeVector *= c;
+    mX4 *= c;
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>& AliFemtoLorentzVector<T>::operator/= (double c)
+{
+    mThreeVector /= c;
+    mX4 /= c;
+    return *this;
+}
+
+#ifndef ST_NO_MEMBER_TEMPLATES
+#ifndef WIN32
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoThreeVector<X> &vec, T t)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(T t, const AliFemtoThreeVector<X> &vec)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoLorentzVector<X> &vec)
+       : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ }
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>
+AliFemtoLorentzVector<T>::boost(const AliFemtoLorentzVector<X>& pframe) const
+{
+    T mass               = abs(pframe);
+    AliFemtoThreeVector<T> eta = (-1./mass)*pframe.vect();            // gamma*beta
+    T gamma              = fabs(pframe.e())/mass;
+    AliFemtoThreeVector<T> pl  = ((this->vect()*eta)/(eta*eta))*eta;  // longitudinal momentum
+    return AliFemtoLorentzVector<T>(gamma*this->e() - this->vect()*eta,
+                              this->vect() + (gamma-1.)*pl - this->e()*eta);
+}
+
+template<class T>
+template<class X>
+void AliFemtoLorentzVector<T>::setVect(const AliFemtoThreeVector<X>& v)
+{
+    mThreeVector = v;
+}
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator=(const AliFemtoLorentzVector<X>& vec)
+{
+    mThreeVector = vec.vect();
+    mX4 = vec.t();
+    return *this;
+}
+
+template<class T>
+template<class X>
+bool
+AliFemtoLorentzVector<T>::operator== (const AliFemtoLorentzVector<X>& v) const
+{
+    return (mThreeVector == v.vect()) && (mX4 == v.t());
+}
+
+template<class T>
+template<class X>
+bool
+AliFemtoLorentzVector<T>::operator!= (const AliFemtoLorentzVector<X>& v) const
+{
+    return !(*this == v);
+}
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator+= (const AliFemtoLorentzVector<X>& v)
+{
+    mThreeVector += v.vect();
+    mX4 += v.t();
+    return *this;
+}
+
+template<class T>
+template<class X>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator-= (const AliFemtoLorentzVector<X>& v)
+{
+    mThreeVector -= v.vect();
+    mX4 -= v.t();
+    return *this;
+}
+
+#endif 
+#else
+
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoThreeVector<float> &vec, T t)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoThreeVector<double> &vec, T t)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(T t, const AliFemtoThreeVector<float> &vec)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(T t, const AliFemtoThreeVector<double> &vec)
+       : mThreeVector(vec), mX4(t) { /* nop */ }
+
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoLorentzVector<float> &vec)
+       : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ }
+    
+template<class T>
+AliFemtoLorentzVector<T>::AliFemtoLorentzVector(const AliFemtoLorentzVector<double> &vec)
+       : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ }
+    
+template<class T>
+AliFemtoLorentzVector<T>
+AliFemtoLorentzVector<T>::boost(const AliFemtoLorentzVector<float>& pframe) const
+{
+    T mass               = abs(pframe);
+    AliFemtoThreeVector<T> eta = (-1./mass)*pframe.vect();            // gamma*beta
+    T gamma              = fabs(pframe.e())/mass;
+    AliFemtoThreeVector<T> pl  = ((this->vect()*eta)/(eta*eta))*eta;  // longitudinal momentum
+    return AliFemtoLorentzVector<T>(gamma*this->e() - this->vect()*eta,
+                              this->vect() + (gamma-1.)*pl - this->e()*eta);
+}
+
+template<class T>
+AliFemtoLorentzVector<T>
+AliFemtoLorentzVector<T>::boost(const AliFemtoLorentzVector<double>& pframe) const
+{
+    T mass               = abs(pframe);
+    AliFemtoThreeVector<T> eta = (-1./mass)*pframe.vect();            // gamma*beta
+    T gamma              = fabs(pframe.e())/mass;
+    AliFemtoThreeVector<T> pl  = ((this->vect()*eta)/(eta*eta))*eta;  // longitudinal momentum
+    return AliFemtoLorentzVector<T>(gamma*this->e() - this->vect()*eta,
+                              this->vect() + (gamma-1.)*pl - this->e()*eta);
+}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setVect(const AliFemtoThreeVector<float>& v)
+{
+    mThreeVector = v;
+}
+
+template<class T>
+void AliFemtoLorentzVector<T>::setVect(const AliFemtoThreeVector<double>& v)
+{
+    mThreeVector = v;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator=(const AliFemtoLorentzVector<float>& vec)
+{
+    mThreeVector = vec.vect();
+    mX4 = vec.t();
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator=(const AliFemtoLorentzVector<double>& vec)
+{
+    mThreeVector = vec.vect();
+    mX4 = vec.t();
+    return *this;
+}
+
+template<class T>
+bool
+AliFemtoLorentzVector<T>::operator== (const AliFemtoLorentzVector<float>& v) const
+{
+    return (this->vect() == v.vect()) && (mX4 == v.t());
+}
+
+template<class T>
+bool
+AliFemtoLorentzVector<T>::operator== (const AliFemtoLorentzVector<double>& v) const
+{
+    return (mThreeVector == v.vect()) && (mX4 == v.t());
+}
+
+template<class T>
+bool
+AliFemtoLorentzVector<T>::operator!= (const AliFemtoLorentzVector<float>& v) const
+{
+    return !(*this == v);
+}
+
+template<class T>
+bool
+AliFemtoLorentzVector<T>::operator!= (const AliFemtoLorentzVector<double>& v) const
+{
+    return !(*this == v);
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator+= (const AliFemtoLorentzVector<float>& v)
+{
+    mThreeVector += v.vect();
+    mX4 += v.t();
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator+= (const AliFemtoLorentzVector<double>& v)
+{
+    mThreeVector += v.vect();
+    mX4 += v.t();
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator-= (const AliFemtoLorentzVector<float>& v)
+{
+    mThreeVector -= v.vect();
+    mX4 -= v.t();
+    return *this;
+}
+
+template<class T>
+AliFemtoLorentzVector<T>&
+AliFemtoLorentzVector<T>::operator-= (const AliFemtoLorentzVector<double>& v)
+{
+    mThreeVector -= v.vect();
+    mX4 -= v.t();
+    return *this;
+}
+
+#endif // ST_NO_MEMBER_TEMPLATES
+#endif /* ! __CINT__ */
+#ifdef __CINT__
+template<> AliFemtoLorentzVector<double> operator+ (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator+ (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator+ (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<float>  operator+ (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator- (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator- (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator- (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<float>  operator- (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator* (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator* (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator* (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<float>  operator* (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator* (const              double v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator* (const              double v1, const AliFemtoLorentzVector<float>&  v2);
+template<> AliFemtoLorentzVector<double> operator* (const AliFemtoLorentzVector<double>& v1, const double              v2);
+template<> AliFemtoLorentzVector<double> operator* (const AliFemtoLorentzVector<float>&  v1, const double              v2);
+template<> AliFemtoLorentzVector<double> operator/ (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator/ (const AliFemtoLorentzVector<double>& v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator/ (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<float>  operator/ (const AliFemtoLorentzVector<float>&  v1, const AliFemtoLorentzVector<float>& v2);
+template<> AliFemtoLorentzVector<double> operator/ (const              double v1, const AliFemtoLorentzVector<double>& v2);
+template<> AliFemtoLorentzVector<double> operator/ (const              double v1, const AliFemtoLorentzVector<float>&  v2);
+template<> AliFemtoLorentzVector<double> operator/ (const AliFemtoLorentzVector<double>& v1, const double              v2);
+template<> AliFemtoLorentzVector<double> operator/ (const AliFemtoLorentzVector<float>&  v1, const double              v2);
+template<> istream& operator>> (istream& is, const AliFemtoLorentzVector<double>& v);
+template<> ostream& operator<< (ostream& os, const AliFemtoLorentzVector<double>& v);
+template<> istream& operator>> (istream& is, const AliFemtoLorentzVector<float>& v);
+template<> ostream& operator<< (ostream& os, const AliFemtoLorentzVector<float>& v);
+template<> double abs(const AliFemtoLorentzVector<double>& v);
+template<> float  abs(const AliFemtoLorentzVector<float>& v);
+#else
+//
+//   Non-member operators
+//
+template<class T, class X>
+AliFemtoLorentzVector<T>
+operator+ (const AliFemtoLorentzVector<T>& v1, const AliFemtoLorentzVector<X>& v2)
+{
+    return AliFemtoLorentzVector<T>(v1) += v2;
+}
+
+template<class T, class X>
+AliFemtoLorentzVector<T>
+operator- (const AliFemtoLorentzVector<T>& v1, const AliFemtoLorentzVector<X>& v2)
+{
+    return AliFemtoLorentzVector<T>(v1) -= v2;
+}
+
+template<class T, class X>
+T
+operator* (const AliFemtoLorentzVector<T>& v1, const AliFemtoLorentzVector<X>& v2)
+{
+    return v1.t()*v2.t() - v1.vect()*v2.vect();
+}
+
+template<class T>
+AliFemtoLorentzVector<T>
+operator* (const AliFemtoLorentzVector<T>& v, double c)
+{
+    return AliFemtoLorentzVector<T>(v) *= c;
+}
+
+template<class T>
+AliFemtoLorentzVector<T> operator* (double c, const AliFemtoLorentzVector<T>& v)
+{
+    return AliFemtoLorentzVector<T>(v) *= c;
+}
+
+template<class T, class X>
+AliFemtoLorentzVector<T> operator/ (const AliFemtoLorentzVector<T>& v, X c)
+{
+    return AliFemtoLorentzVector<T>(v) /= c;
+}
+
+template<class T>
+ostream& operator<< (ostream& os, const AliFemtoLorentzVector<T>& v)
+{
+    return os << v.vect() << "\t\t" << v.t();
+}
+
+template<class T>
+istream&  operator>>(istream& is, AliFemtoLorentzVector<T>& v)
+{
+    T  x, y, z, t;
+    is >> x >> y >> z >> t;
+    v.setX(x);
+    v.setY(y);
+    v.setZ(z);
+    v.setT(t);
+    return is;
+}
+
+//
+//        Non-member functions
+//
+template<class T>
+T abs(const AliFemtoLorentzVector<T>& v) {return v.m();}
+
+#endif /*  __CINT__ */
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVectorD.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoLorentzVectorD.h
new file mode 100644 (file)
index 0000000..3fad3d4
--- /dev/null
@@ -0,0 +1,19 @@
+/***************************************************************************
+ *
+ * $Id$
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.6  2005/07/06 18:49:56  fisyak
+ * Replace AliFemtoHelixD, AliFemtoLorentzVectorD,AliFemtoLorentzVectorF,AliFemtoMatrixD,AliFemtoMatrixF,AliFemtoPhysicalHelixD,AliFemtoThreeVectorD,AliFemtoThreeVectorF by templated version
+ *
+
+****************************************************************************/
+#ifndef ALIFM_LORENTZ_VECTOR_D_HH
+#define ALIFM_LORENTZ_VECTOR_D_HH
+//#include "AliFemtoThreeVectorF.hh"
+#include "AliFmThreeVectorD.h"
+#include "AliFmLorentzVector.h"
+typedef AliFmLorentzVector<double> AliFmLorentzVectorD;
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.cxx
new file mode 100644 (file)
index 0000000..edaaf0c
--- /dev/null
@@ -0,0 +1,297 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   The Manager is the top-level object that coordinates activities
+ *   and performs event, particle, and pair loops, and checks the
+ *   various Cuts of the Analyses in its AnalysisCollection
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.20  2001/06/21 19:15:46  laue
+ * Modified fiels:
+ *   CTH.h : new constructor added
+ *   AliFemtoEvent, AliFemtoKink, AliFemtoTrack : constructors from the persistent
+ *                                   (TTree) classes added
+ *   AliFemtoLikeSignAnalysis : minor changes, for debugging
+ *   AliFemtoTypes: split into different files
+ * Added files: for the new TTree muDst's
+ *   StExceptions.cxx StExceptions.h AliFemtoEnumeration.h
+ *   AliFemtoHelix.h AliFemtoHisto.h AliFemtoString.h AliFemtoTFile.h
+ *   AliFemtoTTreeEvent.cxx AliFemtoTTreeEvent.h AliFemtoTTreeKink.cxx
+ *   AliFemtoTTreeKink.h AliFemtoTTreeTrack.cxx AliFemtoTTreeTrack.h
+ *   AliFemtoTTreeV0.cxx AliFemtoTTreeV0.h AliFemtoVector.h
+ *
+ * Revision 1.19  2000/05/08 15:45:50  laue
+ * Memory leak fixed. Current hbt event was not deleted
+ *
+ * Revision 1.18  2000/03/17 17:23:05  laue
+ * Roberts new three particle correlations implemented.
+ *
+ * Revision 1.16  2000/02/26 19:04:52  laue
+ * Some unnecessary includes removed.
+ * StThreeVectorD replace by AliFemtoThreeVector.
+ * AliFemtoCoulomb modified to compile without Root (ClassDef embraced into
+ *   #ifdef __ROOT__  ..... #endif)
+ * AliFemtoParticle now returns references (FourMomentum(),Helix(),
+ *   DecayVertexPosiion())
+ *
+ * Revision 1.15  2000/02/18 21:32:24  laue
+ * franksTrackCut changed. If mCharge is set to '0' there will be no cut
+ * on charge. This is important for front-loaded cuts.
+ *
+ * copy constructor implemented for AliFemtoEvent, AliFemtoTrack and AliFemtoV0.
+ *
+ * franks1HistoD.cxx franks1HistoD.h franks2HistoD.cxx franks2HistoD.h
+ * removed. We can now (CC5 on Solaris) use the versions (no D)
+ *
+ * Revision 1.14  2000/02/13 17:17:12  laue
+ * Calls to the EventBegin() and EventEnd() functions implemented
+ * The actual analysis is moved from AliFemtoManager to AliFemtoAnalysis
+ *
+ * Revision 1.13  2000/01/25 17:35:17  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.12  1999/10/15 01:57:29  lisa
+ * Important enhancement of AliFemtoMaker - implement Franks CutMonitors
+ * ----------------------------------------------------------
+ * This means 3 new files in Infrastructure area (CutMonitor),
+ * several specific CutMonitor classes in the Cut area
+ * and a new base class in the Base area (AliFemtoCutMonitor).
+ * This means also changing all Cut Base class header files from .h to .h
+ * so we have access to CutMonitor methods from Cint command line.
+ * This last means
+ * 1) files which include these header files are slightly modified
+ * 2) a side benefit: the TrackCuts and V0Cuts no longer need
+ * a SetMass() implementation in each Cut class, which was stupid.
+ * Also:
+ * -----
+ * Include Franks AliFemtoAssociationReader
+ * ** None of these changes should affect any user **
+ *
+ * Revision 1.11  1999/10/04 15:38:57  lisa
+ * include Franks new accessor methods AliFemtoAnalysis::CorrFctn and AliFemtoManager::Analysis as well as McEnt example macro
+ *
+ * Revision 1.10  1999/09/17 22:38:02  lisa
+ * first full integration of V0s into AliFemto framework
+ *
+ * Revision 1.9  1999/09/08 04:15:52  lisa
+ * persistent microDST implementation tweaked to please fickle solaris details
+ *
+ * Revision 1.8  1999/09/05 02:58:11  lisa
+ * add ASCII microDST reader/writer AND franksParticle cuts
+ *
+ * Revision 1.7  1999/09/04 04:41:01  lisa
+ * AliFemtoEvent IO   --and--  AliFemtoEventWriter (microDST) method added to framework
+ *
+ * Revision 1.6  1999/09/03 22:39:15  lisa
+ * Readers now MUST have Report() methods and MAY have WriteHbtEvent() methods
+ *
+ * Revision 1.5  1999/07/27 10:47:04  lisa
+ * now works in dev on linux and solaris - mistake in deleting picoEvents fixed
+ *
+ * Revision 1.4  1999/07/26 16:21:26  lisa
+ * always convert string to char when output - needed on solaris
+ *
+ * Revision 1.3  1999/07/22 18:49:10  lisa
+ * Implement idea of Fabrice to not create and delete AliFemtoPair all the time
+ *
+ * Revision 1.2  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Infrastructure/AliFemtoManager.h"
+//#include "Infrastructure/AliFemtoParticleCollection.h"
+//#include "Base/AliFemtoTrackCut.h"
+//#include "Base/AliFemtoV0Cut.h"
+#include <cstdio>
+
+#ifdef __ROOT__
+ClassImp(AliFemtoManager)
+#endif
+
+
+
+//____________________________
+AliFemtoManager::AliFemtoManager(){
+  fAnalysisCollection = new AliFemtoAnalysisCollection;
+  fEventWriterCollection = new AliFemtoEventWriterCollection;
+  fEventReader = 0;
+}
+//____________________________
+AliFemtoManager::~AliFemtoManager(){
+  delete fEventReader;
+  // now delete each Analysis in the Collection, and then the Collection itself
+  AliFemtoAnalysisIterator AnalysisIter;
+  for (AnalysisIter=fAnalysisCollection->begin();AnalysisIter!=fAnalysisCollection->end();AnalysisIter++){
+    delete *AnalysisIter;
+    *AnalysisIter = 0;
+  }
+  delete fAnalysisCollection;
+  // now delete each EventWriter in the Collection, and then the Collection itself
+  AliFemtoEventWriterIterator EventWriterIter;
+  for (EventWriterIter=fEventWriterCollection->begin();EventWriterIter!=fEventWriterCollection->end();EventWriterIter++){
+    delete *EventWriterIter;
+    *EventWriterIter = 0;
+  }
+  delete fEventWriterCollection;
+}
+//____________________________
+int AliFemtoManager::Init(){
+  AliFemtoString readerMessage;
+  readerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
+  // EventReader
+  if (fEventReader) {
+    if (fEventReader->Init("r",readerMessage)){
+      cout << " AliFemtoManager::Init() - Reader initialization failed " << endl;
+      return (1);
+    }
+    readerMessage += fEventReader->Report();
+  }
+  // EventWriters
+  AliFemtoEventWriterIterator EventWriterIter;
+  for (EventWriterIter=fEventWriterCollection->begin();EventWriterIter!=fEventWriterCollection->end();EventWriterIter++){
+    //cout << "*EventWriterIter " << *EventWriterIter << endl;
+    // The message (AliFemtoString) passed into Init will be at the file header.
+    // for that reason take the readerReport, add my own report and pass as message 
+    AliFemtoString writerMessage = readerMessage;
+    writerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
+    writerMessage += (*EventWriterIter)->Report();
+    if (*EventWriterIter) {
+      if ( (*EventWriterIter)->Init("w",writerMessage)){ // yes, the message from the reader is passed into the writer
+       cout << " AliFemtoManager::Init() - Writer initialization failed " << endl;
+       return (1);
+      }
+    }
+  }
+  
+  
+  return (0);
+}
+//____________________________
+void AliFemtoManager::Finish(){
+  // EventReader
+  if (fEventReader) fEventReader->Finish();
+  // EventWriters
+  AliFemtoEventWriterIterator EventWriterIter;
+  AliFemtoEventWriter* currentEventWriter;
+  for (EventWriterIter=fEventWriterCollection->begin();EventWriterIter!=fEventWriterCollection->end();EventWriterIter++){
+    currentEventWriter = *EventWriterIter;
+    currentEventWriter->Finish();
+  }
+  // Analyses
+  AliFemtoAnalysisIterator AnalysisIter;
+  AliFemtoBaseAnalysis* currentAnalysis;
+  for (AnalysisIter=fAnalysisCollection->begin();AnalysisIter!=fAnalysisCollection->end();AnalysisIter++){
+    currentAnalysis = *AnalysisIter;
+    currentAnalysis->Finish();
+  }
+}
+//____________________________
+AliFemtoString AliFemtoManager::Report(){
+  string stemp;
+  char ctemp[100];
+  // EventReader
+  stemp = fEventReader->Report();
+  // EventWriters
+  sprintf(ctemp,"\nAliFemtoManager Reporting %u EventWriters\n",fEventWriterCollection->size());
+  stemp += ctemp;
+  AliFemtoEventWriterIterator EventWriterIter;
+  AliFemtoEventWriter* currentEventWriter;
+  for (EventWriterIter=fEventWriterCollection->begin();EventWriterIter!=fEventWriterCollection->end();EventWriterIter++){
+    cout << "AliFemtoManager - asking for EventWriter Report" << endl;
+    currentEventWriter = *EventWriterIter;
+    stemp+=currentEventWriter->Report();
+  }
+  // Analyses
+  sprintf(ctemp,"\nAliFemtoManager Reporting %u Analyses\n",fAnalysisCollection->size());
+  stemp += ctemp;
+  AliFemtoAnalysisIterator AnalysisIter;
+  AliFemtoBaseAnalysis* currentAnalysis;
+  for (AnalysisIter=fAnalysisCollection->begin();AnalysisIter!=fAnalysisCollection->end();AnalysisIter++){
+    cout << "AliFemtoManager - asking for Analysis Report" << endl;
+    currentAnalysis = *AnalysisIter;
+    stemp+=currentAnalysis->Report();
+  }
+
+  AliFemtoString returnThis = stemp;
+  return returnThis;
+}
+//____________________________
+AliFemtoBaseAnalysis* AliFemtoManager::Analysis( int n ){  // return pointer to n-th analysis
+  if ( n<0 || n > (int) fAnalysisCollection->size() )
+    return NULL;
+  AliFemtoAnalysisIterator iter = fAnalysisCollection->begin();
+  for (int i=0; i<n ;i++){
+    iter++;
+  }
+  return *iter;
+}
+//____________________________
+AliFemtoEventWriter* AliFemtoManager::EventWriter( int n ){  // return pointer to n-th analysis
+  if ( n<0 || n > (int) fEventWriterCollection->size() )
+    return NULL;
+  AliFemtoEventWriterIterator iter = fEventWriterCollection->begin();
+  for (int i=0; i<n ;i++){
+    iter++;
+  }
+  return *iter;
+}
+ //____________________________
+int AliFemtoManager::ProcessEvent(){
+  cout << "AliFemtoManager::ProcessEvent" << endl;
+  // NOTE - this ReturnHbtEvent makes a *new* AliFemtoEvent - delete it when done!
+  AliFemtoEvent* currentHbtEvent = fEventReader->ReturnHbtEvent();
+  cout << "Event reader has returned control to manager" << endl;
+  
+  // if no HbtEvent is returned, then we abort processing.
+  // the question is now: do we try again next time (i.e. there may be an HbtEvent next time)
+  // or are we at EOF or something?  If Reader says Status=0, then that means try again later.
+  // so, we just return the Reader's Status.
+  if (!currentHbtEvent){
+    cout << "AliFemtoManager::ProcessEvent() - Reader::ReturnHbtEvent() has returned null pointer\n";
+    return fEventReader->Status();
+  }
+  
+  // loop over all the EventWriters
+  AliFemtoEventWriterIterator EventWriterIter;
+  for (EventWriterIter=fEventWriterCollection->begin();EventWriterIter!=fEventWriterCollection->end();EventWriterIter++){
+#ifdef STHBRDEBUG
+    cout << " *EventWriterIter " <<  *EventWriterIter << endl;
+#endif
+    (*EventWriterIter)->WriteHbtEvent(currentHbtEvent);
+  } 
+
+  // loop over all the Analysis
+  AliFemtoAnalysisIterator AnalysisIter;
+  for (AnalysisIter=fAnalysisCollection->begin();AnalysisIter!=fAnalysisCollection->end();AnalysisIter++){
+    (*AnalysisIter)->ProcessEvent(currentHbtEvent);
+  } 
+
+  if (currentHbtEvent) delete currentHbtEvent;
+#ifdef STHBRDEBUG
+  cout << "AliFemtoManager::ProcessEvent() - return to caller ... " << endl;
+#endif
+  return 0;    // 0 = "good return"
+}       // ProcessEvent
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoManager.h
new file mode 100644 (file)
index 0000000..3693e9a
--- /dev/null
@@ -0,0 +1,125 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   The Manager is the top-level object that coordinates activities
+ *   and performs event, particle, and pair loops, and checks the
+ *   various Cuts of the Analyses in its AnalysisCollection
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.10  2000/03/17 17:23:05  laue
+ * Roberts new three particle correlations implemented.
+ *
+ * Revision 1.9  2000/02/18 21:32:24  laue
+ * franksTrackCut changed. If mCharge is set to '0' there will be no cut
+ * on charge. This is important for front-loaded cuts.
+ *
+ * copy constructor implemented for AliFemtoEvent, AliFemtoTrack and AliFemtoV0.
+ *
+ * franks1HistoD.cxx franks1HistoD.h franks2HistoD.cxx franks2HistoD.h
+ * removed. We can now (CC5 on Solaris) use the versions (no D)
+ *
+ * Revision 1.8  2000/01/25 17:35:17  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.7  1999/10/04 15:38:58  lisa
+ * include Franks new accessor methods AliFemtoAnalysis::CorrFctn and AliFemtoManager::Analysis as well as McEvent example macro
+ *
+ * Revision 1.6  1999/09/24 01:23:12  fisyak
+ * Reduced Include Path
+ *
+ * Revision 1.5  1999/09/08 04:15:52  lisa
+ * persistent microDST implementation tweaked to please fickle solaris details
+ *
+ * Revision 1.4  1999/09/05 02:58:12  lisa
+ * add ASCII microDST reader/writer AND franksParticle cuts
+ *
+ * Revision 1.3  1999/09/04 04:41:02  lisa
+ * AliFemtoEvent IO   --and--  AliFemtoEventWriter (microDST) method added to framework
+ *
+ * Revision 1.2  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoManager_hh
+#define AliFemtoManager_hh
+
+
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoAnalysisCollection.h"
+#include "Infrastructure/AliFemtoEventWriterCollection.h"
+#include "Infrastructure/AliFemtoEvent.h"
+#include "Base/AliFemtoBaseAnalysis.h"
+#include "Base/AliFemtoEventReader.h"
+#include "Base/AliFemtoEventWriter.h"
+
+class AliFemtoManager{
+
+private:
+  AliFemtoAnalysisCollection* fAnalysisCollection;
+  AliFemtoEventReader*        fEventReader;
+  AliFemtoEventWriterCollection* fEventWriterCollection;
+
+public:
+  AliFemtoManager();
+  virtual ~AliFemtoManager();
+
+  // Gets and Sets...
+  AliFemtoAnalysisCollection* AnalysisCollection();
+  AliFemtoBaseAnalysis* Analysis(int n);  // Access to Analysis within Collection
+  void AddAnalysis(AliFemtoBaseAnalysis*);
+
+  AliFemtoEventWriterCollection* EventWriterCollection();
+  AliFemtoEventWriter* EventWriter(int n);// Access to EventWriter within Collection
+  void SetEventWriter(AliFemtoEventWriter*);  // just for historic reasons
+  void AddEventWriter(AliFemtoEventWriter*);
+
+  AliFemtoEventReader* EventReader();
+  void SetEventReader(AliFemtoEventReader*);
+
+
+  int Init();
+  int ProcessEvent();   // a "0" return value means success - otherwise quit
+  void Finish();
+
+  AliFemtoString Report(); //!
+#ifdef __ROOT__
+  ClassDef(AliFemtoManager, 0)
+#endif
+};
+
+inline AliFemtoAnalysisCollection* AliFemtoManager::AnalysisCollection(){return fAnalysisCollection;}
+inline void AliFemtoManager::AddAnalysis(AliFemtoBaseAnalysis* anal){fAnalysisCollection->push_back(anal);}
+
+inline AliFemtoEventWriterCollection* AliFemtoManager::EventWriterCollection(){return fEventWriterCollection;}
+inline void AliFemtoManager::AddEventWriter(AliFemtoEventWriter* writer){fEventWriterCollection->push_back(writer);}
+inline void AliFemtoManager::SetEventWriter(AliFemtoEventWriter* writer){fEventWriterCollection->push_back(writer);}
+
+inline AliFemtoEventReader* AliFemtoManager::EventReader(){return fEventReader;}
+inline void AliFemtoManager::SetEventReader(AliFemtoEventReader* reader){fEventReader = reader;}
+
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.cxx
new file mode 100644 (file)
index 0000000..837d7f6
--- /dev/null
@@ -0,0 +1,1068 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoPair.cc,v 1.23
+ *
+ * Author: Brian Laziuk, Yale University
+ *         slightly modified by Mike Lisa
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    the Pair object is passed to the PairCuts for verification, and
+ *    then to the AddRealPair and AddMixedPair methods of the
+ *    Correlation Functions
+ *
+ ***************************************************************************
+ * Revision 1.23  2002/09/25 19:23:25  rcwells
+ * Added const to emissionAngle()
+ *
+ * Revision 1.22  2002/04/22 22:48:11  laue
+ * corrected calculation of opening angle 
+ **
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.27  2003/09/02 17:58:32  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.26  2003/01/31 19:57:15  magestro
+ * Cleared up simple compiler warnings on i386_linux24
+ *
+ * Revision 1.25  2003/01/14 09:44:08  renault
+ * corrections on average separation calculation for tracks which doesn't cross
+ * all 45 padrows.
+ *
+ * Revision 1.24  2002/11/19 23:33:10  renault
+ * Enable average separation calculation for all combinaisons of
+ * V0 daughters and tracks
+ *
+ * Revision 1.21  2002/02/28 14:18:36  rcwells
+ * Added emissionAngle function to AliFemtoPair
+ *
+ * Revision 1.20  2001/12/14 23:11:30  fretiere
+ * Add class HitMergingCut. Add class fabricesPairCut = HitMerginCut + pair purity cuts. Add TpcLocalTransform function which convert to local tpc coord (not pretty). Modify AliFemtoTrack, AliFemtoParticle, AliFemtoHiddenInfo, AliFemtoPair to handle the hit information and cope with my code
+ *
+ * Revision 1.19  2001/04/25 18:05:09  perev
+ * HPcorrs
+ *
+ * Revision 1.18  2001/04/03 21:04:36  kisiel
+ *
+ *
+ *   Changes needed to make the Theoretical code
+ *   work. The main code is the ThCorrFctn directory.
+ *   The most visible change is the addition of the
+ *   HiddenInfo to AliFemtoPair.
+ *
+ * Revision 1.17  2001/03/28 22:35:20  flierl
+ * changes and bugfixes in qYKP*
+ * add pairrapidity
+ *
+ * Revision 1.16  2001/02/15 19:23:00  rcwells
+ * Fixed sign in qSideCMS
+ *
+ * Revision 1.15  2001/01/22 22:56:41  laue
+ * Yano-Koonin-Podgoretskii Parametrisation added
+ *
+ * Revision 1.14  2000/12/11 21:44:30  rcwells
+ * Corrected qSideCMS function
+ *
+ * Revision 1.13  2000/10/26 16:09:16  lisa
+ * Added OpeningAngle PairCut class and method to AliFemtoPair
+ *
+ * Revision 1.12  2000/10/05 23:09:05  lisa
+ * Added kT-dependent radii to mixed-event simulator AND implemented AverageSeparation Cut and CorrFctn
+ *
+ * Revision 1.11  2000/07/17 20:03:16  lisa
+ * Implemented tools for addressing and assessing trackmerging
+ *
+ * Revision 1.10  2000/04/04 16:27:03  rcwells
+ * Removed an errant cout in AliFemtoPair.cc
+ *
+ * Revision 1.9  2000/04/04 16:13:09  lisa
+ * AliFemtoPair:quality() now returns normalized value (and so is double) and add a CorrFctn which looks at quality()
+ *
+ * Revision 1.8  2000/04/03 22:09:12  rcwells
+ * Add member function ... quality().
+ *
+ * Revision 1.7  2000/02/13 21:13:33  lisa
+ * changed ambiguous AliFemtoPair::fourMomentum() to fourMomentumSum() and fourMomentumDiff() and fixed related bug in QvecCorrFctn
+ *
+ * Revision 1.6  1999/07/29 16:16:34  lisa
+ * Selemons upgrade of AliFemtoPair class
+ *
+ * Revision 1.5  1999/07/22 18:49:10  lisa
+ * Implement idea of Fabrice to not create and delete AliFemtoPair all the time
+ *
+ * Revision 1.4  1999/07/12 18:57:05  lisa
+ * fixed small bug in fourMomentum method of AliFemtoPair
+ *
+ * Revision 1.3  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.2  1999/06/29 17:50:27  fisyak
+ * formal changes to account new StEvent, does not complie yet
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Infrastructure/AliFemtoPair.h"
+
+double AliFemtoPair::fMaxDuInner = .8;
+double AliFemtoPair::fMaxDzInner = 3.;
+double AliFemtoPair::fMaxDuOuter = 1.4;
+double AliFemtoPair::fMaxDzOuter = 3.2;
+
+
+AliFemtoPair::AliFemtoPair(){
+  fTrack1 = 0;
+  fTrack2 = 0;
+  setDefaultHalfFieldMergingPar();
+}
+
+AliFemtoPair::AliFemtoPair(AliFemtoParticle* a, AliFemtoParticle* b)
+  : fTrack1(a), fTrack2(b)
+{ 
+  setDefaultHalfFieldMergingPar();
+}
+
+void AliFemtoPair::setDefaultHalfFieldMergingPar(){
+  fMaxDuInner = 3;
+  fMaxDzInner = 4.;
+  fMaxDuOuter = 4.;
+  fMaxDzOuter = 6.;
+}
+void AliFemtoPair::setDefaultFullFieldMergingPar(){
+  fMaxDuInner = 0.8;
+  fMaxDzInner = 3.;
+  fMaxDuOuter = 1.4;
+  fMaxDzOuter = 3.2;
+}
+void AliFemtoPair::setMergingPar(double aMaxDuInner, double aMaxDzInner,
+                             double aMaxDuOuter, double aMaxDzOuter){
+  fMaxDuInner = aMaxDuInner;
+  fMaxDzInner = aMaxDzInner;
+  fMaxDuOuter = aMaxDuOuter;
+  fMaxDzOuter = aMaxDzOuter;
+};
+
+AliFemtoPair::~AliFemtoPair() {/* no-op */}
+
+//AliFemtoPair::AliFemtoPair(const AliFemtoPair &a) {/* missing */}
+
+//AliFemtoPair& AliFemtoPair::operator=(const AliFemtoPair &a)
+
+//_________________
+double AliFemtoPair::mInv() const
+{
+    double InvariantMass = abs(fTrack1->FourMomentum() + fTrack2->FourMomentum());
+    return (InvariantMass);
+}
+//_________________
+double AliFemtoPair::kT() const
+{
+
+  double  tmp = 
+    (fTrack1->FourMomentum() + fTrack2->FourMomentum()).perp();
+  tmp *= .5;
+
+  return (tmp);
+}
+//_________________
+double AliFemtoPair::rap() const
+{
+  // longitudinal pair rapidity : Y = 0.5 ::log( E1 + E2 + pz1 + pz2 / E1 + E2 - pz1 - pz2 )
+  double  tmp = 0.5 * log (
+                          (fTrack1->FourMomentum().e() + fTrack2->FourMomentum().e() + fTrack1->FourMomentum().z() + fTrack2->FourMomentum().z()) / 
+                          (fTrack1->FourMomentum().e() + fTrack2->FourMomentum().e() - fTrack1->FourMomentum().z() - fTrack2->FourMomentum().z()) 
+                          ) ;
+  return (tmp);
+}
+//_________________
+double AliFemtoPair::emissionAngle()const {
+  double pxTotal = this->fourMomentumSum().x();
+  double pyTotal = this->fourMomentumSum().y();
+  double angle = atan2(pyTotal,pxTotal)*180.0/3.1415926536;
+  if (angle<0.0) angle+=360.0;
+  return angle;
+}
+//_________________
+// get rid of ambiguously-named method fourMomentum() and replace it with
+// fourMomentumSum() and fourMomentumDiff() - mal 13feb2000
+AliFemtoLorentzVector AliFemtoPair::fourMomentumSum() const
+{
+  AliFemtoLorentzVector temp = fTrack1->FourMomentum()+fTrack2->FourMomentum();
+  return temp;
+}
+AliFemtoLorentzVector AliFemtoPair::fourMomentumDiff() const
+{
+  AliFemtoLorentzVector temp = fTrack1->FourMomentum()-fTrack2->FourMomentum();
+  return temp;
+}
+//__________________________________
+// Yano-Koonin-Podgoretskii Parametrisation in CMS
+void AliFemtoPair::qYKPCMS(double& qP, double& qT, double& q0) const
+{
+  ////
+  // calculate momentum difference in source rest frame (= lab frame)
+  ////
+  AliFemtoLorentzVector l1 = fTrack1->FourMomentum() ;
+  AliFemtoLorentzVector l2 = fTrack2->FourMomentum() ;
+  AliFemtoLorentzVector  l ;
+  // random ordering of the particles
+  if ( rand()/(double)RAND_MAX > 0.50 )  
+    { l = l1-l2 ; } 
+  else 
+    { l = l2-l1 ; } ;
+  // fill momentum differences into return variables
+  qP = l.z() ;
+  qT = l.vect().perp() ;
+  q0 = l.e() ;
+}
+//___________________________________
+// Yano-Koonin-Podgoretskii Parametrisation in LCMS
+void AliFemtoPair::qYKPLCMS(double& qP, double& qT, double& q0) const
+{
+  ////
+  //  calculate momentum difference in LCMS : frame where pz1 + pz2 = 0
+  ////
+  AliFemtoLorentzVector l1 = fTrack1->FourMomentum() ;
+  AliFemtoLorentzVector l2 = fTrack2->FourMomentum() ;
+  // determine beta to LCMS
+  double beta = (l1.z()+l2.z()) / (l1.e()+l2.e()) ;
+  double beta2 =  beta*beta ;
+  // unfortunately STAR Class lib knows only boost(particle) not boost(beta) :(
+  // -> create particle with velocity beta and mass 1.0
+  // actually this is : dummyPz = ::sqrt( (dummyMass*dummyMass*beta2) / (1-beta2) ) ; 
+  double dummyPz = ::sqrt( (beta2) / (1-beta2) ) ;
+  // boost in the correct direction
+  if (beta>0.0) { dummyPz = -dummyPz; } ;
+  // create dummy particle
+  AliFemtoLorentzVector  l(0.0, 0.0, dummyPz) ; 
+  double dummyMass = 1.0 ;
+  l.setE(l.vect().massHypothesis(dummyMass) );
+  // boost particles along the beam into a frame with velocity beta 
+  AliFemtoLorentzVector l1boosted = l1.boost(l) ;
+  AliFemtoLorentzVector l2boosted = l2.boost(l) ;
+  // caculate the momentum difference with random ordering of the particle
+  if ( rand()/(double)RAND_MAX >0.50)  
+    { l = l1boosted-l2boosted ; } 
+  else 
+    { l = l2boosted-l1boosted ;} ;
+  // fill momentum differences into return variables
+  qP = l.z() ;
+  qT = l.vect().perp() ;
+  q0 = l.e() ;
+}
+//___________________________________
+// Yano-Koonin-Podgoretskii Parametrisation in pair rest frame
+void AliFemtoPair::qYKPPF(double& qP, double& qT, double& q0) const
+{
+  ////
+  //  calculate momentum difference in pair rest frame : frame where (pz1 + pz2, py1 + py2, px1 + px2) = (0,0,0)
+  ////
+  AliFemtoLorentzVector l1 = fTrack1->FourMomentum() ;
+  AliFemtoLorentzVector l2 = fTrack2->FourMomentum() ;
+  // the center of gravity of the pair travels with l
+  AliFemtoLorentzVector  l = l1 + l2 ; 
+  l = -l ;
+  l.setE(-l.e()) ;
+  // boost particles  
+  AliFemtoLorentzVector l1boosted = l1.boost(l) ;
+  AliFemtoLorentzVector l2boosted = l2.boost(l) ;
+  // caculate the momentum difference with random ordering of the particle
+  if ( rand()/(double)RAND_MAX > 0.50)  
+    { l = l1boosted-l2boosted ; } 
+  else 
+    { l = l2boosted-l1boosted ;} ;
+  // fill momentum differences into return variables
+  qP = l.z();
+  qT = l.vect().perp();
+  q0 = l.e();
+}
+//_________________
+double AliFemtoPair::qOutCMS() const
+{
+    AliFemtoThreeVector tmp1 = fTrack1->FourMomentum().vect();
+    AliFemtoThreeVector tmp2 = fTrack2->FourMomentum().vect();
+
+    double dx = tmp1.x() - tmp2.x();
+    double xt = tmp1.x() + tmp2.x();
+    
+    double dy = tmp1.y() - tmp2.y();
+    double yt = tmp1.y() + tmp2.y();
+
+    double k1 = (::sqrt(xt*xt+yt*yt));
+    double k2 = (dx*xt+dy*yt);
+    double tmp = k2/k1;
+    return (tmp);
+}
+//_________________
+double AliFemtoPair::qSideCMS() const
+{
+    AliFemtoThreeVector tmp1 = fTrack1->FourMomentum().vect();
+    AliFemtoThreeVector tmp2 = fTrack2->FourMomentum().vect();
+
+    double x1 = tmp1.x();  double y1 = tmp1.y();
+    double x2 = tmp2.x();  double y2 = tmp2.y();
+
+    double xt = x1+x2;  double yt = y1+y2;
+    double k1 = ::sqrt(xt*xt+yt*yt);
+
+    double tmp = 2.0*(x2*y1-x1*y2)/k1;
+    return (tmp);
+}
+
+//_________________________
+double AliFemtoPair::qLongCMS() const
+{
+    AliFemtoLorentzVector tmp1 = fTrack1->FourMomentum();
+    AliFemtoLorentzVector tmp2 = fTrack2->FourMomentum();
+
+    double dz = tmp1.z() - tmp2.z();
+    double zz = tmp1.z() + tmp2.z();
+
+    double dt = tmp1.t() - tmp2.t();
+    double tt = tmp1.t() + tmp2.t();
+
+    double beta = zz/tt;
+    double gamma = 1.0/::sqrt(1.0 - beta*beta);
+
+    double temp = gamma*(dz - beta*dt);
+    return (temp);
+}
+
+//________________________________
+double AliFemtoPair::qOutPf() const
+{
+ AliFemtoLorentzVector tmp1 = fTrack1->FourMomentum();
+ AliFemtoLorentzVector tmp2 = fTrack2->FourMomentum();
+
+    double dt = tmp1.t() - tmp2.t();
+    double tt = tmp1.t() + tmp2.t();
+
+    double xt = tmp1.x() + tmp2.x();
+    double yt = tmp1.y() + tmp2.y();
+
+    double k1 = ::sqrt(xt*xt + yt*yt);
+    double bOut = k1/tt;
+    double gOut = 1.0/::sqrt(1.0 - bOut*bOut);
+
+    double temp = gOut*(this->qOutCMS() - bOut*dt);
+    return (temp);
+}
+
+//___________________________________
+double AliFemtoPair::qSidePf() const
+{
+ return(this->qSideCMS());
+}
+
+//___________________________________
+
+double AliFemtoPair::qLongPf() const
+{
+ return(this->qLongCMS());
+}
+
+//___________________________________
+double AliFemtoPair::qOutBf(double beta) const
+{
+ return(this->qOutCMS());
+}
+
+//___________________________________
+
+double AliFemtoPair::qSideBf(double beta) const
+{
+ return(this->qSideCMS());
+}
+
+//___________________________________
+double AliFemtoPair::qLongBf(double beta) const
+{
+    AliFemtoLorentzVector tmp1 = fTrack1->FourMomentum();
+    AliFemtoLorentzVector tmp2 = fTrack2->FourMomentum();
+
+    double dz = tmp1.z() - tmp2.z();
+    double dt = tmp1.t() + tmp2.t();
+
+    double gamma = 1.0/::sqrt(1.0 - beta*beta);
+
+    double temp = gamma*(dz - beta*dt);
+    return (temp);
+}
+
+double AliFemtoPair::quality() const {
+  unsigned long mapMask0 = 0xFFFFFF00;
+  unsigned long mapMask1 = 0x1FFFFF;
+  unsigned long padRow1To24Track1 = fTrack1->TopologyMap(0) & mapMask0;
+  unsigned long padRow25To45Track1 = fTrack1->TopologyMap(1) & mapMask1;
+  unsigned long padRow1To24Track2 = fTrack2->TopologyMap(0) & mapMask0;
+  unsigned long padRow25To45Track2 = fTrack2->TopologyMap(1) & mapMask1;
+  // AND logic
+  unsigned long bothPads1To24 = padRow1To24Track1 & padRow1To24Track2;
+  unsigned long bothPads25To45 = padRow25To45Track1 & padRow25To45Track2;
+  // XOR logic
+  unsigned long onePad1To24 = padRow1To24Track1 ^ padRow1To24Track2;
+  unsigned long onePad25To45 = padRow25To45Track1 ^ padRow25To45Track2;
+  unsigned long bitI;
+  int ibits;
+  int Quality = 0;
+  double normQual = 0.0;
+  int MaxQuality = fTrack1->NumberOfHits() + fTrack2->NumberOfHits();
+  for (ibits=8;ibits<=31;ibits++) {
+    bitI = 0;
+    bitI |= 1UL<<(ibits);
+    if ( onePad1To24 & bitI ) {
+      Quality++;
+      continue;
+    }
+    else{
+      if ( bothPads1To24 & bitI ) Quality--;
+    }
+  }
+  for (ibits=0;ibits<=20;ibits++) {
+    bitI = 0;
+    bitI |= 1UL<<(ibits);
+    if ( onePad25To45 & bitI ) {
+      Quality++;
+      continue;
+    }
+    else{
+      if ( bothPads25To45 & bitI ) Quality--;
+    }
+  }
+  normQual = (double)Quality/( (double) MaxQuality );
+  return ( normQual );
+
+}
+
+double AliFemtoPair::quality2() const {
+  unsigned long mapMask0 = 0xFFFFFF00;
+  unsigned long mapMask1 = 0x1FFFFF;
+  unsigned long padRow1To24Track1 = fTrack1->TopologyMap(0) & mapMask0;
+  unsigned long padRow25To45Track1 = fTrack1->TopologyMap(1) & mapMask1;
+  unsigned long padRow1To24Track2 = fTrack2->TopologyMap(0) & mapMask0;
+  unsigned long padRow25To45Track2 = fTrack2->TopologyMap(1) & mapMask1;
+
+  // AND logic
+  //unsigned long bothPads1To24 = padRow1To24Track1 & padRow1To24Track2;
+  //unsigned long bothPads25To45 = padRow25To45Track1 & padRow25To45Track2;
+
+  // XOR logic
+  unsigned long onePad1To24 = padRow1To24Track1 ^ padRow1To24Track2;
+  unsigned long onePad25To45 = padRow25To45Track1 ^ padRow25To45Track2;
+  unsigned long bitI;
+  int ibits;
+  int Quality = 0;
+  double normQual = 0.0;
+  int MaxQuality = fTrack1->NumberOfHits() + fTrack2->NumberOfHits();
+  for (ibits=8;ibits<=31;ibits++) {
+    bitI = 0;
+    bitI |= 1UL<<(ibits);
+    if ( onePad1To24 & bitI ) {
+      Quality++;
+      continue;
+    }
+    //else{
+    //if ( bothPads1To24 & bitI ) Quality--;
+    //}
+  }
+  for (ibits=0;ibits<=20;ibits++) {
+    bitI = 0;
+    bitI |= 1UL<<(ibits);
+    if ( onePad25To45 & bitI ) {
+      Quality++;
+      continue;
+    }
+    //else{
+    //if ( bothPads25To45 & bitI ) Quality--;
+    //}
+  }
+  normQual = (double)Quality/( (double) MaxQuality );
+  return ( normQual );
+
+}
+
+
+double AliFemtoPair::NominalTpcExitSeparation() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcExitPoint() - fTrack2->NominalTpcExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::NominalTpcEntranceSeparation() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcEntrancePoint() - fTrack2->NominalTpcEntrancePoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::NominalTpcAverageSeparation() const {
+  AliFemtoThreeVector diff;
+  double AveSep = 0.0;
+  int ipt = 0;
+  if (fTrack1->fNominalPosSample && fTrack2->fNominalPosSample){
+  while (fabs(fTrack1->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack1->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack1->fNominalPosSample[ipt].z())<9999. &&
+        fabs(fTrack2->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack2->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack2->fNominalPosSample[ipt].z())<9999. &&
+        ipt<11
+        ){
+    //  for (int ipt=0; ipt<11; ipt++){
+    diff = fTrack1->fNominalPosSample[ipt] - fTrack2->fNominalPosSample[ipt];
+    ipt++;
+    AveSep += diff.mag();
+  }
+  AveSep = AveSep/(ipt+1.);
+  return (AveSep);}
+  else return -1;
+}
+
+double AliFemtoPair::OpeningAngle() const {
+ return 57.296* fTrack1->FourMomentum().vect().angle( fTrack2->FourMomentum().vect() );
+//   AliFemtoThreeVector p1 = fTrack1->FourMomentum().vect();
+//   AliFemtoThreeVector p2 = fTrack2->FourMomentum().vect();
+//   return 57.296*(p1.phi()-p2.phi());
+//   //double dAngInv = 57.296*acos((p1.dot(p2))/(p1.mag()*p2.mag()));
+//   //return (dAngInv);
+}
+//_________________
+
+
+double AliFemtoPair::KStarFlipped() const {
+  AliFemtoLorentzVector tP1 = fTrack1->FourMomentum();
+
+  AliFmThreeVectorD qwe = tP1.vect();
+  qwe *= -1.; // flip it
+  tP1.setVect(qwe);
+  
+  AliFemtoLorentzVector tSum = (tP1+fTrack2->FourMomentum());
+  double tMass = abs(tSum);
+  AliFmThreeVectorD tGammaBeta = (1./tMass)*tSum.vect(); 
+  double tGamma = tSum.e()/tMass;
+  AliFmThreeVectorD tLongMom  = ((tP1.vect()*tGammaBeta)/
+                             (tGammaBeta*tGammaBeta))*tGammaBeta;
+  AliFmLorentzVectorD tK(tGamma*tP1.e() - tP1.vect()*tGammaBeta,
+                     tP1.vect() + (tGamma-1.)*tLongMom - tP1.e()*tGammaBeta);
+//VP  tP1.vect() *= -1.; // unflip it
+  return tK.vect().mag();
+}
+
+//double AliFemtoPair::CVK() const{
+//const AliFemtoLorentzVector& tP1 = fTrack1->FourMomentum();
+//AliFemtoLorentzVector tSum = (tP1+fTrack2->FourMomentum());
+//double tMass = abs(tSum);
+//AliFmThreeVectorD tGammaBeta = (1./tMass)*tSum.vect(); 
+//double tGamma = tSum.e()/tMass;
+//AliFmThreeVectorD tLongMom  = ((tP1.vect()*tGammaBeta)/
+//                   (tGammaBeta*tGammaBeta))*tGammaBeta;
+//AliFmLorentzVectorD tK(tGamma*tP1.e() - tP1.vect()*tGammaBeta,
+//           tP1.vect() + (tGamma-1.)*tLongMom - tP1.e()*tGammaBeta);
+//return (tK.vect())*tGammaBeta/tK.vect().magnitude()/tGammaBeta.magnitude();
+//}
+
+double AliFemtoPair::CVKFlipped() const{
+  AliFemtoLorentzVector tP1 = fTrack1->FourMomentum();
+  AliFmThreeVectorD qwe = tP1.vect();
+  qwe *= -1.; // flip it
+  tP1.setVect(qwe);
+  
+  AliFemtoLorentzVector tSum = (tP1+fTrack2->FourMomentum());
+  double tMass = abs(tSum);
+  AliFmThreeVectorD tGammaBeta = (1./tMass)*tSum.vect(); 
+  double tGamma = tSum.e()/tMass;
+  AliFmThreeVectorD tLongMom  = ((tP1.vect()*tGammaBeta)/
+                             (tGammaBeta*tGammaBeta))*tGammaBeta;
+  AliFmLorentzVectorD tK(tGamma*tP1.e() - tP1.vect()*tGammaBeta,
+                     tP1.vect() + (tGamma-1.)*tLongMom - tP1.e()*tGammaBeta);
+//VP  tP1.vect() *= -1.; // unflip it
+  return (tK.vect())*tGammaBeta/tGamma;
+}
+
+double AliFemtoPair::pInv() const{
+  AliFemtoLorentzVector tP1 = fTrack1->FourMomentum();
+  AliFemtoLorentzVector tP2 = fTrack2->FourMomentum();
+  double tP = (tP1.px()+tP2.px())*(tP1.px()+tP2.px())+
+              (tP1.py()+tP2.py())*(tP1.py()+tP2.py())+
+              (tP1.pz()+tP2.pz())*(tP1.pz()+tP2.pz())-
+              (tP1.e() -tP2.e() )*(tP1.e() -tP2.e() );
+  return ::sqrt(fabs(tP));
+}
+
+double AliFemtoPair::qInvFlippedXY() const{
+  AliFemtoLorentzVector tP1 = fTrack1->FourMomentum();
+  tP1.setX(-1.*tP1.x());
+  tP1.setY(-1.*tP1.y());
+  AliFemtoLorentzVector tDiff = (tP1-fTrack2->FourMomentum());
+  return ( -1.* tDiff.m());
+}
+
+void AliFemtoPair::calcNonIdPar() const{ // fortran like function! faster?
+  fNonIdParNotCalculated=0;
+  double px1 = fTrack1->FourMomentum().vect().x();
+  double py1 = fTrack1->FourMomentum().vect().y();
+  double pz1 = fTrack1->FourMomentum().vect().z();
+  double pE1  = fTrack1->FourMomentum().e();
+  double Particle1Mass = ::sqrt(pE1*pE1 - px1*px1 - py1*py1 - pz1*pz1);
+  double px2 = fTrack2->FourMomentum().vect().x();
+  double py2 = fTrack2->FourMomentum().vect().y();
+  double pz2 = fTrack2->FourMomentum().vect().z();
+  double pE2  = fTrack2->FourMomentum().e();
+  double Particle2Mass = ::sqrt(pE2*pE2 - px2*px2 - py2*py2 - pz2*pz2);
+
+  double Px = px1+px2;
+  double Py = py1+py2;
+  double Pz = pz1+pz2;
+  double PE = pE1+pE2;
+      
+  double Ptrans = Px*Px + Py*Py;
+  double Mtrans = PE*PE - Pz*Pz;
+  double Pinv =   ::sqrt(Mtrans - Ptrans);
+  Mtrans = ::sqrt(Mtrans);
+  Ptrans = ::sqrt(Ptrans);
+       
+  double QinvL = (pE1-pE2)*(pE1-pE2) - (px1-px2)*(px1-px2) -
+    (py1-py2)*(py1-py2) - (pz1-pz2)*(pz1-pz2);
+
+  double Q = (Particle1Mass*Particle1Mass - Particle2Mass*Particle2Mass)/Pinv;
+  Q = sqrt ( Q*Q - QinvL);
+         
+  kStarCalc = Q/2;
+
+  // ad 1) go to LCMS
+  double beta = Pz/PE;
+  double gamma = PE/Mtrans;
+           
+  double pz1L = gamma * (pz1 - beta * pE1);
+  double pE1L = gamma * (pE1 - beta * pz1);
+  
+  // fill histogram for beam projection ( z - axis )
+  fDKLong = pz1L;
+
+  // ad 2) rotation px -> Pt
+  double px1R = (px1*Px + py1*Py)/Ptrans;
+  double py1R = (-px1*Py + py1*Px)/Ptrans;
+  
+  //fill histograms for side projection ( y - axis )
+  fDKSide = py1R;
+
+  // ad 3) go from LCMS to CMS
+  beta = Ptrans/Mtrans;
+  gamma = Mtrans/Pinv;
+  
+  double px1C = gamma * (px1R - beta * pE1L);
+  
+  // fill histogram for out projection ( x - axis )
+  fDKOut  = px1C;
+
+  fCVK = (fDKOut*Ptrans + fDKLong*Pz)/kStarCalc/::sqrt(Ptrans*Ptrans+Pz*Pz);
+}
+
+
+/*void AliFemtoPair::calcNonIdParGlobal() const{ // fortran like function! faster?
+  fNonIdParNotCalculatedGlobal=0;
+  double px1 = fTrack1->Track()->PGlobal().x();
+  double py1 = fTrack1->Track()->PGlobal().y();
+  double pz1 = fTrack1->Track()->PGlobal().z();
+  double Particle1Mass =  fTrack1->FourMomentum().m2();
+  double pE1  = ::sqrt(Particle1Mass + px1*px1 + py1*py1 + pz1*pz1);
+  Particle1Mass = ::sqrt(Particle1Mass);
+
+  double px2 = fTrack2->Track()->PGlobal().x();
+  double py2 = fTrack2->Track()->PGlobal().y();
+  double pz2 = fTrack2->Track()->PGlobal().z();
+  double Particle2Mass =  fTrack2->FourMomentum().m2();
+  double pE2  = ::sqrt(Particle2Mass + px2*px2 + py2*py2 + pz2*pz2);
+  Particle2Mass = ::sqrt(Particle2Mass);
+
+  double Px = px1+px2;
+  double Py = py1+py2;
+  double Pz = pz1+pz2;
+  double PE = pE1+pE2;
+      
+  double Ptrans = Px*Px + Py*Py;
+  double Mtrans = PE*PE - Pz*Pz;
+  double Pinv =   ::sqrt(Mtrans - Ptrans);
+  Mtrans = ::sqrt(Mtrans);
+  Ptrans = ::sqrt(Ptrans);
+       
+  double QinvL = (pE1-pE2)*(pE1-pE2) - (px1-px2)*(px1-px2) -
+    (py1-py2)*(py1-py2) - (pz1-pz2)*(pz1-pz2);
+
+  double Q = (Particle1Mass*Particle1Mass - Particle2Mass*Particle2Mass)/Pinv;
+  Q = sqrt ( Q*Q - QinvL);
+         
+  kStarCalcGlobal = Q/2;
+
+  // ad 1) go to LCMS
+  double beta = Pz/PE;
+  double gamma = PE/Mtrans;
+           
+  double pz1L = gamma * (pz1 - beta * pE1);
+  double pE1L = gamma * (pE1 - beta * pz1);
+  
+  // fill histogram for beam projection ( z - axis )
+  fDKLongGlobal = pz1L;
+
+  // ad 2) rotation px -> Pt
+  double px1R = (px1*Px + py1*Py)/Ptrans;
+  double py1R = (-px1*Py + py1*Px)/Ptrans;
+  
+  //fill histograms for side projection ( y - axis )
+  fDKSideGlobal = py1R;
+
+  // ad 3) go from LCMS to CMS
+  beta = Ptrans/Mtrans;
+  gamma = Mtrans/Pinv;
+  
+  double px1C = gamma * (px1R - beta * pE1L);
+  
+  // fill histogram for out projection ( x - axis )
+  fDKOutGlobal  = px1C;
+
+  fCVKGlobal = (fDKOutGlobal*Ptrans + fDKLongGlobal*Pz)/
+    kStarCalcGlobal/::sqrt(Ptrans*Ptrans+Pz*Pz);
+}*/
+
+
+
+double AliFemtoPair::dcaInsideTpc() const{
+
+  double tMinDist=NominalTpcEntranceSeparation();
+  double tExit = NominalTpcExitSeparation();
+  tMinDist = (tExit>tMinDist) ? tMinDist : tExit;
+  double tInsideDist;
+  //tMinDist = 999.;
+
+  double rMin = 60.;
+  double rMax = 190.;
+  const AliFmPhysicalHelixD& tHelix1 = fTrack1->Helix();
+  const AliFmPhysicalHelixD& tHelix2 = fTrack2->Helix();
+  // --- One is a line and other one a helix
+  //if (tHelix1.mSingularity != tHelix2.mSingularity) return -999.;
+  // --- 2 lines : don't care right now
+  //if (tHelix1.mSingularity)  return -999.;
+  // --- 2 helix
+  double dx = tHelix2.xcenter() - tHelix1.xcenter();
+  double dy = tHelix2.ycenter() - tHelix1.ycenter();
+  double dd = ::sqrt(dx*dx + dy*dy);
+  double r1 = 1/tHelix1.curvature();
+  double r2 = 1/tHelix2.curvature();
+  double cosAlpha = (r1*r1 + dd*dd - r2*r2)/(2*r1*dd);
+    
+  double x, y, r;
+  double s;
+  if (fabs(cosAlpha) < 1) {           // two solutions
+    double sinAlpha = sin(acos(cosAlpha));
+    x = tHelix1.xcenter() + r1*(cosAlpha*dx - sinAlpha*dy)/dd;
+    y = tHelix1.ycenter() + r1*(sinAlpha*dx + cosAlpha*dy)/dd;
+    r = ::sqrt(x*x+y*y);
+    if( r > rMin &&  r < rMax && 
+       fabs(atan2(y,x)-fTrack1->NominalTpcEntrancePoint().phi())< 0.5
+       ){ // first solution inside
+      s = tHelix1.pathLength(x, y);
+      tInsideDist=tHelix2.distance(tHelix1.at(s));
+      if(tInsideDist<tMinDist) tMinDist = tInsideDist;
+    }
+    else{ 
+      x = tHelix1.xcenter() + r1*(cosAlpha*dx + sinAlpha*dy)/dd;
+      y = tHelix1.ycenter() + r1*(cosAlpha*dy - sinAlpha*dx)/dd;
+      r = ::sqrt(x*x+y*y);
+      if( r > rMin &&  r < rMax &&
+         fabs(atan2(y,x)-fTrack1->NominalTpcEntrancePoint().phi())< 0.5
+         ) {  // second solution inside
+        s = tHelix1.pathLength(x, y);
+        tInsideDist=tHelix2.distance(tHelix1.at(s));
+        if(tInsideDist<tMinDist) tMinDist = tInsideDist;
+      }     
+    }
+  }
+  return tMinDist;
+}
+
+void AliFemtoPair::calcMergingPar() const{
+  fMergingParNotCalculated=0;
+
+  double tDu, tDz;
+  int tN = 0;
+  fFracOfMergedRow = 0.;
+  fWeightedAvSep =0.;
+  double tDist;
+  double tDistMax = 200.;
+  for(int ti=0 ; ti<45 ; ti++){
+    if(fTrack1->fSect[ti]==fTrack2->fSect[ti] && fTrack1->fSect[ti]!=-1){
+      tDu = fabs(fTrack1->fU[ti]-fTrack2->fU[ti]);
+      tDz = fabs(fTrack1->fZ[ti]-fTrack2->fZ[ti]);
+      tN++;
+      if(ti<13){
+       fFracOfMergedRow += (tDu<fMaxDuInner && tDz<fMaxDzInner);
+       tDist = ::sqrt(tDu*tDu/fMaxDuInner/fMaxDuInner+
+                    tDz*tDz/fMaxDzInner/fMaxDzInner);
+       //fFracOfMergedRow += (tDu<fMaxDuInner && tDz<fMaxDzInner);
+      }
+      else{
+       fFracOfMergedRow += (tDu<fMaxDuOuter && tDz<fMaxDzOuter);
+       tDist = ::sqrt(tDu*tDu/fMaxDuOuter/fMaxDuOuter+
+                    tDz*tDz/fMaxDzOuter/fMaxDzOuter);
+       //fFracOfMergedRow += (tDu<fMaxDuOuter && tDz<fMaxDzOuter);
+      }
+      if(tDist<tDistMax){
+       fClosestRowAtDCA = ti+1;
+       tDistMax = tDist;
+      }
+      fWeightedAvSep += tDist;
+    }
+  }
+  if(tN>0){
+    fWeightedAvSep /= tN;
+    fFracOfMergedRow /= tN;
+  }
+  else{
+    fClosestRowAtDCA = -1;
+    fFracOfMergedRow = -1.;
+    fWeightedAvSep = -1.;
+  }
+}
+//________________V0 daughters exit/entrance/average separation calc.
+//_______1st part is a track 2nd is a V0 considering Pos daughter
+double AliFemtoPair::TpcExitSeparationTrackV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcExitPoint() - fTrack2->TpcV0PosExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationTrackV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcEntrancePoint() - fTrack2->TpcV0PosEntrancePoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcAverageSeparationTrackV0Pos() const {
+  AliFemtoThreeVector diff;
+  double AveSep = 0.0;
+  int ipt = 0;
+  if (fTrack1->fNominalPosSample && fTrack2->fNominalPosSample){
+  while (fabs(fTrack1->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack1->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack1->fNominalPosSample[ipt].z())<9999. &&
+        fabs(fTrack2->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack2->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack2->fNominalPosSample[ipt].z())<9999. &&
+        (ipt<11)
+        ){
+    diff = fTrack1->fNominalPosSample[ipt] - fTrack2->fNominalPosSample[ipt];
+    ipt++;
+    AveSep += diff.mag();
+  }
+  AveSep = AveSep/(ipt+1.);
+  return (AveSep);}
+  else return -1;
+}
+//_______1st part is a track 2nd is a V0 considering Neg daughter
+double AliFemtoPair::TpcExitSeparationTrackV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcExitPoint() - fTrack2->TpcV0NegExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationTrackV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->NominalTpcEntrancePoint() - fTrack2->TpcV0NegEntrancePoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcAverageSeparationTrackV0Neg() const {
+  AliFemtoThreeVector diff;
+  double AveSep = 0.0;
+  int ipt = 0;
+  if (fTrack1->fNominalPosSample && fTrack2->fTpcV0NegPosSample){
+  while (fabs(fTrack1->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack1->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack1->fNominalPosSample[ipt].z())<9999. &&
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].x())<9999. &&
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].y())<9999. && 
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].z())<9999. &&
+        (ipt<11)
+        ){
+    diff = fTrack1->fNominalPosSample[ipt] - fTrack2->fTpcV0NegPosSample[ipt];
+    ipt++;
+    AveSep += diff.mag();
+  }
+  AveSep = AveSep/(ipt+1.);
+  return (AveSep);}
+  else return -1;
+}
+
+//_______1st part is a V0 considering Pos daughter 2nd is a V0 considering Pos daughter
+double AliFemtoPair::TpcExitSeparationV0PosV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0PosExitPoint() - fTrack2->TpcV0PosExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationV0PosV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0PosEntrancePoint() - fTrack2->TpcV0PosEntrancePoint();
+  return (diff.mag());
+}
+double AliFemtoPair::TpcAverageSeparationV0PosV0Pos() const {
+  AliFemtoThreeVector diff;
+  double AveSep = 0.0;
+  int ipt=0;
+  if (fTrack1->fNominalPosSample && (fTrack2->fNominalPosSample)){
+    while ((fabs(fTrack1->fNominalPosSample[ipt].x())<9999.) &&
+       (fabs(fTrack1->fNominalPosSample[ipt].y())<9999.) &&
+       (fabs(fTrack1->fNominalPosSample[ipt].z())<9999.) &&
+       (fabs(fTrack2->fNominalPosSample[ipt].x())<9999.) &&
+       (fabs(fTrack2->fNominalPosSample[ipt].y())<9999.) &&
+       (fabs(fTrack2->fNominalPosSample[ipt].z())<9999.) &&
+        (ipt<11)  
+       ){
+      diff = fTrack1->fNominalPosSample[ipt] - fTrack2->fNominalPosSample[ipt];
+      ipt++;
+      AveSep += diff.mag();
+    }
+    AveSep = AveSep/(ipt+1);
+    return (AveSep);}
+  else return -1;
+}
+
+//_______1st part is a V0 considering Pos daughter 2nd is a V0 considering Neg daughter
+double AliFemtoPair::TpcExitSeparationV0PosV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0PosExitPoint() - fTrack2->TpcV0NegExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationV0PosV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0PosEntrancePoint() - fTrack2->TpcV0NegEntrancePoint();
+  return (diff.mag());
+}
+double AliFemtoPair::TpcAverageSeparationV0PosV0Neg() const {
+  AliFemtoThreeVector diff;
+  double AveSep = 0.0;
+  int ipt = 0;
+  if (fTrack1->fNominalPosSample && fTrack2->fTpcV0NegPosSample){
+  while (fabs(fTrack1->fNominalPosSample[ipt].x())<9999. &&
+        fabs(fTrack1->fNominalPosSample[ipt].y())<9999. && 
+        fabs(fTrack1->fNominalPosSample[ipt].z())<9999. &&
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].x())<9999. &&
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].y())<9999. && 
+        fabs(fTrack2->fTpcV0NegPosSample[ipt].z())<9999. &&
+        (ipt<11)
+        ){
+    diff = fTrack1->fNominalPosSample[ipt] - fTrack2->fTpcV0NegPosSample[ipt];
+    ipt++;
+    AveSep += diff.mag();
+  }
+  AveSep = AveSep/(ipt+1.);
+  return (AveSep);}
+  else return -1; 
+}
+//_______1st part is a V0 considering Neg daughter 2nd is a V0 considering Pos daughter
+// this is to check the upper case
+double AliFemtoPair::TpcExitSeparationV0NegV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0NegExitPoint() - fTrack2->TpcV0PosExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationV0NegV0Pos() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0NegEntrancePoint() - fTrack2->TpcV0PosEntrancePoint();
+  return (diff.mag());
+}
+double AliFemtoPair::TpcAverageSeparationV0NegV0Pos() const {
+   AliFemtoThreeVector diff;
+   double AveSep = 0.0;
+   int ipt = 0;
+   if ( fTrack1->fTpcV0NegPosSample &&  fTrack2->fNominalPosSample){
+     while (fabs(fTrack1->fTpcV0NegPosSample[ipt].x())<9999. &&
+           fabs(fTrack1->fTpcV0NegPosSample[ipt].y())<9999. && 
+           fabs(fTrack1->fTpcV0NegPosSample[ipt].z())<9999. &&
+           fabs(fTrack2->fNominalPosSample[ipt].x())<9999. &&
+           fabs(fTrack2->fNominalPosSample[ipt].y())<9999. && 
+           fabs(fTrack2->fNominalPosSample[ipt].z())<9999. &&
+           (ipt<11)
+           ){
+       diff = fTrack1->fTpcV0NegPosSample[ipt] - fTrack2->fNominalPosSample[ipt];
+       ipt++;
+       AveSep += diff.mag();
+     }
+     AveSep = AveSep/(ipt+1);
+     return (AveSep);}
+     else return -1;
+}
+//_______1st part is a V0 considering Neg daughter 2nd is a V0 considering Neg daughter
+double AliFemtoPair::TpcExitSeparationV0NegV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0NegExitPoint() - fTrack2->TpcV0NegExitPoint();
+  return (diff.mag());
+}
+
+double AliFemtoPair::TpcEntranceSeparationV0NegV0Neg() const {
+  AliFemtoThreeVector diff = fTrack1->TpcV0NegEntrancePoint() - fTrack2->TpcV0NegEntrancePoint();
+  return (diff.mag());
+}
+double AliFemtoPair::TpcAverageSeparationV0NegV0Neg() const {
+   AliFemtoThreeVector diff;
+   double AveSep = 0.0;
+   int ipt=0;
+   if (fTrack1->fTpcV0NegPosSample && fTrack2->fTpcV0NegPosSample){
+     while (fabs(fTrack1->fTpcV0NegPosSample[ipt].x())<9999. &&
+           fabs(fTrack1->fTpcV0NegPosSample[ipt].y())<9999. && 
+           fabs(fTrack1->fTpcV0NegPosSample[ipt].z())<9999. &&
+           fabs(fTrack2->fTpcV0NegPosSample[ipt].x())<9999. &&
+           fabs(fTrack2->fTpcV0NegPosSample[ipt].y())<9999. && 
+           fabs(fTrack2->fTpcV0NegPosSample[ipt].z())<9999. &&
+           (ipt<11)
+           ){
+       diff = fTrack1->fTpcV0NegPosSample[ipt] - fTrack2->fTpcV0NegPosSample[ipt];
+       ipt++;
+       AveSep += diff.mag();
+     }
+     AveSep = AveSep/(ipt+1);
+     return (AveSep);}
+   else return -1;
+}
+
+//________________end V0 daughters exit/entrance/average separation calc.
+void AliFemtoPair::CalcMergingParFctn(short* tmpMergingParNotCalculatedFctn,
+                                  float* tmpZ1,float* tmpU1,
+                                  float* tmpZ2,float* tmpU2,
+                                  int *tmpSect1,int *tmpSect2,
+                                  double* tmpFracOfMergedRow,
+                                  double* tmpClosestRowAtDCA
+                                  ) const{
+  tmpMergingParNotCalculatedFctn=0;
+  double tDu, tDz;
+  int tN = 0;
+  *tmpFracOfMergedRow = 0.;
+  *tmpClosestRowAtDCA = 0.;
+  double tDist;
+  double tDistMax = 100000000.;
+  for(int ti=0 ; ti<45 ; ti++){
+    if(tmpSect1[ti]==tmpSect2[ti] && tmpSect1[ti]!=-1){
+       tDu = fabs(tmpU1[ti]-tmpU2[ti]);
+       tDz = fabs(tmpZ1[ti]-tmpZ2[ti]);
+       tN++;
+      if(ti<13){
+       *tmpFracOfMergedRow += (tDu<fMaxDuInner && tDz<fMaxDzInner);
+       tDist = ::sqrt(tDu*tDu/fMaxDuInner/fMaxDuInner+
+                    tDz*tDz/fMaxDzInner/fMaxDzInner);
+      }
+      else{
+       *tmpFracOfMergedRow += (tDu<fMaxDuOuter && tDz<fMaxDzOuter);
+       tDist = ::sqrt(tDu*tDu/fMaxDuOuter/fMaxDuOuter+
+                    tDz*tDz/fMaxDzOuter/fMaxDzOuter);
+       }
+      if(tDist<tDistMax){
+       fClosestRowAtDCA = ti+1;
+       tDistMax = tDist;
+      }
+      //fWeightedAvSep += tDist; // now, wrong but not used
+    }  
+  }
+  if(tN>0){
+    //fWeightedAvSep /= tN;
+    *tmpFracOfMergedRow /= tN;
+  }
+  else{
+    *tmpClosestRowAtDCA = -1;
+    *tmpFracOfMergedRow = -1.;
+    //fWeightedAvSep = -1.;
+  }
+}
+
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoPair.h
new file mode 100644 (file)
index 0000000..109264a
--- /dev/null
@@ -0,0 +1,515 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoPair.h,v 1.17
+ *
+ * Author: Brian Laziuk, Yale University
+ *         slightly modified by Mike Lisa
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *    the Pair object is passed to the PairCuts for verification, and
+ *    then to the AddRealPair and AddMixedPair methods of the
+ *    Correlation Functions
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.19  2003/01/14 09:44:00  renault
+ * corrections on average separation calculation for tracks which doesn't cross
+ * all 45 padrows.
+ *
+ * Revision 1.18  2002/11/19 23:33:18  renault
+ * Enable average separation calculation for all combinaisons of
+ * V0 daughters and tracks
+ *
+ * Revision 1.16  2002/02/28 14:18:36  rcwells
+ * Added emissionAngle function to AliFemtoPair
+ *
+ * Revision 1.15  2001/12/14 23:11:30  fretiere
+ * Add class HitMergingCut. Add class fabricesPairCut = HitMerginCut + pair purity cuts. Add TpcLocalTransform function which convert to local tpc coord (not pretty). Modify AliFemtoTrack, AliFemtoParticle, AliFemtoHiddenInfo, AliFemtoPair to handle the hit information and cope with my code
+ *
+ * Revision 1.14  2001/04/03 21:04:36  kisiel
+ *
+ *
+ *   Changes needed to make the Theoretical code
+ *   work. The main code is the ThCorrFctn directory.
+ *   The most visible change is the addition of the
+ *   HiddenInfo to AliFemtoPair.
+ *
+ * Revision 1.13  2001/03/28 22:35:23  flierl
+ * changes and bugfixes in qYKP*
+ * add pairrapidity
+ *
+ * Revision 1.12  2001/01/22 22:56:40  laue
+ * Yano-Koonin-Podgoretskii Parametrisation added
+ *
+ * Revision 1.11  2000/10/26 16:09:16  lisa
+ * Added OpeningAngle PairCut class and method to AliFemtoPair
+ *
+ * Revision 1.10  2000/10/05 23:09:05  lisa
+ * Added kT-dependent radii to mixed-event simulator AND implemented AverageSeparation Cut and CorrFctn
+ *
+ * Revision 1.9  2000/07/17 20:03:17  lisa
+ * Implemented tools for addressing and assessing trackmerging
+ *
+ * Revision 1.8  2000/04/04 16:13:09  lisa
+ * AliFemtoPair:quality() now returns normalized value (and so is double) and add a CorrFctn which looks at quality()
+ *
+ * Revision 1.7  2000/04/03 22:09:12  rcwells
+ * Add member function ... quality().
+ *
+ * Revision 1.6  2000/02/13 21:13:34  lisa
+ * changed ambiguous AliFemtoPair::fourMomentum() to fourMomentumSum() and fourMomentumDiff() and fixed related bug in QvecCorrFctn
+ *
+ * Revision 1.5  2000/01/25 17:35:17  laue
+ * I. In order to run the stand alone version of the AliFemtoMaker the following
+ * changes have been done:
+ * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
+ * b) unnecessary includes of StMaker.h have been removed
+ * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
+ * needed for the stand alone version
+ *
+ * II. To reduce the amount of compiler warning
+ * a) some variables have been type casted
+ * b) some destructors have been declared as virtual
+ *
+ * Revision 1.4  1999/07/29 16:16:34  lisa
+ * Selemons upgrade of AliFemtoPair class
+ *
+ * Revision 1.3  1999/07/22 18:49:10  lisa
+ * Implement idea of Fabrice to not create and delete AliFemtoPair all the time
+ *
+ * Revision 1.2  1999/07/06 22:33:22  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef ST_HBT_PAIR_HH
+#define ST_HBT_PAIR_HH
+
+#include <utility>
+
+#include "Infrastructure/AliFemtoParticle.h"
+#include "Infrastructure/AliFemtoTypes.h"
+
+class AliFemtoPair {
+public:
+  AliFemtoPair();
+  AliFemtoPair(AliFemtoParticle*, AliFemtoParticle*);
+  
+
+  ~AliFemtoPair();
+  //AliFemtoPair(const AliFemtoPair&);
+  //AliFemtoPair& operator=(const AliFemtoPair&);
+
+  // track Gets:
+  AliFemtoParticle* track1() const;
+  AliFemtoParticle* track2() const;
+  // track Sets:
+  void SetTrack1(const AliFemtoParticle* trkPtr);
+  void SetTrack2(const AliFemtoParticle* trkPtr);
+
+  AliFemtoLorentzVector fourMomentumDiff() const;
+  AliFemtoLorentzVector fourMomentumSum() const;
+  double qInv() const;
+  double kT()   const;
+  double mInv() const;
+  // pair rapidity
+  double rap() const;
+  double emissionAngle() const;
+
+  // Bertsch-Pratt momentum components in Pair Frame - written by Bekele/Humanic
+  double qSidePf() const;
+  double qOutPf() const;
+  double qLongPf() const;
+   
+  // Bertsch-Pratt momentum components in Local CMS (longitudinally comoving) frame
+  // - written by Bekele/Humanic
+  double qSideCMS() const;
+  double qOutCMS() const;
+  double qLongCMS() const;
+
+  double dKSide() const;
+  double dKOut() const;
+  double dKLong() const;
+
+  // Bertsch-Pratt momentum components in a longitudinally boosted frame
+  // the argument is the beta of the longitudinal boost (default is 0.0, meaning lab frame)
+  // - written by Bekele/Humanic
+  double qSideBf(double beta=0.0) const;
+  double qOutBf(double beta=0.0) const;
+  double qLongBf(double beta=0.0) const;
+
+  // Yano-Koonin-Podgoretskii Parametrisation 
+  // source rest frame (usually lab frame)
+  void qYKPCMS(double& qP, double& qT, double& q0) const ;
+  // longitudinal comoving frame
+  void qYKPLCMS(double& qP, double& qT, double& q0) const ;
+  // pair rest frame
+  void qYKPPF(double& qP, double& qT, double& q0) const ;
+
+
+  double quality() const;
+
+  // the following two methods calculate the "nominal" separation of the tracks 
+  // at the inner field cage (EntranceSeparation) and when they exit the TPC,
+  // which may be at the outer field cage, or at the endcaps.
+  // "nominal" means that the tracks are assumed to start at (0,0,0).  Making this
+  // assumption is important for the Event Mixing-- it is not a mistake. - MALisa
+  double NominalTpcExitSeparation() const;
+  double NominalTpcEntranceSeparation() const;
+  double NominalTpcAverageSeparation() const;
+  // adapted calculation of Entrance/Exit/Average Tpc separation to V0 daughters
+  double TpcExitSeparationTrackV0Pos() const;
+  double TpcEntranceSeparationTrackV0Pos() const;
+  double TpcAverageSeparationTrackV0Pos() const; 
+
+  double TpcExitSeparationTrackV0Neg() const;
+  double TpcEntranceSeparationTrackV0Neg() const;
+  double TpcAverageSeparationTrackV0Neg() const; 
+
+  double TpcExitSeparationV0PosV0Pos() const;
+  double TpcEntranceSeparationV0PosV0Pos() const;
+  double TpcAverageSeparationV0PosV0Pos() const; 
+
+  double TpcExitSeparationV0PosV0Neg() const;
+  double TpcEntranceSeparationV0PosV0Neg() const;
+  double TpcAverageSeparationV0PosV0Neg() const; 
+  double TpcExitSeparationV0NegV0Pos() const;
+  double TpcEntranceSeparationV0NegV0Pos() const;
+  double TpcAverageSeparationV0NegV0Pos() const; 
+  
+  double TpcExitSeparationV0NegV0Neg() const;
+  double TpcEntranceSeparationV0NegV0Neg() const;
+  double TpcAverageSeparationV0NegV0Neg() const; 
+
+  double pInv() const;
+  double KStar() const;
+  double KStarFlipped() const;
+  double CVK() const;
+  double CVKFlipped() const;
+  double qInvFlippedXY() const;
+
+  double OpeningAngle() const;
+
+  // Fabrice Private <<<
+  double KStarSide() const;
+  double KStarOut() const;
+  double KStarLong() const;
+
+  float PionPairProbability() const;
+  float ElectronPairProbability() const;
+  float KaonPairProbability() const;
+  float ProtonPairProbability() const;
+  float KaonPionPairProbability() const;
+
+  double dcaInsideTpc() const;
+  double quality2() const;
+
+ /* double KStarGlobal() const;
+  double CVKGlobal() const;
+  double KStarSideGlobal() const;
+  double KStarOutGlobal() const;
+  double KStarLongGlobal() const;*/
+
+  void setMergingPar(double aMaxDuInner, double aMaxDzInner,
+                    double aMaxDuOuter, double aMaxDzOuter);
+  void setDefaultHalfFieldMergingPar();
+  void setDefaultFullFieldMergingPar();
+  double getFracOfMergedRow() const;
+  double getClosestRowAtDCA() const;
+  double getWeightedAvSep() const;
+  // >>>
+  double getFracOfMergedRowTrkV0Pos() const;
+  double getClosestRowAtDCATrkV0Pos() const;
+
+  double getFracOfMergedRowTrkV0Neg() const;
+  double getClosestRowAtDCATrkV0Neg() const;
+
+  double getFracOfMergedRowV0PosV0Neg() const;
+  double getFracOfMergedRowV0NegV0Pos() const;
+  double getFracOfMergedRowV0PosV0Pos() const;
+  double getFracOfMergedRowV0NegV0Neg() const;
+
+private:
+  AliFemtoParticle* fTrack1;
+  AliFemtoParticle* fTrack2;
+
+  mutable short fNonIdParNotCalculated;
+  mutable double fDKSide;
+  mutable double fDKOut;
+  mutable double fDKLong;
+  mutable double fCVK;
+  mutable double kStarCalc;
+  void calcNonIdPar() const;
+
+  mutable short fNonIdParNotCalculatedGlobal;
+ /* mutable double fDKSideGlobal;
+  mutable double fDKOutGlobal;
+  mutable double fDKLongGlobal;
+  mutable double kStarCalcGlobal;
+  mutable double fCVKGlobal;*/
+  //void calcNonIdParGlobal() const;
+
+  mutable short fMergingParNotCalculated;
+  mutable double fWeightedAvSep;
+  mutable double fFracOfMergedRow;
+  mutable double fClosestRowAtDCA;
+
+  mutable short fMergingParNotCalculatedTrkV0Pos;
+  mutable double fFracOfMergedRowTrkV0Pos;
+  mutable double fClosestRowAtDCATrkV0Pos;
+
+  mutable short fMergingParNotCalculatedTrkV0Neg;
+  mutable double fFracOfMergedRowTrkV0Neg;
+  mutable double fClosestRowAtDCATrkV0Neg;
+
+  mutable short fMergingParNotCalculatedV0PosV0Neg;
+  mutable double fFracOfMergedRowV0PosV0Neg;
+  mutable double fClosestRowAtDCAV0PosV0Neg;
+
+  mutable short fMergingParNotCalculatedV0NegV0Pos;
+  mutable double fFracOfMergedRowV0NegV0Pos;
+  mutable double fClosestRowAtDCAV0NegV0Pos;
+
+  mutable short fMergingParNotCalculatedV0PosV0Pos;
+  mutable double fFracOfMergedRowV0PosV0Pos;
+  mutable double fClosestRowAtDCAV0PosV0Pos;
+
+  mutable short fMergingParNotCalculatedV0NegV0Neg;
+  mutable double fFracOfMergedRowV0NegV0Neg;
+  mutable double fClosestRowAtDCAV0NegV0Neg;
+
+  static double fMaxDuInner;
+  static double fMaxDzInner;
+  static double fMaxDuOuter;
+  static double fMaxDzOuter;
+  void calcMergingPar() const;
+
+  void CalcMergingParFctn(short* tmpMergingParNotCalculatedFctn,
+                         float* tmpZ1,float* tmpU1,
+                         float* tmpZ2,float* tmpU2,
+                         int *tmpSect1,int *tmpSect2,
+                         double* tmpFracOfMergedRow,
+                         double* tmpClosestRowAtDCA
+                         ) const;
+
+  void resetParCalculated();
+};
+
+inline void AliFemtoPair::resetParCalculated(){
+  fNonIdParNotCalculated=1;
+  fNonIdParNotCalculatedGlobal=1;
+  fMergingParNotCalculated=1;
+  fMergingParNotCalculatedTrkV0Pos=1;
+  fMergingParNotCalculatedTrkV0Neg=1;
+  fMergingParNotCalculatedV0PosV0Pos=1;
+  fMergingParNotCalculatedV0NegV0Pos=1;
+  fMergingParNotCalculatedV0PosV0Neg=1;
+  fMergingParNotCalculatedV0NegV0Neg=1;
+}
+
+inline void AliFemtoPair::SetTrack1(const AliFemtoParticle* trkPtr){
+  fTrack1=(AliFemtoParticle*)trkPtr;
+  resetParCalculated();
+}
+inline void AliFemtoPair::SetTrack2(const AliFemtoParticle* trkPtr){
+  fTrack2=(AliFemtoParticle*)trkPtr;
+  resetParCalculated();
+}
+
+inline AliFemtoParticle* AliFemtoPair::track1() const {return fTrack1;}
+inline AliFemtoParticle* AliFemtoPair::track2() const {return fTrack2;}
+
+inline double AliFemtoPair::dKSide() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKSide;
+}
+inline double AliFemtoPair::dKOut() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKOut;
+}
+inline double AliFemtoPair::dKLong() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKLong;
+}
+inline double AliFemtoPair::KStar() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return kStarCalc;
+}
+inline double AliFemtoPair::qInv() const {
+  AliFemtoLorentzVector tDiff = (fTrack1->FourMomentum()-fTrack2->FourMomentum());
+  return ( -1.* tDiff.m());
+}
+
+// Fabrice private <<<
+inline double AliFemtoPair::KStarSide() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKSide;//mKStarSide;
+}
+inline double AliFemtoPair::KStarOut() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKOut;//mKStarOut;
+}
+inline double AliFemtoPair::KStarLong() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fDKLong;//mKStarLong;
+}
+inline double AliFemtoPair::CVK() const{
+  if(fNonIdParNotCalculated) calcNonIdPar();
+  return fCVK;
+}
+
+/*inline double AliFemtoPair::KStarGlobal() const{
+  if(fNonIdParNotCalculatedGlobal) calcNonIdParGlobal();
+  return kStarCalcGlobal;
+}
+inline double AliFemtoPair::KStarSideGlobal() const{
+  if(fNonIdParNotCalculatedGlobal) calcNonIdParGlobal();
+  return fDKSideGlobal;//mKStarSide;
+}
+inline double AliFemtoPair::KStarOutGlobal() const{
+  if(fNonIdParNotCalculatedGlobal) calcNonIdParGlobal();
+  return fDKOutGlobal;//mKStarOut;
+}
+inline double AliFemtoPair::KStarLongGlobal() const{
+  if(fNonIdParNotCalculatedGlobal) calcNonIdParGlobal();
+  return fDKLongGlobal;//mKStarLong;
+}
+inline double AliFemtoPair::CVKGlobal() const{
+  if(fNonIdParNotCalculatedGlobal) calcNonIdParGlobal();
+  return fCVKGlobal;
+}*/
+
+
+inline float AliFemtoPair::PionPairProbability() const{
+  return (fTrack1->Track()->PidProbPion()) * 
+         (fTrack2->Track()->PidProbPion());
+}
+inline float AliFemtoPair::ElectronPairProbability() const{
+  return (fTrack1->Track()->PidProbElectron()) * 
+         (fTrack2->Track()->PidProbElectron());
+}
+inline float AliFemtoPair::KaonPairProbability() const{
+  return (fTrack1->Track()->PidProbKaon()) * 
+         (fTrack2->Track()->PidProbKaon());
+}
+inline float AliFemtoPair::ProtonPairProbability() const{
+  return (fTrack1->Track()->PidProbProton()) * 
+         (fTrack2->Track()->PidProbProton());
+}
+inline float AliFemtoPair::KaonPionPairProbability() const{
+  return (fTrack1->Track()->PidProbKaon()) * 
+         (fTrack2->Track()->PidProbPion());
+}
+
+inline double AliFemtoPair::getFracOfMergedRow() const{
+  if(fMergingParNotCalculated) calcMergingPar();
+  return fFracOfMergedRow;
+}
+inline double AliFemtoPair::getClosestRowAtDCA() const { 
+  if(fMergingParNotCalculated) calcMergingPar();
+  return fClosestRowAtDCA;
+}
+inline double AliFemtoPair::getWeightedAvSep() const {
+  if(fMergingParNotCalculated) calcMergingPar();
+  return fWeightedAvSep;
+}
+
+
+inline double AliFemtoPair::getFracOfMergedRowTrkV0Pos() const{
+  if(fMergingParNotCalculatedTrkV0Pos)
+    CalcMergingParFctn(&fMergingParNotCalculatedTrkV0Pos,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fZ[0]),&(fTrack2->fU[0]),
+                      &(fTrack1->fSect[0]),&(fTrack2->fSect[0]),
+                      &(fFracOfMergedRowTrkV0Pos),&(fClosestRowAtDCATrkV0Pos)
+                      );
+  return fFracOfMergedRowTrkV0Pos;
+}
+inline double AliFemtoPair::getClosestRowAtDCATrkV0Pos() const{
+  if(fMergingParNotCalculatedTrkV0Pos)
+    CalcMergingParFctn(&fMergingParNotCalculatedTrkV0Pos,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fZ[0]),&(fTrack2->fU[0]),
+                      &(fTrack1->fSect[0]),&(fTrack2->fSect[0]),
+                      &fFracOfMergedRowTrkV0Pos,&fClosestRowAtDCATrkV0Pos
+                      );
+  return fClosestRowAtDCATrkV0Pos;
+}
+inline double AliFemtoPair::getFracOfMergedRowTrkV0Neg() const{
+  if(fMergingParNotCalculatedTrkV0Neg)
+    CalcMergingParFctn(&fMergingParNotCalculatedTrkV0Neg,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fV0NegZ[0]),&(fTrack2->fV0NegU[0]),
+                      &(fTrack1->fSect[0]),&(fTrack2->fV0NegSect[0]),
+                      &(fFracOfMergedRowTrkV0Neg),&(fClosestRowAtDCATrkV0Neg)
+                      );
+  return fFracOfMergedRowTrkV0Neg;
+}
+inline double AliFemtoPair::getClosestRowAtDCATrkV0Neg() const{
+  if(fMergingParNotCalculatedTrkV0Neg)
+    CalcMergingParFctn(&fMergingParNotCalculatedTrkV0Neg,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fV0NegZ[0]),&(fTrack2->fV0NegU[0]),
+                      &(fTrack1->fSect[0]),&(fTrack2->fV0NegSect[0]),
+                      &fFracOfMergedRowTrkV0Neg,&fClosestRowAtDCATrkV0Neg
+                      );
+  return fClosestRowAtDCATrkV0Neg;
+}
+inline double AliFemtoPair::getFracOfMergedRowV0PosV0Neg() const{
+  if(fMergingParNotCalculatedV0PosV0Neg)
+    CalcMergingParFctn(&fMergingParNotCalculatedV0PosV0Neg,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fV0NegZ[0]),&(fTrack2->fV0NegU[0]),
+                      &(fTrack1->fSect[0]),&(fTrack2->fV0NegSect[0]),
+                      &(fFracOfMergedRowV0PosV0Neg),
+                      &(fClosestRowAtDCAV0PosV0Neg)
+                      );
+  return fFracOfMergedRowV0PosV0Neg;
+}
+inline double AliFemtoPair::getFracOfMergedRowV0NegV0Pos() const{
+  if(fMergingParNotCalculatedV0NegV0Pos)
+    CalcMergingParFctn(&fMergingParNotCalculatedV0NegV0Pos,
+                      &(fTrack1->fV0NegZ[0]),&(fTrack1->fV0NegU[0]),
+                      &(fTrack2->fZ[0]),&(fTrack2->fU[0]),
+                      &(fTrack1->fV0NegSect[0]),
+                      &(fTrack2->fSect[0]),
+                      &(fFracOfMergedRowV0NegV0Pos),
+                      &(fClosestRowAtDCAV0NegV0Pos)
+                      );
+  return fFracOfMergedRowV0NegV0Pos;
+}
+inline double AliFemtoPair::getFracOfMergedRowV0PosV0Pos() const{
+  if(fMergingParNotCalculatedV0PosV0Pos)
+    CalcMergingParFctn(&fMergingParNotCalculatedV0PosV0Pos,
+                      &(fTrack1->fZ[0]),&(fTrack1->fU[0]),
+                      &(fTrack2->fZ[0]),&(fTrack2->fU[0]),
+                      &(fTrack1->fSect[0]),
+                      &(fTrack2->fSect[0]),
+                      &(fFracOfMergedRowV0PosV0Pos),
+                      &(fClosestRowAtDCAV0PosV0Pos)
+                      );
+  return fFracOfMergedRowV0PosV0Pos;
+}
+inline double AliFemtoPair::getFracOfMergedRowV0NegV0Neg() const{
+  if(fMergingParNotCalculatedV0NegV0Neg)
+    CalcMergingParFctn(&fMergingParNotCalculatedV0NegV0Neg,
+                      &(fTrack1->fV0NegZ[0]),&(fTrack1->fV0NegU[0]),
+                      &(fTrack2->fV0NegZ[0]),&(fTrack2->fV0NegU[0]),
+                      &(fTrack1->fV0NegSect[0]),
+                      &(fTrack2->fV0NegSect[0]),
+                      &(fFracOfMergedRowV0NegV0Neg),
+                      &(fClosestRowAtDCAV0NegV0Neg)
+                      );
+  return fFracOfMergedRowV0NegV0Neg;
+}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.cxx b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.cxx
new file mode 100644 (file)
index 0000000..9dd4bda
--- /dev/null
@@ -0,0 +1,607 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   Particle objects are part of the PicoEvent, which is what is
+ *   stored in the EventMixingBuffers
+ *   A Track object gets converted to a Particle object if it
+ *   passes the ParticleCut of an Analysis
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.22  2003/09/02 17:58:32  perev
+ * gcc 3.2 updates + WarnOff
+ *
+ * Revision 1.21  2003/05/07 15:30:43  magestro
+ * Fixed bug related to finding merged hits (commit for Fabrice)
+ *
+ * Revision 1.20  2003/01/14 09:41:26  renault
+ * changes on average separation calculation, hit shared finder and memory optimisation
+ * for Z,U and Sectors variables.
+ *
+ * Revision 1.19  2002/12/12 17:01:49  kisiel
+ * Hidden Information handling and purity calculation
+ *
+ * Revision 1.18  2002/11/19 23:36:00  renault
+ * Enable calculation of exit/entrance separation for V0 daughters
+ *
+ * Revision 1.17  2001/12/14 23:11:30  fretiere
+ * Add class HitMergingCut. Add class fabricesPairCut = HitMerginCut + pair purity cuts. Add TpcLocalTransform function which convert to local tpc coord (not pretty). Modify AliFemtoTrack, AliFemtoParticle, AliFemtoHiddenInfo, AliFemtoPair to handle the hit information and cope with my code
+ *
+ * Revision 1.16  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * Revision 1.15  2001/04/03 21:04:36  kisiel
+ *
+ *
+ *   Changes needed to make the Theoretical code
+ *   work. The main code is the ThCorrFctn directory.
+ *   The most visible change is the addition of the
+ *   HiddenInfo to AliFemtoPair.
+ *
+ * Revision 1.14  2000/10/05 23:09:05  lisa
+ * Added kT-dependent radii to mixed-event simulator AND implemented AverageSeparation Cut and CorrFctn
+ *
+ * Revision 1.13  2000/08/31 22:31:31  laue
+ * AliFemtoAnalysis: output changed (a little bit less)
+ * AliFemtoEvent: new version, members for reference mult added
+ * AliFemtoIOBinary: new IO for new AliFemtoEvent version
+ * AliFemtoTypes: TTree typedef to AliFemtoTTree added
+ * AliFemtoVertexAnalysis: overflow and underflow added
+ *
+ * Revision 1.12  2000/07/23 13:52:56  laue
+ * NominalExitPoint set to (-9999.,-9999.-9999.) if helix.at()
+ * returns nan (not a number).
+ *
+ * Revision 1.11  2000/07/19 17:18:48  laue
+ * Calculation of Entrance and Exit point added in AliFemtoParticle constructor
+ *
+ * Revision 1.10  2000/07/17 20:03:17  lisa
+ * Implemented tools for addressing and assessing trackmerging
+ *
+ * Revision 1.9  2000/07/16 21:38:23  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers fTrack,fV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.8  2000/05/03 17:44:43  laue
+ * AliFemtoEvent, AliFemtoTrack & AliFemtoV0 declared friend to AliFemtoIOBinary
+ * AliFemtoParticle updated for V0 pos,neg track Id
+ *
+ * Revision 1.7  2000/04/03 16:21:51  laue
+ * some include files changed
+ * Multi track cut added
+ *
+ * Revision 1.6  1999/12/11 15:58:29  lisa
+ * Add vertex decay position datum and accessor to AliFemtoParticle to allow pairwise cuts on seperation of V0s
+ *
+ * Revision 1.5  1999/09/17 22:38:02  lisa
+ * first full integration of V0s into AliFemto framework
+ *
+ * Revision 1.4  1999/09/01 19:04:53  lisa
+ * update Particle class AND add parity cf and Randys Coulomb correction
+ *
+ * Revision 1.3  1999/07/06 22:33:23  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.2  1999/06/29 17:50:27  fisyak
+ * formal changes to account new StEvent, does not complie yet
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#include "Infrastructure/AliFemtoParticle.h"
+//#include "math_constants.h"
+#ifdef __CC5__
+  #include <math.h>
+#else
+  #include <cmath>
+#endif
+
+
+#include "TMath.h"
+using namespace TMath;
+
+double AliFemtoParticle::fPrimPimPar0= 9.05632e-01;
+double AliFemtoParticle::fPrimPimPar1= -2.26737e-01;
+double AliFemtoParticle::fPrimPimPar2= -1.03922e-01;
+double AliFemtoParticle::fPrimPipPar0= 9.09616e-01;
+double AliFemtoParticle::fPrimPipPar1= -9.00511e-02;
+double AliFemtoParticle::fPrimPipPar2= -6.02940e-02;
+double AliFemtoParticle::fPrimPmPar0= 0.;
+double AliFemtoParticle::fPrimPmPar1= 0.;
+double AliFemtoParticle::fPrimPmPar2= 0.;
+double AliFemtoParticle::fPrimPpPar0= 0.;
+double AliFemtoParticle::fPrimPpPar1= 0.;
+double AliFemtoParticle::fPrimPpPar2= 0.;
+
+int TpcLocalTransform(AliFmThreeVectorD& xgl, 
+                     int& iSector, 
+                     int& iPadrow, 
+                     float& xlocal,
+                     double& ttPhi);
+
+
+//_____________________
+AliFemtoParticle::AliFemtoParticle() : fTrack(0), fV0(0), fKink(0), fHiddenInfo(0) {
+  /* no-op for default */
+  //  cout << "Created particle " << this << endl;
+}
+//_____________________
+AliFemtoParticle::~AliFemtoParticle(){
+  //  cout << "Issuing delete for AliFemtoParticle." << endl;
+
+  if (fTrack) delete fTrack;
+  if (fV0) {
+    delete[] fTpcV0NegPosSample;
+    delete[] fV0NegZ;
+    delete[] fV0NegU;
+    delete[] fV0NegSect;
+    delete fV0;
+  }
+  if (fKink) delete fKink;
+  //  cout << "Trying to delete HiddenInfo: " << fHiddenInfo << endl;
+  if (fHiddenInfo) 
+    {
+      //      cout << "Deleting HiddenInfo." << endl;
+      delete fHiddenInfo;
+    }
+  //  cout << "Deleted particle " << this << endl;
+}
+//_____________________
+AliFemtoParticle::AliFemtoParticle(const AliFemtoTrack* const hbtTrack,const double& mass) : fTrack(0), fV0(0), fKink(0), fHiddenInfo(0) {
+  
+  
+  // I know there is a better way to do this...
+  fTrack = new AliFemtoTrack(*hbtTrack);
+  AliFemtoThreeVector temp = hbtTrack->P();
+  fFourMomentum.setVect(temp);
+  double ener = ::sqrt(temp.mag2()+mass*mass);
+  fFourMomentum.setE(ener);
+//  fMap[0] = hbtTrack->TopologyMap(0);
+ // fMap[1] = hbtTrack->TopologyMap(1);
+ // fNhits = hbtTrack->NHits();
+  fHelix = hbtTrack->Helix();
+  //CalculateNominalTpcExitAndEntrancePoints();
+
+  fPrimaryVertex.setX(0.);
+  fPrimaryVertex.setY(0.);
+  fPrimaryVertex.setZ(0.);
+  fSecondaryVertex.setX(0.);
+  fSecondaryVertex.setY(0.);
+  fSecondaryVertex.setZ(0.);
+  /* TO JA ODZNACZYLEM NIE WIEM DLACZEGO
+  CalculateTpcExitAndEntrancePoints(&fHelix,&fPrimaryVertex,
+                                   &fSecondaryVertex,
+                                   &fNominalTpcEntrancePoint,
+                                   &fNominalTpcExitPoint,
+                                   &mNominalPosSample[0],
+                                   &fZ[0],
+                                   &fU[0],
+                                   &fSect[0]);
+  */
+  CalculatePurity();
+  // ***
+  fHiddenInfo= 0;
+  if(hbtTrack->ValidHiddenInfo()){
+    fHiddenInfo= hbtTrack->getHiddenInfo()->getParticleHiddenInfo()->clone();
+  }
+  // ***
+  //  cout << "Created particle " << this << endl;
+
+}
+//_____________________
+AliFemtoParticle::AliFemtoParticle(const AliFemtoV0* const hbtV0,const double& mass) : fTrack(0), fV0(0), fKink(0), fHiddenInfo(0) {
+  fV0 = new AliFemtoV0(*hbtV0);
+ //fMap[0]= 0;
+  //fMap[1]= 0;
+  // I know there is a better way to do this...
+  AliFemtoThreeVector temp = hbtV0->momV0();
+  fFourMomentum.setVect(temp);
+  double ener = ::sqrt(temp.mag2()+mass*mass);
+  fFourMomentum.setE(ener);
+  // Calculating TpcEntrancePoint for Positive V0 daugther
+  fPrimaryVertex = hbtV0->primaryVertex();
+  fSecondaryVertex = hbtV0->decayVertexV0();
+  fHelixV0Pos = hbtV0->HelixPos();
+
+  fTpcV0NegPosSample = new AliFemtoThreeVector[45];//for V0Neg
+  fV0NegZ = new float[45];//for V0Neg
+  fV0NegU = new float[45];//for V0Neg
+  fV0NegSect = new int[45];//for V0Neg
+  CalculateTpcExitAndEntrancePoints(&fHelixV0Pos,&fPrimaryVertex,
+                                   &fSecondaryVertex,
+                                   &fTpcV0PosEntrancePoint,
+                                   &fTpcV0PosExitPoint,
+                                   &fNominalPosSample[0],
+                                   &fZ[0],
+                                   &fU[0],&fSect[0]);
+  fHelixV0Neg = hbtV0->HelixNeg();
+
+  CalculateTpcExitAndEntrancePoints(&fHelixV0Neg,
+                                   &fPrimaryVertex,
+                                   &fSecondaryVertex,
+                                   &fTpcV0NegEntrancePoint,
+                                   &fTpcV0NegExitPoint,
+                                   &fTpcV0NegPosSample[0],
+                                   &fV0NegZ[0],
+                                   &fV0NegU[0],&fV0NegSect[0]);
+
+  // ***
+  fHiddenInfo= 0;
+  if(hbtV0->ValidHiddenInfo()){
+    fHiddenInfo= hbtV0->getHiddenInfo()->clone();
+  }
+  // ***
+}
+//_____________________
+AliFemtoParticle::AliFemtoParticle(const AliFemtoKink* const hbtKink,const double& mass) : fTrack(0), fV0(0), fHiddenInfo(0) {
+  fKink = new AliFemtoKink(*hbtKink);
+ // fMap[0]= 0;
+  //fMap[1]= 0;
+  // I know there is a better way to do this...
+  AliFemtoThreeVector temp = hbtKink->Parent().P();
+  fFourMomentum.setVect(temp);
+  double ener = ::sqrt(temp.mag2()+mass*mass);
+  fFourMomentum.setE(ener);
+}
+
+//_____________________
+AliFemtoParticle::AliFemtoParticle(const AliFemtoXi* const hbtXi, const double& mass)  {
+  fXi = new AliFemtoXi(*hbtXi);
+ // fMap[0]= 0;
+  //fMap[1]= 0;
+  AliFemtoThreeVector temp;// = hbtXi->mMofXi;
+  fFourMomentum.setVect(temp);
+  double ener = ::sqrt(temp.mag2()+mass*mass);
+  fFourMomentum.setE(ener);
+  fHiddenInfo = 0;
+}
+//_____________________
+const AliFemtoThreeVector& AliFemtoParticle::NominalTpcExitPoint() const{
+  // in future, may want to calculate this "on demand" only, sot this routine may get more sophisticated
+  // for now, we calculate Exit and Entrance points upon instantiation
+  return fNominalTpcExitPoint;
+}
+//_____________________
+const AliFemtoThreeVector& AliFemtoParticle::NominalTpcEntrancePoint() const{
+  // in future, may want to calculate this "on demand" only, sot this routine may get more sophisticated
+  // for now, we calculate Exit and Entrance points upon instantiation
+  return fNominalTpcEntrancePoint;
+}
+//_____________________
+void AliFemtoParticle::CalculatePurity(){
+  double tPt = fFourMomentum.perp();
+  // pi -
+  fPurity[0] = fPrimPimPar0*(1.-exp((tPt-fPrimPimPar1)/fPrimPimPar2));
+  fPurity[0] *= fTrack->PidProbPion();
+  // pi+
+  fPurity[1] = fPrimPipPar0*(1.-exp((tPt-fPrimPipPar1)/fPrimPipPar2));
+  fPurity[1] *= fTrack->PidProbPion();
+  // K-
+  fPurity[2] = fTrack->PidProbKaon();
+  // K+
+  fPurity[3] = fTrack->PidProbKaon();
+  // pbar
+  fPurity[4] = fTrack->PidProbProton();
+  // p
+  fPurity[5] = fTrack->PidProbProton();
+}
+
+double AliFemtoParticle::GetPionPurity()
+{
+  if (fTrack->Charge()>0)
+    return fPurity[1];
+  else
+    return fPurity[0];
+}
+double AliFemtoParticle::GetKaonPurity()
+{
+  if (fTrack->Charge()>0)
+    return fPurity[3];
+  else
+    return fPurity[2];
+}
+double AliFemtoParticle::GetProtonPurity()
+{
+  if (fTrack->Charge()>0)
+    return fPurity[5];
+  else
+    return fPurity[4];
+}
+
+void AliFemtoParticle::CalculateTpcExitAndEntrancePoints(AliFmPhysicalHelixD* tHelix,
+                                                      AliFemtoThreeVector*  PrimVert,
+                                                      AliFemtoThreeVector*  SecVert,
+                                                      AliFemtoThreeVector* tmpTpcEntrancePoint,
+                                                      AliFemtoThreeVector* tmpTpcExitPoint,
+                                                      AliFemtoThreeVector* tmpPosSample,
+                                                      float* tmpZ,
+                                                      float* tmpU,
+                                                      int* tmpSect){
+  // this calculates the exit point of a secondary track, 
+  // either through the endcap or through the Outer Field Cage
+  // We assume the track to start at tHelix.origin-PrimaryVertex
+  // it also calculates the entrance point of the secondary track, 
+  // which is the point at which it crosses the
+  // inner field cage
+  //  static AliFemtoThreeVector ZeroVec(0.,0.,0.);
+  AliFemtoThreeVector ZeroVec(0.,0.,0.);
+//   ZeroVec.setX(tHelix->origin().x()-PrimVert->x());
+//   ZeroVec.setY(tHelix->origin().y()-PrimVert->y());
+//   ZeroVec.setZ(tHelix->origin().z()-PrimVert->z());
+  ZeroVec.setX(SecVert->x()-PrimVert->x());
+  ZeroVec.setY(SecVert->y()-PrimVert->y());
+  ZeroVec.setZ(SecVert->z()-PrimVert->z());
+  double dip, curv, phase;
+  int h;
+  curv = tHelix->curvature();
+  dip  = tHelix->dipAngle();
+  phase= tHelix->phase();
+  h    = tHelix->h();
+  
+  AliFmHelixD hel(curv,dip,phase,ZeroVec,h);
+
+  pairD candidates;
+  double sideLength;  // this is how much length to go to leave through sides of TPC
+  double endLength;  // this is how much length to go to leave through endcap of TPC
+  // figure out how far to go to leave through side...
+  candidates = hel.pathLength(200.0);  // bugfix MAL jul00 - 200cm NOT 2cm
+  sideLength = (candidates.first > 0) ? candidates.first : candidates.second;
+
+  static AliFemtoThreeVector WestEnd(0.,0.,200.);  // bugfix MAL jul00 - 200cm NOT 2cm
+  static AliFemtoThreeVector EastEnd(0.,0.,-200.); // bugfix MAL jul00 - 200cm NOT 2cm
+  static AliFemtoThreeVector EndCapNormal(0.,0.,1.0);
+
+  endLength = hel.pathLength(WestEnd,EndCapNormal);
+  if (endLength < 0.0) endLength = hel.pathLength(EastEnd,EndCapNormal);
+
+  if (endLength < 0.0) cout << 
+                        "AliFemtoParticle::CalculateTpcExitAndEntrancePoints(): "
+                            << "Hey -- I cannot find an exit point out endcaps" << endl;
+  // OK, firstExitLength will be the shortest way out of the detector...
+  double firstExitLength = (endLength < sideLength) ? endLength : sideLength;
+  // now then, let's return the POSITION at which particle leaves TPC...
+  *tmpTpcExitPoint = hel.at(firstExitLength);
+  // Finally, calculate the position at which the track crosses the inner field cage
+  candidates = hel.pathLength(50.0);  // bugfix MAL jul00 - 200cm NOT 2cm
+
+  sideLength = (candidates.first > 0) ? candidates.first : candidates.second;
+  //  cout << "sideLength 2 ="<<sideLength << endl;
+  *tmpTpcEntrancePoint = hel.at(sideLength);
+  // This is the secure way !  
+  if (IsNaN(tmpTpcEntrancePoint->x()) || 
+      IsNaN(tmpTpcEntrancePoint->y()) || 
+      IsNaN(tmpTpcEntrancePoint->z()) ){ 
+    cout << "tmpTpcEntrancePoint NAN"<< endl; 
+    cout << "tmpNominalTpcEntrancePoint = " <<tmpTpcEntrancePoint<< endl;
+    tmpTpcEntrancePoint->setX(-9999.);
+    tmpTpcEntrancePoint->setY(-9999.);
+    tmpTpcEntrancePoint->setZ(-9999.);
+  } 
+    
+  if (IsNaN(tmpTpcExitPoint->x()) || 
+      IsNaN(tmpTpcExitPoint->y()) || 
+      IsNaN(tmpTpcExitPoint->z()) ) {
+//     cout << "tmpTpcExitPoint NAN set at (-9999,-9999,-9999)"<< endl; 
+//     cout << "tmpTpcExitPoint X= " <<tmpTpcExitPoint->x()<< endl;
+//     cout << "tmpTpcExitPoint Y= " <<tmpTpcExitPoint->y()<< endl;
+//     cout << "tmpTpcExitPoint Z= " <<tmpTpcExitPoint->z()<< endl;
+    tmpTpcExitPoint->setX(-9999.);
+    tmpTpcExitPoint->setY(-9999.);
+    tmpTpcExitPoint->setZ(-9999.);
+  }
+
+
+//   if (IsNaN(tmpTpcExitPoint->x())) *tmpTpcExitPoint = AliFemtoThreeVector(-9999.,-9999.,-9999); 
+//   if (IsNaN(tmpTpcEntrancetPoint->x())) *tmpTpcEntrancePoint = AliFemtoThreeVector(-9999.,-9999.,-9999); 
+  //  cout << "tmpTpcEntrancePoint"<<*tmpTpcEntrancePoint << endl;
+
+  // 03Oct00 - mal.  OK, let's try something a little more 
+  // along the lines of NA49 and E895 strategy.
+  // calculate the "nominal" position at N radii (say N=11) 
+  // within the TPC, and for a pair cut
+  // use the average separation of these N
+  int irad = 0;
+  candidates = hel.pathLength(50.0);
+  sideLength = (candidates.first > 0) ? candidates.first : candidates.second;
+  while (irad<11 && !IsNaN(sideLength)){ 
+    float radius = 50.0 + irad*15.0;
+    candidates = hel.pathLength(radius);
+    sideLength = (candidates.first > 0) ? candidates.first : candidates.second;
+    tmpPosSample[irad] = hel.at(sideLength);
+    if(IsNaN(tmpPosSample[irad].x()) ||
+       IsNaN(tmpPosSample[irad].y()) ||
+       IsNaN(tmpPosSample[irad].z()) 
+       ){
+      cout << "tmpPosSample for radius=" << radius << " NAN"<< endl; 
+      cout << "tmpPosSample=(" <<tmpPosSample[irad]<<")"<< endl;
+      tmpPosSample[irad] =  AliFemtoThreeVector(-9999.,-9999.,-9999);
+    }
+    irad++;
+    if (irad<11){
+      float radius = 50.0 + irad*15.0;
+      candidates = hel.pathLength(radius);
+      sideLength = (candidates.first > 0) ? candidates.first : candidates.second;
+    }
+   }
+   for (int i = irad; i<11; i++)
+     {
+       tmpPosSample[i] =  AliFemtoThreeVector(-9999.,-9999.,-9999);   
+     }
+
+  static float tRowRadius[45] = {60,64.8,69.6,74.4,79.2,84,88.8,93.6,98.8, 
+                                104,109.2,114.4,119.6,127.195,129.195,131.195,
+                                133.195,135.195,137.195,139.195,141.195,
+                                143.195,145.195,147.195,149.195,151.195,
+                                153.195,155.195,157.195,159.195,161.195,
+                                163.195,165.195,167.195,169.195,171.195,
+                                173.195,175.195,177.195,179.195,181.195,
+                                183.195,185.195,187.195,189.195};
+  int tRow,tSect,tOutOfBound;
+  double tLength,tPhi;
+  float tU;
+  AliFemtoThreeVector tPoint;
+  AliFmThreeVectorD tn(0,0,0);
+  AliFmThreeVectorD tr(0,0,0);
+  int ti =0;
+  // test to enter the loop
+  candidates =  hel.pathLength(tRowRadius[ti]);
+  tLength = (candidates.first > 0) ? candidates.first : candidates.second;
+  if (IsNaN(tLength)){
+    cout <<"tLength Init tmp NAN" << endl;
+    cout <<"padrow number= "<<ti << "not reached" << endl;
+    cout << "*** DO NOT ENTER THE LOOP***" << endl;
+    tmpSect[ti]=-1;//sector
+  }
+  // end test
+  while(ti<45 && !IsNaN(tLength)){
+    candidates =  hel.pathLength(tRowRadius[ti]);
+    tLength = (candidates.first > 0) ? candidates.first : candidates.second;
+    if (IsNaN(tLength)){
+      cout <<"tLength loop 1st NAN" << endl;
+      cout <<"padrow number=  " << ti << " not reached" << endl;
+      cout << "*** THIS IS AN ERROR SHOULDN'T  LOOP ***" << endl;
+      tmpSect[ti]=-1;//sector
+    }
+    tPoint = hel.at(tLength);
+    // Find which sector it is on
+    TpcLocalTransform(tPoint,tmpSect[ti],tRow,tU,tPhi);
+    if (IsNaN(tmpSect[ti])){
+      cout <<"***ERROR tmpSect"<< endl; 
+    }
+    if (IsNaN(tRow)){
+      cout <<"***ERROR tRow"<< endl;
+    }
+    if (IsNaN(tU)){
+      cout <<"***ERROR tU"<< endl;
+    }
+    if (IsNaN(tPhi)){
+      cout <<"***ERROR tPhi"<< endl;
+    }  
+    // calculate crossing plane
+    tn.setX(cos(tPhi));
+    tn.setY(sin(tPhi));       
+    tr.setX(tRowRadius[ti]*cos(tPhi));
+    tr.setY(tRowRadius[ti]*sin(tPhi));
+    // find crossing point
+    tLength = hel.pathLength(tr,tn); 
+    if (IsNaN(tLength)){
+      cout <<"tLength loop 2nd  NAN" << endl;
+      cout <<"padrow number=  " << ti << " not reached" << endl;
+      tmpSect[ti]=-2;//sector
+    }
+    tPoint = hel.at(tLength);
+    tmpZ[ti] = tPoint.z();
+    tOutOfBound = TpcLocalTransform(tPoint,tSect,tRow,tmpU[ti],tPhi);
+    if (IsNaN(tSect)){
+      cout <<"***ERROR tSect 2"<< endl; 
+    }
+    if (IsNaN(tRow)){
+      cout <<"***ERROR tRow 2"<< endl;
+    }
+    if (IsNaN(tmpU[ti])){
+      cout <<"***ERROR tmpU[ti] 2"<< endl;
+    }
+    if (IsNaN(tPhi)){
+      cout <<"***ERROR tPhi 2 "<< endl;
+    }  
+    if(tOutOfBound || (tmpSect[ti] == tSect && tRow!=(ti+1))){
+      tmpSect[ti]=-2;
+      //         cout << "missed once"<< endl;
+    }
+    else{
+      if(tmpSect[ti] != tSect){
+       // Try again on the other sector
+       tn.setX(cos(tPhi));
+       tn.setY(sin(tPhi));       
+       tr.setX(tRowRadius[ti]*cos(tPhi));
+       tr.setY(tRowRadius[ti]*sin(tPhi));
+       // find crossing point
+       tLength = hel.pathLength(tr,tn);
+       tPoint = hel.at(tLength);
+       if (IsNaN(tLength)){
+         cout <<"tLength loop 3rd NAN" << endl;
+         cout <<"padrow number=  "<< ti << " not reached" << endl;
+         tmpSect[ti]=-1;//sector
+       }
+       tmpZ[ti] = tPoint.z();
+       tmpSect[ti] = tSect;
+       tOutOfBound = TpcLocalTransform(tPoint,tSect,tRow,tmpU[ti],tPhi);
+       if (IsNaN(tSect)){
+         cout <<"***ERROR tSect 3"<< endl; 
+       }
+       if (IsNaN(tRow)){
+         cout <<"***ERROR tRow 3"<< endl;
+       }
+       if (IsNaN(tmpU[ti])){
+         cout <<"***ERROR tmpU[ti] 3"<< endl;
+       }
+       if (IsNaN(tPhi)){
+         cout <<"***ERROR tPhi 3 "<< endl;
+       }  
+       if(tOutOfBound || tSect!= tmpSect[ti] || tRow!=(ti+1)){
+         tmpSect[ti]=-1;
+       }
+      }
+    }
+    if (IsNaN(tmpSect[ti])){
+      cout << "*******************ERROR***************************" << endl;
+      cout <<"AliFemtoParticle--Fctn tmpSect=" << tmpSect[ti] << endl;
+      cout << "*******************ERROR***************************" << endl;
+    }
+    if (IsNaN(tmpU[ti])){
+      cout << "*******************ERROR***************************" << endl;
+      cout <<"AliFemtoParticle--Fctn tmpU=" << tmpU[ti] << endl;
+      cout << "*******************ERROR***************************" << endl;
+    }
+    if (IsNaN(tmpZ[ti])){
+      cout << "*******************ERROR***************************" << endl;
+      cout <<"AliFemtoParticle--Fctn tmpZ=" << tmpZ[ti] << endl;
+      cout << "*******************ERROR***************************" << endl;
+    }
+    // If padrow ti not reached all other beyond are not reached
+    // in this case set sector to -1
+    if (tmpSect[ti]==-1){
+      for (int tj=ti; tj<45;tj++){
+       tmpSect[tj] = -1;
+       ti=45;
+      }
+    }
+    ti++;
+    if (ti<45){
+      candidates =  hel.pathLength(tRowRadius[ti]);
+      tLength = (candidates.first > 0) ? candidates.first : candidates.second;}
+  }
+}
+//_____________________
+const AliFemtoThreeVector& AliFemtoParticle::TpcV0PosExitPoint() const{
+  return fTpcV0PosExitPoint;
+}
+//_____________________
+const AliFemtoThreeVector& AliFemtoParticle::TpcV0PosEntrancePoint() const{
+  return fTpcV0PosEntrancePoint;
+}
+//______________________
+const AliFemtoThreeVector& AliFemtoParticle::TpcV0NegExitPoint() const{
+  return fTpcV0NegExitPoint;
+}
+//_____________________
+const AliFemtoThreeVector& AliFemtoParticle::TpcV0NegEntrancePoint() const{
+  return fTpcV0NegEntrancePoint;
+}
+//______________________
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticle.h
new file mode 100644 (file)
index 0000000..18b423d
--- /dev/null
@@ -0,0 +1,246 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   Particle objects are part of the PicoEvent, which is what is
+ *   stored in the EventMixingBuffers
+ *   A Track object gets converted to a Particle object if it
+ *   passes the ParticleCut of an Analysis
+ *
+ ***************************************************************************
+ *
+ * $Log$
+ * Revision 1.2  2007-04-03 16:00:08  mchojnacki
+ * Changes to iprove memory managing
+ *
+ * Revision 1.1.1.1  2007/03/07 10:14:49  mchojnacki
+ * First version on CVS
+ *
+ * Revision 1.19  2003/01/14 09:41:16  renault
+ * changes on average separation calculation, hit shared finder and memory optimisation
+ * for Z,U and Sectors variables.
+ *
+ * Revision 1.18  2002/12/12 17:01:50  kisiel
+ * Hidden Information handling and purity calculation
+ *
+ * Revision 1.17  2002/11/19 23:35:52  renault
+ * Enable calculation of exit/entrance separation for V0 daughters
+ *
+ * Revision 1.16  2001/12/14 23:11:30  fretiere
+ * Add class HitMergingCut. Add class fabricesPairCut = HitMerginCut + pair purity cuts. Add TpcLocalTransform function which convert to local tpc coord (not pretty). Modify AliFemtoTrack, AliFemtoParticle, AliFemtoHiddenInfo, AliFemtoPair to handle the hit information and cope with my code
+ *
+ * Revision 1.15  2001/05/25 23:23:59  lisa
+ * Added in AliFemtoKink stuff
+ *
+ * Revision 1.14  2001/05/23 00:19:05  lisa
+ * Add in Smearing classes and methods needed for momentum resolution studies and correction
+ *
+ * Revision 1.13  2001/04/03 21:04:36  kisiel
+ *
+ *
+ *   Changes needed to make the Theoretical code
+ *   work. The main code is the ThCorrFctn directory.
+ *   The most visible change is the addition of the
+ *   HiddenInfo to AliFemtoPair.
+ *
+ * Revision 1.12  2000/10/05 23:09:05  lisa
+ * Added kT-dependent radii to mixed-event simulator AND implemented AverageSeparation Cut and CorrFctn
+ *
+ * Revision 1.11  2000/07/17 20:03:17  lisa
+ * Implemented tools for addressing and assessing trackmerging
+ *
+ * Revision 1.10  2000/07/16 21:38:23  laue
+ * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
+ * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
+ * AliFemtoParticle.cc AliFemtoParticle.h : pointers fTrack,fV0 initialized to 0
+ * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
+ * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
+ *                 solution
+ *
+ * Revision 1.9  2000/05/03 17:44:43  laue
+ * AliFemtoEvent, AliFemtoTrack & AliFemtoV0 declared friend to AliFemtoIOBinary
+ * AliFemtoParticle updated for V0 pos,neg track Id
+ *
+ * Revision 1.8  2000/04/03 16:21:51  laue
+ * some include files changed
+ * Multi track cut added
+ *
+ * Revision 1.6  2000/02/26 19:04:52  laue
+ * Some unnecessary includes removed.
+ * StThreeVectorD replace by AliFemtoThreeVector.
+ * AliFemtoCoulomb modified to compile without Root (ClassDef embraced into
+ *   #ifdef __ROOT__  ..... #endif)
+ * AliFemtoParticle now returns references (FourMomentum(),Helix(),
+ *   DecayVertexPosiion())
+ *
+ * Revision 1.5  1999/12/11 15:58:29  lisa
+ * Add vertex decay position datum and accessor to AliFemtoParticle to allow pairwise cuts on seperation of V0s
+ *
+ * Revision 1.4  1999/09/17 22:38:02  lisa
+ * first full integration of V0s into AliFemto framework
+ *
+ * Revision 1.3  1999/09/01 19:04:54  lisa
+ * update Particle class AND add parity cf and Randys Coulomb correction
+ *
+ * Revision 1.2  1999/07/06 22:33:23  lisa
+ * Adjusted all to work in pro and new - dev itself is broken
+ *
+ * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
+ * Installation of AliFemtoMaker
+ *
+ **************************************************************************/
+
+#ifndef AliFemtoParticle_hh
+#define AliFemtoParticle_hh
+
+//#include "math.h"
+#include "Infrastructure/AliFemtoTypes.h"
+#include "Infrastructure/AliFemtoTrack.h"
+#include "Infrastructure/AliFemtoV0.h"
+#include "Infrastructure/AliFemtoKink.h"
+#include "Infrastructure/AliFemtoXi.h"
+#include "AliFmPhysicalHelixD.h"
+// ***
+class AliFemtoHiddenInfo;
+// ***
+class AliFemtoParticle{
+public:
+  AliFemtoParticle();
+  AliFemtoParticle(const AliFemtoTrack* const hbtTrack, const double& mass);
+  AliFemtoParticle(const AliFemtoV0* const hbtV0, const double& mass);
+  AliFemtoParticle(const AliFemtoKink* const hbtKink, const double& mass);
+  AliFemtoParticle(const AliFemtoXi* const hbtXi, const double& mass);
+  ~AliFemtoParticle();
+
+  const AliFemtoLorentzVector& FourMomentum() const;
+
+  AliFmPhysicalHelixD& Helix();
+
+  const AliFemtoThreeVector DecayVertexPosition() const;
+  unsigned long TopologyMap(const int word) const;
+  int NumberOfHits() const;
+
+  unsigned long TrackId() const;         // only for particles from tracks 
+  unsigned short   NegTrackId() const;   // only for particles from v0 
+  unsigned short   PosTrackId() const;   // only for particles from v0 
+
+  AliFemtoTrack* Track() const;
+  AliFemtoV0* V0() const;
+  AliFemtoKink* Kink() const;
+
+  const AliFemtoThreeVector& NominalTpcExitPoint() const;     // position track exits TPC assuming start at (0,0,0)
+  const AliFemtoThreeVector& NominalTpcEntrancePoint() const; // position track crosses IFC assuming start at (0,0,0)
+  const AliFemtoThreeVector& TpcV0PosExitPoint() const;  
+  const AliFemtoThreeVector& TpcV0PosEntrancePoint() const;
+  const AliFemtoThreeVector& TpcV0NegExitPoint() const;  
+  const AliFemtoThreeVector& TpcV0NegEntrancePoint() const;
+
+  // the following method is for explicit internal calculation to fill datamembers.
+  // It is invoked automatically if AliFemtoParticle constructed from AliFemtoTrack
+  //void CalculateNominalTpcExitAndEntrancePoints(); // NOTE - this requires the fHelix, so be sure this is filled
+
+
+  AliFemtoThreeVector fNominalPosSample[11];  // I make this public for convenience and speed of AliFemtoPair()
+  float fZ[45];
+  float fU[45];
+  int fSect[45];
+
+  void ResetFourMomentum(const AliFemtoLorentzVector& fourMomentum);
+
+  const AliFemtoHiddenInfo*  HiddenInfo() const;
+  // Fab private
+  AliFemtoHiddenInfo*  getHiddenInfo() const;
+  void SetHiddenInfo(AliFemtoHiddenInfo* aHiddenInfo);
+  void CalculatePurity();
+  double GetPionPurity();
+  double GetKaonPurity();
+  double GetProtonPurity();
+  void CalculateTpcExitAndEntrancePoints( AliFmPhysicalHelixD* tHelix,
+                                         AliFemtoThreeVector* PrimVert,
+                                         AliFemtoThreeVector* SecVert,
+                                         AliFemtoThreeVector* tmpTpcEntrancePoint,
+                                         AliFemtoThreeVector* tmpTpcExitPoint,
+                                         AliFemtoThreeVector* tmpPosSample,
+                                         float* tmpZ,float* tmpU,int* tmpSect);
+
+  // For V0 Neg Daugthers TpcEntrance/ExitPoints
+  AliFemtoThreeVector* fTpcV0NegPosSample;
+  float* fV0NegZ;
+  float* fV0NegU;
+  int* fV0NegSect;
+private:
+  AliFemtoTrack* fTrack;  // copy of the track the particle was formed of, else Null
+  AliFemtoV0* fV0;        // copy of the v0 the particle was formed of, else Null
+  AliFemtoKink* fKink;        // copy of the v0 the particle was formed of, else Null
+  AliFemtoXi* fXi;
+
+  AliFemtoLorentzVector fFourMomentum;
+  AliFmPhysicalHelixD fHelix;
+  //unsigned long  fMap[2]; 
+  //int fNhits;
+  AliFemtoThreeVector fNominalTpcExitPoint;
+  AliFemtoThreeVector fNominalTpcEntrancePoint;
+  AliFemtoHiddenInfo* fHiddenInfo;  // Fab private
+
+  double fPurity[6];
+
+  static double fPrimPimPar0;
+  static double fPrimPimPar1;
+  static double fPrimPimPar2;
+  static double fPrimPipPar0;
+  static double fPrimPipPar1;
+  static double fPrimPipPar2;
+  static double fPrimPmPar0;
+  static double fPrimPmPar1;
+  static double fPrimPmPar2;
+  static double fPrimPpPar0;
+  static double fPrimPpPar1;
+  static double fPrimPpPar2;
+
+   // For V0 Daugthers TpcEntrance/ExitPoints
+  AliFemtoThreeVector fPrimaryVertex;
+  AliFemtoThreeVector fSecondaryVertex;
+
+  AliFmPhysicalHelixD fHelixV0Pos;
+  AliFemtoThreeVector fTpcV0PosEntrancePoint;
+  AliFemtoThreeVector fTpcV0PosExitPoint;
+
+  AliFmPhysicalHelixD fHelixV0Neg;
+  AliFemtoThreeVector fTpcV0NegEntrancePoint;
+  AliFemtoThreeVector fTpcV0NegExitPoint;
+};
+
+inline AliFemtoTrack* AliFemtoParticle::Track() const { return fTrack; }
+inline unsigned long  AliFemtoParticle::TrackId() const { return fTrack->TrackId(); }; 
+inline const AliFemtoLorentzVector& AliFemtoParticle::FourMomentum() const {return fFourMomentum;}
+inline AliFmPhysicalHelixD& AliFemtoParticle::Helix() {return fHelix;}
+//inline unsigned long AliFemtoParticle::TopologyMap(const int word) const {return fMap[word];}
+//inline int AliFemtoParticle::NumberOfHits() const {return fNhits;}
+//by marek chojnacki to could compile 
+
+inline unsigned long AliFemtoParticle::TopologyMap(const int word) const {return 1;}
+inline int AliFemtoParticle::NumberOfHits() const {return 1;}
+
+inline AliFemtoV0* AliFemtoParticle::V0() const { return fV0; }
+inline unsigned short AliFemtoParticle::NegTrackId() const { return fV0->idNeg(); }
+inline unsigned short AliFemtoParticle::PosTrackId() const { return fV0->idPos(); }
+inline const AliFemtoThreeVector AliFemtoParticle::DecayVertexPosition() const {return fV0->decayVertexV0(); }
+// ***
+inline AliFemtoHiddenInfo* AliFemtoParticle::getHiddenInfo() const
+{return fHiddenInfo;}
+inline const AliFemtoHiddenInfo* AliFemtoParticle::HiddenInfo() const
+{return fHiddenInfo;}
+inline void AliFemtoParticle::SetHiddenInfo(AliFemtoHiddenInfo* aHiddenInfo)
+{ fHiddenInfo = aHiddenInfo->clone();}
+// ***
+
+inline void AliFemtoParticle::ResetFourMomentum(const AliFemtoLorentzVector& vec){fFourMomentum = vec;}
+
+inline AliFemtoKink* AliFemtoParticle::Kink() const { return fKink; }
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticleCollection.h b/PWG2/FEMTOSCOPY/AliFemto/Infrastructure/AliFemtoParticleCollection.h
new file mode 100644 (file)
index 0000000..1de0927
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************
+ *
+ * $Id$
+ *
+ * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: part of STAR HBT Framework: AliFemtoMaker package
+ *   The ParticleCollection is the main component of the picoEvent
+ *   It points to the particle objects in the picoEvent.           
+ *
+ ***************************************************************************
+ *
+ * $Log$