Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
// COCOA class implementation file
// Id:  Measurement.C
// CAT: Model
// ---------------------------------------------------------------------------
// History: v1.0
// Authors:
//   Pedro Arce

#include "Alignment/CocoaModel/interface/MeasurementSensor2D.h"
#include "Alignment/CocoaModel/interface/LightRay.h"
#include "Alignment/CocoaModel/interface/OpticalObject.h"
#ifdef COCOA_VIS
#include "Alignment/CocoaVisMgr/interface/ALIVRMLMgr.h"
#include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
#include "Alignment/IgCocoaFileWriter/interface/ALIVisLightPath.h"
#endif

#include <iostream>
#include <iomanip>
#include <cstdlib>

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ calculate the simulated value propagating the light ray through the OptO that take part in the Measurement
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void MeasurementSensor2D::calculateSimulatedValue(ALIbool firstTime) {
  if (ALIUtils::debug >= 2)
    printStartCalculateSimulatedValue(this);  // important
  //---------- Create light ray
  LightRay* lightray = new LightRay;

  int isec = 0;  //security variable to check OptOList().size()

  //---------- Loop list of OptO that take part in measurement
  std::vector<OpticalObject*>::const_iterator vocite = OptOList().begin();
  //-  if( ALIUtils::debug >= 5) std::cout  << "OptOList size" <<OptOList().size() << std::endl;

  //----- Check that first object is 'laser' or 'source'
  if ((*vocite)->type() != "laser" && (*vocite)->type() != "source") {
    std::cerr << " first Optical object should be 'laser' or 'source'" << std::endl;
    DumpBadOrderOptOs();
    exit(1);
  }
#ifdef COCOA_VIS
  ALIVisLightPath* vispath = 0;
  if (ALIUtils::getFirstTime()) {
    GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
    if (gomgr->GlobalOptions()["VisWriteIguana"] > 1) {
      vispath = IgCocoaFileMgr::getInstance().newLightPath(name());
    }
  }
#endif

  //-  while( (*vocite) !=  *(OptOList().end()) ) {
  while ((vocite) != (OptOList().end())) {
    if (ALIUtils::debug >= 2)
      std::cout << std::endl << "@@@@ LR:OBJECT " << (*vocite)->name() << std::endl;
    isec++;

    //---------- Get the behaviour of the object w.r.t the measurement (if it reflects the light, let it traverse it, ...)
    ALIstring behav = getMeasuringBehaviour(vocite);

    //---------- Check that last object is a Sensor (that makes measuremnt and kill the lightray)
    if (lightray) {
      (*vocite)->participateInMeasurement(*lightray, *this, behav);

#ifdef COCOA_VIS
      if (ALIUtils::getFirstTime()) {
        GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
        if (gomgr->GlobalOptions()["VisWriteVRML"] > 1) {
          ALIVRMLMgr::getInstance().addLightPoint(lightray->point());
          if (ALIUtils::debug >= 5)
            std::cout << "ALIVRMLMg  addLightPoint " << lightray->point() << (*vocite)->name() << std::endl;
        }
        if (gomgr->GlobalOptions()["VisWriteIguana"] > 1) {
          vispath->addLightPoint(lightray->point(), (*vocite));
        }
      }
#endif

    } else {
      std::cerr << "!! Last object is not Sensor 2D in measurement " << name() << std::endl;
      DumpBadOrderOptOs();
      exit(1);
    }

    ++vocite;
    if (isec > ALIint(OptOList().size())) {
      std::cerr << "ERROR DE PROGRAMACION EN GetSimulatedValue" << std::endl;
      exit(5);
    }
    //-    lightray.normalizeDirection();
  }

  delete lightray;

  if (ALIUtils::debug >= 9)
    std::cout << "end calculateSimulatedValue" << std::endl;
}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ You input 8 numbers after 'TILMETER':
//@@
//@@ set the conversion factor from mV to mrad and the pedestal
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void MeasurementSensor2D::setConversionFactor(const std::vector<ALIstring>& wordlist) {
  //--------- Check that the format is OK
  theDisplaceX = 0;
  theDisplaceY = 0;
  theMultiplyX = 1.;
  theMultiplyY = 1.;
  //-  std::cout << " 0 factors for correction X = " << theDisplaceX << " Y " << theDisplaceY << std::endl;

  if (wordlist.size() == 1)
    return;
  if ((wordlist.size() != 3 && wordlist.size() != 5) || !ALIUtils::IsNumber(wordlist[1]) ||
      !ALIUtils::IsNumber(wordlist[2])) {
    std::cerr << "!! Sensor2D Measurement setConversionFactor: WRONG FORMAT " << std::endl
              << "It should be: SENSOR2D displace_X displace_Y " << std::endl
              << "It is: ";
    ALIUtils::dumpVS(wordlist, " ", std::cerr);
    exit(1);
  }
  theDisplaceX = atof(wordlist[1].c_str()) * valueDimensionFactor();
  theDisplaceY = atof(wordlist[2].c_str()) * valueDimensionFactor();
  //-  std::cout << " factors for correction X = " << theDisplaceX << " Y " << theDisplaceY << std::endl;

  if (wordlist.size() == 5) {
    theMultiplyX = atof(wordlist[3].c_str());
    theMultiplyY = atof(wordlist[4].c_str());
  } else {
    theMultiplyX = 1.;
    theMultiplyY = 1.;
  }
}

//////////////////////////////////////////////////////////////////
void MeasurementSensor2D::correctValueAndSigma() {
  //---------- Make  displacement
  ALIdouble val = value()[0];
  val += theDisplaceX;
  val *= theMultiplyX;
  //-  std::cout << " theDisplaceX " <<  theDisplaceX << " theMultiplyX " << theMultiplyX << std::endl;
  if (ALIUtils::debug >= 4)
    std::cout << "MeasurementSensor2D::correctValueAndSigma: "
              << " old value X " << value()[0] << " new " << val << std::endl;
  setValue(0, val);

  val = value()[1];
  val += theDisplaceY;
  val *= theMultiplyY;
  if (ALIUtils::debug >= 4)
    std::cout << "MeasurementSensor2D::correctValueAndSigma: old value Y " << value()[1] << " new " << val << std::endl;
  setValue(1, val);
}