ROOT logo
#include "AliITSAlignMille2ConstrArray.h"
#include "AliITSAlignMille2Module.h"

//========================================================================================================
ClassImp(AliITSAlignMille2ConstrArray)

//________________________________________________________________________________________________________
AliITSAlignMille2ConstrArray::AliITSAlignMille2ConstrArray() :
AliITSAlignMille2Constraint(),
fModuleIDs(0),
fModulePatt(0),
fCoeffs(0),
fError(0)
{}

//________________________________________________________________________________________________________
AliITSAlignMille2ConstrArray::AliITSAlignMille2ConstrArray(const Char_t* name,Double_t *parcf,Int_t npar,Double_t val,Double_t err) :
  AliITSAlignMille2Constraint(name,kTypeGaussian,-100,val,0),
  fModuleIDs(0),
  fModulePatt(0),
  fCoeffs(npar),
  fError(err)
{
  // create module
  for (int i=0;i<npar;i++) {fCoeffs[i] = parcf[i]; if (parcf[i]!=0) SetBit(0x1<<i);}
}

//________________________________________________________________________________________________________
AliITSAlignMille2ConstrArray::AliITSAlignMille2ConstrArray(const AliITSAlignMille2ConstrArray& src) :
  AliITSAlignMille2Constraint(src),
  fModuleIDs(0),
  fModulePatt(0),
  fCoeffs(0),
  fError(0)
{/* DUMMY */} 

//________________________________________________________________________________________________________
void AliITSAlignMille2ConstrArray::AddModule(AliITSAlignMille2Module* mod, Bool_t needGeom)
{
  // add module to constraint
  int nmd = GetNModules();
  // check if its already not there
  for (int im=nmd;im--;) {if (mod->GetUniqueID() == (UInt_t)fModuleIDs[im]) return; }
  fModuleIDs.Set(nmd+1);
  fModulePatt.Set(nmd+1);
  fModuleIDs[nmd] = mod->GetUniqueID();
  if (needGeom) { // this is geometrical constraint
    double jacobian[AliITSAlignMille2Module::kMaxParGeom][AliITSAlignMille2Module::kMaxParGeom];
    if (mod->GeomParamsGlobal()) mod->CalcDerivLocGlo(&jacobian[0][0]);
    //
    Short_t patt =  GetPattern();
    if (mod->GeomParamsGlobal()) {
      // the constraint is defined in the module's local frame. If the alignment of geom params is
      // done in the global frame, we need to set the real parameter involved
      for (int i=AliITSAlignMille2Module::kMaxParGeom;i--;) patt &= ~BIT(i);  // reset the geometry parameters
      for (int i=0;i<AliITSAlignMille2Module::kMaxParGeom;i++) {
	if (!IncludesParam(i)) continue;
	for (int j=0;j<AliITSAlignMille2Module::kMaxParGeom;j++) if (jacobian[i][j]!=0) patt |= BIT(j);
      }
    }
    fModulePatt[nmd] = patt;
  }
}

//________________________________________________________________________________________________________
Bool_t AliITSAlignMille2ConstrArray::IncludesModule(Int_t id) const
{
  // is this module mentioned in the list?
  int nmd = GetNModules();
  for (int i=nmd;i--;) if (fModuleIDs[i]==id) return kTRUE;
  return kFALSE;
}

//________________________________________________________________________________________________________
Bool_t AliITSAlignMille2ConstrArray::IncludesModPar(Int_t id,Int_t par) const
{
  // is this module/parameter mentioned in the list?
  int nmd = GetNModules();
  for (int i=nmd;i--;) {
    if (fModuleIDs[i]!=id) continue;
    if (fModulePatt[i] & (0x1<<par)) return kTRUE;
  }
  return kFALSE;
}

//________________________________________________________________________________________________________
Bool_t AliITSAlignMille2ConstrArray::IncludesModPar(const AliITSAlignMille2Module* mod, Int_t par) const
{
  // is this module/parameter mentioned in the list?
  return IncludesModPar(mod->GetUniqueID(), par);
}


