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


/* $Id$ */

/* History of cvs commits:
 *
 * $Log$
 * Revision 1.24  2006/11/14 17:11:15  hristov
 * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
 *
 * Revision 1.23  2006/09/13 07:31:01  kharlov
 * Effective C++ corrections (T.Pocheptsov)
 *
 * Revision 1.22  2005/06/17 07:39:07  hristov
 * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
 *
 * Revision 1.21  2005/05/28 14:19:05  schutz
 * Compilation warnings fixed by T.P.
 *
 */

//_________________________________________________________________________
// Implementation version vImpacts of PHOS Manager class.
// This class inherits from v1 and adds impacts storing.
// Impacts stands for exact values of track coming to the detectors
// EMC, CPV or PPSD.
// Impacts are written to the same tree as hits are
// but in separate branches.
//---
//*-- Author: Yuri Kharlov (IHEP, Protvino/SUBATECH, Nantes)


// --- ROOT system ---

//#include <TTree.h>
#include <TClonesArray.h>
#include <TVirtualMC.h>
#include <TTree.h>

// --- Standard library ---

// --- AliRoot header files ---

#include "AliPHOSGeometry.h"
#include "AliPHOSImpact.h"
#include "AliPHOSvImpacts.h"
#include "AliRun.h"
#include "AliLoader.h"
#include "AliMC.h"
#include "AliLog.h"

ClassImp(AliPHOSvImpacts)

//____________________________________________________________________________
AliPHOSvImpacts::AliPHOSvImpacts():
  fEMCImpacts(new TList),
  fCPVImpacts(new TList),
  fPPSDImpacts(new TList),
  fNEMCImpacts(),
  fNCPVImpacts(),
  fNPPSDImpacts()
{
  // ctor
}

//____________________________________________________________________________
AliPHOSvImpacts::AliPHOSvImpacts(const char *name, const char *title):
  AliPHOSv1(name,title),
  fEMCImpacts(new TList),
  fCPVImpacts(new TList),
  fPPSDImpacts(0),
  fNEMCImpacts(),
  fNCPVImpacts(),
  fNPPSDImpacts()
{
  // ctor : title is used to identify the layout
  //
  // We store hits :
  //   - fHits (the "normal" one), which retains the hits associated with
  //     the current primary particle being tracked
  //     (this array is reset after each primary has been tracked).
  //     This part inherits from AliPHOSv1
  //
  // We store impacts :
  //  - fEMCImpacts, fCPVImpacts which are
  //    TList of EMC and CPV modules respectively, each
  //    modules contains TClonesArray of AliPHOSImpacts

  Int_t nPHOSModules = GetGeometry()->GetNModules();
  Int_t nCPVModules  = GetGeometry()->GetNModules();

  Int_t iPHOSModule;
  TClonesArray * impacts;
  for (iPHOSModule=0; iPHOSModule<nPHOSModules; iPHOSModule++) {
    fEMCImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
    fNEMCImpacts[iPHOSModule] = 0;
    impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(iPHOSModule));
  }
  for (iPHOSModule=0; iPHOSModule<nCPVModules; iPHOSModule++) {
    fCPVImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
    fNCPVImpacts[iPHOSModule] = 0;
    impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(iPHOSModule));
  }

}

//____________________________________________________________________________
AliPHOSvImpacts::~AliPHOSvImpacts()
{
  // dtor

  // Delete hits
  if ( fHits ) {
    fHits->Delete() ; 
    delete fHits ;
    fHits = 0 ; 
  }

  // Delete impacts in EMC, CPV
  if ( fEMCImpacts ) {
    fEMCImpacts->Delete() ; 
    delete fEMCImpacts ;
    fEMCImpacts = 0 ; 
  }
  if ( fCPVImpacts ) {
    fCPVImpacts->Delete() ; 
    delete fCPVImpacts ;
    fCPVImpacts = 0 ; 
  }
}

//____________________________________________________________________________
void AliPHOSvImpacts::AddImpact(const char* det, Int_t shunt, Int_t primary, Int_t track, Int_t module,
			   Int_t pid, TLorentzVector p, Float_t *xyz)
{
  // Add an impact to the impact list.

  TClonesArray * impacts = 0;
  Int_t         nImpacts = 0;

  if (strcmp(det,"EMC ")==0) {
    impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(module));
    nImpacts= fNEMCImpacts[module];
    fNEMCImpacts[module]++ ;
  }
  else if (strcmp(det,"CPV ")==0) {
    impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(module));
    nImpacts= fNCPVImpacts[module];
    fNCPVImpacts[module]++ ;
  }
  else
    AliFatal(Form("Wrong PHOS configuration: det=%s",det));

  new((*impacts)[nImpacts]) AliPHOSImpact(shunt,primary,track,pid,p,xyz) ;

  AliDebugClass(1,Form("Module %d %s: ",module,det));
  if (AliLog::GetGlobalDebugLevel()>0)
    (static_cast<AliPHOSImpact*>((impacts->At(nImpacts))))->Print();
}

