WindowLevel WindowLevelHelper::getCurrentAutomaticWindowLevel(Volume *volume)
{
    WindowLevel automaticWindowLevel;
    automaticWindowLevel.setName(QObject::tr("Auto"));

    if (volume)
    {
        double range[2];
        volume->getScalarRange(range);
        
        double windowWidth = range[1] - range[0];
        if (VolumeHelper::isPrimaryPET(volume) || VolumeHelper::isPrimaryNM(volume))
        {
            windowWidth *= DefaultPETWindowWidthThreshold;
        }

        double windowCenter = range[0] + (windowWidth * 0.5);

        // If MONOCHROME1 image, window/level is inverted
        Image *image = volume->getImage(0);
        if (image && image->getPhotometricInterpretation() == PhotometricInterpretation::Monochrome1)
        {
            windowWidth = -windowWidth;
        }
        
        automaticWindowLevel.setWidth(windowWidth);
        automaticWindowLevel.setCenter(windowCenter);
    }
    else
    {
        DEBUG_LOG("No input to compute automatic ww/wl. Undefined values.");
    }

    return automaticWindowLevel;
}
QList<WindowLevel*> CustomWindowLevelsReader::readFile(const QString &path)
{
    QFile file(path);
    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        return QList<WindowLevel*>();
    }

    if (!m_customWindowLevelsSchemaValidator.validate(QUrl::fromLocalFile(file.fileName())))
    {
        DEBUG_LOG("No es processa perquè es invalid");
        return QList<WindowLevel*>();
    }

    QList<WindowLevel*> listOfCustomWindowLevels;

    QXmlStreamReader reader(&file);
    if (reader.readNextStartElement())
    {
        if (reader.name() == "CustomWindowLevels")
        {
            while (reader.readNextStartElement())
            {
                if (reader.name() == "CustomWindowLevel")
                {
                    WindowLevel *customWindowLevel = new WindowLevel();
                    QString name = reader.attributes().first().value().toString();
                    customWindowLevel->setName(name);

                    while (reader.readNextStartElement())
                    {
                        if (reader.name() == "width")
                        {
                            customWindowLevel->setWidth(reader.readElementText().toDouble());
                        }
                        else if (reader.name() == "level")
                        {
                            customWindowLevel->setCenter(reader.readElementText().toDouble());
                        }
                    }
                    listOfCustomWindowLevels.append(customWindowLevel);
                }
            }
        }
    }

    return listOfCustomWindowLevels;
}