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$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Base class for ALICE modules. Both sensitive modules (Modules) and      //
// non-sensitive ones are described by this base class. This class           //
// supports the hit and digit trees produced by the simulation and also      //
// the objects produced by the reconstruction.                               //
//                                                                           //
// This class is also responsible for building the geometry of the           //
// Modules.                                                                //
//                                                                           //
//Begin_Html
/*
<img src="picts/AliModuleClass.gif">
*/
//End_Html
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <TObjArray.h>
#include <TClonesArray.h>
#include <TTree.h>
#include <TSystem.h>
#include <TDirectory.h>
#include <TVirtualMC.h>
#include <TGeoManager.h>
#include <TString.h>

#include "AliLog.h"
#include "AliConfig.h"
#include "AliLoader.h"
#include "AliMagF.h"
#include "AliModule.h"
#include "AliRun.h"
#include "AliTrackReference.h"
#include "AliMC.h"
#include "AliSimulation.h"
#include "AliRawDataHeaderV3.h"
#include "AliDigitizationInput.h"

#include "AliDAQ.h"

using std::endl;
using std::cout;
using std::fstream;
using std::ios;
using std::ostream;
ClassImp(AliModule)
 
Float_t AliModule::fgDensityFactor = 1.0;
 
//_______________________________________________________________________
AliModule::AliModule():
  fIdtmed(0),
  fIdmate(0),
  fLoMedium(0),
  fHiMedium(0),
  fActive(0),
  fEnable(1),
  fMaxIterTrackRef(0),
  fCurrentIterTrackRef(0),
  fRunLoader(0),
  fDigInput(0)
{
  //
  // Default constructor for the AliModule class
  //
}
 
//_______________________________________________________________________
AliModule::AliModule(const char* name,const char *title):
  TNamed(name,title),
  fIdtmed(new TArrayI(100)),
  fIdmate(new TArrayI(100)),
  fLoMedium(65536),
  fHiMedium(0),
  fActive(0),
  fEnable(1),
  fMaxIterTrackRef(0),
  fCurrentIterTrackRef(0),
  fRunLoader(0),
  fDigInput(0)
{
  //
  // Normal constructor invoked by all Modules.
  // Create the list for Module specific histograms
  // Add this Module to the global list of Modules in Run.
  //
  // Get the Module numeric ID

  Int_t id = gAlice->GetModuleID(name);
  if (id>=0) {
    // Module already added !
     AliWarning(Form("Module: %s already present at %d",name,id));
     return;
  }
  //
  // Add this Module to the list of Modules

  gAlice->AddModule(this);

  //PH  SetMarkerColor(3);
  //
  // Clear space for tracking media and material indexes

  for(Int_t i=0;i<100;i++) (*fIdmate)[i]=(*fIdtmed)[i]=0;
}
 
//_______________________________________________________________________
AliModule::~AliModule()
{
  //
  // Destructor
  //

  // Remove this Module from the list of Modules
  if (gAlice) {
    TObjArray * modules = gAlice->Modules();
    if (modules) modules->Remove(this);
  }

  // Delete TArray objects
  delete fIdtmed;
  delete fIdmate;

} 

//_______________________________________________________________________
void AliModule::AliMaterial(Int_t imat, const char* name, Float_t a, 
                            Float_t z, Float_t dens, Float_t radl,
                            Float_t absl, Float_t *buf, Int_t nwbuf) const
{
  //
  // Store the parameters for a material
  //
  // imat        the material index will be stored in (*fIdmate)[imat]
  // name        material name
  // a           atomic mass
  // z           atomic number
  // dens        density
  // radl        radiation length
  // absl        absorbtion length
  // buf         adress of an array user words
  // nwbuf       number of user words
  //
  Int_t kmat;
  //Build the string uniquename as "DET_materialname"
  TString uniquename = GetName();
  uniquename.Append("_");
  uniquename.Append(name);
  //if geometry loaded from file only fill fIdmate, else create material too
  if(AliSimulation::Instance()->IsGeometryFromFile()){
    TGeoMaterial *mat = gGeoManager->GetMaterial(uniquename.Data());
    kmat = mat->GetUniqueID();
    (*fIdmate)[imat]=kmat;
  }else{
    if (fgDensityFactor != 1.0)
      AliWarning(Form("Material density multiplied by %.2f!", fgDensityFactor));
    TVirtualMC::GetMC()->Material(kmat, uniquename.Data(), a, z, dens * fgDensityFactor, radl, absl, buf, nwbuf);
    (*fIdmate)[imat]=kmat;
  }
}