//________________________________________________________________________________________________________
void AliITSAlignMille2ConstrArray::Print(Option_t* ) const
{
  // print data
  printf("#%3d Constraint %s of type %d | Value=%+e Error=%+e\n",GetConstraintID(),GetName(),GetType(),GetValue(),GetError());
  printf("Weights on params: "); for (int i=0;i<GetNCoeffs();i++) printf("%+.3e ",GetCoeff(i)); 
  printf("\nModules involved: \n");
  int nmd = GetNModules();
  for (int i=0;i<nmd;i++) {printf("%4d |",GetModuleID(i)); if ( ((i+1)%14)==0 ) printf("\n");}
  if ( nmd%14 ) printf("\n");
  //
}

 AliITSAlignMille2ConstrArray.cxx:1
 AliITSAlignMille2ConstrArray.cxx:2
 AliITSAlignMille2ConstrArray.cxx:3
 AliITSAlignMille2ConstrArray.cxx:4
 AliITSAlignMille2ConstrArray.cxx:5
 AliITSAlignMille2ConstrArray.cxx:6
 AliITSAlignMille2ConstrArray.cxx:7
 AliITSAlignMille2ConstrArray.cxx:8
 AliITSAlignMille2ConstrArray.cxx:9
 AliITSAlignMille2ConstrArray.cxx:10
 AliITSAlignMille2ConstrArray.cxx:11
 AliITSAlignMille2ConstrArray.cxx:12
 AliITSAlignMille2ConstrArray.cxx:13
 AliITSAlignMille2ConstrArray.cxx:14
 AliITSAlignMille2ConstrArray.cxx:15
 AliITSAlignMille2ConstrArray.cxx:16
 AliITSAlignMille2ConstrArray.cxx:17
 AliITSAlignMille2ConstrArray.cxx:18
 AliITSAlignMille2ConstrArray.cxx:19
 AliITSAlignMille2ConstrArray.cxx:20
 AliITSAlignMille2ConstrArray.cxx:21
 AliITSAlignMille2ConstrArray.cxx:22
 AliITSAlignMille2ConstrArray.cxx:23
 AliITSAlignMille2ConstrArray.cxx:24
 AliITSAlignMille2ConstrArray.cxx:25
 AliITSAlignMille2ConstrArray.cxx:26
 AliITSAlignMille2ConstrArray.cxx:27
 AliITSAlignMille2ConstrArray.cxx:28
 AliITSAlignMille2ConstrArray.cxx:29
 AliITSAlignMille2ConstrArray.cxx:30
 AliITSAlignMille2ConstrArray.cxx:31
 AliITSAlignMille2ConstrArray.cxx:32
 AliITSAlignMille2ConstrArray.cxx:33
 AliITSAlignMille2ConstrArray.cxx:34
 AliITSAlignMille2ConstrArray.cxx:35
 AliITSAlignMille2ConstrArray.cxx:36
 AliITSAlignMille2ConstrArray.cxx:37
 AliITSAlignMille2ConstrArray.cxx:38
 AliITSAlignMille2ConstrArray.cxx:39
 AliITSAlignMille2ConstrArray.cxx:40
 AliITSAlignMille2ConstrArray.cxx:41
 AliITSAlignMille2ConstrArray.cxx:42
 AliITSAlignMille2ConstrArray.cxx:43
 AliITSAlignMille2ConstrArray.cxx:44
 AliITSAlignMille2ConstrArray.cxx:45
 AliITSAlignMille2ConstrArray.cxx:46
 AliITSAlignMille2ConstrArray.cxx:47
 AliITSAlignMille2ConstrArray.cxx:48
 AliITSAlignMille2ConstrArray.cxx:49
 AliITSAlignMille2ConstrArray.cxx:50
 AliITSAlignMille2ConstrArray.cxx:51
 AliITSAlignMille2ConstrArray.cxx:52
 AliITSAlignMille2ConstrArray.cxx:53
 AliITSAlignMille2ConstrArray.cxx:54
 AliITSAlignMille2ConstrArray.cxx:55
 AliITSAlignMille2ConstrArray.cxx:56
 AliITSAlignMille2ConstrArray.cxx:57
 AliITSAlignMille2ConstrArray.cxx:58
 AliITSAlignMille2ConstrArray.cxx:59
 AliITSAlignMille2ConstrArray.cxx:60
 AliITSAlignMille2ConstrArray.cxx:61
 AliITSAlignMille2ConstrArray.cxx:62
 AliITSAlignMille2ConstrArray.cxx:63
 AliITSAlignMille2ConstrArray.cxx:64
 AliITSAlignMille2ConstrArray.cxx:65
 AliITSAlignMille2ConstrArray.cxx:66
 AliITSAlignMille2ConstrArray.cxx:67
 AliITSAlignMille2ConstrArray.cxx:68
 AliITSAlignMille2ConstrArray.cxx:69
 AliITSAlignMille2ConstrArray.cxx:70
 AliITSAlignMille2ConstrArray.cxx:71
 AliITSAlignMille2ConstrArray.cxx:72
 AliITSAlignMille2ConstrArray.cxx:73
 AliITSAlignMille2ConstrArray.cxx:74
 AliITSAlignMille2ConstrArray.cxx:75
 AliITSAlignMille2ConstrArray.cxx:76
 AliITSAlignMille2ConstrArray.cxx:77
 AliITSAlignMille2ConstrArray.cxx:78
 AliITSAlignMille2ConstrArray.cxx:79
 AliITSAlignMille2ConstrArray.cxx:80
 AliITSAlignMille2ConstrArray.cxx:81
 AliITSAlignMille2ConstrArray.cxx:82
 AliITSAlignMille2ConstrArray.cxx:83
 AliITSAlignMille2ConstrArray.cxx:84
 AliITSAlignMille2ConstrArray.cxx:85
 AliITSAlignMille2ConstrArray.cxx:86
 AliITSAlignMille2ConstrArray.cxx:87
 AliITSAlignMille2ConstrArray.cxx:88
 AliITSAlignMille2ConstrArray.cxx:89
 AliITSAlignMille2ConstrArray.cxx:90
 AliITSAlignMille2ConstrArray.cxx:91
 AliITSAlignMille2ConstrArray.cxx:92
 AliITSAlignMille2ConstrArray.cxx:93
 AliITSAlignMille2ConstrArray.cxx:94
 AliITSAlignMille2ConstrArray.cxx:95
 AliITSAlignMille2ConstrArray.cxx:96
 AliITSAlignMille2ConstrArray.cxx:97
 AliITSAlignMille2ConstrArray.cxx:98
 AliITSAlignMille2ConstrArray.cxx:99
 AliITSAlignMille2ConstrArray.cxx:100
 AliITSAlignMille2ConstrArray.cxx:101
 AliITSAlignMille2ConstrArray.cxx:102
 AliITSAlignMille2ConstrArray.cxx:103
 AliITSAlignMille2ConstrArray.cxx:104
 AliITSAlignMille2ConstrArray.cxx:105
 AliITSAlignMille2ConstrArray.cxx:106