//____________________________________________________________________________
void AliPHOSvImpacts::MakeBranch(Option_t *opt)
{  
  // Create new branch in the current Hits Root Tree containing
  // a list of PHOS impacts (exact values of track coming to detector)

  AliDetector::MakeBranch(opt);
  
  Int_t bufferSize = 32000 ;
  Int_t splitlevel = 0 ;
  fLoader->TreeH()->Branch("PHOSEmcImpacts" , "TList", &fEMCImpacts , bufferSize, splitlevel);
  fLoader->TreeH()->Branch("PHOSCpvImpacts" , "TList", &fCPVImpacts , bufferSize, splitlevel);
  
}

//____________________________________________________________________________
void AliPHOSvImpacts::ResetHits() 
{              
  // Reset impact branches for EMC, CPV and PPSD

  AliDetector::ResetHits();

  Int_t i;
  for (i=0; i<GetGeometry()->GetNModules(); i++) {
    (static_cast<TClonesArray*>(fEMCImpacts->At(i))) -> Clear();
    fNEMCImpacts[i] = 0 ;
  }

  for (i=0; i<GetGeometry()->GetNModules(); i++) {
    (static_cast<TClonesArray*>(fCPVImpacts->At(i))) -> Clear();
    fNCPVImpacts[i] = 0 ;
  }
  
}