//_______________________________________________________________________
void AliModule::AliGetMaterial(Int_t imat, char* name, Float_t &a, 
                               Float_t &z, Float_t &dens, Float_t &radl,
                               Float_t &absl) const
{
  //
  // Store the parameters for a material
  //
  // imat        the material index will be stored in (*fIdmate)[imat]
  // name        material name
  // a           atomic mass
  // z           atomic number
  // dens        density
  // radl        radiation length
  // absl        absorbtion length
  // buf         adress of an array user words
  // nwbuf       number of user words
  //

  Int_t kmat=(*fIdmate)[imat];
  TString sname;
  TArrayD par;
  Double_t da, dz, ddens, dradl, dabsl;
  TVirtualMC::GetMC()->GetMaterial(kmat, sname, da, dz, ddens, dradl, dabsl, par);

  const char* chname = sname.Data();
  strncpy(name, chname, strlen(chname)+1);
  a = da;
  z = dz;
  dens = ddens;
  radl = dradl;
  absl = dabsl;
}

//_______________________________________________________________________
void AliModule::AliMixture(Int_t imat, const char *name, Float_t *a,
                           Float_t *z, Float_t dens, Int_t nlmat,
                           Float_t *wmat) const
{ 
  //
  // Defines mixture or compound imat as composed by 
  // nlmat materials defined by arrays a, z and wmat
  // 
  // If nlmat > 0 wmat contains the proportion by
  // weights of each basic material in the mixture  
  // 
  // If nlmat < 0 wmat contains the number of atoms 
  // of eack kind in the molecule of the compound
  // In this case, wmat is changed on output to the relative weigths.
  //
  // imat        the material index will be stored in (*fIdmate)[imat]
  // name        material name
  // a           array of atomic masses
  // z           array of atomic numbers
  // dens        density
  // nlmat       number of components
  // wmat        array of concentrations
  //
  Int_t kmat;
  //Build the string uniquename as "DET_mixturename"
  TString uniquename = GetName();
  uniquename.Append("_");
  uniquename.Append(name);
  //if geometry loaded from file only fill fIdmate, else create mixture too
  if(AliSimulation::Instance()->IsGeometryFromFile()){
    TGeoMaterial *mat = gGeoManager->GetMaterial(uniquename.Data());
    kmat = mat->GetUniqueID();
    (*fIdmate)[imat]=kmat;
  }else{
    if (fgDensityFactor != 1.0)
      AliWarning(Form("Material density multiplied by %.2f!", fgDensityFactor));
    TVirtualMC::GetMC()->Mixture(kmat, uniquename.Data(), a, z, dens * fgDensityFactor, nlmat, wmat);
    (*fIdmate)[imat]=kmat;
  }
} 
 
//_______________________________________________________________________
void AliModule::AliMedium(Int_t numed, const char *name, Int_t nmat,
                          Int_t isvol, Int_t ifield, Float_t fieldm,
                          Float_t tmaxfd, Float_t stemax, Float_t deemax,
                          Float_t epsil, Float_t stmin, Float_t *ubuf,
                          Int_t nbuf) const
{ 
  //
  // Store the parameters of a tracking medium
  //
  // numed       the medium number is stored into (*fIdtmed)[numed]
  // name        medium name
  // nmat        the material number is stored into (*fIdmate)[nmat]
  // isvol       sensitive volume if isvol!=0
  // ifield      magnetic field flag (see below)
  // fieldm      maximum magnetic field
  // tmaxfd      maximum deflection angle due to magnetic field
  // stemax      maximum step allowed
  // deemax      maximum fractional energy loss in one step
  // epsil       tracking precision in cm
  // stmin       minimum step due to continuous processes
  //
  // ifield =  0       no magnetic field
  //        = -1       user decision in guswim
  //        =  1       tracking performed with Runge Kutta
  //        =  2       tracking performed with helix
  //        =  3       constant magnetic field along z
  //  
  Int_t kmed;
  //Build the string uniquename as "DET_mediumname"
  TString uniquename = GetName();
  uniquename.Append("_");
  uniquename.Append(name);
  //if geometry loaded from file only fill fIdtmed, else create medium too
  if(AliSimulation::Instance()->IsGeometryFromFile()){
    TGeoMedium *med = gGeoManager->GetMedium(uniquename.Data());
    kmed = med->GetId();
    (*fIdtmed)[numed]=kmed;
  }else{
    TVirtualMC::GetMC()->Medium(kmed, uniquename.Data(), (*fIdmate)[nmat], isvol, ifield,
                fieldm, tmaxfd, stemax, deemax, epsil, stmin, ubuf, nbuf);
    (*fIdtmed)[numed]=kmed;
  }
} 
 
//_______________________________________________________________________
void AliModule::AliMatrix(Int_t &nmat, Float_t theta1, Float_t phi1,
                          Float_t theta2, Float_t phi2, Float_t theta3,
                          Float_t phi3) const
{
  // 
  // Define a rotation matrix. Angles are in degrees.
  //
  // nmat        on output contains the number assigned to the rotation matrix
  // theta1      polar angle for axis I
  // phi1        azimuthal angle for axis I
  // theta2      polar angle for axis II
  // phi2        azimuthal angle for axis II
  // theta3      polar angle for axis III
  // phi3        azimuthal angle for axis III
  //
  TVirtualMC::GetMC()->Matrix(nmat, theta1, phi1, theta2, phi2, theta3, phi3); 
} 

//_______________________________________________________________________
Float_t AliModule::ZMin() const
{
  return -500;
}

//_______________________________________________________________________
Float_t AliModule::ZMax() const
{
  return 500;
}

//_______________________________________________________________________
void AliModule::AddAlignableVolumes() const
{
  // 
  if (IsActive())
    AliWarning(Form(" %s still has to implement the AddAlignableVolumes method!",GetName()));
}

//_______________________________________________________________________

AliLoader*  AliModule::MakeLoader(const char* /*topfoldername*/)
{
  return 0x0;
}
 

//_____________________________________________________________________________
AliTrackReference*  AliModule::AddTrackReference(Int_t label, Int_t id){
  //
  // add a trackrefernce to the list
    return (gAlice->GetMCApp()->AddTrackReference(label, id));
}

//_____________________________________________________________________________
TTree* AliModule::TreeTR()
{
  //
  // Return TR tree pointer
  //
  if ( fRunLoader == 0x0)
   {
     AliError("Can not get the run loader");
     return 0x0;
   }

  TTree* tree = fRunLoader->TreeTR();
  return tree;
}