//_____________________________________________________________________________
void AliPHOSvImpacts::StepManager(void)
{
  // Find impacts (tracks which enter the EMC, CPV)
  // and add them to to the impact lists

  AliPHOSv1::StepManager();

  Float_t xyzm[3], xyzd[3], pm[3], pd[3];
  TLorentzVector pmom     ;           // Lorentz momentum of the particle initiated hit
  TLorentzVector pos      ;           // Lorentz vector of the track current position
  Int_t          copy     ;

  Int_t tracknumber =  gAlice->GetMCApp()->GetCurrentTrackNumber() ; 
  Int_t primary     =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
  TString name      =  GetGeometry()->GetName() ; 

  // Add impact to EMC

  static Int_t idPXTL = TVirtualMC::GetMC()->VolId("PXTL");
  if( TVirtualMC::GetMC()->CurrentVolID(copy) == idPXTL &&
      TVirtualMC::GetMC()->IsTrackEntering() ) {
    TVirtualMC::GetMC()->TrackMomentum(pmom);
    TVirtualMC::GetMC()->TrackPosition(pos) ;

    Int_t i;
    for (i=0; i<3; i++) xyzm[i] = pos[i];

    for (i=0; i<3; i++) {
      xyzm[i] = pos[i] ;
      pm[i]   = pmom[i];
    }
    TVirtualMC::GetMC() -> Gmtod (xyzm, xyzd, 1);    // transform coordinate from master to daughter system
    TVirtualMC::GetMC() -> Gmtod (pm,   pd,   2);    // transform 3-momentum from master to daughter system

    // Select tracks coming to the crystal from up or down sides
    if ((pd[1]<0 && xyzd[1] >  GetGeometry()->GetCrystalSize(1)/2-0.1) ||
	(pd[1]>0 && xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.1)) {
    // Select tracks coming to the crystal from up or down sides
      Int_t pid = TVirtualMC::GetMC()->TrackPid();
      Int_t module;
      TVirtualMC::GetMC()->CurrentVolOffID(10,module);
      module--;
      AddImpact("EMC ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
    }
  }

  // Add impact to CPV

  static Int_t idPCPQ = TVirtualMC::GetMC()->VolId("PCPQ");
  if( TVirtualMC::GetMC()->CurrentVolID(copy) == idPCPQ &&
      TVirtualMC::GetMC()->IsTrackEntering() ) {
    TVirtualMC::GetMC()->TrackMomentum(pmom);
    TVirtualMC::GetMC()->TrackPosition(pos) ;

    Int_t i;
    for (i=0; i<3; i++) xyzm[i] = pos[i];

    for (i=0; i<3; i++) {
      xyzm[i] = pos[i] ;
      pm[i]   = pmom[i];
    }
    Int_t pid = TVirtualMC::GetMC()->TrackPid();
    Int_t module;
    TVirtualMC::GetMC()->CurrentVolOffID(3,module);
    module--;
    AddImpact("CPV ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
  }
  
}
 AliPHOSvImpacts.cxx:1
 AliPHOSvImpacts.cxx:2
 AliPHOSvImpacts.cxx:3
 AliPHOSvImpacts.cxx:4
 AliPHOSvImpacts.cxx:5
 AliPHOSvImpacts.cxx:6
 AliPHOSvImpacts.cxx:7
 AliPHOSvImpacts.cxx:8
 AliPHOSvImpacts.cxx:9
 AliPHOSvImpacts.cxx:10
 AliPHOSvImpacts.cxx:11
 AliPHOSvImpacts.cxx:12
 AliPHOSvImpacts.cxx:13
 AliPHOSvImpacts.cxx:14
 AliPHOSvImpacts.cxx:15
 AliPHOSvImpacts.cxx:16
 AliPHOSvImpacts.cxx:17
 AliPHOSvImpacts.cxx:18
 AliPHOSvImpacts.cxx:19
 AliPHOSvImpacts.cxx:20
 AliPHOSvImpacts.cxx:21
 AliPHOSvImpacts.cxx:22
 AliPHOSvImpacts.cxx:23
 AliPHOSvImpacts.cxx:24
 AliPHOSvImpacts.cxx:25
 AliPHOSvImpacts.cxx:26
 AliPHOSvImpacts.cxx:27
 AliPHOSvImpacts.cxx:28
 AliPHOSvImpacts.cxx:29
 AliPHOSvImpacts.cxx:30
 AliPHOSvImpacts.cxx:31
 AliPHOSvImpacts.cxx:32
 AliPHOSvImpacts.cxx:33
 AliPHOSvImpacts.cxx:34
 AliPHOSvImpacts.cxx:35
 AliPHOSvImpacts.cxx:36
 AliPHOSvImpacts.cxx:37
 AliPHOSvImpacts.cxx:38
 AliPHOSvImpacts.cxx:39
 AliPHOSvImpacts.cxx:40
 AliPHOSvImpacts.cxx:41
 AliPHOSvImpacts.cxx:42
 AliPHOSvImpacts.cxx:43
 AliPHOSvImpacts.cxx:44
 AliPHOSvImpacts.cxx:45
 AliPHOSvImpacts.cxx:46
 AliPHOSvImpacts.cxx:47
 AliPHOSvImpacts.cxx:48
 AliPHOSvImpacts.cxx:49
 AliPHOSvImpacts.cxx:50
 AliPHOSvImpacts.cxx:51
 AliPHOSvImpacts.cxx:52
 AliPHOSvImpacts.cxx:53
 AliPHOSvImpacts.cxx:54
 AliPHOSvImpacts.cxx:55
 AliPHOSvImpacts.cxx:56
 AliPHOSvImpacts.cxx:57
 AliPHOSvImpacts.cxx:58
 AliPHOSvImpacts.cxx:59
 AliPHOSvImpacts.cxx:60
 AliPHOSvImpacts.cxx:61
 AliPHOSvImpacts.cxx:62
 AliPHOSvImpacts.cxx:63
 AliPHOSvImpacts.cxx:64
 AliPHOSvImpacts.cxx:65
 AliPHOSvImpacts.cxx:66
 AliPHOSvImpacts.cxx:67
 AliPHOSvImpacts.cxx:68
 AliPHOSvImpacts.cxx:69
 AliPHOSvImpacts.cxx:70
 AliPHOSvImpacts.cxx:71
 AliPHOSvImpacts.cxx:72
 AliPHOSvImpacts.cxx:73
 AliPHOSvImpacts.cxx:74
 AliPHOSvImpacts.cxx:75
 AliPHOSvImpacts.cxx:76
 AliPHOSvImpacts.cxx:77
 AliPHOSvImpacts.cxx:78
 AliPHOSvImpacts.cxx:79
 AliPHOSvImpacts.cxx:80
 AliPHOSvImpacts.cxx:81
 AliPHOSvImpacts.cxx:82
 AliPHOSvImpacts.cxx:83
 AliPHOSvImpacts.cxx:84
 AliPHOSvImpacts.cxx:85
 AliPHOSvImpacts.cxx:86
 AliPHOSvImpacts.cxx:87
 AliPHOSvImpacts.cxx:88
 AliPHOSvImpacts.cxx:89
 AliPHOSvImpacts.cxx:90
 AliPHOSvImpacts.cxx:91
 AliPHOSvImpacts.cxx:92
 AliPHOSvImpacts.cxx:93
 AliPHOSvImpacts.cxx:94
 AliPHOSvImpacts.cxx:95
 AliPHOSvImpacts.cxx:96
 AliPHOSvImpacts.cxx:97
 AliPHOSvImpacts.cxx:98
 AliPHOSvImpacts.cxx:99
 AliPHOSvImpacts.cxx:100
 AliPHOSvImpacts.cxx:101
 AliPHOSvImpacts.cxx:102
 AliPHOSvImpacts.cxx:103
 AliPHOSvImpacts.cxx:104
 AliPHOSvImpacts.cxx:105
 AliPHOSvImpacts.cxx:106
 AliPHOSvImpacts.cxx:107
 AliPHOSvImpacts.cxx:108
 AliPHOSvImpacts.cxx:109
 AliPHOSvImpacts.cxx:110
 AliPHOSvImpacts.cxx:111
 AliPHOSvImpacts.cxx:112
 AliPHOSvImpacts.cxx:113
 AliPHOSvImpacts.cxx:114
 AliPHOSvImpacts.cxx:115
 AliPHOSvImpacts.cxx:116
 AliPHOSvImpacts.cxx:117
 AliPHOSvImpacts.cxx:118
 AliPHOSvImpacts.cxx:119
 AliPHOSvImpacts.cxx:120
 AliPHOSvImpacts.cxx:121
 AliPHOSvImpacts.cxx:122
 AliPHOSvImpacts.cxx:123
 AliPHOSvImpacts.cxx:124
 AliPHOSvImpacts.cxx:125
 AliPHOSvImpacts.cxx:126
 AliPHOSvImpacts.cxx:127
 AliPHOSvImpacts.cxx:128
 AliPHOSvImpacts.cxx:129
 AliPHOSvImpacts.cxx:130
 AliPHOSvImpacts.cxx:131
 AliPHOSvImpacts.cxx:132
 AliPHOSvImpacts.cxx:133
 AliPHOSvImpacts.cxx:134
 AliPHOSvImpacts.cxx:135
 AliPHOSvImpacts.cxx:136
 AliPHOSvImpacts.cxx:137
 AliPHOSvImpacts.cxx:138
 AliPHOSvImpacts.cxx:139
 AliPHOSvImpacts.cxx:140
 AliPHOSvImpacts.cxx:141
 AliPHOSvImpacts.cxx:142
 AliPHOSvImpacts.cxx:143
 AliPHOSvImpacts.cxx:144
 AliPHOSvImpacts.cxx:145
 AliPHOSvImpacts.cxx:146
 AliPHOSvImpacts.cxx:147
 AliPHOSvImpacts.cxx:148
 AliPHOSvImpacts.cxx:149
 AliPHOSvImpacts.cxx:150
 AliPHOSvImpacts.cxx:151
 AliPHOSvImpacts.cxx:152
 AliPHOSvImpacts.cxx:153
 AliPHOSvImpacts.cxx:154
 AliPHOSvImpacts.cxx:155
 AliPHOSvImpacts.cxx:156
 AliPHOSvImpacts.cxx:157
 AliPHOSvImpacts.cxx:158
 AliPHOSvImpacts.cxx:159
 AliPHOSvImpacts.cxx:160
 AliPHOSvImpacts.cxx:161
 AliPHOSvImpacts.cxx:162
 AliPHOSvImpacts.cxx:163
 AliPHOSvImpacts.cxx:164
 AliPHOSvImpacts.cxx:165
 AliPHOSvImpacts.cxx:166
 AliPHOSvImpacts.cxx:167
 AliPHOSvImpacts.cxx:168
 AliPHOSvImpacts.cxx:169
 AliPHOSvImpacts.cxx:170
 AliPHOSvImpacts.cxx:171
 AliPHOSvImpacts.cxx:172
 AliPHOSvImpacts.cxx:173
 AliPHOSvImpacts.cxx:174
 AliPHOSvImpacts.cxx:175
 AliPHOSvImpacts.cxx:176
 AliPHOSvImpacts.cxx:177
 AliPHOSvImpacts.cxx:178
 AliPHOSvImpacts.cxx:179
 AliPHOSvImpacts.cxx:180
 AliPHOSvImpacts.cxx:181
 AliPHOSvImpacts.cxx:182
 AliPHOSvImpacts.cxx:183
 AliPHOSvImpacts.cxx:184
 AliPHOSvImpacts.cxx:185
 AliPHOSvImpacts.cxx:186
 AliPHOSvImpacts.cxx:187
 AliPHOSvImpacts.cxx:188
 AliPHOSvImpacts.cxx:189
 AliPHOSvImpacts.cxx:190
 AliPHOSvImpacts.cxx:191
 AliPHOSvImpacts.cxx:192
 AliPHOSvImpacts.cxx:193
 AliPHOSvImpacts.cxx:194
 AliPHOSvImpacts.cxx:195
 AliPHOSvImpacts.cxx:196
 AliPHOSvImpacts.cxx:197
 AliPHOSvImpacts.cxx:198
 AliPHOSvImpacts.cxx:199
 AliPHOSvImpacts.cxx:200
 AliPHOSvImpacts.cxx:201
 AliPHOSvImpacts.cxx:202
 AliPHOSvImpacts.cxx:203
 AliPHOSvImpacts.cxx:204
 AliPHOSvImpacts.cxx:205
 AliPHOSvImpacts.cxx:206
 AliPHOSvImpacts.cxx:207
 AliPHOSvImpacts.cxx:208
 AliPHOSvImpacts.cxx:209
 AliPHOSvImpacts.cxx:210
 AliPHOSvImpacts.cxx:211
 AliPHOSvImpacts.cxx:212
 AliPHOSvImpacts.cxx:213
 AliPHOSvImpacts.cxx:214
 AliPHOSvImpacts.cxx:215
 AliPHOSvImpacts.cxx:216
 AliPHOSvImpacts.cxx:217
 AliPHOSvImpacts.cxx:218
 AliPHOSvImpacts.cxx:219
 AliPHOSvImpacts.cxx:220
 AliPHOSvImpacts.cxx:221
 AliPHOSvImpacts.cxx:222
 AliPHOSvImpacts.cxx:223
 AliPHOSvImpacts.cxx:224
 AliPHOSvImpacts.cxx:225
 AliPHOSvImpacts.cxx:226
 AliPHOSvImpacts.cxx:227
 AliPHOSvImpacts.cxx:228
 AliPHOSvImpacts.cxx:229
 AliPHOSvImpacts.cxx:230
 AliPHOSvImpacts.cxx:231
 AliPHOSvImpacts.cxx:232
 AliPHOSvImpacts.cxx:233
 AliPHOSvImpacts.cxx:234
 AliPHOSvImpacts.cxx:235
 AliPHOSvImpacts.cxx:236
 AliPHOSvImpacts.cxx:237
 AliPHOSvImpacts.cxx:238
 AliPHOSvImpacts.cxx:239
 AliPHOSvImpacts.cxx:240
 AliPHOSvImpacts.cxx:241
 AliPHOSvImpacts.cxx:242
 AliPHOSvImpacts.cxx:243
 AliPHOSvImpacts.cxx:244
 AliPHOSvImpacts.cxx:245
 AliPHOSvImpacts.cxx:246
 AliPHOSvImpacts.cxx:247
 AliPHOSvImpacts.cxx:248
 AliPHOSvImpacts.cxx:249
 AliPHOSvImpacts.cxx:250
 AliPHOSvImpacts.cxx:251
 AliPHOSvImpacts.cxx:252
 AliPHOSvImpacts.cxx:253
 AliPHOSvImpacts.cxx:254
 AliPHOSvImpacts.cxx:255
 AliPHOSvImpacts.cxx:256
 AliPHOSvImpacts.cxx:257
 AliPHOSvImpacts.cxx:258
 AliPHOSvImpacts.cxx:259
 AliPHOSvImpacts.cxx:260
 AliPHOSvImpacts.cxx:261
 AliPHOSvImpacts.cxx:262
 AliPHOSvImpacts.cxx:263
 AliPHOSvImpacts.cxx:264
 AliPHOSvImpacts.cxx:265
 AliPHOSvImpacts.cxx:266
 AliPHOSvImpacts.cxx:267
 AliPHOSvImpacts.cxx:268
 AliPHOSvImpacts.cxx:269
 AliPHOSvImpacts.cxx:270
 AliPHOSvImpacts.cxx:271
 AliPHOSvImpacts.cxx:272
 AliPHOSvImpacts.cxx:273
 AliPHOSvImpacts.cxx:274
 AliPHOSvImpacts.cxx:275
 AliPHOSvImpacts.cxx:276
 AliPHOSvImpacts.cxx:277
 AliPHOSvImpacts.cxx:278
 AliPHOSvImpacts.cxx:279