//_____________________________________________________________________________
void AliModule::Digits2Raw()
{
// This is a dummy version that just copies the digits file contents
// to a raw data file.

  AliWarning(Form("Dummy version called for %s", GetName()));

  Int_t nDDLs = AliDAQ::NumberOfDdls(GetName());

  if (!GetLoader()) return;
  fstream digitsFile(GetLoader()->GetDigitsFileName(), ios::in);
  if (!digitsFile) return;

  digitsFile.seekg(0, ios::end);
  UInt_t size = digitsFile.tellg();
  UInt_t ddlSize = 4 * (size / (4*nDDLs));
  Char_t* buffer = new Char_t[ddlSize+1];

  for (Int_t iDDL = 0; iDDL < nDDLs; iDDL++) {
    char fileName[256]="";
    strncpy(fileName,AliDAQ::DdlFileName(GetName(),iDDL),255);
    fstream rawFile(fileName, ios::out);
    if (!rawFile) break;

    AliRawDataHeaderV3 header;
    header.fSize = ddlSize + sizeof(header);
    rawFile.write((char*) &header, sizeof(header));

    digitsFile.read(buffer, ddlSize);
    rawFile.write(buffer, ddlSize);
    rawFile.close();
  }

  digitsFile.close();
  delete[] buffer;
}
 AliModule.cxx:1
 AliModule.cxx:2
 AliModule.cxx:3
 AliModule.cxx:4
 AliModule.cxx:5
 AliModule.cxx:6
 AliModule.cxx:7
 AliModule.cxx:8
 AliModule.cxx:9
 AliModule.cxx:10
 AliModule.cxx:11
 AliModule.cxx:12
 AliModule.cxx:13
 AliModule.cxx:14
 AliModule.cxx:15
 AliModule.cxx:16
 AliModule.cxx:17
 AliModule.cxx:18
 AliModule.cxx:19
 AliModule.cxx:20
 AliModule.cxx:21
 AliModule.cxx:22
 AliModule.cxx:23
 AliModule.cxx:24
 AliModule.cxx:25
 AliModule.cxx:26
 AliModule.cxx:27
 AliModule.cxx:28
 AliModule.cxx:29
 AliModule.cxx:30
 AliModule.cxx:31
 AliModule.cxx:32
 AliModule.cxx:33
 AliModule.cxx:34
 AliModule.cxx:35
 AliModule.cxx:36
 AliModule.cxx:37
 AliModule.cxx:38
 AliModule.cxx:39
 AliModule.cxx:40
 AliModule.cxx:41
 AliModule.cxx:42
 AliModule.cxx:43
 AliModule.cxx:44
 AliModule.cxx:45
 AliModule.cxx:46
 AliModule.cxx:47
 AliModule.cxx:48
 AliModule.cxx:49
 AliModule.cxx:50
 AliModule.cxx:51
 AliModule.cxx:52
 AliModule.cxx:53
 AliModule.cxx:54
 AliModule.cxx:55
 AliModule.cxx:56
 AliModule.cxx:57
 AliModule.cxx:58
 AliModule.cxx:59
 AliModule.cxx:60
 AliModule.cxx:61
 AliModule.cxx:62
 AliModule.cxx:63
 AliModule.cxx:64
 AliModule.cxx:65
 AliModule.cxx:66
 AliModule.cxx:67
 AliModule.cxx:68
 AliModule.cxx:69
 AliModule.cxx:70
 AliModule.cxx:71
 AliModule.cxx:72
 AliModule.cxx:73
 AliModule.cxx:74
 AliModule.cxx:75
 AliModule.cxx:76
 AliModule.cxx:77
 AliModule.cxx:78
 AliModule.cxx:79
 AliModule.cxx:80
 AliModule.cxx:81
 AliModule.cxx:82
 AliModule.cxx:83
 AliModule.cxx:84
 AliModule.cxx:85
 AliModule.cxx:86
 AliModule.cxx:87
 AliModule.cxx:88
 AliModule.cxx:89
 AliModule.cxx:90
 AliModule.cxx:91
 AliModule.cxx:92
 AliModule.cxx:93
 AliModule.cxx:94
 AliModule.cxx:95
 AliModule.cxx:96
 AliModule.cxx:97
 AliModule.cxx:98
 AliModule.cxx:99
 AliModule.cxx:100
 AliModule.cxx:101
 AliModule.cxx:102
 AliModule.cxx:103
 AliModule.cxx:104
 AliModule.cxx:105
 AliModule.cxx:106
 AliModule.cxx:107
 AliModule.cxx:108
 AliModule.cxx:109
 AliModule.cxx:110
 AliModule.cxx:111
 AliModule.cxx:112
 AliModule.cxx:113
 AliModule.cxx:114
 AliModule.cxx:115
 AliModule.cxx:116
 AliModule.cxx:117
 AliModule.cxx:118
 AliModule.cxx:119
 AliModule.cxx:120
 AliModule.cxx:121
 AliModule.cxx:122
 AliModule.cxx:123
 AliModule.cxx:124
 AliModule.cxx:125
 AliModule.cxx:126
 AliModule.cxx:127
 AliModule.cxx:128
 AliModule.cxx:129
 AliModule.cxx:130
 AliModule.cxx:131
 AliModule.cxx:132
 AliModule.cxx:133
 AliModule.cxx:134
 AliModule.cxx:135
 AliModule.cxx:136
 AliModule.cxx:137
 AliModule.cxx:138
 AliModule.cxx:139
 AliModule.cxx:140
 AliModule.cxx:141
 AliModule.cxx:142
 AliModule.cxx:143
 AliModule.cxx:144
 AliModule.cxx:145
 AliModule.cxx:146
 AliModule.cxx:147
 AliModule.cxx:148
 AliModule.cxx:149
 AliModule.cxx:150
 AliModule.cxx:151
 AliModule.cxx:152
 AliModule.cxx:153
 AliModule.cxx:154
 AliModule.cxx:155
 AliModule.cxx:156
 AliModule.cxx:157
 AliModule.cxx:158
 AliModule.cxx:159
 AliModule.cxx:160
 AliModule.cxx:161
 AliModule.cxx:162
 AliModule.cxx:163
 AliModule.cxx:164
 AliModule.cxx:165
 AliModule.cxx:166
 AliModule.cxx:167
 AliModule.cxx:168
 AliModule.cxx:169
 AliModule.cxx:170
 AliModule.cxx:171
 AliModule.cxx:172
 AliModule.cxx:173
 AliModule.cxx:174
 AliModule.cxx:175
 AliModule.cxx:176
 AliModule.cxx:177
 AliModule.cxx:178
 AliModule.cxx:179
 AliModule.cxx:180
 AliModule.cxx:181
 AliModule.cxx:182
 AliModule.cxx:183
 AliModule.cxx:184
 AliModule.cxx:185
 AliModule.cxx:186
 AliModule.cxx:187
 AliModule.cxx:188
 AliModule.cxx:189
 AliModule.cxx:190
 AliModule.cxx:191
 AliModule.cxx:192
 AliModule.cxx:193
 AliModule.cxx:194
 AliModule.cxx:195
 AliModule.cxx:196
 AliModule.cxx:197
 AliModule.cxx:198
 AliModule.cxx:199
 AliModule.cxx:200
 AliModule.cxx:201
 AliModule.cxx:202
 AliModule.cxx:203
 AliModule.cxx:204
 AliModule.cxx:205
 AliModule.cxx:206
 AliModule.cxx:207
 AliModule.cxx:208
 AliModule.cxx:209
 AliModule.cxx:210
 AliModule.cxx:211
 AliModule.cxx:212
 AliModule.cxx:213
 AliModule.cxx:214
 AliModule.cxx:215
 AliModule.cxx:216
 AliModule.cxx:217
 AliModule.cxx:218
 AliModule.cxx:219
 AliModule.cxx:220
 AliModule.cxx:221
 AliModule.cxx:222
 AliModule.cxx:223
 AliModule.cxx:224
 AliModule.cxx:225
 AliModule.cxx:226
 AliModule.cxx:227
 AliModule.cxx:228
 AliModule.cxx:229
 AliModule.cxx:230
 AliModule.cxx:231
 AliModule.cxx:232
 AliModule.cxx:233
 AliModule.cxx:234
 AliModule.cxx:235
 AliModule.cxx:236
 AliModule.cxx:237
 AliModule.cxx:238
 AliModule.cxx:239
 AliModule.cxx:240
 AliModule.cxx:241
 AliModule.cxx:242
 AliModule.cxx:243
 AliModule.cxx:244
 AliModule.cxx:245
 AliModule.cxx:246
 AliModule.cxx:247
 AliModule.cxx:248
 AliModule.cxx:249
 AliModule.cxx:250
 AliModule.cxx:251
 AliModule.cxx:252
 AliModule.cxx:253
 AliModule.cxx:254
 AliModule.cxx:255
 AliModule.cxx:256
 AliModule.cxx:257
 AliModule.cxx:258
 AliModule.cxx:259
 AliModule.cxx:260
 AliModule.cxx:261
 AliModule.cxx:262
 AliModule.cxx:263
 AliModule.cxx:264
 AliModule.cxx:265
 AliModule.cxx:266
 AliModule.cxx:267
 AliModule.cxx:268
 AliModule.cxx:269
 AliModule.cxx:270
 AliModule.cxx:271
 AliModule.cxx:272
 AliModule.cxx:273
 AliModule.cxx:274
 AliModule.cxx:275
 AliModule.cxx:276
 AliModule.cxx:277
 AliModule.cxx:278
 AliModule.cxx:279
 AliModule.cxx:280
 AliModule.cxx:281
 AliModule.cxx:282
 AliModule.cxx:283
 AliModule.cxx:284
 AliModule.cxx:285
 AliModule.cxx:286
 AliModule.cxx:287
 AliModule.cxx:288
 AliModule.cxx:289
 AliModule.cxx:290
 AliModule.cxx:291
 AliModule.cxx:292
 AliModule.cxx:293
 AliModule.cxx:294
 AliModule.cxx:295
 AliModule.cxx:296
 AliModule.cxx:297
 AliModule.cxx:298
 AliModule.cxx:299
 AliModule.cxx:300
 AliModule.cxx:301
 AliModule.cxx:302
 AliModule.cxx:303
 AliModule.cxx:304
 AliModule.cxx:305
 AliModule.cxx:306
 AliModule.cxx:307
 AliModule.cxx:308
 AliModule.cxx:309
 AliModule.cxx:310
 AliModule.cxx:311
 AliModule.cxx:312
 AliModule.cxx:313
 AliModule.cxx:314
 AliModule.cxx:315
 AliModule.cxx:316
 AliModule.cxx:317
 AliModule.cxx:318
 AliModule.cxx:319
 AliModule.cxx:320
 AliModule.cxx:321
 AliModule.cxx:322
 AliModule.cxx:323
 AliModule.cxx:324
 AliModule.cxx:325
 AliModule.cxx:326
 AliModule.cxx:327
 AliModule.cxx:328
 AliModule.cxx:329
 AliModule.cxx:330
 AliModule.cxx:331
 AliModule.cxx:332
 AliModule.cxx:333
 AliModule.cxx:334
 AliModule.cxx:335
 AliModule.cxx:336
 AliModule.cxx:337
 AliModule.cxx:338
 AliModule.cxx:339
 AliModule.cxx:340
 AliModule.cxx:341
 AliModule.cxx:342
 AliModule.cxx:343
 AliModule.cxx:344
 AliModule.cxx:345
 AliModule.cxx:346
 AliModule.cxx:347
 AliModule.cxx:348
 AliModule.cxx:349
 AliModule.cxx:350
 AliModule.cxx:351
 AliModule.cxx:352
 AliModule.cxx:353
 AliModule.cxx:354
 AliModule.cxx:355
 AliModule.cxx:356
 AliModule.cxx:357
 AliModule.cxx:358
 AliModule.cxx:359
 AliModule.cxx:360
 AliModule.cxx:361
 AliModule.cxx:362
 AliModule.cxx:363
 AliModule.cxx:364
 AliModule.cxx:365
 AliModule.cxx:366
 AliModule.cxx:367
 AliModule.cxx:368
 AliModule.cxx:369
 AliModule.cxx:370
 AliModule.cxx:371
 AliModule.cxx:372
 AliModule.cxx:373
 AliModule.cxx:374
 AliModule.cxx:375
 AliModule.cxx:376
 AliModule.cxx:377
 AliModule.cxx:378
 AliModule.cxx:379
 AliModule.cxx:380
 AliModule.cxx:381
 AliModule.cxx:382
 AliModule.cxx:383
 AliModule.cxx:384
 AliModule.cxx:385
 AliModule.cxx:386
 AliModule.cxx:387
 AliModule.cxx:388
 AliModule.cxx:389
 AliModule.cxx:390
 AliModule.cxx:391
 AliModule.cxx:392
 AliModule.cxx:393
 AliModule.cxx:394
 AliModule.cxx:395
 AliModule.cxx:396
 AliModule.cxx:397
 AliModule.cxx:398
 AliModule.cxx:399
 AliModule.cxx:400
 AliModule.cxx:401
 AliModule.cxx:402
 AliModule.cxx:403
 AliModule.cxx:404
 AliModule.cxx:405
 AliModule.cxx:406
 AliModule.cxx:407
 AliModule.cxx:408